INSERT ... ON CONFLICT {UPDATE | IGNORE}

Started by Peter Geogheganover 11 years ago235 messages
#1Peter Geoghegan
pg@heroku.com
4 attachment(s)

Attached WIP patch extends the INSERT statement, adding a new ON
CONFLICT {UPDATE | IGNORE} clause. This allows INSERT statements to
perform UPSERT operations (if you want a more formal definition of
UPSERT, I refer you to my pgCon talk's slides [1]http://www.pgcon.org/2014/schedule/attachments/327_upsert_weird.pdf, ("Goals for UPSERT in Postgres"), or the thread in
which I delineated the differences between SQL MERGE and UPSERT [2]/messages/by-id/CAM3SWZRP0c3g6+aJ=YYDGYAcTZg0xA8-1_FCVo5Xm7hrEL34kw@mail.gmail.com).
The patch builds on previous work in this area, and incorporates
feedback from Kevin and Andres.

Overview
=======

Example usage:

INSERT INTO upsert(key, val) VALUES(1, 'insert') ON CONFLICT UPDATE
SET val = 'update';

Essentially, the implementation has all stages of query processing
track some auxiliary UPDATE state. So, for example, during parse
analysis, UPDATE transformation occurs in an ad-hoc fashion tightly
driven by the parent INSERT, but using the existing infrastructure
(i.e. transformStmt()/transformUpdateStmt() is called, and is
insulated from having to care about the feature as a special case).
There are some restrictions on what this auxiliary update may do, but
FWIW there are considerably fewer than those that the equivalent MySQL
or SQLite feature imposes on their users. All of the following SQL
queries are valid with the patch applied:

-- Nesting within wCTE:
WITH t AS (
INSERT INTO z SELECT i, 'insert'
FROM generate_series(0, 16) i
ON CONFLICT UPDATE SET v = v || 'update' -- use of
operators/functions in targetlist
RETURNING * -- only projects inserted tuples, never updated tuples
)
SELECT * FROM t JOIN y ON t.k = y.a ORDER BY a, k;

-- IGNORE variant:
INSERT INTO upsert(key, val) VALUES(1, 'insert') ON CONFLICT IGNORE;

-- predicate within UPDATE auxiliary statement (row is still locked
when the UPDATE predicate isn't satisfied):
INSERT INTO upsert(key, val) VALUES(1, 'insert') ON CONFLICT UPDATE
WHERE val != 'delete';

As with SQL MERGE (at least as implemented in other systems),
subqueries may not appear within the UPDATE's targetlist, nor may they
appear within the special WHERE clause. But the "INSERT part" of the
query has no additional limitations, so you may for example put
subqueries within a VALUES() clause, or INSERT...SELECT...ON CONFLICT
UPDATE... just as you'd expect. INSERT has been augmented with a new
clause, but that clause does not unreasonably fail to play nice with
any other aspect of insertion. (Actually, that isn't quite true, since
at least for now table inheritance, updatable views and foreign tables
are unsupported. This can be revisited.)

I think that without initially realizing it, I copied the SQLite
syntax [3]https://sqlite.org/lang_conflict.html. However, unlike with that SQLite feature, CONFLICT only
refers to a would-be duplicate violation, and not a violation of any
other kind of constraint.

How this new approach works (Executor and Optimizer stuff)
============================================

During the execution of the parent ModifyTable, a special auxiliary
subquery (the UPDATE ModifyTable) is considered as a special case.
This is not a subplan of the ModifyTable node in the conventional
sense, and so does not appear within EXPLAIN output. However, it is
more or less independently planned, and entirely driven by the INSERT
ModifyTable. ExecModifyTable() is never called with this special
auxiliary plan state passed directly. Rather, its parent manages the
process as the need arises. ExecLockUpdateTuple() locks and
potentially updates tuples, using the EvalPlanQual() mechanism (even
at higher isolation levels, with appropriate precautions).

The per-tuple expression context of the auxiliary query/plan is used
with EvalPlanQual() from within ExecLockUpdateTuple() (the new routine
tasked with locking and updating on conflict). There is a new
ExecUpdate() call site within ExecLockUpdateTuple(). Given the
restrictions necessarily imposed on this pseudo-rescanning
(principally the outright rejection of anything that necessitates
PARAM_EXEC parameters during planning), this is safe, as far as I'm
aware. It is convenient to be able to re-use infrastructure in such a
way as to more or less handle the UPDATE independently, driven by the
INSERT, except for execution which is more directly handled by the
INSERT (i.e. there is no ExecModifyTable() call in respect of this new
auxiliary ModifyTable plan). Granted, it is kind of bizarre that the
auxiliary query may have a more complex plan than is necessary for our
purposes, but it doesn't actually appear to be a problem when
"rescanning" (Like a SELECT FOR UPDATE/FOR SHARE's node, we call
EvalPlanQualSetTuple() directly). It is likely worthwhile to teach the
optimizer that we really don't care about how the one and only base
rel within the UPDATE auxiliary subquery (the target table) is
scanned, if only to save a few cycles. I have (temporarily) hacked the
optimizer to prevent index-only scans, which are problematic here, by
adding disable_cost when a query parse tree that uses the feature is
seen. Although what I've done is a temporary kludge, the basic idea of
forcing a particular type of relation scan has a precedent: UPDATE
WHERE CURRENT OF artificially forces a TID scan, because only a TID
scan will work correctly there. I couldn't come up with a convenient
way to artificially inject disable_cost into alternative scan types,
in the less invasive style of isCurrentOf, because there is no
convenient qual to target within cost_qual_eval().

As in previous incarnations, we lock each tuple (although, of course,
only with the UPDATE variant). We may or may not also actually proceed
with the update, depending on whether or not the user-specified
special update predicate (if any) is satisfied. But if we do,
EvalPlanQual() is (once the tuple is locked) only ever evaluated on a
conclusively committed and locked-by-us conflict tuple as part of the
process of updating, even though it's possible for the UPDATE
predicate to be satisfied where conceivably it would not be satisfied
by the tuple version actually visible to the command's MVCC snapshot.
I think this is the correct behavior. We all seem to be in agreement
that we should update at READ COMMITTED if *no* version of the tuple
is visible. It seems utterly arbitrary to me to suggest that on the
one hand it's okay to introduce one particular "MVCC violation", but
not another equivalent one. The first scenario is one in which we
update despite our update's (or rather insert's) "predicate" not being
satisfied (according to our MVCC snapshot). The second scenario is one
in which the same "predicate" is also not satisfied according to our
MVCC snapshot, but in a slightly different way. Why bother introducing
a complicated distinction, if it's a distinction without a difference?
I'd rather have a behavior that is consistent, easy to reason about,
and easy to explain. And so, the predicate is considered once, after
conclusively locking a conflict tuple.

It feels natural and appropriate to me that if the special UPDATE qual
isn't satisfied, we still lock the tuple. After all, in order to make
a conclusive determination about the qual not being satisfied, we need
to lock the tuple. This happens to insulate ExecUpdate() from having
to care about "invisible tuples", which are now possible (although we
still throw an error, just with a useful error message that phrases
the problem in reference to this new feature).

Of course, at higher isolation levels serialization errors are thrown
when something inconsistent with the higher level's guarantees would
otherwise need to occur (even for the IGNORE variant). Still,
interactions with SSI, and preserving the guarantees of SSI should
probably be closely considered by a subject matter expert.

Omission
=======

The patch currently lacks a way of referencing datums rejected for
insertion when updating. The way MySQL handles the issue seems
questionable. They allow you to do something like this:

INSERT INTO upsert (key, val) VALUES (1 'val') ON DUPLICATE KEY UPDATE
val = VALUES(val);

The implication is that the updated value comes from the INSERT's
VALUES() list, but emulating that seems like a bad idea. In general,
at least with Postgres it's entirely possible that values rejected
differ from the values appearing in the VALUES() list, due to the
effects of before triggers. I'm not sure whether or not we should
assume equivalent transformations during any UPDATE before triggers.

This is an open item. I think it makes sense to deal with it a bit later.

"Value locking"
===========

To date, on-list discussion around UPSERT has almost exclusively
concerned what I've called "value locking"; the idea of locking values
in unique indexes in the abstract (to establish the right to insert
ahead of time). There was some useful discussion on this question
between myself and Heikki back around December/January. Ultimately, we
were unable to reach agreement on an approach and discussion tapered
off. However, Heikki did understand the concerns that informed by
design. He recognized the need to be able to easily *release* value
locks, so as to avoid "unprincipled deadlocks", where under high
concurrency there are deadlocks between sessions that only UPSERT a
single row at a time. I'm not sure how widely appreciated this point
is, but I believe that Heikki appreciates it. It is a very important
point in my opinion. I don't want an implementation that is in any way
inferior to the "UPSERT looping subxact" pattern does (i.e. the plpsql
thing that the docs suggest).

When we left off, Heikki continued to favor an approach that involved
speculatively inserting heap tuples, and then deleting them in the
event of a conflict. This design was made more complicated when the
need to *release* value locks became apparent (Heikki ended up making
some changes to HeapTupleSatisfiesDirty(), as well as sketching a
design for what you might call a "super delete", where xmin can be set
to InvalidTransactionId for speculatively-inserted heap tuples). After
all, it wasn't as if we could abort a subxact to release locks, which
is what the "UPSERT looping subxact" pattern does. I think it's fair
to say that that design became more complicated than initially
anticipated [4]/messages/by-id/CAM3SWZQoArVQGMi=v-jk3sBjsPg+wdjeUkM_6L5TZG_i9pyGzQ@mail.gmail.com [5]/messages/by-id/52B4AAF0.5090806@vmware.com.

Anyway, the greater point here is that fundamentally, AFAICT Heikki
and I were in agreement. Once you buy into the idea that we must avoid
holding on to "value locks" of whatever form - as Heikki evidently did
- then exactly what form they take is ultimately only a detail.
Granted, it's a very important detail, but a detail nonetheless. It
can be discussed entirely independently of all of this new stuff, and
thank goodness for that.

If anyone finds my (virtually unchanged) page heavyweight lock based
value locking approach objectionable, I ask that the criticism be
framed in a way that makes a sharp distinction between each of the
following:

1. You don't accept that value locks must be easily released in the
event of a conflict. Is anyone in this camp? It's far from obvious to
me what side of this question Andres is on at this stage, for example.
Robert might have something to say here too.

2. Having taken into account the experience of myself and Heikki, and
all that is implied by taking that approach ***while avoiding
unprincipled deadlocks***, you continue to believe that an approach
based on speculative heap insertion, or some alternative scheme is
better than what I have done to the nbtree code here, or you otherwise
dislike something about the proposed value locking scheme. You accept
that value locks must be released and released easily in the event of
a conflict, but like Heikki you just don't like what I've done to get
there.

Since we can (I believe) talk about the value locking aspect and the
rest of the patch independently, we should do so...unless you're in
camp 1, in which case I guess that we'll have to thrash it out.

Syntax, footguns
=============

As I mentioned, I have incorporated feedback from Kevin Grittner. You
may specify a unique index to merge on from within the INSERT
statement, thus avoiding the risk of inadvertently having the update
affect the wrong tuple due to the user failing to consider that there
was a would-be unique violation within some other unique index
constraining some other attribute. You may write the DML statement
like this:

INSERT INTO upsert(key, val) VALUES(1, 'insert') ON CONFLICT WITHIN
upsert_pkey UPDATE SET val = 'update';

I think that there is a good chance that at least some people will
want to make this mandatory. I guess that's fair enough, but I
*really* don't want to *mandate* that users specify the name of their
unique index in DML for obvious reasons. Perhaps we can come up with a
more tasteful syntax that covers all interesting cases (consider the
issues with partial unique indexes and before triggers for example,
where a conclusion reached about which index to use during parse
analysis may subsequently be invalidated by user-defined code, or
ambiguous specifications in the face of overlapping attributes between
two unique composite indexes, etc). The Right Thing is far from
obvious, and there is very little to garner from other systems, since
SQL MERGE promises essentially nothing about concurrency, both as
specified by the standard and in practice. You don't need a unique
index at all, and as I showed in my pgCon talk, there are race
conditions even for a trivial UPSERT operations in all major SQL MERGE
implementations.

Note that making mandatory (via syntax) merging on one particular
unique index buys the implementation no useful leeway. Just for
example, the unprincipled deadlocks test case that illustrated the
problem with early "promise tuple" style approaches to value locking
[6]: /messages/by-id/CAM3SWZShbE29KpoD44cVc3vpZJGmDer6k_6FGHiSzeOZGmTFSQ@mail.gmail.com
whether or not this should be mandatory is just a detail of the
feature's high level design, as opposed to something expected to
significantly influence the implementation.

Testing, performance
===============

As you'd expect, I've included both isolation tests and regression
tests covering a reasonable variety of cases. In addition, stress
testing is an important part of my testing strategy. Reviewers are
encouraged to try out these test bash scripts:

https://github.com/petergeoghegan/upsert

(Interested hackers should request collaborator status on that Github
project from me privately. I welcome new, interesting test cases.)

The performance of the patch seems quite good, and is something that
these stress-testing bash scripts also test. Upserts are compared
against "equivalent" inserts when we know we'll never update, and
against "equivalent" updates when we know we'll never insert.

On an 8 core test server, I can sustain ~90,000 ordinary insert
transactions per second on an unlogged table defined as follows:

create unlogged table foo
(
merge serial primary key,
b int4,
c text
);

In all cases pgbench uses 8 clients (1 per CPU core).

With "equivalent" upserts, it's about ~66,000 TPS. But this is a
particularly unsympathetic case, because I've deliberately exaggerated
the effects of heavyweight lock contention on leaf pages by using a
serial primary key. Plus, there's the additional planning and parsing
overhead.

When comparing updating with updating upserting, it's a similar story.
100,000 tuples are pre-inserted in each case. I can sustain ~98,000
TPS with plain updates, or ~70,000 TPS with "equivalent" upserts.
B-Tree index page heavyweight lock contention probably explains some
of the difference between "UPSERT inserts" and "UPSERT updates".

Interlocking with VACUUM, race conditions
===============================

In previous revisions, when we went to lock + update a tuple, no
"value locks" were held, and neither were any B-Tree page buffer pins,
because they were both released at the same time (recall that I call
my heavyweight lock on B-Tree leaf pages a value lock). We still do
that (unprincipled deadlocks are our only alternative), but now hold
on to the pin for longer, until after tuple locking. Old versions of
this patch used to sit on the B-Tree buffer pin to prevent concurrent
deletion only as long as value locks were held, but maybe it isn't
good enough to sit on the pin until before we lock/update, as value
locks are released: dropping the pin implies that the heap tuple can
physically go away, and in general the same TID may then contain
anything. We may have to interlock against vacuum by sitting on the
B-Tree buffer pin (but not the value lock) throughout locking +
update. That makes it impossible for the heap tuple slot to fail to
relate to the tuple from the B-Tree, that is under consideration for
locking/updating. Recall that we aren't quite dealing with MVCC
semantics here, since in READ COMMITTED mode we can lock a
conclusively committed + visible tuple with *no* version visible to
our command's MVCC snapshot. Therefore, it seems worth considering the
possibility that the nbtree README's observations on the necessity of
holding a pin to interlock against VACUUM (for non-MVCC snapshots)
apply.

In this revision we have two callbacks (or two calls to the same
callback, with different effects): One to release value locks early,
to avoid unprincipled deadlocks, and a second to finally release the
last unneeded buffer pin.

Recall that when we find a conflict (within _bt_checkunique()), it
must be conclusively committed and visible to new MVCC snapshots; we
know at that juncture that it's live. The concern is that it might be
deleted *and* garbage collected in the interim between finding the
conflict tuple, and locking it (in practice this interim period is
only an instant).

This is probably too paranoid, though: the fact that the upserter's
transaction is running ought to imply that GetOldestXmin() returns an
XID sufficient to prevent this. OTOH, I'm not sure that there exists
anything that looks like a precedent for relying on blocking vacuum in
this manner, and it might turn out to be limiting to rely on this.
And, I hasten to add, my fix (sitting on a B-Tree pin throughout row
locking) is in another way perhaps not paranoid enough: Who is to say
that our conflicting value is on the same B-Tree leaf page as our
value lock? If might not be, since _bt_checkunique() looks at later
B-Tree pages (the value locked page is merely "the first leaf page the
value could be on"). Pinning the heavyweight lock page's buffer is
certainly justified by the need for non-speculative inserters to see a
flag that obligates them to acquire the heavyweight page lock
themselves (see comments in patch for more), but this other reason is
kind of dubious.

In other words: I'm relying on the way VACUUM actually works to
prevent premature garbage collection. It's possible to imagine a world
in which HeapTupleSatisfiesVacuum() is smart enough to realize that
the tuple UPSERT wants to lock is not visible to anyone (assuming MVCC
semantics, etc), and never can be. I've tentatively added code to keep
a buffer pin for longer, but that's probably not good enough if we
assume that it's necessary at all. Basically, I want to be comfortable
about my rationale for it being okay that a "non-MVCC" "index scan"
doesn't hold a pin, but right now I'm not. I was conflicted on whether
or not I should include the "unpin later" logic at all; for now I've
left it in, if only as a placeholder. Needless to say, if there is a
race condition you can take it that it's very difficult to isolate.

FWIW, somewhat extensive stress-testing has revealed no bugs that you
might associate with these problems, with and without extended buffer
pinning, and with artificial random sleeps added at key points in an
effort to make any race condition bugs manifest themselves. I have
made a concerted effort to break the patch in that way, and I'm now
running out of ideas. Running the stress tests (with random delays in
key points in the code) for several days reveals no bugs. This is on
the same dedicated 8 core server, with plenty of concurrency.

It's probably a good idea to begin using my B-Tree verification tool
[7]: /messages/by-id/CAM3SWZRtV+xmRWLWq6c-x7czvwavFdwFi4St1zz4dDgFH4yN4g@mail.gmail.com -- Peter Geoghegan
MVCC, and will only detect the violation of invariants that are
localized to the B-Tree code, at least at the moment.

Open items
=========

I already mentioned the inability to reference rejected rows in an
UPDATE, as well as my unease about VACUUM interlocking, both of which
are open item. Also, some of the restrictions that I already mentioned
- on updatable views, inheritance, and foreign tables - are probably
unnecessary. We should be able to come with reasonable behavior for at
least some of those.

Patch
====

I thought that I went too long without posting something about all of
this to the list to get feedback, and so I decided to post this WIP
patch set. I've tried to break it up into pieces, but it isn't all
that suitable for representing as cumulative commits. I've also tried
to break up the discussion usefully (the question of how everything
fits together at a high level can hopefully be discussed separately
from the question of how "value locks" are actually implemented).

Thoughts?

[1]: http://www.pgcon.org/2014/schedule/attachments/327_upsert_weird.pdf, ("Goals for UPSERT in Postgres")
("Goals for UPSERT in Postgres")
[2]: /messages/by-id/CAM3SWZRP0c3g6+aJ=YYDGYAcTZg0xA8-1_FCVo5Xm7hrEL34kw@mail.gmail.com
[3]: https://sqlite.org/lang_conflict.html
[4]: /messages/by-id/CAM3SWZQoArVQGMi=v-jk3sBjsPg+wdjeUkM_6L5TZG_i9pyGzQ@mail.gmail.com
[5]: /messages/by-id/52B4AAF0.5090806@vmware.com
[6]: /messages/by-id/CAM3SWZShbE29KpoD44cVc3vpZJGmDer6k_6FGHiSzeOZGmTFSQ@mail.gmail.com
[7]: /messages/by-id/CAM3SWZRtV+xmRWLWq6c-x7czvwavFdwFi4St1zz4dDgFH4yN4g@mail.gmail.com -- Peter Geoghegan
--
Peter Geoghegan

Attachments:

0001-Make-UPDATE-privileges-distinct-from-INSERT-privileg.patchtext/x-patch; charset=US-ASCII; name=0001-Make-UPDATE-privileges-distinct-from-INSERT-privileg.patchDownload
From ef50bc4c71b08d08aa4a3c3e9fe0ea218f68d326 Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@heroku.com>
Date: Tue, 26 Aug 2014 21:28:40 -0700
Subject: [PATCH 1/4] Make UPDATE privileges distinct from INSERT privileges in
 RTEs

Previously, relation range table entries used a single Bitmapset field
representing which columns required either UPDATE or INSERT privileges,
despite the fact that INSERT and UPDATE privileges are separately
cataloged, and may be independently held.  This worked because
ExecCheckRTEPerms() was called with a ACL_INSERT or ACL_UPDATE
requiredPerms, and based on that it was evident which type of
optimizable statement was under consideration.  Since historically no
type of optimizable statement could directly INSERT and UPDATE at the
same time, there was no ambiguity as to which privileges were required.

This largely mechanical commit is required infrastructure for the
INSERT...ON CONFLICT UPDATE feature, which introduces an optimizable
statement that may be subject to both INSERT and UPDATE permissions
enforcement.  Tests follow in a later commit.

Note that this commit necessitates an initdb, since stored ACLs are
broken.
---
 contrib/postgres_fdw/postgres_fdw.c       |  2 +-
 src/backend/commands/copy.c               |  2 +-
 src/backend/commands/createas.c           |  2 +-
 src/backend/commands/trigger.c            | 12 ++++----
 src/backend/executor/execMain.c           | 51 ++++++++++++++++++++++++++-----
 src/backend/nodes/copyfuncs.c             |  3 +-
 src/backend/nodes/equalfuncs.c            |  3 +-
 src/backend/nodes/outfuncs.c              |  3 +-
 src/backend/nodes/readfuncs.c             |  3 +-
 src/backend/optimizer/prep/prepsecurity.c |  6 ++--
 src/backend/optimizer/prep/prepunion.c    |  4 ++-
 src/backend/parser/analyze.c              |  4 +--
 src/backend/parser/parse_relation.c       | 21 ++++++++-----
 src/backend/rewrite/rewriteHandler.c      | 18 ++++++++---
 src/include/nodes/parsenodes.h            |  3 +-
 15 files changed, 98 insertions(+), 39 deletions(-)

diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
index 4c49776..c99a3ee 100644
--- a/contrib/postgres_fdw/postgres_fdw.c
+++ b/contrib/postgres_fdw/postgres_fdw.c
@@ -1197,7 +1197,7 @@ postgresPlanForeignModify(PlannerInfo *root,
 	}
 	else if (operation == CMD_UPDATE)
 	{
-		Bitmapset  *tmpset = bms_copy(rte->modifiedCols);
+		Bitmapset  *tmpset = bms_copy(rte->updatedCols);
 		AttrNumber	col;
 
 		while ((col = bms_first_member(tmpset)) >= 0)
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index fbd7492..eb2844a 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -832,7 +832,7 @@ DoCopy(const CopyStmt *stmt, const char *queryString, uint64 *processed)
 			FirstLowInvalidHeapAttributeNumber;
 
 			if (is_from)
-				rte->modifiedCols = bms_add_member(rte->modifiedCols, attno);
+				rte->insertedCols = bms_add_member(rte->insertedCols, attno);
 			else
 				rte->selectedCols = bms_add_member(rte->selectedCols, attno);
 		}
diff --git a/src/backend/commands/createas.c b/src/backend/commands/createas.c
index 5245171..9688916 100644
--- a/src/backend/commands/createas.c
+++ b/src/backend/commands/createas.c
@@ -414,7 +414,7 @@ intorel_startup(DestReceiver *self, int operation, TupleDesc typeinfo)
 	rte->requiredPerms = ACL_INSERT;
 
 	for (attnum = 1; attnum <= intoRelationDesc->rd_att->natts; attnum++)
-		rte->modifiedCols = bms_add_member(rte->modifiedCols,
+		rte->insertedCols = bms_add_member(rte->insertedCols,
 								attnum - FirstLowInvalidHeapAttributeNumber);
 
 	ExecCheckRTPerms(list_make1(rte), true);
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index 9bf0098..b9cd78b 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -65,8 +65,8 @@ int			SessionReplicationRole = SESSION_REPLICATION_ROLE_ORIGIN;
 /* How many levels deep into trigger execution are we? */
 static int	MyTriggerDepth = 0;
 
-#define GetModifiedColumns(relinfo, estate) \
-	(rt_fetch((relinfo)->ri_RangeTableIndex, (estate)->es_range_table)->modifiedCols)
+#define GetUpdatedColumns(relinfo, estate) \
+	(rt_fetch((relinfo)->ri_RangeTableIndex, (estate)->es_range_table)->updatedCols)
 
 /* Local function prototypes */
 static void ConvertTriggerToFK(CreateTrigStmt *stmt, Oid funcoid);
@@ -2345,7 +2345,7 @@ ExecBSUpdateTriggers(EState *estate, ResultRelInfo *relinfo)
 	if (!trigdesc->trig_update_before_statement)
 		return;
 
-	modifiedCols = GetModifiedColumns(relinfo, estate);
+	modifiedCols = GetUpdatedColumns(relinfo, estate);
 
 	LocTriggerData.type = T_TriggerData;
 	LocTriggerData.tg_event = TRIGGER_EVENT_UPDATE |
@@ -2391,7 +2391,7 @@ ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo)
 	if (trigdesc && trigdesc->trig_update_after_statement)
 		AfterTriggerSaveEvent(estate, relinfo, TRIGGER_EVENT_UPDATE,
 							  false, NULL, NULL, NIL,
-							  GetModifiedColumns(relinfo, estate));
+							  GetUpdatedColumns(relinfo, estate));
 }
 
 TupleTableSlot *
@@ -2418,7 +2418,7 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate,
 	 * been modified, then we can use a weaker lock, allowing for better
 	 * concurrency.
 	 */
-	modifiedCols = GetModifiedColumns(relinfo, estate);
+	modifiedCols = GetUpdatedColumns(relinfo, estate);
 	keyCols = RelationGetIndexAttrBitmap(relinfo->ri_RelationDesc,
 										 INDEX_ATTR_BITMAP_KEY);
 	if (bms_overlap(keyCols, modifiedCols))
@@ -2545,7 +2545,7 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo,
 
 		AfterTriggerSaveEvent(estate, relinfo, TRIGGER_EVENT_UPDATE,
 							  true, trigtuple, newtuple, recheckIndexes,
-							  GetModifiedColumns(relinfo, estate));
+							  GetUpdatedColumns(relinfo, estate));
 		if (trigtuple != fdw_trigtuple)
 			heap_freetuple(trigtuple);
 	}
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index 072c7df..d71e9b8 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -631,11 +631,11 @@ ExecCheckRTEPerms(RangeTblEntry *rte)
 		}
 
 		/*
-		 * Basically the same for the mod columns, with either INSERT or
-		 * UPDATE privilege as specified by remainingPerms.
+		 * Basically the same for the mod columns, for both INSERT and UPDATE
+		 * privilege as specified by remainingPerms (INSERT...ON CONFLICT
+		 * UPDATE may set both).
 		 */
-		remainingPerms &= ~ACL_SELECT;
-		if (remainingPerms != 0)
+		if (remainingPerms & ACL_INSERT)
 		{
 			/*
 			 * When the query doesn't explicitly change any columns, allow the
@@ -643,14 +643,14 @@ ExecCheckRTEPerms(RangeTblEntry *rte)
 			 * to handle SELECT FOR UPDATE as well as possible corner cases in
 			 * INSERT and UPDATE.
 			 */
-			if (bms_is_empty(rte->modifiedCols))
+			if (bms_is_empty(rte->insertedCols))
 			{
-				if (pg_attribute_aclcheck_all(relOid, userid, remainingPerms,
+				if (pg_attribute_aclcheck_all(relOid, userid, ACL_INSERT,
 											  ACLMASK_ANY) != ACLCHECK_OK)
 					return false;
 			}
 
-			tmpset = bms_copy(rte->modifiedCols);
+			tmpset = bms_copy(rte->insertedCols);
 			while ((col = bms_first_member(tmpset)) >= 0)
 			{
 				/* remove the column number offset */
@@ -663,7 +663,42 @@ ExecCheckRTEPerms(RangeTblEntry *rte)
 				else
 				{
 					if (pg_attribute_aclcheck(relOid, col, userid,
-											  remainingPerms) != ACLCHECK_OK)
+											  ACL_INSERT) != ACLCHECK_OK)
+						return false;
+				}
+			}
+			bms_free(tmpset);
+		}
+
+		if (remainingPerms & ACL_UPDATE)
+		{
+			/*
+			 * When the query doesn't explicitly change any columns, allow the
+			 * query if we have permission on any column of the rel.  This is
+			 * to handle SELECT FOR UPDATE as well as possible corner cases in
+			 * INSERT and UPDATE.
+			 */
+			if (bms_is_empty(rte->updatedCols))
+			{
+				if (pg_attribute_aclcheck_all(relOid, userid, ACL_UPDATE,
+											  ACLMASK_ANY) != ACLCHECK_OK)
+					return false;
+			}
+
+			tmpset = bms_copy(rte->updatedCols);
+			while ((col = bms_first_member(tmpset)) >= 0)
+			{
+				/* remove the column number offset */
+				col += FirstLowInvalidHeapAttributeNumber;
+				if (col == InvalidAttrNumber)
+				{
+					/* whole-row reference can't happen here */
+					elog(ERROR, "whole-row update is not implemented");
+				}
+				else
+				{
+					if (pg_attribute_aclcheck(relOid, col, userid,
+											  ACL_UPDATE) != ACLCHECK_OK)
 						return false;
 				}
 			}
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index aa053a0..9f5bcd7 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -1998,7 +1998,8 @@ _copyRangeTblEntry(const RangeTblEntry *from)
 	COPY_SCALAR_FIELD(requiredPerms);
 	COPY_SCALAR_FIELD(checkAsUser);
 	COPY_BITMAPSET_FIELD(selectedCols);
-	COPY_BITMAPSET_FIELD(modifiedCols);
+	COPY_BITMAPSET_FIELD(insertedCols);
+	COPY_BITMAPSET_FIELD(updatedCols);
 	COPY_NODE_FIELD(securityQuals);
 
 	return newnode;
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 719923e..8d13c69 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -2319,7 +2319,8 @@ _equalRangeTblEntry(const RangeTblEntry *a, const RangeTblEntry *b)
 	COMPARE_SCALAR_FIELD(requiredPerms);
 	COMPARE_SCALAR_FIELD(checkAsUser);
 	COMPARE_BITMAPSET_FIELD(selectedCols);
-	COMPARE_BITMAPSET_FIELD(modifiedCols);
+	COMPARE_BITMAPSET_FIELD(insertedCols);
+	COMPARE_BITMAPSET_FIELD(updatedCols);
 	COMPARE_NODE_FIELD(securityQuals);
 
 	return true;
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index e686a6c..da75e29 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -2423,7 +2423,8 @@ _outRangeTblEntry(StringInfo str, const RangeTblEntry *node)
 	WRITE_UINT_FIELD(requiredPerms);
 	WRITE_OID_FIELD(checkAsUser);
 	WRITE_BITMAPSET_FIELD(selectedCols);
-	WRITE_BITMAPSET_FIELD(modifiedCols);
+	WRITE_BITMAPSET_FIELD(insertedCols);
+	WRITE_BITMAPSET_FIELD(updatedCols);
 	WRITE_NODE_FIELD(securityQuals);
 }
 
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 69d9989..65584d1 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -1252,7 +1252,8 @@ _readRangeTblEntry(void)
 	READ_UINT_FIELD(requiredPerms);
 	READ_OID_FIELD(checkAsUser);
 	READ_BITMAPSET_FIELD(selectedCols);
-	READ_BITMAPSET_FIELD(modifiedCols);
+	READ_BITMAPSET_FIELD(insertedCols);
+	READ_BITMAPSET_FIELD(updatedCols);
 	READ_NODE_FIELD(securityQuals);
 
 	READ_DONE();
diff --git a/src/backend/optimizer/prep/prepsecurity.c b/src/backend/optimizer/prep/prepsecurity.c
index 2420f97..1de9d99 100644
--- a/src/backend/optimizer/prep/prepsecurity.c
+++ b/src/backend/optimizer/prep/prepsecurity.c
@@ -115,7 +115,8 @@ expand_security_quals(PlannerInfo *root, List *tlist)
 			rte->requiredPerms = 0;
 			rte->checkAsUser = InvalidOid;
 			rte->selectedCols = NULL;
-			rte->modifiedCols = NULL;
+			rte->insertedCols = NULL;
+			rte->updatedCols = NULL;
 
 			/*
 			 * For the most part, Vars referencing the original relation
@@ -213,7 +214,8 @@ expand_security_qual(PlannerInfo *root, List *tlist, int rt_index,
 			rte->requiredPerms = 0;
 			rte->checkAsUser = InvalidOid;
 			rte->selectedCols = NULL;
-			rte->modifiedCols = NULL;
+			rte->insertedCols = NULL;
+			rte->updatedCols = NULL;
 
 			/*
 			 * Now deal with any PlanRowMark on this RTE by requesting a lock
diff --git a/src/backend/optimizer/prep/prepunion.c b/src/backend/optimizer/prep/prepunion.c
index 0410fdd..d607523 100644
--- a/src/backend/optimizer/prep/prepunion.c
+++ b/src/backend/optimizer/prep/prepunion.c
@@ -1374,7 +1374,9 @@ expand_inherited_rtentry(PlannerInfo *root, RangeTblEntry *rte, Index rti)
 		{
 			childrte->selectedCols = translate_col_privs(rte->selectedCols,
 												   appinfo->translated_vars);
-			childrte->modifiedCols = translate_col_privs(rte->modifiedCols,
+			childrte->insertedCols = translate_col_privs(rte->insertedCols,
+												   appinfo->translated_vars);
+			childrte->updatedCols = translate_col_privs(rte->updatedCols,
 												   appinfo->translated_vars);
 		}
 
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index fb6c44c..c0b1fe3 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -737,7 +737,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
 							  false);
 		qry->targetList = lappend(qry->targetList, tle);
 
-		rte->modifiedCols = bms_add_member(rte->modifiedCols,
+		rte->insertedCols = bms_add_member(rte->insertedCols,
 							  attr_num - FirstLowInvalidHeapAttributeNumber);
 
 		icols = lnext(icols);
@@ -2006,7 +2006,7 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
 							  origTarget->location);
 
 		/* Mark the target column as requiring update permissions */
-		target_rte->modifiedCols = bms_add_member(target_rte->modifiedCols,
+		target_rte->updatedCols = bms_add_member(target_rte->updatedCols,
 								attrno - FirstLowInvalidHeapAttributeNumber);
 
 		origTargetList = lnext(origTargetList);
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index 478584d..364ced0 100644
--- a/src/backend/parser/parse_relation.c
+++ b/src/backend/parser/parse_relation.c
@@ -1052,7 +1052,8 @@ addRangeTableEntry(ParseState *pstate,
 	rte->requiredPerms = ACL_SELECT;
 	rte->checkAsUser = InvalidOid;		/* not set-uid by default, either */
 	rte->selectedCols = NULL;
-	rte->modifiedCols = NULL;
+	rte->insertedCols = NULL;
+	rte->updatedCols = NULL;
 
 	/*
 	 * Add completed RTE to pstate's range table list, but not to join list
@@ -1105,7 +1106,8 @@ addRangeTableEntryForRelation(ParseState *pstate,
 	rte->requiredPerms = ACL_SELECT;
 	rte->checkAsUser = InvalidOid;		/* not set-uid by default, either */
 	rte->selectedCols = NULL;
-	rte->modifiedCols = NULL;
+	rte->insertedCols = NULL;
+	rte->updatedCols = NULL;
 
 	/*
 	 * Add completed RTE to pstate's range table list, but not to join list
@@ -1183,7 +1185,8 @@ addRangeTableEntryForSubquery(ParseState *pstate,
 	rte->requiredPerms = 0;
 	rte->checkAsUser = InvalidOid;
 	rte->selectedCols = NULL;
-	rte->modifiedCols = NULL;
+	rte->insertedCols = NULL;
+	rte->updatedCols = NULL;
 
 	/*
 	 * Add completed RTE to pstate's range table list, but not to join list
@@ -1437,7 +1440,8 @@ addRangeTableEntryForFunction(ParseState *pstate,
 	rte->requiredPerms = 0;
 	rte->checkAsUser = InvalidOid;
 	rte->selectedCols = NULL;
-	rte->modifiedCols = NULL;
+	rte->insertedCols = NULL;
+	rte->updatedCols = NULL;
 
 	/*
 	 * Add completed RTE to pstate's range table list, but not to join list
@@ -1509,7 +1513,8 @@ addRangeTableEntryForValues(ParseState *pstate,
 	rte->requiredPerms = 0;
 	rte->checkAsUser = InvalidOid;
 	rte->selectedCols = NULL;
-	rte->modifiedCols = NULL;
+	rte->insertedCols = NULL;
+	rte->updatedCols = NULL;
 
 	/*
 	 * Add completed RTE to pstate's range table list, but not to join list
@@ -1577,7 +1582,8 @@ addRangeTableEntryForJoin(ParseState *pstate,
 	rte->requiredPerms = 0;
 	rte->checkAsUser = InvalidOid;
 	rte->selectedCols = NULL;
-	rte->modifiedCols = NULL;
+	rte->insertedCols = NULL;
+	rte->updatedCols = NULL;
 
 	/*
 	 * Add completed RTE to pstate's range table list, but not to join list
@@ -1677,7 +1683,8 @@ addRangeTableEntryForCTE(ParseState *pstate,
 	rte->requiredPerms = 0;
 	rte->checkAsUser = InvalidOid;
 	rte->selectedCols = NULL;
-	rte->modifiedCols = NULL;
+	rte->insertedCols = NULL;
+	rte->updatedCols = NULL;
 
 	/*
 	 * Add completed RTE to pstate's range table list, but not to join list
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index e6c5530..cc967f0 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -1401,7 +1401,8 @@ ApplyRetrieveRule(Query *parsetree,
 			rte->requiredPerms = 0;
 			rte->checkAsUser = InvalidOid;
 			rte->selectedCols = NULL;
-			rte->modifiedCols = NULL;
+			rte->insertedCols = NULL;
+			rte->updatedCols = NULL;
 
 			/*
 			 * For the most part, Vars referencing the view should remain as
@@ -1464,12 +1465,14 @@ ApplyRetrieveRule(Query *parsetree,
 	subrte->requiredPerms = rte->requiredPerms;
 	subrte->checkAsUser = rte->checkAsUser;
 	subrte->selectedCols = rte->selectedCols;
-	subrte->modifiedCols = rte->modifiedCols;
+	subrte->insertedCols = rte->insertedCols;
+	subrte->updatedCols = rte->updatedCols;
 
 	rte->requiredPerms = 0;		/* no permission check on subquery itself */
 	rte->checkAsUser = InvalidOid;
 	rte->selectedCols = NULL;
-	rte->modifiedCols = NULL;
+	rte->insertedCols = NULL;
+	rte->updatedCols = NULL;
 
 	/*
 	 * If FOR [KEY] UPDATE/SHARE of view, mark all the contained tables as
@@ -2697,8 +2700,13 @@ rewriteTargetView(Query *parsetree, Relation view)
 	 * This step needs the modified view targetlist, so we have to do things
 	 * in this order.
 	 */
-	Assert(bms_is_empty(new_rte->modifiedCols));
-	new_rte->modifiedCols = adjust_view_column_set(view_rte->modifiedCols,
+	Assert(bms_is_empty(new_rte->insertedCols) &&
+		   bms_is_empty(new_rte->updatedCols));
+
+	new_rte->insertedCols = adjust_view_column_set(view_rte->insertedCols,
+												   view_targetlist);
+
+	new_rte->updatedCols = adjust_view_column_set(view_rte->updatedCols,
 												   view_targetlist);
 
 	/*
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index d2c0b29..2c5d842 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -814,7 +814,8 @@ typedef struct RangeTblEntry
 	AclMode		requiredPerms;	/* bitmask of required access permissions */
 	Oid			checkAsUser;	/* if valid, check access as this role */
 	Bitmapset  *selectedCols;	/* columns needing SELECT permission */
-	Bitmapset  *modifiedCols;	/* columns needing INSERT/UPDATE permission */
+	Bitmapset  *insertedCols;	/* columns needing INSERT permission */
+	Bitmapset  *updatedCols;	/* columns needing UPDATE permission */
 	List	   *securityQuals;	/* any security barrier quals to apply */
 } RangeTblEntry;
 
-- 
1.9.1

0004-Internal-documentation-for-INSERT-.-ON-CONFLICT-UPDA.patchtext/x-patch; charset=US-ASCII; name=0004-Internal-documentation-for-INSERT-.-ON-CONFLICT-UPDA.patchDownload
From 2c7dd20a47f539f2de514706a32b02207a04e5a6 Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@heroku.com>
Date: Wed, 27 Aug 2014 15:16:11 -0700
Subject: [PATCH 4/4] Internal documentation for INSERT ... ON CONFLICT {UPDATE
 | IGNORE}

Includes documentation for both the nbtree and executor READMEs, as well
as the user-facing SGML documentation around index AMs.  The latter two
additions should make clear how the AM interface has been revised for
amcanunique AMs in the abstract, without reference to the only current
implementation, nbtree.
---
 doc/src/sgml/indexam.sgml        | 145 ++++++++++++++++++++++++++++++++++++---
 src/backend/access/nbtree/README |  75 ++++++++++++++++++++
 src/backend/executor/README      |  34 +++++++++
 3 files changed, 244 insertions(+), 10 deletions(-)

diff --git a/doc/src/sgml/indexam.sgml b/doc/src/sgml/indexam.sgml
index 157047a..5cd1f14 100644
--- a/doc/src/sgml/indexam.sgml
+++ b/doc/src/sgml/indexam.sgml
@@ -176,13 +176,73 @@ ambuildempty (Relation indexRelation);
 
   <para>
 <programlisting>
+SpeculativeState *state
+amlock (Relation  uniqueIndexRelation,
+        Datum     values,
+        bool     *isnull,
+        Relation  heapRel,
+        List     *otherSpecStates,
+        bool      priorConflict
+);
+</programlisting>
+   Lock index tuple values as part of the first phase of speculative
+   insertion.  If all unique index values are concurrently locked, the
+   core system will attempt a proper insertion.  Otherwise, it may
+   lock a <quote>rejector row</> TID returned through the state return
+   value.
+  </para>
+  <para>
+   The core system will not hold on to value locks acquired by AMs for
+   more than an instant.  It will only hold index value locks across
+   insertion of the corresponding heap row, perhaps including
+   toasting, and across multiple <structfield>amcanunique</> lock
+   acquisitions, plus the latter phase of speculative insertion.  AM
+   authors should carefully analyze the deadlock hazards, including
+   interaction with system catalogs that may be innocously queried
+   with little provocation, and including calls to arbitrary
+   user-defined functions with value locks held during
+   <function>FormIndexDatum</> with expression indexes.
+   Conventionally, value locks are implemented using heavyweight locks
+   on pages, managed by the lock manager.  The core code calls the
+   function in reverse order to the usual insertion order.  The
+   <literal>priorConflict</> field hints to the implementation that
+   there was recently a conflict on the constant proposed for
+   insertion, which can optionally be used to implement opportunistic
+   lock strength reduction optimizations.
+  </para>
+
+  <para>
+   The function's state result value is used in a subsequent call to
+   <function>aminsert</> if and only if the core system resolves to
+   proceed with speculative insertion of a slot proposed for
+   insertion, which it will do if all value locks are successfully
+   acquired (though even that condition does not ensure that the
+   system will not need to restart from the very beginning of value
+   locking for all unique indexes -- <structfield>amcanunique</>
+   methods can only assume that insertion will proceed when there is a
+   corresponding <function>aminsert</> call, and can probably never
+   reasonably ascertain that insertion will not proceed, since that's
+   the core code's concern.  The core code will only release index
+   value locks through callback, however).  It also provides callbacks
+   for both the core code and all <structfield>amcanunique</> access
+   methods to release all value locks. The routine may need to do so
+   for all value locks held while it blocks pending the outcome of a
+   conflicting transaction.  The AM may then report an unsuccessful
+   attempt at value locking, obliging the core code to restart all
+   value locking for all unique indexes. see <xref
+   linkend="index-unique-checks"> for more details.
+  </para>
+
+  <para>
+<programlisting>
 bool
 aminsert (Relation indexRelation,
           Datum *values,
           bool *isnull,
           ItemPointer heap_tid,
           Relation heapRelation,
-          IndexUniqueCheck checkUnique);
+          IndexUniqueCheck checkUnique,
+          SpeculativeState *state);
 </programlisting>
    Insert a new tuple into an existing index.  The <literal>values</> and
    <literal>isnull</> arrays give the key values to be indexed, and
@@ -190,11 +250,15 @@ aminsert (Relation indexRelation,
    If the access method supports unique indexes (its
    <structname>pg_am</>.<structfield>amcanunique</> flag is true) then
    <literal>checkUnique</> indicates the type of uniqueness check to
-   perform.  This varies depending on whether the unique constraint is
-   deferrable; see <xref linkend="index-unique-checks"> for details.
-   Normally the access method only needs the <literal>heapRelation</>
-   parameter when performing uniqueness checking (since then it will have to
-   look into the heap to verify tuple liveness).
+   perform, and <literal>state</> indicates state that is passed
+   backwards and forwards between the AM and core code to manage
+   speculative insertion state, and to provide a callback to release
+   all value locks held.  <literal>checkUnique</> varies depending on
+   whether the unique constraint is deferrable; see <xref
+   linkend="index-unique-checks"> for details.  Normally the access
+   method only needs the <literal>heapRelation</> parameter when
+   performing uniqueness checking (since then it will have to look
+   into the heap to verify tuple liveness).
   </para>
 
   <para>
@@ -766,7 +830,15 @@ amrestrpos (IndexScanDesc scan);
    using <firstterm>unique indexes</>, which are indexes that disallow
    multiple entries with identical keys.  An access method that supports this
    feature sets <structname>pg_am</>.<structfield>amcanunique</> true.
-   (At present, only b-tree supports it.)
+   (At present, only b-tree supports it.)  Note that
+   <structfield>amcanunique</> access methods are also obliged to
+   support <quote>speculative insertion</> via phased locking in
+   advance of heap tuple insertion, where <quote>value locks</>
+   on values proposed for insertion are held across multiple
+   <structfield>amcanunique</> indexes concurrently.  Speculative
+   insertion is used by <command>INSERT</command> statements when
+   <literal>ON CONFLICT UPDATE</literal> or <literal>ON CONFLICT
+   IGNORE</literal> is specified.
   </para>
 
   <para>
@@ -793,14 +865,38 @@ amrestrpos (IndexScanDesc scan);
        commits.  If it rolls back then there is no conflict.  If it commits
        without deleting the conflicting row again, there is a uniqueness
        violation.  (In practice we just wait for the other transaction to
-       end and then redo the visibility check in toto.)
+       end and then redo the visibility check in toto).  However,
+       during speculative insertion, where a unique constraint
+       violation cannot be thrown, but it is unlikely to be practical
+       to hold on to a value lock indefinitely pending the outcome of
+       another transaction, a callback is provided to instruct the
+       core code to release each index value lock.  When a wait on the
+       conflicting transaction is complete, the AM specifies that the
+       core code should retry its slot insertion from scratch,
+       possibly reacquiring value locks on previously locked values on
+       seperate, earlier-locked unique indexes.
+      </para>
+      <para>
+       Note that the unlocking callback is called twice in the event
+       of locking/updating being indicated -- the first call (before
+       locking/updating the slot) releases functional value locks, and
+       the second call (after locking/updating) releases an interlock
+       against VACUUM (this should only be necessary for the merge-on
+       unique index).  This is necessary because it would be bad news
+       to attempt to lock/update a row that happens to occupy the same
+       heap slot as a row version that the AM has made a determination
+       about the non-uniqueness of. XXX:  There are open questions
+       around VACUUM interlocking.
       </para>
      </listitem>
      <listitem>
       <para>
        Similarly, if a conflicting valid row has been deleted by an
        as-yet-uncommitted transaction, the would-be inserter must wait
-       for that transaction to commit or abort, and then repeat the test.
+       for that transaction to commit or abort, and then repeat the test,
+       or in the case of speculative insertion, start value locking
+       for all values proposed for insertion by the current executor
+       slot from the very beginning.
       </para>
      </listitem>
     </itemizedlist>
@@ -814,6 +910,7 @@ amrestrpos (IndexScanDesc scan);
    ordinary scenario of inserting a row that's just been created by
    the current transaction.  It can happen during
    <command>CREATE UNIQUE INDEX CONCURRENTLY</>, however.)
+   Speculative inserters need not bother with this.
   </para>
 
   <para>
@@ -865,7 +962,8 @@ amrestrpos (IndexScanDesc scan);
        method must allow duplicate entries into the index, and report any
        potential duplicates by returning FALSE from <function>aminsert</>.
        For each row for which FALSE is returned, a deferred recheck will
-       be scheduled.
+       be scheduled.  Speculative insertion into deferred unique indexes is not
+       supported.
       </para>
 
       <para>
@@ -900,6 +998,33 @@ amrestrpos (IndexScanDesc scan);
        for the same tuple values as were used in the original insertion.
       </para>
      </listitem>
+     <listitem>
+      <para>
+       <literal>UNIQUE_CHECK_SPEC</> indicates that the call is the
+       second phase of speculative insertion, corresponding to an
+       earlier <function>amlock</> call.  Value locks should already
+       be held from the first phae for unique index insertion to pick
+       up from, with a heap tuple pointer now past to finish the
+       insertion with.  The core code will have previously called
+       <function>amlock</> in respect of each index value as part of
+       this slot insertion.  Conceptually, the implementation performs
+       the index tuple insertion in a staggered manner, with the work
+       broken out into discrete locking and insertion phases, with the
+       possibility of not continuing with insertion (to lock a row for
+       update, for example) in the event of total consensus to proceed
+       among unique indexes not emerging.
+      </para>
+
+      <para>
+       Precautions must be taken around value locking.  These are
+       separately noted in the <function>amlock</> documentation.  If
+       insertion proceeds in respect of a given slot, and
+       <function>aminsert</> is called with a
+       <literal>UNIQUE_CHECK_SPEC</> argument, the
+       <function>aminsert</> implementation is obligated to release
+       its value lock on the unique index as part of insertion.
+      </para>
+     </listitem>
     </itemizedlist>
   </para>
 
diff --git a/src/backend/access/nbtree/README b/src/backend/access/nbtree/README
index 4820f76..2e6627a 100644
--- a/src/backend/access/nbtree/README
+++ b/src/backend/access/nbtree/README
@@ -568,6 +568,81 @@ item is irrelevant, and need not be stored at all.  This arrangement
 corresponds to the fact that an L&Y non-leaf page has one more pointer
 than key.
 
+Notes about value locking for speculative insertion
+---------------------------------------------------
+
+As an amcanunique AM, the btree implementation is required to support
+"speculative insertion".  This means that the value locking method
+through which unique index enforcement conventionally occurs is
+extended and generalized, such that insertion is staggered:  the core
+code attempts to get full consensus on whether values proposed for
+insertion will not cause duplicate key violations.  Speculative
+insertion is only possible for unique index insertion without deferred
+uniqueness checking (since speculative insertion into a deferred
+unique constraint's index is a contradiction in terms).
+
+For conventional unique index insertion, the Btree implementation
+exclusive locks a buffer holding the first page that the value to be
+inserted could possibly be on, though only for an instant, during and
+shortly after uniqueness verification.  It would not be acceptable to
+hold this lock across complex operations for the duration of the
+remainder of the first phase of speculative insertion.  Therefore, we
+convert this exclusive buffer lock to an exclusive page lock managed
+by the lock manager, thereby greatly ameliorating the consequences of
+undiscovered deadlocking implementation bugs (though deadlocks are not
+expected), and minimizing the impact on system interruptibility, while
+not affecting index scans.
+
+It may be useful to informally think of the page lock type acquired by
+speculative insertion as similar to an intention exclusive lock, a
+type of lock found in some legacy 2PL database systems that use
+multi-granularity locking.  A session establishes the exclusive right
+to subsequently establish a full write lock, without actually blocking
+reads of the page unless and until a lock conversion actually occurs,
+at which point both reads and writes are blocked.  Under this mental
+model, buffer shared locks can be thought of as intention shared
+locks.
+
+As implemented, these heavyweight locks are only relevant to the
+insertion case;  at no other point are they actually considered, since
+insertion is the only way through which new values are introduced.
+The first page a value proposed for insertion into an index could be
+on represents a natural choke point for our extended, though still
+rather limited system of value locking.  Naturally, when we perform a
+"lock escalation" and acquire an exclusive buffer lock, all other
+buffer locks on the same buffer are blocked, which is how the
+implementation localizes knowledge about the heavyweight lock to
+insertion-related routines.  Apart from deletion, all exclusive
+locking of Btree buffers happen as a direct or indirect result of
+insertion, so this approach is sufficient.  (Actually, an exclusive
+lock may still be acquired without insertion to initialize a root
+page, but that hardly matters).  Note that holding a buffer pin for
+the duration of value locking is necessary to ensure that
+non-speculative inserters notice that it is necessary to acquire a
+heavyweight lock.
+
+All value locks are dropped immediately as speculative insertion is
+aborted, as the implementation waits on the outcome of another xact,
+or as "insertion proper" occurs.  These page-level locks are not
+intended to last more than an instant.  In general, the protocol for
+heavyweight locking Btree pages is that heavyweight locks are acquired
+before any buffer locks are held, while the locks are only released
+after all buffer locks are released.  While not a hard and fast rule,
+presently we avoid heavyweight page locking more than one page per
+unique index concurrently.
+
+The core code inserts into indexes in a well-defined order:  Sorted by
+OID.  This is a general precaution against deadlock hazards in AMs
+that acquire exclusive locks.  However, during the first phase of
+speculative insertion, corresponding locking operations first occur in
+reverse order (for unique indexes only).  This has the benefit of
+reducing lock contention, by guaranteeing that only heap tuple
+insertion occurs between value locking and index tuple insertion once
+consensus to proceed emerges.  The protocol for releasing value locks
+is that the core system always does so in reverse order to the
+original locking order (so "right-way-around"), either during
+insertion or when a would-be duplicate conflict is found.
+
 Notes to Operator Class Implementors
 ------------------------------------
 
diff --git a/src/backend/executor/README b/src/backend/executor/README
index 8afa1e3..1aa21fd 100644
--- a/src/backend/executor/README
+++ b/src/backend/executor/README
@@ -200,3 +200,37 @@ is no explicit prohibition on SRFs in UPDATE, but the net effect will be
 that only the first result row of an SRF counts, because all subsequent
 rows will result in attempts to re-update an already updated target row.
 This is historical behavior and seems not worth changing.)
+
+Speculative insertion
+---------------------
+
+Speculative insertion is a process that the executor manages for the benefit of
+INSERT...ON CONFLICT UPDATE... .  The basic idea is that values within AMs
+(that do not currently exist) are speculatively locked.  If a consensus to
+insert emerges among all unique indexes, we proceed with physical index tuple
+insertion for each unique index in turn, releasing value locks as each physical
+insertion is performed.  Otherwise, we must UPDATE the existing value (or IGNORE).
+
+When we UPDATE, value locks are released before an opportunistic attempt at
+locking a conclusively visible conflicting tuple occurs. If this process fails,
+we retry.  We may retry indefinitely.  Failing to release value locks serves no
+practical purpose, since they don't prevent many types of conflicts that the
+UPDATE case must care about, and is actively harmful, since it will result in
+unprincipled deadlocking under high concurrency.
+
+The representation of the UPDATE query tree is as a separate query tree,
+auxiliary to the main INSERT query tree, and its plan is not formally a subplan
+of the parent INSERT's.  Rather, the plan's state is used selectively by its
+parent.
+
+Having successfully locked a definitively visible tuple, we update it, applying
+the EvalPlanQual() query execution mechanism to the latest (at just determined
+by an amcanunique AM) conclusively visible, now locked tuple.  Earlier versions
+are not evaluated against our qual, and we never directly walk the update chain
+in the event of the tuple being deleted/updated (which is conceptually a
+conflict).  The process simply restarts without making useful progress in the
+present iteration.  It is sometimes necessary to UPDATE a row where no row
+version is visible, so it seems inconsistent to require that earlier versions
+(including a version that may exist that is visible to our command's MVCC
+snapshot) must satisfy the qual just because there happened to be a version
+visible, where otherwise no evaluation would occur.
-- 
1.9.1

0003-Tests-for-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patchtext/x-patch; charset=US-ASCII; name=0003-Tests-for-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patchDownload
From 881564456e3c0b868324f61568f835f330cb2ad3 Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@heroku.com>
Date: Wed, 27 Aug 2014 15:11:15 -0700
Subject: [PATCH 3/4] Tests for INSERT ... ON CONFLICT {UPDATE | IGNORE}

Add dedicated isolation tests for both UPDATE and IGNORE variants,
illustrating the "MVCC violation" that allows a READ COMMITTED
transaction's UPDATE to succeed in updating a tuple with no version
visible to its command's MVCC snapshot.  Regression tests are for the
most part intended to exercise interactions with inter-related features.
Add a few general purpose smoke tests too.
---
 .../isolation/expected/insert-conflict-ignore.out  | 23 ++++++
 .../isolation/expected/insert-conflict-update.out  | 23 ++++++
 src/test/isolation/isolation_schedule              |  2 +
 .../isolation/specs/insert-conflict-ignore.spec    | 41 ++++++++++
 .../isolation/specs/insert-conflict-update.spec    | 40 ++++++++++
 src/test/regress/expected/inherit.out              |  3 +
 src/test/regress/expected/privileges.out           |  5 ++
 src/test/regress/expected/rules.out                | 22 +++++-
 src/test/regress/expected/subselect.out            | 18 +++++
 src/test/regress/expected/triggers.out             | 90 ++++++++++++++++++++++
 src/test/regress/expected/updatable_views.out      |  2 +
 src/test/regress/expected/update.out               |  5 ++
 src/test/regress/expected/with.out                 | 64 +++++++++++++++
 src/test/regress/input/constraints.source          |  5 ++
 src/test/regress/output/constraints.source         | 15 +++-
 src/test/regress/sql/inherit.sql                   |  3 +
 src/test/regress/sql/privileges.sql                |  3 +
 src/test/regress/sql/rules.sql                     |  9 +++
 src/test/regress/sql/subselect.sql                 | 14 ++++
 src/test/regress/sql/triggers.sql                  | 58 ++++++++++++++
 src/test/regress/sql/updatable_views.sql           |  1 +
 src/test/regress/sql/update.sql                    |  8 ++
 src/test/regress/sql/with.sql                      | 37 +++++++++
 23 files changed, 485 insertions(+), 6 deletions(-)
 create mode 100644 src/test/isolation/expected/insert-conflict-ignore.out
 create mode 100644 src/test/isolation/expected/insert-conflict-update.out
 create mode 100644 src/test/isolation/specs/insert-conflict-ignore.spec
 create mode 100644 src/test/isolation/specs/insert-conflict-update.spec

diff --git a/src/test/isolation/expected/insert-conflict-ignore.out b/src/test/isolation/expected/insert-conflict-ignore.out
new file mode 100644
index 0000000..e6cc2a1
--- /dev/null
+++ b/src/test/isolation/expected/insert-conflict-ignore.out
@@ -0,0 +1,23 @@
+Parsed test spec with 2 sessions
+
+starting permutation: ignore1 ignore2 c1 select2 c2
+step ignore1: INSERT INTO ints(key, val) VALUES(1, 'ignore1') ON CONFLICT IGNORE;
+step ignore2: INSERT INTO ints(key, val) VALUES(1, 'ignore2') ON CONFLICT IGNORE; <waiting ...>
+step c1: COMMIT;
+step ignore2: <... completed>
+step select2: SELECT * FROM ints;
+key            val            
+
+1              ignore1        
+step c2: COMMIT;
+
+starting permutation: ignore1 ignore2 a1 select2 c2
+step ignore1: INSERT INTO ints(key, val) VALUES(1, 'ignore1') ON CONFLICT IGNORE;
+step ignore2: INSERT INTO ints(key, val) VALUES(1, 'ignore2') ON CONFLICT IGNORE; <waiting ...>
+step a1: ABORT;
+step ignore2: <... completed>
+step select2: SELECT * FROM ints;
+key            val            
+
+1              ignore2        
+step c2: COMMIT;
diff --git a/src/test/isolation/expected/insert-conflict-update.out b/src/test/isolation/expected/insert-conflict-update.out
new file mode 100644
index 0000000..8b2ad84
--- /dev/null
+++ b/src/test/isolation/expected/insert-conflict-update.out
@@ -0,0 +1,23 @@
+Parsed test spec with 2 sessions
+
+starting permutation: insert1 insert2 c1 select2 c2
+step insert1: INSERT INTO upsert(key, val) VALUES(1, 'insert1') ON CONFLICT UPDATE set val = val || ' updated by insert1';
+step insert2: INSERT INTO upsert(key, val) VALUES(1, 'insert2') ON CONFLICT UPDATE set val = val || ' updated by insert2'; <waiting ...>
+step c1: COMMIT;
+step insert2: <... completed>
+step select2: SELECT * FROM upsert;
+key            val            
+
+1              insert1 updated by insert2
+step c2: COMMIT;
+
+starting permutation: insert1 insert2 a1 select2 c2
+step insert1: INSERT INTO upsert(key, val) VALUES(1, 'insert1') ON CONFLICT UPDATE set val = val || ' updated by insert1';
+step insert2: INSERT INTO upsert(key, val) VALUES(1, 'insert2') ON CONFLICT UPDATE set val = val || ' updated by insert2'; <waiting ...>
+step a1: ABORT;
+step insert2: <... completed>
+step select2: SELECT * FROM upsert;
+key            val            
+
+1              insert2        
+step c2: COMMIT;
diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule
index 10c89ff..fa92329 100644
--- a/src/test/isolation/isolation_schedule
+++ b/src/test/isolation/isolation_schedule
@@ -16,6 +16,8 @@ test: fk-deadlock2
 test: eval-plan-qual
 test: lock-update-delete
 test: lock-update-traversal
+test: insert-conflict-ignore
+test: insert-conflict-update
 test: delete-abort-savept
 test: delete-abort-savept-2
 test: aborted-keyrevoke
diff --git a/src/test/isolation/specs/insert-conflict-ignore.spec b/src/test/isolation/specs/insert-conflict-ignore.spec
new file mode 100644
index 0000000..fde43b3
--- /dev/null
+++ b/src/test/isolation/specs/insert-conflict-ignore.spec
@@ -0,0 +1,41 @@
+# INSERT...ON CONFLICT IGNORE test
+#
+# This test tries to expose problems with the interaction between concurrent
+# sessions during INSERT...ON CONFLICT IGNORE.
+#
+# The convention here is that session 1 always ends up inserting, and session 2
+# always ends up ignoring.
+
+setup
+{
+  CREATE TABLE ints (key int primary key, val text);
+}
+
+teardown
+{
+  DROP TABLE ints;
+}
+
+session "s1"
+setup
+{
+  BEGIN ISOLATION LEVEL READ COMMITTED;
+}
+step "ignore1" { INSERT INTO ints(key, val) VALUES(1, 'ignore1') ON CONFLICT IGNORE; }
+step "c1" { COMMIT; }
+step "a1" { ABORT; }
+
+session "s2"
+setup
+{
+  BEGIN ISOLATION LEVEL READ COMMITTED;
+}
+step "ignore2" { INSERT INTO ints(key, val) VALUES(1, 'ignore2') ON CONFLICT IGNORE; }
+step "select2" { SELECT * FROM ints; }
+step "c2" { COMMIT; }
+step "a2" { ABORT; }
+
+# Regular case where one session block-waits on another to determine if it
+# should proceed with an insert or ignore.
+permutation "ignore1" "ignore2" "c1" "select2" "c2"
+permutation "ignore1" "ignore2" "a1" "select2" "c2"
diff --git a/src/test/isolation/specs/insert-conflict-update.spec b/src/test/isolation/specs/insert-conflict-update.spec
new file mode 100644
index 0000000..e5f62b2
--- /dev/null
+++ b/src/test/isolation/specs/insert-conflict-update.spec
@@ -0,0 +1,40 @@
+# INSERT...ON CONFLICT UPDATE test
+#
+# This test tries to expose problems with the interaction between concurrent
+# sessions.
+
+setup
+{
+  CREATE TABLE upsert (key int primary key, val text);
+}
+
+teardown
+{
+  DROP TABLE upsert;
+}
+
+session "s1"
+setup
+{
+  BEGIN ISOLATION LEVEL READ COMMITTED;
+}
+step "insert1" { INSERT INTO upsert(key, val) VALUES(1, 'insert1') ON CONFLICT UPDATE set val = val || ' updated by insert1'; }
+step "c1" { COMMIT; }
+step "a1" { ABORT; }
+
+session "s2"
+setup
+{
+  BEGIN ISOLATION LEVEL READ COMMITTED;
+}
+step "insert2" { INSERT INTO upsert(key, val) VALUES(1, 'insert2') ON CONFLICT UPDATE set val = val || ' updated by insert2'; }
+step "select2" { SELECT * FROM upsert; }
+step "c2" { COMMIT; }
+step "a2" { ABORT; }
+
+# One session (session 2) block-waits on another (session 1) to determine if it
+# should proceed with an insert or update.  Notably, this entails updating a
+# tuple while there is no version of that tuple visible to the updating
+# session's snapshot.  This is permitted only in READ COMMITTED mode.
+permutation "insert1" "insert2" "c1" "select2" "c2"
+permutation "insert1" "insert2" "a1" "select2" "c2"
diff --git a/src/test/regress/expected/inherit.out b/src/test/regress/expected/inherit.out
index 56e2c99..27aae0e 100644
--- a/src/test/regress/expected/inherit.out
+++ b/src/test/regress/expected/inherit.out
@@ -13,6 +13,9 @@ INSERT INTO a(aa) VALUES('aaaaa');
 INSERT INTO a(aa) VALUES('aaaaaa');
 INSERT INTO a(aa) VALUES('aaaaaaa');
 INSERT INTO a(aa) VALUES('aaaaaaaa');
+-- INSERT ON CONFLICT UPDATE does not support inheritance
+INSERT INTO a(aa) VALUES('aaaaaaaa') ON CONFLICT UPDATE set aa = 'bbbbbbbb';
+ERROR:  INSERT...ON CONFLICT does not support table inheritance
 INSERT INTO b(aa) VALUES('bbb');
 INSERT INTO b(aa) VALUES('bbbb');
 INSERT INTO b(aa) VALUES('bbbbb');
diff --git a/src/test/regress/expected/privileges.out b/src/test/regress/expected/privileges.out
index 1675075..243eb6c 100644
--- a/src/test/regress/expected/privileges.out
+++ b/src/test/regress/expected/privileges.out
@@ -367,6 +367,11 @@ UPDATE atest5 SET one = 8; -- fail
 ERROR:  permission denied for relation atest5
 UPDATE atest5 SET three = 5, one = 2; -- fail
 ERROR:  permission denied for relation atest5
+INSERT INTO atest5(two) VALUES (6) ON CONFLICT UPDATE set three = 10; -- ok
+INSERT INTO atest5(two) VALUES (6) ON CONFLICT UPDATE set one = 8; -- fails (due to UPDATE)
+ERROR:  permission denied for relation atest5
+INSERT INTO atest5(three) VALUES (4) ON CONFLICT UPDATE set three = 10; -- fail (due to INSERT)
+ERROR:  permission denied for relation atest5
 SET SESSION AUTHORIZATION regressuser1;
 REVOKE ALL (one) ON atest5 FROM regressuser4;
 GRANT SELECT (one,two,blue) ON atest6 TO regressuser4;
diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out
index ca56b47..4490dab 100644
--- a/src/test/regress/expected/rules.out
+++ b/src/test/regress/expected/rules.out
@@ -1123,12 +1123,19 @@ SELECT * FROM shoelace_log ORDER BY sl_name;
 	SELECT * FROM shoelace_obsolete WHERE sl_avail = 0;
 insert into shoelace values ('sl9', 0, 'pink', 35.0, 'inch', 0.0);
 insert into shoelace values ('sl10', 1000, 'magenta', 40.0, 'inch', 0.0);
+-- insert rules still apply - ON CONFLICT UPDATE is irrelevant
+insert into shoelace values ('sl10', 1000, 'magenta', 40.0, 'inch', 0.0)
+  on conflict ignore;
+insert into shoelace values ('sl10', 1000, 'magenta', 70.0, 'inch', 0.0)
+  on conflict update set sl_color = 'orange';
 SELECT * FROM shoelace_obsolete ORDER BY sl_len_cm;
   sl_name   | sl_avail |  sl_color  | sl_len | sl_unit  | sl_len_cm 
 ------------+----------+------------+--------+----------+-----------
  sl9        |        0 | pink       |     35 | inch     |      88.9
  sl10       |     1000 | magenta    |     40 | inch     |     101.6
-(2 rows)
+ sl10       |     1000 | magenta    |     40 | inch     |     101.6
+ sl10       |     1000 | magenta    |     70 | inch     |     177.8
+(4 rows)
 
 SELECT * FROM shoelace_candelete;
   sl_name   | sl_avail |  sl_color  | sl_len | sl_unit  | sl_len_cm 
@@ -1144,6 +1151,8 @@ SELECT * FROM shoelace ORDER BY sl_name;
 ------------+----------+------------+--------+----------+-----------
  sl1        |        5 | black      |     80 | cm       |        80
  sl10       |     1000 | magenta    |     40 | inch     |     101.6
+ sl10       |     1000 | magenta    |     40 | inch     |     101.6
+ sl10       |     1000 | magenta    |     70 | inch     |     177.8
  sl2        |        6 | black      |    100 | cm       |       100
  sl3        |       10 | black      |     35 | inch     |      88.9
  sl4        |        8 | black      |     40 | inch     |     101.6
@@ -1151,7 +1160,7 @@ SELECT * FROM shoelace ORDER BY sl_name;
  sl6        |       20 | brown      |    0.9 | m        |        90
  sl7        |        6 | brown      |     60 | cm       |        60
  sl8        |       21 | brown      |     40 | inch     |     101.6
-(9 rows)
+(11 rows)
 
 SELECT * FROM shoe ORDER BY shoename;
   shoename  | sh_avail |  slcolor   | slminlen | slminlen_cm | slmaxlen | slmaxlen_cm |  slunit  
@@ -2324,6 +2333,15 @@ DETAIL:  Key (id3a, id3c)=(1, 13) is not present in table "rule_and_refint_t2".
 insert into rule_and_refint_t3 values (1, 13, 11, 'row6');
 ERROR:  insert or update on table "rule_and_refint_t3" violates foreign key constraint "rule_and_refint_t3_id3a_fkey"
 DETAIL:  Key (id3a, id3b)=(1, 13) is not present in table "rule_and_refint_t1".
+insert into rule_and_refint_t3 values (1, 13, 11, 'row6')
+  on conflict ignore;
+ERROR:  insert or update on table "rule_and_refint_t3" violates foreign key constraint "rule_and_refint_t3_id3a_fkey"
+DETAIL:  Key (id3a, id3b)=(1, 13) is not present in table "rule_and_refint_t1".
+insert into rule_and_refint_t3 values (1, 13, 11, 'row6')
+  on conflict update set id3a = 1, id2b = 11, id3c = 11;
+ERROR:  column "id2b" of relation "rule_and_refint_t3" does not exist
+LINE 2:   on conflict update set id3a = 1, id2b = 11, id3c = 11;
+                                           ^
 create rule rule_and_refint_t3_ins as on insert to rule_and_refint_t3
 	where (exists (select 1 from rule_and_refint_t3
 			where (((rule_and_refint_t3.id3a = new.id3a)
diff --git a/src/test/regress/expected/subselect.out b/src/test/regress/expected/subselect.out
index 01c9130..9769599 100644
--- a/src/test/regress/expected/subselect.out
+++ b/src/test/regress/expected/subselect.out
@@ -599,6 +599,24 @@ from
 (0 rows)
 
 --
+-- Test case for subselect within UPDATE of INSERT...ON CONFLICT UPDATE
+--
+create temp table upsert(key int4 primary key, val text);
+insert into upsert values(1, 'val') on conflict update set val = 'not seen';
+insert into upsert values(1, 'val') on conflict update set val = 'should see ' || (select f1 from int4_tbl where f1 != 0 limit 1)::text;
+ERROR:  paramaterized auxiliary UPDATE queries are unsupported
+select * from upsert;
+ key | val 
+-----+-----
+   1 | val
+(1 row)
+
+with aa as (select 'int4_tbl' u from int4_tbl limit 1)
+insert into upsert values (1, 'x'), (999, 'y')
+on conflict update set val = (select u from aa)
+returning *;
+ERROR:  paramaterized auxiliary UPDATE queries are unsupported
+--
 -- Test case for cross-type partial matching in hashed subplan (bug #7597)
 --
 create temp table outer_7597 (f1 int4, f2 int4);
diff --git a/src/test/regress/expected/triggers.out b/src/test/regress/expected/triggers.out
index f1a5fde..803532c 100644
--- a/src/test/regress/expected/triggers.out
+++ b/src/test/regress/expected/triggers.out
@@ -1731,3 +1731,93 @@ select * from self_ref_trigger;
 drop table self_ref_trigger;
 drop function self_ref_trigger_ins_func();
 drop function self_ref_trigger_del_func();
+--
+-- Verify behavior of before and after triggers with INSERT...ON CONFLICT
+-- UPDATE
+--
+create table upsert (key int4 primary key, color text);
+create function upsert_before_func()
+  returns trigger language plpgsql as
+$$
+begin
+  if (TG_OP = 'UPDATE') then
+    raise warning 'before update (old): %', old.*::text;
+    raise warning 'before update (new): %', new.*::text;
+  elsif (TG_OP = 'INSERT') then
+    raise warning 'before insert (new): %', new.*::text;
+    if new.key % 2 = 0 then
+      new.key := new.key + 1;
+      new.color := new.color || ' trig modified';
+      raise warning 'before insert (new, modified): %', new.*::text;
+    end if;
+  end if;
+  return new;
+end;
+$$;
+create trigger upsert_before_trig before insert or update on upsert
+  for each row execute procedure upsert_before_func();
+create function upsert_after_func()
+  returns trigger language plpgsql as
+$$
+begin
+  if (TG_OP = 'UPDATE') then
+    raise warning 'after update (old): %', new.*::text;
+    raise warning 'after update (new): %', new.*::text;
+  elsif (TG_OP = 'INSERT') then
+    raise warning 'after insert (new): %', new.*::text;
+  end if;
+  return null;
+end;
+$$;
+create trigger upsert_after_trig after insert or update on upsert
+  for each row execute procedure upsert_after_func();
+insert into upsert values(1, 'black') on conflict update set color = 'updated ' || color;
+WARNING:  before insert (new): (1,black)
+WARNING:  after insert (new): (1,black)
+insert into upsert values(2, 'red') on conflict update set color = 'updated ' || color;
+WARNING:  before insert (new): (2,red)
+WARNING:  before insert (new, modified): (3,"red trig modified")
+WARNING:  after insert (new): (3,"red trig modified")
+insert into upsert values(3, 'orange') on conflict update set color = 'updated ' || color;
+WARNING:  before insert (new): (3,orange)
+WARNING:  before update (old): (3,"red trig modified")
+WARNING:  before update (new): (3,"updated red trig modified")
+WARNING:  after update (old): (3,"updated red trig modified")
+WARNING:  after update (new): (3,"updated red trig modified")
+insert into upsert values(4, 'green') on conflict update set color = 'updated ' || color;
+WARNING:  before insert (new): (4,green)
+WARNING:  before insert (new, modified): (5,"green trig modified")
+WARNING:  after insert (new): (5,"green trig modified")
+insert into upsert values(5, 'purple') on conflict update set color = 'updated ' || color;
+WARNING:  before insert (new): (5,purple)
+WARNING:  before update (old): (5,"green trig modified")
+WARNING:  before update (new): (5,"updated green trig modified")
+WARNING:  after update (old): (5,"updated green trig modified")
+WARNING:  after update (new): (5,"updated green trig modified")
+insert into upsert values(6, 'white') on conflict update set color = 'updated ' || color;
+WARNING:  before insert (new): (6,white)
+WARNING:  before insert (new, modified): (7,"white trig modified")
+WARNING:  after insert (new): (7,"white trig modified")
+insert into upsert values(7, 'pink') on conflict update set color = 'updated ' || color;
+WARNING:  before insert (new): (7,pink)
+WARNING:  before update (old): (7,"white trig modified")
+WARNING:  before update (new): (7,"updated white trig modified")
+WARNING:  after update (old): (7,"updated white trig modified")
+WARNING:  after update (new): (7,"updated white trig modified")
+insert into upsert values(8, 'yellow') on conflict update set color = 'updated ' || color;
+WARNING:  before insert (new): (8,yellow)
+WARNING:  before insert (new, modified): (9,"yellow trig modified")
+WARNING:  after insert (new): (9,"yellow trig modified")
+select * from upsert;
+ key |            color            
+-----+-----------------------------
+   1 | black
+   3 | updated red trig modified
+   5 | updated green trig modified
+   7 | updated white trig modified
+   9 | yellow trig modified
+(5 rows)
+
+drop table upsert;
+drop function upsert_before_func();
+drop function upsert_after_func();
diff --git a/src/test/regress/expected/updatable_views.out b/src/test/regress/expected/updatable_views.out
index ea9197a..3403879 100644
--- a/src/test/regress/expected/updatable_views.out
+++ b/src/test/regress/expected/updatable_views.out
@@ -215,6 +215,8 @@ INSERT INTO rw_view15 VALUES (3, 'ROW 3'); -- should fail
 ERROR:  cannot insert into column "upper" of view "rw_view15"
 DETAIL:  View columns that are not columns of their base relation are not updatable.
 INSERT INTO rw_view15 (a) VALUES (3); -- should be OK
+INSERT INTO rw_view15 (a) VALUES (3) ON CONFLICT UPDATE SET upper = upper; -- fails, unsupported
+ERROR:  INSERT ON CONFLICT is not supported on updatable views
 ALTER VIEW rw_view15 ALTER COLUMN upper SET DEFAULT 'NOT SET';
 INSERT INTO rw_view15 (a) VALUES (4); -- should fail
 ERROR:  cannot insert into column "upper" of view "rw_view15"
diff --git a/src/test/regress/expected/update.out b/src/test/regress/expected/update.out
index 1de2a86..41da5e9 100644
--- a/src/test/regress/expected/update.out
+++ b/src/test/regress/expected/update.out
@@ -147,4 +147,9 @@ SELECT a, b, char_length(c) FROM update_test;
  42 |  12 |       10000
 (4 rows)
 
+ALTER TABLE update_test ADD constraint uuu UNIQUE(a);
+INSERT INTO update_test
+VALUES (21, 1, 'b'), (41, 1, 'b'), (42, 1, 'b')
+ON CONFLICT UPDATE SET (b, c) = (7, 'f');
+-- SELECT a, b FROM update_test;
 DROP TABLE update_test;
diff --git a/src/test/regress/expected/with.out b/src/test/regress/expected/with.out
index 06b372b..44a2f48 100644
--- a/src/test/regress/expected/with.out
+++ b/src/test/regress/expected/with.out
@@ -1806,6 +1806,70 @@ SELECT * FROM y;
   -400
 (22 rows)
 
+-- data-modifying WITH containing INSERT...ON CONFLICT UPDATE
+CREATE TABLE z AS SELECT i AS k, (i || ' v')::text v FROM generate_series(1, 16, 3) i;
+ALTER TABLE z ADD UNIQUE (k);
+WITH t AS (
+    INSERT INTO z SELECT i, 'insert'
+    FROM generate_series(0, 16) i
+    ON CONFLICT UPDATE SET v = v || ', now update'
+    RETURNING *
+)
+SELECT * FROM t JOIN y ON t.k = y.a ORDER BY a, k;
+ k |   v    | a 
+---+--------+---
+ 0 | insert | 0
+ 0 | insert | 0
+(2 rows)
+
+-- New query/snapshot demonstrates side-effects of previous query.
+SELECT * FROM z ORDER BY k;
+ k  |        v         
+----+------------------
+  0 | insert
+  1 | 1 v, now update
+  2 | insert
+  3 | insert
+  4 | 4 v, now update
+  5 | insert
+  6 | insert
+  7 | 7 v, now update
+  8 | insert
+  9 | insert
+ 10 | 10 v, now update
+ 11 | insert
+ 12 | insert
+ 13 | 13 v, now update
+ 14 | insert
+ 15 | insert
+ 16 | 16 v, now update
+(17 rows)
+
+--
+-- All these cases should fail, due to restrictions imposed upon the UPDATE
+-- portion of the query.
+--
+WITH aa AS (SELECT 1 a, 2 b)
+INSERT INTO z VALUES(1, 'insert')
+ON CONFLICT UPDATE SET V = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1);
+ERROR:  paramaterized auxiliary UPDATE queries are unsupported
+WITH aa AS (SELECT 1 a, 2 b)
+INSERT INTO z VALUES(1, 'insert')
+ON CONFLICT UPDATE SET v = ' update' WHERE k = (SELECT a FROM aa);
+ERROR:  paramaterized auxiliary UPDATE queries are unsupported
+WITH aa AS (SELECT 1 a, 2 b)
+INSERT INTO z VALUES(1, 'insert')
+ON CONFLICT UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1);
+ERROR:  paramaterized auxiliary UPDATE queries are unsupported
+WITH aa AS (SELECT 'a' a, 'b' b UNION ALL SELECT 'a' a, 'b' b)
+INSERT INTO z VALUES(1, 'insert')
+ON CONFLICT UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 'a' LIMIT 1);
+ERROR:  paramaterized auxiliary UPDATE queries are unsupported
+WITH aa AS (SELECT 1 a, 2 b)
+INSERT INTO z VALUES(1, (SELECT b || ' insert' FROM aa WHERE a = 1 ))
+ON CONFLICT UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1);
+ERROR:  paramaterized auxiliary UPDATE queries are unsupported
+DROP TABLE Z;
 -- check that run to completion happens in proper ordering
 TRUNCATE TABLE y;
 INSERT INTO y SELECT generate_series(1, 3);
diff --git a/src/test/regress/input/constraints.source b/src/test/regress/input/constraints.source
index 16d38f6..a004a7e 100644
--- a/src/test/regress/input/constraints.source
+++ b/src/test/regress/input/constraints.source
@@ -292,6 +292,11 @@ INSERT INTO UNIQUE_TBL VALUES (5, 'one');
 INSERT INTO UNIQUE_TBL (t) VALUES ('six');
 INSERT INTO UNIQUE_TBL (t) VALUES ('seven');
 
+INSERT INTO UNIQUE_TBL VALUES (5, 'five-upsert-insert') ON CONFLICT UPDATE SET t = 'five-upsert-update';
+INSERT INTO UNIQUE_TBL VALUES (6, 'six-upsert-insert') ON CONFLICT UPDATE SET t = 'six-upsert-update';
+-- should fail
+INSERT INTO UNIQUE_TBL VALUES (1, 'a'), (2, 'b'), (2, 'b')  ON CONFLICT UPDATE SET t = 'fails';
+
 SELECT '' AS five, * FROM UNIQUE_TBL;
 
 DROP TABLE UNIQUE_TBL;
diff --git a/src/test/regress/output/constraints.source b/src/test/regress/output/constraints.source
index 2ffd263..1f6870b 100644
--- a/src/test/regress/output/constraints.source
+++ b/src/test/regress/output/constraints.source
@@ -421,16 +421,23 @@ INSERT INTO UNIQUE_TBL VALUES (4, 'four');
 INSERT INTO UNIQUE_TBL VALUES (5, 'one');
 INSERT INTO UNIQUE_TBL (t) VALUES ('six');
 INSERT INTO UNIQUE_TBL (t) VALUES ('seven');
+INSERT INTO UNIQUE_TBL VALUES (5, 'five-upsert-insert') ON CONFLICT UPDATE SET t = 'five-upsert-update';
+INSERT INTO UNIQUE_TBL VALUES (6, 'six-upsert-insert') ON CONFLICT UPDATE SET t = 'six-upsert-update';
+-- should fail
+INSERT INTO UNIQUE_TBL VALUES (1, 'a'), (2, 'b'), (2, 'b')  ON CONFLICT UPDATE SET t = 'fails';
+ERROR:  could not lock instantaneously invisible tuple inserted in same transaction
+HINT:  Ensure that no rows proposed for insertion in the same command have constrained values that duplicate each other.
 SELECT '' AS five, * FROM UNIQUE_TBL;
- five | i |   t   
-------+---+-------
+ five | i |         t          
+------+---+--------------------
       | 1 | one
       | 2 | two
       | 4 | four
-      | 5 | one
       |   | six
       |   | seven
-(6 rows)
+      | 5 | five-upsert-update
+      | 6 | six-upsert-insert
+(7 rows)
 
 DROP TABLE UNIQUE_TBL;
 CREATE TABLE UNIQUE_TBL (i int, t text,
diff --git a/src/test/regress/sql/inherit.sql b/src/test/regress/sql/inherit.sql
index 09bb750..5101858 100644
--- a/src/test/regress/sql/inherit.sql
+++ b/src/test/regress/sql/inherit.sql
@@ -13,6 +13,9 @@ INSERT INTO a(aa) VALUES('aaaaaa');
 INSERT INTO a(aa) VALUES('aaaaaaa');
 INSERT INTO a(aa) VALUES('aaaaaaaa');
 
+-- INSERT ON CONFLICT UPDATE does not support inheritance
+INSERT INTO a(aa) VALUES('aaaaaaaa') ON CONFLICT UPDATE set aa = 'bbbbbbbb';
+
 INSERT INTO b(aa) VALUES('bbb');
 INSERT INTO b(aa) VALUES('bbbb');
 INSERT INTO b(aa) VALUES('bbbbb');
diff --git a/src/test/regress/sql/privileges.sql b/src/test/regress/sql/privileges.sql
index a0ff953..230b6d6 100644
--- a/src/test/regress/sql/privileges.sql
+++ b/src/test/regress/sql/privileges.sql
@@ -245,6 +245,9 @@ INSERT INTO atest5 VALUES (5,5,5); -- fail
 UPDATE atest5 SET three = 10; -- ok
 UPDATE atest5 SET one = 8; -- fail
 UPDATE atest5 SET three = 5, one = 2; -- fail
+INSERT INTO atest5(two) VALUES (6) ON CONFLICT UPDATE set three = 10; -- ok
+INSERT INTO atest5(two) VALUES (6) ON CONFLICT UPDATE set one = 8; -- fails (due to UPDATE)
+INSERT INTO atest5(three) VALUES (4) ON CONFLICT UPDATE set three = 10; -- fail (due to INSERT)
 
 SET SESSION AUTHORIZATION regressuser1;
 REVOKE ALL (one) ON atest5 FROM regressuser4;
diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql
index 1e15f84..91b5f2d 100644
--- a/src/test/regress/sql/rules.sql
+++ b/src/test/regress/sql/rules.sql
@@ -680,6 +680,11 @@ SELECT * FROM shoelace_log ORDER BY sl_name;
 
 insert into shoelace values ('sl9', 0, 'pink', 35.0, 'inch', 0.0);
 insert into shoelace values ('sl10', 1000, 'magenta', 40.0, 'inch', 0.0);
+-- insert rules still apply - ON CONFLICT UPDATE is irrelevant
+insert into shoelace values ('sl10', 1000, 'magenta', 40.0, 'inch', 0.0)
+  on conflict ignore;
+insert into shoelace values ('sl10', 1000, 'magenta', 70.0, 'inch', 0.0)
+  on conflict update set sl_color = 'orange';
 
 SELECT * FROM shoelace_obsolete ORDER BY sl_len_cm;
 SELECT * FROM shoelace_candelete;
@@ -844,6 +849,10 @@ insert into rule_and_refint_t3 values (1, 12, 11, 'row3');
 insert into rule_and_refint_t3 values (1, 12, 12, 'row4');
 insert into rule_and_refint_t3 values (1, 11, 13, 'row5');
 insert into rule_and_refint_t3 values (1, 13, 11, 'row6');
+insert into rule_and_refint_t3 values (1, 13, 11, 'row6')
+  on conflict ignore;
+insert into rule_and_refint_t3 values (1, 13, 11, 'row6')
+  on conflict update set id3a = 1, id2b = 11, id3c = 11;
 
 create rule rule_and_refint_t3_ins as on insert to rule_and_refint_t3
 	where (exists (select 1 from rule_and_refint_t3
diff --git a/src/test/regress/sql/subselect.sql b/src/test/regress/sql/subselect.sql
index 56707e2..7d6e35b 100644
--- a/src/test/regress/sql/subselect.sql
+++ b/src/test/regress/sql/subselect.sql
@@ -361,6 +361,20 @@ from
   int4_tbl i4 on dummy = i4.f1;
 
 --
+-- Test case for subselect within UPDATE of INSERT...ON CONFLICT UPDATE
+--
+create temp table upsert(key int4 primary key, val text);
+insert into upsert values(1, 'val') on conflict update set val = 'not seen';
+insert into upsert values(1, 'val') on conflict update set val = 'should see ' || (select f1 from int4_tbl where f1 != 0 limit 1)::text;
+
+select * from upsert;
+
+with aa as (select 'int4_tbl' u from int4_tbl limit 1)
+insert into upsert values (1, 'x'), (999, 'y')
+on conflict update set val = (select u from aa)
+returning *;
+
+--
 -- Test case for cross-type partial matching in hashed subplan (bug #7597)
 --
 
diff --git a/src/test/regress/sql/triggers.sql b/src/test/regress/sql/triggers.sql
index 0ea2c31..d3b6aa3 100644
--- a/src/test/regress/sql/triggers.sql
+++ b/src/test/regress/sql/triggers.sql
@@ -1173,3 +1173,61 @@ select * from self_ref_trigger;
 drop table self_ref_trigger;
 drop function self_ref_trigger_ins_func();
 drop function self_ref_trigger_del_func();
+
+--
+-- Verify behavior of before and after triggers with INSERT...ON CONFLICT
+-- UPDATE
+--
+create table upsert (key int4 primary key, color text);
+
+create function upsert_before_func()
+  returns trigger language plpgsql as
+$$
+begin
+  if (TG_OP = 'UPDATE') then
+    raise warning 'before update (old): %', old.*::text;
+    raise warning 'before update (new): %', new.*::text;
+  elsif (TG_OP = 'INSERT') then
+    raise warning 'before insert (new): %', new.*::text;
+    if new.key % 2 = 0 then
+      new.key := new.key + 1;
+      new.color := new.color || ' trig modified';
+      raise warning 'before insert (new, modified): %', new.*::text;
+    end if;
+  end if;
+  return new;
+end;
+$$;
+create trigger upsert_before_trig before insert or update on upsert
+  for each row execute procedure upsert_before_func();
+
+create function upsert_after_func()
+  returns trigger language plpgsql as
+$$
+begin
+  if (TG_OP = 'UPDATE') then
+    raise warning 'after update (old): %', new.*::text;
+    raise warning 'after update (new): %', new.*::text;
+  elsif (TG_OP = 'INSERT') then
+    raise warning 'after insert (new): %', new.*::text;
+  end if;
+  return null;
+end;
+$$;
+create trigger upsert_after_trig after insert or update on upsert
+  for each row execute procedure upsert_after_func();
+
+insert into upsert values(1, 'black') on conflict update set color = 'updated ' || color;
+insert into upsert values(2, 'red') on conflict update set color = 'updated ' || color;
+insert into upsert values(3, 'orange') on conflict update set color = 'updated ' || color;
+insert into upsert values(4, 'green') on conflict update set color = 'updated ' || color;
+insert into upsert values(5, 'purple') on conflict update set color = 'updated ' || color;
+insert into upsert values(6, 'white') on conflict update set color = 'updated ' || color;
+insert into upsert values(7, 'pink') on conflict update set color = 'updated ' || color;
+insert into upsert values(8, 'yellow') on conflict update set color = 'updated ' || color;
+
+select * from upsert;
+
+drop table upsert;
+drop function upsert_before_func();
+drop function upsert_after_func();
diff --git a/src/test/regress/sql/updatable_views.sql b/src/test/regress/sql/updatable_views.sql
index c072fca..0cc2f8c 100644
--- a/src/test/regress/sql/updatable_views.sql
+++ b/src/test/regress/sql/updatable_views.sql
@@ -69,6 +69,7 @@ DELETE FROM rw_view14 WHERE a=3; -- should be OK
 -- Partially updatable view
 INSERT INTO rw_view15 VALUES (3, 'ROW 3'); -- should fail
 INSERT INTO rw_view15 (a) VALUES (3); -- should be OK
+INSERT INTO rw_view15 (a) VALUES (3) ON CONFLICT UPDATE SET upper = upper; -- fails, unsupported
 ALTER VIEW rw_view15 ALTER COLUMN upper SET DEFAULT 'NOT SET';
 INSERT INTO rw_view15 (a) VALUES (4); -- should fail
 UPDATE rw_view15 SET upper='ROW 3' WHERE a=3; -- should fail
diff --git a/src/test/regress/sql/update.sql b/src/test/regress/sql/update.sql
index e71128c..2692eef 100644
--- a/src/test/regress/sql/update.sql
+++ b/src/test/regress/sql/update.sql
@@ -74,4 +74,12 @@ UPDATE update_test AS t SET b = update_test.b + 10 WHERE t.a = 10;
 UPDATE update_test SET c = repeat('x', 10000) WHERE c = 'car';
 SELECT a, b, char_length(c) FROM update_test;
 
+ALTER TABLE update_test ADD constraint uuu UNIQUE(a);
+
+INSERT INTO update_test
+VALUES (21, 1, 'b'), (41, 1, 'b'), (42, 1, 'b')
+ON CONFLICT UPDATE SET (b, c) = (7, 'f');
+
+-- SELECT a, b FROM update_test;
+
 DROP TABLE update_test;
diff --git a/src/test/regress/sql/with.sql b/src/test/regress/sql/with.sql
index c716369..200c200 100644
--- a/src/test/regress/sql/with.sql
+++ b/src/test/regress/sql/with.sql
@@ -795,6 +795,43 @@ SELECT * FROM t LIMIT 10;
 
 SELECT * FROM y;
 
+-- data-modifying WITH containing INSERT...ON CONFLICT UPDATE
+CREATE TABLE z AS SELECT i AS k, (i || ' v')::text v FROM generate_series(1, 16, 3) i;
+ALTER TABLE z ADD UNIQUE (k);
+
+WITH t AS (
+    INSERT INTO z SELECT i, 'insert'
+    FROM generate_series(0, 16) i
+    ON CONFLICT UPDATE SET v = v || ', now update'
+    RETURNING *
+)
+SELECT * FROM t JOIN y ON t.k = y.a ORDER BY a, k;
+
+-- New query/snapshot demonstrates side-effects of previous query.
+SELECT * FROM z ORDER BY k;
+
+--
+-- All these cases should fail, due to restrictions imposed upon the UPDATE
+-- portion of the query.
+--
+WITH aa AS (SELECT 1 a, 2 b)
+INSERT INTO z VALUES(1, 'insert')
+ON CONFLICT UPDATE SET V = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1);
+WITH aa AS (SELECT 1 a, 2 b)
+INSERT INTO z VALUES(1, 'insert')
+ON CONFLICT UPDATE SET v = ' update' WHERE k = (SELECT a FROM aa);
+WITH aa AS (SELECT 1 a, 2 b)
+INSERT INTO z VALUES(1, 'insert')
+ON CONFLICT UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1);
+WITH aa AS (SELECT 'a' a, 'b' b UNION ALL SELECT 'a' a, 'b' b)
+INSERT INTO z VALUES(1, 'insert')
+ON CONFLICT UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 'a' LIMIT 1);
+WITH aa AS (SELECT 1 a, 2 b)
+INSERT INTO z VALUES(1, (SELECT b || ' insert' FROM aa WHERE a = 1 ))
+ON CONFLICT UPDATE SET v = (SELECT b || ' update' FROM aa WHERE a = 1 LIMIT 1);
+
+DROP TABLE Z;
+
 -- check that run to completion happens in proper ordering
 
 TRUNCATE TABLE y;
-- 
1.9.1

0002-Support-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patchtext/x-patch; charset=US-ASCII; name=0002-Support-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patchDownload
From fc30da97cf60bb9e1e50972acc0f58cb7329f639 Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@heroku.com>
Date: Wed, 27 Aug 2014 15:01:32 -0700
Subject: [PATCH 2/4] Support INSERT ... ON CONFLICT {UPDATE | IGNORE}

This non-standard INSERT clause allows DML statement authors to specify
that in the event of each of any of the tuples being inserted
duplicating an existing tuple in terms of a value or set of values
constrained by a unique index, an alternative path may be taken.  The
statement may alternatively IGNORE the tuple being inserted without
raising an error, or go to UPDATE the existing tuple whose value is
duplicated by a value within one single tuple proposed for insertion.
The implementation loops until either an insert or an UPDATE/IGNORE
occurs.  No existing tuple may be affected more than once per INSERT.

This is implemented using a new infrastructure called "speculative
insertion".  A speculative inserter establishes the right to insert
ahead of time.  In order to proceed with insertion, consensus must be
reached between all unique indexes on the table, or else the alternative
path is taken.  Finally, heap tuple insertion occurs in the conventional
manner, followed by insertion of index tuples, where index tuple
insertion picks up where value locking left off, performing essentially
the conventional insertion process in a staggered fashion.
Alternatively, we may go to UPDATE, using the EvalPlanQual() mechanism
to execute a special auxiliary plan.

READ COMMITTED isolation level is permitted to UPDATE a tuple even where
no version is visible to the command's MVCC snapshot.  Similarly, any
query predicate associated with the UPDATE portion of the new statement
need only satisfy an already locked, conclusively committed and visible
conflict tuple.  When the predicate isn't satisfied, the tuple is still
locked, which implies that at READ COMMITTED, a tuple may be locked
without any version being visible to the command's MVCC snapshot.

Users may optionally specify a single unique index to merge on with a
WITHIN `unique_index` specification, which is useful when there is a
concern about spuriously merging on the wrong unique index due to there
being more than one would-be unique violation.  Otherwise, we UPDATE (or
IGNORE) based on the first would-be unique violation detected, on the
assumption that that is the only unique index where a violation could
appear.

The auxiliary ModifyTable plan used by the UPDATE portion of the new
statement is not formally a subplan of its parent INSERT ModifyTable
plan.  Rather, it's an independently planned subquery, whose execution
is tightly driven by its parent.  Special auxiliary state pertaining to
the auxiliary UPDATE is tracked by its parent through all stages of
query execution.

The optimizer imposes some restrictions on child auxiliary UPDATE plans,
which make the plans comport with their parent to the extent required
during the executor stage.  One user-visible consequences of this is
that the special auxiliary UPDATE query cannot have subselects within
its targetlist or WHERE clause.  UPDATEs may not reference any other
table, and UPDATE FROM is disallowed.  INSERT's RETURNING clause
continues to only project tuples actually inserted.
---
 contrib/pg_stat_statements/pg_stat_statements.c |   4 +
 src/backend/access/heap/heapam.c                |  22 +-
 src/backend/access/heap/tuptoaster.c            |   2 +-
 src/backend/access/index/indexam.c              | 153 +++++-
 src/backend/access/nbtree/nbtinsert.c           | 612 ++++++++++++++++++++++--
 src/backend/access/nbtree/nbtree.c              |  71 ++-
 src/backend/catalog/index.c                     |   6 +-
 src/backend/catalog/indexing.c                  |   3 +-
 src/backend/commands/constraint.c               |   2 +-
 src/backend/commands/copy.c                     |   4 +-
 src/backend/commands/explain.c                  |   9 +-
 src/backend/executor/execMain.c                 |  11 +-
 src/backend/executor/execUtils.c                | 293 ++++++++++--
 src/backend/executor/nodeLockRows.c             |   9 +-
 src/backend/executor/nodeModifyTable.c          | 427 ++++++++++++++++-
 src/backend/nodes/copyfuncs.c                   |  23 +
 src/backend/nodes/equalfuncs.c                  |  16 +
 src/backend/nodes/nodeFuncs.c                   |   5 +
 src/backend/nodes/outfuncs.c                    |  19 +
 src/backend/nodes/readfuncs.c                   |   3 +
 src/backend/optimizer/path/costsize.c           |   8 +-
 src/backend/optimizer/plan/createplan.c         |  11 +-
 src/backend/optimizer/plan/planner.c            |  42 ++
 src/backend/optimizer/plan/setrefs.c            |   8 +
 src/backend/optimizer/plan/subselect.c          |   2 +
 src/backend/parser/analyze.c                    |  58 ++-
 src/backend/parser/gram.y                       |  65 ++-
 src/backend/parser/parse_clause.c               |  42 +-
 src/backend/parser/parse_relation.c             |   8 +-
 src/backend/rewrite/rewriteHandler.c            |   5 +
 src/backend/utils/time/tqual.c                  |  23 +
 src/include/access/genam.h                      | 100 +++-
 src/include/access/nbtree.h                     |  49 +-
 src/include/catalog/pg_am.h                     |  44 +-
 src/include/catalog/pg_proc.h                   |   2 +
 src/include/executor/executor.h                 |   4 +-
 src/include/nodes/execnodes.h                   |   3 +
 src/include/nodes/nodes.h                       |  13 +
 src/include/nodes/parsenodes.h                  |  24 +
 src/include/nodes/plannodes.h                   |   3 +
 src/include/optimizer/planmain.h                |   3 +-
 src/include/parser/kwlist.h                     |   2 +
 src/include/parser/parse_clause.h               |   1 +
 src/include/parser/parse_relation.h             |   4 +-
 src/include/utils/rel.h                         |   1 +
 src/include/utils/tqual.h                       |   1 +
 46 files changed, 2058 insertions(+), 162 deletions(-)

diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c
index 799242b..c8ce44b 100644
--- a/contrib/pg_stat_statements/pg_stat_statements.c
+++ b/contrib/pg_stat_statements/pg_stat_statements.c
@@ -2198,6 +2198,10 @@ JumbleQuery(pgssJumbleState *jstate, Query *query)
 	JumbleRangeTable(jstate, query->rtable);
 	JumbleExpr(jstate, (Node *) query->jointree);
 	JumbleExpr(jstate, (Node *) query->targetList);
+	APP_JUMB(query->specClause);
+	APP_JUMB(query->mergeIndex);
+	if (query->onConflict)
+		JumbleQuery(jstate, (Query *) query->onConflict);
 	JumbleExpr(jstate, (Node *) query->returningList);
 	JumbleExpr(jstate, (Node *) query->groupClause);
 	JumbleExpr(jstate, query->havingQual);
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index 4d7575b..b0c5d62 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -4101,14 +4101,15 @@ get_mxact_status_for_lock(LockTupleMode mode, bool is_update)
  *
  * Function result may be:
  *	HeapTupleMayBeUpdated: lock was successfully acquired
+ *	HeapTupleInvisible: lock failed because tuple instantaneously invisible
  *	HeapTupleSelfUpdated: lock failed because tuple updated by self
  *	HeapTupleUpdated: lock failed because tuple updated by other xact
  *
- * In the failure cases, the routine fills *hufd with the tuple's t_ctid,
- * t_xmax (resolving a possible MultiXact, if necessary), and t_cmax
- * (the last only for HeapTupleSelfUpdated, since we
- * cannot obtain cmax from a combocid generated by another transaction).
- * See comments for struct HeapUpdateFailureData for additional info.
+ * In the failure cases other than HeapTupleInvisible, the routine fills *hufd
+ * with the tuple's t_ctid, t_xmax (resolving a possible MultiXact, if
+ * necessary), and t_cmax (the last only for HeapTupleSelfUpdated, since we
+ * cannot obtain cmax from a combocid generated by another transaction).  See
+ * comments for struct HeapUpdateFailureData for additional info.
  *
  * See README.tuplock for a thorough explanation of this mechanism.
  */
@@ -4145,8 +4146,15 @@ l3:
 
 	if (result == HeapTupleInvisible)
 	{
-		UnlockReleaseBuffer(*buffer);
-		elog(ERROR, "attempted to lock invisible tuple");
+		LockBuffer(*buffer, BUFFER_LOCK_UNLOCK);
+
+		/*
+		 * This is possible, but only when locking a tuple for speculative
+		 * insertion.  We return this value here rather than throwing an error
+		 * in order to give that case the opportunity to throw a more specific
+		 * error.
+		 */
+		return HeapTupleInvisible;
 	}
 	else if (result == HeapTupleBeingUpdated)
 	{
diff --git a/src/backend/access/heap/tuptoaster.c b/src/backend/access/heap/tuptoaster.c
index ce44bbd..114553e 100644
--- a/src/backend/access/heap/tuptoaster.c
+++ b/src/backend/access/heap/tuptoaster.c
@@ -1530,7 +1530,7 @@ toast_save_datum(Relation rel, Datum value,
 							 &(toasttup->t_self),
 							 toastrel,
 							 toastidxs[i]->rd_index->indisunique ?
-							 UNIQUE_CHECK_YES : UNIQUE_CHECK_NO);
+							 UNIQUE_CHECK_YES : UNIQUE_CHECK_NO, NULL);
 		}
 
 		/*
diff --git a/src/backend/access/index/indexam.c b/src/backend/access/index/indexam.c
index 53cf96f..1b5c1fc 100644
--- a/src/backend/access/index/indexam.c
+++ b/src/backend/access/index/indexam.c
@@ -18,8 +18,12 @@
  *		index_rescan	- restart a scan of an index
  *		index_endscan	- end a scan
  *		index_insert	- insert an index tuple into a relation
+ *		index_lock		- lock index values speculatively
  *		index_markpos	- mark a scan position
  *		index_restrpos	- restore a scan position
+ *		index_proceed	- proceed with insert?
+ *		index_release	- release index locks
+ *		index_tid		- get duplicate/conflict tid from speculative state
  *		index_getnext_tid	- get the next TID from a scan
  *		index_fetch_heap		- get the scan's next heap tuple
  *		index_getnext	- get the next heap tuple from a scan
@@ -98,6 +102,13 @@
 	AssertMacro(!ReindexIsProcessingIndex(RelationGetRelid(indexRelation))) \
 )
 
+#define SPECULATIVE_CHECKS \
+( \
+	AssertMacro(!state || \
+				RelationGetRelid(indexRelation) ==    \
+				RelationGetRelid(state->uniqueIndex)) \
+)
+
 #define SCAN_CHECKS \
 ( \
 	AssertMacro(IndexScanIsValid(scan)), \
@@ -199,6 +210,46 @@ index_close(Relation relation, LOCKMODE lockmode)
 }
 
 /* ----------------
+ * index_lock - lock index values speculatively.
+ *
+ * Returns palloc'd state indicating if the insertion would have proceeded were
+ * this not just a "dry-run".  The underlying amcanunique implementation
+ * performs locking.  Callers are obligated to pass this state back in a
+ * subsequent index_insert, or use the callback set here to release locks and
+ * other resources.
+ * ----------------
+ */
+SpeculativeState *
+index_lock(Relation indexRelation,
+		   Datum *values,
+		   bool *isnull,
+		   Relation heapRelation,
+		   List *otherSpecStates,
+		   bool priorConflict)
+{
+	FmgrInfo   *procedure;
+
+	RELATION_CHECKS;
+	GET_REL_PROCEDURE(amlock);
+
+	if (!(indexRelation->rd_am->ampredlocks))
+		CheckForSerializableConflictIn(indexRelation,
+									   (HeapTuple) NULL,
+									   InvalidBuffer);
+
+	/*
+	 * call am's lock proc.
+	 */
+	return (SpeculativeState *) DatumGetPointer(FunctionCall6(procedure,
+												PointerGetDatum(indexRelation),
+												PointerGetDatum(values),
+												PointerGetDatum(isnull),
+												PointerGetDatum(heapRelation),
+												PointerGetDatum(otherSpecStates),
+												BoolGetDatum(priorConflict)));
+}
+
+/* ----------------
  *		index_insert - insert an index tuple into a relation
  * ----------------
  */
@@ -208,11 +259,14 @@ index_insert(Relation indexRelation,
 			 bool *isnull,
 			 ItemPointer heap_t_ctid,
 			 Relation heapRelation,
-			 IndexUniqueCheck checkUnique)
+			 IndexUniqueCheck checkUnique,
+			 SpeculativeState *state)
 {
 	FmgrInfo   *procedure;
+	bool		satisfies;
 
 	RELATION_CHECKS;
+	SPECULATIVE_CHECKS;
 	GET_REL_PROCEDURE(aminsert);
 
 	if (!(indexRelation->rd_am->ampredlocks))
@@ -223,13 +277,106 @@ index_insert(Relation indexRelation,
 	/*
 	 * have the am's insert proc do all the work.
 	 */
-	return DatumGetBool(FunctionCall6(procedure,
+	satisfies = DatumGetBool(FunctionCall7(procedure,
 									  PointerGetDatum(indexRelation),
 									  PointerGetDatum(values),
 									  PointerGetDatum(isnull),
 									  PointerGetDatum(heap_t_ctid),
 									  PointerGetDatum(heapRelation),
-									  Int32GetDatum((int32) checkUnique)));
+									  Int32GetDatum((int32) checkUnique),
+									  PointerGetDatum(state)));
+
+	/*
+	 * AM will have released private speculative insertion state and locks, but
+	 * the responsibility to release generic state rests here
+	 */
+	if (state)
+		pfree(state);
+
+	return satisfies;
+}
+
+/* ----------------
+ * index_proceed - should we proceed with a speculative insertion?
+ *
+ * Returns whether or not to proceed (states may be NIL).  A would-be duplicate
+ * key violation on any unique index is grounds for not proceeding with the
+ * second phase of speculative insertion (as is there never being a request for
+ * speculative insertion).  Total consensus is required.
+ * ----------------
+ */
+bool
+index_proceed(List *specStates)
+{
+	ListCell   *lc;
+
+	foreach(lc, specStates)
+	{
+		SpeculativeState   *state = lfirst(lc);
+		SpecStatus			outcome = state->outcome;
+
+		Assert(outcome != INSERT_TRY_AGAIN);
+
+		if (outcome == INSERT_NO_PROCEED)
+			return false;
+	}
+
+	return true;
+}
+
+/* ----------------
+ * index_release - release resources from speculative insertion.
+ *
+ * Unique index value locks and other resources are freed here.  This is called
+ * just prior to the latter phase of speculative insertion, in respect of a
+ * single slot.
+ *
+ * The AM must free its own private resources here (principally, value locks).
+ * We release the AM-generic state itself.
+ *
+ * It's possible that the AM will call this function itself directly, passing
+ * back the list of other states that that particular AM-invocation is itself
+ * passed.  The need to release all value locks immediately prior to waiting on
+ * the outcome of another, conflicting xact may arise.
+ *
+ * Returns a heap item pointer for locking where applicable.
+ * ----------------
+ */
+ItemPointer
+index_release(List *specStates, bool free)
+{
+	ListCell	   *lc;
+	ItemPointer		conflict = NULL;
+
+	/*
+	 * Note that unlocking occurs in the same order as insertion would have,
+	 * and so is in the opposite order to the original lock acquisition (i.e.
+	 * it is "right-way-around")
+	 */
+	foreach(lc, specStates)
+	{
+		SpeculativeState *state = lfirst(lc);
+
+		/* Only expecting one tuple to lock */
+		Assert(!conflict || state->outcome != INSERT_NO_PROCEED);
+		if (state->outcome == INSERT_NO_PROCEED)
+		{
+			Assert(ItemPointerIsValid(state->conflictTid));
+			conflict = state->conflictTid;
+		}
+
+		/*
+		 * Only release value locks (and other resources) for unique indexes
+		 * that have indicated they require it
+		 */
+		if (state->unlock)
+			(*state->unlock) (state);
+
+		if (free)
+			pfree(state);
+	}
+
+	return conflict;
 }
 
 /*
diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c
index ecee5ac..3bd4e71 100644
--- a/src/backend/access/nbtree/nbtinsert.c
+++ b/src/backend/access/nbtree/nbtinsert.c
@@ -47,10 +47,16 @@ typedef struct
 
 static Buffer _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf);
 
+static void _bt_speccleanup(SpeculativeState *specState);
+static void _bt_insertinitpg(Relation rel, IndexUniqueCheck checkUnique,
+					 ScanKey itup_scankey, Buffer *buf,
+					 BlockNumber *bufblock, BTStack stack,
+					 BTSpecOpaque btspec);
 static TransactionId _bt_check_unique(Relation rel, IndexTuple itup,
 				 Relation heapRel, Buffer buf, OffsetNumber offset,
 				 ScanKey itup_scankey,
-				 IndexUniqueCheck checkUnique, bool *is_unique);
+				 IndexUniqueCheck checkUnique, bool *is_unique,
+				 ItemPointer dup_htid);
 static void _bt_findinsertloc(Relation rel,
 				  Buffer *bufptr,
 				  OffsetNumber *offsetptr,
@@ -84,56 +90,359 @@ static void _bt_vacuum_one_page(Relation rel, Buffer buffer, Relation heapRel);
 
 
 /*
+ * _bt_speccleanup --- speculative insertion won't proceed callback.
+ *
+ * This is called by the core code when it turns out that an insertion of a
+ * btree index tuple will not proceed, despite the fact that an individual
+ * phased-lock call (the one whose state is passed) believed that it should.
+ *
+ * Sometimes a call that instructs the core code to call this method for each
+ * unique index (or an analogous method for possible other amcanunique access
+ * methods) may come from nbtree itself.
+ *
+ * In general, we prefer to clean up directly if it is immediately clear that
+ * speculative insertion won't proceed.
+ */
+static void
+_bt_speccleanup(SpeculativeState *specState)
+{
+	BTSpecOpaque	btspec = (BTSpecOpaque) specState->privState;
+
+	if (specState->outcome == INSERT_NO_PROCEED)
+	{
+		/*
+		 * We already found duplicate, and already released hwlock.  Just have
+		 * pin to release, but not yet.
+		 *
+		 * There will be a final callback for this unique index, since it is
+		 * used to merge values.  It is necessary to sit on the page buffer
+		 * pin, to interlock against VACUUM.
+		 *
+		 * XXX: The index tuple whose heap tuple we are intent on locking may
+		 * actually be on a later page than the currently pinned page.
+		 * Discussion on VACUUM interlocking should revisit the need for this.
+		 */
+		specState->outcome = INSERT_NEED_UNPIN;
+	}
+	else
+	{
+		ReleaseBuffer(btspec->lockedBuf);
+		/* Unset callback that brought control here (not strictly necessary) */
+		specState->unlock = NULL;
+		/* If already released all state other than pin, don't try it again */
+		if (specState->outcome == INSERT_NEED_UNPIN)
+			return;
+		/* Free private state memory */
+		_bt_freestack(btspec->stack);
+		pfree(btspec->itup);
+		pfree(btspec->itupScankey);
+		pfree(btspec);
+	}
+}
+
+/*
+ * _bt_lockinsert() -- Lock values for speculative insertion
+ *
+ *		Obtain an exclusive heavyweight lock on appropriate leaf page, to
+ *		implement a limited form of value locking that prevents concurrent
+ *		insertion of conflicting values for an instant.
+ *
+ *		It is the caller's responsibility to subsequently ask us to release
+ *		value locks (by passing the state back to _bt_doinsert, or perhaps
+ *		through our callback), though we can ask the core code to ask all other
+ *		unique indexes to release just before we wait, and in general we don't
+ *		hold locks if we know insertion will not proceed.
+ *
+ *		specState is passed by the calling indexam proc, but responsibility for
+ *		initializing its fields (with the sole exception of the cached index
+ *		tuple) rests here.  In addition, a list of states of those unique
+ *		indexes participating in speculative insertion that have already
+ *		committed to insertion is passed, in case it proves necessary to
+ *		release values locks on all unique indexes and restart the first stage
+ *		of speculative insertion.
+ */
+void
+_bt_lockinsert(Relation rel, Relation heapRel, SpeculativeState *specState,
+			   List *otherSpecStates, bool priorConflict)
+{
+	int				natts = rel->rd_rel->relnatts;
+	BTSpecOpaque 	btspec = specState->privState;
+	BTPageOpaque 	opaque;
+	ScanKey			itup_scankey;
+	BTStack			stack;
+	bool			is_unique;
+	/* Heavyweight page lock and exclusive buffer lock acquisition avoidance */
+	bool			hwlocked;
+	OffsetNumber	nitems;
+	/* Buffer and pinned page for value locking */
+	Buffer			buf;
+	BlockNumber		bufblock;
+	Page			bufpage;
+	Buffer			presplitbuf;
+	OffsetNumber	offset;
+	TransactionId	xwait;
+
+	/* build insertion scan key */
+	itup_scankey = _bt_mkscankey(rel, btspec->itup);
+	/* find the first page containing this key */
+	stack = _bt_search(rel, natts, itup_scankey, false, &buf, BT_WRITE);
+	/* set up state needed to consider skipping most locking */
+	bufblock = BufferGetBlockNumber(buf);
+	bufpage = BufferGetPage(buf);
+	opaque = (BTPageOpaque) PageGetSpecialPointer(bufpage);
+	nitems = PageGetMaxOffsetNumber(bufpage);
+
+	/*
+	 * Consider trading in our read lock for a write lock.  Checking if the
+	 * value already exists is typically relatively cheap, so the threshold is,
+	 * in a word, low.  If the core code indicated a prior conflict, that means
+	 * that an earlier call here returned recently, having either indicated
+	 * that there was a conflicting xact or a conflicting row.  A recent, known
+	 * conflict against the value proposed for insertion is by far the most
+	 * compelling reason to apply the optimization.
+	 */
+	if (priorConflict || nitems > BTREE_PITEMS_NOLOCK)
+	{
+		/*
+		 * Chances are good that a conflicting row will be returned (typically
+		 * to be locked by caller).  Optimistically try to find likely
+		 * duplicate without acquiring hwlock, and without swapping read buffer
+		 * lock for write buffer lock.
+		 */
+		hwlocked = false;
+	}
+	else
+	{
+		LockBuffer(buf, BUFFER_LOCK_UNLOCK);
+		/* now lock page of still pinned buffer, and write-lock buffer */
+hwlock:
+		/*
+		 * Lock avoidance optimization did not initially appear promising, or
+		 * has already been unsuccessfully attempted once, or there was a
+		 * concurrent page split
+		 */
+		hwlocked = true;
+		LockPage(rel, bufblock, ExclusiveLock);
+		LockBuffer(buf, BT_WRITE);
+
+		opaque = (BTPageOpaque) PageGetSpecialPointer(BufferGetPage(buf));
+
+		/*
+		 * Consider the need to move right in the tree (see comments at end of
+		 * _bt_insertinitpg), but defend against concurrent page splits by
+		 * retrying.  Respect the general protocol for heavyweight locking
+		 * nbtree pages, which is that pages must be locked before any buffer
+		 * is locked, and released after all buffer locks are released.
+		 */
+		presplitbuf = buf;
+		buf = _bt_moveright(rel, buf, natts, itup_scankey, false, true, stack,
+							BT_WRITE);
+
+		if (buf != presplitbuf)
+		{
+			/*
+			 * A page split between unlocking and relocking the first page that
+			 * a would-be duplicate value could be on necessitates reacquiring
+			 * all locks.  The existing heavyweight lock is superficially a
+			 * sufficient choke point for value locking against concurrent
+			 * insertions of the value proposed for insertion, but it is
+			 * actually necessary to hold only a single pinned buffer in which
+			 * the heavyweight locked page is allocated, since the page is
+			 * marked as locked with a flag.  When regular inserters that hope
+			 * to mostly avoid heavyweight lock acquisition are considered,
+			 * just holding the existing lock is insufficient, since they rely
+			 * on this flag to indicate that a heavyweight lock may be held by
+			 * another backend on the same buffer's page.
+			 *
+			 * We unlock the buffer newly locked by _bt_moveright(), but keep
+			 * the pin on that same buffer for next iteration.
+			 */
+			LockBuffer(buf, BUFFER_LOCK_UNLOCK);
+			UnlockPage(rel, bufblock, ExclusiveLock);
+			bufblock = BufferGetBlockNumber(buf);
+			goto hwlock;
+		}
+	}
+
+	/*
+	 * Indicate that heavyweight lock is held.  The flag bit may already be
+	 * set, due to an aborted transaction setting it without having the
+	 * opportunity to unset it, but this should be rare.
+	 *
+	 * Since we never release our buffer pin, we don't MarkBufferDirty().
+	 */
+	if (hwlocked)
+		opaque->btpo_flags |= BTP_IS_LOCKED;
+
+	/* get page from buffer */
+	offset = _bt_binsrch(rel, buf, natts, itup_scankey, false);
+
+	/* check for duplicates in a similar fashion to _bt_insert */
+	xwait = _bt_check_unique(rel, btspec->itup, heapRel, buf, offset,
+							 itup_scankey, UNIQUE_CHECK_SPEC, &is_unique,
+							 specState->conflictTid);
+
+	if (TransactionIdIsValid(xwait))
+	{
+		if (hwlocked)
+			opaque->btpo_flags &= ~BTP_IS_LOCKED;
+		_bt_relbuf(rel, buf);
+		if (hwlocked)
+			UnlockPage(rel, bufblock, ExclusiveLock);
+		/* Free all state and amcanunique value locks -- not just our own */
+		index_release(otherSpecStates, true);
+		_bt_freestack(stack);
+		_bt_freeskey(itup_scankey);
+
+		/*
+		 * Have the core code retry, re-locking any previous unique index
+		 * values as required
+		 */
+		specState->outcome = INSERT_TRY_AGAIN;
+		XactLockTableWait(xwait, heapRel, specState->conflictTid, XLTW_Lock);
+		return;
+	}
+
+	if (!hwlocked && is_unique)
+	{
+		/*
+		 * A heavyweight page lock is not held.
+		 *
+		 * It was incorrectly predicted that insertion would not proceed.  Now
+		 * that it's clear that it could have safely proceeded if only the
+		 * appropriate locks were held, restart.  This strategy is abandoned
+		 * from here (although when INSERT_TRY_AGAIN is passed back to core
+		 * code, it may later inform this routine that there was a recent
+		 * conflict in respect of the same unique index, which is always
+		 * treated as a valid reason to apply the optimization, even
+		 * repeatedly).
+		 */
+		LockBuffer(buf, BUFFER_LOCK_UNLOCK);
+
+		/*
+		 * Since the buffer lock is now released, it's unlikely though possible
+		 * that upon reacquiring locks suitable for proceeding with insertion,
+		 * insertion will turn out to be unnecessary.
+		 */
+		goto hwlock;
+	}
+
+	/*
+	 * This unique index individually assents to insertion proceeding, or vetos
+	 * insertion from proceeding (though if row locking in the executor later
+	 * fails, all bets are off and a fresh attempt at gaining consensus to
+	 * proceed with "insertion proper" begins)
+	 */
+	specState->outcome = is_unique? INSERT_PROCEED : INSERT_NO_PROCEED;
+	/* Stash stack for insertion proper */
+	btspec->stack = stack;
+	/* Return state to core code */
+	specState->uniqueIndex = rel;
+	btspec->lockedBuf = buf;
+
+	/* Free locks and other state no longer needed as appropriate */
+	if (specState->outcome == INSERT_NO_PROCEED)
+	{
+		/* Release buffer write lock and heavyweight lock here */
+		if (hwlocked)
+			opaque->btpo_flags &= ~BTP_IS_LOCKED;
+		/* However, keep pin */
+		LockBuffer(btspec->lockedBuf, BUFFER_LOCK_UNLOCK);
+		if (hwlocked)
+			UnlockPage(rel, bufblock, ExclusiveLock);
+		_bt_freestack(btspec->stack);
+	}
+	else
+	{
+		Assert(hwlocked);
+
+		/*
+		 * Unlock buffer, but keep pin and heavyweight lock.  Holding on to the
+		 * buffer pin is at least necessary because we don't want to have a
+		 * non-speculative inserter fail to observe that they require the
+		 * heavyweight page lock associated with this leaf page (we could also
+		 * mark the buffer dirty, but since we'll almost never hold a
+		 * heavyweight page lock for more than an instant anyway, we prefer not
+		 * to).
+		 */
+		LockBuffer(btspec->lockedBuf, BUFFER_LOCK_UNLOCK);
+		/* Cache scankey for second phase too */
+		btspec->itupScankey = itup_scankey;
+	}
+
+	/* Give core code ability to undo/release */
+	specState->unlock = _bt_speccleanup;
+}
+
+/*
  *	_bt_doinsert() -- Handle insertion of a single index tuple in the tree.
  *
- *		This routine is called by the public interface routine, btinsert.
- *		By here, itup is filled in, including the TID.
+ *		This routine is called by the public interface routines, btbuild and
+ *		btinsert.  By here, itup is filled in, including the TID, unlike
+ *		_bt_lockinsert where the heap tuple was not yet inserted (though we
+ *		still use cached itup for speculative insertion).
+ *
+ *		If checkUnique is UNIQUE_CHECK_NO or UNIQUE_CHECK_PARTIAL, this will
+ *		allow duplicates.	UNIQUE_CHECK_YES or UNIQUE_CHECK_EXISTING will
+ *		throw errors for a duplicate.  For UNIQUE_CHECK_EXISTING we merely run
+ *		the duplicate check, and don't actually insert.  In the
+ *		UNIQUE_CHECK_SPEC case, a call here represents specualtive "insertion
+ *		proper", with insertion already committed to, so uniqueness checking is
+ *		redundant.
  *
- *		If checkUnique is UNIQUE_CHECK_NO or UNIQUE_CHECK_PARTIAL, this
- *		will allow duplicates.  Otherwise (UNIQUE_CHECK_YES or
- *		UNIQUE_CHECK_EXISTING) it will throw error for a duplicate.
- *		For UNIQUE_CHECK_EXISTING we merely run the duplicate check, and
- *		don't actually insert.
+ *		specState is state for the speculative insertion locking, and will be
+ *		NULL for regular index tuple inserts.  If speculative insertion reaches
+ *		here, consensus has been reached to proceed and "insertion proper"
+ *		finishing without unique constraint violations is a foregone
+ *		conclusion.
  *
  *		The result value is only significant for UNIQUE_CHECK_PARTIAL:
  *		it must be TRUE if the entry is known unique, else FALSE.
  *		(In the current implementation we'll also return TRUE after a
- *		successful UNIQUE_CHECK_YES or UNIQUE_CHECK_EXISTING call, but
- *		that's just a coding artifact.)
+ *		successful UNIQUE_CHECK_YES, UNIQUE_CHECK_EXISTING or UNIQUE_CHECK_SPEC
+ *		call, but that's just a coding artifact.)
  */
 bool
 _bt_doinsert(Relation rel, IndexTuple itup,
-			 IndexUniqueCheck checkUnique, Relation heapRel)
+			 IndexUniqueCheck checkUnique, Relation heapRel,
+			 SpeculativeState *specState)
 {
 	bool		is_unique = false;
 	int			natts = rel->rd_rel->relnatts;
 	ScanKey		itup_scankey;
 	BTStack		stack;
 	Buffer		buf;
-	OffsetNumber offset;
-
-	/* we need an insertion scan key to do our search, so build one */
-	itup_scankey = _bt_mkscankey(rel, itup);
+	OffsetNumber	offset = InvalidOffsetNumber;
+	BlockNumber		bufblock = InvalidBlockNumber;
+	BTSpecOpaque	btspec = NULL;
 
+	if (checkUnique != UNIQUE_CHECK_SPEC)
+	{
+		/* we need an insertion scan key to do our search, so build one */
+		itup_scankey = _bt_mkscankey(rel, itup);
 top:
-	/* find the first page containing this key */
-	stack = _bt_search(rel, natts, itup_scankey, false, &buf, BT_WRITE);
-
-	offset = InvalidOffsetNumber;
-
-	/* trade in our read lock for a write lock */
-	LockBuffer(buf, BUFFER_LOCK_UNLOCK);
-	LockBuffer(buf, BT_WRITE);
+		/* find the first page containing this key */
+		stack = _bt_search(rel, natts, itup_scankey, false, &buf, BT_WRITE);
+	}
+	else
+	{
+		/* retrieve private state */
+		btspec = specState->privState;
+		/* pick up from value locking */
+		itup = btspec->itup;
+		itup_scankey = btspec->itupScankey;
+		stack = btspec->stack;
+		/* this value has already been determined to be unique */
+		is_unique = true;
+	}
 
 	/*
-	 * If the page was split between the time that we surrendered our read
-	 * lock and acquired our write lock, then this page may no longer be the
-	 * right place for the key we want to insert.  In this case, we need to
-	 * move right in the tree.  See Lehman and Yao for an excruciatingly
-	 * precise description.
+	 * Convert read lock (buffer read lock or heavyweight exclusive lock that
+	 * effectively functions as an intent exclusive lock) on first page
+	 * containing this key to write lock as appropriate
 	 */
-	buf = _bt_moveright(rel, buf, natts, itup_scankey, false,
-						true, stack, BT_WRITE);
+	_bt_insertinitpg(rel, checkUnique, itup_scankey, &buf, &bufblock, stack,
+					 btspec);
 
 	/*
 	 * If we're not allowing duplicates, make sure the key isn't already in
@@ -142,32 +451,54 @@ top:
 	 * NOTE: obviously, _bt_check_unique can only detect keys that are already
 	 * in the index; so it cannot defend against concurrent insertions of the
 	 * same key.  We protect against that by means of holding a write lock on
-	 * the target page.  Any other would-be inserter of the same key must
-	 * acquire a write lock on the same target page, so only one would-be
+	 * the target page's buffer.  Any other would-be inserter of the same key
+	 * must acquire a write lock on the same target page, so only one would-be
 	 * inserter can be making the check at one time.  Furthermore, once we are
 	 * past the check we hold write locks continuously until we have performed
-	 * our insertion, so no later inserter can fail to see our insertion.
-	 * (This requires some care in _bt_insertonpg.)
+	 * our insertion, so no later inserter (or, in the analogous point in the
+	 * function _btlock, the undecided speculative inserter) can fail to see
+	 * our insertion  (This requires some care in _bt_insertonpg).  Speculative
+	 * insertion staggers this process, and converts the buffer lock to a page
+	 * heavyweight lock, so that if and when control reaches here, unique
+	 * checking has already been performed, and the right to insert has already
+	 * been established.
 	 *
 	 * If we must wait for another xact, we release the lock while waiting,
 	 * and then must start over completely.
 	 *
 	 * For a partial uniqueness check, we don't wait for the other xact. Just
 	 * let the tuple in and return false for possibly non-unique, or true for
-	 * definitely unique.
+	 * definitely unique.  This work is redundant for speculative insertion,
+	 * and so that case also skips the check, but make sure it got things right
+	 * on assert-enabled builds.
 	 */
-	if (checkUnique != UNIQUE_CHECK_NO)
+	if (checkUnique != UNIQUE_CHECK_SPEC &&
+		checkUnique != UNIQUE_CHECK_NO)
 	{
-		TransactionId xwait;
+		TransactionId xwait = InvalidTransactionId;
 
 		offset = _bt_binsrch(rel, buf, natts, itup_scankey, false);
 		xwait = _bt_check_unique(rel, itup, heapRel, buf, offset, itup_scankey,
-								 checkUnique, &is_unique);
+								 checkUnique, &is_unique, NULL);
 
 		if (TransactionIdIsValid(xwait))
 		{
 			/* Have to wait for the other guy ... */
 			_bt_relbuf(rel, buf);
+			/* Release heavyweight lock if held */
+			if (bufblock != InvalidBlockNumber)
+				UnlockPage(rel, bufblock, ExclusiveLock);
+
+			/*
+			 * It may be necessary to sit on an already acquired page
+			 * heavyweight "value lock" (on another unique index) if a
+			 * speculative insertion has already established the right to
+			 * insert into a single, user specified unique index, and the right
+			 * to (non-speculatively) insert into this unique index is in the
+			 * process of being established.  It is assumed that this case is
+			 * rare enough to make it not worth teaching this routine and
+			 * associated executor code to release its heavyweight value lock.
+			 */
 			XactLockTableWait(xwait, rel, &itup->t_tid, XLTW_InsertIndex);
 			/* start over... */
 			_bt_freestack(stack);
@@ -196,6 +527,10 @@ top:
 		_bt_relbuf(rel, buf);
 	}
 
+	/* Release heavyweight lock if held */
+	if (bufblock != InvalidBlockNumber)
+		UnlockPage(rel, bufblock, ExclusiveLock);
+
 	/* be tidy */
 	_bt_freestack(stack);
 	_bt_freeskey(itup_scankey);
@@ -204,6 +539,139 @@ top:
 }
 
 /*
+ *	_bt_insertinitpg() -- Handle insertion's page write lock initialization
+ *
+ * This routine handles minutia relating to how each IndexUniqueCheck case must
+ * lock and unlock buffers, and perhaps the buffer's page.  Some existing type
+ * of lock on *buf is converted to a buffer write lock.
+ *
+ * Caller passes a pinned buffer with the first page the scankey's value could
+ * be on.  The buffer is generally already read locked, though not when the
+ * routine is called as part of the second stage of speculative insertion (i.e.
+ * UNIQUE_CHECK_SPEC), where no buffer lock is held, but rather a heavyweight
+ * exclusive page lock that similarly needs to be correctly converted to a
+ * buffer write lock.  This routine is also tasked with considering the
+ * necessity of acquiring a heavyweight lock, and doing so, for relevant
+ * non-speculative insertion cases.
+ */
+static void
+_bt_insertinitpg(Relation rel, IndexUniqueCheck checkUnique,
+				 ScanKey itup_scankey, Buffer *buf, BlockNumber *bufblock,
+				 BTStack stack, BTSpecOpaque btspec)
+{
+	bool			hwlock;
+	int				natts = rel->rd_rel->relnatts;
+	BTPageOpaque 	opaque;
+
+	switch (checkUnique)
+	{
+		case UNIQUE_CHECK_NO:
+		/* Deferred unique constraints don't support speculative insertion */
+		case UNIQUE_CHECK_PARTIAL:
+		case UNIQUE_CHECK_EXISTING:
+			/* trade in our read lock for a write lock */
+			LockBuffer(*buf, BUFFER_LOCK_UNLOCK);
+			LockBuffer(*buf, BT_WRITE);
+
+			/* Break and consider the need to move right. */
+			break;
+		case UNIQUE_CHECK_YES:
+			/*
+			 * The non-speculative unique index tuple insertion case.  As with
+			 * the prior case, some additional initialization is required that
+			 * is already taken care of in the speculative insertion case, but
+			 * unlike that case the implementation must be wary of speculative
+			 * inserters.
+			 */
+			opaque = (BTPageOpaque) PageGetSpecialPointer(BufferGetPage(*buf));
+
+			/* Trade in our read lock for a write lock */
+			hwlock = P_IS_LOCKED(opaque) != 0;
+do_hwlock:
+			LockBuffer(*buf, BUFFER_LOCK_UNLOCK);
+			if (hwlock)
+			{
+				/*
+				 * Speculative insertion is underway for this page/buffer, so
+				 * must obtain heavyweight lock to interlock against
+				 * speculative inserters.  Some may be between locking and
+				 * insertion proper for this choke point page/buffer/value, and
+				 * have only a heavyweight lock.
+				 */
+				*bufblock = BufferGetBlockNumber(*buf);
+				LockPage(rel, *bufblock, ExclusiveLock);
+			}
+
+			LockBuffer(*buf, BT_WRITE);
+
+			/*
+			 * When hwlock held, unset flag, preventing future unnecessary
+			 * hwlock acquisition by this type of inserter
+			 */
+			if (hwlock)
+			{
+				opaque->btpo_flags &= ~BTP_IS_LOCKED;
+			}
+			else if (P_IS_LOCKED(opaque))
+			{
+				/*
+				 * Race -- make sure that lock does not need to be acquired
+				 * once more.  This should virtually never occur because the
+				 * window is so small.
+				 */
+				hwlock = true;
+				goto do_hwlock;
+			}
+
+			/*
+			 * Finally, break and consider the need to move right.  When
+			 * speculative insertion is currently treating the page/buffer as a
+			 * choke point, we may move right, but the existing heavyweight
+			 * lock suffices because other non-speculative inserters will block
+			 * on the heavyweight lock now held by this backend.
+			 */
+			break;
+		case UNIQUE_CHECK_SPEC:
+			/*
+			 * Speculative insertion case ("insertion proper").
+			 *
+			 * We already have a heavyweight page lock corresponding to this
+			 * buffer from earlier value locking.  Lock the buffer that the
+			 * page is allocated into, acquiring a buffer lock equivalent to
+			 * the one dropped at the end of value locking.
+			 */
+			LockBuffer(btspec->lockedBuf, BT_WRITE);
+#ifndef USE_ASSERT_CHECKING
+			*buf = btspec->lockedBuf;
+#else
+			*buf = _bt_moveright(rel, btspec->lockedBuf, natts, itup_scankey,
+								 false, true, btspec->stack, BT_WRITE);
+#endif
+			*bufblock = BufferGetBlockNumber(*buf);
+			opaque = (BTPageOpaque) PageGetSpecialPointer(BufferGetPage(*buf));
+			Assert(P_IS_LOCKED(opaque));
+			/*
+			 * Mark the page as no longer heavyweight locked.  From here we can
+			 * rely on buffer locks to ensure no duplicates are inserted.
+			 */
+			opaque->btpo_flags &= ~BTP_IS_LOCKED;
+			/* No break; no need to consider necessity of move to right */
+			Assert(*buf == btspec->lockedBuf);
+			return;
+	}
+
+	/*
+	 * If the page was split between the time that we surrendered our read lock
+	 * and acquired our write lock, then this page may no longer be the right
+	 * place for the key we want to insert.  In this case, we need to move
+	 * right in the tree.	See Lehman and Yao for an excruciatingly precise
+	 * description.
+	 */
+	*buf = _bt_moveright(rel, *buf, natts, itup_scankey, false, true, stack,
+						 BT_WRITE);
+}
+
+/*
  *	_bt_check_unique() -- Check for violation of unique index constraint
  *
  * offset points to the first possible item that could conflict. It can
@@ -212,7 +680,8 @@ top:
  *
  * Returns InvalidTransactionId if there is no conflict, else an xact ID
  * we must wait for to see if it commits a conflicting tuple.   If an actual
- * conflict is detected, no return --- just ereport().
+ * conflict is detected, return when checkUnique == UNIQUE_CHECK_SPEC.
+ * Otherwise, just ereport().
  *
  * However, if checkUnique == UNIQUE_CHECK_PARTIAL, we always return
  * InvalidTransactionId because we don't want to wait.  In this case we
@@ -222,7 +691,8 @@ top:
 static TransactionId
 _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
 				 Buffer buf, OffsetNumber offset, ScanKey itup_scankey,
-				 IndexUniqueCheck checkUnique, bool *is_unique)
+				 IndexUniqueCheck checkUnique, bool *is_unique,
+				 ItemPointer dup_htid)
 {
 	TupleDesc	itupdesc = RelationGetDescr(rel);
 	int			natts = rel->rd_rel->relnatts;
@@ -291,6 +761,9 @@ _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
 				curitup = (IndexTuple) PageGetItem(page, curitemid);
 				htid = curitup->t_tid;
 
+				if (dup_htid)
+					*dup_htid = htid;
+
 				/*
 				 * If we are doing a recheck, we expect to find the tuple we
 				 * are rechecking.  It's not a duplicate, but we have to keep
@@ -312,6 +785,9 @@ _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
 				{
 					TransactionId xwait;
 
+					if (dup_htid)
+						*dup_htid = htid;
+
 					/*
 					 * It is a duplicate. If we are only doing a partial
 					 * check, then don't bother checking if the tuple is being
@@ -338,7 +814,7 @@ _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
 					{
 						if (nbuf != InvalidBuffer)
 							_bt_relbuf(rel, nbuf);
-						/* Tell _bt_doinsert to wait... */
+						/* Tell _bt_doinsert or _bt_lockinsert to wait... */
 						return xwait;
 					}
 
@@ -349,6 +825,16 @@ _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
 					 * This is a waste of time in normal scenarios but we must
 					 * do it to support CREATE INDEX CONCURRENTLY.
 					 *
+					 * Naturally, we don't bother with this if there is no
+					 * heap tuple that might have committed dead (as with
+					 * speculative tuple insertion, during value locking).
+					 * Furthermore, in that scenario we don't have to worry
+					 * about this at all during speculative "insertion proper".
+					 * This is because we now know that there never will be a
+					 * heap tuple.  Indeed, there won't even be a real
+					 * insertion (unless row locking fails, in which case all
+					 * bets are off).
+					 *
 					 * We must follow HOT-chains here because during
 					 * concurrent index build, we insert the root TID though
 					 * the actual tuple may be somewhere in the HOT-chain.
@@ -360,9 +846,18 @@ _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
 					 * entry.
 					 */
 					htid = itup->t_tid;
-					if (heap_hot_search(&htid, heapRel, SnapshotSelf, NULL))
+					if (checkUnique == UNIQUE_CHECK_SPEC ||
+						heap_hot_search(&htid, heapRel, SnapshotSelf, NULL))
 					{
-						/* Normal case --- it's still live */
+						/*
+						 * Normal case --- it's still live, or there is no heap
+						 * tuple pointed to by itup->t_tid to begin with as
+						 * this is speculative insertion value locking.  Note
+						 * that speculative insertion (which is now almost done
+						 * with this attempt at uniqueness verification) will
+						 * not save the NULL heap pointer, but htid is still
+						 * set for the benefit of the case handled here.
+						 */
 					}
 					else
 					{
@@ -379,10 +874,28 @@ _bt_check_unique(Relation rel, IndexTuple itup, Relation heapRel,
 					 * release the buffer locks we're holding ---
 					 * BuildIndexValueDescription could make catalog accesses,
 					 * which in the worst case might touch this same index and
-					 * cause deadlocks.
+					 * cause deadlocks.  Speculative insertion also requires
+					 * that this buffer be released.
 					 */
 					if (nbuf != InvalidBuffer)
 						_bt_relbuf(rel, nbuf);
+
+					*is_unique = false;
+
+					/*
+					 * Done, but don't necessarily raise error.  Where
+					 * applicable, tell caller to report duplicate TID back to
+					 * core code.  Since it's a definite conflict TID, no xact
+					 * to wait on.
+					 */
+					if (checkUnique == UNIQUE_CHECK_SPEC)
+						return InvalidTransactionId;
+
+					/*
+					 * The UNIQUE_CHECK_SPEC case needs the buffer to remain
+					 * locked, but otherwise it must be released lest the
+					 * deadlock scenario described above occur.
+					 */
 					_bt_relbuf(rel, buf);
 
 					{
@@ -1010,10 +1523,15 @@ _bt_split(Relation rel, Buffer buf, Buffer cbuf, OffsetNumber firstright,
 	isroot = P_ISROOT(oopaque);
 	isleaf = P_ISLEAF(oopaque);
 
-	/* if we're splitting this page, it won't be the root when we're done */
-	/* also, clear the SPLIT_END and HAS_GARBAGE flags in both pages */
+	/*
+	 * if we're splitting this page, it won't be the root when we're done.
+	 *
+	 * also, clear the SPLIT_END, HAS_GARBAGE and BTP_IS_LOCKED flags in both
+	 * pages.
+	 */
 	lopaque->btpo_flags = oopaque->btpo_flags;
-	lopaque->btpo_flags &= ~(BTP_ROOT | BTP_SPLIT_END | BTP_HAS_GARBAGE);
+	lopaque->btpo_flags &= ~(BTP_ROOT | BTP_SPLIT_END | BTP_HAS_GARBAGE |
+							 BTP_IS_LOCKED);
 	ropaque->btpo_flags = lopaque->btpo_flags;
 	/* set flag in left page indicating that the right page has no downlink */
 	lopaque->btpo_flags |= BTP_INCOMPLETE_SPLIT;
diff --git a/src/backend/access/nbtree/nbtree.c b/src/backend/access/nbtree/nbtree.c
index 117b18e..d77cb00 100644
--- a/src/backend/access/nbtree/nbtree.c
+++ b/src/backend/access/nbtree/nbtree.c
@@ -219,10 +219,52 @@ btbuildempty(PG_FUNCTION_ARGS)
 }
 
 /*
+ *	btlock() -- First phase of speculative index tuple insertion.
+ *
+ *		Descend the tree recursively, find the appropriate location for our new
+ *		tuple, or an existing tuple with the same value as the value argument
+ *		passed.  Lock the value for an instant (the implementation performs
+ *		locking at a granularity coarser than strictly necessary), preventing
+ *		concurrent insertion of would-be duplicates, and let the caller know if
+ *		insertion can proceed.  Value locks may still be held, and exact
+ *		details of who frees them and other state, and when, is arbitrated by
+ *		implementation (sometimes it pro-actively releases its own locks) and
+ *		is fully described within _bt_lockinsert().
+ */
+Datum
+btlock(PG_FUNCTION_ARGS)
+{
+	Relation			rel = (Relation) PG_GETARG_POINTER(0);
+	Datum			   *values = (Datum *) PG_GETARG_POINTER(1);
+	bool			   *isnull = (bool *) PG_GETARG_POINTER(2);
+	Relation			heapRel = (Relation) PG_GETARG_POINTER(3);
+	List			   *otherSpecStates = (List *) PG_GETARG_POINTER(4);
+	bool				priorConflict = PG_GETARG_BOOL(5);
+	SpeculativeState   *specState = palloc(sizeof(SpeculativeState));
+	BTSpecOpaque		btspec = palloc(sizeof(BTSpecOpaqueData));
+
+	/* allocate conflict tid space */
+	specState->conflictTid = palloc0(sizeof(ItemPointerData));
+	/* generate an index tuple */
+	btspec->itup = index_form_tuple(RelationGetDescr(rel), values, isnull);
+	/* set private state, set by _bt_lockinsert, for return to caller */
+	specState->privState = btspec;
+
+	_bt_lockinsert(rel, heapRel, specState, otherSpecStates, priorConflict);
+
+	PG_RETURN_POINTER(specState);
+}
+
+/*
  *	btinsert() -- insert an index tuple into a btree.
  *
- *		Descend the tree recursively, find the appropriate location for our
- *		new tuple, and put it there.
+ *		Descend the tree recursively, find the appropriate location for our new
+ *		tuple (though in the speculative insertion case, btlock will have taken
+ *		care of much of that for us already), and put it there.  This can be
+ *		called for a conventional insertion, or the latter phase of speculative
+ *		insertion (it is called in the same manner as always for non-unique
+ *		indexes during what the executor would formally consider to be the
+ *		second phase of speculative insertion).
  */
 Datum
 btinsert(PG_FUNCTION_ARGS)
@@ -233,17 +275,34 @@ btinsert(PG_FUNCTION_ARGS)
 	ItemPointer ht_ctid = (ItemPointer) PG_GETARG_POINTER(3);
 	Relation	heapRel = (Relation) PG_GETARG_POINTER(4);
 	IndexUniqueCheck checkUnique = (IndexUniqueCheck) PG_GETARG_INT32(5);
+	SpeculativeState *specState = (SpeculativeState *) PG_GETARG_POINTER(6);
+	BTSpecOpaque btspec;
 	bool		result;
-	IndexTuple	itup;
+	IndexTuple	itup = NULL;
 
-	/* generate an index tuple */
-	itup = index_form_tuple(RelationGetDescr(rel), values, isnull);
+	if (!specState)
+	{
+		/* non-speculative insertion, generate an index tuple from scratch */
+		itup = index_form_tuple(RelationGetDescr(rel), values, isnull);
+	}
+	else
+	{
+		btspec = (BTSpecOpaque) specState->privState;
+		/* Used cached index tuple from first phase (value locking) */
+		itup = btspec->itup;
+	}
 	itup->t_tid = *ht_ctid;
 
-	result = _bt_doinsert(rel, itup, checkUnique, heapRel);
+	Assert(ItemPointerIsValid(&itup->t_tid));
+
+	result = _bt_doinsert(rel, itup, checkUnique, heapRel, specState);
 
 	pfree(itup);
 
+	/* free private state only - caller should always free specState */
+	if (specState)
+		pfree(specState->privState);
+
 	PG_RETURN_BOOL(result);
 }
 
diff --git a/src/backend/catalog/index.c b/src/backend/catalog/index.c
index ee10594..68bfca2 100644
--- a/src/backend/catalog/index.c
+++ b/src/backend/catalog/index.c
@@ -1648,6 +1648,9 @@ BuildIndexInfo(Relation index)
 	ii->ii_Unique = indexStruct->indisunique;
 	ii->ii_ReadyForInserts = IndexIsReady(indexStruct);
 
+	/* merge on all indexes until we hear otherwise */
+	ii->ii_MergeOn = true;
+
 	/* initialize index-build state to default */
 	ii->ii_Concurrent = false;
 	ii->ii_BrokenHotChain = false;
@@ -2959,7 +2962,8 @@ validate_index_heapscan(Relation heapRelation,
 						 &rootTuple,
 						 heapRelation,
 						 indexInfo->ii_Unique ?
-						 UNIQUE_CHECK_YES : UNIQUE_CHECK_NO);
+						 UNIQUE_CHECK_YES : UNIQUE_CHECK_NO,
+						 NULL);
 
 			state->tups_inserted += 1;
 		}
diff --git a/src/backend/catalog/indexing.c b/src/backend/catalog/indexing.c
index 05aa56e..4c82d0d 100644
--- a/src/backend/catalog/indexing.c
+++ b/src/backend/catalog/indexing.c
@@ -139,7 +139,8 @@ CatalogIndexInsert(CatalogIndexState indstate, HeapTuple heapTuple)
 					 &(heapTuple->t_self),		/* tid of heap tuple */
 					 heapRelation,
 					 relationDescs[i]->rd_index->indisunique ?
-					 UNIQUE_CHECK_YES : UNIQUE_CHECK_NO);
+					 UNIQUE_CHECK_YES : UNIQUE_CHECK_NO,
+					 NULL);
 	}
 
 	ExecDropSingleTupleTableSlot(slot);
diff --git a/src/backend/commands/constraint.c b/src/backend/commands/constraint.c
index b0cad46..183a69d 100644
--- a/src/backend/commands/constraint.c
+++ b/src/backend/commands/constraint.c
@@ -162,7 +162,7 @@ unique_key_recheck(PG_FUNCTION_ARGS)
 		 * that has already been inserted is unique.
 		 */
 		index_insert(indexRel, values, isnull, &(new_row->t_self),
-					 trigdata->tg_relation, UNIQUE_CHECK_EXISTING);
+					 trigdata->tg_relation, UNIQUE_CHECK_EXISTING, NULL);
 	}
 	else
 	{
diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index eb2844a..54cba48 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -2333,7 +2333,7 @@ CopyFrom(CopyState cstate)
 
 				if (resultRelInfo->ri_NumIndices > 0)
 					recheckIndexes = ExecInsertIndexTuples(slot, &(tuple->t_self),
-														   estate);
+														   estate, NIL);
 
 				/* AFTER ROW INSERT Triggers */
 				ExecARInsertTriggers(estate, resultRelInfo, tuple,
@@ -2440,7 +2440,7 @@ CopyFromInsertBatch(CopyState cstate, EState *estate, CommandId mycid,
 			ExecStoreTuple(bufferedTuples[i], myslot, InvalidBuffer, false);
 			recheckIndexes =
 				ExecInsertIndexTuples(myslot, &(bufferedTuples[i]->t_self),
-									  estate);
+									  estate, NIL);
 			ExecARInsertTriggers(estate, resultRelInfo,
 								 bufferedTuples[i],
 								 recheckIndexes);
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index 781a736..1546fa8 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -850,6 +850,7 @@ ExplainNode(PlanState *planstate, List *ancestors,
 	const char *operation = NULL;
 	int			save_indent = es->indent;
 	bool		haschildren;
+	ModifyTable *mtplan;
 
 	switch (nodeTag(plan))
 	{
@@ -858,10 +859,14 @@ ExplainNode(PlanState *planstate, List *ancestors,
 			break;
 		case T_ModifyTable:
 			sname = "ModifyTable";
-			switch (((ModifyTable *) plan)->operation)
+			mtplan = (ModifyTable *) plan;
+			switch (mtplan->operation)
 			{
 				case CMD_INSERT:
-					pname = operation = "Insert";
+					if (!mtplan->onConflictPlan)
+						pname = operation = "Insert";
+					else
+						pname = operation = "Insert or Update";
 					break;
 				case CMD_UPDATE:
 					pname = operation = "Update";
diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c
index d71e9b8..df77573 100644
--- a/src/backend/executor/execMain.c
+++ b/src/backend/executor/execMain.c
@@ -2063,11 +2063,12 @@ EvalPlanQualFetch(EState *estate, Relation relation, int lockmode,
 					 * case, so as to avoid the "Halloween problem" of
 					 * repeated update attempts.  In the latter case it might
 					 * be sensible to fetch the updated tuple instead, but
-					 * doing so would require changing heap_lock_tuple as well
-					 * as heap_update and heap_delete to not complain about
-					 * updating "invisible" tuples, which seems pretty scary.
-					 * So for now, treat the tuple as deleted and do not
-					 * process.
+					 * doing so would require changing heap_update and
+					 * heap_delete to not complain about updating "invisible"
+					 * tuples, which seems pretty scary (heap_lock_tuple will
+					 * not complain, but few callers expect HeapTupleInvisible,
+					 * and we're not one of them).  So for now, treat the tuple
+					 * as deleted and do not process.
 					 */
 					ReleaseBuffer(buffer);
 					return NULL;
diff --git a/src/backend/executor/execUtils.c b/src/backend/executor/execUtils.c
index d5e1273..05187e9 100644
--- a/src/backend/executor/execUtils.c
+++ b/src/backend/executor/execUtils.c
@@ -30,6 +30,7 @@
  *
  *		ExecOpenIndices			\
  *		ExecCloseIndices		 | referenced by InitPlan, EndPlan,
+ *		ExecLockIndexValues		 | (optionally lock indexes first)
  *		ExecInsertIndexTuples	/  ExecInsert, ExecUpdate
  *
  *		RegisterExprContextCallback    Register function shutdown callback
@@ -54,6 +55,8 @@
 
 
 static bool get_last_attnums(Node *node, ProjectionInfo *projInfo);
+static bool ExecCheckPartialPredicate(IndexInfo *info, EState *estate,
+						 ExprContext *econtext);
 static bool index_recheck_constraint(Relation index, Oid *constr_procs,
 						 Datum *existing_values, bool *existing_isnull,
 						 Datum *new_values);
@@ -978,6 +981,236 @@ ExecCloseIndices(ResultRelInfo *resultRelInfo)
 }
 
 /* ----------------------------------------------------------------
+ * ExecCheckPartialPredicate
+ *
+ *		Verify if predicate is satisfied -- if not, callers can skip
+ *		index tuple insertion altogether
+ * ----------------------------------------------------------------
+ */
+static bool
+ExecCheckPartialPredicate(IndexInfo *info, EState *estate,
+						  ExprContext *econtext)
+{
+	List	   *predicate;
+
+	/* No predicate, insertion must be required */
+	if (info->ii_Predicate == NIL)
+		return true;
+
+	/*
+	 * Check for partial index.
+	 *
+	 * If predicate state not set up yet, create it (in the estate's per-query
+	 * context).
+	 */
+	predicate = info->ii_PredicateState;
+	if (predicate == NIL)
+	{
+		predicate = (List *)
+			ExecPrepareExpr((Expr *) info->ii_Predicate,
+							estate);
+		info->ii_PredicateState = predicate;
+	}
+
+	return ExecQual(predicate, econtext, false);
+}
+
+/* ----------------------------------------------------------------
+ *		ExecLockIndexValues
+ *
+ *		Acquire value locks on values that are proposed for insertion
+ *		into unique indexes.  Value locking prevents the concurrent
+ *		insertion of conflicting index tuples into unique indexes.
+ *		This is the first phase of speculative index tuple insertion.
+ *
+ *		Lock values for each unique index such that it is possible to
+ *		commit the core system to inserting a slot without any unique
+ *		index violations, or to inform the core system to not proceed
+ *		with heap insertion at all in respect of this slot.
+ *
+ *		Returns a list of unique indexes that were locked. *conflict
+ *		is set to the index offset of any index on which a conflict
+ *		occurs, if any, and may be read back before being set locally
+ *		to check for previous conflicts.
+ * ----------------------------------------------------------------
+ */
+List *
+ExecLockIndexValues(TupleTableSlot *slot, EState *estate,
+					SpecType spec, int *conflict)
+{
+	ResultRelInfo *resultRelInfo;
+	int			i;
+	int			numIndices;
+	RelationPtr relationDescs;
+	Relation	heapRelation;
+	IndexInfo **indexInfoArray;
+	ExprContext *econtext;
+	Datum		values[INDEX_MAX_KEYS];
+	bool		isnull[INDEX_MAX_KEYS];
+	List	   *result = NIL;
+
+	/*
+	 * Get information from the result relation info structure.
+	 */
+	resultRelInfo = estate->es_result_relation_info;
+	numIndices = resultRelInfo->ri_NumIndices;
+	relationDescs = resultRelInfo->ri_IndexRelationDescs;
+	indexInfoArray = resultRelInfo->ri_IndexRelationInfo;
+	heapRelation = resultRelInfo->ri_RelationDesc;
+
+	/*
+	 * We will use the EState's per-tuple context for evaluating predicates
+	 * and index expressions (creating it if it's not already there).
+	 */
+	econtext = GetPerTupleExprContext(estate);
+
+	/* Arrange for econtext's scan tuple to be the tuple under test */
+	econtext->ecxt_scantuple = slot;
+
+lindex:
+
+	/*
+	 * For each relevant unique index, form and lock the index tuple (this can
+	 * be cached by amcanunique access methods for later use by
+	 * ExecInsertIndexTuples())
+	 *
+	 * We lock the indexes in the opposite order to their usual
+	 * ExecInsertIndexTuples()/release order here.  That routine will always
+	 * insert into any unique indexes first, before finally inserting into
+	 * non-unique indexes, so as to minimize the window of lock contention.
+	 * The fact that indexes are sorted in this way while locking in opposite
+	 * order often implies that the locking window for the primary key is
+	 * lowest of all, though this isn't strictly guaranteed.
+	 */
+	for (i = numIndices - 1; i >= 0; i--)
+	{
+		Relation	indexRelation = relationDescs[i];
+		IndexInfo  *indexInfo;
+		SpeculativeState *state;
+
+		if (indexRelation == NULL)
+			continue;
+
+		indexInfo = indexInfoArray[i];
+
+		/* If the index is marked as read-only, ignore it */
+		if (!indexInfo->ii_ReadyForInserts)
+			continue;
+
+		/* Only value lock unique indexes */
+		if (!indexInfo->ii_Unique)
+			continue;
+
+		/* May be limited to merging on particular index */
+		if (!indexInfo->ii_MergeOn)
+			continue;
+
+		if (!indexRelation->rd_index->indimmediate)
+		{
+			switch (spec)
+			{
+				case SPEC_IGNORE:
+					ereport(ERROR,
+							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+							 errmsg("unsupported use of ON CONFLICT IGNORE with deferred unique constraint \"%s\"",
+									RelationGetRelationName(indexRelation)),
+							 errhint("ON CONFLICT IGNORE performs immediate verification."),
+							 errtableconstraint(heapRelation,
+												RelationGetRelationName(indexRelation))));
+				case SPEC_INSERT:
+					ereport(ERROR,
+							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+							 errmsg("unsupported use of ON CONFLICT UPDATE with deferred unique constraint \"%s\"",
+									RelationGetRelationName(indexRelation)),
+							 errhint("ON CONFLICT UPDATE performs immediate verification."),
+							 errtableconstraint(heapRelation,
+												RelationGetRelationName(indexRelation))));
+				case SPEC_UPDATE:
+				case SPEC_NONE:
+					  elog(ERROR, "invalid speculative insertion specification");
+			}
+		}
+
+		if (!ExecCheckPartialPredicate(indexInfo, estate, econtext))
+			continue;
+
+		/*
+		 * FormIndexDatum fills in its values and isnull parameters with the
+		 * appropriate values for the column(s) of the index.
+		 */
+		FormIndexDatum(indexInfo,
+					   slot,
+					   estate,
+					   values,
+					   isnull);
+
+		/*
+		 * The index AM does uniqueness checking.
+		 */
+		state = index_lock(indexRelation,
+						   values,
+						   isnull,
+						   heapRelation,
+						   result,
+						   *conflict == i);
+
+		if (state->outcome == INSERT_TRY_AGAIN)
+		{
+			/*
+			 * AM indicated that we must try again, typically because it had to
+			 * wait pending the outcome of another transaction.
+			 *
+			 * The AM lock function will have already used the list of
+			 * locked-so-far states passed to it to free all locks and other
+			 * resources for all previously locked indexes just before waiting.
+			 *
+			 * The lock starvation hazards here are minimal, since no sensible
+			 * usage of speculative insertion is likely to see conflicts on
+			 * multiple unique indexes at once when row locking (we only really
+			 * concurrently lock all unique index values proposed for insertion
+			 * to save the DML statement's author from specifying which unique
+			 * index they intend to merge on; it will ordinarily be obvious to
+			 * a person with application domain knowledge).  When clients wish
+			 * to avoid a tuple slot's insertion when a duplicate key violation
+			 * would otherwise occur (i.e. IGNORE), only one
+			 * conclusively-present conflict is required to give up, so lock
+			 * starvation is improbable there too.
+			 */
+			list_free(result);
+			result = NIL;
+
+			/* Record conflict, to hint to AM to expect this next time */
+			*conflict = i;
+
+			goto lindex;
+		}
+
+		/*
+		 * Prepend the list, because later stages expect to find the state in
+		 * right-way-around order, and we're working backwards
+		 */
+		result = lcons(state, result);
+
+		/*
+		 * There is no point in proceeding if we already have one would-be
+		 * violation -- we require total consensus
+		 */
+		if (state->outcome == INSERT_NO_PROCEED)
+		{
+			/*
+			 * Record conflict, to hint to AM to expect this if row locking
+			 * ultimately indicates that a full restart is required.  Should
+			 * control once again reach this function, the hint still carries.
+			 */
+			*conflict = i;
+			break;
+		}
+	}
+
+	return result;
+}
+
+/* ----------------------------------------------------------------
  *		ExecInsertIndexTuples
  *
  *		This routine takes care of inserting index tuples
@@ -990,7 +1223,10 @@ ExecCloseIndices(ResultRelInfo *resultRelInfo)
  *
  *		This returns a list of index OIDs for any unique or exclusion
  *		constraints that are deferred and that had
- *		potential (unconfirmed) conflicts.
+ *		potential (unconfirmed) conflicts.  With speculative
+ *		insertion, successful insertion without unique violations is
+ *		already assured, and specStates allows the second phase to
+ *		perform "insertion proper".
  *
  *		CAUTION: this must not be called for a HOT update.
  *		We can't defend against that here for lack of info.
@@ -1000,11 +1236,13 @@ ExecCloseIndices(ResultRelInfo *resultRelInfo)
 List *
 ExecInsertIndexTuples(TupleTableSlot *slot,
 					  ItemPointer tupleid,
-					  EState *estate)
+					  EState *estate,
+					  List *specStates)
 {
 	List	   *result = NIL;
 	ResultRelInfo *resultRelInfo;
 	int			i;
+	int			sn = 0;
 	int			numIndices;
 	RelationPtr relationDescs;
 	Relation	heapRelation;
@@ -1040,6 +1278,7 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
 		IndexInfo  *indexInfo;
 		IndexUniqueCheck checkUnique;
 		bool		satisfiesConstraint;
+		SpeculativeState *state;
 
 		if (indexRelation == NULL)
 			continue;
@@ -1050,38 +1289,22 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
 		if (!indexInfo->ii_ReadyForInserts)
 			continue;
 
-		/* Check for partial index */
-		if (indexInfo->ii_Predicate != NIL)
-		{
-			List	   *predicate;
-
-			/*
-			 * If predicate state not set up yet, create it (in the estate's
-			 * per-query context)
-			 */
-			predicate = indexInfo->ii_PredicateState;
-			if (predicate == NIL)
-			{
-				predicate = (List *)
-					ExecPrepareExpr((Expr *) indexInfo->ii_Predicate,
-									estate);
-				indexInfo->ii_PredicateState = predicate;
-			}
+		if (!ExecCheckPartialPredicate(indexInfo, estate, econtext))
+			continue;
 
-			/* Skip this index-update if the predicate isn't satisfied */
-			if (!ExecQual(predicate, econtext, false))
-				continue;
-		}
+		state = specStates && indexInfo->ii_Unique && indexInfo->ii_MergeOn ?
+			list_nth(specStates, sn++) : NULL;
 
 		/*
 		 * FormIndexDatum fills in its values and isnull parameters with the
-		 * appropriate values for the column(s) of the index.
+		 * appropriate values for the column(s) of the index, where required.
 		 */
-		FormIndexDatum(indexInfo,
-					   slot,
-					   estate,
-					   values,
-					   isnull);
+		if (!state)
+			FormIndexDatum(indexInfo,
+						   slot,
+						   estate,
+						   values,
+						   isnull);
 
 		/*
 		 * The index AM does the actual insertion, plus uniqueness checking.
@@ -1089,12 +1312,21 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
 		 * For an immediate-mode unique index, we just tell the index AM to
 		 * throw error if not unique.
 		 *
+		 * For the latter phase of speculative insertion, uniqueness
+		 * checks will already have been performed if we arrive here, and
+		 * should not be repeated here.  However, the user may have specified
+		 * that speculative insertion is in respect of a particular unique
+		 * index, in which case only that unique index will now have value
+		 * locks;  only tell am to insert that unique index speculatively.
+		 *
 		 * For a deferrable unique index, we tell the index AM to just detect
 		 * possible non-uniqueness, and we add the index OID to the result
 		 * list if further checking is needed.
 		 */
 		if (!indexRelation->rd_index->indisunique)
 			checkUnique = UNIQUE_CHECK_NO;
+		else if (specStates && indexInfo->ii_MergeOn)
+			checkUnique = UNIQUE_CHECK_SPEC;
 		else if (indexRelation->rd_index->indimmediate)
 			checkUnique = UNIQUE_CHECK_YES;
 		else
@@ -1106,7 +1338,8 @@ ExecInsertIndexTuples(TupleTableSlot *slot,
 						 isnull,	/* null flags */
 						 tupleid,		/* tid of heap tuple */
 						 heapRelation,	/* heap relation */
-						 checkUnique);	/* type of uniqueness check to do */
+						 checkUnique,	/* type of uniqueness check to do */
+						 state);		/* speculative state, if any */
 
 		/*
 		 * If the index has an associated exclusion constraint, check that.
diff --git a/src/backend/executor/nodeLockRows.c b/src/backend/executor/nodeLockRows.c
index 298d4b4..fbafcc5 100644
--- a/src/backend/executor/nodeLockRows.c
+++ b/src/backend/executor/nodeLockRows.c
@@ -147,10 +147,11 @@ lnext:
 				 * case, so as to avoid the "Halloween problem" of repeated
 				 * update attempts.  In the latter case it might be sensible
 				 * to fetch the updated tuple instead, but doing so would
-				 * require changing heap_lock_tuple as well as heap_update and
-				 * heap_delete to not complain about updating "invisible"
-				 * tuples, which seems pretty scary.  So for now, treat the
-				 * tuple as deleted and do not process.
+				 * require changing heap_update and heap_delete to not complain
+				 * about updating "invisible" tuples, which seems pretty scary
+				 * (heap_lock_tuple will not complain, but few callers expect
+				 * HeapTupleInvisible, and we're not one of them).  So for now,
+				 * treat the tuple as deleted and do not process.
 				 */
 				goto lnext;
 
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
index 8ac6047..2350f60 100644
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -52,6 +52,12 @@
 #include "utils/tqual.h"
 
 
+static bool ExecLockUpdateTuple(EState *estate,
+								ResultRelInfo *relinfo,
+								ItemPointer tid,
+								TupleTableSlot *planSlot,
+								ModifyTableState *onConflict);
+
 /*
  * Verify that the tuples to be produced by INSERT or UPDATE match the
  * target relation's rowtype
@@ -152,6 +158,38 @@ ExecProcessReturning(ProjectionInfo *projectReturning,
 }
 
 /* ----------------------------------------------------------------
+ * Verify that heap tuple is visible to transaction snapshot at higher
+ * isolation levels.
+ *
+ * It would not represent serializable behavior to proceed with avoiding
+ * insertion on the basis of another tuple that is not visible (at
+ * higher isolation levels).
+ * ----------------------------------------------------------------
+ */
+static void
+ExecCheckHeapTupleVisible(EState *estate,
+						  ResultRelInfo *relinfo,
+						  ItemPointer tid)
+{
+
+	Relation 	relation = relinfo->ri_RelationDesc;
+	Buffer					buffer;
+	HeapTupleData			tuple;
+
+	if (!IsolationUsesXactSnapshot())
+		return;
+
+	tuple.t_self = *tid;
+	if (!heap_fetch(relation, estate->es_snapshot, &tuple, &buffer, false,
+					NULL))
+		ereport(ERROR,
+				(errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
+				 errmsg("could not proceed on basis of version originating in still in progress transaction")));
+
+	ReleaseBuffer(buffer);
+}
+
+/* ----------------------------------------------------------------
  *		ExecInsert
  *
  *		For INSERT, we have to insert the tuple into the target relation
@@ -163,6 +201,8 @@ ExecProcessReturning(ProjectionInfo *projectReturning,
 static TupleTableSlot *
 ExecInsert(TupleTableSlot *slot,
 		   TupleTableSlot *planSlot,
+		   ModifyTableState *onConflict,
+		   SpecType spec,
 		   EState *estate,
 		   bool canSetTag)
 {
@@ -171,6 +211,8 @@ ExecInsert(TupleTableSlot *slot,
 	Relation	resultRelationDesc;
 	Oid			newId;
 	List	   *recheckIndexes = NIL;
+	List	   *specStates = NIL;
+	int			conflict;
 
 	/*
 	 * get the heap tuple out of the tuple table slot, making sure we have a
@@ -228,6 +270,11 @@ ExecInsert(TupleTableSlot *slot,
 	}
 	else if (resultRelInfo->ri_FdwRoutine)
 	{
+		if (spec != SPEC_NONE)
+			ereport(ERROR,
+					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+					 errmsg("INSERT...ON CONFLICT is not supported on foreign tables")));
+
 		/*
 		 * insert into foreign table: let the FDW do it
 		 */
@@ -259,6 +306,94 @@ ExecInsert(TupleTableSlot *slot,
 			ExecConstraints(resultRelInfo, slot, estate);
 
 		/*
+		 * For now, if we're performing a speculative insertion, no conflict on
+		 * any particular unique index is considered particularly likely.  As
+		 * and when conflicts emerge for this slot, further future conflicts on
+		 * the same unique index are anticipated, which is hinted to the
+		 * underlying AM's implementation in ExecLockIndexValues(), to
+		 * facilitate optimizations around lock strength.
+		 */
+		conflict = -1;
+ilock:
+		/*
+		 * Lock unique index values, as required when performing speculative
+		 * insertion
+		 */
+		if (resultRelInfo->ri_NumIndices > 0 && spec != SPEC_NONE)
+			specStates = ExecLockIndexValues(slot, estate, spec, &conflict);
+
+		/*
+		 * Check if it's required to proceed with the second phase ("insertion
+		 * proper") of speculative insertion in respect of the slot.  If
+		 * insertion should not proceed, no firing of AFTER ROW INSERT triggers
+		 * occurs.
+		 *
+		 * We don't suppress the effects (or, perhaps, side-effects) of BEFORE
+		 * ROW INSERT triggers.  This isn't ideal, but then we cannot proceed
+		 * with even considering uniqueness violations until these triggers
+		 * fire on the one hand, but on the other hand they have the ability to
+		 * execute arbitrary user-defined code which may perform operations
+		 * entirely outside the system's ability to nullify.
+		 */
+		if (!index_proceed(specStates))
+		{
+			ItemPointer		htup;
+
+			/*
+			 * Release index value locks -- if insertion had proceeded, this
+			 * would occur during index tuple insertion instead, as each index
+			 * tuple is individually inserted...
+			 */
+			htup = index_release(specStates, false);
+
+			/*
+			 * ...locks were only needed to ensure that insertion could proceed
+			 * without hindrance from concurrent insertions.  Now that it's
+			 * clear that insertion won't proceed (unless there is a later row
+			 * lock conflict due to a concurrent deletion) there is no
+			 * advantage in holding value locks until after row locks are
+			 * acquired.  Continuing to hold locks would not imply that there'd
+			 * be fewer row locking conflicts in ExecLockUpdateTuple(), plus
+			 * doing so introduces the risk of unprincipled deadlocks (i.e.
+			 * deadlocks that the user cannot reasonably avoid).
+			 *
+			 * Value locks can only prevent concurrent unique index tuple
+			 * insertion from completing, but UPDATEs and DELETEs still cause
+			 * conflicts for row locking (even non-HOT updates).
+			 */
+			switch (spec)
+			{
+				case SPEC_IGNORE:
+					ExecCheckHeapTupleVisible(estate, resultRelInfo, htup);
+					break;
+				case SPEC_INSERT:
+					if (!ExecLockUpdateTuple(estate, resultRelInfo, htup,
+											 planSlot, onConflict))
+					{
+						/* Couldn't lock row due to conflict.  Restart. */
+						index_release(specStates, true);
+						list_free(specStates);
+						goto ilock;
+					}
+					break;
+				case SPEC_UPDATE:
+				case SPEC_NONE:
+					elog(ERROR, "invalid speculative insertion specification");
+			}
+
+			/*
+			 * Finally, unpin value lock buffer
+			 */
+			index_release(specStates, true);
+
+			/*
+			 * Speculative insertion does not project RETURNING tuples in
+			 * respect of rows that were updated/ignored
+			 */
+			return NULL;
+		}
+
+		/*
 		 * insert the tuple
 		 *
 		 * Note: heap_insert returns the tid (location) of the new tuple in
@@ -269,10 +404,14 @@ ExecInsert(TupleTableSlot *slot,
 
 		/*
 		 * insert index entries for tuple
+		 *
+		 * Locks will be acquired if needed, or the locks acquired by
+		 * ExecLockIndexTuples() may be used instead.
 		 */
 		if (resultRelInfo->ri_NumIndices > 0)
 			recheckIndexes = ExecInsertIndexTuples(slot, &(tuple->t_self),
-												   estate);
+												   estate,
+												   specStates);
 	}
 
 	if (canSetTag)
@@ -285,6 +424,7 @@ ExecInsert(TupleTableSlot *slot,
 	/* AFTER ROW INSERT Triggers */
 	ExecARInsertTriggers(estate, resultRelInfo, tuple, recheckIndexes);
 
+	list_free(specStates);
 	list_free(recheckIndexes);
 
 	/* Check any WITH CHECK OPTION constraints */
@@ -768,7 +908,7 @@ lreplace:;
 		 */
 		if (resultRelInfo->ri_NumIndices > 0 && !HeapTupleIsHeapOnly(tuple))
 			recheckIndexes = ExecInsertIndexTuples(slot, &(tuple->t_self),
-												   estate);
+												   estate, NIL);
 	}
 
 	if (canSetTag)
@@ -793,6 +933,213 @@ lreplace:;
 }
 
 
+/* ----------------------------------------------------------------
+ * Try to lock tuple for update as part of speculative insertion.  If
+ * a qual originating from ON CONFLICT UPDATE is satisfied, update
+ * (but still lock row, even though it may not satisfy estate's
+ * snapshot).
+ *
+ * Parameterized plans appearing in auxiliary update plan are rejected
+ * outright.  Therefore, it is safe to perform update without
+ * parameters that may be intended for SPEC_INSERT plan.  This
+ * effectively prevents any cases where the EvalPlanQual re-scanning
+ * performed here would be problematic (including, for example,
+ * subqueries in targetlists or quals).  Some of these cases might
+ * still be possible (such as when only an initplan is required), but
+ * restrictions are applied more broadly during parsing and planning.
+ *
+ * Returns value indicating if we're done (with or without an
+ * update), or if the executor must start from scratch.
+ * ----------------------------------------------------------------
+ */
+static bool
+ExecLockUpdateTuple(EState *estate,
+					ResultRelInfo *relinfo,
+					ItemPointer tid,
+					TupleTableSlot *planSlot,
+					ModifyTableState *onConflict)
+{
+	Relation				relation = relinfo->ri_RelationDesc;
+	HeapTupleData			tuple;
+	HeapTuple				copyTuple = NULL;
+	HeapUpdateFailureData 	hufd;
+	HTSU_Result 			test;
+	Buffer					buffer;
+	TupleTableSlot		   *slot;
+
+	Assert(ItemPointerIsValid(tid));
+
+	/*
+	 * Lock tuple for update.
+	 *
+	 * Like EvalPlanQualFetch(), don't follow updates.  There is no actual
+	 * benefit to doing so, since a conflict invalidates our previous
+	 * conclusion that the tuple is the conclusively committed conflicting
+	 * tuple.
+	 */
+	tuple.t_self = *tid;
+	test = heap_lock_tuple(relation, &tuple,
+						   estate->es_output_cid,
+						   LockTupleExclusive, false, /* wait */
+						   false, &buffer, &hufd);
+
+	if (test == HeapTupleMayBeUpdated)
+		copyTuple = heap_copytuple(&tuple);
+
+	switch (test)
+	{
+		case HeapTupleInvisible:
+			/*
+			 * This may occur when an instantaneously invisible tuple is blamed
+			 * as a conflict because multiple rows are inserted with the same
+			 * constrained values.
+			 *
+			 * We cannot proceed, because to do so would leave users open to
+			 * the risk that the same row will be updated a second time in the
+			 * same command;  allowing a second update affecting a single row
+			 * within the same command a second time would leave the update
+			 * order undefined.  It is the user's responsibility to resolve
+			 * these self-duplicates in advance of proposing for insertion a
+			 * set of tuples, but warn them.  These problems are why SQL-2003
+			 * similarly specifies that for SQL MERGE, an exception must be
+			 * raised in the event of an attempt to update the same row twice.
+			 *
+			 * XXX:  It might be preferable to do something similar when a
+			 * row is locked twice (and not updated twice) by the same
+			 * speculative insertion, as if to take each lock acquisition as a
+			 * indication of a discrete, unfulfilled intent to update (perhaps
+			 * in some later command of the same xact).  This does not seem
+			 * feasible, though.
+			 */
+			if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXmin(tuple.t_data)))
+				ereport(ERROR,
+						(errcode(ERRCODE_UNIQUE_VIOLATION),
+						 errmsg("could not lock instantaneously invisible tuple inserted in same transaction"),
+						 errhint("Ensure that no rows proposed for insertion in the same command have constrained values that duplicate each other.")));
+
+			/* This shouldn't happen */
+			elog(ERROR, "attempted to lock invisible tuple");
+			return false;		/* keep compiler quiet */
+		case HeapTupleSelfUpdated:
+			if (hufd.cmax != estate->es_output_cid)
+			{
+				/*
+				 * A later command updated or deleted the tuple.  Throw an
+				 * error for the same reasons enumerated in ExecUpdate and
+				 * ExecDelete.
+				 */
+				ereport(ERROR,
+						(errcode(ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION),
+						 errmsg("tuple to be updated was already modified by an operation triggered by the current command"),
+						 errhint("Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows.")));
+			}
+			else
+			{
+				/*
+				 * Handle this case as equivalent to the HeapTupleInvisible
+				 * case.
+				 *
+				 * XXX: In practice this is dead code, and the problem will
+				 * always be handled by the HeapTupleInvisible case, since if
+				 * we updated this tuple, speculative insertion's first
+				 * phase/the amcanunique AM wouldn't have concluded that it was
+				 * a conflict tuple, since a dirty snapshot is used to do so,
+				 * which would have seen the effects of that would-be update
+				 * (i.e. this tuple would not have been visible to a dirty
+				 * snapshot immediately before now).
+				 */
+				ereport(ERROR,
+						(errcode(ERRCODE_UNIQUE_VIOLATION),
+						 errmsg("could not lock tuple already updated or deleted by the current command"),
+						 errhint("Ensure that no rows proposed for insertion in the same command have constrained values that duplicate each other.")));
+			}
+			return false;		/* keep compiler quiet */
+		case HeapTupleMayBeUpdated:
+			/*
+			 * Success -- we're done, as tuple is locked.  Verify that the
+			 * tuple is known to be visible to our snapshot under conventional
+			 * MVCC rules if the current isolation level mandates that.  In
+			 * READ COMMITTED mode, we can lock + update a tuple still in
+			 * progress according to our snapshot, but higher isolation levels
+			 * cannot avail of that, and must actively defend against doing so.
+			 *
+			 * This loosening of snapshot isolation for the benefit of READ
+			 * COMMITTED speculative insertions is used consistently:
+			 * speculative quals are only tested in respect of already locked
+			 * tuples.  It would be rather inconsistent to UPDATE when no tuple
+			 * version is visible on the one hand, while also failing to UPDATE
+			 * only on the basis of the non-conclusive tuple version that
+			 * happens to be the version visible to the estate snapshot.
+			 */
+			if (IsolationUsesXactSnapshot() &&
+				XidInProgress(HeapTupleHeaderGetXmin(tuple.t_data),
+							  estate->es_snapshot))
+				ereport(ERROR,
+						(errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
+						 errmsg("could not update row version originating in still in progress transaction")));
+
+			/*
+			 * Conceptually, the parent ModifyTable is like a relation scan
+			 * node that uses a dirty snapshot, returning rows which the
+			 * auxiliary plan must operate on (if only to lock all such rows).
+			 * EvalPlanQual() is involved in the evaluation of their UPDATE,
+			 * regardless of whether or not the tuple is visible to the
+			 * command's MVCC Snapshot.
+			 */
+			EvalPlanQualBegin(&onConflict->mt_epqstate, onConflict->ps.state);
+			EvalPlanQualSetTuple(&onConflict->mt_epqstate,
+								 onConflict->ps.state->es_result_relation_info->ri_RangeTableIndex,
+								 copyTuple);
+			slot = EvalPlanQualNext(&onConflict->mt_epqstate);
+
+			if (!TupIsNull(slot))
+				ExecUpdate(&tuple.t_data->t_ctid, NULL, slot, planSlot,
+						   &onConflict->mt_epqstate, onConflict->ps.state, false);
+
+			ReleaseBuffer(buffer);
+
+			/*
+			 * As when executing a ModifyTable node in the conventional manner,
+			 * Reset the per-output-tuple exprcontext
+			 */
+			ResetPerTupleExprContext(onConflict->ps.state);
+			return true;
+		case HeapTupleUpdated:
+			if (IsolationUsesXactSnapshot())
+				ereport(ERROR,
+						(errcode(ERRCODE_T_R_SERIALIZATION_FAILURE),
+						 errmsg("could not serialize access due to concurrent update")));
+
+			/*
+			 * Tell caller to try again from the very start.  We don't use the
+			 * usual EvalPlanQual looping pattern here, fundamentally because
+			 * we don't have a useful qual to verify the next tuple with.
+			 *
+			 * We might devise a means of verifying, by way of binary equality
+			 * in a similar manner to HOT codepaths, if any unique indexed
+			 * columns changed, but this would only serve to ameliorate the
+			 * fundamental problem.  It might well not be good enough, because
+			 * those columns could change too.  It's not clear that doing any
+			 * better here would be worth it.
+			 *
+			 * At this point, all bets are off -- it might actually turn out to
+			 * be okay to proceed with insertion instead of locking now (the
+			 * tuple we attempted to lock could have been deleted, for
+			 * example).  On the other hand, it might not be okay, but for an
+			 * entirely different reason, with an entirely separate TID to
+			 * blame and lock.  This TID may not even be part of the same
+			 * update chain.
+			 */
+			ReleaseBuffer(buffer);
+			return false;
+		default:
+			elog(ERROR, "unrecognized heap_lock_tuple status: %u", test);
+	}
+
+	return false;
+}
+
+
 /*
  * Process BEFORE EACH STATEMENT triggers
  */
@@ -852,6 +1199,8 @@ ExecModifyTable(ModifyTableState *node)
 {
 	EState	   *estate = node->ps.state;
 	CmdType		operation = node->operation;
+	ModifyTableState  *onConflict = (ModifyTableState *) node->onConflict;
+	SpecType	spec = node->spec;
 	ResultRelInfo *saved_resultRelInfo;
 	ResultRelInfo *resultRelInfo;
 	PlanState  *subplanstate;
@@ -1022,7 +1371,8 @@ ExecModifyTable(ModifyTableState *node)
 		switch (operation)
 		{
 			case CMD_INSERT:
-				slot = ExecInsert(slot, planSlot, estate, node->canSetTag);
+				slot = ExecInsert(slot, planSlot, onConflict, spec, estate,
+								  node->canSetTag);
 				break;
 			case CMD_UPDATE:
 				slot = ExecUpdate(tupleid, oldtuple, slot, planSlot,
@@ -1070,6 +1420,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 {
 	ModifyTableState *mtstate;
 	CmdType		operation = node->operation;
+	Plan	   *onConflictPlan = node->onConflictPlan;
 	int			nplans = list_length(node->plans);
 	ResultRelInfo *saved_resultRelInfo;
 	ResultRelInfo *resultRelInfo;
@@ -1097,6 +1448,7 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 	mtstate->resultRelInfo = estate->es_result_relations + node->resultRelIndex;
 	mtstate->mt_arowmarks = (List **) palloc0(sizeof(List *) * nplans);
 	mtstate->mt_nplans = nplans;
+	mtstate->spec = node->spec;
 
 	/* set up epqstate with dummy subplan data for the moment */
 	EvalPlanQualInit(&mtstate->mt_epqstate, estate, NULL, NIL, node->epqParam);
@@ -1135,8 +1487,39 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 		if (resultRelInfo->ri_RelationDesc->rd_rel->relhasindex &&
 			operation != CMD_DELETE &&
 			resultRelInfo->ri_IndexRelationDescs == NULL)
+		{
 			ExecOpenIndices(resultRelInfo);
 
+			/*
+			 * If explicit ON CONFLICT WITHIN unique index was specified,
+			 * represent that value locking should only occur in that index
+			 */
+			if (node->spec != SPEC_NONE && node->mergeIndex != InvalidOid)
+			{
+				RelationPtr relationDescs = resultRelInfo->ri_IndexRelationDescs;
+				IndexInfo **indexInfoArray;
+				int 		numIndices = resultRelInfo->ri_NumIndices;
+				int			j;
+				IndexInfo  *indexInfo;
+
+				indexInfoArray = resultRelInfo->ri_IndexRelationInfo;
+
+				resultRelInfo = mtstate->resultRelInfo;
+				for (j = 0; j < numIndices; j++)
+				{
+					Relation	indexRelation = relationDescs[j];
+					indexInfo = indexInfoArray[j];
+
+					if (indexRelation->rd_id != node->mergeIndex)
+						indexInfo->ii_MergeOn = false;
+					else if (!indexInfo->ii_Unique)
+						ereport(ERROR,
+								(errcode(ERRCODE_INVALID_OBJECT_DEFINITION ),
+								 errmsg("ON CONFLICT WITHIN index is not a unique index")));
+				}
+			}
+		}
+
 		/* Now init the plan for this result rel */
 		estate->es_result_relation_info = resultRelInfo;
 		mtstate->mt_plans[i] = ExecInitNode(subplan, estate, eflags);
@@ -1331,7 +1714,8 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 							resultRelInfo->ri_RelationDesc->rd_att->tdhasoid,
 									   ExecInitExtraTupleSlot(estate));
 
-				if (operation == CMD_UPDATE || operation == CMD_DELETE)
+				if ((operation == CMD_UPDATE || operation == CMD_DELETE) &&
+					node->spec == SPEC_NONE)
 				{
 					/* For UPDATE/DELETE, find the appropriate junk attr now */
 					char		relkind;
@@ -1373,6 +1757,27 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 	}
 
 	/*
+	 * Initialize auxiliary ModifyTable node for INSERT...ON CONFLICT UPDATE.
+	 *
+	 * The UPDATE portion of the query is essentially represented as auxiliary
+	 * to INSERT state at all stages of query processing, with a representation
+	 * at each stage that is analogous to a regular UPDATE, but it is not
+	 * directly represented in user-visible output such as EXPLAIN.
+	 *
+	 * ExecModifyTable() is never called in respect of an auxiliary
+	 * ModifyTableState.  Execution of the auxiliary plan is driven by its
+	 * parent in an ad-hoc fashion.
+	 */
+	if (onConflictPlan)
+	{
+		PlanState *pstate;
+
+		Assert(mtstate->spec == SPEC_INSERT);
+		pstate = ExecInitNode(onConflictPlan, estate, eflags);
+		mtstate->onConflict = pstate;
+	}
+
+	/*
 	 * Set up a tuple table slot for use for trigger output tuples. In a plan
 	 * containing multiple ModifyTable nodes, all can share one such slot, so
 	 * we keep it in the estate.
@@ -1387,11 +1792,19 @@ ExecInitModifyTable(ModifyTable *node, EState *estate, int eflags)
 	 * ModifyTable node too, but there's no need.)  Note the use of lcons not
 	 * lappend: we need later-initialized ModifyTable nodes to be shut down
 	 * before earlier ones.  This ensures that we don't throw away RETURNING
-	 * rows that need to be seen by a later CTE subplan.
+	 * rows that need to be seen by a later CTE subplan.  We do not want to
+	 * append an auxiliary ON CONFLICT UPDATE node, since it must have a
+	 * primary ModifyTable node that merely uses its state to selectively
+	 * execute some portions of the would-be unqualified UPDATE.  There are
+	 * restrictions imposed upon the UPDATE that make the primary and auxiliary
+	 * plans isomorphic.  This is sufficient to make ExecLockUpdateTuple()
+	 * safe.
 	 */
-	if (!mtstate->canSetTag)
+	if (!mtstate->canSetTag && mtstate->spec != SPEC_UPDATE)
+	{
 		estate->es_auxmodifytables = lcons(mtstate,
 										   estate->es_auxmodifytables);
+	}
 
 	return mtstate;
 }
@@ -1442,6 +1855,8 @@ ExecEndModifyTable(ModifyTableState *node)
 	 */
 	for (i = 0; i < node->mt_nplans; i++)
 		ExecEndNode(node->mt_plans[i]);
+
+	ExecEndNode(node->onConflict);
 }
 
 void
diff --git a/src/backend/nodes/copyfuncs.c b/src/backend/nodes/copyfuncs.c
index 9f5bcd7..079b3aa 100644
--- a/src/backend/nodes/copyfuncs.c
+++ b/src/backend/nodes/copyfuncs.c
@@ -178,6 +178,9 @@ _copyModifyTable(const ModifyTable *from)
 	COPY_NODE_FIELD(resultRelations);
 	COPY_SCALAR_FIELD(resultRelIndex);
 	COPY_NODE_FIELD(plans);
+	COPY_NODE_FIELD(onConflictPlan);
+	COPY_SCALAR_FIELD(spec);
+	COPY_SCALAR_FIELD(mergeIndex);
 	COPY_NODE_FIELD(withCheckOptionLists);
 	COPY_NODE_FIELD(returningLists);
 	COPY_NODE_FIELD(fdwPrivLists);
@@ -2090,6 +2093,19 @@ _copyWithClause(const WithClause *from)
 	return newnode;
 }
 
+static ConflictClause *
+_copyConflictClause(const ConflictClause *from)
+{
+	ConflictClause *newnode = makeNode(ConflictClause);
+
+	COPY_SCALAR_FIELD(specClause);
+	COPY_NODE_FIELD(stmt);
+	COPY_NODE_FIELD(relation);
+	COPY_LOCATION_FIELD(location);
+
+	return newnode;
+}
+
 static CommonTableExpr *
 _copyCommonTableExpr(const CommonTableExpr *from)
 {
@@ -2494,6 +2510,9 @@ _copyQuery(const Query *from)
 	COPY_NODE_FIELD(jointree);
 	COPY_NODE_FIELD(targetList);
 	COPY_NODE_FIELD(withCheckOptions);
+	COPY_NODE_FIELD(onConflict);
+	COPY_SCALAR_FIELD(specClause);
+	COPY_SCALAR_FIELD(mergeIndex);
 	COPY_NODE_FIELD(returningList);
 	COPY_NODE_FIELD(groupClause);
 	COPY_NODE_FIELD(havingQual);
@@ -2518,6 +2537,7 @@ _copyInsertStmt(const InsertStmt *from)
 	COPY_NODE_FIELD(cols);
 	COPY_NODE_FIELD(selectStmt);
 	COPY_NODE_FIELD(returningList);
+	COPY_NODE_FIELD(confClause);
 	COPY_NODE_FIELD(withClause);
 
 	return newnode;
@@ -4653,6 +4673,9 @@ copyObject(const void *from)
 		case T_WithClause:
 			retval = _copyWithClause(from);
 			break;
+		case T_ConflictClause:
+			retval = _copyConflictClause(from);
+			break;
 		case T_CommonTableExpr:
 			retval = _copyCommonTableExpr(from);
 			break;
diff --git a/src/backend/nodes/equalfuncs.c b/src/backend/nodes/equalfuncs.c
index 8d13c69..1ec7192 100644
--- a/src/backend/nodes/equalfuncs.c
+++ b/src/backend/nodes/equalfuncs.c
@@ -862,6 +862,9 @@ _equalQuery(const Query *a, const Query *b)
 	COMPARE_NODE_FIELD(jointree);
 	COMPARE_NODE_FIELD(targetList);
 	COMPARE_NODE_FIELD(withCheckOptions);
+	COMPARE_NODE_FIELD(onConflict);
+	COMPARE_SCALAR_FIELD(specClause);
+	COMPARE_SCALAR_FIELD(mergeIndex);
 	COMPARE_NODE_FIELD(returningList);
 	COMPARE_NODE_FIELD(groupClause);
 	COMPARE_NODE_FIELD(havingQual);
@@ -2400,6 +2403,16 @@ _equalWithClause(const WithClause *a, const WithClause *b)
 }
 
 static bool
+_equalConflictClause(const ConflictClause *a, const ConflictClause *b)
+{
+	COMPARE_SCALAR_FIELD(specClause);
+	COMPARE_NODE_FIELD(relation);
+	COMPARE_LOCATION_FIELD(location);
+
+	return true;
+}
+
+static bool
 _equalCommonTableExpr(const CommonTableExpr *a, const CommonTableExpr *b)
 {
 	COMPARE_STRING_FIELD(ctename);
@@ -3117,6 +3130,9 @@ equal(const void *a, const void *b)
 		case T_WithClause:
 			retval = _equalWithClause(a, b);
 			break;
+		case T_ConflictClause:
+			retval = _equalConflictClause(a, b);
+			break;
 		case T_CommonTableExpr:
 			retval = _equalCommonTableExpr(a, b);
 			break;
diff --git a/src/backend/nodes/nodeFuncs.c b/src/backend/nodes/nodeFuncs.c
index 41e973b..12735ab 100644
--- a/src/backend/nodes/nodeFuncs.c
+++ b/src/backend/nodes/nodeFuncs.c
@@ -1474,6 +1474,9 @@ exprLocation(const Node *expr)
 		case T_WithClause:
 			loc = ((const WithClause *) expr)->location;
 			break;
+		case T_ConflictClause:
+			loc = ((const ConflictClause *) expr)->location;
+			break;
 		case T_CommonTableExpr:
 			loc = ((const CommonTableExpr *) expr)->location;
 			break;
@@ -1958,6 +1961,8 @@ query_tree_walker(Query *query,
 		return true;
 	if (walker((Node *) query->withCheckOptions, context))
 		return true;
+	if (walker(query->onConflict, context))
+		return true;
 	if (walker((Node *) query->returningList, context))
 		return true;
 	if (walker((Node *) query->jointree, context))
diff --git a/src/backend/nodes/outfuncs.c b/src/backend/nodes/outfuncs.c
index da75e29..3c35e4f 100644
--- a/src/backend/nodes/outfuncs.c
+++ b/src/backend/nodes/outfuncs.c
@@ -332,6 +332,9 @@ _outModifyTable(StringInfo str, const ModifyTable *node)
 	WRITE_NODE_FIELD(resultRelations);
 	WRITE_INT_FIELD(resultRelIndex);
 	WRITE_NODE_FIELD(plans);
+	WRITE_NODE_FIELD(onConflictPlan);
+	WRITE_ENUM_FIELD(spec, SpecType);
+	WRITE_OID_FIELD(mergeIndex);
 	WRITE_NODE_FIELD(withCheckOptionLists);
 	WRITE_NODE_FIELD(returningLists);
 	WRITE_NODE_FIELD(fdwPrivLists);
@@ -2268,6 +2271,9 @@ _outQuery(StringInfo str, const Query *node)
 	WRITE_NODE_FIELD(jointree);
 	WRITE_NODE_FIELD(targetList);
 	WRITE_NODE_FIELD(withCheckOptions);
+	WRITE_NODE_FIELD(onConflict);
+	WRITE_ENUM_FIELD(specClause, SpecType);
+	WRITE_OID_FIELD(mergeIndex);
 	WRITE_NODE_FIELD(returningList);
 	WRITE_NODE_FIELD(groupClause);
 	WRITE_NODE_FIELD(havingQual);
@@ -2341,6 +2347,16 @@ _outWithClause(StringInfo str, const WithClause *node)
 }
 
 static void
+_outConflictClause(StringInfo str, const ConflictClause *node)
+{
+	WRITE_NODE_TYPE("CONFLICTCLAUSE");
+
+	WRITE_ENUM_FIELD(specClause, SpecType);
+	WRITE_NODE_FIELD(relation);
+	WRITE_LOCATION_FIELD(location);
+}
+
+static void
 _outCommonTableExpr(StringInfo str, const CommonTableExpr *node)
 {
 	WRITE_NODE_TYPE("COMMONTABLEEXPR");
@@ -3187,6 +3203,9 @@ _outNode(StringInfo str, const void *obj)
 			case T_WithClause:
 				_outWithClause(str, obj);
 				break;
+			case T_ConflictClause:
+				_outConflictClause(str, obj);
+				break;
 			case T_CommonTableExpr:
 				_outCommonTableExpr(str, obj);
 				break;
diff --git a/src/backend/nodes/readfuncs.c b/src/backend/nodes/readfuncs.c
index 65584d1..62c0f3e 100644
--- a/src/backend/nodes/readfuncs.c
+++ b/src/backend/nodes/readfuncs.c
@@ -213,6 +213,9 @@ _readQuery(void)
 	READ_NODE_FIELD(jointree);
 	READ_NODE_FIELD(targetList);
 	READ_NODE_FIELD(withCheckOptions);
+	READ_NODE_FIELD(onConflict);
+	READ_ENUM_FIELD(specClause, SpecType);
+	READ_OID_FIELD(mergeIndex);
 	READ_NODE_FIELD(returningList);
 	READ_NODE_FIELD(groupClause);
 	READ_NODE_FIELD(havingQual);
diff --git a/src/backend/optimizer/path/costsize.c b/src/backend/optimizer/path/costsize.c
index 0cdb790..de2c171 100644
--- a/src/backend/optimizer/path/costsize.c
+++ b/src/backend/optimizer/path/costsize.c
@@ -280,7 +280,13 @@ cost_index(IndexPath *path, PlannerInfo *root, double loop_count)
 		allclauses = baserel->baserestrictinfo;
 	}
 
-	if (!enable_indexscan)
+	/*
+	 * TODO: Clean this up.  There is no obvious way to generalize from the
+	 * example of isCurrentOf, which seems more appropriate, because there
+	 * isn't necessarily something to add disable_cost to within
+	 * cost_qual_eval().
+	 */
+	if (!enable_indexscan || root->parse->specClause == SPEC_UPDATE)
 		startup_cost += disable_cost;
 	/* we don't need to check enable_indexonlyscan; indxpath.c does that */
 
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c
index 4b641a2..b5966d0 100644
--- a/src/backend/optimizer/plan/createplan.c
+++ b/src/backend/optimizer/plan/createplan.c
@@ -4719,7 +4719,8 @@ make_modifytable(PlannerInfo *root,
 				 CmdType operation, bool canSetTag,
 				 List *resultRelations, List *subplans,
 				 List *withCheckOptionLists, List *returningLists,
-				 List *rowMarks, int epqParam)
+				 List *rowMarks, Plan *onConflictPlan, SpecType spec,
+				 Oid mergeIndex, int epqParam)
 {
 	ModifyTable *node = makeNode(ModifyTable);
 	Plan	   *plan = &node->plan;
@@ -4735,6 +4736,11 @@ make_modifytable(PlannerInfo *root,
 	Assert(returningLists == NIL ||
 		   list_length(resultRelations) == list_length(returningLists));
 
+	if (spec != SPEC_NONE && list_length(resultRelations) > 1)
+		ereport(ERROR,
+				(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+				 errmsg("INSERT...ON CONFLICT does not support table inheritance")));
+
 	/*
 	 * Compute cost as sum of subplan costs.
 	 */
@@ -4768,6 +4774,9 @@ make_modifytable(PlannerInfo *root,
 	node->resultRelations = resultRelations;
 	node->resultRelIndex = -1;	/* will be set correctly in setrefs.c */
 	node->plans = subplans;
+	node->onConflictPlan = onConflictPlan;
+	node->spec = spec;
+	node->mergeIndex = mergeIndex;
 	node->withCheckOptionLists = withCheckOptionLists;
 	node->returningLists = returningLists;
 	node->rowMarks = rowMarks;
diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c
index e1480cd..282b9b2 100644
--- a/src/backend/optimizer/plan/planner.c
+++ b/src/backend/optimizer/plan/planner.c
@@ -610,7 +610,41 @@ subquery_planner(PlannerGlobal *glob, Query *parse,
 											 withCheckOptionLists,
 											 returningLists,
 											 rowMarks,
+											 NULL,
+											 parse->specClause,
+											 parse->mergeIndex,
 											 SS_assign_special_param(root));
+
+			if (parse->onConflict)
+			{
+				Query		   *conflictQry = (Query*) parse->onConflict;
+				ModifyTable	   *parent = (ModifyTable *) plan;
+				Plan		   *planOnConflict;
+
+				/*
+				 * An ON CONFLICT UPDATE query is a subquery of its parent
+				 * INSERT ModifyTable, but isn't formally a subplan.
+				 *
+				 * XXX:  It may be worth blending the costs associated with
+				 * this plan into its parent.  Since it isn't formally a
+				 * subplan, that does not occur at present.
+				 */
+				planOnConflict = subquery_planner(glob, conflictQry, root,
+												  hasRecursion, 0, NULL);
+
+				if (contain_subplans((Node *) conflictQry->targetList))
+					ereport(ERROR,
+							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+							 errmsg("UPDATE portion of ON CONFLICT contains subplans"),
+							 errhint("Only trivial targetlist entries and predicates are supported.")));
+
+				if (bms_num_members(planOnConflict->allParam) > 0)
+					ereport(ERROR,
+							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+							 errmsg("paramaterized auxiliary UPDATE queries are unsupported")));
+
+				parent->onConflictPlan = planOnConflict;
+			}
 		}
 	}
 
@@ -1045,6 +1079,11 @@ inheritance_planner(PlannerInfo *root)
 	else
 		rowMarks = root->rowMarks;
 
+	if (parse->onConflict)
+		ereport(ERROR,
+				(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
+				 errmsg("ON CONFLICT UPDATE is not supported within inheritance hierarchy")));
+
 	/* And last, tack on a ModifyTable node to do the UPDATE/DELETE work */
 	return (Plan *) make_modifytable(root,
 									 parse->commandType,
@@ -1054,6 +1093,9 @@ inheritance_planner(PlannerInfo *root)
 									 withCheckOptionLists,
 									 returningLists,
 									 rowMarks,
+									 NULL,
+									 parse->specClause,
+									 InvalidOid,
 									 SS_assign_special_param(root));
 }
 
diff --git a/src/backend/optimizer/plan/setrefs.c b/src/backend/optimizer/plan/setrefs.c
index 4d717df..fb378b2 100644
--- a/src/backend/optimizer/plan/setrefs.c
+++ b/src/backend/optimizer/plan/setrefs.c
@@ -765,6 +765,14 @@ set_plan_refs(PlannerInfo *root, Plan *plan, int rtoffset)
 				root->glob->resultRelations =
 					list_concat(root->glob->resultRelations,
 								list_copy(splan->resultRelations));
+
+				if (splan->onConflictPlan)
+				{
+					splan->onConflictPlan = (Plan *) set_plan_refs(root,
+											  (Plan *) splan->onConflictPlan,
+											  rtoffset);
+				}
+
 			}
 			break;
 		case T_Append:
diff --git a/src/backend/optimizer/plan/subselect.c b/src/backend/optimizer/plan/subselect.c
index 3e7dc85..81b90b0 100644
--- a/src/backend/optimizer/plan/subselect.c
+++ b/src/backend/optimizer/plan/subselect.c
@@ -2305,6 +2305,8 @@ finalize_plan(PlannerInfo *root, Plan *plan, Bitmapset *valid_params,
 													  valid_params,
 													  scan_params));
 				}
+
+				/* No need to directly handle onConflict here */
 			}
 			break;
 
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index c0b1fe3..cdc0ab2 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -391,6 +391,8 @@ transformDeleteStmt(ParseState *pstate, DeleteStmt *stmt)
 	/* done building the range table and jointree */
 	qry->rtable = pstate->p_rtable;
 	qry->jointree = makeFromExpr(pstate->p_joinlist, qual);
+	qry->specClause = SPEC_NONE;
+	qry->onConflict = NULL;
 
 	qry->hasSubLinks = pstate->p_hasSubLinks;
 	qry->hasWindowFuncs = pstate->p_hasWindowFuncs;
@@ -412,6 +414,7 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
 {
 	Query	   *qry = makeNode(Query);
 	SelectStmt *selectStmt = (SelectStmt *) stmt->selectStmt;
+	SpecType	spec = stmt->confClause? stmt->confClause->specClause : SPEC_NONE;
 	List	   *exprList = NIL;
 	bool		isGeneralSelect;
 	List	   *sub_rtable;
@@ -482,8 +485,9 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
 	 * mentioned in the SELECT part.  Note that the target table is not added
 	 * to the joinlist or namespace.
 	 */
-	qry->resultRelation = setTargetTable(pstate, stmt->relation,
-										 false, false, ACL_INSERT);
+	qry->resultRelation = setTargetTable(pstate, stmt->relation, false, false,
+										 ACL_INSERT |
+										 (spec == SPEC_INSERT ? ACL_UPDATE : 0));
 
 	/* Validate stmt->cols list, or build default list if no list given */
 	icolumns = checkInsertTargets(pstate, stmt->cols, &attrnos);
@@ -762,8 +766,52 @@ transformInsertStmt(ParseState *pstate, InsertStmt *stmt)
 	/* done building the range table and jointree */
 	qry->rtable = pstate->p_rtable;
 	qry->jointree = makeFromExpr(pstate->p_joinlist, NULL);
-
+	qry->specClause = spec;
 	qry->hasSubLinks = pstate->p_hasSubLinks;
+	qry->onConflict = NULL;
+
+	if (stmt->confClause)
+	{
+		/*
+		 * ON CONFLICT UPDATE requires special parse analysis of auxiliary
+		 * update Query
+		 */
+		if (stmt->confClause->stmt)
+		{
+			UpdateStmt	   *pupd  = (UpdateStmt *) stmt->confClause->stmt;
+			ParseState	   *sub_pstate = make_parsestate(pstate);
+			Query		   *dqry;
+			RangeTblEntry  *subTarget;
+
+			if (!IsA(pupd, UpdateStmt))
+				elog(ERROR, "unrecognized statement in ON CONFLICT clause");
+
+			/* Assign same target relation as parent InsertStmt */
+			pupd->relation = stmt->relation;
+
+			dqry = transformStmt(sub_pstate, (Node *) pupd);
+			dqry->specClause = SPEC_UPDATE;
+			dqry->canSetTag = false;
+
+			/* Save auxiliary query */
+			qry->onConflict = (Node *) dqry;
+
+			/*
+			 * Mark parent Query as requiring appropriate UPDATE/SELECT
+			 * privileges
+			 */
+			subTarget = sub_pstate->p_target_rangetblentry;
+
+			rte->updatedCols = bms_copy(subTarget->updatedCols);
+			rte->selectedCols = bms_union(rte->selectedCols,
+										  subTarget->selectedCols);
+
+			free_parsestate(sub_pstate);
+		}
+
+		/* Look up index to limit speculative insertion merge to */
+		qry->mergeIndex = transformConflictWithinClause(pstate, stmt);
+	}
 
 	assign_query_collations(pstate, qry);
 
@@ -1010,6 +1058,8 @@ transformSelectStmt(ParseState *pstate, SelectStmt *stmt)
 
 	qry->rtable = pstate->p_rtable;
 	qry->jointree = makeFromExpr(pstate->p_joinlist, qual);
+	qry->specClause = SPEC_NONE;
+	qry->onConflict = NULL;
 
 	qry->hasSubLinks = pstate->p_hasSubLinks;
 	qry->hasWindowFuncs = pstate->p_hasWindowFuncs;
@@ -1951,6 +2001,8 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
 
 	qry->rtable = pstate->p_rtable;
 	qry->jointree = makeFromExpr(pstate->p_joinlist, qual);
+	qry->specClause = SPEC_NONE;
+	qry->onConflict = NULL;
 
 	qry->hasSubLinks = pstate->p_hasSubLinks;
 
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 6f4d645..275600a 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -215,6 +215,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	RangeVar			*range;
 	IntoClause			*into;
 	WithClause			*with;
+	ConflictClause			*conf;
 	A_Indices			*aind;
 	ResTarget			*target;
 	struct PrivTarget	*privtarget;
@@ -315,7 +316,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				opt_class opt_inline_handler opt_validator validator_clause
 				opt_collate
 
-%type <range>	qualified_name OptConstrFromTable
+%type <range>	qualified_name OptConstrFromTable OptConfWithinIndex
 
 %type <str>		all_Op MathOp
 
@@ -410,6 +411,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <defelt>	SeqOptElem
 
 %type <istmt>	insert_rest
+%type <conf>	opt_on_conflict
 
 %type <vsetstmt> generic_set set_rest set_rest_more SetResetClause FunctionSetResetClause
 
@@ -507,6 +509,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %type <list>	cte_list
 
 %type <list>	within_group_clause
+%type <node>	UpdateInsertStmt
 %type <node>	filter_clause
 %type <list>	window_clause window_definition_list opt_partition_clause
 %type <windef>	window_definition over_clause window_specification
@@ -545,8 +548,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 	CACHE CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
 	CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
 	CLUSTER COALESCE COLLATE COLLATION COLUMN COMMENT COMMENTS COMMIT
-	COMMITTED CONCURRENTLY CONFIGURATION CONNECTION CONSTRAINT CONSTRAINTS
-	CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE
+	COMMITTED CONCURRENTLY CONFIGURATION CONFLICT CONNECTION CONSTRAINT
+	CONSTRAINTS CONTENT_P CONTINUE_P CONVERSION_P COPY COST CREATE
 	CROSS CSV CURRENT_P
 	CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA
 	CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
@@ -566,7 +569,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 
 	HANDLER HAVING HEADER_P HOLD HOUR_P
 
-	IDENTITY_P IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IMPORT_P IN_P
+	IDENTITY_P IF_P IGNORE ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IMPORT_P IN_P
 	INCLUDING INCREMENT INDEX INDEXES INHERIT INHERITS INITIALLY INLINE_P
 	INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER
 	INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
@@ -646,6 +649,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 %nonassoc	OVERLAPS
 %nonassoc	BETWEEN
 %nonassoc	IN_P
+%nonassoc	DISTINCT
+%nonassoc	ON
 %left		POSTFIXOP		/* dummy for postfix Op rules */
 /*
  * To support target_el without AS, we must give IDENT an explicit priority
@@ -9095,11 +9100,13 @@ DeallocateStmt: DEALLOCATE name
  *****************************************************************************/
 
 InsertStmt:
-			opt_with_clause INSERT INTO qualified_name insert_rest returning_clause
+			opt_with_clause INSERT INTO qualified_name insert_rest
+			opt_on_conflict returning_clause
 				{
 					$5->relation = $4;
-					$5->returningList = $6;
+					$5->returningList = $7;
 					$5->withClause = $1;
+					$5->confClause = $6;
 					$$ = (Node *) $5;
 				}
 		;
@@ -9143,6 +9150,35 @@ insert_column_item:
 				}
 		;
 
+opt_on_conflict:
+			ON CONFLICT OptConfWithinIndex UpdateInsertStmt
+				{
+					$$ = makeNode(ConflictClause);
+					$$->relation = $3;
+					$$->stmt = $4;
+					$$->specClause = SPEC_INSERT;
+					$$->location = @1;
+				}
+			|
+			ON CONFLICT OptConfWithinIndex IGNORE
+				{
+					$$ = makeNode(ConflictClause);
+					$$->relation = $3;
+					$$->stmt = NULL;
+					$$->specClause = SPEC_IGNORE;
+					$$->location = @1;
+				}
+			| /*EMPTY*/
+				{
+					$$ = NULL;
+				}
+		;
+
+OptConfWithinIndex:
+			WITHIN qualified_name		{ $$ = $2; }
+			| /*EMPTY*/				{ $$ = NULL; }
+		;
+
 returning_clause:
 			RETURNING target_list		{ $$ = $2; }
 			| /* EMPTY */				{ $$ = NIL; }
@@ -9236,6 +9272,21 @@ UpdateStmt: opt_with_clause UPDATE relation_expr_opt_alias
 				}
 		;
 
+UpdateInsertStmt: UPDATE
+			SET set_clause_list
+			where_clause
+				{
+					UpdateStmt *n = makeNode(UpdateStmt);
+					n->relation = NULL;
+					n->targetList = $3;
+					n->fromClause = NULL;
+					n->whereClause = $4;
+					n->returningList = NULL;
+					n->withClause = NULL;
+					$$ = (Node *)n;
+				}
+		;
+
 set_clause_list:
 			set_clause							{ $$ = $1; }
 			| set_clause_list ',' set_clause	{ $$ = list_concat($1,$3); }
@@ -12898,6 +12949,7 @@ unreserved_keyword:
 			| COMMIT
 			| COMMITTED
 			| CONFIGURATION
+			| CONFLICT
 			| CONNECTION
 			| CONSTRAINTS
 			| CONTENT_P
@@ -12957,6 +13009,7 @@ unreserved_keyword:
 			| HOUR_P
 			| IDENTITY_P
 			| IF_P
+			| IGNORE
 			| IMMEDIATE
 			| IMMUTABLE
 			| IMPLICIT_P
diff --git a/src/backend/parser/parse_clause.c b/src/backend/parser/parse_clause.c
index 4931dca..c3d4e0c 100644
--- a/src/backend/parser/parse_clause.c
+++ b/src/backend/parser/parse_clause.c
@@ -17,6 +17,7 @@
 
 #include "access/heapam.h"
 #include "catalog/heap.h"
+#include "catalog/index.h"
 #include "catalog/pg_type.h"
 #include "commands/defrem.h"
 #include "nodes/makefuncs.h"
@@ -177,8 +178,8 @@ setTargetTable(ParseState *pstate, RangeVar *relation,
 	 * free_parsestate() will eventually do the corresponding heap_close(),
 	 * but *not* release the lock.
 	 */
-	pstate->p_target_relation = parserOpenTable(pstate, relation,
-												RowExclusiveLock);
+	pstate->p_target_relation = parserOpenRelation(pstate, relation,
+												   RowExclusiveLock);
 
 	/*
 	 * Now build an RTE.
@@ -2166,6 +2167,43 @@ get_matching_location(int sortgroupref, List *sortgrouprefs, List *exprs)
 }
 
 /*
+ * transformConflictWithinClause -
+ *		transform WITHIN portion of ON CONFLICT UPDATE/IGNORE.
+ *
+ * Handles adding named unique index relation to range table.  Returns Oid of
+ * index relation.
+ */
+Oid
+transformConflictWithinClause(ParseState *pstate, InsertStmt *stmt)
+{
+	RangeTblEntry *uniqueIndex;
+	Oid				heapOid;
+	RangeVar	   *indexVar = stmt->confClause->relation;
+
+	if (!stmt->confClause->relation)
+		return InvalidOid;
+
+	uniqueIndex = addRangeTableEntry(pstate, indexVar, NULL, false, false);
+
+	addRTEtoQuery(pstate, uniqueIndex, false, true, false);
+
+	heapOid = IndexGetRelation(uniqueIndex->relid, true);
+
+	if (heapOid != RelationGetRelid(pstate->p_target_relation))
+	{
+		ereport(ERROR,
+				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
+				 errmsg("ON CONFLICT WITHIN relation \"%s\" is not an index on target relation \"%s\"",
+						indexVar->relname, RelationGetRelationName(pstate->p_target_relation)),
+				 parser_errposition(pstate,
+									exprLocation((Node *) stmt->confClause->relation))));
+	}
+
+	/* assume new rte is at end */
+	return uniqueIndex->relid;
+}
+
+/*
  * addTargetToSortList
  *		If the given targetlist entry isn't already in the SortGroupClause
  *		list, add it to the end of the list, using the given sort ordering
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c
index 364ced0..0fa9245 100644
--- a/src/backend/parser/parse_relation.c
+++ b/src/backend/parser/parse_relation.c
@@ -949,13 +949,13 @@ chooseScalarFunctionAlias(Node *funcexpr, char *funcname,
  * LOCKMODE is typedef'd as int anyway, that seems like overkill.
  */
 Relation
-parserOpenTable(ParseState *pstate, const RangeVar *relation, int lockmode)
+parserOpenRelation(ParseState *pstate, const RangeVar *relation, int lockmode)
 {
 	Relation	rel;
 	ParseCallbackState pcbstate;
 
 	setup_parser_errposition_callback(&pcbstate, pstate, relation->location);
-	rel = heap_openrv_extended(relation, lockmode, true);
+	rel = relation_openrv_extended(relation, lockmode, true);
 	if (rel == NULL)
 	{
 		if (relation->schemaname)
@@ -1021,7 +1021,7 @@ addRangeTableEntry(ParseState *pstate,
 	 * depending on whether we're doing SELECT FOR UPDATE/SHARE.
 	 */
 	lockmode = isLockedRefname(pstate, refname) ? RowShareLock : AccessShareLock;
-	rel = parserOpenTable(pstate, relation, lockmode);
+	rel = parserOpenRelation(pstate, relation, lockmode);
 	rte->relid = RelationGetRelid(rel);
 	rte->relkind = rel->rd_rel->relkind;
 
@@ -1037,7 +1037,7 @@ addRangeTableEntry(ParseState *pstate,
 	 * so that the table can't be deleted or have its schema modified
 	 * underneath us.
 	 */
-	heap_close(rel, NoLock);
+	relation_close(rel, NoLock);
 
 	/*
 	 * Set flags and access permissions.
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index cc967f0..244085c 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -3089,6 +3089,11 @@ RewriteQuery(Query *parsetree, List *rewrite_events)
 			rt_entry_relation->rd_rel->relkind == RELKIND_VIEW &&
 			!view_has_instead_trigger(rt_entry_relation, event))
 		{
+			if (parsetree->specClause == SPEC_INSERT)
+				ereport(ERROR,
+						(errcode(ERRCODE_FEATURE_NOT_SUPPORTED ),
+						 errmsg("INSERT ON CONFLICT is not supported on updatable views")));
+
 			/*
 			 * This throws an error if the view can't be automatically
 			 * updated, but that's OK since the query would fail at runtime
diff --git a/src/backend/utils/time/tqual.c b/src/backend/utils/time/tqual.c
index 5c3f5ad..03fd12c 100644
--- a/src/backend/utils/time/tqual.c
+++ b/src/backend/utils/time/tqual.c
@@ -1525,6 +1525,29 @@ XidInMVCCSnapshot(TransactionId xid, Snapshot snapshot)
 }
 
 /*
+ * XidInProgress
+ *		Public variant of XidInMVCCSnapshot.
+ *
+ * This routine indicates if a transaction is still-in-progress to a snapshot
+ * according to a classic notion of MVCC.  Unlike XidInMVCCSnapshot, it
+ * accounts for the current subtransaction, as well as ancestor and child
+ * subcommitted transactions.
+ *
+ * Speculative insertion effectively avails of a special MVCC exception,
+ * because a tuple may be locked/updated that has no version visible to the
+ * updating command's MVCC snapshot.  It's okay for READ COMMITTED mode to not
+ * care about having availed of this special exception (that's what it's there
+ * for), but higher isolation levels must not, and should actively call this
+ * routine to ensure that the issue has not occurred.
+ */
+bool
+XidInProgress(TransactionId xid, Snapshot snapshot)
+{
+	return !TransactionIdIsCurrentTransactionId(xid) &&
+				XidInMVCCSnapshot(xid, snapshot);
+}
+
+/*
  * Is the tuple really only locked?  That is, is it not updated?
  *
  * It's easy to check just infomask bits if the locker is not a multi; but
diff --git a/src/include/access/genam.h b/src/include/access/genam.h
index d99158f..37bbac8 100644
--- a/src/include/access/genam.h
+++ b/src/include/access/genam.h
@@ -102,15 +102,103 @@ typedef struct SysScanDescData *SysScanDesc;
  * call is made with UNIQUE_CHECK_EXISTING.  The tuple is already in the
  * index in this case, so it should not be inserted again.  Rather, just
  * check for conflicting live tuples (possibly blocking).
+ *
+ * INSERT...ON CONFLICT UPDATE operations involve "speculative" insertion of
+ * tuples.  There is a call to establish the uniqueness of a tuple and take
+ * appropriate value locks (generally once per unique index per table slot).
+ * These locks prevent concurrent insertion of conflicting key values, and will
+ * only be held for an instant.  Values are locked in the abstract;  existing
+ * index tuples are not locked, because they don't yet exist.  Subsequently,
+ * there may be a second, corresponding phase where insertion proper actually
+ * occurs -- index_insert() calls are made with UNIQUE_CHECK_SPEC, where
+ * insertion proper picks up from the first phase, and is guaranteed to be
+ * successful (unless "WITHIN named_unique_index" was originally specified, in
+ * which case only "named_unique_index" has been value locked, implying that
+ * other unique indexes could have duplicate key violations when index_insert()
+ * is called).
  */
 typedef enum IndexUniqueCheck
 {
 	UNIQUE_CHECK_NO,			/* Don't do any uniqueness checking */
 	UNIQUE_CHECK_YES,			/* Enforce uniqueness at insertion time */
 	UNIQUE_CHECK_PARTIAL,		/* Test uniqueness, but no error */
-	UNIQUE_CHECK_EXISTING		/* Check if existing tuple is unique */
+	UNIQUE_CHECK_EXISTING,		/* Check if existing tuple is unique */
+	UNIQUE_CHECK_SPEC			/* Speculative phased locking insertion */
 } IndexUniqueCheck;
 
+/*
+ * For speculative insertion's phased locking, it is necessary for the core
+ * system to have callbacks to amcanunique AMs that allow them to clean-up in
+ * the duplicate found case.  This is because one first-phase call in respect
+ * of some unique index might indicate that it's okay to proceed, while another
+ * such call relating to another unique index (but the same executor-level
+ * tuple slot) indicates that it is not.  In general, we cannot rely on
+ * actually reaching the second phase even if one check in the first phase says
+ * that it assents to insertion proceeding, because we need total consensus
+ * from all unique indexes that may be inserted into as part of proceeding with
+ * inserting the tuple slot (assuming there was no WITHIN unique index
+ * specification).
+ *
+ * It is the responsibility of supporting AMs to set the callback if there is
+ * clean-up to be done when not proceeding.	 Note, however, that the executor
+ * will not call the callback if insertion of the relevant index tuple
+ * proceeds, because the AM should take care of this itself in the second,
+ * final, optional step ("insertion proper").
+ *
+ * The callback is called twice when the core code goes to UPDATE.  The first
+ * call releases all functional value locks, which is necessary to prevent
+ * unprincipled deadlocks, while the second post-lock/update call releases an
+ * interlock against VACUUM (typically a buffer pin) on the merge-on unique
+ * index.
+ *
+ * We must interlock against VACUUM because the executor may need to
+ * lock/UPDATE a tuple not visible to the command's MVCC snapshot, and it would
+ * be bad news to lock/update a heap tuple distinct from the one that the AM
+ * made a determination about in the first phase just because it happened to
+ * occupy the same heap slot. XXX: Perhaps not.  Discussion on VACUUM
+ * interlocking should revisit the need for this.
+ */
+struct SpeculativeState;
+typedef void (*ReleaseIndexCallback) (struct SpeculativeState *state);
+
+/*
+ * Speculative status returned.
+ *
+ * It may be necessary to start the first phase of speculative insertion from
+ * scratch, in the event of needing to block pending the completion of another
+ * transaction, where the AM cannot reasonably sit on value locks (associated
+ * with some other, previously locked amcanunique indexes) indefinitely.
+ */
+typedef enum
+{
+	INSERT_TRY_AGAIN,	/* had xact conflict - restart from first index */
+	INSERT_NO_PROCEED,	/* duplicate conclusively found */
+	INSERT_PROCEED,		/* no duplicate key in any index */
+	INSERT_NEED_UNPIN	/* only unpin buffer */
+} SpecStatus;
+
+/*
+ * Struct representing state passed to and from clients for speculative phased
+ * insertion.  This is allocated by amcanunique access methods, and passed back
+ * and forth for phased index locking.
+ *
+ * There is one such piece of state associated with every unique index
+ * participating in insertion of a slot (or a single named unique index in the
+ * event of a WITHIN specification).
+ */
+typedef struct SpeculativeState
+{
+	/* Index under consideration */
+	Relation				uniqueIndex;
+	/* Opaque amcanunique state */
+	void				   *privState;
+	/* Callback to tell AM to clean-up */
+	ReleaseIndexCallback	unlock;
+	/* Outcome of first phase (current attempt) for uniqueIndex */
+	SpecStatus				outcome;
+	/* Conflicting heap tuple, if any */
+	ItemPointer				conflictTid;
+}	SpeculativeState;
 
 /*
  * generalized index_ interface routines (in indexam.c)
@@ -125,11 +213,17 @@ typedef enum IndexUniqueCheck
 extern Relation index_open(Oid relationId, LOCKMODE lockmode);
 extern void index_close(Relation relation, LOCKMODE lockmode);
 
+extern SpeculativeState *index_lock(Relation indexRelation,
+			 Datum *values, bool *isnull,
+			 Relation heapRelation,
+			 List *otherSpecStates, bool priorConflict);
 extern bool index_insert(Relation indexRelation,
 			 Datum *values, bool *isnull,
 			 ItemPointer heap_t_ctid,
-			 Relation heapRelation,
-			 IndexUniqueCheck checkUnique);
+			 Relation heapRelation, IndexUniqueCheck checkUnique,
+			 SpeculativeState * state);
+extern bool index_proceed(List *specStates);
+extern ItemPointer index_release(List *specStates, bool free);
 
 extern IndexScanDesc index_beginscan(Relation heapRelation,
 				Relation indexRelation,
diff --git a/src/include/access/nbtree.h b/src/include/access/nbtree.h
index 9fa943f..ccb673b 100644
--- a/src/include/access/nbtree.h
+++ b/src/include/access/nbtree.h
@@ -74,6 +74,7 @@ typedef BTPageOpaqueData *BTPageOpaque;
 #define BTP_SPLIT_END	(1 << 5)	/* rightmost page of split group */
 #define BTP_HAS_GARBAGE (1 << 6)	/* page has LP_DEAD tuples */
 #define BTP_INCOMPLETE_SPLIT (1 << 7)	/* right sibling's downlink is missing */
+#define BTP_IS_LOCKED	(1 << 8)	/* page is heavyweight locked */
 
 /*
  * The max allowed value of a cycle ID is a bit less than 64K.  This is
@@ -132,6 +133,24 @@ typedef struct BTMetaPageData
 #define BTREE_NONLEAF_FILLFACTOR	70
 
 /*
+ * BTREE_PITEMS_NOLOCK is a number of items on leaf page, representing a
+ * threshold after which speculative insertion prefers to attempt lock
+ * avoidance.
+ *
+ * This value may seem suspect, because it does not account for btree leaf
+ * fillfactor, nor BLCKSZ;  in general it does not carefully consider how many
+ * items present on a leaf page meet some particular definition of "almost
+ * full", and therefore that a value proposed for insertion is likely to be
+ * found rather than newly inserted.  Perhaps most woolly of all, the page
+ * under consideration may not be the only page inspected for a would-be
+ * duplicate.  The value is only intended as a very rough approximation of the
+ * tipping point at which the optimization becomes profitable, and there are
+ * other, more important factors that will frequently independently make the
+ * optimization applicable.
+ */
+#define BTREE_PITEMS_NOLOCK			150
+
+/*
  *	Test whether two btree entries are "the same".
  *
  *	Old comments:
@@ -180,6 +199,7 @@ typedef struct BTMetaPageData
 #define P_IGNORE(opaque)		((opaque)->btpo_flags & (BTP_DELETED|BTP_HALF_DEAD))
 #define P_HAS_GARBAGE(opaque)	((opaque)->btpo_flags & BTP_HAS_GARBAGE)
 #define P_INCOMPLETE_SPLIT(opaque)	((opaque)->btpo_flags & BTP_INCOMPLETE_SPLIT)
+#define P_IS_LOCKED(opaque)		((opaque)->btpo_flags & BTP_IS_LOCKED)
 
 /*
  *	Lehman and Yao's algorithm requires a ``high key'' on every non-rightmost
@@ -611,6 +631,28 @@ typedef struct BTScanOpaqueData
 typedef BTScanOpaqueData *BTScanOpaque;
 
 /*
+ * BTSpecOpaqueStateData is the btree-private state that is managed as part of
+ * speculative index tuple insertion, particular to this implementation.  In
+ * the first phase, the implementation stashes this private state.  The state
+ * is passed back during the second phase, or resources are freed using a
+ * callback.
+ *
+ * lockedBuf is always pinned when passed back to the caller at the end of the
+ * first phase, unless the current attempt to get consensus was unsuccessful.
+ * An exlusive heavyweight lock will also be held on the page which lockedBuf
+ * is allocated into.
+ */
+typedef struct BTSpecOpaqueData
+{
+	Buffer		lockedBuf;		/* Buffer whose page (a leaf page) is locked */
+	BTStack		stack;			/* Saved stack in case of page split */
+	IndexTuple	itup;			/* Cached index tuple */
+	ScanKey		itupScankey;	/* Cached insertion scankey - redundant */
+} BTSpecOpaqueData;
+
+typedef BTSpecOpaqueData *BTSpecOpaque;
+
+/*
  * We use some private sk_flags bits in preprocessed scan keys.  We're allowed
  * to use bits 16-31 (see skey.h).  The uppermost bits are copied from the
  * index's indoption[] array entry for the index attribute.
@@ -626,6 +668,7 @@ typedef BTScanOpaqueData *BTScanOpaque;
  */
 extern Datum btbuild(PG_FUNCTION_ARGS);
 extern Datum btbuildempty(PG_FUNCTION_ARGS);
+extern Datum btlock(PG_FUNCTION_ARGS);
 extern Datum btinsert(PG_FUNCTION_ARGS);
 extern Datum btbeginscan(PG_FUNCTION_ARGS);
 extern Datum btgettuple(PG_FUNCTION_ARGS);
@@ -642,8 +685,12 @@ extern Datum btoptions(PG_FUNCTION_ARGS);
 /*
  * prototypes for functions in nbtinsert.c
  */
+extern void _bt_lockinsert(Relation rel, Relation heapRel,
+			 SpeculativeState *specState, List *otherSpecStates,
+			 bool priorConflict);
 extern bool _bt_doinsert(Relation rel, IndexTuple itup,
-			 IndexUniqueCheck checkUnique, Relation heapRel);
+			 IndexUniqueCheck checkUnique, Relation heapRel,
+			 SpeculativeState *specState);
 extern Buffer _bt_getstackbuf(Relation rel, BTStack stack, int access);
 extern void _bt_finish_split(Relation rel, Buffer bbuf, BTStack stack);
 
diff --git a/src/include/catalog/pg_am.h b/src/include/catalog/pg_am.h
index 759ea70..f3b17c5 100644
--- a/src/include/catalog/pg_am.h
+++ b/src/include/catalog/pg_am.h
@@ -52,6 +52,7 @@ CATALOG(pg_am,2601)
 	bool		amclusterable;	/* does AM support cluster command? */
 	bool		ampredlocks;	/* does AM handle predicate locks? */
 	Oid			amkeytype;		/* type of data in index, or InvalidOid */
+	regproc		amlock;			/* "speculative insertion" function */
 	regproc		aminsert;		/* "insert this tuple" function */
 	regproc		ambeginscan;	/* "prepare for index scan" function */
 	regproc		amgettuple;		/* "next valid tuple" function, or 0 */
@@ -80,7 +81,7 @@ typedef FormData_pg_am *Form_pg_am;
  *		compiler constants for pg_am
  * ----------------
  */
-#define Natts_pg_am						30
+#define Natts_pg_am						31
 #define Anum_pg_am_amname				1
 #define Anum_pg_am_amstrategies			2
 #define Anum_pg_am_amsupport			3
@@ -96,40 +97,41 @@ typedef FormData_pg_am *Form_pg_am;
 #define Anum_pg_am_amclusterable		13
 #define Anum_pg_am_ampredlocks			14
 #define Anum_pg_am_amkeytype			15
-#define Anum_pg_am_aminsert				16
-#define Anum_pg_am_ambeginscan			17
-#define Anum_pg_am_amgettuple			18
-#define Anum_pg_am_amgetbitmap			19
-#define Anum_pg_am_amrescan				20
-#define Anum_pg_am_amendscan			21
-#define Anum_pg_am_ammarkpos			22
-#define Anum_pg_am_amrestrpos			23
-#define Anum_pg_am_ambuild				24
-#define Anum_pg_am_ambuildempty			25
-#define Anum_pg_am_ambulkdelete			26
-#define Anum_pg_am_amvacuumcleanup		27
-#define Anum_pg_am_amcanreturn			28
-#define Anum_pg_am_amcostestimate		29
-#define Anum_pg_am_amoptions			30
+#define Anum_pg_am_amlock				16
+#define Anum_pg_am_aminsert				17
+#define Anum_pg_am_ambeginscan			18
+#define Anum_pg_am_amgettuple			19
+#define Anum_pg_am_amgetbitmap			20
+#define Anum_pg_am_amrescan				21
+#define Anum_pg_am_amendscan			22
+#define Anum_pg_am_ammarkpos			23
+#define Anum_pg_am_amrestrpos			24
+#define Anum_pg_am_ambuild				25
+#define Anum_pg_am_ambuildempty			26
+#define Anum_pg_am_ambulkdelete			27
+#define Anum_pg_am_amvacuumcleanup		28
+#define Anum_pg_am_amcanreturn			29
+#define Anum_pg_am_amcostestimate		30
+#define Anum_pg_am_amoptions			31
 
 /* ----------------
  *		initial contents of pg_am
  * ----------------
  */
 
-DATA(insert OID = 403 (  btree		5 2 t f t t t t t t f t t 0 btinsert btbeginscan btgettuple btgetbitmap btrescan btendscan btmarkpos btrestrpos btbuild btbuildempty btbulkdelete btvacuumcleanup btcanreturn btcostestimate btoptions ));
+DATA(insert OID = 403 (  btree		5 2 t f t t t t t t f t t 0 btlock btinsert btbeginscan btgettuple btgetbitmap btrescan btendscan btmarkpos btrestrpos btbuild btbuildempty btbulkdelete btvacuumcleanup btcanreturn btcostestimate btoptions ));
 DESCR("b-tree index access method");
 #define BTREE_AM_OID 403
-DATA(insert OID = 405 (  hash		1 1 f f t f f f f f f f f 23 hashinsert hashbeginscan hashgettuple hashgetbitmap hashrescan hashendscan hashmarkpos hashrestrpos hashbuild hashbuildempty hashbulkdelete hashvacuumcleanup - hashcostestimate hashoptions ));
+DATA(insert OID = 405 (  hash		1 1 f f t f f f f f f f f 23 - hashinsert hashbeginscan hashgettuple hashgetbitmap hashrescan hashendscan hashmarkpos hashrestrpos hashbuild hashbuildempty hashbulkdelete hashvacuumcleanup - hashcostestimate hashoptions ));
 DESCR("hash index access method");
 #define HASH_AM_OID 405
-DATA(insert OID = 783 (  gist		0 8 f t f f t t f t t t f 0 gistinsert gistbeginscan gistgettuple gistgetbitmap gistrescan gistendscan gistmarkpos gistrestrpos gistbuild gistbuildempty gistbulkdelete gistvacuumcleanup - gistcostestimate gistoptions ));
+DATA(insert OID = 783 (  gist		0 8 f t f f t t f t t t f 0 - gistinsert gistbeginscan gistgettuple gistgetbitmap gistrescan gistendscan gistmarkpos gistrestrpos gistbuild gistbuildempty gistbulkdelete gistvacuumcleanup - gistcostestimate gistoptions ));
 DESCR("GiST index access method");
 #define GIST_AM_OID 783
-DATA(insert OID = 2742 (  gin		0 6 f f f f t t f f t f f 0 gininsert ginbeginscan - gingetbitmap ginrescan ginendscan ginmarkpos ginrestrpos ginbuild ginbuildempty ginbulkdelete ginvacuumcleanup - gincostestimate ginoptions ));
+DATA(insert OID = 2742 (  gin		0 6 f f f f t t f f t f f 0 - gininsert ginbeginscan - gingetbitmap ginrescan ginendscan ginmarkpos ginrestrpos ginbuild ginbuildempty ginbulkdelete ginvacuumcleanup - gincostestimate ginoptions ));
 DESCR("GIN index access method");
 #define GIN_AM_OID 2742
-DATA(insert OID = 4000 (  spgist	0 5 f f f f f t f t f f f 0 spginsert spgbeginscan spggettuple spggetbitmap spgrescan spgendscan spgmarkpos spgrestrpos spgbuild spgbuildempty spgbulkdelete spgvacuumcleanup spgcanreturn spgcostestimate spgoptions ));
+DATA(insert OID = 4000 (  spgist	0 5 f f f f f t f t f f f 0 - spginsert spgbeginscan spggettuple spggetbitmap spgrescan spgendscan spgmarkpos spgrestrpos spgbuild spgbuildempty spgbulkdelete spgvacuumcleanup spgcanreturn spgcostestimate spgoptions ));
 DESCR("SP-GiST index access method");
 #define SPGIST_AM_OID 4000
 
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index a84595e..eb7f203 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -538,6 +538,8 @@ DATA(insert OID = 330 (  btgettuple		   PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0
 DESCR("btree(internal)");
 DATA(insert OID = 636 (  btgetbitmap	   PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 20 "2281 2281" _null_ _null_ _null_ _null_	btgetbitmap _null_ _null_ _null_ ));
 DESCR("btree(internal)");
+DATA(insert OID = 3218 (  btlock		   PGNSP PGUID 12 1 0 0 0 f f f f t f v 6 0 2278 "2281 2281 2281 2281 2281 16" _null_ _null_ _null_ _null_	btlock _null_ _null_ _null_ ));
+DESCR("btree(internal)");
 DATA(insert OID = 331 (  btinsert		   PGNSP PGUID 12 1 0 0 0 f f f f t f v 6 0 16 "2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_	btinsert _null_ _null_ _null_ ));
 DESCR("btree(internal)");
 DATA(insert OID = 333 (  btbeginscan	   PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_	btbeginscan _null_ _null_ _null_ ));
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
index 239aff3..1237c82 100644
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -349,8 +349,10 @@ extern void ExecCloseScanRelation(Relation scanrel);
 
 extern void ExecOpenIndices(ResultRelInfo *resultRelInfo);
 extern void ExecCloseIndices(ResultRelInfo *resultRelInfo);
+extern List *ExecLockIndexValues(TupleTableSlot *slot, EState *estate,
+						   SpecType specReason, int *conflict);
 extern List *ExecInsertIndexTuples(TupleTableSlot *slot, ItemPointer tupleid,
-					  EState *estate);
+						   EState *estate, List *specStates);
 extern bool check_exclusion_constraint(Relation heap, Relation index,
 						   IndexInfo *indexInfo,
 						   ItemPointer tupleid,
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index b271f21..efb171d 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -63,6 +63,7 @@ typedef struct IndexInfo
 	Oid		   *ii_ExclusionProcs;		/* array with one entry per column */
 	uint16	   *ii_ExclusionStrats;		/* array with one entry per column */
 	bool		ii_Unique;
+	bool		ii_MergeOn;
 	bool		ii_ReadyForInserts;
 	bool		ii_Concurrent;
 	bool		ii_BrokenHotChain;
@@ -1087,6 +1088,8 @@ typedef struct ModifyTableState
 	int			mt_whichplan;	/* which one is being executed (0..n-1) */
 	ResultRelInfo *resultRelInfo;		/* per-subplan target relations */
 	List	  **mt_arowmarks;	/* per-subplan ExecAuxRowMark lists */
+	SpecType	spec;			/* reason for speculative insertion */
+	PlanState  *onConflict; /* associated OnConflict state */
 	EPQState	mt_epqstate;	/* for evaluating EvalPlanQual rechecks */
 	bool		fireBSTriggers; /* do we need to fire stmt triggers? */
 } ModifyTableState;
diff --git a/src/include/nodes/nodes.h b/src/include/nodes/nodes.h
index a031b88..f173d11 100644
--- a/src/include/nodes/nodes.h
+++ b/src/include/nodes/nodes.h
@@ -407,6 +407,7 @@ typedef enum NodeTag
 	T_RowMarkClause,
 	T_XmlSerialize,
 	T_WithClause,
+	T_ConflictClause,
 	T_CommonTableExpr,
 
 	/*
@@ -619,4 +620,16 @@ typedef enum JoinType
 	   (1 << JOIN_RIGHT) | \
 	   (1 << JOIN_ANTI))) != 0)
 
+/* SpecType - "Speculative insertion" clause
+ *
+ * This also appears across various subsystems
+ */
+typedef enum
+{
+	SPEC_NONE,		/* Not involved in speculative insertion */
+	SPEC_IGNORE,	/* INSERT of "ON CONFLICT IGNORE" */
+	SPEC_INSERT,	/* INSERT of "ON CONFLICT UPDATE" */
+	SPEC_UPDATE		/* UPDATE of "ON CONFLICT UPDATE" */
+} SpecType;
+
 #endif   /* NODES_H */
diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h
index 2c5d842..21b81ef 100644
--- a/src/include/nodes/parsenodes.h
+++ b/src/include/nodes/parsenodes.h
@@ -130,6 +130,14 @@ typedef struct Query
 
 	List	   *withCheckOptions;		/* a list of WithCheckOption's */
 
+	Node	   *onConflict;		/* ON CONFLICT Query */
+
+	SpecType	specClause;		/* speculative insertion clause */
+
+	Oid			mergeIndex;		/* rtable index of unique index
+								 * relation for speculative insertion; 0 when
+								 * unspecified */
+
 	List	   *returningList;	/* return-values list (of TargetEntry) */
 
 	List	   *groupClause;	/* a list of SortGroupClause's */
@@ -996,6 +1004,21 @@ typedef struct WithClause
 } WithClause;
 
 /*
+ * ConflictClause -
+ * 		representation of ON CONFLICT clause
+ *
+ * Note: ConflictClause does not propagate into the Query representation
+ */
+typedef struct ConflictClause
+{
+	NodeTag		type;
+	SpecType	specClause;		/* Variant specified */
+	Node	   *stmt;			/* Update/Delete parse stmt */
+	RangeVar   *relation;		/* unique index to merge on, or NULL */
+	int			location;		/* token location, or -1 if unknown */
+} ConflictClause;
+
+/*
  * CommonTableExpr -
  *	   representation of WITH list element
  *
@@ -1046,6 +1069,7 @@ typedef struct InsertStmt
 	List	   *cols;			/* optional: names of the target columns */
 	Node	   *selectStmt;		/* the source SELECT/VALUES, or NULL */
 	List	   *returningList;	/* list of expressions to return */
+	ConflictClause  *confClause;	/* ON CONFLICT clause */
 	WithClause *withClause;		/* WITH clause */
 } InsertStmt;
 
diff --git a/src/include/nodes/plannodes.h b/src/include/nodes/plannodes.h
index 3b9c683..2ff83ad 100644
--- a/src/include/nodes/plannodes.h
+++ b/src/include/nodes/plannodes.h
@@ -172,6 +172,9 @@ typedef struct ModifyTable
 	List	   *resultRelations;	/* integer list of RT indexes */
 	int			resultRelIndex; /* index of first resultRel in plan's list */
 	List	   *plans;			/* plan(s) producing source data */
+	Plan	   *onConflictPlan;	/* Plan for ON CONFLICT UPDATE auxiliary query */
+	SpecType	spec;			/* speculative insertion specification */
+	Oid			mergeIndex;		/* Oid of merge index relation */
 	List	   *withCheckOptionLists;	/* per-target-table WCO lists */
 	List	   *returningLists; /* per-target-table RETURNING tlists */
 	List	   *fdwPrivLists;	/* per-target-table FDW private data lists */
diff --git a/src/include/optimizer/planmain.h b/src/include/optimizer/planmain.h
index 4504250..bd93f67 100644
--- a/src/include/optimizer/planmain.h
+++ b/src/include/optimizer/planmain.h
@@ -84,7 +84,8 @@ extern ModifyTable *make_modifytable(PlannerInfo *root,
 				 CmdType operation, bool canSetTag,
 				 List *resultRelations, List *subplans,
 				 List *withCheckOptionLists, List *returningLists,
-				 List *rowMarks, int epqParam);
+				 List *rowMarks, Plan *onConflictPlan, SpecType spec,
+				 Oid mergeIndex, int epqParam);
 extern bool is_projection_capable_plan(Plan *plan);
 
 /*
diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h
index 17888ad..d5d0589 100644
--- a/src/include/parser/kwlist.h
+++ b/src/include/parser/kwlist.h
@@ -87,6 +87,7 @@ PG_KEYWORD("commit", COMMIT, UNRESERVED_KEYWORD)
 PG_KEYWORD("committed", COMMITTED, UNRESERVED_KEYWORD)
 PG_KEYWORD("concurrently", CONCURRENTLY, TYPE_FUNC_NAME_KEYWORD)
 PG_KEYWORD("configuration", CONFIGURATION, UNRESERVED_KEYWORD)
+PG_KEYWORD("conflict", CONFLICT, UNRESERVED_KEYWORD)
 PG_KEYWORD("connection", CONNECTION, UNRESERVED_KEYWORD)
 PG_KEYWORD("constraint", CONSTRAINT, RESERVED_KEYWORD)
 PG_KEYWORD("constraints", CONSTRAINTS, UNRESERVED_KEYWORD)
@@ -180,6 +181,7 @@ PG_KEYWORD("hold", HOLD, UNRESERVED_KEYWORD)
 PG_KEYWORD("hour", HOUR_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("identity", IDENTITY_P, UNRESERVED_KEYWORD)
 PG_KEYWORD("if", IF_P, UNRESERVED_KEYWORD)
+PG_KEYWORD("ignore", IGNORE, UNRESERVED_KEYWORD)
 PG_KEYWORD("ilike", ILIKE, TYPE_FUNC_NAME_KEYWORD)
 PG_KEYWORD("immediate", IMMEDIATE, UNRESERVED_KEYWORD)
 PG_KEYWORD("immutable", IMMUTABLE, UNRESERVED_KEYWORD)
diff --git a/src/include/parser/parse_clause.h b/src/include/parser/parse_clause.h
index e9e7cdc..6c7cf67 100644
--- a/src/include/parser/parse_clause.h
+++ b/src/include/parser/parse_clause.h
@@ -41,6 +41,7 @@ extern List *transformDistinctClause(ParseState *pstate,
 						List **targetlist, List *sortClause, bool is_agg);
 extern List *transformDistinctOnClause(ParseState *pstate, List *distinctlist,
 						  List **targetlist, List *sortClause);
+extern Oid transformConflictWithinClause(ParseState *pstate, InsertStmt *stmt);
 
 extern List *addTargetToSortList(ParseState *pstate, TargetEntry *tle,
 					List *sortlist, List *targetlist, SortBy *sortby,
diff --git a/src/include/parser/parse_relation.h b/src/include/parser/parse_relation.h
index d8b9493..56cd10e 100644
--- a/src/include/parser/parse_relation.h
+++ b/src/include/parser/parse_relation.h
@@ -40,8 +40,8 @@ extern Node *colNameToVar(ParseState *pstate, char *colname, bool localonly,
 			 int location);
 extern void markVarForSelectPriv(ParseState *pstate, Var *var,
 					 RangeTblEntry *rte);
-extern Relation parserOpenTable(ParseState *pstate, const RangeVar *relation,
-				int lockmode);
+extern Relation parserOpenRelation(ParseState *pstate,
+					const RangeVar *relation, int lockmode);
 extern RangeTblEntry *addRangeTableEntry(ParseState *pstate,
 				   RangeVar *relation,
 				   Alias *alias,
diff --git a/src/include/utils/rel.h b/src/include/utils/rel.h
index 37b6cbb..8f8583c 100644
--- a/src/include/utils/rel.h
+++ b/src/include/utils/rel.h
@@ -52,6 +52,7 @@ typedef LockInfoData *LockInfo;
  */
 typedef struct RelationAmInfo
 {
+	FmgrInfo	amlock;
 	FmgrInfo	aminsert;
 	FmgrInfo	ambeginscan;
 	FmgrInfo	amgettuple;
diff --git a/src/include/utils/tqual.h b/src/include/utils/tqual.h
index ae285c3..3e8ed88 100644
--- a/src/include/utils/tqual.h
+++ b/src/include/utils/tqual.h
@@ -89,6 +89,7 @@ extern bool HeapTupleIsSurelyDead(HeapTuple htup,
 extern void HeapTupleSetHintBits(HeapTupleHeader tuple, Buffer buffer,
 					 uint16 infomask, TransactionId xid);
 extern bool HeapTupleHeaderIsOnlyLocked(HeapTupleHeader tuple);
+extern bool XidInProgress(TransactionId xid, Snapshot snapshot);
 
 /*
  * To avoid leaking to much knowledge about reorderbuffer implementation
-- 
1.9.1

#2Andreas Karlsson
andreas@proxel.se
In reply to: Peter Geoghegan (#1)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 08/28/2014 04:43 AM, Peter Geoghegan wrote:

-- Nesting within wCTE:
WITH t AS (
INSERT INTO z SELECT i, 'insert'
FROM generate_series(0, 16) i
ON CONFLICT UPDATE SET v = v || 'update' -- use of
operators/functions in targetlist
RETURNING * -- only projects inserted tuples, never updated tuples
)
SELECT * FROM t JOIN y ON t.k = y.a ORDER BY a, k;

Personally I would find it surprising if RETURNING did not also return
the updated tuples. In many use cases for upsert the user does not care
if the row was new or not.

What I think would be useful is if all tuples were returned but there
was some way to filter out only the inserted ones.

--
Andreas Karlsson

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Peter Geoghegan
pg@heroku.com
In reply to: Andreas Karlsson (#2)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Aug 28, 2014 at 7:29 AM, Andreas Karlsson <andreas@proxel.se> wrote:

Personally I would find it surprising if RETURNING did not also return the
updated tuples. In many use cases for upsert the user does not care if the
row was new or not.

I'm not attached to that particular behavior, but it does seem kind of
similar to the behavior of BEFORE triggers, where a NULL return value
("do nothing") will also cause RETURNING to not project the tuple.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Andreas Karlsson
andreas@proxel.se
In reply to: Peter Geoghegan (#3)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 08/28/2014 09:05 PM, Peter Geoghegan wrote:

On Thu, Aug 28, 2014 at 7:29 AM, Andreas Karlsson <andreas@proxel.se> wrote:

Personally I would find it surprising if RETURNING did not also return the
updated tuples. In many use cases for upsert the user does not care if the
row was new or not.

I'm not attached to that particular behavior, but it does seem kind of
similar to the behavior of BEFORE triggers, where a NULL return value
("do nothing") will also cause RETURNING to not project the tuple.

I see. So we have three cases where we may or may not want to project a
tuple.

1) The tuple was inserted
2) We got a conflict and updated the tuple
3) We got a conflict but skipped updating the tuple

My personal intuition was that (1) and (2) would be returned but not
(3). But I am not sure if that is the most useful behavior.

--
Andreas Karlsson

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#5Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#1)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Aug 27, 2014 at 7:43 PM, Peter Geoghegan <pg@heroku.com> wrote:

There are some restrictions on what this auxiliary update may do, but
FWIW there are considerably fewer than those that the equivalent MySQL
or SQLite feature imposes on their users.

I realized that I missed a few cases here. For one thing, the posted
patch fails to arrange for the UPDATE post-parse-analysis tree
representation to go through the rewriter stage (on the theory that
user-defined rules shouldn't be able to separately affect the
auxiliary UPDATE query tree), but rewriting is at least necessary so
that rewriteTargetListIU() can expand a "SET val = DEFAULT"
targetlist, as well as normalize the ordering of the UPDATE's tlist.
Separately, the patch fails to defend against certain queries that
ought to be disallowed, where a subselect is specified with a subquery
expression in the auxiliary UPDATE's WHERE clause.

These are garden-variety bugs that aren't likely to affect the kind of
high-level design discussion that I'm looking for here. I'll post a
fixed version in a few days time.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#5)
4 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Aug 28, 2014 at 8:05 PM, Peter Geoghegan <pg@heroku.com> wrote:

I realized that I missed a few cases here. For one thing, the posted
patch fails to arrange for the UPDATE post-parse-analysis tree
representation to go through the rewriter stage (on the theory that
user-defined rules shouldn't be able to separately affect the
auxiliary UPDATE query tree), but rewriting is at least necessary so
that rewriteTargetListIU() can expand a "SET val = DEFAULT"
targetlist, as well as normalize the ordering of the UPDATE's tlist.
Separately, the patch fails to defend against certain queries that
ought to be disallowed, where a subselect is specified with a subquery
expression in the auxiliary UPDATE's WHERE clause.

Attached revision fixes all of these issues. I've added regression
tests for each bug, too, although all changes are rebased into my
original commits.

I decided to explicitly rely on a simpler approach to VACUUM
interlocking. I no longer bother holding on to a buffer pin for a
period longer than the period that associated "value locks" are held,
which was something I talked about at the start of this thread. There
is a note on this added to the nbtree README, just after the master
branch's current remarks on B-Tree VACUUM interlocking.

I've also pushed the responsibility for supporting this new feature on
foreign tables onto FDWs themselves. The only writable FDW we
currently ship, postgres_fdw, lacks support for the new feature, but
this can be revisited in due course. My impression is that the task of
adding support is not quite a straightforward matter of adding a bit
more deparsing logic, but also isn't significantly more difficult than
that.

--
Peter Geoghegan

Attachments:

0001-Make-UPDATE-privileges-distinct-from-INSERT-privileg.patch.gzapplication/x-gzip; name=0001-Make-UPDATE-privileges-distinct-from-INSERT-privileg.patch.gzDownload
0004-Internal-documentation-for-INSERT-.-ON-CONFLICT-UPDA.patch.gzapplication/x-gzip; name=0004-Internal-documentation-for-INSERT-.-ON-CONFLICT-UPDA.patch.gzDownload
0003-Tests-for-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patch.gzapplication/x-gzip; name=0003-Tests-for-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patch.gzDownload
0002-Support-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patch.gzapplication/x-gzip; name=0002-Support-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patch.gzDownload
#7Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#1)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Aug 27, 2014 at 10:43 PM, Peter Geoghegan <pg@heroku.com> wrote:

Example usage:

INSERT INTO upsert(key, val) VALUES(1, 'insert') ON CONFLICT UPDATE
SET val = 'update';

I think that syntax is a dramatic improvement over your previous
proposals. The only part I don't entire like is this:

INSERT INTO upsert(key, val) VALUES(1, 'insert') ON CONFLICT WITHIN
upsert_pkey UPDATE SET val = 'update';

It seems to me that it would be better to specify a conflicting column
set rather than a conflicting index name.

I don't have much in the way of comments about the implementation, at
least not right at the moment, but...

Essentially, the implementation has all stages of query processing
During the execution of the parent ModifyTable, a special auxiliary
subquery (the UPDATE ModifyTable) is considered as a special case.
This is not a subplan of the ModifyTable node in the conventional
sense, and so does not appear within EXPLAIN output.

...that sounds wonky.

I already mentioned the inability to reference rejected rows in an
UPDATE, as well as my unease about VACUUM interlocking, both of which
are open item. Also, some of the restrictions that I already mentioned
- on updatable views, inheritance, and foreign tables - are probably
unnecessary. We should be able to come with reasonable behavior for at
least some of those.

If you've noted my comments on the UPDATE/DELETE .. ORDER BY .. LIMIT
thread, you won't be surprised to hear that I think those restrictions
will need to be lifted - especially for inheritance, but probably the
others as well.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#7)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Sep 3, 2014 at 9:51 AM, Robert Haas <robertmhaas@gmail.com> wrote:

Essentially, the implementation has all stages of query processing
During the execution of the parent ModifyTable, a special auxiliary
subquery (the UPDATE ModifyTable) is considered as a special case.
This is not a subplan of the ModifyTable node in the conventional
sense, and so does not appear within EXPLAIN output.

...that sounds wonky.

Which part? It certainly wouldn't be helpful if the (say) auxiliary
plan's "sequential scan" appeared within EXPLAIN output. That's just
an implementation detail. Note that the structure of the plan is
highly restricted, since it needs to be "driven by the insert" (or,
rather, the insert's conflicts, including conflicts not visible to the
command's MVCC snapshot). There won't be any interesting variation in
the plan. Although, that said, the implementation should probably
display any "Filter: ..." conditions implied by the special UPDATE
qual.

If you've noted my comments on the UPDATE/DELETE .. ORDER BY .. LIMIT
thread, you won't be surprised to hear that I think those restrictions
will need to be lifted - especially for inheritance, but probably the
others as well.

Sure.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#9Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#7)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Sep 3, 2014 at 9:51 AM, Robert Haas <robertmhaas@gmail.com> wrote:

INSERT INTO upsert(key, val) VALUES(1, 'insert') ON CONFLICT WITHIN
upsert_pkey UPDATE SET val = 'update';

It seems to me that it would be better to specify a conflicting column
set rather than a conflicting index name.

I'm open to pursuing that, provided there is a possible implementation
that's robust against things like BEFORE triggers that modify
constrained attributes. It must also work well with partial unique
indexes. So I imagine we'd have to determine a way of looking up the
unique index only after BEFORE triggers fire. Unless you're
comfortable with punting on some of these cases by throwing an error,
then all of this is actually surprisingly ticklish. You've already
expressed concerns about the feature not playing nice with existing,
peripheral features though.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#10Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#8)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Sep 3, 2014 at 2:13 PM, Peter Geoghegan <pg@heroku.com> wrote:

On Wed, Sep 3, 2014 at 9:51 AM, Robert Haas <robertmhaas@gmail.com> wrote:

Essentially, the implementation has all stages of query processing
During the execution of the parent ModifyTable, a special auxiliary
subquery (the UPDATE ModifyTable) is considered as a special case.
This is not a subplan of the ModifyTable node in the conventional
sense, and so does not appear within EXPLAIN output.

...that sounds wonky.

Which part? It certainly wouldn't be helpful if the (say) auxiliary
plan's "sequential scan" appeared within EXPLAIN output. That's just
an implementation detail. Note that the structure of the plan is
highly restricted, since it needs to be "driven by the insert" (or,
rather, the insert's conflicts, including conflicts not visible to the
command's MVCC snapshot). There won't be any interesting variation in
the plan. Although, that said, the implementation should probably
display any "Filter: ..." conditions implied by the special UPDATE
qual.

I think there shouldn't be any plan nodes in the system that don't get
displayed by explain. If you're using a plan node for something, and
think it shouldn't be displayed by explain, then either (1) you are
wrong or (2) you are abusing the plan node.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#11Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#10)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 4, 2014 at 8:03 AM, Robert Haas <robertmhaas@gmail.com> wrote:

I think there shouldn't be any plan nodes in the system that don't get
displayed by explain. If you're using a plan node for something, and
think it shouldn't be displayed by explain, then either (1) you are
wrong or (2) you are abusing the plan node.

Maybe. I admit that I'm not entirely confident that the representation
of the auxiliary state during planning and execution is ideal.
However, it sure is convenient to be able to separately plan the
auxiliary query as a subquery, and not have to specially fish it out
of the subplan list later. Maybe we should add a mechanism that
essentially generates an equivalent, single ModifyTable plan. Or maybe
that would be adding a lot of code for no tangible benefit. I don't
see much point in making one ModifyTable node pull up from the other
for the benefit of this feature (which is another thing entirely to
having there be a single ModifyTable plan). For now, I'm glad to have
something that will allow us to drive discussion of the feature to the
next level. I don't have a good enough understanding of the optimizer
to be able to say with confidence what we should do, or to be able to
see the big picture of making any particular trade-off. It's not an
immediate concern, though.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#12Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#11)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 4, 2014 at 11:55 AM, Peter Geoghegan <pg@heroku.com> wrote:

It's not an immediate concern, though.

My immediate concern is to get some level of buy-in about how
everything fits together at a high level. Separately, as discussed in
my opening mail, there is the question of how value locking should
ultimately be implemented. These are two orthogonal questions, or are
pretty close to orthogonal. That helps. It also helps that people have
stopped being confused by the term "value locking" (I think).

I'm tempted to believe that the silence on the question of how things
fit together (such as the lack of discussion of my pgCon talk's
characterization of a "pick any 2" trade-off) means that that's
because everyone agrees with that. That seems pretty naive, though,
because a lot of the issues are very subtle. I think that various
interested people, including Robert and Andres have yet to make their
minds up on that. I'm not sure what Tom thinks of it.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#13Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#1)
5 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Aug 27, 2014 at 7:43 PM, Peter Geoghegan <pg@heroku.com> wrote:

Omission
=======

The patch currently lacks a way of referencing datums rejected for
insertion when updating.

Attached revision of the patch set (which I'll call v1.2) adds this
capability in a separate commit. It now becomes possible to add a
CONFLICTING expression within the ON CONFLICT UPDATE targetlist or
predicate. Example use:

"""
postgres=# CREATE TABLE upsert(key int4 PRIMARY KEY, val text);
CREATE TABLE
postgres=# INSERT INTO upsert VALUES(1, 'Giraffe');
INSERT 0 1
postgres=# SELECT * FROM upsert;
key | val
-----+---------
1 | Giraffe
(1 row)

postgres=# INSERT INTO upsert VALUES(1, 'Bear'), (2, 'Lion') ON
CONFLICT UPDATE SET val = CONFLICTING(val);
INSERT 0 1
postgres=# SELECT * FROM upsert;
key | val
-----+------
1 | Bear
2 | Lion
(2 rows)

"""

Note that the effects of BEFORE INSERT triggers are carried here,
which I slightly favor over the alternative of not having it work that
way.

I've also expanded upon my explanation for the structure of the query
tree and plan within (revised/rebased versions of) earlier commits. I
am clearer on why there is a special subquery planning step for the
auxiliary UPDATE, rather than making the UPDATE directly accessible as
a subquery within the post-parse-analysis query tree. Basically, the
optimizer has no basis for understanding that a DML sublink isn't
optimizable. It'll try to pull-up the subquery and so on, which of
course does not and cannot work. Whereas treating it as an
independently planned subquery of the top-level query, kind of like a
data-modifying CTE makes sense (with such CTEs, the executor is
prepared for the possibility that not all rows will be pulled up - so
there too, the executor drives execution more directly than makes
sense when not dealing with DML: it finishes off the data-modifying
CTE's DML for any still-unconsumed tuples, within
ExecPostprocessPlan()).

It's certainly possible that a more unified representation makes sense
(i.e. one ModifyTable plan, likely still having seperate INSERT/UPDATE
representations at earlier stages of query processing), but that would
require serious refactoring of the representation of ModifyTable
operations -- just for example, consider the need for a
unified-though-separate targetlist, one for the INSERT part, the other
for the UPDATE part. For now, I continue to find it very convenient to
represent the UPDATE as a selectively executed, auxiliary, distinct
ModifyTable plan, rather than adding a subquery rangetable directly
during parse analysis.

There is another significant change. In this revision, I am at least
"honest" about the plan representation within EXPLAIN:

"""
postgres=# EXPLAIN ANALYZE INSERT INTO upsert VALUES(1, 'Bear'), (2,
'Lion') ON CONFLICT UPDATE SET val = CONFLICTING(val);
QUERY PLAN
------------------------------------------------------------------------------------------------------------------
Insert on upsert (cost=0.00..0.03 rows=2 width=36) (actual
time=0.115..0.115 rows=0 loops=1)
-> Values Scan on "*VALUES*" (cost=0.00..0.03 rows=2 width=36)
(actual time=0.003..0.005 rows=2 loops=1)
-> Conflict Update on upsert (cost=0.00..22.30 rows=1230
width=36) (actual time=0.042..0.051 rows=0 loops=1)
-> Seq Scan on upsert (cost=0.00..22.30 rows=1230 width=36)
(never executed)
Planning time: 0.065 ms
Execution time: 0.158 ms
(6 rows)

postgres=# EXPLAIN ANALYZE INSERT INTO upsert VALUES(1, 'Bear'), (2,
'Lion') ON CONFLICT UPDATE SET val = CONFLICTING(val) where key = 2;
QUERY PLAN
--------------------------------------------------------------------------------------------------------------
Insert on upsert (cost=0.00..0.03 rows=2 width=36) (actual
time=0.075..0.075 rows=0 loops=1)
-> Values Scan on "*VALUES*" (cost=0.00..0.03 rows=2 width=36)
(actual time=0.001..0.002 rows=2 loops=1)
-> Conflict Update on upsert (cost=4.16..8.17 rows=1 width=36)
(actual time=0.012..0.026 rows=0 loops=1)
-> Bitmap Heap Scan on upsert (cost=4.16..8.17 rows=1
width=36) (never executed)
Recheck Cond: (key = 2)
-> Bitmap Index Scan on upsert_pkey (cost=0.00..4.16
rows=1 width=0) (never executed)
Index Cond: (key = 2)
Planning time: 0.090 ms
Execution time: 0.125 ms
(9 rows)

"""

The second query gets a bitmap scan because plain index scans have
been disabled for the UPDATE (a temporary kludge), since index-only
scans can break things - IndexOnlyRecheck() throws an error. Not quite
sure why the optimizer doesn't care about resjunk for the UPDATE,
which is presumably why in general regular updates never use
index-only scans. Since I think the actual auxiliary plan generation
needs work, so as to not have uselessly complicated plans, I didn't
try too hard to figure that out. This plan structure is not
acceptable, of course, but maybe almost the same thing would be
acceptable if the auxiliary plan shown here wasn't unnecessarily
complex - if we forced a simple pseudo-scan placeholder, without
wasting optimizer cycles, somewhat in the style of WHERE CURRENT OF.
This is something discussed in newly expanded comments within
planner.c. I would have made the optimizer produce a suitably simple
plan myself, but I don't have a good enough understanding of it to
figure out how (at least in a reasonable amount of time). Pointers on
how this might be accomplished are very welcome.

With this addition, the feature is functionally complete. That just
leaves the small matter of how it has been implemented. :-)

This is still clearly a work in progress implementation, with design
trade-offs that are very much in need of fairly high level discussion.
--
Peter Geoghegan

Attachments:

0001-Make-UPDATE-privileges-distinct-from-INSERT-privileg.patch.gzapplication/x-gzip; name=0001-Make-UPDATE-privileges-distinct-from-INSERT-privileg.patch.gzDownload
0005-Internal-documentation-for-INSERT-.-ON-CONFLICT-UPDA.patch.gzapplication/x-gzip; name=0005-Internal-documentation-for-INSERT-.-ON-CONFLICT-UPDA.patch.gzDownload
0004-Tests-for-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patch.gzapplication/x-gzip; name=0004-Tests-for-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patch.gzDownload
0003-CONFLICTING-expressions-within-ON-CONFLICT-UPDATE.patch.gzapplication/x-gzip; name=0003-CONFLICTING-expressions-within-ON-CONFLICT-UPDATE.patch.gzDownload
0002-Support-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patch.gzapplication/x-gzip; name=0002-Support-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patch.gzDownload
�
!"T0002-Support-INSERT-.-ON-CONFLICT-UPDATE-IGNORE.patch�[{w�F��>Eg�9��_��;I<6�aw�����gw�H-PFHD-��L���UuKH l����yHU�������y��<�w���/w��<�L��z^_����39��r�w�I%.�P�����E�����n������[q��*���T����g*�>�'�_?��z+~QnK���I:ro_��v{o�vE���v����W�$o�?�OF�������m�XDq"�������t:��R�^]����w�g'���"�.�n�����E�m�������:�L�2�-�.>	@$j��D�4�E�I$�B9��TOf2~(�����"O(���S�O�A��t(-&����*N�[wq�wdB!��k���LV�s����R%�Xh���o]w�P'��C�������-%dW=���@%� �J,d2s�FD"?��#�h���9��F�de����$����IL�l"q�-bv����YH�9>�"H�����@���4��J�A��"�@w���?~v�\��f$���h�!���9X"�48�'~&w�t������x.�U������1�<���L��mcLkg������I��x��S'IA����
�W�������Q��� 

�����H��?�%$yQ�3%]�E�@f^c��e���bK�e�P�Z�S�`����T��������a���q��T�_*U��R�L��A��%��"�~��0���l�����s�
��E���j
����z_��bU���X��gX���"�3)+P9��"����tQiM���U�
\�|5�/)�L����z��zR�6�h��8-k24��]2�)�A�)�����z^O�Na��a(<��>��/�'���fpr��xq1�g�AXA�
H'���O�N��+�N(����H��X*��������h���jq������\�Y�@����dLEt��t�7���^H�#0��&fy�o�JW�y��U����Jc:�{2��>�iU�~����F,�i�����Pb�~�)cvK}~��q|�����E��!f>�r~�=���Jh����� �m\�U$�	���v�~�L6Z�$	������������<�U ��G����n�p��dx��hag
��K�\�R�$Yf.����i�G�;4M�F��8��Kn�Mvg$P�����mO��������+B{��b���������M1��m�G���n#=�"�����ul:g���|�a���LLh��
U����1/����E�(����l9�=����s����9�*O'L�Bcg�1����0^���7���0��WLW-��$0A�PeOn���"�U'Q�Z`7�)|P��G������C	��{��%��;�%9K�*$G�t�E\Z�<lr����3���X��`.���bI�	���3�w���n�������`AW�/9+�"���E6J�W�~K����8��K���}�c�9��3���S�[i�}�4��U�`y6rp�:��L"����
`���Zuf"d�!��q�,������2������mS��Y/YM�f`���7W�6�����������n������;
�]�����	�)��Y>-�6�eg�h��n��$ho��������K��K���b���d
{�C���/B< D;;�����-�;������`��]�����)&rC��i���g����_PL�^���$���#��/��g��^����c����5V��� ��9��-���J�p�*d��[�4+�����d
�Z����3��o�T�~�����f��E5*a����C���s��/6j6'F���L�ur�So�0KM����;\��B�o���S1�����_DMl�$�������7!"���if�U���>;G�6�|9��"R����O�hM?L,_;O�N���V0MV���{��gQ�B���z�;zf����`ekb�-#b	Fh��H��~_J9���zh������
��lD���]D+"�~wM�%�X��v������OT���&�PKo��R�;�*�I�Y6����|*�\����
!��F���+q�ZQ�LZ�3��X�7K���aR�^�[2��H�Kj9�g�6��mrM��T�d{�~6b�6�7 �7�e���
��[^�3Lk��(����u�T��*:!��E��k����I�%@���
CZ�b�zF�q����R]��L�9�����%��n�����Me����:�WO��S?r�k����b�M}�?>����t:�����'�����SN��\�#�N~�Q�w{�G-��u��5�#���J��b���}�����L�%�����Y5tC��T��2D���+��w9��q�@�K���jf��F�+�^o��O�`l�N�����x�����;eK���]�!��o����D��ms5q�V�L���D�K����*Ic*��^�4E���'U�b!Q��6uAXm���p��@Y�v����������T�Q?Cg����$����d���l�2(j��G����I��&��^$��(JZ�I���U��x'.���[���^�c�$��!��P�6v&�y'n������[
�}jn477W7-�R�5T;P(]<�:��'����o����nF�����]���6����N��gg[W����OQXo�M�k����6��	I����������e�X�O^�6!U���"����}�m�&^$b�E0���^����m�/d�
���tL�K!�(S��A��Z#�Ws���$���?N.aMl���R�[��h$������>�CG>�Ww������x�ja~������_m1���TY4O��9���o�$2��2�`?C*sq���D%53C6^����sK��Y^m�kh[��4[u���x�
�R�8����^a��I�E2����J��s�(�|���@�i�]@��`�����-��F���4�| �=G�1���X������l�/�PwU1��6?�+'����/��|64�Hbj���0�[e�h����>&3a�>7�:C���u�|��:d1�r�����Em�:��$���:���� ���/��!�{H��u1����1^�9��ss*��-��|��	��0��:�(�h�T����0�$6��{W�MJ����k���8�Ax�z��[�D@�B�f�+��/�>%����7���($����������������w���k	��d���6�3AM��yk+����X�]{Cey(A�_hS��c#E���B�\Z;m]<�Q���;�S���>?9��k�e2�R�dv@��>Y�Sg)1����C��u�P��'�y���~��y��W-���������cTXL\,�0��=����D�����	��^��GBf>q�����WcL<�7nl�
-qF���)3/����<R�1-P��]�G�+�|�Q����i��������������r���`|�q����V�-_��2�Z��������p��xEB��Q)� ���=�;>�:�P������U2��
�Z=�x���.T��B�!��r��Z��e����c�L��c�Xx|����&��=m���S ��Y���(�I1�D����*F���8�\����D�2�q���Y&���oL����CB�8.�C26����7�9MBa�49$�"?���<���W��y'.��r��eH�M��D��g���O%�lL�^+`�F^�C�mu������dd�
����z{le�M��N5��QLx���!�ap!�'T����`��*J���hR��_��(������h����[�l7��<��]�������P��������hd�
��v�J������%S��*�o!���Y2Y|o"���q��c�����)�u8A�U)���(��_��d��"������U~q:�t7���q��X7�n���8�����g{��7�2�g��d��s�~D�D�Z�`2�U��t�N�7n���S>�GGR0O��!��lI��#S���t����)-D�/���$����N����O���1%�X�c�(�3>�����N-2M��d3�g�������2�4���
�J'�Ln�b�}���RSK����0X�o
f���u��5���!7^��}�-f��a6�����~��y>���b��E6n����U�� ���<���:���rN�))�]�����9o/�t,�%�����L9����V�>�wjOf�
�����t@�F��5y�_����<�}��k�,sq��o���ew���6�l�k�i��XrM�Q$�YK�l������
^x���^6��1�������
����-��e��>��$�����h��&�����n�{D�����cj?�A����|����_�X�"aGg������I�q�c���l���9�u��`������ak4�Z-;��M[����W_J��<���6(_�����=J#�w��V�{�:��
rT^x�(9�5��p#>,�'0��s��w�������>�������8�"��}@��<�9����%���s@�|d��vt&{�9 f�����6���0�!y�c����|r�L�e��5��U���`�a��P����[����^D��'~`�
�R�,���TUhN������f��b��o��5���m|��-�H�B�8�zP�*EV����L�a�8?AnCiX������h_?5�i���p^�0����p�t(�t�mv�v��
g���.�a�L�*��f$c��JkHm�T��c�����P
dV����D�?@/;��l�Fa2���,&u����Ft�T� j��|��%��i�B�0jk�[�����m`g��T�E�4q�(�;a�{���L����yg��G7�|8^fMA2��Xvye���,C�x=h^;�,�t��u��9��~��������Sf�wE+[>��)�j���y��~�e�i{��� #��d�����/d�j�t\�Z'���#:��2���A�����>�=�y�Z2��M	R����Pa�Mc������=�h�#���[�?����N@~�:��Y!/�23��pb��(L��q)�r������� ���"�����G�]����r ���G�p0E[6?b��d>G�@|V���A��y������5g�iE���{!P��2���V�5�4]i$g�:�cY[�>����H�<���0�"v~/E�ZFj"�Z�Fz��LyI����4��-?c�%����RW��-C�|JG��0��kHe�����?�G�L}�����&~G�Z	�$:o�����|jK^�4���k�du�4����2�#����l4�N1�6J~�K����pZ�����]8W�7�O�B6\A�yK����!9�	TA��@�����=s���4*�d�
������F���m��s��S�jB��}��4���u��U�(J)�j�T^V��~�7�^l�W�������em�c���v:��~�;x�M_Aic���������
��i�\���O�9	��'�x��C�@bV�f,@0I��G�\�m[*���2
�2f���F����UT5B?YLWxx�^������=��.��EN�sL;�9�{2��t>�7&��#�FM9z_�hWI�<Ih
4u��h��<4�`������12�0iK��b>g�E~�yZ%���d��36E��"������:��XR�U��~<�:p)�\��<+�.��N���E��K2�2B��d�G���C�}�m�����{/�4�������$K�,��l��%l!#����C�lk
�.{��DJ���R��L1�u~��w]��!\�g�9�z�@fddd�����q�0��4��/��k�t��
�(p �ht�zq�"�U�!���2�/8j�bn%����|��-���l���+%�W$�yJR#��r8O$v����~����'H��
:�H��sn�b�H����n����I.�\�J��W�Cp<� �
	��Q��ps�:�<x�2^Nr�.P��E����6]OX	�(�����������\�&2�y�w"q'���H��1�"��2.�,��2&�Q���Z�i�)B�G��^>�������1s�����NH�������B���H\F���~��	�I�e�O!�P}�U�BC$��+����[�D�@��y�_�A�G��
G�t%�}I�)M�H"<y_]��<��� ���q�{N@��EL��)���n��
�s��a���Q�&%���tT<>o`,�8�oy��)Z�q2N������&t����_4N��:���W|��zvv�Y?�i]7�1B4��s!?n�tw�j��E�.�=N���>!������2���"�"��go �����3g4��y2�80V�b�rFP4!,fH9V���j}u��"����l�����v�����3�s�����rG����^��Y�r�G�f��z��i2���B��FD�t���@�z�qNhf������L��0L<��o�|��B��`�����������Q_u��}���>/�d�$���N#{��3�������[1��(*�\��"���o&��Gf)=~�%S@�����\x��'�����A�
�I6t��������}$�X=�S��O*��Z	���`;,��XLx���DQqC��/I����O����r���6Xl�r���}U����s��KB��(1/9���U����J���$����1o&_�LFt�M�d���Zq���f.�yJ?�%���y�/�����b���V����<V	�(��$����B������!�tz����p�|1�6�)+����M��pAo{�-u��M�f(�}N�k���&����7��S�c����`h� �r���~;Rq��*<'8 ��y���,&�q�Y��N�'T��ip�+.DZ�
ZL�;3Ra��;&�j��X��7����_w��\���6�L�����d ������}N�������6�������G�F�Y�V��g:f����z��M[-�����dB2OJ�����j�m}9T�m>���q���E^`6e�����f]�����G]������G�'G0
8N&L
��3TH�0k����3�XG�=8� w�:�W,g,���F���}�*���c��-!�d�J�k{$@4"��R�6��'�u!%.�i���3����A�DX����~�y"�1�0��h���jO�i�g�Y�YJf�1Sfl,��
86��BG���q�nw/���x�=;�hu5�Z���]<Q��m���Z�?n���[�P�f�0���,��;xN���BFs:P�G�����u�F��2�0��,C���>��L���\����t��z?�]���t�����u��4�9�)d����L�$�`��$P�
}F����y��
�H���(�}�Ed��LxP��1a*B����@���o�����X6-�[$8{�D:qz#=�*�K�@b�|ZX3c[O�S�Y+�k������k�A�5��\d���!�s�, ��O[2�Q��@z�[n�Y��'
��P:���*8��R<�x�jf]�i��i���:H^D�EL6xC�����V�hw++*�5v�0�x,�JH<�I<��X�C����<���H*5��
3�4��D�� �Fh�������W��m����1P�����������H5l��~���9
�
3n�-�CVy`�g���/��E-z�@���'�_������ ��]�9a_k� Z�L��!����`cr';���������2yY��Ab��j7xs��U�B b���9�Q���R@�J��3����8Kn������_��ibG������Q���1K��i�}�as��duuE���y�D���v�J2�@L�Lnr|�&�Gw	��v����LS4Crc�r �@r��>�S"����M����'�{[8��$��K;%�^��^nB��9)gV��<e�sY�W<�V�j���|�:	��y'X������]N+y3T e=��'8��*&��{I�h������D�~.�oA�Y�n��nr�|jf��M~�J�R%BL
!P5d��B6�M+�h�O��p6���R�

��X���f>M���,������n���}b�U$��N
��'<��+G���EV�|�@�{���,�V�]��U�]�3J$,���jy}��,h�
g����7�������0l����Oy�?��eV
��a�[���8e���m����Fvv�������h���'�I���\����^��o��pi0 M��IE����w~�p7`���� O~�8i���H�0?6�<�����J'b\�]�'K��h
��4j�����~2��K�_9�4��O����g����P�����?�����^l���$_��7�:sR8�Ig�:c��u����|�8P��Ue/�9������R��x��n�Qe>�Df�tB��1d]��j���G @���Knm�];fW���G�m���_;��/
�U���!�{���?3�Vh����mN�ckAhiO��������K($S�������A0�V��R��u_UX�TH��J}�E����#Dld28��G]�>�,�d^w�^�l1$�&���"����S����+�] #�bbEb��sE(L����E�pz7�0I���7{z��0�������0{��xa�=��d%u0�K��`@�9F\nv�����bv������ �~-������o�E�X�-3�S�s�.���tb��v��\����9��A^�W�*��lY��E��xeg��k�@�z�3���Gc��Q��[���aGzL��O,���1�!_A�m�.�y���3����.�t���9�����a����B��n4D��y�����{�W�z	�I�����
9t��`�*5<�y�������.�)8(���`G�����pUr�{E��B%V��cK�df�����5-�PE�&�P�;=D~���u.~Q��C[z*��6�V��s���n:�x�w��(G�1�hF�[��AY�m�*�?����Ug��E����F�� �>}��fF��!"Xk��}d����Q���.�P����1����~c.|qb��cvc)��u;`s�@��~��3����Tx�}
&O�B'}���y�X_%�S�t(`��<��f��n?����Ji�����K]������JB~��<M�
%�H8�BO�t���6J�"nF6}���z���%��b?���-8����0�������V�]�bl!,t��1;."�� �Y,/�C���n~x>��A?�"��@������s�����{5���}��U�E��D����{	C?$3F�����!Q��\s�$�A���>� ��2
m�������rep�����st�����=Q��������]��\]��������J��\��U�bgt�/&��o���d��Ya�D/Ije�V0�P�PC#{�7
���4�F��D�y�	����S%��]"�;�ZL=���4B�o67��=�;�;�c���^���^���l������"�����;Xq]��%�^���$��%��@+��D1R�4)?�$z��|��2�(��C�e=U�Q]	n\r�j���k���&�g`���NV��"���.���m�Ln���t\�x��LTk�I9�����<�����^���#�/?������R(�B����p��N��M~�.8��X��Sa KE�^".L&�/��UR�9g�o07��M�9p��gV9�u���5*^�?x�,� z���A~������r��(�a'�����p������xV�wq�D)>����Pd�\p������#E|�V��d.�F����� +���-j ��9���8��h	.��8;_W�0���7+c
]s�v>��Ep�*����Q���E���{^^�V����5/��7�M�!�`�R� L/y<H����5�����p�o���{_qxR�r��f�$`=��&B<�jYRK����&�)!�5������C_������P��=�Dv%eT�����j|���@@�A0
)J����}��k8�(��Rwd�q��M�e�D����oXg��8j:������&^�X��Ii���M�=��T1.qt���c�m���K����-`�����q�I��d��p��!��J��Qu��+��)	.v�XB1���q�
�@�8�bTy/|v����ihhaR�m��Pk���:.Ja����pK�����h;�m�����`��aEu����d�^J
���
.w�-D���piT�PC��l�l5����;������O/9;�n����/\�Q��SI�\z��B�3�I�2�-��
�2�w�:~��}�9���q�����H�{��f<��@�7�����p-����#-��"��1���aN!Ss?�	�/q����L��H}��d<F��=���q_$���E��Eq�(uS�
�t�s���"��3����6��Pw6�%��5��x�FH�q(/���68�:';8����^����Z��z�VK*bL�g��O��SlU�J���jR{�(�dz�d��Jo����P���P���Y��*{��ho�S�qx=�]%����]�R����n���c ���X9����|�k�8v��E�
�`g&��5mU�t��i�q~���KR�Xp��{�]��>#�y������JP�A�#�gsZ�`�4�'��;��5�>��0J��_�^���U���G{T��'��(���;��5Hdk�x[�����?�3Bm��v��H��p�����6"�K�0�L�f�f������i�E�����s�L�mJ1v����\���<���F2AtA�����(>�r������E����~�3)�"zh�X�u��7Y,�]qy���auK����@Hj	�����em�=��hL]�X��b�%4,-������l����$��
����Q�+��������}��<�?�,��h��0�;����>���-8���&�f��eb�v���>^n:�9��3N�=�t[vP5�T��0��P��~�����^c��y1v'sl���d$2���������h���Yu�tG�n�L���hu0�!��
�����I��E�+�wY�����������s!� ��D"��C�h1�1��3�='�F�=R��d��=`��n�K?Q*�*��U����)�*�4\����������_0��}��a��}���7�STK��������;�$�����McI���;8y���1�����-?B�9s�d9�P�_��S����V���vY$dcM�B��#k����9">�0W�b"A���]���0BR�$�_^2M���k���(�\��l��/+:�c�I�:��X�D�I�����$��Wr,AIp� ���sff�qZNO�AI?���
��'��FQ����(6�3���	86
"za��(2�Fysf���Y���(�3,JE\f�j�U�>���*����������H �#A�B; �,����j��r��$�F'�����y-3�4��c��TT|��D��U'�k���`���(�X��Tl�Kg$t	�����.�[m�n�������}�:'�Pl�����a+����)�K���~��V���,:H�:Ynn�	��U��������
��x
��B'����!��|2�9������~N2��i���.X����h�i���]/��	�"IYQ��Y%
�/��t
i��������F4r _�Z��aA�"���5���j�,39e*�Z��/��>_��c��e�q���lA'd��\�BX�����Y6\�Y���y���K����]��(5S�����
�����a��9^��U��9�*��!�Qya�SAX+GB�c��j��^����8 b��~�p(�����+P[���^BA�6��&�g6�V3B�vEbE��(t�H��[g���3yB���"(Hf������E}�h8CnV?(��+���� ��Dz�V���%�-�v�-���TcV�3�����N2;�l�
H�$�j?�N(pdI64��@��}�
�8���Dz�^�Z/I��#�#�+b�IR~[_t+���N4�.r�	\�f�O�0u[#��9"�]O��F /���o��d�[X/�o�v
�DV�p3rC
f��0j����p0����v���RYhq��F=���|/xT�l�2�k��e�J�p@TQ���Y��W=���Q�Ie��M��?j�=��k�@��5���h��6���.�1���FV0��kvq<s����9�
�����{e�'� �'��k�e2ML %d$������?�#^&������~_PMwT����������t`�w���B�	�`>�!�.�Q���x5y�J�4Q[[<t�eZ�A,D
�L0X'!	B���0�j�����l6�1O��5�\/C;K8�CV#��,A�uN���Q�����y�4���1c�)�������Lb/`����[@�S�j�Su)�R��<��W�s���������F�5:u�{�i����S��z��P/�_�Q���m)$hp}6^�����e����
�_j�X�?<��
A�E��v��L_yb����}N����f`(`�+��b�U��^���d@�Fn$h	M��G�����s�5L�\:��T4~I�0�p\����0�{��cw��%wE!Z|s��Y6pD�u�sy�����������4��|T����o����1�?���<o��y>������Rw��}-sV:i��f�M����e���x3�O��p����I�������3�#!2��lm�E�v���7�-;]4%�KK��B�y���Rq��|��l~~��{Mk��j��r���ger�z�58�h�v������{�V��������d� ��>�tf��(�%�x6L3��1G�H}�*$�s�S_����Q����st|~v����}v}�K�>$�p��|6���`�qi������W�D6��.��Y��!�`�H5�����J��?�n�_2O�C�5����=��
KS ���SQ����������	X�CHa����eGw?a_�64rX����#���Z[LFp��P���8wE�=��hx���'��)%�}8�����@�#��y�_��J�FDS���&���_wN����0A����
�>{	E��i����4<����^�u��7&e��-��B�xpbnXFG�Z�R�����b��$�f��U2H���wt<&�F������z��f�Y����@~&�
N�a����:�>������ay��"s�>6�>�3�F�[�1�)f�����-�yk
�WAyDu�F�M,)�}�Q��;����x1��#��H���[l�:$��E����T!�3D\C�I�Y2��J}c�5�]u�,�Eb,@DH���O�K)
���?�*f�;��o������4�A��N5����6�%?b%O��.�,��#�Xj%��RYE���g��K���`���*���k9�7sh�`=���U�d%#����.�J&����������
�����%��z��'������To���1rb(}�����;Em%Mst%R���n���K����7����$x
�"���u�;!6��7������c%njt���CM�&
���<}
;�����9���}�YOm����l��GI���,�	�9q��[70����H."F�Rz�(���6[��Z���������e������O�)v�@W�H`�����u=�0i��������;�.'95�F4�����"��%���d����6)����
��DW���n���l������.8z���lx
c��&BSk����Z9�F0*�2�M��k,�V��6*�q����U�4e�a�������Ap�{�$+�7�'�bO-�f��Y�W���
D�;S5J���c[��E���;�O����h8�\=�
0{v|����}��{��2�0v?Z�I�Vk��u�4��������
�r7+T?��l<f�?w��#�"�C��}��������Y�����z%��>l������%aA~D�D-H��%��L1�
g\��l2��(7�$��
J��J����:�sONj�0��?f���-hfkc[G(�
�q��\��B�qG6�f�[s&�.�^�2��N�*��Q`#�\��.��K,�f�������mH�r��?zxhP�X�QDS.�D�7!�$s(�4���j�����0�
� � 3��fH`�6���Y�g�&���5�V���Vs���;x%*�>��N=S���2�LH�Y0g�I<_����.�>�;��I���Z���G���M���y���}Y�$�I��E���5����E�c�u�l�f�d�ml/{h���'b�cc���P�K^��=��\
��������[������]j\@��<����	�����tP(������������l�FG�,x�|C�(��"�{l_����|�A�`mB��_*�~����R#�\���!���;���U���K��]c�I>����ZZ��`#"x�r����"Ht#*����qg�..���.�,��}�����)#���Jz�M&��+��9\"9W(���X�EE��acw�@�9�l�K����
�����J���
9�^�Y����JH*z�|?�����+���*�Rq ������>����d"Ac�W�r6�3��(v�{��lb����Y��*��.�P�UY�6�"�P��� �j�h^�F���ml��tU�@T���w�n���>�������+r�zj���z!��~O����*�0����eC�+pv����Q���8�UM�[r�<L��G8�F��sb���H[@���F��(,��.FD�Y�;F���yb]k��O�gwU\�<�:|��������F/��y�<�m�K���Q��-Z�m!M��3U0���x��a���"N�)=(��&G����$����*�s���_T�^�2��Y����0(hq�J��d_����]Q[����{��l��z�V�������[�9ko��[�I�����Rg��<`P��P��k��������1�3-k�^�8|��8�4��u� �u����dv�(V��F��g����}�����&
��"����Y��~2�A�d�����V�����f������6��Yv3�u���qEd75��2��#�����=WkPv��0b��Zy��.��:R?V[�u}������E��I�������Y�B��|�(^���SK�5�����{I���;��o�W�!��#���>����Z�cn&����I�L'}�>�%c�����^��y�^����`��oC
��b����$�7�����c�W��bj�w�%��P����������xb�+���/����Q:�g���%�?�I1:{��=��Q�F��f��w�����v�w��>J{)!��v�M)���<����CW��JT��*���=d1�����Y��������0fT��,�w������J��s�U��@Cu����1���WZ������]Y���V����l��{���JkL�/]]j�
��>�s���on"���_x��2K�����(��g���bL��	�T ���S�m��2���h�`9�!�p�*��#���*�[fY:�m���3�Bty���%���*��2�����7��]��
Q�y�v7wh���7y��������"���ya:�h�����aLWFe�"��I�'�p��i����������-��v�����)]��*<mvmT`-*~�w3����l��t����}g���?h�������68HVa���%��5
��nR���&�m�{1K*}�����(���{�������#��0�*�.2g�	��������z��15S�@��jt�n���Op��:�}�yf<��3�������������#_2�����gM���(%�.������tj���������tA&y�y����@z[��l#�B�f��<��k�F��@�!��.!���$"����$#��������%��X�`��s���'L�(���:}�u�74Z���������*�woD<��$�B[k��5���AV��NS�%��(�Gn���H�2
���I����B�S��>k���4x�}���������ka���|�B�ZS����cd����&F"=k��Uz�Y�U���>��KN��m/����~k�����K����v���JG��W����X�y�
!���_��~;��������kU���Vy����~�Xv����su'�7o[P[w���s�����Z��Q�Z�V��g��*����U��"�K ��e1?�I�@6�,9�*��O���B���R��
���+&��Yj|�f4_?P�+VF�w\���0�aL6��w�#P:�p�k�Q��J��]��(_RYBV"qyhy-s�Ln%�~J><6������ug�F�����>�~����	K����)�gm8�2�oX��fZ 4K�1�W����W����_����o0����#��������
0����\�����~p�wz���|��{��Kl����
���3���f�����z� ��89�/:n�${=�����|��`����m�G�,����>���l9�&����Ikk��L6{�����<H;y�	i3��&�����U��Ntn8��������8�Yb�D���>\b���L�t�Er��_�!�Gx�B���z:e���A!�X$���{oA'���<��A��|���2�5'u23������9��(������sv��#��H�h�vbp����Mm�*1��d����k��d1��gTuB,�b��-��]�D)����pX����Bo��$�*m��n���!i��c�����47{�H��V�XzgK����9$^��.6�<"	��x����8��^KX�1���	�p<�'g��9	��7Y	������b��������l���p1~?"����S�I�f3QEp�|�a�����9��b�h�j�~P�m>�U@f�^~:� 4)��+A���aJg������.�\���p��;Jh��`0�3[�wpp�1P�nv�y�������b�S�4G��!���45�f2���"�	`���Cqp}�S�����7NK>�<�~�Fk�%4}�oK��:���\|��}{X���-� {�,���L����;��;}�-=5�&<�R
~�[����^ F)�$�'W��B����A�(�"�Y�s���������w���+�9�|����9��^�p|&a�����E�@���"/V>�u�����
+�-�O�B��WR���R"����k+�%�J1��y���\������H ���7
G#��l���=�������
����6r��A�i"�C�(�%kp���D��Q��!�CJ.3�5�F���$^.�2������}
��:������g��a�`|�����k �a}X)�3kC��Op�:t�N�������Bk&��gm������f1��*=��g�P�A����G?w������.B�������18���g�{*_K�|7�����-9s��~Fa�Y���`���QI��[�G���)%@�j/��������}�����*�kW���&�K��"������L	'���I*�0�����Te��yb�Y'�g]���QI���(t���YT�)B�p�B�
�X�B���5��@*Kf��<r����E'�����5�i$6C��
��	�4�#M/x�!���s����o����F�m�:}����@�
k��M+��� �L�Ie
�3�b<6��3N���F�M�|�q�����Y����uO��)��#��Q:5g�7�����C�aA@�/�e��IQlE��R��v{����Xn{N��mCO��Xz'-���\��>������p��*J*f�M�~���x�����"�H "e)G;Ppl�b��@������x&�����h��������4 ����c������#�T�U��%��0�5��v�-0O�i=����=����D��{`G��
+N�Cb�sFF
�wHDv'G�N�S<�Z�h-��C��������[�F!��qH����
�������|����Ks��NR��#���
��r��C2�;G(�����[��7/��#�A#C����XC�	2��������/�8�����u���X��a�p����MP�kE���t�t���_�_.��M�X����<�tzW=���K����'��������v����{�������}��@Z�8���-X8?V�����5���+����\���?�8l�Qw����u���;��Y<NB�]�����5|������k�4�\�u��.�gr
�����������'3w^I]�(JF�����R��"�q�����#&��6�X�m��k2��+����1�!6�
�C��E�#�����2$���*��y:�����h1���uE����,�}��K��?C��\����������<��#�S���)l�+�;�������3Y��F�_)�G���,�_��
��p��?"���\vs��D�����������{���b���bG
Q�������4Ew4D�b� &�	xI�ZB�+����D�K`���jw�X*�"j��zV��qV�7�tcK�l��d��3e@�g��M��N�l��YO�
U�fk$R�]�()�W�I�K1�g_$�;��x��(H@$H��~ ��Ij���"[ZP��\�\=(��U�Q�T�*�p��T�59����f��%�`[#�C��P�5�,���U�����X������`HX���c��,��3���������2�=�1�73
22�p��-(	��l=��q�d�b+1�Mn?L	e{���m�. �Q��0���;�������]��M��gH�5[��D�V����T8(b�`�a���+��
F������itK�F�$�����B�7Oq\5O���jd��\.���^������:UCFl5[���	)|5�p��e����-������;-g��ZJ1��e`��Q����3��~��p/6������H����%��{lr���32�R�<�N#�f����R�+�s��������(olpiR6Z��9`��0�r�!rv���<?n���y���7y��2:���1�I���A����t5����>�����������b=Y��.
�Az�l6Lr�f�W�k@��T��<�.h�h�r!_9�J�8�����y�I�[-���T�g������x�9���"`���*�����KY���5�$%K�9�|��y�Pq�,�Y�!����,���3��:���D��|>.~�$�x �z��83����0�Z��}	2��)"
N)������O�+y��M2�7I��8����&?��
��Pq�����`��7 3pS��67)v��������1�WX�JM�(T1#+@��r�
�_w��-� ]W��G�Q��������a{F�h�[���.n^���im�oiH��f����w*���;4� ;��v�y����0OE�&�����>�Wl7����3W1B�/F�4��
>'�������?�}CE�B6��997���]���
�r���
(�D�uyl�Lji|��%���Sg���.-g/��f�oh�d������-d��XGA��p�hl�pd����`�	t#���RS�wx<^��[����r��d~�2�a���|����B�3���2=�A��j�C���XfO�#D�I�O=2�5��,� W���1�U��U�`-����h�� �=�fjD�r�s��CD��lmo�5�Z_�y�u(5�n H<��3*	�P(u���@�#-��V%�-L�u����r�	p�.��d�I��*J�I,���e�/	�I�@!Tg���������A�t@�!6�^b��KGK�������gQ�H��l�`���m��Bv�7�<�������������}���l
r(��.Q#�"���b�*���^/��VO����������BdX���h�N�XH��rY��,lE�el=�8U�	7	h��]Q���������C�0�E������55�	uu'�l�(B����`�C-�"�o�_���g��
�z(�Z���������"}p�}O���+aL�H��������9�:�%�+� DqW�F�N[I��Ak�f��4�����~o�,�\?Kr-��v��?�@�6(yvO�2���v��$#?����b�Q.�F*<�X9��$�����	7���	F9/a����\����K�N������}�f��<d�(I"Z9w�v�R�V.u�2B6�O(�p	U���d���?h�, ��m��7�������`Ev�S2�2�R����_�py�rm���W��Q�y�Fy2�p��a����Z��3�R{-�D�w'�!a���k�b��Kke�1��$���6ID7G�B�/4���;EIp�8ND��c#D�����>�0�A��d�[�@�`2��f���e�D�o����a�o�~#��#��9����]���3\Z�X���@FF�e6d�����nq�A�0�H@�I�@<�Hrq���'�@I���|h���0������3�+�1Eo���]��!��!0v/�r�yLU�9kK�E�<K�����#��g#{9�mX_[�H��� q���5Awe�I���OY��l�B��p���k��:S���D�@����@�y�%;{!�Jj���`�>��1ftB\%����Bp�u��k�q������-��Q��|�rHhtV���%
�*�-�D�t64�O���~�[���gm]�+RP�i.-���z�����0�Jey��g���k�lk���]�L�������Xb��
������6af�t���|����yE2��o��A��O�5�Z���V9x�x��
ocF��a�F0���JrxV��w
<-��d��:���E*P�Y^s��C�K�����4�@"�z���9dH��9��L���� ���-{5���^���3G��lk��	I���R^�`���������E�*�a�s(�H�G���/e}mpP�q2lO����5���(�Ia:��F�m<1CNc�%lk����f..�RF�s���,_�a8��������� �
GC����.X�����Y2�����{�K�e�p�������|��E���0�Noe'r��K���P�`
2K�M��������$E=�����K����#~�P ��������sz}I�Z.���.t�A~�|c��6�`H����x�\��+��S$_�Ik`">��@x������7�pgNw���
�E��C���e[z*y����<�Xq�sU#�� ��#�0�T�R�2��/��"
�t�(��kC���Q��}'���"��;�H��L������XK����".gT�������[�,���q3��������KD��������a[kWf�3��{�G���"���]K��oK�'��;�C0���+��\<E�	<~y�5�>A1G������a�e�$�f3�=��q�%
���7���VnL�ZgP+'����&tlJn���@����+�a���3@/q�fY1��JM�k��wv6��W�6��LG��r��D��U��L#f��I��?��l��.������2.re�.����-�k5dxf.���@;f�->����u�l'�S�g�wvN�6?H����w�zg�o�XgG�vb��CD��4��m6�>��zj��������1��{���S%�kf(0�a�����|��_���Df����Kp�:�����X
���7���Xk���[d~$��jq�n��f���U�
L�;F���]�`u"'\�d1mH��}�V���~
:���8��'Lv��byV(�GvE���
�/� �%���+���[Zhu��w��;H��Gf��I�b���m��n ��~�q��yNP�}��mi������I]����[5C'�f���m����t���dSD)��p��V�n�|Y8s�����7^NJu�3��9���VH��VE&�l95�������%�r%�r10�^�]�?�J�N�5; ��������>���t��"D0�/THQ�_x.r�r�S�\��o�_���y'i����w����.O�h��K^�y��CG����d�������G���;WR��!���6[���	�����~={�3D���\���22T�k��Qr�*�=�N���L��!o�>�8��:�3�y��-�5'������qDjt]w�
7����D��.��/~5j�0���St�F~��B��������`�d���a�s�#��q/����l��$!��QO�e��g%��1Z����e�p6���@:�lGa�N�D�Y�d?��d������)Bs�5h;M����CA- �*v���s9VOf��y�����6B�N�?q���B�����<�u��|��2���9'��,�ic����FL}PE�LFv�	����<���a�~���Z��?���g_���^�3N>m94��g���2����8���|��5���\�K������zz��:������Z CT�B��w,/���v��+�����.ON��Tz��O���Z�I����*^)f�i����N����]Ccl���X�3�I������d�8�U�?�!E��0�-(���H���:��H�o�-���>��F��g�
#��"V��^�T�C��p�L��|���y'��2��8�W��y��9�#.3,�62Ru��AMy�^�V����9�h��y�o]�����������FeG��)��_����T�D���b����C�E�.l��TR[=9�$��l�`�����	e�
's����6A�4!p][�&���)�,��l��~��<]�%��YP�Qs$l
,�/3��0,-��J��$m���rF9OB��������������T��1���E��I��QH��7����������������0d����;#)��G_oR2�G�
W��$�ztBs�5	k~�u�)ad9
���v�����v2+>0A��=DW9��������C�9i��A$���4���|�np
�^2�Q7�3W���E=�y�Y����F����?���&��M	'8��"<�=����f�Bi�L��-QM��������o�
_Li�p��� �0'�Ce���:��J+��K�%P3��b�d�5�8z3T����W�J����T����/��1s�� �%������y��	:�Nv����j��8�����������C��>�����4q|ty�9;:�\����s~J���$dB�����
���(���g���gB7�4��r�����;��Q�?@4C����� �!-;� D�Q�]���&[�-�2����~2sq�Cz��$��Mv�:��h=G���0&9_[������_��,=��{ ����4���VF!*���]�(��h�32egQ2Y��nl_���rH�b���6|��#f�AP
���(~���Y�2���s�Qio��(U����'����������I���G��Gg��Kw����|�U�C
���+l"_�wHFS��Y��9��Q���%��Y��_8}�����X,�!��H�sb���I�+�R��f�#Y;"e��}�](��T��lx���C<�z�z5 �q
�v������1�Dk������F���
XJg�	8�}�|���M�&}d��U������'k��YI1����	�0A��3��F����*N�J�I����L�@BJ�\�{u�8������d��3 C�?��2xnz�q�����%��}�h,����=sFM��O�/�f�@7g�Fo�����L�5�`hukxb-�'R�oL��A
���|��+����T��O� ��N]�S����5���w����6*��F� �� q�!hCM��{�����Z�D|a��x��|���8�-�k6�%�aB-\��h�����������u�$�jA���*_��$�����X�������/A�Vcee4�G�0���dC�����P�J������Db�<N�#�����
��}�i)e������	v�u��AZ��$U3��O�M���J�z�5�s��r�^�93?�=�����{1���$�v5#M��-+��Z�q��Hzr���
g{Z��Zn�`z�~5S�j+?y��(�u+j5KB�����!�<�w&B�+�82eY\�U�G��Ky�l9���/`��m ��"��1�t�{f����s~�y��i�tO�tp�
6v�W����J��tN1V�u
H
C�~u:��3�����^l��$����x���b:{XN����@������f�u3�]S��Gtg�ks��<� ���g4a�p�0�4o��5j$���OaU������)T9g�
w�3���i�D:�J7�?�CN�������d�wq��V��g�8�� oI.��PNo����-y;��l������C��yt81��v���Bo�E9pz���7Q������-F#��n� ��)�b�pF��������.d�EQ��y���T�ZUHn{�K��a"�2��B�=F�(����$�	��H�bB�
�"�������a�?FZ�d~�N���F�iGV���3�cIN��cC��,l��]��}\(58 ���P��h9�O�e]	�/�0"���$I���p��\��bSv#e{"�#����v���JX���������l��������5v
��3�^C`w��	����<:;a-5�0�0��D����C����-�����4�����}Mn���V^��s��@`�2W<����Ch��*��p�!��_0�
�;'B������|�i�Dqp��6��(`.��������[K>�,P�@�� �l]�����P&���F�5��Ni3�����y���a�����s��#����6M�Q2�)��'��]�%n@�z��R�����(�/�-2���m���>c6�#�;�G��4� �&��.A������x#x%�������B�H!:^�D`�t�^�[�-�g��9��m�^@�,��D���r�O|h���U�p%����l/���D������;qM2 ���	f�N<��6��V�F��(��&�AXy'��f���P��:���\1�l��_���,���
��c ��\d��]�5H�\/e�w�E��.��j�m����P��}���Dx ��[�.E��JJBC��F�~�p�DQ�p���;��FY������������#\ru�myj���CG��Y������H��-�I>6����.7�J��'nm1L������������{��;�H�D�BZsr�
���pA�J�x^z�$�r���	���^(:�^/B�E���V�������X�;[�~X�p^1�Z�5_^�B0HB�����L� �a�u�8���r0�[����(��.w��������9��t�n�beY�R&�{�p����j�up2�~�B�*�m�3�Q���b�������N2�������[*�jwR�e1?D�"����8N!�H��'0c~����8��F3��y�9�}k�P���m��Q�����^c���-]E��:H�ff��T��8c����������[���+��W�&�N�o����(q����'�l.#v�����������zE%!�KPTl!l-����D��\��S]-Y���[�
N3��<���+A��P��V{�8b���F��
����+�$���m��V ?��)��F�A���FP�����*���_��]&x�Za��f!,)��������������*�}�	�5spIM�J�D�e�s���i��{��������}�9���E�6Q��,<�{���x�����(=�V��v(pS���cJ��#U/�$E��p������V���[���Q��Q���v�D���m�����Z�����Q�6���
�Mt�O�%QG��u>�9��JZQr]A����D���D��Q��o�$<�5O[�M�c�o���7"�+���_q'
W�G&��b�+�~8tJ���(�0����>%����[�N��M�S����N�t�Q��,�N��,&��A����k��3E�9n����������+�1pgF��Ta���b1�r�uG& V�]�Z-.�9;��q��Ob��r�z���S�%B:�P����������?xs���:4�*iRK�������?Sy=k��d�P�l>�I~z���������_	!E�$��V6�KT�8H�����K{�qgwC-����C5���;��4��LJ>DNX}�'91���N���m%\���&��B,�t�2��8X N���FB�d
�������}!,&�K�F��wN�V20dw�rO�&XG�R��>�p������h{�`�kil��o'>�4$N�4�h$��jS�ns=��d
?'�,��1��y����9x��17�����$����O�en%r*�g�!b�X�����b�g���_��mN����4$y]�;@�"�
���T��>�1�A�$qO��0=��Y�%	�/�G�������-.�&dc$�3 �y?Q����r?��B����m����2�Y�)�S���1�E>�n8�X��T2��$��s"����
23�q�fX�lz7�9�3���Q�$��:+�������$2�3I��Ix9�/�nA�	9V�j7q�P�3�B��Q2[�K����\ZR�I������3��&�;l=��qR]{�_�f�2��I���P4X�WS��m#bU��M��6RqT�v�6L)�*�d%�,��Wp���Ve�p_�e7[����fs�fo��l�Jp�bEL�b��;`9��A�����&�\�/_�I��;>���H�(��i��8K[���Cm���N�.��X�zS���^���h�$x����t��C��D�sJ���*+mh^����F��}�y������r��|�����/�nw�����Ir�����X�}��K�8�,����(q5K^���%�a�$�k��M
��^pK���n���{�Xp�7�3�N�c";9�q:!��"<�"������\kY����9$����V��1��H�{�.����$)%�7��B����%��8�6O�%��������}E�>��'������m��n������ W��\��]���^:*��,-���>�8�/X�U�v�
,H�*��;{�qw�7���C�o� I�����Ws�u<���o�_����yB����I'��}��R�����^�#�Y�S����b��=rjR���c�o����f?n�7��7����%uJ��:8�F��e�]�`>@-JA����o�h?^Q	�*�P�_�
������!��r&Q���'
o*c�FEnQhR`#tp���f)����_�Z�������]�
nR��%����8��#���:�{n&��v&���	f�
�m%9����q��E���tV-����	&$+��U�~�J���]�;7���v}i4s]�y2�����vk���vko��
!���E���j�?������c�eK-�}
�/����9���%���/����o�4����n��>�������FJ��������4_w*T(�
y9z��V��.��%�t�:]��^��	�����%=�����s�b��i�wY�<�@vR�8�����s2��YI7��li���u��u�e���)���@���;�����*��C����/�E��=days�O?o������"����+�4��J.I����s����a�x������K2
�w����j���t.�3b�Po��,��[Xg�p��3-�!�C��{L�����mGN:	(��$��r"�>i��c9��{xY���>rT���h���#r.���IN�[��Fk���R�M%'"��{�rR����R�:�����"��'f��U��P1�����9/�aA=��o+��l��q7e�!�*���G��t1_����rzo�vZ7[[�������f����������n��?Xq3�}����zI��g*��O���.;�9Y�h�F���jh�g-�*1�r������P���S�6���r����JSh�7l��6e�P���I�~�]����@�����������?:��3�|�w�Qs.4��������>EJ����������������������;���j��m�HZ;\�G��.0��:"k�G'�T���#���R�7���^��a%��R\�|��������R4&��B~��^jv���@��������njH�z��V55T�T�����%��0�hm�)5�s��:���y(z�G��$�I�u��~�;G�\�PGH��G#6H��yc�P���_�',al�Q yZH��H�^��0��O�_G��$�p�b���Los����n3P�[��@uoS^�C�;��=	������F����LD��!x,"��}���'aNq�A��	���g��]$����8��d 
3��=Pj��,R�����H{\L��/�#y���64B�����bD��o��+h������9|�]a��UEI��X�/�-�q�����Ds�{����\ig�Z�7
�����B2�K�IZ�x]�!_/�	�#��pA��\m5m��VN�Q%Lr��e�E�v���<������6�8��g���<^���r�����a?r�8�}>
��%��\��$J7�r��s�2">��m�����J��-�����D1��S���q<?[%/��qx?�$~_��B��v�}�Z�������'2�^w�>]\�_^�O
%K�24�d�+6��o�9�?5����3���A�S�e�T������q5�D{��S�j+����|/���)6��*�FNP]���Kg�	<��H7�i���#��u�A�(�m2M��N/�8���l������#n�e��4-��sH�Qx�k(�M���D0�)��c�6v�n&�~������.)�\�����5���(I�~�9O0���NI��(��G��[�����AV�t�sM��6��l�%�2%B��
z�}���o����Y6��t)��HTG���������l��hh2���P�������P�K�=/f�{3��p�0����l���,�?��t�	����t�]o��
i�9	"O��>-F���T��Y�����1��	����C�B���j��%}aF8����������`QK��@�<�Xn����{%1�C����C����,�QX�}O(��7��u�y
�oH1�L�U�_FF�U2���_8U�8��l�m�������|`-<0�|$4�d�W��PxPVz��b>�QJtq�
�6�^Rz�T�H�����
��2d{`lN�N�M������x��}��"�,��6��G�R���}�����r����M`N0���,�p� ��j:���=�K/����X��������#��0|��sug�V�7@A��c���;�������;�*���}��mf�W@�!���V�s�9/,\�O�����A�W�%�F���F�N��
@�q�S}0=�S[s�.��B+��Sb1v�HCbi��~���T���(�
<���N��E��m�u~��~���^���d���q6��pz����� �6D��R��k��4p7>�0��� )`����(��x����<�i8��$�
��6M��@2�G9E!&�yt����x�F����?`�E���
g^�����h��Xr#�T����9h�^<	I��D�3!�"��PX\���m&�Z��������u��8��q4*���&�n��3�����Y��{r�nH6W�M���0��|u/o�OGJ��X�md���AA�%��,�
c-^���n(e
U�����F���?D��L�U����1���x�����J(��\�IG���*_�4b��,�	��ab�3��W��a��lb*4�j��a�������g��b�'����O�!��pm���L��g��%��-�����c��K4��L_��ob�e��]��k����@�������{���j�%�TE+(h��3� ��1���W����b�Fl��~���b�����Z�xe-�u����jEF�����D�mZ�.�X{����6���_�)Yc�x����d�����x^_��[yb�P���B��n�F�����Z(m�?p=7E�yM������ $N�4���/W'9��P���D�j�A�o�n��<h�n��n���z�����������$K�`8!�M�c���p>6�%�i?�v��t0���B����
��S�����6I��1x6E����p=��������J\����V���� �n6w��x��z�
W���"E[)r(a������P��������B���"��f1Y)m�A��V[O��)���j�����._z�-�C���X��{-F2G�������sv~{;H:�r�����`W��������U��7^������A�o���Hk�+Kp��u/��l���~�u�n�2[��� h�6����ve����w��;��Q�kQr����S�
�;������G5�����p�!�<�`�k�����g�0�,x��K4�[���9�e�wL$��1C;����i�H�S���y��Hb�zf���O����<J��m��l���f������s���:#�-���������g�=o	{��9�-�?�����O�^���Fp^�Pg?J�JKH�,��lf��I$�xt�J����-�a3*���HjAS�l��,�yxE#z$�I��Z�{DMl�������n(j�F)?T����]5���yV`1F^i��s�T��$�B=A�<HYm�M����E/B�*0o�V�������bi�-�e:����4<�"�.b���������23jO�M�1M��G`�n@�W|F4�������,Fx%,
|,�1��M�[�Q���������2
�ZV�m��~��%���%����Q�������OJ�s�ob���/��J�7�
�{p}����J��aL��1�4xU��`z?!3�vb�+�2&&�
��zx�=E>����;  ����G,D����e���`�16G������
q�+*���Aq8�8��+�D����'�*�;�N9j�y@?��3�G{�]��$��Oa1%�IL���l��:f���%6>�5r��5��-�?�	�6�!�Y�1h�P�TB�N�$������y]���� ��cX�������BA��3��X�����
32�������.������E�I��{�)b�a��9�E���������Z����w�S^�L[z\�0����EZ��-F�h�u@w��N�\�i��og���P�^�=�����[���fso{k��}���.OW*�r�����b~pD
g�2������K��0�g���!�#�"�h��8Kl�����H���@6�� �����<���e8W(0��"�*��������?�
0*.��H���pq.2RTC-������/����c�z�O�����]#���A���$��}hF���c$�[��)��j	����|��FS�}�vu1��|:?�z!�$j<{�����9/1f������B���Ss������Yw8%a��GZ2�����]%7Cm���7�!x��5>r��:�*��f3�t���=�����4T{]�a�E7��.�k�JD���8��H2T|HX8'���2M�.[uv���O�6p��k����7�����w)yB�Og���E�q����o�����������/�pOe��l�0+�	_���g����=Kudr=T6�Y�,������]���'l����������}b~\���']����?�G������������^����1*��:W���+�w������y���qzte.��_�����+z����}ul�s~z
5�vHM;�����I��������6j������?]^�����z�y��R{9;3���zu}yD���^QGg��Y|���s��������.��@����6�b��vV5K�A���D_13������#���.g����\���?��R}<���|tw������{��V���������i�iv���w��i���������y���;g��mC�����'��OD�fY;'f�(�{u�������Q���I�`~�t}��)~�0�����_�/�3�f�
��?C����Hg��O0f��%��������W������'.t�;f�b~;�����3�����'����/�j�]��?�U96?�Q��s�
��������{W0�o?���s����63�1/��Hi~Hd�nf	zow�����u�N(��vn��������C���v�������>�9���u�'F���[f����|~A� �2��1M��`��$�60��R�:��H-NF��G���+��K�0�FD0TOI+%.�����p�L r�/���v�P�
�1^G'm���i�%����![�3aq��d�&=�,���_��������}�G=Q���g��������7�*�^���)����7^��Z���N)}�S��8��NW��E���M������.�����9�;�'���c����	a0�d)��QA�	Bh�K0 �Q8���
�<+���y���+��Q4��������X����s?Jl��>�F��gV��xq�������E���U�n^z�n#�aD]�q�MTx%�0r���[
����S+����{G$���%Q������16w�[�-J�s���Q�SX7������Ft^��F��_���W�k��gV p��:}ne�7�L|r��
�����|j���;��;H��#�
�q���U!��?�s��r=�4��X~zx�������r��{0����wM�����j�q{]��������[����
�������t�-o�������oO��W������.X��^a�[��j�����J�����;#�W�[r]EG�7��o#����������f3n�������{�{��V�\/���\;�flj�M �2D�{C�k\v�
6��������^�M�zY�E�R����]<��~g��J>K��d�
l~F�0w���0����sAevc5+��+�2�wU�s����i?���
k�N%-{�43OHO��z1I�H�������E���\�`��F��^��!�o�j�	">P������c��"��%��Q��c%��}��.l&�c����~c�N��
�����������d6�%���]�I�8�2E��?����>���j��Vp���w��&��w| ck�8�)k�~X_�N�<��-�f����(>Pw�#�#���^.w_�B�����VR�_����� a��m�{����U�QWy/:ET7���\P4?������-����0jK�:-����O_��)#�����S��
��Y�P���|��h���}
v��u�����F��0��+������?]����Re��\���%�,9����f��f��&B{ �\<�\��_'��������g������2���!�~�s��H�V{[B\6���IcCZV4�(n���S,$X\OE����#9G�+�4�d��p�}�R=$�'D��F���;(!��]����5X��+���4r��f�(��X��$�^�� ���i�����f��9��v�`�V�����$�d��./�'���Rs�^��Q<S������F��,�M�Ixz~���f�� l��;�����&%��A}(�����or�hK��6�'rf������L�j/K������j��A���c#�`���i�Fk�������=y��\hDy�������;
�$A(5_5�bT�9���u7h������+��l$�[G�~j�(�.��zw	������������\*9oJ�eN����	){�>�n�$\���w��6���$���������&�{b�����O��P�
���������G�EG-n�W��"�"n�r�F�
�yu��\�Pch��y5����~�;|�b�����G�.ehSM+"����&�0�6�$@1[dN8�dz3d���\m����/�X�J�rU�v�4�����j�V��9�;��,vqV��	omo�7��fsk������WvT���M)b��\���Ez��X�UXA��Q�T-�j��N7��`*2�SW+`J�����T��2�w�|�:���dN��a���R5�i��b���6~��.�H^eC�����f�!��������]P��&������[��AG�6��}^��-���4�fF�A [�s=|hO��� g����%k��z���lo3H����r}5��V`3�e����������OZ��_��=����_��������W��7<�L*s������
��a��ELC�������1�hgGwT�������!�x���x1O��*^�<.��Z�1t�����+�JE��5A�-&��8��}C��+�y5�=����
�������h���[[�j~W�E���4�3kw�l��s��~~�;��?_M�iv����P�c���~�����L~��/���n������������x6DEH��or�	ZL�e�
��v'��f9c���p,��N6��:�]����ye
E��(������!��E�&$9���Y�L�j�!��������l~�FI8���)��o����O]�'`$�A��������ha�"�b(�s:l�%�"��M_TC�1=��� A�Hf{%���E&id�;�Hk��VG�QsL�9�N�w����'���P������*&�@����� ��Y���C��b���g�;����L�Ja�Lg������w����=`d��/r�O���.���N*�� Q�S�BdP�U��h��L�Z�(=�,�������D��C�HGa\��u��+�]����}�8�at��!�#&�?��p��m�9#.1��	=p/X�$��*�9������R��c��f��\2�
V��I�f�J,�������V~S8h����{`$�Vk�`�_���;�Y�@t/T%���8�|IV�#	��z���O�O����.��9#:3�0��	#�|:���S�K!m���g��!�d�`
2��P��7+P�8t�L�F��7��i�Z��h��i5�q������f`	��`��u���Fw��0[|IG��5/b�cqbR�b��8���R�Xs�dw
i�#p��<Y����3s?�`]L��{>�����f��\ql�X�(��3��������`&?'���y�=I�.5"�|�@�����bB���!|��j�S��7�a���u�Y�e���
����w� }�7@�Q�>>����aN��|R��sM��bD#���t3��0-|+8e0#f�[��iqy�{i��!��{�t�YL-�9��x�
�.b�?��Ld���x�/&#���X��7�e�`��5�w�|x�`Mqp-��Q�
�I��]+���9��.����Kc>$��'�$������` n"�a��!f�&�y���h������%������u�9���`1�����	�S�"��H�_A�m��/�+y�mN�Y/����� ��tpqt����q�81��F�a%�� ����������Z�nR?K;h|u�d�_�#2�G�X�Y��VX
Q�������2s0��6��p��l*�*{0���b��e��9����>
� ��>�!��M6(�M��G�`������+OB�7m�
�'|HN�K`>N���+�lzld����R�P�����'�F<�-�[������(
������&������l�Kwh�Q�i.:��Dq�)��L)84�O'�k��~�H��0�fK�}��0i|r���1=3��LV��h�@����y�Z�'
�27�7,����3����K����A�q��L��{��9V.��f1��Ln����a���y-�,_4��'�:��3
���M���(:%m�B�"���J��8�^<�ZN���k��������5������Y����|�o�	�Cp1	���~��Yp����0�Fb�Ku+#�'������8��B�N��8O�Q}-���������BW��y�G������@bg��Y�@���[��|����L
E��%J�jQ0��M*AA�LY�"=:W,���&B� ��H+�S����s��`�r�,��q��F�/��M'��������D|1e�r)��X].`��a�Iq��ge%}Q��Q������t��u�8��b���/�"n���E�K�'����@����{qy~�n�48H^����3z���N�s���P�����m��\y��tf�H�T#0odl�f���h���'+����gn���?��;A���/Z����Y��t���8��7�����Lt#p :��CC�D����z�lgE�I9f������$d:��b(&
"\1�n�6����U�pf��*6?S�Yn�!����U6z�\���\\�y�|��{���C��+I\e�*�"�N�0`�����K8��?3��_����hk�SW�1�ykjD,�CD�;2�0S�K�i����a� [�D� :��$�'�?��n��H�Z�aG63�
�F�� 64&�1����c��fO��[����:<��#�<���u����F�#I�#��x��+�����S�v�� ��?{)=�������/vmD'f���G
>��y1�&��HZ���T���;D�[��B	>^!1�Z�hwU� ��H�c �]C[}��>���(K�|A\l�/}T&��(��
�s!bP]�.�lz����$�����N8
U�x��Mrk&�\�W��u��1�����*���U ��A�N��������FO�|���� X/r�k�����/����,;�+f���}�hh4���u�}vR�����hwll�m�����6�yD�����}|8���?����};�^��z6����	�b�?�9C���u��#����D�q�j�~zx��d�2`<�j��j����u��c�2����>�~E�9M��h�_Y�67Y��������	[?o���e�P��v��$I+�������N�Q�����<��`��9�l�]{v�>z�}�9=}wt|}~Y����z���s��xe��yX����U7F��x@����XTQs�.��e�
(�J�o��b���4�,(�����s�B�G@���x����D.>=:y��i���F��3J�.D?������ ���t��jM8�z��d�
�<;2��������!�E13����Dk�[��f����#)��� ��|�g)$G|���!��<�'K���U�$�T@�5��+IB{�������d��u+��
+!>*�{(o�	��2f����������"Q����u�)FB���wl��u8vA&"����)Y�S����y%�C%f��`8�:1v�a�v�P�a?�B��"v��35���G�_���c@Q5=��)9���4GKkw�y�jd
����}*Tm���x�����T^���Fxt���fnr��P��!���\H�b=%��^������o�����d��:X�I|����O��F����c����>s�C�O����Y��u���c�cb�q��ir7"���_��;������;0�8����l(��}q�������S��q=�!JW
��;��y�xx����&8 ��u��������6�G1
���fR5������1~k�rL���D
E����X��M�Z������VvG�J����*�&c��%�~�%l��X�W5+�.f=�dH��K�{,�����������m�	������Y��kC�3�0{9���/���'(���;�.YUQ�@}`��<��c
Bs�x���o�N�Q ��~�N����(\a���h����X����e�>s�������N����L/��b�z���F=�Y$EB�dzO�����G�6�A����Py�86�J? \�����s�P������7�z$g|��g}s~� aV~&���m��&mX{�����r�t���YX�f��e�7q�3���>.�)�g��������VT7���2yh���ZL q��aK��)�Em�b��F�gS��������P�9%����Y�}��n�2��4�ve^F��t���)��~�����%�v�.�_y�v�������\k����(����*�+46�����-M�!5��6Z���{�%+}���!�y�5��ZIp!����5{<�/}CM�f�e�fh��H��6]i
��z����>nI�p��P2��#����P3���z����n�T78��b������8����
�@��������n�r���b?�e���.����U����$��l6�7��^I@��E�F��J1���A��S����fk����c�(�$'�����M0|��H����iO"N���������#�rjk<6���>��3�T��/�+���R5Q��=�M����R}{�n_~��,�����(�/K����xM0�E/�:nK�W&��eT�����7�*�Q_�����hx��f����������lFx��#�a��1W�&��6r�1_�P����Q������Ne(�l9
������?F]1�]�}~�����VU#�H��3�;���C�__iRJ{����vE+K�����FB����i�0��t�U4�D�F���������
��A���FF��W��6+��\�l�*�����iJ�U���L�lW}:����$��U�,�,F�9���&�K�[,��[�9���k����GgU�����a�1/���nBr�)h2)o���~E���*�4tX����V��=jU4�hh���GC��/�4�S����v���4T5�!
UMt����:����i��@<j�1���%`HSQ0�|�P�����#3��X<��Do������E�V����ydtu������}�����W�(�N�y���
�&-��)��B��?�u0������:= ������d>����I�����v�A�T�F�`T��yT�>v1;fn��cSvgw��D-3C���[��D��n����1�C����W�7��3'Mx��c�=���ig�s�A�����G	f�������J=��(�|8���Hg��t�h��j�ft`�n�m���l��LO�W7s�����!3��d����~���&<s�1����g���3�?�3�k����#����o���|%�����G	�}��Z	�LR�l��l��M0w{v����p&v�&n�0��?W;U7S7Qo�&:M�`�&�$M�s4�M��Y�#7��|�%���
tp�d��(?{671E����f�������7�	?j~sSd�����2�d��t���:Y|�'=�d�/<Y���,�W8Y��;���?o��GO���}���+�\]l��A�.|��Z��S�2K�������V+n67{�VoPR������<iC��m*���-����&K�N������������i��2b�&��'�/F��t!��:�M��:Mg�e{�{�e�>�e��f���u����Z�E�^��G���K��lq�%f��+�g%{���a�[��������R*?���Va����O������Xe]d(_�(��"
�3Z��5��.f�kO���*���Wh�����-JZ�����km�6��ak/����e}9FY+Bt�9�+?Z��+�|!�_���(ne�:D2��� X�>`*)�d����R���3���\�a���O��������������a���-�$�/4���)F��R�a��W����2����U����%���xy8*��a������=r�u�|e�{�������F.���=�"�������~��T���o��P�/{�fk�5�j5������ZkP����m�%��!D�a_v�/E���n['@W�j��Oi'HOa���\+�G�������^��+�7�����v��
r��>��������0
���j�;�����f��d�!������<�y���	�*�rJKT3_lhf<�R����g�cf�����!�f������d������������7\�5�E�xh����G<K�!��O���h��ezOB�����[�\|���VH�
�_�.L������M�����t���d������6�N�gH��L"�Lm�+���E��^b�O(��,������2zy?�r^K�U�#A�o�o�]r��[���������l7�����do�h>]���m��yH��6s��������L�uW���t����*�
)���2�8/��aEns���)�8�"eC19t���1\fk�a$��p��0R�#	���s��^v��^���g����ug}}���������h�Oi-�B
~9����i���Y�e]�.2 7q~|V�-iKi2@�Y:W�B�X�5���)i��1U����5\���������,y�7;����/Hr��������	6�l;�
�`�?��k6�������AU#h$%� �`���8�G����6'����-�U����O��������f�<�G��s�[�9�ly����$�N�aq%��]����DaIh97�'$�"��\���3���y)C8&�����^n���pBs��<��p(g��Nck�d��w�a�!c������a
��-�@���|O6A)�-�2�D@X#�r������9�H5�+�K�rR��<�63(������sH_=��~�>p���R�W���+�0'���"�����~�	�fR����P�8��E&Ej�(Hc�^�6Z�|]L>O�����p�����������Hbf:L8��'X�������]qPG�Ft�DjR����S�)���m,���b�=���e.�N��������O��`�nU�d�!O��*?���!G��z;��1��n�	���&�k��7_K�������<q�U�:�>�9�i6���d+y�8�z�<M�6\��q5��2p8O��D��X��W/(����vu.�-�
M-�O�^)�M8�-(���;a�!Y���%~�g��Z�E�P��(��J����B��BgG	���=�J��s'�����q�SrUM�������!������S��v+�g��ge]��(�����N~������}"�e(V`V����R�Dk'����M���}x�l��.���aJ�Q���kJ�O��x;��v	��a������(�i:{Lt<���oA%�����9���B2���X���e����}S��c�*c���]/�Y<V�V�m���j��8-D*w�_�?��%�[�c��x����V�7��u�*�J�_|���)wWI�w�k��v3>�O��q���(�����A��x��s����/O�k�����F����m���'��(��'�I�>t�>Y�95��QW����
%Qt��>��{oL���+?W>����A/�(��j��0M�sR�n�'���OJ��F��sY��U�;��T
���C6���W��9��5
���~����K������O��j,��v���g������P*zE���I6<�Wy�x� ���q%���cA��
���&��~��������c��T��\;2��5`G(-pp�zf']��pEq��|��=�%��bf�s|{[p��y��~?����>��Xa,�+	g�7(�����>w�*UiW���L������
�W������_Ly-����ZiL����*�����^���D������Z�1�J���'�2
#J�]�F�./�D5�L3.�Ft-z`��LZ)pK�S`�~���;d��Q��/�L�,�U���[o#���
T��T�r�\��ee���b�*7K��\�;��z�=*&���P4�{0��������!]��{�`g{	f��l�Z����8�M�����r��79b��um���p������~Mf3S�]�����?�����&�kf�O����������a��A�?8xl2������$�����08�h�~H�)9�;�� �'I�����e�{��4��C�?��{���W7����v/���B�N��n��=r�w�s�o�pX����^_QM���N1���s�DXGI�V�P�*L����0K=k5��g��o��D6
#14Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#1)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 28 August 2014 03:43, Peter Geoghegan <pg@heroku.com> wrote:

The patch currently lacks a way of referencing datums rejected for
insertion when updating. The way MySQL handles the issue seems
questionable. They allow you to do something like this:

INSERT INTO upsert (key, val) VALUES (1 'val') ON DUPLICATE KEY UPDATE
val = VALUES(val);

The implication is that the updated value comes from the INSERT's
VALUES() list, but emulating that seems like a bad idea. In general,
at least with Postgres it's entirely possible that values rejected
differ from the values appearing in the VALUES() list, due to the
effects of before triggers. I'm not sure whether or not we should
assume equivalent transformations during any UPDATE before triggers.

This is an open item. I think it makes sense to deal with it a bit later.

IMHO it is impossible to know if any of the other code is correct
until we have a clear and stable vision of what the command is
supposed to perform.

The inner workings are less important than what the feature does.

FWIW, the row available at the end of all BEFORE triggers is clearly
the object we should be manipulating, not the original VALUES()
clause. Otherwise this type of INSERT would behave differently from
normal INSERTs. Which would likely violate RLS, if nothing else.

As I mentioned, I have incorporated feedback from Kevin Grittner. You
may specify a unique index to merge on from within the INSERT
statement, thus avoiding the risk of inadvertently having the update
affect the wrong tuple due to the user failing to consider that there
was a would-be unique violation within some other unique index
constraining some other attribute. You may write the DML statement
like this:

INSERT INTO upsert(key, val) VALUES(1, 'insert') ON CONFLICT WITHIN
upsert_pkey UPDATE SET val = 'update';

I think that there is a good chance that at least some people will
want to make this mandatory. I guess that's fair enough, but I
*really* don't want to *mandate* that users specify the name of their
unique index in DML for obvious reasons. Perhaps we can come up with a
more tasteful syntax that covers all interesting cases (consider the
issues with partial unique indexes and before triggers for example,
where a conclusion reached about which index to use during parse
analysis may subsequently be invalidated by user-defined code, or
ambiguous specifications in the face of overlapping attributes between
two unique composite indexes, etc). The Right Thing is far from
obvious, and there is very little to garner from other systems, since
SQL MERGE promises essentially nothing about concurrency, both as
specified by the standard and in practice. You don't need a unique
index at all, and as I showed in my pgCon talk, there are race
conditions even for a trivial UPSERT operations in all major SQL MERGE
implementations.

Surely if there are multiple unique indexes then the result row must
be validated against all unique indexes before it is allowed at all?

The only problem I see is if the newly inserted row matches one row on
one unique value and a different row on a different unique index.
Turning the INSERT into an UPDATE will still fail on one or other, no
matter which index you pick. If there is one row for ALL unique
indexes then it is irrelevant which index you pick. So either way, I
cannot see a reason to specify an index.

If we do need such a construct, we have already the concept of an
IDENTITY for a table, added in 9.4, currently targeted at replication.
Listing indexes or columns in the DML statement is more pushups for
developers and ORMs, so lets KISS.

The way forwards, in my view, is to define precisely the behaviour we
wish to have. That definition will include the best current mechanism
for running an UPSERT using INSERT/UPDATE/loops and comparing that
against what is being provided here. We will then have a functional
test of equivalence of the approaches, and a basis for making a
performance test that shows that performance is increased without any
loss of concurrency.

Once we have that, we can then be certain our time spent on internals
is not wasted by overlooking a simple userland gotcha.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#15Robert Haas
robertmhaas@gmail.com
In reply to: Simon Riggs (#14)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 10:12 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

IMHO it is impossible to know if any of the other code is correct
until we have a clear and stable vision of what the command is
supposed to perform.

+1.

The inner workings are less important than what the feature does.

+1.

FWIW, the row available at the end of all BEFORE triggers is clearly
the object we should be manipulating, not the original VALUES()
clause. Otherwise this type of INSERT would behave differently from
normal INSERTs. Which would likely violate RLS, if nothing else.

+1.

Surely if there are multiple unique indexes then the result row must
be validated against all unique indexes before it is allowed at all?

The only problem I see is if the newly inserted row matches one row on
one unique value and a different row on a different unique index.
Turning the INSERT into an UPDATE will still fail on one or other, no
matter which index you pick. If there is one row for ALL unique
indexes then it is irrelevant which index you pick. So either way, I
cannot see a reason to specify an index.

Failure could be the right thing in some cases. For example, imagine
that a user has a table containing names, email addresses, and (with
apologies for the American-ism, but I don't know what would be
comparable elsewhere) social security numbers. The user has unique
indexes on both email addresses and SSNs. If a new record arrives for
the same email address, they want to replace the existing record; but
a new record arrives with the same SSN, they want the transaction to
fail. Otherwise, a newly-arrived record might overwrite the email
address of an existing record, which they never want to do, because
they view email address as the primary key.

I think this kind of scenario will actually be pretty common.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#16Simon Riggs
simon@2ndquadrant.com
In reply to: Robert Haas (#15)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 25 September 2014 15:35, Robert Haas <robertmhaas@gmail.com> wrote:

The only problem I see is if the newly inserted row matches one row on
one unique value and a different row on a different unique index.
Turning the INSERT into an UPDATE will still fail on one or other, no
matter which index you pick. If there is one row for ALL unique
indexes then it is irrelevant which index you pick. So either way, I
cannot see a reason to specify an index.

Failure could be the right thing in some cases. For example, imagine
that a user has a table containing names, email addresses, and (with
apologies for the American-ism, but I don't know what would be
comparable elsewhere) social security numbers. The user has unique
indexes on both email addresses and SSNs. If a new record arrives for
the same email address, they want to replace the existing record; but
a new record arrives with the same SSN, they want the transaction to
fail. Otherwise, a newly-arrived record might overwrite the email
address of an existing record, which they never want to do, because
they view email address as the primary key.

I agree with your example, but not your conclusion.

If a new record arrives with a new email address that matches an
existing record it will fail. There is a case that would be allowed,
which would be a record that creates an entirely new email address. So
you do have a point to argue from.

However, IMV enforcing such a restriction should be done with an After
trigger, which is already possible, not by complicating a DML
statement with information it shouldn't need to know, or that might
change in the future.

Let's keep this new feature as simple as possible. ORMs everywhere
need to be encouraged to implement this and they won't do it unless it
is bone simple to use.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#17Robert Haas
robertmhaas@gmail.com
In reply to: Simon Riggs (#16)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 11:21 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

On 25 September 2014 15:35, Robert Haas <robertmhaas@gmail.com> wrote:

The only problem I see is if the newly inserted row matches one row on
one unique value and a different row on a different unique index.
Turning the INSERT into an UPDATE will still fail on one or other, no
matter which index you pick. If there is one row for ALL unique
indexes then it is irrelevant which index you pick. So either way, I
cannot see a reason to specify an index.

Failure could be the right thing in some cases. For example, imagine
that a user has a table containing names, email addresses, and (with
apologies for the American-ism, but I don't know what would be
comparable elsewhere) social security numbers. The user has unique
indexes on both email addresses and SSNs. If a new record arrives for
the same email address, they want to replace the existing record; but
a new record arrives with the same SSN, they want the transaction to
fail. Otherwise, a newly-arrived record might overwrite the email
address of an existing record, which they never want to do, because
they view email address as the primary key.

I agree with your example, but not your conclusion.

If a new record arrives with a new email address that matches an
existing record it will fail. There is a case that would be allowed,
which would be a record that creates an entirely new email address. So
you do have a point to argue from.

However, IMV enforcing such a restriction should be done with an After
trigger, which is already possible, not by complicating a DML
statement with information it shouldn't need to know, or that might
change in the future.

I've never been a fan of putting the index name in there. I agree
that's stuff that a DML statement shouldn't need to know about. What
I've advocated for in the past is specifying the list of columns that
should be used to determine whether to insert or update. If you have
a match on those columns, update the row; else insert. Any other
unique indexes stand or fall as may be.

I still think that idea has merit.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#18Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#1)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 28 August 2014 03:43, Peter Geoghegan <pg@heroku.com> wrote:

"Value locking"
===========

To date, on-list discussion around UPSERT has almost exclusively
concerned what I've called "value locking"; the idea of locking values
in unique indexes in the abstract (to establish the right to insert
ahead of time). There was some useful discussion on this question
between myself and Heikki back around December/January. Ultimately, we
were unable to reach agreement on an approach and discussion tapered
off. However, Heikki did understand the concerns that informed by
design. He recognized the need to be able to easily *release* value
locks, so as to avoid "unprincipled deadlocks", where under high
concurrency there are deadlocks between sessions that only UPSERT a
single row at a time. I'm not sure how widely appreciated this point
is, but I believe that Heikki appreciates it. It is a very important
point in my opinion. I don't want an implementation that is in any way
inferior to the "UPSERT looping subxact" pattern does (i.e. the plpsql
thing that the docs suggest).

When we left off, Heikki continued to favor an approach that involved
speculatively inserting heap tuples, and then deleting them in the
event of a conflict. This design was made more complicated when the
need to *release* value locks became apparent (Heikki ended up making
some changes to HeapTupleSatisfiesDirty(), as well as sketching a
design for what you might call a "super delete", where xmin can be set
to InvalidTransactionId for speculatively-inserted heap tuples). After
all, it wasn't as if we could abort a subxact to release locks, which
is what the "UPSERT looping subxact" pattern does. I think it's fair
to say that that design became more complicated than initially
anticipated [4] [5].

Anyway, the greater point here is that fundamentally, AFAICT Heikki
and I were in agreement. Once you buy into the idea that we must avoid
holding on to "value locks" of whatever form - as Heikki evidently did
- then exactly what form they take is ultimately only a detail.
Granted, it's a very important detail, but a detail nonetheless. It
can be discussed entirely independently of all of this new stuff, and
thank goodness for that.

If anyone finds my (virtually unchanged) page heavyweight lock based
value locking approach objectionable, I ask that the criticism be
framed in a way that makes a sharp distinction between each of the
following:

1. You don't accept that value locks must be easily released in the
event of a conflict. Is anyone in this camp? It's far from obvious to
me what side of this question Andres is on at this stage, for example.
Robert might have something to say here too.

2. Having taken into account the experience of myself and Heikki, and
all that is implied by taking that approach ***while avoiding
unprincipled deadlocks***, you continue to believe that an approach
based on speculative heap insertion, or some alternative scheme is
better than what I have done to the nbtree code here, or you otherwise
dislike something about the proposed value locking scheme. You accept
that value locks must be released and released easily in the event of
a conflict, but like Heikki you just don't like what I've done to get
there.

Since we can (I believe) talk about the value locking aspect and the
rest of the patch independently, we should do so...unless you're in
camp 1, in which case I guess that we'll have to thrash it out.

I'm trying to understand and help out with pushing this patch forwards
to completion.

Basically, I have absolutely no idea whether I object to or agree with
1) and don't know where to look to find out. We need a clear
exposition of design and the alternatives.

My approach would be to insert an index tuple for that value into the
index, but with the leaf ituple marked with an xid rather than a ctid.
If someone tries to insert into the index they would see this and wait
for the inserting transaction to end. The inserting transaction would
then resolve what happens in the heap (insert/update) and later
repoint the index tuple to the inserted/updated row version. I don't
see the need for page level locking since it would definitely result
in deadlocks (e.g. SQLServer).

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#19Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#18)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 11:17 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

Basically, I have absolutely no idea whether I object to or agree with
1) and don't know where to look to find out. We need a clear
exposition of design and the alternatives.

My approach would be to insert an index tuple for that value into the
index, but with the leaf ituple marked with an xid rather than a ctid.
If someone tries to insert into the index they would see this and wait
for the inserting transaction to end. The inserting transaction would
then resolve what happens in the heap (insert/update) and later
repoint the index tuple to the inserted/updated row version. I don't
see the need for page level locking since it would definitely result
in deadlocks (e.g. SQLServer).

The page level locks are only used to prevent concurrent insertion for
as long as it takes to get consensus to proceed among unique indexes,
and to actually insert a heap tuple. They're all released before we
lock the tuple for update, should we take that path (yes, really).
This is consistent with the behavior of other systems, I think. That's
my whole reason for preferring to do things that way. If you have a
"promise tuples" approach - be it what you outline here, or what
Heikki prototyped with heap tuple insertion, or any other - then you
need a way to *release* those "value locks" in the event of a
conflict/needing to update, before locking/updating. Otherwise, you
get deadlocks. This is an issue I highlighted when it came up with
Heikki's prototype.

AFAICT, any scheme for "value locking" needs to strongly consider the
need to *release* value locks inexpensively. Whatever else they do,
they cannot persist for the duration of the transaction IMV.

Does that make sense? If not, my next suggestion is applying an
earlier revision of Heikki's prototype, and seeing for yourself how it
can be made to deadlock in an unprincipled/impossible to prevent way
[1]: /messages/by-id/52B4AAF0.5090806@vmware.com -- Peter Geoghegan
pattern as something that this needs to be better than in every way.
This is one important way in which we might fail to live up to that
standard.

[1]: /messages/by-id/52B4AAF0.5090806@vmware.com -- Peter Geoghegan
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#20Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#15)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 7:35 AM, Robert Haas <robertmhaas@gmail.com> wrote:

On Thu, Sep 25, 2014 at 10:12 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

IMHO it is impossible to know if any of the other code is correct
until we have a clear and stable vision of what the command is
supposed to perform.

+1.

The inner workings are less important than what the feature does.

+1.

FWIW, the row available at the end of all BEFORE triggers is clearly
the object we should be manipulating, not the original VALUES()
clause. Otherwise this type of INSERT would behave differently from
normal INSERTs. Which would likely violate RLS, if nothing else.

+1.

I agree with all of this. I'm glad that my opinion on how a
CONFLICTING() expression interacts with BEFORE triggers is accepted,
too.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#21Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#17)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 9:20 AM, Robert Haas <robertmhaas@gmail.com> wrote:

I've never been a fan of putting the index name in there.

Me neither. Although I do understand Kevin's concern about the user's
intent surrounding which unique index to merge on.

I agree
that's stuff that a DML statement shouldn't need to know about. What
I've advocated for in the past is specifying the list of columns that
should be used to determine whether to insert or update. If you have
a match on those columns, update the row; else insert. Any other
unique indexes stand or fall as may be.

I still think that idea has merit.

As I've said, my problem with that idea is the corner cases. Consider
the possible ambiguity. Could DML queries in production start failing
("ambiguous unique index specification") because the DBA created a new
unique index on attributes that somewhat overlap the attributes of the
unique index that the DML author actually meant? What about the
effects of BEFORE triggers, and their interaction with partial unique
indexes? If you can describe an exact behavior that overcomes these
issues, then I'll give serious consideration to implementing it. As
things stand, to be perfectly honest it sounds like a footgun to me.
There are interactions that make getting it right very ticklish.

I don't want to make a unique index specification mandatory because
that's ugly - that's the only reason, TBH. However, while what you
describe here accomplishes the same thing without being ugly, it is
potentially very surprising. Naming the unique index directly has the
great advantage of very clearly demonstrating user intent.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#22Robert Haas
robertmhaas@gmail.com
In reply to: Simon Riggs (#18)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 2:17 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

1. You don't accept that value locks must be easily released in the
event of a conflict. Is anyone in this camp? It's far from obvious to
me what side of this question Andres is on at this stage, for example.
Robert might have something to say here too.

2. Having taken into account the experience of myself and Heikki, and
all that is implied by taking that approach ***while avoiding
unprincipled deadlocks***, you continue to believe that an approach
based on speculative heap insertion, or some alternative scheme is
better than what I have done to the nbtree code here, or you otherwise
dislike something about the proposed value locking scheme. You accept
that value locks must be released and released easily in the event of
a conflict, but like Heikki you just don't like what I've done to get
there.

Since we can (I believe) talk about the value locking aspect and the
rest of the patch independently, we should do so...unless you're in
camp 1, in which case I guess that we'll have to thrash it out.

I'm trying to understand and help out with pushing this patch forwards
to completion.

Basically, I have absolutely no idea whether I object to or agree with
1) and don't know where to look to find out. We need a clear
exposition of design and the alternatives.

I laughed when I read this, because I think a lot of the discussion on
this topic has been unnecessarily muddled by jargon.

My approach would be to insert an index tuple for that value into the
index, but with the leaf ituple marked with an xid rather than a ctid.
If someone tries to insert into the index they would see this and wait
for the inserting transaction to end. The inserting transaction would
then resolve what happens in the heap (insert/update) and later
repoint the index tuple to the inserted/updated row version. I don't
see the need for page level locking since it would definitely result
in deadlocks (e.g. SQLServer).

I think that something like this might work, but the devil is in the
details. Suppose two people try to upsert into the same table at the
same time. There's one index. If the transactions search that index
for conflicts first, neither sees any conflicting tuples, and both
proceed. That's no good. OK, so suppose each transaction inserts the
special index tuple which you mention, to lock out concurrent inserts
of that value, and then searches for already-existing conflicts. Each
sees the other's tuple, and they deadlock. That's no good, either.

Also, I think there are other cases where we think we're going to
insert, so we put the special index tuple in there, but then we decide
to update, so we don't need the promise tuple any more, but other
sessions are potentially still waiting for our XID to terminate even
though there's no conflict any more. I'm having a hard time bringing
the details of those cases to mind ATM, though.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#23Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#22)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 12:11 PM, Robert Haas <robertmhaas@gmail.com> wrote:

I think that something like this might work, but the devil is in the
details. Suppose two people try to upsert into the same table at the
same time. There's one index. If the transactions search that index
for conflicts first, neither sees any conflicting tuples, and both
proceed. That's no good. OK, so suppose each transaction inserts the
special index tuple which you mention, to lock out concurrent inserts
of that value, and then searches for already-existing conflicts. Each
sees the other's tuple, and they deadlock. That's no good, either.

I'm very glad that you share my concern about deadlocks like this.

Also, I think there are other cases where we think we're going to
insert, so we put the special index tuple in there, but then we decide
to update, so we don't need the promise tuple any more, but other
sessions are potentially still waiting for our XID to terminate even
though there's no conflict any more. I'm having a hard time bringing
the details of those cases to mind ATM, though.

Well, you might have a promise tuple in a unique index on attributes
not appearing in the UPDATE's targetlist, for one. You have the other
session waiting (doesn't have to be an upserter) just because we
*thought about* inserting a value as part of an upsert. That's pretty
bad.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#24Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#14)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 7:12 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

The way forwards, in my view, is to define precisely the behaviour we
wish to have. That definition will include the best current mechanism
for running an UPSERT using INSERT/UPDATE/loops and comparing that
against what is being provided here. We will then have a functional
test of equivalence of the approaches, and a basis for making a
performance test that shows that performance is increased without any
loss of concurrency.

That sounds very reasonable. While I'm sure that what I have here can
decisively beat the xact looping pattern in terms of performance as
measured by pgbench, the real performance advantage is that this
approach doesn't burn through XIDs. That was a concern that Andres
highlighted in relation to using the subxact looping pattern with
BDR's multi-master replication conflict resolution.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#25Simon Riggs
simon@2ndquadrant.com
In reply to: Robert Haas (#22)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 25 September 2014 20:11, Robert Haas <robertmhaas@gmail.com> wrote:

My approach would be to insert an index tuple for that value into the
index, but with the leaf ituple marked with an xid rather than a ctid.
If someone tries to insert into the index they would see this and wait
for the inserting transaction to end. The inserting transaction would
then resolve what happens in the heap (insert/update) and later
repoint the index tuple to the inserted/updated row version. I don't
see the need for page level locking since it would definitely result
in deadlocks (e.g. SQLServer).

I think that something like this might work, but the devil is in the
details. Suppose two people try to upsert into the same table at the
same time. There's one index. If the transactions search that index
for conflicts first, neither sees any conflicting tuples, and both
proceed. That's no good. OK, so suppose each transaction inserts the
special index tuple which you mention, to lock out concurrent inserts
of that value, and then searches for already-existing conflicts. Each
sees the other's tuple, and they deadlock. That's no good, either.

The test index is unique, so our to-be-inserted value exists on only
one page, hence page locking applies while we insert it. The next
person to insert waits for the page lock and then sees the test tuple.

The page lock lasts only for the duration of the insertion of the
ituple, not for the whole operation.

Also, I think there are other cases where we think we're going to
insert, so we put the special index tuple in there, but then we decide
to update, so we don't need the promise tuple any more, but other
sessions are potentially still waiting for our XID to terminate even
though there's no conflict any more. I'm having a hard time bringing
the details of those cases to mind ATM, though.

We make the decision to INSERT or UPDATE based upon what we find in
the test index. If a value if there already, we assume its an UPDATE
and go to update the row this points to. If it has been deleted we
loop back and try again/error. If the value is not present, we insert
the test tuple and progress as an INSERT, then loop back later to set
the ctid. There is no case of "don't need promise id anymore". We
would use the PK, identity or first unique index as the test index.
There is a case where an UPSERT conflicts with an INSERT causing the
latter to abort.

Anyway, this is why we need the design more clearly exposed, so you
can tell me I'm wrong by showing me the URL of it done right.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#26Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#21)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 25 September 2014 19:59, Peter Geoghegan <pg@heroku.com> wrote:

On Thu, Sep 25, 2014 at 9:20 AM, Robert Haas <robertmhaas@gmail.com> wrote:

I've never been a fan of putting the index name in there.

Me neither. Although I do understand Kevin's concern about the user's
intent surrounding which unique index to merge on.

The use case cited is real. My solution of using an after trigger
works yet without adding specific functionality to this command. So we
can achieve what users want without complicating things here.

If we do decide we really want it, lets add it as a later patch.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#27Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#24)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 25 September 2014 20:38, Peter Geoghegan <pg@heroku.com> wrote:

On Thu, Sep 25, 2014 at 7:12 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

The way forwards, in my view, is to define precisely the behaviour we
wish to have. That definition will include the best current mechanism
for running an UPSERT using INSERT/UPDATE/loops and comparing that
against what is being provided here. We will then have a functional
test of equivalence of the approaches, and a basis for making a
performance test that shows that performance is increased without any
loss of concurrency.

That sounds very reasonable.

So I promise not to discuss locking until we get the first things done.

My suggested approach to get this committed is...

A. UPDATE/INSERT privilege infrastructure.
Add tests to it, make it separately committable, so we can get that done.
Submit to Oct CF; get that done early.

B. Agree command semantics by producing these things
* Explanatory documentation (Ch6.4 Data Manipulation - Upsert)
* SQL Reference Documentation (INSERT)
* Test cases for feature
* Test cases for concurrency
* Test cases for pgbench

All of the above, as a separate committable patch. I hate the fact
that you have written no user facing documentation for this feature.
How can anyone tell whether the tests you've written are correct or
even consistent to a particular definition of correctness?
Submit as patch for review only to Oct 15 CF
We then agree what is required for further work
At this stage, poll the Django and Rails communities for acceptance
and early warning of these features. Listen.

C. Internal weirdness
Submit C based upon earlier agreed B, submit to Dec 15 CF, major patch
deadline, so we can fine tune for last CF.
Then Heikki rewrites half your patch in a better way, you thank him
and then we commit. All done.

While I'm sure that what I have here can
decisively beat the xact looping pattern in terms of performance as
measured by pgbench, the real performance advantage is that this
approach doesn't burn through XIDs. That was a concern that Andres
highlighted in relation to using the subxact looping pattern with
BDR's multi-master replication conflict resolution.

But we're still discussing SQL semantics. So first things first, then
loop back around, hoping our design has not been concurrently
deleted...

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#28Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#25)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 1:21 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

The test index is unique, so our to-be-inserted value exists on only
one page, hence page locking applies while we insert it. The next
person to insert waits for the page lock and then sees the test tuple.

The page lock lasts only for the duration of the insertion of the
ituple, not for the whole operation.

(by page lock, I take it you mean buffer lock - converting that into a
page hwlock is what I do).

This is where it gets quite complicated. What happens if row locking
on upsert finds a conflict update changing uniquely-constrained
attributes? Sure, a vanilla non-HOT update will fail on inserting a
unique index tuple, but *it* can still cause us a row-level conflict,
and *it* can only fail (with a dup violation) when we commit/abort.
But now we're obligated to wait on it to get the row lock, and it's
obligated to wait on us to get the promise tuple lock, or any other
sort of "value lock" that hasn't already been released when we go to
row lock. Deadlock.

You cannot get away with failing to release the promise tuple/value
lock if you want to maintain useful guarantees.

It doesn't need to be a vanilla non-HOT update. That's just the
simplest example I can think of.

Also, I think there are other cases where we think we're going to
insert, so we put the special index tuple in there, but then we decide
to update, so we don't need the promise tuple any more, but other
sessions are potentially still waiting for our XID to terminate even
though there's no conflict any more. I'm having a hard time bringing
the details of those cases to mind ATM, though.

We make the decision to INSERT or UPDATE based upon what we find in
the test index. If a value if there already, we assume its an UPDATE
and go to update the row this points to. If it has been deleted we
loop back and try again/error.

Sure, you can throw an error, and that makes things a lot easier. It
also implies that the implementation is inferior to the subxact
looping pattern, which you've already implied is a thing we must beat
in every way. Frankly, I think it's a cop-out to just throw an error,
and I don't think it'll end up being some theoretical risk. It'll
happen often if it is allowed to happen at all. Allowing it to happen
almost defeats the purpose of the feature - the big appeal of the
feature is that it makes guarantees about the outcome.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#29Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#27)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 1:48 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

A. UPDATE/INSERT privilege infrastructure.
Add tests to it, make it separately committable, so we can get that done.
Submit to Oct CF; get that done early.

Makes sense. As long as we assume that we want a unified syntax like
this - that is, that we need something vaguely insert-update or
update-insertish - then we need this. Unfortunately, we cannot add
regression tests for this without almost the full patch set.

B. Agree command semantics by producing these things
* Explanatory documentation (Ch6.4 Data Manipulation - Upsert)
* SQL Reference Documentation (INSERT)
* Test cases for feature
* Test cases for concurrency
* Test cases for pgbench

Okay. I do have stress-tests, that are separately maintained, in case
you missed that:

https://github.com/petergeoghegan/upsert

All of the above, as a separate committable patch. I hate the fact
that you have written no user facing documentation for this feature.
How can anyone tell whether the tests you've written are correct or
even consistent to a particular definition of correctness?

I'd hoped that the commit messages, and my discussion of the feature
were adequate.

Submit as patch for review only to Oct 15 CF
We then agree what is required for further work
At this stage, poll the Django and Rails communities for acceptance
and early warning of these features. Listen.

I know an original founder of the Django project quite well - Jacob
Kaplan-Moss (a co-worker - the guy that keynoted pgOpen in its second
year). He is very interested in this effort.

C. Internal weirdness
Submit C based upon earlier agreed B, submit to Dec 15 CF, major patch
deadline, so we can fine tune for last CF.
Then Heikki rewrites half your patch in a better way, you thank him
and then we commit. All done.

I don't have a problem with Heikki or anyone else rewriting the value
locking part of the patch, provided it meets my requirements for such
a mechanism. Since Heikki already agreed that that standard should be
imposed, he'd hardly take issue with it now.

However, the fact is that once you actually make something like
promise tuples meet that standard, at the very least it becomes a lot
messier than you'd think. Heikki's final prototype "super deleted"
tuples by setting their xmin to InvalidTransactionId. We weren't sure
that that doesn't break some random other heapam code. Consider this,
for example:

https://github.com/postgres/postgres/blob/REL9_4_STABLE/src/backend/executor/execMain.c#L1961

So that looks safe in the face of setting xmin to InvalidTransactionId
in the way the later prototype patch did if you think about it for a
while, but there are other places where that is less clear. In short,
it becomes something that we have to worry about for ever, because
"xmin cannot change without the tuple in the slot changing" is clearly
an invariant for certain purposes. It might accidentally fail to fail
right now, but I'm not comfortable with it.

Now, I might be convinced that that's actually the way to go. I have
an open mind. But that will take discussion. I like that page
hwlocking is something that many systems do (even including Oracle, I
believe). Making big changes to nbtree is always something that
deserves to be met with skepticism, but it is nice to have an
implementation that lives in the head of AM.

Sorry, I forgot to not talk about locking.

But we're still discussing SQL semantics. So first things first, then
loop back around, hoping our design has not been concurrently
deleted...

I hope the discussion can avoid "unprincipled deadlocks"....

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#30Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#29)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 25 September 2014 22:13, Peter Geoghegan <pg@heroku.com> wrote:

All of the above, as a separate committable patch. I hate the fact
that you have written no user facing documentation for this feature.
How can anyone tell whether the tests you've written are correct or
even consistent to a particular definition of correctness?

I'd hoped that the commit messages, and my discussion of the feature
were adequate.

I'd hoped that my discussion was sufficient to persuade you too, but it wasn't.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#31Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#30)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 2:37 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

I'd hoped that the commit messages, and my discussion of the feature
were adequate.

I'd hoped that my discussion was sufficient to persuade you too, but it wasn't.

I'll write user-visible docs soon, then.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#32Gavin Flower
GavinFlower@archidevsys.co.nz
In reply to: Simon Riggs (#25)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 26/09/14 08:21, Simon Riggs wrote:

On 25 September 2014 20:11, Robert Haas <robertmhaas@gmail.com> wrote:

My approach would be to insert an index tuple for that value into the
index, but with the leaf ituple marked with an xid rather than a ctid.
If someone tries to insert into the index they would see this and wait
for the inserting transaction to end. The inserting transaction would
then resolve what happens in the heap (insert/update) and later
repoint the index tuple to the inserted/updated row version. I don't
see the need for page level locking since it would definitely result
in deadlocks (e.g. SQLServer).

I think that something like this might work, but the devil is in the
details. Suppose two people try to upsert into the same table at the
same time. There's one index. If the transactions search that index
for conflicts first, neither sees any conflicting tuples, and both
proceed. That's no good. OK, so suppose each transaction inserts the
special index tuple which you mention, to lock out concurrent inserts
of that value, and then searches for already-existing conflicts. Each
sees the other's tuple, and they deadlock. That's no good, either.

The test index is unique, so our to-be-inserted value exists on only
one page, hence page locking applies while we insert it. The next
person to insert waits for the page lock and then sees the test tuple.

The page lock lasts only for the duration of the insertion of the
ituple, not for the whole operation.

Also, I think there are other cases where we think we're going to
insert, so we put the special index tuple in there, but then we decide
to update, so we don't need the promise tuple any more, but other
sessions are potentially still waiting for our XID to terminate even
though there's no conflict any more. I'm having a hard time bringing
the details of those cases to mind ATM, though.

We make the decision to INSERT or UPDATE based upon what we find in
the test index. If a value if there already, we assume its an UPDATE
and go to update the row this points to. If it has been deleted we
loop back and try again/error. If the value is not present, we insert
the test tuple and progress as an INSERT, then loop back later to set
the ctid. There is no case of "don't need promise id anymore". We
would use the PK, identity or first unique index as the test index.
There is a case where an UPSERT conflicts with an INSERT causing the
latter to abort.

Anyway, this is why we need the design more clearly exposed, so you
can tell me I'm wrong by showing me the URL of it done right.

What happens if the new value(s) of the INERT/UPDATE require the page to
be split?

I assume the mechanics of this are catered for, but how does it affect
locking & potential deadlocks?

Cheers,
Gavin

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#33Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Peter Geoghegan (#29)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/26/2014 12:13 AM, Peter Geoghegan wrote:

On Thu, Sep 25, 2014 at 1:48 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

C. Internal weirdness
Submit C based upon earlier agreed B, submit to Dec 15 CF, major patch
deadline, so we can fine tune for last CF.
Then Heikki rewrites half your patch in a better way, you thank him
and then we commit. All done.

I don't have a problem with Heikki or anyone else rewriting the value
locking part of the patch, provided it meets my requirements for such
a mechanism. Since Heikki already agreed that that standard should be
imposed, he'd hardly take issue with it now.

However, the fact is that once you actually make something like
promise tuples meet that standard, at the very least it becomes a lot
messier than you'd think. Heikki's final prototype "super deleted"
tuples by setting their xmin to InvalidTransactionId. We weren't sure
that that doesn't break some random other heapam code. Consider this,
for example:

https://github.com/postgres/postgres/blob/REL9_4_STABLE/src/backend/executor/execMain.c#L1961

So that looks safe in the face of setting xmin to InvalidTransactionId
in the way the later prototype patch did if you think about it for a
while, but there are other places where that is less clear. In short,
it becomes something that we have to worry about for ever, because
"xmin cannot change without the tuple in the slot changing" is clearly
an invariant for certain purposes. It might accidentally fail to fail
right now, but I'm not comfortable with it.

Just to be clear: I wrote the initial patch to demonstrate what I had in
mind, because I was not able to explain it well enough otherwise. You
pointed out issues with it, which I then fixed. You then pointed out
more issues, which I then fixed again.

My patch version was a proof of concept, to demonstrate that it can be
done. What I'd like you to do now, as the patch author, is to take the
promise tuple approach and clean it up. If the xmin stuff is ugly,
figure out some other way to do it.

Now, I might be convinced that that's actually the way to go. I have
an open mind. But that will take discussion. I like that page
hwlocking is something that many systems do (even including Oracle, I
believe). Making big changes to nbtree is always something that
deserves to be met with skepticism, but it is nice to have an
implementation that lives in the head of AM.

I don't know what you mean by "in the head of AM", but IMO it would be
far better if we can implement this outside the index AMs. Then it will
work with any index AM.

BTW, in the discussions, you pointed out that exclusion constraints
currently behave differently from a unique index, when two backends
insert a tuple at the same time. With a unique index, one of them will
fail, but one is always guaranteed to succeed. With an exclusion
constraint, they can both fail if you're unlucky. I think the promise
tuples would allow us to fix that, too, while we're at it. In fact, you
might consider tackling that first, and build the new INSERT ON CONFLICT
syntax on top of that. Basically, an INSERT to a table with an exclusion
constraint would be the same as "INSERT ON CONFLICT throw an error".
That would be a useful way to split this patch into two parts.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#34Andres Freund
andres@2ndquadrant.com
In reply to: Heikki Linnakangas (#33)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-26 15:24:21 +0300, Heikki Linnakangas wrote:

I don't know what you mean by "in the head of AM", but IMO it would be far
better if we can implement this outside the index AMs. Then it will work
with any index AM.

Also, it's the only chance to make this ever work across partitions.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#35Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Andres Freund (#34)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/26/2014 03:30 PM, Andres Freund wrote:

On 2014-09-26 15:24:21 +0300, Heikki Linnakangas wrote:

I don't know what you mean by "in the head of AM", but IMO it would be far
better if we can implement this outside the index AMs. Then it will work
with any index AM.

Also, it's the only chance to make this ever work across partitions.

How so? Assuming there's no overlap in the partitions, you could lock
the page in the index of the partition you're inserting to, just like
you would insert the promise tuple to the right partition.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#36Andres Freund
andres@2ndquadrant.com
In reply to: Heikki Linnakangas (#35)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-26 15:32:35 +0300, Heikki Linnakangas wrote:

On 09/26/2014 03:30 PM, Andres Freund wrote:

On 2014-09-26 15:24:21 +0300, Heikki Linnakangas wrote:

I don't know what you mean by "in the head of AM", but IMO it would be far
better if we can implement this outside the index AMs. Then it will work
with any index AM.

Also, it's the only chance to make this ever work across partitions.

How so? Assuming there's no overlap in the partitions, you could lock the
page in the index of the partition you're inserting to, just like you would
insert the promise tuple to the right partition.

Well, the 'no overlap' case is boring. At least if you mean that each
partition has disctinct value ranges in the index?

And the reason that the buffer locking approach in the overlapping case
is that you'd need to hold a large number of pages locked at the same
time. Right?

But primarily I mean that bulk of the uniqueness checking logic has to
live outside the individual AMs. It doesn't sound enticing to reach from
inside one AM into another partitions index to do stuff.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#37Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Andres Freund (#36)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/26/2014 03:40 PM, Andres Freund wrote:

On 2014-09-26 15:32:35 +0300, Heikki Linnakangas wrote:

On 09/26/2014 03:30 PM, Andres Freund wrote:

On 2014-09-26 15:24:21 +0300, Heikki Linnakangas wrote:

I don't know what you mean by "in the head of AM", but IMO it would be far
better if we can implement this outside the index AMs. Then it will work
with any index AM.

Also, it's the only chance to make this ever work across partitions.

How so? Assuming there's no overlap in the partitions, you could lock the
page in the index of the partition you're inserting to, just like you would
insert the promise tuple to the right partition.

Well, the 'no overlap' case is boring.

Ok.

At least if you mean that each partition has disctinct value ranges
in the index?

Right.

And the reason that the buffer locking approach in the overlapping case
is that you'd need to hold a large number of pages locked at the same
time. Right?

Yeah, you would. To be honest, I didn't even think about the overlapping
case, I just assumed that the overlapping case is the typical one and
only thought about that.

But primarily I mean that bulk of the uniqueness checking logic has to
live outside the individual AMs. It doesn't sound enticing to reach from
inside one AM into another partitions index to do stuff.

Yeah, that's a non-starter. Even with the index locking stuff, though,
it wouldn't be the AM's responsibility to reach out to other partitions.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#38Andres Freund
andres@2ndquadrant.com
In reply to: Heikki Linnakangas (#37)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-26 15:58:17 +0300, Heikki Linnakangas wrote:

On 09/26/2014 03:40 PM, Andres Freund wrote:

And the reason that the buffer locking approach in the overlapping case
is that you'd need to hold a large number of pages locked at the same
time. Right?

Yeah, you would. To be honest, I didn't even think about the overlapping
case, I just assumed that the overlapping case is the typical one and only
thought about that.

I think it's actually quite common to want to have uniqueness constraint
overlapping partitions. Consider e.g. partitioning on the username. You
might still want to ensure emails are unique.

But primarily I mean that bulk of the uniqueness checking logic has to
live outside the individual AMs. It doesn't sound enticing to reach from
inside one AM into another partitions index to do stuff.

Yeah, that's a non-starter. Even with the index locking stuff, though, it
wouldn't be the AM's responsibility to reach out to other partitions.

I'm thinking of the way btree currently does uniqueness checks. Unless
you move a large chunk of that out of the AM you'll have a hard time
building anything crossing partitions based on it. At least I can't see
how.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#39Peter Geoghegan
pg@heroku.com
In reply to: Heikki Linnakangas (#33)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Sep 26, 2014 at 5:24 AM, Heikki Linnakangas
<hlinnakangas@vmware.com> wrote:

Just to be clear: I wrote the initial patch to demonstrate what I had in
mind, because I was not able to explain it well enough otherwise. You
pointed out issues with it, which I then fixed. You then pointed out more
issues, which I then fixed again.

My patch version was a proof of concept, to demonstrate that it can be done.

Right. It was a rough prototype built to prove a point. It also served
to show what I was talking about as regards deadlocks (and how the
locks could problematically persist in other ways), which I was
previously unable to effectively explain to Andres. So it was a very
useful exercise, and I wish we did that kind of thing more frequently.
But at the same time, I don't want to hold you to that prototype, or
misrepresent that prototype as showing your final position on any
technical issue. So please correct me if I do that. I've tried to be
careful about that.

What I'd like you to do now, as the patch author, is to take the promise
tuple approach and clean it up. If the xmin stuff is ugly, figure out some
other way to do it.

My concern with the xmin stuff is not that it's ugly; it's that it's
potentially dangerous. It isn't at all easy to reason about where bugs
might appear - lots of things could interact with it in unpredictable
ways. I think we'd have to audit a lot of code, all over the place,
just to make sure nowhere had an assumption broken. This is a big
issue. You are asking me to find a way to save a design that I don't
particularly believe in. That might change, but right now I'm afraid
that that's the reality. Whereas, my design is entirely contained in
the file nbtinsert.c.

I don't know what you mean by "in the head of AM", but IMO it would be far
better if we can implement this outside the index AMs. Then it will work
with any index AM.

I mean that "value locking" is an abstraction that lives in the head
of amcanunique AMs. That kind of encapsulation has considerable value
in reducing the risk of bugs. If what I've done has bugs, there isn't
that many places that could expose interactions with other complicated
code. There are fewer moving parts. It's a generalization of the
existing mechanism for unique index enforcement. Plus, database
systems have used heavyweight index locks for this kind of thing since
the 1970s. That's how this works everywhere else (SQL server certainly
does this for MERGE [1]http://weblogs.sqlteam.com/mladenp/archive/2007/08/03/60277.aspx, and only grabs the page-level lock for a
second at lower isolation levels, as in my implementation). I think
that that ought to count for something.

I will be frank. Everyone knows that the nbtree locking parts of this
are never going to be committed over your objections. It cannot
happen. And yet, I persist in proposing that we go that way. I may be
stubborn, but I am not so stubborn that I'd jeopardize all the work
I've put into this to save one aspect of it that no one really cares
about anyway (even I only care about meeting my goals for user visible
behavior [2]Slide 8, "Goals for UPSERT in Postgres": http://www.pgcon.org/2014/schedule/attachments/327_upsert_weird.pdf -- Peter Geoghegan). I may actually come up with a better way to make what
you outline work; then again, I may not. I have no idea, to be honest.
It's pretty clear that I'm going to have a hard time getting your
basic approach to value locking accepted without rethinking it a lot,
though. Can you really say that you won't have serious misgivings
about something like the "tuple->xmin = InvalidTransactionId"
swapping, if I actually formally propose it? That's very invasive to a
lot of places. And right now, I have no idea how we could do better.

I really only want to get to where we have a design that's acceptable.
In all sincerity, I may yet be convinced to go your way. It's possible
that I've failed to fully understand your concerns. Is it really just
about making INSERT ... ON CONFLICT IGNORE work with exclusion
constraints (UPDATE clearly makes little sense)?

Basically, an INSERT to a table with an exclusion constraint would be the
same as "INSERT ON CONFLICT throw an error". That would be a useful way to
split this patch into two parts.

I'll think about it. I don't want to do that until I see a way to make
your approach to value locking work in a way that someone is actually
going to be comfortable committing. I am looking for one.

By the way, IMO stress testing has a very useful role to play in the
development of this feature. I've been doing things like trying to
flush out races by running long stress tests with random delays
artificially added at key points. I would like to make that part of
the testing strategy public and transparent.

[1]: http://weblogs.sqlteam.com/mladenp/archive/2007/08/03/60277.aspx
[2]: Slide 8, "Goals for UPSERT in Postgres": http://www.pgcon.org/2014/schedule/attachments/327_upsert_weird.pdf -- Peter Geoghegan
http://www.pgcon.org/2014/schedule/attachments/327_upsert_weird.pdf
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#40Peter Geoghegan
pg@heroku.com
In reply to: Heikki Linnakangas (#37)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Sep 26, 2014 at 5:58 AM, Heikki Linnakangas
<hlinnakangas@vmware.com> wrote:

And the reason that the buffer locking approach in the overlapping case
is that you'd need to hold a large number of pages locked at the same
time. Right?

Yeah, you would. To be honest, I didn't even think about the overlapping
case, I just assumed that the overlapping case is the typical one and only
thought about that.

I'm not sure that I follow. Unique constraints don't work across
partitions today. Why should this work across partitions in the most
general case? Simply because there'd have to be one page lock held per
unique index/partition, where promise tuples are somewhat like row
locks, so presumably only one lock table entry is required?

In other database systems with better partitioning support, there is
such a thing as indexes that apply across all partitions ("global
indexes"). There are also "local indexes", that can only be unique if
that comports with the partitioning key in a way that makes sense. But
we don't have anything like global indexes, and even in those other
systems there are huge caveats around MERGE and its impact on global
indexes (they are automatically *marked unusable* by an SQL MERGE
command). So I think making what you have in mind here work for
current Postgres partitioning is totally unrealistic, unless (at the
very least) someone also goes and writes a global index feature, which
is obviously an enormous project.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#41Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Peter Geoghegan (#39)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Peter Geoghegan wrote:

Can you really say that you won't have serious misgivings
about something like the "tuple->xmin = InvalidTransactionId"
swapping, if I actually formally propose it? That's very invasive to a
lot of places. And right now, I have no idea how we could do better.

FWIW there are 28 callers of HeapTupleHeaderGetXmin.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#42Peter Geoghegan
pg@heroku.com
In reply to: Alvaro Herrera (#41)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Sep 26, 2014 at 3:11 PM, Alvaro Herrera
<alvherre@2ndquadrant.com> wrote:

FWIW there are 28 callers of HeapTupleHeaderGetXmin.

31 by my count, though that difference hardly matters. A lot of those
callers are in parts of the code that I don't know well. For example,
CheckForSerializableConflictOut().

Don't forget about direct callers to HeapTupleHeaderGetRawXmin(),
though. There are plenty of those in tqual.c.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#43Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#42)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Sep 26, 2014 at 3:25 PM, Peter Geoghegan <pg@heroku.com> wrote:

On Fri, Sep 26, 2014 at 3:11 PM, Alvaro Herrera
<alvherre@2ndquadrant.com> wrote:

FWIW there are 28 callers of HeapTupleHeaderGetXmin.

Don't forget about direct callers to HeapTupleHeaderGetRawXmin(),
though. There are plenty of those in tqual.c.

Which reminds me: commit 37484ad2 added the opportunistic freezing
stuff. To quote the commit message:

"""
Instead of changing the tuple xmin to FrozenTransactionId, the combination
of HEAP_XMIN_COMMITTED and HEAP_XMIN_INVALID, which were previously never
set together, is now defined as HEAP_XMIN_FROZEN. A variety of previous
proposals to freeze tuples opportunistically before vacuum_freeze_min_age
is reached have foundered on the objection that replacing xmin by
FrozenTransactionId might hinder debugging efforts when things in this
area go awry; this patch is intended to solve that problem by keeping
the XID around (but largely ignoring the value to which it is set).

"""

Why wouldn't the same objection (the objection that the earlier
opportunistic freezing ideas stalled on) apply to directly setting
tuple xmin to InvalidTransactionId?

You get the idea, though: Making promise tuples possible to release
early (before transaction end) by setting tuple xmin to
InvalidTransactionId is certainly hard to get right, and seems
dangerous.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#44Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#27)
1 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Attachments:

0006-User-visible-documentation-for-INSERT-.-ON-CONFLICT-.patchtext/x-patch; charset=US-ASCII; name=0006-User-visible-documentation-for-INSERT-.-ON-CONFLICT-.patchDownload
From 005eb2760b356c7383c591bb92294cc9626baabe Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@heroku.com>
Date: Fri, 26 Sep 2014 20:59:04 -0700
Subject: [PATCH 6/6] User-visible documentation for INSERT ... ON CONFLICT
 {UPDATE | IGNORE}

INSERT ... ON CONFLICT {UPDATE | IGNORE} is documented as a new clause
of the INSERT command.  Some potentially surprising interactions with
triggers are noted -- statement level UPDATE triggers will not fire when
INSERT ... ON CONFLICT UPDATE is executed, for example.

All the existing features that INSERT ... ON CONFLICT {UPDATE | IGNORE}
fails to completely play nice with have those limitations noted.  (Notes
are added to the existing documentation for those other features,
although some of these cases will need to be revisited).  This includes
postgres_fdw, updatable views and table inheritance.  In principle it is
the responsibility of writable foreign data wrapper authors to provide
appropriate support for this new clause (although it's hard to see how
the optional "WITHIN `unique_index`" clause could work there).

Finally, a user-level description of the new "MVCC violation" that
INSERT ... ON CONFLICT {UPDATE | IGNORE} sometimes requires has been
added to "Chapter 13 - Concurrency Control", beside existing commentary
on Read Committed mode's special handling of concurrent updates, and the
implications for snapshot isolation (i.e.  what is internally referred
to as the EvalPlanQual() mechanism).  The new "MVCC violation"
introduced seems somewhat distinct from the existing one, because in
Read Committed mode it is no longer necessary for any row version to be
conventionally visible to the command's MVCC snapshot for an UPDATE of
the row to occur (or for the row to be locked).
---
 doc/src/sgml/ddl.sgml                |  14 +++
 doc/src/sgml/mvcc.sgml               |  43 ++++++--
 doc/src/sgml/plpgsql.sgml            |  14 +--
 doc/src/sgml/postgres-fdw.sgml       |   8 ++
 doc/src/sgml/ref/create_rule.sgml    |   6 +-
 doc/src/sgml/ref/create_trigger.sgml |   5 +-
 doc/src/sgml/ref/create_view.sgml    |  15 ++-
 doc/src/sgml/ref/insert.sgml         | 203 ++++++++++++++++++++++++++++++++---
 doc/src/sgml/trigger.sgml            |  30 +++++-
 9 files changed, 302 insertions(+), 36 deletions(-)

diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index c07f5a2..2910890 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -2292,6 +2292,20 @@ VALUES ('Albany', NULL, NULL, 'NY');
    but in the meantime considerable care is needed in deciding whether
    inheritance is useful for your application.
   </para>
+  <para>
+   <!-- XXX:  This limitation can probably be removed, at least for
+        the simple case where a unique index constrains an attribute
+        or attributes that are effectively contained within the
+        (implied) partitioning key.  Clearly doing anything more
+        advanced than that would require a large overhaul of
+        partitioning in PostgreSQL.
+        -->
+   Since unique indexes do not constrain every child table in an
+   inheritance hierarchy, inheritance is not supported for
+   <command>INSERT</command> statements that contain an <literal>ON
+   CONFLICT UPDATE</> clause, or an <literal>ON CONFLICT IGNORE</>
+   clause.
+  </para>
 
    </sect2>
   </sect1>
diff --git a/doc/src/sgml/mvcc.sgml b/doc/src/sgml/mvcc.sgml
index cd55be8..dd05cfe 100644
--- a/doc/src/sgml/mvcc.sgml
+++ b/doc/src/sgml/mvcc.sgml
@@ -326,14 +326,41 @@
    </para>
 
    <para>
-    Because of the above rule, it is possible for an updating command to see an
-    inconsistent snapshot: it can see the effects of concurrent updating
-    commands on the same rows it is trying to update, but it
-    does not see effects of those commands on other rows in the database.
-    This behavior makes Read Committed mode unsuitable for commands that
-    involve complex search conditions; however, it is just right for simpler
-    cases.  For example, consider updating bank balances with transactions
-    like:
+    <command>INSERT</command> with an <literal>ON CONFLICT UPDATE</>
+    clause is another special case.  In Read Committed mode, the
+    implementation will either insert or update each row proposed for
+    insertion, with either one of those two outcomes guaranteed.  This
+    is a useful guarantee for many use-cases, but it implies that
+    further liberties must be taken with snapshot isolation.  Should a
+    conflict originate in another transaction whose effects are not
+    visible to the <command>INSERT</command>, the
+    <command>UPDATE</command> may affect that row, even though it may
+    be the case that <emphasis>no</> version of that row is
+    conventionally visible to the command.  In the same vein, if the
+    secondary search condition of the command (an explicit
+    <literal>WHERE</> clause) is supplied, it is only evaluated on the
+    most recent row version, which is not necessarily the version
+    conventionally visible to the command (if indeed there is a row
+    version conventionally visible to the command at all).
+   </para>
+
+   <para>
+    <command>INSERT</command> with an <literal>ON CONFLICT IGNORE</>
+    clause may have insertion not proceed for a row due to the outcome
+    of another transaction whose effects are not visible to the
+    <command>INSERT</command> snapshot.  Again, this is only the case
+    in Read Committed mode.
+   </para>
+
+   <para>
+    Because of the above rules, it is possible for an updating command
+    to see an inconsistent snapshot: it can see the effects of
+    concurrent updating commands on the same rows it is trying to
+    update, but it does not see effects of those commands on other
+    rows in the database.  This behavior makes Read Committed mode
+    unsuitable for commands that involve complex search conditions;
+    however, it is just right for simpler cases.  For example,
+    consider updating bank balances with transactions like:
 
 <screen>
 BEGIN;
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index f008e93..8fbf4f2 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -3751,12 +3751,14 @@ RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;
     <command>INSERT</>/<command>UPDATE</>/<command>DELETE</>).
     Otherwise a nonnull value should be returned, to signal
     that the trigger performed the requested operation. For
-    <command>INSERT</> and <command>UPDATE</> operations, the return value
-    should be <varname>NEW</>, which the trigger function may modify to
-    support <command>INSERT RETURNING</> and <command>UPDATE RETURNING</>
-    (this will also affect the row value passed to any subsequent triggers).
-    For <command>DELETE</> operations, the return value should be
-    <varname>OLD</>.
+    <command>INSERT</> and <command>UPDATE</> operations, the return
+    value should be <varname>NEW</>, which the trigger function may
+    modify to support <command>INSERT RETURNING</> and <command>UPDATE
+    RETURNING</> (this will also affect the row value passed to any
+    subsequent triggers, or passed to a <literal>CONFLICTING</>
+    expression within an <command>INSERT</> with an <literal>ON
+    CONFLICT UPDATE</> clause).  For <command>DELETE</> operations,
+    the return value should be <varname>OLD</>.
    </para>
 
    <para>
diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml
index 43adb61..c414ecf 100644
--- a/doc/src/sgml/postgres-fdw.sgml
+++ b/doc/src/sgml/postgres-fdw.sgml
@@ -69,6 +69,14 @@
  </para>
 
  <para>
+  <!-- XXX:  Actually supporting this is more than a matter of adding
+       the necessary deparsing logic, but not much more -->
+  Note that <filename>postgres_fdw</> currently lacks support for
+  <command>INSERT</command> statements with an <literal>ON CONFLICT
+  UPDATE</> clause.
+ </para>
+
+ <para>
   It is generally recommended that the columns of a foreign table be declared
   with exactly the same data types, and collations if applicable, as the
   referenced columns of the remote table.  Although <filename>postgres_fdw</>
diff --git a/doc/src/sgml/ref/create_rule.sgml b/doc/src/sgml/ref/create_rule.sgml
index 677766a..a7a975e 100644
--- a/doc/src/sgml/ref/create_rule.sgml
+++ b/doc/src/sgml/ref/create_rule.sgml
@@ -136,7 +136,11 @@ CREATE [ OR REPLACE ] RULE <replaceable class="parameter">name</replaceable> AS
      <para>
       The event is one of <literal>SELECT</literal>,
       <literal>INSERT</literal>, <literal>UPDATE</literal>, or
-      <literal>DELETE</literal>.
+      <literal>DELETE</literal>.  Note that an
+      <command>INSERT</command> containing an <literal>ON CONFLICT
+      UPDATE</literal> clause is a simple <command>INSERT</command>
+      for the purposes of rules.  Rule expansion will not occur
+      separately for the <literal>UPDATE</literal> portion.
      </para>
     </listitem>
    </varlistentry>
diff --git a/doc/src/sgml/ref/create_trigger.sgml b/doc/src/sgml/ref/create_trigger.sgml
index 29b815c..26a0986 100644
--- a/doc/src/sgml/ref/create_trigger.sgml
+++ b/doc/src/sgml/ref/create_trigger.sgml
@@ -76,7 +76,10 @@ CREATE [ CONSTRAINT ] TRIGGER <replaceable class="PARAMETER">name</replaceable>
    executes once for any given operation, regardless of how many rows
    it modifies (in particular, an operation that modifies zero rows
    will still result in the execution of any applicable <literal>FOR
-   EACH STATEMENT</literal> triggers).
+   EACH STATEMENT</literal> triggers).  Note that since
+   <command>INSERT</command> with an <literal>ON CONFLICT UPDATE</>
+   clause is considered an <command>INSERT</command> statement, no
+   <command>UPDATE</command> statement level trigger will be fired.
   </para>
 
   <para>
diff --git a/doc/src/sgml/ref/create_view.sgml b/doc/src/sgml/ref/create_view.sgml
index 2b7a98f..3e13a08 100644
--- a/doc/src/sgml/ref/create_view.sgml
+++ b/doc/src/sgml/ref/create_view.sgml
@@ -245,6 +245,12 @@ CREATE VIEW <replaceable>name</> AS WITH RECURSIVE <replaceable>name</> (<replac
   <title>Notes</title>
 
    <para>
+    <!-- revisit - may not be necessary -->
+    <command>INSERT</command> with an <literal>ON CONFLICT UPDATE</>
+    clause is not supported on updatable views.
+   </para>
+
+   <para>
     Use the <xref linkend="sql-dropview">
     statement to drop views.
    </para>
@@ -290,9 +296,12 @@ CREATE VIEW vista AS SELECT text 'Hello World' AS hello;
 
    <para>
     Simple views are automatically updatable: the system will allow
-    <command>INSERT</>, <command>UPDATE</> and <command>DELETE</> statements
-    to be used on the view in the same way as on a regular table.  A view is
-    automatically updatable if it satisfies all of the following conditions:
+    <command>INSERT</>, <command>UPDATE</> and <command>DELETE</>
+    statements to be used on the view in the same way as on a regular
+    table (although <command>INSERT</command> may not use an
+    <literal>ON CONFLICT UPDATE</> clause for such a view).  A view is
+    automatically updatable if it satisfies all of the following
+    conditions:
 
     <itemizedlist>
      <listitem>
diff --git a/doc/src/sgml/ref/insert.sgml b/doc/src/sgml/ref/insert.sgml
index a3cccb9..ac4c2d1 100644
--- a/doc/src/sgml/ref/insert.sgml
+++ b/doc/src/sgml/ref/insert.sgml
@@ -24,6 +24,14 @@ PostgreSQL documentation
 [ WITH [ RECURSIVE ] <replaceable class="parameter">with_query</replaceable> [, ...] ]
 INSERT INTO <replaceable class="PARAMETER">table_name</replaceable> [ ( <replaceable class="PARAMETER">column_name</replaceable> [, ...] ) ]
     { DEFAULT VALUES | VALUES ( { <replaceable class="PARAMETER">expression</replaceable> | DEFAULT } [, ...] ) [, ...] | <replaceable class="PARAMETER">query</replaceable> }
+    [ ON CONFLICT [ WITHIN <replaceable class="PARAMETER">unique_index_name</replaceable> ]
+      { IGNORE | UPDATE
+        SET { <replaceable class="PARAMETER">column_name</replaceable> = { CONFLICTING(<replaceable class="PARAMETER">column_name</replaceable>) | <replaceable class="PARAMETER">expression</replaceable> | DEFAULT } |
+              ( <replaceable class="PARAMETER">column_name</replaceable> [, ...] ) = ( { CONFLICTING(<replaceable class="PARAMETER">column_name</replaceable>) | <replaceable class="PARAMETER">expression</replaceable> | DEFAULT } [, ...] )
+            } [, ...]
+        [ WHERE <replaceable class="PARAMETER">condition</replaceable> ]
+      }
+    ]
     [ RETURNING * | <replaceable class="parameter">output_expression</replaceable> [ [ AS ] <replaceable class="parameter">output_name</replaceable> ] [, ...] ]
 </synopsis>
  </refsynopsisdiv>
@@ -34,7 +42,9 @@ INSERT INTO <replaceable class="PARAMETER">table_name</replaceable> [ ( <replace
   <para>
    <command>INSERT</command> inserts new rows into a table.
    One can insert one or more rows specified by value expressions,
-   or zero or more rows resulting from a query.
+   or zero or more rows resulting from a query.  An alternative path
+   can be specified in the event of detecting that proceeding with any
+   row's insertion would result in a uniqueness violation.
   </para>
 
   <para>
@@ -65,16 +75,101 @@ INSERT INTO <replaceable class="PARAMETER">table_name</replaceable> [ ( <replace
    defaults, such as a serial sequence number.  However, any expression
    using the table's columns is allowed.  The syntax of the
    <literal>RETURNING</> list is identical to that of the output list
-   of <command>SELECT</>.
+   of <command>SELECT</>.  Only rows that were successfully inserted
+   will be returned.
+  </para>
+
+  <para>
+   The optional <literal>ON CONFLICT</> clause specifies a path to
+   take as an alternative to raising a uniqueness violation error.
+   <literal>ON CONFLICT IGNORE</> simply avoids inserting any
+   individual row when it is determined that a uniqueness violation
+   error would otherwise need to be raised.  <literal>ON CONFLICT
+   UPDATE</> has the system take an <command>UPDATE</command> path in
+   respect of such rows instead.  <literal>ON CONFLICT UPDATE</>
+   guarantees an atomic <command>INSERT</command> or
+   <command>UPDATE</command> outcome.  While rows may be updated, the
+   top-level statement is still an <command>INSERT</command>, which is
+   significant for the purposes of statement-level triggers and the
+   rules system.  Note that in the event of an <literal>ON CONFLICT</>
+   path being taken, <literal>RETURNING</> returns no value in respect
+   of any not-inserted rows.
+  </para>
+
+  <para>
+   <literal>ON CONFLICT UPDATE</> optionally accepts a
+   <literal>WHERE</> clause <replaceable>condition</>.  When provided,
+   the statement only procedes with updating if the
+   <replaceable>condition</> is satisfied.  Otherwise, unlike a
+   conventional <command>UPDATE</command>, the row is still locked for
+   update.  Note that the <replaceable>condition</> is evaluated last,
+   after a conflict has been identified as a candidate to update.
+  </para>
+
+  <para>
+   <literal>ON CONFLICT UPDATE</> accepts <literal>CONFLICTING</>
+   expressions in both its targetlist and <literal>WHERE</> clause.
+   This allows expressions (in particular, assignments) to reference
+   rows originally proposed for insertion.  Note that the effects of
+   all per-row <literal>BEFORE INSERT</> triggers are carried forward.
+   This is particularly useful for multi-insert <literal>ON CONFLICT
+   UPDATE</> statements;  when merging rows, constants need only
+   appear once.
+  </para>
+
+  <para>
+   There are several restrictions on the <literal>ON CONFLICT
+   UPDATE</> clause that do not apply to <command>UPDATE</command>
+   statements.  Subqueries may not appear in either the
+   <command>UPDATE</command> targetlist, nor its <literal>WHERE</>
+   clause (although simple multi-assignment expressions are
+   supported).  <literal>WHERE CURRENT OF</> cannot be used.  In
+   general, only columns in the target table, and conflicting values
+   originally proposed for insertion may be referenced.  Operators and
+   functions may be used freely, though.
+  </para>
+
+  <para>
+   <literal>ON CONFLICT UPDATE</> also optionally accepts a
+   <literal>WITHIN</> clause, which can be used to limit pre-checking
+   for duplicates to one specific unique index,
+   <replaceable>unique_index_name</>.  If this clause is omitted, it
+   is assumed that there can only be one source of uniqueness
+   violations, and so the first indication of a would-be uniqueness
+   violation is assumed to be the appropriate condition to take the
+   alternative <literal>UPDATE</> or <literal>IGNORE</> path on
+   (implying that insertion cannot directly cause uniqueness
+   violations under any circumstances, possibly including unforeseen
+   circumstances in which it is actually appropriate to do so).
+   Failure to anticipate and prevent would-be unique violations
+   originating in some other unique index than the single unique index
+   that was anticipated as the sole source of would-be uniqueness
+   violations can result in updating a row other than an existing row
+   with conflicting values (if any).
+  </para>
+
+  <para>
+   In general, it is good practice to include this clause when
+   inserting into a table with more than a single non-trivial unique
+   index. (A serial primary key unique index is considered a trivial
+   unique index).  Note that the UPDATE assignment may result in a
+   unique violation, just as with a conventional
+   <command>UPDATE</command>.
   </para>
 
   <para>
    You must have <literal>INSERT</literal> privilege on a table in
-   order to insert into it.  If a column list is specified, you only
-   need <literal>INSERT</literal> privilege on the listed columns.
-   Use of the <literal>RETURNING</> clause requires <literal>SELECT</>
-   privilege on all columns mentioned in <literal>RETURNING</>.
-   If you use the <replaceable
+   order to insert into it, as well as <literal>UPDATE
+   privilege</literal> if and only if <literal>ON CONFLICT UPDATE</>
+   is specified.  If a column list is specified, you only need
+   <literal>INSERT</literal> privilege on the listed columns.
+   Similarly, when <literal>ON CONFLICT UPDATE</> is specified, you
+   only need <literal>UPDATE</> privilege on the column(s) that are
+   listed to be updated, as well as SELECT privilege on any column
+   whose values are read in the <literal>ON CONFLICT UPDATE</>
+   expressions or condition.  Use of the <literal>RETURNING</> clause
+   requires <literal>SELECT</> privilege on all columns mentioned in
+   <literal>RETURNING</>.  If you use the <replaceable
    class="PARAMETER">query</replaceable> clause to insert rows from a
    query, you of course need to have <literal>SELECT</literal> privilege on
    any table or column used in the query.
@@ -121,7 +216,29 @@ INSERT INTO <replaceable class="PARAMETER">table_name</replaceable> [ ( <replace
       The name of a column in the table named by <replaceable class="PARAMETER">table_name</replaceable>.
       The column name can be qualified with a subfield name or array
       subscript, if needed.  (Inserting into only some fields of a
-      composite column leaves the other fields null.)
+      composite column leaves the other fields null.)  When
+      referencing a column with <literal>ON CONFLICT UPDATE</>, do not
+      include the table's name in the specification of a target
+      column.  For example, <literal>INSERT ... ON CONFLICT UPDATE tab
+      SET tab.col = 1</> is invalid.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><replaceable class="PARAMETER">unique_index_name</replaceable></term>
+    <listitem>
+     <para>
+      The name of a unique index defined on the table named by
+      <replaceable class="PARAMETER">table_name</replaceable>.  This
+      requires <literal>ON CONFLICT UPDATE</> and <literal>ON CONFLICT
+      IGNORE</> to assume that all expected sources of uniqueness
+      violations originate within the columns/rows constrained by the
+      unique index.  When this is omitted, the system checks for
+      sources of uniqueness violations ahead of time in all unique
+      indexes.  Otherwise, only a single specified unique index is
+      checked ahead of time, and uniqueness violation errors can
+      appear for conflicts originating in any other unique index.
      </para>
     </listitem>
    </varlistentry>
@@ -140,6 +257,18 @@ INSERT INTO <replaceable class="PARAMETER">table_name</replaceable> [ ( <replace
     <listitem>
      <para>
       An expression or value to assign to the corresponding column.
+      Within <literal>ON CONFLICT UPDATE</>, this may be a
+      <literal>CONFLICTING</> expression, which allows the update's
+      targetlist (or <literal>WHERE</> clause) to reference a value
+      appearing in the corresponding row proposed for insertion.  Note
+      that the effects of <literal>BEFORE INSERT</> triggers are
+      carried forward when <literal>CONFLICTING</> is used.
+     </para>
+     <para>
+      As with the <literal>ON CONFLICT UPDATE</> WHERE clause
+      <replaceable class="parameter">condition</replaceable>, within
+      <literal>ON CONFLICT UPDATE</> SET targetlists, subquery
+      expressions are disallowed.
      </para>
     </listitem>
    </varlistentry>
@@ -167,12 +296,29 @@ INSERT INTO <replaceable class="PARAMETER">table_name</replaceable> [ ( <replace
    </varlistentry>
 
    <varlistentry>
+    <term><replaceable class="PARAMETER">condition</replaceable></term>
+    <listitem>
+     <para>
+      An expression that returns a value of type <type>boolean</type>.
+      Only rows for which this expression returns <literal>true</>
+      will be updated, although all rows will be locked when the
+      <literal>ON CONFLICT UPDATE</> path is taken.  Note that
+      subqueries are disallowed within the expression.  Only columns
+      appearing in the target table, or, by using a
+      <literal>CONFLICTING</> expression, values originally proposed
+      for insertion may be referenced.
+     </para>
+    </listitem>
+   </varlistentry>
+   <varlistentry>
+
     <term><replaceable class="PARAMETER">output_expression</replaceable></term>
     <listitem>
      <para>
-      An expression to be computed and returned by the <command>INSERT</>
-      command after each row is inserted.  The expression can use any
-      column names of the table named by <replaceable class="PARAMETER">table_name</replaceable>.
+      An expression to be computed and returned by the
+      <command>INSERT</> command after each row is inserted (not
+      updated).  The expression can use any column names of the table
+      named by <replaceable class="PARAMETER">table_name</replaceable>.
       Write <literal>*</> to return all columns of the inserted row(s).
      </para>
     </listitem>
@@ -204,14 +350,16 @@ INSERT <replaceable>oid</replaceable> <replaceable class="parameter">count</repl
    <replaceable class="parameter">oid</replaceable> is the
    <acronym>OID</acronym> assigned to the inserted row.  Otherwise
    <replaceable class="parameter">oid</replaceable> is zero.
+   The command tag does not indicate the number of rows updated by
+   <literal>ON CONFLICT UPDATE</>.
   </para>
 
   <para>
    If the <command>INSERT</> command contains a <literal>RETURNING</>
    clause, the result will be similar to that of a <command>SELECT</>
    statement containing the columns and values defined in the
-   <literal>RETURNING</> list, computed over the row(s) inserted by the
-   command.
+   <literal>RETURNING</> list, computed over the row(s) inserted (not
+   updated) by the command.
   </para>
  </refsect1>
 
@@ -311,7 +459,31 @@ WITH upd AS (
     RETURNING *
 )
 INSERT INTO employees_log SELECT *, current_timestamp FROM upd;
-</programlisting></para>
+</programlisting>
+  </para>
+  <para>
+   Insert or update new distributors as appropriate.  Assumes a unique
+   index has been defined that constrains values appearing in the
+   <literal>did</literal> column.  Note that a <literal>CONFLICTING</>
+   expression is used to reference values originally proposed for
+   insertion:
+<programlisting>
+  INSERT INTO distributors (did, dname)
+  VALUES (5, 'Gizmo transglobal'), (6, 'Doohickey, inc')
+  ON CONFLICT UPDATE SET dname = CONFLICTING(dname) || ' (formerly ' || dname || ')'
+</programlisting>
+  </para>
+  <para>
+   Insert a distributor, or do nothing for rows proposed for insertion
+   when an existing, conflicting (a row with a matching constrained
+   column or columns) exists.  Assumes a unique index has been defined
+   that constrains values appearing in the <literal>did</literal>
+   column:
+<programlisting>
+  INSERT INTO distributors (did, dname) VALUES (7, 'Doodad GmbH')
+  ON CONFLICT IGNORE
+</programlisting>
+  </para>
  </refsect1>
 
  <refsect1>
@@ -321,7 +493,8 @@ INSERT INTO employees_log SELECT *, current_timestamp FROM upd;
    <command>INSERT</command> conforms to the SQL standard, except that
    the <literal>RETURNING</> clause is a
    <productname>PostgreSQL</productname> extension, as is the ability
-   to use <literal>WITH</> with <command>INSERT</>.
+   to use <literal>WITH</> with <command>INSERT</>, and the ability to
+   specify an alternative path with <literal>ON CONFLICT</>.
    Also, the case in
    which a column name list is omitted, but not all the columns are
    filled from the <literal>VALUES</> clause or <replaceable>query</>,
diff --git a/doc/src/sgml/trigger.sgml b/doc/src/sgml/trigger.sgml
index f94aea1..711741d 100644
--- a/doc/src/sgml/trigger.sgml
+++ b/doc/src/sgml/trigger.sgml
@@ -39,8 +39,12 @@
   <para>
     On tables and foreign tables, triggers can be defined to execute either
     before or after any <command>INSERT</command>, <command>UPDATE</command>,
-    or <command>DELETE</command> operation, either once per modified row,
-    or once per <acronym>SQL</acronym> statement.
+    or <command>DELETE</command> operation, either once per modified
+    row, or once per <acronym>SQL</acronym> statement.  If an
+    <command>INSERT</command> contains an <literal>ON CONFLICT
+    UPDATE</> clause, it is possible that the effects of a BEFORE
+    insert trigger and a BEFORE update trigger can both be applied
+    twice, if a CONFLICTING expression appears.
     <command>UPDATE</command> triggers can moreover be set to fire only if
     certain columns are mentioned in the <literal>SET</literal> clause of the
     <command>UPDATE</command> statement.
@@ -119,6 +123,28 @@
    </para>
 
    <para>
+    If an <command>INSERT</command> contains an <literal>ON CONFLICT
+    UPDATE</> clause, it is possible that the effects of all row-level
+    <literal>BEFORE</> <command>INSERT</command> triggers and all
+    row-level BEFORE <command>UPDATE</command> triggers can both be
+    applied in a way that is apparent from the final state of the
+    updated row, if a CONFLICTING expression appears.  There need not
+    be a CONFLICTING expression for both sets of BEFORE row-level
+    triggers to execute, though.  The possibility of surprising
+    outcomes should be considered when there are both
+    <literal>BEFORE</> <command>INSERT</command> and
+    <literal>BEFORE</> <command>UPDATE</command> row-level triggers
+    that both affect a row being inserted/updated (this can still be
+    problematic if the modifications are more or less equivalent if
+    they're not also idempotent).  Note that statement-level
+    <command>UPDATE</command> triggers are never executed when
+    <literal>ON CONFLICT UPDATE</> is specified, since technically an
+    UPDATE statement was not executed.  <literal>ON CONFLICT UPDATE</>
+    is not supported on views; therefore, unpredictable interactions
+    with <literal>INSTEAD OF</> triggers are not possible.
+   </para>
+
+   <para>
     Trigger functions invoked by per-statement triggers should always
     return <symbol>NULL</symbol>. Trigger functions invoked by per-row
     triggers can return a table row (a value of
-- 
1.9.1

#45Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#27)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 25, 2014 at 1:48 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

At this stage, poll the Django and Rails communities for acceptance
and early warning of these features. Listen.

FYI, I have asked for input from the Django developers here:

https://groups.google.com/forum/#!topic/django-developers/hdzkoLYVjBY

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#46Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#44)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 27 September 2014 23:23, Peter Geoghegan <pg@heroku.com> wrote:

On Thu, Sep 25, 2014 at 1:48 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

I hate the fact
that you have written no user facing documentation for this feature.

Attached patch adds a commit to the existing patchset. For the
convenience of reviewers, I've uploaded and made publicly accessible a
html build of the documentation. This page is of most interest:

http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/sql-insert.html

My request was for the following...

Agree command semantics by producing these things
* Explanatory documentation (Ch6.4 Data Manipulation - Upsert)
* SQL Reference Documentation (INSERT)
* Test cases for feature
* Test cases for concurrency
* Test cases for pgbench

because it forces you to show in detail how the command works. Adding
a few paragraphs to the INSERT page with two quick examples is not the
same level of detail at all and leaves me with the strong impression
my input has been assessed as ON CONFLICT IGNORE.

Examples of the following are needed

"ON CONFLICT UPDATE optionally accepts a WHERE clause condition. When
provided, the statement only procedes with updating if the condition
is satisfied. Otherwise, unlike a conventional UPDATE, the row is
still locked for update. Note that the condition is evaluated last,
after a conflict has been identified as a candidate to update."
Question arising: do you need to specify location criteria, or is this
an additional filter? When/why would we want that?

"Failure to anticipate and prevent would-be unique violations
originating in some other unique index than the single unique index
that was anticipated as the sole source of would-be uniqueness
violations can result in updating a row other than an existing row
with conflicting values (if any)."
In English, please

How would you do "if colA = 3 then ignore else update"?

No explanation of why the CONFLICTING() syntax differs from OLD./NEW.
syntax used in triggers

The page makes no mention of the upsert problem, nor is any previous
code mentioned.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#47Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#46)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sat, Sep 27, 2014 at 11:21 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

My request was for the following...

Agree command semantics by producing these things
* Explanatory documentation (Ch6.4 Data Manipulation - Upsert)

Do you really think I could get an entire chapter out of this?

* SQL Reference Documentation (INSERT)
* Test cases for feature
* Test cases for concurrency

All of these were added. There are two new sets of isolation tests,
one per variant of the new clause (IGNORE/UPDATE).

* Test cases for pgbench

They're not part of the patch proper, but as I've already mentioned I
have pgbench based stress-tests on Github. There is a variety of
test-cases that test the feature under high concurrency:

https://github.com/petergeoghegan/upsert

Examples of the following are needed

"ON CONFLICT UPDATE optionally accepts a WHERE clause condition.

Yes, I realized I missed an example of that one the second I hit
"send". The MVCC interactions of this are discussed within
transaction-iso.html, FWIW.

Question arising: do you need to specify location criteria, or is this
an additional filter? When/why would we want that?

It is an additional way to specify a predicate/condition to UPDATE on.
There might be a kind of redundancy, if you decided to repeat the
constrained values in the predicate too, but if you're using the WHERE
clause sensibly there shouldn't be. So your UPDATE's "full predicate"
is sort of the union of the constrained values that the conflict path
was taken for, plus whatever you put in the WHERE clause, but not
quite because they're evaluated at different times (as explained
within transaction-iso.html).

How would you do "if colA = 3 then ignore else update"?

Technically, you can't do that exact thing. IGNORE is just for quickly
dealing with ETL-type problems (and it is reasonable to use it without
one particular unique index in mind, unlike ON CONFLICT UPDATE) -
think pgloader. But if you did this:

INSERT INTO tab(colB) values('foo') ON CONFLICT UPDATE set colB =
CONFLICTING(colB) WHERE colA != 3

Then you would achieve almost the same thing. You wouldn't have
inserted or updated anything if the only rows considered had a colA of
3, but any such rows considered would be locked, which isn't the same
as IGNOREing them.

No explanation of why the CONFLICTING() syntax differs from OLD./NEW.
syntax used in triggers

Why should it be the same?

The page makes no mention of the upsert problem, nor is any previous
code mentioned.

What's the upsert problem? I mean, apart from the fact that we don't
have it. Note that it is documented that one of the two outcomes is
guaranteed.

I should have updated the plpgsql looping subxact example, though.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#48Andreas Karlsson
andreas@proxel.se
In reply to: Peter Geoghegan (#47)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/28/2014 09:40 AM, Peter Geoghegan wrote:

No explanation of why the CONFLICTING() syntax differs from OLD./NEW.
syntax used in triggers

Why should it be the same?

Both can be seen as cases where you refer to a field of a tuple, which
is usually done with FOO.bar.

--
Andreas Karlsson

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#49Craig Ringer
craig@2ndquadrant.com
In reply to: Peter Geoghegan (#47)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/28/2014 03:40 PM, Peter Geoghegan wrote:

Do you really think I could get an entire chapter out of this?

Yes. It might be a short chapter, but once you extract the existing
upsert example from the docs and how why the naïve approach doesn't work
there'll be enough to go on.

People get this wrong a *lot*.

http://www.postgresql.org/docs/current/static/plpgsql-control-structures.html#PLPGSQL-ERROR-TRAPPING
http://www.depesz.com/2012/06/10/why-is-upsert-so-complicated/
http://stackoverflow.com/q/17267417/398670
http://stackoverflow.com/q/1109061/398670

I'm happy to help with documenting it.

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#50Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#47)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 28 September 2014 08:40, Peter Geoghegan <pg@heroku.com> wrote:

On Sat, Sep 27, 2014 at 11:21 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

My request was for the following...

Agree command semantics by producing these things
* Explanatory documentation (Ch6.4 Data Manipulation - Upsert)

...

INSERT INTO tab(colB) values('foo') ON CONFLICT UPDATE set colB =
CONFLICTING(colB) WHERE colA != 3

Then you would achieve almost the same thing. You wouldn't have
inserted or updated anything if the only rows considered had a colA of
3, but any such rows considered would be locked, which isn't the same
as IGNOREing them.

No explanation of why the CONFLICTING() syntax differs from OLD./NEW.
syntax used in triggers

Why should it be the same?

Good question. What could be wrong with making up new syntax?

The obvious answer is because we would simply have nothing to guide
us. No principles that can be applied, just opinions.

My considered opinion is that the above syntax is
* non-standard
* inconsistent with what we have elsewhere
* an additional item for implementors to handle

I could use more emotive words here, but the above should suffice to
cover my unease at inventing new SQL constructs. This is Postgres.

What worries me the most is that ORM implementors everywhere will
simply ignore our efforts, leaving us with something we'd much rather
we didn't have. As a possible committer of this feature, I would not
wish to put my name to that. You will need one a committer who will do
that.

Which brings me back to the SQL Standard, which is MERGE. We already
know the MERGE command does not fully and usefully define its
concurrent behaviour; I raised this 6 years ago. It's not clear to me
that that we couldn't more closely define the behaviour for a subset
of the command.

If we implement MERGE, then we will help ORM developers do less work
to support Postgres, which will encourage adoption.

My proposal would be to implement only a very limited syntax for MERGE
in this release, replacing this

INSERT INTO tab(colB) values('foo') ON CONFLICT UPDATE set colB =
CONFLICTING(colB) WHERE colA != 3

with this...

MERGE INTO tab USING VALUES ('foo')
WHEN NOT MATCHED THEN
INSERT (colB)
WHEN MATCHED THEN
UPDATE SET colB = NEW.p1

and throwing "ERROR: full syntax for MERGE not implemented yet" if
people stretch too far.

If there is some deviation from the standard, it can be explained
clearly, though I don't see we would need to do that - we can extend
beyond the standard to explain the concurrent behaviour. And we will
be a lot closer to getting full MERGE also.

Doing MERGE syntax is probably about 2 weeks work, which is better
than 2 weeks per ORM to support the new Postgres-only syntax.

Thanks for your efforts to bring this to a conclusion.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#51Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#50)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sun, Sep 28, 2014 at 1:17 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

MERGE INTO tab USING VALUES ('foo')
WHEN NOT MATCHED THEN
INSERT (colB)
WHEN MATCHED THEN
UPDATE SET colB = NEW.p1

and throwing "ERROR: full syntax for MERGE not implemented yet" if
people stretch too far.

That isn't the MERGE syntax either. Where is the join?

I've extensively discussed why I think we should avoid calling
something upsert-like MERGE, as you know:
/messages/by-id/CAM3SWZRP0c3g6+aJ=YYDGYAcTZg0xA8-1_FCVo5Xm7hrEL34kw@mail.gmail.com

We *should* have a MERGE feature, but one that serves the actual MERGE
use-case well. That is an important use-case; it just isn't the one
I'm interested in right now.

FWIW, I agree that it wouldn't be much work to do this - what you
present here really is just a different syntax for what I have here
(which isn't MERGE). I think it would be counter-productive to pursue
this, though. Also, what about limiting the unique indexes under
consideration?

There was informal meeting of this at the dev meeting a in 2012.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#52Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#51)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sun, Sep 28, 2014 at 1:31 PM, Peter Geoghegan <pg@heroku.com> wrote:

There was informal meeting of this at the dev meeting a in 2012.

I mean: There was informal agreement that as long as we're working on
a feature that makes useful, UPSERT-like guarantees, we shouldn't use
the MERGE syntax. MERGE clearly benefits (in ways only relevant to the
use-case it targets) from having the leeway to not care about what
someone with the UPSERT use-case would call race conditions.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#53Gavin Flower
GavinFlower@archidevsys.co.nz
In reply to: Peter Geoghegan (#51)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 29/09/14 09:31, Peter Geoghegan wrote:

On Sun, Sep 28, 2014 at 1:17 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

MERGE INTO tab USING VALUES ('foo')
WHEN NOT MATCHED THEN
INSERT (colB)
WHEN MATCHED THEN
UPDATE SET colB = NEW.p1

and throwing "ERROR: full syntax for MERGE not implemented yet" if
people stretch too far.

That isn't the MERGE syntax either. Where is the join?

I've extensively discussed why I think we should avoid calling
something upsert-like MERGE, as you know:
/messages/by-id/CAM3SWZRP0c3g6+aJ=YYDGYAcTZg0xA8-1_FCVo5Xm7hrEL34kw@mail.gmail.com

We *should* have a MERGE feature, but one that serves the actual MERGE
use-case well. That is an important use-case; it just isn't the one
I'm interested in right now.

FWIW, I agree that it wouldn't be much work to do this - what you
present here really is just a different syntax for what I have here
(which isn't MERGE). I think it would be counter-productive to pursue
this, though. Also, what about limiting the unique indexes under
consideration?

There was informal meeting of this at the dev meeting a in 2012.

How about have a stub page for MERGE, saying it is not implemented yet,
but how about considering UPSERT - or something of that nature?

I can suspect that people are much more likely to look for 'MERGE' in an
index, or look for 'MERGE' in the list of SQL commands, than 'UPSERT'.

Cheers,
Gavin

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#54Peter Geoghegan
pg@heroku.com
In reply to: Gavin Flower (#53)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sun, Sep 28, 2014 at 3:41 PM, Gavin Flower
<GavinFlower@archidevsys.co.nz> wrote:

How about have a stub page for MERGE, saying it is not implemented yet, but
how about considering UPSERT - or something of that nature?

I can suspect that people are much more likely to look for 'MERGE' in an
index, or look for 'MERGE' in the list of SQL commands, than 'UPSERT'.

Seems reasonable.

What I have a problem with is using the MERGE syntax to match people's
preexisting confused ideas about what MERGE does. If we do that, it'll
definitely bite us when we go to make what we'd be calling MERGE do
what MERGE is actually supposed to do. I favor clearly explaining
that.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#55Gavin Flower
GavinFlower@archidevsys.co.nz
In reply to: Peter Geoghegan (#54)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 29/09/14 11:57, Peter Geoghegan wrote:

On Sun, Sep 28, 2014 at 3:41 PM, Gavin Flower
<GavinFlower@archidevsys.co.nz> wrote:

How about have a stub page for MERGE, saying it is not implemented yet, but
how about considering UPSERT - or something of that nature?

I can suspect that people are much more likely to look for 'MERGE' in an
index, or look for 'MERGE' in the list of SQL commands, than 'UPSERT'.

Seems reasonable.

What I have a problem with is using the MERGE syntax to match people's
preexisting confused ideas about what MERGE does. If we do that, it'll
definitely bite us when we go to make what we'd be calling MERGE do
what MERGE is actually supposed to do. I favor clearly explaining
that.

Opinionated I may be, but I wanted stay well clear of the syntax
minefield in this area - as I still have at least a vestigial instinct
for self preservation! :-)

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#56Peter Geoghegan
pg@heroku.com
In reply to: Gavin Flower (#55)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sun, Sep 28, 2014 at 6:15 PM, Gavin Flower
<GavinFlower@archidevsys.co.nz> wrote:

What I have a problem with is using the MERGE syntax to match people's
preexisting confused ideas about what MERGE does. If we do that, it'll
definitely bite us when we go to make what we'd be calling MERGE do
what MERGE is actually supposed to do. I favor clearly explaining
that.

Opinionated I may be, but I wanted stay well clear of the syntax minefield
in this area - as I still have at least a vestigial instinct for self
preservation! :-)

To be clear: I don't think Simon is confused about this at all, which
is why I'm surprised that he suggested it.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#57Gavin Flower
GavinFlower@archidevsys.co.nz
In reply to: Peter Geoghegan (#56)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 29/09/14 14:20, Peter Geoghegan wrote:

On Sun, Sep 28, 2014 at 6:15 PM, Gavin Flower
<GavinFlower@archidevsys.co.nz> wrote:

What I have a problem with is using the MERGE syntax to match people's
preexisting confused ideas about what MERGE does. If we do that, it'll
definitely bite us when we go to make what we'd be calling MERGE do
what MERGE is actually supposed to do. I favor clearly explaining
that.

Opinionated I may be, but I wanted stay well clear of the syntax minefield
in this area - as I still have at least a vestigial instinct for self
preservation! :-)

To be clear: I don't think Simon is confused about this at all, which
is why I'm surprised that he suggested it.

More specifically, I have only lightly read this thread - and while I
think the functionality is useful, I have not thought about it any real
depth. I was thinking more along the lines that if I needed
functionality like this, where & how might I look for it.

I was remembering my problems looking up syntax in COBOL after coming
from FORTRAN (& other languages) - some concepts had different names and
the philosophy was significantly different in places. The relevance
here, is that peoples' background in other DBMS & knowledge of SQL
standards affect what they expect, as well as preventing unnecessary
conflicts between PostgreSQL & SQL standards (as far as is practicable &
sensible).

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#58Craig Ringer
craig@2ndquadrant.com
In reply to: Gavin Flower (#53)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/29/2014 06:41 AM, Gavin Flower wrote:

I can suspect that people are much more likely to look for 'MERGE' in an
index, or look for 'MERGE' in the list of SQL commands, than 'UPSERT'.

and/or to be looking for MySQL's:

ON DUPLICATE KEY {IGNORE|UPDATE}

What astonishes me when I look around at how other RDBMS users solve
this is how many of them completely ignore concurrency issues. e.g. in
this SO question:

http://stackoverflow.com/q/108403/398670

there's an alarming lack of concern for concurrency, just a couple of
links to :

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

(BTW, that article contains some useful information about corner cases
any upsert approach should test and deal with).

Similar with Oracle: Alarming lack of concern for concurrency among users:

http://stackoverflow.com/q/237327/398670

Useful article:

http://michaeljswart.com/2011/09/mythbusting-concurrent-updateinsert-solutions/

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#59Peter Geoghegan
pg@heroku.com
In reply to: Craig Ringer (#58)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sun, Sep 28, 2014 at 8:53 PM, Craig Ringer <craig@2ndquadrant.com> wrote:

there's an alarming lack of concern for concurrency, just a couple of
links to :

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

(BTW, that article contains some useful information about corner cases
any upsert approach should test and deal with).

Did you find some of those links from my pgCon slides, or
independently? I'm well aware of those issues, FWIW. Avoiding
repeating the mistakes of others is something that I thought about
from an early stage.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#60Craig Ringer
craig@2ndquadrant.com
In reply to: Peter Geoghegan (#59)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/29/2014 12:03 PM, Peter Geoghegan wrote:

On Sun, Sep 28, 2014 at 8:53 PM, Craig Ringer <craig@2ndquadrant.com> wrote:

there's an alarming lack of concern for concurrency, just a couple of
links to :

http://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/

(BTW, that article contains some useful information about corner cases
any upsert approach should test and deal with).

Did you find some of those links from my pgCon slides, or
independently? I'm well aware of those issues, FWIW. Avoiding
repeating the mistakes of others is something that I thought about
from an early stage.

Independently. I'm very glad to see you've looked over those issues.

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#61Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Peter Geoghegan (#51)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/28/2014 11:31 PM, Peter Geoghegan wrote:

On Sun, Sep 28, 2014 at 1:17 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

MERGE INTO tab USING VALUES ('foo')
WHEN NOT MATCHED THEN
INSERT (colB)
WHEN MATCHED THEN
UPDATE SET colB = NEW.p1

and throwing "ERROR: full syntax for MERGE not implemented yet" if
people stretch too far.

That isn't the MERGE syntax either. Where is the join?

I've extensively discussed why I think we should avoid calling
something upsert-like MERGE, as you know:
/messages/by-id/CAM3SWZRP0c3g6+aJ=YYDGYAcTZg0xA8-1_FCVo5Xm7hrEL34kw@mail.gmail.com

We *should* have a MERGE feature, but one that serves the actual MERGE
use-case well. That is an important use-case; it just isn't the one
I'm interested in right now.

I agree we should not use the MERGE keyword for this. The upsert feature
has tighter concurrency requirements than the SQL MERGE command, and
that might come back to bite us. It would be highly confusing if some
variants of MERGE are concurrency-safe and others are not, but if we now
promise that our MERGE command is always concurrency-safe, that promise
might be difficult to keep for the full MERGE syntax, and for whatever
extensions the SQL committee comes up in the future.

That said, it would be handy if the syntax was closer to MERGE. Aside
from the concurrency issues, it does the same thing, right? So how about
making the syntax identical to MERGE, except for swapping the MERGE
keyword with e.g. UPSERT?

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#62Andres Freund
andres@2ndquadrant.com
In reply to: Heikki Linnakangas (#61)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-29 09:51:45 +0300, Heikki Linnakangas wrote:

That said, it would be handy if the syntax was closer to MERGE. Aside from
the concurrency issues, it does the same thing, right? So how about making
the syntax identical to MERGE, except for swapping the MERGE keyword with
e.g. UPSERT?

I don't think that's a good idea. What most people are missing is an
*easy* way to do upsert, that's similar to the normal INSERT. Not
something with a pretty different syntax. That's why INSERT OR REPLACE
and stuff like that was well adopted.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#63Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#51)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 28 September 2014 21:31, Peter Geoghegan <pg@heroku.com> wrote:

On Sun, Sep 28, 2014 at 1:17 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

MERGE INTO tab USING VALUES ('foo')
WHEN NOT MATCHED THEN
INSERT (colB)
WHEN MATCHED THEN
UPDATE SET colB = NEW.p1

and throwing "ERROR: full syntax for MERGE not implemented yet" if
people stretch too far.

I've extensively discussed why I think we should avoid calling
something upsert-like MERGE, as you know:
/messages/by-id/CAM3SWZRP0c3g6+aJ=YYDGYAcTZg0xA8-1_FCVo5Xm7hrEL34kw@mail.gmail.com

We *should* have a MERGE feature, but one that serves the actual MERGE
use-case well. That is an important use-case; it just isn't the one
I'm interested in right now.

FWIW, I agree that it wouldn't be much work to do this - what you
present here really is just a different syntax for what I have here
(which isn't MERGE). I think it would be counter-productive to pursue
this, though. Also, what about limiting the unique indexes under
consideration?

There was informal meeting of this at the dev meeting a in 2012.

I agreed with the initial proposition to go for a different syntax.

Now that I see the new syntax, I have changed my mind. The new syntax
is much worse, I am sorry to say.

MERGE standard does not offer guidance on concurrent effects, but
there is no confusion as to how it works. We can impose our own
concurrency rules since those are not covered by the standard. These
are quite clear for single row inputs anyway, i.e. a VALUES clause.

That isn't the MERGE syntax either. Where is the join?

There doesn't need to be one. INSERT assumes that if a column list is
not mentioned then the VALUES clause is joined directly to the table,
so we can do the same thing for MERGE.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#64Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#56)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 29 September 2014 02:20, Peter Geoghegan <pg@heroku.com> wrote:

On Sun, Sep 28, 2014 at 6:15 PM, Gavin Flower
<GavinFlower@archidevsys.co.nz> wrote:

What I have a problem with is using the MERGE syntax to match people's
preexisting confused ideas about what MERGE does. If we do that, it'll
definitely bite us when we go to make what we'd be calling MERGE do
what MERGE is actually supposed to do. I favor clearly explaining
that.

Opinionated I may be, but I wanted stay well clear of the syntax minefield
in this area - as I still have at least a vestigial instinct for self
preservation! :-)

To be clear: I don't think Simon is confused about this at all, which
is why I'm surprised that he suggested it.

At this point, I started to discuss MERGE again, but let me stop
because there is a wider issue.

These threads are littered with references that go nowhere. Links back
to an email where you said the same thing two years ago are not proof
that its a bad idea. You need to carefully explain things in detail in
one place to allow people to make up their own minds, not just
re-assert it endlessly and claim 3 friends also agree, while everyone
else searches desperately for what the actual reasons are. Lists of
problems with MERGE statement, with examples are what is needed to
convince and keep us convinced. Then full documentation on the
proposed solution, so we can see that also.

Please go to some trouble to tidy things up so we have clarity that
*we* can see and decide for ourselves whether or not you are correct.

Thanks

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#65Simon Riggs
simon@2ndquadrant.com
In reply to: Andres Freund (#62)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 29 September 2014 08:02, Andres Freund <andres@2ndquadrant.com> wrote:

On 2014-09-29 09:51:45 +0300, Heikki Linnakangas wrote:

That said, it would be handy if the syntax was closer to MERGE. Aside from
the concurrency issues, it does the same thing, right? So how about making
the syntax identical to MERGE, except for swapping the MERGE keyword with
e.g. UPSERT?

I don't think that's a good idea. What most people are missing is an
*easy* way to do upsert, that's similar to the normal INSERT. Not
something with a pretty different syntax. That's why INSERT OR REPLACE
and stuff like that was well adopted.

We have 3 choices...

1. SQL Standard MERGE (or a subset)
2. MySQL Compatible syntax
3. Something completely different

If we go for (3), I would like to see a long and detailed explanation
of what is wrong with (1) and (2) before we do (3). That needs to be
clear, detailed, well researched, correct and agreed. Otherwise when
we release such a feature, people will ask, why did you do that? And
yet nobody will remember.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#66Craig Ringer
craig@2ndquadrant.com
In reply to: Simon Riggs (#64)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/29/2014 05:10 PM, Simon Riggs wrote:

Please go to some trouble to tidy things up so we have clarity that
*we* can see and decide for ourselves whether or not you are correct.

Are you suggesting a wiki page to document the issues, discussions
around each issue, etc? A summary mail? Something else?

We have https://wiki.postgresql.org/wiki/SQL_MERGE but it's outdated,
pretty sparse, and not really about the current work.

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#67Simon Riggs
simon@2ndquadrant.com
In reply to: Craig Ringer (#66)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 29 September 2014 10:27, Craig Ringer <craig@2ndquadrant.com> wrote:

On 09/29/2014 05:10 PM, Simon Riggs wrote:

Please go to some trouble to tidy things up so we have clarity that
*we* can see and decide for ourselves whether or not you are correct.

Are you suggesting a wiki page to document the issues, discussions
around each issue, etc? A summary mail? Something else?

Something that can be edited to keep it up to date, yes.

We have https://wiki.postgresql.org/wiki/SQL_MERGE but it's outdated,
pretty sparse, and not really about the current work.

I rest my case.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#68Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#47)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 28 September 2014 08:40, Peter Geoghegan <pg@heroku.com> wrote:

On Sat, Sep 27, 2014 at 11:21 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

My request was for the following...

Agree command semantics by producing these things
* Explanatory documentation (Ch6.4 Data Manipulation - Upsert)

Do you really think I could get an entire chapter out of this?

If you were an ORM developer reading the PostgreSQL Release Notes for
9.5, which URL would you visit to see a complete description of the
new feature, including how it works concurrently, locking and other
aspects. How would you check whether some strange behaviour was a bug,
or intentional?

The new docs are scattered across many pages and there are very few
examples. It was very difficult to read like that.

* SQL Reference Documentation (INSERT)
* Test cases for feature
* Test cases for concurrency

All of these were added. There are two new sets of isolation tests,
one per variant of the new clause (IGNORE/UPDATE).

When you say "added", what do you mean? You posted one new doc patch,
with no tests in it.

Question arising: do you need to specify location criteria, or is this
an additional filter? When/why would we want that?

It is an additional way to specify a predicate/condition to UPDATE on.
There might be a kind of redundancy, if you decided to repeat the
constrained values in the predicate too, but if you're using the WHERE
clause sensibly there shouldn't be. So your UPDATE's "full predicate"
is sort of the union of the constrained values that the conflict path
was taken for, plus whatever you put in the WHERE clause, but not
quite because they're evaluated at different times (as explained
within transaction-iso.html).

I think we should leave that out of the first commit. I'm not sure why
that exists. If you wish to push down that route, then I recommend
using the MERGE syntax because it caters for this much better than
this.

How would you do "if colA = 3 then ignore else update"?

Technically, you can't do that exact thing. IGNORE is just for quickly
dealing with ETL-type problems (and it is reasonable to use it without
one particular unique index in mind, unlike ON CONFLICT UPDATE) -
think pgloader. But if you did this:

INSERT INTO tab(colB) values('foo') ON CONFLICT UPDATE set colB =
CONFLICTING(colB) WHERE colA != 3

Then you would achieve almost the same thing. You wouldn't have
inserted or updated anything if the only rows considered had a colA of
3, but any such rows considered would be locked, which isn't the same
as IGNOREing them.

No explanation of why the CONFLICTING() syntax differs from OLD./NEW.
syntax used in triggers

Why should it be the same?

Because it would be a principled approach to do that.

If we aren't going to use MERGE syntax, it would make sense to at
least use the same terminology.

e.g.
INSERT ....
WHEN MATCHED
UPDATE

The concept of "matched" is identical between MERGE and UPSERT and it
will be confusing to have two words for the same thing.

There seems to be a good reason not to use the MySQL syntax of ON
DUPLICATE KEY UPDATE, which doesn't allow you to specify UPDATE
operations other than a replace, so no deltas, e.g. SET a = a + x

Having said that, it would be much nicer to have a mode that allows
you to just say the word "UPDATE" and have it copy the data into the
correct columns, like MySQL does. That is very intuitive, even if it
isn't very flexible.

The page makes no mention of the upsert problem, nor is any previous
code mentioned.

What's the upsert problem? I mean, apart from the fact that we don't
have it. Note that it is documented that one of the two outcomes is
guaranteed.

I should have updated the plpgsql looping subxact example, though.

That's what I meant.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#69Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#39)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Sep 26, 2014 at 5:40 PM, Peter Geoghegan <pg@heroku.com> wrote:

I will be frank. Everyone knows that the nbtree locking parts of this
are never going to be committed over your objections. It cannot
happen. And yet, I persist in proposing that we go that way. I may be
stubborn, but I am not so stubborn that I'd jeopardize all the work
I've put into this to save one aspect of it that no one really cares
about anyway (even I only care about meeting my goals for user visible
behavior [2]). I may actually come up with a better way to make what
you outline work; then again, I may not. I have no idea, to be honest.
It's pretty clear that I'm going to have a hard time getting your
basic approach to value locking accepted without rethinking it a lot,
though. Can you really say that you won't have serious misgivings
about something like the "tuple->xmin = InvalidTransactionId"
swapping, if I actually formally propose it? That's very invasive to a
lot of places. And right now, I have no idea how we could do better.

I really only want to get to where we have a design that's acceptable.
In all sincerity, I may yet be convinced to go your way. It's possible
that I've failed to fully understand your concerns. Is it really just
about making INSERT ... ON CONFLICT IGNORE work with exclusion
constraints (UPDATE clearly makes little sense)?

I'll be frank, too. Heikki doesn't need to persuade you to go his
way, because everyone other than yourself who has looked at this
problem has come up with a design that looks like his. That includes,
but is not limited to, every committer who has looked at this. The
burden of proof is on you to convince everyone else that the promise
tuple approach is wrong, not on everyone else to convince you that
it's right. This is a community, and it operates by consensus. Your
opinion, no matter how strongly held in the face of opposition, is not
a consensus.

As far as finding an option that's better than clearing the xmin, the
point is not that we'd commit that design. Well, we might, if
somebody does a careful audit of all the relevant code paths and makes
a convincing argument that it's safe. But more likely, somebody will
go find some other bit space that can be used to do this. The fact
that it's not immediately obvious to you (or Heikki) where to find
that bit-space is not a principled argument for changing the whole
design.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#70Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#69)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Sep 29, 2014 at 8:31 AM, Robert Haas <robertmhaas@gmail.com> wrote:

I'll be frank, too. Heikki doesn't need to persuade you to go his
way, because everyone other than yourself who has looked at this
problem has come up with a design that looks like his.

Andres suggested something that is very roughly comparable, perhaps.
And that was it, really, except for your suggestion that I convinced
you wasn't the best way forward (for unrelated reasons).

As far as finding an option that's better than clearing the xmin, the
point is not that we'd commit that design. Well, we might, if
somebody does a careful audit of all the relevant code paths and makes
a convincing argument that it's safe. But more likely, somebody will
go find some other bit space that can be used to do this. The fact
that it's not immediately obvious to you (or Heikki) where to find
that bit-space is not a principled argument for changing the whole
design.

I never said that it was.

*Obviously* I know that Heikki is not obligated to convince me of
anything - I said as much. Whether or not Heikki is obligated to
convince me is not the point, which is that it would be nice if he
could convince me. I think that there are some serious issues with the
promise tuples approach, and discussing those brings us closer to
moving forward.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#71Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#70)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Sep 29, 2014 at 10:37 AM, Peter Geoghegan <pg@heroku.com> wrote:

But more likely, somebody will

go find some other bit space that can be used to do this.

My concerns have nothing to do with the availability of bit space, obviously.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#72Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#68)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Sep 29, 2014 at 7:21 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

If you were an ORM developer reading the PostgreSQL Release Notes for
9.5, which URL would you visit to see a complete description of the
new feature, including how it works concurrently, locking and other
aspects. How would you check whether some strange behaviour was a bug,
or intentional?

We don't do that with UPDATE, so why would we do it with this? There
is an existing structure to the documentation that needs to be
respected. This is the case even though the EvalPlanQual() mechanism
is a total Postgres-ism, which can potentially violate snapshot
isolation (this is not true of Oracle's READ COMMITTED, for example).
You have to go out of your way to find that out at the moment. But I
know ORM authors, and the majority probably don't understand this
stuff - that ought to be okay.

All of these were added. There are two new sets of isolation tests,
one per variant of the new clause (IGNORE/UPDATE).

When you say "added", what do you mean? You posted one new doc patch,
with no tests in it.

I mean that there was a commit (not included with the documentation,
but with the original patchset) with many tests. I don't know why
you're suggesting that I don't have "concurrency tests". There are
isolation tests in that commit. There are also many regression tests.

It is an additional way to specify a predicate/condition to UPDATE on.
There might be a kind of redundancy, if you decided to repeat the
constrained values in the predicate too, but if you're using the WHERE
clause sensibly there shouldn't be. So your UPDATE's "full predicate"
is sort of the union of the constrained values that the conflict path
was taken for, plus whatever you put in the WHERE clause, but not
quite because they're evaluated at different times (as explained
within transaction-iso.html).

I think we should leave that out of the first commit. I'm not sure why
that exists. If you wish to push down that route, then I recommend
using the MERGE syntax because it caters for this much better than
this.

Why leave it out? People are going to "push the predicate into the
targetlist" if I do, and the effect is exactly the same.

No explanation of why the CONFLICTING() syntax differs from OLD./NEW.
syntax used in triggers

Why should it be the same?

Because it would be a principled approach to do that.

That is just an assertion. The MERGE syntax doesn't use that either.

If we aren't going to use MERGE syntax, it would make sense to at
least use the same terminology.

e.g.
INSERT ....
WHEN MATCHED
UPDATE

The concept of "matched" is identical between MERGE and UPSERT and it
will be confusing to have two words for the same thing.

I don't care if we change the spelling to "WHEN MATCHED
UPDATE/IGNORE". That seems fine. But MERGE is talking about a join,
not the presence of a would-be duplicate violation.

There seems to be a good reason not to use the MySQL syntax of ON
DUPLICATE KEY UPDATE, which doesn't allow you to specify UPDATE
operations other than a replace, so no deltas, e.g. SET a = a + x

That isn't true, actually. It clearly does.

Having said that, it would be much nicer to have a mode that allows
you to just say the word "UPDATE" and have it copy the data into the
correct columns, like MySQL does. That is very intuitive, even if it
isn't very flexible.

Multi-assignment updates (with or without CONFLICTING()) are supported, FWIW.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#73Peter Geoghegan
pg@heroku.com
In reply to: Andres Freund (#62)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Sep 29, 2014 at 12:02 AM, Andres Freund <andres@2ndquadrant.com> wrote:

On 2014-09-29 09:51:45 +0300, Heikki Linnakangas wrote:

That said, it would be handy if the syntax was closer to MERGE. Aside from
the concurrency issues, it does the same thing, right? So how about making
the syntax identical to MERGE, except for swapping the MERGE keyword with
e.g. UPSERT?

I don't think that's a good idea. What most people are missing is an
*easy* way to do upsert, that's similar to the normal INSERT. Not
something with a pretty different syntax. That's why INSERT OR REPLACE
and stuff like that was well adopted.

Agreed.

MERGE isn't the same other than the concurrency concerns, in any case.
It is driven by a join, which is very flexible, but also has problems
with concurrency (leaving aside the fact that in practice it doesn't
tend to work out well when it isn't an equi-join). UPSERT *has* to be
driven by something like a would-be unique violation, not an outer
join matching or not matching.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#74Peter Geoghegan
pg@heroku.com
In reply to: Craig Ringer (#66)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Sep 29, 2014 at 2:27 AM, Craig Ringer <craig@2ndquadrant.com> wrote:

Please go to some trouble to tidy things up so we have clarity that
*we* can see and decide for ourselves whether or not you are correct.

Are you suggesting a wiki page to document the issues, discussions
around each issue, etc? A summary mail? Something else?

It isn't easy, Simon. I thought my big e-mail at the start of the
thread was a summary.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#75Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#65)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Sep 29, 2014 at 2:14 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

1. SQL Standard MERGE (or a subset)
2. MySQL Compatible syntax
3. Something completely different

If we go for (3), I would like to see a long and detailed explanation
of what is wrong with (1) and (2) before we do (3). That needs to be
clear, detailed, well researched, correct and agreed. Otherwise when
we release such a feature, people will ask, why did you do that? And
yet nobody will remember.

My syntax is inspired by the MySQL one, with some influence from
SQLite (SQLite have an ON CONFLICT REPLACE). I don't want to copy
MySQL's use of VALUES() in the UPDATE targetlist - I spell the same
concept as CONFLICTING(). I guess that otherwise they'd have to make
the VALUES()/CONFLICTING() expression a whole new fully reserved
keyword, and preferred not to. Also, MySQL bizarrely omits the "SET"
keyword within ON DUPLICATE KEY UPDATE. So I haven't copied it exactly
on aesthetic grounds. I think that the actual reason for the latter
wart (the SET omission) is that MySQL found it easier to write the
grammar that way. Consider what we do here to make SET in an UPDATE
work, despite the fact that it's a valid column name:

https://github.com/postgres/postgres/blob/REL9_4_STABLE/src/backend/parser/gram.y#L10141

So I wanted to suggest something similar but not identical to the
MySQL syntax, with a bit more flexibility/safety. I thought that I
could do so without emulating their warts.

As I've mentioned, it isn't the MERGE syntax because that is quite a
different thing. There is a place for it, but it's not strategically
important in the same way as upsert is.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#76Kevin Grittner
kgrittn@ymail.com
In reply to: Peter Geoghegan (#75)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Peter Geoghegan <pg@heroku.com> wrote:

As I've mentioned, it isn't the MERGE syntax because that is
quite a different thing. There is a place for it, but it's not
strategically important in the same way as upsert is.

I think that the subset of the MERGE syntax that would be needed
for UPSERT behavior would be as follows. For one row as literals:

MERGE INTO tab t
USING (VALUES ('foo', 'p1')) new(id, colB)
ON (t.id = new.id)
WHEN MATCHED THEN
UPDATE SET colB = new.colB
WHEN NOT MATCHED THEN
INSERT (id, colB) VALUES (new.id, new.colB);

If you have a bunch of rows in a "bar" table you want to merge in:

MERGE INTO tab t
USING (SELECT id, colB FROM bar) b
ON (t.id = b.id)
WHEN MATCHED THEN
UPDATE SET colB = b.colB
WHEN NOT MATCHED THEN
INSERT (id, colB) VALUES (b.id, b.colB);

I fail to see how this is harder or more problematic than the
nonstandard suggestions that have been floated. I don't know why
we would be even *considering* a nonstandard syntax rather than
saying that only this subset is supported *so far*.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#77Peter Geoghegan
pg@heroku.com
In reply to: Kevin Grittner (#76)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Sep 29, 2014 at 1:40 PM, Kevin Grittner <kgrittn@ymail.com> wrote:

I think that the subset of the MERGE syntax that would be needed
for UPSERT behavior would be as follows. For one row as literals:

MERGE INTO tab t
USING (VALUES ('foo', 'p1')) new(id, colB)
ON (t.id = new.id)
WHEN MATCHED THEN
UPDATE SET colB = new.colB
WHEN NOT MATCHED THEN
INSERT (id, colB) VALUES (new.id, new.colB);

If you have a bunch of rows in a "bar" table you want to merge in:

MERGE INTO tab t
USING (SELECT id, colB FROM bar) b
ON (t.id = b.id)
WHEN MATCHED THEN
UPDATE SET colB = b.colB
WHEN NOT MATCHED THEN
INSERT (id, colB) VALUES (b.id, b.colB);

I fail to see how this is harder or more problematic than the
nonstandard suggestions that have been floated. I don't know why
we would be even *considering* a nonstandard syntax rather than
saying that only this subset is supported *so far*.

Heikki, Andres and I are against using MERGE for this, fwiw. Tom
seemed to think so too, on previous occasions. It isn't a matter of
alternative syntaxes. I have described in detail why I think it's a
bad idea - I have linked to that about 3 times in this thread. It
paints us into a corner when we go to make this do what MERGE is
supposed to do. Do you want a feature that, when fully generalized,
plays a special visibility game based on whether or not some exact set
of conditions are met? That is a non-starter, IMV.

The whole idea of using an arbitrary join syntax seems great, but I
need something that works backwards from would-be unique violations.
That's the only way to preserve the UPSERT guarantees (atomicity,
definite insert or update).

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#78Kevin Grittner
kgrittn@ymail.com
In reply to: Peter Geoghegan (#77)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Peter Geoghegan <pg@heroku.com> wrote:

Heikki, Andres and I are against using MERGE for this, fwiw. Tom
seemed to think so too, on previous occasions. It isn't a matter
of alternative syntaxes. I have described in detail why I think
it's a bad idea - I have linked to that about 3 times in this
thread.

Yeah, I read that, and I'm not convinced.

It paints us into a corner when we go to make this do what MERGE
is supposed to do. Do you want a feature that, when fully
generalized, plays a special visibility game based on whether or
not some exact set of conditions are met? That is a non-starter,
IMV.

For other queries we use different access techniques not only
based on the presence of an index, but on the state of the
visibility map, degree of bloat, ordering of tuples in a heap,
etc. -- so sure, I'm OK with different execution styles based on
whether your join conditions match a unique index on columns that
can't be NULL.

The whole idea of using an arbitrary join syntax seems great,
but I need something that works backwards from would-be unique
violations. That's the only way to preserve the UPSERT guarantees
(atomicity, definite insert or update).

I absolutely don't buy that it is the *only way*. It is probably
(by far) the *easiest* way, and doing so gets us a frequently-
requested feature; but I think limiting the initial implementation
to cases where the join conditions include equality tests on all
columns of some appropriate unique index is fine, and doesn't seem
to me to preclude further development of the MERGE feature for
additional cases. In fact, I think having something to build on is
a plus.

The claims that you can't get a duplicate key error with an UPSERT
are completely bogus, IMV. The *best* you can do is avoid them on
the index used for matching (unless you're willing to ignore
problem input rows or mangle the data in surprising ways to avoid
such an error on a second unique index). With a fully functional
MERGE syntax you could eventually gain the ability to write
exceptions like that to the location of your choice (be it a table
or WARNING messages in the log).

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#79Peter Geoghegan
pg@heroku.com
In reply to: Kevin Grittner (#78)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Sep 29, 2014 at 2:20 PM, Kevin Grittner <kgrittn@ymail.com> wrote:

The claims that you can't get a duplicate key error with an UPSERT
are completely bogus, IMV. The *best* you can do is avoid them on
the index used for matching (unless you're willing to ignore
problem input rows or mangle the data in surprising ways to avoid
such an error on a second unique index).

That's what I meant. Doing any more than that isn't useful. I want to
do exactly that - no more, no less.

If you're still not convinced, then I think the fact that no MERGE
implementation does what you want should be convincing. It is
*horrifically* complicated to make what you want work, if indeed it is
technically feasible at all. Isn't this already complicated enough?

We use different access techniques as you say. We do not use different
types of snapshots. That seems like a pretty fundamental distinction.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#80Kevin Grittner
kgrittn@ymail.com
In reply to: Peter Geoghegan (#79)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Peter Geoghegan <pg@heroku.com> wrote:

I think the fact that no MERGE implementation does what you want
should be convincing. It is *horrifically* complicated to make
what you want work, if indeed it is technically feasible at all.
Isn't this already complicated enough?

What about the MERGE syntax I posted makes it hard to implement the
statement validation and execution code you already have? (I'm
asking about for the UPSERT case only, not an implementation of all
aspects of the standard syntax.)

To recap, in summary that would be:

MERGE INTO tablename [ alias ]
USING ( relation ) [ alias ]
ON ( boolean-expression )
WHEN MATCHED THEN
UPDATE SET target-column = expression
[ , target-column = expression ] ...
WHEN NOT MATCHED THEN
INSERT ( target-columns ) VALUES ( expressions )

The initial implementation could restrict to these exact clauses
and require that the boolean-expression used equality-quals on all
columns of a unique index on only NOT NULL columns. I think the
relation could be a VALUES clause or any SELECT statement without
causing problems; do you think that would need to be constrained in
some way? It would be wonderful if the expressions could be any
arbitrary expressions assignable to the target columns; do you see
a need to constrain that?

If we later expand the MERGE statement to more general cases, I
don't see why statements of this form could not be treated as a
special case. Personally, I'm dubious that we would want to
compromise transactional integrity to achieve the broader case, but
doubt that we would need to do so. I won't say it is just a SMOP,
because there would need to be some careful design first. ;-)

We use different access techniques as you say. We do not use
different types of snapshots. That seems like a pretty
fundamental distinction.

We use special types of snapshots in running DML that fires certain
types of constraints, like FKs.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#81Andres Freund
andres@2ndquadrant.com
In reply to: Kevin Grittner (#80)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-29 14:57:45 -0700, Kevin Grittner wrote:

Peter Geoghegan <pg@heroku.com> wrote:

I think the fact that no MERGE implementation does what you want
should be convincing. It is *horrifically* complicated to make
what you want work, if indeed it is technically feasible at all.
Isn't this already complicated enough?

What about the MERGE syntax I posted makes it hard to implement the
statement validation and execution code you already have? (I'm
asking about for the UPSERT case only, not an implementation of all
aspects of the standard syntax.)

To recap, in summary that would be:

MERGE INTO tablename [ alias ]
USING ( relation ) [ alias ]
ON ( boolean-expression )
WHEN MATCHED THEN
UPDATE SET target-column = expression
[ , target-column = expression ] ...
WHEN NOT MATCHED THEN
INSERT ( target-columns ) VALUES ( expressions )

The initial implementation could restrict to these exact clauses
and require that the boolean-expression used equality-quals on all
columns of a unique index on only NOT NULL columns.

That'll make it really hard to actually implement real MERGE.

Because suddenly there's no way for the user to know whether he's
written a ON condition that can implement UPSERT like properties
(i.e. the *precise* column list of an index) or not.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#82Peter Geoghegan
pg@heroku.com
In reply to: Andres Freund (#81)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Sep 29, 2014 at 3:02 PM, Andres Freund <andres@2ndquadrant.com> wrote:

That'll make it really hard to actually implement real MERGE.

Because suddenly there's no way for the user to know whether he's
written a ON condition that can implement UPSERT like properties
(i.e. the *precise* column list of an index) or not.

Exactly. The difficulty isn't doing what Kevin says so much as doing
so and then at a later date taking that thing and making it into a
fully featured MERGE. We'll be painted into a corner. That's bad,
because as I've said I think we need MERGE too (just far less
urgently).

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#83Kevin Grittner
kgrittn@ymail.com
In reply to: Andres Freund (#81)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Andres Freund <andres@2ndquadrant.com> wrote:

On 2014-09-29 14:57:45 -0700, Kevin Grittner wrote:

The initial implementation could restrict to these exact clauses
and require that the boolean-expression used equality-quals on all
columns of a unique index on only NOT NULL columns.

That'll make it really hard to actually implement real MERGE.

Because suddenly there's no way for the user to know whether he's
written a ON condition that can implement UPSERT like properties
(i.e. the *precise* column list of an index) or not.

Well, unless we abandon transactional semantics for other MERGE
statements, we should have a way that UPSERT logic continues to
work if you don't match a suitable index; it will just be slower --
potentially a lot slower, but that's what indexes are for. I don't
think we need a separate statement type for the one we "do well",
because I don't think we should do the other one without proper
transactional semantics.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#84Andres Freund
andres@2ndquadrant.com
In reply to: Kevin Grittner (#83)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-29 15:08:36 -0700, Kevin Grittner wrote:

Andres Freund <andres@2ndquadrant.com> wrote:

On 2014-09-29 14:57:45 -0700, Kevin Grittner wrote:

The initial implementation could restrict to these exact clauses
and require that the boolean-expression used equality-quals on all
columns of a unique index on only NOT NULL columns.

That'll make it really hard to actually implement real MERGE.

Because suddenly there's no way for the user to know whether he's
written a ON condition that can implement UPSERT like properties
(i.e. the *precise* column list of an index) or not.

Well, unless we abandon transactional semantics for other MERGE
statements, we should have a way that UPSERT logic continues to
work if you don't match a suitable index; it will just be slower --
potentially a lot slower, but that's what indexes are for. I don't
think we need a separate statement type for the one we "do well",
because I don't think we should do the other one without proper
transactional semantics.

Wrong. You can't realistically implement the guarantees of UPSERT
without a corresponding UNIQUE index.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#85Kevin Grittner
kgrittn@ymail.com
In reply to: Andres Freund (#84)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Andres Freund <andres@2ndquadrant.com> wrote:

Wrong. You can't realistically implement the guarantees of UPSERT
without a corresponding UNIQUE index.

You definitely can do it; the question is what you consider
reasonable in terms of development effort, performance, and
concurrency. I think the problem can be solved with non-scary
values of pretty much any two of those. I guess my assumption is
that we won't handle the general case until someone wants to put
the substantial development effort into making the other two
acceptable.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#86Andres Freund
andres@2ndquadrant.com
In reply to: Kevin Grittner (#85)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-29 15:16:49 -0700, Kevin Grittner wrote:

Andres Freund <andres@2ndquadrant.com> wrote:

Wrong. You can't realistically implement the guarantees of UPSERT
without a corresponding UNIQUE index.

You definitely can do it; the question is what you consider
reasonable in terms of development effort, performance, and
concurrency.

Right. You can exclusively lock the table and such. The point is just
that nobody wants that. I.e. people want to be warned about it.

I think the problem can be solved with non-scary values of pretty much
any two of those. I guess my assumption is that we won't handle the
general case until someone wants to put the substantial development
effort into making the other two acceptable.

Which would be a major loss because MERGE is rather useful outside of
atomic upsert.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#87Peter Geoghegan
pg@heroku.com
In reply to: Kevin Grittner (#83)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Sep 29, 2014 at 3:08 PM, Kevin Grittner <kgrittn@ymail.com> wrote:

Well, unless we abandon transactional semantics for other MERGE
statements, we should have a way that UPSERT logic continues to
work if you don't match a suitable index; it will just be slower --
potentially a lot slower, but that's what indexes are for.

I want an implementation that doesn't have unique violations,
unprincipled deadlocks, or serialization failures at READ COMMITTED. I
want it because that's what the majority of users actually want. It
requires no theoretical justification.

I don't
think we need a separate statement type for the one we "do well",
because I don't think we should do the other one without proper
transactional semantics.

That seems like a very impractical attitude. I cannot simulate what
I've been doing with unique indexes without taking an exclusive table
lock. That is a major footgun, so it isn't going to happen.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#88Craig Ringer
craig@2ndquadrant.com
In reply to: Peter Geoghegan (#72)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/30/2014 01:59 AM, Peter Geoghegan wrote:

On Mon, Sep 29, 2014 at 7:21 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

If you were an ORM developer reading the PostgreSQL Release Notes for
9.5, which URL would you visit to see a complete description of the
new feature, including how it works concurrently, locking and other
aspects. How would you check whether some strange behaviour was a bug,
or intentional?

We don't do that with UPDATE, so why would we do it with this? There
is an existing structure to the documentation that needs to be
respected.

I tend to agree, so long as there are appropriate cross-references.

See, for example, how window function information was added.

This is the case even though the EvalPlanQual() mechanism
is a total Postgres-ism, which can potentially violate snapshot
isolation (this is not true of Oracle's READ COMMITTED, for example).

That's useful to know, and certainly worth covering in the isolation
portion of the docs.

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#89Craig Ringer
craig@2ndquadrant.com
In reply to: Kevin Grittner (#80)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/30/2014 05:57 AM, Kevin Grittner wrote:

Peter Geoghegan <pg@heroku.com> wrote:

I think the fact that no MERGE implementation does what you want
should be convincing. It is *horrifically* complicated to make
what you want work, if indeed it is technically feasible at all.
Isn't this already complicated enough?

What about the MERGE syntax I posted makes it hard to implement the
statement validation and execution code you already have? (I'm
asking about for the UPSERT case only, not an implementation of all
aspects of the standard syntax.)

As I understand it, it isn't the syntax that's hard, it's the logic
behind it.

FWIW I'm pretty persuaded by the argument that:

* Other RDBMSes's MERGE implementations don't behave this way;

* MERGE is a join-based operation, it's not really the same as an upsert
(though a join on a values-list is similar-ish);

* Making MERGE work for the concurrency-safe upsert case would render
it harder to then support the rest of MERGE for the OLAP/data merging
cases it's really specified for.

I also have a serious usability concern about re-purposing MERGE for
this. I think it'll be confusing to have a MERGE that's usable as a
concurrency-safe upsert and also as a non-concurrency-safe data merging
operation with slightly different options.

Borrowing from / closely following the MERGE syntax likely makes sense,
but special-casing a subset of MERGE would IMO be a regrettable
long-term decision.

If we later expand the MERGE statement to more general cases, I
don't see why statements of this form could not be treated as a
special case.

Please, no.

That's basically having two different kinds of statement with subtly
different syntax differentiating them.

Upsert is full of confusing and subtle behaviour. Any implementation
needs to focus on making it easy to get right, and I don't think having
something where small syntax variations can cause you to silently trip
out of the concurrency-safe mode of operation would meet that need.

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#90Craig Ringer
craig@2ndquadrant.com
In reply to: Kevin Grittner (#83)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/30/2014 06:08 AM, Kevin Grittner wrote:

Well, unless we abandon transactional semantics for other MERGE
statements, we should have a way that UPSERT logic continues to
work if you don't match a suitable index; it will just be slower --
potentially a lot slower, but that's what indexes are for.

That would probably lead to MERGE taking different lock strengths based
on index availability, having different failure modes, etc.

The less internal magic inside what's already a complicated and
confusing area for users, the better.

I don't
think we need a separate statement type for the one we "do well",
because I don't think we should do the other one without proper
transactional semantics.

"Proper transactional semantics" isn't the same as "free from all forms
of race condition".

Sometimes you want or need to do things that can't be made
concurrency-safe, or would perform unacceptably if done in a
concurrency-safe manner. That's why we have LOCK TABLE, among other things.

We have READ COMMITTED for a reason. We have SELECT without FOR SHARE
for a reason.

MERGE seems to be specified as more of an OLAP / ETL operation than an
OLTP one, and I think we should probably respect that - and the way
other RDBMSes have already implemented it.

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#91Kevin Grittner
kgrittn@ymail.com
In reply to: Peter Geoghegan (#87)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Peter Geoghegan <pg@heroku.com> wrote:

On Mon, Sep 29, 2014 at 3:08 PM, Kevin Grittner <kgrittn@ymail.com> wrote:

Well, unless we abandon transactional semantics for other MERGE
statements, we should have a way that UPSERT logic continues to
work if you don't match a suitable index; it will just be slower --
potentially a lot slower, but that's what indexes are for.

I want an implementation that doesn't have unique violations,
unprincipled deadlocks, or serialization failures at READ COMMITTED. I
want it because that's what the majority of users actually want. It
requires no theoretical justification.

Sure. I'm not suggesting otherwise.

I don't think we need a separate statement type for the one we
"do well", because I don't think we should do the other one
without proper transactional semantics.

That seems like a very impractical attitude. I cannot simulate what
I've been doing with unique indexes without taking an exclusive table
lock. That is a major footgun, so it isn't going to happen.

There are certainly other ways to do it, although they require more
work. As far as UPSERT goes, I agree that we should require such
an index, at least for the initial implementation and into the
foreseeable future. What I'm saying is that if we implement it
using the standard MERGE syntax, then if the features of MERGE are
extended it will continue to work even in the absence of such an
index. The index becomes a way of optimizing access rather than
defining what access is allowed.

At the risk of pushing people away from this POV, I'll point out
that this is somewhat similar to what we do for unlogged bulk loads
-- if all the conditions for doing it the fast way are present, we
do it the fast way; otherwise it still works, but slower.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#92Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#72)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 29 September 2014 18:59, Peter Geoghegan <pg@heroku.com> wrote:

On Mon, Sep 29, 2014 at 7:21 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

If you were an ORM developer reading the PostgreSQL Release Notes for
9.5, which URL would you visit to see a complete description of the
new feature, including how it works concurrently, locking and other
aspects. How would you check whether some strange behaviour was a bug,
or intentional?

We don't do that with UPDATE, so why would we do it with this?

Because this is new, harder and non-standard, so there is no other
place to look. If you want to persuade us that MERGE has poorly
defined concurrency, so you have implemented a new command, the new
command had better have very well defined behaviour.

And because a reviewer asked for it?

For example, this patch for UPSERT doesn't support updatable views.
But I can't see anyone that didn't read the patch would know that.

All of these were added. There are two new sets of isolation tests,
one per variant of the new clause (IGNORE/UPDATE).

When you say "added", what do you mean? You posted one new doc patch,
with no tests in it.

I mean that there was a commit (not included with the documentation,
but with the original patchset) with many tests. I don't know why
you're suggesting that I don't have "concurrency tests". There are
isolation tests in that commit. There are also many regression tests.

I see the tests in earlier patches; I was observing there are no new ones.

There are no tests for the use of CONFLICTING() syntax
No tests for interaction with triggers, with regard to before triggers
changing values prior to conflict detection.

My hope was that the complex behaviour of multiple unique indexes
might be explained there. Forgive me, I didn't see it.

No explanation of why the CONFLICTING() syntax differs from OLD./NEW.
syntax used in triggers

Why should it be the same?

Because it would be a principled approach to do that.

That is just an assertion. The MERGE syntax doesn't use that either.

MERGE allows "AS row" which then allow you to refer to row.x for
column x of the input.

Other people have independently commented the same thing.

If we aren't going to use MERGE syntax, it would make sense to at
least use the same terminology.

e.g.
INSERT ....
WHEN MATCHED
UPDATE

The concept of "matched" is identical between MERGE and UPSERT and it
will be confusing to have two words for the same thing.

I don't care if we change the spelling to "WHEN MATCHED
UPDATE/IGNORE". That seems fine. But MERGE is talking about a join,
not the presence of a would-be duplicate violation.

I don't understand that comment.

There seems to be a good reason not to use the MySQL syntax of ON
DUPLICATE KEY UPDATE, which doesn't allow you to specify UPDATE
operations other than a replace, so no deltas, e.g. SET a = a + x

That isn't true, actually. It clearly does.

It does. Rather amusingly I misread the very unclear MySQL docs.

Having said that, it would be much nicer to have a mode that allows
you to just say the word "UPDATE" and have it copy the data into the
correct columns, like MySQL does. That is very intuitive, even if it
isn't very flexible.

Multi-assignment updates (with or without CONFLICTING()) are supported, FWIW.

If I want the incoming row to overwrite the old row, it would be good
to have syntax to support that easily.

Why doesn't
INSERT INTO UNIQUE_TBL VALUES (1, 'a'), (2, 'b'), (2, 'b') ON
CONFLICT UPDATE SET t = 'fails';
end up with this in the table?

1 a
2 fails

What happens with this?

BEGIN;
INSERT INTO UNIQUE_TBL VALUES (2, 'b') ON CONFLICT UPDATE SET t = 'fails';
INSERT INTO UNIQUE_TBL VALUES (2, 'b') ON CONFLICT UPDATE SET t = 'fails';
COMMIT;

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#93Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#92)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Sep 30, 2014 at 8:30 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

No explanation of why the CONFLICTING() syntax differs from OLD./NEW.
syntax used in triggers

Why should it be the same?

Because it would be a principled approach to do that.

That is just an assertion. The MERGE syntax doesn't use that either.

MERGE allows "AS row" which then allow you to refer to row.x for
column x of the input.

It does, but that isn't what you suggested. You talked about the
OLD.*/NEW.* syntax.

I don't care if we change the spelling to "WHEN MATCHED
UPDATE/IGNORE". That seems fine. But MERGE is talking about a join,
not the presence of a would-be duplicate violation.

I don't understand that comment.

I just mean that if you want to replace ON CONFLICT UPDATE with WHEN
MATCHED UPDATE - that little part of the grammar - that seems okay.

Multi-assignment updates (with or without CONFLICTING()) are supported, FWIW.

If I want the incoming row to overwrite the old row, it would be good
to have syntax to support that easily.

Well, maybe I'll get around to that when things settle down. That's
clearly in the realm of "nice to have", though.

Why doesn't
INSERT INTO UNIQUE_TBL VALUES (1, 'a'), (2, 'b'), (2, 'b') ON
CONFLICT UPDATE SET t = 'fails';
end up with this in the table?

1 a
2 fails

A "cardinality violation" - just like MERGE. As with MERGE, the final
value of every row needs to be deterministic (within the command).

What happens with this?

BEGIN;
INSERT INTO UNIQUE_TBL VALUES (2, 'b') ON CONFLICT UPDATE SET t = 'fails';
INSERT INTO UNIQUE_TBL VALUES (2, 'b') ON CONFLICT UPDATE SET t = 'fails';
COMMIT;

It works fine. No cardinality violation with two separate commands.
See the new ExecLockUpdateTuple() function within nodeModifyTable.c
for extensive discussion on how this is handled.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#94Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#92)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Sep 30, 2014 at 8:30 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

On 29 September 2014 18:59, Peter Geoghegan <pg@heroku.com> wrote:

On Mon, Sep 29, 2014 at 7:21 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

If you were an ORM developer reading the PostgreSQL Release Notes for
9.5, which URL would you visit to see a complete description of the
new feature, including how it works concurrently, locking and other
aspects. How would you check whether some strange behaviour was a bug,
or intentional?

We don't do that with UPDATE, so why would we do it with this?

Because this is new, harder and non-standard, so there is no other
place to look. If you want to persuade us that MERGE has poorly
defined concurrency, so you have implemented a new command, the new
command had better have very well defined behaviour.

I'm making a point about the structure of the docs here. The behavior
*is* documented, just not in the INSERT documentation, a situation
I've compare with how EvalPlanQual() isn't discussed in the
UPDATE/DELETE/SELECT FOR UPDATE docs. And EvalPlanQual() has some
pretty surprising corner-case behaviors.

That having been said, maybe I could have gone into more detail on the
"consensus among unique indexes" thing in another part of the
documentation, since that isn't separately covered (only the aspects
of when the predicate is evaluated in READ COMMITTED mode and other
things like that were covered).

For example, this patch for UPSERT doesn't support updatable views.
But I can't see anyone that didn't read the patch would know that.

By reading the CREATE VIEW docs. Maybe there could stand to be a
compatibility note in the main INSERT command, but I didn't want to do
that as long as things were up in the air. It might be the case that
we figure out good behavior for updatable views.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#95Josh Berkus
josh@agliodbs.com
In reply to: Peter Geoghegan (#1)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/30/2014 11:20 AM, Peter Geoghegan wrote:

For example, this patch for UPSERT doesn't support updatable views.
But I can't see anyone that didn't read the patch would know that.

By reading the CREATE VIEW docs. Maybe there could stand to be a
compatibility note in the main INSERT command, but I didn't want to do
that as long as things were up in the air. It might be the case that
we figure out good behavior for updatable views.

All of these things sound like good ideas for documentation
improvements, but hardly anything which should block the patch. It has
documentation, more than we'd require for a lot of other patches, and
it's not like the 9.5 release is next month.

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#96Andres Freund
andres@2ndquadrant.com
In reply to: Josh Berkus (#95)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-30 11:49:21 -0700, Josh Berkus wrote:

On 09/30/2014 11:20 AM, Peter Geoghegan wrote:

For example, this patch for UPSERT doesn't support updatable views.
But I can't see anyone that didn't read the patch would know that.

By reading the CREATE VIEW docs. Maybe there could stand to be a
compatibility note in the main INSERT command, but I didn't want to do
that as long as things were up in the air. It might be the case that
we figure out good behavior for updatable views.

All of these things sound like good ideas for documentation
improvements, but hardly anything which should block the patch. It has
documentation, more than we'd require for a lot of other patches, and
it's not like the 9.5 release is next month.

What's blocking it is that (afaik) no committer agrees with the approach
taken to solve the concurrency problems. And several (Heikki, Robert,
me) have stated their dislike of the proposed approach.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#97Josh Berkus
josh@agliodbs.com
In reply to: Simon Riggs (#27)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/30/2014 11:51 AM, Andres Freund wrote:

All of these things sound like good ideas for documentation

improvements, but hardly anything which should block the patch. It has
documentation, more than we'd require for a lot of other patches, and
it's not like the 9.5 release is next month.

What's blocking it is that (afaik) no committer agrees with the approach
taken to solve the concurrency problems. And several (Heikki, Robert,
me) have stated their dislike of the proposed approach.

If that's what's blocking it then fine. But if we might change the
concurrency approach, then what's the point in quibbling about docs?

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#98Josh Berkus
josh@agliodbs.com
In reply to: Peter Geoghegan (#51)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/30/2014 07:15 AM, Kevin Grittner wrote:

There are certainly other ways to do it, although they require more
work. As far as UPSERT goes, I agree that we should require such
an index, at least for the initial implementation and into the
foreseeable future. What I'm saying is that if we implement it
using the standard MERGE syntax, then if the features of MERGE are
extended it will continue to work even in the absence of such an
index. The index becomes a way of optimizing access rather than
defining what access is allowed.

At the risk of pushing people away from this POV, I'll point out
that this is somewhat similar to what we do for unlogged bulk loads
-- if all the conditions for doing it the fast way are present, we
do it the fast way; otherwise it still works, but slower.

Except that switching between fast/slow bulk loads affects *only* the
speed of loading, not the locking rules. Having a statement silently
take a full table lock when we were expecting it to be concurrent
(because, for example, the index got rebuilt and someone forgot the
UNIQUE) violates POLA from my perspective.

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#99Peter Geoghegan
pg@heroku.com
In reply to: Andres Freund (#96)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Sep 30, 2014 at 11:51 AM, Andres Freund <andres@2ndquadrant.com> wrote:

What's blocking it is that (afaik) no committer agrees with the approach
taken to solve the concurrency problems. And several (Heikki, Robert,
me) have stated their dislike of the proposed approach.

Well, it depends on what you mean by "approach to concurrency
problems". It's not as if a consensus has emerged in favor of another
approach, and if there is to be another approach, the details need to
be worked out ASAP. Even still, I would appreciate it if people could
review the patch on the assumption that those issues will be worked
out. After all, there are plenty of other parts to this that have
nothing to do with value locking - the entire "top half", which has
significant subtleties (some involving concurrency) in its own right,
reasonably well encapsulated from value locking. A couple of weeks
ago, I felt good about the fact that it seemed "time was on my side"
9.5-wise, but maybe that isn't true. Working through the community
process for this patch is going to be very difficult.

I think everyone understands that there could be several ways of
implementing value locking. I really do think it's a well encapsulated
aspect of the patch, though, so even if you hate how I've implemented
value locking, please try and give feedback on everything else. Simon
wanted to start with the user-visible semantics, which makes sense,
but I see no reason to limit it to that.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#100Andres Freund
andres@2ndquadrant.com
In reply to: Peter Geoghegan (#99)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-30 12:05:46 -0700, Peter Geoghegan wrote:

On Tue, Sep 30, 2014 at 11:51 AM, Andres Freund <andres@2ndquadrant.com> wrote:

What's blocking it is that (afaik) no committer agrees with the approach
taken to solve the concurrency problems. And several (Heikki, Robert,
me) have stated their dislike of the proposed approach.

Well, it depends on what you mean by "approach to concurrency
problems". It's not as if a consensus has emerged in favor of another
approach, and if there is to be another approach, the details need to
be worked out ASAP.

Well. People have given you outlines of approaches. And Heikki even gave
you a somewhat working prototype. I don't think you can fairly expect
more.

Even still, I would appreciate it if people could
review the patch on the assumption that those issues will be worked
out.

Right now I don't really see the point. You've so far shown no
inclination to accept significant concerns about your approach. And
without an agreement about how to solve the concurrency issues the
feature is dead in the water. And thus time spent reviewing isn't well
spent.

I'm pretty sure I'm not the only one feeling that way at this point.

A couple of weeks
ago, I felt good about the fact that it seemed "time was on my side"
9.5-wise, but maybe that isn't true. Working through the community
process for this patch is going to be very difficult.

The community process involves accepting that your opinion isn't the
community's. Believe me, I learned that the hard way.

It's one thing to argue about the implementation of a feature for a week
or four. Or even insist that you're right in some implementation detail
local to your new code. But you've not moved one jota in the critical
parts that affect large parts of the system in half a year.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#101Kevin Grittner
kgrittn@ymail.com
In reply to: Josh Berkus (#98)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Josh Berkus <josh@agliodbs.com> wrote:

On 09/30/2014 07:15 AM, Kevin Grittner wrote:

At the risk of pushing people away from this POV, I'll point out
that this is somewhat similar to what we do for unlogged bulk loads
-- if all the conditions for doing it the fast way are present, we
do it the fast way; otherwise it still works, but slower.

Except that switching between fast/slow bulk loads affects *only* the
speed of loading, not the locking rules. Having a statement silently
take a full table lock when we were expecting it to be concurrent
(because, for example, the index got rebuilt and someone forgot the
UNIQUE) violates POLA from my perspective.

I would not think that an approach which took a full table lock to
implement the more general case would be accepted.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#102Josh Berkus
josh@agliodbs.com
In reply to: Peter Geoghegan (#51)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/30/2014 02:39 PM, Kevin Grittner wrote:

Josh Berkus <josh@agliodbs.com> wrote:

On 09/30/2014 07:15 AM, Kevin Grittner wrote:

At the risk of pushing people away from this POV, I'll point out
that this is somewhat similar to what we do for unlogged bulk loads
-- if all the conditions for doing it the fast way are present, we
do it the fast way; otherwise it still works, but slower.

Except that switching between fast/slow bulk loads affects *only* the
speed of loading, not the locking rules. Having a statement silently
take a full table lock when we were expecting it to be concurrent
(because, for example, the index got rebuilt and someone forgot the
UNIQUE) violates POLA from my perspective.

I would not think that an approach which took a full table lock to
implement the more general case would be accepted.

Why not? There are certainly cases ... like bulk loading ... where
users would find it completely acceptable. Imagine that you're merging
3 files into a single unlogged table before processing them into
finished data.

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#103Kevin Grittner
kgrittn@ymail.com
In reply to: Josh Berkus (#102)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Josh Berkus <josh@agliodbs.com> wrote:

On 09/30/2014 02:39 PM, Kevin Grittner wrote:

Josh Berkus <josh@agliodbs.com> wrote:

On 09/30/2014 07:15 AM, Kevin Grittner wrote:

At the risk of pushing people away from this POV, I'll point out
that this is somewhat similar to what we do for unlogged bulk loads
-- if all the conditions for doing it the fast way are present, we
do it the fast way; otherwise it still works, but slower.

Except that switching between fast/slow bulk loads affects *only* the
speed of loading, not the locking rules. Having a statement silently
take a full table lock when we were expecting it to be concurrent
(because, for example, the index got rebuilt and someone forgot the
UNIQUE) violates POLA from my perspective.

I would not think that an approach which took a full table lock to
implement the more general case would be accepted.

Why not? There are certainly cases ... like bulk loading ... where
users would find it completely acceptable. Imagine that you're merging
3 files into a single unlogged table before processing them into
finished data.

So the expectation is that when we implement MERGE it will, by
default, take out an EXCLUSIVE lock for the entire target table for
the entire duration of the command? I would have expected a bit
more finesse.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#104Josh Berkus
josh@agliodbs.com
In reply to: Peter Geoghegan (#51)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 09/30/2014 02:51 PM, Kevin Grittner wrote:

Josh Berkus <josh@agliodbs.com> wrote:

On 09/30/2014 02:39 PM, Kevin Grittner wrote:

Josh Berkus <josh@agliodbs.com> wrote:

On 09/30/2014 07:15 AM, Kevin Grittner wrote:

At the risk of pushing people away from this POV, I'll point out
that this is somewhat similar to what we do for unlogged bulk loads
-- if all the conditions for doing it the fast way are present, we
do it the fast way; otherwise it still works, but slower.

Except that switching between fast/slow bulk loads affects *only* the
speed of loading, not the locking rules. Having a statement silently
take a full table lock when we were expecting it to be concurrent
(because, for example, the index got rebuilt and someone forgot the
UNIQUE) violates POLA from my perspective.

I would not think that an approach which took a full table lock to
implement the more general case would be accepted.

Why not? There are certainly cases ... like bulk loading ... where
users would find it completely acceptable. Imagine that you're merging
3 files into a single unlogged table before processing them into
finished data.

So the expectation is that when we implement MERGE it will, by
default, take out an EXCLUSIVE lock for the entire target table for
the entire duration of the command? I would have expected a bit
more finesse.

I don't know that that is the *expectation*. However, I personally
would find it *acceptable* if it meant that we could get efficient merge
semantics on other aspects of the syntax, since my primary use for MERGE
is bulk loading.

Regardless, I don't think there's any theoretical way to support UPSERT
without a unique constraint. Therefore eventual support of this would
require a full table lock. Therefore having it use the same command as
UPSERT with a unique constraint is a bit of a booby trap for users.
This is a lot like the "ADD COLUMN with a default rewrites the whole
table" booby trap which hundreds of our users complain about every
month. We don't want to add more such unexpected consequences for users.

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#105Andres Freund
andres@2ndquadrant.com
In reply to: Kevin Grittner (#103)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-30 14:51:57 -0700, Kevin Grittner wrote:

Josh Berkus <josh@agliodbs.com> wrote:

On 09/30/2014 02:39 PM, Kevin Grittner wrote:

Josh Berkus <josh@agliodbs.com> wrote:

On 09/30/2014 07:15 AM, Kevin Grittner wrote:

At the risk of pushing people away from this POV, I'll point out
that this is somewhat similar to what we do for unlogged bulk loads
-- if all the conditions for doing it the fast way are present, we
do it the fast way; otherwise it still works, but slower.

Except that switching between fast/slow bulk loads affects *only* the
speed of loading, not the locking rules. Having a statement silently
take a full table lock when we were expecting it to be concurrent
(because, for example, the index got rebuilt and someone forgot the
UNIQUE) violates POLA from my perspective.

I would not think that an approach which took a full table lock to
implement the more general case would be accepted.

Why not? There are certainly cases ... like bulk loading ... where
users would find it completely acceptable. Imagine that you're merging
3 files into a single unlogged table before processing them into
finished data.

So the expectation is that when we implement MERGE it will, by
default, take out an EXCLUSIVE lock for the entire target table for
the entire duration of the command? I would have expected a bit
more finesse.

I think it'd be acceptable. Alternatively we'll just accept that you can
get uniqueness violations under concurrency. I many cases that'll be
fine.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#106Peter Geoghegan
pg@heroku.com
In reply to: Andres Freund (#105)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Sep 30, 2014 at 3:01 PM, Andres Freund <andres@2ndquadrant.com> wrote:

I think it'd be acceptable. Alternatively we'll just accept that you can
get uniqueness violations under concurrency. I many cases that'll be
fine.

I think living with unique violations is the right thing with MERGE, fwiw.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#107Andres Freund
andres@2ndquadrant.com
In reply to: Josh Berkus (#104)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-30 14:57:43 -0700, Josh Berkus wrote:

Regardless, I don't think there's any theoretical way to support UPSERT
without a unique constraint.

You can do stuff like blocking predicate locking. But without indexes to
support it that gets awfully complicated and unfunny. I don't think we
want to go there. So essentially I agree with that statement.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#108Kevin Grittner
kgrittn@ymail.com
In reply to: Andres Freund (#107)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Andres Freund <andres@2ndquadrant.com> wrote:

On 2014-09-30 14:57:43 -0700, Josh Berkus wrote:

Regardless, I don't think there's any theoretical way to support
UPSERT without a unique constraint.

You can do stuff like blocking predicate locking. But without indexes to
support it that gets awfully complicated and unfunny. I don't think we
want to go there. So essentially I agree with that statement.

Well, as you seem to be saying, it's not to bad with even an
non-unique index if we wanted to do a little extra work; and there
are a lot of ways to potentially deal with it even without that.
Theoretically, the number of ways to do this is limited only by
time available to brainstorm.

That said, at no time have I advocated that we try to implement
UPSERT in this release with anything but a UNIQUE index. The issue
I raised was whether a subset of the MERGE syntax should be used to
specify UPSERT rather than inventing our own syntax -- which
doesn't seem in any way incompatible requiring a unique index to
match the expression. Given subsequent discussion, perhaps we
could decorate it with something to indicate which manner of
concurrency handling is desired? Techniques discussed so far are

- UPSERT style
- Hold an EXCLUSIVE lock on the table
- Allow "native" concurrency management

An alternative which seems to be on some people's minds is to use a
different command name for the first option (but why not keep the
rest of the standard syntax?) and to require an explicit LOCK TABLE
statement at the start of the transaction if you want the second
option.

My preference, after this discussion, would be to default to UPSERT
style if the appropriate conditions are met, and to default to the
third option otherwise. If you want an exclusive lock, ask for it
with the LOCK TABLE statement.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#109Peter Geoghegan
pg@heroku.com
In reply to: Andres Freund (#100)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Sep 30, 2014 at 2:15 PM, Andres Freund <andres@2ndquadrant.com> wrote:

Well. People have given you outlines of approaches. And Heikki even gave
you a somewhat working prototype. I don't think you can fairly expect
more.

I don't expect anything, really. I asked nicely - that's all. I don't
know why there is so much discussion of what I expect or don't expect.
Things don't work around here by everyone doing only strictly what
they're obligated to do. Everyone is strictly obligated to do nothing,
when you get right down to it.

Even still, I would appreciate it if people could
review the patch on the assumption that those issues will be worked
out.

Right now I don't really see the point. You've so far shown no
inclination to accept significant concerns about your approach. And
without an agreement about how to solve the concurrency issues the
feature is dead in the water. And thus time spent reviewing isn't well
spent.

I'm pretty sure I'm not the only one feeling that way at this point.

I think that's *incredibly* unfair. There appears to be broad
acceptance of the problems around deadlocking as a result of my work
with Heikki. That was a major step forward. Now we all agree on the
parameters of the discussion around value locking, AFAICT. There is an
actual way forward, and not total quagmire -- great. I had to dig my
heals in to win that much, and it wasn't easy. I accept that it
probably wasn't easy for other people either, and I am thankful for
the effort of other people, particularly Heikki, but also you.

A couple of weeks
ago, I felt good about the fact that it seemed "time was on my side"
9.5-wise, but maybe that isn't true. Working through the community
process for this patch is going to be very difficult.

The community process involves accepting that your opinion isn't the
community's. Believe me, I learned that the hard way.

The community doesn't have a worked-out opinion on this either way.
Arguably, what you and Simon want to do is closer than what I want to
do than what Heikki wants to do - you're still talking about adding
locks that are tied to AMs in a fairly fundamental way. But, FWIW, I'd
sooner take Heikki's approach than insert promise tuples into indexes
directly. I think that Heikki's approach is better.

In all honesty, I don't care who "wins", as long as someone does and
we get the feature in shape. No one can "win" if all sides are not
realistic about the problems. The issues that I've called out about
what Heikki has suggested are quite significant issues. Can't we talk
about them? Or am I required to polish-up Heikki's approach, and
present it at a commitfest, only to have somebody point out the same
issues then? I am *not* nitpicking, and the issues are of fundamental
importance. Look at the issues I raise and you'll see that's the case.

My pointing out of these issues is not some artifice to "win" the
argument. I don't appreciate the insinuation that it is. I am
completely undeserving of that sort of mistrust. It's insulting. And
it's also a total misrepresentation to suggest it's me versus you,
Heikki, Robert, and Simon. Opinion is far more divided than you let
on, since what you and Simon suggest is far different to what Heikki
suggests. Let's figure out a way to reach agreement.

It's one thing to argue about the implementation of a feature for a week
or four. Or even insist that you're right in some implementation detail
local to your new code. But you've not moved one jota in the critical
parts that affect large parts of the system in half a year.

You're right. I haven't moved one bit on that. But, on the other hand,
I haven't doubled down on the approach either - I have done very
little on it, and have given it relatively little thought either way.
I preferred to focus my energies on the "top half". Surely you'd agree
that that was the logical course of action to take over the last few
months. I don't know if you noticed, but I presented this whole new
revised version as "this is the thing that gives us the ability to
discuss the fundamental issue of value locking". So my suggestion was
that if you don't want to have that conversation, at least look at the
"top half" a bit.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#110Simon Riggs
simon@2ndquadrant.com
In reply to: Josh Berkus (#95)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 30 September 2014 19:49, Josh Berkus <josh@agliodbs.com> wrote:

On 09/30/2014 11:20 AM, Peter Geoghegan wrote:

For example, this patch for UPSERT doesn't support updatable views.
But I can't see anyone that didn't read the patch would know that.

By reading the CREATE VIEW docs. Maybe there could stand to be a
compatibility note in the main INSERT command, but I didn't want to do
that as long as things were up in the air. It might be the case that
we figure out good behavior for updatable views.

All of these things sound like good ideas for documentation
improvements, but hardly anything which should block the patch. It has
documentation, more than we'd require for a lot of other patches, and
it's not like the 9.5 release is next month.

We won't get consensus simply by saying "Would you like a fast upsert
feature?" because everyone says Yes to that.

A clear description of the feature being added is necessary to agree
its acceptance. When we implement a SQL Standard feature, we can just
look in the standard to see how it should work and compare. When we go
off-piste, we need more info to make sure we know what we are getting
as well as why we are not getting something from the Standard.

I have not suggested I would block the patch because it doesn't have
docs. I have pointed out that the lack of consensus about the patch is
because nobody knows what it contains, which others agreed with. My
request was, and is, a proposed mechanism to *unblock* a very
obviously stalled patch.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#111Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#110)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Sep 30, 2014 at 4:28 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

A clear description of the feature being added is necessary to agree
its acceptance. When we implement a SQL Standard feature, we can just
look in the standard to see how it should work and compare. When we go
off-piste, we need more info to make sure we know what we are getting
as well as why we are not getting something from the Standard.

I think that's fair.

I have not suggested I would block the patch because it doesn't have
docs. I have pointed out that the lack of consensus about the patch is
because nobody knows what it contains, which others agreed with. My
request was, and is, a proposed mechanism to *unblock* a very
obviously stalled patch.

Please keep asking questions - it isn't necessarily obvious to me
*what* isn't clear, because of my lack of perspective. That's a useful
role. It occurs to me now that I ought to have found a place to
document "cardinality violations" [1]http://tracker.firebirdsql.org/browse/CORE-2274 -- Peter Geoghegan, but I didn't, for example.

[1]: http://tracker.firebirdsql.org/browse/CORE-2274 -- Peter Geoghegan
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#112Andres Freund
andres@2ndquadrant.com
In reply to: Peter Geoghegan (#43)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2014-09-26 16:19:33 -0700, Peter Geoghegan wrote:

On Fri, Sep 26, 2014 at 3:25 PM, Peter Geoghegan <pg@heroku.com> wrote:

On Fri, Sep 26, 2014 at 3:11 PM, Alvaro Herrera
<alvherre@2ndquadrant.com> wrote:

FWIW there are 28 callers of HeapTupleHeaderGetXmin.

Don't forget about direct callers to HeapTupleHeaderGetRawXmin(),
though. There are plenty of those in tqual.c.

Which reminds me: commit 37484ad2 added the opportunistic freezing
stuff. To quote the commit message:

"""
Instead of changing the tuple xmin to FrozenTransactionId, the combination
of HEAP_XMIN_COMMITTED and HEAP_XMIN_INVALID, which were previously never
set together, is now defined as HEAP_XMIN_FROZEN. A variety of previous
proposals to freeze tuples opportunistically before vacuum_freeze_min_age
is reached have foundered on the objection that replacing xmin by
FrozenTransactionId might hinder debugging efforts when things in this
area go awry; this patch is intended to solve that problem by keeping
the XID around (but largely ignoring the value to which it is set).

"""

Why wouldn't the same objection (the objection that the earlier
opportunistic freezing ideas stalled on) apply to directly setting
tuple xmin to InvalidTransactionId?

Because it's pretty much unrelated? The FrozenTransactionId bit you
reference is about tuples that actually survive, which isn't the case
here.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#113Bruce Momjian
bruce@momjian.us
In reply to: Josh Berkus (#104)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Sep 30, 2014 at 02:57:43PM -0700, Josh Berkus wrote:

I don't know that that is the *expectation*. However, I personally
would find it *acceptable* if it meant that we could get efficient merge
semantics on other aspects of the syntax, since my primary use for MERGE
is bulk loading.

Regardless, I don't think there's any theoretical way to support UPSERT
without a unique constraint. Therefore eventual support of this would
require a full table lock. Therefore having it use the same command as
UPSERT with a unique constraint is a bit of a booby trap for users.
This is a lot like the "ADD COLUMN with a default rewrites the whole
table" booby trap which hundreds of our users complain about every
month. We don't want to add more such unexpected consequences for users.

I think if we use the MERGE command for this feature we would need to
use a non-standard keyword to specify that we want OLTP/UPSERT
functionality. That would allow us to mostly use the MERGE standard
syntax without having surprises about non-standard behavior. I am
thinking of how CONCURRENTLY changes the behavior of some commands.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ Everyone has their own god. +

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#114Peter Geoghegan
pg@heroku.com
In reply to: Bruce Momjian (#113)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Oct 2, 2014 at 1:10 PM, Bruce Momjian <bruce@momjian.us> wrote:

I think if we use the MERGE command for this feature we would need to
use a non-standard keyword to specify that we want OLTP/UPSERT
functionality. That would allow us to mostly use the MERGE standard
syntax without having surprises about non-standard behavior. I am
thinking of how CONCURRENTLY changes the behavior of some commands.

That would leave you without a real general syntax. It'd also make
having certain aspects of an UPSERT more explicit be a harder goal
(there is no conventional join involved here - everything goes through
a unique index). Adding the magic keyword would break certain other
parts of the statement, so you'd have exact rules for what worked
where. I see no advantage, and considerable disadvantages.

Note that I've documented a lot of this stuff here:

https://wiki.postgresql.org/wiki/UPSERT

Mapping the join thing onto which unique index you want to make the
UPSERT target is very messy. There are a lot of corner cases. It's
quite ticklish.

Please add to it if you think we've missed something.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#115Bruce Momjian
bruce@momjian.us
In reply to: Peter Geoghegan (#114)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Oct 2, 2014 at 02:08:30PM -0700, Peter Geoghegan wrote:

On Thu, Oct 2, 2014 at 1:10 PM, Bruce Momjian <bruce@momjian.us> wrote:

I think if we use the MERGE command for this feature we would need to
use a non-standard keyword to specify that we want OLTP/UPSERT
functionality. That would allow us to mostly use the MERGE standard
syntax without having surprises about non-standard behavior. I am
thinking of how CONCURRENTLY changes the behavior of some commands.

That would leave you without a real general syntax. It'd also make
having certain aspects of an UPSERT more explicit be a harder goal
(there is no conventional join involved here - everything goes through
a unique index). Adding the magic keyword would break certain other
parts of the statement, so you'd have exact rules for what worked
where. I see no advantage, and considerable disadvantages.

Note that I've documented a lot of this stuff here:

https://wiki.postgresql.org/wiki/UPSERT

Mapping the join thing onto which unique index you want to make the
UPSERT target is very messy. There are a lot of corner cases. It's
quite ticklish.

Please add to it if you think we've missed something.

OK, it is was just an idea I wanted to point out, and if it doesn't
work, it more clearly cements that we need UPSERT _and_ MERGE.

Josh was pointing out that we don't want to surprise our users, so I
suggested an additional keyword, which addresses his objections, but as
you said, if that standard MERGE syntax doesn't give us what we want,
then that is the fatal objection to using only MERGE.

--
Bruce Momjian <bruce@momjian.us> http://momjian.us
EnterpriseDB http://enterprisedb.com

+ Everyone has their own god. +

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#116Marti Raudsepp
marti@juffo.org
In reply to: Peter Geoghegan (#9)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Sep 4, 2014 at 12:13 AM, Peter Geoghegan <pg@heroku.com> wrote:

On Wed, Sep 3, 2014 at 9:51 AM, Robert Haas <robertmhaas@gmail.com> wrote:

INSERT INTO upsert(key, val) VALUES(1, 'insert') ON CONFLICT WITHIN
upsert_pkey UPDATE SET val = 'update';

It seems to me that it would be better to specify a conflicting column
set rather than a conflicting index name.

I'm open to pursuing that, provided there is a possible implementation
that's robust against things like BEFORE triggers that modify
constrained attributes. It must also work well with partial unique
indexes. So I imagine we'd have to determine a way of looking up the
unique index only after BEFORE triggers fire. Unless you're
comfortable with punting on some of these cases by throwing an error,
then all of this is actually surprisingly ticklish.

Speaking of this, I really don't like the proposed behavior of firing
BEFORE INSERT triggers even before we've decided whether to insert or
update. In the "classical" upsert pattern, changes by a BEFORE INSERT
trigger would get rolled back on conflict, but the new approach seems
surprising: changes from BEFORE INSERT get persisted in the database,
but AFTER INSERT is not fired.

I haven't found any discussion about alternative triggers semantics
for upsert. If there has been any, can you point me to it?

----
How about this: use the original VALUES results for acquiring a value
lock; if indeed the row didn't conflict, *then* fire BEFORE INSERT
triggers, and throw an error if the trigger changed any columns of the
(specified?) unique key.

Advantages of this approach:
1. Would solve the above conundrum about specifying a unique index via columns.
2. In the UPDATE case we can skip evaluating INSERT triggers and
DEFAULT expressions for columns
3. If I'm not missing anything, this approach may also let us get rid
of the CONFLICTING() construct
4. Possibly be closer to MySQL's syntax?

Point (2) is actually a major consideration IMO: if your query is
mostly performing UPDATEs, on a table with SERIAL keys, and you're
using a different key to perform the updates, then you waste sequence
values unnecessarily. I believe this is a very common pattern, for
example:

create table evt_type (id serial primary key, name text unique, evt_count int);
prepare upsert(text) as INSERT into evt_type (name, evt_count) values ($1, 1)
on conflict within evt_type_name_key UPDATE set evt_count=evt_count+1;

execute upsert('foo');
execute upsert('foo');
execute upsert('bar');

# table evt_type;
id | name | evt_count
----+------+-----------
1 | foo | 2
3 | bar | 1 <-- id could very well be "2"

Regards,
Marti

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#117Simon Riggs
simon@2ndquadrant.com
In reply to: Bruce Momjian (#115)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 2 October 2014 22:37, Bruce Momjian <bruce@momjian.us> wrote:

OK, it is was just an idea I wanted to point out, and if it doesn't
work, it more clearly cements that we need UPSERT _and_ MERGE.

It seems clear that having two different initial keywords is popular
because it provides clarity about which aspects of the commands will
be supported.

I like the idea of making the two commands as close as possible in
syntax, which will make it easier to program for and encourage
adoption.
The command name could easily be MERGE [CONCURRENTLY] since that uses
the same concept from earlier DDL syntax/keywords.

In UPSERT, we don't need the ON keyword at all. If we are altering the
syntax, then we can easily remove this.

IIRC it wasn't agreed that we needed to identify which indexes in the
upsert SQL statement itself, since this would be possible in other
ways and would require programmers to know which unique constraints
are declared.

All of the other syntax could easily remain the same, leaving us with
a command that looks like this...

MERGE CONCURRENTLY INTO foo USING VALUES ()
WHEN NOT MATCHED THEN
INSERT
WHEN MATCHED THEN
UPDATE

Since MERGE now supports DELETE and IGNORE as options, presumably we
would also want to support those for the UPSERT version also.
I think it would be useful to also support a mechanism for raising an
error, as DB2 allows.

More complex example of MERGE

MERGE INTO product AS T
USING (SELECT sales.id, sum(sold) AS sold, max(catalog.name) as name
FROM sales, catalog WHERE sales.id = catalog.id GROUP BY sales.id) AS S
ON S.id = T.id
WHEN MATCHED AND T.inventory = S.sold
THEN DELETE
WHEN MATCHED AND T.inventory < S.sold
THEN SIGNAL SQLSTATE '78000' SET MESSAGE_TEXT =
'Oversold: ' || S.name
WHEN MATCHED
THEN UPDATE SET inventory = T.inventory - S.sold
WHEN NOT MATCHED
THEN INSERT VALUES(S.id, S.name, -S.sold);

Full example would be similar to this

MERGE CONCURRENTLY INTO product AS T
USING VALUES ()
WHEN MATCHED AND T.inventory = S.sold
THEN DELETE
WHEN MATCHED AND T.inventory < S.sold
THEN SIGNAL SQLSTATE '78000' SET MESSAGE_TEXT =
'Oversold: ' || S.name
WHEN MATCHED
THEN UPDATE SET inventory = T.inventory - S.sold
WHEN NOT MATCHED
THEN INSERT VALUES(S.id, S.name, -S.sold);

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#118Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#117)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Oct 7, 2014 at 5:23 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

IIRC it wasn't agreed that we needed to identify which indexes in the
upsert SQL statement itself, since this would be possible in other
ways and would require programmers to know which unique constraints
are declared.

Kevin seemed quite concerned about that. That is something that seems
hard to reconcile with supporting the MERGE syntax. Perhaps Kevin can
comment on that, since he was in favor of both being able to specify
user intent by accepting a unique index, while also being in favor of
the MERGE syntax.

All of the other syntax could easily remain the same, leaving us with
a command that looks like this...

MERGE CONCURRENTLY INTO foo USING VALUES ()
WHEN NOT MATCHED THEN
INSERT
WHEN MATCHED THEN
UPDATE

Since MERGE now supports DELETE and IGNORE as options, presumably we
would also want to support those for the UPSERT version also.
I think it would be useful to also support a mechanism for raising an
error, as DB2 allows.

It seems like what you're talking about here is just changing the
spelling of what I already have. I think that would be confusing to
users when the time comes to actually implement a fully-generalized
MERGE, even with the clearly distinct MERGE CONCURRENTLY variant
outlined here (which, of course, lacks an outer join, unlike MERGE
proper).

However, unlike the idea of trying to square the circle of producing a
general purpose MERGE command that also supports the UPSERT use-case,
my objection to this much more limited proposal is made purely on
aesthetic grounds. I think that it is not very user-friendly; I do not
think that it's a total disaster, which is what trying to solve both
problems at once (MERGE bulkloading and UPSERTing) would result in. So
FWIW, if the community is really set on something that includes the
keyword MERGE, which is really all you outline here, then I can live
with that.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#119Marti Raudsepp
marti@juffo.org
In reply to: Peter Geoghegan (#118)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Oct 8, 2014 at 3:47 AM, Peter Geoghegan <pg@heroku.com> wrote:

It seems like what you're talking about here is just changing the
spelling of what I already have.

I think there's a subtle difference in expectations too. The current
BEFORE INSERT trigger behavior is somewhat defensible with an
INSERT-driven syntax (though I don't like it even now [1]/messages/by-id/CABRT9RD6zriK+t6mnqQOqaozZ5z1bUaKh+kNY=O9ZqBZFoAuBg@mail.gmail.com). But the
MERGE syntax, to me, strongly implies that insertion doesn't begin
before determining whether a conflict exists or not.

[1]: /messages/by-id/CABRT9RD6zriK+t6mnqQOqaozZ5z1bUaKh+kNY=O9ZqBZFoAuBg@mail.gmail.com

Regards,
Marti

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#120Peter Geoghegan
pg@heroku.com
In reply to: Marti Raudsepp (#119)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Oct 8, 2014 at 1:36 AM, Marti Raudsepp <marti@juffo.org> wrote:

I think there's a subtle difference in expectations too. The current
BEFORE INSERT trigger behavior is somewhat defensible with an
INSERT-driven syntax (though I don't like it even now [1]).

There is no way around it. We need to fire before row triggers to know
what to insert on the one hand, but on the other hand (in general) we
have zero ability to nullify the effects (or side-effects) of before
triggers, since they may execute arbitrary user-defined code. I think
there is a good case to be made for severely restricting what before
row triggers can do, but it's too late for that.

But the
MERGE syntax, to me, strongly implies that insertion doesn't begin
before determining whether a conflict exists or not.

I think you're right. Another strike against the MERGE syntax, then,
since as I said we cannot even know what to check prior to having
before row insert triggers fire.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#121Marti Raudsepp
marti@juffo.org
In reply to: Marti Raudsepp (#116)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Oct 7, 2014 at 2:27 PM, Marti Raudsepp <marti@juffo.org> wrote:

but the new approach seems
surprising: changes from BEFORE INSERT get persisted in the database,
but AFTER INSERT is not fired.

I am sorry, I realize now that I misunderstood the current proposed
trigger behavior, I thought what Simon Riggs wrote here already
happens:
https://groups.google.com/forum/#!msg/django-developers/hdzkoLYVjBY/bnXyBVqx95EJ

But the point still stands: firing INSERT triggers when the UPDATE
path is taken is counterintuitive. If we prevent changes of upsert
key columns in BEFORE triggers then we get the benefits, including
more straightforward trigger behavior and avoid problems with serial
columns.

Regards,
Marti

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#122Marti Raudsepp
marti@juffo.org
In reply to: Peter Geoghegan (#120)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Oct 8, 2014 at 12:28 PM, Peter Geoghegan <pg@heroku.com> wrote:

On Wed, Oct 8, 2014 at 1:36 AM, Marti Raudsepp <marti@juffo.org> wrote:

I think there's a subtle difference in expectations too. The current
BEFORE INSERT trigger behavior is somewhat defensible with an
INSERT-driven syntax (though I don't like it even now [1]).

There is no way around it. We need to fire before row triggers to know
what to insert on the one hand, but on the other hand (in general) we
have zero ability to nullify the effects (or side-effects) of before
triggers, since they may execute arbitrary user-defined code.

With my proposal this problem disappears: if we prevent BEFORE
triggers from changing key attributes of NEW in the case of upsert,
then we can acquire value locks before firing any triggers (before
even constructing the whole tuple), and have a guarantee that the
value locks are still valid by the time we proceed with the actual
insert/update.

Other than changing NEW, the side effects of triggers are not relevant.

Now, there may very well be reasons why this is tricky to implement,
but I haven't heard any. Can you see any concrete reasons why this
won't work? I can take a shot at implementing this, if you're willing
to consider it.

I think
there is a good case to be made for severely restricting what before
row triggers can do, but it's too late for that.

There are no users of new "upsert" syntax out there yet, so it's not
too late to rehash the semantics of that. This in no way affects users
of old INSERT/UPDATE syntax.

Regards,
Marti

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#123Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#118)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 8 October 2014 01:47, Peter Geoghegan <pg@heroku.com> wrote:

It seems like what you're talking about here is just changing the
spelling of what I already have. I think that would be confusing to
users when the time comes to actually implement a fully-generalized
MERGE, even with the clearly distinct MERGE CONCURRENTLY variant
outlined here (which, of course, lacks an outer join, unlike MERGE
proper).

I change my view on this, after some more thought. (Hope that helps)

If we implement MERGE, I can see we may also wish to implement MERGE
CONCURRENTLY one day. That would be different to UPSERT.

So in the future I think we will need 3 commands

1. MERGE
2. MERGE CONCURRENTLY
3. UPSERT

So we no longer need to have the command start with the MERGE keyword.

However, unlike the idea of trying to square the circle of producing a
general purpose MERGE command that also supports the UPSERT use-case,
my objection to this much more limited proposal is made purely on
aesthetic grounds. I think that it is not very user-friendly; I do not
think that it's a total disaster, which is what trying to solve both
problems at once (MERGE bulkloading and UPSERTing) would result in. So
FWIW, if the community is really set on something that includes the
keyword MERGE, which is really all you outline here, then I can live
with that.

We will one day have MERGE according to the SQL Standard.

My opinion is that syntax for this should be similar to MERGE in the
*body* of the command, rather than some completely different syntax.
e.g.

WHEN NOT MATCHED THEN
INSERT
WHEN MATCHED THEN
UPDATE

I'm happy that we put that to a vote on what the syntax should be, as
long as we bear in mind that we will one day have MERGE as well.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#124Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#68)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Sep 29, 2014 at 7:21 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

Having said that, it would be much nicer to have a mode that allows
you to just say the word "UPDATE" and have it copy the data into the
correct columns, like MySQL does. That is very intuitive, even if it
isn't very flexible.

I thought about this, and at first I agreed, but now I'm not so sure.

Consider the case where you write an INSERT ... ON CONFLICT UPDATE ALL
query, or however we might spell this idea.

1. Developer writes the query, and it works fine.

2. Some time later, the DBA adds an inserted_at column (those are
common). The DBA is not aware of the existence of this particular
query. The new column has a default value of now(), say.

Should we UPDATE the inserted_at column to be NULL? Or (more
plausibly) the default value filled in by the INSERT? Or leave it be?
I think there is a case to be made for all of these behaviors, and
that tension makes me prefer to not do this at all. It's like
encouraging "SELECT *" queries in production, only worse.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#125Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#124)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Oct 8, 2014 at 12:12 PM, Peter Geoghegan <pg@heroku.com> wrote:

On Mon, Sep 29, 2014 at 7:21 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

Having said that, it would be much nicer to have a mode that allows
you to just say the word "UPDATE" and have it copy the data into the
correct columns, like MySQL does. That is very intuitive, even if it
isn't very flexible.

I thought about this, and at first I agreed, but now I'm not so sure.

Actually, I don't think MySQL supports this. It doesn't allow INSERT
ON DUPLICATE KEY UPDATE to do it, AFAICT. Their REPLACE syntax
supports that, but that's a feature that is quite distinct to what I
have in mind here.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#126Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#123)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Oct 8, 2014 at 6:25 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

I change my view on this, after some more thought. (Hope that helps)

Great.

If we implement MERGE, I can see we may also wish to implement MERGE
CONCURRENTLY one day. That would be different to UPSERT.

So in the future I think we will need 3 commands

1. MERGE
2. MERGE CONCURRENTLY
3. UPSERT

So we no longer need to have the command start with the MERGE keyword.

As I've outlined, I don't see how MERGE CONCURRENTLY could ever work,
but I'm glad that you agree that it should not block this effort (or
indeed, some later effort to implement a MERGE that is comparable to
the implementations of other database systems).

We will one day have MERGE according to the SQL Standard.

Agreed.

My opinion is that syntax for this should be similar to MERGE in the
*body* of the command, rather than some completely different syntax.
e.g.

WHEN NOT MATCHED THEN
INSERT
WHEN MATCHED THEN
UPDATE

I'm happy that we put that to a vote on what the syntax should be, as
long as we bear in mind that we will one day have MERGE as well.

While I am also happy with taking a vote, if we do so I vote against
even this much less MERGE-like syntax. It's verbose, and makes much
less sense when the mechanism is driven by would-be duplicate key
violations rather than an outer join. I also like that when you UPSERT
with the proposed ON CONFLICT UPDATE syntax, you get all the
flexibility of an INSERT - you can use data-modifying CTEs, and nest
the statement in a data-modifying CTE, and "INSERT ... SELECT... ON
CONFLICT UPDATE ..." . And to be honest, it's much simpler to
implement this whole feature as an adjunct to how INSERT statements
are currently processed (during parse analysis, planning and
execution); I don't want to make the syntax work against that. For
example, consider how little I had to change the grammar to make all
of this work:

$ git diff master --stat | grep gram
src/backend/parser/gram.y | 72 ++-

The code footprint of this patch is relatively small, and I think we
can all agree that that's a good thing.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#127Petr Jelinek
petr@2ndquadrant.com
In reply to: Peter Geoghegan (#120)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 08/10/14 11:28, Peter Geoghegan wrote:

On Wed, Oct 8, 2014 at 1:36 AM, Marti Raudsepp <marti@juffo.org> wrote:

But the
MERGE syntax, to me, strongly implies that insertion doesn't begin
before determining whether a conflict exists or not.

I think you're right. Another strike against the MERGE syntax, then,
since as I said we cannot even know what to check prior to having
before row insert triggers fire.

True, but to me it also seems to be strike against using INSERT for this
as I don't really see how you can make triggers work in a sane way if
the UPSERT is implemented as part of INSERT (at least I haven't seen any
proposal that I would consider sane from the user point of view).

--
Petr Jelinek http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#128Kevin Grittner
kgrittn@ymail.com
In reply to: Peter Geoghegan (#118)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Peter Geoghegan <pg@heroku.com> wrote:

On Tue, Oct 7, 2014 at 5:23 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

IIRC it wasn't agreed that we needed to identify which indexes in the
upsert SQL statement itself, since this would be possible in other
ways and would require programmers to know which unique constraints
are declared.

Kevin seemed quite concerned about that. That is something that seems
hard to reconcile with supporting the MERGE syntax. Perhaps Kevin can
comment on that, since he was in favor of both being able to specify
user intent by accepting a unique index, while also being in favor of
the MERGE syntax.

Well, I mostly wanted to make sure we properly considered what the
implications were of using the standard syntax without other
keywords or decorations before deciding to go the non-standard
route. In spite of an alarming tendency for people to assume that
meant that I didn't understand the desired semantics, I feel enough
people have understood the question and weighed in in favor of an
explicit choice between semantics, rather than inferring
concurrency handling based on the availability of the index
necessary for the slicker behavior. I'm willing to concede that
overall consensus is leaning toward the view that UPSERT semantics
should be conditioned on explicit syntax; I'll drop that much going
forward.

Granting that, I will say that I lean toward either the MERGE
syntax with CONCURRENTLY being the flag to use UPSERT semantics, or
a separate UPSERT command which is as close to identical to the
MERGE syntax (other than the opening verb) as possible. I see that
as still needing the ON clause so that you can specify which values
match which columns from the target table. I'm fine with starting
with the syntax in the standard, which has no DELETE or IGNORE
options (as of the latest version I've seen). So the syntax I'm
suggesting is close to what Simon is suggesting, but a more
compliant form would be:

MERGE CONCURRENTLY INTO foo
USING (VALUES (valuelist) aliases)
ON (conditions)
WHEN NOT MATCHED
INSERT [ (columnlist) ] VALUES (valuelist)
WHEN MATCHED
UPDATE SET colname = expression [, ...]

Rather than pseudo-randomly picking a unique index or using a
constraint or index name, the ON condition would need to allow
matching based on equality to all columns of a unique index which
only referenced NOT NULL columns; we would pick an index which
matched those conditions. In any event, the unique index would be
required if CONCURRENTLY was specified. Using column matching to
pick the index (like we do when specifying a FOREIGN KEY
constraint) is more in keeping with other SQL statements, and seems
generally safer to me. It would also make it fairly painless for
people to switch concurrency techniques for what is, after all,
exactly the same operation except for differences in handling of
concurrent conflicting DML.

As I said, I'm also OK with using UPSERT in place of MERGE
CONCURRENTLY.

I also feel that if we could allow:

USING (VALUES (valuelist) [, ...])

that would be great. In fact, I don't see why that can't be pretty
much any relation, but it doesn't have to be for a first cut. A
relation would allow a temporary table to be loaded with a batch of
rows where the intent is to UPSERT every row in the batch, without
needing to write a loop to do it.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#129Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#126)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 8 October 2014 21:16, Peter Geoghegan <pg@heroku.com> wrote:

My opinion is that syntax for this should be similar to MERGE in the
*body* of the command, rather than some completely different syntax.
e.g.

WHEN NOT MATCHED THEN
INSERT
WHEN MATCHED THEN
UPDATE

I'm happy that we put that to a vote on what the syntax should be, as
long as we bear in mind that we will one day have MERGE as well.

While I am also happy with taking a vote, if we do so I vote against
even this much less MERGE-like syntax. It's verbose, and makes much
less sense when the mechanism is driven by would-be duplicate key
violations rather than an outer join.

It wouldn't be driven by an outer join, not sure where that comes from.

MERGE is verbose, I agree. I don't always like the SQL Standard, I
just think we should follow it as much as possible. You can't change
the fact that MERGE exists, so I don't see a reason to have two
variants of syntax that do roughly the same thing.

MERGE syntax would allow many things, such as this...
WHEN NOT MATCHED AND x > 7 THEN
INSERT
WHEN NOT MATCHED THEN
INSERT
WHEN MATCHED AND y = 5 THEN
DO NOTHING
WHEN MATCHED THEN
UPDATE

etc

I also like that when you UPSERT
with the proposed ON CONFLICT UPDATE syntax, you get all the
flexibility of an INSERT - you can use data-modifying CTEs, and nest
the statement in a data-modifying CTE, and "INSERT ... SELECT... ON
CONFLICT UPDATE ..." . And to be honest, it's much simpler to
implement this whole feature as an adjunct to how INSERT statements
are currently processed (during parse analysis, planning and
execution); I don't want to make the syntax work against that.

I spoke to someone today that preferred a new command keyword, like
UPSERT, because the semantics of triggers are weird. Having a before
insert trigger fire when there is no insert is quite strange. Properly
documenting that on hackers would help; has the comments made on the
Django list been replayed here in some form?

I'm very scared by your comments about data modifying CTEs etc.. You
have no definition of how they will work, not tests of that. That part
isn't looking like a benefit as things currently stand.

I'm still waiting for some more docs to describe your intentions so
they can be reviewed.

Also, it would be useful to hear that your're going to do something
about the references to rows using conflicting(), since nobody has
agreed with you there. Or hopefully even that you've listened and
implemented something differently already. (We need that, whatever we
do with other elements of syntax).

Overall, I'm not seeing too many comments that indicate you are
accepting review comments and acting upon them. If you want acceptance
from others, you need to begin with some yourself.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#130Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#129)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Oct 8, 2014 at 2:04 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

While I am also happy with taking a vote, if we do so I vote against
even this much less MERGE-like syntax. It's verbose, and makes much
less sense when the mechanism is driven by would-be duplicate key
violations rather than an outer join.

It wouldn't be driven by an outer join, not sure where that comes from.

Right, I understood that it wouldn't be - which is the point. So with
an UPSERT that retains influence from MERGE, NOT MATCHED means "no
conflict", MATCHED means "conflict". That just seems like an odd way
to spell the concept given, as you say, that we're not talking about
an outer join.

MERGE is verbose, I agree. I don't always like the SQL Standard, I
just think we should follow it as much as possible. You can't change
the fact that MERGE exists, so I don't see a reason to have two
variants of syntax that do roughly the same thing.

MERGE syntax would allow many things, such as this...
WHEN NOT MATCHED AND x > 7 THEN
INSERT
WHEN NOT MATCHED THEN
INSERT
WHEN MATCHED AND y = 5 THEN
DO NOTHING
WHEN MATCHED THEN
UPDATE

etc

But then you can have before row insert triggers fire, which as you
acknowledge is more surprising with this syntax.

I spoke to someone today that preferred a new command keyword, like
UPSERT, because the semantics of triggers are weird. Having a before
insert trigger fire when there is no insert is quite strange. Properly
documenting that on hackers would help; has the comments made on the
Django list been replayed here in some form?

Yes. It's also mentioned in the commit message of CONFLICTING() (patch
0003-*). And the documentation (both the proposed INSERT
documentation, and the trigger documentation). There is a large
comment on it in the code. So I've said it many times.

I'm very scared by your comments about data modifying CTEs etc.. You
have no definition of how they will work, not tests of that. That part
isn't looking like a benefit as things currently stand.

Actually, I have a few smoke tests for that. But I don't see any need
for special handling. When you have a data-modifying CTE, it can
contain an INSERT, and there are no special restrictions on that
INSERT (other than that it may not itself have a CTE, but that's true
more generally). You can have data-modifying CTEs containing INSERTs,
and data-modifying CTEs containing UPDATEs....what I've done is have
data-modifying CTEs contain INSERTs that also happen to have an ON
CONFLICT UPDATE clause.

This new clause of INSERTs is in no more need of special documentation
regarding interactions with data-modifying CTEs than UPDATE .... WHERE
CURRENT OF is. The only possible exception I can think of would be
cardinality violations where a vanilla INSERT in one part of a command
(one data-modifying CTE) gives problems to the "UPSERT part" of the
same command (because we give a special cardinality violation message
when we try to update the same tuple twice in the same command). But
that's a pretty imaginative complaint, and I doubt it would really
surprise someone.

Why would you be surprised by the fact that a new clause for INSERT
plays nicely with existing clauses? It's nothing special - there is no
special handling.

I'm still waiting for some more docs to describe your intentions so
they can be reviewed.

I think it would be useful to add several more isolation tests,
highlighting some of the cases you talked about. I'll work on that.
While the way forward for WITHIN isn't clear, I think a WITHIN PRIMARY
KEY variant would certainly be useful. Maybe it would be okay to
forget about naming a specific unique index, while supporting an
(optional) WITHIN PRIMARY KEY/NOT WITHIN PRIMARY KEY. It doesn't
totally solve the problems, but may be a good compromise that mostly
satisfies people that want to be able to clearly indicate user intent
(Kevin, in particular), and satisfies other people that don't want to
name a unique index (Heikki, in particular). Certainly, the Django
people would like that, since they said as much.

Also, it would be useful to hear that your're going to do something
about the references to rows using conflicting(), since nobody has
agreed with you there. Or hopefully even that you've listened and
implemented something differently already. (We need that, whatever we
do with other elements of syntax).

Do you really expect me to do major work on some aspect of the syntax
like that, given, as you say, that nobody explicitly agreed with me
(and only you disagreed with me)? The only remark I heard on that was
from you (you'd prefer to use NEW.* and OLD.*). But you spent much
more time talking about getting something MERGE-like, which
NEW.*/OLD.* clearly isn't.

CONFLICTING() is very close (identical?) to MySQL's use of "ON
DUPLICATE KEY UPDATE val = VALUES(val)". I'm happy to discuss that,
but it's news to me that people take particular issue with it.

Overall, I'm not seeing too many comments that indicate you are
accepting review comments and acting upon them. If you want acceptance
from others, you need to begin with some yourself.

What, specifically, have I failed to act on? We are discussing the
syntax here. I have very valid practical reasons for wanting to make
this feature a clause of INSERT. That is a view that Andres seemed to
agree with [1]/messages/by-id/20140929070235.GP1169@alap3.anarazel.de -- Peter Geoghegan, for example.

[1]: /messages/by-id/20140929070235.GP1169@alap3.anarazel.de -- Peter Geoghegan
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#131Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#130)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 8 October 2014 23:24, Peter Geoghegan <pg@heroku.com> wrote:

Also, it would be useful to hear that your're going to do something
about the references to rows using conflicting(), since nobody has
agreed with you there. Or hopefully even that you've listened and
implemented something differently already. (We need that, whatever we
do with other elements of syntax).

Do you really expect me to do major work on some aspect of the syntax
like that, given, as you say, that nobody explicitly agreed with me
(and only you disagreed with me)? The only remark I heard on that was
from you (you'd prefer to use NEW.* and OLD.*).
But you spent much
more time talking about getting something MERGE-like, which
NEW.*/OLD.* clearly isn't.

Yes, it is. Look at the AS clause.

CONFLICTING() is very close (identical?) to MySQL's use of "ON
DUPLICATE KEY UPDATE val = VALUES(val)". I'm happy to discuss that,
but it's news to me that people take particular issue with it.

3 people have asked you questions or commented about the use of
CONFLICTING() while I've been watching. It's clearly a non-standard
mechanism and not inline with other Postgres usage. Nobody actually
says "I object to this" - do they need to use that phrase before you
take note?

I'm beginning to feel that giving you review comments is being seen as
some kind of negative action. Needing to repeat myself makes it clear
that you aren't taking note.

Yes, I expect you to do these things
* collect other people's input, even if you personally disagree
* if there is disagreement amongst reviewers, seek to resolve that in
a fair and reasonable manner
* publish a summary of changes requested
* do major work to address them

So yes, I really expect that.

It doesn't matter that it is "only SImon" or "only Kevin". **One**
comment is enough for you to take note.

If there is disagreement, publishing the summary of changes you plan
to make in your next version will help highlight that.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#132Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#131)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Oct 8, 2014 at 10:49 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

Do you really expect me to do major work on some aspect of the syntax
like that, given, as you say, that nobody explicitly agreed with me
(and only you disagreed with me)? The only remark I heard on that was
from you (you'd prefer to use NEW.* and OLD.*).
But you spent much
more time talking about getting something MERGE-like, which
NEW.*/OLD.* clearly isn't.

Yes, it is. Look at the AS clause.

You can alias each of the two tables being joined. But I only have one
table, and no join. When you referred to NEW.* and OLD.*, you clearly
were making a comparison with trigger WHEN clauses, and not MERGE
(which is a comparison I made myself, although for more technical
reasons). It hardly matters, though.

CONFLICTING() is very close (identical?) to MySQL's use of "ON
DUPLICATE KEY UPDATE val = VALUES(val)". I'm happy to discuss that,
but it's news to me that people take particular issue with it.

3 people have asked you questions or commented about the use of
CONFLICTING() while I've been watching.

Lots of people have asked me lots of questions. Again, as I said, I
wasn't aware that CONFLICTING() was a particular point of contention.
Please be more specific.

It's clearly a non-standard
mechanism and not inline with other Postgres usage.

What would be "inline with other Postgres usage"? I don't think you've
been clear on what you think is a better alternative.

I felt a function-like expression was appropriate because the user
refers to different tuples of the target table. It isn't like a join.
Plus it's similar to the MySQL thing, but doesn't misuse VALUES() as a
function-like thing.

If there is disagreement, publishing the summary of changes you plan
to make in your next version will help highlight that.

I think I've done a pretty good job of collecting and collating the
opinions of others, fwiw.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#133Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#132)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 9 October 2014 07:27, Peter Geoghegan <pg@heroku.com> wrote:

Please be more specific.

Do not use CONFLICTING() which looks like it is a function.

Instead, use a row qualifier, such as NEW, OLD etc to reference values
from the incoming data
e.g. CONFLICTING.value rather than CONFLICTING(value)

Do not use the word CONFLICTING since it isn't clear whether you are
referring to the row in the table or the value in the incoming data. I
suggest the use of two separately named row qualifiers to allow us to
use either of those when desired. I don't have suggestions as to what
you should call those qualifiers, though Postgres already uses NEW and
OLD in similar circumstances in triggers. (This has nothing at all to
do with the MERGE command in the SQL standard, so please don't mention
that here.)

You may also wish to support the AS keyword, as MERGE does to make the
above even more clear.

e.g. SET col = EXISTING.col + NEW.col

Thank you.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#134Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#133)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Oct 9, 2014 at 12:38 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

Do not use CONFLICTING() which looks like it is a function.

So is ROW(). Or COALESCE().

Instead, use a row qualifier, such as NEW, OLD etc to reference values
from the incoming data
e.g. CONFLICTING.value rather than CONFLICTING(value)

Do not use the word CONFLICTING since it isn't clear whether you are
referring to the row in the table or the value in the incoming data.

If you don't have a word that you think would more clearly indicate
the intent of the expression, I'm happy to hear suggestions from
others.

You may also wish to support the AS keyword, as MERGE does to make the
above even more clear.

e.g. SET col = EXISTING.col + NEW.col

That's less clear, IMV. EXISTING.col is col - the very same Var. So
why qualify that it's the existing value in one place but not the
other? In fact, you can't do that now with updates in general:

postgres=# update upsert u set u.val = 'foo';
ERROR: 42703: column "u" of relation "upsert" does not exist
LINE 1: update upsert u set u.val = 'foo';
^
LOCATION: transformUpdateStmt, analyze.c:2068

This does work, which is kind of what you outline:

postgres=# update upsert u set val = u.val;
UPDATE 3

But MERGE accepts the former in other systems (in general, and for
MERGE), where Postgres won't (for UPDATEs in general). Parse analysis
of UPDATE targetlists just rejects this outright.

FWIW, is any of the two tuples reference here "NEW", in any sense?
Informally, I'd say the new value is the resulting row - the final row
value after the UPDATE. We want to refer to the existing row, and the
row proposed for insertion (with all before trigger effects carried
forward).

Having the column reference go through an alias like this might be tricky.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#135Marti Raudsepp
marti@juffo.org
In reply to: Peter Geoghegan (#134)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Oct 9, 2014 at 11:11 AM, Peter Geoghegan <pg@heroku.com> wrote:

On Thu, Oct 9, 2014 at 12:38 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

Do not use CONFLICTING() which looks like it is a function.

So is ROW(). Or COALESCE().

ROW and COALESCE behave almost like functions: they operate on any
expression or value you pass to them.

db=# select coalesce('bar');
coalesce
----------
bar

Not so with CONFLICTING(), it only accepts a column name -- not a
value -- and has knowledge of the surrounding statement that ordinary
function-like constructs don't.

db=# INSERT into evt_type (name) values ('foo') on conflict UPDATE set
name=conflicting('bar');
ERROR: syntax error at or near "'bar'"
LINE 1: ...lues ('foo') on conflict UPDATE set name=conflicting('bar');

If you don't have a word that you think would more clearly indicate
the intent of the expression, I'm happy to hear suggestions from
others.

I also like NEW due to similarity with triggers, but I see your
concern about it not actually being "new".

Regards,
Marti

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#136Simon Riggs
simon@2ndquadrant.com
In reply to: Peter Geoghegan (#134)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 9 October 2014 09:11, Peter Geoghegan <pg@heroku.com> wrote:

You may also wish to support the AS keyword, as MERGE does to make the
above even more clear.

e.g. SET col = EXISTING.col + NEW.col

That's less clear, IMV. EXISTING.col is col - the very same Var. So
why qualify that it's the existing value in one place but not the
other? In fact, you can't do that now with updates in general:

postgres=# update upsert u set u.val = 'foo';
ERROR: 42703: column "u" of relation "upsert" does not exist
LINE 1: update upsert u set u.val = 'foo';
^
LOCATION: transformUpdateStmt, analyze.c:2068

YES, which is exactly why I did not say this, I said something different.

This does work, which is kind of what you outline:

postgres=# update upsert u set val = u.val;
UPDATE 3

YES, which is why I said it.

But MERGE accepts the former in other systems (in general, and for
MERGE), where Postgres won't (for UPDATEs in general). Parse analysis
of UPDATE targetlists just rejects this outright.

FWIW, is any of the two tuples reference here "NEW", in any sense?
Informally, I'd say the new value is the resulting row - the final row
value after the UPDATE. We want to refer to the existing row, and the
row proposed for insertion (with all before trigger effects carried
forward).

YES, which is why I specifically requested the ability to reference
"the incoming data".

Common sense interpretations make for quicker and easier discussions.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#137Peter Geoghegan
pg@heroku.com
In reply to: Marti Raudsepp (#135)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Oct 9, 2014 at 1:33 AM, Marti Raudsepp <marti@juffo.org> wrote:

ROW and COALESCE behave almost like functions: they operate on any
expression or value you pass to them.

Okay, then like CONFLICTING() is like many of the XML expressions.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#138Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#136)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Oct 9, 2014 at 1:41 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

YES, which is why I specifically requested the ability to reference
"the incoming data".

My point is that people are not really inclined to use an alias in
UPDATEs in general when referring to the target. The thing that seems
special (and worthy of special qualification) is the reference to what
you call the "incoming data", and what I've called "tuples proposed
for insertion" (after being affected by any before row triggers).

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#139Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#138)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Oct 9, 2014 at 1:56 AM, Peter Geoghegan <pg@heroku.com> wrote:

My point is that people are not really inclined to use an alias in
UPDATEs in general when referring to the target. The thing that seems
special (and worthy of special qualification) is the reference to what
you call the "incoming data", and what I've called "tuples proposed
for insertion" (after being affected by any before row triggers).

For simple cases, you might not even bother with CONFLICTING() - you
might find it easier to just repeat the constant in the INSERT and
UPDATE parts of the query.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#140Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#139)
2 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

V 1.3 is attached. Like Simon, I think that it's premature to commit
to one particular value locking implementation. Personally, I think
that approach #2 is what we'll end up using, but it makes no sense to
not maintain both at once, since it requires relatively little effort
to do so. At the very least it's a useful tool for reviewers, who
would otherwise be denied the opportunity to test whether any given
concurrency problem was attributable to the value locking
implementation, or something else. So there are two variants of V 1.3
attached - one uses an unchanged value locking implementation #1,
while the other an unchanged implementation #2.

Highlights
========

* No more "WITHIN unique_index_name". There is a new syntax that
supersedes it. Unique index inference based on columns (or
expressions) is *mandatory* for the ON CONFLICT UPDATE variant. It
remains optional for the IGNORE variant, because I think someone could
very reasonably not care which unique index was implicated. As
discussed, this implies that partial unique indexes are no longer
supported (but expression indexes work just fine). This may be
revisited, but I suggest doing so in a later release. Example of
merging on the unique index on column "name":

postgres=# explain insert into capitals(name, population, altitude)
values ('Riga', 1000, 5) on conflict (name) update set altitude =
excluded(altitude);
QUERY PLAN
----------------------------------------------------------------------
Insert on capitals (cost=0.00..0.01 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)
-> Conflict Update on capitals (cost=0.00..1.01 rows=1 width=52)
(3 rows)

When we cannot infer a unique index, it looks like this:

postgres=# explain insert into capitals(name, population, altitude)
values ('Riga', 1000, 5) on conflict (population) update set altitude
= excluded(altitude);
ERROR: 42P10: could not infer which unique index to use from
expressions/columns provided for ON CONFLICT
LINE 1: ...e, population, altitude) values ('Riga', 1000, 5) on conflic...
^
HINT: Partial unique indexes are not supported.
LOCATION: transformConflictClause, parse_clause.c:2407

* No more planner kludges. Index paths are never created for the
auxiliary UPDATE plan to begin with. To be tidy, TID scan paths are
never added either. Unless the UPDATE will never proceed due to a
tautological predicate like "WHERE false", we're guaranteed to have a
"sequential scan" in a fairly principled way (as before, we just use
this with EvalPlanQual(); it's just an implementation detail). I am
not entirely qualified to say so, but I think that this makes my
modifications to the optimizer look quite reasonable. The kludge of
enforcing various restrictions (e.g. on subqueries appearing in the
UPDATE) in the optimizer is also removed. We prefer to enforce
everything during parse analysis. This also gets us better error
messages, which is nice.

* Sane (although limited) support for table inheritance and updatable
views. However, in general user-defined rules are unsupported - I
cannot see how that could be made sane. The IGNORE variant works for
updatable views, and for inheritance relations with children (provided
that there is no inference required, which effectively makes the
UPDATE variant unsupported). However, both IGNORE and UPDATE variants
work for relations that happen to be in an inheritance hierarchy,
provided they have no children. I think it's fine to only support the
IGNORE variant for relations with inheritance children, because even
when users have the "partitioning pattern" use-case, there is no
principled way of telling the difference between a vanilla INSERT, and
an INSERT with an ON CONFLICT UPDATE clause from within the custom
redirection trigger function. Also, unique indexes already only work
at the relation level with inheritance - that's a long-standing
limitation. And so, in general INSERTs better have the right
inheritance child as their target - this is no more and no less true
when there is an ON CONFLICT UPDATE clause (note that I'm talking
about the "object orientated" inheritance use-case here, and not the
"partitioning pattern" use-case - with the latter, it's all up to the
trigger function to do the right thing). There may currently be an
"UPDATE ONLY", but there is no "INSERT ONLY" - why should I add one?

* Both INSERT and UPDATE sets of statement level triggers fire for
INSERT with ON CONFLICT UPDATE. The number of rows affected doesn't
matter, nor does it matter how they were or were not affected. This
certainly seems like the correct behavior. Per-row triggers work the
same as before, since far more thought went into their behavior
earlier. This incorporates feedback from Kevin.

* CONFLICTING() is renamed to EXCLUDED(). I know that some people
wanted me to go a different way with this. I think that there are very
good practical reasons not to [1]/messages/by-id/CAM3SWZQhiXQi1osT14V7spjQrUpmcnRtbXJe846-EB1bC+9i1g@mail.gmail.com, as well as good reasons related to
design, but I still accept that CONFLICTING() isn't very descriptive.
This spelling seems a lot better.

Clean-up
=======

If you take a look at the EXPLAIN output above, you'll see that the
sequential scan node does not appear. Basically, I'm back to
suppressing the implementation detail of that never-executed
"sequential scan", but the new approach is far better than earlier
approaches. Certain things actually associated with the sequential
scan are now attributed to the parent (auxiliary) ModifyTable UPDATE
node. Example (incidentally, note that "key" is used to infer a unique
index to take as an arbiter index):

postgres=# explain insert into upsert values (1000, 'Plucky') on
conflict (key) update set val = excluded(val) where key = 5;
QUERY PLAN
---------------------------------------------------------------------
Insert on upsert (cost=0.00..0.01 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)
-> Conflict Update on upsert (cost=0.00..25.38 rows=6 width=36)
Filter: (key = 5)
(4 rows)

This seems reasonable to me. Including the "(never executed)"
sequential scan would be very confusing to users.

Inference
=======

Unique index inference (i.e. the way we figure out *which* unique
index to use) occurs during parse analysis. I think it would be
inappropriate, and certainly inconvenient to do it during planning. I
maintain that ON CONFLICT DML statements have a legitimate semantic
dependence on particular unique indexes, which makes this appropriate.
I don't know about others, but my only problem with naming unique
indexes directly was that it is unmaintainable, and very ugly. In
principle, I think this semantic dependence is quite reasonable, and
reflects the reality of how we all expect this to work. There are
comments on the implications for plan caching and how that relates to
where and when we perform unique index inference.

Documentation
===========

The documentation has been updated, incorporating feedback. I also
made the cardinality violation error a lot clearer than before, since
Craig said that was unclear.

Tests
====

Many tests were added. I've added a couple of new isolation tests.
insert-conflict-update-3 should be of particular interest. That test
illustrates the visibility issues with the WHERE clause that I've
already highlighted as a possible concern [2]https://wiki.postgresql.org/wiki/UPSERT#Visibility_issues_and_the_proposed_syntax_.28WHERE_clause.2Fpredicate_stuff.29 -- Peter Geoghegan. Unique index inference
tests will also give you a fair idea of how flexible it is.

Remaining open items
=================

Apart from the obvious issue of value locking (i.e. verifying the
correctness of its implementation in general), the only open items
are:

* RLS needs to be considered. I have yet to give it any real thought.

* I could probably do better at postgres_fdw support. That seems like
something that could be followed up on later, because it's clearly
just about a Simple Matter of Programming.

In summary, I was able to remove a lot of TODO/FIXME items here -
almost all of them. I'm pretty happy about that. I'll have to edit the
UPSERT wiki page, to strike out many open items...

[1]: /messages/by-id/CAM3SWZQhiXQi1osT14V7spjQrUpmcnRtbXJe846-EB1bC+9i1g@mail.gmail.com
[2]: https://wiki.postgresql.org/wiki/UPSERT#Visibility_issues_and_the_proposed_syntax_.28WHERE_clause.2Fpredicate_stuff.29 -- Peter Geoghegan
--
Peter Geoghegan

Attachments:

v1.3.vallock1.tar.gzapplication/x-gzip; name=v1.3.vallock1.tar.gzDownload
�]�IT�\{�������S(�s&�
4������n&�;�
M���{G�8cl�G�p����U%ll�dovs�3��$��~U*�d5
�v����w��������G�s�,;m�k3�[��nF���y}�Cs��1�|��6^�^������j����f��l5��f��FS��Z���Q���O��g�����������7�Z�F���;�Y�X-����j�:��l�y����'��\� VL��F�%�cM�����d�">�Fx���s��m5�j!|�}T7��k����%�D���]6��PXo������n�Z��hh���0��������[��u���LB�m!�b�2�(�M>�]��'�@��}�h{Q����m�����`!7���6�a1�������p�W��l�X�/V�����m.��9��
���#������1������Y"X�!��l�����1!w���r_�@��Rt���C�xsaU�~����aK��qCg��r���������ar��6� ���0��x������fr��'�Haxq=ULA?���K�;KE%G��T�+vH����%�p���i�*���?I�`�X
�G��"u(�����c�����������jc���^�X��Y�r���5�K%�M���������=���>��8�C]�H���������+0�\�4�Blw�� �#3����Y�<����[vqw����bs;i����Y���p��� =(\���#���Ah�x�	X2�����t�	X�����c��[��L�n���ld���];��*Z����P)B�f��n]��j���8[yA8{����������W�����yfp�����Y_V�
);���<H+.����O7�+��|j��dA�A���
����::������x��,r�`���{+��,p�NN��"^�5RTj��B�������O����8�2���B����T���P���
p�;����@��vT�L�A$��Vq9j��tC����g��K?YZ�Sq"K(IR���������a�sC�CC��vL#�A��Re���#��ZE�,{6c��L��cy�1T�DX�lz�n�n�%�!l����kMq��W_���z�;UW��;�}>���7�y]�;�����������J��pIg������������*@��V+���;	�����`��X�CQ{���la]xNPy��U(ZY���2�T��-
�� ��[xF��e��j��~N�	���J��>g�JZ�E��(z���5���uf4u��I����Tg�jG-����.P8��>��������]���N~��}��,�Q��f'+���HX��R�
J��{�r�c[o_�|m#
��p	1`�X!����K��N���e�r��@x��'����FYXE�d[����/����,�+I����1����4��P���n6����{>�uadK�8i��y��p0qg���0Z�/!tCb?B�rR�U��m�
���#����"3QBRK� �m4,�q[�-������;'F�j����2k
�k�]���������*D�o���~�5v�$*���i��586z�����/�
 >�m��G�*��6f3^�w[�Vg�<T�*
0�%BHu;U�����AP`<+Bz����{�FWw����������]��w��o�nAfg'�-�����9�L�_�B#@�j������=�g'g�el�X�YO$��XA��Q�7K�lW��;��Bg�e��r�	�T��@E���E9~^`��1F�>\�����J�^��J��)��+;�v�`��������?������_{8��(��?����� =����_*qN�7���S�NrT�b�
��V�����-���d�U�Ay������*� r�9*�P�c���s��E�Me����"����\��)�K�/�x�#��O���I�����!�����M����r��S��������x:�~t;QQ�UIu�K��UIu�����x���g0��������!�����h�:�u���8��Uv�������uUDq���h!�?�'T�G�
gdH�`�2n�}�������������gy��N�!��b,Q����L��G:s�#���|�&0_���!B��7����5�u�s�/v��X+�x��r�p��qz\Pz����FAEW�����'��������~�n�#5�p�!���@}��*K9���SGy�N���)��2���@��z�l)D�U�+��7_���0�����������9�	�tsCF��a r��m�����7/;c�P
�uZF�Q���%�k��WG6D�������:D)��p�N���pF0q^(B)��g'�&���y�2����d�JG"@��vU&�Uf{�Vu���1c��I�g����ku��3�&����T�0+�eXU%��/�)96XA���Ri�����q>�0�]�|�&Q�C�9M�Os��H�'H5�nA3x�~@����I-�<�_�,bjcR[�y��i���t2!�=��m@��>)����S1�O��n���c
�q��� >�����.f�y�_d5������E�T[,Wa^�����09��H��N�Ws�w�������)H	}yU�|���S�~�yUl5�������������
�~_�]�����(R���AN�?R�W*�[�G����y�#)T��m�g�M�;��$�y�6z%�u8����|�9��~Ml��lT�������j�4E�0�}�ie���t�I�0��r$xT����)v�T���?��jdi`���U\���u5lD/ �A\���
�{����
��=9������j�dt��PO��^iv���������D7��>"��O������J��9g�v�vV]WL O�5����� �&�_������������n\e_l�J�����{	N���E%eU��xx�?�Z�2�=�8���@a�4�g?W�cS7���-�o5��|z��l��������&�t��!4��U�}�+��7+]���8}�^��7W���r*CJK��t2�dQR�I��h���	�
FS�T�/�jg��C���BD�w��
Gr����K
�
KH��E\���Y_�SQ�@!�����Y��m�z�~	�*�A!E�IeI,�`�����}C"��~8IY'������%�00��Y�H��`�S���I,��ir�8^`5��6��F�k��+-�
��%A"�G��L�Ub(�H�+n�~BB�v����h����d/@$����l����O��E>Y�d���TE����
�{&�T�x�ZbfY�z}�����!$k��$
� �N�F�J$ I
�eG-�G��b%�~���*���h8�*��\�]���'����Q�h%�x��q<����mv��Y��:�~�S�>V\[��r�EGn�P�	LL ���TS\����Gq�2���rW^���8a�H�����8��)C���*����WSw�&��y�v�6o6I,��������l�dL��s�������~T�nu�����/���k�~8%\T�"b����%@\ro*LUQ
c�������S�F�aJ�?���K��2���0�=v�
a�����Y��^�z��Ue}11�^��&��� ��)�
b����7��&���2��~�DZ��	������n�Ba6�L1��9Ie�`��`�(�U6���#XIE"j����6����c|{�Ho�8=��tsi4�m-A�,��,�^@g�6�����������������
���� P{-�#�nP�f���"���{�����Z��>�k��z��*e���i����|�9s(a�w�TY(�����77��g��)��l�q���L���	�-7�5)^���W���Y��5!��^��Q*��������L
7NG�x�;�_��Il/WiYfz��Q����WPK���J\�Y
�
(�i&}�(���8��v��9`����a�iu���
b�}����%�8�N�F�R�b��������������h�p���0���g���k�>�{~
#��x�(Z)�U(R�8eh��%f2�����cR_�W�d����O���]S7TP
&�G�k��>I��x_Np�~�@��A)��x����"l�Q^o�"|���}a�;
Z7�;z�@��s�8��'���`��w|��$��u����"�]LF������(o��_�Qd�[�F�C��E����\������^R��r@�+Aa�Z9���w��8rD�[�SpB�b��W�7��{������� %�n��������~u�����`���uZ�����;���C1��;r��C���;R��K��u�{K����H����+�Q�*8cv���$B���~�jF�g��n��?�6������w� ��l��l�8j����G�7
b�5{m��S��Z5e�r�=T���f�35U�,�n� +�
a��L����.����f3�B��4�;dU���z�>e��{����{\����W(������� �"KS�z�B���;7YP�nj9��xA�B�'NmCzE�r+:����#�m��X_�*�9f�RH��k�%�Xf����n���v�����cYA�Q����#�))������2y�B:�
]��
���?I�������h��c�������X	|
����k�����T��R��t	4�(����SNkQ{��4qR;���,,YG�Y��!7��e�����U�|���
�H:��*r�`%L�!HOR�T��w��}[}F+���8��T����)\c�^�uM�����S>�F�Y{�V+��#�����Z�;>>��������>����S��w���Oz��i:��_�������Z������H_�&7[��������f���u��s����X��=�I��l�/[�=�?5��'�����u�<$����B&q�Q��zn
�Z�������%5�������A<
�OnC�G���iFr��|����^������rQ��>,����W�q!�e��-���KX-�X��
��O���h����1�����!�erqk���B#�����������:�};y,>L����Hf�^�t���(��� ���{~��{(-%R��O�-�f����������-Yx�{+���w�6��A�b�YX��������v��4:�e�O���k�]�3a�@<��.�J~|6���_�8BMZ�R`��}����,�b����g=����@xEi@�t��f��b����Q�B������>H
�/���R@5W��)���_��zm����D[��k>�N	��O�u$��{�Z�3��?,������� ��op������m��8aR���������-i�BU?%Q�(8�|)����p�y��V�le��!+E$��{CPY�������]\5��xh0��k��%�P�����@O��%b�B�0imU�.!���SU��FF�n����\�O�Z����
[rO��>���aZ��2�G�{����j2]�<5���P'Y�����r��pR>���Oz���xjI�O�2`7�_\����n��tV��v�������
�AV�n���[������(���l����!`�U�	fk��p����(���7oh#��E���)����d����nW_
d�h����yz))���j�d������Yc�E�k���[�c 3"2�'N��w���)s5�!�a���������5�5��1���w4�Yio��h���86��1�L8,��"���
c����W���f���lon��Bc-l��g��O��Q>*�l�������tQ,� ���N�j4�$��+�l3�1��S��By�~��Q��v�YN��Q����H�	��KR�)���O�8 9�����o���)g%��jc/f	�%�3�#tt3��UOP�`���,�!���t.��`�K��v����������}�ew��)Be�?�6�������%OkD�F��0��� ��u������
�� ����]MY<l��xJ��qS��P�!5C��C������q�t��
�boVP��_@�����|m��,b�����
$�'B�Fk�c7rx#z�y�� /g�q9{q�"	@B�O�!��%��<�c9�!��m�
�j��^�����E������h'k"��M<,�L���Y�l���|9k��S����9��������c�3T��Va&f����z<�"":f��o2���]��|i2�A�nb���t@~p�.��������)^P��!���%"S���H�3=.5F���t9a��Q&Jbi�����DQA��
�R�3�C�.�����U2����8�Vg����w�{|���p[)�Nl������fS�)�����;\�A��,��PG��u��}}qv�V>�������.tL�P���|/	A�$�V�>�yG`(%-x�����NR�aE���:�(�?�8�I��y�M�&q������,���������W�K)�w����P�?x>3���Y����=�Q�Fy��CX
0�!?of
�(�^M�HE�KjZ�>���s���}9(���W^���p����h9����X�j��C5y�5��FP���
TI���w�<��G�_���a�V�%�u C�O��5=h��s9@���������e_,�X�/k'k��b������Wg��y<��yr���/%$9����_U���<�j��.�I�a�IbyE=�|Z�-[V��������(������A�d�����cQE���W���>�p/ck9��*����j��=g�-i/D��&O��Q�M���VT��w\�|8`���9������2B [��5�������b��e5Q_RX�#C��qb����O��Q��&-�_���Tl�T,�i6[e}%~������O�u��\k
�~x@��|-�+R�]��WW�q�,e3[��Q�r8w�(���^;����?\{M����b?8:j��z��p��0��d��f,{�ZvxtX���C��l����c9�g�2�KS�[���*�#�RB7%��B�[�����73F�|e�v�Y�B� ��yUK�k��u��������������mE^�E�����5�~0<�
 ���K&'�9$(wnLgd.Lo�:k���@"�!�U���S3��*R���6*��!)_�]������ut�F���}���~2$��������uv�*�����y��B/����X���s����`T'����Cpp����f}XP|xBa��c��#��m�������m��*���6N�*[��BD������=�dmU�Y)��d���u���w������"B�����n�^o����76�w]-,����f�������>��~����0�����
��6}��
6L/I�V"h���������-��k1��*/����q;����Y�$e?%�I�����}Qem�5�&���j�0��=�n6'���u��V�{q��~'
[w$����xZ}�e8�~+?���[lB��<��E#k_��&��x��&�2���!�������D�%�#6��h�#[(��N�Q<�_���Y���p��f��������&��l�5he�`]�a5t��,6!n���f�*�R��G!*�P��j�����7�mb�C�m�������{I?�N�^L��V
����uj�&b����u�j�N����\!3��X/�I��p^e)�n�'��Y���f�	�N���'�����������iWn�+���w�:N�1,�
��I�5	��
kj��^��EG`x��������:�
�z��`5M6����5��@�.��hVy�����a���g<+2u��!^yApC��7V�}��M��{~y�����!n��x�N����Z�����^-���O�b]F��4U0����Y�BK�hyp�\LK���.�(��p�0����	z ����B��	"m_Z�V����W��a�b'M�2~�VF�y^��NoOe^~�������n�7�������v��)�5��$��r8W���\��x�}7
?F]�b\1n�pE���������B��y�'t���:o���<�?���'���	@�A����O�����_�w��#�S�&x�?��t��W�f�x������V7k�(��L!Y��vx�?���~����]���fJ�5[�VA���&B����A%�@���7v����h���%V��?���;R~���{��Z|��
#M�������5��l@E�nX�}�\N3zt?�����Gmp��	�Q�g\EF�-�tE\��p�3����3���,�&=�A�n�9z���\���=&����F�IwP��-n�M�?����S�F�YJ�������R�R�l��
�����R�~��u�F�Cb���B@���YR��:����+����<�8���xP�r�nQ�l�|��?���������e�`��
%=���6�_~�7���O!����
Sk;�07b�%Z��-������v*�N�Ao`����Cj~��������Fmw����r�GIy�WR*�����DscF��U2��d�#q�n�`�n#��j]����#��l ��8B���a=���E��y�NBolp~/h�2��wfr�DJN:z$�`3�>D�#*�$>���)��	:~�8�k��w��N�0��?�Nr%���\����eg�y��}J��k�D����}�45�R-J��P<���$�;������+e�#���M���WP���y�N�
��L3����0�u{C��[���d��������;��~�4��u���4�v��m����W��'�����J8��HJIz�M����;��ct�f0j7G��h�F������I%?S6��bD�*'��_K���*�c�HX��
n��1�e��
��"]V��Y�E^r�jV�U����_1S�	J��P��g���L�J1��*�R�����h���i�Tf�]��r�F����<s�k5)�GkO7�)�|��o3zt�5��h]U����=�C5����us�?`T��Ex��<�q>�����6��dcC=qSE�������bs����]��{����F1b�uW����D�}9J�p�
���1nV#|1Q�
����;�t�65S�.�s���A�A�jg/+k6��u_/+���%���8E�&�v�����U�v��C���Yr�3��(������+KK/g��2��.��z ���:/"?R}pk��!�b~�^<m������RFi��Y��w�w0�)%�09��Y���r�g�6������C��R��q�)'������f��g�U��1���
C
~��f�l�u�F��Iu���o�x�:L�"������%�x�*!��8��}���?T0Rr/�� ��dN	�5,���TRC6�������SjO<����	&�V;���c���_�k�W�s-�xw �����j�f�v��I�>:���"D�'��Z����������{����B����Y3�..��wN��f���%i�^_��u3������b'$Mi��Ke6��D���M�����N���Q�t!�D��G�p�� �x:���I��C�F�h��n|����7� �<L��&�Fi��������T���t���w;>gbd��3t�7�������'#��I�)��?�x���Qst�y"�����pi>t������\R$}��r!���+ �!9,��.r<����Z�������B���J8r@u/X�h�9��(�
Y��X�!0@�c��`}�������#*����"��l8�`�Q#4�H�H���������\p�n���{���=�&�d��)��U�{H�t?"�#��8,���)
d�+w��������9>��'��$�9�K4eD?��d�P���S�8 \�+3����a��tX�+e������������4*!nG�q�����r_��]���}*L�J��G�J;DD$Y�h!����&�,Y;�3Lx|nT��O$�JI���}e\+���:�|9U�
�[��wp�[�!���RM}AY2/��'���y��Xf�D������}k2�)0�-����A7������m�.��L�����0���5&�|z�����*�X����K-�]���Liz��LS�<�^�8�����7T�����-��r"5��8�������x�����h��[�N�U)w�7��)��an�0�X8b�T-�2�p�~���i����UU�T���S� ��C����0���������g��7�y�=A�������F��Gh���~�����;
���b��,���`�1
<�34�t���!��K������\�QC�hVB�26����F�r�������	x�+��KR-�h�#����
���`�X|B)u��~?(.��R�����YU�5���N�N�Vi�z���$�!At03J3���
�P�>a4	<��9�ZXa��\H�0��a$T>�\sOj�+�����tk���fE�����j|m��@�3R�����Q\�qtm������}Yon?������
�cp�W��U+$�|�W	���O���H\���xCD���]���w(^}����
� �W����o��d`�����E��(���)|1$���P�0DxrF�������
O#!��P�O���)��c�<D�=r�s&0R����'���(�����:X!|�
��L����1�Sm��P��3�W������>�C���
-�����0G���V�;�M�f����]2�]���E�;������CD�)4	��"��).�"�^�pj6�������x�Xc��c�]|��PPj������Z�����92:x��8���[b�>CH����
��?����rC�����|o�[�5?B5��A�X���>�������n���~����R�Rr�"?��gj,�0�\����4x��F�"�������|����OF��S�����������d�=�id�Q�1C"�Uf���2��o���H��S0�F�t��"��e4ua	��������m�V���>�TX#�dE��8�)<[yb��(�G<�����W+Y�V,����	Oi��+.�)���
���]�RY��n[��,���s[e�/=����_f�K�K�?1h������ ���9	�s��Fdk����������=ZK�R(~s���I&1�����</@�
o�y[;�����D��a��EKb�iO.tY�J��.����>����1AUV*�!?4�	7�����g�.I��q�
��������N��^�U�f
;X����|�]�6~Fv����^8F��h�`�����H���w��0wpB�x�q��&A��i��3�����S�
���0V-s�%-y-�����]�Z��Ead2>&�$�")�9���[���m���:���[�?����D��5p�����L�,QZ���;�(�[���&��������t��r��m>��lC�8���KP�����3���@�����0�8��$|�cT!�!er��*�,Nk*��G�0�Q����9R��+��
5f�c��S5�
�cG|r�4��"��} j�)�������0�%�+�i���3���|�F�DXT���(�0�:Md1 N(���B�kK�i�g5,@��"��-�M(�c�86*Y�����q��t�`���^\����|�F��>��A�.I����?z�|W]�N3�a8F��:xI�O�BFs:P�G���i��B0��l\�Y����C�������4e(�������2u�t��Ms��L9a�s
C��A��C�X��&'�jVh�+V-H��C��������I. g�g�
�����@{cB�D�W�Gj���C������2a�]F���M�{/�1��S<�b��	$���Q3v�$>����v�;�s�3�\������l�|T�J1�����aK�I�k;JKY�m���A4$�na���AZ��Gv��(~_o����b��`��� Y�Q��R������6��V��������� �8+^ �U
�����<D�����Q0�K*�	0�4��D��HZ5_=���������^�����8�aD��O�n.��T�,n',�����q�a���"�+�}���fFl�K�tk0^s
t�]��n����m��.�	��|��./��)S���z�[v�1�����C���{T@b����� q��j3����U��S�C���s<H/�	i@�UrV���(�S$�YtGu���r�L#���l�:)�s��]#f�<�s�)p,����(t�,�3&����#U!��������}�dh��hA1�)�"��y9������V�!�
B�e�&�������-�CM���|2���.;7a�"������e�\�Z���q� 5?���_=���[�����!��V�+�����T+���G�;A�X�#s#� l$�L��������bG�{�S3�_4�������*B��!Y3:-���x�����/���P����7��4��<��/0��W��Z�����b
���8�Or��#���\$W(�F%�-���VpdVhd�3�',}�n��y����%�������Lc�w��C�a��f��X�Q���6���{u�j.��)Z��_�_vy6H�c�!�i��~�O�����sq�X��������0$M�
�;(�To�o��>`_���]��<���I�k.�t5��c��G;Wk(��r1�>��,Ud���R�1&�"���Xd^j���	��x~�C��?_��	9�I���k?�]/�=�gUq�D���J��9]88�H1�������ru������Q���fm���6�*
����U04M�e�	�X��0��:^S���?"��<�#����Lt��]��+�������:|�h 1��|�)��=��������9-�.�-�����9��<
����N�]�$�*��@+�5i77�)50z��W��Nu��n���jt���uD��Af!���{�$���bJ�u�z�eO1�Q$�z�����zs��6�sE��$YL�H�>#Q��Q��	�7��u�v���h�M7}+1�3��L
l���3D����q[�'+]��
���C��M�U����;Q[oq��`C����7��lA�w���5�B�����\/���7�F������u�iQ��c���z���r*��e��7`��W6��r�6tsO����7�����rrG�7�0���������O������`k�	�ml�s�"�wF�����{�q4E�>N���dBA���!?e�H>Y�^bU�V<g1�bu[��+��^����e�����w�YL���[F1��K
W�.�+j�r�XG
N���	����x�a)�	�j��%��C��:�!����I�|�����
m�5U�U��\��T�Q����n�eO3������U(���Y�� y���X�����3��r)�>�O_�C{3��{�."�"F���\�B��g�4C���r� �'��<�h���l�R,�����QY��������HKP����`�D)t�3�+������u
�v�Mza�YP^��us�V�!)_�t����'������5O�B�?z��\}��e7Jh=n ���mR�3�[�uu�b����8����>?���������q���9����;��i��a�`y!?�on��G�83��}SFG�fU����i�2>���5�lC�\$�L<�#5P���C"cD��!(�#�}��bD�9�f� 2C�>W'�K�Z��������������������oed��%�p�*���P����g7��+����T�D%^g�I��U����d_L�-WOO�d��Ya&�;/Ih��FN)C�C5���4ZH,����N��#�`S"��2W	�t]�������
K~�J����g��g."7B�ln��e����R��\�pI���$g���5��\��lI���u-��c�Z�?����H-�t���Pr�����r=l e�����X�S��+�����0��cO��&ng���^/�x�������$m`t2�z�q�2T� ��HE5S�$;��&������^
���#o��w�&�T���[Hwk������M���+����LzE�DQ��#b�d����<�Y)��>���&!�&�\R��J`�A�*TV��Z�g��G^#�V}��9��o�s�]��G� N��4O�T��a��	o������m����I1�����X�B�����.�;H�^��� �^T�q������f�6b�,2����2V����?�3�������w^g]8�'_�'�=J�z�'NG���������@s���Op?��2��H��B(����Nz������\��'�c~)������`�T&X���,q�0*�x��������g�5�U\�^�c�T�q~5�M�I1�*��6M����X��������chs�sF���K��������#�CI��Q�|j|o)�0��{�����T���;;5�>P��vT��������Wec�4!9<o*n����q����~�n��0�X����l���9>r3 N�Q�DiO�3$:r}�K��Q��'�)�	.z�P\1#���~�
�@�8�b����[E���Z����_�`����5�I���0B�{��%s����w4�
�������`�`E�a��3���{)]p����I���fqb8q�n��10���Z�l��5k{���>rqy�y$���V����SI��?�ing66$_eF[���2�w��/��m�:������y������XO=�<��u��� ����x�z�e�k��9E���N���-�|��`�77���vA@��=���q[$�����E~���	L�*�����S��Y������qbt�W@��4?n�
�Hyh{H�q����p�v,F��l���#�u|�`�j�n�tZ5��c���s;VN�VU���C��8�$��]��ck}���jJ�6r�]��u2�5�)s��h?F�S�r��WA��'��*�d-N�g�L9{���=�/�}>����`
-����(����I�z
[�[�h�4`�8��drB�!Ip���9I�:�UD�Loxt�E*uX-o%r>���f����E4�asX�`���%�����5<}(.a�	��~�
����r���kO�n�3��X=�7�N��H ��V��m-&���H��`�p�Q�"m�
����eD<�?�
�,d�2Q���E}���O��,J-��k�=�`���������&d���w�	z���Z�UW�����������^��$U�=4d�����x/Y,�,�<����n�;]I-���u�cYm�][�S��y@��������cP��II�����
�������W�c�����_��YS�����6�Y�|�3��My��������Mn��ab�}�JlX��N]���L��j�p��
T5��.�/���
�1mm�W2R������;�=`7��KJ2!�/�,?8������n9����D����:2��M�������������W�n
���G#�
.?�s����g]���K=����%�������i;�8�0�����&c��#��^�@����d[Q���Ygk������
�E�t��,^������wi���Z�}dG�����_�����
����[�$v�I�1��PXBF�}��<@~�a�v��l����	!���98��F(��c�)������b��Jd�e���5�
�N�����G&�D�X���EC���
�a�"�
xI5�kd=����E���6f�
�,o�'������P� �2� �����5�;O��{%����!��N�9�&�n�����
RQ�Y�_}x�rkY�=�b�05!>�c� ��&���<��g>fF���6Mjb�EC�E)����\d��E�����[	������
�����>@	d}$�Bht��e����^@\ #�J0lp�~73{ [�e*7
�YB�,��`,��o��R��'h�31J��)�Kf�	]��A����V����xU<��:7/3�f��[\��9jR��a]�O�`��{��������)c+��A���b6����n=�f��������7���eX�O��"�C~���$?wc�q�o�F^�11�:�V��&
hz�t���'P��$���*���}������>�5G
/����6�Pr��.R����<�TS�H��� ���8���~�������u�����y���ObYsn�Z��j�������������Dx�0 �k��f
y��������8`8g��N����=�b^�U�!Cd���x;������&����-X@�e{�����
�
��]���:)^M�,F��	��������:���P�m�Y���:0R��B]g���N�P��6
b����vQ� T4Cz�D	�/��'��A���b���(Jk@�"] �G�Q�Y)�l�6h8:J�T�Z��!9G,����9!�]0:H���h%�g��P���'h1O����kV� �Z�<��.�U&I��r�"?=iD��D��9��V�<�C��s��#������y��{���M\
���`�S����nF�K���p�v�����	�9���t�o(���6j��`Nd[����`
�\�_/�W:�C���"�tf!���{2|qc�!��W�~���D�o��yX���HGFS4���lw>d�.�5��	�f�3	\��/��y�+l^�����M��*�h4�1�&&�2���F���w������s�:\���9u�dqCy���u}:��CM4�\������Pb�-��c���;1xNN��%�7Q�[,t����A4D
�L	0�NB��Q��Y@[���?l��2O��5�L/�C;�8�AV#�	�����N���
Q�����Y�4�	�rc��&�j�o��S��@����"T8y�F1U��+����^����c�k����}�<�����6j���?����?�J���FT��f�hp~6^�����E���O��/p�e,�oW@�AP}�o��>��(O�k�o��:\Ln��Eum�`ZX��`�`�Y#��p���5�b��s�Ya/*�9u�0���@�	���m�N������S�mn�\��4f�<fY�I�x��]J�5�?D�F�Rg�Q=������:�@{�������|��E����w��|-sV8i��f�M���D��d3�O���Uez��f�����
���)[y����"���H����.������)[M"��m�b��Q}��������F#YV2�e`�3u�r�z�34n��R�����${�R�����(��I�A�>�d�� �G�p'�R��=\��y�9��O�;��������cpryq����sq{�S�T�	Cw���w{s����Y�����pA�U%��6�
-�����"7��(�jf0��"'WZ�G�~v�b|�<��(kx�K������
��T���)�v������x�'`u!�U6
pM���mqt���������>���b2B���!x�s�^DN}F��PKM?��6L( ������=*H}x�0����(�����n:�&$��o�N��h��� 	zB�gE�>[	�`�S�����}��_k~��IQbv�(�>���;��Q�����7|}O>E}NSx����Su��Urh��/��>�K��-g�`C���3WpX����\�]ge5���	�-�:/2g�c���;��$�C:&8���*[�X���Fab=�r�GP1hD��%�@1�����������H�L�Xg�-6�)��xQ$'qIU��W,3��%�\�{��a<����$�1>��*?I/�4@��������Z_z����j����A�r|k�o�m�G���<�Ww����f]�%�P�:�Udn|?��X|��8�E��x
'c��u�a��7A�NV"B���V��U2=�6�fVKM%B���������#�&����TkL���!��P�4��g�s��L�ptE����n���K#��1g>?g��5������^�	�����G�tLkqS#���W�jZ4ih�.��W�G��1�#�VW����D�;��y�V{�����wX��C5xU�d"rg$(��R��A��lCh�af�=��^,M�f~��/���b���S��|}yy[ID9L7���Y��y������c
����!�p1��%������J��9m���x�������n���t���t�_{���.x

��sM��������Z����+������)�X��j=��Q���u����LST�h ����P����N'I���	�������fV8����b�H5G�T������������������a2�'��Sf/N.�]�wn;<�WOH�����9P��$@m6z���^�{���r3kd?���<f����GN
�D�����7�/Nn�./���oo���(���
����v�9�1(D�AB�Y����G�f�K�M�_(J��c=8	�Hh%[��yJ����''�L�������$43���!�K���8�c�WH!��!�[�j�;8��MJ�$��lY�e�s�,,�F6��;*/��9#G:'f3�a��G���C���z�h�)���&��h��U��}B9�iN�Y��	����d��	����Tt<���$���[;�������l�����W���#
��3�_B��
I,p����xs[�:O����'�#����jU�vn�p������s]i������s���z�4x^T�Yu�Va�8����
��R�*9�1~U�T�}��2��X�����u�����y��������G�s������OPI����a.Y'��=
�
�Wu�l��FG�,8�|1�(��<�{l>��o8��	� GgmB����*�~��F~��Bf�<EM0�q� 5���<��=h}K���L����U��"4�����5$7�A�kA.e��-��������0t�e�v��
����h�2�*�9�L�8W�!8\9W(���X�����acw
G�9�l"�fE)��*���*)BV@,��l�`X�����JH2z��|?1��F�+��jUf��@���p�_i=v���d"NclW�t&����(z���L`�I��Q���(��.�P�eQlq��
(XpZ�t����HW{��.KW��
��y?��Y=���2�X��&���Z����
��w[�v��2��1����E]��qv����Q��Fc�W
��y�`����;���	���#mmJ#@j�}"�<�\�qf�g�0������4��)�g�Y\��+@�7�,�A���3~<������>.���y	�d�&i���4���,T������~������8���0�~��;z���r:,n�P��^������A{������N�-��+:�����k��\[����;���[��yx�*��f������q�w��m�I�mR��P��%p5����d}8���Z��QgC\�>+.I��M�	j���'5��A_���M������=����-�]����:h�a��5-(K��
�R6��po?��w���Ac��Rr+V��~�M��?h9O��O:m<���nN"�~K���{�M�����7x����f��U���N��$45� kM�=�Or��QLq����)T��04!�`nNA����t)�O���y%��KtTh�y/}a���QTF��������z�y�����Ga+$RX��d����<���~���VT(I#M]��!l_��D�J���������zw�<X���G9p���u�zJ`;-%<�V�#5�}���>.[i|+k<������z�`o/4�����/]]*�����s���^�Wx���O��w#�|���0_������R�E����<@��L.��1rm���
.���DXr@Hs�#�
����V�Z��YO}���7 ���?Hv��h����%a���������&�&�S����.M�^c�7�N-7�-
��Y�5�'�lg�`�����O7p�b�#�y����c
��z�N�%�8v�������p�
W�_���<m����F�����Z�8�y:Bw��j
�&m���`P��Z���~{�Mj�X�Om!�'���M�8u�ST��g�NY\���r�^,�"��}
������xV�,j+��[
���I��U"��+��.��~�����?�n�r5�}��<pw+lg�m������O���������u�����
�H+t)�7�������{�`#r
�8qR�a~��>q��5����,z�t�k���,�`"���}v
��fR
�����t�|��pU����p���E�ip��m�����T���I.\�Cg���5����v����jP�v��V�}5��>�(���/�%�<��`/%�1�����t
<���i�rN�Cz �y�y��:im�
��!� ����,x��|4 ��G�-��'x��R����`y���hb�����y�f��h<�^�)� �mxW��3p�z�]k�a��G�v���]�2N�xy�IHI���7[����,%4�J�1j�
�3�j�\�k�"�����w�]�}^�N�JO���cyK��x�f�_��v^�P���)*�T,���}d5��=��u�Qo����X��_���]U���lC���	���S��c@T�z*�"A�O���/ L���
����Qs�9\6zq�t���9u5O�&4B1k�	�Y���;�i����r�o���ZN�����W�s���&�[���<��C��9H����	�7��tt�A/���x!���+E�������p/���|L���������_>����C��&�z�]��K���������D������wp�9m^��gY�Nt�����[�7.��z;K��I'[���"q�:��2$�����tM�
S����]!���2�0�)����U��x����8�����2�����o������^r���*��X�W����{��'�l���l�C��N�T��3�5�[<�-�-� ��S��~���s���4")�|Y��j�q�.Y�*.���z2J�h��J���{u���������9[��5J�Gfi:�X���Cxf$3Q�c��j�ZMgF�|�EW�yL3�8Z�h�w�B��8�V*w���/��o�f�p��5���f|5���4��m ���C����.�Y���F(��l����������������m����-�[do����@3"�p�����N����
�����[X��������Q�j�i���_���~��-*��^�;���f���B��:pbo�H�D:�Xpw>_;����ym�n�<\l����A!_��C�Fl�����V�EX���l*:����]����p�l[�)�c�����l�c���sSM��|^��oV7��Q�&�.
+������=B���X����x��%��.����h<����f�~�t�}j�O�+���v����_�
7[��
�������4����2���w�����7�'p�7�hN'�4��OteA~����	x�0�n?Y���NR��x��J�?$�����aud�_�)�J��8D�G�z����o���j�������J�����]F��#y�$i��������0�A(b�B<=��]���
D$yk�5/�[�Q���0K`��[ ��k��<���#
�KM�N�Tc�l�{��1p5�0�88��7�^�s�%��VVTXqA�t�pN��lJ>�����{�F#�K���v�;OE��b��/ 8"C���}1��cLc����5��i�1F4�?���(YS�&���#�9�!��`'�K��MU*w"���;N[q����D����:��{J��~������8����a���5�9��dG����c�VR>�NE�m'9p(�6����L�Y1��y?�G�r�#E����&�����:8���v��|G�Q�k�v�
�6�(���-�a��$��7�/��"`����@`�b�z2�_�A�b �
i���d�
���B��]�.*U���qs�E���k�;��H��;��� �D�7D�L�O_��;��b��MD�X��i�!��H����P���(�;0��b�V.�%�`R�_�|�b'�7��X���[4z^1�����3���+��3'���9���}����w�IC�]�2b=�$�!���.n{{$�B���������8|d��������!���aDL�}B�\��j��]mX�P��nU�6��{�oD���J=�SJj���C�35��P��6��u�9���{�s
��p^xd�������8��Ba��jf���\$v�j��m�� ���X�M/Q��8���Fc���iA�4;C:��g���G)�Dx"b�wX8<PH����'�!D���-��$����z���A~�)��������mCc�D���-[�+Q����k����\���a|��h��(�������[
>�"�[xj�Mx,��>:�v�|��!���$���L^x
}q�)���^�S�!L��"��l H%.x������3\_�s��O��K8�r�x�)�=�s�)�D�<qh$�� 1��1%�D��d�-t'2����c�&qR�s<K"Z���� I�!�������(��NJ#I��o�7�,(\c���������(��s]3��@�$y<5I��G}�7z���
�@Z�tv�$>5J�G/�������`&�$~)�������0�����:������g�/6x��d�[(�>�"9��r�,"&��zR�A�u�#��N����y5����^$���l�\�������lRv�����B�=��)�}w�c����n��:;��S����&Lx�l����F�B(�������G�I������ �h�,J���x����e��0��C_Q��,�?�_1�y^]Q	�]��Z��x.EYVd�z�L�|Q
;^�ZNv�����Oq���l��t�@K��d
A�T�
���U�5��	:�����m?�+�gi
�rr���Z��P�(:����)iD0G$��@ ������������F4�����FS�dr����y��w�����N6%��FD��1�si�q�1�����5���k������Zu$��L?"M$S8_�|*�����a����b:qM�	��j���X���dR�p[st���CN4��X��A�Z�����	����S!hz.Z���&��!��d =A�)Mf�s�x�����*a
�>n�g"�#�S������`�R��,��Ts;����;�h���3JC�Hw���<b�r�il���;����WA|��Z�xg�H����]����^�
I�����Ao
8���cMe���L2���+��or?D�/����:�i�������`tH!w��S�J!�l���k�F������.��.1��
�Y�-m���*hULof���=�,���j�.R�� H��i&��r�7������oQ86i��2�J�����md�x����T�9$���qp#�9Tgo/.�;/s���O<�l�s}}ym�w�h6C1|~ry��������t/.o�7���.�o;�U[����]ek�����H}s~vr�P/���`�l�k�[$h��`���pk���U{�V�t��P[nG��6�0��Xb���i���n��N��L���&mp�E�&3��R�*�Qr'KEv$�4I��C����L�c����265��U�#�) ��������RK�V�l����Ef��L|�Q�������X!8�A���`4r�%��a[����z�������=s�O*iU�!�HG�w��Y:��?}5<��}`��3�����'A�����,ju���u��������t���}RH�������\�\���"@��c�/8��#uo���=>��\H�3�����,s�U�6V�<V1]~
�n�q�'�
A����D��������0��g��i�T�o�>T G�?�*�;���)�I��a(HL)�*%`F���sTR�� 7i#0��b���z���@���6��@� _4$�>������W8:1Jp$���=�'���j3�ti��}"?���$�0:� 1)g�@@�4s`G�'M�����f�<p��6`5jj������e��
��4����K4k�E�%l��������x<1��W%���ap����������a�/&�e}����&�r����w�x�m4?Ky���&��y��$5����d)�l�1�����I�$!�=���<g�u������S�4�#�����PM��>�����|�K�"Y�!��ui�w����^7j�y�!��������P�����X��
\3�(�
���x�$C��b�I+6����W��<�#^4t�2e��RV{q����<��W�k�����R���v�N��=���-Tt�V'p8�?J�$G"G���&����3���t8�����@���2��Q&
h	n����sP�+u�i�����r����-�5a<�,�B����<�
YJf���B������%jF��I�ju�*����9!�0�C�SL���sx�����}V��J$N��L�	7��1��[H8(*������\�x*p�u�3�T3��u��(Z��l����b6�sD�%D�dM�'�e 0	������l��0��,#7��,f�O��#��K��$b�����w���yU�z?P��gs�d$n�+��\��n��}HZ���#7���l�k��O�1=�(�
�����,"b�{q��X(4-�<�>k�����-���D���gy{F�����;�����y�2�o����_O�u�d�'�q��K�� �Q	�?������z2vX�'��$r�Qk�(�Z���'sm��aD�Ba�������8L��{�+1��h��"w�z����������� o���������.�[�7�R��w�w��������B�����e�QM��i�J���x*�iR��d�r�H{m|�d�M�VyW�����T]�+���p}�5��W�����Y�X;�:�����L�����d{��40��f��"����=�"�����Q2�G;�TIz&�*���g�y�Z��A�H+{��R]euWy��2�Q5�Xy�������� �k��a�o�v��<�P�'2l1=R���w��=c~���P(���<U�n���!~z>��UT��cu'��]���j	t���%�]4�%\z>Fr1/nT
�EJ:��/&G�g���S��E�M�a����Ju>���$���3i��m?���"�����>Q:p��m�U q�B���������F���]:�����H��:�n83�4d����X���r�)��gCZ�������9�S�����`�R�y?I>�Pg3x��r+�T�	��)�a��U'���}A����7kZ�V�����i�9M��������'�b��E��H<�8��M�h.��3��X��o���3��+j]��#�e�^xf�j�i5E��q�\A ve��x��g���i�&�|:���c7�i`C���@ztK�x��
��Q5Z��^��������kQd�YG�)�A�M����1<�U�0��e�i�I1Xn��ia��L��$$6���X�W��O�G��+��JB��VEm/�z�d���Q��i�0�j��*�DA����U�����2�U���`B��K���M�D�.��^Aa�a��{P����A;<X��M��~a�"�=����%�PTp�����s���oQQ.�
11DdI�F^�4������	1�������7�uac#�m�3��Kc�����=��c�N�(q������9���3��s�#L�+Mjs��f��������V�(�
�6j_8N��s��H';�DAk��1g"E�(�$�'N�R4Q~��v���`�8���Lr��`��@����^�T�,O�|�f;�C��q�Y�m���]Uu��������V��G��`c�����T�/�`��������w2����rf?����x�D�U������fC��X����t���Q�#��f�e�U1!qN��(���	��:�0���o��[I�|-�W���X�:!6�n�[Y����{��}|v|~���	3���������_����[%J�PCtx��[+���,��U��'����;��v��VUq
J�t3��5������#5�����I�C��M����h*���14�.Y���U��S�\E�,���-�5���Lh0�q�)�}�t4�
���B�t�D��=�tP�.�����
6�����z���5{O�����dc�c�\K�2����4�(�jQ�.1r����@c���P���8Z&�`����mkW�!�k�Q�V��U�m�z���:�h�B��EZbQ�S+�*%��!#t�IM�;��(G�}���J�W��S���q*��8��7�)^rT�6��7���*�q#Bd<~�,��,��(�*�Z�~<���/F�����N>��3�&w�{��/OB�1Vy����g�
�~����9����76\Y �{�
UF^\���vG�4�t�)_�D���s�)�2���7��q��<�'gO�le��f���L�!�Q�x�S�ji�#��y�^gP=�X?�ti�#U���~�$����e�:$�J�9�>DL�[;����m���uGZ*��&)c��G|��sF^��^|&;c��b@����*��~�>���cE�C�W�(�O��.i��!m�{v��DmNv���G��/(�$0#W�����tKh ������OaPI�G�!B0���q\�������WIgb=�{Xa���r4�U�a�>76�9S�����.^��)`I�d�sHm���5Iij77�%q��!�,��\hP!�1,���hP��Z�n�-��r��U�m���h�GM��d`E9��M�|��%�������+���3�b���D��#.@0�(�gf65��5�d�L�"has���$]mFC���$6�nWH������q�j�	���dD��.}�v��Y�E���o��N��,@����M<��~=3s
W�a��|���o<)TeT�B��%c���'`�6���������x`r������yld�5
L& =�e����v3�b���������]�;��Pt`�7df��`����5h��`
����$�vV�
������sI"�{�����key0G�9N����"�Qcl0�Y�X���t`n(���R//V2���|k��|���O�)�Lu9h�zp�����>B[p���
*����_p�����j�u�"v����z�������r��I�aN*���xL����u���s���Q���[�����9���c�����1p���@�+�#3���j�g��(�8'�k���8P����Y��z���dr���Jy��<��h�eDo����9�sZ�C�;������^FW�mzz��|� �Y"c^�D�^`]�������w����+�u9��TA����|xt��0�E�����WO�
�\}e�4)��A������{*���#Ri!�2��p'�W�w|)����QO������4%
C��Nnp(1�����s� ��������
�|�Swf�1������ �Mj��:gb���Z���z������E�5CEK.~�	]vx��Z$$��R���/��]�	*�	P����4$3Uw�������@����:!�J���Qr��0J����M����7�S�BQL�va���<K�l^Bk9)@+le#��1~����&x�C��X�H�� ��	 e��X
�i$=d<Sjc.�q��R����DG�Cs�'������|�z�(�(��}���4K@�}�+LJ��	���%B�E;�+�D���$��
�f]�;f�6�MT���J�������A����K��0�XP��L���;%F�U���N�*�2���De� ����d�x+�+*�a��7,Yc���bH��no�wy"�T@@�R��?�
�e+����N^g�}9/b�.��y�!*.c-�0AG��*O�H;�'�L�I4��Z�&j+��iA��=��|��D�H��A��)��X+��0"�R��Fwf2�m*�H����v^g�d�����q�5��^�.���c���p��@IOM*�*��v��X��F"r�p_[��w���G��JC�<�����Sl�&/��U���e�fD�H<]XeE5d��<&GJ��j��PF3�^h�4���(��	���ck����sg9
��=�8�!��q��^g��G*.)��'N\��vZ�N��_o/���2�br9�C��J�}�U�eb��:*�a�od�QN�DH���`��������@hM!�+�Ys�Y8��O��7��T�}��IIQu?�`�%�%T����@p��H� 4S�x}�_��C8������F|`�x�n�r��j4���x��J]�E"��/�������Q��c4u�L��=�S���K�t�~|8�@��f�%���%M�����b�8��!`�L��l&�!h�s��Tp��^}�q�v�[������P�)+�9�/�i����^�����!��Y�W��d�a<��m:3Tk�m��+�V%Y���T��JU-F���v��0
���u_��,����
��V
zO+���/�	�F�����f������'�kqr|}zvq|~v�S����s���87������3a�0�o.���[~����q��p@�,�`�8Yl����3{����=u��A�EZ3���� ��0�vN�E�;)�8i���J�ESR���/q��t�����h�l�YZ��C
(/<�=5��%�;�����df<*�pB���6�^���!K�5H���d1F����n���s�wW����:� y�#�^#u;��Tc�g�����L�����Z���6���������i��{���������B!�,?8y�)�M,��'[�����p(�Y��=s"FQ8���&*/iL5������4���s���l
���;dC�e�l�y
��8����3@@���������i+}q��VOX'%�h�c��6����|W�g�hM0*HVq��	��U��t�L�MerxA�dl���6�h>�M`��R1J��!S?���������,$����f�4T��4�&�}_�1=���e���<k-v6��q@�v��66��DpC����wfz�������Cb�?b(������}J�c���3�X:S�6�2o�]d����unkl�D�84zT��B~{�?��5��OH������0xC��j��Fs�SD��K��h������s������w������$�-��6��z��9�	5�7m�m\w�Oa���;�����mIfX��6w.��:�j��w�l fxw|k)q�6U����x��S&�8^CB��f�=T����uZ���������UG�p>�
;-��85����9�~�,�^�b�.g��H�F��!����J��O�-�S��rb?�s.���l8�����G�e�Aq��	Y�e%�Us/f�0������d����V������"��W�U��j`P�����u�X�*�)���	�?��pNd�]��pqSf��)��{�����o�i�����>�A�3�A-/�w:A������81&`���vj;�hq�~h6&'��xc��g��sPo�S�aS�0CV�&�)�x*0L���#C6gT<-j��.XQO�������[�dW3w��.�
8��0����>}*�z0:U@�"�ySLTNO��������h�y7��M�+��.�9���9�C��_�*9XH��&���h�d�dY����{�{�,���F��	��j��[��d/����@Kg��b4"��j���R��4	1ss1ZA<m���&[=+��l�c�t��HD5�8��l�H_I������.�����/����{�v�U���W��o����rvU�7~����S2�
Z���*xg�(|G�� �8.��q�e_{cd����0&�����&����Ddlt���A�!<�,WQe�vR��r������A�5jn���g�M��~T�3L����C�.�u+l���>C�v�v�$D]j���T"8K��
�
=
.�XN��|�EPNDg.�� T
��$��Ya��hW��p*�s����#��Q�t���qL���G��A��NXw=����G�����g��GJ8{p����������=�(�����!��<��I��#��"�O*�������K�4L��d�p^$3Q������������`x�m�K�AMP�\���>I#�!�����0I�E�_L�����
�&E@����I<�.����Mk$��"��I(,���Y��<����|s�9�rM@��Q`*�{��6p��}�!��hF��C����.��5;Y������iE��1,="�������Nl����n	��L"M�59`u�!��^d|����3���_�*;���u|w�p1���k��Y�O�&�S�E�s���u�U��V5�N�AM�D-�2�s|�]psB��������a������}De��7��/������!�"�'�N���}{���j����>�+s��[/�8�����������,�,�Z<��A�[r����E����������������~��������k��`xA����O4�3;9�WN�0~����'��nlX��3Op�s�r��1��j��\lHCw7x��j8��>���NW��� ��L=rr�3\\�� N��6Dz�y��fr���I*K���7<����w�X�
��*����N�e�����%>2��|��U,����;�s*zU��j���4yKv��9z��������<�(�F��%��_�����4D��N.>�����.���&`���ru�����"s����������
��WZ��/
����������n�>&�J-z+0�)����d����4�s��b&���2���
;���*3$�b<~�K�&1z�q���8�C����n�~���������'P�\���7�m^�=Z��_l�66��g.�$Xt��3I�+����	�.0P}�"� M	�~X[b�l&Hz�p�/�|���%�T\H�s�+�\~����e�Eo`V�&,�OD�T����Y���a@l�L	�X�3�b�8�KAD����a�1k��0�`^j��v�IG�A��#�l"�($$��T.V;���p�A_R�I�@�I�gXxvt���&��r��0��_;G.p�;�L��?�����K�>@�����CVp�/����(�b��u1��7N��X�p���7P�@W��/,�����c��*L�#��T�f,9���@�����w}��W��%3G�08l��qZ��p)�!h���o���<Y22K�h���7R�������
M$s6@Su�8NB����69-��;�Q���c���vp��<�n��	���������jt~�:?>�pg*+WV��#���gs�d�'+��y_-�Y����a�~'������.���/;�In��}�	;���Zi<������OE��vxt����_$�N���7�k\�e�����B4	��s�����-G�L��%k�f�3T��,r[���d�3������������I9b�`�7M�������1����}x�i/�R�<�b���!1B&����E�=�X���br���tk�Q��Am��Z<x���*�k�3�O����{��|����(��b\�Id`C��� �Z���C���0f8A��X
S��s�EK8v%��d�}r5�!���!���2 �wr�p��
�������R({TR���"�"�����y?Q�����q;
[B����c����4���(L^�f�!S��Wh1����}��3�A�>3c�=�n%��}��010��a���s�+z��0��Nd���d	5L�	�.{��>����&��Ku0��|$����_��+�d�m25E��G�h?���Wf����9���R]g2XOG�2��V����?��k�N�p{��i���)������2h'���b)�*��h��L�y���{�ZD��F�^�;�=�;���V�-�V�e����C�Q�;�dV���s42���\^�#f�=�����_���JenN������l<|�!��n��d�hS��!y����g?�y�\R�	^�����e���p�p�����Q�!
�����DY'#4_���v�e�L�\K�=
��y�J�����X���PDf��|6r&�~�&���7Er��vq���5�����1�S���%�3�C&��L�x�L��93�f ��=7�)-K��-����{���k��c������W�����l8��f
]�O������<m�x����,YL�G��bwr�j%�{�#��� ?�����f>�����S�OF���e�����s�NKF�`v��_d�G��H|w��!�z�C�$A����
��k��KQy�?�#��Y6B=S��i���/���4�a��v����y{��[�M������<��n9=�w�M8=���h������(;>�Bd�b�Y����J���x��h�]S6�2��{���%"W.�#��r6QP��S��U�,r���"W$�21��P��R�aV�}X����q���.\�?)^����n|$�a���n���v&�
f&��8$�zX��Z��i5���2F�����L"�k	�H�w\��k-)�Y�MO�ofh��pG��G�p	�������������������z'@v�����E�-�}�P8����8��7K�����������Z�{�Ac���Pv�e��z��v�1�G0�s�BYU�����b�J��i�`�V����7J�OXU����,hy��6���{M�w������&_��B�����>D������T
��f�,)Z�y�r+;�dO����Y�5��6$�����S�������
�����88�7^�Kr�^���LGi%�ZP�H,��r���[�����i����G2
�og���ii��t���T�7_/�����T�<5}�:bO�)��Y���m�&�d�Q:�$U���2"V?)�������-l�`�����+���:>b-_�� �v��'��O��o*8����*>'%]!����j�W1Q��rO���y�**��)w�+����������7_��NZ����;v�	�,��.q��������ak�^��Z��KrM�(;��"D�mR7����{W�y3G�8rJ�3��r�(����n3�^���.n����v�64��@�e:��9�u��
q�\�����r*U��:���)R��h%���]
�G/�k���]�so3��U^9��s���3W �����s������!��6��^�C6����F�����^�nu[(��n"��.��Y���J�];���t�}�!���B*���^����~'O�Y��_o�%�J4{�Ni/�������PC�n�v����0�.���
����(k�A�h��xOT }��u�F#w)����r��L��	:*��6���M�i�K�Q��EJ@`HV+,R�����	�F��(��V<��. ����2�����%�� ^�C�!a��pKi@`�b���-G���G�O�)��Q�v(%�
�k�@��5T��q
����/b����gW :�p�s<���Up�����U��E�����6��xl���7���Q����� �P�o��B8B?DXV������n��h���V~X�
����4s���IjJ<��Q�SS�i���$��ogVl�"f-� 9���%~�T��W�
���J��c���l��|T�@��N�M���J�K6{���Zz����U������Z�=���-�+M�������O�a������x��@���d-�3M�M2#��S�,��ES�4��H!����w�$.�L�:��}���?���er�q�\B����,Z��_�eUcM(N`��_[_�r!�;Y�����^om2���e����W�������D�������d&��p����q���.(�EP$��9��{�3~����~��^�p�cw�.!����B1XD~]O�=7�5Z�L1�����`���v��D,mh%;�E������?v1O�b�?v�����Q�G��;�Y��1l��N�Hv3�/u�:Au��B$�G����������M7L��n�%dU8�H������a%myp�V�A�A��s�������5����/z
�A0_`�[?D�7f�q��[�E����/������9e����q\w�
Q����r���������W���`�����/�b�U��D����v�AV%s9�6�S�xy�>���]��@�D<)����++*��$B����BM����3��8i<0>�����%�W����A�Wt���#b����(h�e�K�t�.�0P� 9z���5��A�T$>u���b���4@�0����)�V`73��h��=T-��a�DFaQN�-�;��N)9o���tb�����J�� �!�����U4P���g�jB��	��� �l�.2A�E�Q�$r@@��u��%!8�Hxq��Y�0����zD8K}�C� t �?Q.5���3O��nBN��m�>L�@sp7\����i(TWF�(���Mt�X z�F4&�b�YP���;|��qxj&U�\��a(�f�D�4_��AvUG����ph�G�7��?-����s����V��:����o��Wx��������5���#��u�+.�1L1�s
��p�V��n�;Z[��
��klQ����?8^^�:v�P�F��>�b���j��
��@���� ^�#
��%������J�_��BI!R(u�aD���2(P������'79E����6%"����,oz:���M�[hs�-
��g��]�z(��(-0n�:��EW�-�I<��+� <��W��q��h+�������%x�&���BF��3!�1N��H����L����4����1K��D�*G�:�O��V�=:Xf�`0K�S�B�=���r���L��]��$.���{�R�T�����TJC��5'Q�(���HB��v�K��k�a�����+��$=q\��.�g"�l���t����\���{L�-����6�a�I��W%3�Z��N��[E���*��TU� �����A�$��������#������Q����gIS�Y�S��{�������xB�`��Vq�o��.�K�YV�i�[����W�joV�Ebd7�������$^��t����F4GpT,Y=���]�<`������k�����\�(IG�=��I?IK{�Y/Z;T�NK~�gQ�t�B`M��9��(	�xYe~��/�5)6��9�J��&uV��W�1���qm�r�;����	��5���B�bh0 d��}*�������LQ��/����,���5���_�����`�:I��O��_�V�'���W���EW'�\����'@��~	��>�^`h��E�
�}-���v{�z�u�����o�\�
�+B�p[@_�#q��c.�RsJ�����^0t-���!��g�'���9�6�er�h�b��Y&�����gX�.?z�%L%VL��V�V�#q#K�6�t����^�5������7��y<!
������S�X����D���W�#o����f���Yw��e�Q���;T���tvFy���
6n��:����P��y�\�l�"����rOx��P�t�=���#�t��lLy�.�p�7���5!}K:�������
���B��[�=����L�������j�j�����{���l0�@�	�1����Byre�u����G2$�_��x��{��i�������)A�?f���e�t�; OeV��5 ��s�'H�� p["��^%��p�����73O�n�8�h����GK{���"l��y5a��8>9w>�+~��e��J����R�������D�����%���[�4`�F6<70)w�����B��$�1�������k�r�$��u�K���^�,>��RI8g�]U��m�����(���������&CO
�������w�r0��Md},l/H���@����\�	vu�~E���7�jGv
������;7����b�|�eh��{���=�/���Js�I���/��(��U4��Z�-p'��*��'M07V<�v��7(�|������4��&�P(��V���W��=���e��c�HCg����<a5��Ov���yJ������I���;��!��{�P:SL����r!n�[Kw��g�����j�b�5�*=J�������PP����7��d�\56�B)VG�%6"�"�!u��������`��!gh��:Hh����(�Y��d^������������/EQ�����]f�[F��:/�p��,�
�>�m�fh�7��>(���,�"�Lgh�����yR\5l�"6��A1R��
c����khU���v���e!�L����YZ?%��6bL��"-&&'���8����.����� \N��Ex{�@��2�[�ao��,���(�=(��qG�2�\�
%���;8j�����C�S�Z���7k�����h��1Ih}x�1EwQ�M���l^�.?;Lj�������\ {�T,5��WB&�*���I���[_�
���Rf�Q��0,; ���1
{>����I	/D�}�(�{�Y-�b�w��M���q�*��22^�z3�Y�	�VX$1n���%�3S�o|�3o�Q�����^��O�_y��S�4�d�H1���=�
��=W��eT".��:�sL��������*_�&�`��)�5��3�R���su��*���^��Z���b�S�JE��,��5��N������n������;�_�T�,��8��q��	��8����1�>��AU8�"2�6���!��idm�f��$�~�P�����g�y�����*J�Q���)�!Jx�� ����]���!��F9�o�p.�s����`51�M^?��\��}�\��{��l2��d4��ww�� J%j����F�.t�=������.?���Tk������T_a��}N���8�|�������A1e2����wn2�hb���P0KF��
��>����Y���%�� ��,�
������Q|�!��6�I��|����u������+�f�GLQ:��q��r:���1ry#�f�y=Bw�7��N�7�����kN��i4������h�N#n����VH�pb:����� �S�9a�x2#���i���������.�7ph��f^ ��']��23��<����:M�z�t�U���|��)�l����(�����%w�4_�����y�x�����������o��N�O��'����S�qsr|��������n��/�v������.����6��`
x�������
��9�3�{uyvm�������V<C�.��;7'���s����g$���wA)w1��������l2^��������?�����km���s�����1u��zC
]�B]�vv����~���A@#��
��������_��Ja7�����y}��z�} }�u��e��;R������X�w�N���w�-�qs{���<y������~�tr�a�=�������3@�;�8=��w�=�����9�]���?��4aY�N�����*8{����������<�o�o��=���`��p����k�&(���L�	m�td�}���9����i�G��s?��t�?��������������sA>��|�e���Gn:7P����x��-f�>������kj��
j��������K����?�����oP��&��z8����o���u�L����7.�����n�g�vn�t.�G�L��S�?��q���h�l�7g?^^������n���a�sp9���x��p��	:�N4"��x|CF
@#_@C)��YuH��;���G��~�����iD�g�V�28���#�Z��*��/���E�L�Qx����X2d��]�#�X�ss�~r[��#����Rb�a�S�a�����k-����J\�����������[����M��W��=�?^����Q�h����p����<������	a�d��� '�x^���%��R����A��W�� Sn�9&�Q�-�dP����J?~Y16f�����X�lL��5�L�����'�R�:�|���F�4����3�r����
��?�^��m�����| ������[�
��o���>�_9����)��h�����H�V��2��c��O���
����R�K7���sK�n�o
����]e���FM\Zre������2q��<�7x�5#S�:f����)�Cek�,�'Z�M����^|�p���eo�e�T���9������f���RE��h1�`�qp��!�)���!z|Hf���5���?@�6;B�P�2
[Dn�����	���=���v���{*f�VF�oHv�_�i�s���,5��Uv\�L��B*�[u
�Z�t��;��������j���D�n�-�:5F��%����,��Mu�N�j�JA:�������$�����|A�K�XP������H����f32�cjxDH�l��K�-����C~s��^-y6�����
r�����2����|�(�T���&��^�W.3��nR:��H��G�����S�����y�nQ�?���&b�|iY9j7��^��oD��L��VV�&S�����r3��x�-��o��h5��o�Do_�D�����p�o�����iw��x��m		��%��w]Tqe���-}1����>L�t��|�99z!?���8�AI_�-���G�cJ!h�1��tN�w���p����[u��������}r�c��[�Lo�r~tT�����
�|��)�����1}_$��X>�(���y#��*bV�
*�I�	�R?(
�������/�sM��>F]���,_b��1�vP{��g]$�����2y��[�>-��7����?i��5r0em�8���,�z$#}?�0I&
t��g���A���;��5f|�Lr;�Lp
����������3O�
{�n�w��;R�_~��rH��0�t�'��	H���F�V�d�0ILo(^��HN^8F�G��K��z��s����A��m`��%��g�d��U�}D���!��QK}���R�C<�����i�+����G�^�=Y)o��1v�/�G����o���6�	y��M�!�E��hb��8P,��u����A��gr�2�������F���RM����)��kM|YbB���F�#��g����.����������6�z�$����!-8������t~�|���^E+���d���&Zh���F��;v)WzPNL&�jsJp���� t ����\�?��cR��e�$Q��Nih5���-�:����cj�g�N�����04���:F(�0�l7n�q�kj�UkL����!��,��!��S��5�X��Q�d��6�d�F�g'���l���2g1a�5�tM$� 	f��=�t8�|_�����9��y��6l�1W#;�sy7U,��I�^��[���$&�G�4�3�h�I�~���q6����4y�|���;��Q��0�=?���B*Jw����6b�$�?���K�;����,��$��
��Q�@+���l�2!/��+�/�6�N��`Md���C��@gMD���DK��G~�Z3�������J`�S���P�����1��s�g��t�')6����g���s���uNn���]��\w�;yv���7��_U�A�8N�*[f��c�_���2qa� ���q;z����n�������.������9�l]lOa�|#d�m	��0(��dI	c"g>�@��[U5)��{D!���J����E�]D��=��y�-X���`���|KAo�D�tn=K]/����.�'�+�a�&p*7`6�4���j�����3���5F��uP��W��0��}c���%w���H�8����o��v��?��h�
)8Y�Fi��82���E��'�������N�����
���!)KS.�5Hl�`zsL]	��]���8G�
��$��ZfR�
��@�A�[�
��!&g����mp0��8uH��N�(����7��Eo�9a����~b�����?@�c~�/E�F�#�����$�3�
��?9AHJ�S�I�0co:���)5�m����tNWLH��x0
FV���&K:�j%]�<J&Z
c7bD�Vbb$5j�(�Fic"���i5r�Es�&��K�����Lfai�)����XP�<o���;���.�o����H���?}`���?��B��������%�����n�_��8%�h�IA\�#8wz�{��b^���B�=����!w�O�Hq�"dZYL��Y=7H����[�-�E�t~�����B.+]��s��In0�F�:U����P`�w���Y��� ����l����1C���)��i��8O�C�'6%�����B�r��H���RL��!���7����wY�x�@�Z��������c�����
� ���$�0j#�QV9\$����W�Wrs���"��}���CW�a�K�L�%����'�
i�WO�x�*"WF��e�3���~���Y��e_99O<*xQ��]����:p�4�-H�i�����"���W�)���^�LB(r�`�@(6�������&������0�������/��D7�����*�Z����v2��_�L��������c+��R�	��G��.��R��� �����$fK
�C��X!2�P��
z�aOSti�T�~�l���u�1���D������s�@��s��L$V��t�\�s�q��o�#����_��	Q��
q����+�<K�
����w���~�g���V0��$�^9���B��	����D
������LI��S�����sq�_0kq��g���1,�u_�"�dT����U��/�a��|
��#T�d'{�Ev��wQ�Pu�� ���nu�TD*�	l�"�.T���EkpCUM=�Z����l�D��(
gM�Q&~�����p���������{09�'��-����ml���~`cb�%���{9g�R���
��'lMX`y�~�c�3��^,��(��6��!z�#�s��;6��`\��A�Pn�����	W�Z�R��c������ 4b<Y8��2S����$�M+�e��wDW.����=�$����.�UN����hNL/hI����o�s�+��q$����t��
X8vW,1#D�F:�sF��7�8z4b�Lw0nK�x+z���M�gr�g������z��EI@�'�����������v���,&hj0����a���D�I�3�eyEf7��%��$hl���Q=��3��Ph�{��6."y�h�W7}����7b�,	�&�6U�"�����u��iML�Rf*�T�wL"_��HPF�����0NG�9n����Mw��8��L�*N������ea�EF�l�JW�DE1D8z��v��_y� 6Y���Z���.n�4^4���]-�\b�#xd�(�)����9��R�����mv��N����^�������];�iT:��������S<u>�B����@���v6
�I}��������gH�<�l����4��]��|�Y��������+�ew��Y��:�r��2������:rN���}���9I�CB��+�4�����v�	�����s���j~�H����.$F������rg5.��j�a�����~/�����QMJ����>�_������C`�;=�/������(�Y�|J�?�;�L[[���8>�+_VL�?F{���xp��>�/iCy(-������j~�[�5c�57���5��+�=�6$���G�^d�x�J������V?f�����}������.0���q�!�-�{>�&b�3����6�8"�3�yPk~����J|�(���1� �
i��D(���8_������V�P���M�*^��fA�tV'�����g;�]��v���o�z?��b�ljj[$���?�TR��y-#�����Wu�>x��r~ft�.�Yx�p*�9��%���
%�@4��gi���|�`��v��HwK����n������g@$\JN/������:��ir�{�(,AXt���t�;J���S����5�����!c�6~J�����.~!i5�"+�.�0E�A�b#0*4o�����T`��.�vJI����f>�W����	��\���;���Z�w����)~)������w8���Z�Ao� WaIu{H�`��V���H]��!���(������Q������H�$�R�ODr��8���N����)��-gH��f��N,�t��-MPz�.SOCd�s�&x3%��}�)?��Bg&��{�"u M@���)������d�]���+MFVT�|D�:�r����=0}j��<~u�IC�	=N�5;�che�H�~`D��t�d���X���2%d<:�s�t���j���\v�c��b6c�K;o&�5�j�_MUs�6�r�8��Sb`�M����^p�"�R�5W�LoN\��:.?�����'�m����t�I���+�p&��4B\��_M��Q�.��hW�,;��	T�kC��E���\Z����%{�`��!��|g��,��xE:J�O9���"���$�����rt3�,&#�83.�y~O~M��F������@^�|!��3����?��5���D�1]3��x4�K6�f.�}kP`lZ������qb��s��yb�b�����,�,��}����<��	�����m��x�������Zp$Oxu��H��h��m���N�x4pu|��5j��ll�B�U
`��BFK���34��2^�n:��}rH�<7����v�uf'����PL�(QKS�=K3���k�����[v�F4�$
^�8k��4��;Ig��+�
��v�����~X"*�
�S9�fi�0w�#�4308v����Nb?^���CMa�#a�!|4�"qcqPG8�-����6|7�I~�a<���X��; �E#{���az�:9Y�/st�C"
�Y4����Fv��
9��^����I��3�������!�D��P���T"ka��1���7�!F����>"��>(�9�A&�$�2v����B@��0��4�3`j���Dz�tnD�G�s�Z�}����qN��"�b��2,q�o���*Psfp�U�j'.���:��%����^bk6�������\����=�C�7���d�
���B<�e��{�cj	��<�FC�;����V#8�~)8������DK��l������'���<������;�qV����>�
��a�.O��usr�����9��H��]�dP�]i#0���8Y��b�M����]����o%��s���:1���e��G�(������/�|
�!!��m&|@!6N)T	�����D���2"�ZIWR`�_���?u���]��d���D��]4��?x��H���f..�W��'��i�����@���qF�r������"<��A����JdrC�����#�6��)�N���$���L�����\_du�;�l"'w���`.�d W�,n����'�O�����#� �9�s������|2aA6��qW�h���S>�[�a:��j��h����[��O��f�z����J���U�v��66�;g����/�!M�3�<b�������aTVD���V���"��+���sL
z��X�)\
���$�2�s��� &�*:���-mb7nK;��/)��8|-`�	���UBq���BUn��������,���8����C��	e]�'�P��p\�WmV�&�p�zo��"��m������j�$���'~wy�!'d�Z��
��4h�N��7�������a���=�KNN������b���)�|H�lD�[�����u�M+��K��V�U:���+;H%R�>vksv�,�>���(K��@�%��V���/J`���\�lS��z3�Niw�\i����R`&����<����`��Y�d~�xR�0����j�����VS�7���A�^o[����J���_��4%8e\hjC����^�w3YVw�O`���-5Xn��g�����F�����^�����P�E,���E�+���w�7���������>�BuQ�r~�=E�J��e��]�\��:�`�vG9�]	��<�F�<L��L����a![���"S���mw�P����������ln?8���,�?�Q�����3"��p������=�b��v��[�����]4qip��9�������s��������������A����RWg��w7P�����(y7�1������_���P����S����q))�9�����9d��=�(fp!xQ�O�h�)�M'�{p�fG'/�:�]�5�����0�����7��U�2��^Sx[.���
^�0��p<;2b��y1�QH`�
fb�X��`+����w�j�A8�|m�����+I����'�f�Ph��O�]��I�@P|kG��hvNa�}Vk�<�$)�]$.qyM�1�~�eI
��cB+�`B�#�22�AxX�p�����Qa�(�r������%�����O���fQr��DP������1)��y�pv�<���P
�1*���!��tU�T�N��&��q����]���*%����p�4��Ci�4��g��U�|z��-�Zm����]�nDo���dnr(yT�|v���\	�e%!�_�����;�����;�wi�uPA�y�A>|����7���U�=���F���^;Y��Vc�JU��_=X���Z��q��1�P�Oa�/�w��{?��������������g��J�����d��&�����V�e��[�^�Y�����<���W�A��?'������m�Q�\�Y�n$0 ����36�����2����'�<���5����F���}���+��J�IEI�@N_���|��P����3Y�+��D����/��a
�S��=U������oCV<����x�N-�"t�,��d���4��rb9��v� s���0��qI���X+:	���,9!����e��R���3o5�����T�(\�"e���p�X��+R��c��M��+��J�-+sA+�@�p=�H���
Ji
Ym�-��r(���6)i#
��'�.��a��9z������W^=�S~I*��M��������
���
k��r�V��������zV��%�X8�%d6)E�!H������R���N�T0�"����l��t�H\�1`����c7���(�������l�Y/���X�����n�0{#Y��H�;��{s���\���yA������7�m�+������v�4�
�hU.��|�\8�(�����,M�.���?�d��$S�%-�����<�tC�Z��j���y��]EM�7����W^�0x${�.U��z�D��WkR�;�\�����k(=�P5��j��3��8�fA��[3c�������a3xI�������z��L���<f�Yp�?��2oE�q�w��z}��5�{���l��f#[�2���y��|D��T�D���hV�p8F�F�cB9�����3����8��}�6���e������LX��TD�r�w8����>���Sj@��A�
���I4����c���sk����e�/���e��b�c������_���$���K�f���W&���3�a�~�F��������m���
��G�x����c��0�����:�jT���N�?�k;z+�� Vn��'�
{e��l��1���;��L�@����������UV�)�������F�}tP�m�=)�-;{��.)eh�[RH��.�v�"Lm4�%E�a���BJIX���L�b���QI!��S�FI��L�YRd�>LZ�V���3)�.:�#���e%Hb�Re��[�>�Q4��i�M����X����9j��5��
��X�d�A>D�Q�}�be�-BHf3yE���@�84tPR�����B.
��14�*��CC��"
�J�84�.��������[V��P�,�4T6�Y*�k���&���Rqh����BN��1� b*��*����;� 3T�X�<;
^��vP	X#�����ywu�������]�����W�(jN�y�oB��[�)�}����?�u���|�����{@@���7VR��
98���\W�z;�M�����A�|����]g���<�p����XI���<���jS����������2g����������I�;j�f�������?�9��g��������w�������W��w�7�Y��+"��C�mw�Z����;�n������&�jg�23'���_2s�����3'Ex��a�9���if���>�f�������?|%�����J�y{vs���TD8���O��n���������L���vy����L�����N�����N�����7I��M2S4YA kr��g���.���%�������)J������s�'nP�
��)�?���e���,�M'~����<Y�"M����E����������?�y��W�<k�}��|�J57W;kq��+���D���CU�2M�]^o�o����^�?�-H V��Rm��!}^�r��2�����n��j/tA\������C�f����KA�mX���
9�M�Q��3��������������Z��f��l]�����p���r�4��|��i�����|�^�����������?��U���B�@���
m�T�����4���c�u��|���E.\Vi��h��.����
����1��
�a1���EA	
�n��v���A�`������<�(*���h
��)�l!��1"?I#�#��DR��#�Y����F�3�R��.F��0��g��Y���������V0����dn� �
Y�nQk{�^���W�t����I@OhuBp����(��g�,�8�$3}����\���^�.����?�w��V�NdFdz��0��,s���_92*������2��6a[��>^�X����t#a:��(�~�m��{�D��A��l�����p��!�B~��0.��>��G�G��#�4y���9�w�c�����G0R�"B���w+"6�(&;�*���	�M��N��q*$��}����s�G8KPZc��[��x��u���Wj#4c�L�kN��b�V�)�=���Yx5*��!���9%��V��{L��s1�
u�NP��yc�_����_�*�A4���>`�#t��@��������q��H]��0�E����b�g)}|�8������Uc��I�?I4s�.�$Ly�h�������h�]�{��h�`���y��wGH��#��s��L�mWH�]j�����&��[�O~0���C�v}�G.s�����&�SG u�[��n���j�@V�v���� �By�9���o�pS�>{��m5�%��������j�P�U0�'�N�uSlA����K69�1�*&��%iJ���E�8ie���� 4���O�m0'�:E
�%�S�sPm�u���:�����'�E>YR�W3����/:��^�0�����	�l;���bww��{"����%�M�m�����.8���@�Q2rd,�|�e�m�W�����f7��p?����`J� $2�e����$@�R��k��1�!�z���������|��A\<3�����*�%��;�2����%�(]��1�g{��Y�����"^d��G�/�H�&�F�(�N8���:*Y
N�;�a(H����\O@^<�����.Fpn��;a-x������z��p�yb��k���*"f�P+������~Kbev�8�t���^��*�(�`����>�@`�J��K��AI�0j�x�m�D�`<IH	�	�g�7��
��NA��(�����Y��������@���9sN+����=�����Uf��H��=crT���Fg��wA�)bZ"J����$J��X�����F��&�.8����T���� `;6t8��?��~�{?bx�,��
fw�,_�n`V\��"�W�^��I�����9c��hV���b�2�WON��M��sr���������&&���"���-�-�RZ�������g������yrR9�F��������rxb��e��}/g8���������~�D)�o��w�Mp�x���6�����B9�_<�h-���\���Z���
����b���yS�<��������(Y����*������'��)#=\�E��V�p��n\z,>��Ts���"X�]������Q���fy?�����������+����^wn�__�]�e��l����,����oN0������"qr
��@��
STDu �A������� l�v��La#�mSX�|OIx�=��_�������
���I2Q ��CQ4p}��Gs8	��"�z����X�����(�B��4 �7}���������P2S5\�m������EEs�j�r_��R4�`>2���S��.my�&�ZUA������R`��2o���������f����S�~���%��H���a|�����O?\^�""�x��j���;���/�;pC��s��@����GS��s�V=E�=R�����������j��OW�	�^����0��3I�K�����k�L\���l}����o�~O�&��E���{������7���g�����^���o������6�����w���,�=hT��u�j��1� �s\��SX������7�o��z�Y��<�^�h�������;k��I����������������]��������z��g0`���u�e��E�A�^o����%f��VJ�H�i*)*x���G��Mz�Sr�Z�vF�\����7�L2Su�����]�����dI��3���=k>Y�/�eO�'��q�7���;����^�'�pl���ed�����;Jl��G.�{\b1�����T�%�U����z��k�%���6VP����mN�!���ag�X���0eI
D����+���D)���o�5dS|��9Z��A�]�S�Pc`,���������7�u�eB�"Q(���b���bni�7j�8:�!���w�K.~n��R�o�c�f��?��	G��_�28��\:I�c,�8��o�w$�j�������������M�5�l�����������h�w:?���?���8Z���������J.;|o�O�i�h�������^���o������V����k���F���m��������o�(�A�?�w���z�O��f�5��a���?����V���j��Z�%D{��`6v�
8	n�i�<����������P��������/�����h�|X�A��fva�2��_���!5�j4�{��q��u�4���EoD/��:�=�.h����@I�S�1��667M��,b�F
��r�x-�N���2^�D7���M$�(
��A!�M��mD^J��8���nj��8�w p����c�EG�H� ���X�M�D���|dUm{�z�H�CzA���S�d��O�����w"�K�����tJo:�&i�y��)r�!F(�*�Sv�>�>�KAw�8����'ph�3��|�
�D�&�WVlG�dS�� ����k���X�Ea..'R����7�c�����?=��1����n��"���h}�F�tV(�W��?$�A8#�*������L�V����a�'����&�PD�!�����A�gY�b��������G<�.�X�3�@��a!F���F�z2� ^!����s6��eL��k��A�\���oJ���\�������	���+�P6�j��+�
�M�KD�n�j�2J��)�i �B��M&�F�6!�jf���)_��v8�3�6�b�E������*��1}���
Bt��!�l��ca�h�!�bh9:����x&�&Kc�Y�������=�DD��i��9!+MK0���*g��
����?=l�Et��������:e.��]��g����]D���,1����R�$=�o���s~��:r�A�����2|�������hp�[�m�<�"|�"+��5C
�N- �v�Fl���h�o�pG������3�P����1y��a��Z�1�^(k;�E�2L@�_��F��0�-}��(g����>��@������g�����pGD+�u4�zG�c#�|H-�����.�;���E�
Y17�=9�L��w��^t����=����� �������|b�2�d<'�4��w�	�h�,'�%�F�V�y0������`�[�{F������Q0��J�kH�e����6+}��0L�?@D��a��8?>��C���
�X��,r����w��M���
����:��ji�����]��&�����)���?D�i�#��A;����t���2��A����
�X�_I{������w���[`�a?�>�|��[a����D�yK���n��u��7K��[0E�$�y�V�Y�����^T!w�p\,�,������q�W�����s�\���
�� �_`�7���b�d>\��\8g���ny=�4|����	e�,�s�:T���~w:��M����^��]o)m5t��O�1������Q�����]�G���;�M_��T6�{j
u>�;:����14�2��Om�uSO�E9b��HM?�E��cq���
����\�*:W����@�#I�D�Z��>�}IZX�-�j2GW*ny|B��|{)���=`
�@?�
#/I���ny�bi�/�A��'�������d�8x�|T���x��r���[UB�M��p�=���z�Pa��}Y���E�H�����w�pF��@���>��_''����'A�d���������K���H������\�#����_ ?=M&�	���S����J�h��+��Y��~���(��!���c�������%So����j��1~���{��O^����Z�����	2�V��K���'���'SE�l�K����A��T��L���L/ [i`K����
qO�tW����Q�fU�
��F���9,@,��IAd��!�T�5V��mc`�B��YC�~��+(s���6�DO��GI���
��Y8 �x�9���r�M[=����w�;D�
�5]���%5�P�_#�?^z*�.mC������_Y���J!Z�$���(ghPEb��5&�&�����c8�$p����[5*��W��V�E���������
��{3���SUt�c��(e�|�H�&h������� v�� �^��5%V�LmV������i�wt�U��>@�����w�RbQ.8"#
���y?B�k�KOz
�IKKS;��/C^%������6�%9t����r��~wY�n��
$_�{F(�'���|���������d�S�0���y����j�]=-���JE����^|���@`r�i5���,iC2��#�I>{_���W��H�{����v=
/(�w�����RK(���h����	��:K�+F�t�%D
T%��F4J�$�x���@)��H��U3��z�U55��aC�E_5�9�;����l�Yxvq���~|�L��g�p
�1�4$�����pv|m��i�M��l9<�v(> �������CWz�`�O���$�d)cu�#��4���4F�C/����D�g��8�������oh:��x3��\����� /���O!�1Zx�m��R�i�&�=���7�-|�#�����P�S�IT\��O����y��������+(��0<<h����ac���h��Q��%��|a��"w�}��!q���M�E�/*}=�����
/�#���l�?*��7��*[��.d��������n��L��V��R�6�f��OyL���`�#�4��`�l�����n�j�*��^�
��q43��DJ���+��K���%h�P��
o���e-=�|9�%���]���Ia9��*
X��K�����!M��@z���,�j���y���h�I�����.�va�p�5s.����q�I\Ldi��l���4F����3�g���]��%(�ch���a��n<eA�����o�-������o��w���u�h1��8�F�V��Q
d�cc�����!�Yy�����l�t_S���=��W�L�V8�����9�hr"���Z4�H���������>�u���J��nLr8A]g�)���
�J������21�E�a@-j�2Y��o�`��J�u�)s��%|�����0#�M�0Hw��)�?��&���Hz�����J*Y�u�7�>��H�Sqx4fo6�3	�^z����,�j��E�h��9���k��5�&X���	��x#!|�:#��;;�:IBm�r��lb�2rM/�#;R�J�;���T$f��D���*��j;�0����%�d�k������.�&�X\�Z��g���+w���fO�FD6����K7K	z|�������T"������E��;���QT��������^�1��&o��1�.�qU����A��%o*U�	%�%Ut�3����nn���w�r�R#�/&��������������}s�9?��Q�����_��I5Q��7�.���q{'g�{;`�B�I��n��d{V�$�K1�x��.�4A��Va��%��k�����5����*�����Y�9<�~��40&�m����q�������%M���]�!~4����"+�GX��t�8W)�
����`���d`���N1����?�-��]�a;k�=q��t�}����|�F��XmZ��l��?j�f��z��|�����g��-�>e��WKZz���Ni�?+����RD��{���v�����w��Wm���=���El���?�E���ed�!>\�t���uP)�_Uj����Z���i
���������_4�*���Q�N\���J��P}��no�t������mHJ�~�s�a�;�4�����|^��;u�a��mk����Dys�V����Gt{	�������?,��@i�����Q>�Os��b	e���mA|9r�����vFk;��7�'8�S8����0���(�G����9%�G���o?aGW*+��t\���h{��fC��\�J�5�
�<>���t0/�C2�b@�n��\4�������jj7�D����t.��?�R��aS�Re��7��7��`?@����������g�S�*�Y�~�4w�Y�w�.�8w���hV�g5wzW�7�G����f5��WW�9^���en�K�����������#n�D��}:�Z� 2|ev.1b��'�9�����?�4k.��X|s~|�W����y�N?NA��Kp���0�_2�W�������JF+x����u�'0���������u��6��wV�#��"���[������=��wx�o
P�K(�D8ETaA[z��"���f�Fr�$��Y�}[�w�+7^��
�yW���2��Z����g�r�F���*_�o�)����������=��vS7i��
���.U��q���������[�!�h��-QL��H�V��o'����Q��6r+E�`E1+Z>[��6r+�����1��������~��n�F�:�c�z}L]r�5z����B�q�8x������%�i���h��t����&m�N���'��7E�Wz]@���������E�"�Au����u����s��2�������S��K�m��������h�1�C8�0X���b�V-8����-�>��a��vq;��G�v-�/���
����y���kh�`�=�I���S;F�wF�z����Z������	�{�O�#�a�a=TXp@��u�_���c�}=��h��w�Y4B��	GqHA|\���8K�g�
v|�Spzv�P�+�������]���������:@���������^*\_^���s|�]�9���i�sqry�����OW��S���^��?�[WP�{h�|�����
���Qu����{|�9y�?�7�����6�~h����o;70�v}q|��\�����'���9~wv�S����o���(�����ys~yL?/��/������M�<�e�3��U
��H:��	���.z���j������#�3��gSy>���xVy���a/����p9?+�/37Q����a1�[�C����O����������Pf6�<�K�/���u�2lX�[�^�v��S���V?u���r�}��	��?O;'���w������k&���:�%k��cx���;�-!�������z�������J���Q�C�Rt19d�5:�0�����2)�*a�y��s��V���+���������^E!�?�4wNW;��X)���<���e~�����ol}^��P���
��|�#�!�Su��x]�/��s'V�|~!������U���O{���E�������N�'����]t�;o:��N:U['�:����%.?��2��MD=(�)���r�f����IJ`%f�?Z�R���
+,��|��$���m��P�{gE��g���TK\F�![��p�r��n����xd��@�����8tz	+�2
B�:��}���2��PW��
�g�1�w��e����7����!g�d���,D=��F�L�Y���T'" $������jS�X�-�����|�Vj����%[��m��Zm����i���	�(J�/(�i���1���iq����8�����PSk7D�p!m5@�*�����<5��Cm���O��No��&���wvV��'��\c>|3
�R�~t<���f!��h�G�B��zJW8�:�����lh�����dl���/2���r��iJ#�k�Qx��<3	���f�*<L�]�>J�����ZIy�}g67�(���FQg�Kg��e�����n��e��,�A��B��Q�E]�>�Ab��0�H��5������dd��_�b#3��Td�sl%��@4,N������*
�*�Z��S%���^��E��G
:Ot~�=G�2m,RN��0��^O���DC+.������M��w� 3�b��~X�i���z��*[z��	�1cf���'�e!�&���[�F�e�{Bw.�E.:�_����3tJb�z�w�:8�]��"���:��M���$?9��d�{��%U�E1���B����O��KX���_L���J�7���#��L�G��������wE�R@:����(D��������g�g�ba�����Y���2]J��z���5{�/�������4jY�KyM�p�����I�<�D��3hre�?�X���]��X����c7����"G��~:�3����y���G��A9`U����{������\{��pI6�|����2�=X�����#�8�du������G���;]P��u]�U���Be,J���Z���2�G����7���b��R�8�X��w7��_b���
2��&�;5pc�n����H�2D��>a�*D-y�E��J��;b
Jw��a�8��Bx��'��p{��|AK����\�M����^^<h$
!��
(N��)�7a1&��1�
�-jVo�@u��)	E�x���J\	J*a^�,����QI%���K���2�������
�F�_3�%`	b��gO��
Q~!##9��p�ts�GM�j���T���U�4n��C;7��#��5�v��do;��dR#����/��I/������_`~��L��=���'��N1{���H9C(�X�}����n�&v���d�o��F��&����/K��u�}�J���xF��j=�H�U���S-�^���������f�h�{��z��^8(�J��UZ��G{��������2�����"��?�.����;���S|����LI��k�\��QHzHv�lhw[.hO��-����r�4���RJR���N� ��g�zr���?Z-`P{~�����A�������������vs��>::l�Z������ j6�G������/�����=�w��c�e����W��c���lY����b��E2����y<�f@�J=cn�����D �|���im3���X�Dh���''��X���0t�gQ�F71��p�Lxa_�����3bD�r�l�.vI� �|��LD����]���'�$���	aO�pg�����(&g�@X;��@�{c2`*`��~����Y��Ys:�BT�����~������c=P*M(�Z��B�:�P�!��&�?]�(�H:!Y�c�$5��4����?��7�����]!������PY�r.NHw8xx	����-*2C/��3��<�d�O�|a��~��(;�r���������riv)�i�����+����L�5�-)T2�F�����[7��v���,�4bsg?�W��l�����ex������>�z�V�?e{���7�M3'�6;�]m���/�d{�����4��(��R�h%h/����l=C@�`���E���g�������>����|i�
���r�R�pE��`�����`Ym��E���v��U�'��^8Y����[����3\V����W-c�Q4*�����ru�^�_^si]`�Y���+��~+XE���-��M�W4x���^P���n1���PzQ+*J/�8r�������,�g���+P\7*7n�2Z��D�esF;��k�������Q6A���  ��?BEr�-:q�8j?�)��R���`cOij�Q�y
y��i����Z��u���Z(amey/�W{O��6��5�A��������^��d&��z����j�?3�$+�\��.n/���Y�7kA�U
�?>���4��f��*@p�����E����������zS�gb�5ov�Prk38����C�������U}
��86rVH��x����xe��q�����^�^z����f�[��/7���o��������������@��`��r���(�(�(�(������z3�]��F�������N�2�[^��b�&�s�qs�ra7vt��-v�����g������RN�e��t�����e{c�["�'ni`:Q&����z.'?�{��-Yx,�Ee17:��?���������56bakK�`ay
��<�mM�,:����tna��D�`���$b���������������#���������X���6�c���T���OQ%rqs{
7�[�"���:'*��o�;�l���
�����6s��s���i|4�������6�����"Je�1�=�_������I��b}|���|�g�5�7k-�b����)������V�J��@��zh�N^�����l�D� ���R4�2>���Q(��'�]�Z�L�?+$�����l7��!�L���������J�}������� �~	�w����o�/�Q��<�������x���������u�$��dIB��������i-Y�O�%�~�i�����O��~����O�Q�Bj����e|Z[L	���m>��p`(���$��=C��������h���U=K�hN"�kc����ux����K�L�f���y�u���_^��l��;�7�p����P����#��>����x�v�	U���$����B��i�����l�BZ�%co:co���w��������]������n�M�o�Z6%�z|Ff_��T��'#��C�>N�h �Q��"	�i��*��7�qQ8��.��p�����_��_�wOX�n��g@���>{;�Um;���Ma��?��`������B<3<y�S�����)����	G]��[��Y��2;�;j����2��:�����-����\(/��|���%��`)������MTa�����[������>�G���Z�^kx��B��)x��9���%�de�g���O��������%�q1��������o,�����#�����|9EO?
������v�5������[*e�e9C��`��2~�D��v�6�&���,;+�O��
zd�����g!��A�m~Y�S,{��,��Z����n���J����|��3�4�e�����h%A���*\��V���3�h��k�{F���sB�6����b���_���X`:H��8J�Q�\���7�����q�^4@Q��_�0F[�8pL��N�M�r���.e��<��\�Tl�h2H��r ��h�6�-��%�t,D����g���"T���
C����1��r�@`	�s��H����9�0O��V���?�m���Epvsy~��r�y���y���[!>�%�����_B��v����P�8������PZ_d(���L�l��#�-P;Cn��������\8C5�e2������iI�[��}x)Bv�8��b����aG�S2m�p"T�R��7�q�Yx;o�hv�8�5*��J�� }_�'p+�_e&�w����}��?�6�T?�"6	kI��p�.�o<�G�p'�l����,8���1d2�G�P?xl�]($���6�x���[s�z/�P���$O�>|3"�&��NC 4!>��9��>�BsB��@_6���My������/�1��i�G��"�:������_�w�l�e8�KU�?�3������G��W�}��O�������Z��M�f�S��(;8�#1�>�S�����p����o	G1�2#��E
��9�<�Z`Bm�4w��6�t��ISP�K�4�O=i�O�[p�����I���4��O;i.�����Y�u�Tt���p AH���������8HBX{G��v��N���h��P!y���lN(��z�E���e�1�C��<���=�|�ap�g!\1"����4�W����1��I���+��D����L�f��9�	Z�P~"��e�g�a�>�Ov�^_����ucL�[Z������j0��;N���S��s����*e�Z�l=��8�9]�������lyf�%X3�nt���D�A�S�1p3��M���4��D�����p�x<E�D�6�Y���p3��=&@T&���3[���V����NX$V�]r@M�"����O������E���G�;x(d_AQNBJ�3AB�!�4j��3��f��$Cq�X
ET]5�x�)��-M:��u��)���B8�d6�����Bli.R*�o?r�#���'	�~��d�$�?c�������#�Xy������G�_�P���\����%�lX@�@���2�B�I+���-���0��$�s|��8��8UV��4k���@�8�� �`�il)!_8������A�T=q���N��Q�wL�y%8���b`"1����5�x%�K�b.S��npu}������I���Y#&��	K�y�j��V�j���:��8��>�6�F��sj���an;+�)��oyO��������A7/�Z��oI_�>$�	��'�',�u����f��67�uE���b����bmt��G��&S�?��z���_��W51�2V��s�8��U(m��S��
$i�2�$�T���$s+eju�����c�%��O������,�sw�%�S"�g�\>��������;h~�����k|�v�K��T}����y��,��wU�oh���V7t�`�1�1���M���8L�>&)�
��}$�[|�B�M9{������<�f�]:Jn��p�Z����_�5�zax����5��5�5�}3�����b�TEh����JL-��p#Z�e� �0��E��7(�p()��F��B�.��LJ>������x�6�#�;S��Vu[@��6Y(���"p<�E���;E�Sd����0-Hw���"��_�w�~tu~|�{`����~&[�hv��;���%�*1��0��J*W�xM���p����f�1@'L[�`�����
�$)?V!rd�I�^��WD�l~�����y<���S������v/j��odt/_�����V�45FJy�PL��8:1�M�6�c�����g����_�d��\�K��E���������M}��'�	�-To�\�����-BP�}�FPu�]��-���Zy�K8BY
u�zs��u�5J�
�����p�c��ee���I�o�
��Sg��r���Yw��=z���7u~�2u�(EF�S���SZ�h�c�����������~2u<��p2S�IsP+���e��Es�:�\�R	{������s��k��u������\�?��h������1�#aM�����)\>]�Z�K�������S�@�Y����	�`�1�����C\�9����s�IC[�I��|/���
�����/���Z|s4>:�������N�|��^88�P�����ln�}�������
�z���?���p%y��"����SH��u5`F?g|�� ����A���q2)\���(��{9���W!�	�nvU��'���8�1���f�4����
L!�P4k)M0�����DO�����c�m�a:-��=��[���5�>����~�W�p�����������YW�!��rB|�����6�3������r_�0�����w�8x]B��e���y�|�0��'�b�c_[��"G��<���}11�U���"�}�D �J(k�1�{U�2�U�����<���9��m�Q����W��������`��I�t�����|U�Vz2'�i����F�����H�E��
��Af��!���/����
��s��;_T\��(,2)�����3���Z ��
������f�r�r��Z\%nz��5\-�v�e�n�_@��G�.y���;8�V^�>��#p�Zd����$�"R��s�����+�8"%�(<�~�7���?��|i*��;S���%yj�o�_���M�
�����u��"�U��������Q^}����?��.�CE���bR���'`��3��9>�E�F	'���w�������W�ZQ�����;]�����\,�/��N:]��d�:�bl���(�J���������`A�(��KY4�h5!�-����k1'��uzw/9|�t�����mL���l�>GX>D�f6�G�B�A��E�rFN����%�B�����'������|j�1�`�~�1n�u����9VD��������h��7x1���'��yw':��Hie���<���- �-��'��^1m=�^P���<vf���c�1�
�Eq����7�Y\��fn	���*��D`h���'�\�Z������/|��1�����1	����5�_<xc8J��!>G�x��d���A��!�8\V�0]#n�hxc��*-,��	����N��:J�Ap���ir�Q<�%�/��S�v��	��eg,�=��w4�]�u���v�
��+|^v������|hu�&n���8uiF����~vN�7 z����s��ng��~;{��V=����.L�Z��w��z�������@��&i��FY�������t�N_���v�]�?���Q�vr�lu��A�&���5������~8{&�xKj�`eI�r���=_~����������+\f���3��Q�oo,��Y���hG��.�r��pj*s<��U$a,��h������"���{|�	�LYp����$���b�����G�2A���h8��`����T���)���/D�fNI�6���\�}1�	&!G�O��������	��xd���+�)�w�{.��IU�*��/*�{������^o5����^	����V~g�S����A��?��`����c������c��O�]H����"���p�`������L�X��g
�@�xIc�S��@8�O���#�n�I�87��D�8~������b��C�W�;���TZ�����~�3����[�����E���������[�s,[�)�E*�_r'����B:u{�w�4v|~�-��m������>~4�N�X��������b�m4�3�:��I��On�K��h�L����t@>�/��!���Mfg����R.T���g�iA����a��������7ap������B�$SH�����pj�gl��<����g��,����?8������v��?���X��*�lKR:�f�2;�ON�����>�)�;J�,fY:��L�FI���&��B��B��������W���7���G�4�|�x�� @��=��S��Um4(�7�j�l�!�<�m������^�O�1$c4��pAG��8ze�%�0�R�A�h�X��fi�u���o�-�Yw5G���������/v�~���h���� ��}�x����u�()�2C{���	?�9QV����A;��o���y����
*�QK�,�l[81]G��h�����>!�J��Xatz%��Y����=s�H��VK>�v�#R*�0�]�_�RG��o�lz�2�-�Q\"�*��QA���4-+)��w�����Tg������L�����a��@�t����CC��p��L/\^M�4�5�py�e��k����N��4i|�^vY��,�>+��h��t�������
���L���
��i��?�Z�UPH� +p�E���#�xgA���56�N��_G����D�ku]�,]���+�3��B�5�Gpw��w�G��nk]�ok������p���B��B�}�{*
AQ�s��9���i��c�A5�(LY-���"��\
Q�n6����F���*�#>#���`�.y���J�C!FZw�IL<�
$Wf)A��+��=�`?���
�jF�E����?��_��.�=�A�P���P'�j[�������aa�������N��`��S��%���,?���z��k�������g�|1�����g�Y��:�U���-
�s����Y��;��iD.���0�}��N���=u����/�n���������Es%���-;�����$595: 	Jh��
 �(���s���	�r�*��#��z�}w�],������
��1�`�W��|$�O;��#v���Z�2�//�t���>(|t�	�I�ju���`R��zMmc����Q�d��_�YbM}��r���o/�����;�^:���vyy={h����%��+�#��$�����>I������D�n�-�s���Plz������P������sMZX7\�a��/��yF����t��������7g�q�����wG/�����e��"���Z����C����q�_�=
���}��CG�����??{�~{�����wX���u'�"������%)]�����|	Z,?�����&�����\v0;�Z�^�=���96'<+����&d�
8�\
���`�
��e ��I�����V�����Z8�l���4A����\�������h�����OI�hr�0��Q�y{~��8��V<V�C
�Y�Y4y��"e4Y������)������|��m�����.h_#c��_N�pQn'Js:N�~
���X�����G�^����A�= �<��$I����THu���S��Y�s�R�W��\[.f��������0�
�b`O���e��{L�=�/�`�\���{�
ww�%2;����#�������!-�B���B�}d���V�K���y����/���N��v��N��v��	MQ���Q��gh��8TN�8�O���D3��|~���U�!N��d��������br����LA��d��81<f���l�95�����A��\�����������^�E�����A����"h<�,�-XB���<!K�;�
r������(���f�j}e4��o�z.o�����2oP��%w���i��!���@��6��}m��t�_����A�#�#�hM,����6�K������)/��'�5>���qg��6!�Th�� < ?���t���&��A5`���*�
)��P����t�Gt�L�w���I���v"-���lVe�y�i���>i����jla��6s��[���d��O����N���y	7R���n����d��:���'S*�G�m��~��9��{�hs�X���3.{�|�����������K�*�����o|O�Vi������+�^���xI5�>�������p�|@/���_,_��^�`�?m!M��)V�11,9T\���?���#(�
Lp����s��w'�����Hr�|@/��$�_,_��z�>�2��Gr�2�brZb��z�]d�GP�
��y�fh���q��^�D������)r���=0������3�� {lH@��z�W�FO�'
8
=3t�)�fz��)�wm�>��_��L���K���|����\P��VgF����8h���~�5�
���O���m���w���!����>�0������1�`���N��6���������������&�����)}�s�cLAM����t�#ty� Py�L�U+�O=���7�Q���o/{�����|����[�t��h�rZ�4X��[b�w�6��N��w��>{����7��@VZ�=��y����;���^��	�.| �v�#��w&Q7<�S��t����N}T��G6n�?l��]��u�v������)c^.������.8�5�-�^:]s�`hj���\�o�v^��?wM���*x���?��&>v��4�x��-�=D��\����N��d��:���������0Td������W��U���B��U�Uj��%�)9��v\��q3���c|{���4��*��eL����l��O�,����9���4�Ic��n�m�6]|rD��Q��d���[��<��I��x�G���2��a��:C�
��2�qBtS@sA])z�|=��;�ptw��$D��g}������e�y�\���>��W��;��g��������Z��_k�o��k�v[/���Kc;�`E��~[�}H�D�G�aw�j�������L`��&�I8h�S�>(�������>������1|$�=R�(�����o�~_���o���~� �7���+9f�����>��8�$���
����}��g�8X���q�i�K�������f�
�?U�1b�C���_����X��f�d�?��4��Q'o^"0\���/�����-6�l���n[�����=i�$�}��~�&����g���������]�������=����K@e�����hO�3@������K��L~���![;���q��6��e��u�|p�?�z�����W��������+���x�up����;����7�����N�{�h
���S��m��<��PI�"��\
�H���c�X�)�@5L������OS>=2��]��
C:^����n0���?��_�9�C���FqJ��Hx���N����	��)�G���C�u<w	���w�����2�w��~�r��?e�������D�[���4�����J=�U����^�����=�3�o���@������������c#�W��=���" �"��
��0�\J�	�v��Zp~���3+�����z
���VB��^-ZSX���U:�����g���?�L�[�NgvAB��.��V�5�>�a��c
���]!�/����
�I�3������5��d�O����{z�?H%����=v��)s�)5�(����No�
=�0�;w��c��Y�����7$�f�X:�_�'������ ��Eh�Po���w�e����T�����a9��t����Z��Nt�-7�����P��~���|3���
���)������������)������c���^�%��M��l*�EW����_w��0��.��dE��E��{��O:Z���!���W$s���h��I(���`��B�T�%���A�ZU�{���&��%� �BF8�T��7��5h<b0:�d��PH��r������U�v__�f��>��-��C�n]�'�t@����0��f�z���1��@��`�}#[{H��a�;E����?��oa����0������8�_xU2����N�d�\�"�B[���J2�Y/�p/o��:���C8CJ{]I��$��Pi�am��.=q��W�_K�q`���\tr_���Q���]C�1��g�G�����V��������7R�_��H�M8mw�tWt����G��������[�NP�����
p��yb���z�?���A'��tiN�1B�t�K:�Eo7��.���7=~�#7�M�?&C+s���kJ7�fkv�����Y������2�0���#��>N222O^�xp*/�V��?�2�$�`,���W�S�VT�6\.�x����-�tOpb8��g�3?���"z=�?����<CL$6b���3�X@��#l�
G��R�	�j�����e��w1�O����Yb�?�T���,����3?�*���%��?�q��P
z
O>��L�Q�y���O�P�/�\%�zu�J+f�,AN�����ZV�>���*g��%I?�V`�81�O%�O;^K��p���<�C��]��w�+U;F����>�V����p[���l�����E�7e���x�5��vyO��vw����v�9JKW����M�����na�/��?�M}�����z�o7v�}�v�R��wX���V��j��\��j��T��B��?X��/�'�@�'���@����jA~��m4��6�����������R���
Y�.���2�=�j�~��~�X���X�yj�;����;�?%>��=���m�F���p?����7}�I��;$dp��Y�n/8��� ��Kv�����������5�����m��J%�V��Zd�W�x��q�B����������u��~��������1~��}i|�������+�}���U���,�W����b�u�������]A�t�T��*b����Tx�������T0�ww}7_N��)C��(���Y�,����mg����V�=�5����a�m���v8�T�T�f6�|�A��p�u��m�:`X�O
,�}\?�d��[���/��~��`�����Y��(U�#i�7m8��3���q��jE���~w�Z+���i�*(E�����JQ�g�U�Z��t�R�w�5zAl��_��_��S��������(��O�tY��\�cJ=	z���e���Th�W��k��~[��{T��s�m�w~�E|~�e|���R��R��K)��R>�B1�����Ny��U����{��R��}D)����|�wp?4�����4�����y4�
o���������{�j�&��pkyIc�����A����TO����c,$L��a�+&���up��&���5� �+0�g�����"d_�����e��w���H��V��R���N�`�j����h?�J�Q%
�a����uU���?�F�v�h�B��Y�Bvq�������=�d�w~7U[3����q��XgRU������B�n0�?�����@��
�������cA������@���`<����A�	����������"0��5pH�D���[�X*�f� F���h��j�W�F���1P��@��'��������G��4��"�ah��i�:�����~@1��H��$�P����i���������������k]c|@�>���}����o�����S���v{��Aw�O�n���)h����*[�i���r�s������@��h����s0���(QT{z�?�G�I'�u��5����:��v��_����a3��o#�z������2\O�/��U�&�W-8�Ok��(�u��08Z]���~�<��?�t��������F������o���}��-P
<%��'��<9�r���!��k���e��0X���h�A��ld�<|	����Y��h6�����q�{�p�2�����r��i�Bo��G�1�����Krb�$�p2�YRQb��(#
���*<~�: �)�]A�#,��������8\H�t�l8B�g�l�����P���E)`J6��#�4�o�J�j��	3#�:��#4�S[���
b��^�[�����F��}��<�����C^l}=l���kB�J��!���D-�Nd����%b(WnC}��A����{�����/���;�&��a��0�Qo������Y�)��\���f]��{H�M8��������~�%I�M��c�8�a>���4�L������d|
+���0,!���j��P��mX��N����Z���������Q�0}g�ms���cT����&h�k���#�!6�>�$}����H����t�Y���n ����9V<;�8����0�>��:Q+�����L�M��7�������i�EE��.��1z���l��C+�=`KA����-.�
p�f�:o�
��0x��U���������<|��<W'"[_��O������Cc�O2���������M�W��QI�����do��[b\����y�p��{��[��%.��[$�EM:Ki��PFt�`h���*6A��uu��&���T�|����eQp!��VS��'��0�������qAq$��/c��V|m�PD:�f��VV��SsE��d�+;���g���D����*�9L&��
]!!;�(jF�h.�Yr)H@0�8��d�����R-N����rF���Xn��n9����AApR&B�,%��8�$������]W����>��E����+�����V�4��p�? �k�@_T�'����LH���M_^1�;��{^W��Y�?�\iq�����P�Q�e��bLWw������7�*[T�!Y���U�u�d���5 ����6�����L��|�,���nB�����y���jb����G&���H9+|�!t�=:�p�a[n��\X�~�K�-���9O��2|FWt'3|*�0[��8�� |��/�.�a�s�.g<%r&�aX����L!Ot�g�� �!�fI����M�+O����2��� �K���[��A_�|i�;�S�@�3��1�QMYx�1�,��.D1Aq�������(L�/;�$�
,��~�dLU��a��4�c��I�4�~Es�t�16_��H���7hm���Mj$���zD��[��]0����Z��v2=q�'��U�����Za�,��u��z�����D5���1�e	���}����9�k����M7K��.}�Psd����8����JQ���3�<u��c��-�`�b��F�VVK�#����f�E��"�NV'�#���P8�����Qyj�����d4�/�s�`��g����f�O~���L�@�����?�G����Sj���I����r��&���[���d�������W*�;��ms��X�o,H��X���������������h���_x��M��}�uq�[�������V������y��x,&����W��J��6.�J@22�Tt�FJbF�^���]����"We#O���>��;���q=^f<d>��J����"D����Lg�%An��En�M���N��&��0���@���6!�I��i�c��@g�T
�g����Hh�I9�qF�L���b��c{���8s���7�������F���2�w)�5�T�xxJ���9�t�������GU�tPY�Y��g��I�A�����|g@l�h��`���;3R:������Y&�?�!7�UP��1��7���l�x��%Y4f�P2�y\Ksm�H*��s�0�.�1Z��W@>��l!�b������
���B��P�~�-�"�Q��
��qmE�L��JA�=����	RnP'�}��y����F�j�����(0��S�9��U&5MX���j�(� ��N�$J��Z���E��2��r�%pjn��R�ivw�����F�%�(�0s������l���-�_U�Q�$9���l�����H2!�2$��yl&1	O:Bq�v���n8! '��9����B�R�t��Z����EXR+
�N2a���u
�b\�Z��r�!�A�"U���[��C���
f��3�����~�	ER��p���nPR���w�kv�p����~����<����I`i��
���B�H��m��Mc�\`�����dN�m��[�����-���m��`@(���D��2`da�pb�
0�b�����Yt���?aN�!��Q<�:e,v�N�,���&w�Q���0+�������c�_<�}+�}G�}7N-���Z-f��/#e���i>w���sq��� 9x�X�2�(����M���3�����(.j\`z�t'�)�%o����W>��f���N���c?�]�4��(�m�p���Ry;��$3�e�#9N��m7���l|1h�"���P"��E_�]b��������&�E:��tO�)�z@'��H��d>�`�:�s��;hE����0�xBg�����b�0����m�����ti���uo���3��k�(�c��A����j��c�Y���l������[����m��76x��7#���obE�+�x�-y -���������G�s4�/��8�08���T�6E������B�� &Q��Wq�R5�N����,���9j��	��+a��x����x�>{wzz����_Ijc��������a2F[e�FB#
�o[�eA�=���Nw���D�$��%]En5�8�x&Sc��5M]�$�%�LR���xq����i���i�&x�f"]���
��q"�gu(�1���
�9�p��(��I����`+������{+���u��q;���6!��7{�;���T�7�����[ta�h!t=7N�n�[�z���Q
�>����_.��=~�7�'#�F�yw]�`����������D|9y�O�����9���������%�
C3�s����TA�@,�T�Y]S�����b��0�k��wQ����q����bK<)����[�L�J�cW���<`44q�G�������Y6��y��gN;�l9L�_���#.Z,�D8^��]�Q� �8��|.c|O?��j�DQ�m,'��+��C���
a��R'�E'#rvzB��I3zC���8�y����L�H����<1f�\�6��K�K�������m�x.����'����ILY�I���M��
C�|����`2R�
hXf���/$�����M�E��x=3�q9W�P�^���t��1B��M���������\�E���pr����5�+��Q��'k�-#�F[����A�=��Z��A/����[66b3\6>F>�># ����O����������d����<`|�����;�����F�������0���U��]��
�l�[$����={���>}�v$��x�Q�)��4�8��;���a���)���=����cr-�M~~��i��(��x{L���G�>����A@/no�[*7}[*����n�DB�B�YM���N��"0
�hi:�@�	`��w[�5��4����)$|U���xc��.]�8.��V���9��|���Vw�nP^m�����O��������+��N�4L	^��N��F����]8^������''��d!���&��2Z��M@���<OW6c@	d�Z;BJ��;^���.pC$H�?Q�,k�����R�J	%�v]cE���@�k@	�Ee�!�Fc�.t9��3��^�����F+�&��v��Rr�<�J7�8h�?�����b�"p����w����r1�<���B��rxB��"u
�|PD�r���(������w/��6���|"�.,s���"n������d�$Gh�"V7�?@I0<l����!	�)^)������"m"$�L��������9�����d��1��_%��6��"�����"��8��}t�K��f�m�eA�@�h�	aw�A	��u���$��_���L��h[����z�k6���BF
oR�����V1�
u\(�"��^�^�����@�k��D��Te�����PW���8�2�#�S��p��]��"D��+@:���2
/���������6�,�x��I��9� kdge�����W�l�����N��f�k��Il��UG>��.Z<^T<l��?����E�m���uJ�C���#����Y�
G�3*��2;B��'��e&��a�M5��l�UJ��?e��|�����"�(A��N��F�vR�X�a���
�����F��+Dt!���n�2��F�(��I,��!�q,v�e�ip����";��*a����o.���K6�fq����GAS3RwA3��AH�8e�$�,h���L�>�	�_"�\�e�`~w?��j��X�A��H8]]/Em�U���c�����LKx&
N50vjL�+?^����kF�-N8;�T�!3�����C���:���PSI&����p|t�}E��#����c�N�K�b�P���rz�2f��l��eW�cG����Hq�[�pj�"��[Y������y-B��x������2��A�,0����B�d%�J����Fn�D����)0�wt��|e���<��`��3�]��8�3�m�Y�����gY�b�9��hr:$Y�NN�2Q�(��l�^�wx�a�(�����)n.�"x��I������bR�n(���Q�qRP��4���d�=�9�
�%n
��r��Dx� krp��FW��z���ZBEJ/x��I��	i�	�O��;�����)GY4R;��DSr��HJW�
:,�I>�����L������X�Ls�`[|V�����,��2�X(��G7t���S%W"l)����ik���L�h�z|#��3u���IX����`�o��GN���>M�n��<[�*��h�FLw�y�bYc9|SY�g�E?uL�EFB�	�,U��������Y����i�����$��}����+T�"q����
�E�%��!���A��7�02����%�J�l�h��e�"}����;��TRIp�?A��R�5���^<V��a����aX�>fp���: ������F��|Mb6s��_"�f��%�3+2u��83An��%���k�<�(��rc�!��f�Q�=��y�D0�P/�@�U��m��e2Nf���+���G����##�_V|P����c;e$��r�k�(�<`�
}v�{��I"�c���h�kjp^!0�I<�f��l�=�h�%^G9����B���/��r��'��A�����Qv�vg\����'�U)%�E�w^�=!e��\9���u����������D����.���z��fX��P;D�a�'����a��cC�|%h�����)�J�#u���&Z����'
b�5��������s������O	I$E���D���"��\H
��ut:	Y���)�)K����{���,>�,�����=hg�9@��b�0j[s3�X�m����m���v����>0������3�2Yp��.Ah�J��
��|�h����8�a'��ZQ{r8�N�]�����'��F���;"(�T9X��2��@?r	�N_�i���j�^D������C������D�%�AIA����V��q%�<���o+Q�	�^���v�hE�6Z5�}�Vi�d�cO�H#T������b`�	�%������	~�=1���xk�p��2D���
�f<�(�P/4U$����:�k'l!3���Q����)M����{]&,<C��	VM���|�����v��O�Q6�9�U��f1'BQ����s:��4'�&b���g��"n��B)����{Qd�0�3A�Uo�?���l�wt�{$��EVW����b�)P������&����DQ:����x\BJ4���,�r��7K"XD�Np��?�(	=t����e#���5A��z�:S-��D,��$_���@��OW3�PS&;@�5�c?�mXT<�d�h3�����]3�A�l�X����;4xR�.�H��7��<1�L�e���hLW�p��PM0�-2����))�"���&�ZC�t��mD1�(Vc34�o��a���������#>����&��"�*��.���@1��`���zC&������8�����D(�(KE�`��G�i��E�g��
e�4JX�c���L^U����3����U8S���iY�&���=5��a1U,���w���5��}�7P�X�N�j�z.V��#���u�I��Q��!�4�=)W�����%�P@�5���jU��ufE������T�����=L���F�m)w$�5�me��md����mB��O��q`-��g{��/���h^��
fy�Y�����VH�:PX{$7����h����@L0�����8n���Ch��w��!C��w_�o�N�����������_����&����}�t&���Ao�;��{�~����L&��������^�q3��SC���m?>j�K�����%��p5��0�6���')T:B��I��xF����5a"��E�	�.��0����3��)d%�t����_��m-f�%�Du��q������2\8&O(�_���R�j5�����d@�Uu�j\���lRV�q(y%q�>�����b��)���4��h��y#[�rn���:�f-��A,�K��=��a�����cF� ���o������V�����x��tPl�/=p?�sm
��G<��C�ddK��Z����"��EzC�V(qQ|� �|R�E�r��6mSA	���#���2�2��hJVY�Ne�h6m��k�?�F�;(h5Z~U�S�����k<Z�,�h��8H|�k�>��H�U���V��%L�[u�^���F�>�bc��0����XP�B�b+1��8��]�������V�X��)=}VH2eL��!��@����N/��Xp�(���4�=@;:���@��G��D�K`b�js���UAy2/�5������)���PD4����d�#����������nX���_�P��@�S}N�7�}��ob�c����r,��%f%Q��%)���>��8r$C�2����j�@S]��/q�D���Q�|1���$H��R��S��D�Id$����d�p��_��KH�����������w0�0����smPR@���.�y�� �f8MO4��I�<���e�w����$����a����7>O��k��y�������]�������+��r��K�l�\]�#l/��6�Kh�dI�y��`��Ag
[�R^[�P[�����s�`O'����juF���7���j�,�S5�q���A�0���]J��.;G�0��f����W���7�����A����w�ep%Ec@�Q
@ �W��@]�
PV1b�H�"l��W�l�F��7(��E]�jco����@�>e�KHC0�vc��c�z���O��K0sl���0o�U�c~qxBb��p2��&�"`:
y��=}q��^�a�	)p���q����n�k����X
�Pl(K#��	�_�:K�1�d�LP���r?*�
���N�{���/����F�q����<$�/B.��9dM�:o5�{f_m��k�s��� ������[
��/���a�h�r���rxZB��%��kQ��C�gP#�ZfY2���g�thmg���M	��Ag���{=��O�%23��(�7q����Ho��9z�@�4pe�'�4D;y�
�,N���VS�t������o3dT6D��	���-�em�k,���������.S8B��U����h���k�P��b������3e���3��VXF�7�����_�Z�������R�m?�w�={�������o6�C����P*�Mvr���{/.���V�]GI7�ie����A^��G��Nw3�}���~OY��.���!����]������~�36�5����a��Dh��	�;p��y�R���;�����<1�:�#�h�ba��DtC\��7��pM�Cb}�b���"f�K�d��c���d@��%Fh����O� �!�.1BY>��'
�gcw������`��5\��r�4z���g�L�������O�c��R�\_�*'������{�(^�I�{	O ��l"6u��L�0�	�8�vCA:_�� L���C����������*�c���$J{y�C��`���S�w��K_�M�hO
OGH��^���z��*�M�Y���G%_h���`0�Z���=O�
L��Z�����~z�}B��}����z02���>�l���!���t�e&a��$��N�bT,���vj/yD�a�6>I�![�-o����Z2��jM�:b!Mo%�@a����r�u�6c�m�s���^�����D���Y��4
't��A�'���Y�|��pYUM��0_�#�=V�]~r5Rl����@!+x/�E�iDK�Q �����B���3h�w,5@��#N��"���H��q+"���@]�?����(XDE �G_"�$(I�on`l����L.�M�Y����%�8�a�1$K;���/n���Ou������m�R�MLW��2�pHQB����g
�LUdm
\?4.�"Z���NO���Qa#9Kg��;;b���6��6�PDY���55��|1N%N�p-�^�N�H�-���6T��2y��!B��xjg��8�e�;��P���s�*(����^�
���]���%9����`v$'q�.���0���-��
*/FPG!��hP�E�� B�����K�����B�|$1���D���{h���}��h	%bia�']`���M|�t������j�R��$.�y�������^������|Ij����/in����zIs�7u�[Z�����pKs#����[�����j��A�{��L�$�?�<y�x�@��cF���-�s8�Z��~4
�R�������O����o�?�y.�kO\�wS�����:&��%��ou�e��)�O���SJ9r����s��5N�4b����|�� @��y�Ek���^JR$g'i*h4'W�����5�"������2�J�V\'9Xe���3����zx}I���)C`��2�+�a0���Z�
_OFp�bQ������G�
�r�W�
���������f�
�p0@�><=:9;5����������������X���I�@w~p��Q���e���x�t��
�)�~����1}��?���A�����,��H��Qn+���nX~�������KL1#�A��Z�Hrtn	�����$5�]�W��=����������{����d�3�@7��U����]2L�n�N7)�C�r#`�G]2��L�Md�E$�X��hq/�Clvq���U���y����F>}D
����AEJ����n�{��� 2��^P�����s�?<{����s#�9%�$�/��9y�(��5ZU�Ad�R�X�� (��l���B�wh�������~���;�h<�tM�5QtW�=��w��E�_b�5zVD}�?��~����z	#4�.��Z�uC�|b
�����	�Bd��x�YpD�q�gjpo��`���`mpB�h�m���2O����Q	���(Ol�$\���O9n�:��$V�f��"c<G?��#�q(�@� ��)4�8���TJ�%3%"�o��)<���j$���u�v�'aN�,^�#��,]�
�_�3���9�i�;���h4��7��f
�A��Tj��:�_F�W�G���M<;?z������A)�Mc���L=�Oq��<dq�/PRT�D G���a�9�V�V9������G
���H+KX�Y2<g�HG>���"r�������u��9+���G��^��8����V�����
X���\�;w1l��<;��:��V��f�NNEp��b�N�]x~��������l�Aw���<�.��p���Z���x�oW;����g�>GH�=�`��X)5���)�B��:z����,�������L���B�&�+��m����oJ���/4���~�
����<����-}��c-4��p�V���&��
��-4��N��b*��=m��'��(4�;d44�A�m_�e���A-Y!�=D�<����0-��j�m�������}H�G��p<F�ax8�t��j��if�q���}@������c����?�
~	^�}��������=E���w����wo^�}���9<���������������5�u��,��~z���7���HEq��~0E����a�n�8<�H� �k���&�B�#e��3�|����Ec���05(�9�%���	kjS���U&)��h��G�p]����n���m�Y�c�_�F��lg�
G�@��c���:�q�������������>�������O,�������D����8-�^�=:=z
����z�5�<h���#�����F�E,�KD�"1��{���g}th@��8��%L�I�, -IV�>�s�&��Y�4,��x��_�|Xrz��������o��sX�� H�R����V{�=�������,ho+��W�d5	����O�<p"��}4�	�����U:G6�����3z�F������p:�oo
�/le��������M1�\����N��G?��GgKK�2�i�|�fI�}��&;�������#:#��f�a���l�G�L;����d�	�Yd��m��d�
�$%���;M���#�c(���f�qy\Z+����ibQ���4�������������T����q3ut@-�8�o����;�����QSCvp���V�L�Q�V��z�VY"����k��P�{@����7�p�1 ,���cR��g��;	Q#�@�4RCP=�"�����y�:�?���2����-���^+1�HrL�8�d����+&jo���<���L1�3��Z���zi�Gh�bhO�eO��~T!�9�F"Y�"��2��61��x���$u.^��=���vn���Y����z-�q����VO�{�d��hf^�h�m�JS������4�|��������R��:��Z�1"��Z��#R1��mL�q�g��H��1)�j��L�m���/�J�Q����^r�>�C@�c��C��{��U�)f:R����t��)�C8kH�G��v�I����$>��l�;��V�u���:6�����iYw����6;3G��`�-�\�L���k�07>n���g,�(`���k0(~O�h��>�9u�jm��,���E�
{��xt�ju��p�E�r(��G8������X��>�B
���O���_�������|��-�0<��������������m�}x_l?�m�2��,ci�h�����G�^�kj�/&G
�����]r��bZ�o�K��/��-Z��f��w�~,��1�j��cm���4a'Z�B�������9gh
r��t�������5�l��������6�;-�������w3I30�����q�u�"E�:5-	��9��)_���!�d��^-/J���L��25i�`�����'��Er�!����&����>[�.�y���1l�n?$�����tRJ36����B|D��M��J��#g7I��P���"�B=.d\?��z<��h6�h�*aZ�����Sl�Tj4�N�qL1)n�b�}�q��!�;�_���"����N� L��i�-�b5E����:��Bj�=/�]�d&8�Dv��%a�% 8�����5x�E(cQ��	��S�g"�T����c"rR��G&�����vgl�tL�4����<��i�^i�;>�SM����f��)E��$�%Y��5=�CF+�� J�$�%5k-�H����I���$:��U���x�-h���K]�41���L�dk��S�d.F7^����V4��8P�����_����Y�d���,Ao`�y\�u��S%���iDZ`H+���`�\���P53�<n�-����/�qJ�
1`P]2����<����`�$����\���C���x(t�����|����z��3!���������n�U�	6�'��Y���x��[��;�$68%���roZ�����d(��A���P>�������l���4a����VM.L�����d��l���U�Z6w�X�����L��S�)���v~�����F��&A�7*%��#�xOw��������-�y
���2<�do0��������z�L'���6#����jE�4��%q���8L����	��3�8s�?��H
��b"V`����8�k�\F��C�^�l*5S����:D������vM�#�p��o5�W���@�qKO3c3s��Z�Pj����V���@�S
(�T,u�+1%�]#Q�KY�����������";c������9o_��xq
R(oS��C�fd����T:a)!�p��E
�Z������\E�(�62S�\�3����F�>��lf5��5���`��L`�MV��[�����y�
��I�H��X�
P�A-��!%��*�Np��`^
�Sd]%�������ueP�v")�\\���%�E4��S�Y��"{�v�����c�G&4���e&���:��'�������0��2Ye|�����*�EP6��q��V2�Gs��dsDJ��i,Z�����E_P3�`1���=��$���":�K�oX	���g�
���~���o��6�dYQ
/I9����od\��F���R}����d�����c�V�,�Y`f��f�����O��I�i|��b�yB������B���,�P.�o�|�X(c��Vq��=����CVw�4Z���������bx���+���8S�cc������5������P����_����=i�:���e��
��0N}����&���dd
;S[�D��t	�,�ZE*����b�)�J�iK^��_rS�ZBQ �EO5������:46��K���[�m+MhR�6Y��BM��4��w�V���5�ueH*����j��/F������<��m+Yc"�w��
	�N��h��+���E�F+��9e�~bv�jfN�JQ��^��Vc�]��f^0�4��YB��Y������d��~ut��Cb�0�-���\d�$��������M?{�y�v�?b��a�2a�Tk����-X`F�f��o�`�r�@c����0��
����7�^�e$����e����H�I����&�����^,�R;O��c\��\tC�
�,y3���Q��VH_�8����6��sw�Y��b��H
��\K���b��N�����
�
�����qrR�e���,%�a�J�����M���iPI<��X��P}�h�rW��w	_?��������bm4��:�"|��ap�u4��}Z���N�����������u�c�8��1&I�g��py.!�����L�r{��t5r�w�#���^AE�j1dOf,v�Q3��P���R�7�s�|��7I�
��o��hY��I��"%vu;7�6����aY�4]�1q`�-i��m��J:����u��J)*[��O�cx\X�<�LZ��L�jA�X�\�����uq&�-�V�$tr.e��S����T��[Q^BH�����klR�����e��*��!+�H.������dO��]eS��v���q���9Z�1i;������AGc��k���%�pl��@#�Q��M4�<�8R���!5"
�#�c���b������{]g�<6����y5���5��7q����o�E��B��������|���R��!o�\|��������@�����/�����k�JP�6\e�z�).����9VP�{���(EkO&x��T�.��z���afD�[ESv�^�]�Wp�G��������n5CX-(tm(G������-������-�_�!���i�j������.w�L������IH9~9o��-��������c8j�C�td�����1��0K'��0;	�����I�L�M����f���	2O���S��.(�
����.�BE���������������xi�d��3&
�?���U�1g�q��]�������r���K9�3����yn-�[s�Vt�"���9��]%1����9�,*�����M�}\���{����r��%E��W�V��93�B��>�����kv?[��Z�����]�z�����!y%RGN�n��@/����$�z������xS�62�Y�FL����/�UdRm��U�����85��H$�f�T�,�%��a��������}�r%';#�A;F�"������BV�b+�E�����69�?��/ P9WUHtKp����;j��T����\B����� ���o��"��x�1�&����q��`l�i�(�G��l��s��
5���m�4ef��Oac�J�/�6so�vp.��D;?�F&�p��Yc��@YS�>�X8J��<OuOr�~���Z,��Z�{t��� �O0B`q;��X��!r������Uu>���7��l�������_I��s
aPrJ��.��9���n3(�'�+��<�P*���w����%cs����s�*j��"��~8 a�jv�k��Hy�|��sB^�0�����3�gYZ.l��Z5\@Y�2T��w��DIJ��q�����0E�������9)>����F��YrE��,�T��WMy��p�e8�^��}�
?����w�k�0�����$_}Sg�.-Q�Y���3������H�����2���	�N�4Z-�N��]U"`�����&��H��R�o��������y:��5�r�v^�?�F@��%�p��h�}��y���H���b�Coz���j�I2Du��p���SD��!�9�#0D4?��4v>�6Bw���f�����0�+V���E�4\�i#)���P��O�D�&:'�:J2����5��<`�\"�L���^�v�F��5����Ue�������?H��b��+|[�?!rXI�
=��z6�<d������|�M����YyQi>��9����5�s2��A���$�iwL����C,�����e��<O;�P��	��P���S���!v�V"T��K���T�T��0��p�����P���s��s�SD�{u���`�?�[�����z$�O.QF���\�e~��^���(�8�LE^7�*�a:iJQ	V����!&�����9��0k�a&z�b"%�l
�� �j�.���������ti�z��M���l.
LZ'�U\j%'))X�G��'��(���9Sx
G�"���)+�������J��'<mn�(,~^��Q���s������G��;=��Q�R	NG���>d@v�C��nq��G�^mO�/��)Q�/]\_k`�.��S����3Wm��l��N�)K.N��I����c["�T|���OW94g%LN���������|�V�����I�lA��x�S��D����p��i%��y���Z$����oK�]� ��f�t�
Gyh����FX�w09�t���#�
�s
���r�pn�����t�gonEc�����-�<F�J�S+Qc"�cT�U���!1�<����E�0l��5��Oo6���������U��e��J�5�7wU0���h{��H����R���P��N�6���=-��[�����;T����M��=?}��YI3��A���)���/c����A��u��H�����@�v��,�������f5���yv2r�	q����?���*y'����V$�R�b~��x�_\��]���&|e�K)��W�wt�J�g$\]��M<���%&�\���~�I���x�*'�8��-����~�Q����>�,q3����Y�],;P��R�7h�p1���t{�^{ca�]e$�=?��`G,K�h�6X>4�"u����"��!�F��q6"��,E��*[�cSf
n������Vw;�����P��H��@������%9e)����[��d6�S����@m&[�@��k6e�m��n��["C�}�k>����vu}�r�pii�2�7�2�Cc=b9�����[�#�L@�������l$(Ra�G6�,��P���"��6������R�}SR������V�J��XV���B���� e'=8d��vY
EGM��/����z�dq����M(�
NeNIF8.�x���)�L���6
 �����_�/�z���m(�8���0�Ed����X������kjF��O���(��9D��?Z�;��������-Q�>���}�Z�u���j���������/?�B?���	�(
v1.3.vallock2.tar.gzapplication/x-gzip; name=v1.3.vallock2.tar.gzDownload
�7�IT�\{��F����S�g#��
4�����q7���~���9�6��Ty��%�m������U		A�����3-��^��|TV���^��D�����dT[�����k�F�gF5;������x�y^_���v���n��W��i$��i��z�3��n6[��������>c��j���U������b�C���~��h������{��'}[��]�n�����n
,��v���{K��X�����&HS�j^�{��}-��\������}9��aU7����G���D�5�l��Aa�����f�U��j�^��=����b�N.�1����e�lQC�!D��h���il<��v�G�_�����������	q�LxQ�@�U(,�Y�x3���-�2��#\K�2!��c�4w�93}w��B����@a�D0���~��WU�D�t"h{.��a��G1!�����@�P,y\t���#��3aU�~���0`K,��"w����:c���'?��3��a���ga^����s/�EX��'2��.�=���������~i�`������s�U�Qu�t��bU�^
��������O�;�_$D�+�z,�B(��` c�`�8��5�|M���k3��k@��gY���B���,�(6A��|��3[9�����W#H��	�c>�5����`�aa���}��,�
'���F���VP�
����>����[vqw����b��i�����V&��Kr@�r���pJ���>�6i I'���&<��I� |D��I����a��I	#��	��P��'�w����N:�YF5�DA��	�![3�L���j5
��h�-�0���Mm�)��n2����&;�"a`���:�3��,�/����W$F�����f"H7�+��|j4�dA�������x;mut*���e��|�&4V{��������L�e�#ws��WQ^#EE����SH���%�	�[�!�"]�<8Xh���0U;m,�.v4������"g8Pf�U�.���$���
.GL�x�a�����nQx�'K���*�����0}��s9�w�M��nh|�5��w�i�iX>�TYk�,�
y�V�4��mV��@e��1�gC��'�����������`�[B0b�v����4`��-~�%���T{�T]�VLt�r�-�g���0�u�x"�c�N���+}���
�����/�b�����Ry�
����J�mt�N�}9g�"��2��H��,�-GX�V^k�GZ--0BqV*
�(�]-� ��[x<x�r��l'��B aY�]��7��QI���ZEO�X�F��A��FS�;��X��KqQ��v�����K���qA���C���I�L�������a�Y���Kv��d������+��"����+�����N�%��1V��LV.!`+��w�����<����������UR)�H�l��n!>���+u6��J����x.�.q��6
�������������c[GF�T���N8��w�8��V��%�.c�C�G�WN�vi�F��0Y��L�N!2�%��T���F� �����<�_3��������X9TfM�q�������p��P�h�MX�����o�V��rb� g
��fg:���Z��a�
���zC�@e���m�z���[�A�Pm�(���!��T��_	(�����x,�.��(�����=���n���=��	}��M��W__���N�;���5s�#�.�_�B#@�j����N�������Fs��.��'��R,!z��������	�rG7[h�l�Z�X�2A�
�/�hj�������3c�0���r����T�
xW�%Oi�\�qh�i��n�����!=HzG%�����F��E0����&��;8lA��9���/_�M�;I�r�X!8#2��6Yu�[�
_=�q����;�N��l,��V�U��6(���Y�6������n&s��S@�$_��G �O���I����������M����s�fS��������x:�nt;QQ�Uqu�K��Uqu���3��|���m����w��T��Q������
k��5����s��~{}��{u]�Q!�8Z���	�eE��������m�O<����<��Y�$��0�	3��X�%��x`��	����~�G��� ������_"&�j p��] <s]�;g�R`�>����]5�#���O��qAi�=�FADW�����'��������~�~�5�pD����q�>�h��iE���,L'ia�����U��A�F�^%]�aU��'�-&F�8�m�o���Qq�����p��!��9�0�A���TCA����1Q���:-����[����?B��#��QQ���Uu�yU8I�s�G5�L���H���D��	�	t�+��*��)����8�]�	a���d�U��j���Ka�����,��`�ku��3�&����T�0+�eXU%j�/�)96XA���Ri������q>�0�]�|�&Q�C�9M�Os��L�'H4�nA2x�}�f�A�Zf�"��� X�(����L�0�-7�"kK�dBJ{P���y}R���)O��8����&�)p���������x���Z|��dWWO��	Sm�XFy�b�����"���4BH����KNe��t�VM�Kh[ ����
���OU���U��h�=�i�'7���������x7�x?�{_Q�2�������P�T::���2�"Y���G���O��S���w��I"�m�����fxi7���D�C5�_)@_6��x!���l�8MQ'seZXt�#]�_�'8���D�
mA�]<�A�J[p���U�,
�hm�@b�W���q]
����N��{���^�p���~eON��0~���9��W��=�W���~�|����/1����H����#r;�����3E�M;���N`/���+j�+�� �&�9_.��������G�����^l�J�����gN������*iR}x�=�j�R�=�8���@a�4�g?W�cS7���-�o5��|z��l��������&�t��!4e�U�}�*��7+]���0}�^���W���r*CJ�%KC2���2�()�$�a4QD�u��\������qv{�v�X����r���\v�f�%f�%$`��,.Hr�����(I�����[��]�w����DB��}PHeRYDsx���s�����G�A�C���$:*��9h�'�L>a3��8��� f�y��>�X
���f���v�~�`�%S�>�$Hd�����#�J�E)r���a�A�� �~|5M������$�����
�� 2��2��'��"�l���@Ar�D�����CK�����
���7� Y�> $i��4;-� x�H@�40��R����B&��2��E�K��p.UF��T��%�
O4�w��r�JX�^�xZ����^ou��V�`}���,�������v��	LL ���TSt.a��v���8�pQF^�+����g	��M�
�^�dgEs����]h�OOK���;Oh�<d;y���$m��w<7q2����83���f?�4�:�XSo���F�5� �.��&l����%�]ro*LU�c�����S�F�aJ�?����K��2���0�=vPa���6{�n�������qUGi_LL����I��:H@��`
�[��c��9��&`��2��'��4a�j�� 
���P�M�SL��9{NR�0�1�#�e�Myk�ZR���6����e�F$����:��$N��r��4���� {T/�3[������z}1��o���6��7SA�j�Eq���
���+b;.�����Z�Z�5��c�6����k��'?k������3�Vy�I�Er�O�z�pP0}����c��\O���W�9�E~C^���Kj{��}�e/��	1���(y��/g'�,/�2��8����h~U�'��\��e���GIrH>L+^A-���"��g	d��s$���� p���\}������~������Ma�������J�8�N�<^)H6ow��y@������h�@4B��\a�\9��g	��\�k�>�{~
#��x�(Z)�U(R�8eh��%f2�����g�_��W�d��������]S7TP
*���k��>q��x_Np�~���+�R����aF�{��-���n7
X�Vm����v�n�w�V��.Lq>10��=��N������u���"�]LF������(o��_�Qd�[�F�C��E����\������^Ri��!���0\.��X����b�rE��SpB�b���o:6����'��uc��&@�{�n_�/=���8��+#������i���JR�p6s����9s���p=s/I����-�r��"�&w��@1���9���M�O��+�v�������m0g�����AhU�g��u��/���"k�Xk�����p��jJ��<�;�*���gj�"�D�}�H,�'��2��JB��JKC���D`-���,�U9*+�����a�K����Sv�_�t`�#�&�~\���4���)��L�s����������/��|��6����'��czY�u$�-�wK��`[�9�lS
��V�^�q�@�2S��N�]����N������*�^����#�))��^��
�]�<{!����M�J�����Ekc������1���JwS[�6���[��58��hq��V��x��H�o�Q���)�����}�������%$
K��2�yu��xg�� ���dU)[����:�F>���n�&��'�W������������#�$�����8e�kL�����i�Q<���h4k�������z������������n<z��O�6������Zz3}����t:���W|���V��h�F�4����
�^��5:�i����y��u�n�1�?}���5{�����������s�S�R��K�^g�Cr~�_)d��q<���@���+.k��^R���!���N�W���l��H��<�Hn���3����-��)M/��h�b;�Y+��0.D{L���Ei��VKA-V��a�������C��R2�3�@���p�\��Z��x�n���<>�'�x�n�N�%�l$��v;��wi��0H�A;;��[�������>p[��	7�#`nA��[��2��>+��m2��p�v��`]�_��Q���Yi:t�`?��
��p5��{n��>+�q�&��o@aMZ�R`��}����l%��Ew�zR�k�@x�\�����M�>+�c�����MP��8���X���B<R��y�/�*���k�t"�6��e���������Q~r�~0�{g��T5Q�^��b�<�����Q��G E�[�.�\��
H-�a��BI��������p��,���K�.��\M&�K`��&%��<2���Y��W�B��+4�>��b(�����E{�9���_�����z�����[8.p�����>�-*p3����&Peq����b���(��
p,����Z�*n�[�8�Q�6��(O������46�L$�������C���v�wrc#��9�u��Iu����#���B�n��tA��) ��ZZ�#��i�����'�%�U�'�aM��{UM�_'����@O�c����k�����}mdW�8>����&��d��d�=C�l3�����O&_�JR	*�T�J�t~��w���"	�{���i	����s�=�,���/�*L����f�w��E��(
 �F��*1������d�� �0�i=a� ��p��)H�;�/$�.-�q�6�w����,�eXm��,BK�=C� �@7��N����?x�P��e�,��!�����o|���^��Pv'��U���/@�p�(�Do�,yZ��@�w�����*L��R(��
�������t���h�.���M*��Y���|�Bg��P���7Wt��
�bo��= a����|m�,�����:������tR@i����4��y9{����u�K�zxP���/j	�2������=V��w=�
�����3A���#��,6�
����dF0�o��`"��[=#ge�o�6��������h�M	ywl|�:���*��,Z\��FZC(F :f�zl2��u�]��gq4��68�C2@�)C���!��j����_�V��:��_$b��V��3S��
����4�N��vE�='}z;���$ ��:K�c�y���Es�����!1k'��y�P?����c���m��;��E/R�&�K6�������l�0&�:@�Q�>����������[��5bI�tL��� �,J� 1e+A4�yM��#���Q��!��W�kbE�^�j�/@���)�I��n0�cf�I��������g�M2�����5j�^��X���<���LR^M�PMB\����y� |L]����c%�S�0���f^�F<��d��h�w�5-nkW��k�6��=��GR�C{A�4���m���}�����y��f�Z�� BM�z���
���y8������b8� ����wj�V��2�����R+��I��au!@�WT��%*�������jI�O�-�#���{�YN*_��-�g����f��w\�����R��T�C,��j�����4���l��������b���
�@�E8��@�J6��l����1^Uy4������3���$���x���y�����rED�~1G���Y����X�&P�M�����%5���LWwv����%�[k-���O���ku�Nvi�gv%�e=�b���Xk���X�����t9�-d�kzEd�|�C�q�Z�V$k�&���������^UE{����#��*��XR�Z������+2#�~��PyOjKf�r��B6�I���n�����p�J��x��5�H��n��^�<l���� =z�6H�k�����^��Ay�	K���b�9T��q��+�_%�B�-�N��\���TA*����!._��8�t��	P����J���#�-?��7�����s����<�+�m����d��1X*���,����pB�����������9~��K���Z��g�b�_+�����2��*�d��S��z�����{h�����]$_�d����k�����tt�*��<��x�B/x�0�!���Y��{rz��G�,@�����L!��������\w�/�q��{quvvz~�9,Ji�J����Vf"
���lId��=Y[E���60S�A4(|�m��f�b������^e��n���^�UT���d6����,��b�13��x�7�D�_�>�@;����^/d�MOy�Q�[�#
N/@�����60�N���Fc�1� j�X#X���q}T2�&5be,����r�:�g���E��:��<�@�B�������gp�2��[p����B�e8G�Q��i@v� �p�P7�#�����"�%�HE��S�,��9����D?6����{�~u��-�;�pg������e�U*�L�N��G���wA;������aj����V�
�>�z��a���f�s�X��"oM������{��iB�a0w�mc���c����2`17C
|m�-�C��-��������.�����H�)�����2a��'�G]}?e;_M��s�9�������c�7�1�R0�[U�U���z��8k��H������.����XW$��#��P���q��1
����
8w#���E��^�x9JU�t��%�����u��P��~4�E@	�u0A�{1�Oh�9X�'�x�h�����b�.>s8���������?���?B�\�{K���O��,2z��}�����~���vX�D3��?��O#5�)O�13TT�e���@[K�0�v�p��a�w�X���nxZ�.����F�1R<�'����h���x^8 �y�{��&��,`&�4������c|���g �5f;!�������;�i������mh��$��z�������2�&�
�� �U�|{��#.=q8>]��]������8���mE#��p������f10b���X�0��p�z���n�K�0��@��|���<-���[ax��*�>-�F47�i�9
��|N�������y����)F�������1������I�:��Y{���/I#�y!�a?������8N�O?1p���tt�����euP?4������������2�d	�_z�������.z��Ui�8�p��q�"�=d�5����F��DJ�%$?uve�3/��x.���-�t�24��������{?��t�6���!K��������]���w�l���;^=��w:��=��/�Z����-�����sP����A0��u���E9mxo�h����s�����+�[��x�p����j�%�j:q��1�<���7�����+��*���c����}��"�^�"@��v�V5��9h����$�*�`-Y��Ez��]����Y���Da�Kw�	L�f"��A�8q�0&��fG	���[����u���,�f��P���+�'s�>�;�����'4�&��	�|�O�<�0���E�f\c��Lo"P�
�nM\vd�&���-�O�=�$����,&�����0~<�I�C�e�g�����+�g�^Y+N����a���A�Y~%���&��G�\�����< [F-)wN>����8�=1�$�h9���6�r����h^xO�*��(���zH�o��k��?��C���@���K�2q9x���\@2P�6�G��_��k
��B�]"W����x|��KW�����������;�����y��{�������7|F�,��u,�E��EL�-�pt|�9����������r-�V=�������s!��;!Q9�@�hu�:�2�?1�1y'e�^at�z�Ual������D)/���������q�F2��}��s�]�D|S�cB%�$����>������N���,,��.D�?��X�<��R������v��1�$�#b��30
R�/�.��������-�O�B������t�Uhr�����l#S�|I�
����������k����M�6���I�l��9�|�;�>.�Q����5	�B����������s�������	i�]<7P�W1pp� �t�5����Ni�w��?��t�cx������^����Jh��i��b��%jjN��*��	�1���K�6u���C
�������*;O�W�y2�J���R��n�8sg������:��=�_0��O5�N���<b�7�Do���2N�1,�a������D;d��TE���9^S���k�JZ���-p�,��s��YvI��[b+v 7p��nc%���7o:������W'�!����BB���q2h�Iq.&Z3@aE�p+&���>������m_IP�����'��M�-q�9�-j�Xd�s�X����r������gx�(��%jU2�`�*�2�_��"���������QQ�6v)\y�Yk����ytzQg�� ������p�����h|�OW��n`�Y����7��H���t#IY��Q�[7��O5&����,����q��G���]C�3
��w�{�0�%0��4���&A-zY�Q=q�s�*� �X	����\���VY3<�3���rbl����[��������r��e����*(6���x�x[c����1�$m����<��tH>��z��k���EC:�D���F�n�D�vM����e��u{s�������K��x��c YH����46��h��1��"���4��?�����S�sb'�Q/����.,��Sp/�?�uE��$Nl@�D�~��7������h������pEY�D�\qv�vCd��;=�R���$��g�gg��D�sk�d����jt�G��r2[��
����?^���R����O�^�r2M���F���(��yM���w��o
���|�A��.�
�K�Hm�t�	"C���@���L9K�mj�����Y��T ���=��NN<�����)��$\/�) ��2�����bz�TU�6�i�#4�=�x+}��Eb�����lm6.OvF����M��]Jf������B�4W$�D���F-[-@]��h���S|��0�)��	�T������}m&�k���4��n�W���9H�hz�L�U�<��NM,0�V���O������P���b��VJmt����Go`t�����!u2@<����8�/m�8DY��:5�����0�t���U��$�8S
�T1�%��Hk���RK8���H���$m�sQ��8!���v��p1����n���1vKGTN"%x��&xOyh�
�$���z_�>��l�������%���2�c{��^BWo�\6@��(Ei�~f��Sg�L�D���{0��..`F����P{<���Bq�O�f�n�����P\�i�L{�8����/����r�����X��Z�$�o��6��C88���.cw��<�8+�$(�
�%m>T0J�D"���P$�*�K��bZ�
&�>w�Z������4�C�$G�������w�\��(����)�D�����<����%�������K�3����|(���Bd���{�}[��V�����������Q��eO�gP�41�B��
?������o%K0�kS�l�g��
�/����\�*Q5Z�0����u4�@|�����]������F$��@������@V�[���D�����M�X���_(rB�  �MB�8�F'�x�:�+�cn1?��h���!J�Ya���{I}��z?��8	M���x6��$��co��=���5�C�6�+u{AjJ�����v��m,9!�x�F�Ig�%�1n��/�;���{L����C�����;A�U��iOj\�!{���9�R�A!#�m�Sf�-�E��Fx_����,����S�:U����+k�U���w�
G���\��������U���"����^R�
����O����$���Ix�v(�/bS�o��:�4��!�s1�{�f1��!�Sv$�p}
!�o����%|����
g�����xHT~\H�v����Rf�h���C��RpTO��
yi����O����|�b�����y�j��N:}s�������u�KS�� �$���	��1��X{4����1��%k�����9b��f,8����ELl��#<��� ���NO�@�9#�����m��{��B�L:������O!)B���U��_�_�vR.�$�[7����)��0���k����v�l4�'���$�����O<u�tj�D'��^8t\�,F#[#�y�D/��R�l//��@j*�c�� +�(��?�2�d�I�V�Q��*}�h����joX,�w2[��z2����K*��d����#��E�����:!_���������E�%���G��3W��G�!i)��[�%1$�E��Yx-�'�:	OI��CM�R�C�t)�0�������2���P����$JI.qLM��a�V�6��r#h������K�o��a��mN���t�=���Y�/S�W!U<��V�pD��fa��#����;���������3
���8I\�G������e,f�ka/P�2e0P�J�K�������w~�Q	��@z�(��"o���V�;g*J��)GG�2�g���jr���Q�J�s��Hx���<����s
�t�X@S(�B��'E
(����[
|jy����H5�m����\��fr��asm����[��\��0p@9{HP����~u0(�{�Ve���F5M,���RoV�UmS���;�&�0���(����Be�A��~�Mn��M�a��/�W�9����SE�Is�<W�BT���{X3�,:����:�gf;;v;�Mt�%t�{�v$��= �9��
�np�It��9#��j��s'��&5���QvYi����6&�_{�/=l:�[�5vi6Q���l��"-���s��d�3x����wQ�R>`�a�}���"!�w�<K(d�	g����x�MV�zf(��	*�W���(���	X=��C�hp��Y�S;�^v�)}��������s�Q��C���l3�����`��
��#���2@ncTr�����?O��t��?���76�b��jQ��-?�2
��}�th<�Q�9��|����������g�kQ���^�]�W���3V�/O���0�-��[}� s	MM%��j�2�3�������m�<������Rv�TFj���[J�l��j�U�/E�l�����`��K��0^'16��g��)�������y�iH�S���#g�1�^9�
^J=B��<J�`�U!�P�`t�V�Z���^G
��*wS�R���O�ZF�Jl�7���O�vH��1�I#�xN �Hdx�!���vQ��)�l��a������/�J����[�"��i	v�;HGK���|
�^I�ZK2:>�{Y��g��<���q�����r�/l?��sh8�D�������$�x��t�Or�GMN����{�D����Y�P0������)�Xo+��E��V��_�J�f��Z�I� ������g~��A��;�Fb��R�=�1	��e��x����,X����?M�H�
�*5�����^r���*����a���n_ �y_&�y�[;�K��G�k�0����XG���d�o�����\�
W�dn�$�B5����CQ�&[�SFQ��U��o�^]�=����%�||^��A��������a�?t��V�W��>T��%J�Ko�7i����E�&�;Z�A��E/����������^=w���>�<N��{�g��E�9T)�|0���M�k��:�&Ji�����N�oN���_v/;?^Z�:��}�����f����#�?�N5���
�����K�[��o��1n�B0,��do��^h�"V�����z����lnPY�C�,�G�$E:�@�n��;��Nln?�B"��`��7��s��z>�������hQ���::��"aE������	����*�����	s�#v����mbsL2�?�������_3"8��������0���G����3dC�&x�)��cL��	;	�\�?���%F�DnF
A�7Y�y�-y��1�%:���O?y�n�h^��W�u�Q��,�dvYW���w���e�;�����~�V������X�[�h�f]�-������h��c�r�����	���D�~8������������v�_�9��g��Vg��'}��(��A�B�����n�G1���(�O�8�������w�Nd��,��oa�]qL����^Ob�b�d�������~��I�~���T���"�&	6��<4*J���w��V S\0��r�*J�]�_q�F����]5x����v���sjnJ��iuLm�}�-��%�#�/w���|~��j7j]���&��3G$�$���Q
h$�*F�Q��u��������3���_��^!��31����=���� ��<+���@a��F�p�1
���o�'�j!k��$+j�a����������������Ha;�fP���\���JoM��Y�wT1�&�F�L�vdZ2]��f�f����X�U�r���q0�/�������h�v��DC��{������������ac���gw��2�/���'���{��i;qp�'���"�~�>��`p���4�����p6E��h{�r ���;�r:9��<�_+l(lG�b�n$�:�=F�
��9��B��m�*��z:� K��N/�����G,����>���#��Y��38A��x�1�n��
�)|����a���f��}��:��xNFr�\h,I ��=��ZO���wr�O/�)��^������z,�,����E��2j�*��D�?p�E��%���
W�y �c�C������K#
i<�3ndB�*���o��L%��	�$�B�H|�����c�o_V�y��a3��S���,���^�z$����E;bI<�7����������d���$C@uP9]�26���zG���V+(XF��J\6��3H����d�d��Cg����W��+��O��� ���d
�V��/�w�H�C��Q@/[����Qdl�$���`��WX�"+:�uW�������I��v�R);c���fN�'�������J������r��It�r�e9�Aa�(�H�D��������0���:�=�E�������G���?7�E�)+HEi�[WA�0����k)��f��R����,�JD��a���,�
T��CA���0IiTZR������e80/g�����;	��b���>���O7fr�)L�2B6C���b�����]�{��x�Td�	�&AM�tSj�|�/�*�3������4$D��cV�k�|
�z����ls;?�*����9�9i�_�:Z5�"�6*�KF����������3{B��P��F��������t��?�lm/6�s��T�=�y��o����/���>:9���}��c����.�b<g��e=�f�P�a�~��LD�@�w�w��p�E>(|�6�:�M��6��:s��2���9����
���,�E�*� ��#�8Nje|�NQ��������.���}�vouEEU6Ad��{z���G��x������R�������55Z�sK���&��W���
�]0%����S}����P�>?f�3���`���=<���5��TmYC��1
z6��bB�YA<w�
��������Q�3F��J��Cyy��	��NRAj�dT���6w}����!mAk�{f���{K�_��I��m?S�kUi��k�%S�������-pH<����_��LJ_>�t�>^�`�6A:��D���m�HD{�uG��
M1w�u�@.��{���}������Q���,��E'k�	�*�Q�.F[��L�~X����3m;��n��%Vk�fWnP��>q4�!
P���#�� ��*���g�j���v��X�'�f:���<�-��a�0/������MYiQP��61�5%�*������-��q��	��3�Age���N%#6�h�%��{H������|�?��LT�F�!�l����N����� �����X"�*1?���@d��Z]	���?�������RO�����b<)�E%a���A�5*,������� �9��X���Z�����B�����K�=��[<q����?�X?�M�3A�����^���ol����(����,x=PWFp�r���S!�
�9��`�!��L�-r��k���:U�Y�A���2�dA��<���RAM�;9�	<	���u�	��*�9L])�%K�l"�� 	�1"���}]`QP�5/i��
V����O*Guod�/��,����\��2+]����#�]b\z��c�����9�|�Y�;��5^�������huS,cy�{w�K�,Vr6��d>�'$���Q�b2��?M�lj �Gs�hu`�H���3�Z��������Z�H����
�����G+�'�k~#=;@R���d����������/h5��l��R�`�Z�E�B���eI��TR�j��.av�j����sP_�PH�Sz�P+s��g�*7���G��	2d��gO�p�/&��r^z�jW�c��`i �?���`d���@E�@��v�~P�Vr�\JC�
$<9A�b%#46����V�l9�$�������&�fKe���r ��r3��x���fg����B�\K��Yj�]�|���U��ls���s�����,���%��	��?�����VT�
��r:c�<f��oah����c�J=�i�N�#��F�����2v�X�z�Te��-2��y��r\W��a�G����7��D�q����k��
yVHl����g�M�+��F]�">5e������pW�-�e�D��i���K�����YuS~��N"�,����Y�7K�������J�H��$}s�e�<�`
�
J��bLqV��c9
a9(��@��#���0�����u1�J6������"�$�	<5��"l=s$�����l�p�4��[};���5����i�FQ�,�oS��b��h1��:�!�1T
�P��ur�	T�r~�{�1)��1[FX�������wkK�j{��h�$��aU�[$��8K
'=�^1�k(~�<���h/%�hN<&Q6GN+��q=���j�\"�������"E��f6uov�]�Ri�6l�7��!��x.U��]����R��N������������!*B��M�y�C���4k����Ch�
�0�z�
����Y�\����
D��^V�{�Y��r��V�����fz��4
1��m��[�&G�;�b,� B�(-lQ��,N�!����p�g�Ok�r��J���h��"Q�y�A����&��'?�C��!e�.�i�^syR�u�����f�rc@�P�u7��IQm��J�fw�r�v�����;1
O*����j����D7Bt%�pJ�t�p
]���2���!��vF����U�F,}��0�����V$6���M�n?�*�W��R��y��k��HT0�M�'Q),������L���Y���j?]�t�������n)��m�+�F�W.7��V�_]�[7����DI�.��}r�?D����{�k'�����m�����	�vA>~������n��U����9��n�\�����zq����Z�6��Lo����uY��������0�p��R-���)^-CTv6���|�;����V��[.Wj�������Vp�09��(�4|�*kf�Y�����{�a���;����<����8G�=����6����]�76��C��5����'I%��]��M��H���(^���C0������( aj�>�	�lVX_j���j��Ewf+��HW[�R]�K��>b���e�1��)���t���x�9�NF��6��
{,�+�1p��0V��HS�����L�|N�Y#$�,K&�^H�9"���<��P�9�<�%;B��a�d������/���z����0rj��'u��C���f�xLy���V���j�D���P���7���9>QjE�r����n��i���9R�w1^����:V(pV��E��F�J�C'I+V�[�-M�_��4��g�2�	!�6�J�V��cT>4�xpz��^v����������>A���?:��(9��8�.l�5�*��	�D��8�5�A|�&"���"��B[E!��F�'q?���1��M`���_�MJ������(A!	�&8u
P��M���04�$��� �%!^��s��e�*�tmU����X8�H����l�u0�����@!�|�����,�x)�i�E�W�����s=Q7��d[2`������� N�6��e�-�������y���L���r�D��,@�{h���W�j}w�Wv�r5�";�}v�������j9:'PezU;&y�Q��m{m4�<������In��
�%��s���
����&�h�m�^�V����V�J��~8bu����m]���M*_Z�M���0�����T��2t���a">B{��
]���}Xwt3rO�X�B��>C3t8��pJ&��Dbw��7We���fk32�:�'j���(}iO
��q3T�O�a�T�����?����������L,
�x!��e/a("���C����
W�l|�"
;Y�B����H8�Y��7�`���?E���g7@.
����8�%-Nr����bh�<������fa����j�F�	{�9�	3�Q:��8A%obN�y4�6V�h}S�_�/niVB>~X[��z=�����e-j��RZ��-q��������^E��o��y���(��{���(���*7�hb���x4�L�,N�����<B
Vm|�ysz��a����,IH���#��H��Z�,���G�Q�63nTiBb�8�j�S���Jg�Ce�����x#D��0�{���df�D>vg�h���;�tE�4t�jd��������6��pJ#,0������1���P5��a��������C��cX2w�c���9s�"�q;��D�	&0��]�N�����4q<%�|O�&��X�V�����@r>&Ra�}��E�z�Dc�L	�%�blK2er�o�:AM�"�z���%5`���+�$�t�"�n���}y�m0?��14�5Y���M?�Yg6l���/�@.�I;��R�n�Pv�n�������G����#~4�;�ij�A���(�
���q`���8��u��io�����n���U��������,���D	W7�wFn4��8��!�Xf0����j[�)�o��M�����~��	wd���o�x�K ����d
�T� �����x+9<�D6��o$\����$.� R�udd+�!�p.���
��a������:�����0����!�W��CYCY�����d�$u��$���m�UH�[U��b�G9��r�����)8���#�3,�79L�}���[�[v�W1#�������<Y�����e5R���I;�s��-�����9[���|���f�q��$�,�-C-/j);�Zq��!6'���0���O>?:�����8w8�$]�1�`
i���!�����6P�C�1���JtA,�,�A�.F�D�'��Q����4�f���@����I~����N���m��
cwp��������f3�����Q����u����m��V�$������q9�X	�C	��O���Rj�� -�`��.$K9���������]�����$���2h���q7c��l���B�^�1��6m[0�z]�����W��1
��+�#w�T�G�Y�7����w�����.'3��Ef}�)�6��z����������$e�<t��Yo���L������8�����Wqe"�gt��'���d����{��Tx�3�nx�?�9%�doa��7�G��s;�����=�%�mDN����IAx������C����0�5������G�f�*g��	�/�m���I�����c�z
���F�5/h�I���n�4��f�T�W���O6�>�)�>9�#�� �Ez��G=`�������E���q�H�"IK��Q@�+^�A.E��
�J[�=;�R�Vt/JtB�Ec=SQ����\ T\��D�F��s8
I��L9KP��� Bj6�5q$R���+�r^��!�JK"
��.'�7���3�5H�7&������|�\�V����f�`X�W1�"����Q�7�A���2��%�J��lmG�(�t�_I"��1�Jq�=��;��S�U��<���e�^�@F�@���\��h��B�����Q�`$L�1	9����Pd��mf���Nw�oL�#�M���7���r�
����HqH��C#*���Q�B=(���az`��o3���s�/w��EE��<Y$c6�������������	�������d������	b�k���L��6�9#/�#R�����
��o������D���0��y��9,�@v(��� �`]\��,fk{��r?��\T����b�x{_H@7�&��]���aI2���Y�1�(���d_�E�2�+x�E�F��SV4�!$�I�B��mt/b�\%�O]�$K�����N�EZ����3}���$S�<��EF�j%�,AP^]��3��6������9�����rH,�	�^�7��KkJ��M��#@i_��	��=x�D��b&6��xB��X=X�+iV�7�J	���0���>j~u�I������jt[T�h�m(���J1�J0f�e4)��8!���fC��B;��R9 S[y���J�W9l�S����H=���V�P%Ik����y��W�����0�'����Z�����4���~'�4��`Cb�U����Y8�#Q����D�����8���c�#�gp�N�xBcD'���+�����#����GH�4f�k��	��������N�R��V�q8�g��c��@� {�x�������!��>:{�u(�Jg�"	H�o�@�����
�dG: �Tm^��e��A�����Ad�������c�TQs��x\h$f��?Q9����4�@��^�	��da���!�NlF���� ����9#�P�Y�x2k�
b5��m�����:����E�P�wft�Vm_��Y\O���]�
D���l�����q8)�����J?��x��zv�~xt�|t������cr?3T�x�qWQ3a|�,�o.W����{�!�[�����M������f�eqRQ�Y)���6)�����[�fFn�"Y�b�Zd/�*�/qR(U��B�|
�)y�����t��_Q�����'����;O����Y��������	�/�[�(���@�l�^����l%��D���?s��M��#"y��[c��B�+%�������Zj�3q�]nz��Mqy~��m��s�B����?y�Y�=l�;5������Hs�*�&:
��?!�Pld�f�{�@<&�����$A��T\
s=w���y�_�s�1a�r�0��S;d#OiQ�;��E��1I�x�](L�)-�����������5�"'���>��7=#E�f�2��h%�]\�2���������7��2p�A�����&O1.�b�l�k���L�9�N0)��(���������p�T�c��G�1u�aH���H�c����W0����C2��}�|4��"�wbz�� aET�����T�:�w:����y3k&	�r�\|�g�T�L5�`r��[�=(�o�F4�p�������OH�����],�h��vv,����"�)PQ"�F_TAt��C�����j�1~��HW5�����7[��d���D���J�	EW�6�;������]^vUt,h�����\2l���Z����C
+�
|k��@�U����d��H���5�W��Df�SI^/H�E@k�������JG�p>TfZ2�q�9"��sr(~�u� �,]�6��E��-s�:��xR������p��TNL�����l8��LlX���;#�q�Ab5Zae%�U}/�Z��Dl���iE��y-�D�{����J��W6T��{�Y����T�L�][8'2�E�9$\���<q
���L���w��lj����@�3%X�/����x_���� H),��4)������D��Y���,P��<<K�AE�Y�k�1�������q$���,�G�l��������Y�zK��a���BiX�w����
8=�I�v�Y�������N��k^d�5���k��~k/�x�
��J��
SMDuN0��)���N�����4���1���yP�-��Q�c�D9�U�zp�2G����	Bm�u�8�}m�'�����J`�f���������
Z�<�a3m�T�od^lYb������D"�1�!�$SS�jJ�0��u��h��dRDw@�6��h���9V�B=_E\_�cE����U�h\��� �R3���\���*�q#+�QE�"h!Iq�q
�m��W��
����K|����Jp���dn�/���Y�hN�EV�l)�����A��iMGt�!��Vt;��.F:����>����\����
�;�&z�b�-��R7�mc����KM���-�.R)����y�g,�o!��Hi#�E(�
�ai�B�@a_��>-��-�3�:v�����FMb�����s^,���G��=��	�w��7�t���ApR��q��
0,�{�	��.�c��X`8�A"h�*nf'�|��I�&��6���#&r�b,���
��7a���i�t������f����gHM�;�����OZ�:�^0As)I���(���{tq������2���]4�DnJL��V��l~Cjr��E�h�-���"m�A�a�,��<����	^+����B��[�Vx	��cu!u���P6��o�#���Q��P��������y
Y���P�H��
B ���+TK.01EbD�GB Q3h��m�cWF,���+�h���uEn���a"�$��N���������eZO����~t=!��$�������������<���+H	�V�����;����������(�W!G�j�]�(gTq)3r��8Q�gO�����t�RG�~��p�!�f�?��f�40g�4�{[����O���t��
��bq�~��W��3������f��?��_���y��q�y���`-���O4�3�9�_�\�_{n�8����66�}B������]�0�Gz,E/9����2������e�7E$�A7��kUTo95�x�#7G~a��Z�	&��ACXk^�G����S�M���nx~ q��~�<��U<hW7�@�P�1n��`�tL���9�E
�&q{tr�� ��h����&/�.�87��Y#4�����U(���Q�
�#�:�O/�x�`�G��c&2���
����j_S���(�\�o���'��"sI���s�n=�n�t%���tm����d@q�������>f��M `St.�W
1�P%B���3�=���K?��+�I�#)e�_��x|�	��PM�5��p�����8��o�����P����m
E��Z��V��r�:�?��ml�C�)�L�1uL�N���
R'�	��(�Du��E~"�$T�#��px=�*���OB�?�6_E�r�OI8'R�\��9���~��qn~�7���f<���V�ti���GB�`�����w(�+&sG�)�����_4�YO-�iK�Z��R��vu��6"��F&!e���7p��CnH�F����.��UA"+:Ifx�k���N=��Q��(M��6��3�F��i����N*���8�Y��[]L>����5(���f����&j�v����W+���}�S�&��j%�����5W�\Noq��^Xf��*i���y�`{����)���qA=nx�lf�����9&��v�M��$_�M�*2�$s6ASuOA��.����p�z�@��5�Fa�q;���������i�i�=�����x������\Y�����+����q����(S�}��g=aB��YH
�{�7������`�&���;�Es\W+�����6"����R��N����������8���-������p�Q�&A����C^���CB*Cs0�+�(YCe�=B��"�e%�������M��
��	zcA�F|'tx����Q�T��v�y����j��x�KCb��"
�3(+,�[���'i����tk�Q�����d/�$�p�������i�'H���
!>���*�66
q!&��
�WE��:9�|����T8A��X
����x=���"�]�a���jbC���+=��Hnv�\��4�<C[Z�e���q&s���t�d>�0r�O��b�����iD.����k��w�gqB�orQ&�g�Y SdG�Q*�]J��@^K"�>���/A>�.3c�=�aE��M���8��p�C�����B���F*,���j&a�n�=��X�c)��_���+���0q����P��I���$j���h�~���?�4�������3���`�#����}w���K��6�c]H��">��8(��KH��p��=��!aO'Q�S�\{��+�f���m��� \;�BS;]�&|wO�0�Q$�=�dVs��s42�����	$��N��Q��0W�WW*sq���,��y�
���v�I���E�t��Q(�5JX��sJ�'x�3j���"����#��sV8�|���������|%n~0�-{f��Z
���O5/���65��,�'�r��|$��fB�D��-"�${��Hjr�.C"n�s�F�3�y||z &v*������zz8q����8�sr�MO���]OP��,�B�m7i����k���"
�����W��� �l8��f
]�O������<l�8 ���,ZLu'���9>�F����j�'�.zQ�XV�^��s�]�C���Q��d�+��Z��E'�%ou�wn��}�i��{�w�a����=���$DV�z������RT^�[�3�F��c�����;��2yZ
%��4����`c�^�Vr������$O�e��]@N�Vcw�Z��3���V����t��;>�Bd�bn�`N@%2X�_���{L�����;KXC�y�;�J�0�T�����DF�N��+�Y�
��E�H�e��+��S��)��+a���I=Kq�����)~���,����Hb�t�Q���-3K=��8$�:h��Z��n5���d�<J��)m�D�%�
�T�J���k-)�z��������]��]-�<���@(�^m��W[5�4�������z'@r�����Y�-�}��9����8L���3�z.G@��w��ry��h�UG��B�	`���n������	ow,T(��r3f�����$�.�36j�-�|���������-������b��i��M�~��]�xv����`V���������%E<�Ene���IH�
��+�2l5$�-����C�����_��
�����,0�V|�Y�7^�1�ar�K�
]��[���e�$�W�z���}���N�a�p�O2
�����k���t�~x��Po�^�O5�����U������)�L3������mJ���*�Z�B��'�c<�X����������`����O����*�P�U��j�����M'"���R����+���Lj������'�'�r�4WD��[��s�S_�BkT���3_��LZb���;v�	-��.q�����Vk�Wk���a��h��:����o�Qb������7xnk?/��G.@�|����)
�����eB�O�C����e�24�����e�C�L����%X�t%����a�
.�Q�Z4��Sz�T�,�hm�V>�f)���r��N�s�N=M\�W������{���t�H���*���W�U^�Y��*pe�W������_���W�V����j�!2����L$X���JH9�K��	2H>���d���uh�
.!�d?i
H�H@��z������^�S��y8���j���Ak�Q.�w�Aoo	��m(M�EY{�D��MQ���?�B1�G�RS9���K#tT���/��B�Ih��&�Q��ELP`HV+,b����	�Fze�Rj+�K�
C��[��\�����%�� ��c���SjQK�Gp�b�7{�%����{P�1��Q�(&�
�k�@�k�`m���0���6&�� O*:�pt8����<�������+�������d��Q���F�y���d�j����
�M�_�G����*3�^���e8 $M������@u{ (��_K�$5%�{��(�)S�ns�Q�|�H�bc�0ii���,���W8��(nen�I�����;����(��z�����J�K6{�����Z��_+����Um���Sm-����dI��L:}�

�]�� c���y�o\%K�$�� �$��`�0�p��T�
�2����g��{to&�:��}���?O��%�fr�T��D���l�����bM(N`���_�r!�;Y�Z�|s��Ix�����G���JU��;�W���0?������!�92T�sb#V�TV��tV�I�@l;�����~�����<�^�p���{��D3d�`��"�u=	����hS���#{��A���z��]"�6����Ho�*E7�G���&(��])����(��#��5|��M���R3�?Q$����j�ZAu�3�H�?�����n�\���������K��p��LA���J�r������N��*��0?�=�$R�J���),�|�=o�9<��E��g�gJ�����"

=���/��Vo��3V�l���;��������	9bw��X�C�Wn�%A�����M�%p��QW)7<sr�N1���}+E�;+/o��\�x�2��h�'%=c�����B5_&)� N�N����
�L��@�`�+;eap���IVB�[`,B����f#
jp��D�%�pL��(���4(Q�
��"�)w}�/���u$�94��K������;��h��1
�r���h)�)V����=M�JZ1@�s��������CT�C�9*�@};R�1�
uz'`�"xYdw�	B.�����:�
���g��&,���jD����,���Y(�6� �#��Q��
��+���)�O7��^4�9Q���?fD���N&��4��+��(��FN��X �
5&�b�YP���:|���xj2k!0M���U���YF!'{.�wU&!�lr�zE����p�`����H^E�8Yy�-9�2�����������W�q����\c���2�.��\�A��Uy��{�����J��U9�`=���%�1�cei4�^��s(��`����1�P�3�l�o
�E<"^XR�Z�1�/��s��B$�JG�l�o�eP��,&f�/��d�j+YZO���S�,mz�����d��j�.
��3��.�u(�� �0ny�:*�Z
��F�� ������^�S|������,�v+��� ��x
B�����3���s�F�d��>@PB�v�,)s��	k' ��v�R���2+y�Y4�
�9�����F}`�&k�d'��4	�t��G��S��A��X"6�I��(%�`�J �tN�����KJ����.U"V�5Iz��@�_@����A_T^����s\�T�����O�-����6�a�I��Wc	��_��B��V�����;+�m����f� G�?�Jvl

C�������^�������,ij5K�
�v�Wx���c�L(��*��}8����� K���#-*�A|XT�v&��H�n:��A�-�[I�����Y?��h���X�zn1Y�^
x��/�{A5���:L
-[�DQ��j�R���2�IZ��n�z����LsZ��>���+K*������ ��U�7(�R^H�� �>�c`Es���x#����?$��c.���e�wr%��5k���/J�X������}*T�JG�g��"���P�Y�Y��7W�������tb'������m%������Jy����������3��(#�z����f/04���Aj�$�F��U��F�\���Z�~3��Ho�T�7Z%_�����1^�9�yS�aE'�������3���[���f-^�e���o���OU�3,X�z�J�J��V�ZSK��-�,��\�^t�v�;!��5�S���^,z���4��+��WV���d�y�&�[�DG^%��FU���[>�Y�n;������w�|�������i�m\h�u�i��Pm?y�\�L�,����~�ygC����wo�����.�!ev;9���@�
���-�xF<2����6h"k�
���=�j)��L)�-x+�Y�0�2[���;Omq�m�(3�;Ft�W>]������3D�������&]��=��W�����k��S���������w@.�2������,��B8������T�UB���A<��V|3���3��9l�}����?��vr^��O>��m������l_&�^���Y������r���������_�{k{��`���z�����$������d��P_{�������a%�[�r�D�Ek�A��n��~��'��B��WU��&�v_�f���������&MO
p����s�����<r0��M`|,�(H���@����\�ub�������7�jGv
��������g9o�xw��24�����B����M�Ls�i���/��(�Q4��Z�-�'�����M07�=��U9sP���[3�-=h��M�
���G��:2!�R����������#
�=�/;������0ux��$&�{�R
U��$FNz��cw��C6�N�t�01�����mg-�E|�e�n�O+�k�	V�^���H���yPYCp��~�zO���Uc3*�bu�Yb-ip!�����t�cZ6�L��9z�7���R�b�
�f@F0�y
'I�Q�_�FJ�iA����(�����d/
��-�FF�Y8cS�Y��>�l����1�%Y�C��c��f:C��L}��b��a�'�19
����hU[G\�lC���j(k��]|�$�]�����!��T#��]�B�bb�2�)@k�U�F�R)(��1F��5��m W�2�[�fo����<�(�=����@�2G_�5%]��:8�a�y��l����K��^+f&���@�X�IB��g��(�bgz�e�bw���Sc��D���b�Q-:%db�"_���_PH=u�_�j�.�w����2/���S���	;�:���B$�����70��B,�|�0���>JbZ".��PF��KSo"�6)c[a�
I���o������7������(���zBcc.��R��p����0��Lc{���<�S+s�cq��@q���@���Tf���XC�������i�v��"^^C�>�!U��ZW�'WiT��*(�*	�����M�JE������5��L��
�vs�Q.7+��,����s�������6��9a�S�T�]n�ap��������)�<���:��oZ�I�����xN� �x4�G<��3ZE)2JS��4F���'����~W��G�Pl	���7�q.������`51�M?��\ M{�\����W���]��z�CB�D���
IU�M�Y�`��Q��W.?���T�@7<r�9~�<>��q�� �Aq���������A1e2����n2�hb��7�F�
��}�������E�� ��,��*�/���Q��C
�sm:�*��,��u���������������m\;��;�`��E����`^�����my���s4�*�5��m��6�`��.�����_�c�
�"������q���N�$��Ho��4m�*a-5������nMY�����K�vBCz����;���[�n�C�.U�d�(�(����6t�Zw�)��	��%{���^U�t�Ty�x��h��n6|�~�t�����w���`���>����s�|��{���?:���w�����I����������s�������8�����O/:X�������w.���c����#�����P�]��$���x�I������sx|�'�"��:W����}N�^\���`��j������������9�@@#����8�������u%s�������<?�i����x]��,�~F
�����������U����y�\\��?��\]��]�_�����;L������j�F�n���z�����:@�@�����C���&,��!���yGo�?�G?t�# ��#��vu���1~;�U:�������&(���L�m�td�c�o��B�����#��s��`]�O�����������IG�9�>:9���gW��E����(|\b>��.p�y�9�`�]����}�?�/����?��A�(��$�����j6�K��I4��w��8�?�?����s���9��e2"�9A���C�`��9����TM�x�u�(�����T���Gr�]F:�X�;��|w0_��m(d�|��gM�!E3L��S��������5b�;(����^z�XqDS��]���^�.2g"�����IK���,\����}���/nKW�D�t�NJ��7�������lk<m�+q���WV������vE�.�6���me����>^����N��n��M��>���N5os;1!��c�,��������?X
��6��u��11���g���cT��(2(��jb�I?�x7f�_���X���hk�0�����?�(g�V_T�4��K�z?+<s/W����-�Z�}����m�<�^<�AjO1���09p}x��G�xn/G�	Qz}��^��Z�T�"���K/���O<?��F7@<$�"I�/�����%]z�e�5���Fn�(��6jb��e(SK=q��M(��!0x��Z�1�h`��4��\��i�(�h-N4I�Wrzx����O-{�,{�������M���U~_-��^TTQ�Wj2X���Y>Ds#e!t?�w�l�Rz)��dm��%d�+�a���m~�"����m5<���z��rxJ��?���~xC�#}e�%�+y���R��[��+����*�<�U������FowP.��*���j���D�n�.�:5F������z\��:q'S5L%� ^�������$����<|A�K�� Wa���^��~�&������!����Qb�k	�D�����N�jI�(�9�u�����]O�,���������R�"{��vI��R(\z��$wM����C&�	��U?�<~�[��G{"��D����#UF�����A�/�[�J0�-�4�ne�n���1q)�(7�����h�}�,@�q�f%z�= ��FF�c|��~6_L��`��#�oJH�U�y4����+��Mm��A0��11������x���|��'a�C�_\/�������B���O��?_�2k�1.��n]4��]�V�F��y�i�.uP2�x���v;s���C`��9���
�?`��@��X:��?�����i]%b�	*�I�	�Ru�)������/�sM�n�.K�]�/�`�;�vP{��kg]$��z��d�.��84�5�g��#=������5q�^�fI��� y����It7Q@��#�Ww+�ZsW �1��gZ���e�SXe�4>��������%�y�W���u����#y��U��3L�!e���Y]�o"�(IW�n���a���P�z���&��J�?��C�iC�E2"r����w��+���Y��UT�#�~�2$"�:j)�������<���$z*��]y���n�����7kb���g�#R�qV��)�����`I�&5 �E��`����8P,��u����A��gr�2�������F���RM�,(Sj��� ��D�{>��B'��g���h/����������6���69����Cp
���[�'' ������^zY+���h��a�:Zh���F�wlS>������Lw����>`�)A�@���;��=:~���������I��%�R������Hkh���B��=��t���@�>2C�a9(c��	�Nq�V��:�_��tJ��0������0��|
dM!TX��(���]lF�����f�[<��Qi��?�0��H�:�~y����w:�L�/�qs�iND/}r�
i���m]�uD�t�(�u��p��AL~�R9HU0��V�D�'/�g�y{J���m����E�
�ssJ�-���N��9��6���}�������8�$�v�{�%��<��d�&�����e����[Q'�h0&����E��@gM@���DK�Gn�Z=�������J`�S���P�����1��s�\a��I�
j+q������~�?������e�!������.u�q��
{*�������������t\���f����S~KS�������:.�^�hw�s^�:%���f�F��D�aP�
:I��D�|��4)���
�$o�o��[+���E��E�����<�-���W�d�e����d"l:���6����=��'�W���u�T"n@o4�i_��Q#GJ2F���k�`~|^�F�p���rx�8x,���e@�����_~���a������D�oH��b4����y_�JQ�EYi�::��|t�e7��o��N4I��Y�Fb�(="�c��������1�m8>%���2��n�wr���W�18���n��0��)/��E
�tjGi� �
��|�����	�Uw�����{�{st8�_���~d4i1+x=X���DsF����_V�"�)��/��7���+J�u���:C_�������F���U�'��I�������9������������I5A	����1�>oZ9a�9@l��%�����Dfai�)�P�����y�D�qwz�5C�o�����,���/.0�|�O�B��������%+��_1n����aLJ�@%��>��@��q0���~T�t�����7�����0���V�6B����2X�gIX~�p�3e�h���g�]�R�e��w.�=��(a� ��S��L�~WC�0��eDY�t���_)G�+G��N\qZ�
�����������ST�#,R���S��{E������wI�xIC�Z��M����2�ro�zQm*D���� �Q5��*���D�ws����Jn��������nA&nh��#@��R���fZXP+�
i����q+D����6g����L!�'�~�	|��<���E�H���k���H� 
�Qwn�R���2
\�������ZdB��-B��g��~T|�j��A>�F�ap0��"���K"���S���*���OQ%*�d��|�,
��IEx5G�V����G��1]�����OA�9~1�I��<���`px���CQ�e8�=M�y��R�;��g����p����'���Gw����}���
x�e"����F���S�K�|����E,����(&H���TGIj9����4(pE������y�\X�������{� ��
*�N��e�"P�|�������$�;�w�������Y�=�(�X�@x���Dr�}s��Qq�������z����|
��#T*$'{�Ev��wQ�P�������nq�TD*�	l�"�.T���Ak�C��z(���g	oYS�n�Q��4���L��9"	�<����=6��&�`��Ov[[$�w7�1����_N���DK�O���E���R(�ak��[��^���IB�b�
E�(c�Q�O�}1������+�q�?x-@���
���N�����r��86�
�h��F'+5\b������IdD��������4�9|���d5@5����h���L��}4���q�{���������v,I4v�/5o��|w[,�o�
>/�t����Co�qt��&x3��q`X��[Q7��t��&W�`M>wO�oiD�Z��q������(~2X�����b���M
:��:/��8�Hd�t8A_�W$vq�Q�����\��G{s�	���Gln�"�w��F�i�ovT��DL�9���o���J]����i���1���!e�bI%}�$p�N��Ej7��t��c��_��t�Q��o��\���e= �A^�y�� ����A�U&QQ��8�-�]���7"�I�������O'��?j/W�i�q.���<�U������Y��\�����mv���QL�J]�����Y�][��Uj29oM��G�O����
�*Km:}mm��z��������gH�<�l�I��T���N/��Mg��6	[��VJ��Z����:����bPi)��1����3�f%] ��U_��AoM�?n��P�+�+x.���/b������������3��Y�K(W5����r��h�|	�oV+����5[�?]�E	�����gz4�/�_��SnT���|r���;1O[���	�8>�+�WL����������
��?��4
��T��:���Or�:�b�f'ybS���F���
3G�
���{���t��B)��u��p�������<��o4}�5-����408��e�����@�9��~U�*m�8���R�13�j�3����>�S�x�Z,L��7��K�ptU�z������F�P8��u�*^��fA��V+��G������]��v���o�z?��B�l�k$���?�TR*U'�ZF"�9�����Q��J\N��Z��Mo�>��g�em�c.�B�6
��?�@�-����6�s������n���<�tyD�������O�]7H5A�&��qFa	�x��������Q|��s�R��L\S�}�<�n������Zw���/$.&Ud�������9HWlZ��L����2>��-�����R�i+*3���T��YD����{���h�_/�i��Az�N��Rr��^mo�V.��v�9h�`y������_M(T�����f��@���,��=;?=R��%�Q��Y<��a�{��+�|q3���	V�}�8e.��
`u~dk���JmB`�$Z�2��E@��\����0�r������9F�~^�A�!��l�����YDn������o��\��0��(�D�nE���#R&t�xWKg�+[Pi�����@���,���w����������������a���������9�}���+���������\�!���6u1�e�]�u{x`V?��A�N8I�uj% �����LtR���kA���s8�Y��*�1N����^�,U�\F��Mr�\�<h�1�ubn���xt����m$�Jo��5@,��'c�NK��"
Q��\�������?l����]�Z�5�Z�(�j�U��es��Q�O~�w��kt��\Z�F���m��a�G���8
x�z
�E^����RO,m����f�DD���d��ar��9�~�$�������1w�>tr&����Ib��t���%k����oK[#�}�����o����U��+���#
��*���<���������(-7S7Pi���G�!��=U��G��i��M^^��c�='A�U�	�0c�G�<�2-c��Dk������I#oI�M=��{������k\c �>���(=�GV�\]>�/J�+Y�X$/Of�r��r
�Jspa��c"��o9�&A�b��v���s:���}J}f�[cs]��?���vl�
*�:���?����o�[��	[����%\��5��U�S�g��:��e�u������hDM�YU���R!\����w��|V��?�N}S�3�f�5s�m�K��uot��&�����r���I�m0V��FD��>����Y������0M3��0*j�Bk�Hf����t���0zS�J�I��*�������9�w:5�)y>	h�t4@G��6>�����D�������W���zF���VZ%�J����Z�\n
0����Ji����K1	��AiHTf�$�SH��/HDC��D,����$�R$���F�������CT����w���2�X��,���M�D�%�\�'"10tV}2()����#���S�_B����K\�DB*8|<��������wy�
j�H��n����L:r�D1�	i��s���Co�nn��,
���
�38OK��gGJ�7�pRh��U����E,%��p��vcc�_�f�%��m��K������/:�]�����+T������I�Q��U[,�y�K~K�=7�SB���i�Vzq95����0�_A�SD��**���*>�L�#�����������a~.?�D��[/!o�k���f3�S�����&u��^���2���di=���L
�?�4�=64�o*�/���9�aM=�9���L���.Y����(��/�p������)�jo1$W8�e�j��(3=��`�>��.,�hP--{Zk�0��W�~��.:����ck=�����
8<m�A�-�EU�{g*�s�ey�f�],6���jt��O�����D��:��!�������vy<��
C����$�
�)�&���P������r����j�|�&�����]��������^�r�S��i��@��/ � �#/�V���%��m8�������/q�P�*�������C����mG���Us>���9��9n���96�A�\4���%P@M�M�S�jjQS`]�a}3��0U����C��9
�����N�h@�z_��	����������	���������?���������\O��xM8��c4�
DEN�Fl�B6���n�����H�g���i��s����e�b����P�4��������?����	U�F�;?Y�������k��F������Pa��F��c<A�q2�'�\D��*�����a��$����`�9�,�
8���l����T ��f��-�E��oa��h(�N��W����h&����m�9�[��]Ai���M�]}��
"�;X)B%F��-��
oE���,H�{��=�u$.~k���w�Y�����,�
�WF�/.��c�f���Ew�5�'������3^����%kX=������i�����`|��9o��>��';S!6}yS��:��	<5��9O�X��V[-8���0�3����7gB^�������}j�L����Gg�������J�������\��]�������lp���vfCF����rx���$c�~1���[a�A"��'~�i��s����, ���P'��.]�%ERAc�/�[����#l"H���	n}���������^��������������F5��f�x�o@�w����(�����Ey�������o�p���4�,�*�����p4�3E-y!���^(�od�}�!����\o/v?����R�(a�����f�<�k
����J��������F���U�4��GL�A�������qk����{O�h�2����Q7E��g���!�� �gx�;EX������#����n��l���#��P��%���c��)L'���0��s����Fa�H�����;��Y����@!�l�} ��B��":�P�	�9
X�@jeX�k8G�'���a0�����PE��/)2�(!T8��v{�v��h�{���O�Ym��0�#oVK�����j�$�|FW�(.��D�n��c�u�X���z�p	�L\�s���T�g��_q�\���TfB��7I�g�@!��4�/�E��-y�2�x��P�d����	������>�D]���0u,�lpGzs��Y���tD���uq�������X��1R��N�}a���4D��C���[��Q0��$��b�K��I��������������$'%��h�������Q�DZ���<�Z=��_���*��<��.�����$�;b�?�3���A���(����#�&8�]��k �`�QFJ�(:����^T�F��QEe�K�j������[�A��{���~�R.�v���_�g����1]�3�q�7�T�����i��q�v$�X���K
o	�8�M��zc�
�g6�'W5q�G�1[v�����
6PL)r���	�	2����6

����{}L���X�-��Zv4~��A	�(���:���7���h�����:gq%��@f�����!8ml��g�z@x���0���H"������@�WI��a���Wx9g
��P��_S�YDt��l�6�n��V������v��}�w�����N��M$�
	�Q�_�?%�yf�ER��
�v=��t���Q�H�6�w)��Vi�8�����*��^x�d�Z��/]x�uw�E��\]�N0�b��?c���n��>�2�u�T�_|>��(�9F����f����V�n�����
�$�n���&?��'��k!�s+g0<>���&D����zA4�����y���;g�����o���@Fr<sM�_��?.O�����a8����� ��b�|!���l��L�2�B���g�.^�:���d�)Vm6�F�\�*�����[u�9�W�M�WE��(j�| ��K����+$�)%�����"��4%��$�(`\v�u.���hB���WZxp���V�V��R����H�P�E��������t�����,���S��O.��EB������Zp���.��z�S�}l�q�ue��Cm�����#��bw��Fd�S��uB����N�m0+UT	��-��[i�-�\VG�P�:�
Q�������L����a�O;�wXl�N���e��.����F���=���V�L���D��p
����y|j���8(D�X�pR2%d,����3L��}t�?c�����Z�����^b�^����y�q�lZ�������f��&B��rAZ~(�A�V��W|��/;|��)@�V�>�V�M��+wF1�<��4�jp
�jo#t�,����O���p�<���������`�"t�|�`s*UN�Y���ct?7\��l�t~��,�Y��!��3����Q�^(
R��yDMYP��0��*�EQt20�hwAW��V�6���T��Z-c���'�����m�4!��_ p�%����/�-i���,����	������r�(3PLt���%)��&������E�	�/����9X76��9�������'����Ukfae�m��z��$A���mdpB�}d�Dl�Z5��#�	�!J�*�	����:e
^iw�x�]p�9+��P.���#���]�^��G��x�#�<����{C�0���-�d��0��Q,/[k��K�=�r���2!�Q��3�Fe.�-f����w._|�?��\���-�g�G��x7b�EHP����*yf��m��''�Ej4�V�Z��*+67qxb��e��y.g8���znB���^?X���[�=��2D���
>V���5��/g8����zu@�R�44��/������
5(p��%���p����>Qd��qQ��_�l@�8u}JHg�"�_��;J�Kfg��f��.T�����T�\��(���fy?��������c����Ru�L�YMwg��vI�o?bR�[��������<f7��*m�6LV����~�\�~����3����Mf1r�"�	��g�{���i��c��f���6�E'-F)�'�+��dh5R����|�TA���l?�%���[8�RT�M�NW��B+��`��3���.=U�6Qbw�\�B�J&R=x��"��r�Oq*����O�ZT�R.Y	���;��E%�*@�jc�o��r����z�|bJ�O�Q�;
���.�go�?t���������8[%��Z��N�;pC��9T�@�M��]��s�V=���S�����������J����:�7W'p1���oa^/f���M�=��d}����o�qO�&����]��X�����-yk�����}���G��jz�o������u��4*��p�(`E�9.����N�!�x�W�Y8FA���{Y�u4�`���:k����z*��:}��b�\���f�[�4�T�9��-�H;����r��k
zy�����F�;�}I�Fw(���a3�ER%���>�T��������NY�S}�N��ur����3V�5�b���tyN�����a����T�M�s��L����lb���s�����C(�/�R.!4�����n��W���2���6VP��b��:��U�0��i+��{��,I�hrp�ye=rc�:�#_�
�\��.��]���8�����)�Qz�O����H�������f��%F
;r5�:�C�<��,L��������ITO�I�y�����!J���������z!��'�bWQM�?"�@%
�yz�!�d�������x�oi&�i�lXUtC�Z���B*�����u4)Z���=<~��z
��.���Z�z�8N&G%4�$�����&�_Q)y�c������=,l�P�R����W����+5�j��;�v��������R�P!������?����`�-���l).�������V\�a,7�!�u"�?�������}8:���?���b_�^hRb���
�����S�f���?���(t�g^(!
%��J�����
g��y�p�`i��/�`��aQ$*������:����m��x��B�s������IF�	h��Uk���3�7�A��� ��XV�������l1�7�&��`~g#b�H.<��}��|wJ���Mxu�b��*�E@���t���)�!��X�9�qs%���/Y�����5�ILe.E�T_c>����=�Lz=��C��e���"���Y���o�U�AeW�F�!�e��PXc�V60����6�2�+s���F)��_���KfJ������������%���������~�!%��x:��S/�t��/����|4��bB��.���Q�R�������7
�������)p1EQ��v������C����A2�p�[,6�*��kQ�25��A�������:W��1�Z������=�h�l(i��/�die+�0�yE���I�K���"B�!�'{�B3S��+����@�X���N���e<�WDU>�dy:�!Ot-A,?�?3���$@ce2G�0�Q���;��b�)l�6������R]�M��l�l�I	�p�~�U�����:�
2b����|��Rd�gd��+������K>�z>��%������CvXY���A?B$���	Qxm�����D[+@�Li�Ww��!�d�n0��w�!b���aP��>��������o��z�=Q;����E���CS[(�X����nc���v��ed[�m �yREd�T+��I�x*�y�eF�{0�8��@�V�bj����_FDY�=��>�x�6������N.���V��x�?�^��A�1���������s3�ci(�m%
ctB���Z��r���s�

�;/��qc��8��m���|�>m����,8?����-Jl�r��|�<�������)tC���[\/~O�����8���p�b�1
�|��8����dR���blA_���;���Z��$�l�����==�J�H0'�W,�8xl�B�3���C4�b.� ���9Q]V����Td7k����\�/Y����a0����>#OS����4���n�<M�?�S��lT�OJ��A�2���<�ne�"a���VI�I�(����,u��tQ�.[��&f|7S�x 	r���p��AD�A�Z�b
��`�D"�0{���$�=��<C2 _8��``�C[���+4&(��	y�!a X3rT����J8�b��f��9����0�)�������g�j826��v��������*�J}�p�;�;�c�������e��a���oh���j5����������Tk�Z�^kUP��j��W�jom�����y�L���[��7��
2��=X��1�y���p�
*��^>���^�_��k{�����E0���^������7�y	�3�5o���&���������>-��h��&0v`�7��W�{���k�*W/������S��T6/��{���l����W����H��d��������]��U����%���>�R�&~JfL:8Th�
Zy��
����9]
e_n�l�;��w,�2z�{�3&y���1U	�7E�/�m��D�NT�C�\�r�#�7�����L1��3��b$�nx	�t�X-z���=e�Pz�R�!�P�k������t�Q������d���B7e����vOUA��c4�<������MIt�_U�X��(����+���8�t��c�:�����1c�oL������T�����%�G|V4�a������1	���BI�C<���'8�4f��
��b��i����y�J��w�`�Y�Yt��$}����/xe��r���*���wR���c�|@�lk=Y��c)��6���Z���N��@�`b����~ ��7e�2v.D��g@�C]�(p�_b�p�'&�;����?��2������M�z��	s�G�� ^�&�����M�����	RJv������Z�$8
����q��K�P�tS�� D����$l��l-�$Y���,�t�8fx� g��r0 ��������'���FiZ��]���P8RM!`��v��-�(�B;�4����I��T�*9���XW��l�=�G�T�����b�$=�o���1�{#�=bPgL�`��]���^k/�6��M��^�Oc��q���
_2rS�Nx$�T����z���6��*&�m����JkL�O���s��:
�H{<T�bXO�Ip���cV`Q�3�E�L@2^�	�6�a$�-�'^���tN�-Qe �p�I�>����e&*��
8�E�(�B�1:RA$����/�	�
]L'�������5�6y'�m�����`U�5��p���y�0]��""e.�I��|@ %B?��:��EZ�]�3Dl����Gw�m�9u�/������{���k������Tl@��M}�\�rY�)�9<����Q��Mk5��0?>z�����J��|r�"����uN6���/���+��p:b���qE ����Z�M��Y�##�	���0��	6�O�W���7=�����#�&����*P1�_N{��h�WkZ���-pdE?��+����P���_P3�4�:��y�u��o�������v����+���v��7��^���g��|��-���^z��R����} ����3����)4(�������X�y����Z2�������'������3!���1'�s���~�#���:�����������zW�'hc���K�^��P�.�O����;�M���P6�{h
��l��<9��U����=�M6J<�9�4+��>)��c�,�
������U�R9�7�BQ�p#���q��2�������
vy������R��C~����_��]��"K���>���?�W������� a��k�`���g��-;|z�J�����o���r��g�&-k#�_�U���!� �mF�B���8��0�% �'A�d���3k�Uw�_j����c�2�+��u�X_T�0������w\��q(�phDA��2�De���U4c���4d���aN���,��%S�y����
>�:�A�8�c�,������kE?>E�/\���~0U�M���t����N�`����F]4@�R�w,�����f���������1*���(���V��+=�y!�h�DH��`���P��X���E8G_��n^JCcw?%%��PaFm�����x��8�N�- ��q�O���5ry�����5f#��e���'D�,�$u���9��S�����e)��O?z��(V��"��I{�(ghPE���%O^��{��=����?�Dp����[5*�dTx5�cI�E�x���#�p_2���F0c&���2w���A�	��n>��s���;���u�iX����$j����z�����I0p[u�[�T5��nw��N)�������n�n���p\��t�W�)!iiij��'��h���;ED	�i\S��2���PS�����]�-������g����$)|����>J���)f�y�-����Z��P���C�~X�`����~Br�0�L7-z�X��7$��:��$�s;5�J.��^�+��M
��O(s{��
]���a9�@���,G�~A�����(����	-�k��m-&P��C�A�%�D���Fh�~�*�N�0�����^uaI����[6K�}T�NN:��������d���]O��2
��bY=��>�����X�M;��{��� ������ 0]��`-[�X}�*%��R1.&{���^��d?�?��<9-���D�0fa��x�^{���E��nE���-<u6PAQ�n�$�=���7�)|��uANad��)�$����������PZy�sYIT���fPo���Z��{K��,ij�%)]�\���&U����M�DV��i��Qh�;	EMB��D{F�5~�S�EX��B��$������8N0�������F��L��7u4��������?�`{(�OE��J���5k���Y������3�=!�����"q� ��u�A�i�*���
LSkA	r�#��*�}�XN9��V��R:��L`:�u�x�����w��!$,��r�+��l�4v��mOp�9����-����1h.�'�7����O�d���DP�f�(�@���7���T�-���/�R���U�m��~���������,�U�w���e��d�M�|�o4Y�-T�<��
�������C&_i�-��zN�7���gKbz�E9�U+��D��T�%:���D�Ee�D^���f�$rqy�N����+g���>������=��P��`��a�����F��k�:����d���(�{���\��U�%�L�-�
��������]P��	k�$a��x����]���U#�%�G|��
�-�L������CGh��`�9{
�g�P�@8��U,���	�k�&A��3I������Cw�^`�u��Y���5��T��� ''%���#����D�����r���2� ����K�Z.x�� a~%�-����fo���v�9�6"�y�l����)$'��@�Gt�-`;���|[ho�s��w�vP.7��� +A~i�/]�������YZ�X���8��k��kKQ�EI�I�����t/�������[��!���`����������O]���9����~�8�?�?�'|rs�KVnbO����JA	��U�e�Z� ��:�{ �)`��}�ft��	F�
o�^"���q�m�Yih�{���y�1���1�g��]@a���-Z5�{����Z�D��p
�mH�C{Y��"+���R�?�����U����{A������qp��l���M��h%�S�H!w{�����Hlr�������9�e��]L8���m[*�u���
��[w���
Z�}��I�����]����xVl��%������Zk4�J�\���F��j��-���-"'��F@GQA>dY��?._:2(d��"�Z��N���a����4!D����V]����i��������J���o�5��yM:c���h�J��5� �e��IK��LW�������]�L�������+�D���&��]1�t{Iz���_��OX:�M���;>��#���x�%�������Bv��.�B�q�eH��z�|���2�sJ*���{�a��!�w���h�o����~��.VNu�{1���#�l�zF��X��s��������q�����Bw��S��+��������(FQ5�k�u������S�$�H]l
�#Z����W�0���:����qg��������f���o��F]!Q��qw>���?��
���dO�
���4���������r��d�����Ry�i/mL��i�����"�����������$�N�Qz2����iu���������7���x5-���c�t���a\/;��,�����+��MM��6��
��t���M�e��w�57D�����������Yq�����|�Xn�a��h����o�kY8=�
�]"�"�EI�Q���7q�os���))�������k_���Wnh���e�����]�?�]�U!�[J�����]�\�\�������I/m��iS��0��������qK�KV�4��JMS�)�����v��+���j#�R�Vdfk������Z!���
�I�m������c����8�H�z���~}��/��v#�d������A�2V�$����a	g�	j)���B��&�K��@�:Dd����,�+=���=�������NA�����@���V��m��2��������Fq�.����~\��Q�6���������J�^1�%g9����h���lg��,A�xdo��V�h��������;?��C#���n|R/���cTzm?���{����������	�s����|m�a�UXp@��y�_��������T���]����Z�G�O}\���8K�G@��'�����g��`��?/�N.��S������5<>}�tB_�������:�����E���Hc����C�(_��tv�9�o����=~@_gP�4�F�������P�X��:~�8���u�.��wg�0��8����k�����\�dx���d����\���N���f������7��xstE���g����>}��~�~����#�n�SC�V5 �#����t_�x�W6j�P�������19������������g�g�{�������������2s��(_8,��~��a����/��h.�����2���g����I��.Y��
#~+�W�^�W!������F]����o_���q���������q�,1A���A�!�N����NXb���K(�F����r�]i�����{8m���]LA?���P%L��e6���!��a7.XP+��u�j��/G��=�*:����Ub���V�9m��5bE��p�'W���$|��)Xy��g������Q���w�0b���*������'���
����Dw�hO�B0��i/����rt�a����{pz|���{�y���w�)�:����-q�A��f& o"BbL�����4gz�F1!����5j�b��VX���$��@I���K���a��Z+jif��������j�[��ev��.��#M����t�q�KX�*������J��BS.Ku���`|����Y\�O�5���Ux~�r4a8[����k�3yf)�}����:!>�5�#i�'�M�`�T��W����R�L}*-��>��>U��W����BL=`Q�_P��:o���������KD������2BM��?Zp!�U@�.q%�n%MM��(!{�u��I�H_>
IM6
�wvV<�_��|~�f�_���hA8�B����ry����I���	����F�j���>kO����)f	�)04��i���$�S���p7w�� ����Vyg�r���[���Fq5�k��?wVhY����/��fYv����R�4��+
������������>JFfW��-6"1c�[���#wR%1gE�aq���/:�*+�*+��< �b����H���@!�r���%g�6m|fL@r�'���C�H�`����u�`����3�b��~X�i���z%����VM�	 ����]X_�cN�A-��dxZr� ��`��������6��m������su���M�^.7��V?X��5�B^l���y��G5+)z
E3�~|���*���UA&����H5�����
��	M/�s��:��
�f3��\�}���/�&OR���a��$r���x^�Csps��>+��u�+�h
��3�U�Ak�\�Wz��^u����n�;XU��N�/���>�O����������MLxwty;�13������t`�LvI��Kbu��]� ����)zO��*�Xng��/j����U���23����r;h��6\����$�j��<
���`�?j{+�G�q��lU������G���?��`�L���P�!A,|!��T�_�#�Uvk��-�+��,�V,<^,��
�7��=1�G����U3������p~s(�3C/���O��
"	��m���p!��By�:�n!�|������ F�=Q�|Q
%��l�/gh��z�	#�8��#����C�����0(:
�s�y��D�
�cMI(��34��2HPW	��p���k����Q������w��K�+���l�a$��G�9�66D�����Ts����#�#+y�J��9=��*B7�����++6��`�jW;�x�������a�\�t���%Q}��
����,n_����h2�X3����?�l�l�[#E7A�b4��S�R�l��.�2c�l�-��Hj��d��b���e)���]����y�����Z$���,�k��r�������������~���+���4�A�0���!��"d�n7I7K���1�wq���	��(��uv]�/��:���K|���-�L���k�\��QHFHv�dh[.h��-���|iM*�Jce����y�S�H����
���"�G�<������v[����9�Q��f�����+���V�������Z��l�b���v��j7�&��G�����������Z}Ym���h`�"Q's2^�C�?yL�������0 HE��1�mQZ�������f2�K����|�"&�=[��6���$1��(?�g�������������Y�M��#��#d���Hh��QA�DZ�X=L`������&�ug�����TIN���"H��y0�<i�g�0�g<f���L��:�x����;8�o����B�p���%������w:q�t1��"��bY�y��+)���}(�o�wZ���5,&��
V"���)�W����^���Z�S������u��s��z2�'Q��tf:�k��B������5">3V:V���^;5=^
�~�z�rSW^c��B%1l���hZ���1�T�&���;�1����"���`x��������z�To�y
e{���W<�M3'�69�]��Y7��of�/ko�	G�u�$@+��)������N��T���/z1�3&����Iu����|��5�����R�pE� ��1������;��
k�6��U'��^�7��-<��~�4�53���qYeDzof�8�F�`��k=�������=�����\���W\�V�[E���
��M����X�)=����F6���HSzV+*kJ���N���ul I�����
d�
��7j�cm"��9�������d~�j��J��&������@��[�N�5��G7e�O�X�	{HS+���5��O�T���Z��u���Z�amyy/�W{��lj�A���~��j��e�X��D���*���Vcf�$��\��N.O���Z�WK^�V�>�_u.
U��Z+��w���jDoz�3��s���|GbuS0g��5�v�Prk�;�\�C?@����W�*��>����0�2\5/;?^B��`A_<V����[l]@3��K�/7�/�_��o��7��[�����{�E����M��
��P��P��P��P��{����f�����'a���m5i���vy�L��)Z9w�^�������Q�����m`VS�aC��K9��Y4R�9kfZ���
���=m�==��7!���a�rB�/pO]�%3o�9� ��lD?h�Z{�r��6[{�56bfkK�`fy��lR`3~�@t�y���\�r!��
^�R�$b��_�������y�����<?�\^��`x��W��>��\b�����CT��\\��
�����]����}��dV�rn�4������j�r�����WM�Jk�.�����"��(����v��r���k~���� �}��2
|A�H�����j����M1+R��UO5/�t<#��4��<x�q�U���D� _kX)��2.���Q(��'�Y���L�?�$������e7������;�N:��pY������T�'����K���4��{s~���-��h�Ct/�No�s��y�%xT5kT�.��/�$>w����_tEjKV��y��_|��v�E���a����������r��*�9�������5Q���E�@S��7Q�{���u�WEw�+��,��9����M���������O�3�7�6��+g������g��)_e��gksC�B�{�����Fe�>~���*�C~kL�V&k�7m����f��i}M�^�r�^_���5�����E�c��7����������eUr��gd���KE}�h��o(��q
��f.���6����xs����;o���E���~�x��wGX�n��g@���>{;���M;���Ma���H�U{�p7���~=y�R�����!�����u��es�j��J���z��$��``�9t�nn����0�B~������OZR�b
����!k���D�����gyo�`~$��b�6���z�a��D��)x��9���%�de�g���O���������
����zD��s�����u�1�[��L&;J�S��m��l���z�6hi��-�2������SrVz�
?���j��&����+;�$�~�"J�#�o��d>���m��l�b�Sne������u50�����T���<��@����Yp}
V�jO���Zm�]K=3�^}�3ru��	���	��l���_bP�Q�/��Y���H���Y��X����^/������/f����p��A���r���.%�Ry��9������ ��AK�����dQ�'(Y�c!�/�2�y�"�T����p�Y����+!s�6�P�AH7���)c���[n��w��xG����(�w>t����
��-Q�ny�x
M����S��B��>���K�J�I^���W�� �v���v3��+��_��|������[8C5�e4	4�����iI[��}x)(v�8��b���1�aG�S2m("T�AQ��7�-q�Zx3o�h�u������+}�t}=��\�u�ds������$�n�f���<�M�Z�#:���������:��382�������o�2�<6�.����~k[<e�����
s�z/�P���'S>J]j�>�"���B}	d!�9!An�����M�B]�����W�5���#nSU-��j�������,['��R���rf��6Q���y5�z�"�j���-�y,_��������=��S
EL����� �(����~Q�8s#�����P� N�4j�:X������'M�KO����������4��I��{�IsJD��p2����	��#��P�	B��p�UY	9*���$���w$(jg�D������*$O8P��	���kQ��?F��wcH����'�xD*E��]/��W����)�+���G�f����I���+@#7����L�c��9�	Z��}"�����?fE�';c�/�MD��1f~���-.���T���7�;������������V1#�B�d�s��S���)/N�+��g��P"����F�61�8"z
".bb:�)��~G����8������`c����*CPz�}D�����N8��AH�6�q�J��_��%���,|���;��O��9�,^t9$}t��'�B��+(�IH	|&Hh���4�*�����f�1�$)q��YT]��w�)3�-�g���4cL����l@��I���\�T
����G���'�~�W�yg��p���W�z�>��������1C���L����X�#
K���X��L������	���J�!��u
�`�i�yI	�v`+V��hV�E�����Z�`�������}����3�#������>�����}���W���Y`l*&�.�:P�W�~��/�2��hxg�G�������<�1��1�a��������z�i���\����C���K�a�lL�P��p
��YqO����=�_������A7-�gZ��oIOy�����	Kn�5���
�
O���|2��l�����mt����3���xd�h����W51�<V�������U(md�S�	$����$�����Ds#%ju�����c�%��O�����E/�uw�%JS"��n._xoY���Wo�{�4"�������j��������1:�_P���,��vU�W�`����N"?��"D���i,t�I��$��������P���=bq�^	�C�
w3.97�_\���C�a��b�����5�Y�Z�9�����8��.����*B+9�-\UbjW�Q�qX�:"�l����t{��
����i���t�[4���j����pb7�O w��*9,�m�2�d���
�����f �z�1O��B���ip��_)��x�������I���c~�?h�H�x��P�;���%�'�������\��E4."��Ec3c��{�D0S���7��+$����"�"=�S���^���7��g��8x��^'=�7!Z�^z������{����h�Y��H�1��C1�.����5��Q���p���=3���*�5�&���\��^T���jk��m�?����m�Bx��Z���lh���4��[�#8��/q�n�������k����*��s���O���^z��
��>�J\V6��Mb}}TX��:8s������hg�U�v���o����K�9������&��jc�[u���_�}��'Q���'��4��:k�\��Z4����+����D�>x���f
Sg�>L����:�s����:6�,��c8���xM�������5{B����8]�<��5;u^��gT������Sl�A(`�>	bh+�1�����Q*A�������ci��G����}|t���/�=�3_.��z�����wp��7=C�{�wC��,p�O�k/\I������A����YWf�1�����k��1�h��&����~�_�r�`�g>�	�nrU��'���8�x�_hq�h�Tz�f�A(���&K�]Cs�N�����c}m�~<���=��[����`����9��x��'�_.�����1/��f]����	������6�y�_����p��0��c�1��+_�.!�������o����������W��D��na�I��������f�>T"�P%�5��5_e��k�}`��&O�����Zg�i�}��|�x�����J�CtO�����~��U�[����<�������_�W�"x#}��*������W���^l�/r-��	��1��+_T�����2)�VD����//�f���yb�����aY�n�HK-�7���x
W
��\����C����g�8��3m�������V#[�,�G)1����+>�
�\��)~�S���k�	=��~yV���U��+���L!��<-��S�_x�~��7�3�SIA���"�Y��o��x_�c�W���+�u����;�Pd;�-&����~�k����(b4�?I��z��c��W�2h�:	�sf��_��<��~%�b��Mv��bF���c���&B �*-���6�Vg�
������V���Z[�r�\Z�p����Ag�(���4P�/O�@�8��.x63A<�]�=����S���{���%���l����;����|h�1��}��c���
-�s,�<�y���g��o�b�qO 
L���h_��`�H+c���	�
]m�l�l?`������{A�����5�L�����T(/r��>�?n�Q\��f.	����


���$�y1�0�j1���������m[������`c���/	�1E�|�G�p��d���A��!�X\V��0]#n�hxc���
5,����k�u�=�p0R��G�8��hh�N���&p�\�	����@6�Q�r\�hH]���+Op��\��y��z�te=�:n���8uqB��n�~v�O�7 z����s��Z��
��UO�p�U����\�1T���{u�W��6V�|��4��g%�*�m7���w�������p��r��#��>�`������0���ZnWy�{
db���,^��D)XY�,rxi��_<7.����9��6�T��g�I��}o,��Y�7�hG��N�ro�+s<��fU$a���h����������|���Yp����$���b���L`��Q� ���h8��`����T���)�j`OD�zNI���k��\�}1	&!E�����O��=}/��|��y��J�������R��
�v�J@w��l{�r�Z���z9���[��(N9|[�������`������J����6@�'����}�u�P�O8z�i�lt�X:U,����S b����Um�N��'G����o.�E��"��.����?���T}����xP�M����@_%o~���Y@�!�UG��[�KWmeu�-t����'�j��l���,
P��;Y�z"�
�����
����1��[������v)},|T�V�X����������b673��{�5K�z��[w���o4i:	s+�A-�5�j��}z|���5`�������dZPcj<�5�aq�����;�|8���I��b2���%x��S��&�5��l1Z�E�R�����^��/���^o���cI;��)I�8�5��L����e��M RVw]��xD�	�����Q/�0���C���k����WU1�o<j���G�4�|��Y��N��)���6���+x5x6��[~hT�M��}e�W���G�Mb$\��}w��Y���O5T�f�Uj�,���6<\�����+c��(�t�c�UO�-|��,�O��$�Ij��\3�A+����v�W���,3��5�O�lq�,�U����_�����k����jVP��Z*D`�e�����8��CX����Uv	)U�n�
��+9����^��1"mhh#BX���n%�G�TXa�	���t�.�iw�j���9�}�T��Fq���6F]�~������w����d��3��V�����
&�d�g
X��S��<:s��}��W��m3��W�*�e�1\�o��x
����X�*�_��\���K�~����m��kN�6��hpu�e���7x�W�e�Z~�,66+/��AV���)G���*+�3kl�:�B�y��w������Y��q�+�3���D���pw.��v����+��m�����x6�m<
�������*��D���?r�\K�I���j�%P�.�Z0V�
�x��r.D�������n��U65F|F#?a�6y�����B��j�yo$1A��7 �2K��E�X�-�����u�n�W3���V����q>�]Z{�/�QC���D��m/��v�'#<�����)|�-s�fq�z24�gB{n�������X[��t�W����l�J���X���uh+���-
������Y�;��i@.���0��}��A���
u=L������v���"1/�����.�
��'��5�R\��;�����l�E�.(|tX���AP.W��v���G��V�Q�0�(v�����4�:?�|>X���]����F�
�����U�<��>n�]���*������
������h8���K��bR�8�K���N/S}�*����<����r%Z�n8	���\��~E^�;\L���w���:?�P?{��'o���v��hz�m����6Z���]��|T8�oN�����;��:z�9��:?v���������&r�{}��N�Qt��xN�.{������[,���H���������aoc�}s�^U{���}lNx���w�C��m�6�T�?[,
4.�A�EK����?�h��4d%�P�H�����JD��d�����zF��DMDB��|J�G�[���������A8�3W<V�BE�Y�Q0x�	�k�2J,x��2��d�^Z���%����?�}���+��U��S%���R������Ph��E��v��__���B��$�<�=I�|�y!�� ��g(������{�
#���a��V+��7B�D������({�wx~�4|�5&���O�;`���is{�W7��	������>,�����"5��eZ��_�����Yjse0w/�����%��n�Z�{���F��&��+d�_C��ue00����J�I������� �����C0��Xo��0���^�k����u�'����\�LZ��G����2���S�L����������7�����^pN�F8�
�o�@�p���>�$L��%T hL�����LfA��B4_z�������s}Z]��R/�v�`;���]cPr/i�^�9�O`x}3�z�������W}e?����A�##�h�����t��A@s��'�|�����'��
W��opI�F���ril�[�$%7��s������ ��	���H��E�d������J���D�����h�5�Y�%v:{�
�K�R�����U��n���jAJ�:��~rt�N��m
�P'E�d��Z�����3J�G\+��fY9���-��:,ek��U�U��h�p
�%�%k�M���g�$XO
m��Kw�E���=	0f��r�}�h����a��E�L�����e��������f�{Y��y�lblrXs�]ak� )0���&L��?�J�J���Hr��E�L����aWY���4����5�q�w�&�]Ck�^��/l`��/Fr��j4��B����d����L�Kj.��X�����s,3K����$���`T�i���(Tf�*���T�
e��{s��4�_���~}��s�,���kZ1��@��V32��Mc��o�VZ������v��id�����U���UR��{�������6�2CT8���iSi�7Y��9N��5�E��[�7!��-������=�8��4�*HW��Y����C��q�b�e��9�S������J/�Npu�y���������$�_�
>�Z�0X����b&�W��:�G��������W�O����J����=m/��Zg�ON���z�?�v}u��=���jm�Wi<h��o����6vK
o�>j��.�}K�0v������B��Db]�j�<��K��tM�lz:'��j��������_,�����:�����$|<^���"�_OH�i���6��Kw�Y�nn+�@*�@�w@�������N�B��U�Y*��%�!�Vv�v����S��f��[wg�+���-BX_V���-��_|G!n^�������Y�1���������O�h�,*�v��������3����z0�_-������f��AT[ C��G34�E���A�x�G����~r\4���;?]\^�����+���WS�gY���Wy������u�^~��=������zI����:�����R*P���h�W�����V=����-�fVI� �{�����^F�=�v�4�����!��# Y����)?]���}�;���I��B�;zI�!~�Gr�F��g�5����8�$���
����\���$q���>����E������1�,���Tf����^�������[��MoSb�?��4��QG'o�]w�����S�����O��}�78 �}�[?�c���O@�t�w�d�L����W���Ps����,L[���z�
0T,�.q8v�Hp���U*'���f�2d���M('2t8Yf��j'���=��s�)Tw�j�_�t��S�������t�=�P�������$�T�N)g�U'�'U���rZ���u
�]{i)�G#�$�����
��I��c����)@G5��	,/�:}z�W�������d��H�5��?��Nx��9�M��b-�X)��I�o���w|��z��Q�lS��C����;w����x�>Y���>r���3�'qM����k����y<
>������z��c������?��b��
��m&F s�Iq����k����}#�7A�+�g��GZ?D<�L!���R4�l7���.��N��z�P@���!��W��t1aTaq9��~�%���U*����7l�������������Z��!�<��s�5|0<�=C,vw/�?����E���L�han�������e1��J�)g��6�a���bN.���"~�SI������R/����:���v{U��z}�o���S��~Y�7`���3d\8	%%��>q�����d�f�����!��l��p8����2|��U�A������
�!�j	$�m�d����=C�����������{'{C
�94FOq��<���^hW��P�M��)"+���3������DE��E76F
�z��Ow�q9T���	�H�$�g�f���Pp��r�z�wT�����7-����;���������Tr�R�'R��0?��z~���[F'�4�u�$������N��n�v�45��-n�%Z����p�>���{5�.�AM�3��?�P�Q7�g����,UHh�]�
zA��[k
z��
�n&�q�2��{qH%Vx	U4�h��f�(��G%���2�Y��?	��^4���M�wgHa��ZSt��VP��������Vke��U�D�;Vw�I��x��K�DqZ�W
�G��%��#V��4��J������K6��^�b$P!���ZjU�[��~���W0��H�X�p��9�.�9	����#��%�{�W.���AkP�Ux1n_��~�d�t��^)U�m+�\�5z\�G�����O����^�
3�B�	5[E��/�v4Z+}����vz��:@���T�G1)��E��c	<8��s3��?�2� �a,����C������gao��I��	���p
�������~����o^K�y~C$�b���H, J����}sG��W5��J��_�h��x�Gg�R��5|���z:���xp���d�A������)����A����G��Y�C���1�1����rA�WIU� �^n��L"�����8�C�j?�������4?%�WX
t'��X2{��BX���	��W�)U���=��W������S&�]�g�����4�Y�e)���&�����_��'���n�O��|���4����~������U�&?YZ��71��S���������e�]���������]��]m�]����s����%�\#��o,���sO��rO�_���L����l��F�s���A>>������*9!�������d�|�^u��d��g,��e,�:9�n�\b�wK�
������^��l��U�v���%)��M����U��N8����<�G��5>�IN�g|!���Vn��T�&}�Z)���7�d�g������D�����[��t��T���F�\��w��U)b�&�p-Si��G�\��~x��g���,|�����'� �Z���
\���n�JG��:+���L������Q��u�+��n��u���~�4t���m��i��_.��j6oRn-a�N!�S��[�
j��n���H�n3KX�[�����m]-�*&f��Ka��2��:���������~��`������Y_')�[R�oZ�#�2�};�k�z�\���Fmc��%��)G7��%���	��2S��sE��-��Q�H��]��bK���<��)��'y����&1��;���5��,OT�)����+�~��C_);�����^�hT$+�n���T�j�V�W���W�����|����7�����|��S���|�;x��;��?Ub���(oK~O�%��'������$��o��2C,���r��^�D�_r��(*��V�����rco0h�+c�s[r��*N��M��|����&&c���7&��z��3�7)�fd�Z	��r�B��r2�y����}��R�5�?XI��E��n�Z������n��
�%�`-
4a�6h�[�YWQ����������E�'f^������V��sv�,<�,f�����������1&�����@��](��
������M�������/2��`�)�:�`�6_r��r�w��z����{���tK]���6��G��v��+��J������.���*�����o������5b�:��X��]�$����0��P����j�]�nn����?��4w�$kg�x ���a4����)���������+O�?`�>*�V?�������vk��Tk�Z�^kUP~h5���|�w��x��<�?�����z���Ug�z���5���js�Qi�M�c�k6���_o[�A�V������^u��T^�����&6��;P��6��o�k��az��7�,��(��n1`^z�Z����P���������j����V*���_��~���l�����|����H�sH�t���@�r���Q��$��nnM��-�h�����������{7���;	���������@f*�WC�����K��8����3�p��������6a p��~W-1�
A�@�M���_F�m@�
���(aA���I`�(�����`2x���A��������{�h��T��jA��Q�)�������-{�r��C����J����3 ����?�;�T��M��P&N��}xX����4~�&��g��'}(X?�{�v��D�Xb�b������:�<�Ux2�K�%}�a�`	7������x<G�9�7�k�
����W��r�be8�nB
D���#cL�x� ���$�^e �2%��������m`�\���R���p0�D�9�����(7<@;�$������ac^BS=?�H�>�C���='������ �#�O���`�1:=M��1����G��������rKG:5��c��`�p�>�/�i�������0�2z(Lo�cZ��@�hk��%�nm(�K<���'^C��T�j�L��6H6��]N���1��;���j�� �����,�ud���r��,DQ
�'�khT8��2hO&���7��`JX�����n�Yl];?���&5��w�����3����j���f� ����W�RcG2�����q���mm���@'1Q7p�����d
2b?�����pH(�<�p��@e� E�u{��>��;���b�9����a��:`u����|�KS�?�T9�Z�
��D\z��^��[�g�0�7P���9F�����`gxh���6f4�e?Dzb�yT�.�z�qwG�-�X� �m���3��G��.�����Y�n`�����(�[�n�������9�qTp��4��m��(C���Y���i4��_e�����fN�>���O���p��yx�JS�z�2��/�vK�uhV��+��X�@)����KP��=!8���L�f�
���}�����h���8����Ld@$��p1��<y�����V_��I"��%^���D~�w�o�4dt��fN1���|�������,E;P26��nJ�3�01aH?�#s^��mB�%`��,�@Z��t�pw���1K�J>��/�n��t�'�������z�wp�"�[Pt(�)���z�pI����I���Vh�����9���q��
Eya>4qR��a<V�3���P@|_\�
�c�!CF;n$����b�� ��:�4[���Q+~�b�w�Z�dMR�
��"3Cf!�;����7g0����?�D�7��u*&tY(���pJ8�Je���@\_#�*�g�/�"�������J���Y4���c�i:`��8��������,#�7�9�n�+bB��,� 4I�y @(����z����E������U��"�8��"�Vb���+�8�6�E���5�2�)/�%�3��M���pp�)Mi�Go�E	��(J��t���f�	�p��!�w�����Ar6S�cwjb��q��o��fv��t��\W�T��j�Q����T	�[��3�#���{����n����7{��_V����_��[��n��W�������%����H�S��l�_V9���l][���@�h����D�:����3�!C��KZ�
����4�s�8|b��fa��Tx��
��vd��:�����j[����)n@��Mk$�-o��R
�� UM�J�77��e.������[w�69����Q����������
���R���V8�/�&����/���K����J�����$�Oj�*����]�������>(��^(
�M��(t���R*<��.f�u�LF
w���8"P/�-�7���#89��#4D���rA����%�H��{�7t4�N���C�������7��2�@s���69T���&O����Q��({�j���y}}������T��hdZ|�{hu��'��	�EN��7�7y��kkY�Ou���J`9hd���H��FPB�����j%a$g(�JOsER�0�"��h��������n�h��R����}��y�"JG�o���fF^�[��>wFv�nF7�Uzj �o����Y�{�4@����|��P���l�7�������a��������e�p3���&�O���������Y��b��E?PD|�;���80����m��o���$v�R����Br�0��z����@��S4����qS�#g���3a��#�I�yO����l���~��X3�%G^��Lt5�_���H�&�M������������������D$����$ew|=�Fe��B����ju��N�p�#�H�T�V��d��~?�(���S����>j��� �f8�S���y���y!��HM��`���KX�J�t��[K�{s�o./���X]�g<�OjF�o�i���5�V�vRk���e�293���)q��������q$����������6���Pl�V�r��I`�����C��&��_����I�1��D�8�����z|�Uil�:p�F�	9-/��?��Y�X+�������<��9%uk�������R�x��6����V�w�= �r?�1\+s^�0Y��7�NN��+o~���(���z�%p�����4y��a5����b�������;6��p���%�(.������
�s�x$e�gj<u�0�%�QF�S!U�J����#
H���b���:���$���v�{��rK�6@*�y�X�p��Z�K���m�n�?���Y�}�4M���L�yS�������Yq��B7�G�)�.����5���i
!�����?Y,�g����k��6�0��b�����ma�oY���^���m�A��-�5���p&?,�����S�i�.q�o�+������
���<6�*�A6/�HVH)5w�t�S�~��Mq��m9l�i5�V?����*���H�F���E>���OF
�/���I�L�����W_V�����@�����_Z*��'�����G��L!O��c���l�k�H�������f�O~3=A�`��I���)�j���1k;���;X�h���]������2�`�e������T�`&��5(�fX�|<Q+�q4n1��/���A�z��8�\i���g��yq����������{m&[�����k>�L�P���o��P��{����	�Z;l�N2�6�6�$�(�=��[�����!�����:0����6�0�z3G���?r��(as�*��b��4~�g\Bz*�ug���s�E�� 3��L�$k��L� �L4F�
���l~r�b1�~���Wh�-�u��gR����A�K�d��][K�_����r��`����,�A p�%M���q�7s�������S��ct3���/
��
�a��r{]�^BdDyw��}�����h�G�G��'�p_"�N��m�%	P���Ah]�OD{�{&j�JBU��oH��kE�Q�� iCa3�q�Y�v�:�f�V�� o�0��;���"
�w�'��������������F}�W0,��N��~�i�,���<l�B]�[[�t����l�&i����H �%���o����������}y�����M�q�6���n�qNvyh	
)]<�),<j0f���)4L�p%z�|F��
����M@%\����tNQs)PB(�lAw�c9
G>c��V�P���}j
�����&�]�g���S��t?Aj�w��g 4���*�I���[2}2p�g u�"����e<������%d����XUK?QN����w	G:�����������2r:����>j��#�\;E���m:)j1V�P��������j(�luL�s�{b�?7nI]��w�{Q7B�	�'J1*s�����^�����z�����\�������*�������|@H��|�c�H5�2�"I|�3�NW������5R�t6����F�ZW��Ve���#���!:���@�i�jS�r<�C��C�E2
K�kiy����f3<��M����-(�P���9yd�����=D�8����X�/�Q��2j�$g���3~iA��)��A���[F�
J�;sP��J
M�����\c	�{lNY��uu�U��2X]=��V�����C��w�_���b�����z���h*&�[�^���:��5��gt��!M��I}�CZW[��^���&�����4�:���K������z�S�Y���=�u<owT�)����bFN�������g-
i�6'�������V�?�N!��E-
���L������������OGo^�I�������'��:k��q�S�t��1E���v'[Xe����B�WiJ1���|WT'�s�E���2/�		�OX��Q��C�l�S;W�E����(c�ID��S��)O:"A��0}>�����������_F��{?�0h�"�2�^R(����;g-�d�|v������G�q���_���EcgkD���?���q<;<>?b3������C������WG���B�.B8?:~��������X�]eWW���!�?����+����M�o�BD,r���.�	K7+�[x�4e� �T���Ii��'t�����%��v�Mj��u�Y���ys��rRGl'�f�@	O
���9������jjOR��)�NL��� _%E�����I�R�T����v�,��p�����i`-��dn9
�R�\�yJ�p����u��\� I��^�	q��~�/��\py��,���@�W��_f5����$��!�<--�s�P>C��1�������~�9�LG��c��D�Y]�( �C�� |=�����{��������r�T'��o����S���b>c�QE2��3�N^���GP�q�����dk 81�����@�Y��;�F��/d�Eg����@HX���O)���+�]P]��$
Awn	�S��y��1rn@����#>����u�I>g�I��}B_=@�E+����N������u����e���x�K\�[`<�X��#N6G-[����mP!raX���X�Y�y/q��y�������7oO~s~���+��B��.����!,�)@����?&u�/g6���cMq����9�q�M
h��$�l��]hT6���h��CY;R/=�����T���/8&���>�d������fg�� [���|Yc���r��Df6��3��Ziv{�
�%b:br�vn��\m���Gu����N{X�d"-�>���O7�v��G[��V�k�mz��hwvv���~o�5��|�������m2�olc�H���R���gN����9l��w�fYj3�k��s�I8�����U���>"�1�u���W���Js��<�{_��+��(c{�K�������`��'�xq����Q� ��i���u5�|d�������-�J��$>6��8�����}�l=t��o��b��`�E�?���F#�&{��`}s��a�i� �B<��,�<	v��������'�����s��C����_�|z������������zu��]A�����%�I�z\Y�l����?�������z���M����`4D��C����m:�'�����?=��r�I>PxK��N��G�?�Mc�?|g<���������)�$��i>���V��SJ��9����N>��q]����[��6�-��9�����m�X8r�*6�����F���v�dow{�}c��9�R�;x����v�)�A���/?��v����x�1��p��R�u�� ��-p�\$��%�i��rN�
��Q)L2&��k�11.pK�l,�j)l�T��s
x����s�������3�Wa�)�uz������;9:P����i%��t���@R��JL��H�"�����if>��yA�5���;���3�&;����6�}m+���_���'��w?���8���T�I]�	�
D�����
|�	~�cP�c|F�����U�xJ����PS��]�_�\�q��/p�yo�w+������p+5���
�v�R�M�q��[kx��IbQ�`q��'9���$���
����C�{Q����hd�i��M)u��MKI������C�?�X�a��Q;V���.�W:��Mt�}�ahcwK�����m�>@tc����������Z-���Z�c^��g_���"-J�CZ~O}C��k������9��J�-��(jo��G��Q�+bH��nvd=�^e�z��#�Kv�����G#@b�3[$���J���<�D%9������P�������kN���X�Y>����8���~\$�lqy#;PFI�n���h�i$FS���uz��J�t��ss�|G��E�wJ�����"����X���.��3~���I|��R})������|
�F�H��r`@�i1��C-�V/��Oo>�U]V�Xo��	O�|�D��w`)/V�������;=n����R�������B�V!p�������{w{�a���/A/���;�`@���h�~���68(��m���Q����i%��h����6'���C��
4(Y�Jr�t�M�{DH����+H�>:;z��������������V%�����>D�6��k���}��u/-����/=�
|��B;����H��:��O��c��V�m)������Q�7	����z��K31f4(�Q�l���&�����^�����}� m�������m����*���J�{"���?�k��/Y�?����yI�X������{�8��1k���jK��y����#��,��zqu����j��t
u�P�vjf���k����Y~�f=%������������$4��v���"�ah%@3L:)&�ch�a����`����
�$���9�n@GQp#y��vI���-o��gE�&��6�hh������d�D$L1��&��P��0�cT�-Osm��5w{2�����k	Hvm�"���s�4j]���t��m::��~
�!�� ��R(8Uv,9��1n�/���Z��Y:������"�:Q.H�mx-"��.12]�k��\���Pvz��(R������bx������.@$�{��K��';X b�_YQ:��{c*��Z�3��gc]�h��p�d�
w��#��K�c��!m��
��h�����_�[l�;�>�M�N7�Y�q�#JU��4�inA��g��q��������C��p��E��y-��3�"}0R-c�����M}��"�b�)�5S=�m�e�7By���-��By��m����Z�]fb3�:�xGzY�6{v������^ HQ���Tp����M�	�%�F�u�v��d+�I�iVMy>�l�j����'��W��%:	��a4���M�R�3p1)T����m�{����6c�q�c`q�pM;��)i���wr��F��a{�^�}#���3�N#HA��>M�����ImD�Z��[oH`�#�x�gT.-��S������f�#�_����QHR�%��f����(%���Z#���$�>��%�yF������������F2 $��CY)\B�{�����=�r���^���e5�o���=mTac�]���(�Pn���>����?o[P��aw	c}s@bQMUL�Ln��$;U�@���W'���b+K�F)W=/&E�*�_���!�3��e�1�1:}���0�NS��4i�3�X���%���m��-c���@�����#WA2b�:�#
���?}��y��#�N���k���jXX��/����k����in��~1 k��D���<��e�\ ��6��c��lqS�C��DW����%�C���sJwCAH����CD4(f��K�r��a�eNr��>*22���oH������`Q�F�I��P����y~�_��9�#�*n�Y�����Fo�I�%4'jH>����"����R��</
�B�6S?��
6���N�Q���M���U'��F��3�g9t���SwG�|X��CL�E-���l�Up5�=�?�������UP��9Qs<�*���*L���	)�����CCN�[T��IXN�q#:
5;���h8B9��I��C
�5dg��9�	#B����#��b�L�d�
���5���';��]Q]����i�Ar�t_�e�4������K$EO�"9����e���k��Cl��+l��]F��3��.�-xA��p���L�To�Kb;�m�:C��'�>c�B����*Z6 �"�&��C�
���t��TRS������l{mB���|d1e1$�ZX.�g_�w�����7|B���r�i!�/��QI�Y��c�����3�;�P�n��c�b���V^��Gn���������nX��bT�@�x�c�J
��oJ`Rn�|��u��y�����m�}}rxN�!�G�ds���V@}�VV�_�~�\���v��D>�`�Se����P�	������L5`j�~�D�Ur�[�t����"�*$��z��s~6����
�#.ND�7�*��pVBh�{�/�0.�-|]<<����CG7����c+h�-��qa�3/]��}��/��F�)��YI�����m�����)�
�>�:�^^���T�l��ar���,�7������J��2�����g	g�t��z���s�u�� �3������FPzT�W�=\)������c��xX�0�.\�+t�F�m�A�h�h���2�
����_z9������[���K�}=G�GPA�"����E:lo�P����
�����$qC9<�S8���Q���"&v��ndc'���n6�5�RJ��N����{�������DpB�.:�Y�*���Ww�P��5�;��[��L�j��X0T��Xr(��	j�U��N����v�
�4�����5Y�&���+N����K]n��w����	�,���,A8J�����J�*���2�^I�V��H��d(�����w�Aa{���	�L��.0H�!lZ�@��Q�?���`9X8R����p�aOB,pyWT�[��2�\���dA�%�p\
� E�d0��M�YTx	|�m}����B�-e�e�tdy��vJq=��L J��d2}q��L����T���a��
��(*;�~!,���VlJ7:Ck���Lx(�,a]
?ll�����7B���W���h�������Za������VP	t�+z�������B���8.V�-yM�<�:M�p�f�zO=��9��������+���9r[��P������}D>�B��J0B���f���.	���l>A���f<��~��~��r��������B1z�>�K"T�s�\FL�tR���B����F��Q�l^�5}�aZnvE��	��Z�A����f��)Re���_���<����y���[]�a��dx�Qb�q��.�����RtH��x�LR��������Hz��%���\G��/3��B@jw���;DE���7�f����xw��v�o#L��O�����������[/���a�;��=����x�6�Yf����b~�j
�G�y�^��p�c�r	#Y$#g��EX�Bs���������	qd��u2$�����2�E�d�EM��jHm��;�5���2K��-K���Z�]����CB��";Y���k5�-1#rI�3�P*��<�q���R�Qc]y��*�@���|i]MU6�����,��i�ZG�y����;`sh���#f��>2����������lR�������@���qI�w�����`�s��~�n�> f7���c'"���|m]�����������|������%^� ��@d9���D��5r<i���)�'�#��=*P,�B�w���� w���'5t*\�PC�d���C,���@�J�f�|��92�1�<�:�����H+�����J"P��6
%1�e������x�)�0t�A�*�<��� �������2�I���e~!���B����dz�<;}

?{�VI��c�6���F#:.W�������%�����=S�%n���H����
�A��p��=��x'-c�2X�+��O�R���(���,G��C��zGc���"�d��8Zy��k���e>L.Wzq����y��N{���l6Z�;��b�j�$��������P`�^A�)�#E4]��V��6���&��'�����79�DE�.{`$�O���~D 0����J
>���5���a5.�U�G���^y��n�R��������J4���
�X�q���*�������R��e=�b��%;N��������J���*��)����-����)<,J��UJNc
�a�1��g�X,3P��M����g+�PTy�� ���)�)��	v�VR0���J��~�����6s2M��0z!w�����\���+�����(Z����o���|��")�R�2<��6w��/�.�z�%cY(�����@n�U��8��d�C;�@m��B�w�;{�,��`=J��HQ#�0�:%HY���k_$�mn�%�K�,;���M-	M{Q`�:���B*9q�H��1jA�h,HX�K�9�<q[��L�d���.1�>\k�0>� � ��-~^��Qw�s��6�;Pu<}��Ov;�9j[j�����	�w����`�{��������;��g�dD=�t}U��-��������Z�:�0���?�b)�����`�R��Y�Y��ZN�]���Kqr������l$��Ct���66Nl���������D�nfSwf�i�X���S��-��\Wm��>�� ��8f�u{����FZ��9��LR(��5��a�������|n�M�tn�`��n�����V4�������Q�+rO�p�����J�t�JKbps�'9)�ja��eO ��GHO������)�Z�PT5H�P>���\��q���M���K�[
lHrIL���j�J�N'>�������Z�%���"V;7�C������
�0��@���������1��J����TJ���M�����-�i7_�>q��KfJV��dNo�=7B�p&����D�`��[- /��t2�72��5����zu��$�8-5�TJ�/�B����cZ<1��(,�f#*�����2�����vO%����I<��N�����m+��)�w�K�L��n��x�6T�^��mK3`1���F������#$m���sOP ��%Jk�64�����"as��(j�������F�H�0K�z4�l�6�$������U
(�n�K9��A�3k�K��_��X_���������4���24udJ3����o�5kd��b��
�%��&X��[���j�%y����pe2R@�nDt���="=�����Zq[��g$�]:��d#
@���C=��l"]IoV8o%��)�RKD�!�������*�KSR�e.����>���X�Q)���������Xt����)��i`M����,nc�Q*��a @q�e��LlS��|j��p������/�X"�"�ZJ�FF�3PD�3Y���a�7yo0���f8N�_�L�9e�����~�t�v(�oFp�@`;����{����u�����?�������s�����?�������s�����?��������.�
#141Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#140)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Oct 23, 2014 at 6:43 PM, Peter Geoghegan <pg@heroku.com> wrote:

Documentation
===========

The documentation has been updated, incorporating feedback. I also
made the cardinality violation error a lot clearer than before, since
Craig said that was unclear.

For the convenience of those that want to read the documentation
quickly to figure out one particular aspect of user-visible behavior,
the latest revision is uploaded here:
http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs

Of particular interest:

http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/sql-insert.html
http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/transaction-iso.html#XACT-READ-COMMITTED
http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/trigger-definition.html
http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/sql-createview.html#SQL-CREATEVIEW-UPDATABLE-VIEWS
http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/ddl-inherit.html

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#142Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#140)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Oct 23, 2014 at 9:43 PM, Peter Geoghegan <pg@heroku.com> wrote:

* CONFLICTING() is renamed to EXCLUDED(). I know that some people
wanted me to go a different way with this. I think that there are very
good practical reasons not to [1], as well as good reasons related to
design, but I still accept that CONFLICTING() isn't very descriptive.
This spelling seems a lot better.

Specifically, "some people" included at least three committers and at
least one other community member no less prominent than yourself, or
in other words, every single person who bothered to comment. You can
think whatever you like; the chances of it being committed that way
are zero.

Unique index inference (i.e. the way we figure out *which* unique
index to use) occurs during parse analysis. I think it would be
inappropriate, and certainly inconvenient to do it during planning.

You're wrong. The choice of which index to use is clearly wildly
inappropriately placed in the parse analysis phase, and if you think
that has any chance of ever being committed by anyone, then you are
presuming the existence of a committer who won't mind ignoring the
almost-immediate revert request that would draw from, at the very
least, Tom.

As far as syntax goes, I thought the INSERT .. ON CONFLICT UPDATE
syntax proposed upthread was the best of any mentioned thus far. The
MERGE-based syntaxes proposed upthread were crazily verbose for no
discernable benefit.

As much as I'd like to have this feature, your refusal to change
anything except when asked at least three times each by about five
different people makes this effort barely worth pursuing. You can say
all you like that you're receptive to feedback, but multiple people
here are telling you that they feel otherwise.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#143Josh Berkus
josh@agliodbs.com
In reply to: Peter Geoghegan (#130)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 10/24/2014 10:04 AM, Robert Haas wrote:

As far as syntax goes, I thought the INSERT .. ON CONFLICT UPDATE
syntax proposed upthread was the best of any mentioned thus far. The
MERGE-based syntaxes proposed upthread were crazily verbose for no
discernable benefit.

For those of us who haven't followed every post in this thread, is there
somewhere I can see the proposed syntax?

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#144Robert Haas
robertmhaas@gmail.com
In reply to: Josh Berkus (#143)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Oct 24, 2014 at 1:18 PM, Josh Berkus <josh@agliodbs.com> wrote:

On 10/24/2014 10:04 AM, Robert Haas wrote:

As far as syntax goes, I thought the INSERT .. ON CONFLICT UPDATE
syntax proposed upthread was the best of any mentioned thus far. The
MERGE-based syntaxes proposed upthread were crazily verbose for no
discernable benefit.

For those of us who haven't followed every post in this thread, is there
somewhere I can see the proposed syntax?

There are a couple of different proposals but this should give you a
feeling for where we're at:

/messages/by-id/CA+TgmoZN=2AJKi1n4Jz5BkmYi8r_CPUDW+DtoppmTeLVmsOoqw@mail.gmail.com

The part I like is the idea of making UPSERT look like an INSERT
statement with an additional clause that says how a unique violation
should be handled. The part nobody except Peter likes is using
functional notation like CONFLICTING() or EXCLUDED() to pull in values
from the tuple causing the unique violation. And there are some other
areas of disagreement about particular keywords and so on. But I
personally like that general style much more than the alternatives
derived from MERGE.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#145Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#142)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Oct 24, 2014 at 10:04 AM, Robert Haas <robertmhaas@gmail.com> wrote:

On Thu, Oct 23, 2014 at 9:43 PM, Peter Geoghegan <pg@heroku.com> wrote:

* CONFLICTING() is renamed to EXCLUDED(). I know that some people
wanted me to go a different way with this. I think that there are very
good practical reasons not to [1], as well as good reasons related to
design, but I still accept that CONFLICTING() isn't very descriptive.
This spelling seems a lot better.

Specifically, "some people" included at least three committers and at
least one other community member no less prominent than yourself, or
in other words, every single person who bothered to comment. You can
think whatever you like; the chances of it being committed that way
are zero.

This is the situation with unique index inference all over again. You
don't like a function-like expression. Okay. It would be a lot more
helpful if instead of just criticizing, you *also* looked at my
reasons for not wanting to go with something that would necessitate
adding a dummy range table entry [1]/messages/by-id/CAM3SWZQhiXQi1osT14V7spjQrUpmcnRtbXJe846-EB1bC+9i1g@mail.gmail.com -- Peter Geoghegan. There are some very good
practical reasons for avoiding that. We only do that (the OLD.* and
NEW.* stuff) in the context of CREATE RULE and one or two other
things. We don't play any games like that during parse analysis of
ordinary optimizable statements, which is what this is. And those
dummy RTEs are always placeholders, AFAICT. Apart from those technical
reasons, the two situations just aren't comparable from a user-visible
perspective, but that isn't the main problem.

I don't particularly expect you to come around to my view here. But it
would be nice to have the problems with dummy RTEs and so on
acknowledged, so it's understood that that is in itself a strange new
direction for parse analysis of ordinary optimizable statements.

Unique index inference (i.e. the way we figure out *which* unique
index to use) occurs during parse analysis. I think it would be
inappropriate, and certainly inconvenient to do it during planning.

You're wrong. The choice of which index to use is clearly wildly
inappropriately placed in the parse analysis phase, and if you think
that has any chance of ever being committed by anyone, then you are
presuming the existence of a committer who won't mind ignoring the
almost-immediate revert request that would draw from, at the very
least, Tom.

Why? This has nothing to do with optimization. You either have an
appropriate unique index available, in which case you can proceed (and
the cost associated with value locking the index and so on is an
inherent cost, kind of like inserting into an index in general). Or
you don't, and you can't (you get an error, not a sequential scan).
That's what I'd call a semantic dependence on the index. Yes, that's
kind of unusual, but it's the reality.

I can have the code do unique index inference during planning instead
if you insist, but I think that that isn't useful. If you want me to
do things that way, please explain why. Otherwise, even if I simply
acquiesce to your wishes, I may end up missing the point.

As far as syntax goes, I thought the INSERT .. ON CONFLICT UPDATE
syntax proposed upthread was the best of any mentioned thus far. The
MERGE-based syntaxes proposed upthread were crazily verbose for no
discernable benefit.

I don't think anyone is too insistent on pursuing that. I think that
the INSERT .. ON CONFLICT UPDATE syntax has more or less emerged as
the favorite.

As much as I'd like to have this feature, your refusal to change
anything except when asked at least three times each by about five
different people makes this effort barely worth pursuing. You can say
all you like that you're receptive to feedback, but multiple people
here are telling you that they feel otherwise.

I'm tired of your assertions about why I haven't done certain things.
It's not fair. I have incorporated a lot of feedback into V1.3 (and
previous versions), which isn't acknowledged. Also, I moved to the USA
this week, and things have been hectic. As I said in relation to
unique index inference, please consider that I haven't immediately
complied with that feedback because there are genuine technical
obstacles that at the very least make it more difficult than it
appears. And, I'm not necessarily able to comply quickly because of
time constraints.

[1]: /messages/by-id/CAM3SWZQhiXQi1osT14V7spjQrUpmcnRtbXJe846-EB1bC+9i1g@mail.gmail.com -- Peter Geoghegan
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#146Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#145)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Oct 24, 2014 at 3:01 PM, Peter Geoghegan <pg@heroku.com> wrote:

This is the situation with unique index inference all over again. You
don't like a function-like expression. Okay. It would be a lot more
helpful if instead of just criticizing, you *also* looked at my
reasons for not wanting to go with something that would necessitate
adding a dummy range table entry [1].

The problem here isn't that I haven't read your emails. I have read
them all, including that one. Moreover, this isn't the first time
you've asserted that someone hasn't read one of your emails. So if
we're going to say what we each think would be helpful, then I think
it would be helpful if you stopped accusing the people who are taking
time to provide feedback on your work of having failed to read your
emails. It's possible that there may be instances where that problem
exists, but it beggars credulity to suppose that the repeated
unanimous consensus against some of your design decisions is entirely
an artifact of failure to pay attention.

The fact is, I don't feel obliged to respond to every one of your
emails, just as you don't respond to every one of mine. If you want
this patch to ever get committed, it's your job to push it forward -
not mine, not Simon's, and not Heikki's. Sometimes that means you
have to solve hard problems instead of just articulating what they
are.

There are some very good
practical reasons for avoiding that. We only do that (the OLD.* and
NEW.* stuff) in the context of CREATE RULE and one or two other
things. We don't play any games like that during parse analysis of
ordinary optimizable statements, which is what this is. And those
dummy RTEs are always placeholders, AFAICT. Apart from those technical
reasons, the two situations just aren't comparable from a user-visible
perspective, but that isn't the main problem.

I don't particularly expect you to come around to my view here. But it
would be nice to have the problems with dummy RTEs and so on
acknowledged, so it's understood that that is in itself a strange new
direction for parse analysis of ordinary optimizable statements.

You're conflating the user-visible syntax with the parse tree
representation in way that is utterly without foundation. I don't
have a position at this point on which parse-analysis representation
is preferable, but it's completely wrong-headed to say that you
"can't" make NEW.x produce the same parse-analysis output that your
CONFLICTING(x) syntax would have created. Sure, it might be harder,
but it's not that much harder, and it's definitely not an unsolvable
problem.

I do acknowledge that there might be a better syntax out there than
NEW.x and OLD.x. I have not seen one proposed that I like better.
Feel free to propose something. But don't keep re-proposing something
that LOOKSLIKE(this) because nobody - other than perhaps you - likes
that. And don't use the difficulty of parse analysis as a
justification for your proposed syntax, because, except in extreme
cases, there are going to be very few if any regular contributors to
this mailing list who will accept that as a justification for one
syntax over another. Syntax needs to be justified by being beautiful,
elegant, precedent-driven, orthogonal, and minimalist - not by whether
you might need an extra 25-75 lines of parse analysis code to make it
work.

Unique index inference (i.e. the way we figure out *which* unique
index to use) occurs during parse analysis. I think it would be
inappropriate, and certainly inconvenient to do it during planning.

You're wrong. The choice of which index to use is clearly wildly
inappropriately placed in the parse analysis phase, and if you think
that has any chance of ever being committed by anyone, then you are
presuming the existence of a committer who won't mind ignoring the
almost-immediate revert request that would draw from, at the very
least, Tom.

Why? This has nothing to do with optimization.

That is false. If there is more than one index that could be used,
the system should select the best one. That is an optimization
decision per se. Also, if a plan is saved - in the plancache, say, or
in a view - the query can be re-planned if the index it depends on is
dropped, but there's no way to do parse analysis.

As much as I'd like to have this feature, your refusal to change
anything except when asked at least three times each by about five
different people makes this effort barely worth pursuing. You can say
all you like that you're receptive to feedback, but multiple people
here are telling you that they feel otherwise.

I'm tired of your assertions about why I haven't done certain things.
It's not fair. I have incorporated a lot of feedback into V1.3 (and
previous versions), which isn't acknowledged. Also, I moved to the USA
this week, and things have been hectic. As I said in relation to
unique index inference, please consider that I haven't immediately
complied with that feedback because there are genuine technical
obstacles that at the very least make it more difficult than it
appears. And, I'm not necessarily able to comply quickly because of
time constraints.

Well, I'm equally tired of being asked to review patches that respond
to only a small percentage of the feedback already given. I, too,
sometimes lack the time to incorporate the feedback of others into my
patches. When that happens, I don't re-post them until I do have the
time. I've even been known to drop patches altogether rather than
continue arguing about them, as you will of course recall. There's no
shame in taking longer to get something done, but asking other people
to spend time on it when you haven't had time yourself can lead to
frustrations.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#147Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#146)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Oct 24, 2014 at 1:07 PM, Robert Haas <robertmhaas@gmail.com> wrote:

The problem here isn't that I haven't read your emails. I have read
them all, including that one. Moreover, this isn't the first time
you've asserted that someone hasn't read one of your emails. So if
we're going to say what we each think would be helpful, then I think
it would be helpful if you stopped accusing the people who are taking
time to provide feedback on your work of having failed to read your
emails. It's possible that there may be instances where that problem
exists, but it beggars credulity to suppose that the repeated
unanimous consensus against some of your design decisions is entirely
an artifact of failure to pay attention.

Okay.

The fact is, I don't feel obliged to respond to every one of your
emails, just as you don't respond to every one of mine. If you want
this patch to ever get committed, it's your job to push it forward -
not mine, not Simon's, and not Heikki's. Sometimes that means you
have to solve hard problems instead of just articulating what they
are.

Okay.

You're conflating the user-visible syntax with the parse tree
representation in way that is utterly without foundation. I don't
have a position at this point on which parse-analysis representation
is preferable, but it's completely wrong-headed to say that you
"can't" make NEW.x produce the same parse-analysis output that your
CONFLICTING(x) syntax would have created. Sure, it might be harder,
but it's not that much harder, and it's definitely not an unsolvable
problem.

I don't believe I did. The broader point is that the difficulty in
making that work reflects the conceptually messiness, from
user-visible aspects down. I can work with the difficulty, and I may
even be able to live with the messiness, but I'm trying to bring the
problems with it to a head sooner rather than later for good practical
reasons. In all sincerity, my real concern is that you or the others
will change your mind when I actually go and implement an OLD.* style
syntax, and see the gory details. I regret it if to ask this is to ask
too much of you, but FYI that's the thought process behind it.

I do acknowledge that there might be a better syntax out there than
NEW.x and OLD.x. I have not seen one proposed that I like better.
Feel free to propose something. But don't keep re-proposing something
that LOOKSLIKE(this) because nobody - other than perhaps you - likes
that.

Okay.

So in an UPDATE targetlist, you can assign DEFAULT to a column. Maybe
that's an interesting precedent. During rewriting, this gets rewritten
such that you end up with something that looks to the planner as if
the original query included a constant (this actually comes from a
catalog look-up for the column during rewriting). What if we spelled
EXCLUDING/CONFLICTING as follows:

INSERT INTO upsert VALUES(1, 'Art') ON CONFLICT (key) UPDATE SET val =
EXCLUDED || 'this works' WHERE another_col != EXCLUDED;

Then rewriting would figure these details out. From a design
perspective, there'd need to be a few details worked out about how
inference actually works - inferring *which* column the EXCLUDED
expression actually referred to, but it seems doable, especially given
the existing restrictions on the structure of the UPDATE. We're not
rewriting from a SetToDefault to a constant, but a SetToDefault-like
thing to a special Var (actually, the finished representation probably
makes it to the execution stage with that Var representation filled
in, unlike SetToDefault, but it's basically the same pattern). It
solves my problem with dummy range table entries. Actually, *any* new
kind of expression accomplishes this just as well. My concern here is
more around not needing cute tricks with dummy RTEs than it is around
being in favor of any particular expression-based syntax.

What do you think of that?

And don't use the difficulty of parse analysis as a
justification for your proposed syntax, because, except in extreme
cases, there are going to be very few if any regular contributors to
this mailing list who will accept that as a justification for one
syntax over another. Syntax needs to be justified by being beautiful,
elegant, precedent-driven, orthogonal, and minimalist - not by whether
you might need an extra 25-75 lines of parse analysis code to make it
work.

Well, that isn't the case here. I'd much rather code my way out of a
disagreement with you.

Unique index inference (i.e. the way we figure out *which* unique
index to use) occurs during parse analysis. I think it would be
inappropriate, and certainly inconvenient to do it during planning.

You're wrong. The choice of which index to use is clearly wildly
inappropriately placed in the parse analysis phase, and if you think
that has any chance of ever being committed by anyone, then you are
presuming the existence of a committer who won't mind ignoring the
almost-immediate revert request that would draw from, at the very
least, Tom.

Why? This has nothing to do with optimization.

That is false. If there is more than one index that could be used,
the system should select the best one. That is an optimization
decision per se. Also, if a plan is saved - in the plancache, say, or
in a view - the query can be re-planned if the index it depends on is
dropped, but there's no way to do parse analysis.

Generating index paths for the UPDATE is a waste of cycles.
Theoretically, there could be an (a, b, c) unique index and a (c,b,a)
unique index, and those two might have a non-equal cost to scan. But
that almost certainly isn't going to happen in practice, since that's
a rather questionable indexing strategy, and even when it does, you're
going to have to insert into all the unique indexes a good proportion
of the time anyway, making the benefits of that approach pale in
comparison to the costs. And that's just the cost in CPU cycles, and
not code complexity.

I don't know why you want to bring a cost model, or choice of indexes
into this. It simply isn't comparable to how the system comes up with
which index to use in all other contexts. Now, I could easily make all
this happen during planning, just to not have to argue with you, but I
think that doing so is less similar to how things already work, not
more similar. It certainly doesn't imply more code reuse, since
get_relation_info() is clearly quite unsuitable.

Well, I'm equally tired of being asked to review patches that respond
to only a small percentage of the feedback already given. I, too,
sometimes lack the time to incorporate the feedback of others into my
patches. When that happens, I don't re-post them until I do have the
time. I've even been known to drop patches altogether rather than
continue arguing about them, as you will of course recall. There's no
shame in taking longer to get something done, but asking other people
to spend time on it when you haven't had time yourself can lead to
frustrations.

From my point of view, I spent a significant amount of time making the
patch more or less match your proposed design for unique index
inference. It is discouraging to hear that you think I'm not
cooperating with community process. I'm doing my best. I think it
would be a bad idea for me to not engage with the community for an
extended period at this point. There were plenty of other issues
address by V1.3 that were not the CONFLICTING()/EXCLUDING thing that
you highlighted (or the other thing you highlighted around where to do
unique index inference).
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#148Petr Jelinek
petr@2ndquadrant.com
In reply to: Peter Geoghegan (#147)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 25/10/14 00:48, Peter Geoghegan wrote:

You're conflating the user-visible syntax with the parse tree
representation in way that is utterly without foundation. I don't
have a position at this point on which parse-analysis representation
is preferable, but it's completely wrong-headed to say that you
"can't" make NEW.x produce the same parse-analysis output that your
CONFLICTING(x) syntax would have created. Sure, it might be harder,
but it's not that much harder, and it's definitely not an unsolvable
problem.

I don't believe I did. The broader point is that the difficulty in
making that work reflects the conceptually messiness, from
user-visible aspects down. I can work with the difficulty, and I may
even be able to live with the messiness, but I'm trying to bring the
problems with it to a head sooner rather than later for good practical
reasons. In all sincerity, my real concern is that you or the others
will change your mind when I actually go and implement an OLD.* style
syntax, and see the gory details. I regret it if to ask this is to ask
too much of you, but FYI that's the thought process behind it.

If you feel so strongly that it's wrong even though everybody else seems
to prefer it and if you at the same time feel so strongly about people
changing minds once you implement this, maybe the best way to convince
us is to show us the implementation (at this point it would probably
have taken less of your time than the argument did).

So in an UPDATE targetlist, you can assign DEFAULT to a column. Maybe
that's an interesting precedent. During rewriting, this gets rewritten
such that you end up with something that looks to the planner as if
the original query included a constant (this actually comes from a
catalog look-up for the column during rewriting). What if we spelled
EXCLUDING/CONFLICTING as follows:

INSERT INTO upsert VALUES(1, 'Art') ON CONFLICT (key) UPDATE SET val =
EXCLUDED || 'this works' WHERE another_col != EXCLUDED;

Then rewriting would figure these details out. From a design
perspective, there'd need to be a few details worked out about how
inference actually works - inferring *which* column the EXCLUDED
expression actually referred to, but it seems doable, especially given
the existing restrictions on the structure of the UPDATE. We're not
rewriting from a SetToDefault to a constant, but a SetToDefault-like
thing to a special Var (actually, the finished representation probably
makes it to the execution stage with that Var representation filled
in, unlike SetToDefault, but it's basically the same pattern). It
solves my problem with dummy range table entries. Actually, *any* new
kind of expression accomplishes this just as well. My concern here is
more around not needing cute tricks with dummy RTEs than it is around
being in favor of any particular expression-based syntax.

What do you think of that?

Ugh, you want to auto-magically detect what value is behind the EXCLUDED
based on how/where it's used in the UPDATE? That seems like quite a bad
idea.

--
Petr Jelinek http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#149Peter Geoghegan
pg@heroku.com
In reply to: Petr Jelinek (#148)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Oct 24, 2014 at 4:39 PM, Petr Jelinek <petr@2ndquadrant.com> wrote:

If you feel so strongly that it's wrong even though everybody else seems to
prefer it and if you at the same time feel so strongly about people changing
minds once you implement this, maybe the best way to convince us is to show
us the implementation (at this point it would probably have taken less of
your time than the argument did).

No, it wouldn't have - I don't think anyone believes that. Magic
addRangeTableEntryForRelation() calls are only used in the context of
one or two utility statements that have pretty limited scope. Support
for an OLD.* style syntax would have to exist at *all* stages of query
execution, from parse analysis through to rewriting, planning, and
execution. That's the difference here - this isn't a utility command.

So in an UPDATE targetlist, you can assign DEFAULT to a column. Maybe
that's an interesting precedent. During rewriting, this gets rewritten
such that you end up with something that looks to the planner as if
the original query included a constant (this actually comes from a
catalog look-up for the column during rewriting). What if we spelled
EXCLUDING/CONFLICTING as follows:

INSERT INTO upsert VALUES(1, 'Art') ON CONFLICT (key) UPDATE SET val =
EXCLUDED || 'this works' WHERE another_col != EXCLUDED;

Then rewriting would figure these details out. From a design
perspective, there'd need to be a few details worked out about how
inference actually works - inferring *which* column the EXCLUDED
expression actually referred to, but it seems doable, especially given
the existing restrictions on the structure of the UPDATE. We're not
rewriting from a SetToDefault to a constant, but a SetToDefault-like
thing to a special Var (actually, the finished representation probably
makes it to the execution stage with that Var representation filled
in, unlike SetToDefault, but it's basically the same pattern). It
solves my problem with dummy range table entries. Actually, *any* new
kind of expression accomplishes this just as well. My concern here is
more around not needing cute tricks with dummy RTEs than it is around
being in favor of any particular expression-based syntax.

What do you think of that?

Ugh, you want to auto-magically detect what value is behind the EXCLUDED
based on how/where it's used in the UPDATE? That seems like quite a bad
idea.

That's *exactly* how DEFAULT works within UPDATE targetlists. There
might be a few more details to work out here, but not terribly many,
and that's going to be true no matter what. 95%+ of the time, it'll
just be "val = EXCLUDED" anyway.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#150Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Peter Geoghegan (#149)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Peter Geoghegan wrote:

On Fri, Oct 24, 2014 at 4:39 PM, Petr Jelinek <petr@2ndquadrant.com> wrote:

Ugh, you want to auto-magically detect what value is behind the EXCLUDED
based on how/where it's used in the UPDATE? That seems like quite a bad
idea.

That's *exactly* how DEFAULT works within UPDATE targetlists. There
might be a few more details to work out here, but not terribly many,
and that's going to be true no matter what. 95%+ of the time, it'll
just be "val = EXCLUDED" anyway.

Petr's thought mirrors mine. What are you going to do the other 5% of
the time? Is there some other way to refer to the columns of the
"excluded" row?

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#151Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#147)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Oct 24, 2014 at 6:48 PM, Peter Geoghegan <pg@heroku.com> wrote:

You're conflating the user-visible syntax with the parse tree
representation in way that is utterly without foundation. I don't
have a position at this point on which parse-analysis representation
is preferable, but it's completely wrong-headed to say that you
"can't" make NEW.x produce the same parse-analysis output that your
CONFLICTING(x) syntax would have created. Sure, it might be harder,
but it's not that much harder, and it's definitely not an unsolvable
problem.

I don't believe I did. The broader point is that the difficulty in
making that work reflects the conceptually messiness, from
user-visible aspects down. I can work with the difficulty, and I may
even be able to live with the messiness, but I'm trying to bring the
problems with it to a head sooner rather than later for good practical
reasons. In all sincerity, my real concern is that you or the others
will change your mind when I actually go and implement an OLD.* style
syntax, and see the gory details. I regret it if to ask this is to ask
too much of you, but FYI that's the thought process behind it.

I think what's more likely is that we'll complain about the way you
chose to implement it. I don't believe your contention (in the other
email) that "Support
for an OLD.* style syntax would have to exist at *all* stages of query
execution, from parse analysis through to rewriting, planning, and
execution." I think if your design for implementing that syntax
requires that, and your design for some other syntax doesn't require
that, then you're not thinking clearly enough about what needs to
happen in parse analysis. Make the parse analysis for this syntax
emit the same representation that you would have had it emit in the
other syntax, and you won't have this problem.

What if we spelled
EXCLUDING/CONFLICTING as follows:

INSERT INTO upsert VALUES(1, 'Art') ON CONFLICT (key) UPDATE SET val =
EXCLUDED || 'this works' WHERE another_col != EXCLUDED;

What do you think of that?

I am in complete agreement with the comments made by Petr and Alvaro.

You're wrong. The choice of which index to use is clearly wildly
inappropriately placed in the parse analysis phase, and if you think
that has any chance of ever being committed by anyone, then you are
presuming the existence of a committer who won't mind ignoring the
almost-immediate revert request that would draw from, at the very
least, Tom.

Why? This has nothing to do with optimization.

That is false. If there is more than one index that could be used,
the system should select the best one. That is an optimization
decision per se. Also, if a plan is saved - in the plancache, say, or
in a view - the query can be re-planned if the index it depends on is
dropped, but there's no way to do parse analysis.

Generating index paths for the UPDATE is a waste of cycles.
Theoretically, there could be an (a, b, c) unique index and a (c,b,a)
unique index, and those two might have a non-equal cost to scan. But
that almost certainly isn't going to happen in practice, since that's
a rather questionable indexing strategy, and even when it does, you're
going to have to insert into all the unique indexes a good proportion
of the time anyway, making the benefits of that approach pale in
comparison to the costs.

I don't care whether you actually generate index-paths or not, and in
fact I suspect it makes no sense to do so. But I do care that you do
a cost comparison between the available indexes and pick the one that
looks cheapest. If somebody's got a bloated index and builds a new
one, they will want it to get used even before they drop the old one.

Even if that weren't an issue, though, the fact that you can't
re-parse but you can re-plan is a killer point AFAICS. It means you
are borked if the statement gets re-executed after the index you
picked is dropped.

From my point of view, I spent a significant amount of time making the
patch more or less match your proposed design for unique index
inference. It is discouraging to hear that you think I'm not
cooperating with community process. I'm doing my best. I think it
would be a bad idea for me to not engage with the community for an
extended period at this point. There were plenty of other issues
address by V1.3 that were not the CONFLICTING()/EXCLUDING thing that
you highlighted (or the other thing you highlighted around where to do
unique index inference).

I think this gets at a point that has been bugging me and, perhaps,
other people here. You often post a new patch with some fixes but
without fixes for the issues that reviewers have indicated are
top-of-mind for them. Sometimes, but not always, you say something
like "I know this doesn't fix X but I'd like comments on other aspects
of the patch". Even when you do, though, it can be difficult to
overlook something that appears to be a fundamental structural problem
to comment on details, and sometimes it feels like that's what we're
being asked to do. When I'm reviewing, I tend to find issues more or
less in proportion to the time I spend on the patch. If things that I
complained about before haven't been fixed, I tend to find the same
ones again, but not necessarily all that much faster than I found them
the first time. So that's not efficient for me. I would not make an
absolute rule that no patch should ever be re-posted without
addressing every issue; I wouldn't be able to follow that rule in
every case myself. But I try to follow it as often as I can, and I
would suggest that you try to lean quite a bit more firmly in that
direction. I think you will make more progress, and spend less time
arguing with others.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#152Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#151)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sat, Oct 25, 2014 at 8:12 AM, Robert Haas <robertmhaas@gmail.com> wrote:

Generating index paths for the UPDATE is a waste of cycles.
Theoretically, there could be an (a, b, c) unique index and a (c,b,a)
unique index, and those two might have a non-equal cost to scan. But
that almost certainly isn't going to happen in practice, since that's
a rather questionable indexing strategy, and even when it does, you're
going to have to insert into all the unique indexes a good proportion
of the time anyway, making the benefits of that approach pale in
comparison to the costs.

I don't care whether you actually generate index-paths or not, and in
fact I suspect it makes no sense to do so. But I do care that you do
a cost comparison between the available indexes and pick the one that
looks cheapest. If somebody's got a bloated index and builds a new
one, they will want it to get used even before they drop the old one.

That seems extremely narrow. I am about ready to just do what you say,
by costing the index based on something like relpages, but for the
record I see no point. If I see no point, and you're sure that there
is a point, then there is a danger that I'll miss the point, which
contributes to my giving push back. I know I said that already, but I
reiterate it once more for emphasis.

Even if that weren't an issue, though, the fact that you can't
re-parse but you can re-plan is a killer point AFAICS. It means you
are borked if the statement gets re-executed after the index you
picked is dropped.

That simply isn't the case. As specifically noted in comments in the
patch, relcache invalidation works in such a way as to invalidate the
query proper, even when only an index has been dropped. For a time
during development, the semantic dependence was more directly
represented by actually having extract_query_dependencies() extract
the arbitrating unique index pg_class Oid as a dependency for the
benefit of the plan cache, but I ultimately decided against doing
anything more than noting the potential future problem (the problem
that arises in a world where relcache invalidation is more selective).

But, I digress: I'll have inference occur during planning during the
next revision since you think that's important.

From my point of view, I spent a significant amount of time making the
patch more or less match your proposed design for unique index
inference. It is discouraging to hear that you think I'm not
cooperating with community process. I'm doing my best. I think it
would be a bad idea for me to not engage with the community for an
extended period at this point. There were plenty of other issues
address by V1.3 that were not the CONFLICTING()/EXCLUDING thing that
you highlighted (or the other thing you highlighted around where to do
unique index inference).

I think this gets at a point that has been bugging me and, perhaps,
other people here. You often post a new patch with some fixes but
without fixes for the issues that reviewers have indicated are
top-of-mind for them. Sometimes, but not always, you say something
like "I know this doesn't fix X but I'd like comments on other aspects
of the patch". Even when you do, though, it can be difficult to
overlook something that appears to be a fundamental structural problem
to comment on details, and sometimes it feels like that's what we're
being asked to do.

I think that it's accurate to say that I asked the community to do
that once, last year. I was even very explicit about it at the time.
I'm surprised that you think that's the case now, though. I learned my
lesson a little later: don't do that, because fellow contributors are
unwilling to go along with it, even for something as important as
this.

As recently as a few months ago, you wanted me to go a *completely*
different direction with this (i.e. attempt an UPDATE first). I'm
surprised that you're emphasizing the EXCLUDED()/CONFLICTING() thing
so much. Should I take it that I more or less have your confidence
that the way the patch fits together at a high level is sound?
Because, that's the only way I can imagine you'd think that the
EXCLUDED()/CONFLICTING() thing is of such fundamental importance at
this point. It is after all split out as a much smaller commit on top
of the main implementation (a commit which could easily be deferred).
While it's important, it is very clearly subsidiary to the overall
structure of my design, which I think that there has been precious
little discussion of on this thread (e.g. the whole way I use
EvalPlanQual(), the general idea of a special auxiliary plan that is
executed in a special way, etc). That concerns me, because I suspect
that the reason there has been next to no discussion of those aspects
is because they're particularly hard things to have an opinion on, and
yet are the things of immediate importance. Please correct me if I
have it wrong.

I am in no position to demand that you or anyone else discuss any
particular aspect of the patch, of course. I am just conveying my
concerns. Like all of us, I very much want to get this feature into
the next release of PostgreSQL.

When I'm reviewing, I tend to find issues more or
less in proportion to the time I spend on the patch. If things that I
complained about before haven't been fixed, I tend to find the same
ones again, but not necessarily all that much faster than I found them
the first time. So that's not efficient for me. I would not make an
absolute rule that no patch should ever be re-posted without
addressing every issue; I wouldn't be able to follow that rule in
every case myself. But I try to follow it as often as I can, and I
would suggest that you try to lean quite a bit more firmly in that
direction. I think you will make more progress, and spend less time
arguing with others.

I'll try. But let me point out that the *very first* thing you
complained about, in relation to version 1.0, was that the plan
structure was funny. V1.3 cleaned that up, making a "sequential scan"
always occur, and having EXPLAIN treat that as a strict implementation
detail, while still attributing some aspects of the hidden, unexecuted
"sequential scan" (e.g. the qual) to its parent where that makes
sense. This seems like something that squarely addressed your
*original* concern. A little later, you (rightly) complained about the
lack of support for inheritance, and to a lesser extent updatable
views. As of V1.3, I have reasonable support for both of those things.
And, of course, you wanted a unique index to be inferred from a set of
columns/expressions, which (most notably) v1.3 now does. Also, I
incorporated feedback from Kevin on some of those same items, as well
as the behavior of statement-level triggers. Furthermore, I
incorporated the feedback of Simon in having way more tests, in
particular, two new isolation tests, one of which illustrates the
qualitatively new "MVCC violation" in more detail.

In short, I think I've done a pretty good job of incorporating
feedback, and where I haven't I have been quite clear about it (it
certainly didn't take you long to figure it out in this most recent
instance). There is always room for improvement, but in my book V1.3
made a lot more than small, incremental progress. I am surprised by
your remarks suggesting that the progress of each revision is
excessively gradual in addressing your concerns. AFAICT, it's just
that V1.3 wasn't totally comprehensive in doing so. In reality, the
main reason for that is: getting this feature to a point where it
might plausibly be committed is bloody difficult, as evidenced by the
fact that it took this long for someone to produce a patch. Please
don't lose sight of that.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#153Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#152)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sun, Oct 26, 2014 at 4:39 PM, Peter Geoghegan <pg@heroku.com> wrote:

I don't care whether you actually generate index-paths or not, and in
fact I suspect it makes no sense to do so. But I do care that you do
a cost comparison between the available indexes and pick the one that
looks cheapest. If somebody's got a bloated index and builds a new
one, they will want it to get used even before they drop the old one.

That seems extremely narrow. I am about ready to just do what you say,
by costing the index based on something like relpages, but for the
record I see no point. If I see no point, and you're sure that there
is a point, then there is a danger that I'll miss the point, which
contributes to my giving push back. I know I said that already, but I
reiterate it once more for emphasis.

I don't think it's either narrow or difficult: I think you just need
to apply the existing index costing function. CLUSTER does a similar
calculation to figure out whether to seq-scan or sort, even though it
doesn't use index paths per se, or at least I don't think it does.

Even if that weren't an issue, though, the fact that you can't
re-parse but you can re-plan is a killer point AFAICS. It means you
are borked if the statement gets re-executed after the index you
picked is dropped.

That simply isn't the case. As specifically noted in comments in the
patch, relcache invalidation works in such a way as to invalidate the
query proper, even when only an index has been dropped. For a time
during development, the semantic dependence was more directly
represented by actually having extract_query_dependencies() extract
the arbitrating unique index pg_class Oid as a dependency for the
benefit of the plan cache, but I ultimately decided against doing
anything more than noting the potential future problem (the problem
that arises in a world where relcache invalidation is more selective).

I don't know what you mean by "invalidate the query proper". Here's
my chain of reasoning: If the index selection occurs in parse
analysis, then it's embedded in the parse tree. If this can used a
writable CTE, then the parse tree can get stored someplace. If the
index is then dropped, the parse tree is no good any more. Where's
the flaw in that reasoning?

I haven't looked at the patch to know exactly what will happen in that
case, but it seems to me like it must either not work or there must be
some ugly hack to make it work.

But, I digress: I'll have inference occur during planning during the
next revision since you think that's important.

Great.

I think that it's accurate to say that I asked the community to do
that once, last year. I was even very explicit about it at the time.
I'm surprised that you think that's the case now, though. I learned my
lesson a little later: don't do that, because fellow contributors are
unwilling to go along with it, even for something as important as
this.

I'm just telling you how I feel. I can't vouch for it being perfectly
fair or accurate, though I do strive for that.

As recently as a few months ago, you wanted me to go a *completely*
different direction with this (i.e. attempt an UPDATE first). I'm
surprised that you're emphasizing the EXCLUDED()/CONFLICTING() thing
so much. Should I take it that I more or less have your confidence
that the way the patch fits together at a high level is sound?

No. Commenting on one aspect of a patch doesn't imply agreement with
other aspects of the patch. Please don't put words into my mouth. I
haven't reviewed this patch in detail; I've only commented on specific
aspects of it as they have arisen in discussion. I may or may not
someday review it in detail, but not before I'm fairly confident that
the known issues raised by other community members have been addressed
as thoroughly as possible.

In reality, the
main reason for that is: getting this feature to a point where it
might plausibly be committed is bloody difficult, as evidenced by the
fact that it took this long for someone to produce a patch. Please
don't lose sight of that.

I'm not.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#154Simon Riggs
simon@2ndQuadrant.com
In reply to: Robert Haas (#153)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 27 October 2014 15:55, Robert Haas <robertmhaas@gmail.com> wrote:

Commenting on one aspect of a patch doesn't imply agreement with
other aspects of the patch. Please don't put words into my mouth. I
haven't reviewed this patch in detail; I've only commented on specific
aspects of it as they have arisen in discussion. I may or may not
someday review it in detail, but not before I'm fairly confident that
the known issues raised by other community members have been addressed
as thoroughly as possible.

+1

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#155Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#154)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Oct 27, 2014 at 9:43 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

On 27 October 2014 15:55, Robert Haas <robertmhaas@gmail.com> wrote:

Commenting on one aspect of a patch doesn't imply agreement with
other aspects of the patch. Please don't put words into my mouth. I
haven't reviewed this patch in detail; I've only commented on specific
aspects of it as they have arisen in discussion. I may or may not
someday review it in detail, but not before I'm fairly confident that
the known issues raised by other community members have been addressed
as thoroughly as possible.

+1

I wasn't putting words in anyone's mouth; I *don't* think that it's
true that Robert thinks patches 0001-* and 0002-* are perfectly fine,
and implied as much myself. I just think the *strongly* worded
disapproval of the user-visible interface of 0003-* was odd; it was
way out of proportion to its immediate importance to getting this
patch on track. AFAICT it was the *only* feedback that I didn't act on
with V1.3 (Robert's complaint about how inference happens during parse
analysis was a response to V1.3).

I'm not always going to be able to act on every item of feedback
immediately, or I'll have my own ideas about how to handle certain
things. I don't think that's all that big of a deal, since I've acted
on almost all feedback. I think by far the biggest problem here is the
lack of attention to the design from others.

I did a lot of copy-editing to the Wiki page yesterday. There are
actually few clear open items now:
https://wiki.postgresql.org/wiki/UPSERT#Open_Items

Some previous "open items" have been moved to here:
https://wiki.postgresql.org/wiki/UPSERT#Miscellaneous_odd_properties_of_proposed_ON_CONFLICT_patch

This is basically a section describing things that have not been
controversial or in need of adjusting, and may well never be, but I
wish we'd talk about because they're in some way novel or
counter-intuitive. This is the kind of things I'd like us to discuss
more.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#156Simon Riggs
simon@2ndQuadrant.com
In reply to: Peter Geoghegan (#155)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 27 October 2014 17:44, Peter Geoghegan <pg@heroku.com> wrote:

I did a lot of copy-editing to the Wiki page yesterday. There are
actually few clear open items now:
https://wiki.postgresql.org/wiki/UPSERT#Open_Items

I've read this page.

Please do these things, both of which have been requested multiple times...

1. Take the specific docs that relate to the patch and put them in one
place, so that everybody can read and understand and agree the
behaviour of the patch. So that someone reading that can see *exactly*
what is being proposed, not read through pages of other unchanged
material hoping to catch the few points that really differ.

2. Replace CONFLICTING() with what I have asked for in earlier posts.
The request is not repeated again, to avoid confusion.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#157Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#156)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Oct 27, 2014 at 11:12 AM, Simon Riggs <simon@2ndquadrant.com> wrote:

1. Take the specific docs that relate to the patch and put them in one
place, so that everybody can read and understand and agree the
behaviour of the patch. So that someone reading that can see *exactly*
what is being proposed, not read through pages of other unchanged
material hoping to catch the few points that really differ.

I'm afraid I don't follow. I have links to the user-visible
documentation (v1.3) on the Wiki:
https://wiki.postgresql.org/wiki/UPSERT#Documentation

The documentation is complete. I link to every interesting page from
the documentation directly from the Wiki, too. Of course, I also
describe the issues in more detail for those with an interest in the
implementation on the Wiki page itself (and list open issues). I have
isolation tests that illustrate the new facets of visibility for READ
COMMITTED, too.

How, specifically, have I failed to do what you ask here? If you want
to see exactly what has changed, in a differential fashion, well,
that's what a diff is for. I'm not aware of any existing way of
rendering to html for readability, while highlighting what is new.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#158Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#155)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Oct 27, 2014 at 1:44 PM, Peter Geoghegan <pg@heroku.com> wrote:

I think by far the biggest problem here is the
lack of attention to the design from others.

I find that attitude incredible.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#159Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#158)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Oct 27, 2014 at 1:22 PM, Robert Haas <robertmhaas@gmail.com> wrote:

On Mon, Oct 27, 2014 at 1:44 PM, Peter Geoghegan <pg@heroku.com> wrote:

I think by far the biggest problem here is the
lack of attention to the design from others.

I find that attitude incredible.

What I mean is that that's the thing that clearly needs scrutiny the
most. That isn't an attitude - it's a technical opinion.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#160Simon Riggs
simon@2ndQuadrant.com
In reply to: Peter Geoghegan (#159)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 27 October 2014 20:24, Peter Geoghegan <pg@heroku.com> wrote:

On Mon, Oct 27, 2014 at 1:22 PM, Robert Haas <robertmhaas@gmail.com> wrote:

On Mon, Oct 27, 2014 at 1:44 PM, Peter Geoghegan <pg@heroku.com> wrote:

I think by far the biggest problem here is the
lack of attention to the design from others.

I find that attitude incredible.

What I mean is that that's the thing that clearly needs scrutiny the
most. That isn't an attitude - it's a technical opinion.

Let's see if we can link these two thoughts.

1. You think the biggest problem is the lack of attention to the design.

2. I keep asking you to put the docs in a readable form.

If you can't understand the link between those two things, I am at a loss.

Good luck with the patch.

--
Simon Riggs http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#161Peter Geoghegan
pg@heroku.com
In reply to: Simon Riggs (#160)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Oct 27, 2014 at 4:34 PM, Simon Riggs <simon@2ndquadrant.com> wrote:

Let's see if we can link these two thoughts.

1. You think the biggest problem is the lack of attention to the design.

2. I keep asking you to put the docs in a readable form.

If you can't understand the link between those two things, I am at a loss.

You've read the docs. Please be clearer. In what sense are they not
readable? The main description of the feature appears on the INSERT
reference page:

http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/sql-insert.html

These paragraphs were added (there is more on the INSERT reference
page than mentioned here, but this is the main part):

"""
The optional ON CONFLICT clause specifies a path to take as an
alternative to raising a uniqueness violation error. ON CONFLICT
IGNORE simply avoids inserting any individual row when it is
determined that a uniqueness violation error would otherwise need to
be raised. ON CONFLICT UPDATE has the system take an UPDATE path in
respect of such rows instead. ON CONFLICT UPDATE guarantees an atomic
INSERT or UPDATE outcome. While rows may be updated, the top-level
statement is still an INSERT, which is significant for the purposes of
statement-level triggers and the rules system. Note that in the event
of an ON CONFLICT path being taken, RETURNING returns no value in
respect of any not-inserted rows.

ON CONFLICT UPDATE optionally accepts a WHERE clause condition. When
provided, the statement only proceeds with updating if the condition
is satisfied. Otherwise, unlike a conventional UPDATE, the row is
still locked for update. Note that the condition is evaluated last,
after a conflict has been identified as a candidate to update.

ON CONFLICT UPDATE accepts EXCLUDED expressions in both its targetlist
and WHERE clause. This allows expressions (in particular, assignments)
to reference rows originally proposed for insertion. Note that the
effects of all per-row BEFORE INSERT triggers are carried forward.
This is particularly useful for multi-insert ON CONFLICT UPDATE
statements; when inserting or updating multiple rows, constants need
only appear once.

There are several restrictions on the ON CONFLICT UPDATE clause that
do not apply to UPDATE statements. Subqueries may not appear in either
the UPDATE targetlist, nor its WHERE clause (although simple
multi-assignment expressions are supported). WHERE CURRENT OF cannot
be used. In general, only columns in the target table, and excluded
values originally proposed for insertion may be referenced. Operators
and functions may be used freely, though.

INSERT with an ON CONFLICT UPDATE clause is a deterministic statement.
You cannot UPDATE any single row more than once. Writing such an
INSERT statement will raise a cardinality violation error. Rows
proposed for insertion should not duplicate each other in terms of
attributes constrained by the conflict-arbitrating unique index. Note
that the ordinary rules for unique indexes with regard to NULL apply
analogously to whether or not an arbitrating unique index indicates if
the alternative path should be taken, so multiple NULL values across a
set of rows proposed for insertion are acceptable; the statement will
always insert (assuming there is no unrelated error). Note that merely
locking a row (by having it not satisfy the WHERE clause condition)
does not count towards whether or not the row has been affected
multiple times (and whether or not a cardinality violation error is
raised).

ON CONFLICT UPDATE requires a column specification, which is used to
infer an index to limit pre-checking for duplicates to. ON CONFLICT
IGNORE makes this optional. Failure to anticipate and prevent would-be
uniqueness violations originating in some other unique index than the
single unique index that was anticipated as the sole source of
would-be uniqueness violations can result in failing to insert a row
(taking the IGNORE path) when a uniqueness violation may have actually
been appropriate; omitting the specification indicates a total
indifference to where any would-be uniqueness violation could occur.
Note that the ON CONFLICT UPDATE assignment may result in a uniqueness
violation, just as with a conventional UPDATE.

The rules for unique index inference are straightforward. Columns
and/or expressions specified must match all the columns/expressions of
some existing unique index on table_name. The order of the
columns/expressions in the index definition, or whether or not the
index definition specified NULLS FIRST or NULLS LAST, or the internal
sort order of each column (whether DESC or ASC were specified) are all
irrelevant. However, partial unique indexes are not supported as
arbiters of whether an alternative ON CONFLICT path should be taken.
Deferred unique constraints are also not accepted.

You must have INSERT privilege on a table in order to insert into it,
as well as UPDATE privilege if and only if ON CONFLICT UPDATE is
specified. If a column list is specified, you only need INSERT
privilege on the listed columns. Similarly, when ON CONFLICT UPDATE is
specified, you only need UPDATE privilege on the column(s) that are
listed to be updated, as well as SELECT privilege on any column whose
values are read in the ON CONFLICT UPDATE expressions or condition.
Use of the RETURNING clause requires SELECT privilege on all columns
mentioned in RETURNING. If you use the query clause to insert rows
from a query, you of course need to have SELECT privilege on any table
or column used in the query.
"""

On the same page, there is commentary on each new addition to the
grammar (e.g. expression_index, column_name_index, expression). There
are some worked examples, too (there are now 3 ON CONFLICT related
examples out of 12 total):

"""
Insert or update new distributors as appropriate. Assumes a unique
index has been defined that constrains values appearing in the did
column. Note that an EXCLUDED expression is used to reference values
originally proposed for insertion:

INSERT INTO distributors (did, dname)
VALUES (5, 'Gizmo transglobal'), (6, 'Doohickey, inc')
ON CONFLICT (did) UPDATE
SET dname = EXCLUDED(dname) || ' (formerly ' || dname || ')'

Insert a distributor, or do nothing for rows proposed for insertion
when an existing, excluded row (a row with a matching constrained
column or columns after before row insert triggers fire) exists.
Assumes a unique index has been defined that constrains values
appearing in the did column (although since the IGNORE variant was
used, the specification of columns to infer a unique index from is not
mandatory):

INSERT INTO distributors (did, dname) VALUES (7, 'Doodad GmbH')
ON CONFLICT (did) IGNORE

Insert or update new distributors as appropriate. Assumes a unique
index has been defined that constrains values appearing in the did
column. WHERE clause is used to limit the rows actually updated (any
existing row not updated will still be locked, though):

-- Don't update any existing row if it was already renamed at some
-- earlier stage
INSERT INTO distributors (did, dname) VALUES (8, 'Thingamabob Distribution')
ON CONFLICT (did) UPDATE
SET dname = EXCLUDED(dname) || ' (formerly ' || dname || ')'
WHERE dname NOT LIKE '%(formerly %)'
"""

If you do not provide actionable feedback, then I cannot do anything.
That's frustrating for me. Saying that the docs are not in a "readable
form" is too vague for me to act on. If I'm not mistaken, they're in
the same form (the same medium - sgml doc patches) that they've been
for every patch ever submitted to PostgreSQL (in terms of being easy
to read against the backdrop of existing docs, which you mentioned
before). I have built the html docs and uploaded them myself, as an
additional convenience to reviewers.

What standard am I failing to meet here? I spent *hours* editing the
Wiki yesterday to make the structure clearer (little new content was
added), and make the information exactly current. I am bending over
backwards to make the user-visible behaviors clearer, and to document
the patch well, both from a user-visible perspective, and an internal
perspective. I have internal docs for both implementations of value
locking (#1 and #2). Then there's the value locking Wiki page. I have
produced *reams* of documentation at this point, all in an effort to
make things easier to understand. The user visible doc patch diff
stats:

---
doc/src/sgml/ddl.sgml | 23 +++
doc/src/sgml/indices.sgml | 11 +-
doc/src/sgml/mvcc.sgml | 43 ++++--
doc/src/sgml/plpgsql.sgml | 20 ++-
doc/src/sgml/postgres-fdw.sgml | 8 ++
doc/src/sgml/ref/create_index.sgml | 7 +-
doc/src/sgml/ref/create_rule.sgml | 6 +-
doc/src/sgml/ref/create_table.sgml | 5 +-
doc/src/sgml/ref/create_trigger.sgml | 5 +-
doc/src/sgml/ref/create_view.sgml | 36 ++++-
doc/src/sgml/ref/insert.sgml | 258 ++++++++++++++++++++++++++++++++--
doc/src/sgml/ref/set_constraints.sgml | 6 +-
doc/src/sgml/trigger.sgml | 46 ++++--
13 files changed, 426 insertions(+), 48 deletions(-)

#1 internal documentation stats:

doc/src/sgml/indexam.sgml | 133 ++++++++++++++++++++++++++++++++++++---
src/backend/access/nbtree/README | 90 +++++++++++++++++++++++++-
src/backend/executor/README | 35 +++++++++++
3 files changed, 247 insertions(+), 11 deletions(-)

#2 internal documentation stats:

---
src/backend/executor/README | 49 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)

Maybe those INSERT reference paragraphs could use another pass of
copy-editing, but that's not what you said - you suggested some far
more significant issue. Some other issues, like exactly how triggers
work with the feature are discussed on dedicated pages rather than the
main INSERT reference page, which seems consistent with the existing
documentation.

Have I not provided a total of 4 isolation tests illustrating
interesting concurrency/visibility interactions? That's a lot of
isolation tests. Here is the tests commit stat:

31 files changed, 1159 insertions(+), 8 deletions(-)

I really don't have any idea what you'd like me to do. Once again:
please be more specific. I don't know what you mean.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#162Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#161)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

---
doc/src/sgml/ddl.sgml | 23 +++
doc/src/sgml/indices.sgml | 11 +-
doc/src/sgml/mvcc.sgml | 43 ++++--
doc/src/sgml/plpgsql.sgml | 20 ++-
doc/src/sgml/postgres-fdw.sgml | 8 ++
doc/src/sgml/ref/create_index.sgml | 7 +-
doc/src/sgml/ref/create_rule.sgml | 6 +-
doc/src/sgml/ref/create_table.sgml | 5 +-
doc/src/sgml/ref/create_trigger.sgml | 5 +-
doc/src/sgml/ref/create_view.sgml | 36 ++++-
doc/src/sgml/ref/insert.sgml | 258 ++++++++++++++++++++++++++++++++--
doc/src/sgml/ref/set_constraints.sgml | 6 +-
doc/src/sgml/trigger.sgml | 46 ++++--
13 files changed, 426 insertions(+), 48 deletions(-)

#1 internal documentation stats:

doc/src/sgml/indexam.sgml | 133 ++++++++++++++++++++++++++++++++++++---
src/backend/access/nbtree/README | 90 +++++++++++++++++++++++++-
src/backend/executor/README | 35 +++++++++++
3 files changed, 247 insertions(+), 11 deletions(-)

#2 internal documentation stats:

---
src/backend/executor/README | 49 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 49 insertions(+)

Just to put that in context, here are the documentation changes from
the original LATERAL commit:

 doc/src/sgml/keywords.sgml                |   2 +-
 doc/src/sgml/queries.sgml                 |  83
+++++++++++++++++++++++++++++++++++++++++-
 doc/src/sgml/ref/select.sgml              | 102
+++++++++++++++++++++++++++++++++++++++++++++-------

Commit 0ef0b30 added data-modifying CTE docs (docs only). That looks like:

doc/src/sgml/queries.sgml | 177
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
doc/src/sgml/ref/select.sgml | 49 ++++++++++++++---
2 files changed, 214 insertions(+), 12 deletions(-)

Have I not provided a total of 4 isolation tests illustrating
interesting concurrency/visibility interactions? That's a lot of
isolation tests. Here is the tests commit stat:

31 files changed, 1159 insertions(+), 8 deletions(-)

And to put the tests in context, here are the stats from the original
Hot Standby commit:

src/test/regress/expected/hs_standby_allowed.out | 215
++++++++++++++++++++++++++
src/test/regress/expected/hs_standby_check.out | 20 +++
src/test/regress/expected/hs_standby_disallowed.out | 137 +++++++++++++++++
src/test/regress/expected/hs_standby_functions.out | 40 +++++
src/test/regress/pg_regress.c | 33 ++--
src/test/regress/sql/hs_primary_extremes.sql | 74 +++++++++
src/test/regress/sql/hs_primary_setup.sql | 25 +++
src/test/regress/sql/hs_standby_allowed.sql | 121 +++++++++++++++
src/test/regress/sql/hs_standby_check.sql | 16 ++
src/test/regress/sql/hs_standby_disallowed.sql | 105 +++++++++++++
src/test/regress/sql/hs_standby_functions.sql | 24 +++
src/test/regress/standby_schedule | 21 +++

So (at least as measured by raw lines of tests), this feature is
better tested than the original Hot Standby commit, and by a wide
margin. Tests also serve as an explanatory tool for the feature (in
particular, isolation tests can be used in this way).
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#163Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#161)
1 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Oct 27, 2014 at 5:15 PM, Peter Geoghegan <pg@heroku.com> wrote:

Let's see if we can link these two thoughts.

1. You think the biggest problem is the lack of attention to the design.

2. I keep asking you to put the docs in a readable form.

If you can't understand the link between those two things, I am at a loss.

You've read the docs. Please be clearer. In what sense are they not
readable? The main description of the feature appears on the INSERT
reference page:

http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/sql-insert.html

I've updated that reference page. I did a fair amount of copy-editing,
but also updated the docs to describe the latest (unpublished)
refinements to the syntax. Which is, as you and Robert requested, that
the target and rejected-for-insertion tuples may be referenced with
magical aliases in the style of OLD.* and NEW.*. I've spelt these
aliases as TARGET.* and EXCLUDED.*, since OLD.* and NEW.* didn't seem
to make much sense here. This requires some special processing during
rewriting (which, as you probably know, is true of DML statements in
general), and is certainly more invasive than what I had before, but
all told isn't too bad. Basically, there is still an ExcludedExpr, but
it only appears in the post-rewrite query tree, and is never created
by the raw grammar or processed during parse analysis.

I attach the doc patch with the relevant changes, in case you'd like a
quick reference to where things are changed.

I have already implemented the two things that you and Robert asked
for most recently: A costing model for unique index inference, and the
above syntax. I've also added IGNORE support to postgres_fdw (so you
can IGNORE if and only if a unique index inference specification is
omitted, just as with updatable views since V1.3).

Currently, I'm working on fixing an issue with RLS that I describe in
detail here:

https://wiki.postgresql.org/wiki/UPSERT#RLS

Once I fix that (provided it doesn't take too long), I'll publish a
V1.4. AFAICT, that'll close out all of the current open issues.

I hope this goes some way towards addressing your concerns.
--
Peter Geoghegan

Attachments:

0006-User-visible-documentation-for-INSERT-.-ON-CONFLICT-.patchtext/x-patch; charset=US-ASCII; name=0006-User-visible-documentation-for-INSERT-.-ON-CONFLICT-.patchDownload
From b9556286b3710234a32ce48e8d163d5e844154b8 Mon Sep 17 00:00:00 2001
From: Peter Geoghegan <pg@heroku.com>
Date: Fri, 26 Sep 2014 20:59:04 -0700
Subject: [PATCH 6/6] User-visible documentation for INSERT ... ON CONFLICT
 {UPDATE | IGNORE}

INSERT ... ON CONFLICT {UPDATE | IGNORE} is documented as a new clause
of the INSERT command.  Some potentially surprising interactions with
triggers are noted -- BEFORE INSERT per-row triggers must fire without
the INSERT path necessarily being taken, for example.

All the existing features that INSERT ... ON CONFLICT {UPDATE | IGNORE}
fails to completely play nice with have those limitations noted.  (Notes
are added to the existing documentation for those other features,
although some of these cases will need to be revisited).  This includes
postgres_fdw, updatable views and table inheritance (although these have
most interesting cases covered, particularly inheritance).

Finally, a user-level description of the new "MVCC violation" that the
ON CONFLICT UPDATE variant sometimes requires has been added to "Chapter
13 - Concurrency Control", beside existing commentary on READ COMMITTED
mode's special handling of concurrent updates.  The new "MVCC violation"
introduced seems somewhat distinct from the existing one (i.e.  what is
internally referred to as the EvalPlanQual() mechanism), because in READ
COMMITTED mode it is no longer necessary for any row version to be
conventionally visible to the command's MVCC snapshot for an UPDATE of
the row to occur (or for the row to be locked, should the WHERE clause
predicate not be satisfied).
---
 doc/src/sgml/ddl.sgml                 |  23 +++
 doc/src/sgml/fdwhandler.sgml          |   8 ++
 doc/src/sgml/indices.sgml             |  11 +-
 doc/src/sgml/keywords.sgml            |   7 +
 doc/src/sgml/mvcc.sgml                |  24 ++++
 doc/src/sgml/plpgsql.sgml             |  14 +-
 doc/src/sgml/postgres-fdw.sgml        |   8 ++
 doc/src/sgml/ref/create_index.sgml    |   7 +-
 doc/src/sgml/ref/create_rule.sgml     |   6 +-
 doc/src/sgml/ref/create_table.sgml    |   5 +-
 doc/src/sgml/ref/create_trigger.sgml  |   5 +-
 doc/src/sgml/ref/create_view.sgml     |  33 ++++-
 doc/src/sgml/ref/insert.sgml          | 262 +++++++++++++++++++++++++++++++---
 doc/src/sgml/ref/set_constraints.sgml |   6 +-
 doc/src/sgml/trigger.sgml             |  29 +++-
 15 files changed, 419 insertions(+), 29 deletions(-)

diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml
index f9dc151..1bf3537 100644
--- a/doc/src/sgml/ddl.sgml
+++ b/doc/src/sgml/ddl.sgml
@@ -2428,9 +2428,27 @@ VALUES ('Albany', NULL, NULL, 'NY');
   </para>
 
   <para>
+   There is limited inheritance support for <command>INSERT</command>
+   commands with <literal>ON CONFLICT</> clauses.  Tables with
+   children are not generally accepted as targets.  One notable
+   exception is that such tables are accepted as targets for
+   <command>INSERT</command> commands with <literal>ON CONFLICT
+   IGNORE</> clauses, provided a unique index inference clause was
+   omitted (which implies that there is no concern about
+   <emphasis>which</> unique index any would-be conflict might arise
+   from).  However, tables that happen to be inheritance children are
+   accepted as targets for all variants of <command>INSERT</command>
+   with <literal>ON CONFLICT</>.
+  </para>
+
+  <para>
    All check constraints and not-null constraints on a parent table are
    automatically inherited by its children.  Other types of constraints
    (unique, primary key, and foreign key constraints) are not inherited.
+   Therefore, <command>INSERT</command> with <literal>ON CONFLICT</>
+   unique index inference considers only unique constraints/indexes
+   directly associated with the child
+   table.
   </para>
 
   <para>
@@ -2515,6 +2533,11 @@ VALUES ('Albany', NULL, NULL, 'NY');
    not <literal>INSERT</literal> or <literal>ALTER TABLE ...
    RENAME</literal>) typically default to including child tables and
    support the <literal>ONLY</literal> notation to exclude them.
+   <literal>INSERT</literal> with an <literal>ON CONFLICT
+   UPDATE</literal> clause does not support the
+   <literal>ONLY</literal> notation, in effect tables with inheritance
+   children are not supported for that <literal>ON CONFLICT</literal>
+   variant.
    Commands that do database maintenance and tuning
    (e.g., <literal>REINDEX</literal>, <literal>VACUUM</literal>)
    typically only work on individual, physical tables and do not
diff --git a/doc/src/sgml/fdwhandler.sgml b/doc/src/sgml/fdwhandler.sgml
index c1daa4b..0c3dcb5 100644
--- a/doc/src/sgml/fdwhandler.sgml
+++ b/doc/src/sgml/fdwhandler.sgml
@@ -1014,6 +1014,14 @@ GetForeignServerByName(const char *name, bool missing_ok);
      source provides.
     </para>
 
+    <para>
+     <command>INSERT</> with an <literal>ON CONFLICT</> clause is not supported
+     with a unique index inference specification (this implies that <literal>ON
+     CONFLICT UPDATE</> is never supported, since the specification is
+     mandatory there).  When planning an <command>INSERT</>,
+     <function>PlanForeignModify</> should reject these cases.
+    </para>
+
   </sect1>
 
  </chapter>
diff --git a/doc/src/sgml/indices.sgml b/doc/src/sgml/indices.sgml
index 64530a1..e6b9112 100644
--- a/doc/src/sgml/indices.sgml
+++ b/doc/src/sgml/indices.sgml
@@ -922,7 +922,16 @@ CREATE UNIQUE INDEX tests_success_constraint ON tests (subject, target)
    know when an index might be profitable.  Forming this knowledge
    requires experience and understanding of how indexes in
    <productname>PostgreSQL</> work.  In most cases, the advantage of a
-   partial index over a regular index will be minimal.
+   partial index over a regular index will be minimal.  Also, note
+   that partial unique indexes are not compatible with INSERT with an
+   <literal>ON CONFLICT UPDATE</> clause, if it is expected that a
+   would-be uniqueness violation associated with the partial index
+   should provoke an alternative <literal>UPDATE</> or
+   <literal>IGNORE</> path, and an explicit condition for taking the
+   alternative path was specified (as it must be with the
+   <literal>UPDATE</> variant).  Unique index inference will never
+   infer that a partial unique index is appropriate due to
+   implementation-specific restrictions.
   </para>
 
   <para>
diff --git a/doc/src/sgml/keywords.sgml b/doc/src/sgml/keywords.sgml
index b0dfd5f..ea58211 100644
--- a/doc/src/sgml/keywords.sgml
+++ b/doc/src/sgml/keywords.sgml
@@ -854,6 +854,13 @@
     <entry></entry>
    </row>
    <row>
+    <entry><token>CONFLICT</token></entry>
+    <entry>non-reserved</entry>
+    <entry></entry>
+    <entry></entry>
+    <entry></entry>
+   </row>
+   <row>
     <entry><token>CONNECT</token></entry>
     <entry></entry>
     <entry>reserved</entry>
diff --git a/doc/src/sgml/mvcc.sgml b/doc/src/sgml/mvcc.sgml
index cd55be8..0248829 100644
--- a/doc/src/sgml/mvcc.sgml
+++ b/doc/src/sgml/mvcc.sgml
@@ -326,6 +326,30 @@
    </para>
 
    <para>
+    <command>INSERT</command> with an <literal>ON CONFLICT UPDATE</> clause is
+    another special case.  In Read Committed mode, the implementation will
+    either insert or update each row proposed for insertion, with either one of
+    those two outcomes guaranteed.  This is a useful guarantee for many
+    use-cases, but it implies that further liberties must be taken with
+    snapshot isolation.  Should a conflict originate in another transaction
+    whose effects are not visible to the <command>INSERT</command>, the
+    <command>UPDATE</command> may affect that row, even though it may be the
+    case that <emphasis>no</> version of that row is conventionally visible to
+    the command.  In the same vein, if the secondary search condition of the
+    command (an explicit <literal>WHERE</> clause) is supplied, it is only
+    evaluated on the most recent row version, which is not necessarily the
+    version conventionally visible to the command (if indeed there is a row
+    version conventionally visible to the command at all).
+   </para>
+
+   <para>
+    <command>INSERT</command> with an <literal>ON CONFLICT IGNORE</> clause may
+    have insertion not proceed for a row due to the outcome of another
+    transaction whose effects are not visible to the <command>INSERT</command>
+    snapshot.  Again, this is only the case in Read Committed mode.
+   </para>
+
+   <para>
     Because of the above rule, it is possible for an updating command to see an
     inconsistent snapshot: it can see the effects of concurrent updating
     commands on the same rows it is trying to update, but it
diff --git a/doc/src/sgml/plpgsql.sgml b/doc/src/sgml/plpgsql.sgml
index f195495..c4d9004 100644
--- a/doc/src/sgml/plpgsql.sgml
+++ b/doc/src/sgml/plpgsql.sgml
@@ -2599,7 +2599,11 @@ END;
     <para>
 
     This example uses exception handling to perform either
-    <command>UPDATE</> or <command>INSERT</>, as appropriate:
+    <command>UPDATE</> or <command>INSERT</>, as appropriate.  It is
+    recommended that applications use <command>INSERT</> with
+    <literal>ON CONFLICT UPDATE</> rather than actually emulating this
+    pattern.  This example serves only to illustrate use of
+    <application>PL/pgSQL</application> control flow structures:
 
 <programlisting>
 CREATE TABLE db (a INT PRIMARY KEY, b TEXT);
@@ -3754,9 +3758,11 @@ RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;
     <command>INSERT</> and <command>UPDATE</> operations, the return value
     should be <varname>NEW</>, which the trigger function may modify to
     support <command>INSERT RETURNING</> and <command>UPDATE RETURNING</>
-    (this will also affect the row value passed to any subsequent triggers).
-    For <command>DELETE</> operations, the return value should be
-    <varname>OLD</>.
+    (this will also affect the row value passed to any subsequent triggers,
+    or passed to a special <varname>EXCLUDED</> alias reference within
+    an <command>INSERT</> statement with an <literal>ON CONFLICT UPDATE</>
+    clause).  For <command>DELETE</> operations, the return
+    value should be <varname>OLD</>.
    </para>
 
    <para>
diff --git a/doc/src/sgml/postgres-fdw.sgml b/doc/src/sgml/postgres-fdw.sgml
index 43adb61..fa39661 100644
--- a/doc/src/sgml/postgres-fdw.sgml
+++ b/doc/src/sgml/postgres-fdw.sgml
@@ -69,6 +69,14 @@
  </para>
 
  <para>
+  Note that <filename>postgres_fdw</> currently lacks support for
+  <command>INSERT</command> statements with an <literal>ON CONFLICT
+  UPDATE</> clause.  However, the <literal>ON CONFLICT IGNORE</>
+  clause is supported, provided a unique index inference specification
+  is omitted.
+ </para>
+
+ <para>
   It is generally recommended that the columns of a foreign table be declared
   with exactly the same data types, and collations if applicable, as the
   referenced columns of the remote table.  Although <filename>postgres_fdw</>
diff --git a/doc/src/sgml/ref/create_index.sgml b/doc/src/sgml/ref/create_index.sgml
index 43df32f..1bebf4c 100644
--- a/doc/src/sgml/ref/create_index.sgml
+++ b/doc/src/sgml/ref/create_index.sgml
@@ -72,7 +72,12 @@ CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ <replaceable class="parameter">name</
     can improve performance by creating an index on just that portion.
     Another possible application is to use <literal>WHERE</literal> with
     <literal>UNIQUE</literal> to enforce uniqueness over a subset of a
-    table.  See <xref linkend="indexes-partial"> for more discussion.
+    table.  Note, however, that partial unique indexes are not
+    compatible with INSERT with an <literal>ON CONFLICT UPDATE</>
+    clause (if it is expected that a would-be uniqueness violation
+    associated with the partial index should provoke an alternative
+    <literal>UPDATE</>/<literal>IGNORE</> path).  See <xref
+    linkend="indexes-partial"> for more discussion.
   </para>
 
   <para>
diff --git a/doc/src/sgml/ref/create_rule.sgml b/doc/src/sgml/ref/create_rule.sgml
index 677766a..9b5c740 100644
--- a/doc/src/sgml/ref/create_rule.sgml
+++ b/doc/src/sgml/ref/create_rule.sgml
@@ -136,7 +136,11 @@ CREATE [ OR REPLACE ] RULE <replaceable class="parameter">name</replaceable> AS
      <para>
       The event is one of <literal>SELECT</literal>,
       <literal>INSERT</literal>, <literal>UPDATE</literal>, or
-      <literal>DELETE</literal>.
+      <literal>DELETE</literal>.  Note that an
+      <command>INSERT</command> containing an <literal>ON
+      CONFLICT</literal> clause is unsupported.  Consider using an
+      updatable view instead, which have limited support for
+      <literal>ON CONFLICT IGNORE</literal> only.
      </para>
     </listitem>
    </varlistentry>
diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml
index 299cce8..a9c1124 100644
--- a/doc/src/sgml/ref/create_table.sgml
+++ b/doc/src/sgml/ref/create_table.sgml
@@ -708,7 +708,10 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
       <literal>EXCLUDE</>, and
       <literal>REFERENCES</> (foreign key) constraints accept this
       clause.  <literal>NOT NULL</> and <literal>CHECK</> constraints are not
-      deferrable.
+      deferrable.  Note that constraints that were created with this
+      clause cannot be used as arbiters of whether or not to take the
+      alternative path with an <command>INSERT</command> statement
+      that includes an <literal>ON CONFLICT UPDATE</> clause.
      </para>
     </listitem>
    </varlistentry>
diff --git a/doc/src/sgml/ref/create_trigger.sgml b/doc/src/sgml/ref/create_trigger.sgml
index 29b815c..26a0986 100644
--- a/doc/src/sgml/ref/create_trigger.sgml
+++ b/doc/src/sgml/ref/create_trigger.sgml
@@ -76,7 +76,10 @@ CREATE [ CONSTRAINT ] TRIGGER <replaceable class="PARAMETER">name</replaceable>
    executes once for any given operation, regardless of how many rows
    it modifies (in particular, an operation that modifies zero rows
    will still result in the execution of any applicable <literal>FOR
-   EACH STATEMENT</literal> triggers).
+   EACH STATEMENT</literal> triggers).  Note that since
+   <command>INSERT</command> with an <literal>ON CONFLICT UPDATE</>
+   clause is considered an <command>INSERT</command> statement, no
+   <command>UPDATE</command> statement level trigger will be fired.
   </para>
 
   <para>
diff --git a/doc/src/sgml/ref/create_view.sgml b/doc/src/sgml/ref/create_view.sgml
index 2b7a98f..aea8447 100644
--- a/doc/src/sgml/ref/create_view.sgml
+++ b/doc/src/sgml/ref/create_view.sgml
@@ -291,8 +291,9 @@ CREATE VIEW vista AS SELECT text 'Hello World' AS hello;
    <para>
     Simple views are automatically updatable: the system will allow
     <command>INSERT</>, <command>UPDATE</> and <command>DELETE</> statements
-    to be used on the view in the same way as on a regular table.  A view is
-    automatically updatable if it satisfies all of the following conditions:
+    to be used on the view in the same way as on a regular table (aside from
+    the limitations on ON CONFLICT noted below).  A view is automatically
+    updatable if it satisfies all of the following conditions:
 
     <itemizedlist>
      <listitem>
@@ -388,6 +389,34 @@ CREATE VIEW vista AS SELECT text 'Hello World' AS hello;
     not need any permissions on the underlying base relations (see
     <xref linkend="rules-privileges">).
    </para>
+   <para>
+    <command>INSERT</command> with an <literal>ON CONFLICT</> clause
+    is only supported on updatable views under specific circumstances.
+    If a set of columns/expressions has been provided with which to
+    infer a unique index to consider as the arbiter of whether the
+    statement ultimately takes an alternative path - if a would-be
+    duplicate violation in some particular unique index is tacitly
+    taken as provoking an alternative <command>UPDATE</command> or
+    <literal>IGNORE</> path - then updatable views are not supported.
+    Since this specification is already mandatory for
+    <command>INSERT</command> with <literal>ON CONFLICT UPDATE</>,
+    this implies that only the <literal>ON CONFLICT IGNORE</> variant
+    is supported, and only when there is no such specification.  For
+    example:
+   </para>
+   <para>
+<programlisting>
+-- Unsupported:
+INSERT INTO my_updatable_view(key, val) VALUES(1, 'foo') ON CONFLICT (key)
+  UPDATE SET val = EXCLUDED.val;
+INSERT INTO my_updatable_view(key, val) VALUES(1, 'bar') ON CONFLICT (key)
+  IGNORE;
+
+-- Supported (note the omission of "key" column):
+INSERT INTO my_updatable_view(key, val) VALUES(1, 'baz') ON CONFLICT
+  IGNORE;
+</programlisting>
+   </para>
   </refsect2>
  </refsect1>
 
diff --git a/doc/src/sgml/ref/insert.sgml b/doc/src/sgml/ref/insert.sgml
index a3cccb9..f5e1541 100644
--- a/doc/src/sgml/ref/insert.sgml
+++ b/doc/src/sgml/ref/insert.sgml
@@ -24,6 +24,14 @@ PostgreSQL documentation
 [ WITH [ RECURSIVE ] <replaceable class="parameter">with_query</replaceable> [, ...] ]
 INSERT INTO <replaceable class="PARAMETER">table_name</replaceable> [ ( <replaceable class="PARAMETER">column_name</replaceable> [, ...] ) ]
     { DEFAULT VALUES | VALUES ( { <replaceable class="PARAMETER">expression</replaceable> | DEFAULT } [, ...] ) [, ...] | <replaceable class="PARAMETER">query</replaceable> }
+    [ ON CONFLICT [ ( { <replaceable class="parameter">column_name_index</replaceable> | ( <replaceable class="parameter">expression_index</replaceable> ) } [, ...] ) ]
+      { IGNORE | UPDATE
+        SET { <replaceable class="PARAMETER">column_name</replaceable> = { <replaceable class="PARAMETER">expression</replaceable> | DEFAULT } |
+              ( <replaceable class="PARAMETER">column_name</replaceable> [, ...] ) = ( { <replaceable class="PARAMETER">expression</replaceable> | DEFAULT } [, ...] )
+            } [, ...]
+        [ WHERE <replaceable class="PARAMETER">condition</replaceable> ]
+      }
+    ]
     [ RETURNING * | <replaceable class="parameter">output_expression</replaceable> [ [ AS ] <replaceable class="parameter">output_name</replaceable> ] [, ...] ]
 </synopsis>
  </refsynopsisdiv>
@@ -32,9 +40,15 @@ INSERT INTO <replaceable class="PARAMETER">table_name</replaceable> [ ( <replace
   <title>Description</title>
 
   <para>
-   <command>INSERT</command> inserts new rows into a table.
-   One can insert one or more rows specified by value expressions,
-   or zero or more rows resulting from a query.
+   <command>INSERT</command> inserts new rows into a table.  One can
+   insert one or more rows specified by value expressions, or zero or
+   more rows resulting from a query.  An alternative path
+   (<literal>IGNORE</literal> or <literal>UPDATE</literal>) can
+   optionally be specified, to be taken in the event of detecting that
+   proceeding with insertion would result in a uniqueness violation
+   (i.e. a conflicting tuple already exists).  The alternative path is
+   considered individually for each row proposed for insertion, and is
+   taken (or not taken) once per row.
   </para>
 
   <para>
@@ -59,22 +73,142 @@ INSERT INTO <replaceable class="PARAMETER">table_name</replaceable> [ ( <replace
   </para>
 
   <para>
+   The optional <literal>ON CONFLICT</> clause specifies a path to
+   take as an alternative to raising a uniqueness violation error.
+   <literal>ON CONFLICT IGNORE</> simply avoids inserting any
+   individual row when it is determined that a uniqueness violation
+   error would otherwise need to be raised.  <literal>ON CONFLICT
+   UPDATE</> has the system take an <command>UPDATE</command> path in
+   respect of such rows instead.  <literal>ON CONFLICT UPDATE</>
+   guarantees an atomic <command>INSERT</command> or
+   <command>UPDATE</command> outcome - provided there is no incidental
+   error, one of those two outcomes is guaranteed, even under high
+   concurrency.  Note that in the event of an <literal>ON CONFLICT</>
+   path being taken, <literal>RETURNING</> returns no value in respect
+   of any not-inserted rows.
+  </para>
+
+  <para>
+   <literal>ON CONFLICT UPDATE</> optionally accepts a
+   <literal>WHERE</> clause <replaceable>condition</>.  When provided,
+   the statement only proceeds with updating if the
+   <replaceable>condition</> is satisfied.  Otherwise, unlike a
+   conventional <command>UPDATE</command>, the row is still locked for
+   update.  Note that the <replaceable>condition</> is evaluated last,
+   after a conflict has been identified as a candidate to update.
+  </para>
+
+  <para>
+   <literal>ON CONFLICT UPDATE</> is effectively an auxiliary query of
+   its parent <command>INSERT</command>.  Two aliases are visible to
+   the auxiliary query only - <varname>TARGET</> and
+   <varname>EXCLUDED</>.  The first alias is just a standard alias for
+   the target relation in the context of the auxiliary query, while
+   the second alias refers to rows originally proposed for insertion.
+   Both aliases can be used in the auxiliary query targetlist and
+   <literal>WHERE</> clause.  This allows expressions (in particular,
+   assignments) to reference rows originally proposed for insertion.
+   Note that the effects of all per-row <literal>BEFORE INSERT</>
+   triggers are carried forward.  This is particularly useful for
+   multi-insert <literal>ON CONFLICT UPDATE</> statements;  when
+   inserting or updating multiple rows, constants need only appear
+   once.
+  </para>
+
+  <para>
+   There are several restrictions on the <literal>ON CONFLICT
+   UPDATE</> clause that do not apply to <command>UPDATE</command>
+   statements.  Subqueries may not appear in either the
+   <command>UPDATE</command> targetlist, nor its <literal>WHERE</>
+   clause (although simple multi-assignment expressions are
+   supported).  <literal>WHERE CURRENT OF</> cannot be used.  In
+   general, only columns in the target table, and excluded values
+   originally proposed for insertion may be referenced.  Operators and
+   functions may be used freely, though.
+  </para>
+
+  <para>
+   <command>INSERT</command> with an <literal>ON CONFLICT UPDATE</>
+   clause is a <quote>deterministic</quote> statement.  This means
+   that the command will not <command>UPDATE</command> any single row
+   more than once; a cardinality violation error will be raised when
+   this situation arises.  Rows proposed for insertion should not
+   duplicate each other in terms of attributes constrained by the
+   conflict-arbitrating unique index.  Note that the ordinary rules
+   for unique indexes with regard to null apply analogously to whether
+   or not an arbitrating unique index indicates if the alternative
+   path should be taken.  This means that when a null value appears in
+   any uniquely constrained tuple's attribute in an
+   <command>INSERT</command> statement with <literal>ON CONFLICT
+   UPDATE</literal>, rows proposed for insertion will never take the
+   alternative path (provided that a <literal>BEFORE ROW
+   INSERT</literal> trigger does not make null values non-null before
+   insertion);  the statement will always insert, assuming there is no
+   unrelated error.  Note that merely locking a row (by having it not
+   satisfy the <literal>WHERE</> clause <replaceable>condition</>)
+   does not count towards whether or not the row has been affected
+   multiple times (and whether or not a cardinality violation error is
+   raised).
+  </para>
+
+  <para>
+   <literal>ON CONFLICT UPDATE</> requires a <emphasis>unique index
+   inference</emphasis> specification, which is an expression
+   containing one or more columns or expressions on columns.  These
+   are used to infer a single unique index to limit pre-checking for
+   duplicates to (if no appropriate index is available, an error is
+   raised).  <literal>ON CONFLICT IGNORE</> makes this optional.
+   Omitting the specification indicates a total indifference to where
+   any would-be uniqueness violation could occur, which isn't always
+   appropriate;  at times, it may be desirable for <literal>ON
+   CONFLICT IGNORE</> to <emphasis>not</emphasis> suppress a duplicate
+   violation within an index where that isn't explicitly anticipated.
+   Note that <literal>ON CONFLICT UPDATE</> assignment may result in a
+   uniqueness violation, just as with a conventional
+   <command>UPDATE</command>.
+  </para>
+
+  <para>
+   The rules for unique index inference are straightforward.  Columns
+   and/or expressions specified must match all the columns/expressions
+   of some existing unique index on <replaceable
+   class="PARAMETER">table_name</replaceable>.  The order of the
+   columns/expressions in the index definition, or whether or not the
+   index definition specified <literal>NULLS FIRST</> or
+   <literal>NULLS LAST</>, or the internal sort order of each column
+   (whether <literal>DESC</> or <literal>ASC</> were specified) are
+   all irrelevant.  However, partial unique indexes are not supported
+   as arbiters of whether an alternative <literal>ON CONFLICT</> path
+   should be taken, nor are deferred unique constraints.
+  </para>
+
+  <para>
    The optional <literal>RETURNING</> clause causes <command>INSERT</>
    to compute and return value(s) based on each row actually inserted.
    This is primarily useful for obtaining values that were supplied by
    defaults, such as a serial sequence number.  However, any expression
    using the table's columns is allowed.  The syntax of the
    <literal>RETURNING</> list is identical to that of the output list
-   of <command>SELECT</>.
+   of <command>SELECT</>.  Only rows that were successfully inserted
+   will be returned.  Since <literal>RETURNING</> is not part of the
+   <command>UPDATE</> auxiliary query, the special <literal>ON
+   CONFLICT UPDATE</> aliases (<varname>TARGET</> and
+   <varname>EXCLUDED</>) may not be referenced.
   </para>
 
   <para>
    You must have <literal>INSERT</literal> privilege on a table in
-   order to insert into it.  If a column list is specified, you only
-   need <literal>INSERT</literal> privilege on the listed columns.
-   Use of the <literal>RETURNING</> clause requires <literal>SELECT</>
-   privilege on all columns mentioned in <literal>RETURNING</>.
-   If you use the <replaceable
+   order to insert into it, as well as <literal>UPDATE
+   privilege</literal> if and only if <literal>ON CONFLICT UPDATE</>
+   is specified.  If a column list is specified, you only need
+   <literal>INSERT</literal> privilege on the listed columns.
+   Similarly, when <literal>ON CONFLICT UPDATE</> is specified, you
+   only need <literal>UPDATE</> privilege on the column(s) that are
+   listed to be updated, as well as SELECT privilege on any column
+   whose values are read in the <literal>ON CONFLICT UPDATE</>
+   expressions or condition.  Use of the <literal>RETURNING</> clause
+   requires <literal>SELECT</> privilege on all columns mentioned in
+   <literal>RETURNING</>.  If you use the <replaceable
    class="PARAMETER">query</replaceable> clause to insert rows from a
    query, you of course need to have <literal>SELECT</literal> privilege on
    any table or column used in the query.
@@ -121,7 +255,45 @@ INSERT INTO <replaceable class="PARAMETER">table_name</replaceable> [ ( <replace
       The name of a column in the table named by <replaceable class="PARAMETER">table_name</replaceable>.
       The column name can be qualified with a subfield name or array
       subscript, if needed.  (Inserting into only some fields of a
-      composite column leaves the other fields null.)
+      composite column leaves the other fields null.)  When
+      referencing a column with <literal>ON CONFLICT UPDATE</>, do not
+      include the table's name in the specification of a target
+      column.  For example, <literal>INSERT ... ON CONFLICT UPDATE tab
+      SET TARGET.col = 1</> is invalid.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><replaceable class="PARAMETER">column_name_index</replaceable></term>
+    <listitem>
+     <para>
+      The name of a <replaceable
+      class="PARAMETER">table_name</replaceable> column (with several
+      columns potentially named).  These are used to infer a
+      particular unique index defined on <replaceable
+      class="PARAMETER">table_name</replaceable>.  This requires
+      <literal>ON CONFLICT UPDATE</> and <literal>ON CONFLICT
+      IGNORE</> to assume that all expected sources of uniqueness
+      violations originate within the columns/rows constrained by the
+      unique index.  When this is omitted, (which is forbidden with
+      the <literal>ON CONFLICT UPDATE</> variant), the system checks
+      for sources of uniqueness violations ahead of time in all unique
+      indexes.  Otherwise, only a single specified unique index is
+      checked ahead of time, and uniqueness violation errors can
+      appear for conflicts originating in any other unique index.  If
+      a unique index cannot be inferred, an error is raised.
+     </para>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
+    <term><replaceable class="PARAMETER">expression_index</replaceable></term>
+    <listitem>
+     <para>
+      Equivalent to <replaceable
+      class="PARAMETER">column_name_index</replaceable>, but used to
+      infer a particular expressional index instead.
      </para>
     </listitem>
    </varlistentry>
@@ -167,12 +339,25 @@ INSERT INTO <replaceable class="PARAMETER">table_name</replaceable> [ ( <replace
    </varlistentry>
 
    <varlistentry>
+    <term><replaceable class="PARAMETER">condition</replaceable></term>
+    <listitem>
+     <para>
+      An expression that returns a value of type <type>boolean</type>.
+      Only rows for which this expression returns <literal>true</>
+      will be updated, although all rows will be locked when the
+      <literal>ON CONFLICT UPDATE</> path is taken.
+     </para>
+    </listitem>
+   </varlistentry>
+   <varlistentry>
+
     <term><replaceable class="PARAMETER">output_expression</replaceable></term>
     <listitem>
      <para>
       An expression to be computed and returned by the <command>INSERT</>
-      command after each row is inserted.  The expression can use any
-      column names of the table named by <replaceable class="PARAMETER">table_name</replaceable>.
+      command after each row is inserted (not updated). The
+      expression can use any column names of the table named by
+      <replaceable class="PARAMETER">table_name</replaceable>.
       Write <literal>*</> to return all columns of the inserted row(s).
      </para>
     </listitem>
@@ -204,14 +389,16 @@ INSERT <replaceable>oid</replaceable> <replaceable class="parameter">count</repl
    <replaceable class="parameter">oid</replaceable> is the
    <acronym>OID</acronym> assigned to the inserted row.  Otherwise
    <replaceable class="parameter">oid</replaceable> is zero.
+   The command tag does not indicate the number of rows updated by
+   <literal>ON CONFLICT UPDATE</>.
   </para>
 
   <para>
    If the <command>INSERT</> command contains a <literal>RETURNING</>
    clause, the result will be similar to that of a <command>SELECT</>
    statement containing the columns and values defined in the
-   <literal>RETURNING</> list, computed over the row(s) inserted by the
-   command.
+   <literal>RETURNING</> list, computed over the row(s) inserted (not
+   updated) by the command.
   </para>
  </refsect1>
 
@@ -311,7 +498,49 @@ WITH upd AS (
     RETURNING *
 )
 INSERT INTO employees_log SELECT *, current_timestamp FROM upd;
-</programlisting></para>
+</programlisting>
+  </para>
+  <para>
+   Insert or update new distributors as appropriate.  Assumes a unique
+   index has been defined that constrains values appearing in the
+   <literal>did</literal> column.  Note that an <varname>EXCLUDED</>
+   expression is used to reference values originally proposed for
+   insertion:
+<programlisting>
+  INSERT INTO distributors (did, dname)
+  VALUES (5, 'Gizmo transglobal'), (6, 'Doohickey, inc')
+  ON CONFLICT (did) UPDATE
+  SET dname = EXCLUDED.dname || ' (formerly ' || TARGET.dname || ')'
+</programlisting>
+  </para>
+  <para>
+   Insert a distributor, or do nothing for rows proposed for insertion
+   when an existing, excluded row (a row with a matching constrained
+   column or columns after before row insert triggers fire) exists.
+   Assumes a unique index has been defined that constrains values
+   appearing in the <literal>did</literal> column (although since the
+   <literal>IGNORE</> variant was used, the specification of columns
+   to infer a unique index from is not mandatory):
+<programlisting>
+  INSERT INTO distributors (did, dname) VALUES (7, 'Doodad GmbH')
+  ON CONFLICT (did) IGNORE
+</programlisting>
+  </para>
+  <para>
+   Insert or update new distributors as appropriate.  Assumes a unique
+   index has been defined that constrains values appearing in the
+   <literal>did</literal> column.  <literal>WHERE</> clause is used to
+   limit the rows actually updated (any existing row not updated will
+   still be locked, though):
+<programlisting>
+  -- Don't update any existing row if it was already renamed at some
+  -- earlier stage
+  INSERT INTO distributors (did, dname) VALUES (8, 'Thingamabob Distribution')
+  ON CONFLICT (did) UPDATE
+  SET dname = EXCLUDED.dname || ' (formerly ' || TARGET.dname || ')'
+  WHERE TARGET.dname NOT LIKE '%(formerly %)'
+</programlisting>
+  </para>
  </refsect1>
 
  <refsect1>
@@ -321,7 +550,8 @@ INSERT INTO employees_log SELECT *, current_timestamp FROM upd;
    <command>INSERT</command> conforms to the SQL standard, except that
    the <literal>RETURNING</> clause is a
    <productname>PostgreSQL</productname> extension, as is the ability
-   to use <literal>WITH</> with <command>INSERT</>.
+   to use <literal>WITH</> with <command>INSERT</>, and the ability to
+   specify an alternative path with <literal>ON CONFLICT</>.
    Also, the case in
    which a column name list is omitted, but not all the columns are
    filled from the <literal>VALUES</> clause or <replaceable>query</>,
diff --git a/doc/src/sgml/ref/set_constraints.sgml b/doc/src/sgml/ref/set_constraints.sgml
index 7c31871..1e0a2f8 100644
--- a/doc/src/sgml/ref/set_constraints.sgml
+++ b/doc/src/sgml/ref/set_constraints.sgml
@@ -69,7 +69,11 @@ SET CONSTRAINTS { ALL | <replaceable class="parameter">name</replaceable> [, ...
   <para>
    Currently, only <literal>UNIQUE</>, <literal>PRIMARY KEY</>,
    <literal>REFERENCES</> (foreign key), and <literal>EXCLUDE</>
-   constraints are affected by this setting.
+   constraints are affected by this setting.  Note that constraints
+   that were created with this clause cannot be used as arbiters of
+   whether or not to take the alternative path with an
+   <command>INSERT</command> statement that includes an <literal>ON
+   CONFLICT UPDATE</> clause.
    <literal>NOT NULL</> and <literal>CHECK</> constraints are
    always checked immediately when a row is inserted or modified
    (<emphasis>not</> at the end of the statement).
diff --git a/doc/src/sgml/trigger.sgml b/doc/src/sgml/trigger.sgml
index f94aea1..71ddeee 100644
--- a/doc/src/sgml/trigger.sgml
+++ b/doc/src/sgml/trigger.sgml
@@ -40,7 +40,10 @@
     On tables and foreign tables, triggers can be defined to execute either
     before or after any <command>INSERT</command>, <command>UPDATE</command>,
     or <command>DELETE</command> operation, either once per modified row,
-    or once per <acronym>SQL</acronym> statement.
+    or once per <acronym>SQL</acronym> statement.  If an <command>INSERT</command>
+    contains an <literal>ON CONFLICT UPDATE</> clause, it is possible that the
+    effects of a BEFORE insert trigger and a BEFORE update trigger can both be
+    applied twice, if an <varname>EXCLUDED</> expression appears.
     <command>UPDATE</command> triggers can moreover be set to fire only if
     certain columns are mentioned in the <literal>SET</literal> clause of the
     <command>UPDATE</command> statement.
@@ -119,6 +122,30 @@
    </para>
 
    <para>
+    If an <command>INSERT</command> contains an <literal>ON CONFLICT
+    UPDATE</> clause, it is possible that the effects of all row-level
+    <literal>BEFORE</> <command>INSERT</command> triggers and all
+    row-level BEFORE <command>UPDATE</command> triggers can both be
+    applied in a way that is apparent from the final state of the
+    updated row, if an <varname>EXCLUDED</> expression appears.  There
+    need not be an <varname>EXCLUDED</> expression for both sets of
+    BEFORE row-level triggers to execute, though.  The possibility of
+    surprising outcomes should be considered when there are both
+    <literal>BEFORE</> <command>INSERT</command> and
+    <literal>BEFORE</> <command>UPDATE</command> row-level triggers
+    that both affect a row being inserted/updated (this can still be
+    problematic if the modifications are more or less equivalent if
+    they're not also idempotent).  Note that statement-level
+    <command>UPDATE</command> triggers are never executed when
+    <literal>ON CONFLICT UPDATE</> is specified, since technically an
+    UPDATE statement was not executed.  <literal>ON CONFLICT UPDATE</>
+    is not supported on views (Only <literal>ON CONFLICT IGNORE</> is
+    supported on updatable views);  therefore, unpredictable
+    interactions with <literal>INSTEAD OF</> triggers are not
+    possible.
+   </para>
+
+   <para>
     Trigger functions invoked by per-statement triggers should always
     return <symbol>NULL</symbol>. Trigger functions invoked by per-row
     triggers can return a table row (a value of
-- 
1.9.1

#164Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#163)
2 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Nov 5, 2014 at 1:09 PM, Peter Geoghegan <pg@heroku.com> wrote:

Once I fix that (provided it doesn't take too long), I'll publish a
V1.4. AFAICT, that'll close out all of the current open issues.

Attached is V1.4. As with V1.3, I continue to maintain both approaches
to value locking in parallel, believing this to be the most useful
direction for development to take for the time being. The consensus is
for approach #2 to value locking [1]https://wiki.postgresql.org/wiki/Value_locking#.232._.22Promise.22_heap_tuples_.28Heikki_Linnakangas.29, but I see no reason to deny
reviewers the chance to compare both approaches. It's easy to maintain
the two, as the value locking implementation is well encapsulated -
The executor level stuff that has been altered in the last few
revisions tends to cause very few or no conflicts when rebasing.

Highlights
=======

* Costing of indexes for the purposes of determining which to have
arbitrate whether or not the executor takes the alternative path. So,
a list of expressions is created during parse analysis, and that list
is matched against existing indexes during optimization. It's usually
possible to avoid the work of generating paths, because (it seems
reasonable to suppose) there is usually 0 or 1 possible indexes in
representative cases. If it's 0, we get an error, originating from
where we now do this work -- the optimizer.

* EXCLUDED.* (and TARGET.*) pseudo-aliases (compare OLD.* and NEW.* in
the context of user-defined rules and conditional triggers) are
visible within auxiliary UPDATE (but not parent INSERT). See the
commit message for details on how that works. In short, we still have
a dedicated primnode expression, ExcludedExpr, but it is not ever
generated by the raw grammar (it can only be added by the during the
rewriting stage of query processing). It's just a facade, but a
perfectly convincing one. Note that this means that Vars can be
referenced from "another RTE" in what is actually a relation scan node
of the target:

postgres=# explain INSERT INTO upsert values(1, 'foo') on conflict
(key) update set val = excluded.val where excluded.val != 'bar';
QUERY PLAN
------------------------------------------------------------------------
Insert on upsert (cost=0.00..0.01 rows=1 width=0)
-> Result (cost=0.00..0.01 rows=1 width=0)
-> Conflict Update on upsert (cost=0.00..32.99 rows=1591 width=36)
Filter: ((excluded.val) <> 'bar'::text)
(4 rows)

Here, you're seeing a "Conflict Update" scan (actually, a quasi-hidden
sequential scan) on the upsert table that references a Var from the
facade excluded.* table/RTE. In fact, the Var is on the target table,
but read through our internal expression primnode (ExcludedExpr) so as
to get access to the excluded-from-insertion tuple slot during EPQ
expression evaluation for the UPDATE.

* postgres_fdw support for the IGNORE variant (provided there was no
unique index inference specification - just as with updatable views).

* Documentation clean-up - as I mentioned, I tried to address Simon's
concerns here. Also, as you'd expect, the documentation has been fixed
up to reflect the new syntax. I'll need to take a pass at updating the
UPSERT Wiki page soon, too.

Next steps
========

AFAICT, this revision addresses all open items bar one - the RLS bug,
which I could not decide on a fix for. I refer to the RLS issue
described on the Wiki [2]https://wiki.postgresql.org/wiki/UPSERT#RLS -- Peter Geoghegan. As I mentioned before, I'd really like to
get some reviewer time on the executor level aspects of this, which
are relatively new, and have received no scrutiny from anyone else
that I'm aware of. This list of items is a good place to start, for
those that are interested:

https://wiki.postgresql.org/wiki/UPSERT#Miscellaneous_odd_properties_of_proposed_ON_CONFLICT_patch

My use of the EvalPlanQual() mechanism, and the structure of the plan
tree in general could really use some scrutiny too.

Thanks

[1]: https://wiki.postgresql.org/wiki/Value_locking#.232._.22Promise.22_heap_tuples_.28Heikki_Linnakangas.29
[2]: https://wiki.postgresql.org/wiki/UPSERT#RLS -- Peter Geoghegan
--
Peter Geoghegan

Attachments:

v1.4.vallock2.tar.gzapplication/x-gzip; name=v1.4.vallock2.tar.gzDownload
��IaT�\{��F����S�g#��
4����5�f<}�/��>��Q�
�GHX�n���g���HH<����6��i�����eVfV���^��D�����xX[�����k�F�gE�i�/jW���x�����5���O>���W��n���1Z���Lo�F�0���FS�t����Q���OF<`���l?����O?oA�L4�z$�n7��h���a�u�e5��-z��e���6�����dz�5��k�45�����������{�����s����/�h�<��8U���A<�������f���`�F���b�GaE������wL?���!D��(�@�%eQ&!�~�x����������]UY \90��{3�"n��	/
(��f���7��_9��/C-8���@,-<fOs��3�w��B�?�N�������A�_U�������`S��<J�g����b�����,q��	�J��b���b)���+6�.����=����),C��?�b.���{,�r�=��Y�u��	�\\\OT�`�K�KKKEeL����P����c_���R0����Y8�$���EbA4@C�`�B���x��������k�6V\����
	K@�g-G�-���P��u��_��,v�����F���'|�kq�������s�
Y,�N
!�7
x��P�x�]�}���w���������8��Tp���~8�V��-��������A�"�J�1}m�@�N�CMx�%�jA��0
����?A�P�F~����0L5`O@�B�C�t<'��*j�����)B�f��^]��j���<[�a4}�L��������W������ufr����0��,WkRv\�-x�)��tu6A��_�E�S��
P��O_n��m����`���������X��g�[���r}�E��-(���GE��+����B����.�O�
@�8�0���B����R�X([�h����?E�p��v;�]&�$��bs#�1�	�!��;���A
���.-�����-'�a�Z�rRo�4�����������NcO��i��Z}fW������t�j��,?;F��c�4��~f�e���N�n���%��4T��Z��G��������n��N�n%D�.����qf��c^���'�+0v�$������G�/�f�)+�K5��svqs�f�
����J��w�N�}9g�"��2��H��,�-G��V^k�G��6��+�Q��S%p7����f�r���NF��@����Rao�Y���>ki�{���k���������hs;+�}��8�Q�{�JQ^�����A� b��!ZD�$��U&��v�S,x�{Ve1����,�"a��J����k���{��c�|��u�8����%��l����.�r2U�����=G�Qy����B*��*�$�*�[�O�"�
A���u�I2u}<�)q���
m��V�W�7��iZ�c���cF6T�C'���������xY��e~����	paZE�V�*�#KW�E�)xf>����qr��oX��223^�S�5S��zN�+���	<����o�����~�M�	K:�Q����*Q�CN�
2jp�8����/��
 >����C�k��������"&������=��!�:�*L��W
�� �1��.=�t���=g�������hx��`L���������W������fhi�\���/���Zf�#�y��'�7vr�Q,�X����X�^�%x�`�Q���b�xB��f
�F����*T��@D����y9y^`:�zc���UVV�jo`v�(yBQrekB�NS]�v=k����������_�i��I\����a����c����-�;������)x'=��1V����f� k��p���9nUcX>`���@��D�`�\�h�a�2���9b�&��&rpS�q�u0G3W  �H��-kqp���: 4����<�u
���x�����l6�{���A��&����c�E�_W�M�U�*�~W���/Y1��B�-���j��?�!�����fM�`6F��)����n���^����J�(��V�-$������������������'�k�����I�,��`����Bx,��M<�Z��(?�������p70q��2�/M�e5��Ah�Z�������b���������O��IAi�R3zj]�^�s2�G����7��������d����F�,cH+RNmea�i38$�b]�J'�5N�U��Ve�xR�a�G@�����6�Kk�������
������]��!����E����Px��2��z�%la���EEu�]�"*�QZ�����"�
'�t��QMw��
@I�|��8;A1�~�C�Q�T4%CU:�$��2!�2�����c;W��p),<3W��tLu��F�d6
����cf����D
���c��J�,���zy�����������D���z�>{��'H4�nA2x�}�f�AA-�}z_D�,��`R[�y��kn���t2!��Wu�"��A
v|�9���'{{7Z��1��x]��c���3�<T�/������	qvm"!��eT�9!&� L7��_�B���.�L����������W�)+�kV>Ui��W�F���L<�<��n� ,�����������"���td���\�R����.��d���I�R?��N�tF���c���N�y�+��C^^������q�fwKb-��Z�YH�?+��N3�)��E���H���	�O�G"�G{mA�]<�A�J[p���U�,
om�@j�W�6�q]
��&�N���{���N�p���neOR��VEM����w+���+��R�l>������q�G�X������R��������U'�Os�����@'���/��VZLM��������nTe/6e%gpq��h�Y������_T2Z%�A���y
W����cZ��3�/����+�Qt;f�l���������8�k���y
.M���Rr����*��e�e���.���<\�������e9�!��%OC2���2�()d��0+�t����T!Un�+����vPm������p�#���M�%f�%$ �A�Ir���(M��`�m������2�&�BB��]P��RYDsx���u�������AR@���$:*��h)&,L1a3��8�`}3��"In+�X�T]Q����m�CxIU�-)�<j7d��+@�E�\q��C;��#H�]���o�n�;"I��.w`C>?��b�.��r�(&��������� �g�HD��I��%��m�^��8��t
�������f�E��x�H@�,0��R
���L�eL����*'�B������KD�h.�n��}+a������*��f�l[�z��������_[�������v��� 0�~�PMpr	v\�k�I�����*\ym��<K���=U��R$[+����M�B�|zZ*^M�z�B��!����]'�`hK�(��A���1�����9w��Q���I������)���hB�������[���TU�#�����S#F�R�B��v�rZ�x�&��j�"T
�������c��=�y
�Tu��%��z��A���~
2�!�l���6�&���2��~�TZ����.BAp/�
�M�L��{N2�0����rYe]��<��T$�6�m�jgs���:������6�����m.�����������	���Fs��d���=��g�S�0w�7WA�9j�E[��n���~��"���{�����Z��<�k��=Yk�<�)X�p�uD��������[O�,��@������3w��K6�z���L���	 -�7:[��Kj;��y�g/NQcb\�
XQ������0��8�I�&�(�luG��2<���*�/�L��.J�C�aV���R�z(��@6J0G�������S\�O�T�&�n��3`�iuK�{|�]����%�8�6m��+9)���@m���d��Fw�+��C�|�����V����g����_�����U�S?e`��%f2�����g�_��W����������]�S7�S���b3�����O�8����k���Cl�B�s8�8��r��
����o�V�O,,`a�A��z[o�a�w������l�v�O����B��W���b_����'�e��������y�z����P�s��={�[;+�;z;I�5o�	���r��F��~���ohO�	y�Q ��K���4��#�X8�������:�*�
_�j��q�c������S�Y�n�JSnq6w���n�9w���nq=w/M����-�rV�"���w��@1*��9���rM�O���)�������P�`��
FC������F��u��/���"k&Xkv
��S��Z5��2���Cm������.�n�0K�	a���L����.CiiC��l��c����*Gee������=�a��=�x�G�J>nr��8�&���L=L`\e�]�,��nf9��|I�B+&�lCzM�
+:�����D�a�vcY|lko�1��Bjn^��^�y� y�K�����;F�o���\����,����#����f/|sbW&�^�&�a�������'mb����6@��r}�������+�M�|���b
�3Z���U�4�.�*�eT<��p�(c-jo�&�@j^��������:�F���Ar�V���-�]��:�F����n�&��'�W����������G4Ig\��cV���1M�������G��)�F���=���D�O���m-���u����h��S�2m�>������u���i��O�?�+>t�����e�-[����4Z��� �)��{��3-�#[�1�?}���5������������q�S�RM�K�^g�Cr~I^)d��q<���@���;)k��^R���!���N��h�d6�{$+M�f$7_��a
���-��)M/��h�;���ze�=&~v���|s	�%����!�]���?��C��R��3W@{x�L.�c���Z<h7t�h��q<R�o�����x6�l3��A���Gt"L~P���|���?1);�����cs�5C������[�Er��,�����J�;@��L� \��,,X���x~T��IV��2�O���k9\��`��=��v���tJ�/x�p�=�h-K�)9�	�m�.�X�	7�n�����z���]�����M�sV�#���/(�G���,um��3�x��3��_�U�)����1�D.mE���������'�����`F�����j���REx��e]U�D�A�����r%9�*\ �|�
_
%���������,���K�.��\���K`���za�K�@���`�+a�R�����" �
=:��|��"'z�����|wq�B����b��Z��#��&�7C:�hU�8)>�-�(���i���A�BN8]I]�-s+��=����R��Y�����`
:��B�/�l���� �������`0����4�N��ywd��_V�5{�.���2d�VKkq$�5
��5������U�J��?�)g�|���1��$S�Eh!p&�������H���O1fA'�y��dn(R&)�y�y�rV8�@���o_U��9�$'������LwO����pU�y'���uh�qi�a�D
�4�oG��Hd/���4(�t�V_"� �}�q8]�>��'�"����������NI�;�	�T����t����O�8KqU�6zq?�����P,H�����\�N�H�]�bj��,��r0\�%������1���Y���N5oT1�O��F�D���a<Y��Ft�Q�����=;�\��SBE�Z����(&� ]a�/��KuQ�-
����/���/D:s
@�+�B�/�j@{��0����z�v7�Y*P+#G�<����|:)Ti����4��y9����s�K�<<(�6���ZBW	F�r"�8��&������
?�><�����F�V�����l�,��[�c�����epVf��������S�GKmK����:�������lysK1���1�6}��6�s`w3��%�	�����2	Hyc���H�>��=DO�V�T����o&b��(��3�������i��2a�i&
�����5Jz��H���>�<�����S��Z�D��mL�U��P����K��?�VB���/xA5��~����./�`��qB�u�Q�>E_���w������38����H��cR�<R��t�$&�l-���!o���x$9�5�x�����F�H��:��9 ������j�f����d]�3`�?�$�_U��������}�|���3�p����d��gt����@%d�T7��,2
`��G�w����5����5;��(PN����W����Y��dl����Y�t�gJ��T}��������������N!����DMOj?�>R�N`'���_��d-�b"���v~�"\R[����xb����"�g<58X�k�����cx��l����rl�uhVxe}2�����Af]��1��q����(Sm�H2=>lET���|��������\1����\����<����f�������YvWo��W��|��%�����b����@`V����n���|��-&���WWOn��O~y�SuA��p�x�Ke��X���rE`u?[��������C�����6[���������0�V�6����
�%���k#�Ia��Z������'-#���?���X�.l*6Z}%�����O���!wz���W��E��d���	���L_eo������z2}�c
���+bf�ZOWt�e
��TPQ������� �\�YO�3]e.`J�����o�!�����4(v���*��7��ck�Q�sx�h5���`t0�t�h���B���� T�BT?)��?�%U��H��&I�o���o�$������Y���.H%���3��S��>S�t�?xZ���f����n���&5H��Q��aD^�����%$w:Lk2|��Sg�.3P@<��^oT�f>[�w)�"%o��m(��)kn���������;�V���u����`���8��c�#2v��9���~�*�g�E#�/G�mB~��	'�y�.���5�D���8M���M��[�9�
%:"�[S�4�� AC���k�?����f:�G���|a��8�;
�-om���#�:����A[���M�w���*�[�*�'�WG�������u�v������fdu���u���-�tg�kq��YOZ�@{A��*V�zE��A�����3U�Z��Jl��>#���YP[�Yk���>�B�
j����o���8�G����[oV�����K�
y35���I�E>KT�����D�tQ��a5��J�S�E�T�E��'��M��m���{��mn��V�s\��Y���o���S�G�Eh�|��G)�����c���]�#$������o/.��'e�jT�IrS�q	�0�8.L|3�������>�)3��I����2�cWo�����sVfo�S�6����1~v�c�.�����L�F����V{�2�58���l}�n�X}��Q������2\�n8����\�zQ�8��-$U���+�:���?���/�!�j<,�����i_��VC0�Fs�8�4o7f����&<%���`�et�
d>���G68F�q[�!�l$��W
V�H�c� �/6��H�\KLm����������*���F��;����W8�$9���;}���p
j�J���~�0�����l��N�';]?���o�������|<�]^q7jA����)%�,�����^�g��w9����[a]=��wgG��?�A�`;���������2���4&�Ri���vC�7u��T%���=<��wE#���y��QS�$���8���
���*8&���:YL����ho�DC�F���2A��2����mp9����f��?>TQ�&��`�K��r~�;�<U��=FF��H
�&�z~�p�����a�|��MY\��+�����Rp3�KQh\��^	���?�DO��EK�U����?����7���&�|�	R�Q�x>"�������)E��M�;e`�?L��_��.HB�_U�����}�\o���"~��{iA`@O�K%$�����a�q&*�p6����J��q+<,��;1|�'p�:k�}D���?���"�~h�'%[�g���h�G�f9��fH����D��U��ZP���EVA'����x��G��A��0F�r����l�'��>r��	{q s�}�D��%qE�=V���Q{�)�C�
5d(O�n	^��*�`��6>1����g�]���Z�`�8!�����Tw�����-��n��<$�y��$Z0�P3	� �&��}�` 3U��?��	{�!1���!������p���!9;�S�a6�h��m�]_��q��mf4�Q�8]D����a��;�s�g���Q��|�$4YrD����+�����r4d����X�0D!�FdPl�k���1SB�c^�mIo�N�B��f��6�f�����]�9�����n��s�r_:�S\-w���b�4��o0��*3t�}Z{��w�"N=��^���x���Ad�8&��_�zUy::���Uo��z��p����'.�f����r��d	�sv����(7D�j��ui�����/�	����k��>(KHW1vX�-���~�d�W��7�i�$�#A��	����l������O�',!�����'�s�v5�D��|�T�&�=���b<���F*ZI;���+�
�i��9�T%3}��a4W;�2��I��Tv��xDc����
��GP/�Y�k�����)���_�NV�W��������X>zhN�5csJ>jp�����H�HY�	��Cq����J�n�;���//=I�EQ�F�dESz���w3����UD��
+����R�L?N'�'$���h����58���[����"k�!�
����R����d�6��I,�����9��h�x�����"������C�������%�5(����>;�w�00!5����[������S���c���$��s��Y�eO�����N��������t����	�(��-��b~U\���,���|�)����e��	�c��d������N�sA�����<d����~[�1������irD������n���$��j.:��F�t.�S�*Y�EI���x
��qxC���qO��G��6�?�]��������������g���Y���{<&�n�%~�����B�[A���_1��SqK:=;���W�����g]�r-p���{�uC
�q)��{���@��|��WU�?U������5)�B��SHB1a��I��}VKFnU[��������d_��fj���{��4�����\V�l��&=�]q7��A"��=�s�%����U������!�:p'� W�e�S}�h��9b��H+��H�h��jL1�JH��s���1����.�����hI����ukiS���U�nD*2+/��������;++Z�PyH��7~������o�G����	i�]�P�
4��:r@,���:jH�>�������o�#��q����g��^��%|%�Qt��'�p�
5� �OT5��d2r/i����P�8���J�<^�����*{_L��;�����%��Y���f��N����'������Sn�4�1���`��[�d�C���DQSvGzR�*�IR��V�v��������*����|j4{�.��uGl����7V	�}��U��wvq����s���F�
�M��hh���8�8b���p����?F�N���Y|%AmZjG����nZb�!��:��"�}2�.�P���Bs��@Z�V%?�3�QP��+�YDk �Y�oN)4oU�'<F��J�ftUp.�g�OJ<��o�`��_�V���?IL\s?�U��b�(v4��\VD"	 DV�r�@]`oE���\��L��-Y*�CV����C����@��
�����a��=���i�.MX�F�r���F�]�	JC0�aL��w�%B*�[gu�	��5f�i��A��-h�
����lA�-!s����
\����N�x�������	<�w���s�+����y��S���}�I�jYb(�o�j�O"�Nw#���e���3��=�����-�� i��>�)NV��3���T�F�D'lS����0}������u�+E�����Z����A���[�����
(�@d������<��v�U���:g��LQ�3Md����\Md�Nz�O�'��bn{���'��3�i
w��z�Yi�]d1�{.'�3(����~�N]j)Q���������iZxx[[��i�x������Wc�nK���|J�����Dn�����H�� 2�tA-

��:���d_g�xU�{�"j�7C��`�%@��||'0��bJ�7I7���!�����F�f�LR�@P�k#L�?���K����,G��?�]��ck�����yWOG�
0Vt�����BJq����P2�[(����������J�������$n�&$Wm��e��}m���f��4����W���9Hg������.%?~���F]�r��D�����R��NL�z��Kv���2Nf�C�t���we!����m�EVU�H����{��@�:���*���I�"."F���]*��J��=8=������Y�Y�D$m�Q��8!��"%P�p�6C!�|��(2��7����!�h��2_A��x�U�����f��F#S�{���Ge��2���y(�
�%5�D�3��)��9�He%��o�|�|�PH�<5�C��p4b�Bq��l�,��e{�5�+j��3�e�L{{ty}ztF��p|>$2=�J.h}��1$kY<���Antt��D �g�C��
�'m?V0��D"����H��HD�/A#=����I�	/��_G���<d���B�Irk�Ia�?�1=�u���/�������3Us��pE��������V��&�R����i���Bd���{i|[��V���������[iX���������5�j�� ;\��+]?{�J�`Av�i�~��V��e<�bQ��Y%� �,V��'����
(RN5M����"��q�g�H$��T�#�B�J"q�?��(G�Z�!�~��9����~�\�O�=j::��5:Y�?�N.��a~4�n`�uB@+�YU���7���~=>��+��z�#6'�4q���`�-?T�5�"����>{EjJha�qb�;��6��_T<o#�j�J�D8��������A����eWx�|W�!�9�� ����h������;t�tjY�Fc����o�l��eh�:��_���\������4���6<����|<���w�>��y6=(�o�)�'����!F$���n/�y�����	��su���+�Hb�r:��%���]�S�L�a}J1�o�8�#�R���K��w�d��/�_�G��+i����:j}�3^X�fw�p��]'Z����
.��[`���.z|��q�s:LT�c��R�P�������a=��s��R��4�K��oS|7���x4����1���k����%�(_��,8&��EB/\�d��D��� ���^�����rf0m�h�km(�w���h���cs����!���*T��@*w;i�t����GR���a�e�H�g�����l��\���Z�����P���M������zEp~��2]���F&"��f'j���]]B�j*�c<�"+�� ���������]��e���6��v�Z�����p����J���[�d�N
*�����3J������{����/]����UY�
I^�����H�#���ki��sO�!ii�>t�KbH��)���OnL���!)��6�����S(e���?�>��V�[��B�RM�������i���p���N�3��6"���������r�=����z	0�~���������B����w��q{
�P%|���H��T���$0;J4�$I)#�����g,v�Rk�.P�2��	s�j�D��W������G-�_+���d"��-t�����_��������&O�>��T?��JO.7�-$��<W�����/�����@{N�OWJ�h
%P(��B�P�yZ�{����,�nv�ts_g���b�k��L��<n��}�����Fg��_,�C����am��f�Z�`��ia�X�Wm!P�!�����5������h���D�0't�R�^��m6�hr;�06�4�
�}��_�������L��.y�������f���1�+����v��v���}�r�<P�#��I��Bo�l��_�A�����C ���\8�t5rN"`�K���0?���1���x���}4��Z�5v����~��i��<���%������f�A��8�A�R>�������R����{���#�r���3g��f����m��t��1A}�b$a��;����}�-y���&d��wD1���N�s����2���V�9�:sim�
f�!�"!����@	��I���R�BI�!" �)��QB�<����QW#��C���P����B�q���M�'��������
�a��G�\5T�4k�<���qz���\�8ov���;YHj��� ������L��E.������:nck�Nzj*��|0�h-�o��^q3����El0�G����\���g���������{�mH�c���Nf�2���^g�s�\KB<J����A��6a8j/���GGw)T���N�2c���!�GpO��6���]	�T���8Q���ry�2�Ihx ����(�o:�	kV�����>|��J����[�*��i�t�����xB��;/$[);;�[��g�/� ��Q�Kj��F��V�������<������VX��x��|o
;(��9�w['����6���giC8��x�7.�������Ov*��E.z&����4	2?ydk�
�6L�=������(<3@B�+��>_'m���ge��%�~�^
��A����^q��:��X�W����{��'Hm��Im�C��N�T��3$6�;<���� 9�cE�z���[�N���G$��/M��xc?���\��;�x<K����������g�q����$�YT��t8�o��?��ah?�����(��E���S��{-�1�z�pj�<�,�T��+w_^�
�{��Yx7�����Wn�hc��`N��t��Cv%%������F�y6!�uz{vtz�{uq����w������Q�kJ�,�e~u]��nv���W|WH��p�/��z�v���Q��Q	��~%�S@��L#5��j4:����xE���B]�Qu��Y�t�cm�"���8������Ol�~1�DV��;������t4���Y/i��d��uL�qC�h�L�6�e_`���V�E8�$D�c����/�&.�$��SSM?��U����+�.h������^�&t���|���C2Fx�O�F��	�s(��I sq���#�(�@0u����X�%��irT�K����P��_~	�7�l�68��}��c~�P�����|��{(h���
�T��U��nj+�%����Y�_�l����*���7�-��A25���������C�,>Q�!����_W�dF��a�zx�4�������*��J1r�a�����)v\��T)me�	���1B�(jY��;��Mf��[_Cq!����f)Y�n>SK?�Af3Sq�E�a��D�%�������[��J�~��t�F��"�&	�!��=�hT��2��n�k�����U�S��w��3��xl`)���;��1'���b����O����
vL$���	���IMl����j�n�����M���@��4�:�q�C����X"�z��|������8w������2@gb��d#�(��ci����b������#�q�&�[<�Ny�m'YS��S�|���MV�n�tt���@���G�F�Y��:Q�6X��������Q�0���������3d��kn�x����[-����D�e]�Y�	����h���;��]�t���:$��-�0�K�A��N��V�|�H>�>h�L����p}9BG�0�l��y"E��[[w��� Kj���4�O�a��,�����G���p���t��/5:�1���`�F��3�3}tF�L���;x�<�xs��`�Mji������^�z?�<���}x���,p"��:A�y�O7�Z��T�l�����%�������X��)��5��QP�`"�����:��sr��.�-s�wqc��A�\��_5p��A����v����GN�8)�B�$����{I���78^�}��c�!��:�F���l7x���t2��NR+����s�A4~������x��0����)e��%?{��
`w��$H8
�10�q�����<�=�4�S�d�E���@MX9]�r6��_%O���U+h`F��J\�����4�a��~E'%���L�������k�����iV�A4�d
����O�w�H�G��R���QqP�(�7����O���WX����k�CWV��������q������dN�7��sT��U��iv[�����'�����s7S��[�h"Y�A���aK�[�������x<!�li`i)F]��>�?>�#_4����DQ�����T���`�HA\5��� � M-`A*�����`:T�Z
��J�H����UB��T���vp.;	@����j(��h�1����n��n+R�,��m������	��?-����BG:6��k���}�8$����].t���esgQL��$D���C��_���m���m��U�S�6<g|']��YG�FVd��p�d�+>,��uj`_PufO��
7z/�\.�&�-x����#\l�	q�T�=�i4����$\,'[[��9=?���{s�S�O�?_���!D�/��3K�+%��x1�-DC9������U���������m<��h�����e�53s%�PX�yd>�e!/"V�FI�_�qR+c$v�(�������,]n�S�02+�/�����\����~��7�?��$X
h��'I�z������@-��1*��["�xZb���'��(���|T	\��1Q?p}����P?�i�q�:�8L����q�6�����A��]N	5+J�7>.H��_`���gB
�k�P�a��"�5@��L��%�F&��=����$r�KL[�������F����W:f�~���aJ��2���w^>�rO�-�^ElQ���W����3!���K8�p���M�s)�e)�:���*��+k`4�����u*r�E�F��!l0�g���ZbN�������G���x0F[@e&�?�������}E7|�k4f�k7*�Z�8�r�E��������8��~��F�m([��6ey�.a����'�e�7�vP���mN����"�jS���R	���^�YW��#V�S}���-�8k������e*&��K����DG���.��W��d+35�Qs����nx�I�o&Dg$.��ZE`���J�����s�B�!R�	�����9���������������	
�;a����W���.�@ns��X���F�����D�����K�=��_<u����?tX@�U��� ��E����o�W.S�<�n��r�v\��1�����t����dGQ��p��9���\�r���I��<��`e���Y� �$��*��AM�{9�	>	�x�a)�K�v�T�<g	�Md����v���E-*C
�&�9u����~B�I���r��F�����`�D`X�r�C10+S(t�QG�����3�B�S��s�����yk<���������i	�����?�����Md6Y��	���������F��65�d������:j�H�L�|�]D	�|�1��Z�H�8�n-����CH��d��_��=(�k,2Yn{�q��;r�F����-]:j4h�\��!+�.kH���i����a��
v����q�{��J�B���k�F�s=!U��f5O��� ]���d�'Z�b�~A��<���2�0����w3q:X����P1-5����J��K�b����'�"��X���
�a�cT4;)�������h�����xNf��,7�����h�Vh}=0��D����p�����OjZ�
�7�,=�\KC[y�� �[bk���Sk��~iM5� ��+��3��d��;
W(��ooK�T�)O[�N�;
�m���]��qk&���*�~@���&^5
���D��U���~3ol�W��`^i�v	�P���&.J�1p�	<��l5%/���l�=s�\�Q�U���V"[�������*������Yu[~��Nc��������\4,f;�*%#�w%9���b\����1�T�$YN(���C,G)�FU����s$�Q���]e�%h�79��.A�������y9eEItS���������H��.������j����z��-�k�SA��J���Yl��A�E���r:�7vzKNcP
�R��u��	T��~��'H�@J�x�����k����HC��C����d"�3L���u�d����R���x��
?rOB3��@.��$dspZY�����T�������=�M)��i����U���h�5:��]�t����To�:,q!��q�O�� ��5��������!jBr3N���E��k����Cx��0�{������i�yvM�$8�.�|{�Y�zyQy���8�����[��h�5U�V�����"W��T���K����w��
� ���B��s�L`�D��w�A��h��"Q��AL|����p�4iL��Kr���\�TnA��5c���r�@���o��.����lv0w�F�����Q8��7�B��{'���8J���*j��� P}���T�N{f���g��W�_X�h!ta2I����Hl�9]��2�~�U���S�H�4������4T��u�D��0���6�2����d��~��t��E�A���_����Z�Zm����A}o�T;+vS%9��N�v��3�\����o��M�r�w}�M�����������9���Ot|���:����
�s=�]9���L#��Z;�F�7�FN����a����F6
�H����NI�/Va*{��	Z������A���T����x����M��~ar�oS�i��Q�0��j�~���_��=�?��z\��y���<� u��{"��`�
��k�.�[[Y��q���2�����1nW���V6.��sF�g�8�!�������( �����;�eXh�}��j\p�����$�V�m��}���%>��U��A�xN��oS��V��x]�3n���H�L�*f8��(Nm�<d�0Zo��R�O��U;z0��� �&��A$9O��#�������`�s8�� �p���-��L�]��-KRj�&�d���������&Dy ���x�N��.��6���8���g|��]���"��5T�R���w2�'�R��K\����1R���<2=�_��`������;5
�/�[]�#LT\�5�,��~<U�|���c�D��w���{�.\����.��%�I%U�@xn�& �f��������]���;=:;��������;��y�jL������Y4%�e5T��"o1u�����������p�I;e�[��m����hGa��[�P�IA��������3n������M?�T���z����2i�Q���k�&�3���W�������uxCJ|
��+�<�Y��t>GB�0�c��
������r.����BV;wC��	}*�1��B�V]�q6����G�0Sbbr�!�U.�p6v��F���l8d��������7|���4��9��)�V85�?{-�R��N��8W���r���*�{�	-e��X�Y��uF�2�����j���tF'� 5���N�c�	Wr����k��=�J+���)���I1���O(��M�i��VH�6�D��3��,>���N����������%L�C&�'�������0[t���d�HL��QR�F��zC�K7C�����XG�?���sY������6��5�����]�XT��������n��b|�!-6�E���!�H�C��H����W�?���2YP6�j�~t�d��y�8�y��$����Ox1�\���#&|{�,���Lto��+jNo����n/�&�-&��cdY�����:��V�N'��%���nBN��7�F�p3�������D�us��n��jGP��������f��]���``�������"G{N��3Pi$� �_JP�i�.���I�~z��+P�n���+%b�`��P�T�k���c��H[�[�\����	���6��\�N�z�8�n��|�������Bg]vr$�J���n����{����?B>v�@
��+6����I�C�L�L�w�������ch(��(���|P7�����	�*Wq�%:��������X�N{�e7n?{��D\��j��K&�.{��j=ib|I��j;M�X�V�����H2+�N��o��sx��&��Y��%B��#�(9��$B����j�8=� r{���f&&�i0}���MA�p�=/���|�zF����q&#O\���/r��
�=����E
i�Q�������T�\62�h=�37b��M���n�g�y�9-r����:j<p{*,���;�����Rl��r44���N�@��#�9�(�N�}g�F�1N�� &�<���-���s��#�MP�)��[�l0�[
�4��g���]�����CjW�����, �Iw�4�����Kui
(UJ*P"�i�Y9�2�xJ��M]M��A������>�
u����!�R�b���>vkG����$u�SL�U)�6`y1IM�a�\ '*v���I�?�7`\^������r9��}S�$��G�,_�n�-^�e���&����c5V��U�y^#%-��U{����a����E��w�
 ���N%�?Io��y��H������,��X,C��2�q4nC��1i���f�����p(	�f��e�<�p�ta>[���n�H�^��!L�0�b�bQA2T��h9Gm�h�|on�B���s����=�|�Y�>Z6�%�T���Ai���)�gEd���S�9�!��Q�������
,ki>�����u�5x��=��2s\J����3�!��B����<�FAb�b�����Q.�.���0nJ�yC�*ih�Q�Q�@"e�U����O�^�*|�i(�����s����g
n,��?�k��I��>'���Un}��(�6�H������������c�<��G�7,"S5bX�q�CO��p��
"�B������������G�������
�9~�{JE��Fo����n�p�~�����&�o')����uw����`��Ja�k��9	J�2i6�,PSm����Y'����5{'��BI||���oyA�yQ����:���?�oU�P���_�����H���9�=;!!x��/�"�<52x�kK!<�l�9+�h��|��(A���W}�K��K�yi+|`Vj�����D'$^��)ou$f�7u.�,b0�p"��p�1���1S^����)P��QmM��j������p�&O��HC����m@(��tz�h:�xG��N��������$Uk���/�W	T��3�B�����j����A	Y-'[���D������H�M8�[)&x�Gxr��l�X-.yE��D;�$����H���$�0~u�d�xF��F�~�^cs�
���������������
t���#�w�G>SW��`��u:"��L�0#�Ft�yB����C�0������qw9"���L��n��"���D��`�/
��8[�uz3o��F�?�uN+=,46��io��5�m���e,��Cf�k�:�gm�-~K��[�]_���D�\�gJw����9���bh\��@H�>v�Y�u�6������u��h�A��h���t�
��i4b�a��W�l8p����2A�>*�]�.l��,XO<[&����
!-O�J�l�+:�{�zeaO
���e���d����Ug���I�y�3�����Z$��xTy}��F,�f?��K+��	��D�!��%P
�H�������
L�(���<%�����l0X��F5oc���Z=�"���Z�N(-����C?����(�~C�������[1����gk��.������b>�I�2�(�SG�L�Gq�d[�++�^�����a��YyHq4����J�<�E��.G�J-�a�o���
&"v.��`�����c�n�
}��!�����Y�
���Zc�QOf��3)ID!D{��G���qB#R~F'���k�������g�OA>4a����	���!���l�Q�5M+�$�s��W&1������7����� D���Gg����L�,���@|�1�@,��� Mv����*g��kDxJ`���}��KB��$Uhn�����1?k<.C9����4��*.��D�0Ym��W'�����@8KW��)F�1pJh����PI����m3��&YQ��TB�Y�
esg���nc��`��z������U �~Q��u��iOK�`@�NY�G�\�r����.ON���N���������������U�LXo2G-���������"�u�;��u@���'���yy��T�YV������BJ��uS#���U���CV�8��K��$�K�Z�����G�G�y��@�U��t��_S���`�J��]��:J���y���R7�	�/�mh[g�r
E�l�^N`�f���]
�_<h9�^����� o��bk+������h��5��R{7�g����&��Q��������e�����w������������Y�g���#�u��`�ML�A�!�Pld�f�{�X<&�y�77I5.����z�����]x.$���������w�V������s�{&$9�>�v�0U�)+��P���C���	��s���	r�������vE�!�9��{'"_W�"lr�3��nU����1Q2� z��1o�qQ�� �����2���v�4���&f)�t8���a����D��s��sL�}[�iB�k��l����F7o�T��=���jM�������I8LYu2#�3P\*e������>eG��$A=���/}Y��"�F�'��?Pc'p'��������X���^�m�\�Q>��t/�����r�=�3�j��Fs�c�TQQ*��\tA�_N��;tNVv��#�MV��y���q0_��d���TE�	��zB�������Z�7oN���':�A�H��5w.�����-'}���J
�o-i��k���{�2{����~�j�k*{�����$p�g������1�����F��|�6������pD�-L�P�<�zA�Y��14!x��s�>��x<RI��i���T����[�fzj�ye:��16f��
a����Jr��^<%D(�6�Al���iE��Zr�$�\W�rv���4��_f61|�:U4SUj�������2��Mc���)�X���.��r9:��+��)�iq����*�[��B�	 P��nb:P8�����q���L�`=e�><+�AE�Y�����L����q���09�EEu6 C�+������2������%(<��XG�U�]?�	�CNA8�� ?�[:S������D(��W�D�����F]z�vm��Ew?y�V���&��$(h��Ev���DYN������j����V��S���D�eT�:;7�/�E9�u��<��TK���r<&�����Y)w�i_(6�f�B� x�<�5���;Y��^Gb�b+��jLq��t�G_I��8Y��E+F1!��/�[�@�{�v�*y���H�7�W������Lo|T���Q2�x����.
q+/Q��E������'�Qv|���)� ���]c$1���p4�+�@��f�	,�)��D�;��",e*!&#%����c���Z����+J����c�����=�]�q�oX�����	�UT�a/}��� "$D]j�����pt������qp����@U��."_�r��0;�E� �T�k��g�Q~��>��)�����P,�d!�O![�{:����+�*�&t'04���ws'��Fb�d;������s�a�=����������`��N�|��G�u��m6�(VH���D-C�F�"#��j��&;Q��l.jz3}��������	`D�knf�aM�a���rq;K"�!�<wK}z�-2��r
�e,���������h��|qK�iz�d�w0�VH�G��	��b��Y_�"(cc�R���2q������p��������G�;���b�(yx������E:��b�!���
��b4��� @}D��X�Z$��-�_�@�v2`��m��k��h��	�G�7)m[�;�Z�8ZRtB���x��z�r�x���/��h0���OQ��2y�a�S��V������0�tB���2�{t�]pu���7�s��(�p;���X�~ VP{u-s��C�(Sxs ����q9znb|��bW8��9�O��y-��-���O���	����|���3�bq�T��
����Xa�z��������o?�G��y.��F����yn5m�Xgr�'��NN��#W����mt�x2�����N�b�	�8�)��	�2�})��EC�`�*����AXi�^*[��<��9��d�''G0� m4uu�b!l4����LN���%l���7<>��w�X�
��*���H�H�����I0~D6�,��8yE[
�'q�wr�40���P�0R7M^�#%����!^,�B%��
a7���D(?�|���	4D��N.���c�$=e�����7��7�[�������\��vx�_n�d�R\ieB�$��r2Eq/��&�^�$}�kJl��(��Z4��%@�F:��fv��V�$�/X/�:����N=��,
���C \"�����'3��k��1�����X���P������m�������7y���-��~�����d����^������5P��t�&�O���C�.�S��#����%���IS)�0��i���%�T\H�s�+�\~�%���h������S8���W	���4�E��`�����((�kR���Gu)���/�_
��YK-�i	K�Z��6�t�u�m+"|"��%�|H���V�g�����t?��gG��u�>"+:Ify�K���g^q���t��j�T�9R#��e�.cz�i����
g)"{���������qR���}�Rw�9�w�D�^�/,��a�����������(9��N����Z�f����}��Q�fsG�p�6�=���!�)�	�G�������S�A63�dE�n�@Z��m
�&�p��l��qy0�,�M��uNCuY�-q��%�;b�`\
�����f�Hu>����H��X��Oo��N���J��eN	��`j���9N���e��������Bp����x@�)7$���/�{����u'��Hc��k�q�ok+R?�Yj�������~�{�� {�����\��]8L/D���:\�!���l�!!��9���c���6��B��Y���4^��;�s�r�@���I9b�`�7�j�;��!^^�C��<�0y�~�.���/�|#�lf�z��]�h�j9$5yU�n
e���M���sB��V�|
�,H�0;AbZNn	S�^�Vc���q���FT("OL�e�
��5��a�c)�c����D�nv�<V�JS&��W� 0LE_PCr�p��r�������R({tOr�3G�E�#$�1��y?Qf����v4�90�6��������4���(L^����H���)�dWJ��@�%�{�#���A�����Xh�U�f���x��q$��(��9A��n��!�j��=��&�����BL����`�Cb��Kuj,�D@�.x���y0�~�M��h?�Rko��23h�X�s��X��;n��`�#�V��sw���K��mb���GE|���p�9��`�����;�q�3��:l���}X�����a�]_�m!�Z�-C�9`9L����N6���}�FF�����?+����{u�=;I������\�]�Ki\�lC����y�:�M�&�?�*	��4$,�����\�����e���hx�V�#�As��/a���m9�h��g�0_���v�e�L�{��Fo��O=/���.5�?���e���~%S�	��v�_D�I�*L����]�D�����%���.���NE���L�����LfS"`N_���x���J���~�6M
���c,��^�S�6�y��
�R�j6��u�d�9.^�'�z��-q3�-��������C����>���~��
=�U��^-&�Z��x~�q��d��7Vvb�!�bT�f��_���!JJ���c��NS���E���y��j������e
�E���<�C��g��5������w:
�x�4��5��1o��u+���}[sp������- G�������j����s���5Qtvz��J�����l�J����x��h��=��������)Q�2�2�K���V�l"S$�Sd
e�E�H�_�&:88nA���]�ep���C2�2ld��s�/�L��3������7H��h5��z���J�����3A���"��m$G�V�/�Z�("��J2��\b#q�I���cz\����Ro�by3C��T�s���hN"��f�u��j�5��.x,�|���o����Z���[li�S��9��n�	`���{���zt�i���zmt������nE��-�w�N�-�#5�3�BYUH��R{7_���ta���ej������G���jzO����
��Nm�����;����a����gt����������$�%� -���/K��x�����7�s��|��+�-�4$��������.8���6V�;FV�ae+Z�p���}H����
�Y��r���E���;x����2I%�y$��z�*|a��M���R�#��l=oi���:� �Ok���<x��b�<�zI��0p��r��--�!����8�{������3�I:Z���hK��R<Qr�j�L�����R�c�X�h�������F���fC�������k�9��U�K>#'%�5%��^��%=��1`�Y�.���)w�.k�<����6���r�7_9����T�i�[�b�\��@��:whX������~;��:��i�Hzp�%6I��|uT�]���`u�{�,�Z(���@�?^�^��Y=,:=�.��f��j���=,����{������)sqzR���|�P�3��B6S&O#�8�{��y`������ b��{�����~������k���+����5�H���)�]���U�����{�[k���A�Z=��Q�6\�[����[��-��k�/
0���B@�v!�_�� �:�
��RD@�7��t;iH��R@�D���7[N���h��p��?3dPTL[���a���V�~��_a5+l(K�EYs�_�7��V?I5@�����!�G�S%p�)�y���!���Z`�Yf��@b�l#�O�-B Y�/A����s\?��W������	dx�0��6���I(���?/����.�L^�R��8����������6��P�(ZJ�����L?�Q�:F��r��s��.��^j�=��8�:���q]�Yp�'���E��MzeuT4C�h���9��~�P�I���-�@.q�H~��y�HBe���p���������69'��2�b��|I�!vr��I�������"����6<7�1<0��P�S���:���k\j�E|%��W���yZ�&�)�Y$lKiN;���CEQ��7@���K�>Jt�C��'��V�
y/g��x�P9�1������(�i~V�v�3�*y���6��:���������^���1�L[+yN�4��:����t�����8\����@B��h%�<S��lJ��7\`���*�!WH�t�nv���������v�)C	O�Nt�d�\5�Y4��t��v���yY�Q6!q�q_�(1�4H^P?�������$�����'/�E�W�^�\v5�)����t�Y��+:'6��g��zA!%��z�"���]��8���0�q��������*����KH4C���P����� �sw�F���)&A	�a�_�����?��#����[���!E~�"��=)����x�W������o2��yc����f�)��q���k�A������
� ��^������w��w��?oa�!�:���`��f��1��xD�����k��v�9� ���p�g���8��#��%of/D�������BK��aPrb�W��?��.��3��]|����n0�� \�c{
��@�"�F�O��A�w2�j����d�d�^�W��B?�Z��
����15�NL�E�1���0COq����Gc��b�2h��z6RF�^�����l)gy�s�j�Cz)�>8{

���h�N��mu<��C��;���_$}��/���������?��w��~o�#WW=%%�7��?+I��4���Y}/e�����<���Tcv|�&F�����T}Qi:G9�����b��0���;��������$�G�S_b>��IF�h��	c��.�[F���N%Er,b�L8������H^����XGS�!��2.4e����BL2��,`���Ib�1:�������8�����g9��&��|�����{Y
s�CS3��C'"�6����f�\E�07�������b��[���^Nu_b�7��a���r��q��
1g����tH��3����	.8|�}���n�p{���E�)[�S�(�dN��t�XCp 9���J:q����V���%�>�w�W���h.���[���N@�sz?s�g
@aseg~�l�'���`rB$f*:�I~"�yt?�~�A���&��^�R}��`�3=4D��(��v���Q�G����Xt� 7�9���`�"-�\�`0(����E�+^���Q�`�9���q�k:����|5WC�T���s
y���*���q$�>�j�k�\��j��2��C{]*;'���o���{�e�����#KxM�;�=�N�^i���F�R��1y(��7I�KG��,q]|���$�\��:���XM�W��+��l�z�-�#�B	����+�}�Ej1���8�Y�j����%�	�(��\�����H��/�����3�p6�-��,��Xm��85�`�&[u\�����lH�j$����v��D���2v6;%�R�vJ�>�!��Z��MM�r��,�tQn&y0�E�)`��d�8_���!�����
����3h|� U�Ei�T�����R���[��)�cU�a���""�~����>tEZ�GRd������cS�q<"��<�pD��"%���$������%z81�r<��2�ut�6�:�*AS�D/�h��P�����;�H(M1_��zUu��l�P�=���xp5S��������)>�[<�M�&��F+��-Ii�5��}>���:�����<�S�/Bx�GsA4�e1�����2Ypq������@��|N�	k��-i0�Y���:�<�!�qv����U:�O��W�6��Y;���0�1�4���R�&�-��8�A� `WM���vC�HL��prT��m!�X>�7
?�S���_u�n�7��/JF�7���z���>�z����B����F�`Ocu	.�`�QA�A�������Q��"B��*��]v����a	����/t����N�Ol]��D��yE����{e, ��Ao��J��yK���f��9���z��!�p>G��T�N���2F0���%���tu����wNb�0e������x{���HI��3��6�s����z�XL�c��`���x�!S��J��X~��K
oX.��>7.cJ	���{<���$��a*�Sr�
��|jf�;��S�"�������e��P�j�:������\���0ciC-]�M]�@wzj��W]�3�`#�6n��F�q�l��p���D�f^�	��_�wT�8r�Q���7%{�j!���.e��J��z���fv�����!�A��X������%���c��f���N��>9���^����:�������3���#��z�����_~�	��������-��I�k]�����`�9RnN�����wg��K�{sz���w�vr=���"�5
��y����3u���C��co7P����
k�Yi70��V���a�Zm���h��|aCkm�(�4> �o��7I�q�u���$X�`@8���=R��ZI�����\��
]9\�V�wnoR��������V]�����PCd�f��-�*���`m��Zu����.m&J����/l�7��[lNp�>�A�%9[P�g4j�h���Za��9�9M�';�0��4��~0z���;h��Q���b�����64PiW5����_^�5���V�����d,N���^Y8�%=7Y��"����b��b�a4�
dV����_o���+lh������6�l�is;�g���[K����;���Q�RM��-zSka�y4���w��$���L�0b��F���������:Y�<��\vr��t]���O�����_V�U4@���tr���r3%%%?��'yH�$P�<)�K	�����a"��ER���6cB�:=��T�(�lI|������(,��d���!��kg*0p3EJ��_J�g��F~*]����4�G� 0��%�'�������z����
�X��r�	���y�?A�u��K����C2�7;��a�K����1k�
(m����J@�#������6y�f������oX�$@- iu�
���S��-g6��8��6p��J&������G���&�����b���96�TE�o@�`������0�.i%kq+\�L�d:+/���jr��P]�Iy�X����
�A�79!7�
T6~�|5M���)����lo��
�cE��O(��BLicR�.�SQ�D���Y�[5�������|K�����<%E��~+�.�iP�[WK��m�������Ac/����+Z��O��y���7~5Jxr&v�=5/��+m.�/��������7�=lI�D�u�?
2�����F�F���B9����A_c#RE��8�����S���9�`��?(Z�X��d���|"^�s����{�(a�U�\�F���z~�:��Z*��J���5�2�@N�R�=�������7�A\�L��L����R\�=[vNF�N�+68��\E��s����#a��q4�������C8�����V�XLgr�AI�Vtl�V���j��������es|�T#j�d'�-<!�8w��"M�N%��=�[�=;U���0Q� ���gb��6�9��aha����f+�	_t�@4��
�'tXiG@�qhs�%�[�������X���1]���X�F�?IR�$��j'�6�&G%�g���:S��%S�����VU=Wo�����]e���������2��N�8:;=�_��{s�����^v��m"$�IK���E��`�'��
a&�&����Zq(�m7O���l�I�7i�W�����&q�9�e������%��PW���0b(��/�����}���L�t���,,�d���(��(/�>a��6�J��R���|C�e�����a|�miE ���w��b���xnz�Jm���
��x���������o�C>����#��[Q������T��)����/������C_��g�9F�{�-����1��D�TiG��1��&w%�9��0�2�.'[%S\!'�t#-�������]���)x��o�y`����lB_�^�L�,i]��Dh]�R�O-����rv��(Y4�������6]-b��9��"Uf���c�b�+���������w����x�&�����{e�(�����l1��b��=���\��K����!"#��*
���\E�R�((8M�3������[E^,P��`I�>���Y�;���m5��W�J.IX�}:T�D��J&e��e��4��*���MVd5�%������Q�\4Uy����x�M�^9���<s���� 	i[��6��?���(�7����P�����������������u�CS�������6w���2g�V�I1�L��k��@�k{.�|��#��}*;&�D��.�������d�%&h�(���R�������D���X����X8�]%&"�P��4p����cj�"�L�����������9��Um�c%����i�zz~���������}����z�]�p���n*�a�!��������kYs�4?�)?#�o��GG��H��������E6�����:I�L���fEu.z�J;��y�iZ6��Kz�+$��j�J8�L]�<Q��r=�$a��>�}��[9[��q����*8�=�E�#������E3���-�7�}���C$M�hE�jNo���u��z�{�����5X�'u���aWp��k��m����s�������L�5/����=B����R�
�>��]�t�!��]��X`�S�^�V��ee������29)]9���b.���e�44Q@�B�n���������Xc�i����0�hX��#mmV���w��]}l���)��D����k����YM��L0��n�I��F� ���eT�o����*R"j7��v�����w�G�6�;�i��L�mAO�M��[�Q��G���v3�w\��tt��CS<�D����&&:��e�l��:��_
[�ju�oD+L���f�L���Y�_g#��"T1'�	��3I��%���5�1Z�#�����$��h ���L�M�V��������^����ix����cA�bw;��j+mV��K��W�@�6L����xJ�S��N�����	0]�y%�u�b��-��4�� ����U*��pe����g�{2�x��v�ue@JUM��:��7����l	�T:Ua��?2Ox�E�y��{`����Z�][���0y��}��W'Y�
m�D6(��%����H��N�^��Ic�~�U����������Pq$�>����-<&�Uf�		S��:t�#e������V�m�9~�3�G��s�s�t��{�=���U�'E"�D����mV����D��*1Q��p����9���D�$ZgH,�k
?'�c���������37��|�o�^��7�W�_����@�Py��=W����R���S��8	���Yc5������x���z�d�����$�,
1I
��_Cr��4"V������~M�>��LF�=Q��G:M�
�L�N�;�p�������l�-CO:��$/l���������� ��8�)�n���6�����C�`��2�!���d���R����U�`��;�9�{���J�sDr�)��������ep�@'X������3��V�,?j��� o��P�Q��T�C%�=83�-=j�WM��('�Rc�����i��3y�-��3G�m.�������a��d��,�xl��i#��*�����3d3qj����t�����b!n�[Kw��f�*����B��Gz�d���C�CV6r��X��w��q(�*���Nx��g����n�"�Y�B����DVB�>��*��������C�!+���@��F*�m����]N��`v3�ti�����s�Y����:�0� 	'Yf�{o<3C����d�����6�[8�������8"CPf�?��)\���mF�(���8y����d������2���y$m�n��T�2%2��r�����iN7|d7{����*N�E�-�H<�AqA����b�16K���@Xc����;��[��;�!?����N9�H�����C�a�Z8�n���	E�8�Q%D�IB�W�>���&J��1;���{���-�i�-:<����}�u�^	�X��@�&a4�2oSaN�n)�{��ty�P����amr<�D�u�QN"=�Z�L����>x���h,���B\�������C�kje��1���M�����2t!q���:%peg���+5���B0w�V*�C��� ���$f�
U$��T��5�_�\�5���nj�R��Y<��!��S�e�����<�35w�C{�bC���bC���v���9]2���R��6�{�T���!_���*NO���W���I���5Z)������&��j��y8�>������/�jQ�Zm����`�\jj��=�83�w}_`�8!���R�1��G���JH_N��i��PIId�.�l��$l��rk�)��xx:]�x�����m�
OAcX�]�
x4��N��_Q2�1r���E	��x��>�b��h���)d
]��-��6�k��d��f�a/�����;0�@�RL��=�9���\����Frq�|)]�y8�9*�<^��>�����m����������`X�g1����wn:���_��`>�o�jt[��Xw���{��r:L��IYl���e~qf��U�=�
,�b��,���o�� ��?"|a��f�*���n[py�~�������]y�	���y6�i"���$ZPm
�=x�'7c~���.J��[��U��K<&����?f�M���������-uh���^�_��A�
��R�7�^�wb����}u�t��O4i�_v[:�M���A�hdZrw��U���{�����������s:>:����uO��������I��k��������������s�{�{��/G������vzu}z|%�������s�����z|vq�E��wWT����{u��sq�u�yJw8�o�tQ�^�/�����/��������K����t�8}��R�r~��*�����u��zE
�_�������]���{y��z��-�T�C����_��Ln7������&���z�C }�u��e��;Rg�?./��Wj��9U�O���������[���V���������������~�7���������w���u�*r��8;Q��#�T�zz�:zz�g����9;�S78UdtrJNuo�b��3��V��)�^�zqI��	W�i��~>�-%�+�?A��o�]"k����W��wj]��xpz}�����og��]i��|z~�e����\u��T��Z�~\��	N���u�u��P{�
7x����3�r�����OjfO��� ���u�,������%�a:����l�u���������������������}�s���j�������������cL+h�f�b.����3��������{��)�{"����lL��RI�4\�9"q0����~�^vm\<��Y5�[�����V�=�d�A'����������C�d�>�)�����T,��9?�-S�u�����w�������}������k�Ro������i��v���V��"iSj��U��~���|�8l��t�l�*�}Fy���/��s�Z����N���,��d�]��]��Y������l���L�}���x&�����J�?zb������zD&��xL��
���H����?k�Q�����8���A�z?)=�/WO�O�V@����"�|m������=�4g�����b�}#�o�����)}�(]<�[��J�"����y�f�)��tS� ���HS�s3��{M�n�o
xN�.�2��j��.-9f<��S����2u3~z���aM((U�:f�I������5]�����i�JO/�}����e��eOU�T�8�t
e������eM�fm��7�5�aU�A�����|�\�&R���������-����-"�}`D~���m�^�������{Z��?����"��~e�%���h�f����e���D�M	on��j��V���a�z��u�+p�r�(�-��X��X5�FZ�ts3�n��:V�N�j�J��tx#�w,xm$�4l���|F�U���Pa���A��_=�*�s����J;��e0
��.'hQ6Xe=(�X�:sj6�x�+�x����x���TY�#tH��������pm���=F�����S����<��nQ?���&b�z�2�K	s�AX����Z���V2���M�yD��R��\�X�-p�^�6@��������\��f:����.�nB�`U���#��3�8�] !PT�-���aR����?�tY�;�_ [�4���Kfc�X88#$���1�A&���e�/h|`��1k��	���2�����6��������[i��<v2c[�z���3h������)�K�t��6c�������,�`5����WT�y^���q��.��{�n>n�Az��9Nh^��FQ�`BV���.U�K�A��Q���(��A�@]q<j��}�nB�94��:�*D�Y�������'���[ ��I|s�`�$��#���8��&R��2�Vp�r9�h�JZK��V��3���;�'>��_��s>,:��\T+
���r��P�%m2��D�Z85�u��y4�1rc��3���@k"s�TFa<���\�A��i��$��Lj�"{he��U
z�X��o�S�������e������N������j��>3O������vLT����)��b���='�P9�wAY:��XB`�Bq�f�}F?J�|,X*pPG����[$����$���D��<�����p������o0�RJ>�d8��m�0��� �0p���2n��1U��FPD�qF�����'X�NC
N��q��)������������
�����\�J�������o>"���2/��m�y8XTo8��G#���BN��cq��b��IRuc������%d�,e��-�\����t:�s���1�sh�o9������oT=������[9��:��s9�#v�	3��{t���K����[���'k��q6�J���#��K���F���J�"������d��,2�(^�I��F�Lr��_���$�#�(!ld��{Gla�����/A�#�+�����r��t�].��[%k_�%��/���$7w�k�Dr����A7���&$�H�p�KHrV��V%�z]���Rw�IN�u�M$�Q8�B{/n+@1�Pn�#l����� �] �����h�<dj���\�Z�[��8;��
�&�D�o/���{�O}���h}��U$7L�n%�%�{�����,�c3i)����G���f#��MG<K�{����<�kn�j/r���l���\�|���)���d����\�u�8yc�ub)���y�����8�C,�����>Hk�*&�u�������N���;��Q���X�������H��{�HYC���m���O/t"�Bk:��1I���Mb*�����k��J:�?'�!�{�v�Y���Az��t�M�
U,�,��F;��&O��	�(��5��SF"�.I�9����9�}"��%>~�Q�*#�F����D-q.GZ�0�/�i��.y���$Av�92�1=G���>	���n��5�f��}zZqh������Wp�a���s��YL�^4�f���+�G	"�\�) �pvt[���uw������2E������3����?U�����@7����&��[�CP�j�	x�$1�^;����-
!y�:���<e���M�#R1��U��j��������~2�q�����7�0K�-�
	c��m|Z�RycQ|6�7#�)V���)Pgc�|R��^.��Fn�3�N%�(��F�$i�(5I���C
-� ��x�R;�Fl�EtV[Z���z���f�^B)��>����[m�������]�Z�~nh��6��=�Yc��l+�O�&!�U��|����?��(�'���Q����O�u]�
]���Of���/*&�F���P-����W@36�����d�8l�U�~�Q���1��<�� m���ztG�YcK�������M/H�A�Q����n~	~a�H'��2�r����X�)�(m�jd���s$�4p
~��������~"o�g���J�%�O���;,LR�lI�����]���|�#f���� p��T~{^�B �������I_����?R�+�3[�K���F�N����	>5�mX��o�����l�C^GYP��C`�q�R}�R�)Y��K|6�L|u�&�g��xjw�����OH��{��;SP����N����f����(�`��.:�2�SLy����r�#q'i�+*��N�	�.��<���hu�Nb�q�0A��.}!{W��kd0)�Y�4RI���s���))�]�����Eg�����i�eo�5@E���Z�|AR,GvJR�������!r���XJ�g\������Y|7x�����WPJN���~s��_���A���*>����pE%���|�������P��$c]z������"u��x����,~��F�u�����I4��Q�����Vr������Z���^W|�7�1�)�,r�z����%&�7�)�l^F�jr7 ��e*1dA�a�1���?]D��3J�s�bzY�:��u,p9�f��`�	����T��B\
�����9Z�&e}l�(��,��
p���b�\N^����_�?���pt���6L��]���[e����������Sh������vZt���������fP6H=m20J�hG0��LtR��B2����0�/r^c�F���RfI�zZ��Z&)�!�c,A���ae����e�~:=	���,�/�U�V^]��g8��
O"
����3�rU�Q?n����[�G���E�RtO��hS���N�������	��?D%��+
d��w��k{Wu��2�S�c���K��T�!���.S)��X�8���R�3M"��$8�,�o�e�;�$�s>%����������Y7�#�E:\��*V��j�����F�x�����_��7�UQk5jX 
����>�Zc�)Ilj
����V�2u+*�Y���t�zu�cvOU�Q/w�<=x3�+��xJ��[�
���N����L�O%��<$��=��M�f�#A����!��q��~��9��x=Q�=��G�e@}�����.��U/���Y��������R������L.���#	�W�>������,Y���G&�
6��wG��&a|���N�Y{!��?�����g�y�9UHC�sw�y��*��~������Nv>Dv�2�:�����
\��T���o_�t��4O���5n~RxU�MM�T�������6O�������)��bp,�`������������g[t��JJwY&��q��
9;G�0KN������1�*SRN�-'	��v��C+������IL)0���/�C���4�nms�S3z��+�)��%���Z�'7s���Z���+e{0h
�j�=D�@}���m��:����{��mH"�&7�D1�������+Q��8"�"r$E2���������.`��j�S������XR�ES�,9%R��=��+��u	�>10d�F�+����W(��I�T����W@���B��*�X�G8N0s|��D �ofAx���!r�'����dc]��q#9!��aL]��0&��a�&i0�0�0�[�,OK58
8����;��#�>\E\�8y��R������^om-���������R�-�+��{��/���z����>�8/�nT��_��z�;�������9OI<�4-��,.��`K��T'���e����7[E�<7_�/9�n��x���2����M����g"J����7p�;g������ ��y����T�n�y���z���qsTf�.Rs�Sc}\��M����R�k�C�����M&U:�:v�e�	%��G���{�QB��rD6zu:�|!@��*3�9��W����^Y��!�&+`P�'�J�{sz��]�{{�������^	�3n0��8T��L��;N:�����Fz�z�Ai�������2���O!y�����G���B�y��g�p����]�nr��t=����0�V���f���0�����_����lQ���BL93#T�4{.b'���U�'
������v��!?��J��H�n��G���<��;���*�?��l���n��$z��l]0�nm�oZ���j�~��p��i�h��Bs� ]$~�L���Wj�E�������3�U3�x�4�S��"H�L�h@Q�:�����\e�`;�z����e�>?Z������lA��J�j��<�^����d���D�Q�,��jL�A��R?���H�g�������=eA��\�Syhm�~�������[3?��*/�cy�o��}��O������_K#�7���U��?�����!y�# E��&/�L���~����o�R����?(=�$���2+����,�q2S{��3�]�@Z7�^��b�<��_k�N��H����W����6v��Q3���9���Y�&|����/�����]$���|�u�%��Bg���	����R2��C�8������M�������l��|�R�c�f�����%�#�^}�D^Y�^f���V�n���fN'��:A�VO=�!�*������A����t�N��\��x2��4�&Z'�[��o�X8���^�F����A AQ}{&���������{oE~�]���m�������Z�V_Q���.��/�������oq���nnCV���8<�7U�@��]��k� ��'J"
���V����$US�n��dq
����\�K&*�z)�����/rd�T�����	W�$�Qn����Z��u��������.Y�F��U3�?)�7w �u���Y��0�DyN,�q1��0/�2�����J�����>�]`����n@33";���l�S���^�}�nVoH)"��>l��V���t�~�h���5[S#��8������?������W�N��z��8;�{O��l�q����q���y��#�����e��9��(bX{o��]�����v����!#x��zq9��=��)�_$��;�8`'�+:~�w����ViEO�_��^v��)�:�F��
�H����� D���~P}����[ ��Z�u��O���Tgd9��UL���f67�d�0���2�Z��`X��[����!��,��"_��F���z����yh�#\�fIt5�zw�m���sF`����P�`~/]����:x:w�t����
+�Je�!Dm�$):��p�T
�!}��x(�o%��z�3A������2

.2�a�O_�O}�c�(6�'_����c��tD���uq)������H�B����y���HCt1=���@6�����L1��������������
�y
����I��u������O0i��W�}����'�&�~ R��}'@.p��ga�������@D��'b���w,�������v��nQs
�I�a�y�z/*E�����A�M$���w��x��a���:�F��k���������c�+n!��e����<)�E����.������|O"�
1�@����!8��4J5AF���wj<���Z���8=I��r���~��P����$�/��AG�g���m���P��4|l���X@��^h����}�=�n�HLFq?��?��%"�^���G]�TE�qW)��l��#t���������N\({�0*�Ym�d��m���(Z�R���;s/p9g
�B����;�YDt��m��6nv�z;�O����z�1���X��?n ����D�����]���(E@�;K-���v�N��V.%8�	�WC�H�6Y�(
�c4}��.#� J�aP�U���z�;�Jt�9P��K�}���'�d<sd����Uf��q�et��T>Z~���Sn?��H����+��$���wS�������tP�MV�I����r�R+����/x���@V'�w������<���o����j�������@Fr����U��;�/C������3����W��X����>>��y�Q�r�)�z�_3t�b�i��$K�b�N}��j8<���u����;��?:.�G�| <���FM�uOHF����O��U4�:%Ol�'�=?l����>��DA*��������e���z;���T\$��+fQ��c���������]�����2����O��25��p75��^�s�G�;���6��@�C�?H�@�tPY���<(�h�����8�MO����g�D7���
� �WPUn��J����q�P�Uu$P���O��#����f2)j�w���/N�W��Pl�N���U��-��Z��A��Z�?<��9�<+�(�^!�n0ltC,�����#n�'aw��\��O�0�����	�5�
��~T����M>�4��-�5�ii`i��I'�&��w.���CP�
�)���x���qI
�P��m������g*<�3E�p�e�i��,b,gJN��kN=z!�{������d���- ��wK�M;�,�m����7~�xY����FN`Si��J��CO��Q�cR��F��3j�o���'X6���@�1���~��"�h"k��C�f������c��_/��v��k�1a�I�
Fz��������
�o�UF%�`5\d�dK
��$�$@EIm�b�2t�3������Z0G������?0����D,�079�J�Xf����7��"�p��@�O"c0S�\
�d�EZ���^��%C�����CZo��W�{��dv�)])�h�	��6��-!��.772���A���^�������VH��5�	�43��I�+s��l9D������w�+{i_��@����Q�!E�.���4��<�M�)��C^nX�O�|��3M�n[u ���H9����jU�n��`����Px;e�&:L������&r�
�<&�"R��Y��k�*��qi_8�0\j�g�L�� ���cGw������������,1�:F6$���
�$���R�_�`�ZP�M��w���|H�UW;AWr���\�E"<�7S��{|��x|a��E���e��N���&F�{��]��W'?�!�,-�i�p�(Pn���������c:Q�5��s8h�F9);V���3y�<���c�y�����s�.:Rq�����}�]��K�b2�J�(�����]����N��pNz�xz�y�I
�hEkC�r�u�h��3�C�`���Q� �F����Y���d�o6�,����}<\�Z���T��'��l�w����x�!NF�pP^�e�����"&�Kg���T���0�9~�+YG:R�\�H�>hy���Y�����E9K/) =��f�72���C��&]P�|xl��7`EV���0.��bR��X�!����o!�k{J�1�W��v@
��6Ne����8l6Y��;Le��
�&~u*1r����� �Mu�g�;� �����>�0U#k��Jh�����^#��j+�-ym��J.E*�6tD����C���;���u������BW��p3'����=h��Ci���V��j��0"5r���r(j�9g��T~+Lc���YL����)
���#��Z�"0l��q�e�3�V�2������Z����vT�����eL�������}��S��?^\��v�Co�"y�*�����U�����.�n���hh*]wO6��5���j3�V��?���^�;?�����0�o����	��,����`#Rr�f��2��z�
m��b����3M���K��W��$Q��F��A=����1�
)}7������4��mP�1dXR��m�z#�xUT�[��f:�G(�J�
Z���[xC��'�h����r�|k2YJ��.��:����*`~�@��`���V�06W�����T96a��R$��<���U��UA��r�8��Jb�0�vxs�q��|�b�X���(}���l���gS!����Z+n��1�:KC�>*s�DQ�,4����?�������d�%�]��G�����a��!�JkHTJ1�)'��o��&�W�3����m��|��������7������U��M���*�to�/[/���R�V-�������?�u�e�|����0w�1����_��ju�ja������/L�zvMR������b�q��GF����(�j����<)�xGx�I�`��\�t)hA�������H�oi&)h����	%?��(�3�X���n@���%S�����G��������
�(������7����@,KBC�6l"��Vk�!u	���-�z"/Y�AB>y\������U����M6���]��T��-E/5���u5�!�W�����R\�5�m�����,rN�&����0��t�<���d=���pzy���L	��WG"��&%��k����b&.6���������2�0��EA����~���8#5��s�A��-V�"}�IEfHT(;w�S�V}��[�����������?��}�~�����m��&��Zx�$1J���U"M:����������+���:�N$)�(�M���r�7���5C�`����U�~����0�B�r:���(��U��_\�������VIMe!ET�`>wmd�;�Lf�}�+�����,�A��L��rV��r���y����kY#�@���_juj�9j!��}0�r����F)��_��KvJ{���]����~�#A@��Q�����"j����.���b��A���g����}uw�K�IX�I�aF�8b�v��d���[�m���zp^�A�` �����z�G��!����J2���[������f-ZP�F@����{���]�]wkB�w8_����{C$�{{�(��W��u���GO��7;�B��|INQB�|!����3��U��&�/7"�\N��������8:i��^��B=O�:F�Ng@�$k������
10�N7�(���^-��B���lA����g���ZE���x�^���j�V�^�W��N}����kc�����O�1��}A�?X=H��Q�o�����@xY��F�^2����W�(:�3`���O�����e��M��~����&����/_tS�,/�N����5�)����l��U���CTX/�K���6�wCt����J������Z���Z�kac��/�@v�d����������t�-x�e��[4�G�8��J���"�S��%�
�5�x!~ :�QnC*� +�T�Tv{�������W���@$Q�B*`F��K�r	�QZ���R��
P�9W�>R�LNZ
�I.a>^��qc�9b6g�����L_�C�<SI7�8@���K�-�t�o�9��A�YC>�1����@�G�^<N���������x�b����B�4��k�m�������<�Q���hN�	��6�u&�U3��S�o6����G�9���?
:��(�=G��$��������TuY!�O3-���-�����}�J���.���)B�3�%�f���x�<G��t#��F����`�����Ru��<� ��b�y��
�L`=�#�t:�~�����/��(��+�(�&a�G�#R(�D�\[6%�R�}-R9�iQ�f"��{Gq+��I~mJ{2 oZ��hh�CW�s�mZ0��)���0�OY����_�8�P��[�L�JL_p�0j	���N�o*������]�V�������Z��G@�'��=�s�#�t��|Oa����z�����Qk�[�Y�����x���Z���h5k�V�����Z�V�o��������O��<�����r������
����5��V��?�a#����A��?l��;��(lu���a�F1���.�w�Z�9���
�y�.Q`	����mt�X��n���f����l�����j�^�.+A��j����~��v���	�j�Zm�jIZ���_�]4���h���Ds\>��u������FIq&V�CQ,�+����������a���L�~���p8��S��7�-+��:�l�����sd����V���
2�+�#��6%�V&��~�V��8�S�T�V���fX�q;M��f��������0�����a�P�oi2�����{������'��e^�VG	g����0�-mK��5.��d>�I!�����]1F/���/�a��qu{�c���~��2�������h9��K.�m* t�bY:mM2"g�+O���:Z�Ue#�$���l�Z����&�w	R%)[���oS�oId>��]�G�l��"T��p��i�h�1���.Q�����o����K�h����N�����"�A�����q�B�S�Y���>��R�� V,�Yf"���L�l��{��GX�I_m���H���A����_����q�B�.x(,(V8���.�H����-���pN8�H^���y&�NqWs2�L�qd����ge������!bvh�}�����pF���Q�����_S"?�R=Chui+��7P������Vc�M��s�������\q2�����t�i�))Hm[����
�����'���MiZ��}<�p�=�M����������{��4i�^y������w�~z�i����m��V9'�3�!�{B��O�
�y �C�")>��	e1f�?�����h�i�+����&LY)�$�R�)N'Jk�V��I��M��q\���R��]T@�(w�C��?�2��	�qm�����fN&�����x�|�h�����6�e����9sS]cZ'!k���7��1�j/H���P|�c$W�D���!d6	�j@�R�a�H����V�z a F(O��<P�:���K�x5��z����HNA#v�\�t�A�l���<�,1u�~Q]��$�$"�HSsga�c��v��GI����d���m�����������a�$c�������m�/����&7�9��E�u\s�V�]��)���������{��"`Z�'�+h�mu0�r���o��Y���N<��=�;*�y�V�I��p����*�k�]�<�N�����G3q7v�5��[i2_�}�=	�(]��nz��{;S�e��8�Vg�=��(�f�u�k�Mc�5�����6{�)Vq��k*C�n����-3K�-��S��Q�i����?3�F���5-������E
�����`�	K����
�N��f����3b_���~L��H������"�6*u���������"*���q��C`GQ��N��#'��03����|�A��X39�a9��L*��<fhJ�&��������{3S�"")��o���W�qf�Q��W���\dk��{����~	:�`w��e�_���X��8��=h`�����r�&R��N�R��Aa��*���Af�y�g�E��k>�!o`����5�Q���%��_A�%i��-Ju��0�J�za�sT;h�[�L7, =��_�/jvf�����ZPX%S��jy��^������XoA��<s������e��[��O�,��W�.F���f�u%tt�`���j�5��G���Um�f���Jq�A]:ynhG���L��h>���R�o�Z}Gp
�w�>
:�M#x��)~�m/�{��0x1��9� 
��^	�}}7����zL�t�>��j�=�{���U����$�n����Ve�P��������bK�(E��<��0��o���_����G������/��3��w��ES�K�2���y���z�u8u`'����]!��I��������%q����s��Q}$�*)W�yX��m4���ptw�9)�HQi/"�&�WT^�sC����(y@���d��*h%��ik�`#���A*+�����n�������ib$0�3�/Rk��������o#l���A�e���2&�rr�0+5t&S�g�l�.#]�&�QX������F�(�M���K.�����d��Qj�8A����:��	�T�s�������xX�E���ld�S]x$��V=�9���������p��>����!+����
z��pp���XL����7����w�������n1����(�>��'�
�F�}��qGQ�6g�u�����k�A�5LSw�R���q����1i�%.���D�Y������fM���l��p������;��4��u��tz������m�9�p2��h5(�c�M��7��!��^<C:�����?pLW�;nPk�=�(������E/	JQ������o�O�����0���s���9t�3N	�!%��5��n��`������-��I�S��1�
�8
Lyq��n�9��A�h��<";"Y��.)��s:��t��0�����|���t��e������	`xa����Z���+#?��)t���j'�\��W���$������H����i�^a<�M�<�����`�"��F��!^�d�q��Q�������pt�8Y���5�B�}��#���@�����|H7�%��o���E���}�X$=�������DGAq-��1�Q���^POr)�!�sEB�����3�\�-�b��7J<�VN�"���u���T��0���[���������k��J��e]��Q�
9���O^���������D�P���:{~W�����b�p��b������QO��/X����#��lV[A���������i��F����J�����Z>�K�i��������~8��q��yD���;M=�I�����D��6�~$��}���5$�f��9_H����1��Q������4���#�4x��RL��Y����o�
.�i���d����=(�AGE�#�<��u��!����N���Yc�'��f=���ox=_�uZ�P��7���i�i_��T��l��[��`�0�tx���0'sv`v�F��#��j�tx5��=��l��'{�(P�d
� ���x��V��v�s�X7hj��'[��'a[��9#M����L'W��	���������K�����t2(?��\�.�b'2����]���F�d��ee�m�������
%������
�?��d�n!��H�9���7�:?��Q^	�v3s���}��8���S>[$����1h"��-I�h�-��|8H��Cr�����C;[���j�( �u���V��6%:5��[�(c��@z���������2�����&������Po0��M����$���XO�6G�$����8y���vVO��J[B�G��q��[MW�w*��cTS��X�6R�b�k;�{�8�.�}s�TM���]+:�#�
f�|���]]�!�"L�t�^������������.`�u%��;*j�q))��N,I2��8#�m�`��^�^YJx�J+|��%R�U0EUc����U��5�:�����-M�H�� g�
G�Z�L���[�P+�U�_���Zr���������P7};;��\M�H0�� M8�_W�
��N�!�)H������!�K�pz0�;�w�$�;�i�DY/��Ykmg?�F��]��9r��(
%���Z��o����gq��,��n�Y�Pfx�W�[�	�1�TT�}��!wO-��\�B�v������x~�
������N�O�����(��@�<��<�dy���0�f��M����]hO��h�/=�p�*n��,���
�ty-��dT������F��o7��6P�����X*����e{�� ��Y'#`e|c'��O�XSf��+��.�������).���w�Z���F�t\r�S_��s�z�N�g'%���h,�R=Xn��s��g�b�]$�U��SYic*<P�i3�oV�����&��r���o�`�[��Z�����������}�yo���[@������Nh
G�����5Q��B�?������=*��V+A������J�=5���M��������7o�.�+I��^]�]���������t�{�A:���J@'��!!�t��I������>���xW�,�j��)�"���c�EfB�=Z�1\�<zu�k������_�V���A���X�B��p��B6	?�M���H����]�|���������cU�y;aJ�&9/��I���/������`J���J��[(����Z%pyC�6X����t��J������[��K��\��3�J���g�����zv2��7�du>����;.\
f'�(T���y-�����-��FY1RP.hz���^1i���O[���0
'>l�V��9��������c�*B�:� ��x(9�H{@q������H�;�}�Z��������[����m�z����E��+v�1n����wQ�|��h���Z~���V����<� ��������vt���L��������xvS�^^^\V���9�o��!�{�y��	�����
�9��:h1g�
�Y�3�vS���	��6�s2}�l�S���>�rV-��'1d��T�v7��#6��<�c�6#�Ua[:w�!V�����,�a�R���W_�{p�������\zM�Pw�6b��D��]r]�+P�j��Z�k6��Yc�m�v������=���F��ww��v\��6�0,_���|�:wbz�
��eg�TF���I�i�4K�'[���������q.���g���k3���]]wu
Y�/����L�
���������{�k
o���pT���V�j�����Dk�sS&:�)NU���\-7J#M��k&����+��i����M~s)�������������^�����g:�+�{�������Q~O�����������u�����;r�l����j�:5��MR�������9U,#le���AU���/��[��pZ����G��s+=�=Y����<Zu��eQ4����j��i���J�P�#�2l�C�m$��sO�h)�#J=B��..m�_v�N�xtv��O���Jzsrq�-�-�����#�����>���d�"_�2����u{�)����^�JD���`�I�q�����K%��������'RM7g�B%8`�t^C���v����S��N�; ����s���g��W���-Q}����l������j�j������1�
e�IaQ�b?����4�^S��
�e����fo���F�VY;:�?�z�����I|	DN1�_���D�9M��*0B��2�&�����r2y�kR0�F���`������-m��������F������aw[�����c-�&�I�%�N��������`�������BA�~�� jT���`���`�6���L��dQ���@��.l���\�u��S��mO9Q���UL[�y�]�?k��.{7��~6������t�
np��S(PM��|j���}����=@�������76i��7nYq��6x�5*��g�����?>������I	#�4���c��}�G`�N�f
)��`x���{i�������Y�a�Xq���!�-���>�������Z~����NTK)�z��c*s�6	�������=�':��49E-vq���u�Sfe�"5w�ph]#��^���_�dI��CL#����$!����k�,Q�,AV�G�

��
'��F��.��?n�T	Zkcs��Z��08��8[�:�VD��Z��#�b{�i��.f�G�i
d)*z��p���:O(�[:`��:�	Y����#��/��8�X'S������6�v�S?�����
y���,�/,���**��e�yH�bz������IOG4i@L59=�+�����D�4���`��pfw�������������h� �p�a����)�-#����%����I�=w+H�R��s}��F\7���dUD����������OH�BY���8:��%/Y+tS>�X��b�o8R����O��ub*��V�$?(R�%��o��m4<��O�NR�qt��K���P�yO�,"8JTLS1r�6^L�;HyO9��G-r(TO=/9%��<���������"�N\+3���vd��{��&d��zD�s�v*5_P�� �r��qSn�9��Y�K
@�_��PH�G������)��
��$K���%g���|�MH�)�pt�M�T��)z�6�P0���
���]�wYI
Wf@��<�<4j�f��&�8�n��l)P*�gz���Bkw�%(������_Q����s�R��h
':�R����07*!� &3<�d
\^�F�7��!���r��������E(~�,�%2E��{���2��p�y��� ��e��E?0���,i��1S���a�)����9V��OY�#������T�X�l��t�)�h#�:��Nr�;���������,����v� B(��6�08T��h�S(5���E�Q�A����=�������
�@��P���
|���/#�mE����`\[��M#qb^�)K�kz�xG��K"���sm>S�BP�a�^-����2:�bb"q
��&	S��a��v@����o���@m�	Ns=��W������_�&>'2��5s�����&�+4�/�u��rY^�R��ggn^��9�x�?F#�����9~s��;��4[M��{o�*-:��)���w�9������(�Y�
E��:D��r9/�}��C�a1�����=`
��A�\�G����ZO:����oW��U}-4����F4�@*��CN(Y����@<	8�/�/P�r�������)����`�\zl&<G�)YY����M3P	j�����[�����n�}��Y���rn�3-�l(���/
0�[*.Q���{�?����*��gV� j!O�?�Ma��lH'����\������4�[����]�h�k:���jg���]��* �Q�[��7�:z�[+I����[6�&�8����y�d��(�}�X�1�/���m�^�R4W#�4^^�jsz�����I��������e�U��{~�����O�����_����!���Z"�i�m��j]s8��D��:�| ���2�\=jE����F���X���JV��_��F�m�$������[�n221�54y��;zV	��$��l���}h��l��5<�$��)��D����$��Y�����tzJ�E�T��K���i�v
	Z�g������$����K$��3����L��<\$�I�$<��v�U�t8H<�R�L%��=5��Q���!�L�����������N�8�|�\E?_
B��������W�c���8���Ps��R�]bfc����@(+V��������;��_� �~��E��?�Y&|@���%&q%h���vP���qrE�&����G�����*��W��&���^��W����$��QA��g�a�\�����{�b�hs��N��
��V{��3�t���d�����==�B�+P�lo�_��^������J����l�������b����P-�:E����	��b����?0�D����i9�N���V9�
���rT	������jE.3E��&
��+���z��U�JJ�6���G$��}�p����e�E����f��,��,x�d��^���s$��lp��V$��b��W��n1����~�Z�G�Q��������'�-�q�M��o�sbJK���NMs�s^5z�6F����V��q<%�-u�7���m�5��-�(�x�m'��6k.r�\�R��4�c�4��G��|�>UC��f�'m��Ad�~�U"�/�`��)�k��kueL�Q�*j�)-��Q�Z�Z��z����Q�Kau^��N&�9{�� ������'����?������5�2�����S.O��5v����("s��T���������l�u���d�>z}�����A
�v��a�6����8o���:.xx8j������s,��-�[�=�Z�����yOmSoy�l�q
���GV?�`�3�R�'��� �&�&��e:����.���(nN����"A�����u�&JL���7�������AG����X�>7Bi(=�)����t0&��|W�7����b�������O�m���1�9jj�
�$RB�����9��su�c��Q
pW=L���)�I��(����%�O����FW[�����&M@����������\5�v����Y0
�h���T�2:���-�A&gaa���Er�('c�ZHoh���4R�"��*.:x��[����� �"#����9�v�����v=L3�'�?���
%fZ;a[X
����a?f����Xx>��C������Z"��Z��/->-���+zB����I�0q[1����r�Y��8�q���VL1"
n+�A�d�gO���s��x�����D�X:)�~����n���V���p�&�����^5'���G=:������z����Xow:�7��?�?���������~�9���P	��Qg�F�AT���Q{���?�����	��7��q�y����_������D���2�]��/�����p��y�d&���i���i�a:��|��.��v</!:V�CY�?�������-�{t�������u�d�I�����r��������B3�Q0�!��'�1l���������GC���;�n�����J&ix�Ly����0���9�i��<�m�����BS'��p�Ip�K%wW�����T�uU�{���j>��p��z,f�
�����?��7�-��I������[��y9����x*r�$��c.�?C�!LHo4�Wwo�I��Va-�#AIFr�&?��j����$h��"�g���Y���X�{��t6����m��J��*,?�5LMb��+7����f�~s;�~���usZ0����m4\*"I't	Z�	��5)�-�2��-N��Yu3s��'Vo��m���1
x��6�
��l����t#v�~Q�^�O����;$�G7����&��U���+U�PP=X��d�W�g���Vn����H��H"�I�����S�z��S)D��n�3tt���t0��iC�N+(^�x������Z$�d����[����3�\UY�E���I�E~<���V>\���"Xu�,����b�i��8,�SK�}AK����S�7|Tfb��g���O��l�=��5�
��~�a<E]OSzz�,Z�u��q��9z���r�#O��T"�z]m�T&�?W0�h�	���;t68n?�)��R�5�`c�ij�i�y
y��i�������M���Z(`n�s�Y�����;Q�
���~���R��l�5���D���w���=&������`����J0h�����u�Ju�g�Q~ ��p�����}�����y�?fe�\��D_���,��;Urg;8�^���&��*�v���N���f� �R�������u��kU�2�@uu�����=�F�s����\��IH�����R��W�k��u���@����H���^���*�{U�����U����w7�)�n����;J��I��2Nk�i���c4�z����jyGg��`6rv:��w�S��d����}�)�9��!rY��p��0u�K���;��~�P��~��V����F7O�UF�~Oa�{zW
j��pw�[��w����Z$mwgr7�m��[:!��$0��S���W�\	~R�n�8s���*��6�F���A�Z=�DM��W����Vp����B�^;�ApB��E����%��Z
9�/�����U_*	����Q�z��~wy~z�:x�b;8:��^�G��u]6�@yu~u}y�����'P��|�����U��������Y|��4P����5��2�gke��������	78$~WD��U�����=4�:��g���3ls���	���U���^i@������!))��U�� �`g�8����.�*�z�<�f������K����J��.�K�|���
ql�<��OrI�k���&�M�)#94V�������|������jC]AF�\Q�YW5�4xuy����Z�����\�?Lo=����jJp�N�6]�������G�^\�SW��bE>��x���mk���	?i����(�l~�}��r�P]~p.�������������,�{�j6S����uS�W���9*��a��k��K���6��3pSU?�����8sP�
��^����������~�
��x�1g��z�>�qgw����y�N
�v�Ql2Eg�l����?������Bf�%�o~:�on�����A���~3��������������e=Y���0��2�R�����l�T������H��/�?Sh�EzGo�bQ<��.XGWA��?w��x��������6��;���T����?y=�#[��`�Z&;�.A7|��d����a�VK���2[�'�����17<�����9�/����v�U)��.�����������#�Yq����[(:WwX�!�4����7���3e����=�?��}2'�\p=������c�3���%)_�px����EX��l!�#��;��-7����-��i�7�6%���r�rYU����;;���j��Yo�Q6�e}K�2�,�DqD������`�~o�Cd�ml�3���p,�#�S��"�)Dyo����.���V��VV��k�y���n����*������W{f�i4�S�5�>��Gk	b�_�J��E���
�V�����\�Q��l�������A�J=�5U�(�����ZN��(��@9.�A?Z�CR�p�Z���>Y���������v)�-�ei.��@�h:L���@�e�5�`�(�I���!-�w��]0H6/AI�S���	L�����_Q8*�Q�9��x��b`a�O;I}�����������Cg��g)�ln�����|w��	q`�P��B���3�RCi|��4;�"��iW����bv���r#=������r"��`�@��idH�OL�e�l�������"�`O	&$�m�XjG�;�F�a*F�l��]Gxq��-�.�A�0[������n�{Ym�$�Q;:lm|�����I��&�ZR�0,)�!D�p�&�a`���
&HT����2td��4�!`�7��2j�����9��O��S���G��������BEhB|}D������ i�		X�!����t�����O����'���MEbu���9��4�d;�p�+�����%��M�?Wa�����S��a�%#f����)R/�Q J�%&2�t�@������N*iG�������U�A����`L�X�dN�e,5lp��T���N�SO�����a+����9u��S�}��S���jU�t��]WH����J7
�8^��8Waa$�����$�oo1��-�{:�Ou��9	��}Mrh@��$5� f��s������f�Cu����������w����i���kd?��y�,��I��;��&��PA	�r�������Z�N�H�q��^W����=rO��I���8��x
�]���eA�%��<�Zp�-m�(��
.��g���.�N�����P���	_'d^��]�4��
�O�{�@c������4Pt���&z�)�2��(�O�l���Y�����,$t7�\�.��i��!��Q�(�e��$Qd2~��I��%�:���:���:C�l+��q�e�y�H�8 !jU�
�����1��c�qh�������:R!����p�Hf����(��{3$�wFG���d�_z~�d�F^�cb��k�FsCE���=hl:&qT	n@������<A��R�>��q3�
�h
`^R�78)����5��h6�;N�XGS��%�xY.��u������#����_0�5!�Z�q���"}�K����S��W��@\���R��������<}st���O�?��5`<5kL�.�	d��A�����_F�'N��Oi�M�Q4������+����;7�[�Y��e�M�)�����~�]��F�%�N��/<�%b���m4�U�%�q^�������� �Y%���h}��;{w�;��GCYC���/����M,��!s��<	����Rw�p]�����+�f�0�$�p����JL��

���*�|F����5fQ��(K� ����|��f��M{�q�_�n����>U��%����>G��O�U������������V�t>C��1�cu_H\�eR�W���0����.��)gG*Q:}U���:�N^p{����6B;�?��F�z��7Z��jF���<�*6y�V�����48�~E��1���D�3�7���[�
����R������+�g�B�H�F���"=�m6-���n��9���h$�J�YB�������$��Ff,� "��~4�?(��N��(��K>X�/��k���]W]����y����������C��& A��������*����&e�,���a���@*
�gTIl�X	]������i��h��dN���DL��,��z<9�������z�^��a�{�x|�����s� SjykK:�\<[�e,�g������~���b���a4����p�������n���2-�3E�}2�,B/����J�MH!j��,�s>?O�s���+�w���6>�'Q�^�OYx���R�����B� ��a��F�w��PZ�;UUw��};��:w�=�0Qg��������P/K��S��K�*���e���jN���v�v��t�v=z����zv�Ru�r�u=��m|G��|'����������~Ru<�I18S�QsP������lDs�:�sQ�9S����I����s��
k�:�~��yL
��Wuz�qz����4*l��
�>n���}�0������ ���/U��f����C�:�	����J>��l6�Rd���f��I������;�5��39���J
���"e@HQ��8y����U�YDX��0��)��s�U��M�T#�L>��F����f�G�Z����3I���2�B��-B���mU���a�uR�x�����6��4�+����4�E��4w�f��f�mH���'�]�x:���c8���2V�r<���F
�	�6��h~��X�?v:�1��]�}�Q�k�oTD>�L�9����p������������Qk~��?N������s���[m:���a�����w���2p��t�\HK���T�\���#KC���]�885����o��{d�>)���9L��d��������So��
/�o)��Oz�p�yf��I�$�&g��~�,��7�B����9a�m<��<�����6��z�(:�<s�5���������}���!��%c������d��&����k��w�s�F�y�x0����[���S������__XJ����pP"���.������O������Vu��g�~���(�~�Cc��B�y����?��Z���|9�������!�p8�����H:��h��q.}�KOB���M���^r����e�`��h�/�s�W�fpeeW��9�6,�U�Y���
/��C�v�?>������`L�1<�8U��1�An��6p�GO��+X�����3pf[h|����O�G;�y�nxl���p��=L/K��l��<����� �o��������j�t@+����P\f"
��ho�\��KU;�Dv0�����|�z�xW`_r;���x��C�P�"Gd.�����f�>���n���m����Eb��
=F�CQ3_�7_`n<o�A�@(Oi{wkN��-
UI��b�[��,\�a8^�E[����T�<����b���NM���&�����R��|������Y.%� 8YF�t��q<�%``6rW�B�pSu�����:�������X=�K=LH��7�,2Wx^t��ag+����U7�	�c�8n��4�$����O��i�JIO�8��Sm���j[�������I�Ct&�Z����z�z����%�����I��������ct�:���]�h��>��6���������8�!��^=�sZ�a?�>�Y��;��]��J�\������'���)i�\F�w��+��y���;L�2��m<��O�u�w�2��!�%��Lm���1��eg���%LM�:�J��\S�q#UY�_/��E��}!*4sJ�i�D��Am�y����_}�F��-������"HI�3/��4�E���R[�����Jt�~s���F�Y�����[E�*Ni0���N��?�?R��C��I	����
���>�e����3�h>~��C���Ye&��^F?�Tc;>������c�n�M��W��+D����������T�C��{^�0��������,�g���<�g8&6�#\��d���>�/M���G��z�Q�\���%UA�%��}�a�S��p[����3n��l���kw(���Q�;���f����b�o�4�3�2��H��On�s��g4i&�i;8L/��a��z��0{��M�gL��!��\�l��$���S�q�����?�[o���������dI,&���QQ��`����,�o��9��:mJ	wt���A��;�FkS�l�Y��mI��7(�&�d|p�-'�� ������$c�L�I�*(>�'3 m@��~W�T-���U���������.����_�Q���/���s]�$�.O&�
���V-��w�I�?yB�X����|�����f	��q_�;�������q7����]g��x�h!����9����D�j��6@&{�l��s������_�b��V������_�?

����oP���~�3z��W��fX	����V3�,�Y�.**�s���`bzJ����Z����S�	)S����w�� ���6�z�I�$�[�G�N6a@��&�����V�a������f��2��P\��6������d����Tg�)�g���h�_l���:YB@g.��w���p��D/]VMz4�3'���!J_�7`�kO����������8�Y�,W��;����.:D�����&h���\
W�{���$@�uVN����uJ��{v��s����M%�d��o�����M�>8T7�j�58��Z�M%2��uR�_'���!>�h��#t��T�P|:e����`-MK$�T�+0�|P�h��3) @�B�+wo	@��6���_�Y�Z�	�3�a��m��	 �4-��1���?Go��+%�2	�e�u������Zj���M���y7�?G�����^�J���0����<h?F,�����jt�@mWz�E�28T.�{�DO��`��S=�+���W?R���!\pn������Pq��y�X��P	=��5k>�������EQ�d6�`>K����]D^�po���
�N���-�l}dkX�M����a�LL!��c�U�yE����R�~)o|�]����h��Z�>:����aD|�~0l�G����Q�0�:-�9������z�.'���z��V�]����Y+�n������{q����P0��$����(\��d6�%�����N����
E���,�4ZB]^��?��*JF���BIV�����1iSd���r:(��������+�88;:���u7���$?�$�d���x��tUS?�-L�����{t�]pu�>��{~t��S}{yq�=y�R�W��#��b�d1Y�����������K��H�zh"8zu���a�Fc����Wu{����L�9�Y�F��Vk�P����	�-�U��}J~��X��������k��L�]T��������U��k���nz�������wQwq8��>=�*��Mw�,PY���8>W���;_*�PT���\���P�����������i_���k��(�9��&���������]Q��'�WG���e�E�^�'���h� ����8��f�wP4)v������htI�>�������;#qB����!��~�
�5
���)�^~��{�i9�����V7��	�U�����#�<��^gC>i�?��/ �>��?9������A���������f��v��V�rH�9_�T�p��I/T��g�[t���.@��i}�a46e�c��<������^i�m�ya�	V����+SPpg� �������2q���Y�M�Y����ex��8L�w����~tOQ#���=E��b�}}����TE�H���DfA���l<,?������O�h}Mu;�����5�q�u�gv�N���i.b����no����{����K��k^)��/1�	P��hh���v�b*v:R4�xr����(��T�_`eW6!�T��~'<��F�n�3J����h�n�;\��\
,&Tf��@:�-�%������%��[^O�9K��7Yc�eZb�c�����������N���7<�x����Ez���������ku0��n�5�V�-�7�N���#�nNy~��7*s�7XU��	�fe
X����xQ��i@������D�����n0����n4���~R�
�^����43���hU�[�"���Uz4YW,����-��}������6 �M�!�4�-ql8��Ob��xE�rg#��iW�[�"�Ne�*=�@�+OGG[�����S�&S�O�KNb������=(^
j>D�1T ���8���E�����h�\Qs����Ot��Ag5zH�������3�J�;%r���8erV���2y���-�[�qGk`����..��|�wC��q2����ZHNy1����Z�Zm4���A}SSH^��,"yuHY_'� ~����P��S����!C������L��Zs��������g��
*����|�v�\g�����~I���x�C�}��>,e�ST���V��S
�^��
��U�E�<U������.�$!��
^9-I��c�s���O�a]����������wo�V���ZG������O^l�Z�/Nx����f�=rvy}5����:�V����ih��Yg�V��
v����hP��+HP7������4(�Th����A�j�8�7����v`�?����������r�;?��]W-�
���S��Je*�I�3 ���O���J��d�O��Uo�#��!������'$3��gx
4���N�#��u�����+���o3�M>���4�������7�K�7��c��+������1�u_��������
�X��*���El���F�Z=���V���b�Yw���t�����9�!/���#���g�� �G�<�Q�au<,����W�"z�.���|7���+A)f���'��|�q(�Z
%����$��_�G�����J������.=����d�|��r?�h���*��/x���'I�����(J���8���u�Wa����M����^��P
mp�:���]��h�E�t1�B0T��z%B�/A-�A��%�:W��g:;c0�"X!I<���7�����0u�R5=��9�����v�!u����b�l�������;�x��
5��Z��V���W����[n'[��+t��UG7�?�:��W��g�T�d���R^G����'U�T���HKy4�j�D����rv%�>7z;���+j6uR�3�����4��Ym|�6Y�.����FA��� ��g��2��%+�8�Y�H�q���zpv��T}�s���u{{e������sg���$����0B=��9kj����/��I������	f�I����:X�{v�����.���a~7��Td.s)���M����7v��F���u�/�����E���SL��|�$���vp}������)m���9�is��9��-��^%�&��|�I�Ee�>�=l���j�>�u�����!
��k8G�������o�\��'3�O�&�)ZZX���$��yYDwSi#tc���n����O��G����*	��X�5�^�@�1���VJU���`��I�w[?X(��Mr��	&��e{�ML�{yv����b��n(,,��1
�f��~�G��5������P\���W�`�����f��92R�W��?t�����E�N��V����Lw<�f�����v���c��Nx���6W|�_tqcT:��,�:��� �QVU$Z���`��kH��M9���U�n���mG�ko�^9�oaOr�t�Sfx:)�����p�^���\���T���~��\�S�%��Jm}�v�g���osk>���y����I?����@@������s���{��~����ad�B�@��Q��W���3���bg�)`���!�R��
��D5�D%W�������H=�M���=C�:({I8���n.�n�^�Z.�Uv��?WTFOE�����'��^+����G�������z��t/�����W
�c�z�REd���z�T����A���f����W���(v����^=bgq�#w������g�/V���7�E�����j�&��-�-�|��Z�����V��0��n���]�!Lz�Rv�X����(�����Srv�~�O '�%�\�(�i1�R���F=7�Kw3b���Ca��Qi0KH�<*{�+��)�c\�ni��,2�Du�!�y�V��x�b1��K�M��"�OU	�E��D]�����"�t�G_)9�8���[�~D`�	}���C��0��1�>g,4�cu~�XR1��X]��e�r�����y�D1%#Mw~��H@�1�S�k�+��'������$��{�������|�����6�mdi���W���%qDQ�����^�-'��%+��M�R.�%�IBKPV4������@J��8#�Td�@��}��s}�����������N�>�>Z�o�����]���wk��o�*��7��T�wW�M�{���7}�=�Y�ni��������x��_��M�x?�z7}�}v�����������=^������P���������Tu���[���F��V��B�h�B�`�B7}���������s�^�_Y���~�_M��������x��� ������u�����v] �,} �|'�MzA~�n���P��#����K��K���S�	
N���|	�*��[�	po�9�����p]���8��+��qH������$\�d��� O���vz�i����Z��f����N?�����e�Fmo���+m,�;u
�k����z!�}�*���@�+�vr�k6�Q�n ��R�^�4�@�u�kx�n}����y/�c+������b����A��z�4�t����sX�v�n�wf�{;|o���J�2���{�-�~��s_E��?e����5[/�m��
A�]�]���A�a�j��h=��B��r�{�����N����~�d)���Q7�������}h�Z���5~em�>Oc�
X��p��H�M������n6���8lo���(��]GvF���J��5M���[T��Em�1������pW^PZ:����wo�<4z������r���N��VMu��itt[�~��C��C����#����^K������}�i�����|���|��<4��J��<����������?�>���?�����?�~{��?�����?�~{}�?�^�h�?���CT�_���yD�
;��R�h�qg�l��hn�(��j.�����K�H���8���h��B�}�]�la��7�F~�&�~_�_({O�N��xw��
�?^K��C��������a�;�NF��z�����=�������?��w�h�����f�q�Z�x���$���_%�v?��_n�����@m��gp����K����/9�E���
���K@�RD�2����p\D�a����1#THs
��!e���^w5��T��VAD����v�O��;�?�x�
~���Y������D��
�|�p�0�Wk7��v����O�(��������+�P�.���LE�����v�v����������n�-�7�:��7�N����z���7-�`��&h}�w����V|sy^}������g��9h�ag�����$jE��(l���7�Q��;���^#���A{�Z���Av���<~��{�}��_���<8�<��"�p�N>�!d���'������s��
�c�q{�q�����jgW���s�q����7O~�{��J��G��AJ����S���7q��V{>�t��`v$�?@�{�����Er~�����pMQcL'5�D����A!���AK��,
PV�BP[�Zr������j0��|�g��B/<)y�>�&cy�p\�a�����Y#NT�G��C<����=~�q;���a
�4��<?�����@%i4�U������o��g8	�q��l��������~kK�]��)-���>egPwH,C�&cx���d��v~�,s@1+}k(�4��h�6Q�^1I��f����	���D���2k����S���8,O���X9����%������������4/�	g�EB�t��������'�g��v
��2�\����]��a������
�4*��J�8&�I��K��,���@��x�����v�:�Y�
5
�d��R�2<��#I`��w����9���W�,5b�d�1�2;��Mm�8��S��������,0U�A<�8���s�G��Q�������H���MF!(J����h��k?�8Z�bx_-'YC)�t�3�]���H�G�.�Q]'��k��"5�!q� =�F�J������G>�%KP'C��v�
�3���Dqu�o�=�%a�.F<��
u����&��VL�4r������]���x5���I�Z�b�fH��SYD����qg���	��c���������GW�KP6�	�O�j�H(��<����X}��a��_�1s�u�DR�jx�g�a��:`w�I�0����%Qz/-s���`��j; k�)=��
l6
�2��l���e�k>?�/�axh����V��e����R��]�0q��"���c�� 	�j�\��i�~��c#n=_��q�Mg	Rr����k;JI���8+8�3Z��c�%T�'S���Y���i�������qK����g�
�I<:I��������4h���Li����}$LMv����if����U��&t�������b��T����_����(���p\s�c&2 ��lr55�2��_�����">��heI��ohQ�]�����,����V����Kq�����@#W��2R�CJ`��*xv&&�J��Z��\�!�Y6	�2�U����}"c6�[�r+��F�����$���mt�O�a����%��8���U|v���2|�#r#z�s<��d����������p�]��Cu�Q�d3]�i���������>��0e��3�Fr���2����3b�$\L������2MO������v��������QS���(Y�
��������9�Fb:,0��FI��Q�K�UA��9����l�F|�P��/���v2�i��KV
���,d��b�9��\�:#�d �e���(��~�����!U�qdJ���������f�Q�.En��AFi�xL��U�=*b�3J�Ph������ZM���������8jc����O��y�����M����6A<E��J�Lm��0|��9b�`���>U���l������I�6|4_�]3�o�t����t_��v���t���N�����=~����Z�0
���� �G��n/�za�w�N�?������l�4��>
D��N�q���+������%��}@5uy>�Jw��%�>;�Z�}�x��&��&���38!��t�=���@�[$��2�X5��-�+<�/N��tlMr7�����w9�j�L�-/���P)���O�"5k5	�Yp�`q*���+U�bu��G��z>��1OR��Pw@��_Vm��#���E|�x3[�r��+�w�N�XOj�*L���]�E�������K�AX�|�J��It�X)2E5G��)�p~(�sm�.l|�o�S�pr�k����d����m�Y2GuU���"az�Er���H���P7�����P+h��h#���3�w`-�q1Z������/Pkw�\7�?�{�H�����![�_��]��4�sx����7'Ok������&��iMMt��W�%���j�W���|>4�W$�/����h;i��{��RM����8��2�"����u��K�k���M�W#�@�Vi��3��F��!Q�`P#�h>��s)��d<[�J"��F�&.�u���_�b�Y�/%m����["�������{�$lv>��E����XF�-:�����
�^���"w�;����
"%[}\�n;��|�o��E�z?X~�q<.�?N�W0}��/�Oou>*Vv�����_�qO4�O��"���\����	x�~��$�������i$w���7�.�C���Z���`�.��J�8^Ss(�v.Y���
�u��pO�O��	�t~��t�l�����I1���?�@�d���v��M�}x�()��C$��q�a��1D� ����]���x:!��^�}�B����g*T�C�Mw�x����yB�Lq�S�E6;qv������M��R�v8%s|z�g�{G"��� D>V��~�23��$D�����q�x=��s����zg����� ���������6x1��+�����D�d*�U&�����Ha\�	�gIl���M��=*�9{y���t�$;�[q�#��"s~wd���b�"�%�����k�	5t��X9�\qw��)Yg���.C�j���#����Cq�*�������\v����&T�#���8Px�Lg!�����:t0�{k��s���4���{�8#��cX������S��Y��F�V��RF�����ha�������h�0�,�p��3�|pm�2>����~������4��T���7�����&�|��qb�u�������{C�P��������k�2�h����������	
����3���xW���Q7��b�uH�)�)�3;�Y%3l�z,�����.��kA��k�,�A���y���DE�F����h	�_<'yC����������y�a�uz��������q������o_:N#�M'����D	�o������{�TW�	yuyT��&k��0��(�"��ZC~��!	�����E�A�������X�a�k���W�,�&�����/s�-��������������\N�����xJHv��������*$Ko2 �]&��|��q�\�M�C�|u*��p�>��%��N<0��$�q�-�e���3X��b$�����WV����wGh��.��y�������a���)knI�#���,���`O�Q	{&���;!�������@�� ju:���]@���H��>�O��_�}$Z���t|bzn6�^}�AY��N$c�eCT�B|���$|�l��#�@x�4��Y]0N���KL�WYE��$g$n�x�������A��%r���lw����
G��@�)�\���G�X���K�������n+�sI��P�������L�N�p*ZY� � ���F:��ec	�9{����Z(���"d!��|��W{L9���uGUu�r���Ha����B��~�D.r<Q������Z�07�yY��QL"�I�����zL��"/1f���A3N��\��5�	���)���m�|o���_���-�S�
��JPi����|��qPJ��W�Q���"�;4��R�Q+�D�I����N�]!�����!_��~���IN<x������f��[���O���{��k~d�9���^;���h7��Q�w�P&�c&N��I��J�Z?\�p�[�������~�1��t�;ko-�U�%�v�	u[���z���D�Y�dFO��+�hGA�r�s�Q7f�:���9�xX�\j�� q �R�#��'��S�����Nx@�� fvz���~~bg��BB��j�������Q<|�+Gf��w������=MF8�83"��w�u�'��u�����I&���y2���t�y��=��^OK����y�K7�aD��F��f|�bVQvez�\����BF���X;5��yJ]�R��$��8��;���s�4�K�t��'1M����p1�pN*a��x$8��C��<&,��)!�f�kP���FsK��)I)�:�x�^'����b��S3/]��b3�6* UH���
t��B�$��U����Ct�]�H/< lmF1.��4����PJ(q�����N<!b�y�gRT1���z�����%"�*�*��N��*� �m8���t��@��l%�f�b�~!�p����w���`� �����t�@�'a����dT5�3���PE2�4�8�����;�>������l�{����U�������={��C�����;y�T|�����6wB����7�dXI����l�Ua��US��=�2��Dox��
�V����X����R"��J<2�j`��tA
8$G2�Q��X�<�%�M/����J�2sS�p�U�3�L�����/�.���t?�j�tL0��1I�1n�!%]��)��r����Y����/�O�v�3���9��7u��@Q�v5���??;�������a��������O����i*�y������z�DJv���^D��(*f��Q8�eAr�r"����OD*|�P����D$<��\H��������iz03����4�ZS]�8}�L[����8K&	�p�g.'0������"��K���S
���4���t.5��y�"��*N�0LS@),R���<,��f
�h=��4o���M�����&G�����������u�h��n6'aw��_e�QtL�\�!f������U�0�LT]�����i]����0�����4�K�*�����J�<���~��@1����q�{�c��4���jAV�<w)_9�X9��M���&���N �(�	/b
e����H�����A�m���g�;�!B����U�S�4�t��0K��|�b��n{�g��6�H����'R�����AX����A�����A�	����r��S�/��~���������7/~������?#�(�m���%����fS��������[�JE�F7��B�k.���!S$vs,����mA�������������I��\��Pn�:j��L�����
���~�+,s�#��H�����|t�^�����W��LN(%N}���k�����pa��a����]���3m������N��J��uw�����~�h[{�&��s��FQ"���~�lG��������(��m���j��S���[���OA�����d����.��#\�&�?:Bx��\s�I���~9�����&C�lC�8Qp��4���J��Tl2�~Uy���R�_���������2�_>k���Y���J61���[��>>�����\PU��E��+3��wl&
hM��=g�0�@=�`�G,##D���8��`�E���p<F/z8���*A�0��\H���_���!���_����������'�����`:����)�������?��z����O��ly���
}�u��������<�#����3r�N*V���t6��e���p��d:���'O�F��;�(�R��s����G.��������7��<P^�"�Q����������5��7����C�^���B#��[�r�\���.�FG>#����T�\f�ft������~��o�7�@k8���x��o�s�.��(E������/A�/������86�	(�E����"�����3)�`�� ���W�`��P2�T�����	
B��vb��-$��!���������)������:�/dg��\�t�5)����i���q�!ga��?���SI ��A��>M3���m���sQ��v���#�=m�Av�j������`�q�����<�,�dF�@�*�����.��~y��:cH
�Q�Uk�0��K6Z�c��o@<��16M�����"���"��&��)52^���Xc�������=���e�����--�(�[��I����}o���
�]�`��H�[���<����&Sw_�'�H���$�q�GQ��8�3H��C{F����K��F���t(�O7n?n][��7������Y,^��
M�zwm��GGu�y?QL{��(����|����LL&�8Y��f%#k�#!@��@\N{`V#T����4�8����%@�iO9���� E��>���Q�����+b�[���|�R��D3?�������P��=RW���8Y*]s�D��@l(/����P�����4����Tp��3I�M��Y��f�d�qu�
{�6TP�}M�yM�]r��:�\��*~A��2�J��w�@�d9p����v�j%��k1�������Ulk����m;I��|99�����[�4��?����F���i��A`��ls�9�W1z�3Mly�=^����G�?��x���/�oj��<����Q������#�*�@Sq��(�������x��N��D�%��{	�R�����$c�\�va�NO��=={���b���B�|OH9���V������Xc���x�����e�)�Y�R����?M�)8��T�wk�c��c~3���y����u����X~����]�,��qV��+�-^Pg���#����E��
���F`��yB�f���o�w��7�������w�O;�<���w�v����jF2�x�v(�[�L������}������$tU0N�"��J����f�^bJ����A�|����Z�vE�} :"@����Z���=��3�w+���fp����vo�jg
�IJ/z�%��=bMi��F���Ac�
�h�nd��P3m�*�fl�+�w��3]f��1f��_���+zla�h>�Q7��^���Ql'���U�<D��	x%!��8����IQ��l^K�A.�1��q����KzJ�{+&�����-u���-���R*|����}�������s\^��6:�`g�&�}6.-�>0{���Pw�^q�h$gy�b�!:`�HR�{��b���<YSD���ie�d�����)��\�����K���#t� :L�j4j�����1����k4��8�0y&�G"{J��J�������%��
i���X��%_z�z\�AX#T��v%�-(�H��	��������u?��L��E��`Y=P1'��� j���"��sdX���1nK)��|�P�[&�{e5�8p��#SR+���?�����.X��L>xb�J�A>�S�a����	\w�T
��T��D���LWuH�>w��kQ5?[F�r���]z���	#�����X�JuB&/�S��C��`��h�-W��-Zo9��Y,DY�����n!�\����6��[f�G��� �T�M��y��.�(T�."�Bw�2��?�;����CW��9
��%X*�q�Y���@)f�2!��|����u�PiT��L(�J<ot��e)aA�?�F��k�p�^�M3(BQg�\Mw������_��^��=<F��t�8\,~�5��S����I%���uN�~�H�f�
b�(�T�����E�
���~B����(�;�� ���dJ�s���0�-��=�$>��.2�m�@�����b���o�IcW#�2*�ot������������(F=$2Vh�
�Zx���t�}� =�U�"�h�7�<HFf�����RA�t�yp.n�7Ns_��D@,%[�\�`"���[��+�N�&��qD��t����L�'0Y�1�T��T���
p����]+�RJ
��CK5���8���aS��n����e�Pe�3�� ����[:�.u���+�&F�j��bc$K�&�,�G�V�a���9�6�CvV*��.�%p���1L����*z��R(j�����()�*�{
�1���|�+�,gy �Z�}����W��{	�2_�������u��4��J���� m���w"��k���I��w~���[<2��2��\���sE"�05��+�����Z������A�[��;}������j�����
�[u�GT:����%u�:�Q��+�C1�+�s��`�l���8�K�[�x|o����i�U�����U��S���	H��l%�M�q�Kj���3��w��=�;@�0W	����h�e&t���VDA`�J��E~\R�[�������!������*��}�Ea�z@`���e�V��D�"
�+0����'��"��d�>c��J
�4�/���Zb�#L5�V�,(-��'��������yf��a2�������u^ &D�#�#H�g<��NH���"�F��0G�P��U�Y�S���5�9c��[�0����T���?�<|�g������[Z���%�����6�	fNH�1��&4#zci���W:�@/I.C�7�k�t�K�>d��"W�!����y�j�x�!�G��1�T����'�����CO�)�<��|�u��1��d�9�f{+�>������viP����H�]9���������9b���\R���>�>b*[#��(����7o�]Di&^�"��u�:��L��B/����=�Z�l.��/��g�O���b��/��8�QP���� kd�� ��9���r�L��hm����(9�L�nj�V�v�B5X��Q�ln��������	&(��u���������V��3<7�� $���S����WK��sk���:�R����u
7e>�T!������H{D�����#H�p�P4@:�-p��n|�z�l/\&@V��Nq��#��}.-�2���|������-(9��5��J����MiV����{�%ZR9U��R��a������v#k����q�]��:�\iQ����[e�����EG�8$�o�������(���f��^��D�[���&�����K�D�Q�N��N���(��!'&|'d#��xN�����-����[�qS���4X)��m	����{������c���[xb%3�c��,�6��i�/ZGL��Z8�HG�U��;�`������_����p'��d����:F��YZ'��<��&�j�h2��Q���DF�����'2��L�{7���>���F:�Q��4��x��sCNg��p;Ao$K�'g�y����-��44[��f�Z*�G���6��C���i|K���J4����������_�J�bOu�}.�J�;m����5z�-�K�,��5d�����o�[{��6�G���b�`�G���d��F�'z�i^�G.��(;��p����s�"I�eh��X����)��22)?���!m��&�(6M��-o�0�������6I�WhvG�N=��J��<��v�#5�-���#I����]i��M���������4a����-�4���J�\�+
��]��r��;Fsr?�;1�p�yNk�W�p������@y�X��og��vK�qe���y�����U>������Z6m>m��Pi�#���e���Bx�0��+�A����y��I�0N'{_*R���!q_y
�|��'��`G�,j8
���%Q�������������������kx��?�	s=�_je��~^��1l=��+C!83t��k|Y`f�L�����N��OL��mx>1��3��j���0�=�_B�T{�o#{N��@�J_���w��cLN"�N8X��zG���^@���A�v�����\�L���8w������6�x<w�����&��E������=��$q�I������>�	�2�1q3���F-W��h��k�hJ	�\/��=-�P�K2�����~�%T����)���r�n�n�E�7�9J���V�d0eJ\4^�$��E�>�D����6�������z���L��Q)��7�8�g���
u}�q���4��,���Z�2
7�w;���nTu�������@���$�L�4�r�jmY��|�������)Z?1P��a8^�������O��	�������j�����-������m��Foi���� �#D�Q-k*���'%i&%8\����A��K�Y���*3v.���������L�����(�$M���*���v�uX��7�@"�AI�@���[�sw-s�
4�4���*T�gxl��������o
=B1�
]
+�����b�ZP��mc�X��8��O�s��������)D��6xv��%�mmw�<�M����������-(�b�=S�+����������Mv�n����_.���a��h����w��
#9� A���i�e%I�~��������9o��a�� �y��E����`���������(�n�����<MS��>>����N�<F�;E����g�p��o�[��6Ct�������u
	�W��0;q.4��"�N\���K6���8�Lf�� p.j�:ar����p�9>�y�&�A��Rs��"O�����l�J�����].(�����RH��b���q���"�p�����Q��6$=`�����~6���j�����4��J��`z��<��������pI�Av�R�6����>�LRe��<M1uJ�q�!���t������X�QKg�����>�����r���9���t<�;��iH���%"B�x���`�����V8���-�O.jg]�?l�=w9�I}�B`��g�#^��@5��g��8kC��hQ���������pe����%%m��"�JtU�m�8��M��s��l�2�����{5Y��=qi[�0�!�*B�4�_�ZE�e��9w�q���J=$����,��G>�)���|�,^�w����n�������>���v�
;��5�7�#�@�^+����@���-��Y�������H��9����+O�
����N����GP�
?n`Ao���Ag5��
���9��g��K i%b[
K��*s�bL�R0Z?o����
��,y�E��;�/�.i�,Hfp &�'�-y��R*�o���-��G��1�[oV�rn��d��Xv�=�G�
�]w��q�(-=k�v���n�m�wvWQ
\��FK�V�I�`��ct�K�A_���W^���u��2�tS@�J�������x��E�z�lu\Io,[*��
�r�[�011�+���c����F�c�O8������uI�Y3��K�q�J��hrwi���}��d���\)-xh�O�<��Vf{5�,
��d��S�t�B��������Yj��b���t����`���o����(\���6�d�)���
��)9��_��i/{@/ �L	����E��17q����J�/�I�_���x���B�(wc��MY��
r�T�B�zl�k����������mS��v������}>���^�<JA��
X�����m��n�&X>5�N@�2�Q�jC�/�&�$G�R�,%O�Cn+a�P�n�j�"0�a����$�����MN�(^7�
x�+��j�j���,�=�M�;GXx��#h��x�����f8Y�+�4��=^'�=-�����-zI�E��4�sZ�2��j�{�	�862U?p9�4�a�8��h�KRDs"����Z�]7[R(�����e�qzV>_e�����Jq�`Z67�0M��qr��A�/�mK"�zN�s�nM}Z3���Y�~�HW�F�~mz�)vt������Y� ���.�D���/������!���?e���Jt��������$�����\��,��x�6f7�Q��a��H4�?d�@���������#`��vs�l�j�<�<�<�<�<�<�<�<�<�<�<�<�<�<���~�?3H���
v1.4.vallock1.tar.gzapplication/x-gzip; name=v1.4.vallock1.tar.gzDownload
��IaT�\{w�������@����������lU[i�����n��{t@��P���]�6��wfJ�HQr�����NbJ���0��h6�z���o�.F�q}���#"�[v�������_���'���������c>M��z���n3y�O�������N���tz��g����7?c��j���(���g�E1����O?oA�Lou���nt�=�6��Vw��[V�������s���Cv���^���g��+��Z�M
�y��D(|���K��.��z��R����az�7��+6�D��zl-���a-�Uk���d�f����#�Ga�����F��wL?���!D��(�B��eQ&!�|n��L����������y�1_8<��/>w���pn��P$
��8lww���_Z��ci�X�"Zx����d��D+7�Z�l
;�^��z~���f�`m���R�9��K����r��}���>H�y�Lr�[�F�+����Z�7t��Xn06]�{����!L]��?�|)� �;���r�=����q���R�_�S��%����RQ���Qr U��Ru t�E�*|Z��5o�+��$w�X
�G��"u(������c�������s=M���k3��� >`	����(t�|j�WJT� 6\���a/";|b�;�T�xD�X
M#);�_�v�J�K�"���j����������0�J� [dE��h4no��������i��\p��)>l@�gE&��MJ@�J���p�A�1<Pm�@�v��M���I� |D���x��0��i	;=���$P����+���Fv�I��C����2QQJ E��0�mh�z]C��`4N�^.`����c�G�d��+c-V�"�o���:�Sdz������W�A��V����*���N=J0�"�>}�����VW����z�>�kB}�G��txogx�E���)SP����F���@��SH�)��5�	@Z>�C(Ezep�P���0U;,�.v4�����?ENw��n;�]f�$��bk��5���!��;���E
�e�,-��Pq"K(IR���������i����������0���j���Cf	G����Y�|���Y~z��3���p&��u�����5�p��B0|�N��q�i �#[��KV��a��gUu�[1�����`s��{�A���x��%;v�{^X�X�#�N3���������;��P�_h~�����;`'����1c�p0��P����-[X��T^k��
Ek�P\��J�0�o��!��po�L3^�wT
s���J aY�]��7g�YI���ZEO�Zm1���F��]n��ZT^����8h�P��7.�s�!����*d'��1y ����"��C���`��u����p**�Tz�R��/����;��(_��B!��\B� Vp.+��R)�S%ynY��3$����I��*��,�"I���B|�YW��,�+I����1��N��4��P���&��F�����;�:�0��B�tt����
P8qg�A]����L���_9)�kH�6����@g�w
���(!���\����A�����V�T�����#5C`�P�5���7.�
b�j�p��P�h�MX����������r"l�Q�c����L��`~�V�aXm��=��(P�u��X��1Y�~��U`jK���uk0�_	(��� �x"�������������/oof��8��)}���n'�__���NO�;p���'���0�B�a�e&=B�g0�{��NN5�el�X�~�J���:���o������;��B��2��r�	
*��h���\���?�0����)��(�+�R�70�R�<�(��3�i��nf�}T���#�D|�a��^&I~��p��|�l&lA��9���/��M�;�Y���B(pFd���6�
�p4|u/��j��{d�����D�V�Q���6&�^>GXd!��Lvnf0.b�	�h����.i��c-�@N?�R�&G=�7�y��36�%n��![��.�7S_�'��w�������J����*]�TG�O��P���,_�|!��|GxO�x���/�-nD����Qel�a~���o��6/�j�� �#�{1�=��>��h:��t�xf)��>$�k���������������B�,��M\�Z��(?����|�x�p70q��2�/
��e5��Ah��|j���)�K�����j(G�'?�����J���iTtys1���h:�����^��f��?P#G��=0;�����!�H=u���&-������BM:��qZ��X
a5��G��&z$8�m�o��������A8���^�|����{[r��������(�������j6ma��� ,��#���Q�����t�yU8I�s��j8c�����G���T���x�2����d�JG"@��vM&�Uf{�Vu���1c��I�g� d��	 ���g4Mf#7i�*:�aV����JT'0_�!96XA���Ri���g��1�_��!�KT�P}N�w5���D<A���p��p�=�U����D�~���^��Im��a�[n�E���������w)��� ��.)O�d?����&�)p�������������Z|��d�POH�	��X����		qa2��H��F����d(3��C�jRB�N^
�,�i���]z^[���0m��zt�~6������������g��+�T�w�}���Gr�J��sK�(S"�u?/{$�J|��
�����)q�\
�7�c��W_���tZ��^"����������*6��Z�Y
TS�����2�,���.�/�&�X�D�
mA�]�b���T�[���������$V}p�n[���9m��hq-��*T�Z���
�{2�����������~�@�����������V�=��<n�)�]=;"��z+A���)�m�Yu]1�\<.=G�}��/��x
�K�^Zi15����(�'��I��������Q�{�c�zQI�*iR<<�dG�n{�q�9�����iv)�(~�G��]��h�V���p����!�6fi(�h�t
.�J�-Bh����U��oV:���av>�Mfo/�W�T��&�,
�d|�$���A��x���	�
zS�T�	/�jg��C���BD7��
Gr����K
�
KH@��".Hr�����(I��`u-��[����t
>?��T���"���$��0�x�e��!r}7���$�,�ItT�	s��O��|�,f$�q��� f�y��>Vx1��.���r���t�%Q�>�$Hd�����#�J�E)r���A��A�� �~r9�������$�����
�� 2��2��'��"�l����@Ar�D�����C[�-�8h��A��5�B���[�6-��U"I�P�,;jy2]+�(���Tq.UF��T�R����x������V������*�V����F������(�-�bz���+�]�u3L����T3�\����Cq�2���rW^����8aO�����8��)C���*�VK���;Oh�<d;y���$tm�}��w�6~2���������f?�4�:�����/���k�~8#\��"b��p� .�7BU���{�������	�����P7�]���!�5��cG�"T�5s��[����`\�Q�/&����wh��u����Bf�Xg c��9��&`j�2��;��4!`��P��
pC(D�S�A���T6�/1�\V���f0J*Q��v`������D;��[Gz�D�x��������������{���h>�g�?Cp �>�:�~�f*�B6C�@��ik���
����W�$v\|/�aA���VkT��rm~��k�R&?�O -��-<c%"�����2������ ���7%��
9��9,��xshKF����x���^�ng��S��WV�f����F��2)�8����h~U�'��\��e��
�GIzH>L��Z����������b��f�����}{�s��.U���?�:0��{SX���z���%�8�.m��+9) ���@�h_]���x#�;�����U>K�y���V������c)�W���B_�<�SF�]b&��	=&%�E�z�H�j*�P���.�U>uS9���>1��oJ�$�?@����n���#�R�#��aA�5D������4D�Vm��$�v��n�w�v����8��'���`w�w~��$�����z�"��O������^/o��_�Qd�U�f�C��E����*�V�u���Jk��"^	
���y�|W�AL"G���='�)���|��i�[<�`I��m)��z5|
�������DF��7_'��"������l��9���s��5���z�^�6���[j�,E�%M�^��b0P��C|�'�����;�s�=�����������M���Uc+�����nE�(����wp�V�
�k#����q�wPUj����TE�D�}�P��+��2��JB���!��f"����iXw��l���|l�f��(@��w���1�W(������ �!K3�z�A���;7YP�nj9��|I�B�'NmCzM�r+:����#�m��X_�*�9f�RH��k�%���Dg>���F���� ;�T���
��=R�~ ^h��7W ve���t��:2�k(�{�&���opTn�q�&�V���b%�)���^�������l�*��K����2*�|A8e������&�@j^��K��2�yu��x��� ���dU)[����:�F>��\6X	i����+��kA�]fp�V���#�$�3.��1�p����7�
]����x��O��l����������F������������v2~��O�6����m��i��'�������W|��'�e��%-�k�&v;�!��y�w�����
��G���=�2��o�������vk��O-<�IA4�/�F�%��%~��I�~T����[������pzI
�F���*qh���������<i�4#��Z��S����hy�Niz�(`�@�I���+���2��-���KX-9�X��
��O���h����>������>LG>���E�
/�k���;P�Oq7�� -�x���N���%��$��S�}��w�_�)�����_C�
O��d������S�4PP,�7%l���">�K^����S������&

{��;,�Y���x�Th;q��� �2�'�P������0� �o�gu���i.g�����C�����S���v+3���p����O������!
h���nF,�(��O����-���}{��d����Rp��i�Ts�J��xF|���1�iO�A�XED��8�C��G|���$��q�U��
���S�VT��C�-�{����-��`P�0��x���������hCM�F%Q�(8�|����e�&����p��6?B��H"����1�18��vqo�"�r��r��B7"��=����Y,	���h�a��K���62�p��;�J|�X��BO��/���.x������5�<�V4��������t����#@���"N��+������ �~>�cP����v�!$	:K���]w~������m+��>v��&C�5��F=x����1����6J��8x6VKCg��*���������d����>E6�S���������Av1��
�����O'%� �B���)���g�Y���E�=����f�@fDd\W����L����@����?�������C8����
��xMm���cJ�6��w�=A9�V����fJ'�����Eh�����-]���S��w��^]���!���?���sg��
CVe��CC��u�%�z/!�b#3�

A�o��k��j�+ I���! `�bV_�<KP�>��4���U��H�i�kd��)�3?A:b@r�p2���?6�S4�Z�4��^�O'�R�g(H��U{��N4g��3��V�e�\n�d������mo�g�s*����VF����dHd�x�h��-yZ�!M�Q�)T�v�����H�P�Qu��a�p�5����:���w����ah�������>����w�n�3�G���Y����6��'���I��Y�X���"�9������}�E�
����������N�x$~
P��V����Y�������V��FF���7L�g�~�s��#��*+�Y �F3����`����/��H>��|���f��R�2v4>���jfb:�_��E��+�M�D��M�;�p�?'���&�4,NJ^b�7����L���$zJ�p�z-�S���0�X|�DjN�T�L���1��:���PJJ�������b*%(�I��*s���7�7���S��Ua\1�N�����sY�0���2:�h�����������|{q���Y��8;��f�]t�>^�������n3L�<!q��J��0
(�*��Ai{+k����&�����<bXFV�vR�p8�0�#���?mM��/U����"�'+�^����b��������p�E0���;��-~�7#3�hE�q�|��E�a��

i��#��%��{�"��@���Y����4��j���t��"�
���}1:���S]a�y�Vo���S���V�����u^�^E�����zmm���n�br_�T5�k���[������'a�����,�T�&n��"�}�������n�d��W���uc��
��b���HB����KS���5w��I�x�@vam�&�(�QaU��=�p����mUE�����!��Xr�$�_����-�{=5����"�����f7�����&*�(|C�����K�'�
������b�b[�m7�����N� ��q���;������S^���<iM�?�P�Y��]T�����F��=�/%U�#�(Q���lQ�����b��bl������+Q���5<�8���S���"�h�5CV��&�X�'}�S��\z��)���p��?^3[��V�"���Q��*���0�����<xkok)$�%���Sk�#���A{��k6�����^�!|�6sh�K�������./�O
������t�g�vw�e��x;�M�g����B��p!�-Y��Tb��)����E;�:�B�3�'��u-
�B�e������ej�~+��U������D;J�/�t��d��9���]fp��K���t=������UU��FB7mCy���yDX����4�ss{goo���m��v����wM,��w��������Tl<>Co>l���j$�H�/�|���@6����Q�� ���c�s���4
9X��4���#�aO3*k�7����z<�&��T�|e�"W=��;
�Z^Y!
(G�������/�6�,��qU��U\��;o?�^E?�~�\����;+���&|u6�v	.�|[:~����p_�����z~��WAs������ �N'���,�-H~%�9x_�cBRK�#�����o��sL��b���/�1a]�������W��`V�����%�e{�n2O���E��j�e��h�1�Gk���n�6Z_2.B�2/rD=����hj|l��9��nJ�6T��X�a�G7����b8>�.By,�cL<j�t�7�~G���#��\u/?~�p~q�9�+�1�o�����w�c���?��
i,��:c���"<L����v��sdA@��z����zJ��!Mu1�����|D:�y�U��9U�%/��O`�vm&mom�i"|`R����D�
T��RBM�<�^�Q�:[/-$U������H��7M�O��!�j�|*��Y������vb����}?�h�,M4�w�0��_B�������e���{�A�o�Fg)V��j��G*����VF/�Gz�����������������D��F�K��8Lk���A>��������_�>K|s�%'�..j��Z>\����:e�$��[�s�/�pU�����V����odQ/���r	fs��pN��>[+W���'c�KJ�a��\�F�5�����yH�R���d4;Q��xa���0�����gs%�8l�'��A��d�q�t}u�7��}���w#6>�K�����~2cI����a.�c��M�3���Q=��='"���,�u�����_o�_��MF��'����7����������F�g�i�T�Vjh~���*��&_�'TK��l�S�s5�&}s���1����X������7����=������U�N����\!	���z�
'Ml��y��$������uj�j��0��N������Y�0����M�R� \��w��,:c(����/��8���
����z�����X[�|��h�%���2M��0o���I�>��s$f��
�Z{����@�����N������p/�k�X#z�����E�������g�!�Lt��g����@[Z�{x���z��Bx����s
����H�7�6�y�o�4v��/��3�m���^��%�)�j�F��a�g��L����$A_Z�V%��"K��+�	*�4�%���d��y%�����[�/�Bv����
��Vk{gg+Y�Z|�E9�k�����k���,��t�������������kT�4����lHE�{K�<]�>J�f����m�	@�� �D��')|<;���N����\F/�Gg�~���Ks� ���:[��I�<�
i�����`w�lw������+�o�r]�iU�A���-d �a�Jt�.7�ze���b#��p�K�~q�)o~���{�����k��Bh��^\w5AcVLE�n���>�=�C��!Y��r���r��M�(~�����"���p�����%�L��Y�Mz�Ad~��7�����
:/M?��4�� Le�\Q[��P�:��N���pnE(�[�}���R�2���J����:���-9��6GBC
L�����tR��EB
�d�S�d'����w	��F��i��vr���wP�|<=�:�QN�%���(�]�M����7zc�{�S ���������L������:�0�oG�g�S:NU�4�v��S������������6�����M����^���B~��=w�`��K�����N��=z��i�Z�������y6�Wq�H%v�u��,	/��$�+
�n����f�
��9�����r���;�53�z����Z�X�L���|��������:��.�$����I!#�9��?u���"l��| v�j�/�8���~:�`��9�j����f��P�&�3�t�.���u�Rn��
��hy����
�C����������6�c�o�� �i����v7M'S�<��oo�Y�I����������rrN>���u���q����Q���E��b���Rn��Pr�����[��s�i`�d�����0�j�N���L����e���+0|-(o�G��Y&�yVn��v����7`/���W���dh�X�
���
��������6��~�`=R�7�c�x�<V��1�����|�7f/����"]8�u)#_F#Z����N��������������T>��	�=:1��L	���C�m������D�hw3h?`���"<�Qq�q?��VX1`i�U����3\�}�6��l�?A�X�l�����F�������'���C�8��M0`��(���d��!������}������^W����8��(z�d/*k���\/*���%Jz������g[m[����Y���qr�!I�wF�R�h��{�������;y@�
q
�!��?�@�E��T�g���&�,��#�6�UO��/�!Ud����]����%��S�]���j���6�H64L�>	���|��R���Au�w3�@����:�D��5+�P���/�M��C��;ddGR�s�-�w��d,1R�Y���B��K���1b�$f3Vz
#�����,y����'#"g�2����B������7��#�e3�v��eG���S�QP�Slhw$�(��;cj�a�v��#2����{��"D�'LZ��%��{u�s������*�mmc���9��1_C�dl��[ZL�K�f=LN~��rQ ��t/�w��%'<�~�0�S8�s��25H��$�6������V ���z��%�]�lc���7�6�[2�:L�����q��7�:���,�����)���� 4�Zl����>��fVl^w�t��E' D��Qs$
�<Q��Pf](�4����b:�,���L`Y�4MvW�p`�M��������
b>DAv�f�j��pH�b�����p���^PF4F���YR�yc�z�����X3@�1U�s�-�QD��"��1�JEd|�Q�KFV�F�qP�H���&3Y��X�"=P
`V��Y�������d�!�V��Yq�� �
�Gdqd�s[)E�����}�����V���S�d9�d3GtSF�+�'�
5��9��B%�`g���r����I|��3W��~r6E����V%��h?�s��.�b��N�q���G�?>�"Y����H;����rQ������Mwvo6x���Q{>��(�%�����Up=��/��,���i~s�c$z�w�[;q������JM}IY2/at3Z���"|F�	2��Q�7���{x��l3R`D�)�����}�
9��
����&��]���A,L��P�q:�����qyk?�9AP���}��)m���;��$�v-�=�m�^��A)�]�+���.�n��0]z���'<�\���lW�[0�T���0o;MS~N�a��<�Z�t����p���A�����j�����0\}�r��"��C�yZd3�������Zw��}��s�zO�;���h�����!��w?�����kv�.��/��k�t��D(p!��8.�
��~B�"�����|�Q!.�0+�c���)"��>5�1i��7,�HD P^#�	I�h`X�t���H�oo�~N�x��������]"=!�a	3���Fj������T��zi�1�Y������e�����1�����Q�p�Ss�XXcD0D�N�����*_P�	��'5������\��2�y�w,~'�����>cG�Jy\3�E�yLc�j�2�;Ma��m���Z��O�V�����\wL���%���<�����I6�A0D��$�2���S��hj�L��+�;����m2�!���~���)��y+dC���lB*�0O���\����8��4R��O	T�DH_@��e��yh���Ah�����dF����bF�<��^����0��W�b�Z�-�mr�&�M4��������~2���q�T<��������[���Mk�P��Dj����%����r��^�(`�������I�z���S������d��7��s��!�`z�����3Z���)�C2N�|
�5�{����1E��g���d&�%��Sd"(����v��h�y�*70������.g~4�0���gm�K�7���(>�a�����/���Sx�C��!�1Qn,�$���c�A^h�4;��n�������*����xr����E�M�=�6����1C_�Uf���2��o�l�H��)�&���t����l������3�b/�j�	:u.�8�Sa��$+:D�AM�n����>�L���X��w��L�[q�ybR4&<a�u"�����3�M����~�,��V��~@������*���s���hI��9�����l��Vi�������9@`�t������������Z+�RS���->��dcn�|���� ��
ogg[����?x�Q�'fI9��@������.�t{�n��r�|6|eUV&�&�K	����[����q������cx���bh��_H�w�KA�X@��@<[��H�3@6��8���C���[��������m���i�����z����D��;�	ZLi;3\a���������%oD��~��d��Y0�'��`�N2`IA��U�[��f�p-t�M?xnat�Q�	S#k���������t���wSV ��oAZ����LM)�>��_M������f�x �wH_�9f
=�	i��qK�A����0�p����d�"����0cv!]`i�P6�L
aM�A���+�i�b�8+c�`"~k8�L��,���14>	F�M����OD#��y�L���Zb[B[������:���t1���E5��u�����D�#=cB��<�]fm��.���,@��L��Y=L!�\�Y4��P��>�����N���������s�VW���h��c5�\O&"�&����7�5�/T�9qH�#3|��S���l�]�L#F����`M����kV���C���>��L����4ew>�{����J�]�1�I9^f�`�S �|���	������Y��W�Z���C���������$h�8Ba��<��A�6{������JC7��r�{������.�Zb��c"�8���HWO�����'�H$�V�����T|�J����x�4�Z$��`
G==�������q�4 ��[2�^����������$Cr��P:��
�&���B,���Jf]g��a����dE�VDe�/XlRE��
�nO+*�5NQ�Y$jfg������-�3�GARc�TV�/b(���|�-�����j������^m�'��:���Y�x����)���d�VP��`q;q�W��8�7�����E�}���fFl���tk��
���������k�Y��3��q�-�Lm��-����b��Nz>;g�����RyYp��@�����f������N3�����`�^ji������=�Q|������,���@����.�=������R���1M,�i:�m�bs��~euuEM��yc"��A��H0F �B�nr}�&�G7	��mF����@�d��������V�)�B�e���������-�S���K{Gi2���w��	Q���|��)K����
����r=�n�W�����$X������SN+�K5��^���]��~�7��*��u(��������~.�oN��TR��#��������hr�K	J1U�@��3��:���9r<���t�P��\�2
uw�o|���M���,��L�����%-h��J��a��	�yiW���9EV�|�B���5����[�`pM��zF�����T-���)���5�5�f����Ax����7>���h��\4@�P��v�
��)[��^G�o~yVH�n�j�d��ys�m>�L������p���fxc���`k�L|(���S����8��{���6~���vb.�tU�p�����5�FD�;J��*������I'��Q�d����|�����������	9�[N���"g?/����s�8�W"��E�����c��Vf������u��}t��([a��l���}J��C�w��*34bM�d�
�Xh�!��:�P���?�{�\D�3{s2��cr���x������u�b��f�@>��`�"�����`dh����uN�cmA�hio�0������K@��S���Q�E���XI��=�}Qa�[=�b����5�����8"i,�B
���I��2�;R�;�/{6O9{6Y�s��
V�)�����.��d>�,�?�G2��r]�pZ7\7I���7[
���1���dj�Q��>C��A^
�{�8��J�`2�@����s���F���E	���a]AC���Z0#������C��XJ-1����:zYt ��i��������?-*b�r�>��P/��Un%9�L��l����W^���n��Ug��{c��^��kb����DzD��O,���>�!
[��m�&�y���S���u_z;��8��	���a���N������)�PE����
�:�8��1���Rv]��7�N�|_(�$���|��������r1�!�?����*u��ZV�1W�eX����}R3�~x���O�"S���v�[�D����uNAW���K[Z*��6TV���4O^�4*�6*���Q�4��n��
eq����$/�U��L��vb�R�,�'���z�$3��gp��X}��#+������
��� -���O�yz��g�v8?f��r>��=:Gud�j��:3��DZ"�
��@���R��g�+����U�:������9o���������V�aR����B���'"������5�L�%�H��BK�4���J�<n��7}�������0%���b����8�B�9S5}aX���7+me��gcn�w��9q�5m:����P����7B'03h`_D���Dz��]�7�!��>
�1c�``��3Q���4�A�VB���m������}HT0"��z3���p��I}��B���[C��������}8��:9<m�Qq��(���Wi����Mu�zry�t`���"$*�:sM"+ku�	���>k[�����l��\n1v^������R�����+�iX�-��6�&z��L������(a��������SBIk���Ci`79��3������5[X�(:/z���U+YP�[�$uVU���]���rK�kT���J�����1g�Y>���D0R�4	?�8��L
>�C;D�����������3.�o�a��5FO�b�34BWv�+DQ�}\�1xL�6A&���V:�EE���f&�(��R[RR��z��X�Ne����P��=���cG�o����*��-��
����������5��T�j.��2�DQ��#b�����Ex����s��LMbH��c.\R���@�A�.���C�����Z#���6�s���j��X\��8%q"l�yZ�j�
��Ox��"�
/^��8)F��0d�"�\(b}d}�H�X)	@2���i���@�b��5����FD�YH��������+����qv���>����:���<8YS�z�*������_=/�+�O�i��%/��7���!������7��q'=��R���b�[���1��?f^�}�����k����a����p�$�e�K-m(�<1�U�6*�^�cT�q~5�M�d���t�7�KG-��(�:F14���6��1t���8���}	I�������\�N���2��S���Y��,��5���J�����@�� �(3�������1	M�����[*w�b\��4���Y��s<�X����t�$�n���}p�H�2M��3$�>CHr'�&��$�3�<�E��+fb����U��GT��\�:/�h��kh�|R��PQk����/Ja�|���H�����j�c����1�.���:A��3`�������';��4��I)	���10[�[��v����n�l3|��K����U�e4��N�y�;��'�i��q��}BcC"�Uf�E$W"X���nW�����-Rg�o1n3���=p���z�	�~#n�{'a`�(:+X��4��8���9O��%���>Bw0�E��WV�K�c8N>cO��E�7�X��Y�>3L�*������Ph	�St��rYL����
n�.?n�j^������������������l�H���z>rf �b��:��T��u��N��S�U��}ld�w�������l[��������E��`:v�C��|��!�*�Oar*S���*�V��q�}���1Xu�^{������y����`#&XCG���-
o��3�^�a�"��vO����N��$��!�n�R�7�_�[��0��FF��c-v�Gj�(��_�.�]�>�
������-Iw��G������Q2#�Z�����RD^<*���=A�E��c��_A����@"[�0��:L,?�����@�����E:&�����{P|..�,d�2Q�U�EC���O�De�j�X��93	���_g��r�d���6�1�,�dG�1������`}�.����
!�����>w"O�������3���-p�+�!�%�w�+�,*�����G}����E!��6);�����l��fe�;��A���W�c�����?������	����m�D���Y:c�BK��$"��`�[s�����������:�a�^�:�)�G3J�-�t[6P5`%�j�S1t�
���c��rRX���gE���]�+��%#���}�EGoH��V�����9��k7J�d���:P�&xC�`_��ee5v��J<��A���h����xn�|n���66r�"m��R�h1�>����D�$��w�Q��}5�}��;mB~rBC���D%�����Z�`=�XE��t��,^������)���f��u�F����)
��f[���s�`�����$v���[���2��70���W�������k0��'�0s���r������C��`@%2�2K���X�B/F������#6�0V�b"A���,���!@���/�x����U[�Y{.cV�������q���N�:����{RP�6��<���+���$8
QuB�95�s�`?-v����d���������WX�(�[�����
��=��W��`�<�13j��l���(�3,J�_f�r�U}��o�nR?�w+vc�����H��p�4�b(���Z{Q�;*���1�n��BvV�L$
�
[� ��`-��o��R��'h�s1J�)K��	]�VU�]���Hn������|���(6�����a�>��'S*����
&�>�%�_$>XtN�:^nf�1+��U����������x��B#�������t2d�=��}MH�s?&|������Y�6��d�4=�t���'�H�I����f!����'N�l���A�14�P�Fv�[�Z@�mX`�H)bf������e*�LyK�z����o�W?^���N�4B?�e-�ej)^�K��"�;9/3�|��bAj��!��)�U�_�
����a���^����1��*��!rPya�S�����&����-X���v�,Y�"��f��+9�R��HY��
��������:CkF��.���y��n)p�����[S'�Q���
b�r��nQ�*�������B5�=�#�^��r<"E�`
�=B��ytU����vm�&�#���N%���3q�B]mG�	��� ���M+1�!y_t��?����4�����Y���j�����W�8e��
D�"?=iD�a"W���TnV�t�n���UG���I���e_��m���}
����h� ���nF�K��?�F���J�c�9��t/)���0m��s��������`��\�_/�Wz���"�"�u��B:��_�f�&���
B(���r[������ cu(�2��f#M�������!f����L/��M@��\�p-sO�b?��Wh^�����$H�	J.�|L��7H�6���G�Z��w�������k�:|���9u�dqCE���e}:��CM49��@��|�E(1���1�R�Y</'�0��$j�c�����LS9��H��)�$�Ah0Q�^��nm!��~����y���Qfz�i�q���Mf)����Z*������~��J#I��3���9O��.���*��u�T8y�&1U��+����^=����c������0������n��`�g��R:��U����B���g�2��e.C�_}*�~��-c��yZ�����0���Fyl����|J��Er3������fv����v���h�
-��5W���f��\�`r��H@F���4 v�i�M�����T������h�m���fY�I�x��],J�3��'�F�Rg�Q=c	���`^_�cL{��y�2�
����M����w��|-sV:i��f�M���E��d3�O��pUez��f��cq��}O��-�<[[ ��N$��f�NM�X�����6�a��6f�T�P_!=�_`�^�j$�JN�9��\]��\����-���M�����${�V�������f�� ��0>�����Q�O��4�d��o��E�W!�������sx��N��;�����>^\t��Nn�J2apw���Y���l6����.�������t�e��Hh��@N�@����WANDZ�G�~v�b|�<��(i�7B����&
K�#�~��SQ����������	X�CHa����eG� a[�6�sh��X����������>���e(��zy�}
oB�n�I8����~8����@A�#��y�w_��Lp6�=��b������c1;���&H�����B��VB�l�|0w[����o�5Z���`R��;2J(��7��%t���fb���!��>��2��2
����]����o�)���/)iv���i���\�a�#��ZY��j�+�	��W�����J���QV�^c�b�W��W�Q�k��X/�\��,���(F�Vw�C��|!G"2�b�%��V�<$��E��D$U!�3��R�I�.)�E���o
�����%6I��������R����oR����F�[ �=4P���:�S�o��d�>�#V����"�����0\�%�P�y�Udja�~&��[��bpLq|��6��ZJ���\Z�Y����D:Y�e�cW��V�d�|L�<�y�k�`���U/�e�w/<�x2^��L���|�C�����&�-j3i��+���w#7.^4_0���T��$�k��O��	������G��LKQS���W�jZ6i0g��������|��+�UW����F�{��y�dN{����?���~�5x�F2�3���R�Ak��"���io7Z;JH�X�����/
���b�d��X�+_��_�&�&I:#|~{�9|��� �TC��G3�o�.����M�A
�4�A�/��1mX��$��pzr����n��������7��:��
Mc,8���T����Q+;�z�^������EgU���Jt���I�)x���P��@���E�Q����^'I��
��,�������tT%�}��j��T���������r���������x��?U�������p�����^=!
*����@�B�u�o���N���5�I�OH���,����V����i�FN
X����w�����N�����.���(���-����v��y�1`
� �n� _2�H7�r)���������K(EL+���S�<�<<9�e�^��^�omB3��B�T���S>�|�����%P{]�;	�0)�'�4c���,���e�6�����"����j��\��0l����0,�����������"�r�$��	1%�AX�^�L(�:��m��a��&��RCe�� �b-��09��F�1�r�f6�;�����(���B;�N��K��S!�e����l~��.������Q/Nb5F����zd���\����'gW���&QMj�.��n��GO��e�Zu/mj���2�5V��UjS%���?��-��|_���1�s6����~WW�<3���o��Ok;T���y������?������m��C����l��FG�,x�|)B�~���=����ox��	� ��6�O�/	e?�N�^t��]��@��g��?�U���G��6��&,yc��M�zD���N
��E��FTHf�������\}�8��(�v�]&�o�@�&U�sz9��op�pC�r��^��Nb1�s�9��%Yg�	*��R��*���*)bV@���l�dX�����JH2z��|?���V�+���*�Rv ��8����z����x,NclW�t6�3��(z�{��l`�I��Q��6QF]���� �<l�E�+,�`�mA������w�����f���B���1of�>�'}SE�#G�����Tk���Z!��~K���vIzI���.�(�%@
��(b�h��jE�[r�<L��G(����Sb���H[@���Fe��-�|.FD�Y�=�c�<1�5��cF��]W��CO�����;Pj�:���s���z�:�%�b{/���&����������|�w��O�0��Y����O�!xC�aqVJ�����I��*[/	t�,�_<>t
R\�+:����5�V���V{sk?n6��v7��j�5_�(��K����&��������3C����j����d}8���Z����!*�����vO�����iW��������&o���(������������k�[�_G-2l���"���p��,��N��&��v�=�\��(i����B��dg���<�b'<�t��G�9���Y26^��o�N����g8�Y2����W�g��:��M ���1Hk�o��C��l�� ����x��x���{B�:��96��%��H)~�r4��2�O}��
�|��e/�Wbqs�����������f����,����l��r�Kv��K��y�����<t������F���=C6����i0)�O�/���`�W�N'�n{��CAn�Rl�\wu�T�v����Z�`3�!��K�������[Y����d'4�;��ps���S���K%�3>�'r��|��Kx�����~&��|q��
f���4���o)�Z�l��Jds��p�:������dtT����V8!�!-����+�,'����
���z�c�5<otq��d���� p"%I���wZ_��c�D4D:�����������C�S�M�SY��F�VC�p��v2�n���I"�ti�*�9��x:
}l��<���3k),�nq������*]���
�(�"O�i�������9N~�������s���p����7[��e�kb�9u��������tL�8us������:fEp�<�^,�"E�>����dj��A:m��5�
W�V���s�t��ou�b�Jj����~���|���7`��a���	y��V�����a�����}��E.�CR�v������7m�@�X�KY��i��������D��y0!&E�G����B�KO�����s_��F�rog�\�w��5XZ�0M�k����K��F�&��Q!1M>7Wm��gH��t�o�}-�Ku����F��z�>���	g��������f��������N��O����d��k)�Ao�K	q�$���{xwgh��G���y}���Lr��x�w%~EZ[������h��x=������8�T_��~xm�>���d���?���p���t4�&cg��?���?|�D�3���y����\��5��N�q��4Z[p�j5�6�x�%k���(��X������v�r��Ib]�e<>��J�����h��"�������]�~^�Y����J�5_�k�����5�����U��p��|���`M0�#+�^G��1b�YG�����b���6f����R�*u�<�p��43�}�hFY_E�V$��1�_�en6f����[d@b��xf���\�5�uD
��fJ��F��������~�9��F�hL�����s�6^���L9�:|7������0�����ER~-9�^��u�,�G��y,���	�.�Il{�E����W�/�"���|Q>z�� ���/���WT����(��qv#$	�3��F>�7�����c������L�}mN=st;���Q~p)�87w���d~W[#�d��_$�Tg2bC@n2=ybk	���b+x�WL�z����Fi��=��Y�t%^G#��5o��U�]�.�m��e���N��;�b/?������j����\[�e\[�mx�$})�����5�k�Q����[kw[�s{���&)=|�]k�uDy�dg��������$K�:�d�z��.�^ds5�U��:c���A���0M73��w�W	�Fr,w���vk{��ny3�d�����f���������*
N�$z���+�/���^;w�:n����)������&��0����Br���@�I�zIS��Q�����������������W���_�h���"���F0O���3���nO���XV�KS��gWf=kk������>�5"��#��IS=%���M�W����^OW4PX�%�d�j:qjo�JX:�Y�!7�^?����TE}Go��_p����^A_G�����>��y%!���a�p���P�]�
F��l�!g�����=D
����������jz�3�'�8�&`�Mx]X(	��e�=�N��������h�r	%��"����iF�&L���v���v���@��0�G���o���lt�B�J?:�gY�EMU��F�.
��l|�?
5��ftc�e����$(�VwL3���s+�t���!�k�����$e���	���D��X]����e*���#�J�����<8�����T����(*��J1��A��j�SF��+y����I�&�:�m~�������[�E]T��D������~��1�9a:1K�fxb?t�.!c�����e6U���1J�D>��]M������3[P{��>3�������+Nh���\��k�4�#�Jv�������5�\�]W;�����B�����G�phW[�/"�?�4�5�o����%�-Ra$���dm������7��C���N���U���-5n����.�[���%��[/�S�=���5L��m'S��p�=h�����;B�G|�R���I�Z(�m7���CA)w��m��3qf��rD��,e����(������j6�������dGy��h1�{%<��M2u���0�A���������7�o��C��T���s����.���P���k�;VH��-�$���w����g�n���t#�H�
s�L
7jH��L���v�w����M�EQ��ig�@�����cB
)3>���e��x~����%�`d����l�aN�����QQ#4�0{~`X��W�N��
"����j��Q��}����w�MCL�]�4�|�$,���}��I���_h�PW}<8��>��|5�p
QO��c~�[��?�h��W�����B�W�G�V�+���~D���S��Q0�,�(�����3
K��t!���z]�{�G���M7@t���p^�lu������A>q���
9���jx�v����g]6S� ���v����cL����`�4��Cz��'���O)!$����,.bkj�@��@>�d���<�J
)�����~a���9.I4~E$���o�2cK�������%���];*z�o�kQf��n	u������|��[zk�Cx(��>{w�}�e"D��$���\fx
~��)���A�S�"���"��|(��J|�>�|gQ�g��"�x�_JA�2p���(�#>�3�)Y�DX�88HE2H�p?d���h����"��<?D�p/�9G�LD�R��e��<�(Sr1��"���t2b��5��fAc����$uO��E�T�����GPA����$�
��J��� ����	�86H@|l�8�^�����m#��0@�4���D���CN��8��f`���B���B���9����P?\�+������	V"POj<h����a�����W��5?����q���&�H��s��~8������f��P�����u�������������){o�E(ah}xm�Kf�F�!�U��C3�����xw�3H>�K�.������C���jc���+j�����'��.F8��W�
��]i-�K<��,+�t����'T#A��m-7;�YY|��Xw�����Z�`&
F��)�/���=�1��B7j�
D
z��53L�I'S:~�v����)����#��6���g
�F����6"�K%��� �_g���������F4���>}�7�&��eq#jO�����_5�g�J�M��2�c|k�Kc���vx2�k���b�z�y�;�����S��G���������C^�B�S|aNhs�x��N\��}��E5���X����R��[{u�oC/�!��._���\�V��{���������4A���!@��@��HO�5e���AOsl9���EH�"��m�LL����TR�p5/*��r���n��B��)��($���/ ���wF����z�#0K���4Z��t�����*J����%J76,�m/���>_����n�����$�sfg*s��e�����_y�t��!:}A>O5����O���e�q��O89���d�f]���{<+����9���������T%���������c�2��"�b��Os!����x��6�F�}���I���*%kd�v�M�����PC���;���Z�n�<�������E�e��������mw..�/�|WK�S������q���sx����=;��^~������s\whv�]���,o��%�������*S�E�������q���&�5?����_�`�f����
�Pk~G����0���d���k���n+�O�L����m��E�&s���kE�hr-KEvl�
<I��CZs��l&{bTjdl�V�*�#�* ���"���	�K�Q��?T���Ao��
z�������
��]���!��*n1�4�!�g�H��!<������v\���i@:���h�������Q{�.`<�\J��s�|BoM��V��j���%H�`;z��\'\/�'���<��P�O����oE�0|M������{u�s�����Y�BB?���`S����af�*�k �UJ����My8����!��4+�v�Dr�H�9��|����
'zS=���P�FfUXw��YS��M6��`1e���\�s�B���`-��n�F�DO���lPT�^�
	`J�����J��!1��,�~����?��@����##={"�'������YKS�D~������:�hb����
���.���)������{����FM-@������]��[QL+��?�Y�,*,!��7��������pl���J
�+���q��
���8�3n������>��������_��H����B���W�Xh<.�$�y�0�^��N9s�9H$)	n�������,]p����������[���Z�}���=�,�e3��,I��I��4D�F������q�����'S�`P���(x�N
;���e��6s����I��\1��ENZq	m66P^m����������o+I��y����Q��pe��i������T8J-��O*N���I����:��a�(u��]69L�7�vg6�������;�$�;��A=���t�&�D�%[p������^�+N���bO���O��y�@k�tDyekJ3�X�(d)Q��og�6�;Sw��V������U�M���j�w$��SM���x�����\}N�%'����	?��5�X)$�`��bw������nvG:5�A=�+_�\���i�
�l���+R-!2$g��3��L��l#���3�����?���eD�)��`����# ^��&�q/����������~��q�f4����V�T��n��>$�sS��77�a����o���d����B�Vj|PW� imf����T�B��h��y�Y�$�M�lA�����{FT�gd�5mz��<m{���Q�,���6�����-1x�W(��M���O������^�'#h�z�(�&y�;���}����ho�0�������
��Cs���:��?��C�O��Kl�s�o�u�U�
��uY��
����sX(��x-�t���HR�R�>��J?�#TX=Z����aC5)�P��*E���;�O�P�0%��� D�k�#$3o���w�L����J������<�w��(B���@1*�U����s��q��xvS��h������K$i��o���*
��+B��L���E>�X�J�;ITI�O��������DZ���1�U^wUT^-R���UT_yy�<���r��-&���m_om��$���[L�-j�
�����F�"
e����7L��[A�����Z9E�c�����K}��L-���HpZ��%�(���9�H���`AJ:��/&G�i���3��E�M�a����*u>�����C��4�v�Bjj?��P�(!������*��X��s:bci�=oD2����l���@1-�-R�;x�pnTi��I9�+XA�Z9GR����!��4dVy�	����eJ��I��y)�������9�W,�J$UxC,q��{���@�����8B<�����G��s��6���E�]��l�x���+�E��H\B���%J���c��9tD��b��G����YE����:�9��g��6�VSx*�O�bW6Op-�Q�f�������=�aC�`ts��	x��-
�`�a)�������5��;���~k� �\;�(r%bA3� �G#(Q��AX�������^����EIJb��{4�$������HZ����������"��x�p2�H���m�4�j��*�DI����U�����r�U���`L����C�E�.>�AA!�qws{������VyAS�P��0�
Qv���\��)STp�6G���B`�7kFT�U� &���X)��F�/���H�����=D�^����J1��Ag0<6g��$��y��;{��0�k\u�%.��P"jgF���N|F	]q�Y�
���^ckW/�������ZY�������3H�Z����ET�:�krAA� ������<��o�:9f��.�����O��E%�%���k�5�6��,�$)���v$D|�������z����:��%YC���4L�.q����Q�*�`��H	LJ35n���1��a��$�WNY����GvuN�K����������BR��Ix�#;Ms��G���C�9DR�Nt��4����&�eGS�T\��3�*��9�9�CT�n`�����3i�}'�R�����~��2����U��kN������}H��oON?^t�S����x�;�,��%����&Fn2M�5(n�c�>b��5<�}/���"T���u������cda��-����eDC6u�l���:��P1����"b�e��}�����?�;�o>����k�e�,�1�Gk3/+U����W�b��By�640��p��C���S��
��W�#.��!;	_>��%�;�oDn9���j�Dxv����6����lHX��]�@�
��U]��TL������r�*%���w-����=�;�
�j���,��#���$���~���JtU��,�s��x�`�����	ecmnlVk7{0"������<����(�D��;�0����v�`���UB����h���zv�����z�*/����s����=�>o�������$���1v�e������i��'V1�H�Q�_e'��[��;.�J�f][�
[M��Nf��>>�n����5����<d�.S��?@ri���TS��~J$��B�����R�������nb���lm�+���[�kIK%��T`l�1��Kj3�{z�@��#fA��<�;��`����	$=&|��!�N$�e���%��<��}�����I���I{p���$���Sr��nP�j$5���?��g�"j���AP��<c\��
&�~�4n�Nl�N+E�2[�6��9Ey,���
gI*xKq��w��s������'�|�
tQa(�R�@�s����V	!������Pz~Ns/�'4������Jb��yx�s
_���4������ge4����~�� �3��mW���p
�L�N�e�Vq"�K)����lj���k�/Z�NM�f�����Q�
sbR?����]!�\�];c�j��i�����D1�q���Y���Z?��o=���P+`zhM��[2�[�I�����S#>�{�+h�]���T]Pg+�6by)�� �3u���'�
��}�����fT7D/mZ_S�����$�kjv�dl���]�y_e?.�h�IL��.���|�@�XFV1cA��F ��r4�����t���F��TK��Fn8��v���?��9"��/X
��N�V�o�	��cAr���P"O���T��#�i�(�����19�vYZ���r�B��8����;��-x���]�4@T�/8�n��j�w���M��SE���l2K^�6Y��#%�7sR����+��UE�Iv�= ��A���YNx	:��J���b����1������+�#S���j9g��(l���kP�"%P(���y��rI��e
��FE�
���M���Xo����<��Vt��v��w��FO����H�|<��X�cDA\B�^���`T����������h�<ca���{���j�@R2���!P����'�
Wp���"�������uJ�*U���Ri������������p���z�h�����!3�0T
v"��#b�Q_yH�xI�����/Q5\�|�Sw��������gD<�-�Zxp��8�j���D��,�O�K�0���~3��jvx���#&'��Qt�c8_
N!Y�\�j�NY�/�4$3U������e<�m�)�N�XI�Y%U���7�5���E�6�0V���E�����	iR����E��N��R�4��y����+�9� �M�
��Q�V��Y"=d�Pjc&�u��lQ����XG���r*/������|�B�(�(s�~O���3���AE63��������QD!$
��A[7�d]#���-2U����m(��6�6y�3��g,���>�������0�����M���F�5��-'4��X��{A�����J�M�CC����Y��h�f>$��W��<����|�Q8��e+���4�^�d�V9-#�>n�i�))6{��X�	�I�b�4I���gsUpW����WUL�PQ����?������C��X�b�dU��OhV�3?R2b�1"���F23Y�V����Fh6���(5��,�4gB��n����g��gG6����HO����#{�S�������<���k���>~x�����3��P��G����T:E�.AD�����dD�H�.��"��v
:�q����?��Zodn(�������i��If���b���4�������b�+~�kG]�(��Y8�Q�%eM��q���[m������*��#T��l�{M�
4@T���"�
�Q��/c~�@&�r
!�~��/�cr�Z�����B�W�Y3=Y�R�gw�;u*��G�oR2��G���Yc����W�nh�&f����b;%���>L`���)����Nf���7��_N7���[���6e��'Dl�_N����w�*��0���B����Kr��%�oP_9L�,P�f�F2�o�����/iR�'�Rw
�x�"�����d;d�F�<���W��������p���*�_F<���;Y�������W's�Pn��)c"��"�|<��sA���Ho�jb�p��xE��[Vm5�Jx����a5-pg�6�I,%���*7��+�9p28��X)<�Yg~1��]2��m:�����u�R����$�/�O�OO�~��xr~J�K��H��*:�}�S���������X7O�n.h"��8Q� �M��r{�l�f!kO��e�b����j�$*\&���Yb�� u7��  MY�#�������(�0�&z��W���4�].+����mLA��Ww����f��������z-Z���/�m�<79<D���j��;�����-&;y��������Y�R����	\g����������i����1��9���4e��r\�x����8y��s�9���~�=����]g����u������-&����PF�o�9k��Y��9����Xr��4��C�z���
�.��g�����l
�����9)mF����tq$k��]��0���B!�S�5�
���m1��
��]��ylzl���-vE��i�	�*��8AF�*����merxA�d���=�6Lh>�$0��������g��8�"-*B!4����2�����/fI2��r�����3�:������-K�&�.��6�������}���M�m<���6�9�X��uW`c=d:J�c���7�
:U�6�2�
]d���C�[C�����C��1�����c�\KQ������|w�7��)b� ���y�m+h�Oc��`���s�{�M��)������(����6�z�o8��ZX�h�6.:��f���?���G��Hf��X�2�t[�Q����2��K-��\pi��*����81�@ZB�����5��:�"t���kcqZ����@���hL)�������g�"��P6#l��e�)fI8���LX?T.q�<�V�X���bs��T���1�rz�������9�]�x��tBVpYIn����������d'��7��I��~��Z�+��������������2��N��H.0!�g��g�i��m��R��8���i
��SN����]�t5D8:��K��)�hu����p��f���1��q0�����8s2�7���`r�k����?y6���h3���r���41OI��f�������!�Y�@�Z���g�I<]�~������V�O����3����3�ENF��a��j^�o*��o�k#�~�/������"�+��>h8�h8�C��_�*9 G��&���0F�Z��z����{|����GV��I�a5x,�`��>d�D�.����l>�aV�N0��6M����BTEO�g����B��� r��P,]l%V�wvH>Gc�����M5�.H���B��{���n�@�2����?�^M���F�i{���Q%�c>�����������;�Gm�{q\���������	9�!����������C�F_����aF���aU��N� ���S
���z��V��(1>�4�4�Yy�D`&%�uvc�v>���k���6^�a���[�������Dp&{��L�(:��|��`��.������}��l�	B��\X�+��v����1�f.c�P�y��?�J�1���a?��	�1X�����u����9X���
�[<��:�@���a���f{$�`:����X7�,@���Xh����7����D�2P��T]`��6�.����/&SQ���s[M�MO?O���r=��d
s#�)g7�,qbl��'n�#��cE�%�?FuL����0��bO��p(%�� �D�f&��b��,�/�f�����&���B�E��\�<��i�V���-x����;�i5D3JZ]=�~8�G4�0d�]	G'���:�#�;!��������]��`�W�b'�H�YDM(��?��K�oR��"2�Y�t�XU7t^^�#�����eQK>O���zL>E��}\���e�����Z�B�5�=�Q�����������a
�w�� �H=��79�������P����~E_���!_�G���������
����D�w������6H��_���7���~���>��E��3���%G�����h���<��-7��_?����y>�/���/.5���
�T����h�3;9�WN�Py������iWV�uB��'����|G&��R�����4tw�*r�V�%
h�A��(��(9�e6���#�!��mJ�o�����J����g����&�X���sN��>�<��U�go 8����OK|d��;*�8���^�������Q�d4PFN��e�c������;�U,�������N�����������������#W8x����K�k?��( W�<����6�9<��9���vs�"���J3�e�z��<�����NI�2��j�\�����0��"�Bi���o�N2�������
;�r�*3$�����!*AMb���0�?������w~�~���������'��^mo��x�v6[��W/��J1����$�>�p.�y�p��N�0�������	!�:k��TV�
�f|����%�T\H�{�����[	��������V�WR�p~V8q�=9]�	��������H��|G����}�o�XB���Z6���K-�hk�EW��a}���&Z)�H�"�B#Xm|?�y��Z�4�����f�����~��XW$aV�9Z���b���W�(<*ImE6���52�
��2�Y�
��F.k�������$N�px�F������]�=X��w�oG�W�N�m�S5�� t���|���f������U����S�D�m����8��j�����<}����
r��&K�cI�b��6\�T8,6�vcQ^�D2c4U��N�86�*���ia�\DM$������@C����c��Y�i�#����������?Sy������)�X���8?=yV���j��z�.� ����Jg��.���/7������T�bj���������~~'���G�s�o(~{�2H@����P9�t���h��/y5�;�,�x��c����uO���,r[p��S2�YG����X�E��n�����`�7�p[�	�;�3kf�L������3Bu�����p�r2�p��2�Rk�QL�zU�n
e:�����������Fji��8AbZ�nc�^�V���x:J�����0�
A�:�W����0fs�����.��>��pd��\�������@��x,���`��	��+a���c�sK��QI[\0��KHGH�c��y�e#
��v����D[���dX4�|���y
�a`�|LYz��B�;q8�aI���D<�x��3f�S�����&�;�3��a�O�s�+z��_��ma��Z"����W�BDlH�r9����\��s>E�lR-i�g~r�6�����,��Ngb�������m��u���t�s���H��I]+;������H�D�m!eG�}.�	�19��+N����������g�w�d������m�v��L�-QL�en���}�Q�?�dV��s1G�~6#2��tN����b1��T������"_����R�w��&wE�"����U!?�pX��sN�'�����e���pp���#Z������{�]��h����h��L�{��[��8��Z*\��|��h��uj8|,����("3�J>f(������U��"��a������tJ�^������X�� ������s{;���3���O��NP��,��3�E���������`,��^}R��4IJ�
�Rc�,�C;'��Q���9�����%������B����Mu���h�0�o��J+�U��^�ng2��A���'��#�*/5����C`����������H��Z���%�:��G��<H����c��U������}�~��!T1����F���R��^C9�!���>h,8(e����b��8�Ma�����s���������V���;�]�AUwgP��T�7�L�D	�Q�w�7�������.�HC�Du(�+.��FZ)��B�2JQ(T$�"z��X9���B-h��������hH�]��<:���+���,�'��Fds�M�������w�L,d)�L�1��(��R|�m5����E�6�/�f^�K,��C iJ�qE:���od�7=����]]�\x����Dv�Vk���[J0����?{������Vz_F��[Z���t���{���o\�{�����`o��l�6��;�����*���aYuo�-�{�&ft��eU�1G��b�J���`�A�S����uw?aU�V�g����W8�t�P,�5M����-�CL�@�_�>}J�5�-�i�3�xYR��]�V6����
��^hh�oH�{~^��E5�]�.�Em,Fp�,��V���A"H���]��xkp;7�rRX8|�'����IQ�#1h�*�+�P���z�
�J�4�KS�����)ZY�-D��[���)������V��sO�hii����<�����]�J��&���qM���./����(�3��,����K[p�O�|,��=�u<b��V{�������2�	�R �%2����rRR�QS�T��c4\B���3\$�����rO������w���_�O���q���4��u�}����g�H�Zs�������f������1��k��{���N�"e~��h��j������(�M�),�����8���E=,:9�����qj���=,���}|���
���+s~r\��-|�R[2��B�P�L#�> 9���wK�2|�"��X9��_x�����_=�JKV`��x^�����B�@x��"�x�a���i��o�o6�I2lm;�~U��/���m����x�:|;���� �2�
��KwA�Pn��e�@�����/��|����_n�%�K2}o��t���mPUL�f[����v����z�V�������(k�w�-h��O�E��61��b��R�T
�rbG�xH�k��n�W]�� K	�'��!�a[E�/�4[����|��Q��t&Q?��@�w����������"������X���E��*���(��0�t�@�
�4#�<��A�2B���=1�4J\c�����9�C�i�v�(#��N��4�K0n���p>zq`���FE3���%���e��%�2�J�:�oM�h�q&����Bl������'��G(���9�$��"��K�������E �n+�EM5�6<7�<0�.`��Y����t@�F��P���jT�g8�����MRS��H����:����.������] |i����n�`@����>�_������*�|�� ��:���!5�T������j�/�YG���~���Z����R���B�S(�f��x��O�`��z%$��-�P�$��e���,��8J�p5�$,\��5lC>�&���nr������N�,]�PD���].;W-���} 9���o��^�5��"$�8.�;� &��6������[�\��x���U��zuo�(��b����?��O'��(���DF��SY\BY��)��X��#�:��9����\?^�_L�������D3�?�
��A�u9g����1�`�	E0���`��l����s�4Ep
=J\Q�A�G�<� D���RLw����g�����gC%��|�mf���_��;�g�i�g�D���*p.�{wr1I\�\����7FL[�!M��&���M����, ��`��ns�����dH��3N���������$rz���9c������/8�$cn�w��&���(p��.�Y[���A(WD�("������.W�K�bHJF�J6�_o���-0�O�7��B8<%���^LVD�6��N����
MC����1sU1YY4�|=)#q/+B�k|���4��B���^
�����f��J)^�w�������j�Sz��E��o�R�V/��<�h��Q��[�j2���������q���
�J�M�:�V?H�b��4��=W�����1kGo(�.W_T��U�78G�a�X|��E�����
(6�#�+	B���`�K���5����z��'������
�����E\�	/8B�a�khGC�jd����4����mD6�Q�I�X����lM`#Q��o���|��{oy�}�3!()r(��8ApL��kdO���gSs{b&�t`�D$��?�H���$����)]��l������C���_�������u2f��822��a���4�8�u�OC�0_�Y$�
�$�9p��ht3��3M6"M��uA�R's�-�?�
�Ai��n��������Q��������Ga}�_<	�6�`N�'���]PXC\���&��	d{\L^(��L%�� )O3M����o=��n��2��b�3c�"�~$��0QN��;t6�����h� C��r�K�.v,������"	 �,.��xy�V�F%�}���#���f �,���\$H�A�XhSr�{V!�W#���P�MQ��c3U��	�������������+��
���K��%����"�����Vc+Z��o���f#��r�&K��� ����H�%���t��A�����p<�4��^i�&3��n���J�t6A��:R�q�(������HV������,���50$�5(�������MS\���ZS	��^OJna���q<��S���\��M�5�F.�^�B�P#1�H��-%:�����p�)��9�c����OV��5�I����E����T�
A"L���sH

���@�o���5#U�E)d*MgS�F��^]�^���cU�a���""�~����=�YZ�GRdo�����cs�q<"��>�pD��"%���$�������K��pb����eq��sk3T��n�^t��g�pCKOw��4s�,(}�j��d8K4�qO��f�y��C�|{xt��o�fl���&�Q�sp$)_���M?��{��� �/�O���"�}���,�)��������+���%
�8��S�MX��I����~���>�����&��T�I��;oHm��	�v��f�/a�c,i�'X3
~�HM^[:9i�����}5a���
uB 1�2��S��bt��c��~��4�i��Z^#�t��+�(U�'f������*��
AJC����y
#Ht��S#�D�1UT�|0m��hp�yT�2K�oJ�F�~w�aX0/���/�^���'g��.zx,����������S����s�S�<�%���k��@����o3��)r,��2s��u	�1����/�b���O����n=��Z+�u(���
L������C�1wN����vL���B��1�(�
u������C0����F}��Pp�6��\��!5�G#J	a��O!��t�����4���]�5���,��9��:2Y��������NTn����4pZ�u��^�!���u��5�t�k���t��"p0��fc�h�����o�>�8��p�l#�k1�q@�+��j�'0
�v�����Ue��*�Rf���9�����ag'��zt��������gZ[=�-mv]^>bH���Ro'�{#N�;��p�
��r�PP��l�7��$y�;����
��Y�;-��k^��s	�[R�������U������u���4���K�~t�%�D�*
C�y��7�3Zu��tC����4P����
g�Yh7���V���w���f��?l�&<�+z�V��RJ�}������>����P���c���H�CS��Jz�+KLg"��r<�-(�IoR��������N]IK/��"+Vi�RZ�W8�3���@��-k+_�N�(?_�Ro�C��X~��{���s5<���������V�n/�����v^a���b�N�����c���Il��Ig��,<��@3�wE0�����5�e]�wzf����X<�����2s,K�z.�~�Y:�92�a�����`��2���V����^�mW�����e�m��&��j�O��:��\-��j��U�7F�K��y�^������dp�E�r/���7��a��!�X{11�-�O[d
�r�)�����G����p���k(@���$y�gx����@���Yr�Y�����A`�d�0a�Y��j�����NO,"�(I)[�\_���<����L��c)�<��:S���)2��Rj<�4���w�E'?���f�T�_P_�<_�{�u�{�&�R1c�HY���N?A�u����%(����[{��A�[�5
'b�NQ�rC/��&������6y�������8lX�$@- iu�
���S��-0g.��8��6p���'������G���:������R���9��TE�oA�`��������.i%kQ+�F6w2���N�A59~`�.��<\�m-I���������c*?r���Cl���dl��S�������L��g�Co&���fg��(��\5���TM�/�pXkr�%������>%E��~��.�iP�[_KZ�m�����u����L����c-��H����4�r�[��<8;����V�����+?1}5����$�FE��+��(���'AF�<}�4�<0���'
�cJ���b#RE��8�����3���=�`��>�������IK�L�x�PO��{�*a�U��u��9�:?y�>������X���)S
�$�����^�I{O��Z�T��Di=�)��9�u�f��D�R���W��>�|hH�+ ���[~���i>��W�.������x"�JBZ��,U���j�������e�|�L#f�2d'�-<#�8w��"M�Ne��=�[�
7U���0Q� ���gl��6q9�x/������f��	_�Q 
������G��#��������lAEc�j�����.
W�u�H����r����j'�6�d�5�g�T�:3��%3���KM�j��������2Z��R�Gi*�B&���OO��G����u/:o;��#���ARnRr�h*��6��!�����^
����t��LF�~��y��)��t���,Sn�����w���Rw��C�-t�]2;�����G2��ndaI$s�T� ����������*�e�������Q�{K<�*[QE ���w��b���tnz�����5��x�������J�.C�����WP#V�������Y[�#��)!4����\�g�9$�{������1��D�TiG��1��&w%�9��0�2�.'[%S\!o��FZ�y�9���=�&S9�R��4�o�x`����lB0�����5R]B@Dh]T����.i#���w~�,�zo�����&�"U�p�LR�T�i&'����?��?�~���II��V�������[���Lb>���������d�V�r1�c��J~����HH�jv�H��ft�XK����4m/p��@t��Ny��+��s��y��B�)��V���pe�����'3�~b�[���3�������J��d��Y
aI��,"�a��WMUD3����#���Y{�e/|��%$!m��1�&����6e�������z�GGU?%M���o���wh��
I}p�`x��Z����]�RFpr�P������;�����7�a�#�sDs�O�b����������$c��]2�tL�[��o��|��gu��x+�hL����q,��2�H��~�LLJ�1sr��
�{i���p���_c��nM���0��D|dN��@O��;�s<��[����S��@��G�OER�c�k�y������EV*��G_����w����U1�r���WN_x�R^���F'����l�QTs��(�9����y��` ��7�U�j�Jx���S���r�G��}�E���f���#���
����
N|�{�6U���P�����j���G�L/6_<�A���I�����dL�;��i�p)j�>k0#pO� �E�����k�����N�r0��o&R�K�u!7@���QG<���B����MgL}����v=7�u���<�/�����'�2%)]9���b����'/��( !O����Lsm��u��*����*�����s,�}
ov��9+�"�@���eKz�4�����(�`����8�����M��h�����*R"��FW7�
�,����# ����4�|��6��'��Q���$���sB�4��N�+������'h�G#�#W����C��&3[��F�Z��v�������h���Y�P�5�-����:�U�1e%�L��I/�{��C�Vg���~����X�`[�/���o5����w]~�JK�J�g��X5W%F����v\��V��6�u�J�E�H?zg���i:��?�)��+��Of�&��	�/�����Y1�[��ig�C,-�u�Tf�����{��xD�h�������ws��o�#;���|��<`������������	 �� ���V`12�a�������N6���A��PW�:�+&R����^{i���i�e��s��*����2|b��cC]e����E���C��5R����mn�����.�O|���j����������v��(�n��I�H(Q+�yf�k��-���Y!"jv��<�}1���D����V�9a|C@�_v3��G�~"���J����7�W������@��Py���4�g��R���S��(����Yc5������x��k�z��D����$�,
1�
�hD��sOko{^�{;����5��f����}�i�]@w_`�4�������<�%���n����u� �t�b� �Pi�zA
9q�?4��`o'��X���S
^�mN��������b����;�������Y��)h|Y
*A��ybx+fS��o����ix�`=��K���s[����	V��l��P_P��\�C��=x3�-=i�M��(��R1lJ^��4��<������+
�6W������p�:<�]6K�&G���!���o�~5%���7���R�Ls/�|U3q��Z��&6�Ei<E��iq�dt"�N,�
��E���v��2��	�����;jz���_8 de�����lf9
��>�Y	q����&_����#0��C�1�F�����4"�B�L5;O���zL��������_&�k�.���(�,�-�Xc��c���]�����2��CR<��nah���u�q�"CPf�?�)T���mF�(��k������x�kI�
�S��x�<�6Y�p��L��oR�]Lo4q�������xK�`
/�"K���o�D|�]�K-��as;�Yk,���A�x����tg.�Gw�%]�9��V���~�9�����Z11��/9����������t�\'Y0=��r\vw������&>����H-���-%db�"�AM�h����8���R��B���&7�r��	���x�	g����Dz��p�Yg��}��&!#r��9�i��[���������zf�0��tZZ�T��!$-z�9���
X�Q�Rw�/9s�l��9�%/�&���u44]��[��0H�~�s�o����IN�P����P �?O=�:�i^;�C������y�/�GJ+s�
af�Rl�9&��u�f��J��	.����DU
����T�z�	��\��:�!j{�����_�X��7��j��i|�|(�O�;�/��7��f��s����*��v��[�3�3c}�v&���)����ir�����AYO�b�=d��������
W����tK���x6���c��L��Ux�=�	�5��F��a��H�f'�a�"���^�����3a��F��v.�����d�X�����?l2����__O����g��R���]�9��������"�x�����@x�GjF�J*�W��O�A`�t�����7~�=p+��,&;_R3�����Z��k;M'#�
\��E����O��M��A��m�b74�F�/��7�x�����!U`��g!l���������O_��_�L~9�����E^�����0����u]^a��u����C�U��%3���i��,�f�/]�p�"�����o���x&D73�[���69���?�����\���KS5��"w	z]���9 �}/�'���0��U���?��)���)l�(��$C���?��j���-�����;;r�������������sl~\w�'=����?W�������O���E�0�]u."��������`����O�L�������eO?^R����������)����	�p<0?����>���_N�M�_�����������$C���x����QE~���8���_/���+S�3���}���?v..�\|@��
r�Z]_��,��v�Z����f"/�1��?F�^�]��#u��qq~���4K����zu�����W��?�'/�z/.�����N;�K��;{�0�`z���������?�z�C��V���O��?ik�e=96=����:y�NO���N�6:>!���H1���}0�t��7��_�/f�����/i��@gf������mk���;����]�O<8�:1��g����YG�9����D��#���KS���j���+3;������\P��]B���~<<�/�����lf��|�L��q���![w�������"I�<����=����mz�����s�S�s�?�er���A��5��dh����=���R�1���w�l6L������3���jb�=E����=~���.�&��6�RI�4\�)"q0����F������x���/R����cV�=;d�A'��/p������C�d�^Kv�m�]���8PA{�~q[�����'^��)���@����Wb
��-������{��F���W-��SI�R������;���`a�`������fck�Qi�������eP-Z]�M�D�o����
�:������,�R�Or�An��<�L�{���&����4%�/�����o���I�?zD6��zL��%�d�H�����|4���-*N��`����j�B��Y�����?�_E��������~�p�x�9s������}$
�rB��.�^����6E�;���(O�R��IR#	�D�@�w�K3��sEB��R����O��:������<3�.�8�6�F�?�
f�	aMvP�u�����S!����IT�i=J4�o�������+��.{�-{�b����{�5|��?�����hmm�p�������0����l��O���d:x)_.������o�����D���=�,�}���t�������h����?����H�2����/���k�+���2�aS���*�Z��������A�������_�sU�D�n�/�:5���n����������#��������p���}���fQ���n���]�n�
�����T����)G������nm-�^FC��8�r�e�U������3�f���=����������1�J�%;���w�vr��nR9��H���x�d~��d���<�d������\�1[|����wfn������������G����i���#�t��D�b���#x���������n�b�c�,�|�v������/�����w�@QE�#����
4���3GY?i�,�����/��\��S�e�b,<�b
�F�����������>���������!D����;t���f5X������Ccy��n=����z�#$s�qL�������n���Fk�-���B�WT�y^���q��.��{�n9n�E���%NhA��EQ�`BV���.U�K�C���u���cbP$P@�`���?i�.�OK�(��88��H\f��7��l��`�h"n���$���d?��}#���������O�EKVS-����gQ��wV'�lC���s>,:��
���f���r��P�%m���D�:85stF�i2�1rc��3��\�A���</�a���8>�i�>]�D���I-Y������P��^>�����^�{v~�����s�����K�(���Z>�������s��k6�a�f��l�b�nT/ X=�oP��wNY:���C`�Bq�f�}F?�m��X�\��F�-��$����e����'e���'2�i��z��[��I��R���uA��C�.�l�0����v��K���qU<�����f%D�gt~q����`+���G��[R���V�������
�����\�J�������)o!"�Z�2/��M�y��To0���C���B���cq�!�����5��g��y7��BY+�U+�����tz�sv7��c}�����/�G�MP�P6�G��o�D��V�������/�������"\�?�,�9~dgCv)��5���Tpo*��?d*� s����jfL2&[�L�G��\$C"&%^�����m<,F�QB��,���������/A������X	B�q\:���������}��c���>$����}$�p6�d{��u_�)n��I�*���\��m�.#;�&��]�D,��c*��zq;��J�i������A>�������#Q�<dj��j�ve���f�ME!m�L���,R����d����[����6Q�U���3�m=�0g	�MK!d�|��+�n6����H`I�/R}������Mc�"w�>��8��n)
���n�I���+�X���7f]Kq����L���k��q�X�[�/}��5lf7�t��.��{Q'��
�l/��>������$������>$3��0���W�H���Ot46��7�y@A�U����YU����%	
��8���������I���
5�,��F;M�&O��x�p����������K�<���82��O�?'Y�n���z�Q�� MH��r�����}�M��t����.� a��L�y�q�9tJ�$��r�!zj����>=mx{�����;�p�a���9��.�m/��_
D����\�+ ��v4	�+������';�VP��W��"A�L����YE���������q��E�����&��{�����3��Ib,�(vH	��^B�4u���y���M+�#r1���j�j9��������Z�x(���E�
1��o��b��eu[��-T�8��8�����|��n�2
�bLYA*gC��G�����-yJ����[���$��&	{�>Th	�)�����a�0b���9�zk��y�1����R��<����[l��j����x��l��w{q|���C�x��!������b�
`rQP��(�wd~��wYEz"y�Z��v}���J��\t���Lv�+_UL�?Nv���Y����^�`4SeC�=PY���d���d���b-��#.H��V�d4�5V$��������	��<D�}�s����������+�/�����������F{�FN��=GRL�&�lI������O�����a9��D�Q8��[�{��I��i�����|�y_���D����N���o�P	�_���h7�>��g���r@P^Y�l�.��"�;a���6���va�r���6rB'�0���2�,R_C`���}���qJ��o>y&�:e��P=��+^Vi�'[��{��;���.�j��v��h)��GQF+�q����I��9��������cv��uR'(\?.f�Y�
���M���Z�T {W��52�T���i�R���{���������������ILW�1�\&^*���O�"�3�b9rS���8�j>@���d�+�'c)�8I)����8�m��-S�R����Akg�l��[��nI�eEuw�U���v�����vc�cd�
c��d2�.2J�d�c�(�s��+b4)��fTf����/;]��1�#����t���H�����t�8��e&Q4X��*�`��e����'���:.�x$���If����w���$>&��f���U�,��?�����3��@;C<�/�t��=O�6#dK����3�J�X&��)��8���� �m��7�q�w&�{+	a��S�l4�t9�f�#)-�g$g%��$���[�a�e��j{��4��`f�c���HU��qJ0�^F��"���K$K���f��R'=���������lRjM%9����%���5��sI��8����aM��ck�$���<��k��)0��3*��o�0s�A����m��8r�x��6���F��	��f��t���QT��GQo�B	}J�=�M�3�I�k.jqk4�<K,�>1�3���T����u%ojL��6[�,���N-;�G�N6����N�����r3OdI������Wr�����J�#}�P��3X����*����fx��L"-�A��;�R�36{���?N��6)i���B����W\��57v��d�VJh��C���^�n��Kh|q��b���R���H��7����B.���{�tu�e�f���ZO���o9�q��\�(��H3��;M�u�^����6�����L�.����C�����n�BA_Hx��_��������'������>B�B��h��P1�)���V.��RB���Dq�i��D������k��
�^��0�8lo2��0P���k���A ,���4"g�
1%�Ki������5�E���>d�
��8�(ai�r�)����p���xQZ�q6���1pT������a�D��XC�+���0�,F5����!�yn<$����	����w����1�6�,��B	�h�1��.������FF��
��=t�0n!Qa/��i��B0L��F�)�V�����L�����C��$����g
��B��J�F����:��R2�&�������k�AV$27\pr����Z�yW2��������7�F��	P��vG2�:�kJ�wF��,1�i*���\���<��QB���4��
J��8LD�S:W��`,[[�2'����%�x>Q���7
���e�E���c��c=�\.E����B�7��	K`b��<i�����y&�P	�Z���96�������{��������&D�T��n���K��'����f���.��:�������8����I%�V
�x"F�{���;m�K����}f-�d&��v����c������0w������u�!�d������6��L"2�gq�f��`�����r�q��'m�y1���R��i?���6�-2�Pt�f�kz��#� ��N,�R���(r�����8���^<g~�41HH:������.!��
�D�vQ~���&��\1��Q�#�]�?���hj�����x�H�^`��Y���0�$5�������������&�9�����|I��D�g��#a�0���h@�����}�H�#"/�	a���Q;C�OMW�������m�_wy�[}���#2E�+�
�W����O����G~~��-~;��k}�7�4�A�v*���.-/n�ka�lUv;:�� ����O����R"����f�&Qd]p�
!
�R{�����4W����R	o�p�W@��F���>���(s��@��V��).Jd���\oS��;�^i�\i����Rd'����<��K����g���!�J��<������z�[������;���n��w�{T�i�W�=m� d-8�o�>��	YVw�O����kP�H��'W����J���O�Nd��on'���"�X���(��D^��/��/���D��.�Bu�G9��=>�����O����8�����F�\W"�	��>����&g���
�4x�Q����]wL-�>?�'���W���8$d���FO2�Fwi��\5��1�?{fFD7����?;6BB�%�y���.QK��z��b,
�������g������'��o���/V�6��1.����������[6'��RjVs��4�F�<�"~�'7��g6"���fTiV7�-Is���=B r��y������:�0p�N:�����n^���wkF#v�'3a���������<�\�AS������r(���j8��
1A�<6o`�C[�C�
��x�#�}3�Yc�p���E�"���5�����'���O��j���>O��{k��S2z�����Lo�;spF�
����
�OJ���,�fA���BjP>cZMW�qY�+������y�@���s1C�����S��y��ww����nH:�	&*:W1��,%/������$�yb����[( ek�'���>��:=��J�g���d��KR��)As��v6��
i@zv?�]m�K�����j��Y�V�G���%S�}����#������&D��++5�u����n����,�.��tw@��c�~��w�����{�hU���!h'O��j,_��V����6�&�����&7���7;��x��5`�nn]��8���s@z}��%i�#z�^�/�-�[�F��2��
����W�[<|�[�=y\`��9�HT\tf��6 G�3�X�H�f�<����8�o�T�h5|�HNs���-�U�b��Z
s`��d�Aat+�I8&!
�*�&c�D;��n�k���R��+��}9d���+_{��s�so�CV���k��-�"��,��d��F����rcy�vv�('g�- �[=.iR�cgcC�!|$Y�R`b��i.Y.���(;�V;>�J���"�B	��/���0�!��69�"?6��K9}��]�d�r<�i���X#��d��j��eS�V��E�G�1�r4�&%�^I���G�W��e����?'+T���*��Wr�/I%&i�E+��	�My6xI�>y�y�����"q��?	i�!�&%FK��1��7}�(��3��K�)�'i?�fkwc���e�L�7u9B�;d�@�p$������:��g�������!�km���75��������%�Gh1�"��T��Q2���w���`�{x�������8Ge��s�Io�D�"�/�}+p.Q��s��eei
���F�����h�I�>/JV�)�^f��&�n��r�0fW�u`�>�������f]�S���)r���JU���J���&�A,PIg���p��Pz�j���z|��0�b ��E�����
d��0%,���hhHv�%2�o�?�3_�5Z/��W���-������s���fcw����4�I+������l��5�pKl��$�x��h�w7[u�%���`&��p*2��a90Qy��������6tv@v���
9G�����H�sRP��������GX����%z%�C\
b����5(;Z �4�[k����=��i�.����m�(�/*ZzE#^��S"�����[P_I�|��#a��4�M����CnY7BLp5 u9��.�m����8B��jw���!r�������Jg����Ev���t"C�e�I(���t��?l&(P�>��?�)�LhW���0��nc{+Z?�klo/=)�-{g��q������vE!��$��i��n����(b7
�U���2��e�r���AE!����V��Ek.e���"������?4�J�������l/*AJU�ro>�4�L�(U5����|~K����v�\�����UMv��������naBr�)(�m&������*�{h��������=������ZE�=��(������=�]5t��v��{�j��=T5��=T5�����pUno�X�QJ���"��"#��Q���n��&����q�:����jkDVVv�v4�������i����xw��w5'�e{��d�KZl�Sy���2�`������iur@D��_7VR�rt��<����6H�*����A����}�c��|{�`�n������efhH��_{��HU�����?d����~�y��:sR�����������v�g8��,�;<xt�,;������������/p[g�l����i�&$��h�N��;vCs����j�W7s�����!3��d����~���"<s�0����g���3�?�3�g����#;g��o���n�w���������n3Ie������c�v�9��9�����yC���\��T��L��D��y�4��Y�4.��87E�G6������3L�N���g�
0�w��&�(��c��x4w�Q�M*�U�on�����2Y��,��N��U'���d�E�,��'����e�
'�<p�6�����������7���^w�����(����`��6���>M`oj�N�����=`(�l�4<`��������W��M�!�"��M�������
�O�����Q����7������|`����	n��(�������g
/�x�t������%�;�f��l������J��R�4�[���5?�@^��[��3'���xwv������i�
��I����F��t�$����Q�Z�c�[��c�3x����f��n��"��u���-���KT��9����c��9����e�������}���Z���������?i�`���P����v�c�u��|����EDq��Zv4[�.��kO��q�c���d)P��
[�����S��$�,�
��Q�e��b�
#)~FR��u~V�$K`aV�3�et[�7b[��.K�cS#���
}2N�t������o.YY��lEm /�!���kd���>������:bkLB4/��`����0#]P��z�k��_��xj�O2��zr}��O��Z�+�y��z��Sa�m�'t"7�(���d�i�d��&�R'r�Ix����ip�9"6����k��l��	�?2���[��kV��v����l��vv���[(�bF���[�~������q=�J��U�b�m��v�%_"du �!{!��b��^��5D��fs����	q��`[�]2���=�-�H�:�!�M���"q���[n������_/&���{Bq�\��Sa������
qbA���}�-H����R�)y��)��D?��V����>z���������t>���b
��_�
�=O���!`�+���y��i:�o�������45��4��&^L1���swk�h)�/���.�y��~n���Z�$n6���`g7yl�?����.����������L�UW�����_oG��4��+~��M	
u�
)�����v2���g���li������w��[���
�-j����zn����w?\����/�:<�:���'��3���6���r�M��;��!'y1���,�d�y�=��*�M-60�Mf�0C8)����bK�����'k~*���@zu�	uQ!q���N&�(�����a�x?�����P7����~o���9�������������8�6���#X���6�E���� ,�,�2�v��?���1�1�o�Lx����s/hc/u. �|��F�^�;��U/}�n�E��}�-/#��/\S^z�W|_������kf�^j���V����p�r��<S$�nS���3%	",������9�H=�7"����
������<�9)��u��r=��	8��@H(1���H�3��<S�u�Z,�	��$�����S��=��QE��1�>C6�(��'(�6���
�@����F�]r��D��|/�*1A6G@���m�B�����l<��H�3�%���[p.���v'�S�p�
���3L���\Y�1E�h�;�?r�(���I�%^J`>���@���Py{�3�o7���pd�&�8W����z�O�������Fa�sN't?������#�V0�,��O'W?�yO8���������\���0�Qs2a^��%����)G0�4�4;�%�G�2���P	I3�����������y�$�����8-BnW���������h��6�u��E������.�r"%�������`�����������GyT�����+C{b������Y�&"M�r�xN1y�y��sqe��hj�\xr����"�Yt[��Lw���n��m��kY]�19�m0r���P���B%~���RF�!��b��R���?�-�����2
��T�Dx�$S>�|��tt�d��s�rY���>�������4����o��A'�����"���7�bf�p^JJ���Kz��=sb������d���(���R�_M��-F�}xw|zz����;�57��{3�|���v�����P�&)uD�1�*���8�!���@TH�B"���z<#M��+�
����a��n?��ePW��jMB?����\��9�[m���{�f7������8r�9"����<��1�9l���F��l8�������#���4�{����f3��I�a#�m)F���h�������9������NQ���D
��CX-l?_&3�5iA�O�����"+�Q���Q��;Vjd[����\��b�����r#T0k���V���%����4����KW�z�8'���Fq?����M&w]�A����(e�6�i��}I%d[����v�����fk�m�m<�+���v�#��p��4���������c������9	_�J�@�0Q]d� |�����"3r�K�BQ�=K�0�
[�=Fo�k�Z�]���������Y���$��t���������Ik{�?���^����
��2_����DW(��KK��]����:�8��!)��5g����U#�xv���\��9�BFj.��%[��s�T=B=P������������:F�=;|��na�^���qoO�}�����=X����������	�;�U/_S,?\�������|s�zYP������I��5��O������2�tc�c*����a����k�%=96�yr��r������l�p��x2MP���K�(T8=�sg�����&�=P������a������\r#�����7��#�G��W������d�?0����A2�Z����RIFr������I�$������k%�Rk&W|����9���a/����`.|�|� e�HQ����.�����2[Z����fA�0�r���$�*���5�2�����&�}��ezl�����`�6�jW�jC�����A���&�6��R�SI1����}��1k�������a=����^��&���CV�@��Q~qF�������+�?(e!�����Uo$�����"8"�����,e/L�����(y��;@:�A?nomU/�_���[��cW�P���%�	#/�_�r���\:I��(l�������Rj���-��[-���1���a3�h��<h�VW��������mnnnmt�zt���s��i�7 ������
e7X����������������M�'���mm��V{{k��������6����[�+������o��(�_w���=���o=���[{���pgo����V��n����akk�������qt��E��hs�%�d���f^F`���%����:G����n�����i���W
�K^FW7�F�������mC�_n��l�E�{����sR���������������t���%*��U-�|��A���f�
�����z�Lm���]���s0��d�����kP��������@�'���F�l�C�qy������`PN
R0{$�)��tm�0��$�x��W�t��h6�e�B��y�N9	�'�5��Qg'��a<��j�7��P:�y�����\W�TA�������� �-��Wk>��_��{�8K2Q�}�F��������,NG��U��R��P�4�@���0�B����C�����B2���fHH�K Jj>iJi��/��s�f����,�y�O����k?(D����H�,�&Yd�s�*����`���F	x��;��2�0�*�P]��M���C�Ho^���E�FS��8�)�*��@Qs��gB���f���
�Q��]#��7A��D`03�j�<�$�2�6w�Md��N��������;6�6�t�C�&@���	���~�g<d����@;h��y&��2N�DxOGgW��3+�N&��$���SA��S��u��8����@�+ &�@������6F`5e<�6��*��^b&1���O��P29��+�R2AR��2���mE{�
���64a����MK4�O�����B+:^�������k��5]���)��*2 ���yf��_�^��y����q�3"=���1�gd����	g���Y3�-k�����d��]o��%x���-�Th�4���c��0��0�)������j�%�f1
l��-�������p�������3����"�t�$���n��i��d�,Mzn��w0rro�q��9�7�l������l������=$|!�I�E(G�+���0M�k�n�)�E���e�yi����b/jL��6k:]sc,�����E|�('���>
��9kJU��B|E��p����GY2L6���\l��*MQ�H��i$Y��z<	���6�����U�Nkc�M���?���}MR��
�.�����aE2�a�
��8��u��8��L�WXS�fb���)Y�����O�*g�Lq��R	���$�}a#���u0�q����o0��K�H��������;��f2�5�J�[�������3��XP��Q��{T�����U�Lf��&�	��3��eb)���vf����3}w����?	K���a�����S=|5�)Ac�Z7�Y�
9��f���iw�*�~�� ��*��IB��n�Aes��)7�x��j6��hh������9��6'�-�\g����q>Hn��[%^g���17w3�O��ChS��Epq�{=1�"�`��x�T�K�	~����U�����Z>0����[���/������[������������e��Ek7*��D� gx�����*������l�F[V{2�:���4�
l�|`�u��3r����*�D�K��?�\��m;���W��G���ck_�k6���R�_�3��[z�O�fTY�P��Dfe��Y�lOS��)5��
�?6��j������������y�1�=VB����xwk�lnz�a�����u��^T�������{�/ ���B��!`��&��O����be�C��&�9C�rn8���# ���������|H_�>An�l���#��'����h����~]�i@�m�#u�)�I��h�,T��=�?6?nm�rks��CQK�d^�Ex������$��,���|�3�]���z4���/
=�-�Wu���_5U��Kl@��f���z���z|�:�0���nF�%5Y����%���oIH�0/�\b	
�|�M�e�M�~rkp��~�tw�))�HQ�O�**�������i�=����t��I���4��9
�{�Y��YY�{<���!��J$s_d]b���qf90��\��b�e�1�����d�+J�B]tg����z7�+�r�M�yNA=F�{�E�0"�����u�G�n�:Nr�#156�LR�L�7J
j��\Y����F�r�fEr!�v�K�G�����6���nO#�n���B:���:����������Ng������P�8��-����~�����Yn���������;��O���d��~g}��as"����1$�X�{�BF1r���iVL�����`�5Lc��R�$��T�)��#�<yJ\j���5U����/��B5k�Z_9��O��������%e"�$�'g�<yE�&��Yn3U��r����@����t�s��g��|4���{yJ��c�����mX{L��,�eQ-i^�D3D��(.��.��D��^�O��#���bH���
�m��L�~4��u?�Y9hL)�D�b4`�U<�!�Y������g.�/�,�<��1Y��*9��V�)�O��cl����4��R�f�S���!O<��K4t�2��-�Y�Lb=��X�9���3D?(@���)�X��{��1�1;d��D�P���+Cb�����G��f��3�W#�#�+�HQFA�,���:p�F�T�����d:�LK��Z��
�&��{r���;h�P�����/���J��86�O���� Td�{@�������sU�]���#��/'M�W���z�dP��C���CTF����xj��|�i�{��4"�'+�������+3L�Y���p\�F���%G���������v����r��9��u�~~��p�v+�=�)�t-n&�3�L�R����IL�lWh_^u���%���y]��PW�Ww�cM1�W���;A��:2o,�rX`�H�S��%`��|��0���B�G��,��\���'�
����CP�M���i�)��lM��zm��D���/ck8;4����BN����L��Vy�������t���b�����};p!O�����q���@=m	k#��W;�/��Cbjj'�a��1��u����������:�^��	0���oO[M����5�\~��I�Hp�\a3�����+�N��������>_���;�	����V�LO����Q�~)TG��������`{�Kh���}����������<L�k���cZE��[��> ��J����7y�*(?����/�l'����n����F�"�.���o���S8J�����!��c�_���7�y�rd�$H3����aT�C�*|V���nl^$��l�����=��LV,)s=��_}AW��������<��d����VX�*6�c;���_��p���4����:�n|?M�Z�g�:�����y�D�pu���3��8��Y���+�c��	r�i��jV������nVO����f&��@�]�m7�ZOYP���2�
��k��	�����7���wYS��"ZLa"NX��1�����%���_r�c��6��>����IC����G
���,�
������Xr��%�����uS�%H����?��0�Mi�oY]"��*��i�������O�����m�LO�d&�#BP+Y#����V.���� �z|UbDa���,����=������P7C�:Id�vP��h�&�����E����vc�M������	��x5=Xo�5�-:����Kg�i�p��q2L�
n�P��9.��D|P�Z�
��X�L�"�e��vz�c9Es�_�����7L�+q�r�T�y��������L��-p� ����p�w�Vf
.���y;�r>������x�3]���LkN��-�x�(_d��T�<,�=��nN�		�5r�,	Y�6o��W$����`o�%������,�Pd�e�d�����E��.��"����g�s8������JT����}%�\W���Ca9�YH����n�
�V(�������|��=����q�7���fH�����o� �72�@8`c[{��,��j@E�'!�"��6+���|�����f\%KA��V*�-S-
-''��x�K���9<6���_@m�[}sv�I���J@�4Qu�B���p�hQn�.Y�(����yO��'P�mO�>��m������T?��,������k�22�S�������.�� ����������8���`��?{K���e1m���X�BZz��(Lh�G��/�l�z�UU�94"�f�9�m�o�Kb��[�:~Z�-�����a�wS���Rz�����*��7����'�OU����m�'�N���,���x��\�����/T}�����h�@���`M�V��
����[�B�e{�����
SW>�z�����s59���������F6���`r�c#��,k�/P��?x�r��i�#����Go��Ik��~��
t�+����J�H�	z��G�T���&�R�P��#�|'N�[�I�a�
�/[��<�:�}������O�����������+n����o�wQ����Q���Z���V����=�,����=�g���T
S��]9��G:M�k�����F�6O�|t=&u1�8�/��	Rb���*����d���/`���M]�SA���TfI_
uH�������[��m��v�����$�K4������z��	�Gp��Y`��]��s����Lm�dQZ�p�u�@#*�w�*���G�����L��4-E8��Z�����+�P5@�Q,h���Y�k�u������SN����wwPj�����I����6�>�ww�=?�@��M��h/*�T�8������/��Z��^�oO� ��E#��6���L���W�W�!k�%C~����X�]}�u|�������^�Z!Xv�x?6��d;�.���l�����05�MG?E�4EB��r�XQi6�V��tZBI"��4M{�pS�\n�Pk$c�tqr%��jkj _9�+����I]����QyOIS��
Q�������U�����59�6wI�������Ij�����9�����ja��.������3�RX�����|TJ�+�����#���I)���{�QN�aks�ln���;����B������hmq~�6e������(��c���I���sx�==?:<�,�'��R��9>?���Pe"��ebk�`�I�����	�2oe���]
|�_�E���d���aT{����
�������a�Z[��������o���F�������	/���M�Z���O@iS�g��7����T������-ULH{��M6�����dk�6����9�,�m�w@�?8	�yM��]*Cu���:�M�CS�.�
2mdx��}�&+���X/Xd����%ms
��c��3��5\�`~{�w�h�gQ��5����3qUZ��������v������suc(�-�k=7)���yE�����s���B�z_����	\���v�]��

wN���}�����)&��/��s��������������w�bZ!tXvU�6<t��w���gN�zLOjwjp�/L�F5����Y�����,Q�zao�������;`����$�>�w����n�w�r�T�;$|��%O��W�B�^�ql|����6�z��a�	���������>��������y^��B�Y�C����2�8�����8���$�a)gS��t�eP��V>;������(�i�;ir8rZ�����j����������s��
�v2�	+���,�hDw���2,�H�4Y�b�a<�'�(Y����<@��x>U$uK�q�T I�Z[��Tk���	0��5��iCt+�e�;2 e0�����lBt���H���������y�\++$b/P�p79�q��O��a>����X'SM�+�{KS��n{�ub�7�������D��(��r4��Ps(�q��y:M����/���t�)�j�MD8�v%Y$i����iP�g�����S��e�'�7,�)��]E��AU`D8
�]�"�-CC�N�$�����Th�W�v�"'��(�������)��pP����E�%��uY���(9��� �tS
�����l���.N.���+xn�-���0�A������<�I�����I*�9M����a���X�RY�D�&Z �"��7�Q\�s���R���5�k^	$R*�z1���-�Y���0��ZkA�h���0B���G�>���R��L	��t�}��Gno�ZS.��	b��V���fu��dn|��E�_��u_�&��l������S5]0`=R����tDL�t�m�(����bc��k �2�`������C{����Ua�XW�pV(���7=^�C��RK�P����5S�a��.a
�{��n�
/"�B���]�����6`���&����oj��zG�h�pg��+����YT92�-'�.��Y�����gQK�5�~.H\��i�1
[��w������r�: ��C�rG����U���b��h2)�#u'���RC�������!/��6I�>��[,����I@8N@��,���(|������0�����z	\�����Pk?�
�AS�F�/�w�N�'0�#�m�E���e0�=zhH�'7�f�������W�qt���2:�*7��3���G��"_KH)#B��9�-���
1I8r�
�����4.@,�s#8��j�LpJ�?��(����e�������a%�M
��kB�B��R�z������E�E�(�;K�4���[����c�Bs��?�������e��!�����m���(�/�w�����F����i�"��\"F���F��H�[��
��'fG��4�lZ��H�yU��B�I7�K�)�b���f��f�YaM��JB��c�?6�t>�$��H4i�����M�(��� A�U�4p93W�����p25�K1�`=�i���r1�����q���������L���;S�fI���zi���Ru����QW�<�NR�|�_8��v6��?��c����q����d^�5��n�+����\p�LC�QjdN��\`8�^��9�QH��&����n�&,\cn�n5�����F�t�(���g33�?Qu���j�^�Z25#�4^\�jsr�����q��������E�m��sv�Q�
B�o�����\U��Q������g���D���a��
[�S(O�=^F����d�5D���a;���&��RT%���X�]NZ��m2\C��G�221���4��=kD�D���Z��>t�q�����-��&c�������$�d�_�S��N~�F!�/M����9)�l(_�\=���I�/#�/{�1-�e���a!)M�Y��p��8 T�����<2m�<��R���G��a��3����J)�����������e��e_`��o���l�����eu��1����#��d���H<;�v �����������9���� h~��Y��7��g|A����L�J����I�	������&����G.����lz�T�foG�u��t_.��-wI��#�����O������3����Ax��7v9����8HKm�>e+]upE����nOO���
�����W�!V�8+3WV2s��r����	�od!��6x�S�)��a:�*7���w�P~d��X���y>�n���V9�����|�����Y������X.;E�
��Ks�
}�z����(ZA�k�|DBI�>�>���\f]D/_�ja�����B�O����hG���-)����*���%����T];;�V�l��;��R�[X�H/�����]r�vN�i����d������������{eO	W�������Xc_���
XGH;%4tXK�E<�������)���Q��j��������}�J�B��m�
�f�q����q�����=����p���}���fs3���k������e�kq�"~y�\�g�����A/���������B�?Pk�E2��:I�\�<u7�Qw���"2�*�x�6J���(���k
S����T�����_h���a�Q��o��,�-��^�����A���w���auU��/��x������y��`y�l�q
����=K����%��=1^���Bh��YV���9�BG�����L��,�#h!�)��m*�b�����xp�r�$d_�N
z�����c�s�t��2���
JZ�AWR�w5����=�.
��d�L�T�$��)ryjj�
��8I�xg�Aj����{�����j�z�0<����b�R[�z_2�T��@Klu����U���5i����gL�%U����iWe�����,&�R�����[,r��y�x�\/�{�D%Y:�B�C�5��|f[^Iq���g���\�+	
,2�x������$J/��3��������I?2l��#�������q�cn�]��Y��A�<�N,�n(�$����uG��a�R��32|E�H�������l>��8�ee��Wp9����@Z��0*���x^�t������@�:��yci"4}��M� ������n�������h��}��$�O���H��vkwk{;����������?�W�G���Z;�;��n�����Vk�P�-CC���n�����~���?��m�E��k������z����������E�Td8�����$Y����p�sy�l"���m���)�0HU�}������Fs���,��������������]��sxl������U�x��Jc��14Z�9�_"�ipI���t-�'@�%VH�y�����t�4G=���]v3!t-3�irm
`�r3�Y(I�����Mt�������12-=���M��h�a�:[%p��;NL�{2��X:�)�������/\��B�g�\�����A�b2(���5{�v�jX��3o����<��
�V:�B������^ �&�;�9�a���MX%�H��$#�u�_Fa5� �Om����/�>sd�f��0D��x2M���mb�J��*�Km�mmb��+o+�r��%�����
����`�f��d07�$��%�.N��Y�l������<�U�3�
|a�-W}W��<������KC3'�6?�]m�-�of�[��|�g���(�6a�t�o,�L�]�zv���_��=��&�\��#���>�$B�TH�mX:En��?��	�������t��iC����z���!r/�V��5��z�`�vJ��rQeS���&
B�h��*��|�U�a�a�8Y]sa]C^�[>��X������h���a#���
�y����s�]�iQ�m���l7{��=�S���N����E��nR5�GzN�j�PykO(��]�D\��9H�L\�a&����+�0M�v���Y������k�[5��
{JS���_�Pp�~����YSK4����\�-�`��,k��4&q/i��A�9���[���d��+������'���Twrvu
g�Z�����z������e�e�l���"d�9�u}JV#�x��Y1(�Z������hm�����k��q�����4�gS��v�����7�u�2�f�U��W��^���-�X�9U��e0��K�Ls����Mb@�[���;���{��:���G3�?�r4��h������)�GS�������f*��Y�}���dK_��-��6g�;8iA��`]��L�k����t��e��Z]��|�%��SV_��H�x.��eEW�i�������	��^7�n�"�_v���E��g�����)#�La�z��msVS�>�#E��'��t����v'�3�����-M���P8�l'�����5=F����K�Ry��V��U#mr�����l�%�[��/"���-�������=x���3d/gm��m���.���DN��N�oE�����
uxv������E����������������s]�9��d*:<��������loG�o�9��{�����^�$�_��'_q*�h��a����:jk-�O�����7(8~�E�����5��n���[t�^��/p�=��|h�a�V�
�bu�b��`�0Vm��L���|J���dJa�����m��6&��<�k��;-r�kf��%q��=���J�x�d�iM�����tSFrh����MwYU]����]��j� �~iv�i�4�<z{q���dZ��� ]�?Lo+
��y�%�Wm�W�.I��'K���9��o]����bZ���v��{z������I��oJQ�C-�YAQ�L���w��M��.~M���q��N&���a�q�����&������B6��k���7n�3�SS��[�L;(�~�U���S�}~n��u;^���n?[�2���ty������N"��;��C�]~����R2������}V$��-��I�����o-M����~o�[�����J��
�����e-[�|z7��������/u�'#�B��f]F�~��y��^�O��:�����Ytx����O
�O
��p��*c�����g��jFz�n?�#W)8`8Z6S�� I_�=pex�r��}��������p��������r�*9|�s��u���J_u��?�����v���9���o��@����G:�v����i��q�>q���%������e_L��g\�v[��oD���d[BR9��
��9/�����ByG
\�v����\B������?|/����e����%�^���XNq������f�`���&����[�$�%e9<���[
�^F�O�$ �n{U��w}�@d%�OQDYE�SH����1<8M�u~Y���z��,~��~���v����&��4�f^m�	���`���i�y�)ytC<��W�R��",s��Vok�����z��v�n�bhQ�G�f����%;C,��l����#�Y8!��6�%�{�A�?}��Bkz9k ��N4m��
��K�o�%�+KsQK���� ��J��8��k��|Q��)��K"���(L"��.: �l^�*�����0u*�����_fI<�Q�9�8���b!b�OkYk-�����������a�������K6�BtnMT�k�����8����I!��qL���G�����P�OJ�n��+W�-Q1{Cn����?a�z>�kOl���qb�Z��(n��m�1{���3@t�m:&�����r�E�������r�W�=��[x7o�hn����b�/#�����U�e���Jv������e>�4���22i��B(��}{WW�g�}����A
B�[��54���qN:���*I%�����$���>�u^�*���'��#U��>���o_#�%e<$�`��a�i�������)&'�~'WH*����:��`:6��2j���Ps������16���G�������} 4!�f��f�� i�		d#C8�A��/�o�{s��wX���������j�)�sN-�7�d;�p~���/��Y��l����z� �u�[��b�e-fT���~�Q��U FN�%&2����Z����[m�iG!�����UU	���>����� Y�u��1�P���x��o��]o�V�[�����h|/�Nk����7�uN��V=��4�j���1���HR���0��s��$�UY�A���w%�ow�F�xW��I"�*�`'Aq�)�j����I5�3�����T|GX�r��>��E�s"b� R��%���Y��,��h����
�}�k�,&�
�R�����M$�!/��(���"�rD�b���*�bNwU�w=�s����x�3
�djc+@��s
���,A3����V2��m���y��Fp��<3�d��	f!cT5���X������6e�2�0��t����k������n]Fk����h�F@T:�
gz5�Wi�?�##	]�����Kz
�`�mE�-���*�Dc��Lnw�&P ��r4�*�)	�����`b)�.���G����F$������~HeD�O�0A��-�����u�Bli.+a����(��V��������;#%S�Pdi\j��I3�m�qq����667*@�Y����Y���"����.��C*S�v�(q[�R�0��(y�ABxKM
�LaV��hV�E}��y"�u0#H_���(��LpO��XL����!�	u���`^���Lm*&��N3ZQ=�oWK��VS������������_g���j��&�]�	,�i�G�����m���]�a�n�>����A%��Y��p��Rgy����7%�k������W����Sw���a����	��A|���y#��-�9c!��A����};P�\�;���5"�#�C:��{�W�M,=�!��,�<���0%b��,�Kc6�R
�i������2�#p��)�fS����C�O��*�Sz��TK��-Z�D$���o����m��f���C�Y����jO�O�Cq���X������{����O������D��G�F���9����c�L*8c���+�?�����	�tZ��C�5v�<G{��f�Bh'���/����A�=��f��zs�������.?
|�K�p)AB��,�W%�����:K� F�XO�S��3�	g�B2O�F�~���W4���j��g9���h ��QB���:T�d�M��X���NA�k���Y�,���3
DX���W����!�T������C��wG��f/u���PA��������^.�PwM*��p����B,T�����`���� t�
�kF������9Bw&C��o��p9KY>��g���$W�_�~�Q�����+���>��{�X��������,��2ni����@��{�q�'� ������V�iC�����u��F[���/��������@n�r���l��g9����o��W�K�L�����p�������C??�R�����wx����������;z
��D�>�W��
~[��wN��{|��z���;��� +|o��
��4����~�(��b�������v�v,�)�K;����g}y�R���b�j	����v+@����w����~>y��z������m���w
�\��B4�z�y.�d���l��n�����k���o�w��a���
~�p{4��P���*lCA���:�H�,L���'���S�S�)�'��<Ue3�b�]���Ah�_��}��C4�����]���{]!)Y�SugP��5j�M�)R&����'���5�*Y����
v�#
o��e)���*���.�GCRH�N�[��h6+�4y$��T�����-z�	!�~��
pv��Nj�W�����7Qz����/C��8�F��e�#�@V��O��	��C�x9�����u� c�.��|
t0O���UG��4��������O�����8W�>��"|$��f�G5�����|��F����Qo~��o&
|���"��U�Z�n�U��@!�<�b�_?uX��������dpBZ�Gs2�Zpp�|��U.6��b��[���y��2����������c�j��12����F�i��V�(�?����]��}���+_��_�e]��w����z�k����(�
g��e���^�W������qg7����/ajq�����kWM���@�����E�DI�m4
.����6���&��p-��P�P'������}&7�����i.|��2�h�*����B����(���Ga�-�������h�6��W�ti�������^��&�N���b�����x���`�?[b�,e��6�7�p��a&}|�����yb��h��\/�0Z$���&�����WiW�l[�'V�E��]aE�E��nm�[[r�I��
�FS��g�J
6�qb�[:���	7�vl���T�=*�mA`X�iz�������|l8��;d���i��`�n���ge�r��,�����	qp��7zd�7��R	����:�2(@%��&�5�?1T�$�����w�)k�.��d}l-&���b�=����~��?��F�?��sJ�6h��d l�����!&:�5s?����q����Sy���of�4��J��$��7�I����C2�@��}�
�����h�Xi�����p�D��|3���r�V�	_���,s� �y��E��GU����P���;Uj����fR�gp����kW��z��.pA����~�w��i/���C���X��q��iJI��:��g��{	��0L��x��5��;p����������}p�'�Z���k�{�F����� �\G��]��?��~g�;5Gk���G��m��}i������7���I�i��Z����k#��h[V��t4�]���4"srxl���w^�S����R�
�W���dU������f,��p2��-�u���eN��$������=.c�}�+aB���s�d�3�kp;7��E�uj�IR��=Q�^S��u�:A�X�![O���A��#p�}���p������SZ�<��u��Wer��JvX�����Z�������u���"K=Ne0��j���_���
�R��C�
�I��=<N�d���X�IHA>������u?Jd��d�;���f�>���&���z7)Qx����f���;������r�5������ L�w�2�<}U��M$������B�Wp_��_�fu7�,�+�N����5�g+U�[��/����%����O���uc����R���'\�����~�������;��8�g�����6�S�h�W����J��;����g�h��i7�8L_Z��j,�:�!z��M�W���ER~�b.���$��S{�i����7V�C��~���L�$�I�����t�xf���e�/�����:���<�����V���q��)��M;��y���M*�I��e��U ��$�4p(���	X�or�I�H�P/���?����}��W���L�p��U{������)Ix�_��"��6u����lO�KLT�������~g�����G�},�������R�@�3��k8�g�)U�Sc@)�k��N!��R�F���ws�.�SXUO��������J�KE�_�
������oV����O���Xfhu�T:���rE�T��p����w�%�a�[�*hKF�s��m��\�4zc���ys����-;�c�(2�n����k$��@o9���j��;LA�������b�>���^��]����
�I�h���e-������_�;�0��������m���{�X�Gw.~c�8���p��B/lVMv4�3'���
p��������1H��u���Q�e����|u�!��g��,���s���p�8j��.	��A������7�Q�����#a�������Y)*�%���Vs�Th*�a4�Z�=���fQ��mk�T�>�7_����5���#tY�\�T|�e�����^��H�>4I���rAY��2N�$�s����%Y���
���{��J�$� �=�i3�m�lR�8b��]�	�����T� ^��)��[���8�o�5��e-����C��� }�8��|T�B?�1���oy�~�X��41�Q�W����ep(����Z�mo�ZS��+���W���~Cn�",��������E<C����g��Eh+���6��[:��8J����u@Q��0��C�A_���l���`����{�~�BL�[>��U������'�JM�G��N;���� ^���
7��xm�
�E����:6�<L�C�M6G���U�Q����tz{<�]��:���/�j������^|�k\�����4���������h<�o��K�����p
�j�^��p�Am%T�Q���}�
2
k�s�����7dM�I^��a�����;}s�>�����z������\_&�� ��v���x��
R��W�������;�?��;;��^�9��~x�:}{zrp�����{���H��(.��tN*����G�^���O�a��.�	o��9|#�����T�W�����%6'<�Wh����cEpy�����������W�5��F+�IC���i&�.�F-�P"�x&�`���70F��R�;�S��F�E�������!0Ng�x�z�*��&�`��\�g"dTY�|�TpX��zfH!���w@��q�j�3�W10���'J�'���>�'?l@��6����q�r������X������I��}�qN���A�x�8�~	b
�J�$W�������[3B�D���v��X�s�>`>��+�(���8-��(����.qdBx��vv~��c}u�c�!�4��eY�P����]�jse�v/��?��%�q������F�����:�����5���|�}�C����������Q0�������8#_��?�����L�����l0���,��������'��^�6���Q�H����������OJ;���v�e8�7��W>u���uK>3P����������\q�h2�<��{����j�jh���������o���l�A���i�.~�k���&P{3�z�����?w�����7F�?���Q��`d�����_�t4�yq�?y��q�>�;k��		��B�t�X��il�[��x���`����q�I������3�)�e2]^��/�'�r���4c��I�=�U�-v:����n��e�)X��-�x����&�@,������o�����)�tCo�W�~2k������t1�!��oVc�7X������`��~�y��/&�Eyhf���*w����-�����FXh	�����{��	L���23�c#�U�k#��T�����2��������E\��^��S��
f�e�&��!�����(<���d���p9#��lH�J}mD�����1�����=�
����bW���dg��F�E\���
A�n`��m0��	�3��^�;��<��-~kc�\��j���#:��q����fGIT�W��������D��gz�3�M�����y�v��:nY
��]�?Gq�|��}:?t�����d</�������wk�fs�E]!Y-���d�C����������nt�
EH4T��+��,WN,�����z�����-��P�����f����8��,�*�W}��/�����D��cz��R�|�����������I=�5��~�����!�$)wh��Z�<Y�!�2b�����-��������'��^�aX��*����=�~Rd���Nx�����q�S�MNyg��h���VC�w`�y��j���_T�GE��y���b����_��U�
��DW�k7�:i4���������?x���z����6�/������;�M4��UuK�Z�L��0��F)�k�Ub�Q�z�����f5�p����Gk84����,�������F������~tv~��2�4S.��'���Y�v�}�$3}��
�|�z�\�}������^�g�Vr��h�k�Kk/���E�Z���V�k���vP�J����P��t��������2rCn)_`�MWD�i�RAl�dyJ����p=��r��W�":�.�`������W�r������}�q*>l!��Y����W�/ta�
�#��R}d���c��"�����1���#n���?X�$iRU�2EI��#".�:�������M���������&�.���+�������C'���W"D���3>(7�BPo@����HUg�F���VH��]
"�%Lz����/V�e��n?�T����B���}��?n:�����W{����P������+{�C}����~��p�r���q���i;O9m�@�?�w���������	�VI@A��-gW=I�����!����fV�x���E���ncWt�|�N��~i��
*�
��r}��R&Kg��"Vi�mI1�-�����^A�s���;�+��IT����kg���$����4|���j0�����C?����������=���b�l��c/��������a}�fj���W�c��%���y��`�����b��		��"S�r0����Hz���w~�����WoS��[u2d��Z�s8�^��JRK�E<����g�=�;j����Z�1���u��������sh8g��/��W�������!���O��z�<7���$������MO�)g��C��~�]��\J
JEx:�%��'k{C�+Ld���wL_)S�������p����������)�����p�J�7}����������i�������x<jv[����Gk�C~s9�!�<�f�
������5��#cx����pv���d�;��pM1<���N���G��=�|�O����>��#��R�I(>�_��1*�'U�UEg�!�Qk�W$[��3`�kH���`��BU�4�9��2E���y���&WE�c�c�%[
�j����|��41�|�I�C8����H�v�]�T��/S������D�y�����I7�>��@@y����^�1��O.�~F������:j����S�����3Z��^n&�q.?�R� �i|��c���i0��*��Ity�H=����a�:&P^$�,��z�u,�,yF�<J�\H��(���\1eh;m��=���k�W�_*E=���*������������w
�G�����6���W��;���^w�������c��^�����[jW����Q�{�X�M�z�a{�d?Z�7�`��X[�[l��S�{�Qc�G��h|x�a�����.z�Z�v@����^��iP���)�;\��'�����a���	�Y�����@;���Y.���1�C�=����(![�����@���an���5�Yd�	������`Z��j���y��4�y��	�E��T��_x*�� F7���@N9�o��J��01J'�~k�����ic|�\h*p
~�\R�l'��s�<#����'����b #M��
%�}A�y!�fN��^�g�~;GEd��xS���,���+���(�^��{�t^���()^������[�����C�������2���J]��{/�\��{���������o��q���~p���Po����"n�>?A���]���VN��T}(�z����U-���U/]](��U*��X�o�X�o�\h�~��.g�^��f�Z�_Y���z�_M��?X����?nV���������|�
�_�W��R��W�,R��W���Nu��t���*���*���N!(X��V�K�OIT�_����j�f�����BT��Y8�z�r����>IM��E���>��`���&������Lt*��b��/hJ�*[�Y�����g��������z&�u�V�/������^�V�
�q�_�u�&Vp-��xw�B��W�j}���Py��c)������3��v7t���6�
����rX�Tkm�w���M~����R���l�n����)=�U�l�]�:��\A��L���Z����T�n������u<*"����`��������F�Y7�����Y
��~T��!l���'%��@��\����l��)LU�H�N+N���
�������Z���o9�N++�����=**E�����jQ�'�U�bT��F]����*/-��+����<y��v�p!#��)���i�V��PC�z���O�d��OT!h���j��i��|�E�|{�j��.���-��P�����WR����������+����}V��������wt��[�����(��o���~���F~7�\b�"����:�F�_�'g<����^���j�����qVd5�Bk�z�T��K�H_b
b��4{[A�=k-�{&1g��#_�����^�������SG�d��w��.H��Z�,Rz�FsoX����qk<(J�A!
4a����m�Y*�����n}Qx�	+��5�����6��!|�A������z?��_n�x�x�������������_���@����B���%��\D}/<d�kt[]�.�F�~k�]���Vp���>E���vk��?W �������v�w����@���7�����W����b"���w>q8s�+5j�Z�T���O����#��E��O(ht�]�������]E�H�kts������w��������I�O�f�Uo���V�O�f�Qo�������"��y��\��������h�i�����6�F���Z����
�c�����Q���m�C�5����k��z�1�����,a3���Zo_��Up��������*�������%�,y����\������� ;v7��
o����Kg��?�����v���;����O����(�������7�����U�)��f��d�2@�7����#q�i��e����*����I�gt4���C%�^�>N������$2�����sxk���w���(d�CD���>�$����
����k�����v=��(
D�Z[��C&	L��'�������J�>,�����#�l��bs)Df�G_�����fF2{r9E��f�������XZ�N�j�����l���q�x�K�_�o/���*���ku�&J^��'T�g�D������
��
F2z�J�VJ�������THt�W��l���5l�jS���2�O.�^��@�5�����O�pr����+��2�����C]<8�~�?/��8�����3X���}
+�����}K^��<�}m� �#���)B�1�����jELG��	z���L�W�
Y�c�1�F�8Rbf������J��O-M��i	^�G��28z���qC��W
%f��MTp����X8����� ���i�EE��.��!z=��dL�C+�=`KA�A����8C�j����m��=��"����kD�O=���^����b
6'�G�o����1S]����`v4����������W����#������Z`l�7�%�����F�����8��?��2��E�Z�����I��sw@�
�=P�F����p	�:�%�M�P�����OD��p�.C%"M<���qLF�-��#�&h~	sx�f��kC.�,�q6s�5����+b$3^�*\���p:�(�G��W�/~����l�
���B��EC�O�K�e�AC~8�ECP�'��������$��'�p�
�������(�� $S>f"��RB���GBQ��
5v��?U�>�S�.�Jp��� ��BY��"��%��7Ru�C	�}�
"$���&/�S�����/������D������Y\������
r���+��;�q�Q�Q7�"Y��&Y���U�u�|���5 �����j���ik��)V�Y����/(&�k��s���U����+J����
#�,�yD8P#���p���p#8>dz�j�^li����.���3jE�����]
�Op|7�
s��<J�?���r�c"g�1����A/����F(������:�x�a�������F
���Zr�%	q�d���%OHr�|t��X�4���UAg�[c��2�����	��h�����H������(L�/;�$�,��~%LU��~��4�c5�I���~EsUi�����|�.#0������?�gx4��8� �
co�v�Hf��6�.>���gx�*^���,qs��f����[W(@]�8~�}��&��+|?��$"�������8j���n7�}�����KD<���hn0N�=�RAU'�K�����1@���7��n#i+�9��te��f�E��,�NV'�#��=Q43���	������5����$�T���N�?���(��0I�{�3��|`��.����]~x��`��sj���Q0Gov>C\��I�-y���d��*�a��o�hn}C���/�`��F$X�0u1G��[���]�	�;��Y�h���[fx��U��}�eq�[�@w�h���i�V4�������y��x�F����W���c�6�.�J@2��Jt��:F��$��E�v���aE��F�e%I�|LU\�f��p�����c>�������*V0�����q��3uk_�:�)�7��`�_�E���H��O+"����	�83��'EBO����	�3BCG��0O��+r��a�V� p=
6��J���K���t��hR>�R�)��J���I/~VVw<��Jj�%�D�{&P�����8���w���VX����#�S���Q|����$"��r�Z5���`~�����k2Y\�Ec12%#���5����roY������O{��z��&��L[�P&�XWhQJ����w�!���!��;���|�],@���2���� �zeb�g�<^���`T�@�([O����>w��Y����	��*[8C�he${�i���@�B^���?K^�mS�q���p��l��2�(��D$&�q:�.��u����e��=��$�������pI&$Y��0>��/$&���IG(��N1��
�{����7g���RhP*��S��}8�r��`���L����]E1�]��H)���A�*����[��#��IK�9�gv9~��#��g=H-�o�z���A���^�Um���u;�f����Hn�NA`�$0�8B[s\G��EZ�����1�\`�����dNZ��[���f�-�����`@(����?	02?dH,����_�����t���?bN�!L�A8��g,v�N���.R����u}�
�B�v�}��c�/_<�}t*5��}73����Z�&��/#e���n>����uq��3 9x?[���(�Nk���&��f���"Q��7Gwb��r8�\X�p�}�k6IY�d�{8	 �&�F�!J\[�;1��T5a�Lc��
c�u�
��@�:_4���%h1��%m�W�.�y[p�\S�V�"��A�+��Gu@4'��H���?I��:�s��1hE����0�pDgU�����?�����m0��U��i���uw��g���>�|�qk�#,���?�+�jG��eE���B~tSfo�b��:_���(��x���{��Y�(�m6����c{+JO��/����c��;}I�/tmD
�&�;������nD9l�b^M�	_HA��=]�^s4'CG�(�?M@���)��Go^�o��w���o��$�Q�a����vs_�El�	�(��m��I�J��Fw���D�$���bEn��8�x&Sm���M]�$���t	R�A�x�|v�4�i��d������.Y���D;���:����C�B�c8�����I����`+U�)��V������v�]�:������Vk��R�U�M�o��V��0c����'s'��w���k�Q��|wx������i��p2rn��s�%:���)�9Y��H���CQ�����{���;������A��fh��H*����D�.�;����mZ����"1l��T�]�r�+gEl���*�O��u��4�B;��������%��
M\��Q#��0��2��,o������Z��&�������f�!����� �(Ey>�!>��?�������XJ:baV9-F���6�*�n�L	�NFd���d#��e,��:v���@,?EB4:�1#�3���H�I4s!W�4�/�.U����g��1����z�w���K��#
0e�{$��#6Ir7���,�r��H���a�m��?�,�3"/6-g����L���\dB~|IC�:���K����6	�Rv>��<�UqN;\�
���oz3���|�
F�}�,����T�}D���{���������V����[��I�Y�����V�w4����@�vn�X��v64���/T#}��|�_��S��&�t���2I����|�h�����Ogz���#�������Hy@��)������t
���(~L�%v�T6���k�n���U
+Dq������]���&1C��� ����(T��6W�A'�
�B�����2��
[MC��((�����;$����m��0|���3D_h�g�@BA���a�Q�;ti����Z	>�N1�[\7�
�C��*��J;'�_���0;-qW��5���L�w�����2AE�{�XL�V��ON���Ll=p]�0��U0?��@��;�x��l�2�	e��)��D�8Az���
!��L���%�*�[K�Y+%�T���]IG��E�@�(Fh��P�I��F�w"� ��7Xa�!M�[,%�#U��1M^�����X�W$��9~����U��=�6}�P������H]C!�9����>JA�.�=��]�3������v1���3��x������[�%x��g��!	(�����u�{(�wz��I���P��������/PM���)o#�j���J�@����>��x����Gbm�ic^�+���i/�h������;h�O���g�d���`��J0������p�'9�}�:�	$B�T��J;[���Rk6
��BF
gR�����V1��j\��"��N��
���@�*��H�������PW���012�c�S��p��]��2:��-@Z���bN�����_�p����'���<�P��������
�_�����Z�,����7a^�B���:�)�v�z����a3��%��pO�/��6���[��8�=ZtD<^)#�����xF�S[f(�`�Dx��d�������$�mS4$�(��%�h8�"�H'���v���X#{;�u�����M�?{Y{I{PF�.�Ct F����2w�F�(\�J,����q,f�e�ip*�E}G�lE���d�����D�.�4��Q������������@:��S&O�����D1��a�s��k��+�����pQ�-4�s��3��sQF�|A�vp�X0��="�"i�(h8����16��p�^m�Y3
l�����2��hw�%"�=U��T�u1�d"�aAX����^��1���>x���I:!��.V �R����t_����*�\I��I���#��=���^�SK��&�j��U�n,8,X���"�8���M���(,���2��t;|!TIV���nY�i��I���0����}Ggj�WH�S�
&Uu&�+?'w�d&E��k��Y���h�;��I,����t�'�&"[����`X"�<,��<}����E��p�:�4u������oaT�h?�F�!�p�]����7�
�S���`�A���d�3��@��*z/������5�&i���k<w>�*��"�7���N9������9�"�
�����%)t\]6h��*�ph���e� �F���M�r'*���eu� I0��~�L�.3����:tCw�^�]��J�-��\�8m����������<�D9]|��,�p�^0����#'��_�&x7�|��Q����?TFL{�y�bYcX|S����~��V���x Y*]��N�# r6$��/��	-^�>B�\��ueW����P�����+�f9��'�h�(e>�����t�N���`+����O�I��qZ����bSI%���FJYR�,/?\z�PYH�q����1�KE�������8�55��`��u��4a�,��I��������%(��u\���r��p����P�X��]�vd���0A-</
W�?X�����0�'K�n5�b����}1�A���z�QQZ�Q�Y�b�p-e�,�������tv���q�'�Z��*8
���(9�dZ���^4������J��d!e���C9G�H� �d���(;
t�3�P�����������O^k�=!%��\9�`�u���������bE�(�aY>�!��M�bK#�v�`)��M+�U��u�������z2���*��s,�T��m�<_�����%DW��.��u�{���D���a�K�2��S���
�����N+!���`�=%8%Q^~p�����+�l������#gT� $�lkvf���r1��������4���FrB-�I�#��"�(/d�Y��H��V}+.�=�7�V��G��x���H����H?��!���N��AA����*��9u����wv��N�������@��+ch�"ZsEVAW"�� �� ��?�D���_,��:��J�������=���G�F�����B�������f��r�`\W�B�l9a�� ����<3?:f�ub4����a3�hh��!�T�p�Q�����"!�s���9\;b��n��,N���$W�q�j�[���]N����o�c^_�&������N��<4@W�9���j<�s��As���ah��u�T!xa(��l?�"�C:T_�Z^p�m��6sG��GB� ��Jb�Jv��"�$�bh���M�a��Dy^�(��R��%<.!%*���,�r��7K"X=D{�p��?�(	=t����e#���5A
���u� >Z�!�X�cI�:b���3/&�C�2������b��k����p�1'S�6C#�h
�6�)" 9���	�_*>��
��aER��H��o�'ybX\�
�cQ��|U�.Ce��M��m��OI�����*D�A�y�3�b56Cs���>[I�*��W��KyDmt>�����J*�"�!P�[��@�,Wd����� 
��Z�	��e���#L����H6�%�H%�L0���F	�s(�Pb���+"@��+A��h�����(���iY�&���=5��a!��K��hw���5��}�n���6��!����1��p�j��JbM��=�����I��T�]�/�d�B�AP��0��3���ts���
��v�q���r��6�;����y�62�M��6�l�'|���-��jg{��/���h^��f	y�Y���T��:�u22���HnZ��PQ���Hb�!=��f�qk����v�!2��(�}��5�N���k6z�o�����:��`����a������n��t���po����u��{�{�U������Y��?��s�����f�ha���s0�V���')T:B��H��pB����5a"��E��.��0�	��43��.�$�t���_�T����~�����]�F��Js��<�$~a��KY+����)rT��*q�j��IYE�}��-��9��
�:6�������b��K$�����ly��16�qWK�D9�R8���chFMz�X�f�PK �����n�KEf)@��g�?L����\�?0����x&<q�V�j$�A1����@(���g�$�\���qxm��H�['����,���Qf4z���-lb��Fl���,���K��"����q4�B�Qf��@�v� �D�����JS�B�-��g��x&�yP�"e"��b�x�Dl���H�0�u���&�a
��	J��NB�d#�M�mj)�S��cRy�%7%k�D���%#q0�-IFZ^���T�%�����VL��7�����kDbTD�R���A���$h���	��t�9%�zpf2�!G��
�~��&�C�^��E�����o�K?NIX�=�<�����n)hp�l������p�9~~;c�R�+{<���(���N�gfM���P]0�zE��n�z���|���ybgN�����m$o��3�z��)K�������.$����$���"���
m7==���qD��%�V�0��>7����Z;����N�Vk�����������q���^�����&%�z6���0�������������9_*+WN��8�[���[R! /�M�t'�C`�2�)�]H�"X��W�d3���*���b[p���=Ge\���g|J�Rh�r?��[jG���#	���
��X5��~�d��}�Q��c��7VF����h;����@�����
���*�M���K;@���� ]H&^�v��Z<��S���A24b��`�e��$��,C������r������������h�;S��t5*���8l�_���OVN#�qx:�������1q�����*X�T`t� ���c������^k��r�`>��Z9���F	P�H���������m��$�d��)�6��GW��d�f������bim��h��L�BdBy�u\@I��O�����<*������y�Y`�8-�RGL���
t����H�Q�rU��5���$K3���Y>�Y�/��!$���AP2G�P��{77<�>���Z����lT
����j�;JK�	�t�7��-f*���.kU���!���~����?x��������7�����2�P|�M6a��2{/��rBZ\��Zkj�|�=�����h8����
d�G(������^��U0���]<�_n����LG�J�y�"�R���a�������N�E<4�eM���Oy}N���ZM��bU�S,����&#�q�a���V���D�s�3C����N�r�U�/��n��(����8&#c5��I�D�Vv�5���iL����'�Zi.I�#������`K�����F�[���	�z�v����z�z��2���
�o�'��N�1��(eaL�+)����GP�+��+'l���h�,;%PD����= �q��!1L9'��A�
m����8�"�#����l�q�&Z��3��4�foY�<��1�
`G�WG��!'r#����cU�	r���f+t��h��U~E��A��=���NA�����T���$����,���:��Q� H6��DI�b�Q��vr�j�X�`�5>Y��^�I��D!&�Z�Li�2��y�~f�i�3]���S���Y�\C�yeq���v'�?chr�V(�>�?��U*����{��hbi����������S�-W �gE�uh��K������3������2���gp#����0.�j`&��xs���#��g�Q��?�_;��s�qxn�9�[7`?;�pr
�e>p�e�;z�^��f�/w�������1�
r�P2���{p�4�{{����5�f���w�������V]��[cK0k��9f��i9AEI+C;2z����?"���h����<slK�!%�Q9hAceg�>����w�����M�@��:r"y%���9�M�e��]��:�-�����pHA�C���1=L����Xe8�tNV�t<n����JX��*e���pOC?��Y�6��VQ�<�e"����
u*�n���X:���YD]��R��$�$��v1���GV^����Q�>,����uS��G����R�4O�	C�N9���Ir9�[B�:G�uH�����������u������o�+� \�Q1�%��l�����Ps�#mb���ak�*lx�%���y
�&9SD "���	�����0E�Q�P��/�e&�b��Q�W�&AR&������#���S%�|7��1��?&Ux�$���t�v�*��1��g��#��P�,ps���������~����j���_��W�������=[��}���7[���[�S����A���'��^��1�@����a��%f��eU��=�0�8�|]�q+q�����0�9}�B"��r,2��2��Lr��J
�i-Z&�sM�r�ZjE%"�OS�������"1��Sk���?��$����0�A�4�F.��p�m�p`�Z��������������������}��z�=!�����CQ*.�v��KV�><;�u�ut_�|
����^<����-�u��-�!�g���a)JL�8�%�\�OAs"�����9Ey������������
)�nwp�4w�0��0���k�!D��%8@@�~�DJ:*��Q�H='@I�������KcVEN�Z����%s_���zTK������{q��VqR�,��bz����CC��E�aq����4�.����+���(�4�N?��Z�h�m�jc���vW���Md]K����Q�������N�E&�)����
�"���]�)�8��X~�C%��9�P���!�a�Jm�����1��BCx�l)��@�m<�K����t�0��r8����0$x�*���[O�-��a�����&��C��|�P�4�`����y����8Li�������r�}�gG�
<$Gd��H�Z���7{��#��L�1�~�j4Qh��6����'e�����r������G/�7'������������G�8���g"y�{���A�k6�e|gq8��w��l��lH���B���H��X�I�{��Rnf��z�2�	R�6�������1mk�9�)�G,�NA�0.9En(�r�A]-b��j�
�w��Y6���k����W�S�����u�^x~y��O_mko������������z��_���a�]/v�M+���y�|�-rN�/n��>9a������w .g�-]5h�9�����g�{�g
���p���D�ufG�@ �����[n�Au��WQ� ��CJ�Q0��'�{�`V����a)G�$]r�fDX�/T0��L�-�tj�w��	?�%��iEC��G���T'4�5�@���n�>���Rd�Xm-��'X����f�?�����*Av3��� ]~�=���W������W�'�?�~��O��?�������)��������?��9>y���<���}/.��h��K������K����!�+[�X7r���<]yJ3p�����B�� f�'�&�B�#e*��3d}d���E��*���#�V�,��4���,�L�^c���d�C�����Bg9#�e�^�Vm�#gl��|�3c���b�1}n{���Vkv�z�[���
�99��\���N7}r`���O���'����i���v�t�5��������t��4t���k���/���4d�Jb�
tb�	$���3+a������{�G	��4� +��� ~��(��^����:�?��;;��z
��-u[�N���(�m+��
dAs[x��'�J��^��s�Y�����J�r`^Z~��B���
��~FNPg���A�V����� ����c�#[�^�������ux�?:������y,,y������]0�D�Q<m��W���C\����*����pa-U<fM���mj"fZ�3L�������]C4�H�x�;�Dc�y��%�Y��h]\��r�#�7*�(a�=�?�pj�a�a"�����`���O�����g��3�bO���x��>1�q<]*N�9c��������v���h:4���^#^)Y��D1g��Q�l(�M9	�����	��:?���2H��W\{��x1����(_�	�fK)����#��a<\L
FV���D#19=�:dat��6��(��/r{J��(UVtI2������dx.��NW%�$CF��.wS?�a ��_Da��+u) k����k�u��@t('�-��P�M�1=���L�t(�������j���� �L��V����`n��b�@_�y^�c��9M��5�1����oR��3GvH�{��~m�X-9�v�F|g���
�	�m'���Bo]{eJ,��O*�BQnT��qmW���U����9��=��K�>�So?����	�a^g���g,^h�NT`���%g�r���_��8�X�0o��8$�L7����KUgVfEfH*��"���p8��R��x�Hd7�#
��p� %���d����@�����;�uzx�������l{�m��yAP?)��OU�������g��%��5���W^�.L��2�
����8|����\%��3���5���%������X]������U�����c�S�(���V��K��^P�	3��*�4�����9C�
1��G�f���o��{��_����^H�����;N����'�X;|]S������t�d��os��"�h1�^�/r������UF;����<}����k���Y>�D�nb�I[���oDW�����������+�����$��?$w_�l�!�SH/Z���Bo������X�o����������A�
��jk,�G��+�w�5\jf���g�$_���%963E4����)D�:�s��WE�eQ;
�@v��H8���ef�V��4.
i���c8���PY��S$��r�}�28�TG)��6P�A%�g_V�c���fD��f�����N���x;���';���zo����>/�(�d,���;���I*{/� ��8���� !z'jH�����O�����l��k9��h8
��@�YL0���MF~�����k4[�q2a�H����O	�!�\N�)���>�m��Z1\�������K�����!��H
����*�lF�DhgOH��&U�S�����4����H^,�*f���DR��0'6J���t'��\ ��|Se["�{y9;����:�Vv��"@m���]�+�_����>����\���l�d�N��\����H*��fa/U�w6����g�(�.���0)1�F4�70�
1E���t\���/��7P+D������L���{F�.�#DQ����n!�\���]fy���P��2bI��d�r�+��P�h����|�v�"�]<0;����AW�)�c��!�r	p+��a��*T|&��{�o��`�%�RR�.��^%7A���A]}���-���}L{����<�U�����=V�����������8��8��n`'��5�O2��su.f���q�<��:�a�f`x���.I�=���CW/Q0"��<
��VJ�s"�vl�'N�����������������
3{[��(���U��V�2
5����
���3&��D��C��;&����3���B.���J-}<���N^��8!Rl%Uo�6N����1�hY8��#��j��Py�&��#)V��3��D�����Y������{O�����\	��{��h���V*|Q�2s�����O1�Y���� ���0xB7^<���Z{)�\��Y�5����\��	=������l��b�R��!=+�d]��I�m'v@�:�G�EVR���������?hIp�h�������\��v��<��Z{�)��	��{	����yy�!g��$�t,*I�&3������R���%U���$Jy�}��'������E���rF�JO%��a��
�Cm���ZR����A�[��;=���\B�R�j��uK� 2��)�+*�U���g	]��=��'�C�����;k�61N�����HDRpy���A8���s�\+`��^�,�{CU��Qo"�@])Fn�~�O��TO-��jf"��%����5��o%��GM�Q�����C�_R��J�+��D'L������������������+��F]�vDT��
�4�
`�jq�4Uq9���X���r[,�%V��P�g���7���|�Dt���FEQ�y>��p��~M�&�Y��)��� �>���yB��Y�����cT
�t�Dqf�R�n5r���C�b����^�7X����tf���O%l��2��j��hx6��!l�����9!���9���h�ReG����$��9n\3�"���/�����
[\^��h�*7�1 ���)|�gU*W{Oz���Ws�����t��=�����9�X[�t1+����Ys��F�vF�T���{w�eW.��0 �0����J�h'�V�I�cM���|��@3'�
�����3nU���L�<E��g�ud-���VU����G���g-b0��������G�g�Y�X�����;
�����DY#�'����5.+���@��k�O�����+�h5�UUgX���Q�Ll��f������	�)��u���.��_`]�{���p��:����O�KC,�_g����
�R���i�e��x��B���cQ���J�i�d3(�,��UAH�p��7@*o��_�t=���A�����uj�X�.��s�h	��-fs�gu~<�|�%�N�L�I��X!��J�s���`�U��dNe���	G�;kd��R�N�h����&��w� �Hmq�����R������� Y��[�v#��������1Z��D�[���:����U���KAR1�q���)z���	��	�B��l�����8�9���i���37+��V
��9��-�`3�OY�`qf<�8NNji�7�n������ze����O�}�:b0�"�������9RcT{��/k�4�n�;��8��cAc��
���i��zU�h8.b(���8�������D�����Cv�*�X�;w���B'#��\��w
7�v��I���s�@��]r��sAr�����7}��6���P�X�x4����
O���R�7<���������d��9�����+�����]brDm~�
���f�0���j���{)9e@
���c�-Yk��m��J:�E����,s���,�'Z�i\(G���j�(:��p������G��4������^`���oi�����^�Zk:dq�����^V����K
	�W����d�:�-�J>r�/�U���Y`��#A��4�]*��������S��������p�*T�Nj���J+����%'�Cz�	����fY��>�F�Aw$n:P�`,�������e�oqe���8����UV���y	4���j�qcWn��U�lGv�x���y�=�-�
I.
� �H�tx��I5��N��>WHY����}�����~�8F���jU�}o�F|�W�&���U;��,�zF�KfN�����?^�!�zS���R���v�+���t���4����H`wW���D�z�FD�2e��N��oLf��m8�f�_5���S���/�|V[�7�=�p���J�b�w
�cLNa"�N�Y`13	
�����^@�L�� Q;��F�~*a&�� ���*��/�d�g�r2wS����{�\�^���>��$��A�����06�1�2�1�#�t��	��E�1��%�� *��5���=�X��K0����t�2�K�����I�P��6��7���8����8����*�2>Q���)pQ[�����t��1j-���r���/�|��H)�QQH'��8�G_`���>R�����V$��������-'�������p����I��d�J���Z�������R�Z�9EK����{��hv;}~r���#����Luc{���p��1�EWu3����	YP�[��q3��Q)�X�kVZK��9'RJp�;�����*�0�#9>L��d��c7�S�'��%�7����?�k�����jAJ��������kw*A�N���2��b���-�6Z
�mt��j�PL(CZ���2�<+Y��U�t�4��6��It��g�V�������z/OO^c�OJ�K���j�L��..�N?J����1��L1X����'�&�R��w��9j�]P�D[�R�VwGx
^�R�mh�LOD�2Hs�b��fAN�d�8+��sv�Y�2����p\daQ������*�e1���$��mP��]��E��C���l�Mo:���j�J�E+�a�����mR��E�[����](���J^a6�\�`��tb���]*��j�k)�����`F1���\�Mn���\�#��;X��#�REr��[�)x3���XI�N����K9��TP
���mZ1 V��3!2�*�P�;*C���{L�#P�_M��Q-O����rC
��	�����������aK*5e�8
��3�$�������C�d�:a<%�3��,�"�Z4
�����Zv�����9f����B���y��'�����y|��Co��M���9���-������@�_�K[�r����
��()�BT
TUjypt���E�����C���r�N����A�1�$�-�P�\�K�.�5��6y�-xV���1����uZ]��4f��87%p��L��j��6��]�����;]�z��R=$����G����oS���k�m�`~a�%��d='�7�a���k�j���7�{ko2[����|V����4��7�g�������H��)��@�+K��
�l�N��w�G+�j������������vV@��P�pM���O�@���6���������`�n���D�UH�y�K6��1�u	�V��p
b�(q����!QH>!�2�q9��S��������Vj+��*���q��>�n�7�Z+��:��%�[Dii3XKO��<�����X]EI���"X��lU9)jLDx��sJ4�++j���nssY�_`�����Cm%Udced}��Q\�IY�Lv\Nm,�*i�
�r�Y�0$TWT\�52��7���C�3��%f����8��J��hpc{i�O��9�iF��8VJ%<	4�'H�f;1����tI���S+u�\�����=
��Q�Pm�
�[S#�X;k�~����$�Q�0��6���)���2��=I9s�_�i}@=@�3"
l�#z���o�N��-����"���� 5ng���u
������Ga�1H���,�:����s�m>����>���	���Q�f������{4^����hp+��
�����s�y��`��:!?H�Eu�
�|9kr����,K�~��ZK��~����1����]}:��MLg@��1Y�`]+�)�m@S�CK����^#����I��a�-d
���b �Det��a!dYH�x=����x{v�����v7k���4)�g��e�%=>�F ��������)�&<lGDU������?0�����$� ��&`������W<@fT��S*%L���
�)s;V��H���L��aI$V��v����z���unT��/�����'����dGj8��D���Z��
�*}[���x~���!,�3A���+�{�*IA��{V��R�Tr�X�f���4��"�
CdG�����X�;P���q.�>��Wj���F����������������������������������������������������������������������������`�Wx
#165Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#164)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Nov 10, 2014 at 3:33 PM, Peter Geoghegan <pg@heroku.com> wrote:

* Documentation clean-up - as I mentioned, I tried to address Simon's
concerns here. Also, as you'd expect, the documentation has been fixed
up to reflect the new syntax. I'll need to take a pass at updating the
UPSERT Wiki page soon, too.

I should mention that I've updated the Wiki to reflect the current,
post-v1.4 state of affairs. That remains the best place to get a
relatively quick overview of where things stand with open items,
discussion of the patch, etc:

https://wiki.postgresql.org/wiki/UPSERT

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#166Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#164)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Nov 10, 2014 at 3:33 PM, Peter Geoghegan <pg@heroku.com> wrote:

Attached is V1.4.

Someone mentioned to me privately that they weren't sure that the
question of whether or not RETURNING only projected actually inserted
tuples was the right one. Also, I think someone else mentioned this a
few months back. I'd like to address this question directly sooner
rather than later, and so I've added a note on the Wiki page in
relation to this [1]https://wiki.postgresql.org/wiki/UPSERT#RETURNING_behavior -- Peter Geoghegan. It's a possible area of concern at this point.

Anyway, it wouldn't require much implementation effort to change the
behavior so that updated tuples were also projected. In addition, we
might also consider the necessity of inventing a mechanism to make
apparent whether the tuple was inserted or updated. The discussion
needs to happen first, though.

[1]: https://wiki.postgresql.org/wiki/UPSERT#RETURNING_behavior -- Peter Geoghegan
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#167Andreas Karlsson
andreas@proxel.se
In reply to: Peter Geoghegan (#166)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 11/20/2014 01:52 AM, Peter Geoghegan wrote:

On Mon, Nov 10, 2014 at 3:33 PM, Peter Geoghegan <pg@heroku.com> wrote:
Also, I think someone else mentioned this a few months back.

Yeah, that was me.

I think we have three options.

1. Return only inserted tuples
2. Return inserted and updated tuples
3. Return inserted, updated and skipped tuples

To me option 1 is surprising and less useful since I imagine in most
cases where you do an upsert you do not care if the tuple was inserted
or updated as long as it has the right values after the upsert, and
these values is also what I would expect to be returned.

The possible use case I see for option 3 is when you want the values of
automatically generated columns but there is actually no work to do if
another transaction had already inserted the same row (same according to
the unique constraints). But this behavior even though useful in certain
cases might be surprising.

Andreas

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#168Peter Geoghegan
pg@heroku.com
In reply to: Andreas Karlsson (#167)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Nov 19, 2014 at 5:37 PM, Andreas Karlsson <andreas@proxel.se> wrote:

I think we have three options.

1. Return only inserted tuples
2. Return inserted and updated tuples
3. Return inserted, updated and skipped tuples

To me option 1 is surprising and less useful since I imagine in most cases
where you do an upsert you do not care if the tuple was inserted or updated
as long as it has the right values after the upsert, and these values is
also what I would expect to be returned.

I can see why you'd say that about option 1. That also seems like an
argument against surfacing the distinction directly (through a
dedicated hidden column or other expressing that RETURNING might
reference, say).

The possible use case I see for option 3 is when you want the values of
automatically generated columns but there is actually no work to do if
another transaction had already inserted the same row (same according to the
unique constraints). But this behavior even though useful in certain cases
might be surprising.

I think that 3 is out. It seems hard to justify not RETURNING anything
in respect of a slot when there is a before row insert trigger that
returns NULL on the one hand, but RETURNING something despite not
inserting for ON CONFLICT UPDATE on the other.

I think if we do this, we're also going to have to set a command tag.
That could look like this:

postgres=# INSERT INTO upsert values(1, 'Foo'), (2, 'Bar') ON CONFLICT
(key) UPDATE SET val = EXCLUDED.val;
INSERT 0 1 UPDATE 1

Or perhaps like this:

postgres=# INSERT INTO upsert values(1, 'Foo'), (2, 'Bar') ON CONFLICT
(key) UPDATE SET val = EXCLUDED.val;
UPSERT 0 2

Maybe the latter is better, because it's less likely to break tools
that currently parse the command tag. But if we went with the former
command tag format, we'd have to figure out if there should always be
an "UPDATE part" of INSERT command tags generally, even when there was
no ON CONFLICT UPDATE clause. I guess in that case it would have to
become stable/consistent across INSERTs, so we'd always have an
"UPDATE part", but I'm not sure.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#169Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#168)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Nov 19, 2014 at 6:04 PM, Peter Geoghegan <pg@heroku.com> wrote:

I think that 3 is out. It seems hard to justify not RETURNING anything
in respect of a slot when there is a before row insert trigger that
returns NULL on the one hand, but RETURNING something despite not
inserting for ON CONFLICT UPDATE on the other.

I mean: despite not inserting *or updating*.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#170Anssi Kääriäinen
anssi.kaariainen@thl.fi
In reply to: Peter Geoghegan (#166)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, 2014-11-19 at 16:52 -0800, Peter Geoghegan wrote:

Someone mentioned to me privately that they weren't sure that the
question of whether or not RETURNING only projected actually inserted
tuples was the right one. Also, I think someone else mentioned this a
few months back. I'd like to address this question directly sooner
rather than later, and so I've added a note on the Wiki page in
relation to this [1]. It's a possible area of concern at this point.

I think the biggest problem with the current approach is that there is
no way to know if a row was skipped by the where clause when using
INSERT ON CONFLICT UPDATE ... WHERE.

I am a developer of the Django ORM. Django reports to the user whether a
row was inserted or updated. It is possible to know which rows were
inserted by returning the primary key value. If something is returned,
then it was an insert. If Django implements updated vs inserted checking
this way, then if PostgreSQL adds RETURNING for update case later on,
that would be a breaking change for Django.

So, if it is not too hard to implement RETURNING for the update case
then I think it should be done. A pseudo column informing if the result
was an update or insert would then be a requirement for Django. Changing
the returning behavior in later releases might cause problems due to
backwards compatibility.

- Anssi

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#171Peter Geoghegan
pg@heroku.com
In reply to: Anssi Kääriäinen (#170)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Nov 19, 2014 at 10:37 PM, Anssi Kääriäinen
<anssi.kaariainen@thl.fi> wrote:

I think the biggest problem with the current approach is that there is
no way to know if a row was skipped by the where clause when using
INSERT ON CONFLICT UPDATE ... WHERE.

Well, there could have always been an UPDATE in a trigger or something
like that.

I am a developer of the Django ORM. Django reports to the user whether a
row was inserted or updated. It is possible to know which rows were
inserted by returning the primary key value. If something is returned,
then it was an insert. If Django implements updated vs inserted checking
this way, then if PostgreSQL adds RETURNING for update case later on,
that would be a breaking change for Django.

How does that actually work at the moment? Do you use RETURNING, or
look at the command tag? Would you be happy to just know that certain
rows were either inserted or updated in the context of an UPSERT (and
not cancelled by a BEFORE ROW INSERT or UPDATE trigger returning
NULL), or do you want to specifically know if there was an insert or
an update in respect of each row/slot processed?

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#172Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#171)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Nov 20, 2014 at 1:42 PM, Peter Geoghegan <pg@heroku.com> wrote:

Would you be happy to just know that certain
rows were either inserted or updated in the context of an UPSERT (and
not cancelled by a BEFORE ROW INSERT or UPDATE trigger returning
NULL)

Of course, having the WHERE clause in the auxiliary UPDATE not pass
would also be cause to *not* return/project the not-processed row/slot
(in a world where we do something with RETURNING in respect of rows
actually processed by the auxiliary UPDATE). I mean, you're seeing the
final version of the row when RETURNING with an UPDATE, and if the
UPDATE is never evaluated, then the would-be final version (which is
generally based on the TARGET tuple and EXLCUDED tuple, as processed
by the UPDATE) never exists, and so clearly cannot be projected by
RETURNING.

This explanation a tiny bit misleading, because the rows/slots not
affected by the UPDATE (or INSERT) are still *locked*, even when the
UPDATE's WHERE clause does not pass - they have been processed to the
extent that they were locked. This is also true of postgres_fdw in
certain situations, but it seems like a very minor issue.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#173Anssi Kääriäinen
anssi.kaariainen@thl.fi
In reply to: Peter Geoghegan (#171)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, 2014-11-20 at 13:42 -0800, Peter Geoghegan wrote:

I am a developer of the Django ORM. Django reports to the user whether a
row was inserted or updated. It is possible to know which rows were
inserted by returning the primary key value. If something is returned,
then it was an insert. If Django implements updated vs inserted checking
this way, then if PostgreSQL adds RETURNING for update case later on,
that would be a breaking change for Django.

How does that actually work at the moment? Do you use RETURNING, or
look at the command tag? Would you be happy to just know that certain
rows were either inserted or updated in the context of an UPSERT (and
not cancelled by a BEFORE ROW INSERT or UPDATE trigger returning
NULL), or do you want to specifically know if there was an insert or
an update in respect of each row/slot processed?

Django uses the command tag currently to check if a row was updated. We
also use RETURNING to get SERIAL values back from the database on
insert.

The most likely place to use this functionality in Django is
Model.save(). This method is best defined as "make sure this object's
state is either inserted or updated to the database by the primary key
of the object". The Model.save() method needs to also report if the
model was created or updated. The command tag is sufficient for this
case.

So, the proposed feature now has everything Django needs for
Model.save().

Django might add a bulk_merge(objs) command later on. This is defined as
"make sure each obj in objs is persisted to the database using the
fastest way available". The INSERT ON CONFLICT UPDATE command looks
excellent for this case. In this case it will be more problematic to
check which rows were inserted, which update, as we need information for
each primary key value separately for this case.

When I think of this feature outside of Django, it seems it is
completely reasonable to return database computed values on UPSERT. This
requires two queries with the proposed API. My opinion is that RETURNING
for the update case is better than not having it.

- Anssi

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#174Peter Geoghegan
pg@heroku.com
In reply to: Anssi Kääriäinen (#173)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Nov 20, 2014 at 10:58 PM, Anssi Kääriäinen
<anssi.kaariainen@thl.fi> wrote:

Django uses the command tag currently to check if a row was updated. We
also use RETURNING to get SERIAL values back from the database on
insert.

The most likely place to use this functionality in Django is
Model.save(). This method is best defined as "make sure this object's
state is either inserted or updated to the database by the primary key
of the object". The Model.save() method needs to also report if the
model was created or updated. The command tag is sufficient for this
case.

So, the proposed feature now has everything Django needs for
Model.save().

So, to be clear, it would be okay if the command tag reported number
of rows *upserted*, without making any distinction between whether
they were actually inserted or updated? That seems like the least
invasive thing, since top level commands historically report a single
number of affected rows (FWIW I wouldn't report the first OID of a
single inserted tuple, as currently happens with the INSERT command
tag). The ON CONFLICT IGNORE variant would still report number of rows
inserted, though. RETURNING would show the resulting rows from either
the insert or update for each slot processed to completion (i.e.
actually inserted or updated) by the upsert, without making any
user-visible distinction (you asked for an upsert, so you must not
care).

Django might add a bulk_merge(objs) command later on. This is defined as
"make sure each obj in objs is persisted to the database using the
fastest way available". The INSERT ON CONFLICT UPDATE command looks
excellent for this case. In this case it will be more problematic to
check which rows were inserted, which update, as we need information for
each primary key value separately for this case.

Cool.

When I think of this feature outside of Django, it seems it is
completely reasonable to return database computed values on UPSERT. This
requires two queries with the proposed API. My opinion is that RETURNING
for the update case is better than not having it.

I am almost convinced that that behavior is better. I would like to
hear more opinions before looking at adding the necessary changes to
the implementation, though. It might be a bit questionable that ON
CONFLICT IGNORE and ON CONFLICT UPDATE have different command tags,
for example.

What do other people think? Should RETURNING project updated tuples as
well as inserted tuples, as described here?

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#175Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#174)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Nov 21, 2014 at 3:38 PM, Peter Geoghegan <pg@heroku.com> wrote:

What do other people think? Should RETURNING project updated tuples as
well as inserted tuples, as described here?

I think it should.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#176Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#175)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Nov 24, 2014 at 6:26 AM, Robert Haas <robertmhaas@gmail.com> wrote:

On Fri, Nov 21, 2014 at 3:38 PM, Peter Geoghegan <pg@heroku.com> wrote:

What do other people think? Should RETURNING project updated tuples as
well as inserted tuples, as described here?

I think it should.

Looks like the consensus is that we should have RETURNING project
updated tuples too, then.

I've already written the code to do this (and to report an "UPSERT"
command tag), which is very straightforward. The next revision will
have this behavior. However, I'm going to wait a little while longer
before formally publishing a new revision.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#177Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#176)
2 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Nov 24, 2014 at 1:03 PM, Peter Geoghegan <pg@heroku.com> wrote:

Looks like the consensus is that we should have RETURNING project
updated tuples too, then.

Attached revision, v1.5, establishes this behavior (as always, there
is a variant for each approach to value locking). There is a new
commit with a commit message describing the new RETURNING/command tag
behavior in detail, so no need to repeat it here. The documentation
has been updated in these areas, too.

There is also one or two tiny comment tweaks here and there, as well
as a pg_proc OID collision fix in the case of the value locking
approach #1 variant.

My mirror of the documentation (i.e. a html build) has been updated.
INSERT command documentation (for new RETURNING behavior):

http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/sql-insert.html

Details of changes to command tag:

http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/protocol-message-formats.html

I'll make a pass at the Wiki page to reflect these changes soon.
--
Peter Geoghegan

Attachments:

v1.5.vallock2.tar.gzapplication/x-gzip; name=v1.5.vallock2.tar.gzDownload
v1.5.vallock1.tar.gzapplication/x-gzip; name=v1.5.vallock1.tar.gzDownload
�MvvT�\{w�������@���������:[�Vo�����s���$6��a���~���)R��vow{���D���o��f���_������x6�{��`�b)��i��a}�������d:�<ox<4V��i������5�5�W�t;�V��V���u�V��[�~�3�<���������}�-��=��y�e|8���;h����=]�������y{`����������{����5���k�65��������]���;�o������Q�p�o��Wl�k��8ZB�V��[���W�&�7��v�?
#|��~7���c���?B�I��-DYQ�e�������lh��/,7
�����C��sg)X�u[0���E�@����r�p�++\s/��%lS����h�1{\Y�����j�)�|(,�zs��Y�j�)�
���`W<�	�c�������>H�~�r�]
�F�k��t6�'���Ol,7����=��`N�.j���q������A��y�n�@�})�����)���|iqg���@�(9�*u�
�::��D>y����Bkm�����5�}�� R'�r>i	:p:z���>1��Tm,�6��l���>+Z�BZ���k
�D�	b�q_��2��'�CW� ��G$����4����%h������
��� 
+��Y�<��#�d�EV$��F���������<���.G������fd .����H
�4*����js����h����#�0&m�}��`>�%����%$�@�������!&-�
M���e��\�@�����&��������c�O=7�`o������0����X�U�H��:7������{������ h��T��"��r)�tC���O�z�,(��"�>}�����V�E�?�l}������#��0����.���S����y���G3��,�S���	@Z>�!�"}�28X(r�s��.J�?@�p���"�;Pf�U�.�xI@��U\��|����`����2L��e�T��J��0}m�r%���0e������a4�����\��Xg�Lay�^�4�Z,X������X�~��#��l���a��h�����h3���.��q�i �#[��KVo�F���U�n�Dw6w�������}~*�G��������aMc�����I��zjbgg���B�~��E��J�����k�r��u0Gc,����Yc[�0�];����G�<�P\��J�0�o��.��po�H#^�wT
���Z aY�]��7g�YI���[�EO�Z�1\G����=n��ZT^����8��Q��7.�s�!����:d'��1y ����"��C���`��w����8	W*�E)]�����-�������PH!+����
��T��TI��f,�	�Ga��R��
i��U$I�U [�O�"�
������$��>�����Os
���hr�7l4�����c����#[*�I�E8��
��8�#�|����������4lc�5��x�:��S��\D	I-��d����mef�����L}��12U#V��sx\��� &�V	W�	U����%	�(~���ITd��9k�-�80;kaK0�@T+��0��a�]o��n7nt��Pm�(���!���` ��P �{A��Tx6���������O��/oo�����}����o��__���NO�;���'f�0]~a
�a�e&#Bgp��(����j4��b��i&I/��;8tTG��L��S��z
����
�5&hBPa�@�"4V��y�i��-�p�p�����*U�+���4K��hZ5����Qk�?������_�8��(��?t���� \����_*q�������S�NrT�b�
��N�����-����e�U�Ayr������� ���*�P�c���s��I��e����"����\��)�C�/�x�#��O���I�����!o���������s��s��������t>�nr3SQ�UIu��R������I5*{����/`
�#�1�S-��1A��q���uf�T[p�k���������� ��m��BL@O����+����m�,e�m�H��#wz@���o�;�O�t��0]��X���^�0�� t��F�����
L`��K]� dY
n0���c<5�������I��C5�#���������K%F��0
*������|<�M�_]���w�����#�.��S��X��V��z����f|HO��P�A�j�kdK!"��������������m��6&N���L��2�_A��toKN5��y����P�����M�P�)���iQ^�%��b����jA�"�
'�t�Qu{�'E(��Q����6�TFS��U�Hh�������lo2����\5fLO�x�?B��<�b��F��6r����cf����Du��8%�+���[*�T����7��'W�s��%*w�>��w5����|�T��4���{t�(
��2���E�"F�&�e��al��y[J'R��Z�H��� Y�uEy*&����N7�sL��6^=�cL���`f�j�EV�Q\C=!�n\$L����2'$�=���ME���tBH�-q�%�2sn���� %�-��p�����OM���U��hjx�O�������*�}�nr�~~���Hex'�9��H�^�ttnieJD���e��P�O�AR0�6%��C�D�.�<������/������q�f�kb��e���($���mV�u�0�Q��E7?�E�%y����H�Q�/���U�tU����T5�40��
������m��6��� ���z��^�PU^a��''R��VC������ju���f��_:�[}��%�y��)�]=;"��z+A���)�m�Yu]1�\<�\[�}��/�x�(W��������.����vZc/�e�dpq������
�c�|QIY��)�����m�7�q��8P�3�.����U���[�b�7�E�����l
��1KC��f��F�J�-Bh����W��oV:���a~>�O�o/'W�T���,
�d|�$�������L%���r�2^.��`��jw���nn/&����7�������� �������$�B��3�A�l4�N����$gN���"���$��0�x�e��.r}7�N�$�,�ItT�	s��O��|�,f$�q��)�A�$��4�}��b��nv��!�b8h�K��}hI���QO�
�J�E)r���A��A�� �~z9��������$�����
�� 2��2��'��"�l���@Ar�D�����CG,L��h���asx��!IC���^���*��$i(`��<��/��L�uL��8�*��\���s�v�KD�h.no&������.���
z���{F������^{?�k����^����mj�&&��c�9.A��ve��8	qQF^�+����g	��M�
�^�dgEs����]h�O�������	4l�����M��qz���M���p|����r����*�m�l������A�5n?�.j���t� .�7��(���x��r�)L#�0��Lu���i�Yf�;h�P`{!�b��>��`\�Q���u]�=������Y �9��|sl�	��L>��J�%
���y(}��!f�S�A���T6�_��rYeS��?��T$�����jos���:v�����6���,��K�yok	�g�Ge��:��Q/|�F�?8�|������� �	u�!�&/p�z�p��%���wXP-oyj�j�X��of��Z���O�H�_����M������B��'n�a���?s�M�2dC�#~��+���l�etyM�W.����qV�8D�Hp�7�Ei��y9=a�yq(����Q<����Wex��U�_����}���������oz��}�B��1G�I�.
��)���]*e����7���v�]C����z�Zp��F�f��FW
R@��<r���}u�:;��0W&#�V�L���
v��'q�Oa�R�E+��
E*��M\��L&PQ<�LJ�� �����T�!������b��
���}b�X3���I����r���
$~�����7��!�ng@"�v�"|���}a�{MZ7m�Z�~�m��|`������	�P���r��W����w>�|�^Zz{����~�G����68�F�����(��%���)D���g?M�+� ��-������C_��J���4��%Y�������)���5|
������Dz��7_'��"������l��9���s��5���z�^�6���[j�,E*$M�^��b0P��B|�'����;��=�����������O'��Uck�es�V;>� >��Qc�=���V�
�� ��E�y�wPUj����TE�D�}�Px���
�rS%�]N��#��f"����iXg��,��u}|�f��8@��w�8�1;��P:0�H��?FA8G��2�0�~��wn�����r{����2�O�����v��Vt��YG��
|��4��U�s�6����
�K����#��a��h������cYA�Q����#����F/|s��L���N~CW��}
�q�O������m��Z��n�k���-V�B�����,�g�85��Ti<]M��7��x���S�Z��>2M����'$K��r�yu��x��� ���dU)_����:�N>��\6X	i����+��kA�]�s�V���#�$�#.��1�p����j�-M�����S>�f�]��<������F������������v:y��O�6����k���V���V��?���/���OCn�Q���4�|�>j�8����M�o��
��@��1�?}�������Z�W���N{��Om<�IA4�/�F�%��%~��I�~T��8�S;&����aszI
�F���*qh���������<i�4#��Z��C���
��y�Niz�(`�@�I���+���0��%���KX-�X��
��O���h����1������>G>���E�/�k����P�Oq7W� -�x���N���%��$��S�}��w���S���]���/]�R�,�������i��X>�oJ���;�E|�,�����)S�J��\���=�������'Zv���3���	?T�-��� �����Y����!���#����-���(�����")&�7�{��:n��-�I��c/��1K<�u���p:i+!�s�Z�(!)4��$hZk�\:2������iLn�Nl
^�#�����_��IHn����@_���)x+*�`R�!����Ql����'L�"6:��v���5m`����$j�/e�xXnBO��
�y���)"�<�*����mpQC��"*��3D��\��,��:nD�z�7/�<XZ�Ik���	�4���62�p��;�J|�X��BW��/���.x��e[fy�<�V4��������t��	F�:�@+D�n
�+������`�� |�����%_��CHt�������{+7������}�(8KMN�=�Y=D����1��8t7J��h<��a��o@w��a����H�s��/|���%#d�;vfr�=da`�Y���tZRzYH�Z2C�������R��a{e���'+������{}��#>�#>�"&��� c���d�N�� �CC�f<^�_h���R�
G��u�BPNG�U���������4w��_�
;�BX�����Tt���.9���64����g��b���Ua����xh;�.�D�������\�#(4%�3�M���o�H$q��b���a���Y}
�,A��O�x<�>�V-�"������z����p����Md�������O�8ki��6z�0��K���TP MGW�U�;���K�D�[9�us�����V��:��1���]�O��N3o
X�'��!����A:���iMH�4�~4D��P��z�+B#�B�F�=����m�Po������	�����A;�����0F������9�t���d�Wk�.��Xn\A��')s\fe�O`}������v��1�Y+��r��:Q��@�)@9�Z�ZBWfF�r�Rz�[%�I��0�_���yO�x��l_d�`��p����i
2�{���Z �������GK�J������A�����d~sK=n��6m�7���e�� �/��!l��8)Yx�E ��B?h�2%�wz��)c�����Nm''�Xb�-�9mS�35n��`��|��kC))�:f\�~"�����X&%��OF���d�jOYDC�W�q��:=v��?v�d���������B�KrB$FX*�����{tr�f1�?��h�Mv���pyvr�N>�j�R��&��4N�9v�r���=�i�b@��m��D�D��;����!�����<b`G@V R��<�0�#���1CmM�/U����"(��^�����b�#��������E8���[��-~�w#_3iE�q��������
�i���%��{�"�����Y���4��j���t��"`�
���}1����S]��y�Wo���S�5�V,���CP@oE��V+�^[�����_��<��F�_GM���+�m�����Y(���DF���u�W^��]��Vy�*�\7Y���s]����w����,���E����|E�a�A���j2KSDA�>��]X����"qTX�|�y�m$�~�c[U�p1#�m�G����=1�~��@����L
}~,��uww*���7��$p��
*
�Q�o�����	jC�+'7�����V���_Mxr}�$F����~��o~su��)�LgG����@��,j�.�	�Oi�`#j�����������V�]�(a��JR�]Q�
x�V����+Q���5<�8���S���"q�5CV��&�X�'}�S��|~��)���p��?]3[��v�"���Q��*���@��;;[y(����RX�K
���W�������^�����z�K���_�Gn�7v�i~R �����C^7���,���_��#N9$W��9����O��-�1�����=��ki8'�(.[~�G��/S�4d�e�
pY��d|$�U������&���yu��2�+�_z�T���d~D����42�i��|��jj�-�@�w�}�����aC���wM,@�w��f{�a�.��3�t<>�Co>l�^�j$�H���|��FE6��-����� ����e�s���4�9X��4���$jO3�&*k�7����f<�&��T�|e�b_=��{
�Z^Y!*���l������6E=��qU��U\��;o?�^G?�~�\����;+���&|�8k�	p�|[:~�����a���������`Waw������`�N'�-�-H~%�9x_��B�S4���������?K��v���,����p/=9}��
f���?�Zb]�7�&�T1�L]d�q���m�������wiX���F�s�E�^�E��g��M��m�|����mi����
�;,�������[���E�����G-�N����#B�^ ������������q]I�)}�����
@�}M'-�I�Pc�	��%��%�aBC
��������_�s�P/�S�6�������=��#����������=��	5�����X����:M�ptB���S��HS��c�[J����I��k���"�]g�����������"���I��M0^���%��K�0��mm�o�wv������`���^���D�}yw[&��%��g:fL�%x����G=� �[����Y��)�-����*��_m���O�����Eo�
D
#����_���c�J�Q>��n�������]�4����Y���-9�v��Q�����4��D�)�4���^��#
x�!���n��N���,��5��P6��p�������<�eS�
�t��=:�Y<6�K�k"�Ja/���0�Dikb���6a���O�q����N�MHC���p������t�������r>��4��K��t�.w\��kn2�!y�0�����|��!Q/_d��k��@���v���l2��^}���Y��/f
�}��062=�pM3�*�RC���ax0�!�l�5U�CB���<����1��1Wco�7��&#��:��8 1m>�gMKW	�AwA_����o���B*��sN��|��*KI.��Y9��^��?c�������Y_�Z�a���/�v�&XA8���41Yt�Pfx�� �8v..0��� 5�J2h������g���^3�O8�D��V\M���=0WAb�����[k/{�����_�����!u��!^y��u
kD?|x��s�==?�S��~H<�@ek�Z���9T����}���>x���-�������$RO������4��n�����m[r��7�'I�J���/m��#;�9f?1Ie����UI�@������p�/�a�2�4����K����B���S��d{��4������V��-4��&�2�V�q��k���,��t���w���������kT�4����lHE�{K�<]�>J�e���%~�	@�� �D��')|8;���N���\E��Gg�~���Ks�!��>�Z��I�<�
i�����`w�lw�����'W6�L������v���FNbV�D��rC�W6��,6j�j�T�7����7)��g`^K���a�)�9��uW4f�T��:��S����1��e*q�/��<� 7�����W�|i�+��o
�����_r��������D��!�q|��x��S����H���TP��M��o�����:�V�2�uq�W�Z(�"��.���k�/y�������nmr,5��;�>�O'�o.j�$�`_���KO�%P������:��E�Zg�A)������'9�WH�W�ly�7����������O�����
Sk�35��S���P�����NE�T8T��L�I�SL�������w>�lk5�w9�"��?��'��A������C{����������r�-z���J�X�
�����b ���bL�N��b:�OZRf�9�I�_7����0���6ZL7�s
���,e�=wpgfH�|�-�$�&��)��#�M)K�aCG�M,��}�I�0����N�%r����,�������@���g?q4�Y=�t��@Ss����O��g	�lMgr��]l���n����!��|����$U�L�����m�8�
�A���
u#l�~�N��yi%�����#�����3�y�9���|p!��\w������Q���e��a���Rv��Pr�����;���s��h�d�����0�j�N���L����e���m0|-8?(;���L�
2�����F;�Io�^
wY+�f����X�
���
���������6��~�`=Q�7�S�x�<U��1O����|��^�e�=E�p�SF�
�F�,���<+�m��)7���f��?Ry��&<f���k2%t�����gp�j
?�������m���<G�����6[u`���1[����p���\v�y�c��MK��6b}s�����g���C^�8��M0`�(4��d��a������}������������q�!Q���^T���
��^T���K�����=��6mA3�g=��~���j�$9��l�����
�nV��^���:�)(c�0�m?R}pk��+�������D��W=i�����T�;`��w9wf$����&_uw�w��	���T"��@��$�R��q�K��+��i;��LC-�NN�Um��C
~L�8I������Iu��������Y��HEf�n1�F-_�Z,�G��������XQ�)�,k��,'�x�p����rj ����(�����y#<>Bf7CjG}^v������Q�8IW�vGB���L�3�&&�`��9"����(��"�R�����IK}���@u�/��;<9S� ��m�;;g��9�k(���K�iz��������[.
�x����.s������op
tN�0[�I!�DC�F��xC"{�
�|Au�[�#�������m�"����&cK�\�iw�A��{����X�]���t����!ebH7��WZK���S��������/�p�!���(34j�D!�'������c?�]L���b��,���)D��,����5���;CA���k�(���/��L:�	����EaDcL�i�%E�7f�Gj�:�5S�8��3�E��,"s�TD��Y�dd�k9E�da��+�l2�U����!V%fu{����
n�<I&�n������R��|DGV�q9����k���?n�t?�����\:YN%����������{C
�jNa��P�o����{��z��#�o�p�
W�O��(���������a�4c�[�b!?c�5�������VB$���C�i�6qV.��T~�[������o<�7j/��Q�����Z����
�'�%q��:�b9MO��������0��O��KZ�����%��F[�:~��0rL�!������Yw�<��$g��#rO�?��v��V��m����6��K�ba�U�j����M�O���X���O	����]�C
Oi{�����$y6�k1���oS���
J9��
_c��1vso�!`���kgn>�ap�[��e��f��������y�i��sJ.{�g����#���Sf�O��WK��|U�����������"���F�����M��`^�$�{��i��F���������)���w]C����M~Q�\��;��x B�9��qAW�B�qH5�>�3�
���Y	�l4O���+�j3��a�D"���1OHjD�Z��D|G�~{��S:��#f���6���9pl
aeK�	�U7R��\��D�J7�+s�\�������(�
�\���4o'�;������c�!:tr����P���ML=�9�`n-pot���0�9���c�;5Xl��;�V�����,��c���TK���i
��m�����Z�}:��t�����c�6��(A�����l�xd8�L���!�%�'A�6��B�ESf*���_�Q?l��h�!�[%/�7��(N����f���&4��a�����uy����
O#�h��@�O��dJXv����{��f{a)Kf��M�-f������u�y��|�-6��L���%w�z��DsM��l_�/�'3J��H��+�Z
o==�%�,���
u��M�f����[2=]++���E���!J���!!�=�����I8������Mf({�)l0W V��t��Rw���],XN	a����S�����#������)2<�n'3�-1}�"�AA
�L���?F��U����6����,u9�����L<k�}2�����@��n�e]�c@����>�1���rX��x�WF0���F!H�3`j�&�@�����h����>�'>-�]d�$���n#{��3x&��Pe�H�-���V(��L�T
��i2�I�������L�}�>�/�r��f��S�2�:6hO��CT��V�X��#�D�����|\qg8�J����gA*Ec�FZ'��Ki�?!�D��=O����rMJ�)�����������=�.8���<[�c^p��A��6]m�6-��q<�Q��M]������������.5�/�\h�	�$�s���>?/�6o�x;;�����F��#����?1K��iO��f%���p���C�p���>���+c��2��0���}Jk�u����2*9�6������<F�H�LCso���:�7'X������o G���y6�g���-/����v��(�h.N�&Do��$H�&����O�bJ���
���0m�FN�%-y#�����.�;����0<�cv�K
:����1��k��m��s��[�ZO�Y�V���}����������~����djJ���o�j�e}>T�6��!���@�"�1��P��OH����[�
��A������O�'{0�)(%� ��[��K������dj�h��?�]�N���Y��;�agj>d�����I0bh�g%��}b �+����������4]��)��P����y,,�A�ob0?���&�+j��a�r�hKw�	��f2\d�:�������E�
%��������t��|���������|�F��6�A�f2��0�~�����}�:��������u��:��d��Be1J?&�k
�,m_��2�eJ�f1g��L��)��y�{��w`W��B�IM�a�2S^����� �L���`��&P�
��b��t
������w%��P��
����b��{w���W��n�����|�u������i��<F�z�'T�<�D"���j�������V2�}����"�.k8�����&��\�3��e~��9$���������\� �s�����E�V6��n��b��Ub0�:��
�6$�P$+"�"*|���*�(=T�u{ZYP��Ap���bY3;+^ �@L�w���h��y<
�"3���Ca&���n���?�V#TO����
h#>��w��}�b���\]���X���'C��r������K�:�6��A��9�,V�,�@�#4�63b{_&�[�
�����.�i_�����u1�����������&���x�.6��������Xi��Q�	���������-������+c�f�G���1D5��&��m��Y�{���F1���
Y�5������}b{2�]'�za=1b�X��tN� ���a���������D���63�`0�@T�����.tM��nlC��F�1M������`K
��s"�����������g[(��$�����mp����s�$�a�KS���%:p�hi9`e�f����21��I�(e��!��V��jB���%�T+�ToB�^�'��bdf�#a�-������r6�d����tjj�/3�\�J�R�CL!5d��B6�N+zo�O�q:�=��!���B�]���f��.�!�~7�}�=���[i4,S�8�1O"����3��
�O\(V���h�y�~k
N#�I4T�(���}������� %7������Lcv2������G��-������A��[���8e���w���_������!�iw�a��:�����x�Y	������pa0�����;(�To����>�^@���M���Q����K,@U6?����k
�Q.�������l4�C�5b�	!nT?�E���6_��iD9������E>�BB������������a@��*N����qQ�p2#����i���5����|�8�'=�<�VXs�9[#�c��Re����4���X&�tC��c����7T����@��%7������u��\��+��|G~�|�X4�����%������]$I����`����X[:Z��?��e�6u��P3�T1��|Ro��t>V���F�u_TX�V�����|�.m�+�H"����A�=j��������N�����S��M����c�Ur
�6�sE��$��-K�>�Q����@W�0���
�M��a��VC+1oLo<5�s����b�����s��8��$Pp8$��/7�U���Q;oqXW�P�{��9k�����5��BK��%g��^Eol1}d=t���O������ /�+uo�[I�,����F��1����5�[9y�Y������������o�a8��r�����OeH���_``�	�ml���"�wF���������h��8{�o��1i3�"z�4T�|�����N��$b�Eu3��]W|�
�S�3�J>I�).���1�e5�\�b���d�J].���z�UbV(:�{��L�������������;���V/��� +d���U������Jm�
U���'3��W7�������k�=�x�hD�[��BY�m�*��f��*3�����;��u��	|��:����\D�"V����m1'8b�4CYL��@�����g|rl��cv})�����sTG�����3#�M�%����L�(�Nz���Y�X^%�S��+ �.=��f�n���li�&��K��.4�{"R;+9��[��D�P���K/��K���X�����fnx�WzL��`�~S��N� ��m���.��3U��[�zS��VV�}6��z?��Gy����o��@������Q�f����2=�H������&;d|��A5flC�,�t&�����0��J��!�1�
U�p� ���
Fd�So&�"3��:��/�^hu�k��>��9������������egn�2�yz��JI(�T�/'W�H(�Za|*B��3�$��V7��)��������i��0)��k��8��Jrj�g���ay ��&�~��5�3AS��6r��U��Kdr�[kL))�%?S��9���g��."7B�la����Cj6W�dA�n���YUI�vQk�
,��Q��r+��Z�C����	-�3�H-�$�pS�\��3)�T
d�Q�2��z*�����d�U�a/�=)�M���]��
�E��q��\�1q����[=�8�-����(�(sZH�Iiq��1��b�:�m��B1������1�fJ�����68������N���R
�����dE����	�7�3���*w�9G�o05�!M��pI�gV1�����5*>��>h�,�v z���A~��{�Sq9O�h������y���6��>�m.���4�x)>��9���e��s������#A|c�$�<6/�� �AT�u�3G�@�G�{qf �\��~v�����:`���_V���������dQLa���������S |����,?1������p?��:�����Bv
�������kKiCK��n��v��Z��y���K�V#��K6���}j�����Z�.P�yb���mT"F����>��>�j��
���w��od��Zz�Q,u�bhL#Gm��c�s;pF!A	����������
Ye����{��Y��k�X��=���)���A�Qf�G
�'yc���7�T�R����ir{�n��x��$�o���H����a���4��e��;gH8r}���NTM��I�g�y��^'W�������7�9��C��u(^��ZU������;����'}�_����Q��,�S���6���[�3c�]��u�����1r)	�'348�v6i�Rw=P)c`���[�����fcg��s�_�G���;��I���p��[�)��8QN$���K���2�-"��2�w�����m�:�|�q�������{d�f�SO����pC�c8	��D��X�����U��<�)xjnG(A�#�����i�(�U���^��q�{^��-���B�"g�"��1(��`�Ua��x�8��BK0���w��b"~-fWpc���qsU������gN����������l�H���z>rf �b��:��T��u��N��S�U�$�}ld�w�����o�l[��������E��`:v�C��|��!�*�Oar*S���*�V��q�}���1Xu�^{������y����`#&XCG���-
o��3�^�a�"��vO����N��$��!�n�R�7�_�[��0��FF��c-v�Gj�(��_�.�]�>�
������-Iw��G������Q2#�Z�����RD^<*���=A�E��c��_A����@"[�0��:L,?�����@�����E:&�����{P|..�,d�2Q�U�EC���O�De�j�X��93	7���d��r�d���6�1�,�dG�)������`}�-.����
!�����>w"O����/��3���-p�+�!�%�w�-�,*�����'}����E!��6);7����l��fe�;��A���W�c�����o��}�[���j�6�Y�B�,�1p��}VZ[0��9In�\JcK�|�l���V/W���������
�-���L5����BD[�1�k9)��~����N�.����O���>��"��7�b~�~pV�����%c���[(e��t�����2���p%�� k}}4���S<�[>�z�E���6���d��Y�C�}v�yy���(wF�����N�-w6	��	
�����2Gk����cQ.���#�|x�B�_���o���7�?tOQ,5������[d�|t'�SL�����Qv�����l��0����u_�1�=!��0������u\<��:~h*�i�YBV���z1�vt�~������*!�������E�
x�4�k�<������s����GV4V���`e.v" ����%���2�!v��$�^�.�%�i���j��I���i�;=�%�LTf��7\���EQ�bO��,�l����0���
�z$���Y��Qc0�f����F���aQ*�b0���������x�@v��!�[)�?��@�G�(�v�#�YC|^���
��Q	����w3u��Zf"ihV��a���k�,}�F���}=C{��Qz�8H�X2�H����"�����v@r�������GG@��M�-�
[�9�?�P��.��'m0I�A.9�"����p���r3���Y1`���V=�f����H�����6��!�h��0�KB�_�1�X���m/>�@�p����t��&-��`������#�')
4����K��8]�5�Gs���J=��o�j%�a��"���5�X�jk���2�D,Q���k�\�m_�xY���8-[�i�$������x�V,��,|���\�������]���n��W�?|�s4 \���9�gP`xV�{(����C��A��	NL��Z���+.�`�������dml�Xv�M/���K�j e1��6��&?�S���B�|�"���!�����3��L��F���"(Hd�=����E}�hCz�_��8l� ��Dz�V���%�5���.��}T}V�#��
���N2;���rH��u�1'���$�7��@��}�
�8���D�[+�f�K����c�
_e����6�����
���\sS�Y��I����V���'EF#��}y���F2�5,��:0���p"�N��.����G��!�������=��PZ��QK/s"�
��s�-Tfr-~�L_�)���� �q3��~~�����+6��v��m���nO{����Y�����td4E��J�vB����F0��k6�?s���=�
��L��y%�&� �'(�h4�1�&� %�H&+!k���#Z&��/q���_��A��
�:V���Pw5��|:��'��g��G0�XH)vd���<�P$r����-��2M� "�b�,���DM�z5�f{��w���}����hF�2����N������m2KAPg'��R��(�hnf��<TI��������T�y�mtq&�Pa���-���S5����$_)�'����Y��+1pq;�!�Q��N����i����Q��z��P+�_Q���)hh~6,�����e������/q�e,����������~=L}��Q�A�} �R�p������{0-�Y��h}ow�A
��4�������b�m��^.T0���$ ��w�4 v�i�M�����T������h�m���fY�I�x��],J�3�?$�F�Rg�Q�`	���`^_�cL{��y�2�
����U��o�w��|-sV:i��f�M���E��d3�O��pUez��f��cq��}O��-�<[[ ��N$��f�NM�X�����6�a��6f�T�P_!=�_`�^�j$�JN�9��\]��\����-���v����${�Z�������f�� ��0>�����Q�O��4�d�����E�W!�������sx��N��;�����>\^v��Oi�J2apw���Y���l6����.�������t�e��Hh��@N�@����WANDZ�G�~v�b|�<��(ix0B����&
K�#�~��SQ����������	X�CHa����eG� a[�6�sh��X����������>���e(��zy�}
oB�n�Y8����~<����BA�#��y�w_�J�F����AL�~}r,fGW������ zV���J(r��O��n�������F{�+L�sGF	�����������Nlx������P���}f�_%��������)>4��w�u��%%����1������+8�w�c�W+�<Y�ye1����"s�>V�>�3�J��c�S���r��5�ym����<��E#�!���(���"z�3��"�HD&R�������DQ�(�����*dv�6W*3��%���=��a:s���&�����C~�^J����e1���il~�����v�Wu���u~������<v��H��`73�b�1�d�Ge�Z���i�N|�S���Ma���1}3�u�#��7Q�NV"B���Uw�U2=�6Of���*��ue�Kb��+�8�����;S�1)�c��P�4����w��L���J$))��������1o>?3I�DEb�S�wB00d�oF��Q<=S�R��2�������M���q��v�)�1w��r����>�Q�^���C%���3�'���;���A
����LD��D��E��zpp�&z��im7�;JH�X�����/����b�D��86+_��_�&�&A:#x~{�9|����T#��G3�n�.����M�A��4�1��^�)mX��$��8=��v��I����U������:��
I_,0���T�����P+;�z�^������EgU���JT��E��S�4e���}����~������N��+�Y�g%3��i��J>���!���%C�~	���X�{��-�'���(��O��=;:q������<#*t�O�@�B��t�o����fsgk���
�����Y"�)d�"3
���	!05��k��o?�]���u/�]�C'Q��a-�[�\�'�.�
��c�$�@��4A�dr�n8�Rd��8)X9����O�xV2%����y�ypr���	��1����|f65���r�0�g|��
)�7d]K���1W?`Q�O�i���qYb;����k�c1�ELyq�����9_�0��
QX�'
�=4�It}`J2��J���P�u���<
a��G5HK2�����X�A&:��Zfsar���XCn�V�l2w�m��+Q>�Ev������1�A�������nu]6uq����^��i����'��Ty��6���'g���Z��&5zE/��������j����
���l�k��*mR%���?��-��t_���1�s2����~WW�43�y�8??��P��G�Ax�J��NP���L&�B�N6= ��2��q�������P��E,N��~����L��@_m��_�*�~F���R!�\�}�!��8;�
~:�)�A�Y�mtuM&�X��*hi��u��I��������1.L���}q���pyf�Q�����*J�2���M�D��r(q_�^������B���b&���
s�K���8dT�����U�v�%(U�3���[��z���s�C���$����~l]u��W#(U���@���q�_i=������X|���J�ldg��Q������$��������m�0��#)VA�u���|WX<������-#y��jo�����Ue�h�7c���}�N�$��~G��/I����"k�5Bz���L;[�U$= �%�����[���)���A�q��Eo�=� �6���+_N�	��O#m�l*@�}"�<��ad��0�����4��gwI\�=��{��@������^�������BX2/�7pp��m�j�i��X���g}���D�Y�p�o�a1�4��7�a�t(��P���]������Aw����C� �U
���}E\�^soEl���l�����V{g{X-�����|	v�8h��M?I�M�=3�.	�P�jK���
��5�:��YyIj�d<����v�(���[���Q�6V|�����_�xa�^���u���Mv�?�\DP�#��l����n�ln��7���&�XM.D������G\��'���HP7�aq4K���[�M����5�<KF�z�#�Rr*�l�V�Z�	$2u2i��-�����M1��<�����vOX�07�����xt)�O_�&�Zf��/�Q��o����sJ,n��2�?z�~<��m6��[�����Q�J�)-G�dw�v	�0x�����x�rR�FSW�g���7�<�&%B��"��e�0�������m/](�
U�������
�N��S�l��m���\��x+k�������fs'���[K�1�_��T�9��}"�������Sx
��i�g�����`fQ�.O�����2�%Hf�R ��D���"�8��LFG�9i�����,@���2�rr�(y�8����.v��[��F��?Kr�����&R��.^r��eM?LDC�S����M�Nk��N-7����,7�����#^��At��OL��+#U1���d��i�c��I
�VKaq�p�+��}[�V�z��T�F�y�L[?���8x�e8���q����0�'��C���9lm�����N�5�[���&�SW���{�M�_:�^��9ST��g�z�"�v��p'z�"b����x25�� �6V��C�kBt�����y:n���I�t%��O�D?J}����k�0�^��>p>#������c����}�Bu����������+6��U���"V�RRos�+'3���l20�k`�E�I������������~5������������%���=��.�	v
�\�zi;��~HgwFTHL�/�U�u���0���G_�R�1��������j%k���.m|7����z�+.�������S1Dq}(�����Z
�G��R"#�p��������i�r^�cz ����!(��]	_���`a?D+�8�<�F/�s���;�)������N[���!�'q���b2c�6
���Y6��k���O,����{^Q,�f$��M�&���h��;��������g��dm��e2k��5vu�NVn�{�������QIq���"
Z@_����z������k9��S[	���yM=��x�f>\^w^'P���{���1��>�"���?F�:��;���T,������>U�Z�\C������f�����(K��H����>f��?�����t�H�����������h����DI��V"�����o;0����)�l��~z������7�)�U��&9\����C�xH��%����������?����8����m��IB������]�W�/�'�8�R�`� X������e��1�n�$�{���������4�;{�0�mm}�D����3�A���������ssg��N���5�O���EIu&#6�� ��g���xgZ�c�bB�#u�`4J36������+�]4�]Y�f)\�?D��Bd/{��>w���{�)��H�7B�����gpm��qm���������pl^7�x�k�%ZDAJ8���n��mQ���.�y�����w���������o[wR�F�,Y���=����t{�M�@WU���m����#�4�h�pj�! ^%�������6��f���g��p���4s�e�����Uip'�KD_�}y�,�����qk���LY8v.��5��m�1gG&�K�|�Nb�K����:�&���_.NO��o�/�^w�;��5cf�,��[�<hJDb��3��=��C������p����z���c
KG}\kD�G�`��zJJ�6Eoon����
U~E0����D�������N||���/�O��5�DQ���o����r8xP��"i���V���������;��2w�&�e_a�>��
Y8K����q j��%�����w��V�����<����6�:�o����B����x/����p2���m����GD���K(].��0�]��K3��0_:�>��g����/���A=���(|����`�CZT��1���_)��(�h�",6�wQ�~e�{�i���t4��>kot%Aa��c��<�[�����
�]��<df$!�(��6H��G'*5���D��/S��Pq2H����A��e��RG\�FQI\V�1�6��9e���w�=�-
��m�C��������z��#Y��
F$�k�
�p�G�C����wk�'�#���1���h�_f3u���dK������d�p,@:�88��7p~�3��K�?����������u8�D�{��dg�!�\���w�����^8!t�J�tD��v���"�SJcX��f
9�Y��!F2�=�P!L�������C�!�<���+��@p)���*H�^��Rs���*>9��qz�eOX"}�e��=%�S?�q^��A�v2���'���k���m�#D.q���+��d����v���8�r��
���?`V�.Gt>��Q���H�b�I��{[�������[��h#O�-Fa��0o����R���9[l�f���^So�D�G��J�'R}b������]DQ� .��k�&���=*:[6IP�����+�"�2���Y�Fr���(�n��,7N!��?}���d��b�h�����6a�����2�Rf|����.���J��p�e�,������g��Fhna��`T��+j'�K��M`�x�(��>��Y��;��!&��sq�_������������H�/4B��>`a��G��?������1��Fn�?�h�K�W�^���B��G�V�+���~B��#�S��Q,�,�(�����3
K��t!���z]@{�G���M�t���p^�lu�+�����A>q���
9���jx�v���g]6S� ���v����cL����P�4��Cz��'���O)$����,.bkj�@��@:�d���<�J)�����.*��s\24�h�64�H�+I��e��`%j5�]C�KN���vT�:��	���2>�g����;
?�*[���p��Pr�}�"���KD���I&�������
R������E��	E���P����}������p}���?'
��,e�&%	@3|�gbS�0��<qp$��d���~�@Q�*rE6�y<~�
�$^�s�h�����i��%yHQ��b�E�&J!�d�0zkz����5�����H��x�b���5����(���I�<�3��d#7@�Y���=rl�`��(q�y�%�F8�a�$�i"y�~�����3�q����T�/��9�����K�%�K�~�9VF�
��D���x��K�%�H��c����k^����q���&�H��K��~8������f��P���a�u������/W�����){o�E(ah}xm�Kf�F�!�U��C3�����xw�3H>�K�.������C���hc���j�����'��.F8�OW�
��]i-�K<��,+�t����gT#��m-7;�YY|��Xw�����Z�`&
F��)�/���=�1��"7j�
D
z��53L�I'S:~�v����)����#��6���g
�F����5"�J%��� ��f�����e�/�hl��}�Vo���K�F����5����j��:^���e����<��y!�3��d��'W�����*w|��=N��$��D3�E�{s
`��*���������?�JA���
�4��j�i�Fy�K�*�����^C�4�]���
�0N��i���1����s!h~.Z���&��!p��3���k�&S�9�,���rVSe��CE������g	���z�jZT
1�)���4���3Ts;PH��#^@"y���)���<6G`�0�9�i�\���#lQ�M�F�#_K�nlX�^�O}�6]!�����9�MI��
>�T�>���$��-m��]�M�����<�\�f?rv2��
��.�f<���B�m�u	jd4����K�s���s�v~�V6�P��*���S��B�5Md��Z���AZ?M��:S�#�����}�m,
G'
P*�����hX��6���[BC
�b����k�:����.��wg��������'r�����<�t�]-�N"��G����������N����{�������s\w�gv�����,o��$�����5��*3�E���O���q���&�5?����_�`�f����-�Pk~G����0���c���k���n+�O�L���fm��E�&s���kE�hr#KEvl�
<���CZs��l"{bTjdl�V�*�#M* ������	rK�Q��o��E��7l��U=q��R��b�����d���K\��~����3�A$������r�h~7�eu���
 ]�	o4v��	���`���=�0�[.%d��9R>���gQ��L5G���N�=U\������O��`��'Vh���"E����_��b������{����,p!�f�f�)��iB]M�03{���5��*%��B���<xIn��S�I;B"9c$�Va>�f�t�������}(C�?�*�;���)��&�X��2NVJ.�9M!�PR��b7i#f�'�i_6(
�`/f�0%���P�%�|���pO?I�v���t ��������=��k��f�����)|"?��X�UXD4�9g��J�svB������|l��G�kN�� LOp����R��(�E�����Y�����
B^����x8���U%E��ap�����@x��	7\�ItCi��k�3iy������-$�;��q��iz���@,4����ot/M	���8��d	����?������c�.8pzNi�XFT����AM��>�p�s����H�dC�$h]"�
#�l�F����������)m0��p<�j'�x���2rm��9Iaj�$��C.����"'��|6(�6��d�h�
�e��������{qy~�1,\�}���%9�2�RK�����}g�CR��<D�N�p�?��eG�M���f��M'#&��)�0�����tH���2��I.h�\�������W���9����r%���c�-��8QC���L@<�,
YJh���B�����dj�U�esu:g��[Bion�H2���^��4�����c����J$��9s~�ak��RH<(.�����'3	���{���tj��zNW�L�(��e5�V��f�{W�ZBdH��Ag-(�0��FiQg8���-5���S�������@8���M,��^�c?�_��U���L��^�h���9�L3� k���}HZgN7�n�Z������o��?g����B�Vj|PW� gmf����T�B��h��y�Y�$�M�lA�����	{FT�gd�5���I��=Zd�(b��}�Wg��z���m1x�W(��M���O������^�'#h�z�(�&y�;���>Fy������a.�
?<-0S����a�u����C�O��Kl�s�o�u�E�
��uY��
����sX(��x-�t���HN�R�>��J?�#TX=Z����aC5)_Q��*EW�{�O�P�0%��� D�k�#$3o���w�L����J������<����(B��w�bTR��kG��iG���"��m���Q6^_�G�-�`�i���h��4@��=Z2u>J�hc�*I�$Q%�?��T�cx��i�n��TWy�UQy�HqT�/VQ}��)�8�{���k��`���}�����P�gl1=R���7���3?a�t(��c�w�0U�oA�z��^h��O!����.�i2�z�"�i	k�T�4B��D#���R�)a��K��m�Mr��4�Y0G�5m��������~6�eE��P8�ap�E��@�C}�|��?����H*b�b���������F�r��}"����H���}��Q�!�'���X`U< �k�9�&����B��Y�!�k��f�(��'�2��L���P���p+�T�
��-�b���n�������7KZ���/�+�,S�6�wB�����:C�P���K��Z�<�V�x
1����T�z����0�o�]�VYG6GV���|���j
OE����0@��F�	���}+��,� �t2p��g7lh��n.>z��!�:�",%A���V����i����%�(r�,����d����dl��D0��aYBoxV�ze[X2+m$��r�����+��g�#i�'��*B����Z_8����l#��zr4��� ��b�l%1VK�V�F��c�EVYB���1�S.P�����V9���������o/I����aa����;���C:���hm���W3��6o�(����ALY��R�5�R_X	������{��������b4���`xl�0I ����w�<4a0��0�4;J\:�b�D���B��������
��
������^�������ZY�������3H�Z����ET�:�krAA� �����O<��o�:9f��.y����O��E%�%I��k�5�6��,�()���v�
D|�������z����:��%YC���4L�.o����Q�*�`��H	LJ35n���1��a��$�WNY����'vuN�K����������BR��Ix�#;Ms��G���C�9DR�7':�f�b�Cs����l*����\X�����!*N70��{��������d)��|�W?Gn�X����{�5'����������������_}+^�N4�jw	�d�����LSs
�[�X���6z�g�c����d�*1{9��Eag�������|��M�'���b��"*T��y���j��)B���/�����O����O'����l4K{mF�i�m����-��������P�d

�%9\i�Pp<�Tm*
d����������%�P1"��rGd3��
�:;�0��6��n������!h��j�P"'�p���g�dv�Isg����k$�@����LTG��bXy�����5���������%G#����!6xCf�j�U�sZ1b�m�O�d9���X�{�HK��rN!Cw��	�@�z�����<����p��n% �a�,�9�c�J�'�c�����r��?�67IH�P���Y|����O��c��QJ�Q`d�:,>,��C�?f{��n}7@��ASSTy������-�~�y��y���W\x�xTy.)O��C���8��@�M���8����ET]�We�Vv�"��6��U�^��������^_��Dd�y|��J_y+���CvF3�P�3�P��8�P�����DrT+�����M^����6T�����1��yk�Ci�������U�v<b�r��zq�a�����E��=��A���w�ssI�
7�p�C��	�s>wI-�`��/H"�t2G�p�]@���j���<<��Sy�`7����Lu��`��#8����k0.^o
`�m�JJBs�7s����]�-O[���<���u���
^p�q�6e����=+��va�F>���&}�C��=.� CC�]+���2�����UJ�f��u�g���)"����W�i0���)����@'�1���d���������!��)���Q�,E,���a�%z���M�M|�s\+��	��L}
cq|4|�6��YL�s�
c�+�dA�kgl���B�8ust;����>o�P>�>�S��������I�K�p
:����sjD�a��}���7��8�l9�F��1�� �L��i�����f���s<�I�
�K��?�{ld�55;p26l�#�����������_���u�C�
 �
������p��
�&k09��
f�����Y
�s#�V�%��)����k;��� %�P��'��W�:mX�Qk��>����?9��JU���R�/V>��xK��|���@I�������<@���o�Mf�k�?K9u����G5��j�l&V��$:���bk���YNv�k���gs^S�����\jf�����]�)��3u��[��5W�(xC���%u��G_3�Qe����}^�?t�r����bp�<O+�Oh���������)=?�R1�29V��Q�P�9�;�!>��1"�ot~��g^�
xo�d�l�4���!����g�
�6�8�I�_
��_�_�uJ�0U���R�����)���?�
�������J�5��dj
�	��r�P�G��W7�-Z��n5�K�F
�,_���)$�hj�r����$��E#[�3������	m e�Hf�@������<@���~��6�W�'�v�I�,$j
�����d���"�HC��Ru������q���d��HuT��Ar�q�F8[��2�s#P���`c5E8�%*��!}`�&�i�m_��L�o��Z�	�����
�@	2���!��,�%�CF�6fr�X7��+<�q���)'_����7���y�) ��5>�����L'��|T��LF��1��1�c�G��p���QCP�
 ��H`F�m��D�y��t��M�M~��8�9��* P*n9��b�M�)�);�B#�"��g���<a�	M=+���^�7��,��P���-��h!Z���������.On���&��}���
�� ���oY�XN����tw�~LJ���c%�p���)M��7��\��q2�xW�4��i��STl�p���w�	��c2���U(�#+0�[1N�R_D"��lo�
Ra�#�����+5��,8gt�
u����g��gQG�6���HO����0{W���6�o���������������7������<�����!Zt) �=B^�t-����
#��1���q'�l=Z���F���z������6rx�(P]�_��jM3�0�|�)�����s^9��M���(��
)�T~c/����^D'H�V�E]�b�%S�l:Vh����d�|q���G��rE|��>�TC�����}��s��6���|��������<����i3�>��x��As>n�K,(8(��tCsx61k~|v�)a=�z��O�l�"��Y��7���ct�����Vk�����l!R�fa�����i��s���&� &�>���avQ��b�Z�<"��S ��������/�����q�/u��m+���y9J��S�
}#�a��/]����W���
'�;q��!��bs����!Zg)�
N�2).����A��	��x8!F���������@w\Y��V
%�6<J�jf�x�fJ��a{��������.�k�ip28��X!<�Yg~1G�]2��]:������u�����*�/�O�OO���tr~J�{��T�H*:���S�����������8O�m�g"���Q� sI��r{�d�f!SK��q�R����Z�$�\&���Ib�� {���, =[8�#���T��(�(�&z}����4�]�+����]LA��w�"�\�f��������z9Z���/�o�<=9�D���f��9�����%&:���������YT��h<m��������&[�rbl��j��v?M��\����u&�/O���\v��f�v�~<<{�Yx:|tB��/�<%�Ip�%�Q��E/KVzd�� i.;�D�%�����^8}b?��o����s#�!q����h
K�����~4]��q*�3��6�Ph*�T��l��Y{C��z�zI��q���[Gnv�=Q/v�j�A|��ON��rW$�C[�,������?�g����'����{p��c0��,� w'�E�C�e��CW��nfk03S��,I��i]n1��`rr�Ugu�2�eI���%[��������2�����|�4C���j��l'�<G)v,�r#�f� D��G_�����L�4�`�rk���fh���#�h���������}�1/�]1����Z��F+�)Fv����fZ��3��{�;�;���3�j3�::��s�IT=�eaB-
��h���c�����\_w�#�$�*�{�[yK�������a�	����%v�.8@[!����S���\ �!��C�U���P}J��������ytL{�gY�3��C�p�RJ�3K�s'��k+nyuH)K��Dkf�����r���	�J�����K��r�>�9��KD�����������-�0����?�Jr�V�a�.�6uu&�d���M�W�����U�8_�t@U-����`�-e�1��*U�R"��|����5�
f��'x)a��P��)�/J9�����Y������v�������:G@}���{G(��,��mN`� �7���`rzl���?y6���h3���rF��41KI��f���������Y��@�Z����'�H<=��r2F��mg��irO�WpX������.r:0�UET��|Sy=�!�1"������������r��C�3lA��[5������wd9ibK�C$�$�:����}���gi{��{d���r���E9Hz��������t���G#2����e����i���[�����y�����S�YU�D�x���-D������gt�A2x����C��7"�bXd8|�>�m��R�W����;����br��Z�7a"�<UP1<����T��JY����9P@!��e�wL�.���S$�f�(Q�.����M|J}BR%h3�0����U�g)B���e14�_Lk���Zw ���0�4/�'�=����������"�����w�3�4�_l!2�R��g����yk�aPhk3�������5A�gUD9��A���P���?��&�xWh+dS��pjao�2�4�F�����\���oJ���O����.MXs=H����K��`��s�N����<���l�Lg����fr����<�mZ�+v�&�0��Y�u���)��f�E��3��d**z;}n�����N#�����d2��1�������N��u��,o�.�L�E����#����1�6;DD���n�=�/����F���	X�P����g�,���g�2��|�q�nM	��
\�ZA�{�P�
���#���(ywhuq����<���p��U@w%x��}l+�w�@���+S(;vE2��a#\���!m58��:��?P/�~Iy����f��q�cU��yyO���G��E�|<M���1��c�qa����?��$k�9�����dK���2;�G?FW��)x�9��K"���oq�d{g�%�+������0�N�).�����������r>����?�C���,�
R~�<v��+�M	?�_��������J���_|jP4���<�{�n��|����|�_>�_\j������s����VO4����#'Q`�������a�++�8���Lq�S���}�G��EC����U+A��[�}
����2������n�����T/5�.D�N=�c;�76y����<�sr�����p~��9�t�0k��� �ZB��Q��	�����-��NdN���&���0r�&/���noN���b)4q>s���P�d���n��
�=D��M.���c���i�#����ba���M�kms���=�����7�+2]9��0_�)��{���������)sx��P������e���gJ37g~+v����}]FW��^pfU�!���ww��P�j�������O>��������#���4,���=1E��Zh{�P^�x���ne�
p���I�C�8�&�V��@'l�r���Sly�
��S�M\����'3L�����s*�����Mp�G��^B�r���7��B���+	�k�#a{��|��R�0��P�O�H��A���-�K�S�R���`|y�emm��*�k�|�/�D+���Csh���g�[#���Tk�&P{���,<�������;��0G����,p��
O���S[��
�.r��O������Ep�����������u>����%z������mv�@Wo��������#�(�'�x���S���S�l6�G������2M���'bXns<����
�P;M$�g��}��m���4Yr$K:�.�)Pl��a����0���M�-T<���
mrZ�&7��P����bFq;#�PfF�����p�`GZ�H�4:�8=<9�g*�W�&�E��b`s��'��4�\��Y����0��1t]�L�������`�v�7Rwv�j
M�T�5�����/���Z�ht��
�/�c�U	�[��*���@���M���\�%��q��Qou���5T��	��EnNqJ&9���?9k�(-�-�����fn�!aw�tf�l4�����D{F�n|5Z�!1BN&	c�P>_
^m�#��U�j��A�L#bgXX��1TaO�
��3(N����[B�|��U(�x:J���"v0���r.ju�������\�<;9{gn��%�K��%a_O|�H����G�\�e*9c�]Ml�q{�������� ���6i��7�>���$������t�d<�<�'�h6�08nGC���$�:hv'��������k�C*����;������Kb�>&���� ����1���nM���i�!��)�~*��X)�7���&m# �%�	/lt���aC����MT/���X����(JfSpI;>�������g�@�t���mV��o�W���Q0�a�#Up����Z��<\_'&G�&rl);*�s�L�����X	�J�����]XDA.������No��l�$[�������B��X�����}&� ��Mf��\����wt~�������sz��'�It�2WG�����R.>��J��%�	 ��U]��n��/�48,��9����YiA��R]d8x�0������f���6����G����W2����o93��k�����#�J���p�X���P4f��|�&P&:a9&���E
�C[��0���l�!��?=?;���A�6;=�Ni���n2�
��jV#������\iY��	\�&A4l�"������4@�W����F8M��m�a��5���E���z���`tO��wi���d~o;P|onS:%=;��<�����Ye����n&S�,�D#��������27��K�����<�3M*z{o�����m1�a��=B5����)�����>����S��<9����f�6���j����il�h�Ac��)�V�����J�.Q��������^<l6wwZ�A��[4h��
����j��)�(!	q#
����}qHy��HD�}�JJT
.��V�*��B��(�(;!�BE�Q(R ���4��J8h�R���������{����JI�]���+�.����i���j7��nj�vj���but	nm)����S��jg����%�b�Y��(��"�R��7����X����/����>K��]"[x����m� �����?{���7��>�B([li�sn��9.���+��]p#x��B�n'{[�f3�n��{O]~U��_����m�q����ft��eU�MG/�b�J���a�A�S����uw?cU�V�g����W8�t�P,�5M����m�hL�@�a�!}L�5�>�i �3�8ZR��]�V6��_�
�N�^hh}QC�������
���-,��p���h[Q>�o@�� m��b�[�������"����t��IiD%�����P��B�/l��6��){VY�_��G2��^���i���B�5|��b�,��[�c[9������`�%��=����]�J��&���qM����/���)�3��������e��ziu���r__t0�k��R�c��4���m�|��h�����Y������fz(7���)J/1�y���LI�hO*���[O�MyuO��D�?��&��*�m����J�`{�`3&��"���&��l'�{�f���:�=�dx
T�^��[�9��8�{_q{5�y/e����+N���'�9�����B'g��z�B;N���:g�{�}��>����W�s��(te*5�%�.�te�t�[�|m~���`��|�����@�/��I�O
x��+�+Y����UXb^�����B�@���"zy�a��k���p��oN�Aks��?x���-TW����Y�/Ax��9�;���� �2�
��KwZf�[��������.��|����_n�%CK2}�W�t���mPULvC����m7����^��@cX�PqSTe��N�����I*�>�4&]S��]������A�'vC�[����K��A��<#3l���*�fgVdB���2�*���$n�1�to3��;L]v8�`�S��^�"q����F��"��������#!?��0�(����"���?�8s�2gW��� l�$�d �?��8r;��0A=���w���M��Q��W�`<�� 93�W��W��`*���5
�����K�
I�)�b�6{�L\� ����RJB,��/�2�N�_W��y�p[�.���������iv;����]t��H$��!a6_����6��6�IjJ�	S�S7����F����W��/�{)�-�\p"�����^����Y�r���k������qRcN�+�*��,�6��Bpz��A/1��f/���K�B[iN�4Y��)c�:�$AF����QBrx�"	&pn��\v:-�o��T9XCT��e,[�6�3i���&��`/�`�v��E��4�������q�B��������Fs�e]�t(���#+�uqodm8)���n����&� 
�6?yS,�~�mJ[�H��O��J�g�n�9�/��T����G��s��9'���8S�x����)^�����h��^A�1("�.������=El1���������dsk9$l�Ir��R��=�n�A�@�?v����w�I��;/o���J2D���L�U���g�������5� '��	%2�L&��+��b�	8�Y�I�P�6&����tH���"}�e���/��3	
��{p��qQp���p2$P��H��H�]*�'��)#�E��D5/z{�3�+N"D@���]�����5
�`�LA�D��&p1N�5��w��,���3�����������j��.�-�P�/U�����dE�Ya#|��	z���4ty�]3W������s�69�"���wK�H��+T9������(�nV��m
����ilo~�^��)�v�"��7|�W�AlS<X����-�����U�p����K���S%��&�A�x�$X��P���^*��������7���/:M�*����@`,>_��H�AjKA��!�|�_��%j���Drd�`z��)�����
�����M\�
/�B�a�kpHC�rd�����BP���f�R8u�@�8�W�i�����wTf����{�3�	1I�Gy��	�kbNz#;j�<������g"�:��D�v�&�t�N�&g[`�U�N���<{>���^n�1�����8G����A����z�����$nI���c��4�����&����H� M��:}����b����������sw�b�Fq�=�kOsd�3����~�P�C�I}�x�7
@e
i�`���)��q-y�s��F��<��4y����h���M����C������������$;!4,n���bGR�Od����Y���m,.���H37.�,��D��>���"��1_��0�������������`n�r� G.��b���=���C�����h�j5��Jg�j����T���'��_��W��_y'4��e�l������h��������,�f�3�(�I�$��sNh�d^�X_u8\�jP�4g�������J�46A��:��q�)������H>������,���;50$Y5�������M�.�1�O�E���`lo&%w�p��8���A�/������#�Z/q!�C(��J�������|��k8������1i����%+k����$�Y���Mrh��� ��Ks��'E	�
w
E���R�X
�������r���))��|��W�qn��"�����w#o��q}��-#i�7����r���9�8?iR8"]^�
����q��O��`��%z82�r�s:�0zg���jAw�D?�h��	P����l=�Dv��R�.���6�MW���5���j�$40��n����#[`i�InT�I���pn����`6j1�����G��F�xh;�lJ-�3�u23���yswEA�R�7��x��{G�b�������O���D����C Sz�'��R�os�����K�����	���g)����NN���cl`_I�ouU��L������!�X>���-�p��Em�n���
_�|,�3�Guef|u�� ��l���y
Ht��S#�D��1UT��0m��hp�yT�2K�`J�F���w�aV0/���/�^��O'g��.zx,�����
�����S����s�S�<����g��@����+o3��)r4��2s��w	�1����/�b���O����n=��Z�u:���
L���u��C�1wN��#�xL���B��1�(�
u������C0����F}��Pp�6���\H�!5�G#J)a��O!��%t�����4���]�5���,��9��1Y�K�+������NTn����5�Z�u��^�%���u��5���k���t��"p0���fc�h�����)�!�8�p�l!�k1�q@���j�'�
�z�����Ue��*�Rf���9�7���ag'���4�������gZK=��lv]^>bH���Ro'�#N�;��n�
���r��P��
6�����N	����tI���X����e�5/y���-)v�y{����{IisN�:�^�S���i?���g"V�!���
h�2R^�!P�ip(�aYK�3�,��bb�Hv�Z�V�n�������5�����t������-R|&��E�2'	��2��������V]U�zW��D#2t�xV[P������c-��E����^
1HV��r����ng�u��b�+Z�V���(Q}��-�|Yc�
7�����[�������7���N{k{{�M�5����
���6����>��	��&����C:���a�yI���#����o��/�
U���2C�PM�����P����cAh
�s�������9V/,���F��k�����_����\�(�l��66W����I��j�7T�v����0*_�������0�V��&�/*p�{I?|����i�6w7����m��60��S�Y!�k!A>�W��~Y��P�-���I���s3&%%?���=f��.2�<*�j	����na��� )x�\�1�}���CQ�R�%��>�8c�	8#/�f��X
>O?��T �v��������D�����I���"p����~F=|��|E�����S�q��SD�����w�	B�S_.}/��d2�:�k��_{�Q����V��R��xi�4��^��X�/Q�a�!V0gb'@���a��fjI�+V��&�m�9s)q�e��Cd�0<�4���w=��Q7i��p�5���������**~��|�|'�euI(Y��ZA4�y����uj���#C}�&��bmkI
7pe����+P������b#��m&c{���K4D��5e
>��|31��H5;#?Eq.���f��jR���Z��-Y C���))�$w\uw������Z�_�$/�O=�+:i`��&j����l����l�yy��W�a��oO�K��J[a�������XpRp�����d?�Pg�� �i�?UIE���r�2��QO��"lr��Ir����w��0��M�^�X��&���|!>�S��T��b�0�*�X�����f���FSKu�_i<�H��)�������lT����'
�S-`��d��~��"����w3ru�_���|�+rl�s4$�P|�G��?�S�4���V�VV��l<A%!�hd�*|�y5�i3�]�(y�<(��Y���`��.���HS�S��z)G�x�M�%!5L4�q6�)�Q\�.��0����Dc��~�m�����!9�d�+�(5��n<�z+[�C����Czv6����t3�����F(������
'�a
���4����bb��{n�R���������`�w�����?���4�R!����O��'����������������K�d�()7)�]4�{+]�fst���\�
��n�y>n'#N �L����	sk���l��'v�n���FD]�;�OK�����.���c��'��O\�!��%��;S�����b���Z`K�4��93/SFEl�-���lEU�$b@*����W�0���[s���7|s��{��+\�]�|�q��o�F�nE�3:�++c��,.G*>�S*Bx�C7}�&��s4H`���y9��c�������81"d,sM�J�s�a�e�^N�J�.8B�������s$4�uM�r����iX���TEq���1�����5R]B@Dh]T����.i#��<t~�,�zo�����&�"U�q�LR�T�i&'����oh��d?�d����@+��qa&�����{u�������d6��d��=���\��s���1!#���.��]%�R�)(8��+�������D^-�
3����}�@����w�o��U��o�
_��^�d`��O�v���w��A25��S���l�2 +",	� F�5�������c�v`��tds�2�a����������$�N5����9���G�h��*C9���C��Q���c�35��������BR\/��V/6���+V�N����t^uxv�];p�f9l`sx�h��iP��4��;|<�x��w��bLvx�K]"���r+�-�����������T88��#�Uf�	��O#��II:fN.R��t/mP0n����k�����i��f�����I3���q�/u�fTr�2�s�bvH�Q���LJ�a���v-?/z������J����K������]��*F_����oT����#������U��9�j.{�=��2�4���5����Z�_	��q*`��]��H�O���8��Ur�WA8\P���q/��J~��u4�zUm���h������2H���4I�������u�V<-.E��'X
fHd�h�\]r�����B9����}����D�y	�.�h�#T:��'B�>C�������o�6��������V���r<C�0�lY�$%,��� �Z������R@�#�)������i�����S]%�B��AS�#�6��r��{H��n>6g�Z��3�w�l�A�����|�{`Q�����^b��Qz��)|
��p�auAEJEu����F�a�E��{�������F�D�4����%=}�{N����O�Kh2{��=�M�hdi��js��x�^���`f��V��$�������n
w��k��f�B���3���G��.BsL�D	p�48A��F�^3�c�Y0q���'/a9Da0���+�7�[�����}������)�V�U@�� u������.+�}��`�2�������w��)��}�{��+��Y�����{�$�E�]�����sZ6�>���:��9�	2���d}��,������25��������<�f*��0���/�'<������=r�hQd-���X��m��c�>�,���{vo�D2x����O�.��}��AD?���Y��N�]0|�[�8`���L��Q�
t�Y�B�F;��f�H��7�
��9����%�S����s�s�t��s�9���M�gE"�D����mV����D�g����}���`�Z�y�"Z�3 ��ZA���a~��L���|��+a�N�6�t_�~^�J2
E�B�������u�/H!B�N9[�,bgf���w��>
��_o(ko�+��H� �ii�Ynx�D#���x�xX{�mx��m������'��kC�2���w��}�0��<�s�������K�e��&�������4��@���)��1��0p���|bc��
lN)x
�9&�2�jCN�Y/�?~�\ER�cg�"���e(�7G8�����M��SW�����|k.�>z�mU���&X���YvC}E)�rI
����<����_4�~��pIE�)y���g�@;��:f�4�\^wf�����dw�,ihl���C�|ow�������L��7J�3���<�U���k�/��,��{�!�E{d�� 81��5��S0y#?���p~(���R����~�������/���($��LOd%��3����|����9��b��4��\�2��|<M���1�[�>�In?Q�$����C
�����H�b����+;4w�[N�s��/�I������_�8��G�k��I��xl�P%ZN�	����q������%q*�OB��H�dm��4�2-��I�v1���k^7B\?����5�d�,-�H<���!tY,�X�F����Fda������w�/������IWt��~�[E�b�!�0�[8��k����S�����[B��w��Qr�d����q���w�v�b����&#�`��������,5	��Vx�����K���O����
''jS��'��o���q��yf�5�����<��Ec�8��Rhoub��C�k�2��m����iiER!z����y����7`iF�J�1�������������%��Ob�9��tA"l�_Y� ��-��o�m��IN�P����P ���z�} �x��#9�<�;�t�K�I�����bC���n���y]����R��5���\����P���*^O=���+\��������m��_�����I5��4�k>����������d����v{��f��+����1�9��`�<N�w<�T`L>%?�����d=E?�
��%63��V�J�6\)WV^�-��'������K �vW�)�$$�x����#�����q�\��{I��/����V- ���~	^C�`P��[;���d��&�A7���v�;���U���M��s��s9%�}Er��|)���<\���\�T��?n����N����k�o��{�V4�YLv>�f��)���v(�NF��m�~i�)������������nhP��_�oF���]��C����Zc>����������3�F��W��_��g��u��)���+L����_]�W���i�'���yU?e��jsh@����>K��K�0�|(!;�[�5��%�	�����>f��6e�������si���^�^��.���3���E��db����}�j�q�'�5�/w��>�M���A�dh[�O�'�Um9���Y�A�����m�_�������Nttxz�96?���;���_�������w�������3�{��@������ed;��>9��R�������qzxe��_uP���U;?<�\����l]~��,��������+�����4��==?;�pyi^��B2��������U�����C�����:�6u1<�������S��
	����T�C����_gy�����H��0yy�i��)�>�����p��3����S���Y���^�����-���>|a�|���}��:7?~9:�/!z����(�����g����?�����[�v�~<?=6�|��i����t������-�9=�S':1�������#
�������	���z~I��	7Th��~>�-���m�>��.;�������\��?�t�?�������_�o�'gi��|rv�e/>�G�:gW��O�@��fv��3.p�y�������O��tx�_��??���������`����#��P������$��x26����rn��������������������}�s���j���a/��y{���R�1�����l6L������3���zb�=E����=~��W.�&��6�RI�4\�)"q0����|��������U}��^G������!�:�5�{�S������&���Z�;�l����<F��
������U=V��>�*H��	����FL����e���Ao�����Pq���='�U���G_U��;��}�9��-#,o�0�#
\��t�����!k���s���J�bG^g��j������V�����l��Im5����������w�.������?~blLu���������yzL�~t�_\����A��v�8���A�z������h+�V�q�MT���{O_��
������}QtQ��H��G��+'����m�"����L��=��<e��G��&!��?������}����5�;�2xN��>u���+���^�,x�������`�'
6�y3$p5�z�Z�1GI��O�(_�'A�����8�����������m����������������������Vk��	o�[��j���	>&�����|M|��f��=�Zv�
WDxm��r��	����6�g�����S��p��>xKl#��DK�+���f����l��zDFL�on�j����`��7h6�w[{;���E��J��_��iS�������L�s���S��C��H��[�EY<N��)/_�c�z<T����6*�����$S�o�����Z������p���*�������Y]N�F'{"e'�w��.�P�J�%-�^��l#D�0�dR9��H���x�d~��d���<�l�����\�1[|���wfn���hq����Z�(�V�8M�;CL����X�-H��[������������YSJ�����j���'�C'�3�8B]�!P@��jxe0i��Q�OD�'�{gSa�d&���1r�d��
b�X��Qy��(*����0���+�p8\-�:a�@&�z�����Y
�c6�s+���G^�lY�P~:��A�|S���im����f�����XEK����BU���W{(�a��Y���[YnA�.���,��JG�a�R���:y7��N@U!L�����������gm�e�i�ed��C	����Y�B����x,M�]zs;cl$v�#s��4yhD6H����V�}�)�(�j� Q��`�,�������m(CWu�`��1��bX������x<�$N2�p�lM�}��R��f��h0M�2Fn�A�`f�4�X7���2��Q��������� 0^2�%���7E������W�w����P�]v.;�pr���W��R����y�����}�4 b����`[�������g�]�����)AG�s�Y(������G��A���������z�<#=sz���p"���l�}�Dm��L�}��0�HJ�����k�%}����VV��0f���1��s1U���l���9B��/���+0���!���(����|���>@?>i��@k{d&���=���~u
�[�����}��h�g��L���^w��c��X0�Ad���.kz�1��5m�O22N��|�
�)ka������
��X�����9������osS=����u�[8����k�rrO��3f�m����e����X�:�OL#Cl�.�'�]Yo
�M���L�72I��f�#c��@�D�zD�e2$bR���n���S�a��$D���i���-��A=������[���H�Eh ��e��*�oQ��*	�X���;f��C�����G��' 8�Gm��ML������������I��Z���2��]��kQM��Q8�B����c�<�4�����ojF��#��<�;�C�!F�)3�&iW&�~�m���T�&�D�o�"�
����	A��h}��5[n��n%�5�{5���	K� ���Bv���7����fCo�����"���<m��4Vr������Q�������������Rgu�89b�5�G�	^�4�+y�k ���U���Gy�Q�&u�Nw�rq�%^�8�H�n8f{y�4���u��$�6���5���9�� ?��:6{�x��������ca ���\�u������/�eHt������O�d��H�oh���g9���i�4y�O/���K�.�f�DFW��9N��A9�}��9�B�(p�pSF�#�Z�iB�8��FUe�KZ E�U��ui�B�Xg��sA���S�'�^�����>�S���i���4�]����o
�I�v1m{� �
�j� %`<��j^������7\�7od�?�����+�z�	zg:^���*z~$H�LTM��s�+.����0�E�`8��S�0��m��v��c��E�CJ��������s<��K�x�lZ��g��o�������_���b�������7�0Kn-���	^��mrZ�Py�|���g���V���T(���d!���
Y/���#��)9��J�oU�!���R������PQ%L�\�Zj�5�Kw`��H�������3��2��&����n���K��#����n��������49em<a��Rd���e[1~�0��(���w�;2���WYEz"�x
X��v}���J��\tA��Lv�+_UL�?Nv���Y�������f��W6T��E��q�KVy�IF�K.��>�<B���!muIF�YcE�����i�m� >��1��9�~j	~��H/����r����N���(c�e����s���H
a~������d~"e���	F��@S�@�=&YvV��k��r���}e:����k[�8GO.�=/@%Y�{�����b����gJ�@)e5�{sJvl$��1��~���S[�ED������	� ��b(��@H}�~���e��b�)Y����\�����M���C����x	���lu?���o�������������D�?3@���E�*�'����[,(�<w�������:A���!�p1���Z@U0��]J6�&�������R5����
b]�H#��'L�#�����r-?7>��ULb�*�)�r0��MQ�D|�������R����T�r�xH�%�\!=F�p�I6)��I��]�Vn����2xp���6�;��Ao�_��*��[����o6�;�	�l�sx��aQ�$���cF�!��l%z�=xC�&%��d�������C�KA5Fx$O�w�I�I�����nB��� ��$���S%CP@@\�d����Dp�C�[g���=�$��5I�����n^�������l����j�E��'p���wF���Tg���E�I�`�i�fji6z�qR�P��dQ*��#g��u�M��f<.����n%!�3=`*��&�)'b��`$%��������P��~�2LFm��F�
�r<���
0�&�F����MdsT{y�d�TP�D4^��G��=�>"0���G�y�$�Y���\����p��[�P:L���s�c�#�v���t�S<e�CZz&@�
f�;���!��Mt@G�O��F7��H3�a��L��N�p>�j��H��M_(�O	�'��~<	 �E-n�&�b�%�&�u&51����YX����-B�����&�`�e���e�H���f�Q;������Tn��l ������J�������|���>tKsv�P�462���I�# ~"��K�J*w�f�����i��%%
\^"��Am\#n�5��^sc'�K�Xi����0t)�-���������g��}-�.O*�M;���z��	���(�B/���a�@W�E�k�!	;���Z]�������Q������4C����d\��I>�h�*J{�a�d����
:D�7�
�F)��t�7����i�g��)�\x��9�9�#�+��&
3��!��1)%�3N���MJ���akY-��*�����
����&���:l��^
���T}J@#r�P�Sb!��A��;LZ_�^�H���c&��}���rU��/��rF;Y��8�Ge$gsn�G�n�����6����5���	���bT�k�������CL�Y�p/���p��>Ck�yrp��*�k�6���m�	,N|`�`D��@��@�
C�]���+����n��b!huk�`H�����}9�=$�O�)�|���Q)$����k$��>�cj)%3m2��	�;i�d�As�'�Qm-A���w%���H���
z� �aT{y��=!jw$�����> gv�C����\��~*��Q%����K���������D�?���se
����(i�9��)�Q�����Kx�p�
�X�X���y0��9��q��R�,���l!$y���&6�����+(��g�a�r�P�%ZI�S`c����_���O���n�AD�Dm���1�D?x�=X~i���{qy~��78�W�0���i�(��_O*��jHD�1�����?h�\��6�3k�$31��{�N�K'��DL�������e��;�&C�?�,xFw��v2�A>�c�7�������;�K�x?_�M���=w���N�����	o�����4\�{�)��Gtb!��b4�F�����O���-��%�;��AB�i�D��Uw��VV�;'���RC��4������.H��������9��0�@Sk������D������t��%�����uo��r���7��	����Kr%
��8A�	�������=�������"�lt�0&g�RCD��<5]I������w�~���n�m_�{O��o*t^�^�6?3�o������q����d�����������������P�T�9�����S���N��/�">Ez�L38�J����_���D�u�m+2�K��V�Q{�\U�';H%����^�j������.�����QdW�_XU&��(����s!�MM�b�lz���r�)���J��p��j��b/�1�o��*���+U���s��F�J��oU��5����5�I/�n�D�V���{�A�Zp����o&�������������vOO������Z;���v� c�s7e4��2<wD�L$��m�xx�}wx����N���R+Tz����1�QD��rvt�����~tG�s]� '���c��I[�2*<�j��UD����w�1��n����P��_1L�B��Q�7=�����Gs�D'������T<�v����	u�@����v�Z�����,��`��9��@�v�9|�}{rz������re���q������+S�n�t|��zGYY�Q��!���i��N�3����r���Y���$�!s?����%��	G�Z�����I:�,��G�7�yi�S�E��������G���o"�<r1MAZB��G��@�C\��xvd6���d�<`��Ipm��*6������|g�y���\��2�$o^7�N?����~2�<%{��q�@y�Yj�+V2����	�}0���6l*)��*�h���r�A�p�ie4S=�emH�,�.F��t�8���*�	vN�N�]������R�!�$��p��\�����l�����gv����E'��K����������p���+�i����/��s��p����i9���*��a"����0�]S��ZS�����F"�k�&�m��m���	br!,�	����JM���7��t���&���j ����������%�]���y��6Z�f�z������W��������
�����+�������%���@xD��;��!��������^_� GI�����W'�0����nc��2��5�wW�z�x���{�&����s������h�m@��g*f���"<�vx�?k3q�����j�4���p�A[r�n��G����Cy����Vv�pLB�UhM��'�v����6���6�W�O�r�?W>��TQ�n+�~�Y�?���c�������8��f�j���������������o���I����
����d%K��a���d�'~��L[��t*����
%���h����2�k������|.����w��q��\��k�c�x�������M�:Xm�-��|(������z%5;T*�F\��vsv��<�PY�a�����^��$��d�T~&H7���%X������s���]�n�(������-��\�S��)��/(9.1���d�������vT3��i2yl������@�����O�S�n��^P�g���D,��A^z��dj������y��	ZF��t,�f�G�v�����u/�]y�vP�����z�4�
�hU�e�o�%
�sN���,M��d��o^a�>/JV�)�^f��&l��r�0fW�u`�>�������f]�S���)����JU���J���&�A,PIg���p��Pz�j���zz��0�b ��E�����
d��0%,���hhHv�%2�o�?�3_�5Z/E�W���-������s���fcw����4�I;������l��5��mK�dg��� ���Dcs���[/��v3I�������������H����}������uo�9DX��TD����:�3���/>��6����/�+���M4Mn@������Z+������O{u�\l{�@}YP��+��$���l�����J����1��_���PK��e����j@�r\	]Z��%����p��M��BS5*B�n#���
�
���q��>��r"C�e�I(���t��6�z�Q�����%lV���0��nc{+Z?�klo/=)�-{g��q������vE!��$��i��n����(b7
�U���2��e�r���AE!����V6[Ek.e6�En}?�����l*e���~�����q,(U5�������`�T�D����Y��f�6�����
�h�j���?���X�t�;LAl3� ��=�WQ$�C���=tP]�����{{�]Q��C�E�=�U�!�����n����vU�r���&:����:�CU����
���6+3J)9bRD�Rd$�!
>A����c�3��Z<?9����[[Q-b����N��"#�{���,��3����������l���~I��rJ ���@��`��v���7�N������J���fC��;WG����iSE�=4(�/T���bv���o�L�m��R��
i������"R����_v���3�%��_u���������i��o<���A���=���0��~����u����{�������)�:{�t�n������y�nh�
y!SM��f���?d����~����:sR�g���������v��g~��,�9<xb�,=��������.��~r��;����c&�l�l�mo���1w�����e���������c��v��n��n���<�u���,��I�h����d�An����'gK��3��������e�t�Z��Gsg%nQ�j~sSd�����2�d��t���:Y��'-�d�/<Y���,�W8Y������?o��'o������|��k�.6�� W>
�D�m���}���������;`3{�PB��ix�����M�������C&E����1��	�7
���4<9���$e�!o�7�c]/���!+����Q������g
/�x�t��^��;��d����n�Ik)-���P�+eH���O�^�{ ?Sq��x�gN�7C�xwvua��`��7
�����	�'#����I�F.��xT��V�����������h��mn��#��u���-���KT��9����c�������e������{�^����w�
���Y�*lm�8TK����w�c�u��|����EDq��Zv4[�.��k���q�c���d)P��B/��V�lz�����J`k�Q�e����t��G`$%+Y�7`5L�f��9SYF��(p#������$=65����'��H��y����������Q��"9��F��k�����Q��#��$D�2�	�H��3�%��G���a�����$S��7 �'N��L�U�����@��:>v��xB'r�����Kv�FI6�n�!q"7�d�7Xp����#bC0/X�����Yy���#��K��Q��B�{���f�y���X��G�X�3�����%~i�'f\����{��q�i��u��Y�~��E�a�Xa�W�iMQ��l�7�u6!.:lK�O�������Z�6����;���<�1c��_��p������yO(n���!x*�2��r�^!N,�^W�����y�Q*0%/��"����g��
Pxy�G/=@"0r^���}��������*� ����P�����1��;�������F�a:M~����FP�f�����)��|��-��E����b�E�;o���}���&q��;��S���=��wI����'@^�7fz���e���r7�J�)E]���mJ8P��nH�e�&ww�1M <��$`K����m8��4�����
�-j����zn����w?^����/�:<�>���'j�z����U�o�&����������?��I�Q���<��d�����&3E�!���KI����	G�b��5�\TG �:�����8��a'�p�|����0�O�_�	Nj�q������A���l��w���'�D�D��
q��&���Tr�e@�_��-zeEa9g�����E�9|���O������;��w����"������2b�^�hs[x����� ��"�,%�K��o<���=o��KLU�p"����}�S�����b��\���/�XDVN��	�.s����oD�KY?6F	�M��xjsQ0�����z��o�5��pPb����6�p�y�^���X �I��g���_{������cp}l
1��OP�m@�����B����f��w����}�s����/���~�/�&^�[��L�h a��o���)nA��~X��NT�E*\���0���ree��0<�}�H��9�\��9v��\�n8�8������
f2�@���O�'�"��"�����c2v������F���S�	����p����}L��+�����|��y��\��o�����/��a���M��D�F�hl�#��{���!�2�x�5����)�!0�4U���Q�y�E�!_!�)^�tx��s��;<�����u���`G�R�2�}3ZQ�SmwH���v%����?�i~���dv��p�^����A� 4���>|�
�Z����2���x�Os������%��~������������n���W
rgl	
e0�}!we��x������jr�^�Q[)���
aJ�E�����PY��@���*��|�.�*����_TsQx��Y>�|��|t�������\���q������b�~Z����?�8Z�L�i�J@���1�P8/%%��$���^��<��n�D���Q<3e�����M�;�2�������{`�F>T}�\G���d��K����rj�B��d�
��3N����('�:E��p����Wf��e e����4����q`�.�
��ff�rA��om��pj��t0��l�~������_"8+kve���#����h�)�����8!\+@c?�q����������Z�����ew�4����b��N���v�w<:�D<q����)*Yz�HALw��������dfX--�����jS�}ea�2
���}�![}�z���Q��_/�����P�H`�66B�����+r_�T2�
q(H��c*�tU�7�k]9�%��Y�'v��M�N�7�;��v�w��j/�������"�.�B�.�@��K�����u�O=�*����qp��)��X��a��HeA�>�G�/
!#f���}��+�a:��;����0!��$��������Y��	��d����������j�jo�q��k�z���X�~q�%�*�/������:��|~y\[C�Q:[k�����F����s����s����\�1K��u�x�z�|<z��gG./;g���4��_.:7�=;|��na����qoO�}��d��=X����`������9�;�U/_SL=\�������|s�zYP�������"F[�����b����t�e�5�-��p��X�<���aIO��j�\��\�!j��*,\z3�L�g-���NO��Yr{�ww�v�{��s|b�e�uw7�d���������zO
N�#��+HGXF	�A���t�u������T��\9�Y��"`1$����9&��E���|�_�<#~�z1\�+7��)��</���uR����K�%g#�L�V:d��Y�+����%��J��z����$�A�����fx�2����`[@�_�M����6��^��wZ�xg�M*m<�E���bx�I$�7c��x���3��
�yt�y��2�MBY����s9�����)��A�E�7dp�B��7�O���d]��|G�w�@!4�����i��4�Y�V;>H�[�f��m��0~��R�o�a���a_������790yY.���;������b)5B�����������m��k��n4������������jmmt�rt���s���I7 �����
��6XQ��B�����������N��i��km�������v����f��M������n�����8������rO��o��[�$�~��7������x���v�xw������7[���kG�'��*���{Q������j������}��drs������o���d:�8o��UCd�����������V{;j�n�����6�fh�^�I��:��������W{��
4��EKt���Z��2�������.�f�ku�jK'g�j���C�#<"3�5u�\������S�?��;�V5�8%Q�D���
/;c]�p������X%i0!6���"��[C��,�����t��}>:��q��8��e��Y�[T#���x���D�H�<��E�RH��=E3H��o��Z�A��t��)Wrtz^!4�UtO&6Hfq:j�����`�*��`}���Mfv���������k��$����|4C�w]��Q�4S�$U!P��4KVm@���}�xM_��@��8e��"�&6V"���V	�����72�k�����x��I)3��dEZ��0R�w����[$V�m4�J�_�����+����*W�~&��xj�m�0�@���
�D{�	?]�]�6w��M.3�`Sb����P�	$���*���sa#b`S�O�<N
��� l�����A�O	`h~��g����(��H�+G�otv��8�r�dR�L�J:�L����Y��\�8���=
R��LR���)��J�b��!�Q��j�����%fS�Z�jM
%�s? �,%|�zJ(�HJIL���@/L�B�	y��D���X���.�����N[8�df���[��*h���"� ���g�����u��������=#B�����
}���&An���(M4C���-����O{����^��Y)�a1��f#�� :6��p��
���}�	���lr��FN��?�s����X��L	����0:.R
@�L��j��*	k�q<zD���\�6/�[ '�����qHq��l���kj����Z�K�������j����Y�bB��aI���`�Wi�2���I!V���s2�@������1�hU3��*�5��9�DkV�P�5S�Rg!���|(}v��Q���
;5�^Z;�JST'�2M�Gq_s@�������i������X�_�l1f��������������"��Q�p��an�y~���3���	kl���j�o3NpAf���x��6��tL9�4����x�V9��`����J:u'q������6����8����\�A�Vd3�]C����`��T��
6w�����b�&.&����������/��2��H��� ��-K�-��372����.V��I��X�0D�#�3-���������L	s������6��n���5rT��C(���e���������
��=�*P81�	��f��1=�b9��w���+`�1R�{;�Yj�q�En��H%�/�F�'^����EK��T�[8s��1|31C�����jjS[��������������o�x�|���9��n����;��Bp��u������h}�M����M��\��?�H\�z�>�w���Iz�+�:���
�}[���~~�e�'�Y��O|�G��vJ���_Q��!W�=�P',/jX:t������i����������x�K��*�x0{�������Lm�=�\��S+��Q(�5"3������6�����������{��g��z�|�������jQ��x��*!����x����l�vZ��?�Em8=��Rl�dO���U����,��;t���I2��ok-��C�����k����|�'�����)~����{Gl�>���O�?�\��HX���0��(Z����_W2q��H�W�{��+Z6pg�����[?����n�P4�W�W��m��6���$���4�s���H���~��E��_��W����?{�����z�
����?4R��6L�/��c��f�c��(��&q39�d��I���,���e����LS�i:Nn
���O��~>%�i:�$��bCM��7��6M�d��N�<���&X8$�^#��3�4�#ku�	��6$�[�d��LKlzp3�,��r�+�[���c8�rU���|EdL+�d�K�~fW<������m�4�	�$T�a�v]s�q�T��U}��Gj`jl����do�l*Q��<5M����.9���(4����$;��m�����Fb<s�]�!s��Q���6K����1e���6X�?`m��i(��A6�	[��<��S����a52��wK�p������Ts�������*�
��cH"���p#�Lc?o����������kE�����I@�D�S�mG��������k�])�1_���z�L��ra���6�W���e���'g�<yM�&�TVn3���qR��Sa����t�s��g��|4���wJ��>�<Sk�9���V�`�E��y�c�	�������[D�{�?�r�bJ.�!evGk����30����[������f��r��������W����fV<n�����"����)��:�������<���;�F���I����i6?&�1;��c��AC�)�����%���@��k3?��1����NQc|5�K�r�0`E:#f��G����_��b��hZ��q{��j�|�Ec�)�(8��=6/��U&��|bh�����j��-/��{r���;h�P���������J��86�O���� Td�{@�������T�]���#�#.'3�W���z�d�E M`��CTF����xj��|�i�{��4"�'+����?��{�+3L�Y���p\�������;��~c����]u�|f��Zx�7o������|v�N�:�l�7���U�b)s��{F���+�/���]��V�o�.�Nt�s�����������be����>�7�\9��7k��&/�0�j>j^�O�]����G���})�Q�������%���	As������c5	N�F����~�L��z���5���q���/�tq���D�j����N{n�.A�S@��,!�q��Lm}Q����Hm/��
/
t�����6�yy��s��9$��v����A�^��i_l|����[G�+}9�;���i�������&��7�	�+�c�]� r�?�_9u�=u�w�k:�c5A�k�
��){Z�S *�/����im������������`	}O��j�ba� �����$��Zv,�XS�:�p|F�����$��M?
�O������0���l;y?��FR�.F����)�y[�~�D�1E���l���b9�A�
���0�}S6�
k5�[���z)�i����u��9(�K���L�&�.�+��������Jl�J�`[�x��
��A�&xj<�����Q�~�Z@�����O������v���`�Y�����.��@OL�f����x��/`,&���]��Yy&�����Y=�~B����\%H�=z����j?gAuG�����[��M������	7����
��b
�qB�
m��E�|.��$���U
�;9G!�N$=D���)��S�P+�>K�b������{Rk""M
� 8�F�W.��6��eu�������5�c���*S�S�K�9N20���h���d�#J�Z�L�n�G���U	��Y���,�[��H�23B���$���A�Z�%B���&�
N����Y7AL�~C��Ot���h�}�Y��@���Z��.���U��K��0e?��c	���H���A�j�>��b�:-�L�iN��%��������j<G�0���9�v�GT9p�����FP��r3�3G�����7Q�k����Z�)�Jr.�.�3�y�.��O��D�tU~�
2�9�����E��. g�r�aa�A�usNH`��geIdY�a����B,'[�����������bE�XF�A���&�_eB�CF���%�q�l�Q�#��o���J���������,$��q�@7A�`+������.���oO:��5s��h)�R78��'H���$����G
��M��D� �"P�6+���|�����f\%KA��V*�-S-
-''��x�K���9�5���_@��vZ�A��<�N��v	���&��BP��9�:�W��{]*��Q�Q����O�2���}r��F��=9�u~x�Y��g����~dd�:���}m;<�	#]�} ����������`��?{K���e1m�>�X�BZz��(Lh�GO�%�l�z�5�x�����5�[���`������S�����"���-�6���C���Rb���Y������������E�N����S�NZ]�|�v��}�GcR^���.���q2$P`C)6X�����Cu���*���|�i��������a���YO�~�}p�'���P��Yt����� L��al���e-����;/Z�72��b�������-^1i����[��NAzl�V���$����?�x�ME(YmB`A%�/�C3�w���%�4v�0������c������}:��}fR���|����&�aj����y��7��jM\���(~�*���W������sR=���D��Ja���+'[�H'��M�syy~��������n��!�g�u�O�&A�
Vr_�7|������6���v%O+��R�	$m|5�!	����b�o�:��/�9�����/�@�[�Kv��'X�g�f�M�vU�~�]d�Qx3���E9h3��������P���}�!}L��k2������&j��
����@C��'���2�f]��E��C��_L9��c��C���{�&brv7	�iswGq�������8����L�����K�i��l�����e����rpM^4Kn#����K�p}x����_2�7��]����W\�'�k�g���u����u0�3�������/�v�l�����05�"y�~��i��r����4�l6�3����&D*#i����������H�����Z$<�7���@�&r�W A}���BC�������������w������/k"rn���k��2��*�����_����V��B������>�+���ZY_	�G��������<q�x������q���������v,�K[�:~:m9�)�H�	���W<��3����&m����q�������L�H�K�.�����S�G@����3�����&
-��%��e��:Ju�9	=���n5�������5��;�����a��[��������o���F�������	/���M�����O@iS��g��N/;o���#Qn�[���1Z;I���<���^��l�xN*�b����.��6�s�k@��P�Fel��l2�Zu�l�i#����C�Vq$>��{�"s���Xi�k��d�Q���r���G�#E�d8�z���~l������m|]\^mv�O�a�:;W7����O���s������W���|i;g�l! �����(��[��f������Z`�)4P�9�"�c����?��y������^"}�v�SFl����i��|�Ua�+�������
�
8]�1=����
�0!�����f��s���D
w�a���zN�n~n|���6���G����E����/�;������sI�`�����Wv�{�+<a�^(dXv�V��>���5����g'�%��#Cig�W���vV��)'���&����3.'�"	`X���+<s@�j��g��������'MGL�]�t� ]��Y�w���x0p����N�6����>�$��W?�<�`���8*����K�p9�G����E����H�C*8�����V�Z��Zk�P'k:���hUr�wa ��`�1�����(�?��,���A�-�����m��hx��:5�	P�����~?�G8��Gr�fbmL5Y���-UL��n��6���N��� >>�P��W�HP��i�1��:O�	������w��?f]�_��'���o$��!W
��3��2�J��,�y��:���+>��;��s�:���C<[��Z�I,mo/���� �JEN�S�Q���b��ST��[<v����|B0�e)/�������|
�J5�f"�ioOT�a#���<�D@~V����}`��b�"�i�����yv��'c��T�S�<�0�3��w���e�@���c@�G^#?P�k�w/9��K-r�S�<�y%������Eo��9��f�3�>��j��Y��.��pY�oQ����JMgT2%���e����-Z��v[p��|1A�Z@�*]���n��l���]R����|����v�M��Kb�����.����
S��m:"v`��)�mDv����1X�dx6[���/����b��b�?�\�������^�ZbV��|���
��w	��������Nx�0�Bd�������r���^���;��m��Rk�;z�Gk�/�0[�Gn����m9yp�+%�d��|?��0\����s��
�8`N#��i���F�U�p~��#�A�X�c8b7����D��d���I)����8AB
p�d�}0�C��8��$�`�n��B��6��8�_K���7��i���O������% 5�J���2�M�dh|��9q��W�H�qL�]��G������!���H��f����_%������0��\��TbT/@}4�|#���r�.�J*<%a��F\���������`�`���M��)�c�1'������&�$Z8x����~t��#�������]c�����7'5��P����e�h1]+
�ka�B��R�z������F��xS~{��iD��A���?V� ���;z,�-��ck{�\,����k5v�-�kAn���R����! {%4ky��>4��g����>�_������	�t�a�`�}^�G2���.8�Pt����2�! =k�p�`�8�	�h	�(D+9��gC)��L��L�&��������b/�_��c�5��Nx	/Us�3,���f������7�d�
Cum��7�o�Z8���rXK2�<��K����K���h���cRt�Z�O��q5���������*����fP.����^�0�r����hl^�gx_��{f��R#s�G�
�)��$��%|E"�����F�pk5��a�<��v��'�v�~�;$N�N����x63c�g$U7�i��iq���%S3`����F'g?��w��O?�?�^v�v.;gG��%�.���Y�XU�qju�t���y�q�^��&������t�0����{��Og�R�R�,�{���\6�
���o6��po�yy+E}Ky9�m�s0���Iv}h��t;:@�f6��lrO�� ��?j9�Q$\�v9��y���d�a���.	0o���w��T�F�&@��t���qf3	*���Ca}c�T�����$�1�@}�!������'���J�<����q�|�7f�SF)�~
�����W�����?��fl����y��k��*���/�����Y�`�����eu������EN��C��8���@�0V����?�3R�W�����sK��`or3����@����bwk�v�������	�tixZ0���qFO��
�3�=��7Y��Ytb~��e��c���Jl.���0���j����'�'����O:��]����C��O9�AW�F�',z�W�s!A����v��e�(��������\f���oe����K@-<\�������1����B�<w�?1G������(B��9����Zo>lD/j/,�D�er�u\��"��	��#OR���A��D+�x��oH�
����glh��?��]T�Z��'&���x��{Gz����ojK��'3����e�����4�no�6�������k�8
U��^���/C����������$059�5��j��=E+�����X��K����5�j������X	B��R,K�r�)4�������x����!�p��'��"C����*m��Ea�y*t��k#�fO��E�-�i�`���4��d{g�?����e�k��u�A2��������k����'���:��\��r���p����N�1�'?��1���(�����wl������]^���0u�m������������6w������|�E���e��k���`�58h6����a��
�������a?��=�S4?��J�N��f6�	�d�%�����[K)�6��B�G�*�����A9:zeUK�e�e�1A���?m3e�7e6������$��fj�S���J�21X�����G�hG�i�=�My,�UX�'�M5l{�l"
���'5C�N	�����*x��$�q���9��S#��U�*/��&(���j^(��Jmy&I�T�PM����6�>���	h�Q��3��b��v�]3�##:�>��h���.�����%����-,�^pO���$A1����b�my����^d�:s��$t\�Z��e�g��;rt(7}^[����U�6��������Q�8�17�.��,�{!G'���w�$�a��<_w�/b/�Q�A�Zh'I�&V���|�oq,��
�|��r">��)�E��R/aT�Gy�������
�7��u&U5�U�<s�~F2��`Z�V���q1�`kn0A�6�,-I��q���pyvr��y)@��l��m���n�l������Q�����,C������f�=�?���k%���A�u���d����|;M�f�P�O��s�������h��_��s�?e���'��&�nQ�����9��69�M�����V8����8a`N�y��62
�b���L���d}�M���k2gJJFGF��S��0!1�[�#�����M?����>�o���i6'/�#�"��<���0���@��!9�����-�tGO� ��m�j7����9S�v��\�BBM*)@,�}�����~��wg���+[�n;m�����
Mf1���7�k��A���6�E���!I���4�f��dY0s8�u������p��g��3HEk��5���ns*�KP�	��^"�����wu����#HF��f�� \/��:����a/e�E��(�l�/\s�UL�`B��I��Y���BrN�����+M�5��J������+�|n���2kc�-!�9�>���&.�Q�Yn����J�>P6�=J�a���t�M�	s�2g�����5��l������K����L��<������U����d>:{�w���e){�4I�+Jap��P����e�DfZ%��`>ec?�x������	��`Cs<��+E�$b�h��*���l��R��q�6w��LY&�o�|���={��	���`����_�g��^��9W3r�(;�V!��n>�S����O_�	,P���n������0�������z>&��@�V�1_-N����{C�0�%����s�X����l*2��BC���2�8�LN��r��>���8��s�R��z�2���V�� ist�kI5������&Y������<!9�Y�^v,�wjU��U�/blv%d�K��M������c	%[6�A�iSm��8��w��@��E%���^kn�|<������@s��uS�*�Y�����M��3MJ�f�U]��G,����^���h��A�PFa����B���T�����#�������-�R+�$e���Q���P"{����k�X���-�$� z�z�����D����m,���6���I��Q���)�b�����s���h~&&w��c�S�F��M5ZV�A�p�������W����6���^�u�_����n�H'K��[<�G�.?b��ic�w@���+��9zW
)�/��#�v�bah�����J�*d{����$����fs��l�/�s	k���=����j��K���G�p���w�%��o+l�Dd�6��<r���3+�8�	3�O�g��i���kFyr�uGg���=�	�E��@H�#2p�}p &��G�{l��s�1����k���J��;���r%���z����MR��K�������6���4r4�;]Y��'�
g����2��o���~�J��X�=�?~��)��0�
�����u��u�����v�|��!��=O�|b�uX�&�)��5D�@.B�_����J�
��3>[����|�|0`
�.Yoo��%�b2������=4w5�3�����zrJ��l�n�1��5'&��q�'���S���@4@���^"�!3�4F�	��C���L����[
��7��� IV�<L'�i
��"O�)��
��R:E`F��3�O_kE�5�7(����y�����F�5��G[��$���E]�FT��I
Z�O�l�q��4����r�9U��Y�S��%�]�&�t@�*�Z��ar;v��d:���(x�o����y���L�yO�RR���������@7)=Jw[f�������l���/T�s[Wpj����(�M�?��,k�y�W5�%��k�=��ZN��
���.��Q���z���[��fs3��{���P�c-
�_�����q���)�v�N�I_JH�\T���k����d�1���j9����r5�W�F�U� ��$}�D�)�x�_��:����c&B����IN�,4����E���@�cF�g�������1m��NH#��]�n�+e�e��������+,;��u�R�s���Vkg�_��!x<��f���m1�3��7�����������������?���������km����^{k������z��u�7h��7z����c��
����p~#��������N���+�����K[�X�\�������X]��@���M:M���������g\U������Fs�9Z����?E�RikM��[g���1��'����U���	���4M����>4�0hc�'V&}��)?%Sr�Ss�g�r/�9�I6��
�G���p���
!�(������l��a���h<`+�
�z9b�H��6�:�X��$FZ�l���'u��������Kggo�`���� ���M��M�F�1�L�+&���q�����������L�s2^���a�E�����M�M����^���	���d<m"�V�>�*��.����(�B]�)_�}�>�*����>�����������+�+�0���i��~F��be2�-�on'�o0,X7��[7��&��()������A���f��P���&��r���q�Y}�U�=��s�������c����6��w3��2�����)%7I����*DK���A�h���y/KF�?Wy���JE
�����v�������+���O���y���u|{^bc�il������OI*A�%��LH���Y�}+UI%�v��L#U���k��o-��S%��K)D���0c�8��b��yf-���V��M��=������sL�����9v���^�w���\4:��Q������F��7���5M���
����>�%���F����>������Y�v6������X��!�����7�4��Wh6w�5��������-�����+P�h�AJ�T������cL�c=:��)p���)����Z���:M��m���w��KS�{k�@CE��b-�0�T���"ko��,����v�Vk��:;��o�Z�I�W����5�R��P�������Q�7�����������g�Yy�0r`z)u�CxSR��X�K0
+j�oD]�����5������zyp�xM�^,o�P���3��b�(�M��o����=	��fq��#��=�f�q
��6����$N�������_�����U�?�L�����3<�gx�������?�VJ[�V*#��	��u<��������|���8������x�7��
JL��UA�T�C���1�>��q�)c�r�[�I8�3Hi	+�SIqrF]��TEc?=8�}S���px����|����o�S�o�Y�0�)��F�����!I��E�����-�g�UQU_lO�'���&��(��0r$��J�����sxU���.��&�]�����^v���N������X���[
-gM��&B�@����Nh���!��j��K��)7|o#��}RR�Gg'�l����M���h�z{zv�D�P����h���~�
�W.�����O�,�p*
4,l���?S���}Y���������%~WD���j����7���G���#<��7����WAalT�(_���@F�od�fS%^.�mS2?^�S��_<V�lC~7q�Y��6���J?�K�|���1gd7��6���L��l��d3�I��:�hf�Z��t�����z���h]i8�/��+q6�^���1A(t9?X����m(�G��y�G�tFUtK����0����O���4����y�g�^�X{:w~�
:��xg~�u|��:j�������6��`6����fCq����	��M^y_�S|�b.+�QG2yf����s.�T�����41>�=��'��������;}^>�����9���Z����x������`O�P����b�):�d�t���l��2���u{��*���{��n�~_�����wd��p��~S�����WSt������c����iB��seA���)��$}�K[��?�}�fj�T���qO
w����]�U�+�`����M���2h����������0<Z:��<A���2��>������d��O^�����qmrx|3��72_�\�p�!2��'W������mi���z�IS�����CC����a�-�B�����&:����e��U~G^vkNV\p���6��{�c�M�uAI��!^A�0*/���?�, ddA*��@��hY@�����pZ���_QR����������������N�V�k5��nF���-�2��g���;%1_z���a0���fI>Cl�m*�� ����)N!��f6
0�^��/���y�r+���n�������z1<�(�W�%_m��O��6P�4�W�����Z�P���v��*z����=�
�=�[x�E��<���]�3���R�����#������[�
��3�'��/g
��d53rwc�`�l5�W��TC�Z���n�@�������`�Q\'D��K"����O�'� ����Hb����������u��|�,�����'���VL��F���;�����[uxz�(�������TH6�B|nCL����a#V��>5),�~����Uj*�{�Js�����M�r�`�&fg���)7�S�oP�.��`�(N�����z-z�D��LV=�p�9b'av�8���$D��sX� �1c�����#�8o��6�N'T��`���1H?Hy
n�GYa�����+E�-�&uD�����+)����N�i3�X�88T�J�A�F(Cgp`��C\�0����&�PF��Q�a�A�QA�x��i�4r��	��B�[�YHcNH5 02���N�B�����}+���oxLEbu���9���w���f8�a�����,i��\_�`�����-p����3*y��<����*��8�����`��c�iG�Jq?�����*Vb��d���G�RC�['����uZ��uZ�o��v��{�uZ�Nwo�[���j���lA��6
���	$�n��Q4��J��` 	��@�����=����t[��I" �'\.���
:�������fnR����<!�5����M�.��4u�p%Y���o���1�!��i����O����5���,&��g����,����J��� [��|�q\�UN'7�1���=��\Q�3
�d�b�C��sS�	�Y�L���e'����������s��q$#���AU:u��PB� �:U!����[����t��E����_`c��� �t:C�MxkP4�/���hbV���f���0:�F4�J.�.�w�H�l+�lQ<f�����b��n�WX	N1�<G��HB�$�:S�e�5�L7%<bSl@����bqd�);�
�F������.#bK3�XW�g��
����)��s�c�C@A���g��O���-pY=�n�5���!f�k����:<u\�aU]:���;�3�ix���*u�����
'C�[j�0����Xkh��Es��ybY�pBEq��FY�'R����evC�����q�d�[jY�50/*_{�>�TL$�H=z8�h
D� �Y.��[M�?������������]���kYg�T�bM`�O�r��r@l4ho�i�]�a8�kC-��J���Bg��?����goJ�7��EY?����Q���$���!Kt<����%0%��J�7����4�1�*�E�@�s��l_�W�
����e�^�FxK�c�<8�-3�w"F����4f�/��0�`HB���JL�7�G56�dx�Uy��k��:n�"%"q�I���vS\��v�{A����=�~[{�}�����b�����O����[�>��wkOzc��
��c)Dtp}�y��n�~O�	���RBuS��Q:����#�}.�B�9��7KB;���|!F�o���~w9�.��V�.,�����4����)���+�1��U�$gD%nD���2*���9������)W�f�B2K�F�~��s�W<���i��g9���h(��qB�},`�qF���`��"r4����
�w����B!k�i>3��j��+�����?�
k�.|�J[���@��r���:�~�����A�ch��\nQ��
�,�3f1�(�����?MML���]������i��v4���I?�<��".\�R������|\����W�_fT�"t�=Ve����f~��A��m{{K6������q����]v�6�tz��K}��w0�Sn9kl��6���n�_�
m��y��2m5Y6���)�MR�=���Yf�u����������`1�/~���q�G�7�6���GH9?[4����6�������[f
6�6�:��
��
L~��������w��O��k\��@V��"p�;�Xw���,P&�o��5�\9�g�vm9�St��<z���������y��^��2���
��F�;����O?�<�I���O�����Z�j�;�h.�N!�K��<_r�Tb6�d7R��g���G�7�;E��������=x{����6��� �GM}�
T�[�;B;�1v���������/OU�����|t1��T�`B��?����6=���������5���8U��\����"eB�T��q��Z������-\c�=���:�\V�B���F���b4$])�w���#���X�<�x�D, 
��w�����Q�O�uR+�
��n����������:�G�8�d.�a���M(�����U��`_�
2���"�O!��	���h~��X�_;;�c��<}c-�U�����w�wa�{�f��[���Qr,*o��������_�r����2w-~7���z���E�����:���^��uk28
!-SQ���W�g�X��|]�.f�5������q}��l�'�t/wa����\e�����[�P��Rp�Cv�`r77�W�(	�	G�����Eq��<����gQ~M� �����l3��'�y����n8s5�_�����#��kWM��:G������}�$�.��wW
p��.B�I��i���@(����p���!�~��R�4>��L!ZS�]Nc["^S����������xO�Y�nQ�z��{�4�������be���?�Y�����|�����x�.��`p0Y`�,e��6��aL�L���!�m�����d;��O�x�8X�6��~b�^�\��k���X;��w	�r8I�B�����G\t��|
������Y��R��h�TO=�b����psj���T�=x1p!0���4a>&{(o^�m���3���O��{Z���U{�
��id��{��c\�J&�M�+����i(��!��V\vw�	�	5�f{�����X�����^c�;����x��_r>v�i��b�=����~{�nf������%b�����Er���kVr�������x���h��<���7�`~�
���_�c���(f��a0�E3��o��������C�ZtX�4\�r��i"�o��_�r���	_����X��aRS��<d������q$	����*��
L���I
����G$�m]p(��IC:�I��<,�V�y�������Y�:n`���ysT�)%AH��o��
��~���f��ll����*O��z$���"H��f����������7���r'�f�����:���9:c�O�]8�V���#mQx������(�1��Q�k�xw���~<��U<#
d�+,%��\�����������.��������'Y���
�pK�2
����x]���y�S�0�%��{,mv�K��f_�J������L'Y�������e���f��vOTh��$h����E�8�����{]���������(\��t��y�J���=�����L.�Q���:X>�Vk6Z��n/�vUc���R�S��^uGm�/����D)r��I������
�����}�iRP@@>pf�tt�����%��L����~�U���Ok��t8r�MJyzpz�Y�����?>9�?��������%S�UF�G����]����iH��5Q��
��j��nVw������d���^s|�R���ex�}�L=Q"�����n�4�t�-�>�z����h8���\e�3�k�����2��{�:Ui�y��� \����1����K'qX��Q�1���dz��m
X$��*�r��$�����M�7���
Bur���_2��XL&;'�
�����ov�� �����X�y�,���;�Z-����NQ�l�Y�����
�h�3>�����8D��Q|a�P�)����<�����^>"W����{��W����������*�|��S�S�~���QE�Um4�(��Q1������M����)�7O� V�XL�y����R3G�3��k8�g�)U�S�@)�k��N!��R�F��qwsN��cXU��Va%{�m���R�Wy���p.�3hE��j�2�������N�Jg�:]����^
ZAU��X�V�U����d4Qa:7m�.�9H���pu>kn�|BZx��&�`�AN��.�z�I�$�[N�-��0B���A�5�-�t�3=~���m��w�5hl�Bq�*�|�eYI��w��>�b���0�R^O��\4�{[=g�B�JKPt��7�����.��e�dG�9s���0�`�+o���i�����8���Y��A���Q"�z�nOl�8�T&��d�Q�evI 
B���3��F�S./~���rN�k�g��$��{��Ji�{R$�^��n����^/h�vQ��ok�T�?�7_����j���G���\�T|�e�����^��H0>4I/���AY��6NX�$E���XW���,�m@��\�=ch�Mg���t�&B6iZ
1���g��z���r*s��p����&8N�[�DM�cY�zt��@5c���^�G�(��S�Z��'m�����J��-�N����7^/�C��7�n�yjM�*.�ON^��W��0�/�{���N�
[�p6�N�$������me�����:��C���I�=��
)
����O@�0�� ���������B��Ngo�BLA-�c�*��Q�aC	�R��Q)������E8]���
6��p�j��^c��/�G��V�Q�a�v�ds�_��]
�l6���7������@���r�vyy=���������+�C�� ���>�������D]I�
� a����e4VB�<�����UAFaMp��5"�z��YSd�����_������'oO���h����������"���d7K��k�� U
~5�����O�������t�����:����������/�c
)���`�t
��<��g�b�+~r��5���Fz��P������`6v�������������@���N��5m�1d�m���+����>�_�k,�����'
9���,���4@����\�����g�v�;�w��������������8�����
�����c%���D���������*k���B^>����}���^g��c`V��O�pO��Is8N�\�@�m:9[�������3�{���;d}E���^��������q�~	���htI�>�-g�Wc�wf���b��TS��=��X�O�������$�N�u&J[�G���^��������8_�l�7
�gY��#��G���A�]���'?�d=�i5�-���i7�{d��eL�k�����x>�����p����zZ�� �gu`��4"_�>F1��Ri�m�yn�	6g�M���rt&�����I����M<zd�,�&�.��b\��.�����\��������|��H�&�|',�Ac���MY����hPy��g���_�o���M���M���7�Q�
�W����
^�4M?�5�`���f����3��-� o������%F>F��(Xh��C���r�EC^�O�k|������:�lB>��(�Ax?~�G�cF)6�9��f�����4���|BeF�����"�..����J���D��������*�{��i���[ik�a
�*k�.�������!��%����������b�<���Uq��Za����c&���|��7�S�7X������`=��z�y��/&��yhf���*w����-�����GXh	����{��	L���23�c#�U�k-��T7����2��������������G��� �"��M�Kr��[6Px�;��.���bF�'��n��Z�@w������b�r�ho��X��*vU�8�,A6q�X�(���]����#��
L��	G#4�|����rgk��^u��Z�>����q��H����:K`���C����r�8z��<��f�������g����y����:�X
��}�?Gq�|��}:?L��9���d</���z��S��j�f���7��B�Z\��z���
2
�/�s
��kz��16d!�P���Pd��\y���b�"�9�z���7��B�s�7�����_�$�$^�!�������2)*����J9�)�.������_|�z�k�)������nIR2n�
~��$y��C8+d�.��a[��?:��_���a���m��o�1��l�I��j�;��s��b�=tNyc6�]8����F;(��t*t�C��������"=:��U,P7����e�_�%���sNtU������4�
���K��P���y]��|������z�����`m�wU���V*S� J��A
���B��lT�����Iy�]�r�]�5�Se� ���!R��X��ON �}���o��g�z(�O3�"�|���eo���O2�g�����Z���5����]���l�J�-x��wi���������N�W��6�n;,z��fV](�A�Nv�]�
����!7�/���+���w)� �M�<%�Q�a�fp9��KC�X�_0�D�������o�������<"N���A b�5"Kb������.,��@�=^�����/f�Z�&?��1f�w�W~�/��Q�G��$M��^f�(��#q@uD�P��]���=�t���j���Z`�;���@�"]���_��I1�R0��:|%B�����A���z��G�:� �"X!I4�u4�`X��0u��Zz&�8��y�V���Ri34Z\,;`�u����.)~��jy�����+����j�;���z��5p����;����7�����N�{�h
�I�Sn���H[�?�j�����rvUI����"��1**�8��CTS�34��]�!:e��
����U��������L��E�����b8,����B�w�DZ�W����Y'���~�����e{�g�^�;���.���p�R�WR�6q�6{��\���{t�2�����=���m�F k�Iq�?6�:��/������8�O��Q�.2�+L�x:IorQRg'������M��u�O@�l�Zi}�&W��#kWIjI<���,)>�Ym��Z��n��h�fcUjynk9:D���Y��� �b!����#7dy3F���b:��g�6��D?���i� �c}��o����O��G�O��$t�deo�{��������+e*]�7�������Z=Y4Vc�&�|s.BU���O\xWyv�Y~@1-~r����n�V�4�������\�y�D����`���9�}�a���_F����<��{=;Y��0�CcO�`������qw��2_�������$��?��&���)n�J��I�n]��tHi��������,�)��j�(���PU%
�+9��-��{���������g��l���d�Ca?@�zv�P��#��O:�w�"�9���v���j��Ej��w�5�hA=��)�9|�OAs�j$P�A3�3��`��������{g0�������`8h�1����5�+�b39�s�A��b)N���D������4�7��������1��c�yL����������o���T�����+��S��S����r����{��u��Q�C�{����/px���i�|�P~��Y��c��^���j{���^#X�c�Fr�+��V����uvK�����9�#w�~�����T�5�a�Z��GK��8��k`�r�-�j�p�?h�wi
���0,<w�s:�E�W�j��4��?
��0%w�����2rZ�1�u1�2����)hG�B=���1FA�����Q�'dkV�p�%��T�1�-�T��3��(�������U��^0�M���W��3�x�s�)�;�����  ���?�/�S^�ar)����e�E�u`�Q��i��1�2����>���8��(��2��r���	��{
��Hc�;�D�i_@�q��H������������QY9=�.5\��������������J������������e>[��?t��/^,�(#����E�����E;��:��K�Q��V�������~
���>+�����-�����zo�T?oA�����~;�oQ����[����B[�B������������~�r��~
`�5��U�|�7�������~\���z�*@��=��'�y���*���:�_�d�Z�_��=vjj}�k>T)��U)�4u
1@����$^�J�"��p��V�5;������v�N����=��_��&��"�eyPw.3�l3�	��K���{6:�����/hK�*[�^�����g����X���j&�u���/������n�V���:��^�e�X���CTf�B�������*������e)�������3��v7t��Sm��NgE������L�L�w��n{�w�j��Y��t	��Sz��(���,u��\A��L���Z�������{a3Rk���~o����Y���)�}�x�j�m-0,�'E��6�U��m���a��C��/P",��++��i
S8������>������o5j�V��V�6�[Yr��H���RQ)�����}V�R��^T��Q�ou)���UyAhi�_���^�I=z�����Ds���f��Z��2@
S��j��|��C��B��g�����K���i�6���o���o���C1��b>_I1��r>��r>���O~?�Y}'��{.n�����n�������wt��>����"���su�%���+F��h���������z'l��j���`/(���jl����890����"}ypt�5��C#��m
-�����lb��54F�P��[��/�/
�}������g�.�]����4:��4��~��Wo
[�^QRQxh{����������z��jftp��ZO&�^����������=q�7����:~�����U�����_������H�_r�� ����.�/�"�{�!��F����rw��k�����b�!��G�+���Zt��4�f=�#}����]����������
�c5��� 7���i����!gaC{�Fm��(�������rw�P���q��
�]}��h��}�v[��6�@�
��E��w�m�����������$��F����wZ G���l4��?��'�;��`[J���b�s���J^�)���po���[���n��o���V���o��~��v��z�4�R�U�?��WM��6�X��z�:�/.��`��^]����4�0��I~^B����G��j�����������}�h���N�^:���	��c����������(M��#Q��!�o�-W��U�)�'��d��C�7����#q�i��e���o�*��\��Q)`t4��}%O_�9J�L�9Z�Id���Qg��(��3�:.�A����&��CHISu�@���7�����v	=���(
D�Z[
��`"	L�������TV%w�V2	��\�r�cB1��!�5���J�J�	3#�=�#����j��N}�b,-�U�����zA�C8<�<�G��#^l�������jBo�~[��Z���j�d�������#w nCy�����R���J�W�����������;fs�{�~�W���f�)�{rY�t�
tY�����qo�@�������.�Io��8�E�Q
�������`<��� i_�����St��o��^���b��m�Ds��_�E�����/6P;_������(A����m�2��/��#�0��(�GJC�l}�����J�\��������/��ut=���
�0�B�W�
%v��CTp��
c,��C��� ���i�EE��.��>z=��d��C+�=`KA�A����8CU���j�6*PO�5�g��i��5������������C���)��#�7E�������GL0[�t�{�n�����x�`��d���`���1�W�n�q!3�v�1�tc�8NoLf��3n��5�,�i#���;CmT�2l�'\�*���x�|�)��YQp&��P�HO9�~���s����H�	�_������ �t�������{O����	D.��_8u�����`����l�
	��B��E�`���e�AC~4��}P�G7�������(��F�p��������(�� $S~�DH���p�����;x"j�|�G�T?��U<w!V�+M/�)������D(�x����O&J��;T�!��7�atq���LG��Up\�g� r�}�����5���n,� ��8�"���)�<*0�&�'s�V3$�_r��
���O��cc�D��+*�������I�bu���M�>������Avm8p2���X��II~��^a��9>�z�=N�p�a�[n��L�XM}�K�-��_8���2|F��fb�T�����Q�CA�	��&Xa�u��)�
�<5\�hH�L<&2|��4�Q�`9w:SYO8�aY�HX� �����TKN�$!`�2���	I�P���	���5tJ h�Lsk���1��;�#-����bi��U����e}����e2�a���
�?H��y�v9i�f�/i�:�Z�����e��[���z���&52
���G���[��1�	������m&��Y���W=(2���k�3�e���+��g?��UTp���Qo�P��O�X<5�vM����Fc	��%�j�Lk47'��!])�������%M���� ��L��C,C��H��|z$]�z��u��`��'��v��M��)��|��������
��qo]����9'#�R[�j������7�h����
�~��&#X���!9h�����dvzKJ�{��_�e;�t����oH�6����!������g��{�t+�����4��yO3A�?�>��^�d�}0G_AEgQ���9�#�D��h��C�&denb^+:�5e��������&Qx% x%:A=MbF��_��`[����"Wd#����{>�:.I��r4Kx�|�1����y�bUm+������q��7ug_�:�h�7��`�_�E��1�H��O+!����	�8��'EBO���G	�3@C�a��SW�������E�zl��X5�5����K�x�����SB�����^����xTK��(K4��L��1)1�Uq�7���
��,�ugFJ���!����C]7ID��;��
j�?z��:���-�dr�$��,bdJF�!�kf�-I��r.f�7F-��2����$�M>E��&�L�q���4��wKoACD?Z#,FC��;���|�],@�������� ��2��S`/��Oe0*T ]���d@�i����	���aR��eq�-	��v�2�=�4	�@B��	!��m���/��i�8NC�
C������2�(��D&!&�q:�6��M����e��=��$�������pI&$Y��0>��/$&���IG(
�N10�
��`��p���3���(4(�K����>��sJ���I&L�^V�����V�$��}Hk���?�bo����������%��3�?��������7�<c������go�Um���u;�f���S$7�� �e�4F[s\O���F�6���1�\`�����dNZ�[�����-�����`@(��]����Y1$i�����oH��l�VX�0��%Q/a�3;P��gq��[�E���g�
�l������/��:��������	gHFtG�'��C�����V��4�;f���8���	����a�f4|���U���}q��GC�h����;��H9i.������5���v2�=��
bI#�%�����T�T5a�Lc���������tu6�4W�K�b(K����]l������X�*��t��my4�8�b8��Ej�$�I�����S��Ac(Z�����E:�����,���i$H�o��>����K������=M�@>c}~��s�[�a�/�4�\QU�8b�/+&l��M����Y�2�|U��S���Y5�~+�\Q��l�i1��V�&�>�?�_�~��n�v�$]���kH����(f4O������y5Q'|!Q#�t}{���q����4}�J4��J�}y�7�I_�?99x{v�w��&��ta�0���Q�V�����B���oY�t�@)�]������DW�R���F��dj,V7��+���4�i"A*�H���N�f2���l�+7���nn J�Cy=�C!��o?T(�9�S�k]���>��
�b�QP��2Q��aoE���H�)n���W'X���n��Zk��xA����k���c�.�)Z]�M������[������(�l_|��/���^�
+����%�]���X�k��l�d��"_NE!��vt����O��`gp�	����9#��jojA�@$�T��_Q����Wb����+S�wQ�I.�q����lK<)����[�L�J�cW��<`44q�G�������dV��y��'N;z�R:�x�ff��\4� ��p<���ve{���Q��s���`nZ�c/�n�(*����#�a%��b�}4�c#���V�d���aD�NH6�|_����c�..���S$D�c+3:c�;����0r�������������n��$���'����ILY�����$��`�HEy�d�~e���6I�_@�	����h��z&B�r�
2�`zAC�z���O����6	�Rv>��,qUqN{\�	�q�oz3��|�F��O�e�F��V>"�_�F��n�k����6��������������� _���w4����@�vf�X��f�����/T#}��l\��S��Z&�t1�2I����|�x����/��� �'hGB��E-���PAc��/����	Q��bK��#�l
=&�"��g�/�V��<�����K���sMb,�N�{A�nP�\�m���N�k��b	
�gmj�v���QPDH���wH�B����a�l�9g��������05F��>����qY��|�c(���nhp��U ���^�ysxvv�����]�P�pb���`2����^Na�	*�?��|\��:O~r�'b���j��}����h�������te3��@OhkG@)D6b��s�n���g
�e-�T��Y*���PRi�5vQ$]$?�c\T�a4f�B/']z��xc�x�_/d���4�nu��\<�t���4y����Z�b�^�(\�3��='��Z/|z�k����������H]C!�����>JA�.�=��]E������v1����x������[�%x��g��!	(�!����uv)M���������!	ES�R>�Q������T2�mDW-t�WT��MT�0 ������;�6��!/�%av���Y��Q��\�-4�'h���2B2EsL0[�%�}t�)?4��Ip_����!F*k[����Qm�5��J!#�7)V}��p�
��~m5��A�b}/^O���|�j V�w �F
���]�h��tXN�X���
�)mq��{��^`��� s��F3
/���������m�I������Os��A����rik��/���A
-8��D��0�����[DW��K[h=�xQ�������7�S��:�
�.��Sb�-:"������pt<��i,�=�M�{"<Zf2��Z�fz�����R4$�(��%�h�7"�H'���v���X#{;�u�����M�?�����=h#����!	z"F����2��F�(\�J,����q,v�e�ip:�EG��D���d�����@�.�8E�4p]?�3!u4#,��tP�L�D����	b��%��gH1Wt�W��������[h,� V	g$<�_�D��U���c�����L��}h���Ts`��������9v�(��	g��<�Ab@�yp�t�� ����p�b(�Dt���p�oT������>x���I:!��6V �R���[�t_��
��@K.%J��d���#v�=���_�SK��z���5����sX�1��E(�o>�1#�QX�4H�e���v�B����W	����M��ca���?&������, 8���p���L$��T����m�Y�N���gY�b��O�hr:$I�NN�2Q�(��l�^�wx�a�(�����(n.�"x��A85������x]S�{�����@��x0��	����Z��qc�`9]>���vdMn@�>��
[/�" QK�H��pl���`���s�����b~������,j;��
��9_���A��g�����vx��<���k���L,w�s�`[|V�����zp�I,M���[��ok%W"l)����i��5����p��F��'���&
`A�3����%�9�����4���8��ZU	��}m�t��A,�5���75�������h��H�7���u���tD����Rs�e�4a��GH�K�����Zy��*��q�x�`��,����mX������x�n�	W�l�Q6Q���2I�>NKV�Pl*�$8`����H)K*�����������-o~�0,P3�T�]�]Q��`��C\�Qs<�9Q��Hv����d���_�� 7�[�X_��M��g���!7�6�2�l3x�'[0o��j�yh �����-�4����8Yz�p[��Q�sd��������FylGDIFKg�����X�E���~v�G��I"�c���h����4�B`@�h���i��{f�P&J�
S*�����{_x�O �����I��(��N�B�[��/�RJ���?ye�����r����7	�'*�rR
���U�E�<����5�����!��;?I��V
C�+z��r�z0�a���2�tw����REk����D^�FVW�U\����20)�i�SLI�s�}/����NSg*�F�::���`t������y�u�=���,>�,��Ab�6�����
P1��8�����y,b6������N�;��b����6Zx\&Q����Q^����9����-�V\��0h��Z-��v��|�D��EoD�	.
QGu���
*UV)���K���\���+:����6gOB�b���%�h�9Y]�tK`�(��j����:SbD|�<���o+�4�?����4T*�a���>�
c��c�r�!�g�m��q]2

�������_������%��1P��[��0���!��VP5�>FY�B���T�!VZ�p��-d&��2jXXp8�	��\y��k0n�g�Cw1��JR���yuy��.8��=�J:e�Rh��fs"5��xJ�����d����3`�2��B�("�P80�~EF�t&������'�:�m��|���Ax������DiE�I$��������&����DQ:����+x\BJt��;X����Go�D�*D{�q��?�(	=t����e#���5A�
��u� >Z�>�X�cI�:b���3�G�C�2a������c��o����p�1'S�6}+�
�5�i" 9�����/�|������"�ch$��7��<1,������hLW��C��6�Lm��M��OH��5��:D�A�y�z3�b56Cs���>;I�:�5���OyDmt>�����J*�"�P�;�_A�,Wd�����"���^���e���L���H6��H%�L0���F	�s �Pb���k"D��+A��h���<i���iY�&���5��a��K��wl��5��}�o���6���!����X1��p�j��NbM��=����I��T�]�/�dE!� ��?�eT����u�W��9�}BhJ[���I~z�Qz��	g
m[�,d�������P����XDb������K|�8�A��u��FB�i�1p3up�	$@��(�=��VF`�t������`H�%�q���E����;���C�Z������N��5�����C�o�Fs��jv��F�o����n'l���n'l���^��o����iTU�.5D�o������z;�m��\-�W� p�R�8�$��JG�����(�C��&L}�h�2���ef�Q��&���L�d
2�-a���W0��.re�%�D���q������4\8"O(�_���R�J%�����d@�Ut�J\���uRV�q(y%q�>�����b��)���4��h��y#[�rn���z��R0����_����Q�:�%����3�������B�Y
���	��A��l:���4��x�C�	E��U��z��flk��^E�\0x[.ax�it���H�'f�6�,���Qf4z���-lb��Fl���Y-�M��"���g�x���5:��~����A��e��Jc�B����'��x&�yP�"m"��b�z�Dl��\K�0�M���&�Q
��k	J��NB�d#�M�mj)����kR�x�%7&k�D���%+q0�
IFF^���T�#�����Vl��7�����k�bTD�V���^h��$h���	��L�9%�zpf2�!��
i~~U�I����x�����{���U��)�������3#=��

.����,4?���g��������O{q<��l��S��Y��v���#�c�y �G�ru��%�=������o����K�'����Y�<�^������z�ap��7���@?���p����%���E	����?-��M%H��nv���[����;�aG�1�e.�������4j�Fo���v����73�F�w\���[�S[��I��������<m����?:���|��MN��J�47N
�n~�R�@��rs������{JX"�F�
R��a��e4L��q
�	ui
�b)�
����������@�3>eB/c����-�cR^��VO�C0s���� m��8��(B2&��'k��sn�
���lO���ct�E�sz���j�eg�%�K��lF$�ok7�^/���)NA�&YqwN �2�YrrI�!��r�ZFG�h\x�Q��DI��pr<����S�z&�)��J�6�g�8 ���9��|z����YDu��PY���
�
�O]P���V�q�K�5{X9�0�b��c��P��3I`�B�j�HL���1�I�#2��Z����jYno���p��V����i�Df�z!2�?��/�S��'o��8��B�nS�<V�*N����<r�����h3dT:��<��^�k>���8l��v�N���Igti���"r�v��,�vO|6�6� ����G�����f��{eb+��J=�R����^k��������m?�w?��x������o6����)%�����L���e�^�kK���t�[�����A�W����A��Y"5����PvZ��7�����p��9�)z�����
�a��>UjS�"S���Q�����I�N���������'���|��������+�� 7(�9�M�H8������_�N��D����^�������a�%F��^� +���pG�jhL���J���*��#2*��E�[$�^��GO5��������������o�������V�;��������l�}�=a
t���6o)�=O����5��b�w�����*�	����Jk�����_c�0������6�
#��Q�y�(1�m VK��U��qE�<{�j��_��T;�4<2f�9���0�f�E��vH<�r��'�@�|���(�?	H���������
�n03
����%�&J8(e�y#�����^�	��wt^������E]7���:e	,�0F�,BZ� �'d�����mF�5	s�����c?��7�.L���k�����n��T#�g&
�C����
����b�������h��*|"-��8�����H�5W�J��
����7&��|��Q}0t��Ztv� X�3#��n�?@�4���_
L|�1en�?}���l?����O�����a��k��6
��N(��b6���C�����������Z�0�����^���A}�����j�����f���W3v�~�;�jvqG�W��w�G�q%��W����������]=���0�l���mgB�pZ:�%�������` ���IND�FK��Kaw��:�u�
ax���`���&P4���\aL���������pHa������=J,l����8U8�tFN�0=n����+^��*e���p~�<���FB�VQ�=,}"��k��7��O�tj�;���8-���IJ��B�b��J�4��!�C
���XL���M�%it�&#�K��<�1,�W8C�
�z ���n	���I�!Y��d�^'��K%XO��^�B�UFA�
�hhxL��Y�1�h�g��XG��h
���A:E��FK()*���DR��@���	�����!H�Q���~ �E&�d������
z1�LR������%��`�3+��7��=��?&�Ux�$W�-����j��5��j��#��P�25�s�%����������N{�S�����z��������&���b�����f�����bx�^�|1H�2�����3f&H� �=�n��L����*Sx�F�������:ne�3}`4�+�6�
$�K�b� �����J�1f����\Qv���ZQ	���+�\�Y�{{?u��������-�Oos@#�Ad1��1n�b��8��w��U�N����]����@����og�',\������NgWH�d���@��s���?�
�oNO�_`���&��0����j���_��@���.�~������k�P[���U�4'������SP(�mm)����9^������g+y��{����"�Y��	$G8H��Y� �Ta�t��4}�<8:X�4vU�t��9>z�]2�5L1~� �G�dlz>�����/^�*�"*�eZ����uyD���H=,���\C�&��\\�\�c�����f����h��A�����Ak��]�/6�uM,<����J��,�%zV(�)�O�W���NI=�Jc@��9M.�B��+*i�������[�Vj�H������X���JAV��o�)_��X8����q	���=��<��OA)]�/ ��[�	��M)��\�`���0k��*��)����q�V�=u_��n�2��t���~)$�S���^���F7XF���Y��=@b��g�o�Q3	���LU��bK4��~��`���<����G��{��(T���/
|/������=���gl�(
�S[1T~A�v��mB8��a��5l#�#�����1r���e�����5g8U_0��J?���_�LdU�X\q#m+v4��";Z���5��c�Z�&;�a�����3��������dn=�����LmK��,�\T�F:A����8]V��U;I%��n�s�N��
<$���k�as�V���A��L�n&��e?HQ���M�=��v��C\t?y����O������3u�����S��]K�Q���(����uj f((�w�h��O?�����3�����#&G"�Y�K��������y��3�[B{�J�k$��������9�@�G�W�0J�s���#��A�� �W�8��Uo��n
�-kY.���9�W�����R�����\�]x~y��WjM�Vf�o�i3����������^���i��n����m����������p�����h����GYGw��P�x�"^�3��j�~�^��I��qF�=}�
&2�/sc����`���Z�0i�N�m��s�p����,�t��mu�BJF���^`)U]����)xOp�m�~�����A�"����*o�Y��
�� �L�f�?|����>b�(YX�;����	�>�������.�`��h4^~N3��� ]~�]���W����������������������:;x���Me��������~}��`��{/.��?��)����'���z����\��4������L>�����8�4�*�����6)�)[���!�#����0�6zdtS*F�"g����y������eh<�xJt\BW�\�����j��nC@p9�����73b	;��s��mt��Z���v��������>�e,��t�'����d
�p"N�l�d^/��O��+>��^h
��,����q�c�C���#1�����&�g}�h������I�2���$����_�il���5��E�7+�km+��^���:���:=��z��+uZS�V���(8�K��5dA{[Y���'�J�$�@|�������$�C�0K7��c�sd��	�<#'�3A�Q�u�
j�{�N�me������i�[�U[�k�9<?����Y��baI���gj��p4����t4��//��'�����)���[����!�T��
��&v]!6������< ��n���!����[U$k�D��@r:t��15���Z�|$�P'Z&�B*h�1N������.c�h>L�����&j�;��T�^�����$7����p�.�jQ^�,r���(vj�]m��L��A�+dN)�\� [0�� j�LCm�.'��;S:4�=���F�Qx&�+���~�4�����P�O���J��i>N(�B�q.������i(c�����F)�J��������Dw��k�\���K��"���QFQ�J�!�$Jms�K��s���}5���R�MgA?�i���O�D��Bts�
���`�d�]�Hg����J�5[;���IF��E��]��Q��L`��"		6T�8����:]��2*�9�T��8(������8�-��[5����`�c5�97[@�^���>��d��U�9�����������9���3�=�5����z����xq����ujN|y��U��D��m�kr�+��y/���7�����W5PNbFH�y�����*��|gH*��:b����{{��n/��[{+D"��i�}�3�)�Pg4�
��z���g������ON8��7�F+<��|�2]�T�d�����+���K�O���]&���e,
��[�<x����L�S�j+�����%������8]������U�����c�S�(��qV����^P�	;��*�4�����9C�
1�SBn�ry����=���vD�s/����i����~���������NMKBfr:~�AV���u�$����������o?�u��N�"���&O%7��
}��7�����M�6h������f@tE������GO�G�*��T����"$�g����p|����Nh��a3�z7E�H�Uj^ C��"[X]�������p,���J�j��p���CF���|M���������b�_���^�:�6�"
�����XK������g���,U����cp(��a1q�,MXR���\P9�>��l&��Z�����H�/k�1�Ua3"��3�t>�Ag��������OvJ��]�������N�����4��<XP�4`\���T�tOS�����R}������0�}�t"�e-�]��dE��P�������'m%��s��/f/^����	�G��	&}JG��[.���U�$W���@��/�fi��E}X�A������yy e��JV�G6#3,r��$��5����5gc��R��m��I�KC��t������`�6�X<�^�.�L,���D6�)���5��P>����������m6n�J.��U�������<�>Y���fba%^)fb�������o9���c�;������/��K�44���fjIq �m���=x_�R��D��������|�Fj����>��<��pt���,���\(�J�cz�@����D4j{��t�z���:5FS�F,����\H�������q�1�������zld���W�����,9G��{E�s��Di��|w1!/@���u��:������Fp
�jF�!�j�������4���a'�XQT�a�s=@W��u~<Qt�9�&�O����E		���^t����(���.K%#�Q�F^�����&����(Z�1��Qv��5�!�Q6pp��		�B'+��{�YE���X���NK(��/����G���3+��P���_��xaR�
ow]��6N��G�A�$����I
�o��S�S�m�>^GR'1gX�6%NQNhi����������9PO�5���\~Ti��#��R�WY������OS?8�b(9	�,��I��~��n����{��_��f���bvD3��'>*��-g�$�Q�iZ
�2���s�`bl38�=�y0Q5���2�6�&w���u}.�CLSvO�4����X��I������N�E<O��oI(���D�����q������$d��*R�2*eK�(���'n�h��{�x�Gj(���k��+(=�gV���7\=X�?�iA.;2=�H�k���Gzs|N�S,�1vd�-���7��q��xRy���%<�*��c�3��Q�h,�Nt�M�$]b���[���rK�P�hf�[Ab}����f����5��KG��4n!�I��,sG3�7UpL5����9�yI�.R��
�����>�������?C*I��v3�0����k��o�2�W���+W����Xn��T�P�h@��c��2�i�r�$�%7U;���XXK�k��XAi����m�8��2
�����|�?�H_��.M���0!���� �>�������b��m�nc�V�t�Eqf�R4s9�U(��C`t����78��R�tf�"�O%l��2:�r�hx.���#l���N�� ������h�R�G�AP���$�
86�0�"���/�����
[\\��h�:��3 ,�W)|�/\�N�*�	xC^\��:������G��u����3�j6��9	�����CDL-oD�K@�Mu[. Qv��
�15
�0_��D��9y���`��y�OP�����<|��������Q(����:�����0���J��������C6������zuxrz���_��rH������IL�W2|�y��`��r9N_hx��Q�`�b\�FS]G���r�C�%X�Y!�y�)��q��d]�&���h,b8/���vxh&���\<�'�h�3F�ta$�I�b�(��a�.k���c;��6�U2�b�aB���-^���w�xT���<"��{����\�-
79������0�:c�=������8���=RM��@l������,�Yg��&o����$�.A�Y�Z;��9v�:@�:+K����B������5rjz�g7�*�D�`�N��7b)����D����+�>OK`�#0�\,N��6&�c;����k-(fh2�����"m�5bZ�g�(��+��L;v�
�b�m"pYc�e�����e�[`���XC�������*��/�B��Y>�,�|�t�����6�DHj1�ri��-u���P������	�[!Cj�p�v2�����B�-e�F=[Hvd����������V��.x 0q��TP����L�)+hKw������jF(�����S����h:���#5Fgi_Q`�MsNXG��<	�������^�>�q��H+]"*Nd�.>�X����SP3��Pe;�j�?Q�eDYX�����>f�HH2:I������
����~�
� ����.f�l�+��p���kO�������h���'4}<<��<����]}<�uXzD�O���#���T�1��7-����?YX��u�Q�E�1/v������������QtL,h�z������������4��� bE���;���O�8����Lm%��;�Xt���0�
d� �Zuk&4s��8�B���]��(���+lH;�]����P:��S�iW�[fg�]r�$+T�w���.�t;���S
�T�TCXi4V��/���������2����&�t�����l>}D�H��H�����X���gV��.�~�;������Jg�������K"���w�vin�[X%n����R�M��1.
���U��Z��n��L��Lz4b�9�?����9�G�yz���7%�

�*p��U7f���fF�@gN��kp��?^��z\1~��2���U�������/3�#CC��]UJy�:&&�Vi;MJ;Y�N��oLf��m8�f��x:	SN�J{��Y�UY���Q*e����������X:a���D�$����
J�2 �4�j��i`��f�]p�����<�u�q�,'s7V����>w<W7W�;�����T`r�e`B��hH�d�����1��aB��<4XT����
��z�}P��1����_��%��V�/c����l����q*�q��8��q���v��`�U�gV�<����6���b�t:D���t7�#7�������R85�trf�#{��m������X����"Y����>3�7�Ie%w#N��[m����u���O����v���&�r������d���y�Hw��oQAS�-ElS��%����ij ���HL�ZAp��n�������:F�Y|A���E{��K[f���,��]n$�����X+>�)5��1e��m�A)�'d��x"r^:��AEd�R��u��r�Q9W.�O����9�����C\����O�+�r���$%'s�kX2
&v*L;�[���.f��)#�������|���p�s!��#p{����|I������Z<H���:���5Ao������aSk����vE��\����$*.4���5o��m�<�[��%��t�]!�v�V��z��N�Me�Cc�5[�[�I�-���Ru��ar>�/������?��Y0�R�N��`�OJ�F,�Gp�6G�=LW����A�p(�K�����Z�
��{0��z�}���X�S����XLHm�r�'3}z)�8�H�y�&V�r��]g^<y���������#��������SU���_�1� ���`�	`����c��	#��7�M�Z�8��h��>\����_�&�!�A�+��1�>P��
��T)*�
��:�oI<��;��p���~����fc1�L	d�6�8a:��=����-��� PZE���*���fG+-�^/�B*��bi�����]�o��As�4�	�3$�����S�U��a��z��>�jyZ�W��rm9�x1<V��]�6e�~��?�aG#��9
���:G%oC����C7e:a�4�����i�
b%��PZ	QyG/,��>�����a�A/����
������`lx_"����_����6�g%sL_�$��?��e��^u7�K���'q|�2>��,b����#��\lgexFV-���~���	�.�$P�\�E��c�|�y��L5�Ei������j�g}��g�dB����L�".=�U����t�k1������T�/E`#C8��j&��f|d��H�������*	g�n\d�U�s��L����i�j��4��+P�2[����|V�)�p=%b��oqrO������j4�\���R�B�\/�B�V���F���N��QW}���
���Y5��`KH�5~
>�;-�
����0��07�������@"�2�i����8}{\oz]�4��,��1�$�����Dh�T^N���+��=h3��n���(/��@����0�#�m��z�%Gv���5"1��i�T?�Z[��{�����%p		1"X�!�uELjLDx�aH�W��%������
�YP�m
B���J*b������������n������6U�]L%#�Z`B:H����<n�d4�^#~��w��dTT���CKO��*U<��
��=;y��EN3�q�:�R���%A���fb�M"/
����#��N���)�k2���0�T]����G��T��Z���'���@��%m�K���{P�����&��> ��~�N'Bb��P���r:�c;�.����$�������u�B�)�Vnw���e� �������z;+��U�0,;*m�v��
�~�h6�k����f���W
n%}�;��& }��w��)5"wh��g�	��>Wy��59Jr�6A�%��`��%#J��M�R��B��NZr:���8#G���x�^����6�)������H��Y{��
����G�aS �Dg+[.����9h�x=���x{�����v7k���4��
8��Xz|d�@,�c-vm��S$M��.��(�L7�"9Qu����[7��������eshb�D��2���R	�A6wP0D��q���@�/'R��D�T�������Z�X�f����]����8K���YN<������)	�v$�u��.�3����`�%C�d-0�S	����������*xSo���E�r.���,�����x���{1��"z+�Q[��T��8������u��+��������~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~����@����
#178Craig Ringer
craig@2ndquadrant.com
In reply to: Simon Riggs (#160)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 12/04/2014 07:07 PM, Anssi Kääriäinen wrote:

On Wed, 2014-11-26 at 16:59 -0800, Peter Geoghegan wrote:

On Mon, Nov 24, 2014 at 1:03 PM, Peter Geoghegan <pg@heroku.com> wrote:

Looks like the consensus is that we should have RETURNING project
updated tuples too, then.

Attached revision, v1.5, establishes this behavior (as always, there
is a variant for each approach to value locking). There is a new
commit with a commit message describing the new RETURNING/command tag
behavior in detail, so no need to repeat it here. The documentation
has been updated in these areas, too.

It seems there isn't any way to distinguish between insert and update of
given row. Maybe a pseudo-column can be added so that it can be used in
the returning statement

Yes, I think that's pretty important. With a negative attno so it's
treated as a "hidden" col that must be explicitly named to be shown and
won't be confused with user columns.

--
Craig Ringer http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#179Anssi Kääriäinen
anssi.kaariainen@thl.fi
In reply to: Peter Geoghegan (#177)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, 2014-11-26 at 16:59 -0800, Peter Geoghegan wrote:

On Mon, Nov 24, 2014 at 1:03 PM, Peter Geoghegan <pg@heroku.com> wrote:

Looks like the consensus is that we should have RETURNING project
updated tuples too, then.

Attached revision, v1.5, establishes this behavior (as always, there
is a variant for each approach to value locking). There is a new
commit with a commit message describing the new RETURNING/command tag
behavior in detail, so no need to repeat it here. The documentation
has been updated in these areas, too.

It seems there isn't any way to distinguish between insert and update of
given row. Maybe a pseudo-column can be added so that it can be used in
the returning statement:

insert into foobar(id, other_col) values(2, '2') on conflict (id) update set other_col=excluded.other_col returning id, pseudo.was_updated;

This would ensure that users could check for each primary key value if
the row was updated or inserted.

Of course, the pseudo.was_updated name should be replaced by something
better.

It would be nice to be able to skip updates of rows that were not
changed:

insert into foobar values(2, '2') on conflict (id) update set other_col=excluded.other_col where target is distinct from excluded;

- Anssi Kääriäinen

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#180Peter Geoghegan
pg@heroku.com
In reply to: Craig Ringer (#178)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Dec 4, 2014 at 3:04 AM, Craig Ringer <craig@2ndquadrant.com> wrote:

Yes, I think that's pretty important. With a negative attno so it's
treated as a "hidden" col that must be explicitly named to be shown and
won't be confused with user columns.

I think that the standard for adding a new system attribute ought to
be enormous. The only case where a new one was added post-Postgres95
was "tableoid". I'm pretty sure that others aren't going to want to do
it that way. Besides, I'm not entirely convinced that this is actually
an important distinction to expose.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#181Anssi Kääriäinen
anssi.kaariainen@thl.fi
In reply to: Peter Geoghegan (#180)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, 2014-12-04 at 10:27 -0800, Peter Geoghegan wrote:

I think that the standard for adding a new system attribute ought to
be enormous. The only case where a new one was added post-Postgres95
was "tableoid". I'm pretty sure that others aren't going to want to do
it that way. Besides, I'm not entirely convinced that this is actually
an important distinction to expose.

For Django's use case this is a requirement. We must inform the user if
the save() action created a new row or if it modified an existing one.

Another way to do this would be to expose the "excluded" alias in the
returning clause. All columns of the excluded alias would be null in
the case of insert (especially the primary key column), and thus if a
query
insert into foobar values(2, '2') on conflict (id) update set other_col=excluded.other_col returning excluded.id
returns a non-null value, then it was an update.

- Anssi

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#182Peter Geoghegan
pg@heroku.com
In reply to: Anssi Kääriäinen (#181)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Dec 4, 2014 at 10:27 PM, Anssi Kääriäinen
<anssi.kaariainen@thl.fi> wrote:

For Django's use case this is a requirement. We must inform the user if
the save() action created a new row or if it modified an existing one.

Can you explain that in more detail, please?

Another way to do this would be to expose the "excluded" alias in the
returning clause. All columns of the excluded alias would be null in
the case of insert (especially the primary key column), and thus if a
query
insert into foobar values(2, '2') on conflict (id) update set other_col=excluded.other_col returning excluded.id
returns a non-null value, then it was an update.

I don't like that idea much, TBH. Consider this:

postgres=# update upsert u set key = 1 from upsert i returning key;
ERROR: 42702: column reference "key" is ambiguous
LINE 1: update upsert u set key = 1 from upsert i returning key;
^

So, suppose this example was actually an ON CONFLICT UPDATE query. If
I similarly make the aliases in the ON CONFLICT UPDATE
("target"/"excluded") visible in the returning list, it becomes
necessary to qualify every column - an ambiguity is introduced by
making both aliases visible, since any non-qualified column in the
RETURNING clause could be from either the "target" or "excluded"
alias/RTE. This is particularly annoying for the common, simple cases.
Also, when there was an update in respect of a any given slot, how, in
general, can I be sure that *any* visible excluded.* attribute is not
null (which you suggest as a reliable proxy for the update path having
been taken)? For one thing, the unique index that arbitrates whether
or not we take the "alternative path" is not restricting to covering
non-nullable attributes. So does the user end up specifying
system/hidden atrributes, just to make what you outline work? That
seems sort of messy.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#183Anssi Kääriäinen
anssi.kaariainen@thl.fi
In reply to: Peter Geoghegan (#182)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, 2014-12-05 at 00:21 -0800, Peter Geoghegan wrote:

On Thu, Dec 4, 2014 at 10:27 PM, Anssi Kääriäinen
<anssi.kaariainen@thl.fi> wrote:

For Django's use case this is a requirement. We must inform the user if
the save() action created a new row or if it modified an existing one.

Can you explain that in more detail, please?

Django has a post_save signal. The signal provide information of the
save operation. One piece of information is a created boolean flag. When
set to True the operation was an insert, on False it was an update.
See
https://docs.djangoproject.com/en/1.7/ref/signals/#django.db.models.signals.post_save
for details.

The created flag is typically used to perform some related action. An
example is User and UserProfile models. Each user must have an
UserProfile, so post_save can be used to create an empty userprofile on
creation of user.

If Django is going to use the INSERT ... ON CONFLICT UPDATE variant in
Django for the existing save() method, then it needs to know if the
result was an UPDATE or INSERT. If we are going to use this for other
operations (for example bulk merge of rows to the database), it would be
very convenient to have per-row updated/created information available so
that we can fire the post_save signals for the rows. If we don't have
that information available, it means we can't fire signals, and no
signals means we can't use the bulk merge operation internally as we
have to fire the signals where that happened before.

Outside of Django there are likely similar reasons to want to know if
the result of an operation was a creation of a new row. The reason could
be creation of related row, doing some action in application layer, or
just UI message telling "object created successfully" vs "object updated
successfully".

- Anssi

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#184Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#180)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Dec 4, 2014 at 1:27 PM, Peter Geoghegan <pg@heroku.com> wrote:

On Thu, Dec 4, 2014 at 3:04 AM, Craig Ringer <craig@2ndquadrant.com> wrote:

Yes, I think that's pretty important. With a negative attno so it's
treated as a "hidden" col that must be explicitly named to be shown and
won't be confused with user columns.

I think that the standard for adding a new system attribute ought to
be enormous. The only case where a new one was added post-Postgres95
was "tableoid". I'm pretty sure that others aren't going to want to do
it that way.

+1. System attributes are a mess; a negative attribute number implies
not only that the column is by default hidden from view but also that
it is stored in the tuple header rather than the tuple data. Using
one here, where we're not even talking about a property of the tuple
per se, would be a pretty goofy solution.

Besides, I'm not entirely convinced that this is actually
an important distinction to expose.

I think it's probably an important distinction, for the kinds of
reasons Anssi mentions, but we should look for some method other than
a system column of indicating it. Maybe there's a magic function that
returns a Boolean which you can call, or maybe some special clause, as
with WITH ORDINALITY.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#185Josh Berkus
josh@agliodbs.com
In reply to: Peter Geoghegan (#166)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 12/05/2014 07:59 AM, Robert Haas wrote:

I think it's probably an important distinction, for the kinds of
reasons Anssi mentions, but we should look for some method other than
a system column of indicating it. Maybe there's a magic function that
returns a Boolean which you can call, or maybe some special clause, as
with WITH ORDINALITY.

I thought the point of INSERT ... ON CONFLICT update was so that you
didn't have to care if it was a new row or not?

If you do care, it seems like it makes more sense to do your own INSERTs
and UPDATEs, as Django currently does.

I wouldn't be *opposed* to having a pseudocolumn in the RETURNed stuff
which let me know updated|inserted|ignored, but I also don't see it as a
feature requirement for 9.5.

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#186Peter Geoghegan
pg@heroku.com
In reply to: Josh Berkus (#185)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Dec 5, 2014 at 10:00 AM, Josh Berkus <josh@agliodbs.com> wrote:

I thought the point of INSERT ... ON CONFLICT update was so that you
didn't have to care if it was a new row or not?

If you do care, it seems like it makes more sense to do your own INSERTs
and UPDATEs, as Django currently does.

I wouldn't be *opposed* to having a pseudocolumn in the RETURNed stuff
which let me know updated|inserted|ignored, but I also don't see it as a
feature requirement for 9.5.

Agreed. Importantly, we won't have painted ourselves into a corner
where we cannot add it later, now that RETURNING projects updates
tuples, too (V1.5 established that). I'm pretty confident that it
would be a mistake to try and make the inner "excluded" and "target"
aliases visible, in any case, because of the annoying ambiguity it
creates for the common, simple cases. I think it has to be a magic
function, or something like that.

I really hoped we'd be having a more technical, implementation level
discussion at this point. Simon rightly emphasized the importance of
getting the semantics right, and the importance of discussing that up
front, but I'm concerned; that's almost all that has been discussed
here so far, which is surely not balanced either.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#187Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#186)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Dec 5, 2014 at 1:07 PM, Peter Geoghegan <pg@heroku.com> wrote:

Agreed. Importantly, we won't have painted ourselves into a corner
where we cannot add it later, now that RETURNING projects updates
tuples, too (V1.5 established that).

Yeah, it seems fine to postpone that to a later version, as long as we
haven't painted ourselves into a corner.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#188Peter Geoghegan
pg@heroku.com
In reply to: Anssi Kääriäinen (#183)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Dec 5, 2014 at 1:01 AM, Anssi Kääriäinen
<anssi.kaariainen@thl.fi> wrote:

If Django is going to use the INSERT ... ON CONFLICT UPDATE variant in
Django for the existing save() method, then it needs to know if the
result was an UPDATE or INSERT. If we are going to use this for other
operations (for example bulk merge of rows to the database), it would be
very convenient to have per-row updated/created information available so
that we can fire the post_save signals for the rows. If we don't have
that information available, it means we can't fire signals, and no
signals means we can't use the bulk merge operation internally as we
have to fire the signals where that happened before.

Outside of Django there are likely similar reasons to want to know if
the result of an operation was a creation of a new row. The reason could
be creation of related row, doing some action in application layer, or
just UI message telling "object created successfully" vs "object updated
successfully".

It probably isn't ideal, but you'd at least be able to do something
with row level triggers in the absence of a standard way of directly
telling if an insert or update was performed.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#189Anssi Kääriäinen
anssi.kaariainen@thl.fi
In reply to: Josh Berkus (#185)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, 2014-12-05 at 10:00 -0800, Josh Berkus wrote:

I thought the point of INSERT ... ON CONFLICT update was so that you
didn't have to care if it was a new row or not?

If you do care, it seems like it makes more sense to do your own INSERTs
and UPDATEs, as Django currently does.

Django tries to update the object if it already exists in the database.
If it doesn't, then Django does an insert. This is suboptimal from
concurrency standpoint, and does two round trips to the database instead
of just one.

For Django, both insert and update are OK when saving an object to the
database, but Django needs to know which one was done.

I too agree that this doesn't need to be handled in the first version of
the patch.

- Anssi

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#190Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#187)
2 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Attached revision, v1.6, slightly tweaks the ordering of per-statement
trigger execution. The ordering is now explicitly documented (the html
mirror has been updated:
http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/trigger-definition.html).

As always, there is a variant for each approach to value locking.

This revision fixes bitrot that developed when the patchset was
applied on master's tip, and also cleans up comments regarding how the
parent insert carries auxiliary/child state through all stages of
query processing. That should structure be clearer now, including how
setrefs.c has the auxiliary/child ModifyTable use the same
resultRelation as its parent.

--
Peter Geoghegan

Attachments:

v1.6.vallock2.tar.gzapplication/x-gzip; name=v1.6.vallock2.tar.gzDownload
v1.6.vallock1.tar.gzapplication/x-gzip; name=v1.6.vallock1.tar.gzDownload
��u�T�\{s�F�������V9�DR����0��W(&���kD� ��!���>�u�H�A:�����r����uOw�C�u�y����ww�����G�"j�n��7�0X4/o�����{k�ck��!?:���]|���}�O�����0�����{��z��/�~P��'�b2�����n����?o@����������������;=����>0�cZ�?��v��^,�1`�����6HS�j^�;��}#���x�>��������I�
���l��k��(y��F����������@�����IX�������-3N�`Q&!�6e)DB�I�f����&�q�iw�xt�$�V

��.�%���`17=���.I"a3�"���_���/#-����P,C-|fOs��3+���A�?'n������a�_
�������`��s����K��C�"��!p�[i��<�A��b���b)�??�Vl]n16��{
���9SX�����\X��=w"\D�:{�������0:���N�8�/�/-,�=09r�JCqc���}Q��WK�G���p�I|����h�>����R?�r!I	p2F��=\1?�Tm��6+H<����Z�LZ� w�D�	��0�0����W��5��<��8�CK���@:l!�9��������f��N��8L�8�J�-vE���j������7W�������H�P�p���X�?�m����E$�
b ���$�(�G���K���QA'=/x���>$%��& $Ca�j����E.v�:��nl�
�, 'R�l�3!���l65����-xa�bm��~Y�Z����X���,��r����xxa����ENN���	P��B�\s��j���r�?�f�>?�@Cu����]��.���WR��H��e�T~�wL�R��`3��_�
A��8�3d��B��V�R�t�P���
p�{����@��vTz��	a]�7��XVN���x�Q�����m0h�MYY@�%�P|�f������0-:`g@��8G��?;
�.c?��I��`���'��f]�l�qX����O�t���������F��j;�&�/��E��]�a�i���Xs�4�D>��Epkh�c������G����������>�07X���e��0@k#��������a_O��#�\����QE�$7���K��������kMxq���z3]a�^�^1s��m���
$0���_j'�*��*���l��n	�h��+9[�ueIru}8C�Krk
�������Z��k�V�|l�����
q�5���� p�9���q��]��4���}�)���4��D�?4��\z�,r@`�
%�����8< 85�����/���o��#e8�r������k��R�����B��waIBT�l�J���3��t=��fp�
l	8.���j3�����@�J���N���Vw`9�jSE�6D�~�����>��}&b����2��O�b��������d|��hJ��^�g���o.o�g���-xF���y�T�2DI�Zf�Q����'�o��T#w������$�Kp�^1����-�U��h`�Q-@,7� �����"�9B�Z���tg�F��!^"���J5_�hF����z�u�$����6�+{p�Iz����0b�U��4:�E0�q��e��6L>��X�s�yW;'��o���-c�P���hw�dm�^�6|}/��j�j�{�8;�h�����w	�e���A�pz�b�&�����f��"fk�f�P������������Xj����{S�A`������2/_��=��`m�����d6�~|3Ua"�Mq��-�JO����j�T��9+g0w J��������c�ki�k��
fcT��0?7��wWW��/��� ���z)�9��>��h:#E����q�8#�g������M�,��`��bF��K�`���\	���!��=�bJ�KS��dY
8n�����V-zs�/��{�R��T
�����'�;iAi�23zf]�\��c6�N'��/����������������F,gH�RN=eazY3�'�r]hH'�����R�k@��~��1�W��8?Z�8u���s������������.���S
noY�n��P������V�6���Y����QtQ���G��m��z*��3vrF5���+E,��A����:�5�T�����R'h��l���J^��~���t$&����H��\B�y0��J�#�&�Q��R�0��%�T%j���.6XG�����VU�_���x�~|5>�x�)Q�E����@����x�D�+�VJ{��U���D����^��yK�3�-��"kK��C�����j��F��q������1��)�YWlT7M/�QZ8�sJ�0�8��v���b������bL�ZA�c6�G2a�XS@B+m��l�$�6����2^��:	ia6x�K���4rH�|��N�J3nydg�>�]�D6pJ���C����b������\����F7?�v�����������"���tOd"A�#L�M�`|�4eb��|����/qEz�u�:��!���
${�����`��*�7�!�\����U�{�������:9������9����(K�������Z������s�rAE9���3�ee��=����vI]��~�R`�6:��c����9�4Fg���(���bd#T��_����XA����d�h�83�~��f�STv5�?��'XWO6V�_1E��W�Fu��4<�u�p�"�T�|���_�C����6�Ln'
�lSVa������p31���zN��E����-BQ�����%f��Qe����dVWp�4Lg`�Z}��3�
�XC��-�P����$���t3$�Ya�R�e�e�����8�?]�&�7����Z.�KB���2���d2TR�`�~<UD�D{��R����)���;���f�������GrU���K
�nKH@�,�H��,��(K��`�ls`�
u�=�W$kK���Q!%'�@4���G[�M�����d�$%dE�H��RNX��r���1#��
��b&�~\&���4�o��~��Z��.��/�
v�%C"�`=�|J�E)r���(Q�@�� �ar9�������$�����
�}/2��
�('+���l��
=�AAvK@��2�xG8��m��tg��}8���YD���u	��H@�<p��<�.��L�eL������ �R���K���KD{�h.no���������
f��3{��^���wC���"��	F��a��?X r��T3�\����}�T�5��r�P��*=��d���['l�����!�Z�����-��'G���[_3hXdi�I�j���q0�%a���0Z{�����A�>�>��['��5H��Fw7'�0R�����p�����[��6Ja��������I$&�RB��6�rZN�(5L7G��E�������7�C��0�� �K�I�:�.�>�2�q}�\`�xL��6�$L�������W-w�2�!�#����7��rT�w&�u���A�(������#hI]"j���v6W����c|;��o�89�����h��Z6=�1�Q�;]��gV~V���^�L`�!���1w��PA���C�M>���	��%�7����Z�[����g��`��k��'?�+�n���b�"������r���"���p�����\K6�a��F��,t]n��,{���N�n>��S���|
V�f��/���,/Ne��iN�������Of'�Z^�ef`%�!�1�x�����>J ��#��_W9�������6�R��`�vAu;��%�
�W=;5�@I3��#����`�f'��J�V�?0]d{��f#�d��j�-�x��j��1�<�*��[��U�S?ed�,�2����8`�_F��1�WP�����������u�T��]l_3�\������C��^���X>���~F�9X��[��nW�`����3KX��i����
~�=q>3������p���w(��}%��+���U�;��?s/���^���M�Adi~A��n{�j�Y��{����������rB�'Aa�\z���c��b�x��-�58&O1�����M�=���Es:+�{@����7��#�2h���%f)�/_f��,�~����l��9���s��5���z�]�6/��Wj��E�%��j��b0R�sc<��qM�O��K�v��������2��oG�1��Ah5��l�y�6+�c��(�FQ����k�xvF��4Z���CUE��7pSSu�%��b�|!�(�X*7��e(-
a�7�-�L�����UY� �������"dX~�/��~���������)��vi&S3W��.MT��[b����V���s;��.����eu���6�n,���mU��M)��������t.���F�n�z�!�U�n]Q�f� �����#>h��8�2yM@>�
CY�5���?Y�6i-x��r}���x�vj��M�|���b
.�3Z���U�4^��*��8*����^n�2�����j��v�e,!iX����.�Cnv<-�Y �oe�����UU��5�eU�v�a"
Az�[p�p-(}�L��2ZqD��q��:>�N�&���Y���Ow������}�\a�^��j��4�����@����N�q�O�������N�����c�{�����?������p��m��m:>4��aCp����^�o�3������'k6��������q�O��QM���j��%)���
���u��M�o��N�Z�l�9b�W�Kcx���tQ2Yi�6��Y�u�*�5�'����L'�"f
4����D�'��]��_\��+�5a��)bUhr\j��)�#��4��JG�\a-�x6>�Z���w��dr?s*��+n���\���oX����{r�c�^�C,�j{L��@L	}��q�a6��2O��x���<���4P�56�l����"��I^��2�[�����6���#Zo��N�K�N(v�4�Kw��1���P.��X`�#`�M��gu�w��������E�E
[�-@�o�C�%�M�s��u��3D[������AoF,�)�AHg�L�|�B:���0�_Rh|.�M�t����cK��+#��i���	'�(���""&D���Q��E�>7h<�����������^e@��+)��f������A��IQ�Jg�qn?pO[������H�&S���R���%�����
s����B��H"�_��<��:
�.�L�K�`:�=��{�����D^�r�c��Y�	����50$A�e�� ����c�}�Z=�X*Zhq�.���d��<���\���q������t|2TE7�L�{����J&h�$4�aEHNzt�9
���8A-|�����Y��5b��k�z<�����d��~���K��8�#V�zU�Z���gm�4��{`�"N�����=~+"N2x��N�U��RaCx�L���(�����O�l�����Nz:�,F���ii��v.P~�4���Bc�^eXd��]�I%e�4�r[���O�G�6��eu�*����tTN`45����^O�%<���`B�0�V�����mmd��(��ST���d������Av����{�N����T,��*�4Y�����:/u�D�+{�yw'�@����u�q��p�$���W��#�ju��V_#@P�>��8�.���
�Cl����H�)�M�~8 ��@�J�����������a����M�����6W-�D8t��D�Z:�U��t���V��:��8���Y����N�7,�'Kl������0���i�H0�Z?Q��R�
�N����Z��@y�!0sx�����Q]Nf�N��5�U�1^Rs��1�_I�B}��x��Y��
����Xv\������9.X�XI�Q;�;��t�F����'2���?�&/t��� ����uu�ve������������ ������A�s�g��64���E%y���Px8�����/#e��|�?��������%d�����C�U��y����o��6m�7���&L�&��'&�)��p���U�Ds�����9~����d"�%.�A���6�;S��y0WWS�]{JI���qM��+�R�b\�2w<X�d��DYD ������Z����~��d���m�tD����dB$FX*�������0NCf���-���{�������|f��RM�%�qF��	�i��q�2�"��v�S{&�q�T�U����jvO�+�%-x�`�|�TL��=���h��j��,���y�!!��t��C6;�|�}3� �:�W���?�$�_��\]�x��|�G�\�M�����W���p����}���^��e��*����"���`���<�������Y� 2����_�I
jZPB���������<(��Q�Y�P[���'�5j�6���z5?G������F3(_\���/�a�IP@����cM��t+����3��Y���-"#����y;,����[��Fq�2xU;W���e ��bn���=�x~�_��������"�j�7�V����-������BeW�dn(O�`f�{�5�68�C�����&\�l���a��������6�@�q;(����i���������]*��u;����������*
�����}��]QE�b*����1u����Q{�\;��������g~3u��*������iM�w0����X���&j�
����W��8�RPUvp!�0V+�.Z�by%��,�Xsl*��%}%��������bsEE9����[�"���k�����S��������d���V__g�d���A��w��t8����V��Y����J���
�������qk��������a&���m�����8������8J�IQq����D.0��}�������#2$��;���-H%���3��S����\��^V�4z
"Q����
!���i��9��*�"�����e	������4������u2��z�J��d9;��WVEJ>���mT�g�j���54���`���7j���}-���Mdvkq!rK�?D_-������*�x\@��rT�&��@����_��rA>���|lL'[4��� A��b�s��jP���~i|G����=O)���~����~����W�o���Q��
����E�W�;:n���t����)�����U��Np�}w���.����c�v������XiFV7�*�Y�L�G�m���;C\��w�z�2��1j�b�z�����'��,�,Hv%69xQ���Ki j��>;����u���L;+�a�$�tq��O���B�+���B��]@�z&9�}=�/��o�Y-~�N�������	�* ���/vSU�M��c��F��:4 ����b�A2����v��`�_��`~x���G;�b��f�I��<�5��d���\���_nwN�Id��z��Ca���W�!L�������.�Ah"�6&��h>���O	��{r�����z����n��gU%�Pz��Wv��FP�F(^G.��-�S���T�����a�n����W����QO��3���e���u��OIo�����/j�F�UT��5o�����r�)B������L�k:�i��u7[R�X����3��na!a
��M������Q���7^�����6�.�u��>j
���~�5<(qV����N��!�6x��B7�rR�
�F����<w����S��X\5X���U0��XK�

X��Ep��P Lw���Qy�Wa#�`��b���i���.�����h	�_�K�K�����n54UP������H�)�<po/��F�
�����n/Tn'|�^e��\w(c�g\
l���uk����g�6
����h����?b��X+�����#���	_�<F�m<�>�q��V~B���	i�/��L4�n��0^�f	��O�8�)����al�TRa�cv�L�}�<�������8
^>,G����E,z�p���P��_'���g�&���yip?����A���������vvh�R+l~�����i�h�5��cD��- ��F����\��d��>�bb*u�[?������-�F���z"��\��	��;�+��B��06�������p^e)�)�9Kg��+��g�:�S<�`�w���8����M�R\At�����d����*�^6d���
	�.���z%)�Uc��"��g��k����0o�������)�����������}��8V�1�pMf�J]7t�W^P��������?�{���]\�����H �`�k�^l��9F����/�W�$i!in�:��OQ����6;���<����]�u�����G�=r"V���������G�/���HK��d� Di�U~e8GI`���e�}e��Jnt{{N$���[L��~�?������������
�������n0B[�Fz�K��Q��T<�%8�g��.�]�j���wPHE�yK���>������e��	��a����/VR�xy����#o���
^��.��,7�Ks�(����Z��n���p�3�4]c{0:����Q'������l���u��UE��]���	�a��=��@����E0��$>�`�����)�IY�=�xm������/�����&��-�(�
�p��Ki�O��0�HT�8g�9<� 3������H(����H@.������75K�I�q�[p�q�{���W��=_\7���� �2)��-n�e]w�g�)<�"�����}����^�\��||-�%'@�� n2��5-"G�;M����MD
����A�<0��}���xX�r��Z�4��4�Q)������G9�����B��o��o���o�����e������Q��o�UT�����\�N�)"��-L�y�cH���U�������1���������]�+��?\�ui�M'�w�������){������V��vtLC�Cqn7p�Gc�mwC���C���$������a���v�����������2����;������r��$"(U68�0.U����}(��,L%h�������%rBB/�E��3��Z
��bTu���@�z���#M�1W��r;�%��5���N����w�J���6lM��~�+�I�~�S���i�q�V�P��7�
���<N��)3j�����#���C������^p~V>x!�����q�����{���[	'8@aI)=�(9��d��p�!@4����R!�Z4�� ����s��J~�,\A��tUN�������c��Y&�S�L^�v��]�7�^
wY��f�	h�5Z��AW���N�L]�AJC=��!Xk
��XW����R��YW6�������d��{�t��5��|��`SF#(:yF�k5�3jb�c��q?Rz���?f���5�:h=U����3�g4�����f�~����Ex�����L�l/;�b,���T��sg8�"�\t�y�d��MK�j#��:�q��5Qs��`�
V�&8`D�QL��d����������t�15S�-�s����)A��d�*k���\�*���
J:��s��O��)#�?���u��nV�'���Hj�m>��:�,-���C�U�� ������y��#������Y2M�~<m�^����R����s�~�s#�a^����k�
���>���D������/������'���v�����^�_T)��'��=9q��#.��~Z ;��?'�B�Nu���E ��=��Z�h�P�����b��D��
�O���`Q�,��d+�t4\��!�T�LF!V���x���SLu�v<�e�$����2���'���@�7D�������2�#�,��{��"D�'�UZ���������w����R���mMc�����_C�Tw��[ZL��f=LV~6�r^ v&t/tw�E <�~�0��pH��	�f�j��bI4�q����7$�� Z�qy�:������c���(��"H�
'&�SC�l�iw#�4�3�gp�X�]���t���{>eb,;��s�5�_��s�7#��H�o��7�1�;�B��#Q���"+G2�BA���
I�.���	Oq�����i
��#�m:>�����d>���fh�BJ �!��e;�N+�8`��`Q4�1��<N�����#���a�H�T-���D#�V��9T*"�[GE��rA�*Q#�@�J�L���������,��n�B���M�'I�@F���Xe�����#�8������-�h�!�����i/��a�j�����b*�f��
M��x<yo�AU�)l*�����~��S�r:$���L�R���(�s�b������LS�����"�g�;4v=B����*mlSF��MD������Ozk"���8������K�a��DY.��Vt�o��k��� ��Pg�/�X�����q�^ou��(l�U��T��/(K�EF�.����q�8A@�Y?����4zD���mF
��=E�����'��s���l�d��(0����V�1���L���(����#�>X�z�����%�#II�lPLx������
�r��-|��������]zg���<����hw�[�N�kOV�7��)�"�R�-��j������)3
��
V���^S�������v������"�|�S��b�j�s�����<	����j{�����>����`����`�f�}vQ�\��;��x B�rf��]"^<&��"��j|]�e�d�f%�e�y�
�> 6#M�o.�����"F��j�X�x����mo���p��r��=��Av�8���L�%L�����4&�7������1�,C.HxC��cb�f��e ��C��px�Ss�XXa�7��M�Z��a8T��\SOj�+����]�$5LeN���T�N�5�����;����Ec�(.���+�\���N]�>g[o�>��2���-�c���>�Z&i�;%�W�<�����J%A��"��$�2�M}NQ���f*���_WR?l���&���MV�n��Q����'�f�-�P�0�yrF�������
O#�������+�)��c�<���� �`h �,��c7���(�����:�7|�nP���e�D����Ds��g�����%}��H��[�Zro=�!�,��V�:�M�f����]2=][[W��E���������cDh�4	��!n�w\+�({
�m�`�>���'����&���],X�	����sD$R��Cj]q�Sdt���q�/D���}�Irj@k*��)X����
y�6\"7��e��P
g�8��Y4g�B�(P���}YU��d���}�c|����(7���t���d�I��Q��06t���q[�x����}�&�.-�\d�$��ao#s�B���\X�2{�e�AT|[�D&@����q4����!�a[F3dl����\x��&h�����N�5����5�w+O�������gb!���V��Dn�B$ Q���������b���l�d��'O�Ke��B�P\l���t��m�������CK|�-�1�����Uf�.�Js��4\,(E1��=�����������.���0Z<��dcn�����$�������m^\n�R�Q�'�$���E��jVB��]p���/<<���p���)��R��0���YL(x�u$�>�e8v*
�CWh|V�g$���(.���q�"�N�4�u�|��g[�"9Rv���#R@�C���YXL���O�w�6a���6Q�qv=M���`�
��|�S�N�+<p���j9�����[��z��]?���d|L�IYR�s�UC��CU�-t��<�h��Q�S#k���1�y3Gi�w5��������F5y#AM)�!��]M�������p(��6$}���M�3��O�f����Tqf	&�
CO�x@�'{0�,R�:B����������d�u�<"�e�T��
E���E���8�T��,���cV����Y��1���	�|�i�m]����4]��9��D�P��y*,�A�Cd~8Md1�7N(\���&5��&���jX�/2����a�c	��p���F%�����t�t��k8n{�W���*_��<}�j��O^s��G�������L,�/��>�^Q���l�]�L#�����`L���h�Z���C���1��L����4ev>�{����J�m87�Ir@f�	`�S ����	)�58kr�f�F��b��t
;��y���
�Jr���G(,2������&�_���4���]w��S?���E 11��1�F�\�c���xB�p�H$�o�f��M|!>ks��w|�<��'��`
K=�$����b�!
H%u������v2�����*s��hD��B
�)���a�O�vy#P��J���c�G���dE�VDe�_0���J��VT���;Eqj����/� ��9XLC��{�A�S������	��6[d���[�������{i#~�����}�b���\]��0���O�ne��a
�xu�m@��8�plY��Y�A���8����}��nM���]o�����k)�<��6xH>E6�gD�;S���V*����x�����c�`��+G�&���@�{�mYm���2�qJ�Nn����KmCp��vV���8�W\�ytOuMC!��!�E�'	]��uR����#��a<�s�)p,�����(t�,�3&b����D��p�*��&�w�k���64�h����������8�RC+�����r��q��p����)�f���(
���.;7a��b������e����X���Op7?��F���o~�-J�����SN+�0*��F/jn	�]�F�T?!�j'���bda�#a�
����[�r6�,�����tj��M�{+A��!��5d�`!kF�|�#�x�O����*�P����w��,��<��o0�w���[Z����V1��ej��d�'�v�J��)2����HT�w������S}h��3�',}��j��g��I�5�����5���������a����k9����FxZu��nW�`�[�����m��e�g���0V��v������3�~�g�9�������=�[}������:���[;�����p�&�O��~�V�%�AU�,?�d��j
�Q.�������l49�C�5��B�Q���K�l��
S�zq�S��?�|�����
������������YU��+���R�|A�Iu2��:cX�xU�:q�p���([a���F��J��#�w��*�&L2��t
,��0��:^S���?"��"�'��{3���1�bSW8Vk���su�b���d0��[�-{�?�����
rZ�]X)���������kF~`S��.!bOrB��z��\2���?U]Qa�[��b���s5����8"�J�g!���{�$�n�����V����.cN<N����e�Ur��6�sE��$YN
K�>�Q����@W�0���
�M�����n�Vb���x*25p������}����p��8-���r��.��|/J`�-��l������B��~�[c!-4��_2���u��P����������?-*b�r�>��P���Un%9�L��l����7N���n��mk��zc���.���~
��-?�����T�4\l�9���P����>G)�zgTm|�d9x�G�����t�0O������S�����%�%Vuj�s&c,V������:o0��*���P�I�Mq�`���)(���bC�{��&sU�r����:W�MX����}R3��<t�5,=��LM���������bH`��s��2w����B�mMa�Y��l�UhT�mT��^��i�;F#"��g��lcV);H^0�.V�����1��h�O�����Jft/�EW��c���1�$Tl@�f(�lQ�N��X:�������~��/�|`>G"���%�<���DZ"�
�������I/0�xLV>�WI���
~���z� �����[Z9���}�����S����JBn��"I��Hx���ri�=.�=(���Yo�J�I���oaJ��	#�]gvt���L���a�F�^W����;�������}8q�o>
����}s3�?	����v���2:z ������������>�Tc�6t�*�E����:R�[�]?$2F�����=��H#2��7���
��:�`_J�������u}��g�~���]�����\��(#q��(���W�o����Mu�z~{�I�l+�OEHT�uf�����M�O��n��T�r��4Lf���YK���9�9���Wl�hy ��&?���3�����eD	�t]���������K~�JC8���g��."7B�ln��
y��6W�`A�n��TYUI�fQsk�
l��A��r+��Z�C����r-�3�H-�$�pS��PekRp�6��CDq��
,�����Jh�%��:;���������@�JT`EQTx�!��M��=���A��Q/8�H3#EeN�R���~��q�X����k�X{�����������*��-��5�������[����T�j&w�2i�(z�1a�����<�Y���s��{LMB�&�.\R��J`�A�*���C���d���FD;��6�s������..g-�FA�i�W�k�:���`���������'��z�,S`�E���	�{[H�^��(�^T�q��#
������8�(�\�z?;�_W���:`��q_����������dQLa���������(�x^v�6�hn������{_���������nz�z'=��F���b�[���1��?fV�}���0�k���
�alaC��yEM@�K-mT�9b���mT F�q���>��.�j��
S��'��od�t\z�P,u�bhL�����1�����9�������1/3^v�Z`v7d�q����E��=@_�<��D���NM��l���2C8}��z�7&�	��������]��8��&!�6~�%�~���@����vz��&����3���\�QH�'�"��$�3e=�E��+f�����
d�#*���L�**^���V����BH{�}E�N��~Q
#��G�G2^L�zW��0�o����	�a�V�9F��@,�KI`�9�2C����K�fqb��8s9P1c`6���v+��?h��>w��?ryu�}$}2���o��Nq<������I\z�>��!��*3�"&�"X���n�������-Rg����"�=8��8�������� ��{'a`� 8�*X��43�8���s�<5�#� �[����4o�*_��-�p�|���1n�8�����Z��/|�6�jU��#\0N�P�,���	��H��v76�����+R�Rx��%g1X������l���#�u|�`Hj�n�tZ5��c���s;VN�Vn��p#����:����l����d^��o#��U0�Z�!_�2w��b49)���qt+x�����I���Xu�^{x��=����
i�FL���b��[��^l�${�����.�=
X#��:��`6�$x�K���nn�*�A�?kq�:���9��i�Y�E�"��9,X�}j��tg��q��>�0��_k?���U���9}T��'H���t��+R'jk,��F+�����a"c���]��(x��	��d��2�����b2Z������>r�E�'�F��j�Xn�9����|���)���)Y����h��C�R���N����n(��~����$�����!c�������|u_���W���p�+�!���w����*c��)3�:�:7C��%E'�~���u��W�G����x�Q��+�������7E���}�}x�w�?�,B��w/���>#����v�$����1�>[%2���U�.�uh�Gi�!��n��ZI���*��P��v�z%c!E����"����v�����2��K������T,'�g�-���v�hJ��VG�	(�W��22���p%�� k|}4���S<�]>�z�E7r�"m�oc�h�0>����\�$����Q���}5�������

%�����&Gk����cP.���'`������|@��o���c;��-tO^,4������do|t'�SLL�=��2��h���W��i'ye��`,]Oa�����4B! |O�P_?2�*�i�YBV���:1�ft�~��h�cU&�d�/R7���0H\�5�%�����7jd��K���7<���:d�#s���@�e,A�=�)skbw�&Y�Jv�%(	NC�E�PsVMb�,�O���)6(��2�.�������(�{b�ajB|4��A/M��y&/�|����m����7�>��R��3J��J���m��d7�����1��}���H���	���U����@��`���n��B�V�T$
�
[� ���`,��o��Z��gh�31J/W)�Kf�	]3��H�*n���������{�:��PlfS{l�k��}���T�lXG��6��z/��{��`�^8ely�02SV��U����������8��|#���������.�=���}IH�K7&��y��&"FXg�J"��M��V��i=IYP��Y�,�x_8�����|�D�C�+�hdG�-����9���"0k����,R9���X��'�����x�����N�_qZ6���I,k�-SK�Zm2\Y���y����+��-R�
��L!���"�h@tA�)��h�@��`��\�+��1d�T^���l��=����esl��{����=��n3����:)^M�,F��	��������:���P�m�Y��)�z��3H'P'�Q��6
b����vQ�!T4C��_�V�x&��A��0�b���(Jk@�"] �G�Q�Y)�l�6h8:J�T�Z��!9G,����9!G]0:H��y�J�O�W]��go�b�Hu+y��jAX�^y��]��L�2��
E�"?=iD��D��9��V�"�C��s��#������y��+��
�����E�R�0�
'�������7�k������h�x�o���[
e����Zz)��V��8'�BE&�������������2�Y�G����_���2AE��MfKPw{��o��yX���HGFS4���lw>dl]�kd�	�f�31\�����i�l^�����$H�	�\4��Lo��m$����5_��-���8u�v�/s������N[��t�;��h2>��'��B���`6���.�R���89yF�Hd%Q�[,t����A4D
�L	0X&!B������,��f�w���#����hF�"�����#��u���m�� ���3j)gCC47��y*�$�z@n����T�y�Mtq*�����[�
'O��#�*�|���Tb��c�z[`��v�Cz-����Gd�0c��F�<�0�3��Z)����*�����
����|�r��Y�������%��h���/�����g_`�P
��C��B������ ��n�L���	v;�)����-��[���8�
{�P�h��H���oi@&��+���&s/�T{�����h�m��x���� ������>k��L����d�z������:�@{�������|�����7��Wh��9+���Y3�&FO��p���T�����xG��2�tS3m��8c�xF�'D��@���1����'��J�e���d*xi~�V��0k@�2[*�uT_az67������H��L���L]��\����[4G
�QG��${�Z�������-H�A�0>�db|��i8��Tw��=\��!y�9��Oo�'w��������������M�������$���!�e{s����a���o+;����J,HZ6D^SEnN#�Q�" ��`�� '"-�#\?�X1�d��@�4<�P�dk��Da�Br$���}�����u��;�~VwRXe��a����=��G�
��dTY��������1��](
��P�;�"r��0������pl���~���<����G�	s(�����+9���C�bB4���L���:�	�'{A����g+���?u>��&������Z��+L��GF	��q���3���>$&����A�(��p����h<���su��C��~SZ������R�K�1�S�&�
��1p���u�Vs@^YL�n9�y�9K�D��e%�=�c�SL��r��5�Ym&��*�Ay�F��XB���h�[����8>�(Gbd"�:Kl��LyH��"9�
H�Bfghs�2�N]R��H��o������F&I���������R���5(����A�������f��_�)�����}�G\�3+��4K
v�at)�CQ�|TV����TLs��bp��p��6��J��
.-��C��o���D�����n]�d2�.�m�����J��]e�b��+�8K��K������C����i���#�5�4���$))������F�/�c�|*~�$�k	�O��	�����G�tLQS���W�jZ4ih�.��W�G��1�+�VW����D�;��y�V{����?���~��j�>��D��HP�_�K����M����~�y�����Y������O�)������f�����J"�a�S�g����w�[�q�5�z�0��,�b�?3��e7H����&&��K:�5�����w����8���?����}7`U0�������*c��W.ji�j^����j���(c������*��A��,MQa���}����F��;�$%�Wh'0\��?f�7��Q|�
�C�5�j���%8�&c�u���l�&��q<�T>��/{yz����{����yFT�u�M�J�$������A�~�D��g�?�f6H~�Y��L�<h!�����*��{�>^���_]�Nn��V}'Q��a-�;�\'�.�
r�c�3�T��v��%��t���2 �L���B+�4zt�I�J�u��4�NNR�0��?�����gfRc;(����q�����"�qC���^�p%!�Z�I8O��:-Jl�:YX|�ll!�wS^\a5pFnt�6�&l�(,������}4�It}`J�@Y�z��P�u��I��f��j�%��c�Be�q/�b%5�09��^�!�r��&�;��j��(���";�J����1�A��g�b9���M������'qcT���jU�w��p������{Si������K���z�4xYT�Yu�Va�8�-C_c
xQ�Ur�'\��>������e`��>'+���vu�O3��)����E��
�<�*�������%�\�N6={��������8�Xp��b�Py,N��|���pL��@���>��?#Tt��:���G��ry���@>���������j�H���FW�db�%m����)�����!�1�]r��dq��������K���d���UQ���TfR%:��A��
�
7�K �
Ep��H��+�B�n�����M���'EOX��awX�R%=C����q��K<�8T�"	IB��}���U�h{E�1F�����^=N�+��N\�$�N�g������Dv��E������Kb��)�8h@|���`�%I�,����.�]a�n��� ywu������*�l�f��Eo��I��������
��>�Zem5FH�����n��t���[.�R'G�
RL'C��*���%���$�[C��������F������J�D^y��� <��/�aj��i�i,SJ�n���9"@������A���2~�����'�qo}X2'��s���M�j�i��X�����s����>+����|�i���=,>�J���=Cyxn�w����K"�=K��;�R\�+*�W��9�5�V������~�]�5�G��r�5[?/�fK���qm�����������H�j��Um��pV��������}V\��=����qO�����%��:%ob�7(l��������R�3���o�&���p���r��,e� :Q��?8j
+4M�YM.D����?h9O��9O:<���nN����K����M�����x�G�Gf��T����J�pHdj2E���[��D#�M1��������fOX��3�$o)�FJ����dQI���
����K_Y����(*#������N��<j���U�����-RX�vI�E��~�������'^E�������U�2��u.O��I��}�����`����'�v{�����Ro�{�{JP;�NxN��������{��j����q��=h����GQ���S���K%��������O>����+���A*��|������<�].'�A-�d�
��9�E8x��q����tTp9>��0 B�ZXx��W�,��������z�b���7���I�kw��HIv���;�/+�1o"j"�����4�m94:�����T�f�t���/������� 2I�>��T�4G���!O'���I��VKnq�p�+��}��V�z���F�y�L?�� ?x��?���q��l��0�'��C�n�F���^�t�U���&V�S[�������_:�N�:�)*��3�^g��\�"���1b����q2�{�k�E�a�;Bt����Kx:����Iq�
jH`���������k��E�\�m8�n�����;�����)!Tp������|��_�A7�(`�.%���\:�~/�!D���!N�4��X�'^���7���e��|-�m���y�g��p=�p�`�+N/M'k���b�BM���6�-S���t�m�}��KU��VA��:�>��	g����d��V�z�+6�����T��8Dq}(���}�-y���
�R"�p����f@3^��6.��=�2��G�s���im�
��C�E�#���<x9X��IoR�/��k?:m�>E1?J���?��	8��C<����l�;.����
�[�������XLa$w�}�&���h���Z���Z�Z���G^�6N�x�R�����:j'K��L���.������8o\m��z-`_����z������k93�������yG=��x�f>^���u_'P����v�1��}dE��]@����;���Tl�������:�EU�A����U�5cW��-��<K8�V������A�c#1������po:N��_���Y�����y�N�a��d_O�����R�,i>$��0���$}$m����!��jh�N9W�&��N������o�{k�
�X�����1|�-���C��G���x�Ew����,B���#�? ���x�d��O�$��kI��B6c�="��������%E��!L�����d?���Mii�Y��it�d��k8����%�n��10���+��������Cl�N-0�H<��d����d�����7��� 48�[H }�3�q�6B��Y&�%�c�r+�,�����o ��F��?<�+��{���]������>������P�b��"���<~��w��t������bE��u���3��z�U���'}.3������p��+��_�@�A���.�Y�*�	�D�t���FT�,lk����&�������/j��L�t�2����+"LNoQ�]�y�^�TRG��EL3��`@������3S��-'��4��_cI��N�F�i���}���q�C��fa!���+��%���)'�)"�
(�����
D�:	aQT�����_�/N�/{��n>���������/����-�5��-���K�����E����l}s����NA�-�hpo���K(8���>�~���z��9�R\/\���/W�l�~5�J^��1����7?�r4|T(�����l_���u�H�j�u@�����q�Ew�W��36|��]�ez\$���p�$��4�����g�~��I#����Qx���� '��`:r4��/��D��(0Q�L8%B�����_��.�i��$�;AzR��|����������o���s�OTzR�L��"
~���$��5�.6��aA�����O �������YZ�_�JG�jU���7�|i��� Yu��IS����J�?����n���_>i�J�W|�xx�����A��h�U�Em�u�E��f�p�������-�����'YS�M#�;�D��	��Nl�@]���������%�����~�<��7��U��r�A��I8�.w��-���>�FSF�A�������=��d,4b����/��m�;pz/�l3re�$�c4�X�������z&�v5�EA)������q��c��7��qN�h�	=���	F�����x>����OF;1_J�l�
��9��\�q��k\8N'Bn��%`�Y'hUbV���6���(U,�Vq�=���{�$m�,�[�P���IvZ(�m;���I�Z�Y�0fR�����������E<NWS)�d� j������a�h��!��F��-F���%�d���S�2�r���a��n_'o���g����>.��Y���~aOW��-64�kW�+��O
��Z�N���9+����1���wVR���D��Es`A��]DM�HR�O_�,B��r�!Z�E��H]@�'�8�!�����!V@��IZ������'�!������S5Bs���kg�V��r�.a����=s-�3Jx9���}��M�R���/��M2J�A�%���a���@�H4����*'b��J���p
Q���5����h��W
^z����P�/��P�JW����q�O��Z��B�qJ�90j`�t�f�2]���� ��V��E��qi��3�W�6���
��d�q�����jf���\&v�j��m�� ��X!M/���<gS�J�K�
�Z��x���:� �sw��5��"�1g=,^(��T$@�'�:D��_��\a�Xt@��� ?��L�q��H�q��`(���c�p%*��/Y����R�#4rM#e���!�.�.����(���uo
{O$E�g'pP<�|����C��oO1<.f"����K�*���B�DBf#J�+qA���E������0��`V����0)����2nE�[�A{D{�x"��C��R��T�MFC�(��=�>��'U;�$�e)j�0b�PR�,y�:D�!�b�tRb�Dz�qfAa'C�%d�0uO<"��B���53��H��#��d�x�g*�[�In�����{�'�""�T�<����dJ�6Fe$�X��w$���������Z7S�2���;�/�%.+�b�b���(�a>�"{"+��$5���R�9=b����]�Q�����2�����&`�?��8����!eY.���pZ>c�F�h�'������X�
fy���{��{��������H�E�`���rh�}����:���	+�������/)��[vJ	{����
���ra�sq_�����u�kWX����(��,\o�����@0�e[���tV��)�;����K�
�1�f����/��>^0X�Pj�xt�k0L���t���X�8sS8��{�����|�@�i���M�/�"�x��
2�uAj>.��(+}iLc{���wz�h��L.:�����U����$��.��	<��@"�;��Z���f}����w�U���)��#�wA2�kq��9T�~�_Xf^�^)6�4��p�����k�����7l�N_����0��	�����!�����$������8������Zk�!!�2s����dn|X0)[N��l������x&��&�q��fw�HY��B�����H�h��A�$��!�=H@���Q:%���_�p������+h�s�^�|��w�v&����m.���>��E��lo����� uad���2��lJ���
|������������'YC���a~���ON�jmz��f7H��@�O�����A�hg�ni�6�VA�b�x7g71��f���W��"�a{��O3:�����8�)����.
Y
�T�U)X#3P��
��L��%b�����D��m?=R��Eu������:�X���O@��77W7V��D�9b������n�]����M�wyu���x}}us�=��
�6I�+;K�7�.������c�K����O���p8���F�7���_/�@��Z5���C����� �fb=���N�!2L:�-?�������|�Y���<FON]� ����,i�q���*HjW����d����R#C���JVyin1=N�WO��"[�r�}S�.2�f]�*h�������
���dD�!��*���~�zH
�R�v\`G�e9s��L+iUQ.�HG�w��Y:b��?}5<��}`��3�����'s��%�43ju]��u���mGG�������p���=2��#���[�"��`
3���"��n~���?9�t������M�k6��U��V�|\1	�8�J�������.S��I;B"9C=-,�b6q�>t��������(C�FfUXw��YS��&{�P �R��J(���M����`-����F`���| �`/fE6����P�q�N
"wH����%�<��p>�e���D#=�DOc��f�����1�d~BhI�atAbR�L`����.6e$#�Bb��� ����������l�)������:���h�,�
K���
m#w�����dj�a<�J8

�+���w��=�����b�H&�=e����&s�����(L�6���m�\��� ,���zA���Aw��`�������dG�X��<�]0��|����N�)���o�n*TS+Dv�f�9�r���0�:�{/
���!{!Xx�P��9���dNUl�x�j&��� �"rm`�9�blp�$�c&��OZ�iy�������q���]*{����������iX�"Z��������T8�
�sO*��	t��P�y�Z�P�p�(���]69��4y�b�������;�I&�z���&���<�2�L����9���O��8�d�W�Wny|�r����&����Q��4����B���z��r#�5u{	��+u��Z��J^/�4[��I�\�������xu~&W��{��S�&Sn���l�7F
	�C�W2B�,YHtQ�u����jFW�I� �	Y�r��P�����\�j	�!Y��	lA�0������p�G��x``j���0��������D��O7�X(����O���N<��\�'���bA����3��4#d�f�����&4�9�5[��Zs���1=�(�
�����^���H�>��PhL]�y�}�.�}�7[�gm�&?Xc����uM
'��mV�7��kb����'��f���X���E��)�n��*~��9���d�P�BOx�$��Qk�(�[����&�0����T����q�f���7b���$E�{�.�=���WA1.�[A�P�3���,]���o$5H�������u�6�
�������������d���O�L���?L���:�������.����	�=��A����VT��E��[��}�)F%CL�v�mF;�/V�.*
���n5xm��V�U4@{_�z~E��Es��d��V���NU��S� �@�8���(�U�6[��������U��jv���+'���!���+�l1�>:F���f�y�����R��{���1?��E:�)�p;L��t��CyI�O������u�����K}��T-���H�`��EC�(A���`$^��`AJ:��/&G�/���S�F�1M�a����Ju>���$��si��m?���"�����>QZs��m�M q�B����������Or��}"�����H���}�^�!�'e�����x��C��+LM�8>�
IC��#N;��UL)��CO�M�K��/%��������a�V"�V�}�1,�����a�t�n�������ivC+��y��{k�ej�lt	r��>W�RM;�V�E�	<lJH#�����Abi*f<~�W���0�o�]t�2�n��J������d�WS�.�K9�Ibw7�wuxV�Q��i��������bM����A�z������GY��$������o�����F�?hnh�igE�E�$�@hr$
��GcT�
`����e`xV���eZ�0L+�$���pm�VAp�i��,i��1Z%aC~���vWx��3�H������Q��Q��i� k��+��F�n��+C��0%��X��!s"WW���"H��Nc��^?l�F�MI���*��x"��
�R��v����"���%Fg�Z`�l�a�B�rQBHU8���0K�4����q�J	[�?&��o��F���"��V>��bj08'�$X����S<{'�F.5v�1IaG���$JD�,(����/(u-^a�����������~�����hU����oS�v'�A�Wr�.F�rf*8d��|����g������c�.�����D�hFn,8Qb}�l�x-�6���X��$[S1c�i1�z�����J�k��C}�%/E��8���6E���<���	��YJ�R��l�8���H�U:ee�:����v�����y�f)�$JR���x��?�9���G���r���X�o�u�a�
���s�U6W����#�i8�;�CT�n`N��p��b-�V��|�w�n�t�ENb9���MN������:!(�w'�o��Me\�F���jv	������K�1\���<%����w����SU����[��}�����L'��&�q|��;�h����M���B��*z���"�Z&k����
�`�x�S�c��hq����f���p:��=�tP��� 9|��-���8���I%��^����T���?�[�+����Y�"O�U�f���4��<;	V8!���r�a��=`�]�����scX���1v2;n������YIb�@����G�p��c��T@.�.�������7�D{�^�0�5�A��W��j���6�ME�e}p
h��1#-1�����Xm��{z��&����M"��V�J�X�hbFK�q*��9��7��>�y��<���$!aH���$O>�H����}�(��J^�p�c:�5#d�sQ� r��q�xp]�����k���"��m���gM��N�9|��0������!_�K&$���z�h��}�io������*�����N�q\,�����+;�a����w.����Qv*]�t�RU��a
��P�/Mq��*@��O���VX66
�������CxN�����1}�}���T�]M��-��Y�\pVb�B��N�����XZs��������%�@R��+�?�����L9u�d���t��_$�;�,�x��l��@�j|���@�{�>SN�m��?�p�+�T��s	A��]����� W���WII�x=szX����r�hU����j��Nb����$���G*��=���=�nH����=�����-w��>h�ty��F�AE��x�t���a��;w=���$����7�G�Uf�q5���e����7��^�LJC��_u�"�$8Gp+�(.���G��`��~afS�p{_�t�Ju*�4�P��P�#���f4|�i�pIRa�v��,�`���p�az��:xH�$>����[8����������w�hA������cx
Z��0s
"�(zt�����7��8�l]�F��1F�B�0y���'�g�`��/yh��������yld>�5��L�-zby����v�cpm3�
p���u-2�w��B������p��
#;k�9��
f��2��Y��s����%��l0�z�k[���@&�bs,���XuZ3���a�$��cE2����GU�b�|$�i�(6���
Q?�����u��g9�W�c�L�k�?K9u��������5�&�,��$:t��f�>:2H��dO�1�\
����������RS����rO�=����`�������@rge���ex����J�;�}5�����}��|F�����G����8�X�_�9��i����0ie�
x��z�u�C3�O�w?d�
��Q���S�>�������0�G@��7��(�|cM')��������-[�0�T��8<&%�q���j4���;[!�����Ii��qM��p���_*W���#���F�E�G]`��|����5�W*ug�
P4���9[RO���T�����@1h����	5���!
-�0Q�������*Q:q 49����/E7U�W��A�mflZ��/13��1�40)�����8������2�|����d�t'Xz�b��w��`���rD���n?�x"��#��gIpm	���X���+�;i����� �Hg���N�+F	�HE�m�{�mR��;�0���h������"���<��������<�B��o#T`,7�.`��Ii�K��U�
���B�'o��	��+�kPr�0pVg�Eo�XK1��#�-�Sc�y%��3M�����[�D"<��������x����Ai(��G�������-�<2�yk���M:$�� �`�r?J����W���]��8�X9�~�f�@9:�T��4�V�8���P���Y������F�C����3�{�����F�4{;A��r�����"%�t?x5`%In�&�0�}s��H�&o���q"���m0�ewL�mG�`\TT�V����,����3T�YM,�?G�����������8�X�S���E�����FQS��|����Dv�H��xC<><�����mZ�'1k���U$x�*>to�w�q�����0�m�.JM���Ev�v������v��������_��Sj|�8����i�!�QL��%j�*�$��Tp��/Y}��q�$L�2�yO��y�Fd�� �W�����6x2�I���������G�1����a,�3?Q#��7���UX�aU	��Fo��������Y�I0�B��62b�*	���"���SV�xO+���/p�G��N�iE�L}\U��T%g1?=�9;�<�8�������Y�-����p�:����;�h�G]���el�������Hgq\|PD7H�'���9��YH�^�6zR�����y�"����r�X�*���=�c�I���+���(��:,������_\�0ir'f�.:��u���,����Z?��+���cc ��62��`Y&��2��y��O���I��������\�J
�5C�S��0�zi��c<|�����=�4�n��Y!i��w�HrS�UB6����
	Jv�T�c��� M;�s���u�����r.G��<E��p
���<��&>M�����L�;5���yn�>m'?�/	����1��O����'�\c�����������{P�1����5��t[=j�&��p���w��W-{f���w��S�D���r��K���cD�w&RX�l�;f	Q�m!���,�a�M��8:7��s�tH���
��	�6�<�T.�'�a��6��S��X�u	���N�����N���U`�
�yB�U�S�E\=�2�K*�/G���6������!��s,�.������0��+y�6^������!��`|�����o(4���%�'������$Kk.��-�h���bm�����#����<3�2J���'����isF
�9Y�%gi����.�7?��K_���p�S4�{���#�Y8Zc�&:�:$�'�M��6��	~0j1d��+;0C;��
wP-�!.��^���+������d&U����L�U��}7K���0Y���X����x���"~�lAFd�u��a�
7o�!c���t�M�y^)�]U��vM�#�O���uq��p�+H�&@��i���*0LdD�����9�.�Re�g������V�1I�&�x���!g��P]
�wi�;�����NO����y��]����~��YM�����i������e9ib���jVn�u���}�~���DFq��cQ���[�K��-���#����r9��^�	���Rx�iVIV��|�� x�<�5
?=+s�����/�5�6b*;wH67���������F�x#"�k�X�5�v�
V)B>^�����*��&W��az������K�=X�5��`���{���[/w�,�%������@��E����DD]���F�	2Y ����	��6C��Y���������JT������A4�2m��x�3����>�0	��DI-�oWK����v��>C�E��[h���������rs$&z\]�M�#��s]��:m�>s��U���8�����
m�b��:�
�a�\�~D���#��8�T}���6��84���W��l<%:�D���'�{vmy"0ix�	�G����FQ�����p�c��I������t�Ay�P}cuQ�[&�3�QM��H���3�g��*%Yu�c� F���O�!p����e7��D�!�D{��0I�E���SE[$�LF�����h��q��E8��p]�X�~$n�	����O6���f����aX���)��s�Spq<��_�	��& �Q�LX0�$�x���K�
����5;Y���8H�iE�
'�XSB�]5	���")���F��@~3h�0�����2j&=K?2����B�xX�x��Xe7tV��O@�������m9�G��~
�|����s	��?-wj$�Vs�}���D�I$�*��'�?�w�|�^:^���T58���jq8
j���5!y�.�~J��g�OL����x�`5��	�ob���e���<����k�������{���rJ>[�&�nc��/��s���y�����&�������'s�<gO��r�h��,�!�6���6�����I��b7��G
��w
�|:b�����hS�<�m������ZE�����
i��/T`W���r��J�:;�h�X�MNz�ek�X�	��h^����/yc�w&�D��f}�22�������O�;���L��
Z��o'�)9������n�h1�p{'��"���^��R$/�!c��=7�xQ���2��	��pMd��&�~���=D��N.�p�����H���8��8�h(%	����ls���C������������+�5��n������d����D �E�B1C��A��s���bv��V�$�/�^��>]a�KA#TE���XN&O�P�U FG?I���QG����|����>�w#iO���{E�$N��f�-+�q�I�x�������.@�$�ra+3�t+��
���Q+0AH�nX�R���(��Pc</�'~�f�w��o�{��i\9Ytf�|���&
��e0��uD�=L��Mw&n�k��eS�Euw�������5��1�G^j�E��7;�_��o@��C�����?��O�Q�K��x&	��}�F���+�H�"#^����3G���6[�v��M�����ZM�����i%q����������D"���_$sGy0D*lB�{4�L�����L�18�rd����]���]nS oH	���mW�o����T�@n����%)�k�c�72���������m/g���J�@���,~6��p=1���g�H�,�We���ke��M;�{
m�n��9����e�2���@�ST5�
�CL.��p�!���>�"K��L�y�P�sZ@/\"���f�E�V��[�.�({����E�X��d4:�4Xna��W��2{:R�Q�6\Gl�b�1M�����4�E�	�g��������W;��R��.ILT�<���T������B�+jb��1����q8X����,~�0?Ab7������V!��c\�id��9��d��3C�������}��<�|�;x�FE���X�wR	���)�$��$G�������R��T�z������92M~����T��!�&�e�Kh�O
�'�2��%��3���O��P? }�$�����m)b'+/���L	L$�[0S5�`�bItd2$v1>�8�5Y_l���D�������	�"]�}�p�d 4T����-{��D>!��0%b�3D0��v"!��q"��J1���``��`�;���}���eo�~w:�L�gf�$h�\��?�h�x��Kl��M��RNN��|��c�i�K���+�
cr�<�d�� �uF����S�D����#��[����0��3WG�J!'w������h{��;���8=Lx��8�rK���Q�������l)H�mH�����]\�*��k7��}�&�+�"�n�d��������h�x
$GPdd��`��V���3��AN�h��	��|���F����'�T:2���K
����lY��;e_���0M�O�������"���-�E?���L����/�N��LeLh���LC{���L�)m`N���x��eJ��M��X9�:�o:��/�Yi�~/?)����yn!�]��]uNN��_�
�n�QY��K���53���{��:F�����jGda�UV��.&�Z�`%����$����ol�pJ�f�b@�����iR����[t����=�|�'HH/!�����~�����h��C������+vM#�I~�A�����v��l�;3E���|����d�_u��������^�4�Ag�-�5Qv�z����(��)�( 	a-������p}B�t�HD�}�J�J�
.��V�����\����(:!�By��+�#GG�4�GJ8h�WR���������{������JA�]�cW@]ZhV@���n��;5+�
35�C�bu��mnm#���}�W��lgV���%6bD�Ijw\��k#��Y�M_Zfhw7 ���/�i8�d�����T
B]���!����}�]ph���.��������P8�������w+n��\attp6���Q�������������l����0������M/�������J���Z�F�{���~����f�dA���p����X�k���J�;MII�@���c8��+r}��@xg�AH�h�'����}��k&_Y5������[�mcwUR�1����r���j+[Q>�m@P�� ��O���d	�2�-��?�����2)����������W���ic7���8E�Jk�kS�H&0����?-�]���w�'����K�����4�3OM�ii�;,i�c�<|���D�Q2���$���2{K���x
�~]�����V�-�n9��������f-X^*{,���T�VS���1y9Zpmc���V|rOjN�J~��ZG��/K�q�H���_�'%kc��5kS\���lP��
�	o�
n;i���:��6#Y.V����0���0
����at��e2��x���6i�K���U��.X���\Y���O�O7�w�#���B��w�z�\;V�����?8�}��;e����������2���Q�T��2E:]=Gr�n���`��x��,�~O����H���b�����
��*l0��E�R��'��9����:�5MWct�8��������V������a��>k�u�`�%��������}�}�������
m�	��e�@�}fd_�w@�Dvd�o��o�_�+�+X�_���>(-'��0����� lw�������(/K��F�]k#j&�<�-���-��
����o '��]1E�c!BS�)���5��������GS��C,1�\p�4�3 ��dBr�s��z�Z=����'9���IL�0`�d1��zr��4C_B�<���L�8�I�C�+��O2*h�T;���B��m��x:�sP>��P�i��S�#���<I'gJ�.�W�������O.1��J���JeLF��:#I:<�^����0���R�������&�"�C	v=��5S�fH*_��5��80'�`�5�f���%
��K:)�	A���u}���a����	����������5A�)�����@!
���v���p>�R�k����a��By4���Ge��i9�e_��R5_�~�nh��^�N�Z}|��P�I�o��y�zX�Y��^\]���?�����;�.��.����cur��a���n��W��Q8x����"|�8v ����X��g5��9���@=�h*�G~M���wX������+.��\\��n
�Q��IJ�m�?0�����>rB��d6�g2��d���B������%��p>�����-S�L{�"��7�)1���o�C���H"b�1���CL+�jQ����2��{C.-v�}w����wsr�9��_z���U�f�����2^�^�]M����CH���K;j8���T�����x��Um��2��v��n�����
�^iCk/j[����f�����M���VZ���rfau�f��r� ��l����[@RMU��@d#_%7Fn+^H�+�8�C�IEc�+����_�-zsr���;�N������	���"����DhR�8%J
Y����@^�e�P)
��x�����ODv1��=A���

���7�
��d��	8�WWVy�p�^}�U��6���.�% �����4�0`|I�!�K�a�b��	a�?�x#�u��w)�".��/�2���~U�����C����i89fQA4�a�q2�"�;�w���x����$����
����}��\���P�S�B�������%r��a����h�8X!
�J������<C"y�|T�Q�����|�_%G��&[RNt4�G *6������N���4'W���#J��K?Ii�\~�q�, 9<o������Z&
�d�.��Q�O#1��E���i�U����K?`��ikt�n�2��2�#�I;�U�����uq����U
>����~k����Jp�������6[�Lx���9�E��M��;�5)�:c<� ��w3��o��D4��E�������p��>��W��Q�$��Rr�������v7
����)(�����@�MR���q{�l�~7m�j>�{7|���o$Vx�qL��Z�����Ir�>�<�@	
�
�Q`+�qE"�j
�mN���!*�<�H��Y!������`�STS+���:���P�CmZ%��N�9A1.0x�6����!x��QD��2���'Z0�c����U7��.��4
=���FN����Sv��A���SL.���A+������y���b�
��lQ���&�����D�g#���]�~����xy?k�}���o����)����K%�������(�5dZ������b"&�	:�����#-y�����K,�K�<��$\zC����b�r��8��J@&�o��	t����&�/4�E��"��S?���J���4^E��	x�NM;����qs�K�q�=S+
x��5�.�������(t�����)����axv��$
�~�
��&��(c����U0wJ���Z�:�����3����Y��2�,��4��A��	����,+ 9c��H�q���/���.��0-�&C�.��O��A��"�C��y����5��Q1��Q��:#��E��R�$C�ey���]vg��W .SsK��(�@�K�^���E��2���xe*�"&#|,q�C�����4��y�
v�}#R&�����4ZNH�NLA�e�a���]�j���o&D��o��b�W����{�5	��)C����@��!��aD�jSM�g�
�"a�$�r����;�����G{&�����T��1b�$�"��`Oan+����~�iH���#��{��&d��������zSG��=�UN�aC�c�p�,G�$�a�|b��hBK�:Zd��9/D���K	�����$�q�L���b���i`=�cA�|z��2.��(t�!���x+�m�ch6�8�CW
��6vff�@��_A�0� 
b�*��0bTz)�!j����*��Y���n�W.%y��vH�k�w�5�i�"X���us�%���'�p1��pYu-���x���*���5���������t[�����x
$6^`��,�g����d�e�V�z��^��[���e����[�w%m�	��?l����^���=hm�����2��(e�;D��]��j�q�i��Y��("���/��B-YL�������6����NX�@������������YQ$x+��I�u
��tR
J��S%�M��a��<!���[��78A� c (%6�B�XDDb�\�Y
O��y���V�����&���ff�(�P������B���S5��X��hN�������4=��9��O��x#j>���=�������a������~������mj�!w
�S�>����f��A����/&pa�R�1m�j�a�W��:��*����eb�����(+A1��b6X���{��*bZ�[��e�R���7�\F�xh��~�;�M|��5^un����d�=���C�b��T���G�\��NkE���LC��O�(Gq,��m�c��uw�� v-{�q��6�bX�>��^��$fiU�i��y4D�Uf������~n�:rJ�Q����N
�=i!�=�M� f�j����/���8pu- ����i2Wpg4��S��&���$	�P�J�l=#;m_Rr0`1�fP`���&X'bF�-�)��������1���a5$�=j�(��7��+<�4r�����y�����q������w���[��-��'����p����N?7%"1�%S�K��19`��k�����(8R��������A��0=9���C��3�_�/
%kT�8�E�7,8��������N�b	g������D�\���	�lJ�'�<���I���x@ng��3������I�'�.����~���"
�����d"1/
����L�M���b��(TX�2c�����!oR�M��9��e��
e����:-DSs���sjh�Xi=�.��O�koQ������ +��U���Y!G3R��^�W�_�����u��8%H��e��	(e��X`_)(������%�s��� gQ������-�TY�e46��C��d���N�d�HY������������W���yY������D�
�(�:?q�O�"�T��eI4��{�A?�������Tu=��GR��`�=�-��{��`��C\t��l0��7����e��U�%\�F����mQSKUq��j�(���1n%OD/�j���Dg\���k�p��P�		Nv��?�:Q���������s��H2�!��8���c8�M�9����.�D�R,��F��d������1��1�������)i��L3YX�)�T*�P*���2������0eKB�L���lj&���Q��\c�|�4��~�1��
8�v�)���=B�=<D����L�8"l���A#st�f��X�U$��yzR����4{��b���{D���U���v��������-��V���9��9��?�\���N�.>~���t�uo���6_�I��<�������q�o�.	tX�^��n�x��	'���q^}���;��=���CG/v��w���R���C5�(����>v!7\���4�t
f5�x��0c��2���Ie�iC�4���2�SDE\�w&|�m��+*���W������[�����;8���=����s��+^]�|�q���H���g�]�Q����
��x9R�E�Ru%�H@��&���#>�x�FL�?��1 $�J;�@�qC�k�|�9���������"ce��8�Jfj5�� ���1�"���
�>&��PO&��Lw�@���#"�.�%���.i-�I��J�E���t���&$V j�LR�|��TN�[���?O��U��*)meO�5L�P�����n	���d�P����������1�*�����eh��.r���F����/8��+��_a���n�'�����K��Y���-�#O��Z�9�`�����N6x0����2#N�X�Z6UYC���=��&�.��~K_��	�E<HB��������?���Q�o�rW��|@�������������
�������|R�]/8<js��o�sWl���q�����L��#KkC7�:-�c-�(4���taqe�z�����F�d~�2Qv%��� j���Cc"�hH���ViJ�j+5>���fK��Y:'}��+m��9��Cs�K�V�n��~�<y���I9������*{�+�E
����}����t�>�0���v->/z���]��J����K����e�]��2F_����oT����b������U��:,P��%���fpA��Y�4SU�9������p��S���r�G��]�E��s�pSG��q%��������m��W�2��f^�p�7�`��z������f4�"hFoI���s#�
���L3��42Q%��d?���]3B9����vN��;X�3�n�ba?��GcTE(�H*�+�=�v:���7� ����g���![$�ey�"a���LA�O�R�Afu�>���C^)4��x�5��������8�,�U�)�9�U8R;)��+\�����cKV��)�HL�g����)_5��c�w��#��k�����F�BV#�1M^$���Yv�=�,�G�]�L���?
�?��d���&���O�==r�.5HQsp�t��tO���/�M>�xZny#�;E��E9�[��buF��A�_����a�h�;F����-W��G�s$�G�
Q�rF�!	-��5^"�Z`_3t�1B�9�$+9I�qA���/�"���
{��z����0�8NE��*���T�&�tU�6�y�%�`�1��>����O)��~�y��)�,Y�H�w���+��h��>�0���`t���)���<V���r�X��^t�uk����nx�M5��U�LeS�eA��%���]�����V�L��� Eu��F$��������yu�e��
�HF��o}�D�R�.����:���vU����('!���5ZqL������F<+?��������:&�x����e��Yl��@(�Q��?�/��.�<���������]��� c�)8�<��z��D��g	1B~��p�$L<�:� �a�����V�3�r�/\�.tG-89�p��|�W���l
��_	~�^T
���B����d����� ����q0��Yc��`u�V�����{�*�m�L��������f�����"�<M��p�����������drL���1���&s���I$������_���[�i��~�426���q��
R��6m���i�0%4�|�9��I�����+h`"�Z60��
���������m����;+Q�����7�@ra�`��M�
s���;�w���v
���L0�U>���`�f���"���}����yn�Y��j��,1���]�
�+�w�I�k������0�����H�J�����c$�4XrB��"����Z�K/��Cx3q��+��4g���W9�����hb�X��Q��������~DK`���"g4Ly����a�0�mW��{�:!{C/?��n�"�G��{���DVB�Pop����.n4����*]��2��C�1,���A�6Rl�"=��A�&���8A&�;������)�{�X�&l�=����5n8Y�C�@?��D	C��z���n�����K�
4�")D�VS�RlJ	BE�/	%Sm@w�uW�s�^?F�B�[��1��&{�������q>�l�D�U�&x�,bZDT�n�Z`�q�e�
Kd1�[�&�2�mf�o���8�H�����CMfi1\Cw
O~��\>d��5��P�c�;L?L�7=�8q4Lo5��n��<
O�����][�J��RE�����)�f�f����R���j�%$v@�&�s�/��6�5�����D�F������CD�?�<����
����ZEe�8��}�T�0@�f����tZZ��1����D�=���Wv,�(�;���{�2�����&C��IaxC�������jp�T���Q�X�@!��)|����t9�c��������y�`�<�7�Z-����B8���v���9]�3;�|c����A�HP���yN������#��}N�he6�_����~���~N�O��d~�(������Q��i�:p*�j��v��Z�3Z0���C����4|���J�����8zdUadX �(�)S�C��)q�������ni|x>]$<������*|�{�'��i4�?������0[��(��.��R8����#�_"��Hi��@'����m2��d<�������-�nU)�i:���7�qt2��Y�����50��GjF�J*����>)��d���k�o�����(�%�Z1��#5��tD)���C�<�o��h[��X�O��>�Y�\4a2�����2�83���L�0�
��Y���a���{��?�7�?c��x���m���l���H]�e�T��-��=�����W8���:'��F;U?���j�k<��o{q3���4Z�Q������
>"�73�7�1M�A�r���h������B5��AGz�-{���}'�+����(F�W�fG�D���eO������G�v�N42-��������y��, 7�{p ���tzr�C78=����������������swrq��w��pr~�����������{���o��Oo����������Kh���_\�v����[�vur��=��\] T��<'Y]���]��?o���;�i���������
����d���o���KU��������������8<����c���{s�����kl��\��w7�:�3���VLG�?�
���+�������.g���D�������R}8q����o���������[\��7�W�����.��CB;8��Q��'�g��N~DU�]�����.�����5aY�����w?���w�������9l��srw��	������a��q�����&(���������m�}��n��������������O|p~w��g�����+�\���/�>b��������-���_��f'8��w���j��-J����'�������af�������+>�w@Ie;/��O�d
�w2���mqr}�>��{�S�{�>�e��!��D����G#`����;���5)���������$]��_��Y0_���?�#s�OL�=EcrD��[a����6�#J�j��9�����)2~9����a�"������g�K&������"{'�&�o2�^Kf������aT,����p[������'^�o�G��O��}A���	�v@��Z�O�U����{V�WM��O���O�������q�}��:4pa��E4y�5���f���n����b9^g��j��oE�u)�9�x6v�Llru���W�1CV��������iz8#��S��7"j������������������'U�7h^���\����
��?����m�����| w�x�Y����1��x��}$��rN����"������Z��;��{^Y�`�MB	x?dDv����4��;�w�e�9�����������{�1��RO=B�n���z��<�%ZC,2��c���{��)P��K��
��iv{e���>���t��v�3���3�����Y�S�����np�f���g�������&�==&��k��0���f���Zv�
[Dxm��p��	����&�g��pm����?,{���H�2����*���a4+��V�H?P{T�������h�8���:������SM���B�N�Y������<��Cu
�N�V�J��1��xG� 
�����+��R��R]���EZ~x�M4��
���������K������������`CcW�� ��N�,�������5���RU�W�	���;Z�I�4�"��G�s&�+N%k5����'��~r'r�C�l�9�2��w�n����i6�+���[Ys�L9�\����@�-Vf���K�(�3(����/����#�rW"�\���j�A����/(���19
�A>B��
�Ae0i��(�p���yg9��L.��S�J���@�kP4*����N�_���U��$�N!���%���=^4��z,�fn���I�lA[vQg��# ���S�a����N��7���5��j�_j�t
8#_��B��KF_����I��5�U8�yQ}S�h#�����u}�,~jj4�\��K���d�e�����gm�M�i�eP�QC"	�,����IXg�i�-M�$�X0�{��9�s=�>�m�(�u)�(�*� Q�o��,����n(���Jh�Gc��A	0���@8]p�	�#Q�	��K��EB��3�����{�,NiBr�F�&sTFa<���\�>W���q��K&�d�=��OH��y����W\~��y�����
�p���������M�/�o1�-f{���y���J�}�D`,3�h[����D�����$�U��u���7���k6;�3$QfcP � ze��4$o��>�i����I������n�/�Hb-5���o�&��/)���U��!���E�����-dWMd������*�}("r��@W7w�������q!���8�G��V+�} x\�h������&���;���{u�67&g�k���!B�y8X �0��G#��������������IZwc��m�:�y�j�"���0JN�q��w}����$���`�Eo����N#��B����<5.~+'�?@���\&3"W`&�uO�>�t�p�~�F�T�l�42���R���)�M��)�����F�"�A�����$s����)q 7���I�w��y8��s�Q�X"�X���a[���o4=�h;�b<[�9%�J���@��@P���U'��/1r�x1�$d��`��!��&��'m�����Wm/]<a�@�:����&�������D�D,�k�T��q�������������>RT�S�> *�����(t&�A(�)%'���������^E!m&"���
��;�O}��������0U�&�lV��[J���-Y
�����������<���DF��I;�Y��Ts��9\K�T�-V�9g���o)
���n�I���+tV7��#fU�rH� ����$�xz�&�����>�j�jfj���_�oz���4�g����c
��N��E�������.��&�!|�7"F�t��2�Fc�;3�E�@]�������U%����I�2�n��X������3���I��@�,t,�yH�,R?���
^�fqi%a�2){H����|`�}������P�E7e���V�A���"N��!P)������9&�)v��J;�������Bp�9jsN����'�E�F����J�����]�����E�&���D����h���W���r����A��T������l_[A��;�e�x����&����?P�TTM�O3�(6R��d?�E�Z���`-��
CN	{������b�����e�#�S�8:����X���!������W����?_������}Y�]-Ro�a��ZM*$�WV�y�f�J������#��!�8��\��+S�������r6d�\�G/|�~A����[�A��\�&��>Th����\K��fc�-�2���[�_/S�=���^���?pp�M\B
�Q�:����+������!��{�!<}���$��8���Q �~����"��D���Zj����2��t��[2���|Y1Y���� ������Q�?,_����{��(Y;�;d��d���b����� ��
�HFC����)�����VM/>�A������_X6�F��+�/Gu�[�Zb.2��DY}>�|M-����4%l�!'������	�Fy"��L��;$L�~Iw����c���|�#b����pn�Ln]^�Rt��t�D��I�x7��O�
M��4){sJ>DL�����l��SS�FD����[��H�9�3�R�����@����[�8���<�\n��	��P>��[N?��'[�
y�����48�����
���������a���b�s�-.(����}l�.��N�y��G����5k!\���l\!� }K�
db��GA`������e���iw��$����s��a�]�$����!{�@EJ��j�I��)e�Z<�j>�\;�f�&W�M�<��q�Ja���i8�?�-S�R!���G#�����
��r�YIu{�����V�y�1������
D)������8��(���/�o����4�qF��_���c�GA5 <���{���D�q�a1�%��6�/�7�$����J:4����t�.�Y��	�1�HY�Q��>�������������V-��?��\}�����x �2���E�&��I[%l�8e�~_��dQj��g�qu�M`�0�3'��Y���L����D2�l��@R"Z�����$�C�fa��[�a� ��c��Ni<���`����G�B��������� �P�`7��,�
��"��z�$Z�'��G��m��cZ�W��%���F����A X}.,(�G�p5�&�u�A$�u��9.-)�R
-<Hk�
f�;�Wd9�)�����)�mt�A�X����V��S�i�+��X���/�e����%�;�@���+�M(EK(,	�1{�:�Y� ����5�kF���u�Y�p���G�����v>�����Rv��l`~*����J���r��]>�����4������R7�0!��s0������������]��������'QA�'7EU�6�0n�6��^��#�+��f���E���d	�L7]��
��p�����H��i���Ygp~�-
���f������}�f��I*
c=5V8�r28
��*����i��	�i2��
�KI��
�� ��=8���g7���l��ppn�B����S�2
�S����O;a���
��'�b�[�90��
�t��p�7Qr5)���[�h�5��0`��^a|q����a�X�-�P�IN@0:�j�$#&g�
1%�K��`���
4!E�BG�RY�C���E��|��3��ZX�E8(W�4]rc�8��i�G��0�bC��X}�+���0�,t���!�Yn�'����	���w����chm8�
^p���6�����	Z�����Q��3'�n�$*�����%�<�=����������,��|��=$	O�9�.\���Q)��`P�5z��cj)&3m4��	�;s��J��o�G������w�����dK�H�B��<��0����Z="jw*��"jMa}���-C]��o�j.tSQ���j)!��wi��6(4~�A`"2����se
���q+P:#4��F��C�.�K�6M�f��2�"La��1O�X'S���@Yd~���0����%db�d��5��G��<
c��� �J��CX�����;yr~Y���!���~������O��/�\^��o�N��������7gU?�=���Jt���x"�@�>9_����-mo��>3L2�N�!�dp��p��qL�t��~���YV����`2�����g0��PD�,��$0�zR�3_�<.���|�&YE���,��N���d�	o$COyGi6��3�)1�CtB!�(�h>�<�[�����[��K�w��aD�iE��U�Y����;��L��6�B�Pgry�TI����EI�sJ[�T��Z8s.W��)�.�v`��yy���"c�kl�Mtn���������:�%������E�4~�PRXl@�����}+O�/�	a���P;#���CW��$�����>���M�{;���"��
�W��L����	@/�N�����K[|���k}�7��0�A�v*���+-�/nW������vt�N����E|��x���*%�>�nm�oE�7���.�3Z�'�Hse�v�J8[�s�"�]<d��������2�D�]ReU����������6��1���v���|��*f���������&�UJ���+e�N�9��F�L��oU������z�����H����zOS�Y�N��w��}�D������d{
i������<��4������d��o&	RF��,��E3�������m�����'�����V�.�Q.�{g�":�l������]����H#��+�	@S_����M���������m�JWud��`7|~z��]���C!H�(����d�����\5���?�0#��
�Ag�����Pg����������}�!.
.�;'7]��_^tO����_\�;9����:l8Ac\������
���[&QfS�P�T8J#�g�B?��C�!8����*f�g�p���%i��Aj�!���<����c-�:�0��N����1�������"�����Of�����?���7�<r1zM���i������5��gGfCLP:O��!�2	��-pQ�F�N8�#�}���0O��l����������k����O��j���>���{k=Ry���+�?�3�����@j
�h��}?�<�����,�����VF3�s\������b�ai�5$��!�����S���)��������t��l
3Ar"�^�U`��2PF�QL�g��A5O,:�^<A�J����&QT�U���c��3����`$�z���� \-���ua�"
��A/��&	�wG�V;u���u5R�;a^359b�F�'�k����T"��������]1Kz�qx��$�g]��g�1]�xG��Zu�s��i��������%�5��T�������������[������9L^�@x��R�b!������^_� GI���a�N�`��N�SkY&��C������-���[�>y�]���s������h���.T�bu#Ex�v:�?c3�����,���4�����Cm�D��I�j4����2{��[�C�1	��W�5)�H�SW��d�Y�+��A��| �a�������*��m�����+�'�Z<E�R�_gA���U
�A���q[;V��3�-�7z\��.��
�����d%K��a���d�'~��L[��t*���%Jw�%%�2B���y�1|]����Z%������;�� �o����������6���Zc>��h���Uz+�*�OCW���e������-*���}�U�+9����\�����������k��q�Z��a������4�1�&&FKp�q.�S��R������SjOrqR�fg��*�hA��S��*Gh9��.P9<�d;vS����R/�����# p`q��2����:S;F��t���ZF��t,����r�����%�Nn��:��W��SQ��Li�l����|���sN���,Ma��'u���W�����~J�l�E����Zv�TV������^�c=����c"��4]�
0�z�D���kR�;T�{�<�(=�P5��j��3��8��F��_�2c��aJX�����@����l;��>|!�h�1_5��jv�+�����F��p8��Q3l������k6�%���A��� �V�D��i4��K8���&�Rp�0��h9Qy��������:;$��W���������H�+RP���x���#j����|�^���*�o�yt��[ �4�[;����9��i�.����m�(�/+*zE#���P"�������$L>���a��4���%=B�e���_
�O���m�����p������
uL������L��T*��;*��}���"C�e�J('��t�m&X��}Ji�c���*+�;�����~;�=>���o<)�-;g��.)e�:d����jd�4zEx��ttJ��M��K
�N�2G�e�a��3,t\RX}��V�QRXs)�j��p�YB�*��b.e�eCG~�����q,X�l�����!e��Re�9,���-a�Zes
cgC;6V6��5�8+�naB2��+��L6Hqg����QI!w��1{�U�cg5K�8{�UR��C���=�_6t��V�0{�l��=T6��=T6��*�l�ng5Y�QH�1�!��S��$�>��k���w<CE������m��h��5"[[A+X �;��5��2����������l�Mv���V9��W�] ��[���7��L��r��������������Me��G�T�F]
���'z8;07�����!L��M������6�����/�����!s�����:o��������i��o<���A����=z��>X�a6���������k��'�?��sP�u�����w#82S�p���=y!SM����efN�����d��W�9�]gN���Q�4s�7�9������9|��>X�s6�������y����8��o�t��$m���~�'o�s�1�la�p$gj&nj�
�<u�jj�jjgjj'j���T�i������i~���)��� r��0�F8��`\�6��(�{
��tF��84w�P������"�� �]&�����t��W�,~���-�d�/<Y���,���,x`om���7�{���������^w����F����!8QE��}pD���;����0K(�7���pxss��W����!�"����������{
���4|�sz��$e�!���e]o,��a������>
�����P��D��J�U:^~��kQ?��7��Q�s��iy���z^)C����z����`����+�����_�^���L�k���%�A�iXQ%�
�N�q�Z�c�v�|Lt��X�j;��Q3�v��r�
l�Ua9O��w��X�:M�=�_6�y{�:<r�����Y7#K���Uh�e�%z�H����d]�+dQ
�"��Ugm:�6��z�y�4�t��B���/9jQPB�E4l�Q��^�����rzQ�F�b�"�
J���?<#)Y���"VC�FhaV�5��t[�=7bS�jM%�1�H�c��>��D�p��Z��77��VW��bmD^ C$��W��y���[��x�Q��+���G�����H���f��?R�r
0p��1*�����Ug@�O����Z�z�:o�Vu���e��	;�M�u����4J����_)���I��=n-�`�sl���W�}�8K��Hi��o�c�{��_�~��o���M�������?B�2��qD�.�<.�K�����x���*��q�4L=�%��d?d�"�a�Xat���
�J�^��5�lB\u&��8��{���m"��Nm|����Y�<"c��[�.n����7��xO(n���!x*�eby�h�\�����F_g�g�p�T`N^v!E��ct�_<p+����>x�!#��{]�760*��^����D�_�
�{�;.��u�W��_�!�M��H]��(�G����c��)}|�81����>w`����H�{v_��Hx���������(�����������������-�=�������.�������QC|����6��u�O~2)��B��|@J.s�L&��&
!<k��$`K��~m�Bj��d���@ap�By�9���W ��������{�����y�ZEp�F��������h�>�Y�\9��1�'iJ�>�e�{�?����l$`�L�0C8)+��,�bK���)Ov�:TpU�t����B������L�Qr���+`��_�	Nj�qp��8h4�h����F;<�?Zw&�&��W��T$!�I%�_�E���QVD$,W,�2����?��_0��`>0\�xg�n�q!�x���}ti����*����o��-g�(�A	t�C�����q���vSU%���roaG����%�y"��|(w:G���E�)��E��y���{���R��=�Q�����x*KQ�0�����z���oV5��pPB�������`�B��)]�@&0����/���_{�M�������(w?A�����p��j�j�V����'�����g0�	�9@L�,�����'��7�:���f�Dcv�����������`���3��j�H������r]nm-��Gz��9G�M@�9�Y���
��{����\�LH�Q��{�$Q��dv�K>ES��������pB����.���=`_�U~�:����{�1t ��?���9,��q�K�N�#LAdi���$?2�1�G\���q*�"�������6�0����f�SJ0�}�)�������~<�����i����vv���dI�%�+)p�>�VT�T�R���]I��|�wg������n�n��8w�����H��0���Jop�m�C�G�c�0���`�\��^R��f�o�~M,&GtC9(x� wP���P���+���7�)��JZ@M�A��<jK��b��OI�J�tzw*���2,��J��K6g�r����/��(|n�Y>�{|��tze������\���q������z^��wg?�8Z�L�i�J�_<�OK����p������q���/?-���%_��/�s�Q"}�7O��8�G=XWF���hx����H{�_��N@?�SI��/�Ij��z��^2�����7st��1�L���=�
���|>�KI���^��U9dq`
6Y3h���U��n�Qx8Ae����HEm�\9S�`��Wk��Hf���������
��0S����$�z��_�.���*�i����l�����"_<�V�.H��[�^c����Q����*�?��n?�r����0U�h����h`�{�������h��d���U����\�Q�
��p<���y8XD�/b���=\D�O{4�p����Q�S��ye#����(����
�\��K�M�	�������{��+�A8���#kA����[��f�e�.�,��K�E���X��rQ4��e6U��
�����j�1A��d��1oR4��9 �{8������_�_
=*�D����#^0���y�6���pp���f������N�~~�dK��!��H����?w��������D�b�����w����M��{�c�L���������]�l�z�f<~����on��w?��������<��-oa�/y�r�������=�����!U�����S�\��{Z��lM1�p������K����R��m�7W������6��(��W�,���T��M�z���bk�Kz~�y~��f�FX�]YYo���i2��<kV7h�H������n�x2��h��z>t������[��Rc��w'�_��[G48��$/!~% ���`��~�8�W�.�����L9�C���}$S���9#'�U������qo��1�����>g��}�j�"��JQ��5�n�����4�Y���tR+��F}�|A���9�[����d;wP�0�����L�i�A��(����\B�c��p8:����Acl�I��5[TJq>(���DE�`g�g��0e�	8������7	O�������&r�3LD�	z�J�!#� K����Q�],�h����7&�J��"������8o�b'���aI�G���
Q���_
�m>�YU9�2J>A�z�����I:�`!���z7�'V��a��Gv���6P�n�a��v�~\ono��������h4�{���^|<���9
�=��������c{�r����y�ht:���yx�p����v�������a�����V�qp�A��6j��%b�?��W�[����������Ga�yp��at�
�����p4�;�-c��m4��A����?��jnc3��k������!����g���C4O>-� �|�
�%z�=,kA��j5��A��u��u�0�k6��K�w������������?���N��h�Vt{[��_v r0����q��`���>m���}����8{�,��Qw�TYN�js���"����mMN�PG&%������`�J�(v�%�l���k�h�	�^1��A�^�������t�Yz>Y��i��0�CV=H������B�w�t���=��xd���h�(@����C��0�-��nW\�A�,]�b��l���`������@~
�E�����t2�
V/�q������^a:���]�nm��c1�,����K�A.j�e����Q��1N�m��������O��A<T-N� ��z����
BLg��]����Ce�QS���I����ct[�m�V�(e;����S$�6��J����}a�W	�BNn��L�O��m�����~��c�gg�8u��D"����`���L<��V&��-�x�w�����K��0���OW<N��P,j�`8��?�����v8'�L���n�<��N�>)g7"�8�o��+��3+�N&��$���s��4)E�����Y�L�I0�1���Hx����[�$��5�d�����D�tr�Lb�����@���	�3�	��6E�2$�t$��m�!�1�&����i	���*���
���?=��FL2���nM�+�u����)���yfT�_�^��9������D(���1	���kRtx �G��L)�3����-�u����~�F������0��A����`^s���!D��������0i>=k7u���$��+�]U�������%���br4Y�1DsT}�D4x��0}baVp��U�C�
����
�q-�v�t���4�
���Z�K��a@DRP���3���K�b��}FI�����i�R���I�U����1N��&�8]sS\�m�i����P�J��%�*d5�Xs�*u��
�?�7��.=J��0�3�W����c�4EU")�h6���]=�m��>'�wc�|�����)t�|�f�!�>���?"��Q����������{��$k�1P-�3 ��_���:����'um�N<�lR���\D<�UNI1��MGK%X����g�y[V����3����
xk��<���[%���UlS��}|H��M���h0�]�8���z1L�p�J��{��Z�T����"�cs�w��L,��t��x�g�=\�'b�bH�c���i��j������J�����3������r���Q�1����l�F�5�7��P��i[!���lF
��7��!���~y�+bLZE�Vo&?�M"/����q:���E��$������x���w*M�,<s��1D.�>�!JrEjt;6I�h@tF����������a�����Q����bu}�`m�L�^\����#����E��4���~�~���� �=!�[j��_ov���I
&��V�:���
��.���Qv�E���"��5�C��hX������(]����4~���y��(��V�*3��Y����q�����9���+�Li_`ns�q���&w�AY�\i������c���2}����<����}xd�|Z����#�M�U��*�Ug����������a��^�Q':8���W�aU��J������1k��F,?a�	���&�|@K���b�}������4�u�L�S����;�X
�w���}��y�����
�2�B?}}���JC=
n:`�7CqO�8E�f������a��a����f
�8<�*�*N��74���OQ4�&���d�.QC_<t?�.
=�-��W{���_6U��l@M���H��8W�.����0�-(u��bn�[.9!3aI@y�!���}�j�1�����������-��#5�cE�������V;��Q�"@����G����	��C��ej4�n�b��p�F��y����<�B���a�l�p�y���u�� "��2�X//L��c��,#�D�-�����RS�S��2]oO�>bU#��k.�j��Rt���������~&�C&����J��,OE3dc�o�ceKR
B;���+I�N:h�Cxd�'�KK��K�].9��ZWjX:w/�+
T2�cM�����eu�(��[_8��<�}����@I��}~w�j-�bg� ��
����:h��
����xaHy���V��wX�.E��o��W�� a��u�����y@*^"\��.%D�"�������D��d�}�yu�p3q�2=�A��W��e
F��9c��S�EX#
�)AL���Qx�r�B�Ga:|�	U���$�t��|~y����xr�*T��E��3���C���B4�^�b?E���L���$K��a��~!#p��������0����LB������Z_�& � ���h�Hx���ktSB��� �sNfJ��tGX�n��f_�/')����'���u�V�z�{��z���({e '�#������M�}9jR���q�n����x�PR�����;�+�.0��q<zM��o�g��[�3=e�%��EY"f�
�w�p4B����pn"���Z!��s,Q��z"�GZ���B�h�Evb��[[�G<t�d�NP���w�l����i'���z\�h���hw���o�/N��<���Q0
�1��@���+��j&�3����(�|S4�����r���^�8��ip�I�U�E�+��K���'hSo�-�t��e��Y��9��q[�w6�
��A�&X��/���G�����l��o���w���E0�)'�9�'����&�����=�	����tk2'\��c���#E���<mgC�����?b��
L.ahi,���6 �=gAuG�B����V��N��wV��	����uE$
h1�]8�T�T����C%���&��f�Y�a����chY h�����\�q�Z�x�E<���S*_0#�=B���#	����g�W��.��-�K{�d������sV������8 �0����<S	��x
�#chQK���M��o'~����QMM�.���~��n�(�S\)X���I��W�HY�,��]���6J�mCds��?�6[�y��tTu��9�Q�B}?�F���F�Ol�e(��t���c�D��O?t�+�����?i,���F[�y?��V���j�
d�����tGF ���m�E*|�x�(5���'c;�v,C���
N��U�p�m�@�P���)x�^i���Q�,�f��t��l<+��O@4�u��p���~$��h�{������ap���_4}0�m����{z�N��O�aY3�������p��A�u��d����G>/�r)Qa.K���$�W��� �����_�^�{�v�j��������/�*o!�(��H�������d�a_aLQ��,x���*+}����k��[}	{7W\>�������1���,QE?�����K�w����
�*y#�i��2�����J�$/#��(V��8��~K������aQ��N����Ye~:{�U�T}c����7���f�������?k��g�-��n�w�h�z�x?5�V+�(;
^!������6�Ri���G!����z>��=5�v��F��}9������rk/�K���.���u�Oy��t�{������:��?l]i6O�����>����T,���#�"���s�EnB�=Zs0\/�����W��d�6&P�7��Eh��-��
�-d���h�9�p6��nYJ��!3���#�����WWW�g�U��oON�:it~�e��
��LI�W]�Z�F���x���J���t�����<� g�=�:-��FLm�_<�z���l��K��%�_�������P�Y4
A�]��[������ez#�(+F��M�.�����Y�ck6�	���c�9n(�#Iw,`��<���h��S�I�b3�#���P�������F_�U�xlt06���OG�q�Lj�q�����+v�Ye�o���(���:�]�U�������7c�
^~��I�����3�v�T�&+��b�5t�t4N�+�����Z����A>�����g<���BtD�gc�]x�y�:��sdo�#(�X�B �J(L i��v�
/R�����1�}��Y�n�Da��������z����G`�Q��a*fU�����h�����^S�������c�PI��~���p�)�K��T�N�F�S��T�+@��5�oT�2`^�E����m���'��,���L^��1g3T�����Q�19�!��:
���D��X$�Y4�a*T��^��V�?l!7���L�]���\�5��]�b3�>���u��������c�&bw��q
w��������aF���������:^�[;
���N��-�����P��kn������y��I���4Q�I������2��Z#����;������J��3���J���+���4eX�!r�;�y���^����#"g��!��v��c�NR������|O��[�u�f���/?�[��pZ����G���������9��z�^u���8n�:�#8G��0<�;ne'�-CG��n2�?E�e���u�*��3����&m����Y�������H�H��.�����[1G@����g(���&

A)$?����u���(�
��%Wt�����:
*0���#�_W�����������O>m�ls�,��#6�5�Mxa��S
�j�w�=�M��\BS�_�t�iS�G�4��Q19 �~��z�q4htZ������9)-����������"xM�y=,T�9i���o�HF#�%����\�o��784��E�9U��5��?x4M)h���r2yB/�AI���m������=�MRd��PdS�G?�������n��q���uSS<��������������8C����z������|4Cd;x���9v����)Z�V��Y�4;��_�Z�����q�����F�ai���+B��]��
)�E�.����������5�)�:/g����B����K����N%6���A=�1=���~�.H>��dj��p��3�7�H�������9-;����"��}������!'O�����
�'d�e��L�#<�v�4���c�;�k�G`A�vs�@��m�������r{y~Q�Oq
�{�88��~g�	�2g���"�f<7Rq�pXK�t�Vd�JL3p�Y����]�u�BG����(���@��$���T���0]h+��"��Q���.�p�=�����a��pWg5c�����������dn�������3u��"�e:����,t��(#f �(�'C��������)8�'H��f�E�f�f��,j���/����"!���J 3)������5V�����&
�����y4#�i�E����'9�t=�D�4>��Q1�B�GQ��^
��vT�(���<�/-�agt&<HF.����z��W��e�"�~J{��1P}�.)�H�}�����j��	�r�"#�V�\�2����u�8?�a� �@#�]�����u����
��T�D e%w�3�x<y��{�����<�OH�"Y���8:�����kU^5��H ;<}������`�o�����D����S� a-���^���,y�:��"���"r<O|�,H9��mBWq����"�����"�+��y�)��M���N����3�+����7ek�.�
�0�
!����)b��|A%c�"+\v�3�qL�v�!��/��e([�G��V��)���M��}�:�W]���q�u_+GwG�tq��q�D�f�11�=Ns=h#���g�b%��@�6��f����yTk|�D�-���R�8���S�1���%6~���k 
�������8I7Bd@�ajTq�?w���U�W�v
�p������6��}^�|u�3�m�<����#<E~��~dl>hcQ���3I5S��w���s'�����X�"��@ROQ�T�0�|����d?r���{u�U�'��}���LWa��I<ua��b!��C��CP��)J�IL���5�����a���W��8���f/`7t���-@�6���}exd'���D��X���?���&����LY�I��D���h�-���k������O���,f�T�eQ�:�#�+���[��s�B���Z�m��$���=VdXY��T���4Q1�;�ws�S�C����g�����{H�$�#��������|eFm�����f(�s�=x�l������eu2^�yq�`7h�XHt��"����uj�����uc��Q52�\x��$�����[p����9�[L���2��ex1���+}�nV!����1n���r���l��sdG�{�G
�/��7���F�G��R�hO����gu_����a�6��|h�3�bJ�����PD�8J����^��,���0��S���9���s�R��1�b\�ijA�}��{sKV��T���wz�����s[�*��!��S^�4�)�*�%�vv�G=q`�{�r�~e��m����qB�x~S��0(�����N�0x9�^c��W��?��*B3$���p��p��)w�S��������A������01,Z��f����v�|�-&[�N!E���bc�gL��	�G8[����D���f����Q��?�\���N�.>~���t�uo���]��Pa��Wv0���8�fGe��,��S��v�����O������u}t]�A��T���������\Z�� t���8��N/n%�o).����#�h��-r@���nK�����d�X$3zV0��R���A`mnD�����5����	��-@�"�D/'���i�,�����qg-�J����)f:T�a��b+���GI�_�> 1H�!�%X����P�K�� A��U`)uh!-�����!3�2J9�sT��?�^
q�@>��A�����`����j�m���@�=��o���������eu��Q2������;R2��(o��U����_N��G
���b��cn��A�'���yq<��I�8:������D���-	�ti8Z0���qIOp���X<���������~�������K,0������k5
��{�x�b:8"�a�Gw�P���!�
�����g�s]����"�*X�o��Z����Y��������l�Z��x�`+b�Bdh9't!�(�'}�W��H�m]Zd�%�E�lqV�{h=�N�y��������2y�Z����Gt��r�)`��u$F�fK���4��(|�o����7���tQ�jn��LBU'�s��u�
��<�������Y�],��|��{�Hj6�����V�}�,�H*oa�$+�[�:�)����$0595�4�6���{�V����=��{���Ku%w�5�j���a���$:���y���s
h���.�*h�o��0D<�[&����c�G�U�6_�3�o���Us��@�M���U���i��hx����F�p����u���aM�Z�^����Kv�G ���F/����x���>��B�?P���h��5��\���Yi�j��(E�E)��ZA����<�c�u��������������Y�}�n��q"xX��/�[�"���@����=<����~sx�"�Z������a'�}���?�E���������#I�=��J�������2�L)co
qBh��nF��]�{.3_w�j��HC�)�B��OL�|���$0:V�O2�kf��|��d������u;����0��=`�xF����U*��!yD�T��&��(������d�9��E>���?��!�&0���g��9�zl0���+��O�f��0�.>��Qj����]qej����"���p>'���p>�\]��=v�0|
AQ��&���(5]����C3j��|M�A�&Nw��������DnI����Rc�5k�qJ����$|��Y�������C�u����m�k��I�bh���N%M�YE{>k��_���`k��J�E�4�����~�|����!d�(L�_�&@��B(4�4�pX#�!�%~`C��_�d�O`(���,�o|x�;L�aD����U7�@�P����f��"�����������8�9	)��#��j��U�A�32j��)��x.)��z'7�<��3vY�{)��zDp���
oe%��z`s>"���u>��C����QbX<x��zv�r�[[��<���4�%�����X�W/�xE����Gt�Q"�7L�5��Cw���?0[e��������{L��=����n�wo.�/�?/��������a6�c�s��?�w�G�����3�7��v�?8���F��N4ju:�a
_'���y\ZM�
>K���������^�� ��>��-*�XY
XG�E%��x��t>��,&E���
Za|�m`k�����w�62��IB�S������C�0����!B���X�VJFF���S��Gd����a<�.�����TS��>��������iq�m�9M{�������&kW��?gH�S��@����8�rMxk��a�LL;vLP-�PQ�Jj)t����nY�)��)[�n��B���cjV����g�x�F'���f'���I`��L���|���wL�����9T��m{�!C���O�~�������IN�hn|�S����|w��3���:�����W�C]l����D��dN�G����d�Q:$�"����m���p�H�F�C}]$� <�lq�iB�E�-Hy�pFAY���z��kc�-�YHK��C�m�m|�t���~yEj���u/�)K�YJ��~�?�$3��sO��P(N�Q�S��x	y��B�Da>���1���7X�m��]<�w���E)[�4I�#���8Q�v��<���z��G�	�S�@Y	�����$�\��X�<�JQ9�T�,\e$�&[���Ry����V�(�����v�k�W3��p��I�lR;������_�A!SSq.&���%��d��4��N���p���]�w`��[��&�l���=8�R=.���a�q��
��4l�S#�&4�F����q�Y��
p��l���gP�Q��d���E����\�p���g9y6W#��d��j�s���:I��G\K4���O}O9R��.���_�����bF���%x���L��M�qK
��1����@�����J�"J����iS���:y�����E{�y��v�|ry�����X�����M�1#I{�����6;���&�s�����.q����xo��<��=�tV�P#�Q6��]�+�i����1c]�<��!9:�-IY��v��(^���\�x�	�%��|,��V2�B�����q�vq��E;�?`��9)}6�|��<]
(���tnB7W�?Wl��3jd������C�=o��20���a�e����{�-z\F:YJ>��	=��<�y������=���^�����r�u�xa-�4(g
�p�zY�\��`����BG�V�S���a��Y�B���\����'R�;��K����1���C�g���nDJ`n����`��!��8L��3�O�g��hd��kJ)��
u���w��	������a��n��X������m������;���J�ym���2�4�����g�}�7�R�������V�m���i8o�
v��WX�mt�k�=-�}+����X�
�������)�9�[� ��E�{w'�{�|w{���r�a�E������Ol����?���#3�����,y��u������.�r5h>#����6����^'�E8�YN?����3�a\`������Ac�Sa#o4x���������Xv�K��d����MG�)L��_���K�2���0t�3��dz/MEuTHXU�d��(��H�8~��?{�4wP��G�����#��� ���.47���F�������������G�|��M�{���?���fgT��""��y/K�x4�$����tk����v�XK�t���������G���7^0	�=��|S���������@Sx��6`���2��b>��r��V�A�������������eY�����i.��^�����r
6m���i8�f��F�����5��z+:5���"W�a-r�R�X��h
��d�RXX�������@1�����.\7��d�����j9�����5�W�F�T�#��$}<��S^����)��Q��"����LUN�"d��g�h�/�O&C���/��-�����)m�aOH-���P���������Aya�����i
���U�
�9V�F�q���x��=�^��������~����V���������Fc����;�#�o'�G��0���A�x�wUc��9>n�at�	;��������
��ap������f�u� �k���K[�X�\��������F0!����h��~�x0N���qU�G��v</��t����?���cikG���x��<"c�����{�M�]!!�M���:@M(���a�P3.A�������R�P�H�{���'�4��Gi�`������(���ML���Q4���h:d+�5�b���P2'Sg~z��;9��0�I'�NI1������y�!����8\��]�h=IR�_q2���� .������89�D#�lI���4Y4��T���D~oq��qBz���+5YzO�-V����x{���g1
�X6�+���Y��7P�G|?�K�?
u[PW*�Va�w�e��~F�v�2��6�7���72,�nN��^:x���q�3���	CQ3-�-�C��~��s�U73�
���m[�s,���4�u�!�73'�6;�=m�.�o0��"����E����(���n��U�	8'S���f������F�����ZSY�H���?�2�����N�S�N�l�5u���c��5����h����~P�l������{H�i��`7o�
��rUe�wm��a(�x�K��|�Y�a��q�����@^�[���������/i���~#��
+�f/�g�n�x�be���XS�l���;��������A�����T�x�kzN�l��r�P(���CE�	)�Rq�{T����6��E����7�^�_���Wl�9M��m��!���*M��ZS4����Y%�-�(�L����
�����~�^o��;�Z��M�����(X�����'�*�Tw~yw����Y�j������m�	6[�7z�l��)z����u�?g�����`��`g������vp��;9��&�+;�As���Y5�
���*`�7�����7��n�r�2�ko;��L}���&q@��6�o�w�����G:���'��������������������������T�����d�)�C��2Nk�i������������@�;�JNrN
)h���~��C�+������)�r�g�I��3�H)�s	@sz]�����~���u�/F���SF��L����T
ZpVc��G
����3�`ni{�(��;X�%�l�c
0��$0.
L'j�t9�=F��T��By��V�r�2������8<�o@.[[A)��g��u��R��h����B�	`��N��!�������(8�<���67���Y/�l'w��������K���3T^]������qv#��h�1&U���*%������?���Siv@����_{o�������������E
Bhxz.���46n�I����S�JPmIEWI&����]��JUR	�'��#U�q����[��_������[�����fqK�A�F��-"���?�Z��~�N��0���������[<@�*(��j���UK��������6�&�����:���|���f����J���/��W@����8Fc��UoS��$q���zM6������TJ-V/���M�]>C���H��zAf��g������74&h�.�+[?��
��Q����Q5�Q���%>w����/�#�%;rg^����;���]��t��p8
��O����PG
���Q������F�v���#�)n�U��m"���)�+��� ��+��Bt{$����n>��[5��o�y�:�������vs�a�����a���'vs�0gT�Z���O��uy�I
Y�Zl2Eg�l�����-��/Bf�������[�~so8������~���n�9h�^6�y|��}����g��\�h�	I�ar��R�O$������.m���xt��7����2�?�����������y�l�~�)0�U�������U����GKe��'H��^�CF�gx�r��cs������K�p��	�&��7�y|#�����"�+yr�i0���������cL����~�:�<n�Mni��l��7���3��,����{��;s����^��h����>��%)[��x�����������=�����R�e%��#Z��i��EI�>�_F�W&�Z|Nx_o���u���^��v��8��-�2��gT�1U%1_z��>l����|��r�T��u�O�%*R�B���,�1�^��/���y�r+���n���������<�����%_m��O��6PV|�>+	bu_�N��E(r��A��o�?Wwj������-<��Q�V
���}�.�"�r���F�1et�:MV��F���{[S���\2��@ 0~� �j�,�y
5L����q��,�C����`�Q\'D��K"���	���N�A�{	M��8}?���S1]OU;��6���� 1J;/OO�Y���72�����v���������	�N��8<N�ds+��6������!l��nw@M
5��13|/5���L���T�l��]�r���5�f����)�7(C���3���a��Z�>1Q�-+SO9���0�`NN�c���,����1�Psi�^��7�F�f��*����������r���0�V�
�����"�f�*"�M�^R
�5��Q�C2����xb!��P2�A-����
r�q9B�e^�M`����(���N�gR��)�4r��	���[�YHcNH���L�x�~������?��|y�w<�"�Zv���S��;Y�N3�������g���[�/k�^}m��8�X~Y��<��iT�z�Q������{��c�����N���J�����UU@��/>���	cA�p��#c�������C�:���:����^�Z����:��[�����sBD���t���W�H������J7��8��g%qN0���E �mI���E��<�V�|���	��u8���`""�*,P�7����<%�5���!���]���u�p}O��w\C�acC"��h�R��
�}�kRY_L��8��c�H�c^%�I� [��|�q\��g���-V����lP�r���Q&�"����u�-4g	~0m/���lK.6#��.��g������Y����F�t]�]l�le�v��N�}�~���v���B<��m��H���~�o�S����4�W���y�q,���TuOU4b[e�t~����	d2��f\aOp���9��VR%A��"-���q�d����
�~9��+G�2��@�A�j���.��2R!����l?��i��US�u������,�K��}��us[�b����k|�C�,��c�XOqT��,���R����@��R�:�i\F���C�[��0����X�iV�E}��yb�p,T0��
e9�J��Y��T�O���q5k�&kX�
0/**|��?�TL$������5��v��/n5e�h{�N���������'q�z\��8���k�~Z/�Qk+����F��v�f����6�B1�dv;+tn�S�,��qv��d|�^��3����C�N�=��D7��.����x2o��y�|�XH�y���f_��=���ut=��(��t(+��0��XzC��Yl���1�F��1�|����C����FbJ��T8����P%�������^�7��pp�)��^������M��������m�i������P��u+��U}rO������=�X{��3�n��D!Z���c����$w#�;:��4�����N$��i]���$fT�������
����{���������Q��	�b���E�{z�4���Wze6f�*��������qXZ�1:��z*�*��qmqv/$��i����E����v�#����Qy%T�qTQ��*.���D��("��~���Z�%b�"�����\W��O������T*�����W��^�Z?���8���O����
��c����-�|SA��{�,f&��X���.�[���+��)�����fX�3��'_xC���Y���=�6�� �����K��U���'^��������'tao�����,�".�e�8*�}����;�N��{�q��� ������V�iC�����u��F[���/��T�e������$�������e�Z�Y�����z��I4���p�������C??�R�����wx��6�������[z
6���w~{����F5�����0Q/<�~G����Y�{��mX��c��e�f��@������wp������e�N�]�r��]o>��k�z��O(�j	����v+�t��'s7>�|��'��C?)��[k
������;�h.��\|��S����H�������0��������?��h���.�(T�.��|5��kP�,L���'1�2z�z�?��D����l�����A>��Rg�e���p�1���SE�'.FG���������3(m�5���)z���'���5�*Y����5v�#
o��e)���*���.�@C��97��J��Y������$*X`QH����P?�V��j}*��Z�U�v�
�M�^{'�����e8&�4s�+��x��8hB����7^��z=�qt�6���A4!�B��(`�Q�$����vz�c���<}c-�U��������a�{�f�S������)9�7�������D��|9P�8��]�?�*�(da��el����w���0p���BH�T�~|k��U��:Vi�X���o�g^�iv��>k6��r���0�F�cd��U�?���h���Q(n)��!��?����+_����E]��w����f�k����(����e���^�W�S�����qg7����/ajq�������&
���a���o�>Q�}M�K��+���q��$C^�{����79��|���_���>����W��Xe����������8�(���!>�}V�[������.����4�*�\��;��d�i���.�O�5�?������,����4���6��8����z��6OlzM���yF����7��s��*����m������(^�+��ib���68>>�����k�����"N�lH��z���.'p����
VS���E����&N����h���y�������C�>
�V��h��V�a*x^��-��"�q�*-���H{��8�[���UB+.������
P	���s��OUm�l�b����l�ZC���/Y[���x�i��c@�"�������Y+|"�G5sN����WV���"9T�Y�5
+��<�h`m�h�A8�T�ri���?	���RF�/�1��h��]������7@e�|��|�F-Z,V��a���4��7��������z��<���\:Hj��r0�QU~��$���hd�N����Xd^��O�R����*8����!]��$�
Y+�<�JQ�^|Y��z�	7�����9*��� �[u�7����
��A���Wk���Xw[���_=�����O��f�������^{��o@F���JE��{������by�U���H[^�����7�0L"L{m��<��6���6e�IG��KI#2�!�'�*|r��q9%���(���y���iV/�z��)l�2�
�C� �"^W��_�;Lb�z�K�=�R1��W�&�,aj:WIVp9���q#xY�_���$E��=�5%	Z���p��Er��t�k���������/%]�n����r�a��*m�,��}T��:������V���� ��jlUY�q*������-����(E�>6��A��19���tIv.l�e������a�o9�P����@6�I��S���j�<��
�j��w��G���a������ON��/��Zj<-m;	��~�+#�#�W���D���8����(��p�Uo��nVw��\���t���Zs|�RU��ex�}�L=Q"�����n[7�|�-�>�z����hX���\e�soWo�z��)e4�+���T����[w�p�3Z4]���J�/��a5�F��}����5d�������dZPcj�7MwX����*|���N�z�I��b2��:U�N��y��H��4V_���S��w��V����A����rg��*�l�$l�F�E������]��\E�p\��K���I��E�&����D��-%�����s�o���z�\��xn]�j�����;�:%����U�\�F��z�������A���^��M��{��b��E������Xj�(�`f�C
�,2�*uj�(%w���)�[\��H�3�n����`������������s�������@8�����j~�2�i�����N�Jg�:]����^[~�����5�p��Vm�h��tn��
\��F/�`u1kn�\BZx�e'�`�A��MU=}��q�-���UM��`�� h��_���^�>dT��k���46X�8Im��������X[�b��zg���y�6�����5`�sOK����ol��.�Y�������r�T��AZ.��W�:{���5��]�.<�3��L������.6DZ����&��vNy��G���%�4��5�8���7��ry�{$l�s��?+E%�d���WJc��"���v�>����~�o��Jdn[��2�i����=���Ws�=B���uI��[V�����n�d��A��L-�%�(���L��1��>[�%�
������g��I��0>`�6��D�&E�#!F����?�@o���@Ne�5*��k���)���*Q�X���=�O��}�	���R����E�}����c���A���B'����7N/�C���7�nz����U\�����%���a�-^��V�/�����`6��h��{�zR����_oS`���C<��$���^��
6 �A���\����jMVx��w����S��1p� ��G����	�R��Q)������2�W�����GG
�3�Z�7��nQ>�4���:���k���~�dw�p���p>��^�Oi8�w=r������u�o�_��g��x8	�_�`���3�$
��2��u%m7���������i,\xP[	��@��~r�������$cD|���YSd���tP�x����O������������>��������$�Ybp>^���j�����~ur��|���CGo��{�?<x��;=98|�kH��n�#�S`�l2#�^�����Ag���0�S��������fc�^*��jO������	��Zx`�>��X�CF�&�zl�"�z������@����{���a�p�����QKC��(��6��{������v��������QwQx{r~tp��Y*���
���8>�W��U�;�yVe��R������T��t@��v��'��~>Q�=��&��8=�q
���T�l���W����e���^���M$z��s*hV�
F#`���kS`W��%�����_���'�����5����^�����i]yF��F7�i��Dik�ww�#�+�����}����
��!�,�B��B@�}����V�;(��{i����/Y�{�F��m5z�Fu��s��	�P���Q��,�g��8TN�8_O��c��
��!����+�ca�+/��
?��<����R������[�:z���l�5�����A��������������Wi�\�S|#y���@��X�X7��C0e�,(o�*�W�����oV=�W�[��~�sy�t��`�8���-0(���4M��q��7�	��L�����s��-� o������%F>A��0h��C���r��#^�O�k|������Z�lB.��(�A8?~�G�cF)6�%�f����ydR`>�2���t�Gt�Lw��I���j"����x\d�y�i������������1k��Eo�Tx�d��E���q������p1e�n�����Of���`��1�.�:�~��jL���sxB�U�@��`6VO<���e�$�(���W�U����=�� �z���-�b�wz�`��;�ip�Tf�slD�J}�E�����6Y����3{=��=�zt��Y�,����1�Qp!��c�G��#��rs.fD�
�V����W����&���������c5zU��qY�l���(���]����#��
L��
�c4�|����rgk��^u��Z�>����qc�H���q:K`���C����r�8z�c=��f����L�n�3{�L��K[��A��z������d>����:����V�@2�7A~�^�[�5��N�(�
�jq�G$�2�7�(��8��6(�7�t��m�(B����Y��Ne�rbi���D�sh�%�o���b�6tv0�V�y�dITI��C�}�^=e&RT����r�S��]��L�x'uM�y�9����oON�%I��C+������Z�����_<f�m�?�h��?<89~��-�
�5W��7��`�����"��~p�[����{`���0h��p�;��F��u����;0���^��m�/*��"@�<\�u1Fh^�����*A�
\p�����x�4��R�x�z���<��m����|i������������&������u�T��a��x�����*���z����Iy�]�r�]��5���jAf_�G�@���V?9�=���������?���t��g���]{_?�L�cz�'�k�^>�l���9f�������-6Z�ZA���KE=�*�u��^�_��6��n;(z��fV](�A�Nv�]�
����!��/���+��4w)� �M�<%�Q�a�fp9��KC�X�_1�D�
���^9d���M���>��8���m��,�Q�O���W������x�>�M���1�j���Tf�����^����C��z�4�*{�������@rwa���	��[�eV����|������R����DN�������+�~����N!�� Q�I�Q��!��'����`[E��	S�^��g��Uo��l���)�6C���2��P�mx�%����C-��6��^|��<�u�B-���������W�	�I��h8O9�l�8�?������6p����;�F��F����U�$� ������$����^���FEES�t<cH����|z��+:d�O�Lv��4�����u�>�b)���dD�4�����ox�Go����\"�'���������>�����2����5
_��=W
f~�A<H8�#)>()n���z��M�.V��=>�2�����=���m�F k�Iq�?7�Z����7�
������Q�.2�+L�(��7�,y����y�6e��U' C6m��>����l��U�Z��A�%��=��Q�akw������Aa����Z���<��s/�b{�X�8���Y��2�������
n&�/����nz�=H9���m�l+��Rj�P*��9/	�>]��^a"kwf�c�J�JW����������VO����N9��D���PU����V��o�PL������84G�a������`o��8�7�s�_��n6� �o�oNk_�A92�����g==�g�A�N��<����
��8|�����H��~�����9�&�G��TB���"��Q��=���*:�)�Z0�"�z��3�XC�X�����������K�)b�h��s�337�*��3��<���P�P���D�T�������N���I}�G��]�*��~}����]n�%ZP�{&�7�O�)h�Y
�c������1�|���3�|�F���0�����m4F�{�~s���.6��8d)F��4>|�	HT�$��\y��8��E��M���0M(/�n��:����F�<J��K��0���\1eh;m�{6=q�j���.T<�z��y/T��E#�/�9m������=K=�v�[����Zmo���5�;�n$g����nu��[�_k����[��>���w�����z�a{�d?Z�7�`�&X[�[l��S���ac�K��3>�`Xx�b�t��^���-+zh���=~�#;`J�����	d��dc��4beV)-��3����*z�K�+b���Aa��� J��<�8�K����c�[n�x�g�aC���5���V5�x�l��9�&�g�Sx�s�)�;�����  ���?�/�S�� ���GL�����Z��(F�4@���M�����%�!��p�;��3��\-�p����(2����Pr�t���k����&��w�sTDVN�w�._g��?^���G���=X����=DI��]=|���2��P���T�/�]�?tU���>x���?p���%���E�/e��v�p�����0�z����q���	J���S�x}�r�����cI�����j�N�z��B���R���Bo�Bg�B����u9���00�����M>���j�M��j?�_�q���� W�����U��
�?]�?J�/_	�H-�/_
�;��>�5
����~�:��`��[/�>%Q~}4��[�����^we��b;K'ROR������OR�pu���2�<�{�l��~��Cj�=�
��X�����}���W��+-,��*�q4�,����q��%�K?��+�Fg����z�~g��+��LK��y����Rh��[�Z�c��;T���XJ/�%�)���Lk���
�m��
�������4��Z���)�n��m���T-�w;���.��yJ�}%������/WPl5�7e��0z�!a��~������`o��`�n3K�� ���G��f����~Rd)l��Q5���]5�>��%�r����Y��0U�#�K8-9��3*�>���V�Vk5[unC��%��y����.��_+�J=d�(���*T1��M�.ey{\������z��e���BO[_���h�����4Y�Y^���=�Z��_���'���Yj�����R���B>��f��������y,��X��+)��X��_�������!�������m�;z��-��<pQ�����G~?ZD#����D��r�PM#�/��3u�[���^�����"�����h�Y������q-�����X��<4��V�b�[���I�Y�����*b�G��� �E�2/`���sY�����������^����j{���5�%�����{m���6v-���?�fZ����=������~�RV���� ���/����_�/7~�i<PE�����U��	|�/�t�E ����]!�����.��2�5��.\����^k�]����p���=�^�_���k�@6����_/��x�3�?�x74~����Y������DN�
o�q8s�+5j{�F���������G��=�st�P�6���LE���������j���.�G��m��F�S��O���_�v���5;��_�MPP����x��3O�my�_�/�?�������rz�N�5�[��n�� $bk4�w�{�.�u�����u�����Yp�5z^�����k�n���'��������*��������s���y
N��B�<�~�X�f���_��
�;O�'���]�����y��p�?�~~�~�������S$�9$J�`at �9������~��J��)�c%��������?�H\t��q�A�������*7�x\�
�g�G�E���o�S��q4G�8���o0=���3r��D%8Y��d�(	!���(<���#t���]A�},.���������Jt�	v��Gqj0���K+�Gd��9�1��\
����We%j%�������\Nqq��u5�C��a1���U��������C0�p�������X�{���RM��Ro���V�n���~2A�zI������P��`$�G���v���O����N�Dwz�v��l�:����6���*S�����u�
tY���K��?� W_�n���*�Io��8���������������9��H�������������e/m�C���a	�9����"p�������Q�t�m�������~������1f�k�a�#�!f6���(>PP���lga��,NK�">ZE����/�������P0�(1�D�h��S4�0���?T��)-gN#.*&tA�����&�`�ZA�[
R�BvO'�7��P����6h�|�����,x�_#��~���;?z).;���)���i��+j��Lu%��0�li�����-����1�	G�-�#���5��^�K���3����qz3:�e�q����Ik)u������1h{��
�a#=�T1t�K��x=�H���"���3��]�JD�x���0_XGBM������x���\Y��l��ne�;�W�Hf4'U�o�t�a�i���_����������?d���G������p:��n�oI�U����q8�����1�M��-'�Q<AH�|�DH���pi�����;x j�<V#��}�*�'�]���J��A
���r�E8�J6��o���	����DH���M^^1�<��{�_W����?�\iq����fQ���e�k'WHWw����n�y2'h5M��%7������/6�k@$�]aE��{���2IS��
0�80���_PLd��� ������W��]�F�����p�F������Fp|�������4��$��s]].��g��n&�O%-��&<����n��X�Y�",�S��GD��cB�74K�^5Q�P��s�3�u�����Q�
��
#�+M��$K��� -K��������|i]��"�4��p=e���`!>b�"�m!�)����]�Q�N_v�7H8KX&s�&0L��p��$i��j�������������i���]F:`���Ak}�=N�hR#q�'@�}��"����Ly_m<]|l3Q'�� U��A�Y��^����3��P���q�(�VQM�AW�~��ID�9D5G=�cq��5�n����%tg��>x�)2���`�p{t�(��N"=�4u��c��#3��b�F�V�3�#��T;�����i���.(N�9F6�{0�hf�	���G�S3k4t�G�qx�:7f�<NmQ��a���������ST]�o�����6�����A�`���|�� ���[�����UU��H��*����$h-�[_����H� a�b�t�"�K��V8��4����������'���9�
*:��>�����&?E��h Z7!+}�Z����)��}��m�]���d�����u�I
~��m5;����\��<��J������$����,�!���|���>�U�e�`4�/	3*�-��Ag����u:U~oM�D8���X}#"��-�V:D`�aI1�q���	N��&����jg���a��SW�������E�zl��X5�5����M�x���|��SB�����^����xTI��(K4��L��1)1�Uq�7���
��,�u�GJ���!����C]7ID��;��
j�?���&���-�d��$��,bdJF�!�k��-I���.f�7F-��2����$�M>E��"�L�����4��{K�@CD?J#,FC��wl[���X�hk�eX�SA�������y�����P�tQ����5y�2'���IM��U�$p����8H���$�	��$���a�:���8�8
57
��)$2Y�/"?d�Q�G�0HL@�t�m�)�.�Y��b{)I&+.+%5-���LH�Ia|_HLB����P���b��l���G�Yn�$7����T.X�V��p��"�)��c'�0e{Y��bl�Z��R�!�-�^�L���`�����IK�9�gv1~��������7a=c������go�Um���u;�f����Hn�L@`�$0�8B[s\G��FZ�����1�\`�����dNZ��[���f�-�����`@(����?�	02?dH,����_�����t���?dN�1L�~8��g,v�N���.R����u}�
�B�v�}��c�/^<�}t*5���}7S�����O���/#e���n>����uq��S 9x?[���(�Nk���&��f���"Q��7Gwb��r8�\X�q�}�k6IY�d�{8	 �&�F�!J\[�;1��T5a�Lc��
b�u�
��@�:_4���%h1��%m�W�.�y[p�\S�V�"�A�-��Gu@4'��H���?I��:�s��1hE����0�pHgU�����?�����m0��U��i���u���g���>�|�qk�#,�����+�jG��eE���B��)��t1[f��zlpg<ZV�����,W��6�@Z�����g;�G�k0�/���m0������6"I��F��IsA`7�6|1�&
��/� j���k�9��!��|���&��_���P���/��7���������?��(�0��g;���d�"�����F���x����J��Zw���D�$���bEn��8�x&Sm���M]�$���t	R�A�x�|v�4�i��d������.Y���D;���:����C�B�c8�����I����`+U�)��V������v�]{u����V[���K�T�7�����[9����Bh{n
���4��r��f�eF�g{����_/���
+����&�]��X�k��l�d�2"_NE!�Svt����O�Tgxk	���i�9#��jo*A�@(�T��_S��i��b����kS�wQ�I�������lK<)����[�L�J�cW��<`44q�G�������dV��y��'V;j�R:�x�f>f�\4�"��p<��c���8B�l��\� � ��R�����&�JLc)���eX	��qN������2Y$(:A���C��(����+�����1��	���J����#�N"m&���\a� ���T�?���q ��K�n�	�q�..�^�4������>��$��0�G�(�	&#�+��e�I��|�8O�����E���3�sU�	��%
��P@N.#�7�$H>H��h���VY�9�p	+ �b���\`���+y�}��/�4R���	�j6Z�vsP���f��,f�,m�$�,}�|����/����M'�*�3c��2�����<`|����;g��D�������0������I��
�l��F��7?x:��<��	},�w�D�BM8NF����k$D�c�-�k���q4��\�t����jX!�����_?(m���5��:����E�r���R:!o��$4�����W�jZFA- M���!l�n�����}���!�B[��
��hB����K�e��J��v��0����U��T��W�:8y��������i���
�������`2����^�`�	*�?���|R��:O~r���b���j��}����x�������te3��@O(k�O)D&b�	���n���
�e-�T�Z*�Z)����m��H:�H~`
(���:D1Bk���ZN��4����4�~�
�i2��`)�xvT��'4y��_�Z�b�^�x�����{N�W�^��<��QC�;9<>EC���B>("39a�}���]h{����e�gM�b>����9�Le�?�BK��aCP��k���R�`g�[�%I�C
c�R>�S�Q���	�T2�mDW-t�WT��uT��'�������Xl����0;v��,Z�(��-.����E�g!��9&�����>:�<74��Ip_���@�#�����F��6��M}�������xF8h�UL�����H����E��<F5����;�c#�E���b4�U:,'L��������8���=hW/���|l���9�z�������h���W6�$�xp�I��>K� cdge�������l����,�f��M�����P�-���|��-�8�({�Lo�e����E�wp����G����+Ecd��<��tj�le������r��V���dc��b��d%���
Z�D���pkdo'��u�[�i�/"k/i��c��qH��������Q���H��T���� r0�����0
NE���h���VX��0Wq��7�h��%��0�}����?RwA3��7IUq��ItYP~�� F�\"��sM�y��9��.����|b�pFb���z&�h�/���:�GdZ$�#
��;5F��N?��1kF�-V8;�T�!�
�����C����:�
��.F�LD7,����k�;��>�O\�1I'�2��
�X�5r���+��`6P��+��1#�Q��qD�����pj����L�[�*��9�k�8Z�g���13B�eC�4Y&`�n�/�*�J|��-�1��4�08&�>�S`���L�����y�����Dr����N�l����tb�?���~bG��!I��pr���D�Dd�Z@��SKD��_��Oq�p�����X������uCq��-��������p> ���y�0���P�r�|8��2�����}��(�^ED@��P�R���$���4���'[�[����)GY4Pv2<GDSr��7$�����-Y%��B�y�������X�D������$	&�>L��q0�e&�P4]�n�n����\����k��R�x�zbZ;����G�(����4���&���z����+�������5�:����i/0��X,kl}�o*����O�j��o$K��R��xD����R��e�4���GH�K�����Zy��*��q�x�`��,����m������x�n�	W�l�V6Q���2I�>NKV�Rl*�$8`����H)K*����K/(��a[���aX�>fp���2 ������F��dC6s���#�&��%�3�2u��8�Av��%���k�x�QN�����t�����l��]"����e���*�����,Dc�d���m��F�C���~�/#>(��[�a;* JK2J:K],���,���6�3��?��N#��@+]U����Cg�L�Z����z0Q�u�Ri��,�,���{(�H{)$�u�eG�nw�
P�:9z��RR_T��km�� �d��+���Ip=Q����RP�H�:,��9����iVli�,E��Ib��j��XQS����Y�B���Y��#u���*Z����'���1������*�����NqO��"�H��3�{	TF�s��:S!50��i%d�����$�����<�z�ye��
s���mv�l����a�m���c�7Q.F�7�v���=���HNh����2�w��]���,;K�����o�%����F�����p�7��$��/z#�Opi�:���/vDPP!�r�J!eN]�~&��������j/+s�4P(��Z����C�U��H�6�")H����<��3%F��#�����������u�nmOA�2��Q+i����0� k<v*��z������[AN��=����>����Yb�
e�z��@�c	�k�aU3`���.4�HH�b�e���B���)����S� 9��w��Vx�8t��$�����W�	���������S�+
��lN����O�\�v�\�l|yt]� UED�
f#���������W���d[+�������P>'������(���<��Z��up�$;Q��(J+��{�KH�
����������V��#\4���JB�d�p<A��#dMP��C=e�)��~@"�X���XB| �LF���P�Lhv�6�k�~�����)x��T���H6Z��|�B�c�h������C���XE���4*��I�W�jC�X��+_�!��P�`bS,co�SR�E��Guv�
�gh^�>���X�����f���V�����:�RQ�a��)��
���{��7�'��0s4���G�d�VgLu.AG�q(��g&(8�Ms�-R�<�(��Q��J,��`�J����JPb&6�5����&nZV��(3��A
<q�EHe�R!.��'aM�rw�
T����:��:#f�NP��UI��V�'>�4�=)W�����%��Q@�1���jfrufU���c�{�R���2�a��Zn��frG�YC�V2�F&�)>���&�
���>�4�1Z�lO��%�T� �����l#!�4���*�U�NF��M+#��*�?R��@L0�����8n��"������{D�����{(��F��L��5[�G����C�o��^�5���z���;����z7�6����]o�a�?j����{�U������Y��{Ro������&��p%�`�-��3OR�t�L=����?�1Kk�D���*�
\6a&v5if�%]�In�������U�+�,�%�%��d������!yBI��0E'��V*	<�D%R���+U�b��������@�[(�s��Hul��M���!�HD�����sclT�����r ��pf����>���0�����(��@����w1�T��R��N����e���`��	4��Lx(��r�H��b��1��
Pz
r���Il���
����'�.7(NL�lYxQ���h�>��[.��d����8��Y-o���E����h���5:��~����A��O���&��BZ>[O�c�L��HE�D�5���Z������<a6��ps=4�M��Js7,�����"�F@�8��R��7+���K&nB�L��S�KF:�`�[����B!
�(KZa��-��H;	n��k�%���������@��I�>~)e����:rJ����dC�cR���yMB�L����?�S�����~����{�x13����R����|o����� s�8�v����W�x���Qle��B������f
�����p��#���d�K�Gs����.}����~g��|{���GF����E��`���4���H	�K���	���YwZ���<U���qG���1�1�h�SwT��~��b����~����z�v�o�����73�F�w\���[����&%��7���>0�������������69�*+�N��8+\���[U! ��M�4(�C` �2�)c�]+H�"���W�xS�*���b [|���)=Ge_���|J�^��'r?��[hG���#���%��X5��~������Q�dP�OVF���j������&���*�M���N;L���� �H�^�vR�Z<��S���M24b��`�e��$���C������r�����`���� �h�=U��tM*[��8l�����OVQ#r8;�������1������*p�Tl4� ��e�����^k��r�a>�.[9��F	h�����dGl������I
B���Z����jYro���p��V����i�Dz�j!2�?��/�T����o��X��B�n]�<�,pU��f)�;�x���:y�I�z$��TH
���d���\ ��p>�4��,��K�������)�#d�d_�8�f)V�w���$P-�&���Qw.\�w�@1\���!�hx��:&-p>U����vY���N)I��a}������o�m��x�������B/pq�$k���q�-��Bv����Sc���~�V���~g���n C�H?BIju"�� -�g���+�Gg����}�O�21*��}��LU%��	�U.�:;��� ��5����=e:i�Ll9���U�WL�AnP�s8���pD9F;��{��i�[z��i�L����[n���Yb��-�����~�)Grd����0I���.���Z8"������_��E2�UI$�T�1\l_x�h�(~�P��;!�~����| �aoXo6���������-��2D�� ��,d
t@%���	����y����UP�`8�����Z�D=
�2#��	���V)��M90���U���H��[0:��X1��5T��k�g;�S������5��o�7��a�!�
�!U����n��
]���j�8~,X�����VQ�j ���L7�
�RwZ*�x��E�Ul�r�Wc{)&@@:l�Q�	�"��x��
��%�8�Pm|�p�������?L~���'����4������h�/�	�.k�/�-#z�(��?���@�����PD~&��a�/dE3��S1� �����`�]'�t[qE��[�X���\�R������agT�~g�	�e>3r_��F�L�a4����G��Z������g{'�n����-���?�0������R:�n3���2�-=@/s�o3��;k�����w���9_����aw����:A�W���5�f���w�������V]��vcK0+��9f��i9A�V+�<2z����?$��mh��D(��tlK�(%�cX9�A#e������{��^��M����:t�%��`�8�Mi��m����-����d��qHA�Ck"�&��L0p��
~:#_A�7vC�S�/�e���n�����Q���"|����V@����
u�n���X:�V�iD]|����$%���v1�\�GV6��a"����t,����uS�|I��9	�R�4O�C�NT���JJ:�[B�:�Gr|H��j�������	��������G�+� \��4J&���'���k��#mh�u���k�!��l~�%�L�Y
�*�VD �����{HQXTH��(t��?�"�[��t�(d����S')�����F�h���	�Tt�t������*��O�G���M�M�M�����5
x���M(��
n�������y����;r�����:���=����K�H���k����v{{���o���})��g�����> �O,k�v@c��d
��� w���z��2E�a�I/.��
��V��}�C�a\s�R ��X2d�eI���'�^L(>[�Ln��������J/���`����ybn�g��_�;���$����a0�KC;��F.V�pjt�p`�[���������������������{ ]�:�B2��Gg��T\����~sxv�������Y���|�mb�[��"*�[���� ���R���pIjKT?�����D:���-|t�
e�)1��7�<��Rp���LA��a:�a`�W�C`q-KpX��
���",#���*�N0�������������N�4'�/�c���)�/�����u��?8~���%��8��ZF���%Zg��/(�����Lm�5i�]��5�U9���
i��~@n�v����Zm�����e��bY���Cx��{�T���\r�g�"�9�=���o���c�5���`\��,!����V��������c���������A!��!<Z�dd 7��������|2M�P����9ta<O�������t���S*wEc��!4k�D(���Jtk���v�|&��bO�W�{������8�49�_
�����p����������H�y=���H,���
�-6j&�	����UL�����{&�z�4/�p�l���z���J�A��E����T�����P8��)�Pj+��10��7�iB�@���:*2��iD��U �2P��L��Uf�����zW��q�h�+1���,�+n�i`��f?WdG�����za�v��A[��d�>�����;&{S��z������g�T^p?���U����T�t�6v-��qZ2������rKV/L������+�xH�]����n��o��F���L��~�
�4Q'��6��{�g������~v������G���'���������3{-�FM���X�n���F�����-���?U�XSNb�Td���O���,e�h8b�.e�r�3J.�yZ�|	���~(q���;3�;}#���M�J1N��0�	NJ��j*
�_-���V�%�5Dd��e�����Dd_��[��K)�z�;9����������yk:�2���O�~F�^������^�3����f���l��(d�E�w����>�'����;�?�~���0��n�Rj/P�Kq��3���M9���a"���g�o��D�fnDUu��WQ���������:�	[�1@��L�X�V��,D�dL�+����_O!|�l�w�hT'�5XY�5���P9���wL��QeR7���?���I�da]���y�'X��B�������A��,x�Y�,? ��t��w���_��sB~�^�|�������x�����;9ES�o�o�?���o�O^�>|	O�a���[�l���D����Wpe�=8<C&W��M+nx,��z��f�v�G�`j{���p�I]���E��)������}h�Fp=2�����Z��`�uQ�<
qq?$\0`
V6������C`K�����[mQPm.��v�~�3c'H,�b�1}n�����Vkv���n����Zqr�G��%�n���������aN������������`��Y��!���|�,0���
v�<r��v$�q��D���l��-�!���ZY�U���$^=�kG�6]��q�b���b����)��������sX�7 H�R�1�n{�>�g���ZC4����,x���Nbd��n,����L�*T
�u��9:G&*���3*�g��~�V������ ����c�#��n���m��=���pt�#�jg>HWK�,�e�m~����c���������5:���x�94NN��*����A����
�f:�2<2��X���V4�H�xq��Dcl���Kf�
_��Fy\Z����|���H:���Y""q6�gl��Y���c5�|mx�>c���`0{b��$�������-�SE��{�-���mW[�{���v��B�1E��Br��R�G�q�,��${gJ���'��q�1�A�����[&H�����
u0��t!����t�� ��IBi*�����` �P��@F��kO�R����Q�)��� ��">�����E��	���D��CdI�����J��6n�q�*�ms�.����A8St-�1������J��1�����?�Nt��9�c$6v$�[g��ru�4.s�V�H�1���!D���rVi�M�(1�U:sd?�qqP�7l�:Vq[p#�7j�����'���Bo]{e�����+�'VnT��QmV���U�7��9��=����>�So}?����)��`^g����,^��KT����!g�r����_��8�x�������r�3B�/J�_��Vi;�;CR��V���`���b�t��"��@�4d?����I�2�L��aR��������������������
����LW?W1���?J��+���K��^y��L0�/�X*8����������s�U��N���V�c.�T7��V�cu�����v�V�?�?~v������6�Z
vG,6{A�&�D3[�8������-��6�d�O	���������7����������w��������r�"��:�-	�����Yy����E&�|v=�]�N

}�9���v2�67y���N�k��j�,��"t71��]�6:����2>|��`=���Uz{�8���KH���%	��2B:��2��/>z�d>�o%���~���@��E���"��bY[a�X>b=\I������R3+��>���^-/���y�i�GEO!������	t�L�E�=������9��7{#Y��9���Q&��@�*Y� �����r�}�28�Ln�G�2��j9��f_V�c���fD�g�|���^����z-8��OvJ�^�����V�N0����4���_P��gx�����8���A�*"��T�@���>w+'Lm�B4��c� �*�r.Y�p����P�`:�I[���B������h�D�d���X��I�R9����>eU��U�-3P+K�Y�fQ�t�mc=��>`J�&��U������0Ir2x��pZ����.��c�rk��n�D����� Kbx���eX��M�.�*?��)%�	s����l��������C �wJ��n��[���hz�deb�h%��O��e�3�XX��WAj���:mm"��[��:��N��:��>�����q����!��ZR|��|r��@�(.Q/�9�}�;�=�6������Uz�!#]�&�����0
F����^7�/�nY����.]*"����N�Q��QK�{vD<�S@>��q0!g�}�����nj��,�e@�U�q���,K��e_����2Q�����]N�PaDj1��|�`ep�\!��;@���:��?�C��v���u�E%V�0��q���S��<K��2*��P�(!��T���P[�@!��T��f��#�Fh/?&yf�Ae�8��e��I�Wv�W��a�L������:j��k��Hy�!���fB�P	���^|�l��Y�[��i�f����"u�Y��ig��>�DBz'�hu�P�|�7�*~E��B����4f�G_������<)*�����%�s}�U�Sb����� @�\^��<�a����_s8�/�0HE8�����j����+u�������C	Kp����M�o
��t�C\j,����o��Ms��}������2r��
�H�i�*��D���������)BG��"�J��~�\@R]���,M�r�1�,�����
<������u�.�y�,@�MB�|��^�hH5�'*w=J��I�"�-���T��qI	{�&��q������x��b�z��4���S�g�A��|����qqc�T��%������NO~�7`�T��F��`Gf���Nsy������i�ZB��?�yD�\P����T�d��&�	<:�5��H2.����F	g����%���`���\��PI�t��H���D����6c�Sq�T����(��T�#ik�*�J�����\
Vj��Tq��HOl�2�	����l/����6�,�|�#d}}�2�����r@�*����@��WLSU�$�h.����.���Zb�K���J���<h��Il�0zP�m�%���������t�ib���	���t)��~L?TS�m�w}����#%�33�z����x1ob���=%���?Wi�3S5�)|*a;(��q����D���Ufa��F�x���)�����F3��78z�B7�%������q9��|���U����VE�T)��Qa�X�J��~����YIO���jfT�>�r�w��k�	�g��nH?��Xw����Ft�gD�K@��u[. Q���
�����W��D��9����`��y�OP�h����<����q��
�Qx�����;������q��J	���h���E&����������<n��>�?�0C��������d�$ ������e%w�(��$�QP�`��_���*1K�n9��	����<���_;�R�.S�V6����jg;�O/�A����:5��b����Bq|�}3��5uo���q��*Y���0It��/��}�;t�>^�W�="�����E�=��un4r
HU����1*��>������8���}RM��@�n��������Eg�>M���]�I�^�A�$���.vj�s��� �U��$Pe�.�1�;kd�3tv�l�Q��L-S��+6q�W�C'��('�iW�}���BG8d�-�X�dbeLp�vf�3�Z�����Vw1b��E�
���o�-P�iW�����L�vE[�D�2�����=�cGXW���6X�#3*�L�������D
�)��|@�k���:���U�(��
�b����3S���z�~�h��2�t'3���q�
|�R�����Hf��l����	�|l������IqEWj�������qW�,hc�f�Ri1�y[NXwG����1*FK��o����B=rv� K��=�NJHD��i���D�XiQq"�uq9��D�����I��*��V;����R-#��^���1�DB��I���}�=�����Km0.���\���[^`3lI��%as:�0��'�LG�'�<�����e���dn��������#��xjW�Q����)��� ��n���d�nJ��G+I���,�~K�;v[����G�1��-�=��'�>��V~����ZA	��#w��:i?!q:NAA=��J,�	F|����I��1�A�%���t����qx�zY�
�4:5P$�AU��v$��wi�T����������47I`���B-NUM���v0����4�=��J�)��P��8iN�/�T����/�?�7����x<o�e��5"
�#qS��c����YE��L�-�dw?��+���2#�z;/y���o��u���ja��m��g@M�6I�~(	�(4z
Y��k,~�	m��13������x�</����3������V�sPr��p� s{nb]��j���\���)�s�����K:�S�+��Af7����q�X�R9g�Bpdh����Jy����D�z�NG�RNV�Sb���Ygj�F�w�&^�NB��[i/��`>��*���C8j�C�"}�����1��0C'��������R��wAn Y��F��ju����t�&z��$3�b�m��Z����~�t�����5����5��p�i�c(�=��xC;�L7���,����6#����d��zD�G*� ��@t�7�����.��"�"]Em���8��8/s�Hw��2���$����l��� �e��c6���f���qEJ<�*:RJ�T���!������{*?b�HC���d!�r[����,'����8��n�YN���6�>
'{�ML_��� �+���Y����W� ���]�:����K�cyy��@n���t���H)�O�����������KU�OJ[z��2�,��Yn$�����X+.�)5��6e��]�����a����y�HKu�Jy�����AK��9G���h����C\����O�-�rw���$M's�kX2
&v*Y;2[���.f���QK��s]��F��Yp4���������s��E���s����%$l[�b~�������7���������4Vq�o�"��o�j�cB�_�F���m��Tn��ZuM��;p��E�^�Av�N�WmSre�Cc�I[�[�J�-y7�8�8�
��b]*���UA!B3r��:=y�
?-m/�"h�,0��,y�(]Y3E�a�1�.��)�Oj}�58+�AG�]w��m�N�z�8�3bp"�a���������-)��l!#�	"��y��I������Tey������@
:Uo�u��$��D�����7�,w��}�{@t
���=��F���b��P_6}p
���P�	(�T0��x]qgp�Q�T5���[����`���&e���p��]y\9�EW�NcAp���g��)t=���FZJ�N:�T�M9��x5:��rw����cfa:"gG�����r��$��<E��i�������E������T�"�@��{��^W�I��[$���R�L�C�}���JB����m�e����(���YL�#�T��;���������d���j�1{/��@��~�����&��N	�+"��<P��V8�H��5��9x����l6����
*L_�$e�?��o�n�����rC� �3'�(I~TBeU��q\-��2�c��W`�?��g��rJ'���C��WQn.n<H4�����C��y��#��:O�
o3��r�k���s���|�VJ6�6^���P
@*Z�����(%�I��k?�yqc���@�J�����M���*3h5v{�Z����hwFUfK9`U��Ju�WG"Xu<�������|��&�'��J��X(]`��[��h���p����20��{�0�*�U=	(��&bM��s@�%� H����f�(����|UH[���������M�K��rq��I0�Q����OJ�!lc�/�,]/<�h=*��n���(/���������G��F���[Va@�*5�*�^���{�H�,���bZhR��sh�*R���%5&�9�t0�H;K��ApsY���������Fm%�$f{d}��B\3R��L^mN�N�dm�
&��5m'$TDT4��.�q���;��0�>��m�Zz��P�~!
nd/�����9�HT'G��TI1�bf���7��)����K���`[I_���0��p2��Xt��<T5����z8�@�k�:OR��+K\������-U�7���dUW�������t:��/e������,��r�XN�P$���%����s�N�r���U�(,;�V���e�@���aXq����a�9���d����Z��f����+!��-��!��:�J��/v4���M���;ogxSRC���	��H�Eu�
�|9kr����f����,�_0���F!%n�&))�����J��,9�a�BZ�����Zu$a?X��a
x�����j�j��H/���5<��xY�#0�H<Qy�O��tY�v63^�4��=^��)1������$�"
B*����#�w�u�%p���8p���	���E�&q@$'���!~�vSR��yq�l*L�P<@fT��� d[����+��-7�����#��X��a�����h��l���B
E�	�D�+��I-&�dI]����"O]EZ����j7��_��:C��i$��d�J,��|!V��)��]N��`������g���h����}�)3�P��xN8PYT���e���9���H#��Pj��\���N����T�u���>�n"f��A�>�U�J��H����v��8M�u����NbU����T$����FE�������Z�T�����������������������������������������������������������������������������������������mv�
#191Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#190)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 8, 2014 at 8:16 PM, Peter Geoghegan <pg@heroku.com> wrote:

Attached revision, v1.6, slightly tweaks the ordering of per-statement
trigger execution.

Right now, there is no way for a before row insert/update trigger to
determine whether it was called as part of an INSERT ... ON CONFLICT
UPDATE or not. It's also not possible for a DO INSTEAD trigger on a
view (a before row insert trigger) to determine that it was called
specifically due to an INSERT...IGNORE (which I think ought to imply
that any corresponding, "redirected" insertion into a table should
also use IGNORE....that's at least going to be something that a
certain number of apps will need to be made robust against).

The question is: Do we want to expose this distinction to triggers?
The natural way to do so would probably be to add TG_SPECULATIVE
special variable to plpgsql (and equivalent variables in other PLs).
This text variable would be either "UPSERT" or "IGNORE"; it would be
NULL when it was not applicable (e.g. with traditional INSERTs).

How do people feel about this? Is it important to include this in our
initial cut of the feature? I thought that I'd avoid that kind of
thing until prompted to address it by others, since it probably won't
end up being a common concern, but I'd like to hear a few opinions.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#192Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#191)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Dec 11, 2014 at 1:11 AM, Peter Geoghegan <pg@heroku.com> wrote:

On Mon, Dec 8, 2014 at 8:16 PM, Peter Geoghegan <pg@heroku.com> wrote:

Attached revision, v1.6, slightly tweaks the ordering of per-statement
trigger execution.

Right now, there is no way for a before row insert/update trigger to
determine whether it was called as part of an INSERT ... ON CONFLICT
UPDATE or not. It's also not possible for a DO INSTEAD trigger on a
view (a before row insert trigger) to determine that it was called
specifically due to an INSERT...IGNORE (which I think ought to imply
that any corresponding, "redirected" insertion into a table should
also use IGNORE....that's at least going to be something that a
certain number of apps will need to be made robust against).

The question is: Do we want to expose this distinction to triggers?
The natural way to do so would probably be to add TG_SPECULATIVE
special variable to plpgsql (and equivalent variables in other PLs).
This text variable would be either "UPSERT" or "IGNORE"; it would be
NULL when it was not applicable (e.g. with traditional INSERTs).

How do people feel about this? Is it important to include this in our
initial cut of the feature? I thought that I'd avoid that kind of
thing until prompted to address it by others, since it probably won't
end up being a common concern, but I'd like to hear a few opinions.

It's probably something we should add, but there's enough to do
getting the basic feature working first.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#193Michael Paquier
michael.paquier@gmail.com
In reply to: Robert Haas (#192)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Dec 12, 2014 at 6:39 AM, Robert Haas <robertmhaas@gmail.com> wrote:

It's probably something we should add, but there's enough to do
getting the basic feature working first.

Moving this patch to CF 2014-12 as work is still going on.
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#194Jeff Janes
jeff.janes@gmail.com
In reply to: Peter Geoghegan (#190)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 8, 2014 at 8:16 PM, Peter Geoghegan <pg@heroku.com> wrote:

Attached revision, v1.6, slightly tweaks the ordering of per-statement
trigger execution. The ordering is now explicitly documented (the html
mirror has been updated:

http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/trigger-definition.html
).

As always, there is a variant for each approach to value locking.

This revision fixes bitrot that developed when the patchset was
applied on master's tip, and also cleans up comments regarding how the
parent insert carries auxiliary/child state through all stages of
query processing. That should structure be clearer now, including how
setrefs.c has the auxiliary/child ModifyTable use the same
resultRelation as its parent.

If I build either option of the patch under MinGW, I get an error in the
grammar files related to the IGNORE reserved word.

$ (./configure --host=x86_64-w64-mingw32 --without-zlib && make && make
check) > /dev/null

In file included from ../../../src/include/parser/gramparse.h:29:0,
from gram.y:59:
../../../src/include/parser/gram.h:207:6: error: expected identifier before
numeric constant
In file included from gram.y:14366:0:

I don't get this problem on Linux.

The build chain seems to meet the specified minimum:

flex.exe 2.5.35
bison (GNU Bison) 2.4.2
This is perl, v5.8.8 built for msys-64int

It seems like IGNORE is getting replaced by the preprocessor with something
else, but I don't know how to get my hands on the intermediate file after
the preprocessor has done its thing.

Also, in both Linux and MinGW under option 1 patch I get an OID conflict on
OID 3261.

Cheers,

Jeff

#195Tom Lane
tgl@sss.pgh.pa.us
In reply to: Jeff Janes (#194)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Jeff Janes <jeff.janes@gmail.com> writes:

It seems like IGNORE is getting replaced by the preprocessor with something
else, but I don't know how to get my hands on the intermediate file after
the preprocessor has done its thing.

Maybe IGNORE is defined as a macro in MinGW?
Try s/IGNORE/IGNORE_P/g throughout the patch.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#196Peter Geoghegan
pg@heroku.com
In reply to: Jeff Janes (#194)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 15, 2014 at 4:22 PM, Jeff Janes <jeff.janes@gmail.com> wrote:

Also, in both Linux and MinGW under option 1 patch I get an OID conflict on
OID 3261.

I'll take a pass at fixing this bitrot soon. I'll follow Tom's advice
about macro collisions on MinGW while I'm at it, since his explanation
seems plausible.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#197Peter Geoghegan
pg@heroku.com
In reply to: Tom Lane (#195)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 15, 2014 at 4:33 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:

Jeff Janes <jeff.janes@gmail.com> writes:

It seems like IGNORE is getting replaced by the preprocessor with something
else, but I don't know how to get my hands on the intermediate file after
the preprocessor has done its thing.

Maybe IGNORE is defined as a macro in MinGW?
Try s/IGNORE/IGNORE_P/g throughout the patch.

BTW, the gcc -E flag does this. So figure out what exact arguments
MinGW's gcc is passed in the ordinary course of compiling gram.c, and
prepend "-E" to the list of existing flags while manually executing
gcc -- that should let you know exactly what's happening here.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#198Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#196)
2 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 15, 2014 at 4:59 PM, Peter Geoghegan <pg@heroku.com> wrote:

On Mon, Dec 15, 2014 at 4:22 PM, Jeff Janes <jeff.janes@gmail.com> wrote:

Also, in both Linux and MinGW under option 1 patch I get an OID conflict on
OID 3261.

I'll take a pass at fixing this bitrot soon. I'll follow Tom's advice
about macro collisions on MinGW while I'm at it, since his explanation
seems plausible.

Attached pair of revised patch sets fix the OID collision, and
presumably fix the MinGW issue (because IGNORE_P is now used as a
token name). It also polishes approach #2 to value locking in a few
places (e.g. better comments). Finally, both patches have a minor
buglet around EXPLAIN ANALYZE output fixed -- the output now indicates
if tuples are pulled up from auxiliary update nodes.

--
Peter Geoghegan

Attachments:

v1.7.vallock1.tar.gzapplication/x-gzip; name=v1.7.vallock1.tar.gzDownload
v1.7.vallock2.tar.gzapplication/x-gzip; name=v1.7.vallock2.tar.gzDownload
����T�\{s�F������u�R)�)�k_��u�+�\jo5�$b`���M��}�{$@� ����RV�	�����uOO���h4k����}w1��j��yp\1a�v�����6
�E���~4�����<��_����^���f��H?�����z_4[�N����:����7�_��A���OF<`�����n����?o@��w���`*Z}���A�����Z�F�k7���7���k�c�b��}�h�������v'"�o�?����_����"���u�_��.x$^�I,t���a<���k5_��^t���7�}l�,�����pr��5O�gQ&!�6e	DB�I���;����Q�iw�xp�8tW:��#�po&X�MW0�E�E�P�����f��'Z�e(�G���e B����q�Xsf�n��B��K�PX8�:i����k��Nu��r�@4�QB�=���<,K���f����L�:�/���:l������]�94���d�����C�Laq��6� ������x�D�+U��Cfq��G�Hax~e�FA?�/�.-�,�-09J�J]q"bB��(QE��`�T����p�Ar����h�>�� R/�ri	:p:z���-\1��7V���c���%����������Y(Qm�����/Lg;������z���#'r�kI�������s�

Y,@N
!�7
x���d
����6����v~{����|��v*8������cq��%�m$@zP��QaGLT[�4��� �P4�".F!4�u�G�`�CZ��A�o|B2	��:�	h]�`s����D���eY�(%�"dk&�	���Z���0�NMn���A3C�e��[,��c-v��HR<�+/N`6A���X����r�`F1t�~����UU����j�<?��@]���n����5]hq��LI?��*)+��n�B�N�g.����MAq(�c(���b�����`�l��!�wW���2���2�0�a]�7�XZO���x�^�����n0h9c���(���m��H����y�aX���c��N~0�&c;��IUg0b���E��i�3��Zm��O�l�,�����5��)��z�u���B��u:h���5���������}��N�^\������?b��}���q��L�Y���X�1�Xg18�^�/����;::z�at�?^z�u���/�1�H��S/5F���U���������Q�����t�}��!{��Ehp�6�Vr$0F��W_j'kR[�,�$�,�����B��U�+M����\l�.��)>��v�k�=����!���(���
q�i�'�/@�0r���Q��\��4���y�!��0���D?�q.]t 0����Z&��n	�+(�x_�/������!c�8�90�
�\{���aBzrB��]�B4�.,I���jo��7���r*2���q�����5����E�~Xm��^(P	�� ������������(���!������	(�����g,�.Dm�����+v?�����1��;������jd��/�������AM+��0]��0KB�0U3��N:0����O5
W��p��H����k�:j_�b�xfU��8��� �u&(�����������y%�^`:���	F��(i�UT��k42h"T�b���������QiN>I�u=�F"��1�����?����� |����_)qN�7�*��S�MzT�bd����V��Co���
���{�o�1������Xv@gc�.x!�z���n�1�����M3d�S�s�:^��+�{���-oqp�����4i� �0��������/�f�-��9|;�F75Md�)�ZR��TR�1�&Be���b�)�R��;�w��{� F��JR�Z4E��8USv�uv�������+]Dq���h!���'T�G�
gdH��`�2�4$c�L�;�#���w���/�t���Qx,�M�=�Z���\
�>
���{7pn�)/M��%� ��g������
���b���������Ofw���K�F��0
*�����1�L��7������n�U�p�!���?U��2��*��U���0�}z*�]���8��dK"L����-F$8L_�O��hm����Wlj?�2��C���nCNJ���I���BE(gV0������}��;B)��Q��(Fi���D=N�;9�������"�r�(Qqz�j���*i��F�w��4�_�2�������������X�)��+@�.��VG�?�jr�y)����Y�(����N`J3�Xa��rKG[���b������jt���D�@�Q�

�=O�'H5�n�f�E?�[Ei�������"1
u0o)��c�����R���P6rv��
�ldi�8�9��TN�����u���t���&\ ��SB�I��7��u��������1ek����D���M	������>����T^,��*?����v�'OU�\~�N��3������-�|��C�A��Cb����u����b������\������;�������q���He�(��HP���`�I0>z��1�JE�Eyx�CT���j��N�~�lr#�@��Z��	��K���O�d��f��#|/_�d���`�N�!��^�"'|tZO���<���nm�5M�\+|=�J%g���I�:�^vQf!A/?�����J}��5b�+��u���q�������q:[��D���#=C�����Z{��T���Ov�V�3e�k�;ycW=�c�z��m�d#`U�S��J6��������Z��T�T��1�9_.�����,��UF���Xg�6e�\����0'��~V�X���6<�#�m\���_������~�+Mf�wwM��M�����o�C>����$��:�I>)Ig I����-�,�������'��|x5o.GW�L��fy��0�>��PI!'{���"J'��8�ReBDH!U&��I��5�f��^��-��j��\R`v[B�p(��dm��a�����F������^����}H�����J��UJ���@4��'G[�M�����x�$dy�H��RLX��b���1#��
��b&�~\����$�����[�:������K��.��Hd�+�+��X�,R��!�Q�(���� �q|9�_�LvD��^^������d9\��PQL��	IU��=�AAzK@��R�x[Lm���1='�i����A$4[]Z6��D�d������hxQ�d���c��W��T9
R�\H��_"�c�Dsq{3�����o�0�U0{������v�w���vC��[���f���T�0a����P8���;�{0CP�V��tv���8�p9TF^�+����o)��u�
_�dke���h�X~=9*^���B��#K�O*W�f����-y����:R��>~�g�x�]o����I6�jvvKr� �Z}��O"��0��%�Q��0��y�^n���������)pHJ9-�<���Q{�@*lM����������4LXd}	1�^��!��� ��I�b5@���`�O���V$?N*�j�t�.BAp/���0�p
L)�{g2Y7�1�%���uy�x+�JDm������r{<R<����Gv����M�V�E��������G�F�tn��Y�Y����������u��n���!�#A�����~���z6���%�7T���Z�[����g��`=CO���L~	V -�*�/|�\JE���/:��r���"����x�.�#����k��_�&�FCn���x���N�n>���C��W{
^�F��-���</eR�IN�'�����Oj'�Z^�e��������5�.���*��')d#�s����� p���B{��J�G���YL���X�.��w��i�9Jq]�=)H1ov"�y@���&��lO4B��la��Z�����.��Zg�E����,^)�VJc�T N����L��x$����Wa�t���T�!���w<z�b��
��]b�X3�\�Y��@�gr��<��H�>6i��)o���C�����4JD�Fm9�,�v�v��6�%"���0��,�"�%�g;�'�B���+_O��wV������������<�dD��������z�ty�$���Q>��I*�yC��$(�Kw5x��A�cWT����)F��|��i�G<�pN'c�v�)��z:r�_�z�s����,`���uV�����[���C1'�[r��C�&�[R��K�fu��J���H���]-�Q��*8cN���R���I�s9�]5{7���j������x�;sZ:[�,��.���� >��Q�`���4�<;z��PS-��?�<������l�
#�d�v�l,��C	�r*-a��7�/�}L�z�P�rTV�l�)�����������J���O Mn����M2d���~U���dAi��� ��9�oe��8�SI��)dtH+���D��veY|���4���J!57���5�$9���f�^o[�A�_0�����b%Dt�IK����O�����k��o���r��4��I�X�Ik���h�����c�S[�|
��7�98`��qt��Ti�M$��qT|s=��8e�����i��v��<!YX�G�Y���Osw��[iV_��U)���/bQ�v��4�qf��8�ZP���<��5`���.���K<>fN����A��i����F�������D�?���M-�:��t����x��[2u������w����?�^���|�������1y����o
Z&���n�uvf6�)��hN;���Ot���x���������h4_�[;��i��?
�����u��$����!�8���c�|�
�l�IY��t�
7"����*ui����-�C&+M�f#w:����W���DsV����Q�L��!q>�������1���+��X��HY���q����S�w���@R�
�b�����s��]��A%�{�G�������*�W:}-~L���qHf�^lu�V��8��a�� �;�QZJ�$�l�>H[��	�I:#?`
����K��2��>^+����_�A�b�WF���/����q�T/]:C�^|�C�����o�A<7�v����tJ#��]p�-�h�H�)���m��X�	w_n����Wz���]�����3hM�A�#�@��({F;��3����v.��yB�R��y����5�
�nd��Q�_��>:��:4��_�����)Ua�*���a :�� -�k]�U>-��=�s�jr�Q�@jy�
O��EqW���u8��K("�=H`����������H�N��pi��P��q�,4J@�B�y��h �B������i:B�|����Y��(?�#�^j��<���AkrNb�	� ����'�@����'�%>��64
��>X�	�+i��mE�DG�d]�$��9	+�cO����`3��/�w}�b�F��^�z��������ZR��A
������Y%�k�*[��5�
��%����@ikF��������W#&x�r�y7��5�<�1_��n�K|'n���0h�8T��_@�+~��hEW7�I�
�|�~rJ��&�8���6�t
�m�H���B�l���%�zt�vH9O�	��K�������Yq��ml�c���tZB�����B~y�	�l��tA��v����8Q^�E��{���F��
����)����d���q�� �����������$�@k!1*������O<���I�v�������2���������N�.����N�7���h��&S&��`0�,eZ#V����{��3�U�:�!dP���!.��{@Ln��">U�U���
���K�Yl�;<[�u���S����#Y~j@{��_a�q}_���D*����M	���o��T��>��~`35�AY���r������	��
aO����y����=��6���b`�+T��"����w��5�V����d�z0]���`6�=x_g��
��~>�`3">^jWB���g0����L����63Qk��#��m�������)���-���T��^�Yn�}���Ul����H�����J��0��NNU��[�D�m3sf��o���D�k�pR~�
��#�W��i/2jv�d2��~����hE?�7U���:
����;�E<��H[1oQ����pHN���a�����8�NF1K�(���.:W�/�N���g6I����9^��a���e��RuD+{�e�1�����j�8A8e�y�$�gw����B��GXp6��
R����� b�N�P@��=Fu�����������y��f�P�8�����	o����{_�_{��=?d�����tE�*}�GW�I��F����S5h���>p���[\��iLGWs_ ���5�������2#6>�dQ0-���vA�A��������wX��	Z�Z����,mO4���t3��V�_/�d���E��n����,��t�����4�����Kz3�#sy��h�����_��I��"��0��k*�YRSd�Jj�[[�]T���a������K�d����$��6����A3($�������y<@+_���>����m�]L^_/9Q�T�S<�)�-�M��>�|��%��h�n���m`~��������fa�U�<jy6����3�O~��2�d]�E�,��A����l==X���gsp���a��$��w�Y�d����YR���N�lu=��'
~��,��A�����ZJ�����'��d>���X��&6;=Z,ii_3�L2����%����kvA�������A���pi}	�d>����WW��23;��,��
*��\R�^+�������q/]Q���j�~_�����9��������ex��UWz��ap}�F�Z��{{�����)����%����6��'�������Qv)�]����.}��!"�7�0�D��s	,��\b���@���E;t��B�3���i������u������uj�-/��Wx���N��� '�t��t��9���]���Z{�V���tqw�������	?R��(H���P�{+
�����V�5��{����o"E����Y��(��
$�Do�s���3�[+�M�h3'��q�\��{��(�~�j�C���2�!(6���5M��;v�c��Y��9ym���q0��LgQ%Q*�|a��3=�;
�-ol��WB������[�����s���*�[�+n�����O��O�w.���H����gdy��^���
D���_�3$�$���'/c`���/��5��
s+��������K*H-Hz%��x)�T��H�2���Z� lW����A/���S�,����
����O�'4�@�i	i!���V���x���������������V�j�����"'�#����_�LaQ���	�|��6��?��p���R�/��0Rl���1������A?*���l���4�P����E���;���V��G�>��s������3��a&���f}:����A:�W���{��������q��u*}_�����\��8>�K�MN��`�,��`���!�[���]������z.�k��9�`���,@I������}�������
�''-�q-�kH�d��y��w@����:��yKdNL�{�4iM��d�a��O����T(H����fO ��������d5�?���Y��0���~���[�6[��`�H�Y�������k�/Z�%���l"�
��E"P�
����o���P����_5X&���U���X��r��z+�(�
�-TT�����`ITn#���b��j����,3�&=��b��`R�|�R��+����	����p��g/�^���E�6������0��qz�[X�L���>\�?W�U�������;���uu�g��^����[���>��M���e��1�� <G����o����."c�s�������=<�����z�)~���^^���tZ�1������%t1��w���2@��Z5�j�0�/�b/�.�D��2g|��*t��ar2��
��=g����������TR`�^��)\�p]&�K�q/����_������K�i��������P�?T��3�M�[��|�^F�K��c	�
Jf��O	v�J�-���D�O�R�\�����/"ut�$��i>�jG��aTR���dUS������
x�v��B����S`7���9��$d�6�s�;�LF���}(��������o \��_���wI�xq-u����7����������!��&Hy������J�^.e&��2�<����*������h��E�����`��1D��l/��O>�V�(��8� ������0t�EbX4�a[g�e
�Az�� G��x��T��eg���P��8���G���d&A,�mF��C�MD��$U���4�mh����,7��l6�zC����Y�
���[d�
�&[s+�pd����n\$�3q�
���r�I��G
��W����dS��Le�8�G��`�)0���0�C�K�b��4�y����Gj.�'��7��@,FK
hc)BQ{�7K�u��P/?qs��#Y������{�F��'n�r�G����*���t�������������fUo�X�]�vN��g��a��d��-���������f8W
z��<�N�Q?�����G��/�^K�����_�V�^��������:e�{��3�>ttr�H��A�
^�D7���u�Q���W���x��Y����n�����+�]�>��52�S�.f��~$I�G#��9i�(�UyK����tF�#�&4����
a���8�i�;���p6��eOj���<�x�Vl&��eye���#�8��U�N�2�f��.�����#����'A �X�}��+~�����������6�/���dE~uI�������`�G���bl^�G
N�t\^����������{�Yi4}�v:��eByQT��.�@�����4�~j�6y�
Cb�0�er�9��DA��Tq�v����#�r����$��'����<x��+
����RT�z�
�c�,��i���$�x�����p2��������T�gf�51i�}M}�T���I�9%l$U�!z��4�j
���Dp���'9�r�\�xC}�&��&)���G-wn����>��>9��M�d�`�e{���8As`��s�w��g��3.���]jb ���19gA�
	ns����qP���`7'O��<N�CV�G��tz��X�Q�Pb��h�!:g�0fv���"��;��i<����8�������T�e���������o�����v<�<yu���v/:��s�l�[�g�h#��H~�!K�b[�!�%-�prz�9�U����w��J-��I��`����q)��'�
��F���t8����H��9_U�=$���N�*�����5Zb��9��8��S����jX��qb��K���n#��:x���K��=m�����C�������k����"[9a���p�K~�Z����V�^���L~y��v2��,�.���K����>"c`�5�'+����6�+4��9�m��������a"!�K����������@����f#|~L��$��#�^����5�P��
BK����r�`���������X��sY��I�Yb��M�z`[���O���E�4Kb��Ms��`��E?tQ���'�r�
75����j:�(G�M�db�����,!)�U�Vot��jF���	�5�H�,U�L��|���.�DM������)����F~;��h
��o;U���GD��q����P�
��1W�Q	�)���=�b6�?BQ%F�g�|j5��e
6��C������U�W�_��\tO��~��?����n��?rI�)������y���.���� �)
L�-�(�[���:��}���/a������� �����)l�GZ�P�U����-q�������W���L�����Y�W��U�w&��F[1�az�Y{����3Iy"���"	4D�V(Y74�"�G�����7,���IA�p�z�VsO�L?j��7|��rb=���"�}���Vv����e3�(R�@���QA�{�XI�g6S��w�$�
��#h����-8��m�%bN�\��^��AU����j5j����%��[*�S�):�e'���8:B��6A�7���[��$[1�|%�������4��)I�(�$����V��FX7������.��w}�\��L�KZ��n���C�o��{�g��y���S�������e��qI�lO=�z5�E���o�1;C����cNN�����������<<�����@�O��vMM��w��^)G�7X������=)w�����n)�=�C����
�\O=L����'�K}��>����xu����Tb�$�!���,n����
��$�G<���6C����ykll�):�'+��Io����jj|2��z�x`\$����i�40;g�� �Q�����/��Y�'>���+��'����{2T�_4pBA��t4w���4�l>g�� ��I���^T�'����9�|?�m�������1B�6��]3K#�wC��W���%����3mVe$�}�f���������z
�hz�v�z�rl7
����
��q<U�
\3NpZ�9g�"���S��a�*0�sC�8�^9��Gg�������Sa
t����F#4����[~n���OI/f9n4W���x"Q�8���(B�=��,2���,_N7EU���x�q����Fb4��7������R�Y?\�����&,d�b���M�Gl;s��
!bJj��������K��#Z#@���U�s��{��M\v��E���������������)����}���p+�`0Tc�vy�Ph��X�!"������F�����6+7e%&V�M_Qb�M&�&��Gq�����v�o�9^�p�����Xg�X�]������f������r�����3�9�wO��s|�R�����
��Qj0U�;C]rV�l��p/��_LUs�0��,C%7y�4�W������6����UoV���V{?Z����g5�t	I@��>�\�������h<�����J�n������QW/z��K�ly��<
��r��Z�� ��C�r&q&61�����AL/����zA�S�����<r�K�
��@��1.���b��r�����Yt��L/>����� ��%n�09���x�95��Pr�G�����q�����"�9� ����]E�g/��S�`;>"�/��5������n�-�b����t��o��5���{����,�$`E�TA*����;�x������������s\1�I6C��G��C<,��L�&�k�*�_?���]���i@�'�Hr�����C��S�L���
��{��=
������8D,���l'��g��x�[F��t�[��qW^���������FY�]��T�a}J#��F�d����6/��E����G	@>\j�&|(S���+��U��n����(G��
U����}Z�����%r�Q��0S��Qz��69c���f(���d]���o�[��v�������yW��33f��t�"��������cDp�9N��_������A�7%��N���|d&����a>�n������0{l{���"�\����E�����7K���W�4�5&2��������2*;42�g����A�k����p��,��d�H��y�r�����T�*�o�����/��w2Y:��d/�E���� ����
� ��s	�Y�h1�������]���p���F��D��m%G��-�b�^
���������W^���7�������{x������5vY}��������qM�|F�lw���B�RH���s����k�<�������GR��c�{U7��x����tt}
���Q�WH\w.E|c����"���A�����'�O�`��b��m��j���}	���]��G���.i�O8��l�%I���$�|����4������,�������x���oK���H�����+��� d��,E���\�?=����B��7�����yY2�KLEE=/erw�|mD?5v�L�4�
�]f�+AG�I�\���C�x9�O�$'F<��
dB!Qa���J���,�nv�Ls�f���b�k�a�5y�\{����{/��\��q��{����l6��VX���{���`����X�W]!P���;�K\C��XG��a�:���h���=��s�*��k0��,�9T�tT%�<�H��5d�����?���H��kF�E��oS��������L�������|��wHk����6��UL8�K�o�c�����Z�bNPLfL�6,��{l�=���=����N}-��x���a�����[m��,���%�������B��8���SV>��������2�P�w������5����v���w��6xF�����}�aKa�j�����}q-%�#������!��?_9mR�����0��.c�����A[[��z6X`�7�,x�'�uz�E��^(��8�1���Q��'����Hkc<���A�&���7���X��9�)'���E$�Ux��e�����E���^��l~��s����,P�s�����+i��BRc�|�>d|0e��5-J�D��\��Cgll�iOm%�Z�-cw�����)nF���h�
f��@9;?���R���-��?�5���Ys?(}7F������������*���!W��������g�H%��z�1��W�������3��>���mP|�cj�� ���;���9�c��J�GX��+��r�*�9�������oO���>^h�	nM��U&~��R��z>xs`�mr6�1��j/!���i�����%
[a�Z��Uo��}����+���X��\1c�9�������'!�����0�Q�������Ma5���Mo��_2��5�eZ��w�X-��9}o�X�b1g��_T713�.���IP��#[w�walo�<�����F��28���)��V�J��8rK�,%W�W���5�H�n�t���{�Q���s��r��}��U�d^�)��r||�<��#z�p���_���_&�~��ucKf`K�^��Y�L�Xa��n5�=��z���5��7��]���[%9�q4���Z\���/ek�����.���<�W��d0
�oh���g`�a�������5���mi���j����x���������q�b��e�y��e�+����s�s
�'��7~p{�
U��'����;.�HPa�#�)w��Fr0���gn~5��*��cPU�-u��������������W����W�*u}�F�����A��?\��J[�^�2��V�����(����S�%R�����x{���������1<�GB�����xf���/7�ln5�J��"�Q��M�t8�7�e/m�#_k�vul�scw�wR��@����}���!-��m���7|6�nOm5s�d<.��:
Pg�����,�?�U�n%�=q!��`�2�o�3X�D_�v���-���#��.��,��A�����t��[A�a�(��$�H�eo�[T���1?�95B������(�EA�����'���#��]|W����#�je'��<��S��tA�uY�h���9h�R�e�D��;/?SoU	�W?����j���������F���WJ���( ?������eVJ_��D���A|&��J]f�I�X�I��8Z�:�g
H�Bq�~6����g2�^J������${
�v��
��
��\X<�T����]4z:W�Y����gNf)�`���q�����lz;2����~O.�X I���3O�#�����L�w��t�p5��e�&�i|��AQ��"�����k�{I�Gz����������.�H[��4�46N�L�QL���-��\�����������~E�"������ 0�L��2���N�T2�w����'��x����k:O�~ ^���G�d[u�
�
�l����4�
q��`��������_�446�Y�� -�C�W����T"tLS��s���*�p�8]�UJ�e�����?(n��^}��3���"�]�=�E���
��E��%����7�n�
��uu
����?�c[�z�I���oksD�F��^�Z��5��%�����8#L1�=�3?T���U�3B���{��iQ2668|�A,�X]$�-
��*Y�<7_�kG��]w��V|iff	���t�H�����\�����i��m4(�Nj���J1�/�:�$A�Ma3+Z`�H������&;�g^��	9:|W���?$�\�&o����+e�U��# <���i��5����]R�����?������Z�W�~������������ >�q<eg�s�p3(���2yl����:��s��0���*����O��xy�F*,��Okb���*d�#���g�R)K�>�=���#�:��p�\X��8�J���-id�1N��`��Z�e����[�}G�<\��q��=���Z��~~�U)�L��+�l������`4���>v��M������Q9���K�Y�C�m�?k{v{��GE��I���F5tk���
$�DB�c>x�\:C<r���si��(@�h"	J�n-\��v��`2������Q��r7�>��?PG����t�uWP��L��0c�z��s���/��=��y]�g.gxh�7h�?�N��{��s��oIwS��*���L1}m�C�z+��5b+�O+�j��z����S��{U�c��=E�����04��c�J�l�G
`�t?_!��l%Us��9B7El�6H=*3��x�R����^����+�U��m�/������h��C�����}���r��D{��+������:"0�D�<�nWW�3��|Z�)#4i�5��	� (}R��c�=I��bnBq'�`�SQ��&
V2��h�!q,�� �g��`�������n�2��x���W#-�m�z�\�V?���ub��_pua<��3k�@�m��������bO�Z�u���x�GG0}�QG}�
/����vcC��'g����o������_��[����{s�Xb
���3��@$���U���h�bI��dCj5��o�y���.N,��&!L~��E�5�(�G&��(��+(�y���<{�������-�2v}�K����)�rk�_J��Ob��&��I�\�|�t��#��N��>����)���d%N�n���Ja8F��y(��1�)�����F[.9qG���\��hj#���Bn�|l�����`�M|�(��i�Fz)�2�H�&�heVw@�:x�!�
�1��G21��dL %���M�D$�����G������o��1+��z�'�KGL�h��Li���A�L�'��:)��BZB��/�~�#����A!�}�UW8�AX������ek�[�`���1J���3�]��#�l��l����z�P�������+J���x���&c�HFFW�6�9���drj��+�o�����Z+����a1�a�.�$P���E0�@����U��$����p�qk8���O>�����g��|]�nP���o�d�#��I3���T��mP�Y_�O��,�'}���
�;�y
.?��D�bP��&Lr}��h6���d���#_1��Z�hByt�ii7���gn��XPP�YZE����������S��b7��������w3V@����O���I).�:�����_g$|I�i���*h����������F��h���I']����t+�����N�QH@U�D��*n|�3!�@�>,&r�5@q{L���	��A{0���8�� _9��R���cn,+�T���#���\�6rb�P��k���8^�s��RlS:���"(��H�r;e�=�"���x��
��#�s�}M��U�H��0�����du����9�B��	�9��o�9`�*O0�B���e$g^6�s,�jp���/#�
�JS�Y*�T�0�3�@g��%��kYLA�	�C��X�,X
@o��3^�1������6Rj���'`V^�u�H%�W8��]t������W���5��/'0����|�3�oL���kG�������3�����5��������5��I�W������7+����T���!td�6��6��i�y������M<���1��tm0�<���o���DT�n���+���[�|lLM��0�#�	���eL.�������5��m$w�a�eM1[	R��zK�x�=`"�e�5Y
�d* ]nq�P'?���,1'P9<��z�A#k/����R��b��F� k���7e���*on�%,�wZ�,�*���td^��C�K��L�����o�[��
x:��<t���@�c��EV�_365U��I�7���Q�m%n��m�^�	�+���q��R��%J���Y��F��([���~�~��f��)1���P?�Q���X1�8���;\�����8P?f�]���:
�����_���|���@�ZNEk��>��C����n���������qcw�)��QU$
~��R,���vWY��M�&���6r;?<O�������	�u�*�=IH5�C����p��������5�l	��[�ec�X�M������d o�W\$aN��0���P5��t�q�"S�F�r�"2�n�>���-
i�����$���a��5�W,���H����f��`s6 AI�4c���c!e�c'X�����}�f�qz��I����0��v�h?�:2������7S(��%��������=�Z{$�$�l}(na�����U��	
�����-�����SD������@xf�;WaX'k��6��+ZwP�Az}�>*��z�k`k/����ea��8��l��>"�!�����y����!���8oA�HO>��fkKJO�����k��m�o����R=�������!uG����{R+����Q�V3��7�//,�`^���o1"G}���v{'���~l������G�CI�h9�����c�	O���_��f������?|W��+���lO'�,��g/|��)���|S�J�\0�
��\�YYRE�d'������'�)��P�7M.Lc������f���.�Rb�j�Z��`�"����6YJ�jw��A�V��[�������M����6UR"�9��v��c`�k,�����;�m�Qn��7�maM����bv?]�)?�����.���J��/�d�����x��H��V�����w����m"/a�������BR��V����7��eX��M��-����!<��k��juo����k��dS+�@�0�}ksbq����f�ob���~;�e��T��������C
�8�q�u����^��r;�r\�
���:����`�E�����-���r�s�����(�����9�6	F���=�76�E�Q�q���FF�G��������:uq��Q���[�fT��O��U�%M�`��PCEF��#�CL���9��z5@������",�T��M���'������ ���������������)f�.��������r�5� m��2|ab��&C�1��
�]h���=M��Hs����2�}~P��|?u�
B�D����3���p~S���D/��|���3�++��������,�g��NPM39��-�����<K`�y�w�)+�� XA�)S/���B�'w+q��;mHT�s��l�������������=M&����"D%L�#K�/�����>�X����Yl�	��������m*Q��������
���G����U��K;������2d������]�s�j������5�J�e�T��:�y�\�G������*�H��X2s������#���)��b��}�0cRl��Zd*&�-�_�lM������9�W�&�3����<������h~^��^|Y�X���pP&�'�X�2�:�/Z�������^z��*�3�X�Pf{��@.����k#�.�L����������A���&I$�kY�=�j�@�Z�����s��j~�/�:�y�����(O�)��+�{��x�wl@����(�0'��R[D_������&n�q�=��������d #1��jS�4F���G���s7���,d�=�&�ke(oug��dq��g�p6,�G�������tmo�wt�6�B�d 6>�{	 |�+��llZ��L0f����C={M2��&{�|�����	c��������-�]@05+gl'�N���#'O�$�+:���Kp��;��F����S���Y��p���o.$D��	�@}�)fd,&=�R/bUl��&j���������	y���9����_
�4]�w��F9�����q(�R7��!"�,d����,����xx&��V����
J��7��l7�b�]w��_T	�#$��O��>@��M+�t''���
$�L1<����t���2$�5�Sp�&���8�&�V���W����d��6*21G��|6�nB�����(F����=%�c���]�h3��*�1�2���w�A2�C���8��Gq�1�d��~�'��T���O&������;q)
J�Q����D;���}�U�5��y�tA�J���a�l�4-h���l��L�Tm��V���ebzJ��i�)�
y��f����D����h ��iFr"���Fc�N���"����0�12��D69�Q�����-@g8b�Q���P�CL�����i�p���)N�)�(�%�Y��7����s��\;��y����[���;���8Me~
�b��.f����]L��q�libX���`:J~�y���'�:cZ���=_�f2���9�)x����X&�$�%�z�7�KR�&W+��V�C����h~$�F���d�����o������HY�����%�������{�x�?Kd���Y�l��c+��u��^d��2y8�N�Dv.���+�Y���>�*t�,��A{�e�':��`o_�<������6��n��Y�|�-��-:���2�qJ�wB��c�c/lcz�cFff�F(�`���H<ek1!>1��Ic`+��5g��Xea<�8_Q*��U��sy9abv�y�0��)#9�Y>D���
����i���S����es���S@rW!���	�����^���m�q,�}H��3�96�T(
��6�=D���cIf�s�
���[|�,Cn��
�`1�cF�&U�>�+�����t�wqb,�
�E���N$b�	�l7�"���4�i�y��80���P9���>��41��}4�!��jj�xX�,���0[qSK�����QN���YjB[~fQ�#*6�k�
B�rZ�X*T�����8�n�t�����kV"���vf��2�r�����7 ���w�`�kM7�/���{���Q`���I�-��v�Ry�.���F2D8��P��9�+���S1Qg|���3(9��:�f��S)���^�k[��U�	��
9��������!q,{��Mu��o�����T�_��dW�gO��$p�%<_/�S^�(�d�o/i���i�]��*`g��v����$�i�3RX}_�$��������p_V�<L��9���t�W���R��yQ�N�����~�jV���M��r���PB�+���G'+�qsxk����=7
*����Z6����L<eE��m���
�����P�Z3�9�o�<'%��E��/�%��(1�3r$���|��?��V�ofGC������M�L�=j�jV
y�q�{��
���e���z�����V\c���^z�m�9�����hXqs��&����Cv�+u�2�4W�&�������L�>�7��]er���&�q����i%��(�^�������Tf��nB��})���oH������fa�4��@�3pp���,l!�S��H��������LnSVG��|3�������A�v�{��������������{�~�c��k��T�A�|�������f\��or������L���q���7�J��U�0�|��B��{���u?������)��Yd���EN�v�����v
��.i�M��x��8?�Q�_���gs~���4N���@��a�H�%E}G�� ����U��D�J�/i�Y���|�>�����8����6iX�GgF�q��ZK����5��PD���`���T��%}|�d�����H�}��C���_[32ZtQ<	��z�=O)�n>�q[�_&��K��h�`Vf7���~�v��'�^�aj�!3���6�0q�:+�1�R�p���'M��1��`1�����U�z<�,��(4�?8�d��w��U������A'~�*�p47�� `W	��:F�a����2��:x���6���?&��j��;,���-R���0���h(�������c�MJq�����b���G�n���%x��5�y'Jh�$�;���qD����
��#�,q�\��t�Q�5m+���8��P#�-�8��R��m��M��!�{��t������A�811����L(A�{��d������$N3^_Lv��$���V�&G�f���JXf���S��2�*���]�?�%
������.bA�/	���
v��C��>��0v:�"$r��0 <g�A����X�(4u�U`���,���}�l�Y��
���0
=Hl&<
Ye?u�k,Y����y�V9�VG��'g��'W��xr~�W�*d]�r
3���Lg��VR��J�{����$f\
<��:e�i�x�&4�7X>�2Ri��l!6�U�{����9������;I�A&��9�RNR���|��;��@��52���=yt���}1�����J
�3�&	FoW���N]�����AH��uU��D�[Vk��G�a��W�L)����J��vu<x����C�=�`(������=������������������[]��)7L���K;���\�aM�7�S���Y�C)�O�i�.�)w���0{vG�����8?��i�������Q�����l���5��WL��cbo��\]u�M��@�������v�8c:"U����WP�������C���Dp
?��4���B�g'���)�v�$IeK�T��&s.#������&���m73$m4*�	6m�y��p���b������
^�pfEa$�N�����������C#������}�����@\^^��g*��o���G�o�8�s�������
�V*y*.`��[)���a���Z�����h?�EN*4�.s0��cg}��}k��G#q!����^�������a�H�_	;�e����
SK�#�1�������M�A?XNt������Apn ����'���aZ�������k�q���d��|�U0�����h/���M��.��VY=�bo��C��B|�#<3�I�%S����/�9���wwq��P!�.a����������^h���5Cf�~�-p=B��pKw�Tr�(���m���c5��v���'R�p����o���G����T��	/�
4g)'a�)���#�-O#�V"8�L4��g�u8H��!8!{��,)�5�M'��e�����W�5	����v;�FwU��ZM������Z�')X���K|�.'Ol��q#!�������e�e�P�k81��aV~�X�3��}(�&�
�t�-�c��){7u"��r�7sO,w:�{� 7�~Ms�%�,��Hm��X�N`k�D)�Nm�4u��D�	,ZtHDB��2��"{��	j�@�<��U������rvU	j��U����k"-��8Z[1]��d��#����'<�$�>�Z�����iN�]�1��|�>�U�wK�����E���W$Q���������������5�YcY�$�g���M�hpc�insF���-f��-T�<���7*Hh�Un���Xlh����R���qp�NN�- �qeR�
��xm��`���B��E��YaZ�k,-��$14�bQ�2f���E�#-�d�
��h��	�1�Z�c~��d��y�>�d�%@���aO�"tp4����*ZC��,�G����K��K����$z(����M#��Oi�t���������N�#5c������D�z:�TKU%M��RY\����-��TZ�}1��2Vu��I	5���Dx��
K��E8����f��"H/����!�#A.y�E�,F ��
k�!|�x���%�L�J*���^)�h�[��$3q#���0I4����r5�g���������*�_��u!��XJ�L��T"q'�Hh�����uo���.Q�x���Y����*������r�	�6��	)��b<���-&��?��/dp)p`.H7��b���j�]'��!h�&�[�(���sx�}pyEB����C�G�����W�S�p�!�i�.��`N�c�6�:�Go��{��
�{u)�0�!T���@�N�ys�>�6�?��^]�#C�����+�lN�{J�)P�_\5(������~����:�l�ut&p�x	3��_w���Z�K�s���9l��.�7q����Ov�������G���nl������i�S���})��EC&JxC*p���(xD�n*U��t���'��X�81�XR
6b���uq�k��s�K�����S&;�����t*��&S����Anu�m�hI{�Pm���F$9g�GG��l�����Uq:h�mZ��e���VsW3b�G����U�d�d!�F�qx+������x����#W8���N����?v���z~cX�&��:d�Y3�d���7�:])��4QlgQ����y7$)�Rb�������RL��th�_� ���o�N��������
�����P!��`q{�(�`�6��)�kq��u?�o�[�?��a&T�'g'�f[S�w�Ca@��MY��Z��_k�R�9�\Fs���Eu.e�*�	�{#���cHJ�d��}���uH���C@q��,x����s�����/����dRc���(�2������0���!��z�I����+2u��_1G�)������XF?��#,]j�Xc?�z{�k��5��}(�?z���b��;aI���6]��>OpC<[�d��,�.��W���o�9����_i���$��leS�-�g��X%A?B��j5��|���p�k<	$%!�=���W���?%���4F;P��p>�{�?�#�~H�
�FQ<]�����r�����)������~����?2���<;�������y�����O��6��r����� ��S2�rZ�+K��������v����S����Q�%K]���c6b}�>���^0p~� ��L����7���l��H�	F���~�3���n����2�����V_�j!�I����������M2.C������N����-~��\\Gr9%�c���	���h$w)Dys�����9��������������"N ����rh6U�`d����(F,_�3n,lW�������	�{���@�un
�P8�����.D����S��,�GB�8/:W�/�N�����.�sK}�{���&aq�;"����l��WSK���N��pB.���x[&G����F�u�%5���PZ�
���%�����4�"2T<��h����a���Jv��r?b}�)c�dIB��4�$��d�)�~*������5�ME}
�
"#�!	&�����Wt}��$��i��� b��w���r/�j��������d�4������Z0a�{�0�
t��=US���Ot�����[-����x@���d��z/�\&!&�'V�������6�_[�Hrz$e�$�+%<�A
�V|��CM��f�+��`w���U���^���+FW���U���	���J�����O6�6%��S��a������$��N��I��8�,Z��<:<=�H�2�������S4[�*
��i7%��}b����[74�8����(.2��#�c
0b\��F����������q������=3����TTC���L��mn8�XO��p$[��~�6@x$��6�_��-��&���s_d���?=?��g.c�PY���*�������	X�on:?��v�R�u	�pW����V��5Dg���x����fQ�K6�_�Y�B������������*��?��5�Zw���t�Su�c��@8�j{Ota�U1�^�o�:���2N46��}�������x���)�������{���(�P�{
Vn[{-�g���{�&,�e�@;RQ����?<W���c��4;�����m�Hr'?77�^C)���mg�>�Xb��u+���}[q��E��C�/��h���h
��j��?h�z�N�DE�h���@,~G�9,!���{B�o�^t��������(`Rn9����e�"��)��C2��|#S$�:��[<���q��/�v��Ek�b'��G���0���)��y��]����V�Q����,7���15,�&"����d�j�E�HE��_J�9BJ�%*x	����Z��7����^h��]]��n�}M��HI�Y�e��Yo���pg�����[�<H/8����!o����9r�8��G����"x��@�����V��
��Vs��@�[(:�2�����bo�,'��T�PW�4r)O]��D�0��l�27Z���P�#V5�jzO����
��Nm�����;������+]����p�!�����l�H�i����%������]�`�m7`��I9�.i�;�6����U�+�%5�#q*,��V���7�gG������������v1G���"���=���(��R	r�=��L��
��ml��H,N�������<�	��:� �O��"��5���y���h~n�im��S�g^����{{�4��bW
�ab�IM6���/E[����ct�u#���2]};����R�c��/����d���h6j|��l��+��GN^���������$�g3'MC��~���
�f�(�t�����`m���bm��{v�5����4������MZ����Fz��1]������
�a�W��V������_%dx
�^�����C4Nz�n/��f��x>3�c�������������J����b;n�g��W���o=��bs�xe�O������s��2���QgL��2y6�f�SJ���[
Q��A����O����)������aq9��D�_�
k�k~����)���W�U�F/���{�[k���>��F���R%�[(��~1����o��J���]H��)2H���.��[K�@�}�����.�&�����_���-�=�+�3Z�O�%C������G�_�����A�VL�-e���,��k�f�l��]&���Gw>�2�P���p~;A�"�<"��wC���#�a^VH��2njM�P�!�&W�0�q��M\v������Z]��C���u��4�J����G�W���h3�%8�)����p2��9��\
�c���0mrm��ep���A��p&A�6fA]\P���#�q�|;��	{�X_I��B��p��.1
�j��"K
v�w���h�*-dc�tr$G�FE?Qs�P���pZ,���2)3�*�$�;Gr��e-���T���*0��w�X���&V#%���I28�}A����~G�O��%R�J�9�qIS���_;BL��
D�qs� *����85E��"�A*

#xyv�,���5-���Wq	U����';����m��j!���k�$�&��g��a�{��sz�������C�����]2AAb����n!��-o!C�!\���Mi�gd���#��.���z��1�����S���}�o��^4��V�TQ	lk���Vr���hb��@;�$�QH�x.�������	��>������#���_N�Jag���$K�������9f�!^"�����E�^�%����/�0Q8��C��
���.���5EA�����&�\X�������U����
$����DG.#�G�]e���-Q���s���n��(��lZ_��������1�6������ao��k�}R��V����S�V�M�S�O�nRB�b�V^�8�s�aY��
lvY��!p���"` 7 �P�zb �*�1J[����
�;���X>����0x;�J����)�%���[�#{\���t��AG_`4��(fJYE�b� /��40P)(E�s��#���>(��a���"��*
���	n������b�"��^��F�����oPiN/��b��D����%��#cM����Ob�����=��2f!���
H�X2�s�^,��/�2LDR�l� ���A��.�����T�F2�%N�VD��ep50(�lzK� Y(��i���B���T�n�/���4g\
m�HV�jN��x���������N���cL�3Kx2�K�GY�uX
��g�Uvd]�m�%M���A���j����p-��ik)���f�`�^G��d�-����^��rd���s��TWSPd�����|&3Y8��R�
�M$`�M��"�L��Mt��n�2��4�#��X+U���
�����y/�&���$\�[��BW���7���_��D*�N����"y�"[�;��_@\2N����Og����f�MT�L��Z��f�p��;�����������:I����R0�6�x�c�>������J(�������~���a��������Hup������p�IL��2Z2K�����S��A�"�/�+R��QS�9�c�%���.�z�q��H>�	+���O�E}���>���j=�Y0g(�9�7���R_�4�sE(��#�1#^�`��)J&��	�:�4y�2jUW����e������Z/V�
�����F��W���A}�����Zy*����v����c�o�h��%��3T�f<������~V����:y����T�4OO�4;�����|��R-]^vI�]�ab��1tYa���996���E��G=i���c�S����;�8�`�$T�9�9�se[���bmwkt����x����V���x
~f�� u����(����,�J/87�
����I���.U������s�����b����iP���l3�h�C~p�6�N�@7��f���!�S��������$�<�^deth��b�YH��mD��8�,���$�x���4v#���� ����������0-�&�r�ZQ5yGr�������xGD�� ���DFS�0jf$v�HFsB/
�d�HV���2��#L�^�j���)����K�Aj��-�/���te�+[��h�XR��-	����J\������0��V���>����D�)�2��{]ENO�
�u��9hl�:��_$6�S^�\��	m��@����0@���'��4�v�L�_��a�H�������}L����W�a�F"^����HA����������m��="����F�E���/LB|�h����%q�BOa�$#��_��L���c����[�5~���w^b��Bpv��_�%w����n��"�!nQX4*��tiAg��l�h���CY'�gr&
]�_�`r>�!�
�mfZ�G�k�J����M�������D����M����[E���F���1����@La|���Qkr�����p�#oG8C:W��<2	Hl��K���sx
c�Q|2�HX�����b��	��	�]�T�PM H���I�(�1�m�����0����*%-�9%��	Y+��%�^�����y+E�G	�N�]*@�b*���a�V��^6����v��J���d�{��`?M�#�9��P��Xl�"��lN��j�b_�|/������;�^�)�G7��d��l�YR$x�	"�I����eMz�$���C)�M����zBKe�'6��op���c!(56�A�8D ���4�g���2��������&�m��ff�9�0�2nr�
���S9EwbI�h^�����-Y������COX{5>�+7�+�[|w�`Pk�����k�Z�oq�����+,Na-���zC'���j���o�<B�6�	oL[�i���U�:^�
��9�����!.��(�A	���lp��$�`!H���j�O��y���v\?�e���������h14��J���U;KU�PI�c^)��Kh(YL)���E�a��vcE�PP��e��**�@��l�������d�-q-�$�e7[�[������QA/��^�faU�����h�e������."<��������[y;~O�����N�� �*�I�_���%p�Z�(+'�����;�
/��ytK�<�&8��5����1���4%�Km�%1Ui+�u������"���?�j��������H�9j�(���%��K�I����I,����� ���3�������������<R�E�9����'����d��bw�����J����G��\�2p�cb�$�"��C�����_�W���T@:\�r&V�|�5;�`����T�>�-�q8�H�K�M"e�P�<c������fN�����1unG�t�s��&�SmW����r?�fr�yu��M3�������d+�fs{���<
jrf,p^�<�&y���n���J
Q��P&A����hb���l|��
���C�R*��\c8E��3�K�9�����zR7K�h��;��|b�E�M":�G8�9AR-�]$T����[`��J�B��beW+9����>�� �L-�W6\�l��8Y��~XM��Y����F*F}�fI���'�G�Di��&z���!�S	�E
,))7t���?����b4Y��Bip�p!�L�e�v�3�\�I���T�h�]=-�@��^���p�E���s�\������nX���*`	��!�s.p[4��������j�������e�gSd5NM�[�3>o�5'�7�P�	�vv�;?�:s��;������s�~�u&���8�e��p�D�1�\������j�(	��D��������3�X�$60��l}K�|����S��C��M�e4��Dga,7	�L�{��LB�D(
qwbb��\m�~*��np���R��<B�%=T<D���Tl�8fll��%������8m��T��TQ����%�g���mJ��%��D6K��J����wa�t������?en��L����OO��G�����u/:�;��#�/���12���0��A����k�����L�}�����$�^�qY}t���-C�	�L�����8���J�]);�J�����(o���y�Cn���=[��L[����b����~u�W�*���U��B�-8�j(O����y�Q�a<_a`cf�^�cY{n��s���i�w���|�<�7�t'W4x�w��&������g��x+nlLhlY�\|��T�O|-0����d�����lt�KL��@H�j;�@"qC�k�|���Y�-n�_��������:�jfjs���=���+��*{H:�
P��F��c��9L���xI��e��\L�;�4��9�6����fdd��
g�R�=�u��X��
S�I�#vVIKMi#�;��Dp
��|�wK|d�_O�S�=�������}����j�y���7�D�����ed�r}��d�z���b��v�H��@V�s�4��g����O$��(��H�M��GDnE)����<H~�9���a�-MU��!���Fc�sWD{���|�D�"$#Ob�	�$����6�� ���`+��9�W�=T%���Q�/�L��J������q�[�l���b#���|�������R�d�N8���6�p��E��}�
2�&x�M�Wi7�?J���,��#N�r+�)�
��Y�yh��02��U��l����>�*���bup�������t�
v8�i;����j5�-���0�^3G��HO=9;��\��n���yy�'�l�p�����O�0
��k�~1GM�	�q�l�T�}����7���#z^$��fQ�H�*���~���	�%p!]��9����`w��2O4M��������
������>#u*!j�Tn��%l�c�'��n*gK;1��q&Tp��f����$�*�d����sQ�p�����l�z���������[�1���������!��=�lT	�>Y�;����X�\������.I�@��>���p@,�#?&FU�rI��������2����5V�����M���B9�!O�y�.���S��e�i['��C���3��o4��g���?vC�\�"��Ns]�<�1G��Q��=)��s,���������d���4��t"�2:�K�f�p�\�����:���C`!��D�HR���k���4B��R�e'����#��3T�S�q)����f���O�==��.M���y m�A�9=��_8�|��I�����3>��en���
�u��6{�j+�j�K�12
do�2E�`_�{��h�v�c��h�l�I$����@�H�� ��������b0�����%oM���������)a+I���*�
(1V��PL���&]*�:�8B���|�&�/����C*����/��?��M��.]�{�5�j�k�ig�����u�Sg�<���W����<T��`��"PQM�;����r����L�S��A��=�D�]���������b�`Cu��K$:��7b���%�����
�HA����N�YJ�r�K/���Vuw�*�K�x�_ZIL�����c.}�W~:����z�k��=�q��G���Lcs�B��[�
	���)a�R�3n�����s�9����U�D�c,6�����M�����^#�g|�#��AxB���D`Z4'�k�p�R����c�����G�^r�/�J�e�[�7�W�_/J9Y~���z���t����~�����q��Y��bu�U�����k�*21B���
�������OT�o!&O��i�U�#��^��(�/�'�cjGm0��In3����D2��|��l���K#e����q9�Hof�S+iN�t��l}CJh���p����G�?u_����	�1��)�^$,��\^�����1:��7�H�����<%�J���
��e��������_�2p�7��V�,?j��2�7�n���)�t��d�o���G�������� #����W�H�q6��c��c�HC���Ug>d+�9\����A����$��eF��nU�_z��7����{'W:39s�������Z�����?�}=6q,���dDK`���"�,LY������0�m�&�TJ<G����W�u�r�������g~�+�~�X����B��r�>@0tr�a�0�v�H%p-������.��('(,q�7<��<g{�0���������;��$��`���\�zQF*��_/4>9�[��.�f��.|!E*S������R�P���dal0T��Ut������0�}yq�f/4��j�!k��,�<��aU�	�����1r�W	,�2f[�nP�����2.1��o��~��e�iG��e��iRK�p
C)2��q���!Mn��eM}������%��n'���.g��[���O�����-���i1QB'�+��������a�m
��k�/e�L�>#q���8�@��;C��"��W9&@�6�~�����D����s'�,�m�7�NG1�,���>�.Ti3P�������vZ[��m��I��(�9����7`m����b������V*�@Z\��d�4r@$AX��I�s��L�$f��WO�M W�H����>[N�@��`����v��;��	��
axe�
���ZV7����.���8�|�����~�HP�P�4��*^O=-��[G�-6x6j����b�K�J���,��>����Z����0:T���A}8h��Vk�BS���`	�{��i����j�����Qt/�$����������8�9�jM�,��qc�)��xx2�Oe���s�l�
OAcX�$���h�?D�z�����f���r���\e�`#��L�	�}���)�F���N����l2��t<�������[�3�����K������8:���Y����d25�����������'��1/�����������i��^"�J�����s�!�0�����X�Tc���������!�:��������;�e�f��L�0�
����+��Uo�V��{�F�����6.������	��/G���m���+s[_a��u�N�&����1��\[\�G�.|��H���tY�1E��E����^R.�L�$Nf�[�1O�n�s���v<D����n�?7��z!�#]��V�3������X���� �����!�����vt
�<J��:������������W���.����]
��
������������sL?.��;�'?����?W���o�����O�����;4@�]u.�������%��9�A�������8=������T<}���O;�G���S@�����@?��������_N����/W�������z}�'�!N���0�������^^]rg�������������������%R���whS��R��k]���np+�#�gt�&���z�c�}�u��u��;6��?.�O���To��W'o�[�qyu���}��������~����#4���a�{�g�~xv|J_���G�����9�����3i���SGO��D�N^�?�'?t�"��vw{��G�N��;Z�L=�z~�����e�x��k���3"�c��~��0a�����sI?��=te~����	��?�o�'gm���|rv�e����\v�.����E?�h~��3)p�y���h�]B���~<<�/������=�_B���!n�����S��d:!�{��8'�?=|w�?{�����9��B������``��B�q4$�m��'?��cS�`q{��v��i<�>�w�lG(@�%s5���j}���:��Kc���I��5\6��Q2���f��c����'G��^�<8���#�d�/i�������;�����c2�� "���x��s�'�g�e�z�N�}�V�����M���R\}�_=���BH�[g����T�{�}���xU��~�K�kQd�wY]>h�[������U�������`$��\H�-�XI�AF�����v�[�l]%\N��~�����9h����]���f���zi��c3|������1�����"�y���O�%�q�.�����e����$u�'�'h+�V~�xd�����W�����sW�������F���#A�+'����`H��F��l>��4o�����+�8!�["M���>O�e��uiY�<gW\�?�u��Q���+7������`���L��Vk�E�w���V�SI���3�$Azlh�&���������,{�-{�b����{fj��D��W~�,����'�W��;�����,�=�Og���5��?H��{2�R�a�����������{u���f���{F��?��h�V>��c[�����o��Ft\iM��!��z���?�o����~����_�}*��B��_H�j,"�G��x}=��i[���k�C�:������$R8���|��P�I��b���A����$���D���Vhz	D�~2H����*������
7d����e���\����\�,^+�=��i�*�t?t'����O�1��L�W�J�m����'R���'r�M$,l�>2e�	������Zs	(w~++v�-'�K C�q�I[�O�"���b����?��G6��I��t.'\�*? ^9�_������~ I	��70	�M���Mgr=x�l:|�/��y<e����Py����� �v����,h=V$#�d��	bD����t�c��f5����[m��<�5;�V_43h�1����	G2����v[�p��H��
����z��C�k y����d�����������B������Dl��8�8?��/����O�A-L�	(W��#?��"�$�es�QD�����@�8��i�dT�f"��s��L�q;�����������Qt_	l��e�E�srYM�}�����$V��U��*�B�"�jV	����y�XV�V>
���$���pP����~:<4�:��,����{��OY30����<7�a8'C�|?_�tr�%K��t�pc���y�|~?����,��fw��?H���_ua.��\t�����p/��=ng��?�~����A@D3
ncL[�P�X]��Yx���Av���lN$qTmq�`�ap8��z�b�L`��Y�	�x������������Odh-����o��������u�X@@1���a
�hc��`��$����s�����"f��
:��z����-4HZp���nNqh����o���F��>��G4����������S��%�r�-��_�D�:�s��
���p�;Y�	,X
'�]��U�1�=��&��Ct��UgfDk����,5��c��x"���/&f���$���s���:�-�H��������1����|�9�z�a�u��n�:�+�Q 0�J�}m���O����F���F�"JB/��Y��4�
S��K ���I����Yx{�L�#��1f��'����$Ue`�Q8��J���up"G$�
�-Hz�j�Q�5RN/�����w�5��~5�d���`��ux2���������(�U�r�ZS���!��6�)"��A��
�
l���e����Mh}S�96��D�7�f1�(0`�T:t�p�"�h��w��x�U�4A1B�s��t��$/�N��.�� 6�M�����KN�n6'n�|�I��l���?)��xP3�P�#��� 5��y&��ib��b���);IR&?E�����]���ngw��I�*�y�g2���}�=��V�F7Y� m9��+:0��;?����,������}7"/3�]}�r'vz�6L/�j�c*��1��B�(�����hl�vof�X
�kPd3��f�����Gj�T��#N���,�� �������*@V"�x��r?��]����4[��=����iV��>1}_�
�Q8+#_Fm�mBc�$��	��������fH����_�v��)~f�x����9c}r�)�� �c��In�����G�<�]������0���"]L�^4H��|5i`�`9Br%������1	�]�"d���Ik�X���-��u�0���x����jjb9x��Gq������/
�����la�lr��6!���1��rs�(��q��f�T$���=�"�%��b�j=���OgW�?[�xRW�W��z5��-��
�U�m	d�x�����%�/F�Slt3+S`��%�Auo�z��9�]��&���S�$*��@x��8LMS,���APl\V[nG,��$w`��2����^�&Y����'������_}H	s������9+za�$�I^+�=�����U�&/�4�"?�J�q8��~)��nU{by�Zx��w]E
]��+���)l7��E�Lh��`7l�V����0��/aCY(,��m���|-!��O:�� �"�uYG����&+���(�Vm�D����C��S?A��pb����W�^s�_��Z #�
�b��=_z>�&� a���5x��y'j�������	�4D��E�����{,��������������������m�+�;�����yIw�wH�Q���C?q8755�1�)��S�""�+.���#}jk��h���w+)�lXb^����8h}k���u�$Lv`{&Cp��}(���
/��C�SR�y�����$�|�������(�=#a��Fr�����N��%�}l����]��/�������>q�%�����#��
q���2
��w��G`2-�@74RI��I&���&MR�!a����*a1]��8���8�<#�c�������)�ZlHs}��;�f��MA>*<���t^G�Fw�g�=!�q�T��ns�E'\�W����'\Q;���� ��y���P���(���!L���ywq~D�N�+>������������3���������G���������`�#Z��c�T|a6�	��,r�z@w7�%!�����8m^D�j|�g����YY\|�{Li"���'�����3�\P�_����r5R���W�|0��nOe�g�J�Y:�\�"�K��Bd�������4rK�������6����������+�����?���h{=�|��[9�W�����r�����P=(���xf<C���M�G����'��T&������hKv�9�1]C�~{���~=�=v�i���9����@�����n����;?�}lvR#��x���H6�:�C�<cx��7x2i������@W������Z��-��W}��)�S�AZ�7�*��l��z#l�cTJ��O��� ����62kmnSG/�=1<��QZ�X�
ZP�CmK�]�R�~��q����$?�I
�1�	�st]�Y���,�$��a?u;?#����N��JN�Hj���3G*�%��������7d��P��
�_����Z5sjX 0����>��.��+�M!B:�Q�9k����'��5����U	RT�����e������`�})`OYr{��y�b�d�K�)=?����O"���l �l7��M������c��h �fR�����`��D�}IS�N���}j*��|P�����S�T[W!VK���'�N�t+\�8��O,8^.z��F�n���?�>	����.�?� ���%����B��?������-��F����@������OL�(�3W���r�
h &�e�m8s�6���)��T�wo~>$���������G��������z)��wWk��_��WP5�jp��o��,�hb6��	������FG����A*.�e�
�B�e�>�m�#�9]���d�n���3��i�e������B������d���]�����2R��6S.5����$I_[�`���
���z��)T.��X�������V�������r��F�R���|��l<2�����)dT���/K�$�B��9��I&F5��ac#�y{{�^�K[���D�{����O���ZvM�6yS0�W$�������~j�9��A�C���z��O9O2RJ�?��_N��)U�_8�/{x��Xa}��Ax��&
�v%c��d�����������`��Yt����&m06��p)�nheZ��a �bfb�L��^�y������'�8DF:?�������<���XH����K������/;W]�b���~�������u�"����D��A~������)y����[����r_�&U�b��r&AG����a������i��S����Q�I����6� ���*H����6�s';g������ G
��I�{�v���&����,�k!a!���a)�_����Y�ti�\����(���#g}���2���=�L�8�d�u�MW�$��k*f����9Md/�^����F�C����]'1V���_�G��~��K_���mCo��t�i��R��������z���[L������gu�3�y$	��M��[^��������.H�N�$\9�3���)gN���[";���|S�v�?�r������:	��8#��Q�h����?���n��h��e��V��Q~9�Pf{�It�r�P��(	��J����B�
`Gd��*��[��@}��$���7�d�����2��;�+�U�+|������9��n�gs���������A�z������H�9MMu���6���<�6��%�xLD�T=�D��
�,��IxG'�<��L��9�@2N�����7�D��L=R� ����'g:I�Vl'W�;�R�^�AO%��q4��������Q����j,�_��4�_<��b5>���"����A�	��AR��9��0�~�[�����(������z��b8���C��RgbH�VZ�_��G�� }s��^d\��U��� �A�~{xr�}}~��������~�<
���
�����8�^��6}	\EO����t���F���3��sb`�q��M#6!��OT���#�R���Y�ZC8h��@��
�J`�0���9�M
d|��]�����h\����U����/���&g\���{w����~&60����w��(Rl��)M��C�����W�5]n���z��8~S�M8M���8���(s,x�x�j�Z��ju�_��r��������q��������������]�������Z�V_R���[)��/�����v�6�Lks;�!'�\n�8�T8P��W����C4~L�G�4������
�]o5�t!�2�������]V�@�dc��O�c�O��H�D�PP��H<�H��C@G8�sHB�kAod0�Mw���|��#�j�*a^Rfi�@���@���q���*�Y�va\^�:�3�����$�XRB[�0�}�%v�j@S;"7�������s����4�^/��Z�H����1T����n��#-md��4�X6b�������?d�������O~��z�=?=�3N�h��wc��4�f�<�u�L���E��e����e?�������W'�m��{e�������-���A �wzH�?���vIxN��W~8�lBfj���'�/^�.:�������a��tx�z8`_�p_�X��t<��_Z�k:��'pQ$c\�r���,�C��2��_2d�SB�04��I�y�?��Sa^Y"�+��u��J�������<��	�e$>\�hcv���1=�	^�f��9����^�0�YK:����J��kV�������P�8��G�g_bN������'c$����x�=��d�dQ�"
c2���_�O})��QlpG����y�w��1�v#��	$�!��� �9�w�p��2w#�k�}q��������<�����b�������p
���m �-��������������T�y���d��[v.�4#�Gv�����0������O��tf�P�_// �h��E�V-Qb��%Jl����W������r������$�1�B���g�75:�UNWoCF�H	PGbf��[�7g����z���Aj��z/,����|9[FRHF�yQ������xc�]4��sKv6"?�	�c:�RM�m���{�l���f��O�c>1����_"��?W ��3K]?��l}6���-���`�
q��3�+�T<8�2������H����2���d(��K��^�������,���")�Z��*��,:M����w���$pR��>�������c79Q4��f������6*�|�yN���xg1����xDl���2��L32�k�����]�u��W�q�N
�'�G����/�G)J�s��9�j���X�<Jx;%.� �80�Lj��.�����O��e� D�@�Hb-����N�,�_&5��pw�Em��>
���Fz���X��|�e����=\|���s@�hPr"�����X��=����(`����R����y��n�x�F��o��J��<��k�&0"<����K�$�y��w���4����������8TU�C��;\�@�cQ ��g8�E�.�f#R+f1|0��1�g��ZHS�f�����l�I�<�z���0
��p�?�mG�N�U'X��j���VC��<y^��\u�dLL.�|;��f#�X��
��U7_-e`9�Nx� TLbl���
)8��n���t�?���D�<1�R=����8?9�^�����L�f^�]���e�i�[�����l]���V`��������B��
�]7]����H6���j����3�P�
���)����fO�%�C?���*��
oe���:\pY�h������/����L���	����q����RK��#GG-�~����Ako�ZmD{���`��H4Q�1�c���9yH���e�o0�s1:�f�!~J�"�'��e�H�|��{84��^6M��}�/���������M��h��&�^=��rZ����02�
��Y���o��E��H�S*�^�����-�X����X�VNIJ��cN=z�.�;��f@�vt��?�C0.�s�Lb���o��'�C�p�2�Uv�x
���J�aU�'�)z�	�o"N.b $R�����
�����^V� ��;�'X��P��Z�Qi4r���{L����H���`���8i��l�k�~���y�%��gp�@��� $��FU�K���%���dx	%wQV��=���z\nl��&�t���?
���
���(D�[��`;�Ur7����
�
��J�6-����Jnt�^�bC9��C5]��r�����h���8�i���Q��+�iMkc��?�!D
�\��Z{/���>���������h,�'���F|��#�X%^�)
��y��n���m�T�������)���t1�G
��������K��������y�f���/��yPR4Z�2��n��Q�Q��fV�Z7�+�Y�f^v����8���5��Ia4�q!*n����0!�	���\rfU��k�yD�����+�X$�wy3y�����A8���8
��'zV&oQ��R\��p4c��5`���/7$6�)p
����!<�}*%B�30~IC��2'�}���N����#��OG�N�-���e�z)t�����v��_��8����������g��3�����{�6w��j���Vo���wK���n��a���I���=s���������?�E"�.��7�H5<��R�o�=�72�6����f00/&����7)WH��,p�;�������~�Hs#�QxJ��L���_���/�d>`h
�Y3j����U3%t���^k���V�A���rR�,kc���R	�}o���9>=�������E��f:�������R�}�By3��1���Y�d`]3xYG�I���*����K�&�EfA'���8"����9w�����*���!�Q4��������v�s0B	c�����sb�����x8���\�����#E��;�}����p���I[���U���������V���R�Evo�	������T�&�� @�|���ddS�@�$�[��B��q�p���0d|�������k(���;�l�V3S�����VI^7��T{��8���}�W��&��'�|�Z~THD
���L�~Ro�[B�5����p�9�
��H���T�.!���$���7�:�������g��������.:���;��)���h`+]u���g������V��?��t_�?;�����0]/�L�	��,������
g�~O�&���>[���RKM��F�t�zq��e�7Yx�g ��~=��7�1�
|���
��\I��(/��s,����N�!j�.*�X���d:�P^3���>.@Q���$���m4����lr�|��v�;\���z��F"EU�H�1,� ��Hxi��As����J!#I�K������^2@��g�����&?����eR���������P����%@�Rg�E�{6UW�F_R�Q���2i-���92��$��2e�A��B���L�a��G�,��/'S)a�����`�W����� �]�H��$����)��M��67c���{�":�,rt�y��"zm<�P�v�2�f����.�z�"L��kd�62��/����7�ute�|N|���y�����$_Z��j��ha��V��\����g�$U�=r%X�D�B�#��SzJ����C4�K&8�`�W������!�8Z��[�	/��f��v��5a��]��K������|���w��1�/�k�8|y����}!q�:9�������,I���p�����k<l�$�=~�������-���c!}�����_�����������-�R�R�T���
v��� ������T�%{J
���-�������5/�R�����/���r�qM�]<��zxJ2���������b&+�^�O�U&������U�6��($����p��C� 9���|�H�oeC����c�+,�*i��}b����_�0��N//�w���q����X�)Hs�	���i\;	�����r�4���e�l1�3�&o�h~C�#��4�����\}��6au$�����#������%R��*\,��I�b�\a�%��3]�Xki��TRdA�5�s�G��)�a'p�#Xa^�_���3�2���Y������|������!*�����Z�v�Z��w��K�}S��Y���r�O�
7�]�������~��qD �rq�f����������n>�� �v�t3E��g�������mX�I�0��8�v�3�w����
��Gp=��.� K�V���������
���&�I�����5cX����������v������q��v8_�?���$�}wH�������z�P��'3��=(!�G��4�(�|+���OD�q3w�!��.�,�q�~�uc+����x	(�8]~V���A�C��y��|�$���q����g�mw��� o!��l:��\���������Q>������%t����v���p5vsR,kc��3���G��vdUE����@K�E�gs�����	��h�����y���?�n~��,�6jhZ��BD�Ts��m�*���zL�KB������#4K�/��R���c�&Cn2��~:������~�
�����(d�f�^�
0��h����v�Qk�5�V���~;\�Eg�n�L6���O�������^0:k��O�F�@
h>B�����������Y|���@�|o���7���v(�����+������(]�!���h.m�pJ.�8#�o�#d�
:�?�\_�#P
�5|M:�;)i�(���M�rB����9����QU��F��	'�D*F�M�+�.O���z�
�SSb��4�V�T��i����h6��>��42+�j�0�h��TYCI��tiT����������%�:ew�����3��
�^}��a�@�M�����_8����{�'��p3�dJ��=>����O*����W��������_�Vk�0z�q�x�s����&;�g;��iG�j�w��Z������n���7�k����Vso��h��F��j��������G�	���sw��������^#�"�N��k4��p��_�����nx�n���A��o��a����$�\Fw1�Z�9�/h'�<'���M4�����I�����m���E�v�w���i�]�,*A}�j�Hz�<��?o�;��Zm�r������^}4���%0$��;�����4��O��IQ����?h��d97Ke������7���rgl�2��L�-�&�xnY�|�����h���7M�_�`8�YDw����*G:p�#����z����f��2����	��V�y��~p��q�x�f���S�
I�8X7��0��h��a2'f[��rz�������OgbN>1+k��9������ �-��7K��7���|Y���� ��a�l���b|�������w������)�5c�7IgP�e��q;\�3���)g��?pd���t.D��G�� �|l����I��FW����&����B;4�06j�Tp����or�bIq�l�i
z���q��r#�CFe��D�{���Z��������9���>e��L�]T|&��N��n:z�!�j��5y�%G�xz
�po�D��E*-�Y!�&���gy��69�+s"�,���M���]
F1�
}:���yN8q����	�������A��u]�
�3;'�������"����oc����I�3�	B���a�"���Y/�}����HV��9�/�)�> �-]��F��5,G!�9R���;��$����;^�����'@*A<���#���������F���	K�	��<-��~���K'f�9�-�����[H���C��W��YB�DV/t?=��MD�����`;����p��3��1}C���A�����s�r=A��~{?������oc��s�D���	�'m�D�vB!�� �|��}�����u���Kx��x�d"�G����$�����F��}��0%
�����&_B��p���g��|%
�����4R�������3�7����h&X
�-�C�n9i@�R�*k�����:|#�U8������M^�����s�[a�2����;l&`>��o���<�UC�8������"�Ih������GD|����8Z�����r���m�������q�7����3�L�k.����!���_���Gd�����E
��y:�%d$]���%����������������<��@s�s��p�M�,�k3���&���8*�yB��Ki0�I�K���GI�3�<"�������0q?zCl\�I�/"������9��	�P������m��F�-�`:��1����q83�}q6�Uz4����;g����*��!C]��
n+�ReK�h��&3
�>�H��Gw,aH��pD��t>Y�����6��&��!,���o��A+`t;�U4@���YZ�`�N�����yE���'B�W�f���@�g�O��^*x���,
D�e�m�v�c�l,%�i���(�}�":	lb��/�EK����Q)x���E�1CH��S����L�,L�����)lFcMt�Z��N6ei@N�h�QWa��|��<�GX�������Md��_�f3XRU���������Aq�P��JT�V�_g?��O2��t1�tq�� s�
k7wXIW�g��s(U	��d�,����(��F�*�����Qm� ��L�C�FRO�����6��T.�b�'������:�����di���� ���+Aso���Q�.W�z�6]���7����VoU	�E�����j
�Q�m��6�3 �y��+[0	�����.b�w��$!�F�>�d�R��g���5�cg@�����$�3��w�o�~�H|����5�6 n�K!��`��o�~����p�L�F~O�=�����"X�|�?�2�iF��z��w�_e^5���bC]�8o��F0��������s���A�}zQ���h�Yr�7���ES%K�J����J��$��x8��g=��\���)�Y�������5��(F����G�b��Il��85��5���>z�+��b<;l��y~&
-��E��zCN'K���������I]W Z��<l�R������'��
.p����VZ#%+*�f�����j�F��K��c����$���-����8lh0�(4>{��&�I�$����B��&;�5[�i���X�����
>��������b)��.���q5����_�P��R�dXb�6R�th��������n�w��(�7]d������>��TWY����vTNh�%�/�Q���v��mX	�y`X�;}~��,�!fC���E|Vjm�Z��V�5��O&��e��S�Z��S�0��#t�2��~�7��x7OQ���|�y�Ks��9W]�&%#�����_���3�t�c��C��b#��o���K��	��52� O�����}��
/�Ia�@�<>��	{���a����s����T���������z�X�S�F�T�����O���`(9o�2`�����)}����Z���&�BdP5N���V�4����*3[_�R���^e���*Q�?���b*���A�����C���c�P�[��'�a��1�\Z�
���g�����J_w}G������M�}�jZ9�I�~��s������3��T�5/��U�����Oq8q�o%��]�Z���jF��0�����A�����Q3'��M-Qo����D����d����2
�lp$�����3�E(��D��>~�<��E��B��4@�\n�%rW"!5
�G8�>w
��Jh%��������A��8�k��u�$h��/����bA�C��P��dQ�5��+�|W���\�zK�n�s���;^5�s�t�t��`h�1r�	��A�C��5!~F����`$��Wr8�arlr�b���<ehCOv}^���U-�U�Z��_���*�
��������@�n����������?���*�c���[���<��J�����6�K:E�����yheN�i���k��l���ow�
��h.��"�gz�����C!)����2������?Gc2$z�k	���Qf���j�y0A]�L^�gO���C���������W8g����Z�L��$�	���
cc����Jg���&�G��f���u_�U	E���	o�KzYa��k7e�&6�1m������Z.����7�f�LsW���*��h
G�"2y����h��*,�>��?}���h���V����f��������~6������0g�Y����[����<�U�#��g����1�$���E\"u{J��1���i��uK.;�32q��� &X}B�R��OA�vM������?��wy��=�Ej��>�p��\����I�����
�}���~8C��Q��3AuJ^�>��F���������I��A���b��aX/���*2�(�!Y�k��_b�����k�����;?��5{$7�F�$j���P�-� ��bx���(�4K����)n��b�5��\�_��m5��ong������;lM��D�|b(���������������q�x��Q��6����P<������$�uC��[���<A�-��X3mVOK��s���h����\}mCK���TkC����v��9�Y�W�y$����o�Z�^����������&��B�C�sl!~Hla����B�m:��g���d�s�+��6�|���pt����Eg)is&K�k�:2�S	��H<��V���Hv������~��v�/&v�m_����+r����}���.����}���l�Vl�!!�^���|2��Z�A�������
�-�
�/d�-�aB$�f�i��d��2\�|��������������0����e������m�K��r0a�^y�����O��F��P�
��;�J�Ce��nt�x������p�3
o�I���g������jz<�;('��>����qA��G��T��y-�����-��F]16��yz��-_1m����[���0�m<`L���@G���5;�#�G�*~�r�{��vZfGF���)�kl m8��������o��6�z�z�����EH��v��A���&Z�t����y��o��I�#�����
�������S���^2�����
|djG����.�m
�-��������E%�ZL��z�f#������"�����D����uh�������%(y�����&��V��5�&�:�p���tl{_F9�����"1���^�[��<���,R0�HD�]	w�.Jrv%fj���rP������74�x.���p�!�i�%�z���V��M�J�`W�c�(�������������zxwG"���[�7$c��1����s�%�E�=A,�5�������4;����B�Q's.}���g��[����O����E%q�]	�j3_L��:������t�/�'vf"�HW_qWH���n���^�l���G�~����������LE��WD�iCN5�T���$���9�z<�x>+P3y�$5M�T�iR{	�&���pk�c�tqr��hK[�H��z�W ���'w����G�=Ih�:,D�#W�o:W����?m�������Y#)��L'���?&j���_rN��u�fPU�������Ff9�V�7��P��HOdAOVl�=�V���!j�v����~+r ��[(�~��	?��2��g�����axL�6��/:����:<���'��\��9>?���0�D|���z�`WXCM�.��
hYH�����]�
y)_�U����@�����"����������z�\�Zr��T��Y�P	��������-WS�����w@nS�g������k�T��(���UL7����~�Z���k�F�x�6��'�E������C�"z���]�K�����l>��:^���s)��Xb]�p�r�g?ekW�������H�,no�� �J�{p
x������+)����c[3��A����<��>����WmM��0=v^�..���c����+��������� v���Ss�e���W4��ti�Kxv&�����-�j�D�Q����
�	2�@�3E����C~�� ���^����u�9����[O%M��N,V.(n$��H]��y����>��=�'�;s��I�j�)�D����/���D���9/;�������|�'�S��=������Q&�W0R���1�����3;���<�"�C���"
�C�e��{iK�I����4������s�����5��G7����i&�2����jAD.xE����4�=,}u}v~�y<1�x"�J
C�Q��|%�XJ�<�������Gcj�y��	��F�E?���YN�w=�*����ma�}=�FYr�#��wgu������2�Q:]�!�*���C��������B���!�n#W���Glj��E�����Y�����P�Y	t&���9���[�YS�(������Ew�$
�~?�}B@��l�)f�������)d�5��?���(�oeCY�_XTB�$�Le��_(���z>�\�NG�qW�:��4�=�0^�?��L`G�HR\�$����������:���� �y+
��
�w�������:���]�(yM�>��(�r�x��'�{��.�
j<�Oh�e]���8:�x����c&���S������7��l.N.�g��T ����&��A�Z���n�D������$�8����9-�$�w���A��D�fc ��W��mxi���J�K�K^	$j����B�Y;������ ��h��Y��.���	���q����K��\r��c���y7klqj�k*���~X��J*]���l]�l���\^q�����e���r���S���(�.���^��	sp��h��P5����h��>2��@&	�x��=���~���Ea}�7h8$j�r�M�����%,�������6�e�3wsZ_��](�!F�Q	���Qh���_����Qt�s
.I����l��6�J`�0������rz�b�r��d
y/��8Hc��&�"��;5�l���
>����B
c��(��"S :�C�qbE�`�F�"����f����./���d��[���`�����?$�����&>�[,H$��D`
H��NQ�������^w�l8����z	�����1��~2FqC����b!�wqe��<%##tp2���Rt1������Ql_�����
����f�������)f.^�0�@�|������-�A�3�wleq}K;����m�8
��Z�6�j��=1d8]����`�6Q��;��wq�S�D��
(��0���s3����Gs�pm�D���v���P�r��G	$�tx�Y+w���$
��K�A���\��T%����S	�M\<�m��cM���F�����h���l5�`�������X����2�Ftx�@#W�n1!��}H�)���xq����/�K�@�/�
n��?��9����,�$�8Me���b���4�����rQ����S,fe���=��~�������7C=��16 (����\Y���9X�k9�@%��/�Ko~���:�M{�;s���gK��@>4��B�Ly����l*�(��1=��K��k���3'�0���'������MaiP.f���N�0z91���F�^Y0p���\t2W�Rc��c:B�����T��������	���J�$\��.[RS7#�a�b5;8�y��4�?�;�'}����#+\�f�>����n�N�~<<=9����{�����\t��:�>P�����e1(�-~�10��8-5n�����1����y;nZ�G���

/��U��eL��	m�
D���~��%����%��.�����
v����n��z���MG:����J� ������sc����W����u^�<H����
�H��Yr���lI��0��oJ�#��w7�i3��a�Q}8�r��>2u?|:`5H�!##8`�����Ac�?�@��B0(���W*n���DC<u���g0��H�`�H? �?�<�r�������*�e�����x��_~I�y�%xW����-4������n�i:V�G`��U��b�/n�b����zK?�.������^/b�!�����q����n�i��(�d��
�
�g�\k��=�=����qx'|?�����C����p�
��/�Og��������N��������$�5�6�M����C�.�����Y�X���b�(�
j���|[�TP\,�1���\�`���<�k���PD<����$!���P��hd`CC���y�EpbqZ�{�<��n�Y��V�'�'�#�e��uR���"�L��,a��j�����'ZU�k���Q<x�$_��������������������+���U`�J�����\�FwKR�fa{��T�a/���j5j���Z�8{Q���L��l�Q�k
�BS�BS7	�M��O6�_�&Y36�\���9�+����}�9��Bti\�=}Mn5r[~Q��},��j.H�*p��d0a�b��"��������� ` ���#�*����80n�RT`j��)��*�[FmIJ���vT�����^}I��d�"*�)�.^���H��yq��!hyX�_�G�<IZ����_
y.T��x>\DCy���D������UEP���$�t���T�������C��\��/�w��A��]%�Dp���U��L�{�<86�j/l��K��g[("��8A���	�~6r�Nbyi6�6����7�<4�gr[�Izh�zFgAMM������/�W}�kZ:�����^�>c�i��M
�\�������_3p��q>�e�����l��;'���0v�<h���C���W%h|?���T�����Ph`�`�?�����!�� ��?���\M ��Xfg��t=�����3��+�L�I2� },8���,,n5��[[qibq�=JQ0�\8�1|�}8�o�.W-�]M>��(�a9'L��Y�����5,�y�&�����]�"$�-��0��SA�,e� x��p�h��O������1	��q�b
�$�u��n�w(�V����t�a�5��w���*��Y���.}-�FBn#\W
n$��j�O�n=���J�7��1��&�����^:F���Ay�'�9��^.��TR6I�|��V��(�����0��8�K�SRW��S
��ImN*����p9p����I:&F�I�����Vm��kn���}�rq
��} I�{iPff���b��Hi&8��=�d�fnl������!��C���u���.�i��LXl�ru���$��
���L����.�d	��#_�h��i������N4�I�	Sb�C�s���;H\�o��q��Z���n6<����vAN�����������7�K�<�c���m��?���������[����U���Zs8��j���`?����f4����{{������lT	uR>j���������`���������J�*���K�<iIT�����G[��&g�)��RN+Z��$�\�c
�id�p1	Yx�:�q��0�w��oBF��������}~��9_�=$Fn&��8n���I�Z3^���2���!-���3g���f������:U��u���E���@�����<'�.w���v��$�J&���mU�<J!�Q��@{n�������0���>���^Sr�x��(�����[��$
.���m����l:���94�s���gtB�4���O.��-����II�h�:hI&�1�=��;��qu@m��J,����?�KxOg���<�B{���CR}�h�lb�S�p4�����q����wH���Svd*���
�0:j�����O��#.Z�o
��\
UD�aY���3�����f�Q��B��$���$�p��$sI�,��#5�S�Q<�BLiJc�%�����B>���F���7$��XC�����]/ck^�V7M�@�j�\*9M�}�S���&g���]6�E���ws�\	>���,�2���J)���c��tm��e�������ZA�!'��m����Ix���(�(�5��G�gw�_����H�H���A����43�2�6�O�f��/��V��j5l��A������^���@����H��">���)��:��e�W��Ux���,kb	B�S����h���y�HJ���A����s^T���E_���B�8C q��rK�����}o�n��<�������R�>/���@�� �)s_�c�R�xn������V�^��`��DEpM�Z?X�}���B��!�d���W�%��������I��	T����<j������Q��!�sl�#\)}�w��?�-bI�[��o��a��X���3���A���'5���b*�F8Al����IH�l�QZ{�,�8�;3���I���3�I=38��=?qn����9b)zN�M��Y?A]���W��?h��qKx�8�������e�����B�x�:p	��L��`�6)�!U��U��z��`�������+������d����]�+��n���iyUX��n���#~��_��W��?T�|&e;X�-�xnKEviy#b��D�$	����r�[D��p��n-X�b���`��-\,J���6h<p�������'xpI�;������jxk��A�y��S�3H�*�^��</�1�Rq���	=��6I��fm����������%�$���R�;9;$�J�)�~���:"��U+*b?2Z�����h�s�#b��I�Y�e&r^g9�tZA�;�����z��
�������Q?8P���#���u�9������V%���?q��)����x�9�"�J�,W.�����eC��o�	wN�!������nC.�	Fg���_��#Er��E������'��y�$�J����&�W�o�����<�������������'�Y�m���c[��'e1���[��scd��6����������`��y6I8���w����b�F������"|5�;eaq��mI�{	�o&�>��W[rW��0�X�D^���6�n��\�!����nQ�fe5s���^�Q����km*��6�����;�Ck��������T�[�����g:��e��c�x���������)��A4��-��9m���-��8��a��j����)FMv.S������`i^���.^���0�*3cy�0�;�B6|�m�x���_�e��g���p��6������s��$	����`�n�HV6�������]�����0p�T�����iz{u���eQ���|D��z�����u>������Y/����j�k��j���������h�yg �I��A�xZP������7
��T����}p]:nHH�I��������5�W�F�U�9���w�P�3��g2�N�����0!����N��4��������@�C��#�u����T1a�05��m�
|��WXi>Q8(.�T�^a�L[XW��JfP�Cn���ZmwN��q�Y��j����w�o�Q|������V������������|����[��k���[���vm�`���~�������O�Ci���k���}^�?��;�����]��3����]��������E��������S5:�m[����z��L�&j����h<^�#ynn����xt|i[[��0$t���������&c���C��$�E�2�(rSm��a`�pQ�&l	g�ZB���"5�=�'����K��;��m�7Fic!��@>��Y�q�s�d Re�)��G\Mj�����&�0
�<;�,���g70������b�9�'*��&�CH����rl����)�#y=��i��d���a����u~~wzxr�K��_^.&#�4g�h���z������386`B����3se�xZE�����%����F��Au�(�Y:sk�������'$y���n��j��*"��4l��Q����W�k�[�I�R��k�����7�`1�2��A+;a�����b�[���|7�^u;s��gVo����W~L�����v�t��g�kq��z=��|Y{$~���(N��!��e�M)U�RP=X��x���q���Un��l�H�����������O1�W�O����Q�����`���y�Mj����eM��=��`��O��L,�nn��C.�Lu����4������`�����&��Kj.�K�5M�	�������{������B�9���������5���%���{����iJO� �l��.�?�=gB/�2Tn�)�#��r���i#��i���4A_co��/���Cg����������X�+6���V��_�P���*M5�ZSk4����^�-�$�H����
&�����v��j/:h�Z���G6)F�GV�\��f?%��ju'gW��p^/�����(?���\��u8��_p5,8���C��0��� �X��TQ#~���;��y�{G%�6������)5�U,m���K�f�:��W/���o^u~����-��.�xjt���Ql]R3��+��4���7��[�����m��=��}3���;��������������������������T�����t�!��Fl���D�������u������+y8	�9���A�{�<�?>K���z����Xx����8��D���/�j���+Z��e�d8�~��2��{
c�1�����:B`��R���m��D���@�ng1�Abc�����:q�!��h�8�����x��_��
��\]�q����*�����{���Q:����-����;p��z��7)-�
��PGH����	���.�����������;W��/6�����Epu��������������C"�"���E#�N���5���e���a�=���]i)��(`��k�eP���^�=^n������A ��"�n.	����j�������� ��������b�*�0�+
����Bc�FU�f#��\+�����w��������4[��
L�(y�k��;S&)@�.��j��<��OrI<�d�qM6���pr~	X������b��|�����p40t���a��8�}� ty��������f^m	�U����K�Y���{������"�%+���$a�~��N�����v�;�/�'�U������"e����c>����a<
�����N�O@xR7Ex���>��r�VHy2y��/�����b����<��M���'/�n<�����?���~�
��x�6g4�z�>�qgw����e�NT
�v�Ql2Eg�l����?������Bf�%�o~>�o�����~���~3���_����������e=^��f�v��u���s�E0Og1K���+ItR%�����������tr�}0/��<�?��d��������	6�H��<Ql�JP"����Y�`�J�
��e��m	�d�U��WF��[-���^��:�8&
���07<�����9�/����n�U)��.����0�vs��|�f�(������W0t.)��Kni�7m_>n��g�"�2n�(�B^���l}��`�]o����)�f��|��|
Cy��-��b!�#��3;��-�P�������i�7��%�/�r�rYU������p���zc�����[*d�9eiW�v5
���;�( �����2�������<E#*��B��f>��I���e���������Nc�����ts'�M����K^��	���`�(k}�~�V�j���Z�����9D�f��������������o�Ch�f�z<kT�}��9`m��V�'��1����]���E�������� �.�D�v RlGn������6�
�|4 ^�8� 1��M�L�<��h��c�� 8���A��L��85%��W���&&g:�G�l@��s|q��k��C�>m�����_u���'���P#8���9M�dK+��������k���n��T���X~�J��������m�z����7�F���!�)C��q8/�]D����3Q��q�t��>v�nG�H"�x[H@'���� y!�R7���'�x����
Z�R���y2���n���Z�I6�vt�Z[�X��k�I��&i-9�� u���	�wOn$�G��N�d��F�a"8����0�cxa�f�����������A���A�K#72L�_/R���|P�4�����qp0f:�m��g'|���<���m��g�\�9�p��y���i����p����"i?n�����g���g���/Y1�\��m�z�s�5�|:3�>�2��?X�$I;&^�{$=�*�?�r^!0��S�lG
k�:9�������S����s�
��`�UN�f��i<��9g�ZV8-�����q�"����
��h<���8�@
 !T$�������tg����X>
y���mNNv���@$6�&��$�I1@��!=2�Hap�g!����0z7��,pF�����d($�����s=#��?W4��a&��E�H��N��N<��\+	�'��3WL{>~W��F�(��~� ���6	�Y��!�md/������t�����q�c���&�����P"� 
�oS�$�M��L't_B���F�w���@c���f����t�M�05(z�/Qxg4���hF��iE�� Z�4���M����r�(�S����d��vW:P�j��x�>h@��zC�i4	VN�L7c<j�Z��O�e�#LM�no
��X�9-��Vly�0[2�"W���Y����!��Kbr�� ��2�H�g|��$&���Fm4�dV���ll��IV��8w�L�2��LP�l���a\O�� ��X��b|r�����e�v��Dyd�h"xY.&�DGY�55����sIq�)���'������������&�t�� |X.�������w'o/�����^����]�i"8����A�E���_D-0��4#W�Q4�����/&��og��"
��:����+���o����~��z�F�5u'u����D7�~�n��:n$m}>�,��<HxV�A�{.������BR����,~of�EY:��eAz���;��.���K��e�%�h���IL��
�#�
]�O9���Sz�]TO��e)��E��gj7��6���AX�
�&kO�}�=�k^;�o��+�?�V���D�w�>��7��c�IgSD������H�p}<�y3b��	�	&4�J	5My;��)]��0�9���P�����Rk���W~-F�o��~{9�^�k	�*��@.ejWJ���\�@v�cIU�$D%i�TG��
Ab�lA�ix�~�R���B<��&�KE���tR�!���'9F��H����3v�f[pz�l�&wh�y4�E�������D���0_�T�U~�������wH�B����`�f�Y/���������w��6���@���*�������53�4�H�K��f�$�m6"�+4�_�~b;�#l�'����W�����y<9
�������z�^����yP����;;���y#���k�6��4�`�X8���%���wD���K=��u��h&-���K�Y�O]�Rr����D-��4r������$7if8��>�����������}�T��x:�o��OG�Q,_��Yx�������6����Q'�p���|���v���!�z��������U)�snr��u�x��I��Y�^��
��!�X/+���e���j^���r��=�Yw�����o����K�y2t����ft��!�VN�_sW��O���$�'��l�G�A%��Z4�������E%�Lef�Lv+U��G��_������
W�15��_�����0���*lL��|������-L��!���g0��|�����M��2Tc3���NH�����zs\��&�������x����;�
��79��6���)E��^%+��s��FT%oq[�������Q����������p�]R��������K�g��g����-z��R?�V��s������@Z����6��4�+�?viN���$w�7�@�f�]����'B\�d:���c0���
2��r4�e��:���a�1�$������9�����Gq�5��_Q��9��0��Y�������������Q������(�/>1�n
���Zw> d!��2���O�N�^��Mk�9v!-��s6�zpp�b��,
���v5����C��"�e�O���'I9��/a���������kD�z�OUx�������l�'_vM�/>	���F��.�������vQh��_x�B~7�Da����a�sd�H(:��������0����L���kW
�\�0�������$�nz]�])�=�_" 4l������=����o�;u����
�����n^{%v����r����[�L��+�q{���_�<[����Ea��+�~�������&��2�4 `��-&���:�/!$�'���Ki��w���l�K������Eb��t��-f��"���]4���9���3���o�6��\,���
	��$���oq�-��I�I^�G�������*�������B,��q=�9�`3n�*�>�7p&���@��'wr<r��g��w�c3�x�@�Mf�*xY��e��|\�����7x6���8d��i��9T���*!��o�e����-"�-L�#�x7��!��/y���Z<B�!b�P�#��}�����G�O��3�\q �K@� c�h�b>E��ra3_�7_an�����<����Ixmlp�(��1f��7��i8���p<��6��66�?�w�k�c��pxG�5����76�7���@i3��Zz�<�(������H����;��4``:�W���H:�\h��5l=��vL���[O�Rw�
6���)f���v>Lu�&��&�O��8MSJ����
��2��Iz���>o���Vg��u�Y~���i?F�aL����&�k��Z�j�%�n�O*����{��������,�BG����������OV7�6��)�^�����w������+��Hv�C*i s9rx�����=7IN���3J�+|^i�����%��b`
���oF��$^7Qxg+K��X�*~��f_q���_v&�KY,�te���p�s�N�FTY��DN3
�4�JTh��%h�����m��H��������e[����E��.�g^$��ta��Jm�,�+YT��v��HP�6���^�W�@���UQd����}P���=HFCB��lp1� )!8<�v�f;��L���B��=3�f�	<�y�80PLf}�����jl��
���>8�����y���D�������/N����z����Is��A	8�D_�`~?�_nf?�1�V�
��A�j;�s���Vysqxve�e�[�
���c%��j������lc����Ra���������Q�{���f�����b�n�4)3�2��h���n=��+�x�l�v*p�_z���/��a����L������R���/����S�q�LvK�t�����E���:�d�,&���Q��T�g\�v������X}����;�����n�Z�G�z�_[�;�vV1fW�����&������'�r|3���O�J<fe�&q����O���%T!���2�Q-��5U������Q{7�|��[�q�~�/���sU�$��'��5��A��m
�{���<yB�X�p�b���7���D�}�� �"W�2�����r�u].����EiW�_�q4��oiV��2��e���kF�_���8��Z	p�����z����
I���������A3���>RX�7�fV`K��
���l[��.I��Y4����[�$!eJ4���n��lz���g��4NC�|��eT�0}�_�R#�?�d��s���9�o�Bq�J������������[L^p��h�q=�`��G3�j��uX�<0�>s���q�����v��Y5����9&��c�V��`�+O����������x�]�,��`:�����6D������h�^N�N��x���J4�J	�b����a��J�� ���s����u%�x��o���%U"��[�zmX���f�j�+�%�Z%�%K��k7p��Gc��������)km��^ki[bY����$�S+	�����L
�����[
���
`m����3�Vz��p�b�>�x�&C�C%F�;�����Cr�p��^�]�Z;�����6���cy�zzr�	����K�I��Q)�������Tm�������P�m�N�v�7�(^�
�L��)|,Rsjfq�zJ��'\=8���5��|_?W��E��l���/X���uh+���[�� ����i���"��{�m8�3� u�&�o�d�![�
����=�+3S����J4��HP�EVj�/��u��lt}�V��~A���z�;D����`�����DS��h�0�{-�9�z�vWG=���]z��WA\����s���]���������qiN0���H~D�p1����p>��K��r�nxK�i+T^��0S�Z	My"�wJ����"���$gD|�����):��p1����E������y���y���������$�dS��d������z����"�}\^���v����������w�G����!��I8������9�X��_��yC:�������h"8|}Eo������o��U����{5%6�<+4h���� cC�
y����bYQ�����W�+5�4��z���amp����j���3���Z=g����!e�>���|�]�g�W'Gb������*�����@q5_��Q��%�QA��s���B��k������ut�����b��sr5M��qq��#���]Q�������O�t���^�e�;)�,H~�yg�i�Y�
�����o���b�.)�G�r>�V|oD N��a�4������A��[�����;����<����X�Gf�W�i�W��<��ngC9i�?��0/`j�#99������A��������{�z�l��Z��[��2&�5���^P�������*w']�;.�����hl�����h�z~M��*H3m��3O��8Go�T��@gr ��������2I���E���YLR��"���Y�������v/�MPc4JWo�D��XH_� �C4�	B���,�W�������T����*@�k�v�5���5�q�������#xI�<\<������7�l`�=i�����,��?���-P�F��A���j�V*�tD47���_e�Q����/���+��@�T���N$,~R�C���(��F��>i�;X��\
,&Ta��@:�-�%���.��5�TZ^M�9K���Yc�e^����h���[ik�!k���$oxb����������������:�rw7}��U�K���W������q��������
��K��R��l��l�xQ��i@������D�"�����]c
r��3=\k
�����k~�x%w�if�����E���-��h�,�X<���[����*��[���A��LC>i�:�Xs"������A�� ���f����M�]�o=�@�*[\��Z\�x:��m�?b6�*��������#�5'1���l`��5��&��z�W�c�"�����z4}.�������:�_�Bg	�\��D�5���3�K�z%r�������6�9�2y���.�:�q�j`������BI�w���d�e'��w 9�����^�]�6��^���UH^��nD������FA��?��8����]kC�	Ce�I�=;��*�K�Wl	�zq�����-�[�wn�~�wf�Q��$��-�&��<����Y��M���bv������Bgo&������&��j	S���������!��
^y-i��w!��2�&���3"��O:?y���G�����	�[s�����9�o���Xg�Z_�������{���� j����w�������]���#�������m��$=���
����y=�)��&�J�k�8N�
{��_����A���U��}S�b������}��W�)ms�
Fq�3 ���O���J����?���z��\�.a
���������_�)�x<�;�_{���O.�.MWz������o>�����^��d�/����u����F{���hW}%;�d&G���y��vi��b
��n�^s���V���v��{��fV(� '��6����~Nl������h4�'�vX���<�=L������1���7���wG��C%(��n����>J�$��������,	�����o|`�	E�#�8������>�l�O�T������J�d�����I��*r���_OR��@�Pr���oz�W����C5t�t�`]���h�"rV!T�F�T��%��<(5���H�����dg���+$
��
@"�2�W��G�7/��t�i�S*m�F��r�_�i��GJ���(�L����Z�*��B��_�r��U������&�']�^O������om�Y��u�Wh���1�m0N(����Y�����n��A��-��������dIK�*��"�������w�q�8N���;]�)g�>��yg����H[y0�j�F���rv��>;{���?���dj��g	PYt��H�6vEDDe��>���7��7�o��Y�K�,��E���k�bX,��N�_C���D:OW�v�xn���>�����2����5�@��=W
f~�A<H8��Q|�������
���X1[��������.��GX�
g33Y��W�s�_Kx������#[g��G&$D���L����'�� �M�k���w���z��f�(
��M;+����r1�2v���&��0�����U�����;�i6}?� (�+�����sh8g��/��W���o�?�C�����,������������bv7=�R�0F�U��~�M����;'������>[��^a"���z���1���Yo��
���,��O�r������d{�'.��<���(�����a!��h�w:�&�����
r(n���_@���������WlF�����c�Y���v�v���a��&�l�t�����vw�G2_��..-���4��?������)n�J��I�nU�YwHi���+��G�0S�5$��fU�I_��J���f�"6�F�<�?ss�����1��	����-��|����:1�"�$��O����E�k�$�����R����O��~�[s-��=��[�'�4�Vc���4���^3��HA�	1�;��-=$t�=���f3�;��
��L�\~�!�A������ Q%�hr�E2K���
"� nr�#�4uL����x~�%�3�g��+��Q��BBe���s����T������]�������Q�C��AE|�3_������|�P~��,��2�F��v�����v�����6R�_��p��[�[�_k����[��>���+X���2=61�=o
��M�k��G��-�-��?�f�;��.��V]maXx�bt���j��
+zh���=~�#;`J�����	����c��4beV)-��3����*zV�K�+b���Aa����a���yTw�J����c\Xn�z�g�8���x�\cL�ZP
�`>����&�g����"S�w
*��/<A@��� ��Qz!��O���E�f�����i#��3��!\���K�C����wn�g�Y�Z����s��H�;�@��@@�q��x\s'�P/�#M�_��QY��>5\�������_G���=X����=DI��]=|���2��P���T�/�]�?tU���>x���?p��������_KY��>\���=>L����=dE��}~���U��5^����-��XR��o��-�Z���^Z^(��*�X,�k+���������������Pk��6�Xo���7�'��x�������Xr�h`m>Y������U�������� ������ �S]�#[���J��V����)���_I����DE���������;����vJ'2OR�c�����'�I����c�A������i����Zy�D����V=�����d_�����C���L�oA�,����q����P���=��6���`{��W`]���e��0�Z�������Xy����;��+x	n�0���i�v�����^��+�����amS9�����
�����m���e���m�����<�����m�Rg��+(�����[%��yH�}w�#`!�� ������)a�����#���-S��I�����G�l`�ns�?{,�J��5~ce�>Ma�
$�K8�P���
������7��vg�UG��zt�#=��KE�����RY-�����*U����%ey{\������z��e���BO_���h�����n�VS^��e���N����?��*m|�A��t[R���B>�n�����|��R>��|��|#�|������|��>��<d���^��MqG[����.�R�����(��A�hw���!J�/W���,������oh
{Q��lvw��TqV�5V�5�=N.k��Z���N��1yh�������,�{&1g�Z#_����^�������SG�����.�]��G+�|d������a��ouF����Q�*��H�^��������:�g�\�����G��x��/Z�k_���������@������a0[3����w��&�����@��"��_����H�t^�E���C�=����n��wv�x�n����g��)zu;�����l�x�o�}���p�������k�����Y�o����D��
o�q8s����~������S�������om��p��
�]}�O�fs���Mu6�4/��]����N�����zm�����vz��v>�z��x�O<w�Y���<�/��������y���~{�i
w{�a��;j���N����Q+h���h�i��v�{	�x]z~�k����ym��6��{����(9������wy�_�,��h%�������r�{���^�Av�~��<�}o��k�jg��?����s���Gog�������Q��!�o�%W����]�O)+�i�
�����<jz��w�_l���"��c��Q
8�,A�_���8�!h)�}�&��`Fj�H��d�'�8�$>�z���bP���G��q|�C��"
B%|��6k����� ~�����j�'�8�}o�6?5!C�F�����[��($�����Qu?(�V��F�u������s����7�D���Bg.������i��x3����1Kwp�O_�v(F%��O#�J���r� ��M��O��Y���)���{�+��x:O:�}�wFp�5v�S��:f��1�l������b��x�A�}�rL������"�\:�����`l����EFw����w�\����]��a�Ud�\�
/*x�R��'�J��}j�I0
��d#���/�F#����;$q ���� H��ZB@���CmC��$���%�2s�5S�,5&b�d�1OR3��Mm�8
�@/��ud��c�z:k��&���rN��&A6j����2��i���Ii#�A����-�!4�{�Gk`X�U)��k(D�^�7�_�	�����u�/�F�?8�:>$�$�{��S�c�A�y�w��Z�e2d��'��p
1��^LdW�<��	,	�u�q`|F�O7�,��c�h�T����\j3���=	�VS�0�R	X���\s"�;~eO�+��6�s$�9I��qW0��{��^��9�a>!��A�
�A�zp�#�h��T���1��k0d*����Y�<��i�rX):����C�@h���<�/-S���`�K�
�5���E�l�M�I��}6GC�<�5����^Z��h$�-��O���)k�z�&O��Z|"H����c������H�[���"�q�	g�2�����6�I
���Q�e���zWqS���nXZg���#<�������p����Os�7�'��(��sh�{OS�	��I�'�vE���>�
�+:5�T�pRn�WQ���;d�7MV����*H|���zH5����q�����!�MF���H��������y�%��DD+K�txC��XSv`�Hdt\�fN�t��X�5�����3����j���gZ���Y�U���k�3K��:�V��gU��!u�H�
��\K9��n�5zB���u�po���G�O��-(�����z���=:nt���i�.��h Gpb��`�g���2a�4qQ'^�q:Q�3ru�uq�C�'T���<v�Hn����\� ;���4[9
f�v�*�QZ��)��&�#8���^��!���k���5/�g����u0�H���4b]a��l��kD�$���:�p3�
�iD�
JZ�E]�!��FJ<�L|�l����|��v'���d8
�������#�a���U���(*��%@(�����z#��������.����"V5*"��J�P��0�Sm����sE)��%�Ex�Q8�/�~x�)�k�G
3MG7b��D'J�����6�
�*�#fzn<�D	$g�����9*��n��F������n�M���6�����m�w;k�i�{�����C����GQ7��F��Vo������;���n���}�0������w�!���[O��O[��O�?��l�)#�c*5�'������C��W��kraIk�Z��8���L�\�.���Y�rB^(C��Q��r�BG�q�F��VA��Yb��.�Y�	�����bJ� �A�b�"\�f�&�1���4NlUu�j��n��(\P��i<�A�zr�����a��_�?���a���3��-��X�R�n���$K�M-R�v�����r}�S������b1�@0��P�a^7��LQ�QY����;�9�&	�R��G<�0��Mk�5�z +w�5�mk/�)!wQT��)�7��������	]�:}���j9%���l pyF�L�=.B�Xm��C��a5��!�������Y2~�f-t���B�������8����o�=�a���:>�8b�Qhj"��M�c��b)����l>4�W$�/�(aN�z�D!��%���>B��(��� H��r-���5/�9����M<S#*�pN��8"c�
	�Z��CY�@�>��XB��@���L�*��	��d�{��b���P�q�R������%������/�g�L2�����V����%`��=��������E��2�a)�]/�8h��R��>�q��6����\'�p�l�����j8�?��3|���Owy<��l��������<&��c������nIA'�!��d�%�c�����)}�����v��|{���GF���C�'�
6�-��v�_��X>��^Q1)S�.XwZ�)�����G%�\*;��O>�f��>��:Y��l���8V�{����4��A��-����&�T������n���B��M�����xLm���zwr�����gJl��=�e��{����qEM�6������'�o�E��-�75#Hv�������u��m�c�k��X���L�:�mC�7���l����c�h ��m��A�A
�Vs�a�6.H��*L�`q��cMWqHF���f�(Z���6����<G����4M�3�����M.Av��}z��t�����c��4H#)/!^�(���\�
���B����>#��Q3�L��}��Z~���U�Vz����
?(Xs4��GHj����yQ�p`e�d���
�y2	�\l�C���AR�[�xS�j�ZW	�N�&�m�����A�����k�+��(9�e+G��F�����0�?e
kK�l��60i��(9W�6��pm�1�����m����;)�]�������Pc���������������G��:n�l��?H<c��ii�2
��#q�����l��\�L����'���3`��i1�a��zCX�."f����`�z�j���3�������;�Yz��F��p��C�p����?���)���1i��)��!�E��f��uzt������>���~p���Kk����t�Ar��(@a\-���kN���K����=(�Z�x�at��%�C��"�%��|���� -�g?D�����a6���U0���P����)W$L��G�����G�E��.�^��i�=�1[�G��[~���*~'s��A~�����;B�
iq�\��-�=�^Vy�`��c��[^�Lq*��,�y2����Y�������q�K��P�����Q�]zI��8"Q g�?�^���)k��J�#��|f�pm�}a��;����;9��^���	������n�^�����|�����E�7������	H?=�(� �AK���x.B����!
���S� !l�����C=��2�<��	�
�,�[�(<g�A�r�_/1	@�*r���4C1�\@_r����T�He�oX[=���
`G�@6-�\v���N���x'*~��
Ccz���
(1T0�)�$c>'wx��4i�-��{$#������Ty��eaa(��^Sy$�L�!Q1���"3���%H%�Z0���E���,�!��,-�(�_d���=J32�O�+]�h��Z��o:���K�������l��"��S��Iz�i�0C�[Y��|�(6��h&��ZZ��=�����T�����@%ve)��d|������)
J�T�����Q���m/����z7r ��m���_>�I�������m�o���Yr-��m�O��pM��5���g����#�:�}���7����:�_����K.�ac|������, u|�jJv������KB7l������:g��`Vhar�'�r�����������b2��l#@7_.�
LLM-zh�$\���:bk���m4�'#n��>���,�0Q`����!E�HR���
���RO�
���r�a|/�p[
-f��8���T�8.'�5c��S���d�mBS`��y<��Sd�i�An������e��nxC�^���f}(0N$��b2���g��K2�Lk^�����Lb��� G�&:�N����2=��R��^<�;�>��jBkE���uS��KF�-�]d]j���;��:����{
B3_��n����M�H��,�m�r���J�l���Z�Jo	�*$@��Ct���?��no[��ud
�x^�Ar��8d\M�7ZBI���
s�<��C��	�HQX�������-] ~�e&W��t�|��
���[	W�/`q<Zq��ZZj��8B��t�����bcXV�$������M�M�����(��G7!��
gV���vt|^����J?h��n�����2;��v�5�|Ov��V��G�7���^=[��}a���JB�q���k4,�����C��23e����LQ"F}Z��+����+b�z�5�K��G�x�
,2�r`��tAe;$�2�P|�h���%[�����J|3SS����\n�	Ca�y�����9�����#�����3�=�v<����P�`2fW�~L6 �+"H�9=~yp����G?#�����}[&��=�W�{[�������(�v���_���p����u)B�����?e�$��C�c��H�y��R�KE��4
����hN���:���
_?3+hjG	oo�<��lfp&��`��Ll�"5�s��,�a�~	���PLo�<'�������h���U�TK����r�<�0��������Y���*�� �t)AIGR�u��0���v�zX�i�r
E�pry
U��{a)�!���(��Nv�fst�;;e��ry���C�Y�k���P��h"�����#�Gg�!j`j���X(U��NW�U����u]9��`����x�C�1�e���HZ�dd ��7������S��D�J������#F0�YD-��0}I�3[�	�N�aA{�0��r�P:n����%=���&��%��?��^v��8��q���#�km�p�lF�h�g�z���w��H,��9D������hz����cb�r+���K,��K�����������1
�������*��� �/&�����f�,s\s�PU;	Y���6M�)��t�����7���N� )���2P�>~�j4]{�����NC���"�*�8�m|%F0���W��7�4�bG�����U���Q�d=�v��A[��d�>lV����;&{Sn��j�M+�[��i}����bV�n�����	�|*)�����ee��2)7������[�����*<�t�A;���������[�����a{�pXuB�/�b��r��".��Hh��NO�^�=�>~�;~A�y�e��k�7j�~'�5��&x�FJg����
���.%N�T��b)��1j��Iin��2�,'<��rq���F|pM]�%�5�z��s�o���������{"^�Mq�<�g�j����UpU��@�@W��]V:��U��Cw�-ky.�r�����|t�������U�����/�v�=����(�bj��(���z;;A��l{�� ��V�i�<G!#���/��5q�>]����!�����<�}�K1�,�'�(�e8����E������J�B����c�+�bToFT5����*�)�B?�4:��������@�	(0���.i�Ws��za��61v�C��t�)Z���Q��	�����X��~�h����8��6M���@�R��+��%k�30?�������>@
#�������/?��r����k1�/��P�{������x�{'���/����G/��>ES���o����w�N^����sx�
k���t����L	H��?=zW����3dr�V�i�
���]65JZ���� 0S����?�7��v�r�I������K�Dc7B\�G�W\_:�J�� "F@!n6����	3�3g��@�E�1����Xu���(�68�[�\Uu�~B��$JN��������=l6�;A���S�n��VP��(�].���X��~�U����7�/���]/��R���a����c��j�"���pLb�iM$[�i}�\�� �,���HK
����2�r	(�bp�������9N/^�]�U�l���z7�=gS E3�����,hn+b�)#���,��*��P5*`z?���Ch��J�	�0��z��g8�FA��r�1���iw���m���E<�<#���	*y�G�M������~y�?�m����(�D%�b������l(��4Qv�qr]��i�yd�����hH����V���*�1�B2;T��65���Z�|$�P�[���"V�Q�Sc��g�}���|��K�Tu����
��4���S�'��In�>1q���U��x)�|��Q����P��n�����Jl��T�)�\�m0��|(=`)��z��3�CS����Y|���(}�_w�-�a�vnE�:���d���� O:Pr���IJi*��`��` �-P�?��������F)�J��������Dw��k�l�I�K�����aC����l�,�R�dq�?�j��q��v��R��M��0��s��`A*�����{C�7�4Yx����.�7g�`����� #M�V����en��b�<X�"�HB��)��U�@~-vn�~Hy���*A\���
���j)���56S�cr������j9�m��Q��ej:��c�y��M�u�Q����z�����`�����S�"t��*n�	��Dh�~������8���ZZnW�@9y�!�������*m�~�H*��*b�3}P*��p�=Z!�
HC�#�M��*���P�&5�+���wzt������G��f�h���p�2���
L)�����S�BI�}������W��&�eKG�?����$��w�^	����\.�n~�����R���U�������w��}�(���V��K��_P�	3����4Q������l#�*�xB�f��o�w�7������������_���6�������T�$�L���]V���Z�$Y�/��SCC�A��*���E���&{[��4�D�����A_���U�7�����,��] ����
����������������L�\� �/#���$c���c���:�ip#QT����6�2�8/���@��(��c�1b=\I������R3+��>�%��^]_�cs���^���Br��������,n(��
�/��C;s���k"��%KUC���#��p�`%K�T�PG�T�['��=�q����0�/�5����������0�{1��v����6z ��'��b���������5.�(�d,��;�L
^//�h6�B	�)�F���*�C�����P��>�:���+���cE��sh��Z�tX9l����0�Q����k4-�8�`�H�
��4D����A�\A���N��m��Z1,�fY��e}X�A6������:DzlV��<�9�a��&IN�Z��e���Rxr�Pn�����JpQ��cI�:+_V�l�dm� �X���������9�Az�rs�,���Z�lT�m&n	�%��I+�T���d(���~4�U���VV��6���[��:���N��:��>����rF�������[RLx1�}���%�%� G��l���&R�k�������.w&��t�#a�P�P�eE4*{��t1P��*����0�����x.e�|F�!�|�s�>���cE�R(�)��(�J<n44�e) A��Bn�����.5>{)V�!/@���U��m������Fp���G��*��`���,���a'�XXT�a�OP������q~<����6	Gbfx��.I�����	�zH�j��=:�\2���RBe�8�z�e��-�(v�
W��a�B�����:j��k-x�(Co����*T�����9��m�Y:��#�`����-5��9�
M8��,]x	��~A���2P�.�����MS!���fs	������������M�>^Q��Nf��k������/�fQ����:�<�a���������:��hN���ILE�7�� ����P�����(:������:��db��fq�P6��� �4U�@.W�a�b7�[���D0<\fvs���A�H�O��~�\@3f/�fI�Hh�p���OH2�����rt:A�1��N�y�H���IN,���+
�\�[r��1�$x��+R��� qF���b]]�����{�8�G��Zj���V��L�Ye���z�����1NK*��%������N_�Do.����27������S�Z��A���L���2��\7J��<�t!(KZa�vJ����K�0N�Q��Z)^����C5c@cT�b������K�Ta�.��R��H���D����6c��\��n������yI�>���
�T�.���t5+5����RI�'�c�������n/����6�<�|�#d}}�2�����r@�!��JtA�h~M�vR7."�&K�)�G�WU�v�-����a����$�R��f�8��F?M�%�g��
�������gb���"���
R*5���~��$e<���0Fe�OGJ<gfN��nVr
�<
nb�����\�k��C��A�i��J�
+e��r��h}6���9� �Q�� 7bA
j30������^��MrI|p��f\U���/����
[\^��h�*��1*��������y+����!�/�FE:d���4�rI�2�����~f%�n-����Ft�gD�K@��uS. Q��������W��D������`����)�h4sR�@�e�`�q�Bj���?S�o;�/o1�@�����|?Z�c����Awrr��8>={���_��q����pJ	K�O2���j\Vr�����H�����
�5��x�e���M9��	����"���_;�2�.�&�1T6���KA�������'����Or�I����Q1mh���Nq|�}3K��Muo���q��*Y���0It��/��}�;v�>^2P�="������#��p��S@�5���0:�Pe��4����5��?l�j��bt�6t_L�����=����%�N�����H�k]�����kA��L-I���
]�c�w��*�����<�P�A`��H��e�8�+!��k"�IQ��{_�%������L��	���L�}�Z����.GL3��Z���V���
6���8���k��kk�\�X��3��Dv�u��Z� h��z�`F��I�pz��|�xBN,P�Z1~�����kU6J"�0�����M�i�}�-�
tN�u���Zq���
�=�3�e��U�gK	��\��R���	�|l������I�IWj�������qW�,4�1P3rRi1�y1�����f3<�9RcT�����!���N
+��`�	��:B�����t��8*@Hd���!�~�h]\Nq�C�����I����V;����R-#��^���1�DB��I���}�=��8k���`\B�O�Pu����f��*
w%aC�%{5���(��-)4K�K^�;�'spC����]�R-#O����}&����>�
��O��d]|���d������d1�c�M�+��zK��#j{���h��q�,?nT+�"A�y$��Nq]�c�'$N�)(�'S[�;��	�c�<)
�"�q!D^B�nS�k��5�P/+�A�����=����d�:�.-�J�rT`�U���Y`���&	�,�]��)y��j�~Y|jB��w�/�4���U����d�ae2}7t|��!��>�����y���-jDtG��Be	c��r;��l�:������H�R�Ds�2#�z�(y���o��u���ja��m���@M�6I�~(	�(4z
Y!�5?��6�����Ath���������@���pt
�"<(��8dn��M�+4�8:�����;e{����xI�L��b���dvq��8�A���)�s�O�
5vw
)�Q���[O��hR��jvJ�wxc2��l��H7����%�8}+������r�s�<��A������1��0sN�ac13	
;�5���@�1~���l�����l�&z��$7��6�x0����+�h�b�;���%���>���L8��4t�1����x��I��Lh>[D���6#����d��zD�G*�"��@t�7���l���*�"]Em���8��8/w�Hwlh�`�URd�L�6iml	�2iu��1�nL3Zn���%�oT)�u���[s8�G_a��t�S��	G�3�7�,�Vnk�9x��i}%w#N��m�[�����v��p�=�n�h���+W�,�L\L�Yx��-�	��A
���Tu�M��B�ry��@a���t����H�O�����������K
�1��6�ro0d�'X�
��x��f���ZqaM��,�)M�r<�19�������PG-�VD�v�_Z*���Y2���C�{[�q�����T[��6��?&�I�N���P2
>�T�vd"��]�r�f�Z�G^���4�Rg����B��#|�����|I5�����J<H��j;�����Ao�����1���X�E�i�K�����	]T\0h~�%j����2�Ywj�I4�����B��z��z�~����8����0�v�o+I����4{����&����\����P@�(DhL.���_b��j�K�Z,�L��6K�=�V��L�0N9����5EH�O�g�=��@��.^����XwC���[6$e�O/c'hI1��dAA���K�O��><g���Z��7��E�ER����~��$\��|���\��;���A�=�s
���=\�F���n��P_6}p��S��6P^�`��x]qgp�Q��0���[����`���&e���p��]y\9�EW�NcAp���g�dO��Ng~4R��t�)��n�������������3+��9;b�,�<���Z}d{p0O)ky?L?�E�����T�"�@��{��^W��:��HdbK�2�9�Q��*	�hG77��	�f����g19��R�����&��=~s���]�W��x�=W��y-gT�]1��Hk��:A$4��$�@}
[�D#��������w�Z�o����0{q����d
��wz���x���2�d�t�$QD�Q	�
).�q�����
��*��l���)"��N�9�����\�x�htm�e9T����%��H�������:�t�!.�<75���l�m��A�!��L�.����(%�I����Y�����+��h���h,���{N�v����l�Q+h�vW`T��TV���TG�qu$�UGz7��g��������4��=u�PP��R�$���F��X=K������T����D�|V0�$�����5�.��8�B �J�JL���H�G�UY!�;�5��G���^����'�(��Q����OJ�!lc�_�X��=�h=
��IO��,!�2����Q�D"��]�_Va@�*5�*u^���{���Y��;����dk	���U��U}KjL�s��`��vJ�Apsy���������Fm%�$f{b}��B\3R��L^mA�N�dm�
&��5m'*"*���R�u��aR�rv�SA��V-;���P�~!
nd/���w����N��S��b���&	�o�RS<yQ@�$��`[I_���0�i8���cW�s��<T5����z8�@���u����W�����-)S[��o.t�'���f���"���:�b e�D��a����C9�,'J(�\�f�Q�vnC
yT����6��BdZ)��2:���F+����Let�e��6���S-K��ntv������beH��H�[�^��H��������v�7%5�`���4�[TtU���	)	��f����,�_0���F1%n�&))�����J���Pg���o�EAQ�:�p�j�0�
hJ@�����5�K`n
��~/�B��lG<Uy�O��tY�v63^�4��=^��)�������$�"
B*���#���u�%p���8@�p�	���E�&q@$'���!~�fMR��yq�l*��P<@fT��� d[��a���[���f�K�V],�����^��(Z17[����Bi�2������d�p�����fWO]EZ����i7�^�=:u�\��H�g/���Xn�|!V��)��]N��`�����^���n����3`��g�\PCAt�K�9�PeQa��S�������@9C�mrs���N;u"��f
�S,u��w1�,
Z�!��UZnF�^���� �4a��?��;��Z&���"i$@<5*�
�O��7�M�V����������������������������������������������;�
#199Jeff Janes
jeff.janes@gmail.com
In reply to: Peter Geoghegan (#197)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 15, 2014 at 5:05 PM, Peter Geoghegan <pg@heroku.com> wrote:

Maybe IGNORE is defined as a macro in MinGW?
Try s/IGNORE/IGNORE_P/g throughout the patch.

BTW, the gcc -E flag does this. So figure out what exact arguments
MinGW's gcc is passed in the ordinary course of compiling gram.c, and
prepend "-E" to the list of existing flags while manually executing
gcc -- that should let you know exactly what's happening here.

Yep, I tried that trick and had decided it didn't work in MinGW. But I
think it was a user error--I must have somehow broken up the build tree and
'make' didn't detect the problem. Now I see that IGNORE is getting turned
to 0.

Your new version 1.7 of the patches fixes that issue, as well as the OID
conflict.

Thanks,

Jeff

#200Peter Geoghegan
pg@heroku.com
In reply to: Jeff Janes (#199)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Dec 16, 2014 at 11:08 AM, Jeff Janes <jeff.janes@gmail.com> wrote:

Your new version 1.7 of the patches fixes that issue, as well as the OID
conflict.

Good.

You're probably aware that I maintain a stress testing suite for the
patch here: https://github.com/petergeoghegan/upsert

In the past, you've had a lot of success with coming up with stress
tests that find bugs. Maybe you can come up with some improvements to
the suite, if you'd care to test the patch. I can authorize your
Github account to push code to that repo, if you're interested.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#201Gavin Flower
GavinFlower@archidevsys.co.nz
In reply to: Peter Geoghegan (#200)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 17/12/14 10:11, Peter Geoghegan wrote:

On Tue, Dec 16, 2014 at 11:08 AM, Jeff Janes <jeff.janes@gmail.com> wrote:

Your new version 1.7 of the patches fixes that issue, as well as the OID
conflict.

Good.

You're probably aware that I maintain a stress testing suite for the
patch here: https://github.com/petergeoghegan/upsert

In the past, you've had a lot of success with coming up with stress
tests that find bugs. Maybe you can come up with some improvements to
the suite, if you'd care to test the patch. I can authorize your
Github account to push code to that repo, if you're interested.

Yeah!

I have just released a prototype software (not related to pg): I'm going
to tell them to treat it with extreme suspicion, no matter how much they
may respect the developer (me)!

Though like Pg, it is critical that it records data with reliability.
Also, both need testing to try and detect intermittent errors (I already
found one myself in the prototype - fortunately, not so critical it
needs to be fixed in the prototype, but would have to be eliminated from
the production version!).

So I think it really great to encourage people to come up with demanding
tests, especially automated stress testing for pg.

Cheers,
Gavin

(Who wishes he had the time & experience to contribute to pg.)

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#202Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Peter Geoghegan (#198)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

It looks like we are close to reaching consensus on the syntax. Phew!
Thanks for maintaining the wiki pages and the documentation. All of the
below is based on those, I haven't looked at the patch itself yet.

The one thing that I still feel uneasy about is the Unique Index
Inference thing. Per the syntax example from the wiki page, the UPSERT
statement looks like this:

INSERT INTO upsert(key, val) VALUES(1, 'insert')
ON CONFLICT (key) IGNORE;

With ON CONFLICT IGNORE, the list of key columns can also be left out:

INSERT INTO upsert(key, val) VALUES(1, 'insert')
ON CONFLICT IGNORE;

The documentation says that:

Omitting the specification indicates a total indifference to where
any would-be uniqueness violation could occur, which isn't always
appropriate; at times, it may be desirable for ON CONFLICT IGNORE to
not suppress a duplicate violation within an index where that isn't
explicitly anticipated. Note that ON CONFLICT UPDATE assignment may
result in a uniqueness violation, just as with a conventional
UPDATE.

Some questions:

1. Does that mean that if you leave out the key columns, the insertion
is IGNOREd if it violates *any* unique key constraint?

2. If you do specify the key columns, then the IGNORE path is taken only
if the insertion violates a unique key constraint on those particular
columns. Otherwise an error is thrown. Right? Now, let's imagine a table
like this:

CREATE TABLE persons (
username text unique,
real_name text unique,
data text
);

Is there any way to specify both of those constraints, so that the
insertion is IGNOREd if it violates either one of them? If you try to do:

INSERT INTO persons(username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username, real_name) IGNORE;

It will fail because there is no unique index on (username, real_name).
In this particular case, you could leave out the specification, but if
there was a third constraint that you're not expecting to conflict with,
you would want violations of that constraint to still throw an error.
And you can't leave out the specification with ON CONFLICT UPDATE anyway.

3. Why is the specification required with ON CONFLICT UPDATE, but not
with ON CONFLICT IGNORE?

4. What happens if there are multiple unique indexes with identical
columns, and you give those columns in the inference specification?
Doesn't matter which index you use, I guess, if they're all identical,
but see next question.

5. What if there are multiple unique indexes with the same columns, but
different operator classes?

6. Why are partial unique indexes not supported as arbitrators?

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#203Josh Berkus
josh@agliodbs.com
In reply to: Peter Geoghegan (#180)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 12/17/2014 01:12 PM, Heikki Linnakangas wrote:

3. Why is the specification required with ON CONFLICT UPDATE, but not
with ON CONFLICT IGNORE?

Well, UPDATE has to know which row to lock, no? IGNORE does not.

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#204Peter Geoghegan
pg@heroku.com
In reply to: Heikki Linnakangas (#202)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Wed, Dec 17, 2014 at 1:12 PM, Heikki Linnakangas
<hlinnakangas@vmware.com> wrote:

It looks like we are close to reaching consensus on the syntax. Phew! Thanks
for maintaining the wiki pages and the documentation. All of the below is
based on those, I haven't looked at the patch itself yet.

Great, thanks!

Yes, I am relieved that we appeared to have agreed on a syntax.

The one thing that I still feel uneasy about is the Unique Index Inference
thing.

The documentation says that:

Omitting the specification indicates a total indifference to where
any would-be uniqueness violation could occur, which isn't always
appropriate;

Some questions:

1. Does that mean that if you leave out the key columns, the insertion is
IGNOREd if it violates *any* unique key constraint?

Yes. This is particularly important for the implementation of things
like IGNORE's updatable view support. More generally, for various ETL
use cases it's possible to imagine the user simply not caring.

2. If you do specify the key columns, then the IGNORE path is taken only if
the insertion violates a unique key constraint on those particular columns.
Otherwise an error is thrown. Right?

That's right.

Now, let's imagine a table like this:

CREATE TABLE persons (
username text unique,
real_name text unique,
data text
);

Is there any way to specify both of those constraints, so that the insertion
is IGNOREd if it violates either one of them? If you try to do:

INSERT INTO persons(username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username, real_name) IGNORE;

It will fail because there is no unique index on (username, real_name). In
this particular case, you could leave out the specification, but if there
was a third constraint that you're not expecting to conflict with, you would
want violations of that constraint to still throw an error. And you can't
leave out the specification with ON CONFLICT UPDATE anyway.

Good point.

For the IGNORE case: I guess the syntax just isn't that flexible. I
agree that that isn't ideal.

For the UPDATE case: Suppose your example was an UPDATE where we
simply assigned the excluded.data value to the data column in the
auxiliary UPDATE's targetlist. What would the user really be asking
for with that command, at a really high level? It seems like they
might actually want to run two UPSERT commands (one for username, the
other for real_name), or rethink their indexing strategy - in
particular, whether it's appropriate that there isn't a composite
unique constraint on (username, real_name).

Now, suppose that by accident or by convention it will always be
possible for a composite unique index to be built on (username,
real_name) - no dup violations would be raised if it was attempted,
but it just hasn't been and won't be. In other words, it's generally
safe to actually pretend that there is one. Then, surely it doesn't
matter if the user picks one or the other unique index. It'll all work
out when the user assigns to both in the UPDATE targetlist, because of
the assumed convention that I think is implied by the example. If the
convention is violated, at least you get a dup violation letting you
know (iff you bothered to assign). But I wouldn't like to encourage
that pattern.

I think that the long and the short of it is that you really ought to
have one unique index as an arbiter in mind when writing a DML
statement for the UPDATE variant. Relying on this type of convention
is possible, I suppose, but ill-advised.

3. Why is the specification required with ON CONFLICT UPDATE, but not with
ON CONFLICT IGNORE?

That was a fairly recent decision, taken mainly to keep Kevin happy --
although TBH I don't recall that he was particularly insistent on that
restriction. I could still go either way on that question.

The idea, as I mentioned, is that it's legitimate to not care where a
dup violation might occur for certain ETL use cases. For UPSERT,
though, the only argument for not making it mandatory is that that's
something extra to type, and lazy people would prefer not to bother.
This is because we assume that the first dup violation is the only
possible one without the unique index inference clause. If we don't
have the index expressions with which to infer an arbiter unique index
(as with MySQL's ON DUPLICATE KEY UPDATE), you'd better be sure that
you accounted for all possible sources of would-be duplicate
violations - otherwise a random row will be updated!

That isn't a fantastic argument for not making a unique index
inference clause mandatory, but it might be an okay one.

4. What happens if there are multiple unique indexes with identical columns,
and you give those columns in the inference specification? Doesn't matter
which index you use, I guess, if they're all identical, but see next
question.

It doesn't really matter which one you pick, but right now, at the
urging of Robert, we cost the list of candidates and pick the cheapest
iff there is more than one [1]/messages/by-id/CAM3SWZQz+jYkwfuZvcSf0qtpa2QiY+8NGNcHjfWgz3DDzRfzEg@mail.gmail.com (and error if there are none). This is
roughly similar to costing of indexes for CLUSTER, and occurs during
optimization (only parse analysis of the expressions associated with
the unique index inference clause occurs during parse analysis -
indexes are looked up and matched in the optimizer).

5. What if there are multiple unique indexes with the same columns, but
different operator classes?

I thought about that. I am reusing a little bit of the CREATE INDEX
infrastructure for raw parsing, and for a small amount of parse
analysis (conveniently, this makes the command reject things like
aggregate functions with no additional code - the error messages only
mention "index expressions", so I believe that's fine). This could
include an opclass specification, but right now non-default opclasses
are rejected during extra steps in parse analysis, for no particular
reason.

I could easily have the unique index inference specification accept a
named opclass, if you thought that was important, and you thought
naming a non-default opclass by name was a good SQL interface. It
would take only a little effort to support non-default opclasses.

6. Why are partial unique indexes not supported as arbitrators?

Robert and I discussed this quite a bit -- it was the argument for
being able to name a unique index by name (not that I'm very happy
with that idea or anything) [2]/messages/by-id/CAM3SWZQ8tDPdjiwj_FW4AO8gEvpyiixwBE67OVQuufPJ+y1e1g@mail.gmail.com. Basically, dealing with the possible
behaviors with before row insert triggers might in general greatly
complicate the implementation, even though the issues we'd then be
protected against would seldom arise. Robert seemed to think that we
could revisit this in a future version [3]/messages/by-id/CA+TgmoZgLgY2PBAMTY3T1jpYXAvNL-w=T6o+6pMqrVR+Vn-iyg@mail.gmail.com -- Peter Geoghegan.

Note that IGNORE will still IGNORE any partial unique index -- it just
won't accept one as the sole arbiter of whether or not the IGNORE path
should be taken (so it's really the inference specification syntax
that doesn't accept partial unique indexes, just as it doesn't accept
updatable views, exclusion constraints, and inheritance parents where
the semantics are similarly iffy -- that's both the reason for and the
mechanism by which ON CONFLICT UPDATE does not support these things).

[1]: /messages/by-id/CAM3SWZQz+jYkwfuZvcSf0qtpa2QiY+8NGNcHjfWgz3DDzRfzEg@mail.gmail.com
[2]: /messages/by-id/CAM3SWZQ8tDPdjiwj_FW4AO8gEvpyiixwBE67OVQuufPJ+y1e1g@mail.gmail.com
[3]: /messages/by-id/CA+TgmoZgLgY2PBAMTY3T1jpYXAvNL-w=T6o+6pMqrVR+Vn-iyg@mail.gmail.com -- Peter Geoghegan
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#205Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Peter Geoghegan (#204)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 12/18/2014 01:02 AM, Peter Geoghegan wrote:

On Wed, Dec 17, 2014 at 1:12 PM, Heikki Linnakangas
<hlinnakangas@vmware.com> wrote:

Now, let's imagine a table like this:

CREATE TABLE persons (
username text unique,
real_name text unique,
data text
);

Is there any way to specify both of those constraints, so that the insertion
is IGNOREd if it violates either one of them? If you try to do:

INSERT INTO persons(username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username, real_name) IGNORE;

It will fail because there is no unique index on (username, real_name). In
this particular case, you could leave out the specification, but if there
was a third constraint that you're not expecting to conflict with, you would
want violations of that constraint to still throw an error. And you can't
leave out the specification with ON CONFLICT UPDATE anyway.

Good point.

For the IGNORE case: I guess the syntax just isn't that flexible. I
agree that that isn't ideal.

It should be simple to allow multiple key specifications:

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username), (real_name) IGNORE;

It's a rather niche use case, but might as well support it for the sake
of completeness.

For the UPDATE case: Suppose your example was an UPDATE where we
simply assigned the excluded.data value to the data column in the
auxiliary UPDATE's targetlist. What would the user really be asking
for with that command, at a really high level? It seems like they
might actually want to run two UPSERT commands (one for username, the
other for real_name), or rethink their indexing strategy - in
particular, whether it's appropriate that there isn't a composite
unique constraint on (username, real_name).

Now, suppose that by accident or by convention it will always be
possible for a composite unique index to be built on (username,
real_name) - no dup violations would be raised if it was attempted,
but it just hasn't been and won't be. In other words, it's generally
safe to actually pretend that there is one. Then, surely it doesn't
matter if the user picks one or the other unique index. It'll all work
out when the user assigns to both in the UPDATE targetlist, because of
the assumed convention that I think is implied by the example. If the
convention is violated, at least you get a dup violation letting you
know (iff you bothered to assign). But I wouldn't like to encourage
that pattern.

I think that the long and the short of it is that you really ought to
have one unique index as an arbiter in mind when writing a DML
statement for the UPDATE variant. Relying on this type of convention
is possible, I suppose, but ill-advised.

Another thought is that you might want to specify a different action
depending on which constraint is violated:

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username) IGNORE
ON CONFLICT (real_name) UPDATE ...;

Although that leaves the question of what to do if both are violated.
Perhaps:

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username, real_name) IGNORE
ON CONFLICT (real_name) UPDATE username = excluded.username;
ON CONFLICT (username) UPDATE real_name = excluded.real_name;

5. What if there are multiple unique indexes with the same columns, but
different operator classes?

I thought about that. I am reusing a little bit of the CREATE INDEX
infrastructure for raw parsing, and for a small amount of parse
analysis (conveniently, this makes the command reject things like
aggregate functions with no additional code - the error messages only
mention "index expressions", so I believe that's fine). This could
include an opclass specification, but right now non-default opclasses
are rejected during extra steps in parse analysis, for no particular
reason.

I could easily have the unique index inference specification accept a
named opclass, if you thought that was important, and you thought
naming a non-default opclass by name was a good SQL interface. It
would take only a little effort to support non-default opclasses.

It's a little weird to mention an opclass by name. It's similar to
naming an index by name, really. How about naming the operator? For an
exclusion constraint, that would be natural, as the syntax to create an
exclusion constraint in the first place is "EXCLUDE USING gist (c WITH &&)"

Naming the index by columns makes sense in most cases, and I don't like
specifying the index's name, but how about allowing naming a constraint?
Indexes are just an implementation detail, but constraints are not.
Unique and exclusion constraints are always backed by an index, so there
is little difference in practice, but I would feel much more comfortable
mentioning constraints by name than indexes.

Most people would list the columns, but if there is a really bizarre
constraint, with non-default opclasses, or an exclusion constraint, it's
probably been given a name that you could use.

In theory, with the promise tuple approach to locking, you don't
necessarily even need an index to back up the constraint. You could just
do a sequential scan of the whole table to see if there are any
conflicting rows, then insert the row, and perform another scan to see
if any conflicting rows appeared in the meantime. Performance would
suck, and there is no guarantee that another backend doesn't do a
regular INSERT into to the table that violates the imaginary constraint,
so this is pretty useless in practice. So probably better to not allow it.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#206Kevin Grittner
kgrittn@ymail.com
In reply to: Heikki Linnakangas (#205)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Heikki Linnakangas <hlinnakangas@vmware.com> wrote:

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username), (real_name) IGNORE;

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username) IGNORE
ON CONFLICT (real_name) UPDATE ...;

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username, real_name) IGNORE
ON CONFLICT (real_name) UPDATE username = excluded.username;
ON CONFLICT (username) UPDATE real_name = excluded.real_name;

I like all of these suggestions, except that I think they reflect a
couple things about the syntax which was never settled[1]/messages/by-id/CA+TgmoZN=2AJKi1n4Jz5BkmYi8r_CPUDW+DtoppmTeLVmsOoqw@mail.gmail.com. First,
Robert suggested using DUPLICATE instead of CONFLICT, which I think
it clearer. So the above would become:

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON DUPLICATE (username), (real_name) IGNORE;

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON DUPLICATE (username) IGNORE
ON DUPLICATE (real_name) UPDATE ...;

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON DUPLICATE (username, real_name) IGNORE
ON DUPLICATE (real_name) UPDATE username = excluded.username;
ON DUPLICATE (username) UPDATE real_name = excluded.real_name;

Second, he suggested a shorthand way of specifying that all the
values from the failed INSERT should be used for the UPDATE:

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar', 'baz')
ON DUPLICATE (username) UPDATE;

I think the first point got lost in the discussion of the second
one.

I don't think either point was ever really settled beyond Robert
and I preferring ON DUPLICATE versus Peter preferring ON CONFLICT.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

[1]: /messages/by-id/CA+TgmoZN=2AJKi1n4Jz5BkmYi8r_CPUDW+DtoppmTeLVmsOoqw@mail.gmail.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#207Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Kevin Grittner (#206)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 12/18/2014 05:46 PM, Kevin Grittner wrote:

I don't think either point was ever really settled beyond Robert
and I preferring ON DUPLICATE versus Peter preferring ON CONFLICT.

I also prefer ON CONFLICT, because that makes more sense when you
consider exclusion constraints, which I'm still hoping that this would
support. If not immediately, at least in the future.

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#208Kevin Grittner
kgrittn@ymail.com
In reply to: Heikki Linnakangas (#207)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Heikki Linnakangas <hlinnakangas@vmware.com> wrote:

On 12/18/2014 05:46 PM, Kevin Grittner wrote:

I don't think either point was ever really settled beyond Robert
and I preferring ON DUPLICATE versus Peter preferring ON CONFLICT.

I also prefer ON CONFLICT, because that makes more sense when you
consider exclusion constraints, which I'm still hoping that this would
support. If not immediately, at least in the future.

If you think this can be made to work without a UNIQUE btree index,
that is a persuasive point in favor of ON CONFLICT. I had missed
(or forgotten) that we thought this could work without a UNIQUE
btree index as the basis of detecting when to resort to an UPDATE.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#209Jeff Janes
jeff.janes@gmail.com
In reply to: Peter Geoghegan (#198)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 15, 2014 at 11:06 PM, Peter Geoghegan <pg@heroku.com> wrote:

On Mon, Dec 15, 2014 at 4:59 PM, Peter Geoghegan <pg@heroku.com> wrote:

On Mon, Dec 15, 2014 at 4:22 PM, Jeff Janes <jeff.janes@gmail.com>

wrote:

Also, in both Linux and MinGW under option 1 patch I get an OID

conflict on

OID 3261.

I'll take a pass at fixing this bitrot soon. I'll follow Tom's advice
about macro collisions on MinGW while I'm at it, since his explanation
seems plausible.

Attached pair of revised patch sets fix the OID collision, and
presumably fix the MinGW issue (because IGNORE_P is now used as a
token name). It also polishes approach #2 to value locking in a few
places (e.g. better comments). Finally, both patches have a minor
buglet around EXPLAIN ANALYZE output fixed -- the output now indicates
if tuples are pulled up from auxiliary update nodes.

I naively tried this in vallock1 patch:

create table foo(index int, count int);

create unique index on foo(index);

insert into foo (index, count) values (0,1) on conflict (index) update set
count=foo.count + 1 returning foo.count;

insert into foo (index, count) values (0,1) on conflict (index) update set
count=foo.count + 1 returning foo.count;

insert into foo (index, count) values (0,1) on conflict (index) update set
count=foo.count + 1 returning foo.count;

insert into foo (index, count) values (0,1) on conflict (index) update set
count=foo.count + 1 returning foo.count;

After actually reading the documentation more closely, I decided this
should be an error because "foo" is not a valid table alias in the "update
set" expression. Instead of being a parsing/planning error, this executes
and the foo.count on the RHS of the assignment always evaluates as zero
(even on subsequent invocations when TARGET.count is 1).

If I switch to a text type, then I get seg faults under the same condition:

create table foo(index int, count text);
create unique index on foo(index);
insert into foo (index, count) values (0,'start ') on conflict (index)
update set count=foo.count||' bar' returning count;
insert into foo (index, count) values (0,'start ') on conflict (index)
update set count=foo.count||' bar' returning count;
<boom>

#0 pg_detoast_datum_packed (datum=0x0) at fmgr.c:2270
#1 0x000000000074fb7a in textcat (fcinfo=0x1e67a78) at varlena.c:662
#2 0x00000000005a63a5 in ExecMakeFunctionResultNoSets (fcache=0x1e67a08,
econtext=0x1e67848, isNull=0x1e68b11 "", isDone=<value optimized out>)
at execQual.c:2026
#3 0x00000000005a2353 in ExecTargetList (projInfo=<value optimized out>,
isDone=0x7fffa7fa346c) at execQual.c:5358
#4 ExecProject (projInfo=<value optimized out>, isDone=0x7fffa7fa346c) at
execQual.c:5573
#5 0x00000000005a86c2 in ExecScan (node=0x1e67738, accessMtd=0x5baf00
<SeqNext>, recheckMtd=0x5bad60 <SeqRecheck>) at execScan.c:207
#6 0x00000000005a1918 in ExecProcNode (node=0x1e67738) at
execProcnode.c:406
#7 0x000000000059ef32 in EvalPlanQualNext (epqstate=<value optimized out>)
at execMain.c:2380
#8 0x00000000005b8fcd in ExecLockUpdateTuple (node=0x1e5f750) at
nodeModifyTable.c:1098
#9 ExecInsert (node=0x1e5f750) at nodeModifyTable.c:372
#10 ExecModifyTable (node=0x1e5f750) at nodeModifyTable.c:1396
#11 0x00000000005a1958 in ExecProcNode (node=0x1e5f750) at
execProcnode.c:383
#12 0x00000000005a0642 in ExecutePlan (queryDesc=0x1dd0908,
direction=<value optimized out>, count=0) at execMain.c:1515
#13 standard_ExecutorRun (queryDesc=0x1dd0908, direction=<value optimized
out>, count=0) at execMain.c:308
#14 0x00007f601416b9cb in pgss_ExecutorRun (queryDesc=0x1dd0908,
direction=ForwardScanDirection, count=0) at pg_stat_statements.c:874
#15 0x000000000069385f in ProcessQuery (plan=0x1e47df0,
....

So I think there needs to be some kind of logic to de-recognize the table
alias "foo".

Once I rewrote the query to use TARGET and EXCLUDED correctly, I've put
this through an adaptation of my usual torture test, and it ran fine until
wraparound shutdown. I'll poke at it more later.

Cheers,

Jeff

#210Peter Geoghegan
pg@heroku.com
In reply to: Jeff Janes (#209)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Dec 18, 2014 at 9:20 AM, Jeff Janes <jeff.janes@gmail.com> wrote:

After actually reading the documentation more closely, I decided this should
be an error because "foo" is not a valid table alias in the "update set"
expression. Instead of being a parsing/planning error, this executes and
the foo.count on the RHS of the assignment always evaluates as zero (even on
subsequent invocations when TARGET.count is 1).

If I switch to a text type, then I get seg faults under the same condition:

So I think there needs to be some kind of logic to de-recognize the table
alias "foo".

Once I rewrote the query to use TARGET and EXCLUDED correctly, I've put this
through an adaptation of my usual torture test, and it ran fine until
wraparound shutdown. I'll poke at it more later.

Oops. I agree with your diagnosis, and will circle around to fix that
bug in the next revision by, as you say, simply rejecting the query if
it doesn't use the two standard aliases.

Thanks for testing!
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#211Peter Geoghegan
pg@heroku.com
In reply to: Heikki Linnakangas (#207)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Dec 18, 2014 at 7:51 AM, Heikki Linnakangas
<hlinnakangas@vmware.com> wrote:

On 12/18/2014 05:46 PM, Kevin Grittner wrote:

I don't think either point was ever really settled beyond Robert
and I preferring ON DUPLICATE versus Peter preferring ON CONFLICT.

I also prefer ON CONFLICT, because that makes more sense when you consider
exclusion constraints, which I'm still hoping that this would support. If
not immediately, at least in the future.

This was why I changed the spelling to ON CONFLICT. It also doesn't
hurt that that spelling is dissimilar to MySQL's syntax, IMV, because
there are plenty of things to dislike about ON DUPLICATE KEY UPDATE,
and I think a veneer of compatibility is inappropriate - this syntax
is both considerably more flexible and considerably safer.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#212Peter Geoghegan
pg@heroku.com
In reply to: Heikki Linnakangas (#205)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Dec 18, 2014 at 6:59 AM, Heikki Linnakangas
<hlinnakangas@vmware.com> wrote:

Good point.

For the IGNORE case: I guess the syntax just isn't that flexible. I
agree that that isn't ideal.

It should be simple to allow multiple key specifications:

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username), (real_name) IGNORE;

It's a rather niche use case, but might as well support it for the sake of
completeness.

I guess that wouldn't be very hard to implement, and perhaps we should
do so soon. I am reluctant to let scope creep too far, though. As you
mentioned, this is a niche use case.

I think that the long and the short of it is that you really ought to
have one unique index as an arbiter in mind when writing a DML
statement for the UPDATE variant. Relying on this type of convention
is possible, I suppose, but ill-advised.

Another thought is that you might want to specify a different action
depending on which constraint is violated:

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username) IGNORE
ON CONFLICT (real_name) UPDATE ...;

Although that leaves the question of what to do if both are violated.
Perhaps:

INSERT INTO persons (username, real_name, data)
VALUES('foobar', 'foo bar')
ON CONFLICT (username, real_name) IGNORE
ON CONFLICT (real_name) UPDATE username = excluded.username;
ON CONFLICT (username) UPDATE real_name = excluded.real_name;

I think that there might be a place for that, but I'd particularly
like to avoid figuring this out now - this suggestion is a complicated
new direction for the patch, and it's not as if adding this kind of
flexibility is precluded by not allowing it in the first version - we
won't paint ourselves into a corner by not doing this up front. The
patch is already complicated enough! Users can always have multiple
UPSERT commands, and that might be very close to good enough for a
relatively rare use case like this.

I could easily have the unique index inference specification accept a
named opclass, if you thought that was important, and you thought
naming a non-default opclass by name was a good SQL interface. It
would take only a little effort to support non-default opclasses.

It's a little weird to mention an opclass by name. It's similar to naming an
index by name, really. How about naming the operator? For an exclusion
constraint, that would be natural, as the syntax to create an exclusion
constraint in the first place is "EXCLUDE USING gist (c WITH &&)"

Naming the index by columns makes sense in most cases, and I don't like
specifying the index's name, but how about allowing naming a constraint?
Indexes are just an implementation detail, but constraints are not. Unique
and exclusion constraints are always backed by an index, so there is little
difference in practice, but I would feel much more comfortable mentioning
constraints by name than indexes.

The main reason for naming a constraint by name in practice will
probably be because there is no better way to deal with partial unique
indexes (which can be quite useful). But partial unique indexes aren't
formally constraints, in that they don't have pg_constraint entries.
So I don't think that that's going to be acceptable, entirely for that
reason. :-(

Most people would list the columns, but if there is a really bizarre
constraint, with non-default opclasses, or an exclusion constraint, it's
probably been given a name that you could use.

What I find curious about the opclass thing is: when do you ever have
an opclass that has a different idea of equality than the default
opclass for the type? In other words, when is B-Tree strategy number 3
not actually '=' in practice, for *any* B-Tree opclass? Certainly, it
doesn't appear to be the case that it isn't so with any shipped
opclasses - the shipped non-default B-Tree opclasses only serve to
provide alternative notions of sort order, and never "equals".

I think that with B-Tree (which is particularly relevant for the
UPDATE variant), it ought to be defined to work with the type's
default opclass "equals" operator, just like GROUP BY and DISTINCT.
Non-default opclass unique indexes work just as well in practice,
unless someone somewhere happens to create an oddball one that doesn't
use '=' as its "equals" operator (while also having '=' as the default
opclass "equals" operator). I am not aware that that leaves any
actually shipped opclass out (and I include our external extension
ecosystem here, although I might be wrong about that part).

In theory, with the promise tuple approach to locking, you don't necessarily
even need an index to back up the constraint.

So probably better to not allow it.

I agree that we definitely want to require that there is an
appropriate index available.

I think we can live without support for partial unique indexes for the
time being. With non-default opclasses effectively handled (by caring
about the "equals" operator only, and acceptable non-default opclass
indexes when that happens to match the default's), and by assuming
that having an INSERT ... ON CONFLICT IGNORE without an inference
specification to find an exclusion constraint is enough, we have
acceptable semantics, IMV. The worst part of that is that partial
unique indexes cannot be used with the ON CONFLICT UPDATE variant, in
my opinion, but Rome wasn't built in a day.

It would be nice to have a way of discriminating against particular
indexes (unique constraint-related, partial unique, or otherwise) for
the IGNORE variant, but I fear that that'll be difficult to figure out
in time. There is no need to address those questions in the first
version, since I don't think we're failing to play nice with another
major feature. We already have something much more flexible than
equivalent features in other major systems here.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

In reply to: Peter Geoghegan (#212)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Dec 19, 2014 at 05:32:43PM -0800, Peter Geoghegan wrote:

Most people would list the columns, but if there is a really bizarre
constraint, with non-default opclasses, or an exclusion constraint, it's
probably been given a name that you could use.

What I find curious about the opclass thing is: when do you ever have
an opclass that has a different idea of equality than the default
opclass for the type? In other words, when is B-Tree strategy number 3
not actually '=' in practice, for *any* B-Tree opclass? Certainly, it
doesn't appear to be the case that it isn't so with any shipped
opclasses - the shipped non-default B-Tree opclasses only serve to
provide alternative notions of sort order, and never "equals".

Well, in theory you could build a case insensetive index on a text
column. You could argue that the column should have been defined as
citext in the first place, but it might not for various reasons.

Have a nice day,
--
Martijn van Oosterhout <kleptog@svana.org> http://svana.org/kleptog/

He who writes carelessly confesses thereby at the very outset that he does
not attach much importance to his own thoughts.

-- Arthur Schopenhauer

#214Peter Geoghegan
pg@heroku.com
In reply to: Martijn van Oosterhout (#213)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sat, Dec 20, 2014 at 2:16 AM, Martijn van Oosterhout
<kleptog@svana.org> wrote:

What I find curious about the opclass thing is: when do you ever have
an opclass that has a different idea of equality than the default
opclass for the type? In other words, when is B-Tree strategy number 3
not actually '=' in practice, for *any* B-Tree opclass? Certainly, it
doesn't appear to be the case that it isn't so with any shipped
opclasses - the shipped non-default B-Tree opclasses only serve to
provide alternative notions of sort order, and never "equals".

Well, in theory you could build a case insensetive index on a text
column. You could argue that the column should have been defined as
citext in the first place, but it might not for various reasons.

That generally works in other systems by having a case-insensitive
collation. I don't know if that implies that non bitwise identical
items can be equal according to the "equals" operator in those other
systems. There aren't too many examples of that happening in general
(I can only think of citext and numeric offhand), presumably because
it necessitates a normalization process (such as lower-casing in the
case of citext) within the hash opclass support function 1, a process
best avoided.

citext is an interesting precedent that supports my argument above,
because citext demonstrates that we preferred to create a new type
rather than a new non-default opclass (with a non-'=' "equals"
operator) when time came to introduce a new concept of "equals" (and
not merely a new, alternative sort order). Again, this is surely due
to the system dependency on the default B-Tree opclass for the
purposes of GROUP BY and DISTINCT, whose behavior sort ordering
doesn't necessarily enter into at all.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#215Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#210)
1 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Dec 18, 2014 at 9:31 AM, Peter Geoghegan <pg@heroku.com> wrote:

So I think there needs to be some kind of logic to de-recognize the table
alias "foo".

Once I rewrote the query to use TARGET and EXCLUDED correctly, I've put this
through an adaptation of my usual torture test, and it ran fine until
wraparound shutdown. I'll poke at it more later.

Oops. I agree with your diagnosis, and will circle around to fix that
bug in the next revision

Attached patch fixes the bug. I'm not delighted about the idea of
cutting off parent parse state (the parse state of the insert) within
transformUpdateStmt() only once we've used the parent state to
establish that this is a "speculative"/auxiliary update, but it's
probably the path of least resistance here.

When this is rolled into the next version, there will be a testcase.

Thanks
--
Peter Geoghegan

Attachments:

target_ref_bugfix.patchtext/x-patch; charset=US-ASCII; name=target_ref_bugfix.patchDownload
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index e037c0f..8c25e82 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -2006,6 +2006,16 @@ transformUpdateStmt(ParseState *pstate, UpdateStmt *stmt)
 		qry->hasModifyingCTE = pstate->p_hasModifyingCTE;
 	}
 
+	/*
+	 * Having established that this is a speculative insertion's auxiliary
+	 * update, do not allow the query to access parent parse state.  This is a
+	 * simple way of making parent RTEs invisible -- otherwise, the parent's
+	 * target could spuriously become visible were the query to reference the
+	 * original target table name rather than the TARGET.* alias.
+	 */
+	if (pstate->p_is_speculative)
+		pstate->parentParseState = NULL;
+
 	qry->resultRelation = setTargetTable(pstate, stmt->relation,
 								  interpretInhOption(stmt->relation->inhOpt),
 										 true,
#216Michael Paquier
michael.paquier@gmail.com
In reply to: Peter Geoghegan (#215)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sun, Dec 21, 2014 at 6:56 AM, Peter Geoghegan <pg@heroku.com> wrote:

On Thu, Dec 18, 2014 at 9:31 AM, Peter Geoghegan <pg@heroku.com> wrote:

So I think there needs to be some kind of logic to de-recognize the table
alias "foo".

Once I rewrote the query to use TARGET and EXCLUDED correctly, I've put this
through an adaptation of my usual torture test, and it ran fine until
wraparound shutdown. I'll poke at it more later.

Oops. I agree with your diagnosis, and will circle around to fix that
bug in the next revision

Attached patch fixes the bug. I'm not delighted about the idea of
cutting off parent parse state (the parse state of the insert) within
transformUpdateStmt() only once we've used the parent state to
establish that this is a "speculative"/auxiliary update, but it's
probably the path of least resistance here.

When this is rolled into the next version, there will be a testcase.

Looking at this thread, the last version of this patch is available here:
/messages/by-id/CAM3SWZRvkCKc=1Y6_Wn8mk97_Vi8+j-aX-RY-=msrJVU-Ec-qw@mail.gmail.com
And they do not apply correctly, so this patch needs a rebase.
Regards,
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#217Peter Geoghegan
pg@heroku.com
In reply to: Michael Paquier (#216)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sun, Dec 21, 2014 at 6:10 PM, Michael Paquier
<michael.paquier@gmail.com> wrote:

Looking at this thread, the last version of this patch is available here:
/messages/by-id/CAM3SWZRvkCKc=1Y6_Wn8mk97_Vi8+j-aX-RY-=msrJVU-Ec-qw@mail.gmail.com
And they do not apply correctly, so this patch needs a rebase.

That isn't so. The latest version is much more recent than that. It's
available here:

/messages/by-id/CAM3SWZQTqsCLZ1YJ1OuWFpO-GmFHwtgwTOg+o_NNzxrPa7Cx4A@mail.gmail.com

Everything is tracked in the commitfest app in detail.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#218Michael Paquier
michael.paquier@gmail.com
In reply to: Peter Geoghegan (#217)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 22, 2014 at 11:20 AM, Peter Geoghegan <pg@heroku.com> wrote:

On Sun, Dec 21, 2014 at 6:10 PM, Michael Paquier
<michael.paquier@gmail.com> wrote:

Looking at this thread, the last version of this patch is available here:
/messages/by-id/CAM3SWZRvkCKc=1Y6_Wn8mk97_Vi8+j-aX-RY-=msrJVU-Ec-qw@mail.gmail.com
And they do not apply correctly, so this patch needs a rebase.

That isn't so. The latest version is much more recent than that. It's
available here:

/messages/by-id/CAM3SWZQTqsCLZ1YJ1OuWFpO-GmFHwtgwTOg+o_NNzxrPa7Cx4A@mail.gmail.com

Everything is tracked in the commitfest app in detail.

Oops, sorry. I got mistaken because of the name of the latest attachments.
--
Michael

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#219Heikki Linnakangas
hlinnakangas@vmware.com
In reply to: Peter Geoghegan (#214)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On 12/20/2014 11:14 PM, Peter Geoghegan wrote:

On Sat, Dec 20, 2014 at 2:16 AM, Martijn van Oosterhout
<kleptog@svana.org> wrote:

What I find curious about the opclass thing is: when do you ever have
an opclass that has a different idea of equality than the default
opclass for the type? In other words, when is B-Tree strategy number 3
not actually '=' in practice, for *any* B-Tree opclass? Certainly, it
doesn't appear to be the case that it isn't so with any shipped
opclasses - the shipped non-default B-Tree opclasses only serve to
provide alternative notions of sort order, and never "equals".

Well, in theory you could build a case insensetive index on a text
column. You could argue that the column should have been defined as
citext in the first place, but it might not for various reasons.

That generally works in other systems by having a case-insensitive
collation. I don't know if that implies that non bitwise identical
items can be equal according to the "equals" operator in those other
systems. There aren't too many examples of that happening in general
(I can only think of citext and numeric offhand), presumably because
it necessitates a normalization process (such as lower-casing in the
case of citext) within the hash opclass support function 1, a process
best avoided.

citext is an interesting precedent that supports my argument above,
because citext demonstrates that we preferred to create a new type
rather than a new non-default opclass (with a non-'=' "equals"
operator) when time came to introduce a new concept of "equals" (and
not merely a new, alternative sort order). Again, this is surely due
to the system dependency on the default B-Tree opclass for the
purposes of GROUP BY and DISTINCT, whose behavior sort ordering
doesn't necessarily enter into at all.

Yeah, I don't expect it to happen very often. It's confusing to have
multiple definitions of equality.

There is one built-in example: the "record *= record" operator [1]See http://www.postgresql.org/docs/devel/static/functions-comparisons.html#ROW-WISE-COMPARISON. It's
quite special purpose, the docs even say that they "are not intended to
be generally useful for writing queries". But there they are.

I feel that it needs to be possible to specify the constraint
unambiguously in all cases. These are very rare use cases, but we should
have an escape hatch for the rare cases that need it.

What would it take to also support partial indexes?

[1]: See http://www.postgresql.org/docs/devel/static/functions-comparisons.html#ROW-WISE-COMPARISON
http://www.postgresql.org/docs/devel/static/functions-comparisons.html#ROW-WISE-COMPARISON

- Heikki

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#220Peter Geoghegan
pg@heroku.com
In reply to: Heikki Linnakangas (#219)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 22, 2014 at 1:24 PM, Heikki Linnakangas
<hlinnakangas@vmware.com> wrote:

I feel that it needs to be possible to specify the constraint unambiguously
in all cases. These are very rare use cases, but we should have an escape
hatch for the rare cases that need it.

What would it take to also support partial indexes?

Aside from considerations about how to pick them without using their
name, partial unique indexes aren't special at all. My earlier concern
was that we'd need to account for before row insert triggers that
change values out from under us. But maybe that concern was overblown,
come to think of it. I am already borrowing a little bit of the raw
parser's logic for CREATE INDEX statements for unique index inference
(during parse analysis) -- we're matching the cataloged index
definition attributes/expressions, so this makes a lot of sense. Maybe
I had the wrong idea about partial indexes earlier, which was that we
must use the values in the tuple proposed for insertion to check that
a partial index was a suitable arbiter of whether or not the UPDATE
path should be taken in respect of any given tuple. I should just go
further with borrowing things from CREATE INDEX, and give the user an
optional way of specifying a WHERE clause that is also matched in a
similar way to the expressions themselves. Did the partial unique
index your UPSERT implied not cover the ultimate tuple inserted after
before row insert triggers fired? That's on you as a user...you'll
always get an insert, since there won't be a would-be duplicate
violation to make there be an update.

I actually care about partial unique indexes a lot. They're a very
useful feature. Back when I was an application developer, I frequently
used "is_active" boolean columns to represent "logical app-level
deletion", where actually deleting the tuple was not possible (e.g.
because it may still be referenced in historic records), while not
wanting to have it be subject to uniqueness checks as a logically
deleted/!is_active tuple.

This measure to support partial indexes, plus the additional leeway
around non-default opclass unique indexes that I can add (that they
need only match the "equals" operator of the default opclass to be
accepted) brings us 99.9% of the way. That only leaves:

* An inability to specifying some subset of unique indexes or
exclusion constraints for the IGNORE variant (the UPDATE variant is
irrelevant).

* An inability to specifying a IGNORE arbitrating *exclusion
constraint* as the sole arbiter of whether or not the IGNORE path
should be taken. (exclusion constraints are not usable for the UPDATE
variant, so that's irrelevant again).

Did I forget something?

The use cases around these limitations are very rare, and only apply
to the IGNORE variant which seems much less interesting. I'm quite
comfortable dealing with them in a later release of PostgreSQL, to cut
scope (or avoid adding scope) for 9.5. Do you think that's okay? How
often will the IGNORE variant be used when everything shouldn't be
IGNOREd anyway? Although, to be totally fair, I should probably also
include:

* non-default B-tree opclasses cannot be specified as arbiters of the
alternative path (for both IGNORE and UPDATE variants) iff their
"equals" operator happens to not be the "equals" operator of the
default opclass (which is theoretical, and likely non-existent as a
use case).

If you're dead set on having an escape hatch, maybe we should just get
over it and add a way of specifying a unique index by name. As I said,
these under-served use cases are either exceedingly rare or entirely
theoretical.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#221Robert Haas
robertmhaas@gmail.com
In reply to: Peter Geoghegan (#220)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 22, 2014 at 5:04 PM, Peter Geoghegan <pg@heroku.com> wrote:

If you're dead set on having an escape hatch, maybe we should just get
over it and add a way of specifying a unique index by name. As I said,
these under-served use cases are either exceedingly rare or entirely
theoretical.

I'm decidedly unenthusiastic about that. People don't expect CREATE
INDEX CONCURRENTLY + DROP INDEX CONCURRENTLY to break their DML. I
think the solution in this case would be a gateway to problems larger
than the one we're trying to solve.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#222Peter Geoghegan
pg@heroku.com
In reply to: Robert Haas (#221)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Dec 23, 2014 at 5:46 AM, Robert Haas <robertmhaas@gmail.com> wrote:

On Mon, Dec 22, 2014 at 5:04 PM, Peter Geoghegan <pg@heroku.com> wrote:

If you're dead set on having an escape hatch, maybe we should just get
over it and add a way of specifying a unique index by name. As I said,
these under-served use cases are either exceedingly rare or entirely
theoretical.

I'm decidedly unenthusiastic about that. People don't expect CREATE
INDEX CONCURRENTLY + DROP INDEX CONCURRENTLY to break their DML. I
think the solution in this case would be a gateway to problems larger
than the one we're trying to solve.

I tend to agree. I think we should just live with the fact that not
every conceivable use case will be covered, at least initially. Then,
if an appreciable demand for even more flexibility emerges, we can
revisit this. We already have a syntax that is significantly more
flexible than the equivalent feature in any other system. Let's not
lose sight of that.

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#223Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#222)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Dec 23, 2014 at 11:30 AM, Peter Geoghegan <pg@heroku.com> wrote:

I tend to agree. I think we should just live with the fact that not
every conceivable use case will be covered, at least initially.

To be clear: I still think I should go and make the changes that will
make the feature play nice with all shipped non-default B-Tree
operator classes, and will make it work with partial unique indexes
[1]: /messages/by-id/CAM3SWZQdv7GDLwPRv7=rE-gG1QjLOOL3vCmAriCBcTYk8GwqKw@mail.gmail.com -- Peter Geoghegan
close to satisfying every conceivable use case.

[1]: /messages/by-id/CAM3SWZQdv7GDLwPRv7=rE-gG1QjLOOL3vCmAriCBcTYk8GwqKw@mail.gmail.com -- Peter Geoghegan
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#224Stephen Frost
sfrost@snowman.net
In reply to: Peter Geoghegan (#222)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

* Peter Geoghegan (pg@heroku.com) wrote:

On Tue, Dec 23, 2014 at 5:46 AM, Robert Haas <robertmhaas@gmail.com> wrote:

On Mon, Dec 22, 2014 at 5:04 PM, Peter Geoghegan <pg@heroku.com> wrote:

If you're dead set on having an escape hatch, maybe we should just get
over it and add a way of specifying a unique index by name. As I said,
these under-served use cases are either exceedingly rare or entirely
theoretical.

I'm decidedly unenthusiastic about that. People don't expect CREATE
INDEX CONCURRENTLY + DROP INDEX CONCURRENTLY to break their DML. I
think the solution in this case would be a gateway to problems larger
than the one we're trying to solve.

I tend to agree. I think we should just live with the fact that not
every conceivable use case will be covered, at least initially. Then,
if an appreciable demand for even more flexibility emerges, we can
revisit this. We already have a syntax that is significantly more
flexible than the equivalent feature in any other system. Let's not
lose sight of that.

+1

Thanks,

Stephen

#225Peter Geoghegan
pg@heroku.com
In reply to: Jeff Janes (#209)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Thu, Dec 18, 2014 at 9:20 AM, Jeff Janes <jeff.janes@gmail.com> wrote:

I've put this through an adaptation of my usual torture test, and it ran
fine until wraparound shutdown. I'll poke at it more later.

Could you elaborate, please? What are the details of the torture test
you're performing?

--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#226Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#212)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Dec 19, 2014 at 5:32 PM, Peter Geoghegan <pg@heroku.com> wrote:

Most people would list the columns, but if there is a really bizarre
constraint, with non-default opclasses, or an exclusion constraint, it's
probably been given a name that you could use.

What I find curious about the opclass thing is: when do you ever have
an opclass that has a different idea of equality than the default
opclass for the type? In other words, when is B-Tree strategy number 3
not actually '=' in practice, for *any* B-Tree opclass? Certainly, it
doesn't appear to be the case that it isn't so with any shipped
opclasses - the shipped non-default B-Tree opclasses only serve to
provide alternative notions of sort order, and never "equals".

I think that with B-Tree (which is particularly relevant for the
UPDATE variant), it ought to be defined to work with the type's
default opclass "equals" operator, just like GROUP BY and DISTINCT.
Non-default opclass unique indexes work just as well in practice,
unless someone somewhere happens to create an oddball one that doesn't
use '=' as its "equals" operator (while also having '=' as the default
opclass "equals" operator). I am not aware that that leaves any
actually shipped opclass out (and I include our external extension
ecosystem here, although I might be wrong about that part).

So looking at the way the system deals with its dependence on default
operator classes, I have a hard time justifying all this extra
overhead for the common case. The optimizer will refuse to use an
index with a non-default opclass even when AFAICT there is no *real*
semantic dependence on anything other than the "equals" operator,
which seems to always match across a type's opclasses anyway. e.g.,
DISTINCT will only use a non-default opclass B-Tree index, even though
in practice the "equals" operator always matches for shipped
non-default opclasses; DISTINCT will not work with a text_pattern_ops
index, while it will work with a default text B-Tree opclass index,
*even though no corresponding "ORDER BY" was given*.

Someone recently pointed out in a dedicated thread that the system
isn't all that bright about exploiting the fact that group aggregates
don't necessarily need to care about facets of sort ordering like
collations, which have additional overhead [1]/messages/by-id/CAFjtmHU3Obf5aSpWY7i18diapvjg-418hYySdqUuYhXZtjChhg@mail.gmail.com. That might be a useful
special case to target (to make underlying sorts faster), but the big
picture is that the system doesn't know when it only needs to care
about an "equals" operator matching some particular
B-Tree-opclass-defined notion of sorting, rather than caring about a
variety of operators matching. Sometimes, having a matching "equals"
operator of some non-default opclass is good enough to make an index
(or sort scheme) of that opclass usable for some purpose that only
involves equality, and not sort order (like DISTINCT, with no ORDER
BY, executed using a GroupAggregate, for example).

I thought we should formalize the idea that a non-default opclass must
have the same notion of equality (the same "equals" operator) as its
corresponding default opclass, if any. That way, presumably the
optimizer has license to be clever about only caring about
"DISTINCTness"/equality. That also gives my implementation license to
not care about which operator class a unique index uses -- it must not
matter.

Heikki pointed out that there is one shipped opclass that has an
"equals" operator that happens to not be spelt "=" [2]/messages/by-id/54988BF5.9000405@vmware.com -- Peter Geoghegan (and
furthermore, does not match that of the default opclass). That's the
record_image_ops opclass, which unusually has an "equals" operator of
"*=". So as Heikki pointed out, it looks like there is some limited
precedent for having to worry about B-Tree opclasses that introduce
alternative notions of "equals", rather than merely alternative
notions of sort order. So so much for formalizing that all of a type's
B-Tree opclass "equals" operators must match...

...having thought about it for a while more, though, I think we should
*still* ignore opclass for the purposes of unique index inference. The
implementation doesn't care about the fact that you used a non-default
opclass. Sure, in theory that could lead to inconsistencies, if there
was multiple unique indexes of multiple opclasses that just so
happened to have incompatible ideas about equality, but that seems
ludicrous...we have only one extremely narrow example of how that
could happen. Plus there'd have to be *both* unique indexes defined
and available for us to infer as appropriate, before the inference
logic could accidentally infer the wrong idea of equality. That seems
like an extremely implausible scenario. Even if we allow for the idea
that alternative notions of equality are something that will happen in
the wild, obviously the user cares about the definition of equality
that they actually used for the unique index in question.

We can document that unique index inference doesn't care about
opclasses (recall that I still only plan on letting users infer a
B-Tree unique index), which is thought to almost certainly not matter.
I think that ought to be fine. In the next revision of UPSERT, the
implementation formally won't care about the opclass of an index when
inferring a unique index to use as an arbiter of whether to take the
alternative IGNORE/UPDATE path. That's formally left undefined.

As already discussed before, I will still proceed with allowing the
user to pick a partial unique index when writing a unique index
inference specification.

[1]: /messages/by-id/CAFjtmHU3Obf5aSpWY7i18diapvjg-418hYySdqUuYhXZtjChhg@mail.gmail.com
[2]: /messages/by-id/54988BF5.9000405@vmware.com -- Peter Geoghegan
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#227Jeff Janes
jeff.janes@gmail.com
In reply to: Peter Geoghegan (#225)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Tue, Dec 23, 2014 at 11:55 AM, Peter Geoghegan <pg@heroku.com> wrote:

On Thu, Dec 18, 2014 at 9:20 AM, Jeff Janes <jeff.janes@gmail.com> wrote:

I've put this through an adaptation of my usual torture test, and it ran
fine until wraparound shutdown. I'll poke at it more later.

Could you elaborate, please? What are the details of the torture test
you're performing?

I've uploaded it here.

https://drive.google.com/folderview?id=0Bzqrh1SO9FcEZ3plX0l5RWNXd00&amp;usp=sharing

The gist of it is that I increment a count column of a random row (via pk)
in multiple connections simultaneously.

When the server crashes, or it gets to a certain number of increments, the
threads report their activity up to the parent, which then waits for
automatic recovery and compares the state of the database to the reported
state of the children threads.

That is for my original code. For this purpose, I made the count go either
up or down randomly, and when a row's count passes through zero it gets
deleted. Then when it is chosen for increment/decrement again, it has to
be inserted. I've made this happen either through a
update-or-insert-or-retry loop (two variants) or by using your new syntax.

There is a patch which adds a simulation for a torn-page-write followed by
a crash, and also adds some elogs that I've sometimes found useful for
tracking down problems, with new GUCs to control them.

I don't think you made changes to the WAL/recovery routines, so I don't
expect crashing recovery to be a big hazard for your patch, but I wanted to
run a test where I was generally familiar with the framework, and thought
an independently derived test might exercise some new aspects.

The one thing I noticed is that using your syntax starts out slightly
slower than the retry loop, but then gets much slower (down by 2 or 3
times) after a while. It might be a vacuuming issue. The constant
intentional crashes interferes with good vacuuming behavior, and I need to
retest this with the intentional crashes turned off to see if that fixes
it. I'm having difficult access to my usual testing hardware over the
holidays, so I'm not getting as much done as I hoped.

I'll try to look at your own stress tests on github as well.

Cheers,

Jeff

#228Peter Geoghegan
pg@heroku.com
In reply to: Jeff Janes (#227)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sat, Dec 27, 2014 at 11:48 AM, Jeff Janes <jeff.janes@gmail.com> wrote:

Could you elaborate, please? What are the details of the torture test
you're performing?

The gist of it is that I increment a count column of a random row (via pk)
in multiple connections simultaneously.

This is great. In general, I strongly believe that we should be doing
this kind of thing more formally and more frequently. Thanks!

That is for my original code. For this purpose, I made the count go either
up or down randomly, and when a row's count passes through zero it gets
deleted. Then when it is chosen for increment/decrement again, it has to be
inserted. I've made this happen either through a update-or-insert-or-retry
loop (two variants) or by using your new syntax.

Did you continue to limit your investigation to value locking approach
#1? I think that #2 is the more likely candidate for commit, that we
should focus on. However, #1 is more "conceptually pure", and is
therefore an interesting basis of comparison with #2 when doing this
kind of testing.

There is a patch which adds a simulation for a torn-page-write followed by a
crash, and also adds some elogs that I've sometimes found useful for
tracking down problems, with new GUCs to control them.

Cool.

I don't think you made changes to the WAL/recovery routines, so I don't
expect crashing recovery to be a big hazard for your patch, but I wanted to
run a test where I was generally familiar with the framework, and thought an
independently derived test might exercise some new aspects.

Value locking approach #2 does touch crash recovery. Value locking
approach #1 does not.

I certainly see the logic in starting with independently derived
tests. We all have our blind spots.

The one thing I noticed is that using your syntax starts out slightly slower
than the retry loop, but then gets much slower (down by 2 or 3 times) after
a while. It might be a vacuuming issue.

Interesting. I'd like to compare both approaches to value locking here.

I'll try to look at your own stress tests on github as well.

Would you be opposed to merging your custom stress-test suite into my
git repo? I'll give you the ability to push to it.

I can help you out if you think you'd benefit from access to my
Quad-core server (Intel Core i7-4770) for stress-testing. I'll
coordinate with you about it privately.
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#229Peter Geoghegan
pg@heroku.com
In reply to: Peter Geoghegan (#226)
2 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Fri, Dec 26, 2014 at 4:22 PM, Peter Geoghegan <pg@heroku.com> wrote:

So looking at the way the system deals with its dependence on default
operator classes, I have a hard time justifying all this extra
overhead for the common case.

Attached pair of revised patch sets, V1.8:

* Explicitly leaves undefined what happens when a non-default opclass
index *with an alternative notion of not just sort order, but
equality* exists. In practice it depends on the available unique
indexes. I really found it impossible to justify imposing any
restriction here, given the total lack of a scenario in which this
even *could* matter, let alone will. This is a minor wart, but I think
it's acceptable.

* Allows "unique index inference specification" clause to have a WHERE
clause (this is distinct from the WHERE clause that might also appear
in the UPDATE auxiliary query). This can be used to infer partial
unique indexes. I really didn't want to give up support for partial
indexes with the UPDATE variant (recall that the UPDATE variant
*requires* an inference clause), since partial unique indexes are
particularly useful.

Note that the unique index must actually cover the tuple at insert
time, or an error is raised. An example of this that appears in the
regression tests is:

insert into insertconflicttest values (23, 'Uncovered by Index') on
conflict (key where fruit like '%berry') ignore;
ERROR: partial arbiter unique index has predicate that does not cover
tuple proposed for insertion
DETAIL: ON CONFLICT inference clause implies that the tuple proposed
for insertion actually be covered by partial predicate for index
"partial_key_index".
HINT: ON CONFLICT inference clause must infer a unique index that
covers the final tuple, after BEFORE ROW INSERT triggers fire.

* New documentation reflecting the above. A couple of paragraphs in
the INSERT SQL reference page now covers these topics.

* Fix Jeff Jane's bug by added sanitizing code [1]http://archives.postgresql.org/message-id/CAM3SWZT=HptrGyihZiyT39sPBhp+CXOTW=MhNFzXiLf-Jh4QVA@mail.gmail.com -- Peter Geoghegan. Certain illegal
queries now correctly rejected during parse analysis.

* Fixed another tiny buglet in EXPLAIN ANALYZE output with a RETURNING
clause, by making sure auxiliary query plan from update also has
plan-level targetlist set.

* Minor clean-up to code comments here and there (in particular, for
the ExcludedExpr primnode used to implement the EXCLUDED.*
pseudo-alias thing).

* Better serialization failure error messages.

I recommend looking at my mirror of the modified documentation:
http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/on-conflict-docs/sql-insert.html
to get up to speed on how unique index inference specification clause
have been extended to support partial unique indexes. As I mentioned,
apart from that, the INSERT SQL reference page now covers the
definition of a "CONFLICT"/opclass semantics issues.

I really hope that this deals with all semantics/syntax related loose
ends, allowing discussion of this patch to take a more low-level
focus, which is what is really needed. I feel that further
improvements may be possible, and that the syntax can be even more
flexible, but it's already flexible enough for our first iteration of
this feature. Importantly, we have something that is enormously more
flexible than any equivalent feature in any other system, which
includes the flexibility to extend the syntax in various other
directions (e.g. specifying particular exclusion constraints).

[1]: http://archives.postgresql.org/message-id/CAM3SWZT=HptrGyihZiyT39sPBhp+CXOTW=MhNFzXiLf-Jh4QVA@mail.gmail.com -- Peter Geoghegan
--
Peter Geoghegan

Attachments:

v1.8.vallock1.tar.gzapplication/x-gzip; name=v1.8.vallock1.tar.gzDownload
����T�\ks����W�WL����H���J�������++�n��R���D������3�!	����U[uU�%�3=�~�>3�`0�^�[��R�i/��2HC�������/.����g�|��_GG�}x|8���'����������`0<�~2���<�_����\�O��������_/�l�N������p������'�$8����Dz<�����h�C��7z���j08����l��3�Z�:W��l:�� U_.���t����a6��6(���YG]5�����jxx�?<�?V���`�zS��ay���������Gy���y*1OE��j=�"�T������o�J�

Uf�n��G9��*0�y<��j�j��N#��6��k���c��Yv����
�8�
B�we�h�����������o~������������z���J�y���Py:�+um����DZcB���y����R��$({�8�����w��a���7�B��?^�_+��w���a�����^-�*��7]��I'�%�q��5�<.�;&UQ������3�k�U�UP�Y�
gA���~�E�f��t���[P,*�,T��8���r����[M@s�6e���$�{c4U� �\&jN{gF)0L�Z��������6�]��,�2���?'�[�oa�Fq�-T]
��x���r�y���s��~^�9���t���16�F������V���y�A��!9Y+s0{�=����%I+���`�XC;�k6�oi�4SX|���hB����[����P���Iv�d5�AQ��� N���DJr)�
dBM-���*����N@q�LM�����`�A�dc�2x�in2�kF;S��UY��
��,���G�S�@���	"�������i����Z����qb^��"�����F�[��P�_��S��X�	�b����>�N��\�?���P�>��6�����Q�������yK��LaVw
��a2�^����b��H��� ��������a��0�]~�0-j[��+m�U��H���/����N'0����U���`�X[U{���"�hy���ZQ<� qLc����?~_D�H�S�IL�����8�j�sp@6��QZX�#}������c�K�N���b��������_S�7%<]�,
��U�S�"�wZj_��)���TQ�?I{�$u�h)i�����{�gq�hO�)���.������k��G�E,��_d������3.~�\zO�,d����WFWD����/_�b��x��"�+���������l�H���"DE��u�!� }ew�ZV��+�������)cCe�H����2���
��Y|5����'-L|=��h���#=<��W#�=���"+����x�Fs������3*X��F["�vH�(��vug�Ey����Q�R��O�������S�i�Q3J�IQ-D����.��JQ{���B���m���Q���m���q��W�l�����	��>�����xx����l�>>9<9��� �z��yr�cD^K6�����������/�����N�Mw|����=m���*)
z�7��� ���7�.��cqk-��"(��>�I�4�C���S2��ty�Z��M�����8y��;�M�7��3��bB��jGU*2^T��v�C�@��B��-�~,�ni.�Po��l��h,�{(��'I{�]�b��,�Z��nxFN���m3�F�y*j+���<����J����M��S�k����%[��WU�3�k�*�����)Y��q8�T�cq���1�.JK����^2KE.��lX��A���.q�;v���f�x���m�Z�����?�����t�j���g�I�N��� ��� BM� ��P��l�L������0��h��Eq�����$:5�v��kH��v�[S�aW�[��6��S;��h�6ke�_6�G�����)�*!�Jh
��'n�������i��Y3�����Llq��B�v#�_z��8"�dv���i��VSx��_X�5Z�����5a"�,����2�#�������R?�[G � |��!�ARagDp9�U�����V$�FB�?'e@f����|K#�&Ifz,rk�t���*�r�;���a(�.���Nhv�s|�.h|���c�Z�rQ�Djj����~�[�p,�����&��(����V��i� �	�Pr��K�
F�IC�c��6�&��X�����!�EvX�[��Y��+�Qu�g�q�4����Yv�fG��M�����������l���0�Aro��j���*���-��&X�-���n�mg��6`U�,,��P�AQda�E&o '�2:������t��'�?�Ya��tB8��DB�oM���D�O�(�[�{O��Q�M�H�P��4��~�����R�Rmb@�iD��o�qw8�9vG���h�,�
����	�R�@�4��ta�e]0��A �I��H	cQvd��0^z��3�N"��B��AY&�,��qd�rJ�s�6��$���8����HPILu����E������q�W
��`y57���9`����M�0F�Q��*��?�=d�d��@��Si�&�����
;`���/����F"L�Es�C�����UJ`�A�|B��@v��>(i�X��4b����Psg{���q
DV���fb�)P������h:��l�t�A*fIaB�,�|!��R"� �%���� ��,�-����@X ��MA�3�!���a�������Jm���z��,>G]Q������E�s!����W������[�uS_(nI�V��]]*o�YW��
���A�#D���J(0R��*�1���I<|!����;{�Q��X�R��X�'�����`���<#�A��N)4�D�s��0���
'%��������������u�o��;Muy���8���
����
g8�zD���[}@�����Y��d��x6������J��Z`�w`F��S�}�)]����%*�,:��)Y�/)����@u���hL��	jcO�XAQ,g�Y�j�2Uq�U[��	�C�CzO5sF��m�K}���e��A&���a�ke�qw����[k�HA����@7�ZCe�@j.Na�A-�������UW�������������:��eZ��z�D������L0<�[�i:�mK��P��Q�W������A�X�ZT�y���l��e�4�Z�Ogs�a�K��h�:��u=�,�i�
�6>	��J��c�SK�R|�����w-��D������i������p��t�)����,���P��t{�������	gy<�9B����$�2�RTcm7��iG����f���U�|�l��b�x�v:_r���~7J'����C������L�1�g�.�F�C��� ����K�r��,�1�0�r'���@�*���7G[�A@���\����D�e�1lwn'�>�
��6�r���sX$��*��-����7c��G?�+�����q����.:X����{���Q��[\KFz�	��f�(�l���>'���9*�����>��Z�/
_*gDH�
�]vR��"��d���c*�u���Y=��)�L��Q��(4ni"�|-�Ib�
�O�Ob��t���j�����d�e�t�9Y����V0����:Kx�N��s���>��l���]p�b))���w9��k�?>�R���B����5���cYZ�#kF��W��1�[��������~,i��<���1���*6��F^�#���?�1����"�g�������Aj���f�F��O��0>&#C\�&��E^���D?�}���4�st���Y�.��t6i:���z�o�X{�a��.���?R�����l�������D��vrJ�l��t��K����������kv��t������WB�(������2�91 `�s)7����-.(�����[�r8��i�n�<� ���j�d���T������,j�X2|}R%�C��bxj�d��@u������8�� ��]-�
�~(�cY��[��k�P�J��Dl.�� �h��$�+�Og:Y�%��s_$��Tq���]���%�kv�R�%\�Z������K���twe�C7��%�������\M3+B(Y+�.��^��'D!���tUt�d��n.3����KR�[O���b���v�V�E���	��O���������${u-��L��rV�u�)���l��y���`�(T�$�z�x�r��"2U�+�zM�9�y
��V?Z�p^�����9��AU�����������5v���4K{��c�i���O����D�����%���<h��g���Q�:\%��2-BL�����k;�:|QX�>�\YfAR��z�a>%��������-[a�`���<��'E�m/n��W��r[��/��<�"�l�
����Q��X����x�����|0�e�'D��������P|S|�����^���M�Z4��"#N
"���$*�ZM�.l�$�Zy_�z��C^��&j�ZM2���7T'�?�B�9r���^���8N�������N�l��"�+����S^~S�{3d�!�qo�u�^_C���'1�����L�����{��
����[
[�\�������k��m�����"�w���R�u����N]^�d��{H^;�>��C�a��{�am���6v�eGx���v�/��{����e����-�p�1<n���E!6�}w:�������yQ��k��h�;w*��o��|=�F3'�Z{�_�L�`):7�'�WU�T�{;!�����p��2�J��q0��*��2=�$���c�;��k%s�m�5�;d�^�{��m3���u<M�[Mgrr����ry������(�5S>1�B��l4����A'�s�@P�p�����G��M.�M�D��-$sm�$&-���&��XJ^��ph�a������r�s�sF]��z;���}��rm�����\��Q�	gdY%1�����:�<re�r�����
L>0NJH�vI�
���$W�����mg�y}�y�_�s?�E�J���7�~SO�YA/���'j��G��Pq?��q�hk�$�!��r�������s?��iB:B1q�B���E�������G�/�+}A�nW��,�h�3���3���A.��4'��sTKC���\��|��/$U�9]W��Pk�n�rR~jof���=5rw	7��1\���X��V&rjtr4�������a�x@�_(n`/��)9��9	O��o������Z'�`�vr8��!w]�)sV���ef����(�Y�&*�F1c���%rR������q�*$��9t*A����q��PL��J������ z�p�^_((t�#�]/�Wl��c����.6o��������n�\���
�e�`L/!��\,���_}��L�s�`�M����`p�^Y�T$�fT��������_={��V}��^���t���V����kc,�����{�
����m]>+��u����	���^9����
�H�>��b��3jV���a��f��� z� �;V�M�A��� ��`=�(_���Yyv�7X?��E�o�X4k_f�1�����
9R�R�"���������SV�.R����{�oD*��".f��Ss�U�	:����f}*g^Q�'��������� |+�hl8_�5�&`1x�������Z�I��_Y�77�G]P��Y�c��W���S��F��?���w��]��������u��84wLHP��&���V=tn�"��������l����A G}M}i���kw��?��4�����w9����+���XUXAn��������	]�t�n4�gj`&�y���� ��%�����E,l�MZ�����)�m	���������2jZ1�{�D�S����t��S��4�Z�Cb�]#H^(s:��$��H��A�7i�*w7�mR��\����S�Ys��[�t[R��K~�ML|���g��P�YE����������7�����-����������v���y�}q�/���Rm�Z��ym9��e���H��Q8����!yf$#d$q�3��A����
x.'����Z����j���������K]�[�����d�c����.�V�Z�����L�G�cJ$h�t���w�(��\`�.�]Y�M����R�������%���U*V�Gh�/�������tW)%a�����vrX��w�v{{�����S[�W��C
[6���a�y������IO���wK����)����z������It}sq��Y����V:0s�TG�H�~on`)�����$ACa�=�P#��������UY"J�sCQ5������Y������7�������Y�<"�������<�Y��5����5*AL4�{M~J�����O+�G��'G7Gh����]�t��O
6#y�'��I��h"��"��
�G��m�������4��XP���+�<�����n��J)�
�����a�^�����^q+,k�m�e%)�������
����zP�h~���O����4*�\��#�9oRuJ�������x���1u��6NC�&"�� {��3+9�A�N�&����[[2��d1��io6��
>&�������95�NE�a�a�<
�G�����]/j~m���%!�������	;��D�;�^������7mt��f*�T�kk^��|��|c�'DF�>!�z�Z�B��L!�����e~�$'����LF��d�C,x:_;�p������������9������#����]25����]Y/��]��pL����??L��gmR�����G8���F��~l�W����,;���k�S���_ U~iM��wq5E�� \w�������~c�^�m���n���Zk���V�b�Z������7I����K�4��Q�+4��V���H9��v�$��
�oV�#�R��xE�i�6��
��!���U�2��������4�V�7�3F�F��u
:��y���f������NI!����/����t���k�(��&���2�e4h�g~�d�9���E)j�*������Gf�fk����CW�^��a������
�
�s�P�p���+S�b:J33h����A�����������\�������v�q�S�7����vU�c�Y�plA29����������(]�0L�	�l#NU��zl��i��/�9�
�����k&��6���M����'�l���X��9M"2�:b�������
������#@���M9\���A������ M ������!����z��?C���>ug�T�����2��Qk������s��yg�G��}�B/��;��P�_��l��e�����L�����=�WS����
�����C&cR
F�t6pz���aT���{������d`'��Y8;��=�
O�]�����P���0��y�:���O/ ���)��o������ �(,��n��#��&�o����	��\�������W�o�
���ua���Y�I�c�[\������P���snV���qu*����W�+�VtRG#�Ds@}L���]�6���6l?� K� ��yh�"�_�#��� ��3�q��#n�+rv7Q����LiH-����������|�}��`F���.9���"�7�F��^������ew���9b@P�N��}:P	��<a�j:F&j����Es���\g��g�	Dx��e�kc{�A����x�{%�+EVt��a�Y��y�#z�q����O���Z����K�g
b��_����;�������3�1��a�K��\�i�V��������h��������i���v[.O�l=L�O�01��RA�7�}n��_��n��g��Z��i������O�����l���v�����?���3���O���Fc�`��n�u�o�v�����w�{�I28�:��nf�_����-�j6^5^�lG[����OQ����E ��I4r$)�2e���A5������(w5�`��L�~��M:�7�4�&�>I�1R�x�IH6�<��IJ���[#��U[WgI��d���S+Y����1����#�I<���Gn�$rg�� 01S����?'�ch����+�}V����`�	X���YG:e����_�:X��=������IAs�'�� S�����iz���;(��)��
�e�k]����3T������5FR����%�|�N^������C������xDa��qefy�7��ln7}%��T�S�B��`��Q�$��}�������������� �Q���j�g=���f`�����E���R�A�*�4��)���z22]�Q+ ��a��@�E~'3�)�fF�p!�q�<J�=��;����~W�3��f&Ie�w
�(M���L73���S�F	��V�I�U!�q���/-�H��$���j3�K�z��F33��}�%X�z�r6mm������x�dJ�U������*����#���v��	U�#��M�'3�51{�T7U�o3?%���Ca�JH�T�9������HJ�c�,��U�m����u
+O�G3�D����C-�����y����6�V8��X�%�:<���2'��9��{�����<��n�������vwAn�|��oY���-��6��yp2>6/�����	!N������M�)j��#���^<L��6I�������l�(�_?&�C�[�G�K��������O����! ,��Y'��;�	�V
Eq��z����	��k�"��������m�E��~_�.���r�������n�i�c/�[�����kc��R���L�����b89���O�����9���Q�~J����m1~��f$��ab��H1��T�X?�cf�	<L 8�+��x-wxx��#W�8��i����#�����&���*P��%�,H��-���I�,��3�|��a<FpI�l��9kmQ%�^�H:�z+����+�kbM�B�=�<M��	���5�(�v`���^�}t���>�8�\�/�<vtC�_��;W��N�_#hq��|�]�_6�$V���#p����T����7]{�t�EO�#��t��������{G�p ^�\�I(�WChf�:��\�+��j3�8G�S�t-�H����C!�}��4X]������c�`���`f���S3�gpgr�������3"���x<2�`*�y3~���1�<�O���?���������}��<�nxs����J[��u#�V�N�h)�W������!�[���8E���trqP2c����
���Xk����7���g.�u�[}�t���K��v8��)j����U~�7rM�~�Y=l���O���/�U�TDb�Op<�CW8�Gx&_��?%m���_�SS6�T#se"F�����3�fJ��ZE@�/Y����qF�z86��s���u�S)�j��/��O�b�C	�*EJKt5!�W�����D����c
`�GF��	���	���b��{�c�$���6�����c��Vd.���~��5se>i��9�����9�yt��S�W��G2�)M{��Z0�*���p�]��-[���Pc!�+5����)(��\U��$!/D�8����t�f�8u��A��c��#�'	=s��|�|Rvi�.+!�Ao����������~�7��6�"JY)�QZ{�&���O��PcW�P�z@"S�=�&�Dif������n:?Q^Z����WGFy�e��KG�P�$�s�O�(�KIC�~8��)��Tb����i�fS^M}�}���>p�>k��t
�R����-x�	/k�z��&h�K��L>C
M����?!���"nkQWjF|	�4q3\�
��	�5�V��O�uU��f�
b�9�'.z{qeu�P��
��
��dDP�+�ej
����O��K��l����x�������������P��w���xa�Lx�"9v,�|U���f��M8�	��:���G����J0�������\�I�o(�
�'�Hf�4���j+8s��b>F�����)X�F?X���~<��1�k����yc<��|Z���IT��� �zpV�hs�6^K~�CN�}X�i>���z��<w��JS/�����9���:o�=�2�dH��������x�y�Vg:,�/�]_�t6�����<lg�c�7�^���]%�������s�V�R�n_q�z�)nv�%{u������`�\��U���4�[HC�<�z|�l��D�b�%����G�������@>��2�oT�]U���l�P���
�p����r�����������������z}wo��}��/[(���2tI�n�%	?II�A�0��m9��z�h�����������U��i���hz��P,C�r�}�X�%��w���B��8;���RZ*�;���y���9� �GlU��,��n3I�+�x����|X�D~���N�8����f���o-��41��B�����(l9�
���(����������HJ����@*�K���`	��,��[�l�
XJ3���l%�kU�����`�^?��t�w�����<j���l��+���bJ����CR�d��
A� ���No���,0�@��������K)��X�.�����X�&��"��}�I�%�l���z���A��c�`{p�}������_�����I?�P$$X��W�����L%��1�^����
+\Z�������K��lx*srq��,��-v���^VH������������Ak�9��V$����4t���<��CGKup�d��a<27Q����Zt�;b
s(K^������G'��H|^��e��Z���
�A���U8������p��yk�q�'S��w@n��B����u��m��X��3&�L�f�f����!�zn.}�Y����p5~|����
�R`�+p&i�aNy�6T����@
jp� � ��u�������J�Os���=�<�H&�KXj�����H6e)a�"a�'���=s���Q�t�2�.�����rV�;h��gn�l����i�L��\���~������#��m����w9�\H�s����3?b��K������B�����ab������Vw>�(�l�u�������F���#�U��^����������/�'3[��E���hH��~%��P�������("|��3����h]S��R'��mv�����ip�������uC��C]Z ��8�xrm�ze�������������J�:�/��������%��� n���he�����y.���)_J�������������^�_ ��kg�.��@R�5�IB��f���#k����%�������YJ��~2�gC����JF�E�"ye���PV!Ip�}���O����h�Z��aYMA}M)�s�S���E����7�������
3~��������u�����^>��gL���7vv�L�[q9��),���m��6v�S�!���M�>�������L�?�J�3}%��'��w�����$��<{s����M����~!���4���F�p7�[����PQ��[���6��I�p��0|�J��)��
������I��I����oZU��)M5�
�{�����`������;��_6��N`��k�t8��G~����a��ln��(e����z��_6\��#���S����WzsD��(�"n�M���;�����?��7��yy������j�#�lM
�j�3{
�5�w�1?wj�HMv4�C2MI�:p����%�����Z�����C���*����#���	#�0���T�������K���h�<o�UR��vK��:�R�U3�
�]�,X���$	�(*/x*�MiC��r�����	�,����Z�s,~J(u.�|I�mwI9�;�^k�^��������%M��K
Q<l�L��A�W�*��P�z���6||+NZ�q���"�=���U[���)�v�-���8NMx�����qT��cP��c�hE|�hk��<�����uY�����Y��[~S/����6|&_�Di7�5(�8?�op�`��Q7���uBy�c"��Km�.���f���vsK�(�O}��|K]������U��?�7����6����=�����n���o������3�n������A�78h����i6Z�A��[{�n��t[_��g��5��Oc��v�U�9��	���!��^�G>H�_5�0b:�]�X�)#���(u{C�M��Yt�����g�����"�<�3�
{:s����I����O��L�G�d>T����I<1��#F�$i���8�"�b|G��������na�9�%N����	��!���'W����7o�LOm��i�M��C�K��rh
���c�QX��O�����L�o��<Y��p��wHNC[7��#c�9��oxd�se��e�B
���Y�\�������P5��ACa0c�CDX���g�2�����}�x0���N�B��-E����0��Dr��1�#pK����V`�l���(�^�L(V�k$d�#�x��43�%���$�i��	��z��	+C1����.e�L3C�O@�E��I���-����f{1�gz��:�!�2		R�j@q!��n�I�K����pn�s���+�&hDL5^��K6�f����������\�S�/�X��:jX]X&)�aF�_��z�g^/�����:!,4gwD�G�n��J�7NMHi���2D���8�O�*�h\�V���s:Lcsuz0u=�������Oon�'f
�r�"��	I/S��!�&`x7i����		9�����$B��]����8�FF��O	��>��0�u��>���]oD�l�Ki�9�1���vQ���r�u����&Qf��
�����������f&��1*>��2�?��`H��0^�_����R\G���fq�L��u���s!
�Ld�5�{�5;��X����8Tt��D�Kf{}��G>9;�r����=�G���2��0v����D��2s q��9��,��'������.P�F�������O�$��g�� ����G�������p��M�~��D�w���)g%���F/�8��TPMG��Q��h��%f�R�;�Us�����V�?:��1���]�O��N3o
X�'���b;$�G����i�������)~��B��'�"�Q+�
kn���p������:��w����1_.#'4�	%�w���S�#^~��,�zWvME���|�a���eVF�V� j��v�c7�xE�?�p��!C�Q���x�y��O��1tu��2���('"���u�����a�k��w�~�3>�w[�jk"Y��FS���pBH��'�����/���1��|H/8
&F���'P���V�LL���;:�qr%Dt��m�d�s����(7��1�d�g�}���U�L�^7=%$~=����XK,�E�4�m�g����\]��0�#�:f\�M�����&%��O�$�%]�,�a��"�bF�r
����m���a��mq�=��"�pH����H�A4���x�N��,f����!���������w��u#��"���$��g0��p3m��#��9v�K��flM�L4$8A8Up��w�v_
��a�J1`�mz�����A��e?!mY����}B�+���Q�,l��X����"�$��^B����b=�����������I��[��o�~�d8����.����+�C��k4�@X�Q��%`���"�������Y��2�4����t���w�^t!�h$���;�&���h����~T\��P��n�Q�jP�����f+X��@��Y���j�X���:jz'�_�|��0Gf�BF�h�������95�������Ss��������<�UWq'_�s�7���g�����E_W���BM���"�Wsht#I@=��0�5Y *2������j�ypPD�mw_����6��	�v^Ed������?�l�
�,�Zm���,��R�vbx�SYE���|`\���o�2�Ej)���^K��:����
L�9��nm�
�QM��[����~��]o�su��*�a����>����Y��[T����r��^�_J�

�"�Z	�p����W���������m�����Sx^_CV6�bcAE����ZX��"|j�5C$�f��#.	�����������"'(_mv��p*
��W���9�����n�������7��sk(���as������Z���q��m�����8�������������1�a*�Y����KH�����N1\��@V� ���a���mQ����*�o����/��j��H��vty�����T�5.��D��z�I��LPf^����P;QQ������X���O���L���Wg��3v�����W�t;����V��w�'�6�� �%�����ewg;!i
��svBy9�//Dn.;��������7Z5���;��	�w=�f$��/�|��1�^C.F�-�����3��.�D���4H9X��4��k$�~O2A*k�������$�����6!���Nz���\����r9���������iSX3^W��P���������M��������dD}+���&|�<k�78{��t���!����v=i#u31
�b ��"���Y�[��J���r:�9�",������a�W����d{�-�kg�>��� �=�9I?)S�*��%4�W���l���#w��������Z���f-�)������pe�"��#����_�D���`�
0}����7��u�GO�R��/�c�0D	�mD���'~1xb�� ���<�5��d<�y�;@3�QN�Yd��:��]i���kV�cL����YB�c� ���u%�Lz����c�Ri�|  �����������IU��)}��V6�����f���s���8;�F�a�����(��]_��-��U��*�RO��3J��e�������I;�����gj��,T����d����f��q.�E������T��-Q81�[���8��Z�����������D(��a��O ��N����`���{@��t\�+�v�������[;�f����n������	�u������<� 7�D 2��1�����B�Jbcy�h�<Z>V�P�jc�HVj�.-��P��;<����d�� +m�<VZ�m�o���&�B����p�9��E}fHr<��M��%`��=bM]�L�N�s+z���4rX�������5��N��F���\�(a`��{l�^��k�����Rm�C���y�M���_��2�V
{q�a'J[�2"��6�W�����������MHC��.!p��i<�9�t�y�+�9b}Lh���4������,3����x6E6�A:f�����s=�^~�E��Y8`3Z���>�|�l<����G��Y��3��>NyO��l�7����J�cx�k
N0e����%n�.<:"4��X�h��{f[�&#$�R�`��JL���i�:a�1����r�����<W��B�~?����q�W:�����T$���N����g�:�S>�`�7���G�rn���]�	V����uL�1���{��Qy;�&8q��(5���c�m��{�|������UN��o�����d��#���!�7���[+/���q�e���?��)u��!^yAQw
�Eo>�}����]����?$�L��50u���LK�N��U�KZ���[q�Q�s)*�f�`�h�����.���������-����D5B�#Y���'vf�t������'-Q��M���W����'���K��
|��y%W:������_LN�~�eD�}s�����^I������AQThm3�BK�Fz���OI�|v_	����x�}��B�L�[?���UT�����;����9����( M"&�i&w�r7������0������U��������4g�r�k��e����J�9WHVv���
���^���\���f��k� �*`�7��
$h �a�Jt�v��E.�1R�Dx��9|�����Hy�����30�m�?z�S��s���Y3������f�����e�J7�=7O���r:����"_���x��%�����0��f�7�9������\�Bv^:��T|{�X�^��0�I����)v��<�nNO��ynE(�`�}���R�e\����|-�%/��� ��
p��&�C�NA����d\��*��O�K�����y`������_�r��ZEZ�im&E(E>����$;��+�>1�&{����1�-����o^ajm��F�w��fj����s���
'�*^�I;�~��Y�{��]��[��������=�����
�����^���@q�&��g���%��V�?��v���6Z����<4u�������S|;��8����$��������w�$�0vCF����dFA[p��L��'�����/����$�(S1�4p��0U�v��m,��C�I6�����%�h�W�4���e�D�@�����$���~����9�j!��&���P�&F2�v�.��M�Rn���	p��/x�!��_���\���m�8�
�A���
u#l�a��'�):�����#�,�}#���y�>�|��p �k�t������q���U��c�"�R��pSrZ����{��s�J1��d����0�k�NG��L9������~2|-J�7*��k$,���p��cr#�����"]V��Y�E2��>F@W�hu�b�.!�M=��cXK
3A,+�$���O1���h(_���%[6�)��S�2�U4�U��l��]s�|F6������d��#��p���SsY�)���Qu�������q:�n���l_X��9*Rg�d;��
+�B���������/������'�"��mZ�fb�fs����}���9�qj���*d��F1v����F���T���mj�*�~~�}���a��e;{QY��6��zQ!�>W(�uo�+z:������������t�!K�wFR��x��{#������3�O�/��������"�#��������(K��P�
z��+�I}�*2�Yz�}gF��<������~������7�-
�|L�[J\>�*Hr�PLm���ix���Y�"�m����P��'/�Qr��B��e���:���[�T��"XbnEf��0��Z�h�X�� ��)������Sj��
�O����*�u�_(��M�l&��z�N<��������x���<��U��ZT�|g�	��4�)�������ef��g�"����"D�'pXZ���%��ss�k������*A��1[���{����|���}���
��������\�{�J�|*s$���o�`�i�z��"A
�e�D
�r8�b�D������I����!b�����>E�
;�G�M�uC@���{��Xe*��r:������316���)j�%��k*����hfe��7A���G'p�2C���*D�D���u� �|��8�����@�S�<}��r�i
��!�_�t|�������� �C��5�U�@.��/r&�����U���0�1��$����7f�Gj�:�6S�8�j|�0EDf-b�p�\D�����Y6��5�*Q#Y<B�H<Oe�g#�o�BY�Y�g���7E�$c6�z����S��n�~DGV�1h������?m�t>lT���\>Y�%��]���|��d�P���S�8 \�;����c���X�ke���s�'����y�iUB�����g�z�-v��=g������O��IV��C�i���$+�%`*?��	@gg�f�	������a�Dy))<Vt����k���$6�Tg^,�8������v���k���TM_��\M}IY2/���v��{E$C�d<�'�Nw�%��8��f����S�������rnA�e=C&��C���A,L��p�Q:}���a�}7�^<�S(��C�P#S�� w$)I�
��i^t��)zc���u�o0������b������Oy�g���l7�[0�T���e�v����<J���^�KG,�O��*��z�z^-���UF�������.�{���w85�(����tbs��'�����n
���Zk�������f���a����6�(n����_V<�����q�s��cBe���j|}���<F�h����v�h�}�J���	b�%���h�N������OiY|����b��K��AP9��""a&rV��������4r�tC�6�0� �lHx~������q�HS�n�Xs8����ZXa9D��o����*P�	��'5������\�5�dN���H�N�5�65�������0f�����(��;�o�!��E���z}�9��%@���1�/�������p��_CY�X?�+����`�	�I�e�M>�����1oG���5���%�d�7�����Et�(v�g8��X>%�1M�H"<y�.J]�|sD�l��H��>&P�#}�;%,;��C��%�)C�F�73r�&�3J�A���:���n��j5S����=���6�\S��3�W������>�!2��5-�����2G���V
w��M�f����[2�]kk��E0��N���1!tE����C9�EfE��^R���X��>�2�������.�XNU���f ���c��u�sd8x��8N��[b�>AR����
��?F����rC��m	�7����M5�~�Y��]� .�*eDtK�U�'�#�P`�x~LL���Oz��g�J\��(.���Z���}08n�n<��]|�wG�G��2o���p��=GM�0�\X�2{���AT|k�D&@�O�4���[�����,�������\x��&������N�5�IVt��������9}$�h=�������j%����\����1�	#�y��4��l�l�������r�K�H����0�������s�p/	e��������<��|�4������RN �q����dH�_�N���s�RS�����O2��4o�����0m�������YY\N�=V	�(��$��v�B������.�tz���p�|1|mUV&�!zH	U����[�w���q�����3���&�����~U�[>�,M]�����`G*��y�g���-/���9���+D������+�G�4	������w����vf���7L�U��cIK^���k�M����g!l����;�@$��V
n�}�M����6�������G�+B���_�c�3�D����wSV��oAZ��LH��}�W�/���:��$�c���y���aC ~�6����%&P��%�i6==�=>��l�q(�	9��*�,�j*�����a���#8� w�:�W,g,j����������h�:��R@#v�&}V^�#�18�"m��x-���-qQyM��?�P���5:�G�����6�����h"���1��h�.I��t���Ym �A�9X=L�.��Y4��P�
�`v�U���4���u�����U�k5��w�H
:���\^��G������i�~0������l*d4��y�0����)4���=�����e(}�=�������KS����=^�;�+Sw���&e��)/�yNi��VzG&pk0kr�f�F�^�jA��qw^�C�w$�txZ�Ed�����k���{����+
���esw�>�q]6,��$8{�Dq�#=�*�K�@b�|ZX5c[O�3�Y+�k������k�A�5��Ld��O
b/���T2?l�lxm��R^s[e)����[�C���#H+�|b��+����zc0�:#&~@���u������l��h�x��PA��n��
|
�]�f���Y�!�
z���<D�����Q2����E��p�oK"��V-TO���i��������g1b" Wo1l~g�����r �����K�:�4��A����|�H�����8����}��nm����3���=���Ff��<�����.
�E��&F�^�lL������MYi���"H�e!��=G$�������`�f�;���1,9��&��UrV���0�U��IrKuMk!��n�������F�I�^X��1I��i:�m�bs���euuEM��yc"��I�K0F �B&79�]���dh��hA1�)�:��y9���j��Nd�PyY�Q�8|�$�poG��$��>Pr���]vnB�`1��cy����D�x�|X[�����F����l~,J���r�.���
'����[��K���Ou��z�y�+F�V>A�J��X�)gS�����w��&�~Y�����*b��UC�,d�����f������S�J�*(T����Cw�0�`��73�7���kZ�����"����0Nx���v�H��]d/�K{��s�<��5u
���)�gOX�>�������pK�9}
uM��6�.�d^�as��Q�S���. ��{u�j/��)[�o�������������N����|��T
?���D�\M}�����i�L|(���S����8��{���6y�G��v�\������'7_k(��r1v>��,Uf�)�R��Np���,2/�G|�S�~9�������|���������������G�s�8�W"��E����.6u�P3�L�a5�U����1�Q��l�5��5�;�\(U��M#���H4a�I'�o`!C�u���]ur�4�%��khs<��cv���x������u�b�1�@>��`�"�'��d�dh����u���������a7{`S��.�k�Ls���z��p�7�j`�T��
����][�����=���$?12)���&Y�df�^w�^�l�r"s���<���7��nC>W��@J�������sE(L���
��,�n�n�}f�l=�3az������0}���l&D{�8��J��dj���9�����T��k��(���8�+h(����a.9��[���5��B���)g��^Eol1}d=t���O������ /�Kuo�SI�,����F��1����5��{���p���E�
���-�����#=���'Y�C������� ��B
�<���)E|����/������4uq�4��M�#�f�E��y�"�����:�8��1���Rv]��7�N�|^(�$���|��������r0�!���_S�*u��RQk���*�Ptli��L8���������(���;J|��h�w�����������Jm�5U�U�S��X5�����w��({�1�hD�[��BY�m�*��f��zg��E�����i��	|������S��`E�>F����=����
��e�-��	�����y��������\,�\��QY������Em,-@�w��q���R���W<$+�WI�/�
�K���Y ���ws3$��x�����M������JB~��t<�/��#��-���;,��(�������n��{0��E(QW'D��6���y2r�������n��Xikk7�[p}�u���\{�A��X^�������y>��A;�"�G$P����I�2����5�lC�,�t&�������J��!�1�
U�H�`�O�^��4��L�Df(�su�A_�z�U��8�����re���������F[�!MY�<�
��cS��JUh<�����/��7������"�X��L%�n�����j#��2��a?cZtZ{4		�
sG��VZ��
sD��
s�V2/�Fc[��$+LJ�8!�V��D�	(W.(�������b��u��.D��rb���74%W�Z��e��{�%��>�T���!S/��a���b�C�����-�3���Z����MAr�����s=4��CDy��
,}UiG�J0���V��Xc��xm�v������WQ�}\�9xL�6A&�F�V:�`E���g&�(���R*��v��X�Ne��J@(��ys����7�&&�J!�n�sz�=:�n��zEp ������@6V=���0yw;Cx�l�n
s�����	A�1.���J ��^*���������}$���}��9��o=p�]��G�$N��4��4k�9���`�����/�%N���.E��9��>�>vt�Z+	@2��#i=��@�b��5 ��������\�r?;�_W��0���/����������������g�7���S |��l��>1���W��p?��:�����K!�7�d��wm%mhI1�-����_�3�}���0�k�7��h�!5]��
M@�K-��g�5�u	�\�^�cT�q~5�M����t�'�Kb.��8�:F14��Gm��c�s;pF���%t�~D�gv�Z`)���8�O����Y��k��Y��]��SS��0�mG�!L4�� ����rx��T�R�K�Gg��}���_����$�{�T�9>q3FT�����9���9C���.InGUD;���|��'��ubq�LL����*p����A1��[���m�uu
-�/@*�-*j-p���R!�=*����bj78���y[�t�aL����N���d���n4�w��qv�l&�YLL��mB6T����V
�pwv�����}x�9��i���]2���7ou�8�D�3{��=�K���2�-"��2Lw{��^�=��"u���6�a/	��cJ�C�����@�7��-u��$��EG#���fV�[�0����������G��y�HW���fI���{�y��H��
��5���G�`��T��.��q*�
x6AW�)��X�ZUpc��qsU������gv����������l�H���z>rf`�b��:��T��u��N��S�U5��7=��]������:��V�re<�)���avLG�q����O�3�PE{)LNe��j~\%���1.B�p�3&�n�k���r���!+��	��q��}���5��L��k����E��k��U�P,qHb�;=�I�����"2������T��Z�J�|�G��fA��hD���`���qK��7�Qk8}(.a�L	��}�-������oO�n�3��X=�gp'jk(��V+�����a"c����9�(x��	��d��2"���0�LTB���!r�C�'�"�2�5�Z��93	�c���f���Fd��L����|�����+��Eu��Y���8��5&IBD
+}��<�K�W�%~y��b���tep $������Ee�=e�[�S�g�c��q����=E�z]�����cG�rc<x9��{����u������}�}x=t�?�,B��w�N���>{^[0�m����9�F�����*�a�^�:�9��3N�-�t[6P�`%�h�S1t�
���c�WrRX����E����k��%#���}�EGoX��^���u�st��n����ou0��M������S��I��E�+�wY������������s.� ���Dh����bj}9����Id�w�Qn�}5�����6	��]�l+JT�><�l�7�s�UDa�O�O<���E�/|y���]k���w�=�K`��V��}��"X�x����N1Yto�cSXBF�}�V)C~%�aL;�W6}
����aN�<YN#"��q���b����XP�L�,��&V������c�{���M$�U��AD�5����?�P� q����L������- ,�=��1+oxdEcu�8	���N�:����{RP����<��+���$8
QuB�95�s�`?-v��������������WX�(�[�I���
�����WO��`�<�13j���l\��0�3,���(�"�X�eo+��Av��!�[)�?��@VG�(�v�#�Y�|Y�����Q	��N�w3q��Zfr������RQ��Y�V�p�T�z��>��bq�R�d.���%�iU����V����Z:�_���r���:[|��9�?�P��.��'m0���\r�A��E������F��b�lZ[���x��a���F���H���G��!��Es�ah_����I��<��xc1�9�V��#�l�����V��t��|Q��Y%r�/��t
i>�Or�C�K�hdG�5�������"f�X`
��Y�r�T�k�ZO�@^[���m����z�~�i��FH�'���L-�k�f�����������@x\� �+��f
y�������\S0��`6���X���B�+��1d�lT^�`��!��=�����r��<���%kk+0@�Bm6���S/��m���������Nl�3�f�
����5���
#�t�Qvo��	��j�� �!v+����-��a��~P%,�TcO����;��Z)�#R����-D�@�G�Q�Y)�l�6h8:��T�Z`�Cr&�X����9��]$��L���E(���	Z��n���U-	��#�=���*���������R�j��0'0��U?�����m���zRd�y����6�HF��E�R�f�����nF�K��/q���������?\�;G��B�c�6j��`N�[AUqN���L�����+=�aQx�:nf!���z2|qc�!����9�~���D�o��EXX�l�#�)Z�TB��2��.����]�	�����U���@�g^��+��<1�	���F#�ib)!#��|���r��Hx�X�����;|�SM7Tt�X[��C�9�D����
���/�JL��q�u��b����3�D�&j�c�����LS9��H��)�IH��`�:T����h!��A�v��y���Qfz�I�q���Mf)����Z*������Z��J��`="7f,49�s�x]���TX#�~�p�TM8b�"�W��I%6�z���K\���*�>�S���b2�/l����?����?�J���������44?����/s���s��K\mK��h���/�����g_`������a8����P�,�+��b�U��6���5R��	7��&V\{nc��r���=���2Ib0aw\�M��a6�B�jwTx��"->��u�,+8	"��9��E�s������h_��@6����������1�=���<�o�<�}�y����+5_���N��Y��&FO���"j�T�����xG��2�tR3o��u��|O��-�<[�C����.'��J�e���d$xia�V��0o@�X*�u������/�|�n5��J�'9��\]������-���mP�AsO��|�I�B�c�qSRn��f��xb��Q�KF�$gJ����"
������YO}|�>�iG��'�_�����WW����_���L�c3l����E�����g����2�*�l�!]�T�&RZEnA#�S��jb1��"'WZ�G�~v�b|�<��(kx4��'W;���*&GR���������.�w&��O��B
�l�4.�8:��	���jC=����@T���im6���Ci^�����W����&�Q��"�
�1����V�
��'��@��*�Wr6"��M�k������1;���&H�����Y��g+��l��1���o���_ycR���2�(��'��et���nl���#��>�2��:��������������/)kv���yQ
�g����!���\�]gi5���	��W�����J���QV����	N1����+�(��QH�T��U,6����)F�Vw�C��|q�Dd"�:K���LyH��"9�H�Bg��R�I�.)��J�5��S�!Kl�������RJ��)����n���7���f��_�)���y�A�	+y���r�%��a�K��$�>*������LLs�����0���^/��m9�7shQg=�����JD(;����J&��c����r�i�����zI,��{�	'����|f�5&E�v����f}�$�NQ�I�]�$%e���q�����9����G`&	^��Hl}j����n��Q�yTO���7���~���e�svy���x
p���9�\u�����-T��l���I���,�	�9q��[]���P5�������^�K-���
�����ZcWi�fu����w~�M�mW��$6+_]\�T����tF�,���}���1��FQ�����/��n`6q��w�R����|A��f���������>?!���G��wGWo���#V��X`���T�����P�v��
�T�a?E����3Z��������i�
C�@��Fp�{�$%�Wh'�R�Z8f��I��J>���!���&�~	���X�{���'����0}�?��/{~|����}����~FT����@�B���`����z}���M�����������R����m�GL
$���������7�����w���I��|X��5��I�K��<T
H�*��a7I�.�\�kN���d�I
V�Q����"��L	��)i����2a/Lng�6��M�m��\*�c�s�B�`�
Y�h�n���X�z�x��auT���w�p���B�wS^\a5pFNt�6�'lC��G���C���/]4�It|�M2�]�zq7��4��y�������d�M	����Lt<������|[[�������d����CW�|�C���#�/cN�$�s�������u����QN�4�P���jd��k����������Ue��&5~E/��������j����
����}�5�e��T���H�����zH�%���>'+���wu-L3��W����Ye�
<"��Tz w�J��G2ru��9��p�aU����X��Hb`��/E�b�+bqz�����
��`?����&�������g�i�����'j���j��YH	5z$�����5��cI���e`
�!�'-�kHn,bD��B��0Y7f���}�����Q�����*J�2���M�D�ts(q_�\������B���b*7���� vW�c�r�&�4�I�	��?�KP��g�Y�0�����a���J;$!I�������Zm�(6�P�LJ����S����z��u�������Y��=���0���}U��qI��= %
���Xa,t�GR���a#.�Ya�KN��Z���o����Zk�����5��y7��X;���y�;r|E��C�Y[��{��d�i5�������[.��^��[��N"��S^�)zK��I���#o�}9'&�{?�����R��'��3��@�|A�P;�LkMc��Qzv�������TB{�b��4}�����^=���>�%�B{'��������F����*���x���`8��N�)=(f�&;�����#����*�s���?T�^1��Y��x|�nqs/���}I\�������`g���h���������kk�~���/����m�O�n�~���[��������i�������{V^��=
��P��0�R{K�U!J����P�y����k/����c�[7��d��}�E�e�:RY���8��K����A���@Q�����B���
�A�y��Ny�i���us��G�dl����T�}[�����d8��82+%�b��mU��D ���Xk�/���?�����f��,�C� 
K��6����$�)�FJ���������tT0�y/{����QVF������;{�z���.���VJH��Q�^���~�<����SG��J%)k�)���=dc��\���Y��}��|x���Y�3?:������p�����(��A�t���Z���������i�J���q�����0��$��JkL��.� v���!v�����K8�W���^&���q��	f���$����)�Z�d����8N�r�}�����h�`9�!�p0 ��#Z���WfYN�j%���}���.:zkd����gI�� l"eI���wZ_V�c�D��v�S��j����d���rSo Tf��E��/�������^�g��>]�[�A�K�<��?�La����`��
��B����o��W�J�k�[�����s[����^�c\�'������Cm=��v�F�j����6�kb�>u����j2��6������r|>������T.pb�)"�)J��s�����zYs�pC�n��0OG5�V�KWR���L����?�J��f���������1w��v��v�8�����SB�p����S�~�7�j�~�Q�
]J�mv���L`�=��F��sbR�a~��>��-4���_��h:��|kD���b��+�����$���������M:�7W��4���Yg�!��
������U���z����R�&\������N������"��}u<R}*�(�%��/���<�����I��M������WK���y}���L��� r��^'�-X�=Dk$8��y<�^�f��}gS�/��k?��H~���d$��?���H���t��$#g��;�9�?|�D�S���yE�������FN�q���-�km�Z�?<����z���\lxo6��Q;9��$�.S�:���L��"
Z@_����z������+��S[	���yC=��x�f>\���_�$P����6T0��>�"���?��u�Vw����X�����
���"����w����k���>[��y2�lZif���FY�Fb������@���a���!k��q=ux���O�e�;c_O��O#�?�i�4l4oc+I�_g�H0����u���5�H<���l�l�~-�[�m���U���S�h)��lz/��:b���I�"��$b�������z�����l�;O"�$��KY��R1c�9"�������%e��1�����{�e����fni�w�X����%m_���B2pw����o\����d<{�l���Q��/��3�=!G�����ZD���8�
��Hi���a�����>�I]���!���7K���.��mr�o�5q����^p�.��)v�����s�8��'��M�H������ ��g�����}��s��H��������1�����hco���a��+�G��| ��L�N��Y�*�rL�x8����Y�������l�	:?��S��Ok��L�t��������&�7!�7�-�B��7u��NS�9�3<Zay�*i83�h�
�y������&o�S���gZ2���s���8P��3W
v�B!9��W����GIS^�S �
(K�����D�y	aqU���C�_.��N�;o/���tn���P�u��o��,�%��M�n��*G�1�il�\]��w�����;�����F�[��+Kh���	u
I��]`?,�O�7��?���2�l�m���nd�i|1���M
+3;���s�U�=;=��.�6�������z�D���QP�6��������x�95�'O��k"�Ss O4UZ3�Z
2dH�x���&L�#�O�D�|^�������+�x	�YT�M����E���~�N��S�;���p'��r��e��_M7VT�1���������L��HZ��5L�:�%��������5I�
������`���B�=.��*w�:r}a���P�H|�����R��%e,%���iz��`�LH��H��I�����2��c;�#f�+/%R��$v�+�iF��8*��x�:�dG���%���}R�~�-
�p�U�s��W/�:f�=�BA���k�,,6�wP�~e��i���pJ��CV+
bz����������;�����W�����8cf�����\S����/��l%%4��q�������^�����o�(k�h�(+����{j�]F��9e�o�4�o����.?J��@v���=�^t���R��h4��p�GJcDl{26K�anU~�9B�� ZN4�4��P�i���%��Gu2b\ @n`�a��������I�I�h|b�����F��
�����W�����'>t���b�AXt�$�L'�����}��)�1lp��l�,I���%�N����m�_��������F  t�/H��x�V�|/�s��p�t��t����K���^��D�9�p�<��X�h,�1�T{Ps-P��M��:�<���9�'�k�l��$�C_-��D��*r��5��1��t�-�:RD��n�h��/���k5�Vd;�����(��pEZ�dsw�oa[��F���������}���41��X����\�eh��_�WU�����ve��*����������U����}�e��H��wV3��\%�F8J&F�??.,���X`���vy����AvD�(F��2�.k�p�X��b[ �cs56�p4��*�t��J�\a��-���pb��o����������u.U����Snn����V������o������Bb��8�%��(9A`��;�,N[I���u���#}�c�=�W�#�����������`��V��e��E ��?����6w%\��O@Zx�p��?
����WA��|�f��.dS�b
���p:6�td����e@f��_���G�QT�vfl���MW��;H�;��+��%���S�h`�df��q��P3y�_��s>�����	!#��=(�������x�D /G2���VR��8|G���Qq�?��������oC��D9��L[�ic%*�Q�KN=����B��E�O�e|��tpK�K�|�4���n���6��$Y���~*���K�L��,��.���C�L� �r���J4���	2R�#���,*��W$'H���#S����l4�g��#�T���Q��b�`O!y*j*c�����R!:������E3�����i+�%K�����1E�Jq��H`$	��������4U�x,�����5����l���S�6=�3��;�Pn��/�'V|� 5�"�[�<��`L`V$�'tg�$�tcI�I��2���0�|����

�}V	]�������"
���X�6,8lV��VY���.+K�~Y�Y?n�r:	����b�G��\�_�p���$�<��'��{�_����������^����a����=m�������.��I�4W�8	�t��r�S'�ArbX�u��u�&������C��*����Y.-*��b�������v���/�\����F�������I!k9�����3?���5����f�`n��`��E���H�7����!�����f�	X�dB��#��;�Y��\�n�Ak
r��"j���M�K�)0}�o�}����~O���4���
����0�4*�M��=9(�~U&x�.i`58���{�\c������>k��k�����Z�$���\?MQ��1�'r����3B=�����.�5m��9_T�N���u/��D~��3����pp���E=n��keO�w��H_�d��C��z�9I
�����RS6�X/$��5�����X��L��31L�r�0L�������R0��Iz-�J�v����;F�����%�R���Yl��4a$}�i�\���cl[Q�u�F? qP�nmY	���}F9��"����;9�MI,��^|�"|�7uJ�m[�~��(������I7�4~�4y�/[�4R��h�Iz�U��0F�
��lh����K�s�t�v�v�6�2���*���v�C�5_i(�Z��P,��BZ?���:SNh��f�U���uQ8L��R9Q�d��@��.���������G�:I�5�iI�s:�N��_\�_����j
�{�������*�d4;<?�8iw���n>\�;�7����W7����`�����1���gUf�����t��n���_78 Mp���J��x���f������P~G�(�3�\�7r-�E�Sj��A���=��!�z��n�1�pu��(�oe�H�����!YyyH.��M�d���H�3��\oy�-)v<hd�Le�3_��y�D����w�7�uGv��l���y{`��W�r/������w���I��#)���/���	K�:[:{��!��M��M���d�[�I�?�N�!a�U�QoH>��q��x���D?Q#,��\������z�=wS����hHGO
��i9�'�?Y�1R�e��X�7�����Q�S�*4QR�M������c��}g�{"XVa�hGB$�eD�B���2c>$i��M���t<u
kF���Q%�*��UY�;�m9�sHl�����(�������r����<�a���[6U]'��F���<�u���R����+����|���I����F�b�2L�������s�)9�*3��q5�f��!�25��0��vd�A�6�(����������������5�,
�o��)2�2����
	7�Y���Y��������e��������:�Vc�����F�D�g��(
�*Ju��bJ�;������{i��!1l�4�|���?�I_��q����J8c4����,[��9��G�]H��5��6]��!��!'b&��OY	����<2��6�t�j���|O��<����[@n������>l����7��X�6������Z�1v���08���i������\��qtKs���'!������;�Y��MFf8#�a���.x\T��q����Rz��i=��Cfw ��$s�����S�\!�|����s�8�Z�RV�����������xK�d��!
z���8o���������8��A)����1T;)�v��ku��]S��)�Ws	�H����K�����e2O��o���v~'��������q�\:�x���/����p�Zn��T��{�����NA�����"���)�Dg�;MX6�����k�va�)M��������!������y"����[W����K���1�l����2�
i���=�l{�Q���w��6�sF������i��M0�9�����p�_��/NO��s�:�=9M�x�M���������Q_!]����0�JDc����:����Vs��U�E��-���`����wD��N���u�'���	#02�\���SY���(W��6v���>����w7�X�mu�(�l���F|�\�g�����&����e��YOleZ���3�4��������9�5v����l�J��\��eA�7"f����_���q���y�o�$�M��F��slO�\T��e��n{y�<�P��"W�{���y�5��n_��s<G5�o��ER��W������5����@�WJ��v�u���V�������6�0�!L���a$I7�����F�R�4qO����+�����������h#�e�z������N�T�������~;x#��J}wx�/��)��dm��hQ?C_�}}K�5���>�E�T��9,Y�|�6��X�6�+�����d�ne�D����XQ}|���o�:B����*_�R���������]EF����E�l��Y�^Y�H3$~
��i��_N���y�Y���E�$=�D�d��3�>P-�}���JH�;���������j����_�������IHF�+�l1�>8D4�a���?���X�\�_l!8#g07�-��P���y#T)4 .:�I<KC,@��\f�O������v��	�PD���7Js�����H�����t6�D��6G1�d���l�C����z�������a��E'�P8�a8�E��@�#a��~<G���T��������y#�!�dg�t"w��*�Hu0�pVii�z�97,�*���r�t�c��HZ���Y����R�f�c��'�*�Ls&�|@v�D_��Vb��}sb8�-2���a�[�t���b�����v�%��k��6������������{��j�)�'
rih��d�l|����QY%�aV_S�p�����Jl���	���WS$%��9D�dMOpt~w�\��q/%f���5��]0���BP�B�l�(��qAa)	
�������z����4Z���� :(W��g4!(�GC(Z$�����0�
<+��(�-�X������V�4��$�����������9�na���6x� I���Q-�m�4tp��A�DI��������3s����9aD^����M��Z/��AAE��{{�;��z����o�+����%\ ,LpM��krt�z����b����	_N�]�����B\�
��1������>j����� �����+�?�w~�_-���X���p"�H��B/�L�j
A�g������7(���#Q;�a���(m6�2�d��2�z�*�.��8��l�JY�������H�J����F��&g�s!ovC���	��O<�`d@�n|�2�<�{����40Qb��L�8X�oS�L���)�\�GJVD���9�4_�4?���*�1$'N���4���J�g�*R����K	�K35�
�Me���8:�;e��;��PwNKL��_�L�2�q7�Y���q��9�\�#�C���TM>��S�3
�������F-D�8g<cX#�	�;�v���I��G���LZ�E�����]d�OE^��U���\u��;=:;�������������:Y�����zJ���?�gyFZHO�m,�a�p>�|
n�_e��'#����O���)1s@�	��gHV��*����t��}�������50�"�������'�>y�ThR�B����������H�y.��?�����N���t2��o��B���`��F��1wPv[��J���5��5J��4��'�(��&\O����D3�DH*�����!���P�%�o���'��� IF�An.�s���T������]��=�*_,�w���5�t�5��Us��bXy�Q��y �%�!�!4k�G#���a��������U���H��	�E���~JTv���#-���L���N�%r��_Pfs�z~Q�}bdi��XY����af^%X����F�������?���7Dw2�
	1���wY�:��!V�/d��aJ�Q���f-�5��DI�<n�w�s�����)��
�h��q
6�J��B��y���\���yy�2����>���9P�`C�M�Og�����"L:��rx?�<�	5`��������������r��p����W)KGjpv����^�M�^��������L��a��I6��\���.������1����T�]MG�64S;�uv���q����9��E��������]�����@R��"-<�E,�����D���c�Dt�d$�b�=�����	��N�(J��`����8gu�����#�� �9k0.^o
��o�JjIs�b��Xf�3�����l���T}�3������2f��9����@n`���0MiO?���q�@BNd����MA5�)������_���dw~:E�?�'�u��2|���8�������j}���i/A�6q+
��W%X����'�$�������GE!���fo����ig*���T=cq�4imFC���t�]!���];#����
�b����C������������B�B����[�R���|���-L����v�����w���R�J�����Uw�pg�����$�>����m��}31q��WI��k�{lU d��518���o�������a�Df����K3b���@�
��*�������$�;��Z�sG�������zk�usr^�q�M��A��q���������i���Z����������{��<�����������X!D�+����m�w��<���"��z>�&�X�-��!���U4�������!���a���$-���vw�9�tL0f�����{!������P�C.rN�s'-@�)[����BJ����wW�c�5����aW����^��]N�U�p�����P����������������
�y���Q_Q�97@>>��1"SstAA��A3S$��=J<qp���0�$�=��W��I��|��5~EH9����tJ�����CR�6k����d��v���@w3yR^����N��`���Ur��<���cCk���t��zIQ���u5��Q�1�G*ug�]P��Y�<H�J-<9�KR����j��"�ib�J"5l�
!}\Z*tO<�)������E�^�~�E?!�WM*���f�Z��_b�Zf�Zh�R�%5"�Y �%���p�fM��������SxJ���������?�\���`��&�]���p�k��Tx����Y�Z���M���o,�,���@0�c��`���W}��~���n32�)���@���03�YoFq�]#
=����f\��,�SG�\y���4�/bl�)��<q�n'd�YW������D�a}�w��8j��8��o�<��g�E�E���I��U����zn=����oAT^>����7�}��&abd.�`i(x�#��Kkz@�.����������t?`��$ �a���2G	G�Z�	�z�a|����@rD���6�u�P�cm�h��3�x >�M�j��j?�R^r������������A`���~ii���J������b6�dg82PIR���8�Ht�\GOBR����������}��s �6�
l�v�h�����4{���i�:=��x��A[:l��KT"<��p��{

�"?�)aB�����OFl� ��%�h��x�]��l��������)[��Vn���)�o_�k���n�����m*�lz����doW.J��P���H�y����_0�����������sr�e+Q�N!'�����e&i���*5l�rz�@��Y�d���A@�;��u*Kym�3UxqQ����n.�	<��!�h���������1��M�b�*��m�+TU�lAJ�d
���N'����8� o�}����&xZ���b���d��}:����������Z���NN���No~��tzqv4��D:��p�|O
�[��?��F�I��j�c�X���2�A*�"#���L,�^�l����5cCd�g��	�!��X+���9�aC�I��V-���$y 5Y:4$d�5��3<�������?�hO�m�@�V���6���*�tK����<LR�wG�f!Y:�(�������A������
�5FD)��V/K1�/��t|��Hp��xx����@�,7c����V(v����QK5�v�����D�����/�/��W��#�9�_�Y�������y������0��
gisLR�]L���j3��h2#pdfo�\:_E�M�O�����>:1��������IDIO��&����|�MG�L��d��{�#}�?>l�;��f�+��O����)���'6	���e�X�����p��������X���R�J�1�%��#O
��h�;�������6>g�{^���sLI���������m��0�32fV���D���U��|9����8P���i���E�u86�|$a����i��^�L)����H���d���4�M	���W�/��8V���[u��R���%#
�L����L���1�r*� d2�l�^�2�c[�5+�;�9�>������P_��,o�l�br��m�R
�6��e��Dg��ZQ3=c�
j����,�)�f=;)���o��^���y��)��4+�,�����i�v?��������:��`�f�Q6�?����H�B���{�O��,-����Q��3	�(^OB�����"���+{�N����7`@���h�ru�0�O0��U� �e����;�Fj�����j�y����Q�������`-��������Ok&�P�;��+����8�7��8/���2:%����;{���4M�A�3��5�`�����@�d8;y|����t��g`�b�	V��$����	��T_YlOalu	��q��o�[s?��_��i'y��p��j�X���DX���,K������-�:4�����g5��,���FV7����n�>X�s�q����bMK���l8$��^�����|���l�(0DQ��y�k�D�l�Oqn{e|����.#�8PH>u`��	���Ai�1&D�2�bPp�=�����P�}i�����a1��E��7a����H���2����R�����A�y��������@�q�Pty
>���5�3Ro<7�
�sE#�=?�R#	A�GLk��3Z}��/�����4�'��$�%'!i�;�����7Pa����3�8��������x�r��C�L�0����xC a�\�� :�c�ULW]���t�(��
�Ot8z5s)��G&��������p)���u���:l�����6}#sP��$���s�^=O�5ov��d�#A�����8�*���`���G<���B<���[<���V$~}8���b�{s^�'�����HM����1R��\�n����j�����rzg�,�C@w�g�x�-��>)�%��2t��mm���1�����_�#(��H�&��=��Elka��g��4�fX���S�1������Y�P)�m�����9kB�����+*��y������+����a[��b7V�_[Mb�F�H��
�&�����&�P�,��e�TI������R��OG��5����������p���P��&Io|;2��_p��93w��5���]�ZH�����6<R��T�>:�1��1B�������;��6�P4�}�$�������)�!NT)VD���?�.r���:�T�j����!��k{��� �4���\��?�����|�$�9�s��/.�ss��y����h�yV���N���/�s�����!7��V~��r�s�q�t�M����DL{���B�XWa�����>b����D�b�	���)��c��T����!�r[����������)@.�ty�M�.%^�3�R�)(&;.�p�yu��]2a)��������rw*��S����mly�C�hq{A����<�����#�r6��N��
�����o��������{8��9K��l��� �&"#�_\����	4D��M.���c���
����R ����~-2�9<��9l5����t����dnY�Ydt�o�5w?��F�G����F����v%3��x�`�P��9�[����`���2�������
�03����KDP�X����8�zw?�o�[�?N�a;I{B���S��|r>6-Y������K��V��=���$o�����])U�6<��6�)6�t�
� �)�.{Rd��t!j������)~u���Mp�G��V��r0����"n����(�P^��<lp���(�K��3G�)���_���>e
���X�K-T��&��������+�}��C^������cg�bI;������/�(��x����]/�l�����}������W���5��s9��oO_�J�~�v��zq#�����T����S�D� k���{���$}'`�}����-��O�$��i��|!R������Fd�a�nqM�Ql����6In��LSj�g�uktb����K^'| ��C?D\������3an^��2��'
3sP����7���Q�����d9�Y�Z9��)�j|�R����[w����fw�4X*��"��~�3�@t�s-�mi���2.�1��r��,W����jI��1��r[���S2\Y�����XD9���p��q���l�m=&���N�gYS[������[k|��.����cP=I(�*�@���u��&i��w�&���)��
�Av��r�����8�#(�G�[E��'�1Jl�7�����|f�:���������w�G/����i	k����D*a�	<6,I�%I���j�i'��c<�^D���2��L��A����uuK}�#��dC�"Cq	]>r�I�O�V��$�\��g3�@��~�gX�dd��G���!�"q��M�`N`��h�P�	G�F�#�!1��u+���d}����su%����K�"]'�6&-W���6��BU��s�������{�vb!�M(#�XdP1��)J����������wvXgr��a���j�{�l�V�j��QdD{�077IL�����B*���T,�q��y�����Vad�*�u�+R��^w��U�������|��bEt�b�:`���U)��O6Y��m��7������F�C�������w����?*s}|tvt�/�b(�
��q��:V��������-e���D~e����lVZ�zr�/2�?^��((���f��f��j�G"�cr��	w�|��%�XK���P�S�N������L�
Jq��<��
tL�����/��%�m#t�t�	G�5���.���Lel�t�X��-2\]�����2�|Yo��W%C���/�e/7�`z����'	�_43��������*g�X�dj��vnr����*�Vlh���$S��g�VZ���3���p�$�;�A-�AV���XB���V�-`x���
]�6�s�����=,�72������������������~j��>X���J;������w��-�N	�h��<Z�F
*zg�I�w;��;�K�T]!�6�*k1n:�Y���S��<o����f�6���Wj�Z�y�4�Y�L�.�Z���bc��X�;�F����!.�K�9b�`�������[I���sx����L2	��'���~����!����0��wy#��<�����Q�}�J�aI\n1W*�UdL�����P���
%��c�P�I���������p)Z��l�.��p�z�xW����
�
��v�����+ae��&�Z����75�<;5�CL
�1������7�����>��d��XbYI^E�/���YIv�c���k�pV2t'�^E��0�HG��X��;��+VS;�����wJ��d�'�][
+Z�}=a���j��vW;h��mZ�����@���8j�h����gm�bG�����o���{9j��`w?F����~gw�Q��0������eG���.������<p�^��"�0�6��V�F�[?�>Y�<�&fV����6��'�[^B6��s[v�L����^�pOW��O�K�1~L&v�)���DR���W�V�~��15���ZhhsQC�����������2}^]�cfA��S�������(��������k������s`\X@��|������������Y�.�+������\���=[VS����Lb����%�l���s�Y�t�|�E,<xk�S�i���dzaAjm��S�g"��=���X�=�;����G����d�{�.�qR�gF���U���t��fiu'�6�j__��Vk�I��-�jn��M����5w�9y�]"��o��+��E3=��S�%F�y�� ��!w��o��8�|���W���������Q��KX�]66B`��������\�����vD��*��unY"�g�E��Z$����Nw{�^�m5��Re���<�+B;�EF	�`#�y�������&�l:��A��]����M�
]4
q�����&�B;�&�����{���M����8=�g*�_b*��k*u�:T(Sfjms�������Z���|D��;�����6��Z6����d���p
��������
E��� �E��{�z{p�}�+]|x0��.��~�v�_�
�;lg�t�LH��
�����\R���QJ�u)�P�U�$�Z�L��wT�/�#���"��K�I$�~5
�L#��%\c_����_
�2��P�~w
��#�`��-H�7��"��/K���F���6��.�q��t�!�#���]<��oX��y�<�5l��TC_��l�����0��K!���F�9�H�&)�p&t�8��Y��dG@"�:�r��Oz�.G|��l�8	^�$��`�n�%�M/��E'�-Il�mR�,Q/�(�&��h�	�����r��?QL35��1�������m�5	�B��/#r���X��5G6C����$�Q��?���2��Dh#�E7���6�7���c��Rl��!� M�w��x���r��(������k����`�6|�K�D��'��}a�����4tE/z�k Y�9�qm��%�v��\�r�SdXu��2T�})�L�����;G�o0sg�tF�8�PYb�5r�����*�R�_|3�K�?���z����w^�4��C<��h��W������������}�t��.�	��9���L:�[�����pw�{w�a�P��~3L=�T�h|W���
����aO/`4��s��w�I�pK���&���'Y�9���O�@��a�
<�gk+h"=���c�_�P;`�2����|��%%�����'�������#-s�\{���oSbg����-�$��D��C�gC�*�jQ��.�{Op!���;i�=�pv��::������#��w��U���t�W���lBJ�^�!P�i��d�Y�����U�i[LU��Fo����Aw���[��v
-=�]Q���5Z��Sk��Q���ge�3���.�_��
x&���S!
`�$5���|�\���t*a��G��6#��sZ(��`���S������vm��7��e��9H��3_"��~��/���C�"V7�RQ��IA�~��U�9����S����A}T�9���t?�
_G�4�+�2@<|4~]��bk��:��5���H�W�oE�h�q&�I$+�����b�8&�X�oi2N�N�v��n�����q��:C������t�{���$n�
������a��>�I���>��a9���q��vc�}�������Y�S�f��������g���t�����b�B��*%;GL�������������
�1��%���p�|I��=8���A��j����j��B[yN�4]
(C�&�$-6$����]�rx�"��uq^�\6T-��]N}�"�F�����35�����T�n��1�2���|��P��|�N.�+W
��7����5�^V5���8t�[��ZVb�Tw����V[�\���{A���u��^n5^C\������� F3�6TML���6�u�p��������\�gx���q�B��n.XF�x�c�>������B("��6(�����5�V_��m����G����7��?���q��|�rz����3�d�*�f����8he~��\o	�	��#:��=I9�.�����b�F���+#��f�~J�2����5��v.��s��:mG�������������#B�l��������a�����KI����������9�}����� ��eg�-&�`���z����~���Z�`p
-=\Q��^�09�c�Lsf���[�)����F�xqk~�T{MS���;3W$�������K
���G�!���u�X�-+&R�9��+�."i)���fMf4XlN�?���.�!�\}�}y���@���Alm�G�]����D��r�mw�I���_����I�L8�� CV��mc���.�����	�A�z���[��UeA�b,/�2;u��2@? W�#]�����C���2B�"������:�A{n*M������o$���"������YVF�F��!��Q�F���0���cW��Z�������dC7��$F�����%��QJ�(E��r�[tNGiv�i����<����4�[| *��4d4V�c����"	Y�T`���,/t�He7.����g������1J�R��0���[B_$d4uO�{�21�P��m00v�F`Q�	���7�a���+���)UU�F�
���)���bo2f}#�V���k�2`7lwy��LH\����m2b�b��-���M��O(hv�9X��W��n���}�Q�`o��9`�I�� +�>����@eSD�O,��
nWP�����3MC�m��f?/4�
�cS��6�.�<2�����U�]���}��m�}��H7�~
9	�.�����u�����br^���I ���"��Y4*����&��$d_d��D�LN1���l�3#[CR��%�a��5])|��d�,H��|*��]���M�)H0|t�h1K 
��RHUh�ql�YF�,o���+7��%��i�bs&���5�j�'�E����3u��%3���OA�b	��4��Z#J���.������m3R�s���o(b���8w�;�
HG���Sd�����S������Q�T�+�y����"���vw�](@�b"���[�n/����8�m�.����
��(%$�?�F�����3�i�:(T�6f�#A�1���jj�b"�e��5���.C��^�*�GZ��)�'�2��fA��{I�JMc:�.j���*5�*�n������	)U��Y����	vb����C��� +D���sx�?�+Ml�x^6��71n��43kk�9�f�2nJ�
�&�j��X\���em�K[�|]�b�%�pI\���;c�tJh���������f�[�%T0c��\�����R/,X�P��������K������[�o=b|�����wx)�r�b����l���N���s�:���Z�����,������1��� bZ�����{s�"��������k^V%�������c+]YD�L����}�����n�d;�^T�n����l���^��fb\/0��=X�B��N���Q��U��\��R��,����PP��Mzs�Z�E>�sZD?����p���}�:F��`:�����n���C���cs���e/�.;���t��I����xI�Ys.�������DBt���W.-�!��}1����_M!�]y.�m��Y�������e2���iro�y
�9I��;�����2?w%�c�sm�]�L��5����h�0�g���,7��!���>
��NQ��o�1*<�4r�N����i���0u��������*

��
�F�OE������~��e����C�:m�������5
�����=����!_7M��5��<���jC��\Bg?��u�7NlJN�i�����C��-�ABsnr��8��8�P<oq�>���	2��'�T�)(g%e�x�w����9�
�rB1z�,�����;�[O[J3���d���EFw�H��M����H�C��`�)�fR��J:��#�9�e�~�*T��u�4�^&t��5�j�\�\��7j��w����$Q��a��:=�����k������z���G�%Rs��Yz�����U�|�M�6c�+TZ�1��������U�.�3�~����fO�V�V+�sMtV�i�_�����U��WLS�Kl8I?a�������z�Kd�C�
jI)��HO�qtC�B�����ok���5���sJ���^�%�k
����	�R��I�G[y��5�oFm6�h*��o`G�9�����E����(Vf�D���f���Mj�s��jt6IDGN<ErK�]�e�1(SgKs�����5���C9����8�r6�I���Y�Z*�e�hK��$����#��X���GJ$�����G�Sf�`+���HG}!X>*Af�*���H!)�Ra�'S�&'�A&����3YP.�.���~�O�!3B����f��g4�/I�'�S������f��+3���fb�ZK��#���$���K�jfC��P{0����5�G�@�h�ZY�M(��9�a���v�R�	�fSu�#^�G��=���tdn����������:%�11����f�\�����@��4��l4W�4I�C����"��L��K,�%*N�Gg���m!���j��N3��S���+P���"�qW����#�W3�bM��lf6�!�����������������"�Eq��iXP�}F���e���h���5���.*a�[����B����R
>��wD�G~���<���Xt���[O&����	k��>X,��3H�����w����RU�f��+(����N�w�����77i�� dO����w.�	5;��]}��;���7��s����x�T4�i����xBD�)����=����IQ:>
�U�}��Z���Py�K1Q�<� 3�������L�2��UU��*�h F�)��r�!�����L�I_�y�����Fn��xQ��_��4���-�������S������)��04R^v�����|�q�X�fG�g
�T�`Kf��D��V�<7o�~�K�[e����Q=�K�I�I���ttvz�9�8����s�~��j��l�6���$���C�w��"�$�$k�#�k����~6�����Y����8�>:E��
%��9�e����CT*�]-��P�$�A����]2=��>.��>�0O6Qlhvph�9]�\7��r(�eU�|�l�A@�$R�q?��ek��1�����3p-�#�	=|k�|����W��zc�@wr%������7.��n����[��nm���>����fD�����Su��[�3�#�"b���y�'Yo�>@��
�!�q)�v�
R�m^���:����C��m�L��K�[����@.���U8K��Q��]�q���2��O���BB�j��Ck��>|�)����c���.��nM���6��RM���LJQ�O��.eQd��)��O��))�v<Sv��B���SRkTfYU4�O	9q���P��5���:�\�������	�����u$�*�:9#��g���z��6Rp���<�#�d�)r��4��������s7��S���<r;@zh�[U��a��0�����l�|�}�T�wV%�����/�<H�f��axv��#�x����o���s�Y�U��<�)n�/��o�kf��
�}p�`x��F���7��X+c:9&_(��z�Y
�N��|c�����~������|�GS�2Bh7���l�	��e'Hy�>�"�k��U���^���>�]��P`��l$%	��v#3,	y�4�6&z��[��J9=rM������<6;��UO�O��T9M�'4a�����[�N�a~��%1(�@���E���S��Y6jA,�I� ����G�t2O�������92|����$o&W��9�9D��g����G/I�2i!����Z#U�����-s�
Dl��u�H���}{��1K�����+G����re�x���F�5�v�����������Crk�9�GV���_������sm-��$d�c���C]1+�JB�� vbm�:2�N��b�$Z^����
4����I�������n��W|g�P��3��"�L��E��[��s�������E��#@)��X�m5���TO;��:jV��uzCd�]�3q�)��+Py��Y���Bt2����Mgw���=�dG�y�jl6]���"�PvG|���Y������x�y�e������z��<~�mW�E���a/X���_Sa���	�!<��p����L��6����YO��Z��S@q�>����
��l�����uF[�Y���^����{IF�b�+0Jqk?���H�C&(��Z��M�x�03��~<n��U:��]B�d��$��H
^%��������V�^�n�$��|o�BE/�B2t0��d)�B��������9���|x���f�<���DOv��ZH�x,�b3���_���j��:�������_+�e�U@��@f�������u�� �_�#��]�]��g���!�������?�%?q���J�)�	<s�!I1��{��e��C���#����BaX6�����][4MS��nD"�M5�cob�������Tx��.��+�#��'df�
�F?Z���9��wl��u�Y��M$�u�i|�D�R���B����h�nUS#/P^^��������6�_f�w�Z��W~>��Q�a/�dH�l0��ad}s�8�U�>r`���������)��6Yk\R]���F��@�&��V+E���}l����J�{����C;���c�X!0���G�����V�V�[��9U}��Ztt|�������-;����J�[��R�,4�'*/v�W�B^�tA*����5�"fpf�Xy�~4����������G���E�!f�����[�+Fcr��i��nsg-_HO6U��(����@���|����>}y�\n�e�����(]*�(e5#Q����+�gq� ���x��JF8z�����W`�����!�2�jKv�Y/#�}h_G�����U�K����2����@���"v<���\��5�<�&���?���`��f�
��4Z�>����yn�Y��h��d�%(���R�
�S�3�L	&�w�G@Z�n��1#V��pux�;l�5<��o�]b��{;���/�y�{�f}�U*�1d�s���B�f�����%gQy1*d�Z�������#gq���������i�>�S��rL)������f�������l:fRiP�������\a�o��6�k�q�Z*|8�`�:��9�4\����Z�Z��)�g�I���(���K��!��7|M�E�q<K�Y�6���/���1n%Y�YE�@?����@��X��r��0�]��$r�)R�����\��tN��8%B���G�9�GY=
!g�/��K����j����9����P��	��>_1,/".������m!�����/���Zn���tZ����[EF`�!�&����TJ�����"����j} ���7SL��N��Y���[���O���P
0��-%db�"��������������Rv�AY�37�r��)c��8���s�{ |
�!����wq�K�I��L�N�Y ���_wG��t�j��xVd�L��������r��s�g�I�.��s=U�,���c7R.�S^6w�,��K>��[���C�f�[�9��B�k�_XW �������i����T�4
����{����L������yt�c�<���R�2���B���Tn��)z]�=�?}�����^�H4��Po��*^O�+�WW�4��Z����������
	$����^��Y\~d�/�����gr�3�@�+�$T+��4���8��ND��
O,�RG=Fsc�C��p���J��=����&�S�)w�������h��Dswm��t���x�}#.��E+7�a6I�x3���^���F���drK>������/"����$���Z(�`��"&7Tq��U�)���@�)�zj6g<�sc7GW��7u�?�1G�:���H���
�n9��i�"'�0���cWT��0>�M5�&�R���C���v�Q��������t;���O�v~'����Vco�Q��vz��x��$��Z��=g���s���38�'���R�T����&�|�W8W��
l�&%
Ol���X�]:�h����`<<M�<�xfJaby2�b�2���2����x
MxI	�uNG���4<��,R?���N���e���*�R^��x�H�������[M��"��Dh�p���u�����
���)v�k��;�Y��W����m��&f_�	��:
������j�cR�^AY����t���E�������s}��3�Y��>��4��
J��k�t�o:���?��g�7����C�R:��"%D���f�B�6��)�"Z5�8DBy�_������2QI�r��N2�-y�q�8���s�,��o�����������������}b~\���'=��n�?7Gg�:����@1�^u.�����@W�����������>��{yqzn�8;�6��.���x����]�����w.���.?O�n�����6���k���f}k��AO/��?\]��g�������+m���\�����#�����:�1u1<�����6��S������%�T�����_��ei7����t�L������H���"����w���?�.���f��yUoN����������}��������������4�O ���3�`z���������G?���c�P�!�������"M���'���7��W�o��������!��S��|�d�o����Y�SL�����~1�,�������yn��6�]����U��m_��?�=t�?�������_�og��mi���|z~�e/?�G������Om�K5?n��D��\����}E
��w
�
����~�0��t�'3��������������K`�{���t4�Y6��]�?;�����i���n���x���'�@�P�yM��0���l����\\�j�?����s������h2������t3���
L�tA �����7"�!�i�V4B���LYl;l�sx(����V>Ip���0�*:i�Gn�6]U�����K�#w*�"�;�2�I&KA�,(���d*�<9������e�z�N�}�V�*w��
���#m��7��{����N5WxU�������>�U���_y����}������Nmg�1
i��o�������0?T=7���?V�1*H;�<U����(�-L�?�C�x=�e�����?�,K���f7/��F�����a)��z���;��|@�o��_���@kA��v�8)���:W�.�tN��E.�����~�h>�{W5�&��h��+/Ioa&��X;����R�R�_#j�t5b@0|0�/M���G��v��p���1
��T�����Z�UK�A!:��{2��^I}�u��.]�2�Z��_�p�|��_A��+1
x�O�#?/{�z�
9v]s�r��|*d���>���G���M/�{�����7���*F�����i
^��hU�*����[�=q;�%�,�'s}L����+���2�?��o���|���\��{��OX�����h5�K��b.��dT}�V��o�y��W��,���Uv]�����v�S�W@�a�����~�^?�����m/���M�U����5z�dT��Yn�no'���V�F�*�hR���No%
���e�(h���|I��Z�k�������c�L8�	��~;��X{	t�^�M�6a`6$��B�F�8bf�8�wW.
��P�*����	�po7����es���^<b����8��\�O����-��g"W�D���#-�X���Vs��k�
�p.oe�n����
����Y���H/�c�a�����K���h��EB��/����Z0�	�������|�F�(d��
(�,)�V��|5o�������{B��S�,�A��p0�y�J\�����F`�
��E�����������P��`��C;��
�'�8�^�������P��aD�������Fsd6��Qq��_>�!�����T��}T�G����Nq��R���]J���6X���I���w~C
f���XN�������I,�����)$T@I��_�vK��1���5�8����`<	W�&�����|���2��c~�\�z����6�V����e�U�������7���
0F��zV����������x ��t�2�*7�4x1���y|�����'=L+�6����;8;�3^T��)B^��rQ�u	\0�w@��2��D�����G��d�� �fV�V����$�2�������	8/������p�0	V�����1����<��(���-��>
��p�@����rn�l������*�����,<�a��w�@�
"����	�������7�v$7���H��l8�:%�q���Jh'_���:-�#3����������3��B����e���+��gQ�w�#��(�2�G��}V�c��c��D28g�g{����9l5���UK���XBL�FD�M��}1�8:�F�LH�S2����q�����?me���I|k6�s-���p	#Q�d�2���f�`�����=��4$!r�qN��[�9Q�u����x����x�k���i41L�C� �G�I�y�Q1�A��dF;&��N�hQ��/
�~%'�{c��(�H.�d
��&z����3!�=ipH��}�Dp2����{�A�3}K�PPG���K�}���
�����c*�I�:�K_��R�C4c�)����Cv��Tme$�������Q�E��^��m"F���Z�0
u�B'��*��\?S5J6*��z
F��G���1���L���,pd���=��I{(�E�'�"��3RG{���n�������\:Q����J��m��UWUn]��	����i8jR�j����*�!iz_!���\^uH~�Vp��w��Jf�r�`�'����d���YA���L�Zbj��h���������S�������]�Z9�G'�s�^���7E$�u�w��L�)������~pG���7/��C�#�x����xxe^;��M��B���p���t|n�f�z��$��\|���u��[I7NW�D ���R���@�'�I0�"�3�:�Q{b"�<!�|���y}s^`H��;,�Yy59������FD��"�[��o���l�����	Sn�s�r������m������_�*4�9�KE�ab�#7
p��M&B�e�8J�AV�YM�)�v��S+���d��dwE��O���!wc�Q�E�z�3�zN�&���q=H��'r(���?���2�:�3��&�NJ�&�dW����w0�E��[�����fd���Ls��e"!�I�nH�B����X��r�[� tE��@W����b�:dE&Tm�7�k����������f��M�{A/�����P�\��#�t1�VB��,�E�*T�+:�0���o/K�{�k���'�9�NN���?�|f��%.U��2��O����a�9�=�����BG+��Z���C�m�a�)�����Z�<7�e��#�	��1X�"�xe�K�DY]��e^H`��� ���0(#��X�:PY�*gB�oy���!>�R�$���%>��g��6��|�I���.��x�)�VR�����5����:��&
�_8(}d�A�_�)�=�4���tX���9.���� �{�������t�em,1�I)��eG�i%��<�����!����*K��4(K�������{�<5��E����nR\�y�d����xo�^�>8h5��f�6T���E�Lw�G�z�IF�+.��%'��?���'muH}{���=E���%�����D�z�_�Bd�����_����WV��������f��L)��(.�'�=�&#����5$��$��>��5�`f��~)������&!�z,LS
K7�+��C���d�!fg�z����/,��s3���-.e;�'1!����O�3aP,���c�g���	�M���|N���(��o����>l�1�G�R������@|�B�������	��0j7���� TH����������D��;_�����{�����p�h�wq�����>6w���]C�_�I��@��!�1d�k�[�a{���!�����?���e��H-���J���]��z"n�������b�QAO����W�2��su��7`1@�)e0rlH�B"��[B�������3N��jZ��d�����)�h������A�>h�ni�p����N�9��Yk���Y;��cs��Ix��Svm$��$���E�^x^��II���OD�p~�����u��PH�;A�!`YR"&��D(Y�(����$�R��U�9���	���(��F��(q3.l�!d$A�����OQ�3�����1c���%8Wl����������G6��<}����<~�w1O�t�0
8�f`U�e�p�Ad?+��{%;��f<./����&�I�0��c�f���[07
�����M&*���$�8����%	�"��%��K���~�^�DU��q./�`�������8�b��M�L�5
����I�O�$p4�F�Q��>i�BM�G��,`
���_L@8�9����a5O"���h+�QX���+��/���=.(@�������+2{p)c�{�;�Sn��v��T�%u^6�]>�
��l4����V����B?��;V��VJ��7B0����������#
,L"�����l�"6#�SB8KI�t�m���������f��r����Wv��f����}�R�0p�4�5�����&	ock�H�������mN������4M���.��nX�6n��`��9���dL�RF�gj����L7��
��p�k1B{�R"�~$l��L���E�@���
�rX-a�5I}d��A�lo����l".
�w������&�:z�����B���?�2{R�&S�UK���.�q�#�(���6�s>2-ls���$V�"���F����r��S"�)�]<�-����z����dJ�\fe��U�i��-#�%Cw���a{�iwD�b=�C5/�!��%��&�%�.�
1'��H�\LZO�X������bV�Q�@Ry��S�:*k��[���R=�����G��`���X�����D�~5�>c�a�Y�*����s�K�!�T��#�%������1`�8S�2����.���7�t"�1"�� F9�����Q�{)�L{p]��\2q��V����e��I�}9�=$iZ�)&��
��[n!�D`�R#�"�(��@L�,t�D`
\Q����l���!�l����s�e1�1)���K��<0LF�W	�B$���e�U`j���� Zf��T��e��9Xr!T�	��SPi~�J�R����&���t����HH�@��`�VB�lq�.����.�X��A�bYfgf�!�g��R.E�C��	!�&���ob�J%L���~&�� 	yP�J����s������s��������.�GHwe��h�L�_�<�^�i���syuq�n��8�]���o�$��_O*��jXD z������D&�D�0�Y�yn�=�u2.�H$��0%f:��|��"�t&a�d��]P������/W�,��x����'Y��p�q������s>�RC�D�4&G&L"`CO9]p2��|:R�7�����q���<Ei����9;�I���wL}�$oxr_.���.���T�R����&��\1��Q�#<���<���hj�����x�I�^`��i��� �$�2�S#c=1��D����h�s[�A�~I���k���-a���-xC��_+r���H�`B��|k`����'�+�H������|��n�� |CQ�-�S$����B7���i��������O�/N�D���>���s��Qetj������B�P��P�v�f�f��x�"�3_�)D�E��Y\J�S����$��n[!4]jo��2����`���T�#��
�����.�u���W��P~ ��9�V��).Jd���\�lS�p.;�^i�\i����Rd'����<��Mn���g�9�C��y�L�9�B#<O��oU���7w��z���{;%������{�AXe����\��	3YVw�O���=�kP��v�No:����J#���v�`cd��g����XF��(���~?]w�]�9z����=j��B�rv�9������O��/�_��$��H#��+�	��~��L���M9��j��uL���:p�1�5|zzL�]���F�z�(��F���Fgi��5��	�?�*��x��������p��Zs�D-���}2��4X&N���������v�����=:���Z��������M���)�s�l"Td�����f+
h��Px���i���,�S*X.T?�/<����9d��^S���i�g������uHa�n:�4��A�M:y����r�9�������?]���`�c�nK���*��2?1V����l�	J���y�A����f"�om�Cl������S�x/�>�\�L��|=�H��V�����-;J�O����dr?d���hX��;V��[n�LD���]���7��VF:��������b�ai�G��Q�����!�r�v�/���Lu����)�#2�r�x��*1���RR�{���W�<���`*�{(p���)�$���`���(��g�ai��Y�{��J��F
��9Z����i�4�
d?}U��5������kb���a��m�
����;hlo��~	3������um���n���>�;�a|�E�F���6���o������V��<vo��f�x������W���������D�q�����������=������G���sg��^�����f���G'C`0`�^s��,�L�������u���wO^�1~N2�Q��Q�T�Y�n$�����������1~��rL���Dr���m������j��e�
�[�]��BQ�W�5_>��3�������WJ�g���'�-�E��=U������7�+�'��t�R�_gA��L"U
Z�A9��q;;V��g�-�.=.iRg#gcC�Y�Rb$W<��r)q5�������T:e�s�>}����2����)\����V���X%����L+7�b��|-���k6������'Z>j��P�G�6o@�k��P�|�����	�o�f��)yZ�������A=�3~I*1��.Z��L�n����K����k�����I�Pj�(������-�r���O���?'�Q�rN�=������V#�A�4�<�����f�}q��aK���g7u���}������#1�k��r��u�vM������H��2��N�������U.�u�~8'�����k���>z*+��+Mz�Z��*���
�}NDYV���E����������~J����t��g���.2T5���{<�������vXO*/&�*��M�U��zm��+.���;�+������
J��T
��Z���
C�!	p��l���@fx������
����u�
����u�r�VK3�fA"�_>�vJ��ro5+�~ww�����F��9������/j6�%��n����PW�D�����Z/��v3I������Lw�}$����>Z��.����K�NE��)��{�_����#�vsJ�I���!.�9�D���-�N�����������i�.����m�(�/*Z~E#���vr/%��y����0����hD#��F���X��[6���	���uhm����6<�#\���Qbw[����m�����Q�����mwe(�l���h&]1������(c�mJY'��
1E�;3�W�iE���������������R��1��9����"��1(��F��7��%2��SH)	e��1�}��B�s
Q�?����S���R���SHcZ���M'R�5o��G�/;�J���R�f�;~�'�d��i���Oqo6�'���Qs�\�����������	���7�"��6SPd&R^����9E:�S�����e,
5�������"
5��h�5�C��v�
���������rHC�&:OC��:��y���\�h����RN�X��bR�M}\�p�h}���9/NO�����VT�X#���5�id�����_�V���{Ov�_���9y/�a~*����zO	�+��.��#X���o��M��D���ec%���!G'�����FwKL�6�{hP�_��=z�����)'�]L�]��V5�
h���k���T��n����1�C����W�7��3'Ex��a�=���ig�s�E�������������_������G�?:��-#���m�h����z�n`6�-y!SM��f���?d����~����:sR�g���������v��g~��,�9<XB9+~�����p���7K	��������2�i��4y�F��=���vB8#;q#7o���������������7O#��Q0K�`�F�9��h��@V���aZB8=_���0�g��6�({�m��z<w�q�m*�U�on��v��2Y��,��N��U'���d�E�,��'����e�
'�<p�6��������Yy�[��G�Ts}�����y&��xZ�4����`�Qc'���v����y�p��oO���-�_��7q�L���7�mfiol4���ixJz��,e�!o�7�]����qW�{������wx�#n=�hx��[�����Br��=�m����qh�[I�+-,��J���H�Kv$2+.v��z���f�����/��L�F����>��d�=�����B�\G��J��������������m4���lD�rvJ��7��r�=����m�������e����������{�FC����|�*�`�����y#i�-�*�"]�#�R:��;u���i���^o<o����\^��M���()!�"����uX�w������|~Q�F�c��"���I�#0�����X
�,��Y-d�T��i=��m���d$��M
��~:��t������o�XY��lEm /�!���+d������x�(�Z�[c�z�=�:��sE�G�Q�~q�����
���S�9S��^������C����.�Ld�Dn4Q��{��(�f�I>Sg<�I����ip	d"6����k��l�s7��dD��[a�����6Z�f�~�����MTl����e1��N]�yX���~l���+M�W������i�|�������Y�&��{���U����V��&�E{�m��d+�u�� "y�
�oz���#��!������=�}�?�7�	�-s�;O*�+G�����M5�z$H��#S�	y��)�D?��V��T��� �y�^���������X���/�����'p��������,F�4���7z�I���f����$����^L1���swo�h)�O����	S�"�����o��^�ww���2�_F�>��4��?
�O�l��o���t�d��~�^'�������6q!8�M����!(/W:���G4s�K�K����������^���g�r@���aB����Vpu����j�[���WG�7��jhE�U�"pG�V�q]�l��%}�}�)�tE���d�e��:�e��c@�ln��KbD���T!g8e���2�R��������)�������&�W��P#gA���d��;�0����(�K-�~=�{�qo�^��v�v���6I����������D�`�t 40"`�G�<�i.���A�����R�#������!���p���.1�>S����SE�8���_3��
�x8u�'�L{I�[����5�?x��a�<a3c^���(�Vn���p�s0�<�t�&������Z1���Y�1����=R���H�)'��3!�p2EdPe�A��n����]O`�D��I�J�;����;��|�~���H@AJr{L������(�*��3i0T����%�G�r�9�j�Uk���w�`��_�W��Q����0��������-�IE��0�py����&���)��6e��h�e��=b���aFn1$�H]��~~E �����aO��Yh��6�So�1��pR�j B{����{#�1r���49�\��U�����AIs�v)���M�b�E��g�����5��z������$���]|�K�	��}��$�4��U�p��U3n(�N�����[�p|�����o��Vq�>����q�1.������/��fi��	��R<�M�����7?�����R����LfZ�`^��p�	�H��v�e��=��L!Bl(�F������C�����x�sD�'�x�? �:/<�P��h��B�I��LZ�S�{����BY7�h����7�[�6���q�_z}�[�+�ye�������%��pf�������m�������E��������TPC�aKP����w"����7J����U@���y����z�XX�ui����wV9�;}p�	x����/�T�zip��Q�o����Ny��q�����/��b����{��U�������;�N�71�?^N�O>���g�D�a���[$`� ��w��Rx/�%����n�~x���9(:��Bq�������5&I����_�}��v&�G�����c���nT���������e��K���O�T�����8s�Xk�����3L����abO�`��E���V��xls3�k�Z��b�is`�`�53m���h�����~�����������&�-��X�r����$�������������E��l'f����x��C���r��B����!o.��%v��u����2�����oUr4���1�N����Il����bt�����E�rl5
E�P�1���|��9�B�@eV3��[�Cr�����S�
&qoq�P�`��_B=\D��5���=�����As��*�H#��G�Q�	]zv����;����_���DJj��,�^<�N�FR���������J�,,\v48�u���iE���2�����/��Q���P�����V�G��*�^�q����}@��������_-?�KD����#����������������_%��_��|	"���tZ\�������W'�
������9���?��E��������'Z��^Rc��m����J��z�DU��?\]��o�~�E7�^�)��s~��=��Az;c2�&����pEy��{������qV���i������/_S�u\�������|s�zYP������A���7���g�,���W������
�9k�KzzbV������
P����������$AyR���>hP���O�	,��O��V������S#�������Y��������z��'3��s�GXFY�a�������o$��W�[��Hr��������a�l3-��[��4�*B�t����Ce<Qk�����m��_���hArI�����=g_�/�tK2�WNl��znK������+����7�7�k������
4����t�x
��{�bj�j5m5���~�7v����PYK(YJq�0�23?�k������.?t���%,#���_{�YJ�r���{.�S>+�_��C:��������r����*�n�CYGW&&�!�[,����0{iZ,,���j���`��,I������N��-.����:v�WC�z�� ���tt�B�������d]
G7��=r��=t��sn��7��������������/�gN�'[�6o�o:��8�Rac��)�7�����ol����gcw��i��o��4������nl�7����4����h�������E�p������M�{���f���N��Kv��dwp0������^s�m4[;��n�����F�u�5����W���,Vc���.a4��%������8�����2�~�qV7R��f;$����Y-jPC���N�8|�}���mm�oo�_��2�*������������D�3�h��o}]��_D�����q�A��`���Fm���]���u���d������������c	���l���QO��j��-������!8e8����pn�����S��7	l_����^���)@|��4':t`\�(�q�)4��F��sT! ��h���W�H�n.��a_�D!���� �}�p?�-��+>��_�����%u���B#X��uar�e�dJy~��a��Oy_ H���L3Taz��6y%��[�1	`dt?NS��������X �a�<�Y�n�+9����d��K�
��,$�H�Q
y-�.�N���<t�x�Q�5�Q�c�����0u]�5�)�-�����"����+-�f�]��/9����\w�L8V��L[_�W2
��[$��&�&�f�63E6��n��G�����P [������_��K�����AT���3�WF:��fG`�]��������������Rb��8U���]�6��l;�T;���N���G�fV2Ltj�L�I����@����2w�y#i�2�W�fi�vn71���j�061�L�}��I��`K��*��')�V���T1Ed
MX0'd��i���ih��Bv�p���a�.����4]���)y�:����yf��������Dq����1�.�72J��'�M��7���E�`�*�h�`� ���Tk���	�f������$
��D� t�!����S��{�\�s"����)���=~*��p��m0/��ut`��)e�o&���+\}�2L%����a����u���8yt��+��{���Y���#p����Bv���hD,:�,���c�b?��E���kB����v�&���&b�iL��:>�FX�uM������HE&j���	T�;[�/�?����e��?���WqY��c�4EUb)��a�45��z<	���6�����u�Nbc���!���n�`�q�����Fm�����%��e����H�v���Z�d@`"���w�:���a4um��;��Rcir9{�4�r~��'-��*%q����
���`@���f{l�Z�����."}k�4��]^E�����h�h*������C��\c!\�0�����l���B+�\7��H`�F@���2���_;���y��~��`E:.;�c	d��0���li�b���Seh,Y+a!�m�-���HgK���Gx�ze�.0����9�y�P��O��_N��f��2&�3\����}���6G$����g��J�� �=�m���hv7�|x��?�-U�]i3a�E�y2�R���Q2ER�����E�=�SXG��&:^E�����z�Q���HR���N=~Z� �1����~�vw�����4Q<�~�Za����Mo�����}_o�Ee���8"�+�:�hn������A~�e���i��K���lX���
m�/)�����E4a��~��$��f�*7����S5s�/]���z��?}�t������m�=�<?J����h^�Bi��Q���6���~�h�)�=�]O��F�����Y��/Q|9��U]/�.m�����<8����z=N{��~Q���
��\T��rq`~�z��=A�E8����C|<N&=r�����}�L4��9������x�*�<��0�~��m����	
%`���0�"�B?E+}}����H6n;�����'a��e�0����������;��F����~�y����4�����!�(��������������u~Q���h�e�����^�yS�K�jR7���;�������/C������R����[2������c���Y"�d����2���yB�5xYO>yj�����c��twO�:/����.�i�}��P���w	���	������2�6�C1+UO��6d�[�d���Klzp;��������[���c8����FR/!#��X�&��$�S��)'��$��c�3��&��X�C���K�]���j�$I9rSc�Ot��I�F�Q��+�S����h����I�D�Nu�+���'E���<��i�L���K2��8g�Rga�t>-�3nU2D�f�����2�#M�P��_<1%*>{���l�Z��e����su��0�qzw�Y���G�v�wk�m����tjYy����.��SX�E���#��Wi�6���8��[?` ������y�R<��������+b�e������3w�c�����be��p�7�\9��3k��/$X�����ya>�w���Q������qD	�)d����}����
zT\'	�����k��g��B<�^�b?'����L����QP���}!w���z&���Bp����G
��mC�X��1��E5E7X��^��&�u{�	g��4�����(��Bsu��s��9�(m�ivT�kL��j���}�����n�Vz��w���n�(mz��V����������6�u�Z���������:�c�����8������g����d���kF����tw���q�{�~�$Jg��\o��9��������GZ�����hAHc��H%k~�Y���&�{%�@.���7��*_��A.d���A������ {��Q���;����5a�`��"��1���A�q�&�:/Yn��|�����AT��l"_&@�Ew6q���i��'�U��,(�K����aSw��`���e.���[�r��t����bzXB�(a9,��EA>h���>��n�0I;Z�\9�����<kB~�����A����i�tUX
������E{�nUrT�Edm������'d��x�Lha����"��l���sX)��L��V�[7�[?x�0>Qn����{)�E1"�L[sn;�t=���D��E�4�,Rk3l.w�rUE��N��q?(���fP+I8M�q$s�H��Z�AT�`	�FL�g#���>}u������5a�:�jS�
s�+�=DR����nizs"���5BL-��er|4�
�����2*������G������fh����;iF�������`�8�kW����~G��;�8<Y�7�����{Tu��9I�k/��d�Rv*=��sN��D�Zk�e���A��������]����yw�d�!������1v3���N~y��S�JP�P�d�N��?g�[-Z�m��4F�������{�\Js�������\�t��w%]:h�@�����pd���sn#[����1|����4����c}H���������1�Q��=J��x�+XZAH5�"!7�!��aq�����;D��g�4n�F��� 
]�a�$v���Ia@�E������8G������N��E�������N����H��I�t�����K�}����L��.-�8"��B1XI������E���u��������0�-�-o!/@���|�=Ix��� ��g|C2�)�3����l��*��������7�s�KG�s�YR�/&���%������z��Q�o��_W�W�7b��f�\ca)hl�%Q�2O�b�|�����F�-�g���(QC/����Ue�4	�*�
z}e��������jz����u�x����[D��r���v�]����N;l/;	^eG�{����4���a���
G!������|8
)�=5���M���}9X�y��p!i��sC��df�>rW]�x��E�(�?�SG���&��o�����`��?�+���m����s,�[!-�{.r������0��������
��z=����NA:Lye��}�6�Evi��8��v�����F;�x�7�����������f����zn���� �-Pz6����jB���B��{4x~���:�����p������]�qfO�G�n�v�k`��m����Y�p�#��/��	����-�]2t��*T�:���?+j�}���/�i���2���QwF��7o��Ik��~��
��Q>������;X�5��^D#��h*�dm�5��}GV)^�I���r�/���{<V:������,���s>�Bm/v�Sd��Y��bl�Ox�Z���U�
��]���O��>�C���|�������+����m
�#��������YMm�'S���&d6"���3�G��G�}v\�W|��C�e���e����X��J8, Y�����R���1�=�rm�;&1Dl(p������8<���4�]8�����q�x�����`�J��){�>��vS��kM��r/����h*�&��L+1Ni�R���5��i�Fu��5[������h��{"���=W��
����h����F��H��2,o��mNtv[a��W�\TF�������gz�?�sn4cs��9��@=�"_�<OxMe�f�=|���8�o�^�����7vn!HW���K�k'��H��_�l�i��*g�i
������2��y��i�o5�-
'<��5�3���L���D����k��R��	�y�Mqs���H�����B4<�.�lj#������
�j�4������4eZH��\���=�8<�8���������o�>�,T���I�|O��O��B����x�G���?�m�����|�j�O�Y2�%���_/�U�{�l�{��N�^����������>CGB��>:�!>��=�[���O�ax�>.m�����<>=�?>/�'���F�����a�mL���0&�=��� h��N�9H�L�z
4���+�C`O��V!����;:R�w��_����7�y�_�����/>�j�9�jj���E
y^8,�T����A�'�����h�����7���#Q���_�1�2�N�U����a�psiC�sR�(�Io�N�b��&��K|�m�B�1��t��F���W��Bk���������u4�R��y��c��&)e��P;����c��B8N���
8q�������K��s��l��q�8sp�"�[ag!����n����'z�j��zv��<=~���SM��v^�8~(v��U3k����r-j+����<;��_������h �n����a�
�	1�`+l�/D��(T���~��B|q&?���O�x~��'�`��"�"�~h�������K1}R���;I���M�&|	�~]c��li? �P!m�������WUk���.Q+=.������V&����(�"Ox0t8���S3��WN����<m�
���y�����M�����qA<�0����������T#T��g�n�/�`'��$�yE&~�$�44�u]��^>S[z[���0�?@.d����3��a:���'�xl3Ju0���� ���8�S�:�7�#�B8��"�7�������Ex��[�����>�l��e��O��1b���*���=.L�g��<x\`�&�7]7c�M�7��9�w�p�.g	1wU����F�3�����,�DBh"e.f�aq;�n)�A���s���M%[O9�/M�����f����f��~c��6�g���r:��E�������i��x���|�?�'�K1��9��vd����$�����<�g���X���e�)�R��pH`d~:���/�@#�]�"��:u1������%0�:�p7b�x>y��{���Ib<�.�v�l��|�SnME��kM^5���'5�{�F�����������<&��<I�K�5����h�:��8��G>��""��d�K�i����D��G�����T�=�FO-2��%|^q���y�I'�T��3�;����7e{�n�

_bbBv�G�>G���3z2&���mw#�{l!	"���b~X��B*���i��@�w^�
c��K7�����D����D9�;����8L`�e��Hs�I8��pA��"B�q~�1�A�3�h�F��!���:ZC������\U��8�����Zb�?�P��k�
\Z�����Mlq����������4��Ym�J_�F84��Y�����)m�������j��2��yE�H��������h@�	_�9����3�J5��S����9��e
�du0s�X�	�S�P��$���&'�����&-��u���@�7��<�;����$��������;�2���(�n�c��$4��h:�qR�,fG��~5���W]�~C��p��<~`s���UFF�4�IHB�����������	�����|K�~��z#�]Ml4I�z�����4��|B�6��Q�L�M�-�N���i��-�)s)�ppJ��@m�kO�=6dX]�_\��4Q1�;��wv���q�R
�g��>���\'u�am��"���~efm����,1�9�vR6�O������d����O�m�X�t�KQQ�o��wj��=�#���?���Xop��{-	G��j7�b�����uH,�kAn���:�8����>G�-���(���x~���������i�G�L��3�$��|�A�]j���z�xd�Y�7�����K���"2�5�4��OS)�'*U��������b?�	�z�0�h&��P��Xi�ZN+PS
������d��NU������]����-�������K^�5��*�OT���]JK>�kQ��S+��!!O�����paR6����J�0�r�S{�G���0]|g�����2<5��=�+O���G�`��]_�W�:}�[�H
cv���jHM����M/��4
9��>��`N/��4�'��X���;\�������z��N��?>z}ypz�������������Cm�Q��MzU�4�����u�u�V'�J���j�0i?�8	po�����
E�:S���b����g���l�����{�����\�[��[���<�`�3��w���j�O�����df*W��[���0��Jj����>7�Hx���u����I�G [��7��i�,���d�ug���J���NR8��th��U��� X��:=S.�$��P,�a�V(���X!J�q8�QZ�K�8aP�,i����R��M�����f��S� ��;�<u�[M�G�<�GU��#�@�/z��s�Y�pp��H�Kem����%���U,]�+<^<��x�c�����������O��)�xh�I�8��Qx���l�8='��.
�
&w#�5N�$z�{f��7��*�b?����C����p�F�����0}��)�^�	���uv����6��
"S<��KC�I��Z>�L�r�.^����[�x���"�|�-�O��p�"��
��Y8� ���q��O	u�K�I���)#1]���[�G	�&X�8����=��B������jj��e`?�!S4��
�<x�p����F^����ly�Qu�������}�pZ|,i\���V�"T�"x�|��QA;��7�������z�.PdQ�^�{��~��f3h�����-l��v�!��.Y
�WPTo���������aa�-P��h������o�T�������^����� ��>V�Dg�P��Ty��v��������0E<�OL1kO���\�D6���������@Y��.@�M�Q�"j�)-��t��(-�����������K�]��[��Dx��p@>j]`5�������B������B�����h��OO�y
�f�y��l��}�L����;_Ry~��
x�<h��{��������(�*��;WDp���]:��8��^�;���{�zw�
P�[(#���Z����*`:��n�R�h#I��������R*�3�Z�TY�!�&�fLN����
�u`���^Y�W�C^H1c������IMu���%0�����nj�1�g�L����!�QjL
0L�p�*�H�)�Q��L����G����SL#���vX9�
l�/6��W������j��4����B�������)|��J�9_�Ck"��jL�h��2���)h���0�2?Ec�4��3�a���t�-��,%clp�~a�����w�T�@8����������uC���r��S��f����GJ����ff=&��X�����<��)��`D���h#��N���y��l���dB����7^C��L�m}�AA��.��x������(���?Q��*Pk�����w��N�r�)�

u��4��;D����I���'.N�AXlK�s9���$n���Uq��3FX�F�vk+Y_-����/d� rz�PY,����r�������d9�fx#����`
�&<��K�[���qt����q)Yj������_Qs�0��>��@Z.X����&Q�����4��+!��5����I`%���������^T�M�����b!���Yx��#��0����qj'v����� ��r� b)�e�Dc\y�8|rK&��{-����|��"h���b�����������%D��I&��ab�8�S���j��<Un:���2W3�H����B�4Mu��eg�V�$r]�^���W��N
��a�3!���mGeX�U�F2+,eRa�0SX	�3v���#�6|n�]�w���:����d�S��@�'�:������%�K�kp�fi��'O8��	�d)���Q"��T-P%I�|�U�Z�������r����B��� ��#��ja��_�O��h���&6���U��4_P�u�����������J�.������mu����)~���n�i��F�mt�:�V��v����������f{7��=R��7��������k�Yg�Y��v��_�X�UHT�q����D��'�q��T^��L�D��
Za�
�P��(j�.Y���I@Uh
����r5����o����D�b�t�tL�:�Pq)��o�;��A�m�u+�`uLy
]�#�^t�bY�
[gR��L��9�D�'�\Y���Z�zGr�"��\��&�3��f.���{�V������8HU���}���	V��<[�a�E�jM$w����3U<D�2A]np��
���0)[L�n~x��o�G���+�PCIn�k��F����\ALm�`7�.������Z}7I.�������9Q�B�
��
wv��;�L)�dd�=%�G���D�����m���)���\�p6�9
�c�HN�0��,�0LE����v��/K\�7����E�e��xC���.gJb�IH	�f������>H1{AEZ1����k����57����V��=�Fnc������z�C'(n#�n�+C&�90$�tv��:��J6�e��)����c�P��|(K'��
��	�S��A�t�-J��A��Ut�O^z�Q���J���22]cXTZ.���j���q�2#��-A�Oo9���s����M�����m���S<E��f���a\�
^i��~��E����~=+_ ���V;j����?*V>��wz^=�����_����n���@��:q,c�D4�����EM,@�����p
�>���9��9�3��,6a:�rm���6�-J��z^�~��%"�$�%V�������NVg�/�����ne��^���Lb�Y�I����qH)�>�!YkV���ETvx#��b��q~��


l/z����9/p����p�vk�!���b�q51����~$����6m<3-����j�]�Z�,r ��~�+��6j�jKg�b�}�=�Tu;r��c1�(�mHY
r_R�s�'�Q��'�/��)��%&����K�#{��&`X������/���k������^Wg��]M���<']\Mb{!]�.`��Y�B=�&
o�]�:Cx��W��T�!h��[�G���u��i���%����]f��t�4��'|	��z%'�7M�5�����F�r4���K,8���2K��r�p��
���<������K�c��X��[1�RU?�UL�6--���*�o�������G��9huX�t���z����G�f�� A� �Y��>+Q}��_�����h��v��a�1l�����v^�������H$x���Z2F���(n�w�AeX&G*��R���xk4������'�g9��4���rJU�T��g�Ur�J�F
��,�bj�v��'1`�g�'s����n�?�7k��%����Ks�f���iq�3�L��J%���n?&,��)�	3���68jXiIk��1�9�R��>���-�>���Ar^t�o��tB��G>)���b�������?�9?�?��a��Xk��/]�����?��u����T&���1F�g�BQ3m��m��k��������0�v������`8>�O�����[�e�.��c�����&W
�1��hp=o��c_�X�H�!�NxEqL�E��L��7I&;?DSR�K����{����u7M&W�TTG��5	s9�$J��	ZPN���6*�D��H��Y��k����J���*����V��.:�f!�hpPA�2��9�r�����R�����������F\
3��	0���&�E�J�FY]>Mn����M���o�}������l��-f�L�]��k��r/�K��Ux4�m���2�+p�nns/���J.�
O���<���^��lk��I�5�O�1j��UF-�`��_��9
������_����w�N���:���&d�MG��}���A��_<�iA��2h+��
r�W�S+U: �����)�>�p��clo(�����H�WvXE;	�D�����OyI�bY��
���B��Z��
x��5[4�+�'7C�f�g������Y�bBd���'���L:�I��B�����a����4���]�M�������F������t���N�������\���r��������?��z����?������h�� j��F�^'�t�v'j������=E����������_����,������;��'%��q��������Q|����@�8�����f��~2�6�� V��Z�Jk�x<���������)��6%�@m@nB _��]\�� d��@������D0@�7:4I cIV��1�,�)�R �N�B+�,�R4G#I'�-H�T�;��v�R���F2u��4��-��!����t3Th�����p��Q�����L�PD��J1��g�^s�H�>�����.�*���*��`>��Y����������Ox�y�t�N��99/��D{�7��Zq��;��	��x�|�UqMR�j��1�v����S���>�#>���D%�����x�E��w�~�����uG[qw��	��5���w���WX��i�����x�����+�����e2�b����tp
��(��U����6������n; G�j����>���}��'N�u��������	����n�n����n���R��x]E�O��w�L0j��jq����F����}���e�s���GP�2,�ai���K)D����`�8��Z���g��
���U�����O&.���S��m��������]��
���h\rl����c X`��o.|�k��=�������j�[q��h��2S{�{f���T�/[j/j`����;w8O�����]B ����l�x�KFN�^�d�r�',�dCo��������7j�P�7�����[g����M���c5�z���ij�u������Q�j=ZS+4����Z%�-R����_�]�h�ZJ�^��Vk7��f�l�[�%�"���q���,��\���,���4�������� ����s��%�9������7E�<S����J�Q-���6g��-<���^^�C�+�*����>�&��"���
����_.����3L��|���g�,6���������	��Z��6������z��]=QU�������?�s��������nuc{��*��~�kw�L?����y�im>z4����`b96��MvN2��XC�D�@���)����q<2��cDO*�D)��M1eeq*Y������h����o������~-3_~�p�;�T
�pVc��G
c��y���zrH��d��w�lK��z��$��I�q�� jj2���#A�?%9�,T�KxU���.w[��(v5�a���.[[�)��x?*���(�Ihq4k2=6o:�m4t�H��C�/v���k��7|oc��z����/�������.�R����ur~q�D�P���h�WQ�V �R����a_�Y<�T
,�����TA����n}�Y\o�!p#A���tm
�����a@���0��������n�5j
���(_llS��!#)���M�J����N�TyM��'|�Lq���n�B���l�K��~��P���#���npMm��[�$�5�\��fq���]H�e�d�J:�p�����Z��

�2�gJ�_~�	Z@������������j��Q5�Q��%�odKB����g?��4��g�������t�U�I7���������Q9
u�������6���=����~��CCq[o��	���^e��ES|�j.+,v�d��������\���?��G�e����z�[��a7���)��v��|�a7�V��zZk�C�w�$�Q9'�W��D�����b�:+d�����Fgyv�����d���g���~so8��7���r��@��
7��4e/�t>����~�����nA2N�)I�qz���V$���y�Dol��~wt�����sU���=5���w�vT��8�����O�U��*��o�����#��w��hY� �!M{u}`��i�Q���?�Z�g�A�����6%<�Y������9W<\{�����Ug���s�����?x;�����[�_��s���0��e!E���y��?3���d��U�@^���lu�u��
��G�c�L�5�$���[�s�����
>s ?�h�����-�����V%����^��*�����^���t���V�v�|.���Jd���������/=S��;�(bN}sC>C�����������)N!*�f6
1�^��/���e�r+���i.������	�	<�P���_���O��P�4��|�������Z����9F�V������S��lt{���8�y��<��R]�3���p\
��
c�Z�e���\� ��������Y�{.D� �G��0h��L7�]y"�1=M�`	r����5�����N��D�D4����Rg�� ����Hb�R�%�AW�f�J��g�(�Ab�v^���wZ1��dL�i��w�����ut~��t��������mn�����|7���F�L�jRX��8������T��2���S)�M�v���vL�����Snf��_�]���Z9Us$�Z����m�@�@���8[��pO"N��c���=c��z��0ol;����v�h��tqB+��_�<�G)����(�U�d+�F{����U�]�M�l�"6	{I��hG�� � (/c����De)>�!��2t�6�q?����#�sle��E��b%�xF�v��F���<��_?`��|��4��[��!���t��7?����!#��1���S.��F8|l��"v����
�?/fI{���y
�������N�_1bF����G���^ba�{b"����{l��A��03����r
bP]e���4w��#c�a�[�����uZ�{��V�u��a����i�n���z��)������v_m� ]76k0J��(��x���$;�e@���w$
pg��$�������A$O�\��Ie�'���&yx�����5���<!8>)LC8H���c��Y$5f$�a�
8!6fp22<��X����&���c���	������I*���S�������\�|r���0{M���uU��&���8��Y@�������h��i�^l-8���pAf�\�#��#K-�TJ[7�%"0�z3��M����Y@������� |`c���"Dt:C�Mt�h�<�/���xbV��
�f���0��F��J���\b*U`[	e�R���
�b���w�Z	������w�$�:S�ed`3���L7%�j[t�RL�U�9M�ao"��y�M�y�[�E$����N���)��s��|@A���g��OX��-p�[�n�5���!.�T���ll���8��k#�p�tV3�/P��T�aWI2T�DjI�O���5l� w����Z��FY�������{��'����N6m,.nY�0/�1�?�TL��g���@T���R�����������?�����_����@�u�I	H��~ZU��u���hb����f��E��6�B1�dn;Ktn�K�,�{�������{8/����5����$ {X;$b�n��}4���d�X�������� �Y���h{.�����v�Etx�PV�_a�7��2���s�2���b�M�Kc��R��SC�6����y��1�Qc��J�'�Q�g��l�����)��A��gj7��6�Ns/lC�����kO{L������X�F[��D���O_����'�$��w���XI �eRHW��t�Pk�%T7��H���(�?rX���f^%���n�Z	�����+1����w���J��aU�&�h���u�i��\��^����F��d���$6�_�a����S�T��e�|&�����/<r��J&%9�~"G<q���� I�Z����U������V("��~4��kq��Y�,���KS-�N<�������CP���w�+�a���VA~[�/u��JI1����V��]�r�EU����p�����4SAb�� t�'lB���b���J{����yC��+uj���|����(���U������T��������gtao�������@:�e�8��x�{�y���w/�!���xM���=\a+?kC�����P��v�l�_'b�B$�����&�"����}q-!��,���~�i2����&��N0y���������2�*������3�Qj]	��Vz{���&VtP�����@�o���9�E�&����wtu������p������-�'C�j��!:���a?K�k���Uwi��7�����.��{.���0��oi�",\�Y���w�����~2�x��au�����V��J4�yg%�����_rnWb<�n73��{�����o�wV���������	����R+�R T�rW��"��x��E{���j����vf��UDq���HS�������H<E���S'�e��:��������C<����L^/bV�������`��������bG�t8���������Y�O�Sx���{�vB���	�d�����'���'\�>��x��	a��Y��?���R:�i��^�����s7��Z����K@��U�zkZt!k�����R!��/����rGL���F�ah6��
�\�Y���{��!�|��$(X�	s���M�%�af�4��U�vAmj��g�$:���%�L�)���(�0���%���CV�H�����G���O5k�28:�@�vr�^+��
3|�(�N�=3��)v`���
���)��g�����lv��S���u8Mn��Gk`<Hn�j%�%��]�`������/��S��m�r��X�����<�a�{hS'��-��r�U�����]]OH�O/����y�*8��sE���,b���]ux���,�|��/t��\�%3�8H��r6��3.���b#D.�Bu���s�\�y���<��-��-V�~"B��
��~�R^�!WG8y���<A���E������P�z7/uU���#����(,R���Rk�=Pvx^1�e2?���"����R�?����p�k�>QR{��DW���
1��!i�I��i<Hr:(�����h�p���C����)\���
���:1��] >R��)�=��D��=����U�E�}�����/Jo�����s���M���O��b	�7�v9����I�
�v��&�~N��,�������`��� '�d'��O�d�:�	lr���P�J���e�r���v������]�����&���\o��s��\�h��#�=2��i������r>�]�5�A�z*������i�0��=T�n�C�9�B��6��[�����_����e�F��CTD��Eg��9�n���O����u~..����zB������������6�D6q��X�N1e�!N��������"���h0[!�:g%�����v1[�����Hm��OZz�X�(Xi��+<` Dgz[@�:����H�a�8�_�%�S�;�i��t��swCV?�������S4�$*
�\���Y�A�p�M�7��0Q=4�L��a2!O��@)���rcu�V!!*~�;���7jS!��rC���_�il�x6��jk��F�j�qh4X��c�G-$�#\���������t~���
O�\���
���&�c�=Z���~��n�A<����k�)�����$�y>K�Dp�����#����5�gH����'��	6�_��
��d4N��.~�g��8�O��xmd�9�F 
���\cn�$�'O�������z��<Q	��J���z=�X\��7���%#wwj�70^f�Y&p�PR�}G��+	��!]�����
r'Y+��L����l�C���S�3�m$
�.3�n5�:'�
(��8 �\��ln��mU�/~����U��k�zg�E�5�^{���@]6n����w���N���`���m��{<�%��o-o�]8��A'��^���m�������������bvi�����}���W��{�S�^����E�3��M��\�2���C`�~	��(�5/s�;������Eq�r���k%���B�8��	�Z:cn/Kx�WQT 	���
]��$1��\�c1�	!G�k�����������.t7��Oi����s�����S<���'/�����[,�S�7�V������/klYw�q*B�����6��|,4z�>5�|'�U�E�q�"W	���nM��	F��0���9��T���|����WO��jn(m���1t8v�M7(�����1�?\|szv��P�|c�����;��(�@_55�K����>�kb�w�+�����������y������^s|�Z��s^���|X���Buq�N�m�?>��J�m=���]�>����)�+��*��_�]���mfg��I^���S�������U�����"��l}��v��
C���MfW���ER~��h��?I�=��z������=���:;���O��dI,����Q������7�y�_�OO��X�yJ��nZ�NP��F�4V����e��>I�9�f�js�o������:��r�\Y0�tL�,�����~�`����O��_���^��{���=�u����'����3��/�T{YA%�*[7�����F�)��?�8N��	B2F7=�te��;q,�Q�����f�JUE�R����
p�7�6������hr9��UUzo�_?�m��>�zd?��S��A+
oV��]�O���Xfhu�(;��r=-��m�a+�)�������VU�
�
���`*���s	���4�F]���u��rO��3o���ir�EU�\#��MM�;mmZ'������T�_���^����Q���Y�@��N\Q��A���Z����.���X,���As#&j&j���~��s,t�t�"Ew.~��8��op��B�]VMv4�3�����
�
,z��S�7�/�gw�������
�z@�z�@�I2G�5<����g\PbC�U/�mt���5�
)$��T���pT�6N��D�S���G�a9'�����$�����Ri�{R$�~�n�Q���[a���D���L*���������5w����|Ui����N�}p/MK$�4I/@��!��m�������K�&��%������9Bz��p��DA~�6]������GB�8��Y��{b�4�������3��8���3���-�����q>J����O�����!�A�H�q�o<��f��n�%�R����U\�����=!��a4�=^�+���_:
�+l��I��g�g��VQ��m
�����4I����md��7�l@0�0��0������*�J�W����SP�s\%�^�#�2
��6���uZ�d]�H������3F�z�7����|�kj�&���&�#����j�A�f�����%|��v���q�#g��t�����
��K^��^��o"��0����>IF�����D]��
o@��m�b�+4�4VB�<������@FaMp��5"��pr@����h>T����������X�������P��o����}k��qy��R��W���~sz���Q������u�������������������Q��Lg73R��?;z�tV~
#=u�M��7��\v0;��{��i��	�9�Y���9�zl06��>���b1�bU0m���q	���0^������!�����@�]|�Z�D��o���Z�����v���������w1�Q89�8:8��-�lPX�x
�)A�~)BF�����Q��ziI��/
:�!�������>��������4i��N��6����}�f������X�����I��c�;qN
���;�h�8U?DS�CN5�3���������;3B�D�?T��)���z��,���!t�Y�w����*O�����9�L��p��/��a{��.C�A�����,�
��)��[�L�S!oWY����/Y�{���R�A����:�����5�K��|�}�C��d�������a46����o�i<B�z~�,:��L�����Ol0.���I��L���c&��^�6���Q�H������yx��8L7������~tO��x�*o/�A���na��h�*4��	YP��U�+�����g��[5��e��o�v.o�����SoP��+J��M�t�C\�?�@��6��w�^�n����5o�<��>1�D����E�]:��y�t��\<���������O��9���&$��
���g����yn1���7�����Ch�p>�
)��P����t�G4O���]��cR)���H�x>�������^g�aw���Z�����K'm�jd��c���n�����-\L��z�����E+�<X>tL��R�/?�fmJ0���xB�U�D��`6�O����e�������W�U����?�+,A���������n?��{/�	����"o?�F�k��ZD��m�Kk�e�����1����
�����w�a���������B����VA��`n��u���"��Q_kh��I/�M��/�/GO{�������s�%(&��%�1��g6���w����M ?�~������s���o�M��\��q~$@��x����C����J�8z��<Q�f����L�n�3{�L��7�+[���������R��/����0A�d��R��
����z���w��`UWHQ��<"E���> � ���?��8������!�����V�";������Y�����K������4=��L�rX�x�%�8#R����t<U}���HQy�L��Q2�Jh��-o*�H���7�����������rK&�|�V�+�%�up�E!#v����~{t��3_�������F�!k��Qo��b�����Uv��������V;��s��a�w��wv{A;�u���wd�y��Z[m��V����y���a��y5����$6p���J��x�Ms�`�jcC��K��z;�����]S�|>WN����6���-m���
�q�
3%�.t����z����x��.\��.����^�����h>Sk�S���>������J��Ly�N��L��do���/2��������B/?�lO��S�vY/���u�6���������~H�U��[�f�^�
��n;Z�J1�,�P��t��6����wrC�)_`�MWD�i�RAl�dyJ�����]��^������q&�o���XS��}3��$6O}�q*>l1�������W�ta�
�#�1�q�]Tx�]z�����j���
;�l�.�����t<���Ts�I���L%=p$�������3�?������Y�#�w_mr\�IW�K���#9)�^
<���D��Q5
>�4�2�' Q�I{�k#�!�I�*�����.�OG/��3���Z�l��O��@������P�
�'wI����P���
���t����_������z��8L�O�� �����8�?�w��S�@(�'�N%���H[�?�j�F���rvMI�����2!3������q�+TYL����6vE�,����H�M���7������T��dE�0���������#��!�H�����p<�D���/�vvx�Lb/��L#�+��U��?d��;)>*)n�[�z[�-�.V��=>V�����=��w���@��������������u4��V��|�����Zt�iT��`�$�!Hz��
uq�������k��>�ik��9���gO�]%���|:�����g��94�v����QkY~ik%:D���Y��� �b!����c7dy+A(��b:�Vf�6������,fw���A*�(����`G3'�Rc�R	�}I�������
Y�3��W�T��od����w��|�h��>M���2.\����m������~��0�b��i(}X���V3��B����^v�h�,9�/��h7��������l�����E������O����"|yn�P����d���qx�G2_��"N�q�NR���km"��%��1�q)b?�)��0�"�z�Wj��)��@������
�U��g��
��muz�9����\��K�U@���p(��_�����x�`t�I'�!]��g>�#��S�j��}=O���.��-(�=��[�)�$4����6s1K�
��0�LA�b�w#�=$,4j�Qs���;��a��[�@���0���"�R���/<�*���
�u2M���=b� nx<�G����By���xv�����sC�"�Q��\�e��-F��1�X�h��K���]��r���)�!������A�^�#r�.�5� ��{�yDv�7�u��a���
vG����6R�_��p�:
�-���[zW������{�X���fz�c{�?�1�����$Cc�	���F����C������S/]���p�����b�	�nL{�4(Hn���+@��!#���h�ZL����W*3�b}���8���!�|T$)Y�GU/ `�7��Kk��\���E�a��P��?���1���l����4�Y4E`k��RP����S1��G�	r�Ax��"}��Q&]�+���H��!s���5���d>���A}w�E`^��8��A��s\����/P���Y8��~�i2����V>&��
��M�&���h�P��}�A���:�G��)�?��Q�%��v���U���+��u��)_��ttZ�q�nuQ�W�����g����P��)O>%�O������zc�Ucdyj���B���x��^������[�8�7����3�L�+�'�H�s���1k��J��8��{�o����,����������=�	���%-��b�������V��*G�t���/ZZ���	::��Jr��%�����uz[^���7#��by �=�`!P�����K����g�w�"���W�����#o^�c����eEq��h�������^���Z��dF�
��VjA)���P�'<�/T���FY���K��zy�#p���ix[,d<����j����=>N�U{{������
��������h������0���qK������_\���U����k���K|���|����V�^���)�B5�_Y=��+R�j*R�/��~}�_X���kD������D���R��G;J�x�b�K+��WK��j��F�k����>�����������?U�U�����u�S�"v���^���[��_�L�W�r��.�<������1������Ng�.���� -�$���Q���E��./��{�V��K�6������	�������:�U�K����+��]�����H�OTuu���f!��L�k�.�_�����n�^�
��Qko�e�X���CTbk��������O�b�UL�g�%-y	n�a�o1��m�qCw��Z@W�;�%U��
ck+�3+���w���+ �����f���4e<�/�e#��W�q9��%0z�!a��~�������ho�4�(����?HiD=�����u�P�����~T�B��Q���r�?C��R��_Y	�/S�o�#i��-8��3:1)
��VP����A��8z�,8��s�g4v�@�ZR��1+��/X{o��{�'ACJ����9-��+�����S���������N���N����%�SR��j5������P������Z�����9z-*��6k��\�[���h�F��F��4�o�4�OW�����dV��#
+��q�`������;z��I��<jA��n���E��+�����Ju�zr���.w�^��������^������Zs�����#���u~}x|����C#e.���e+_�D����5��$�Ja~k�W~��&�@��y����}����+���#���^4w��^�5j����z��G��{m,d�
v��)��fFw����kxp=d��FQ�������������_Plh8���Uk�|v��_E����V��P5�g)���T���rxv�h�.��2��V���a{���^���p���=�^�_�V��?��������_o	��x������S�Tj�W�J��_/�|�}�a��E����FP���������#��&�9:(f��^�������^�\��-:|W������w��4��������A��i�^����F3��P������y
X����Z�����?o��?�w�n��w��a�j�5v�{�v�F�~;��A�	G���yt���j4����&��6�L�����6J����p�^�^����4�8�M��@T�g�;�jj����
^=?�<���@�4z�������������8�Fu����4�*�D�**G�����\b�GQ����q4������>z����g���#6��� �~w�u���h<�q�HwF�������3���d��a��a���5g���K6��0�;X.���cD��Su�u����w�7G�u
=��d1���������@7J���>
�Y�_X����"��G���9�0����}MV��A��03�^��Dqb�Y��I`X����W�����~8�M�O9b�)��������e��[���!�V�mbC��6E5xrE����m��P��bL���L�`���+��/�Nwz�v/���F�5������C�����uk:o�w�4���?�� a���U�L��7�_����������&W��f�I��@������?E��hV_��ycJ���
K8���~��6��?��������$LG_�)�O��l��Qx9�c=�FI�8Rba���M�~��_<�M��i	$
B��8+8z��E�Q<�|�k���R�N��!*8�G#��^&�ntJ0�r�4��"aB����}:�n�C+�=`KA������8CM�����mT�^�s���W��kB�/��RG��y� ��S
�&@Y�o����1S��O�`�
�����r��@��d���"��`�f���Bf���$����8�Y8��2��E�Z�����I�M�w@�
�Pr�����p	jD��M�P���gIHD�9a�.��"M����Q�����#�&h~)sx�f<�kC.�"��6s��2�=5W�Hf4'`f�����ai����)b9���+$d��A�
�Y8N��M��d�@�������{�x6���S�vC���;��!���2�e)�L��!A�^G�D=�������z�Lo��+����������p�?a^|2A/A�'t���U�TH���]_]s�
�#h�6���3���>�z�g��C�L�U�Sl�=1]��wEy}��9���/�Q^�1�7��W�5 T�X�E7�����L��z�l
����C&�?Yx��y�6��u<��t��V�0R���4=�Mp8�0
,7��CFh�p�K�-��?p���e
��^������&y�����+�L	�5K2����p9��3����
���)Nu#�����Ld<�0�q�������	
���Zr�)q�d��V$cF�gBtqNX�� ��SVEg�[c��6���(���Ey�K�������(Lg/;�$�,��~�LU��a��4�c��I�4�~Ms�	���t�|�.#0�����~��'x4��i�@�}��"����Lx_]�k|l+�'�� U��A��q{�M#�������P���q�(��PM�AW�~�iB�9F5G?�c���5�n����%to��>x�2���`�p{Ft�h��N3�,u��c�3����	n#i+���te��f�EL�I���.(N�9����,��^�����G�S3g4t�'�1�{_e�9�x����#P�t��{�����T]^n��;������W��A�h�~�r����I��P���d��.d����h�|C���/�`��'$X�0u9����[����	�����h���_�|��5��}����-s�7�v��Oq%@+���M�����Vt<&Cj�|��E_M��}���J@22bt���:���$�������aEn��<��J�����\�4��+�,�!�����W�W�!�U�E�`4�m
[�t���}��t�=��)#p|��&D �c
Z�8�"
h��4@�{b	M<)�'���
S	ynO�*'�6l��a�`�_Wb���x^f�.���F�
�O	�V2G�Nv����C�Q-
Pz�,�8I>2�b����V�q�L�c 6l��r�t���)�
�X��Ku�4���;�*�+���hv�������9\�Ec1
%#���53���ro9�����^N{��z�*&�U��&�B�q��Ui(C?��~
�h�p5R��qmE���bQ����eU�Y)WU�e��x�*��L�4A�����y�3'���IM����$���1�8H���$�	��$���a�9��L�9�8
57���Rp`�>_D~�l���a�F����=;dS6]��:��[�Q�$9���,�����H2!�2$��y�1	O:Bq�v���n8�[��O�8��	HnNG�A�\:pN�����EXR��N2a���t
4��v��'d�CZ[����|�n�O��6,�����|$����;�.z�Z`���0�E�a�������m8|�N��]��)��on@`�$0�i��
���B5I��m��Mc���6s#-[��r�����M��[�%��}��.P����?�)0�0fp(���[�_����q�t���?dN�)N�~<���,v�N����)|����u}�
�B�vU|��c�/�����J������	�
�tG�'|�����V��4�;f���8����	��_�a�f4B���5���S}q��G�rh����;��H�Y.��w��!�5���v
�=�8�	���}�R���GL�S����d������S�u�
��@�:_`��%h1��c���.1Lp��R�R
�b:����<�Q�1�@�"5x��$��q���9#��1�K�z���!�U�cd�b���4�;��DfT���
\�;\���&| �}~��s�[�a�/�4�>\Q5�8b�++0k��M����Y�"�|M��S���Y��~+�\Q��l�i����*M�x��?DC��/����f�$q}�k#��,� ��q���4�8#�a��j� N}B
�F�������8�E[�i����D	<:y}��I>���\���F1�	??��f��1��*36Q\x��-��(��k��"s����V�����t��L����4u���4M�HE������!�L�����z���!]���
��q"�gu(�1���
�9�p�u���=���E[�V4
��3&
?��hr����v�]{
�����Z���K�TM<�����[;�������n����r�mo�z�Ff���������A��"���q��ui�N�%��Z�fN�/+���Qr<mG�������N
�p���.A�0o���3�HP]��bq�����Z���MG��[$��"�(��RNz���k��][�IYv�p���Bhg
V�{�� �nl������u�Zbe�9�,�y���N;z�2:�x�f!��F\4� ��p<���ve��!�Q��s����fZ�c/�n�(*��e�#�a%��b�y<�c#���V*d���aD�NI6��WF���c�..��
k$D�c+3:c�{�3�a.�
���Wt����Z���)t�����8���H/O`�B���=��$��0�G�(�&#����e�i��B�8O����\D���3�s�"
�W4��G%]�d���h� � c��)�RWe���%����f73�~�_0R�}��Y��_���5�V����a��
��|���Fl
������
�~q
o:�.P��Y�����,g��5F�C�a<�	o7�S�|Y&�t5��N����|�d�����er��9�����}GQK�< h�
������t
���xvL���#�h
=&�"��G�k`��<������6vH��:��|��A��Q�\�m���N�;��	
�gmj�v���QPDH���wH�F����a�l�9�����!�e�05���>����qY��|���P��p��*��
�@���>8}��������i���
������)F|�I���(ST��
��M���<��Iv<�����!����f��!�s������>���!%���/H�Y�!$��)\��DReBg���RBI����"��b ��5���R���1cz9��3X�^�C����+�&��v�����y��=���K�������T��_�g8�]�3"8��\�Ge�����
E�
����8��]�)P
X��	��6��#�m4���D�?�X��3�=D�,�
-�<<�HAI���E���K	s��nm�$}|I(����)���Z�/�M���io#�j���6��DU�B2k��������`�F� ��^��^d�
�b���n�?E[�|V2P(�c���?(����N���,Or�{�:�FH�h��mmlo�jS��Md�2Rx�b���������)6���T2���nlG���;�c#%6���a4�u6,'N������lls��{��^a���� s��F3
/���������m�i������Os�A��������_����r-8��T��2������[DW��7��z����a3�}]@o���ul�]����8�=ZtD<^#�����xF��Xf�(�`�Dx��d�3�����$�m5�hH�KK>�x`Dp�N4A���'��F�vR�X�a����W	Y{I{�F�)C�4B�6�]e�i�tQ �H�X8�
b��X�J�
��t������h�U)s|s��=\��h'��u�h���]���Wu�q��I�YP~�� F�\*��sK�y��9��.����Bb�pFb����L��_P��w,���i���L4�j`��YW~<��7���8��@R��0L
�9o����D
u0.C]�$��nX����j�?�l�>�O\�1I'�2��"�X�5r���kSa0�b��D���LQ��q$������pj��A�z��U�n�9,����"�z�7�����&,���2��L;|!�HV���nY�i��I���0������@gj�WH�7p�k�L���T����m�Y�N���gY�b��O�hr:$i�'�A�(OMD�p��;<��DyX��y����Y<j�0������bR��(���Q�qRP��i2���{�s^-L��1t��`$,����
��']�b�u�Q$j	)}��M�<LH�7��|�u��C�'���N9������9�$�������))t\}6����ph���Sm� �F�p���r�:���gu� I0��8I������B�t=����,��Vr%��B\nM��N]�����W�ody��.!n�d0c/��[��������O�;MB��U����?�FLw�y�bYc�;|S����~��V���x Yj]�
�N�@�l.H�u'^�HF�@}�$��������Gh]���7�7�-r.O��U*(|������&�p�/�VeE+�,����d�C�M%�,��)eiU9^~�����8�������1��D�U�����8�-5on�a�fN��K�����{�E�n��&�
�����qmS��E��o���
�L7;�����%�a�ZxY���l=��A2&N�]9�>j�?����b���F��W��QF���Y�b�p-e�������~G:;IDt�8�W�t5��W�S�Y2-}�,��D��QF��b���|����#�	�x�h<6�c���9c���uz�Z+����J���h�AH�,�+���Kq=Q����QP�H�:���R���+v4j��"��$�JV5�Xw��)_����G1sk�����:��K
�a�V�	��Y]QBTq��s����g�O	I$E���D:#�;EL������t����S�S�������Z������&��;��;r6A��b�0���f����(����3)�H���>0�S�ph��L��4�K�{%���D6���[qI���0�Z�z���F�r�D���7"�Ih �8�bG�*�S��5�gB.���
�F]^\��'��s���
�h�9Y]�tK`�(��j����:����by����8V�i�#xvx�[[i�P���6����/,��1���
KF��!���u�((�V�zJ���3��c�:'�@Y�o-.�X���rXA��e�M+RG�Xi�������v��aa���&HNr�=��A{�!�|�U��~7���>�]p��{�
�r�|��]+�D(j�;����%j�������g�T(�lv�^A��������(2�0d3A�Uo�?���l�wt�{$����$6�e'J+� O")����8l��(�K�[
����%�D~�����D�x�fI�B���������C�!(��l���&��������G? u,�WG�!>�|nF���P�Lv�6�[�~�����'x������J6Fv�|�LM�u4e�K�8���c�=��H��	5���$O�c�q,�U�+��e�M0S[6bo�3R�E��GMv��g8d^�>���X�����f���N���
�:�SQ�a��)��J���{��g�'+U�0s4��F�G��F���*>��2�P�!&����H6��[�Zx&	PO���9�X(1N���
!Y����L4l�s��gM���V�Qf���x�0��
�eB\�;�O��D�>�7P�XN�j��\T��EG8E5�^'��F��	����I��T�\�/�dE!� ��?�eT����uT��9�}B�X6��q���r��6�;����Y�62�M��r�P����XDb������K|�8�A��u��FJ�i�1p3up�	$@��(�=��VF`�t������`H�%�q���n�i4����!C]�����f��ie������o?�����v�A{�o5{���fs��N�;h4Za��l��a���8�oo�qM5����5�:{�������$�2����0����')T:B��J��`L����5a"��E�	�.��03�Sv5f��4��"�V";|#�m�rO�Y�KT	J��38�����	%���X�����ZAT2 E�Zu�6�l�E����1�>P�J��}z
R���ASFc1i�$�
���,������k�X;�R8s�p�cFMz�X0f�X7@����w9��r�V)@���'�?L����\�?0��h�7>���P�Z����Mo��*���X��BOb�%o0�o]y�r���L�������eF���^�r��6��l��\p����'�����M��&��������&����a,��
1�z2�g��E*�&��)nX���
8�;�f��	77CC�d%��4w�"�����P$�hg�ZF�4�f��b������!k�D���%+q0�=IFF^���L�#�����Vl��7����k$bTD�V���~d��$h���������h=83������4??*�$t��p�h��i�=xA�����{
�u���r��|
���iG*Z���0�6;_�&v`4���k;g���1�<�SN��Ds�}
��.|���y��,~�oyc������g�l�mo���� ���F�K�$�P� ���yF�Dag3�����5�1*h��2*�9�������5B����^��
��4P�f���Kh6wk01����>]�ek���US'����N����OE�o��9����yG9Ki��`5��P�O�D�v��#��D�_���4���8xP��(,���
�N�9�%
D��S&2�  0x��a\���R��|b^���c��M�Y����G��!$zX�� m�	�n�>FO�������*N_��8?��"��0Nv7�� yx��)�z��Oa�����s�XW���2K�	���":*����b/�1:l�C����D���/�q�-e,��<��p>KnB�YZ��������
���R7O
Ut!f���`�D�E�oU���Z�����)v��1Tg	5J������G��b��F��+L�d�������0B]T�Ro����u�[-D�Z�������(�p����Co����s�9������Nw��S��a)�
�y���9=��e3dT:���C2.��}���8[kR�vr`$�R �3�,�I��.��*.�Y�U�~�?	#��	��j4�W�]9�W��L$��A���IG�Oty%�_�k���CJ!�}8�}����;g�9y�l=��%S�J�8)��d�5�&K�[ -dE����u)�`��~�����~g���m�@��>B)d
�	�� !�go���G����~}�DbTXL}�xI5���S�z\&Mvu������S�u*�>����%]���b�����~�Rx���
�p8
�xo�E�S�����������14�����*��X���,14��o��FBA/���,
VCW��K�Te��Q(��9�G��,�&"�����?Rx*`F�k�������|)��oG���^���nxz9�����a5t�~�$d�h��^<���.�Ta�'�k�}r�	��,m�����	�e�7sX��g~(�6T�<9,_�����������%_����aw����;Q+h{v��Z���K��V��;��Z
��>���6��>%��9���p{:�P[���pb�Y�Bb��>�I����mI\Q����(��D{ymXI�
���D�7�6�k����c����8 D@���'�k�)����S	�����l����U*N-����B8x��5#�Y�7vG��U���1��n���n���l�}���2T�	��6�sc�bZ����j5I2O�yd����9[l���9^�#'��S��i��p��������S��U�1L��Z�'�%�*�n��^%K�d!X����w2i3��k�t��D�� �����d�T�xD74��k�8����z
$�����#�������B\8�����=��\O$�����z���)fhp>f&�n�i;��,#�0:YXa?�l"
)f���1w_r��~a��a���=�g�Go��d������X{���A1�<2�	%`I#�07\p;zf�~�w���^������v����w���k�����n����������"��p/L����?uLd�'�1��H�w�>��)+�y����#r;E��^���:��[�F�f"?�n�r.���J��b@r�8	@g\E7�H1�z��w2�gVTB��4��<��������~��������W�>~����3q1:��^���p#���^�a�,������?�����_�����_.@/#����f�;B2g�G���$]Z<��X�������C,���>��R�~���&"�u5��w�������%P\e�UHSw���pJ��'��9��.�f[uoo���.7�p���j�%�����z"gB�]#K��M���Tj���E��~�*�2�����������"�S/���km
}�a��	�t5�����/�^��U�TrFk�'�E�"�0X�+
�"��8S_s
E��2���*��{!�����rC�[���
��Q���v���&����Cx��{�T�����O�
E6������� ���/)���������[fV=���@0��i���,��xl�$��h�R���82�:�r�����$e�.m�g'��D0`�4VJW�
��n��|�[A��$c�� �W�D(�c6���y
���8��V�E�$���n�"��\�Yrt���Q�:QX����n��\D���E��=@b���E�w@h�bF>��%U��j��d,����M���J������{��(T���f
	]�M��=������T4F}�PMZ8���m�*0����VX`�]����1E�G�S����9���[�.
����0��D@I���=n�m`��?�����f����q�1c-B�������r[���MYg����V
���S%���m���6sU����)�����ee,��n�|a�pydN�3Z��z�.0��~g�k/
�(l���>G�����_,����7uz������C�wu��w���L�������+�2K��n=�����b��{�����c s���5�`|�&�k�c�"����B�>��9�vQ��k�i�L�/T����V!�x���J�u�L��������`�LK�����	D�	>�L���>f����0��L0���qh�k�H�{{�A���� ���������<H�4�������wB����~��~T������_�:�{z�����o�o�������o_��y�M�Q'���/G9���-&�~v��������o��R��V(�F�6JY��4�������/���i�I�[�#eK!�3�|���D��F�7(��9����!����d22Pl��,�h����u�)tw�V���"���
������z����q�P���97���3��������]���
-99��\��N7{r`��/����'����Y���~�l���������3���6�L�4���u�3��&�7a�g�8h��������q���$yc���ib��Fu��M�?�k�/KNoN��\�|��/`�����c�^�9�
��kk
{���,���'�F��@rN7k���m��`���R^i�sdc��	�<��r��0�h���g�_��V�)����.���k�9<�~��P���Kj}?S[�D�q��K���~y�?w�Q�������U0���T4R�3�$���Mq�Bk|���3�ZS����M�a�����"�5f HY(��p����m���V2�Y���QH�K��{��e��7�!cS��2_04�zr�'x�=c����`0Uwb���#�������*O���E���Z��`:����b�5�e�Sv����i�MV�4�H�^'!���N�O�8����WU��8^\{�s+�jC�I.���P
��`~�R����"H�4��[�LnOm�z'���"i����2Gfm��s'��d+���JOF\�<q!o�%*�
��R;\%J��s����4(��R3�T���3M�R4�+�%�"��_~oh������.�&P.e/~*{s.qy��d���
�3��gW����E6��x���H8��R��m,hw�B~�����%��^�g�_�9V9G�6����L�����T��_�-�k�B1���qU��+AMm��d���G|�j���w.�-�Ri�R�|�Y���iYo������:7'�2a�*B��{6��M9����y?���7�|�jw_���!1N��j��+Xn�r��
$�k���=����,F��J�!��Z��~g����>��~7@������uvx�����[�\-1Z���$�����o5������r�o����Z`	���,{�	��eKG�?�R���8���?���nI?�r�t��i��N��_?.k�h����o���[�(��qV��(-7��u��-l��L�o���d������2
����_r\��C�����i-��rjx�H[���<
��||��i����{���[j�C�7���*!�����v>�,��A^�����E����^<M�'�-�x����'�����l��������U>ma^<��<�|g�T�q=1�_�\7"�_�2�km�"��i0eLQz�8�0���5!�Fm�d��^dC
�[ @�R�%���#6������3\jf����yFL�W+9q�0�-�<��)$�&��y���xg��XK0�tmr�m-(�v')(b�F�3�#�i1�R
f��V�����lj��Xc��p���3�h�3�Ue$b�2�cy�bg�����^��d��9���f?��I�2�!/���dgsz!Bq��f���F$���d�IY,�`��������{9Qz�4x�D�s-����J�A�����r�_`�|[���u�R�k3Y��2A���R���=yK����v�&zp.7�-;2>�b��T�vE�9R�^��v��L�
�	'�8Q
�X��]J1nh�aP��J�a��5�NG2xeR�d����	W���������M��Aj��J��@�r�ew��N���8*n��Z&�	�~��dHX4>������
n�1NM�mF`XpscJ]2���_e!F�;����%�����#�<p�L�
��������������:\��P�*�s�k,5���*����[N��6���p��7���1�wM�\����e�b�1��	���cN�5�O�+%�O���U�q�]�.K�4���B���O����]M�iPe�G���|��d���\���{Xk��{�l�p:���;�I'������:��\yG�%�o}%�]u�P�H���P�(������x�-*�2S3t�e#>G8%f�Ae��h����\��$��k�_�8`���M�����o(�"�98�#�Q�ax���� A�����dK����������pn)��xK-�z���M�=�Z��%����.��F>Hq	h����M�!���e3	���/hCw�����hc���p���k�?�:%���wqmj\��<�q���z��9�WZ$��O�CK5^uB��&����L��~��I28'�r���-n5����r1���M8�rc}-�!����Y�d��-�x��3A�%�`FNW�i��@�����!�&��b��Go��O�&8��B����I7�u�(�*\��c*�������\U�����:%W\U��P-���*��E�%��MX�D��&q��VP�R
8���R,q�TI^
�<���TR,������P{&�ee���|%� x��4��E�T��#�������N��7s�2:*����`Gv�R*�J3
�{u%����\-QT�����t~#U��B���,]b��G���
	��J��	�<����b8��-�q�,U�����1�5��-�� �2�}&�M���i`13���j6�%9@W���I
���"��U����"e��Q�F[X�t��U��.��m,�b�c���5�����U�)���4��������I����:~\?�0�������9�\�9��Vb�z��c�WC'���zr���v"�}o��
�<i��dN]]l�/�����@��-
���.u:i\)J@���pe
��C��]G0E]��D���"J��{������$vL�����U$�&���p��S��fN�s2�9w��~Xx��|��ET�3�����c���6e_a��|�P`���A"eXIz���C�q��d�*��Lg\�%�VY&�@��{k�X�|5�EA�6q��9�Tb�51h|'��eF�\l�.�|����>UHXh�����R�\@��D4R�I ����	Tq�0�G?��,��.W��m��sM�:�3J-V�2��Ux��9��	(N��C�QA��`�R��J/�
+%'7�S��hk��Sj��YE�%�*��b�}6������[������]r��HNH�W���sf_��]<o���y��Ss2����o�&E�2���x�:�f8|8>>Wo���/J��w����sb�4S`3M�I�O���=kz\N����F�0����<�V-�)�j<�Ea�^k��<�fR���eFd��J�=�Q�������OF.���|R�)�2�rH��t��;�����t�9���O��4*�K%�
�>]�n�=1nb�k��H��7��\�rAQS�V���,��|��F�a����af�lO�e�R����X���P���,�zI�`���+�����R����+?/�����g�&"���b��,@��Vl���/��L�Ou{}t~qtr���7�e���J*��	��r���f��OQ���a�"��@o�����(���8����;j�F/DN$�����l��k�����Lu�����4���=5�����H_�n��Va&�$������4@g��J.��
b#�(`�|.��t�Ep�2��c���	�AUE��na�*;�\����2�
=�d6�i=�O-�^E�B���~���������K`����iC�����]��(�!zf���s��f`<j��'��Y�N�b�I�I}75�-1fC� c��P��:xv,�������x�m<�,4F�����<-L�;i��c���x�-�����X4�������T��Na:���5f�D��"��������K�!�L�i���iJ���^=���p���U���"��,0n���N&h&�����h��X3@���RtYv�!w�Wg&��
��lW2��f5���-��3?E�H�����������F�FK�'L��9&�Lc��(�����=B���4���}�m�Bl���P9B�����FW�C-e<D�x���v@�L&2a����(�P�[�g�,��oU@@�R�
1��U��>��J,���iKvP�Q���+�
��[%}�p �~����B���"{.��pqQ���2�"`��:�{�}�X�!6j��Zh�uq��Of��Z�T����/�*�4)����a���8���(R��������D��s���S��=�y��!�
��f-a>�����k�������/sz�)>f�	����?��������Y����sF��d[���$h��qq�
���p��P��	 e����+�}E���@9�T�$9G��� E��RYh&R�_�9����Q^���:r��.6'A�R�^�K(09����x^�;����9��b+��8�5�Y�0��`^�V���A�0s�gK�W�������H�]�@`�89)���(;�7JQ*��W1+K��}jF(��S9�S'����,��7Gj�JX�����6���r��Kv�P��"t�z@W&����c��L��KD����)�'2|��
���R�<����v�$o_�
������C����DH�����#�������!�%�u��l�
��Y��c\��\����P;Y�uOh�x���\�x2�Gt����a�]t<�CO����3����#��:�/��e]|T[ji��F�����5���]I����h�`��X7AI�?��O���O�{�
��TD2,�W�=2����8	#��-�m�E(M'X����(�	����%R��L�5_��q��t5�J���$���'��Bi�	��:"I�,� �����]�2�\_���u;����S�T/U �4���u����a���`	*|�CzC�^=,��SjD�G��AdFN�,JO�lw��["d��H��t��K���.�Op��6Kkn�[X&n��ah�������a.
��(J�?���Nh���d��0N���SCa0�R����L��E�����d�����W�D�pk�������t+�@N������/��O=��c[TJ������.NH�o�2�#C������������*�K�����n|cy�l���4�1�hm**
��9�����ux�!5���^`�*<�KX�5]C���0��0�X�w�3,�B�:+�A��������}��9;���G�[�W�j��1��K�n��]��/�/���!��l�@�L#A���+������HkQ�h��T ��a���<2��� o.5���7j6�i�����d;k����*[e���
��S��S�����#MU��C��l.�2s��5���e�����;��!�l����-��?�2���H	�GS�b�8�G���
u=P����Z�J�(���v@{%�.�n���vk�p����2���rQ4ye�t��n/���OfY8�Ou'��,L��;�-�x��y.n�(�&��)i^��bM��Z2��:.�YrE�^5��7���6����_`���r#Q]dL������SCY�{6}=(2O���$�13%0�%�Qvn]���|:	�dr�
�|�T�!���E��TW��6>�D|��H�K�(������W4��V'�
M{SF�4#/u��4�����Q��d��@��n�W�I)?
L���x��%�u���<.�m2��wG%23���%hv�9r�����M�3r�Q�����-��Y�zHF0xWH���
����m��XT����1�<�����)m���u��GQz9N�������tI�����V�9;}�
?������� ��y�([j!}�q�	|���-2�OF����N��I�2a|�yjl���k�xF��"1�y1)E���J	�:d��e%Y���2�<+BvT��yKU�����E�T
J������7	��'�p�`������S�o��5�!2BU���r��������
E��9�Z�-H��
��MLJA�f_o�=��)I"i��Jb�H�4n�_�|;]y�������hp�2f(uE*�6J(u1���xj��5/d3�	:q���U�Y�����"O�sP����5��=C��I�����)�I���f=���}��-�X��Z��Jd������a�Sc����R��'S;>���1��F(����:�\)]5[w�-*GQ1�������0�a�>y�"��|����~�v1����yV����7�G%3��b�na+�!_�����T[����>�34�������)����g�w��ZF�d���%��dbuF]��8�	W�iEV�5
����?���*'Kr��R#��xF��]g3�����bey���MYvn['�����G�N��s��X��'��D������'e�N��.����*!��$;�YkV*%J��`�$�v�XV!c������E���Z���
�T�R�Z����(����
	��,�p�u����~L9��J�������(Y&:u����-=���W�}!�|���TY���	W ��+d=]���?2�=��f�C)��mC6��i��4��G6�F"R^���k?�t��Jq����������z=�as��p������g�l�k�\%^^�������?>^��[����t�Xqe�����?�P	��S���_��pi������5�D��3.5R����#Ja��x���%�D�*���R9,��xi��$Vi-,��V�YT��t����c��$�kou|s�!�J`O��O�T��k�U2f�WJ��M��zj�[�/8��jp����(��AA;��-*����V���;����u�z�����(�t09��(qYF�Jt5-����D���,����^
����������V���]���� h��8_�'����jQ���y9��*��B�24Ft�P��������k��x������b���dh�I\�C��/��]���'%�H�6�j'�a ��D��7[��z����.I>:Rp�A�X�������p�C�S@��4���;����������$%Rei����qK�����ZA�9n.��-�lc`������t"�f?�zqxD��A�9=�IO�y���P$(f�����s�N��yGa{����dZY|�Y����s�m�|�������A��S�f����+���m���[v4�����������gBOf��'��"���4aZ��jE�/gM��82a}7A��/^�h	��pBfn�����i����t���yA�

P7A��hY+�)�m@S�CK����]#���7�����-d
�s�S �T�^Z�o���;���z���x{�����r�[4I�E��������������T�8���F�)��r|.���(����HNTx4��~������/LC����L�N�dF�rp�l�p�n�I��k�f1	��*�.��cYg9>�$-���7�j�1E��e"��[��d�P�Jay���S7[�"��/f��p��7�g���y����[��V/�����qk#r\o�r����kn�:�~�r_�93�P;�-�:![�bKJn�����k\�Ne���%�u7���)��C�'������(�h��a���r3��"���'�J�%~����N��0�w��01�s7���Sm��z�����������?������J��
v1.8.vallock2.tar.gzapplication/x-gzip; name=v1.8.vallock2.tar.gzDownload
����T�\{s�F������u�R")�O�^��Ht��^���R{[�0$���dn�����3 ���w���eH@O�L��{zz���k�^�������e�<8����n;a�xVT���~ys?���KY�/�����m���u��~��n����lwtC����z����_0� ��'#0��rVN������7�Z�������N�3���y����ZS�}{���^������}���%3zL�_�?�mj�����������{�����s�����/^k</�85���A<��F�5���m�����k�������ow���[f�����LB�m ��2�(�Mw<����P�����q��j,.��K���`7]���Ca3�B����o�h������Z ���>���c��������/�@a�D����~�oWM�E�t"�{.��C�9�B��}��`�X����4�G��g������)���X
�����C����N���=4��.j��:��=��N��Re�<dw] {�>��W�(��%��%����&G��T�+ND�@��%�h���j�2r�?H�`�X
����D��P. -A�A��A/"?p��+�������Y~�����y�r��B�58%�MP3<�����b'Z1�;�UR�xD�D
M#)�<��v�BXs�a[�!�H�I!���� ���LA����F�q{��oo�\]����NG��j�h���B\xi	h	�.BiT��� 
4��!<��M���G�Q�t]�*X�����c����L�n�{Z:�j��9�m���,T���H�5���Z�^�XX�&���}����!��\5,�����&;�Y$�	f��'0�� [�o��"''�\��Q]�_���mU��`���z=����3PW��g�[����rM�EZ�-(SR����J���<���P)�S��K�/i`SP�t
ao��C/`�z�X([|b����?DAw��v=�=&���.�J,��l�@<B/D�|�q7����MYY@���Pr�j����P�0,N���1�q�'���A���a��Zc0b���E��i�3��z}��O�l�,������g�F��h��,\�Q\��Z�]�n�����Y�������|���>V��G��;���oA;�%|`��a�������F�U��q�0��/��:�[�����q$n��)��#Jg�*N8�������Q�����t�}��!{��E8��=Y,[���E�_}���YHm��H�lX`��c4[�
A�V9�4I���Cp�q��4��P��5[F�j>�����C���Q��
���j!N�^��a�p'�G��r������c����40&�����@gQ���(!�e���&����������x���}E
)�����=�����&�''����*D����������~���.�"C�wM�X8\���f0���5��0-"�F���v���
�Lm�R�N
4�/r�������
u:�!�|�������7�������~��NnG��^���N��[����s��.�e�%!@����@'�?��`�����EM�^�%��XB����������:��YUt��N8*`���U��@E����y%�^`:�#c�/Q�5VQ���E8����&B�,��I�	�/m������ ^�
`$�+�i>H���#�9L��wl<<������rN>��G�[ F�P���h��]�6�	������V�����ejl$��/�^Bo�q�m0&^����C�o���)����:^��+�{���-oqp�����4i� �0�l���OR/_��&x��@
���p4�0��i"�MI���R������I5*{���Oa��%��S5��1��W���)����2����\c7�_]�������(�V-$�{�������������R�m�O2����=2�}��Y�"�A7�1���,�����,�����9���!`�o��p������Y���
"�@x��AoN���>z/V�>����dv')(�TjDO
�������M��h����zp7y7��*A8�����q�����2��*��Q���0�}z*���b?�qX��-E�����o��0" �a���Gk����bS�q�~!��9�0�A�6���$�-����(T�rf��}��h�F�����J�|�RDE1J�[kN�S�$���#���(X(")�����&��ox��f�m�|��8!@��eM��T�r��S<������"�3sY@��P���'TMn�0/�Z1�%��	L�aF+��WRn�h���W��8�^
�a>P����h�U������|�T�+�Vj[�#�U�Mj�����*�`�P��r��0�\K��-eOe#g��0�F��~����I�1��)�YW�L7I/;a���9%D�{s;Z�\1m���\��S��x�M��L�+����Hz��)�#��]0L��b����*)iaz�T���W���~9�y��*M���/����wAY�!1�gV�5����b������\��M7?Uv�����������"���Od"A9�#P�u�`|�8cb��|������$���*{�`���F��/�{���ry��N�0W�V)�G�^������V��C��.EN�h7��i�y����^k�Z�V�z,�J�"(���u�����B�^~�����.ik��W*��`�#��=��:��O�t�\��r-�=Fz�*e�����$��v����P�Rg��4�Tw���z��l�����F���+��7|�lT����s��P����Mc�s�\�i�/i!X�?�G��Q�=��UXvpm0b��L�T
�Y5cU�#d��d���qe�;�~��G�T����4���U�{�����N�k�g��p�C>����$Io��$	���� I����-�,������������j0���^]T2�^�!�iH+���P&C%������(�h��pZH�	=!�T��c'U����us{1\�H��}sI��m		����K����E*J($ma�u�h4M�c�JV�
X��B�H��:*%���9<Y8�zoJ�\�
F�� ) ��D�b����0�Iwl0�3���"Mn>'���h���F����M��/)���"�I��L��Sb(�H�+��F	�`B�;�����x8���f� ����b6����(&����,��b�mLH�2D��a
�[�T���� -1��6�@���g�>�9�B��`4;�lHO�$�BWP�����\�D�[��y���r.��)��j[�D�������fX)[�+��aN� `v��c5�N���i��@9�<��	�'� `��f��j��KX�s�3�n�����p�.����pY����	[����H�V�q-AN��������U���)4�?�$��r5o��8�����x�#eL��w?pf�����I�n
�����-�=��k�A4!\��$b��	�-@\r%LaQ
#�����I�H�`nJ	L������r���0���
�2��TL-���f�wf?�VY_BL��������OA��`��X' c����'aj�V$?N*�j�t�.BAp/���0�p'�R��d�n0�b0K��C������*��nV;����H���N��'�79[]�;kK��"�����{f�g^��t��6v�i����c��l������z��#����$v�DP���j�n���6����=Y3�2�%X��p�pD��s)aW���X$����1LO�'�":r,Y����
��l��u�@>���K�;����/Qc\�5xQ����3��8�I�&9E���F��r<���jyA����]��������p)6=T��?I!%�#�d_�������6�2�v��s��mu���Kb�]|vZp��F�CX�') ��N$9(�Z���d=���Fw�-��C�������V����Q���+e�Ji�B�
�)�`1�	T�D>��*�������:T?��GoUL���Z��3�������?�\��S"������H\�/�?��r��n�%"|��~a�;:���U"��S��,`Ob�s�s|�'�,��u���ge�;?K/+��Q���M�AdI~A��v��hv���%�������NR��u9 ���0X.��H���1�]Q���S�B�Y�M������9����=`�������#�������f��/_���"�~����l��9���s��5���z�]�6���Wj��E*$M�j��b0T�s"<��
M�O���)������OW;eN��FC�����������,��b����	�����p���-���h9�X�����MUUe�hP�%����dc��Jh�Si�C��|��c��������~`�OY�U�(�� O<�g�UJ~ir��8�&���L=L�_��0YPZof9�=N�[+&��T��h
����#�m�]Y_{�*�9��RH��k%o�=j,�m�j��F�������e%,6�X	��5h�4z�	��2yM@6�
]X�5���?i�6i-x��r}���x�vj��O�|���"�=NM�*U/B@	�d�\�AG/7N��=d�8��y)OH���q�E<�f����r�V�U���fU�#���X6�a"
Az�Yp%���e&`l
�8�K�8���Y�S��4��o�����u�Y���K?��+~���z�u>��������	��d��}�O�������1�����������1{�m5
����w�l��?��7��f��}�kO������<Y��������������x���hb��F��/I�59o�$N?��X<����=�vR�r9�`���!���J]��h�d����J��������#�U��9>����d:y2S�cH��f��<1��zL|p�J�<��l)RDV�rc\j��)�T�j�A)������s ldr��r�xP	����<��%�x�
��N_�S%�n���[��Ul?�4hD�t$������(-%R���s�-���k�$����{���%Yx�K��B��/�\���+�B���xP��I��.��s/>��bV�]���
� ���J~|:�
B��.��Z�@���\���6[�Y,���/���Q�+=Cx�.i@[w����}�� �c �g�=����K]@E;���<!^)��<�e��5�
�nd��Q�_��>:��4��_�����)U1QUT��4@j6�L���k����!h�q��T����R�nxb�,���?8��!�_B!�A[����� L_E�t��K#l���`�+e�Q�@��D@1zp�^<�O�����]�p~�BF����R��vZ�s2�M@i�>4<�b���>�-�����i%����B�N8]I[�}h+R':B< ��$���IX{R�G0��d�����6:t�B���M������*�
R�W������*����YXS��_"j�-���a����[mnZK{5b�7�!��w������g7����C�H���[��!.��b�����h�Z����a��>���R,�������
*��m9�>��,�(�p	�];�R�f~���i�����~V�h[���<����n���j<��_^v�}[�{��F��
����)����d��7������pw�=;G��T����$cv��g?qED���$l�����;�@UfV�DFFDF\�����f���,��Y2�p�J���������}���y3�z~�V1n2eBN��R�5b��j�0}�=;3\E��BE�[�r�������+�S�[uA�����m��$��F`�3���Q��:�o�:���t�7KP+�������H�Z=�����6��IA�-����G6S3���=.g/�9��(p����$n	]��1����}o��n@*��B��)B�x�Xk���Qn�L6����-
f#�����epVa�������s	6#���v%t�h|�� �*��l���e3�(>":a��o:�)���"�+��!��N�_����F���~�\��i����O�
������Te!,�EK��63g�	��1�\�O��v'����I?�}%\J��"s�f�N&�O�7����Q��xSe-��3��Z��CP�c����E;.z
���Y�*>�����w��`���RH����s������{��&�9�c#>�65c�L�V���h�c��L;�[=S-g"�� �0O������1BPH��H���`����Tw8xx1����(P�`�Q�rk�da���5k�f��E9;��&���l����������`����4�b3]Q�J_���7ERs�������T
���@���j��D,k�����iz"�[�,^b��{:3��L�l& %��m����K�
�d5�����K�j"Z>	����y���i���^�j��o�~�]P��M�^�[��Ul�+z��tcs|�/�����NP��|4���o�/��#L��X��5��,�)�A(5��-�.����0T��n�tMs�%���D�*�<0������l4A1/�5m�k�\v��of�e��J��ZAa]qion�+K*�Q�e����C�45)�}��)��n��;P�$���_�3���4����r�k*��nf������5Y����n�w/�ZO�U*4��L�`yC6	����D��jnzw���~��4[]O�d����_r>�����a��U�}� �I���+�O��+��������2SZ��f��IVZ\����2��y�.H�"�0�W2K�9?<@d_B=�O���t��1������/�h�J��iK.�X�U����{�����(l���r��/���f�5� S�����2P���,���0���V�W���������S��;�������J!�����������Rv)�������}���"�=�z0\E��s,��\b������E;t��B�3"��y���t�u����������������������k4��h�2EU�%�����D�M'GjYf�b��u"���:k^F��Z�nf������*Z�6�Hm��!��BM��(`�Nv[m���9�������&R��_��?Z{����b�h0^5����V6�v3�f4��o�t� G)�4.rR��w�,+&���e�EPQlBwk�,�w�0�X��X�x���M��`t3���J�T�����{z�B�<�Z��`�����4�F���N?o������"����Vp�y{���:����}�j�]�d��XyF�7�_�]�Q�����K��������e���%��17�@as�(R�����z]�I��:/e�*��R&��Yk��jux�8�E�5�`��%�0URBk�{��������--!-�Hr��}����Qyr��������4��J�BM���>Q]�XqDU�6����O 1ju��0a�O�� ���c�@����_
)�% e�&C�M�!|>��C
�u�[��A��9���a�"u��J������2��w'����sA$`c�Gw�c��.�0t��C1��Q����OG61�H���=�]w��_\�_^w����S������o6�`=����^��s�7[e#�A���E������z.� k��9�`���,�K������}�������Z�g(-�qU�kHf��y��w@��w�:�/yKdNL�{�tjM��d�a��O����T(H����fO ��������d5^>���]��0���~���[�6[��`����v�J\��5�+����q6��k��"�L�lrq���O!T�%6�W
����cUd��6�����+���"F�����j�A'K��/��m$R�[L@Z�y�'��oI�}�04_���t�
��f`�38� \����������uCb��r~����7�-�,g��}}��o�+�*JonK����e]]������'?�C���w��i_���B�<������zU���3�E�bLw���c�=v8z����v��R�0��b�����ks�>�N+8&���:��.�;���YX����UI[
$K������O���!�p	|�B�&'���QNtv�=�<���!�MI%�������
��q�a�`�4���.���=�-h�y"�P�����^j:�*������o����h~�>b�j��A���3��Y	��Q�H��"�J���|���E����_6���;��76,K
�\��j���v�
�v��h�P��.��x6�j,!�Y�
w�N2����x`�6+a��!|8�k�%��W4����A/>D\K�C�=��}����#��7%bn�	Rh���D=>���L��0����f;���+��|�m8/f2�p�p0��p�n*�Kw����<Jz&�@�L���3�3�m��v�lm�En��"���:rs&���@��G���Y�G�84����#7��01;�IP�u�Q?��s;Q7.I}2�'�y��a�)#���t�
����"��f��_�6���rC�������!ch5�X�[��L\�C������t����������$��!S��=N����� ft&yHp���?��1O����H�E����v1��hIm,E(j��b)���[��'"nN s$��x[��uO0���J}�r�'����*���|�������������fU��X�]�vN��g��a��d��-`��������f8�
z��<�N�Q?�����G��/�^K�����_�V�^�����O���:y�{��"3�>ttr����A���D7���u�Q���W���x��Y���o49���[��w��X6����}����I�$���������tW�-�JlN���������'�"(��;���g��N�d��� ��m|�-z2�3�|<���;�������:G@��,JV%;}�� ��n�~�"�t�~����c-�q���	�
O&�Z����KB�������}$�gC��KGf�_�<4����y%�48I�qu}H�RV���$�����J���;���/�������t���&�����S���US��.�S�i�x&
���3��,���9��(�5$X'!��8�U$���k]i(�������cX8Xcg���KH#�T&q�sV�/?��yO?����2>3�n�1HK�kz�s���yL����(a`#�������YS8�/&��;����8�Y������p4��I)��=i�s��\��������oB%�k/��D�?���%8��s����?���qV&X��R�-'��9"VHp�sO�{z�-����H'�!+�#��y:�A����?Eh��z4���|3��{Z����A��4�E��p�p��x�U*�2��n������������v<�:ys���v/;��K�l�[�g��#��H~�!K�b[�!�%-�����s��������J-��I��"`����q)��'�	
��F���t8�����H��9_U�=$���N�*��Ykh�����OK9��������1'&[1��	��61�������j��8����MJ8�}�P��x0���AD*����<
�������`�����������'���a����'�v,��`
����1�4��d��k��T�����x��+{�dsk�����/� P�6�b�V��U2b��F83�/��2{�${������B
�*-�������9N���7hBb	
�e}OAg��{?�3��muF�<�;0��>UP�6�
o6]�a��.��Eir/����+��������}6-���g�����P3T�[y��e��]�&D��#��T�3]���)[w��Q4ekO7c��s���M�T��)����T1_�?PF���#��6P]F%�OzKT���'(��H�,���f��L��^{b(>�5�b��J���������������C�}4#����\�5A��g{���;mk���K+.�?~���m�8���,t�������$`N-�m"���9
��v1����+��W�(�kK���4}!6�Uve$�l��}s��
�l����a��h	��~�R�Y{<���3Iy�"���#	4D�V(Y�4�"�G�����7,���IA�p�z�VsO�L?j���|��rb=���"�}���Vv����e3�(R�@���QA�{�XI�g6S8���$�
��#�����-8.�m�%bN$^��^��Ai����j5j����������
�s���w�	i�.����F�@�M�������5!�VL�1_��3�3�m$
qhJ�.�+I�=���k��M�tm!l�K���]_>W�"S�����#7�������7�=�������<Pi�9�M~`���2���$j6��[����x������!��ye�1'��x	��q��g�qb��D�{A�e���z��������j����	����N����;�jxvn����!ON���{.���Go���5��GC��oKL
��tZ�G*��~����NP7�T���[T�#
����~�!�ee���566����?���x����
�h55>�l�Y<2����a�4R��3M���(�e�D
���
������?�^�����uBKf�=*�/8���z:�;cSPE6?4��i��$g�Z����w���C~�6-mbBr
\`���_��t���������+gE���d���6��3��>F���c�KR����Wu3�|4�W;D�^9��nH�����8�*�'8-����	P����{�0H����Q�y��	���juC���sl���:�S	X@#�kpr�-���n����7��
�lm�F��
��ON!�����*�L�H�C�/�����v_e<�8��g�g#1����N���H�M)���
Nl���s�N�L������#��9���1%��������K��#Z#@���U�s��{��M\v��E����������������m���!|�uz��\0�1`�<�
(���J����mH���F�����6�*7e%&V�M_Qb�M&�&��Gq�����v��Gs���<!��g90���
��3�sa��V
N[��]1�~�I��gBs��������D�hyK��5r���`��y����P�$��^[������aRUY�Jn�pi��4~Ho�[�m�[�A���Vk��~�D�I��j4��z��}���s���7��x����v����e�i���^�N'W�����y�
�0���X�A"#�� Q�*Llb~Q�����^+%���������{y�����D�����c\Z���8�o�r�-�G��7�^�kE9+�A;|G��r����6ptj����B5�&�����G�����LN���&w���b�L�Q������6��e\<o#o�E�Dx�
�������C��w�eoJ�|$���S���>�d�-crS2�v~�n��q�X&�hu.�w4�a�&d�7yc�U�����-��L�<�F�`��cO�����`��������G��Q�>�N���� b	�f;)�<���k�1"��;������p�,v.&���,4������Z�S��f0
� ��_��y��.�@v��2�k��;�J�7�C�:��\A/���������G94o�������<�GO/�;�rN���d��[����T�5CY.&����|�/#������nN4�������1{^�k���,l��G#�c��pZ����L�>@H����V�����Q=p@�ofB��Z���F���vda����)�E��#%���#;n��=�#�Ji��(2Ld>�uT)�g	dT.vhd��d�o����vE!���1Y��������1�lg{9���U��T�]A_r��d�t���^&�r�M�A�e#!|5@�	���,qc>�Zou����-�k��F}�(��J�@�[������!��KC���t����o���G[������,���e��#�>����5��#=��I[�~�K!��Y��9�Z|?nl2JG@K���dL�H�J$O%�U�\B��~�G����)</�G�_!q������f���HhG�����t���{o��7Zr�?Y�>���/������(�z�!��	�P���$	�I����4������#��=�s�����mi�bB;���|csq�p��������������'�G\��@hR�:}x)�6/K�s������L�n������������@���s%��=����T�{�/'�������P#~��L(� *,��P����q����i����rW,w�2, �&O�k��7;|�er�k�9C�`�&�����������V;������%{�E�/��^����:R��#�q4G��u$�!�����V�g_���d9�����*���9�C*��!��E��7p�\�G�~Z3�-:G��6�5�����v��e�G�\�K�CZ�nn6`�����`�I^B~C&�~.�L���8+p�b<cR�ay��c{��n~�i�Z��t�k���dw������j�T�>��^�NV��!����OY����?�R���k]��Nz�{~�r�D�g���n�MW�`���+{;V�U�-�!�Y7gV���� �Dor���?�r��I9��x���C������������C����g��>����.rx�B�U����A=&���b�?���DZ���`�52�4�����������O9��W."i���(;7��6����'���������#Y�X�b�{�%W�������!�2}��`��).�kZ�����P���������J���[����_�S��8xm���1�6rv~��=���5[�U�khW_��~P�n�~�_3;5p�5��+`�U��)C�F1}�Q����J���c�J�.�_�Q�g��|��%���$ ����Ab��w�=�s�6�bs������W\�Usv�'9��xuS,|��
�*��:&���L���e�!|������lzcl��^B�����q	UK�� �vk��w��l�;O�dT���b�r�����~`��'N��X�����V9�G,�V?�7��4������%m_�^��x�u��o����=K[,�lU���&f&�%��4	
[zbk�Ny������h��jD� �c�=���h����`�#���Rr�~�������
��Y���(]B�9R�
9���>I���y2���D9>�I	y�	����t�����/E�@���%3�%v�e�,G&}�0Zo�����L�O��\>��@@�w�.�o������xGkq
���m����/J��O�Bi^	��4x�������=���3D{���2���mj���j����x���������q�b��e�y��e�+����s�s
�'��7~Zq{�
U��'����;.�HPa�#�)w��Vr:���gn~5��*��cPU�-u�������Y��������u��k`���|#�Ob�/f�?��������tLl[W�n|Z}&�@i��J{�������fXDB="I5�r����o���-��O1?.i:yZ��2�)�E��7������2�s���7�������������;T�*��
�@���~�~p�B~�2�]ci���y�L�$���-���CML�,�����y���6��Lh�/U�R7��n�����,"�nq��i>����H�WZ'P�����������f��������R��&6�u�-z�^N�:6Z��;�Yk)��W�/���J�e����q�
j������s[��
���oN�X��i���c���6�{���8U/�����I�I�q����$~�&���H3���(*�4c�`��<��O���},�S]�>)��$�H�e�s[[�X�1���
Xz������(�EA�����'�oGH:I��>�d1s$����5b�S�w����[HkE���~��O���|(���*�2v�V����A�`��kW�1������"���mE^)�c��&�?�����o�'XJ_v�`�5a����J���[�X�I��Hh��~`�s�#���R�����>r_I2������
�8�d�����\9=������]4��(������K���=�������lz72����~��=��I8?�;V��#� ����������t��C��d�����4��j��'�0KK���������\�;��6��B�H[q�G+-q�����m���s,�	�>�������K��W�S�_SqF��?Q%F�)����������J.���1���!�]���wM�Iz��+�����(�����a����y��l�&:%���,z>�=V]�+�g'@��#iZf�w�j�=qU�W��	c�[w.�8]������j�A)��]}���83�4��QZ��<{���H��Y�m!����;�a^2�^y��&�P�:�09=8O�SOt�MY��0���m-b������k��������<"L#+�S���������Xf
$gv')]�����?-�����4)���7���c,��G����]I��� O��"��-a8!r�+��q?���D"�t2���A�w3�^�\P��xq��� 	�w��C"�	�'�6��=���M���{8��Tx���zH4P����ke�U��cX<������@�������cZW�_`L���V�y�
����"�o8	���4����bvN0%:E_&����0R��}�q7f9�c8S#����#^��'����p�����5��IC7��WF����l�LX��� ?����"�
B>�'�MqGY��47NC2qz���Xv2@�	Sv�Vm�!fs-���`#'�������w.;��C����|���o���w:��V{J"\��T01��}D���H<��e{���������������'���F�;������H:$:����T���s������n��nD�^����Rb�������|<w�J��09�R�N� X\�)
!C�o:o�/;������?���f��;����x�M
|��
s}��������si�^�_z���:��z|����GO�#
��I<|�H\~9XU��E`�����GE,���k��:��}����
��i�����,��E��F���.��d-e��^hb�Jb��`'A�[%�W�����"|�����(,r"�5��`U�c��o�
�-il^��F������r�O�'�����]9E�\�f5�T��.2�z�a/��%�:Z��d`!Bc���p��������:���eo���� S��+q��YH�8l���#�E�xz<��%\�7���y��:����$)�%�M,�o�\~�3�����7��/F�[��t�
�	���kO�h��,`;���8����D�/�z5����p��0Pe��D�qX�G��F�0�A���SPGT���#��.��)��HMqH�TV[Kl`{n�]�np~��|"�^�����h�G�.q8�*]z��&��0�rx��R]����T�C�:��A���&}R��� <��bnP&�����H��8P�k-8P9�y�d�bs,qs�8�:���KV&8����u�j���m(���mu�_'6��W�s1�Y�#`
/7|�6�=x��2�C$O�[��;�����^������,�_N��;?w����c��W�R2_�{���4*7?��\L��{n������%�o�
�����'i8yOB'�y��P��\�"��Xv��k�(��+��We�[%��(z��{�[��?d��&�nuECS>9����������,�Qv�3�(�����+�`GG��hZ�-��8o
/p��C�#��0�D(�&�����l?���������f��oI���ox&kr#����`up#�f��a����K��D�Os�=���0����gB�`ut��x��K�|$��H�����n�� "&�\�2�
�����|~�N�Yq.���>��sx�$���y$�Tzb�����,�%�^��q�_0���LX����+qp�� 6����h��������.�' 0P���"_���.�(���%>�)B	#t'���(%{���&E��A���R�+�����\X��7l������n��_����H<'��p�<X��?OTI�=��}f|K��p�p�i���8I�x���<�,�F��p�2�=�9��U�t��&�a8�y	��#W�g}>����]F�Nc��K�f�O0x&�E������;�3��V>G*�2�c� ��������������X�z��?/�&��l$�H��~��:�%9�!�����c�����Z�W�&HFn'E�t�'�mo�;I��DU�7g�B��%�5�Wq���	Ir_Kg1��G�
�.8��\��1��������
:���R�3y.�+�T����M5��R�6rb�P�!q=����K��R� S:���"(��H�rml�=�E)���8Z�Go�\%�/����j�	�*��$R�	��gVKg��zP����l��k��q�K����0��'N�Y?�e$g^6�K,�jpU��h#�
B!JS�Y*�T�0�3�@g��++�.�kYL�
�C��X�Y
@o�3^�1��w@��1��j���'8��E�H%Qb8��]t�;<U?�O�	j~�_N�E^c��Bv�#���]#��`�����g>A��T��f����r��n|&W���Z�vP�����T���!td�6�36��i�y������M����1��L�0��������%DT�~��8+��4�������pWa��ZJ�9��\���������^�3��8����5�l%HI�-����7��D�$���T�|t��#K�o����`�<�����y���8��DJynX���L����G���1���������|4�f������ZKG��[>4��?�D:P���0v�� Q�����C�^!�
�<FC�����5c�UPU�� ��~/��!�V��i���������-U�h���j
?lxq_��%A="�2Zo"D�]F���P|T�Q���X1�8R��;$���k,���Uw��_�4���z(sk|�G��A�6Uj9���G�a�b~��tf�1�D/�$l��GDdiT��"i����L�g����p��mJ�nCQ��=�L��������	�u��*�=KH5�C5���pu���������l	�����ec�X�M�|�����d o]|�aN��:�C�P5����q�!	�Fwr��{�li^c�� Z����s3����%���Xr��R���LS�l:�~���f�w�~,Z�����u�����5N/�;����4���1����g�����)w��{�U�J�����k�}��s�~�a�+���U��
�s6����)�H�������2 �AG�#�J��
���>�h�e������P�����^#m��)^�[6C��
]~��e"�Y���*|��x4W#����%��x�pN��k&�������X����v�F�i�zh � f- ��8N�|t�*�����e6�s����=������)���3��[��S�m�W��;��?������|�GJ���X����s�H�^���!Ic������?|W�G:^�lO'7,���=|��)���|S�J�\0�
��\=�YYR�a�d'��������)��P�7M�ac������&����.�Rb�jWwxa�"����=YJ�w��A�V��[���\�V����TI��3�-��l�H�0%O��q2��'���a2��5�eR�!�����29A2����1�W���o$X���t�����F�G�r4�������`ly�8�
����s����,��)^-K���d^�����(h�/��v��W�6����:a���Vp�da���F��6�h�m3����i���hY$9Uo���h(��Z��"R5��^����^ng_��_a9B\Y��] h��������.��_r_��q��9�~�Z���;'���l	�i~���F��h<J�#��T���������66���2E�U�{����
�\�����x����:��������v��z5@��>���",�T�{�4|!�ID>�U��%��27���-�93j}�.e�Y�K�td3��$��G��J����_�Xc�I�l��'o�~?��{$�(���C���d��<�����~������<�:����������^S7��Ks�WVP�g9!���Z ��-����w�[�1	�c�{������SVD�A���S�^������O�V�3*�w��pC�����qmC1s�����{�(LF�+�-D�J*�Pd�:_����L;|\��!�}<O���ig�s�m�G2V�������lHQ��K;������rL������]�s����i��I�H��`���o����R�����]H�%G�O��}(p�����tp5�����(
#�eEr��7R��mW\�*���pRsy������X���j7e��p����L����C���	�N���uS��c���kb�����Y���F
�U4�o��@P�Y�l���YZ1(�������S���-�w��^��K�I=`�)�����>T�vgk��C�w�fJ��<OH�UF?���
��zcw�!�K�����^|r�b���xn�r+����\\2�r���i8%�%�,{�O�����P7EcPS�^�����PU��]7�����dX>�4�b�FNqmJ��h���x������;u�Rj�����Z��%cR�~��aIr%a�Q[a9��m����mF���@�#,<�C��������9�`��Vz��z�)�d\����-U)���������w�fT8�A�J4�	��q��
�ej'���I/�\�S_��8Qr�`����?�����<`�>Dn�	�@Q�)fdl3=�R/b��r�'
[�������	��9�9���������~g�"D���.J���yC)����&0���e������0wb��[�oa��3�����f��3���T����nQ	�#dW�O��A��M+�Hk�8�	!��K�&�S1q���t��au�����z��ya�Z�J $��cu��!�9�����Wa�� #{s|u���6t��K[�b��j��cQ�Sv���6�y�r.Z/m))�w�����O�������F2Y<lt��O-6��M��L*R�(W�*U�pwE�!
���3�v�U��fqH��|ST��
d�i�dod2���d�<���Y���S:L;L���j�
fpp��y�
���l=�f$�zo4����E��n��;b���1�l�E9��GL;�[��,p�����14����8+�4�A�l�$�e�TS��K����|�S	,H���������7�s���w"�S�J���48]��c�!<��������-&a't"�h6Y5�
N���c��2��i7��31�M�������<��m�},�,��w3���%y����w7{��LF��h~$�F�R�d1�����o������HY�����%���������w�����B�c��h����X"[$v�Zg�[	g�����"s����k]v�%R�pa�d�C�o���U���p`A�
d?<6�>�QV��;�[�;�lN�6�^�����AX��#�9,���Dy'T��>�8��6�'�7�,�M"(�`��^I<ek1!>1��d`+��5g��Xea<�
8�\*��U�St�9ab����0��[yr���|�&&��1���{��K#����N�Y\>�,7�&�o��{)��^~�c1�C�%������x��^Hns�#��\e����df��g�@�8�
������2��[��3?*"���j��y��#Pt�n�.N�������D�6aF���VOw[-���eq1%��*ZK�8�lb"}+X2D,���f���rYl1�)`����6�o��%���.*:��������GTl���J��T�T���y�[�����c.��'.t�����iCJ�L��2�bBp��h�c���=r������{-j���GG���f%���v�Yy�;���F29��P��99����1�m|����)9���:���,�)���^�o[���)�	��
aCk��q�u ��c�+/m��� #���T��ik
�� ;}�x�X��qLg�y�������&s{�M	��9N	v�hgq^J��6g9���x���u���*�����q������*���[��9/�r"����Z�JCy���U�S�Ip-<B�7����@�A�)��Y��fBf���:�'�C-G��I&r��_�6JPd�qwfp�`�n�7�|���77���M���x����H9���W>k��^,��7�.��D"I���R�f&��8����g��������\/�wm��Vq�������W��\NnX4�w���
{%�^�1���V72�Os��h?\_����`�� q'���&�.aYw����V��q�"�E�nz�s����h��6d;��������	���
�)F��:�q��c|D�a����E�������=gT�:"����}4\�5���|��V��fp��������'����u=��
��j��EM&�\Kg�����g���q������`+��a��^��	��6�~��#}��S�����e�8���O+�-���qd�P/�DC��5>x��V����c�a1�zy�F�:\(74L�����j
�r������J�u���4���N� y�{�XW��Z�a��4���3#����-�(�c{�������FA0NV�Q��>�v2����M�B
��>������D���-�x���c}�^�U7����/���E��c0+�����i�
L;��Q��(68d�|�
eL��w��mL�T@|�s��IS������XXq�c����O<�0c���&�w���F4N����@x��r�0M��*��V�?��j���o����5���?��BL}��s�5m�`v��)invf��d4h�����t�1�&%�8�g�][1*��#��q��,�ZI�Y;%����i�co$b�N�Ogc!������O�;�Z�i[�������1�	|�
�:��w*
.�/�HG=;d����))e�0 �>Mv|��y8K�K�_�dwI�'��n%nrd��`F8;����e)[�h<.���=J���\riY�� `�$d�� ��`g9tj��l�c�#(B.:l8�s�i(�����O�v;C�*�p�a*k��w��q0�B�	�BV�O�7�K��Va��|���[�������������?���&A��SW��af��{a5^�,��JJU[�v�mk3���if�H�y|���,#����bac�������f�B������Na�	/uN���s�#���}�G��%j����DqO]�'q_j`�"�R�����F�������i�����C��y%Br��;^>|���n�Z>�QhXa�U6S�iDb/?�R"�]^�$�c��ML�J��*)�ebE��:�3`���x l�uaG-����V��a�M�m|����Nze�����������!���'�m��;�D��=�#[��b
>]�Kl�a{�l��jT�6'��`6�bM=���e���X��w'���c�$�)cc�5��v\��6���
������!��8g���|%�S��u�!�UT">=��XO%l0*�!HarB�
�Wkh�K00l`D�u.��MZ�%��R��hD���h`<�T�����'?O�A0aV�k����C�j�F&�J�t��Z���ac��9T��&�8s�[������'
b�q�f&��(eT
4d�p���Sb���������W���Y
xF���nFfaFfI��9��K0��/��-�� �V���0�3[���$���q$^�6�8��������\�����R�.�B�-���pW�� iAo���>,��{e�J�sCI��;���#fb�z���ly�:��nY�%�A�v�����N
_�45|���rZ��sT.����s���	*I=����./�5Q9,c#���E�N�}	�����x�P��l�	�m��3l���/�v��c�+�8?���A*���
��Ng\���>��*G������?��xv��;[@ir��$���C��:`]��:)a��!���%��N����+��#�2M�^��^H $�@e:���@s�rf'����
��tY80�
F&4�����&�
$�������R�����3$��U�����7�
����v7�F�S��ZM������o�')��8$H��.'Ol��q�"����+����e�P�$kRAFc�+y;xo���0�PK'��b<�+��w�'w��f����*s5�����i����Ea'��u�a#7&lp�(��B�	<��_��47����H�4bT�f"9Am��������~c~5�_��*A-}�l���{Bjg���[k��+C�6>3�J����ke2D�k�pb�,9�������]���i�Y���LqE����O����I�yM%K������	���bl��Z�
\�|��!��"����*l	� �s7��$��47yxv,fBv��b�M�88���xKSQ�6Y���k���X4#�[�k�9�g�i���0:���5�\jl������?��8�D��>+h�i�#&��0T�X��Yt�����.
'|>��K
g�����PE��h�t���1f[��,������K4�������$@*����V$�7��4���A�G���3��9R3vW��5A���t@R-�q�4Q�oIeq��K���SiQd����X5r'%����6�"�a���,i��Pz���
� �h��
��;�	���y��Z���5�>f|�O`%�p�1���%<X��%3q+�,�0���**���i��������
�e��b�
�Db�3���5O\��� ��t���&������qr`SR/�>���R���R�E't�F�'�h.���Y��b2����	��A���t�[lUXW-���7Z�D�k���v�~��I(x�9s���	w�����s�a�0�����9��!N�9�2������:����o����6�j�����d�I����y���+��H~�?�3nq�M���A�8�*��������y6�����u���x��LlH�<e��J����+���p��s��������O"&J�y��DLZ�B$��/�
���a'��O@��O��:������'
�@�
Y���ZN:T�;
���?����L/�E��X�66��<��P�����$&��wK�)�}����b�S:�����p�{����T�Q���D4���g�.����g�#�|6��N�IQ94�8�E��� �V�V�s���y�R�*T2��d��8������w72���x����#W8����N���Riv���f~kX����k
�=�Cvy�Js����bZK�;��v��������wC���{&v)C�Q����_+�$L�&�bn��V�$�/X/�:��0"�I�b"[
ww��r�&k���B�a_��������lfB�zrvrj�5�@R�Xo������k-]�� A�KOdN���h�����Q>a����II��=q2���E}�E��D�P��-��1s;�\�&��/9<.�a���j%����o1/�3�wLFj#ye��m���;���g�Lb�Q}
b:�����������K���L���������
�oJp��u���|�GX���N��������sY�"^L-�m�e�[v��D���mV���6I�*[�L�r���3VI���n�Z�n$�����D@���O��DDHz��"�7���OI�e� ���-#�O��������b��DO��q0���0�����
'!�C��a�_�<�����&�N�������z^o{| ���"�M���%w=���F����b�������#�_�������7���A�wGl�n�R�2pd��X�������4;��>i���1d)[�7�|�Q$�4�_�L0!���v�	{%��q[��Z�{.��*v �ss��K��+my	��hzw�b��D|+��\N��+T-pP��2��,h�����V*���:r�~���\j���N-b�,�l��@_-���e'M�@��
K���U��%���v�w;-i�� �7�oN�A���(���1�,�D��f�f����%����s������{�������8�i@O=��$,>�G���X�m��jji�H��Z��n��)o��<���n�F��Jk��|�!���;���\D�
N<����9����@��~P�G�Oas�0�@�;�F��X�,=G����d�����dY�Ndd:$�=�n�����/�����\=�F��5dB���\Z��E�m�BH\��L�F�yR �y�hf!�a/����Nz��j�Q0pH�N��Uv�%6�}:����L���"�e���|b�M1��Lm3����$�GR�LT"����V�\q+<d$�4fm��A�n�{��f�z�����b��lY��l���}����q�d�mSb�=��������$�w�oO:���n���������e��A}�6d��������Wi4�L�)�%�������=������'Gq�����X�)��x�M�'	�u;�?���
�����=3����U�I+�f���6��=�f��]��K<���S��^�Ez�L���N��k@����M2���-��v�rs��5�q��:]�w�U���E��g���_bz��K���,���vf�������u3��I<�s�*������r
��E���%�?����^�����(��!�{�
��f\������l�[��'N���m���%n���=��'����4e��nk_�}_m����H]���v;������N�e:��]r���s��K�zJ,cc��5�����PNF�>�1N���"�P��q�u������C� �y+WL��l�F<����z���T���k&�.�ZJ��lc��Xbw��.���C\!��s�2��/��I���4�j��:8h�Z�$�DE�I���	�0~(��"9�'���{��]^v�0���?��(`IRn9W���eLEE|��)�aO�y�1S(��2E2|j��+d���@K��]*�a�z�xW����2�2,�v��}�����F�!`��f����f��g����a#��`&z�|�M���gD��H22\v�1N��%�x���sF���f��~��r�,g�N>����h_a���Zb�7��������__��}oH|M��H�k�.bE��gNX�C�p�_�?{��i��Vz�q�f�Z����6�����}��.Vv�+[��%�����QF��{!RV��{������o�������e�%���.hx�J�J���G�N�%$A�wB9�����w�3�d]�H6�`f9m�M*�f��dy�+�&�tj�.�	^��]�����0��Bz�>�������`#\����-��������b�yx�(V��|IC�������d���d��������K� q�/��V�D�7�@���%��z],k���-����^@�������G+A�#u�x���]�����T���{����k�C��l]]s�z��3�i�|�E�<xK��n�l�8��[�k[9�������-������g�C�@0T�[j�����St���Z<&Q_7bo�����s�;�8������M�^N�No�f��.7�F�U��"O�����e�7��K���ohz81���^Z�[�M�8�0H
�SL�x������_�������cSG�>/�������1�g�����jQ/��9��#��W���s�
p��/3���*���^m�Z�m����Jc��@������K	��K z��]����}�����x���.O�S*t�RH
��]_	e�qwB��s�����Ul�&����q��P�����L�����Qgn�2e����56�68iR���X��WAe���O��2oS�U#^����,��WQg�Z�PkL}~���+S a�Z����l?{����
�k�P�����no���[(��~�hl�=��#�B�bZC!��_�(%�:�P��:t�n-M&�����$�:K#�iI�_�B$#�G�p�}A��	�d(���R�^��B���
�vXL1�-e)��,_����J3����|.�����i�y�����p���Xr���K�k��q
��B*.8���>rS�hb$]���B5ZXi��iVR�	]/��K��UXU�*|��3(�1���$�I�*�M�W�$�x}���k�%���87)�}5��[�������������*�@4��v�Z.@���	�4s��w��
,������6\�($hx�2b�<�K5�X���r��~�t����������,�
�ZMQfjn�n�Y���&��d(b� �=�YS���t!��������5�d��@���V|�����u}eJ_���>���m\���o�����K/�}�l\./�
�/q�e�R�ib�a������].�B,����n�U\B�����\b�a�`�3l���<�Z(���7��Y�G{�>����_\w�^u�W��"�T&(H��	���!����-B3=��c��-�������x�!��E]�_�r0���T�(`<��s���Y�����J`[�OM����G�����%'�"��sI��h"}�� �c�J�P�`�:�����TX���d����C8�;����K$1�������������}gQw������������(c~��������w��?��^�}������K@�QDzWm�D�}����&�����7<J�7���{N�G�u�i[�����A{�N��������>�]C+iWT�Dv+�&��T�|���H�@���q�L1���B
������~3z*�Cl��f�2����K��5�k����s��@�@���N���� �t�^�"7m,yW�%:����g��M)t��G��b����yt(6�U�M�Dw�d@�~6�U�9���� �;�niK��l��-�	O���p1~��YY#��b���'[����o�"�]R�z�o� +���X���/����Nah�!�S���o1�&�A"�d�����K����/�cu�~�L�������81 #
b����x\���>���0H���pZ������=�c���;u�t6��f�<r�����32��$]����hd!/1�S%g�����������Q!uVC���|����p�tIe8���0j
��f3�5��������LiV
��u���O�bC��z��9,G�-��]�UI%�6E�K����g������3��o���-����bZ5d�Dz���)�a����:��R5�\:�Y�6�����l�9��^B��u���t%�l���z���J�B}5�r�'��EM��N��%����t���h���D��4�j�l���=H��y���L��ya�T(�-�h���=�G�
����+���"��.�A��g�Ro��B���};!�V���7��?���q�C�|e��@�s&1�*�� (��KbU�e'`O��ryH����K�p��a�>g��j��S��?3�Ak��d�h����)y�/���+��4��5/r9N�7&��m�K�<
]���VOs���k��A-��[L���n#����������\�`p
�<\Q�y������Ws����[�*�~<������~V����:y����T�4OO�4;�����|��R-]]uI���ab��1tYa�p1�hK�H����"����'=i���qR����;�8���$l�9�)Gse[���bmwk�������|��������9b`0�|vy%��(��bx-�J/8�
����J���QV-����sy��r
z����Wj�g�p��R�y���@mm�4A{n*���YEC�����e�D�8��{����I?��a,C�3I��2���`�����[��\���|��P���p�!��:J
��V(w��`@g����?���<�M�![�w�@4xt�KHd45h�fFbg�dd9�����de��Y*�y��������1N����0+�`���!���{F���a�����&%.�`�����*O0>���
��oU�i�����L���(319��U�l�)�j����e���Ub�8�U�2 q�/=
n������0X��;'��4�v�L�_R�H���8��{}L{��YY�!.G"^����H�������������{D���!��6��e?!^��7�����E������BfJxo��%w�K�)����Y�"k�6�0����b���Eo�<H�X��`��E5D��hT����0����H�}�I���39����/d`K���lI�
-����
u%w���& �b`AB$�S�D���w�M����[E���i���T����@La|���Qkr���g�������
����{�-p4=.|��N�,�)G��\"ay�F&1n���6�/i�3�|N���!�=G��V@�v��Xk�5`4!;�#3UZ�sJN��V
{KD�\A/#�-�V�xO����T���Tho
��^?�V{�0�m�/���V
��(���;���������`]�3��C�`���i�R-]L"����R��9��1%�Hk�z���y����6K��5/7	��p��I/}���,���_���\Oh�,�������[c,��d8*�]Y!R�v����a_�����e{�i���Z3������Z��C�\A{r*��NL 	�+��V��%�W9+�����^l"���1� ���%QF���G��F^����M�b�t~�8=<9c���Y���o��k3\���;���o���P�i��ZHL���|�4@{�Z�^�F�^��:X�syM��]^aq�kIp:~J�'D�LL��������Y��b��������i�[�-�����5�FB?�Z��"�fz�C��7�8N^�tK,����������^�1��#_4����HnI���
$��=A#KU�P)c^)�-Kh(YL)���E�!�}��fo��kaC��'UTb�$�W7����C�D�-���^'�t�[�[��^����	H/��^��laU�����h��e������.\�����b"It���W.SHB�OzUC�������t-��d�e<&���f2��|�L�c<�����@��4��!�U��=����f=Lx�-��������pRz;�-��5��3�s�^��!���Q�v��_~��Q�Y����hW��68���9L]��8�|F=|q�H����Q�G*�)H{ �x���	��Z�^L���y�Wi4�_��8Z]���`������d�Q��b������
�RR	9�������Q�qbSJ�Nd_��Ca��N���BBKnv�S�8��8�P=o�MN��\��e������@��;W
��]����9a��<J������;��Z�3#��f���E�����C�9;�������`�#��,;y���{�T���~�2L��u�-�^f�N��4��q.��5��u��w����,2W��&�`:�<�����k��7�'D�z�9�(K���U�o�AK��7���b�����]����1�a*�+D��=zY�X�p����X�m<{j�JX�b8�D��6�%�����M�BM�d�.��l�+(��6et�e�3�D�?����!�
�:)���xG7)��(6O���}O\sa}�>�8�S����ZC.��b�T�}6��V^�FM��i�N��-�vTGr�����N���Yu�c&K�]jv�����%G]bViA�Hm��S4���5]V c��1u����q	�X�a�D�1���D�	��d��T|����M�\A��t?�"`X%="5&�_1?r"�{$�f�>��
�[��f@:(��Q	2�Uq$.����-e�~4�6%Y2�p���N��s���������}��E�Q�Ml6���>�1����q�n�k�8�x�����*b��A����������1��������lh:nW��G�hEM�Q ���P+��	��iN|�+)�]g��H������������l�9���tn�������fAhu�~cz�������>�e�!'�����T�h���f����E�1���;������8�]�}��"����^�<�fj����NJ,����*;��^���5{��53����>~
����z����K��6����&5�����or���K+���� �;3�
�d�[#r3G3�}���h��F�UA���v�H����-"�q<�!s�	L�����U�����3?iGz��[*�3�����G������{6=���&�d	��e9l���yBig�=�G������z��>�<^���!�HECL��O?�3&�������thL�j'EI��L����7vT�}�4^�RL	���1��������S�z�S��*�h F�U�r�!��&&��K���1���(����w��F+�s%$��<
&�(�Kz�h�rS���������*��/{wq���|�q�X���%�g���@��%���(1K��J����wqS�V-��?��|��t�'g?��w��O��;�^v�v.;gG.��M&i�����C�:�ZK�^R����5q(�m?����f.k�4.��N��p��x�9�2u�z,!*%��pW�{�`1U3��h~b��h>sx��h8���bC���C�N�jT�P�*�<�U����-���Y���"~8�09�6L,�|�p��X��������������7r���{��+\��r�I��'p�8�Zn�s�6:*-�;�}��wc�D����URu��[�_��E�f-��:���ltY��s<�X�R������e}��$�'�	�Bm����K�Y����@z��L�p����7{H��
�rtw
���.c�N0^K�#'�!�Jp9}�|������0��J\��M#���p3-�>�Xw��"��N9��n,iI�x7�������d�f��Z����jy���~gD�j�$��*2�$|����}�����u�H0�U�:�`��f������DRp���2�k�Mb�9\�lGD>%���~!]���T���<v;@zh�[����a�-�����E�����[ks:c�%������u���C��by��ms�(���Y�W�=V9n�T�����:���>q�`x��V9��7����c:)&�)��zsKd)�j�q��m`]����?��	�|�'s�2Bi7�aU���,��$N���9��k1=+;S��
�!o}�]��Pp3�H2N<�P�5�F;F,	y�4�6fF�X�$F9s�R��	�l�<��F����q������	Kg��Y����Q8NoA�!G d�5���&���E�����D����n��1	���D�^ �'R�3q��-�jt5�:����S����y"iZ&�D����VXD5������Q	��l3w,Y�\�?��,��9���o����Lno��R ^��I��������"?�7�_�xhCn�cg����J<���4i^��anl$d!
Y��4w�+��d�$IY��N��QW���=�l���k�U0�	����aq���$�i���n�����B(������u+
1�
gQ�"��-��Rwf��\�]mj}�YI��*FI��i������uH����I&n0c�J�����4F��2��9���2t���=�dG�y/��lV���b���#>YE����qH8�2}��� �{<��9T�7x6$
����F�4.N�^�� #~��Bl�nCx&��p����A��%�r9������Xx�����>�����6�)��)��I Yg�c��#z�8��w��c'��nj�Q�@Z�	�����L0���O��ffp����|5�{�0+��`I����WI���a��n�W���{�Q�^�M�i �E�)���EH?�qr�cN2���l�J����� �I��$z���DX!u�� �I\������$�����+�^����k�eYrPb�����z���p]FG�:�N��|�6�������!�������?��M�8]�{���5�l�5)��uq>o�}�y�u��:���8����I����+��I5��$�o�A{3���������w��^��8+=#3�m�-��%�0�����Y�N��Y�����.���O�YJ5�r�k/�6��VuD����M��3$����L��1�c�+?�\�`�a/�d��l�������qF��}I��[�
����)����6qIQp�9�����M.(��V����������f���=�q�or�	OH�B`S��������������T��*����������l� ���+�/���d���sy��|I
y���|��G��8��������9�\r ��*..B&F,x�FY����OT�o�WL��q�U����^�
��/�'��vG
U��It	 uTl>J�>}y�\i�e���d�Q�T��H��L���9�����^���a:�w%��q7�(��+������#!C"F��;���������C}Y1v���{���q��`���;��O��".b����Q�����1��7��V�,?i��x�7�n�/���2��d�Go���'������M��<4��W��J�q�gN0�����=��ry��O��lWG&�+���sp�[�����|������t��s�f}��+�	d�S��b!n;�����M��,�z����-m2�}�,!�)3\V6���8K�{~�U��*%�^����+��[���cf�����Jh�%���7������J�]��`X0����04R	\�<c�b2����	�vyiG�a�[����#�$�%��Bq�o�vh�������_��Z��U��Ozh��r����n�64r�)R�����\��tN��8%J���G���GY;
#g���Q�%A7��j����9����PW�	�����1r�W	lb	����@���e\~_��m���O��w�v+�l?t������Rd�C�����������@����)KL��N��]��M�fs��G�����X5�b��N,Wm-Qs1a_�������_�n5}F���s":9��9���=>�L��m�%����p��{���x�D�I^�:��.�!����w�L���w��������]����=�(�b�9�seo����
���������]6�o��Na�V5���J�����\m!���7�h,tMb�k{��e�r����!�Z�����~��x�g���<��1w��w���0���B���Ln��)z]�[{q��5!��T�������)U��z*�W7�����Z�{��������wH0)����R���� �_��������gr��W�I�V@��0��pZ��2��D���z�:�������bpc���; 
�M�x*w'���2	Hzi3��������X+f�<��(D\@��Vn��b6"�f��36x�&R�t���}�=���=IL����wG������
f���&M\P���R8�������9��@�>���s]E��(��TwCU�Y\.��N�	��Z8Y��)�Ln���,��G�)'"���Tt���.�Qk�+_�y�%����A7�����O#��"��j���z��o�{�p�E��.����aC����`gHnO�1�
��1�q=��^�\	D���)<����foX������s���d2����1`�9����x��*�6���?�<)4�$%�s�=�F���0�Y�~D�l<���l�D�������!��lU�Ij��~�I�7�z�Bc���6����f��6�N_��;��>�E����y�)�n��U�b9��}�'�n:� ����/�i�I����#�����*�)�\(�������v�g�� �}$����9-�.���o:����m�g��������R��UEK ��;��8��m@^G�EL�t�	�]�9���\���pD%?J��:����E�!�4�r��[fy�x{w���m����:����i��~\w�O~�]��O���^G?M��{��@��!	@�������������Q�{q~rFm�^�����*����j�����#���)P���	�fp����uP_~^�/'��;��5zz~v����^���u����_�V��Hu�_��/�3��+n����bx��������c��
�����T�����_�2����H�����<��^�hd]�w]8��MV����S��-��C����;�\]���O�_a��_^���?�v�f��uw�7�����O��?����:D�D��������L���'�����?��������;�	���	�h�C2�7����V�SO��_�/4�8���p ���FG��1zM�]v���UT�����?��6?�����v���������s�C>9;����#W��+*�c�����k����L
\w��\r���`S��~<<�/�����Hs{B���D?�eC
��.�I�w��t2��q<�o���^\���t��t��G�P��cp�3���Pc
I~��������6Mww|O��p�)8�f8A�T����u Vk`4fe��W.8
7��#MoEJH���v��sx(��I�|A���0�28���#�{�Ut�k�{�}�N��|���c2�� "���(_���p��	��m�����m�����.�������[
��/��@z�6h\x�Ls�W��{���9�^���������Z$&Y�6����V���B����yt�������I�+	�1�H;�2U����()�[����>���z����#
��?�n�t1�;�i�^�?�^�/+�eX��7����p��"��ywq�g�����g�}b����J�������e���g�g���������D�m��%�����kfG�;_
e�c��{�
QW��"qh�����}����f���z�"(@�R�2H3'{{��X�.
�����M�R��(�:��tI������t�i�M(�;X�����q��eO���E�]�T�����J2�tM�&���'��OM�,�{�!�������*�*��g��/��z������z��6�f��n������H�����a:�������A�����u������X��>y�tO��z��X�=#��NF5�*���1O}c�U��H��o#������nxsS��PkX�`���T�����n����7Qh��kt�eT�H�������VG$n�Z4�����M��F,q8�Z��/_���x���|�m�w�C���f��X��ni+4�:|?������:�li�t��
2q��2q�_��� ���Re1��������Gu�e�����0��L�W�J1�����O�����O�z�HX��}d��fR#�j�����pI
��VV�&[N�@{I3�\��9"��-8,?�����A.q�����P���\��\�D���@;��#�2��A�0J	o�FA��6����������������1K�c��x;,8�Y�+;w�;���"am��=�9������!-�}*1����Fm��')l�`f�����P��~���&|���K:2��=��������$�b�tK*�b�0�#��mE��n~)��u!�.9��i�E�ea�JR��v~C
f���XN��������M,c25�(3�P	J���j��C��)eP*��P#�3Na<m(��rum"��{���H��G��]��r��az�o��D����u����e�O�O�N�;��k`�������[�����x`�����|W�e���Q5���w�P�������p������Cu�~��J�6G�+�Z*
��a�Kf�H=����H�j��x�x0�&_<�	D�������Lr[�J�z��L��L�y1q��a
�jc� ��`�������'�g�����G�tANh3i�X�MO�Y_�`XeO��M!BL�``^q��N�]B����q9��>u~y���]��lPR��d1�����*�L�����,����#�Z�J�������)����K[���n�y����E��3be�&Q;���P-������d]j����U����g�ak���/[����b�MD�o:�������n2�����<9�xd����|�}N���Q��gL�[���I-��z�K������$\nK��2��,|��%�;��-�s������������h��/�{�{�{����V�3b���<�N2�7���h:�����#{���-JX���I�_�	%zoh �!�	�K/�����Dx�q&c��G��C���J'c'�?"�W2u�-gB@�7����H�E�/;	g�T'i���}5��z������2j@��oG�VGb0��^��h����AE�4"]	��S-�0I���N�
S&�� 6f>������9���8�LN�FC�����O
G&.�	��$w2�J�U0O�3L$����8��t4v{�|I�2�)*�Nd����\�~�8{��
��.*D���uD��4�n�PBA��R	�4}` �;?_\vY~�Vp����X#3L�qb�G�i��R�U~f��e�WS���'S3���lZ�R�nH�	0�k�VN�1���s�^���7E,�u�w�
�B�&R�=����ABG��&5/��C##+y����xxe^9��m����k�#�\D�w�����*u��4��*����u��[�6�W�D �U��[������a�U� u�=���v�MEB�|������]��x'�HV^�N�d���a#jA{�����\J�������j����w�WEX[�������������b�0��c7
p�#�L"	�;���Yyg=q'_���N���"��q?�	<�
���p6
I�����-��S�M�uA�&���q3�p�O�����ts;�u�)`f�q=8)��S\]��_'�����	�G��]�o�<����
�@\��G#EHCJ:���]���?���������JD7���!;dBc��fa
I���0�w%��)2�����o�146�0	���y�W+�M�~��"q���.2�w�+�K���g������IG���	������/�B��p�@	s����!�S��|z�p+�_b����������4U+9{Hy�i�gJ3�K;�f�X���2��������5j�2��n"Y����($���u��wF������L�7�3b����[���a)HZR�K���%>��w�qE��}���/����x�9�VS����P|+�~���\i��A�#��
���%H����1PK����.����r.��aQ�^.IG�����9-�>����?������)�C��C�u��6
��b��od?�>���R������d�eW���.}p��w����~����n���,
�k��6_��O����b�^"q���[�\�i[]6��>n����Si~���:�u���)D�O��m��iv@_Y���_��C[ 2�|������|MbK"�H����j��v�[�|����~�������&!�z,�����W�������������cER_:Xo
3����.e
;"'1#����'��`XX�N��5�Gd7�p&j�9=�6R���y�VR� �a��"�2�$=Z����;(fQ�>���>�(������S���%w�J�~@6/��5Mg�&�:�Z_������w��b���;��`,(����>6v�����f����	�!N�	@o���n�:C�!�9h+F%5�bC#�TRL�*��
��=�q�����g������}b�
N�i����|
X/���
96���D*L�7��
�����q1iY�M�bt���g3:��G\A)�oz���m����>��-	k-j'{������E��|�:t �����/.���Qc���YN�V�
�~��{*��n����o����[" )s�H��d1_����g�,V�\�;�p�����GG�T�/�q5���=���[\|�{Ji"���'�r\L9��
1����m��������~����t{�(�>�������U����M�XEJ���Y��$@���bq�v��F�Q������������������*�^�G���VN���E�g�Q,l���A�V�3�,:Om�m"��`��L|R�\n:��O�A,��^���t
�C����:���������GX�"Q(=.#v�Eo����|rL�s ���,^��<����xW/������`����G��^�����?i����O^���n\�XO�nr�������%��I|��,%w�'��zQ!X������W�����(-h,�-(�����.s)s��q����$?�<"����7��]?9f~�}f���������}�c�`N%{�~$�NG��#I��eZ�}����2�J(��������Z�L�d".��c��C8bW������#����9k����'��
l���U	RT�gd��e��lE3v�W���%����I^-H��	��w}q]6(e	f+��#E���SF1KJ���	a(&J����:p�����*�Am�).�M�$ ��B���!����>�V����O,8^-z���0��w�?�>	�����~8�$���(���E��?��.�dw�b}#���b �r�y��V��y�����Oz9T5k������17�SAJ~��Ie����C�q���ij��L$�X�M�X���r
x���I�v����j���)�P���6lQ4RM�������x���	�K�Yf��q���yG�N��f�C-��2e�L�b�Y~�N%�zR��%�9;�%6��(�|<���$o����KM�ib3I:/`m.��}��9����
�K���K��[�F�Z��o����y^�J�_J�*8���U���q�c&��!�~"n�T,Q�%����G\$��H����<���}�2!/alA�E1l�M�>�[4�j�j���M��.����nCf[H,8���q��v"�[p3������������>[f�
�_��B��zk�L��v/{�dw%���dSf�������#�2q���6]�k06��p���YdZ��a ��fb�L%^D=���+'�8DF:?�������F6c!Alocc/f��F��\w��]X��#�����O��J�������I/��-�N��LfSH�;�4���.�$����5�z�C���3	:"_o
�\��L�=(������N�O���1|~>UA�n���	�H�9��f>��9j��M���@���4I��Ed)^	�FlK���6��x���K����l�D��fS���}���2����=$�:��U���7	xl\��l�)�"m��sB�^$�)�o�	����
�@G�N6�o�=4�������eo�ze����X9������$Y���U�{����[L�_E���gu�3�y$	��M��-��4�y}�K�]����;IH}~g�3�������
��^~���+�)����=~�/�I8���(���F�����AX��w��F�_,���������2�k��5B9���T$4�+aDq��+�6��������n�Fy�q4��p�������%��n�������DW��p�qOg�[��|>��^�!�L�_@g;l�[���A����["��4Q4��BZ�`s&~�L�T�W4�1q|LS��R,�4��s&�=��� �_0!��Pi����|����� j��Y��_����3�$X+��+��n)s/����BC�8�����~Pb�(K.fc5�����W�/���
o��M]}>p�j�����x� )m��9�?�����?L���
(����~#��!����8C���
���������:q��jtX�i
����������?����Q���P��`�� J�������u�h�W��n>quC�mn��a:C�N�B3�y��i�fq	�pT���#�R�>�Y�Z����b�e��z%�K����&Wa����$�P���8+�m�(+�*k�z��q�N���U��3�����fZw��3��M7��j<�~BY�7�
����p~r�P�X*����	'��s��w�[e�o�[�^k�Q����b�Y\T�����3n3����O�BE���O.�?�n�>�j���Bo��I�F~������s�!eZ���
9�7�r�`�������Y�?�)��c>����6D�`��VCN,#ZH��Q�e�Y��K6���8f�\��HL�E��3�$�>t��k�P�kAod����p}��{)F0���U��������������M����U�R�d��`�m8/f:�����|�����a4���K$�h���vDn�'�N���z{��i<�Y�!���Bw�Qc0�V{���^?G.Z����i��l��
�w?�?1o���o�������{~zg����.C�
���i���y�����L"�(���}1��~���w�O�Ot��g�����a_�;���@8�~9=�9�`;�8z�8������	U�u������x-\\v��)���y��!0��<0��O�����n����x�'(���>H��?9�4#�J����g1J������!��J���FM��[���`w��
���a^)���mU��`��yh��H|�"���n��cz:���L�s�7��ti�@���|������7����������1.���xA
0�a���x
��1�~w�i<J�LA`�
��w�1G�����/�'���`�(6��_Kv9�;���n����)����	���C��T�;v8�A����5���{x}����G�Ke��G1@-�b��to��y��6�t�G������������T�y�s2��-;�c��4���#;IO[��TA�g����Wi:3!R������,Y$o�%�.\�d�VX�|y%�l.��,���nh?I����e��=�������r���6�{��u$fv��exs���}������a/���b��m!���e$���������:��76.����?X��8q� �H��I�j�o�76��xf�G��0w~r���/U�
�������������;d��Q�=o	��c���5�\���q�F��mp���#��<����<���R��Wo�3a��)�!��HJ�?�
85�N�fin��r�>	����bR��5v)���MNM�E�F��?s�����_*B�� �{�YL���� k7���z;��L���l':c�}���U�@�S���	��@��+�Q����h����x"V'�$���R��002�����t=�>	`C��q
6�Hb-����N�,�_&5��pw�Em���Jr���9�#�M��"�����{��t9}������p#H���+���X��=����(`����R��i@��s.����\�us+�{��-x���@M��	���.��d���w.�$Y�i�����
����q�
�M�~�w��1��@���p4��\]�F�V�b��`���GN�����~����U����,y���{�aV����n{��[u�%O��_&A�R{D�C;\�74=�]%b�G?�����1V������q�� �AcB*��0���I"R���L�U!���hW��L����:h���(��?�!���������?\�I��������r�,W�����Q"v���<B�
\�����I������.��#	Kw��U���g�S��v6���A����d�y�*��7��[Y��-�\VGC\�:�������j'�
��Ct��V<?�\uXj��p�e��/`D�A� �����n��j���$�&�vJ���7]/�S���n��P�������P��?%�?�����a�n>eh(</����	������e �=\��@���5��<���	�O6�v2����%����V$V�� ���[�qq��������f��v�E��2��1��NI����O=z�N�;�g 6wt�8_F4��]bw1��>DY���ZO����eH����~4@�F����I���Ze�M)��J���SnJt^��3P
W��"�p�pI�j��`��m��@��Z��l��w�`��_�<lf ����d����G>����,����C
� ���Hpv�*�&���)��1��h����T��
%F��b�	��&3R8��"��(=��^�Z-p�\����E��f�S�^�n���=��4~�Y�&J
�+wUR-}��8d)�-��%eeP)R���������e�SI&�GEbr�o<���X*w_!5��=2��,��j�p6��������''��z�����h���S������[e�X2��D�����}5�<�n*�5�&��Cc����c��_C���8����L�d6;>�	�����m���:�pk�.f�>�z�������+g���O����*}@�u^z>���h���k;���G�~�sQb�4�T_D~����	m�Qk�5�4�h��2V�B����aB�:�+�������Ek�=��;;�$+�>I���S���/�$������Y��>SI&��xc�������$����}���|�0D�@a��<������>��S���x��4r�QR9�S�O	�x���wD8�����-�v�����^Z��&��do^����?1�-�+/�m�p�(�#&�o��%����
���A�Z=8��[�9�=�-dwK�k�G�n%2��?������r�wi]E�t9}8��R�o�y�72�U����bG��i���}���0����{����=�c;u�zK��H�j;�Nm�~�_���8��h�9�)Xg��m�:�V���u��z��^�Z��v/�I+����+gK%���������T��>x_8����C��A��K]�f
��4��:g����u��eMnA*�9����6FN�����ba���x��3������vc���o{5D��uF"�A���4S=�.z����;�?���,�s��$�A��)�����>m�A}��h7�%md�h1vre�����w@J
��?a����:�����Z,H�ek���$)���'q���<b��������3}��6��`�^b���.�Q�[�L!>�R�Z%�^`�\S����(R������.����j�Q!)���0�I�5n(���V�����6�N�~�j�%$����5�����?v�����qi����[�MX	��]v�:�?v�M��fN�y4���;�k�3�5�G����W��?_t�o��u��u�[�nB���K�����t}��V���^�'BRO�1�WS����m$f�n�8Q�*��,<�3pW}��]b�S;Hk�F�oI^��H�Fy!�cI]��u�
Q�mQ����n&�Y����r��q��*���&�����n�P�d�\�[wwM��2a��[�6i�
�G��a!�^@�K��W���x9��R�HR�~���9�p�1��.C-7"����e�s)����r���&�$����d	V��hQ��M��O�e�+��o���{�dR���'e�sc-���f�<J������@�_N�R���6��p�Z
���A��B(�������)��M���7c�v��{�"a��rt�y��"��=�P�{�4
r����.���"s�b���62����1��7�ute�|N���X�|P���$_Z&�j��ha��V��\����g�$U��%������aR�J����C4�K&f��Y�`�w���"�9Z��;�
(��f��v��5q��0��ME��2��c�������^��@qT�
���J��urHq%%%$[�� N�������k�l�,�B~������e�����)}�����_����"������-�R�R�T���
v��� �����@�T�%{J
�UUr������v+�v��������J@�Ar9��Q�?�\^�?<%Q���PEdjRCt��h/���A��l^
����*�P)�]Im�J�!z� qr3_8	^��.���k
K�J��c������7�
������+�]>�\�C?���J���n"� kA�N������\5q�l[z,[������"����T*M��(�:�?�s��
MY
�`82x�����F)�e���38R���tPPL�� ���d���k--���B�,���|n��>�8�z�+���Q��`W��\:��@�p����op����T��Q^qc��?��N���Z�p�A6U��5jf���qF7 K�NK[L�(2���z����z/Fb^�"���-��<����R�,wFz��w��s_��t��.,�$���h�p����;a�� ���#x|���(����������{����$���T-e0F^�F@$���~x�������������r��j����;����x�% z���,��p��Y�!��=��8S�)�?�����h��b�(��e���	��#�i&p�^y��9�j��N&��GB`��}����;n1�`l<�^p��Z���c���3)j��^4�>T��]��.��v���mW����:��a���[o��6��=S���;mWxUpK�	h������6�#C2{"{A+��x)�=+k^���8�O���_?%�
)���.6��:`���v�3P@�A�4'�J�*���y��{������]�]���#�[���C�1*���%nGC�m��{M0Y�Bf��_�.�mF����Z��Z��p�.�i ��2E����?�����c�����!�?�E�J`*81�_h�{�W��k|g�; ��/(�sB�.�eQ>���[���oH<�B��n�����h.m�pJ.�9A	��o�#db:�?a_pEP
f9|M:�,i�(���M�rB��@:���QU$���gEZ�$hy��zv��W�&����a������M���z�����u4	'�lq���h\����Sm,d=%�b<��Q�zn���`H��������~�,�.�8F/��
}4���/���^�G�a�H�J��\2mqK�}Al9�V?�B[h�^=��77��?�_�Vk�0��q�x�s��y�&;�g;�>jG\n������Z������n��I���-zWo�vk��^���?�uj����l��?"Dx�������V��_��-�����Wk4�a���z�hw�j4���n���(l5z�;�n����xv����4��f^�|��}4���n�I�����������J���M�����o����
5j$��^��_6����^��y�`3���/��G?�{
�&|�Ds��67M����$sT�#Bh��[C�9�m����g��������2c��2c+M�-&�x.[w�s�|���hp�i��k�D��y�Z����w��S��E��mr�v�im,���l:�rb�o��j����qo,^�%�������x�;�?N��[KwSN�y;}�����C��Hfemu�k�|t�H��o���Y�������
�d�^��`�����,�������h��M7%�j`L�&j�l�c>]��q��P�&m���)�d��W����ih��0�O�:�7�r<����y���-��Q�vhaa��*�@_�eq�����b�In/�@����js�Wx�"�=����n���C-�.�^���E�*%#���D�_�1��������q�A�"i���%D��7��&��������T6o��������������H^J���S��}���Q�B��e(r|#�iE���!��������f8cv��Q70����~�4'}��UF��~{V��N��ILB>��2��z�U�3DH$G�i�	d9e�����\����.��.d��AG��6y��"���1�3�d�����f��HV�m+s2���!�Q��d�s��*OK0�ILJ�|���NN�\�@x�/��t�J���&2����y�m"�6���YJ�Uo�Cl��E��zW_m#��_D/��T���������`�U�0��Exe���&��xL8�850�R��<:�M������}��������FLx�Ax�d"�G�R��R}�X���sm��/����y�L��r�����\��)kC�����K�`���I������3���9��&���,n�q:�//�����rz����&�]��k�����^��S��fr��1����y��q�AR���D�!D"�2�pge��������Gq�L�=M���5��)*3K�E���o2���g �4�'����!���_���Hd�����E�b:�%>d$]���'������s�'��b�k^c�Z�d``��`����d�z�6S��h
�������'t|��3�t�T��!|t�$=��c �Y*�H�#;����������"�[�I����z�
�>�N���Ehj�1���C�I��3��9�g[��O?t�6��)f��k+8)�(����,U����aq2�0���t]>n����GMK���)�����k��ah"Y�B����;f�V��vt�hviu��n����-�+r��7�O"�,���	�P�`������]�Y�>I��M6
������L�(��KqQd��Et��"�_���J�]��R�mqw��8b���o�4DI*YI6Y���=�S�����8��8A)�l&>�����������H�	��?	����%�m�y�
���_��f����`����@<p_����:bU���N=(�����~���d^��b�����A���n���n�/8��P��<�
�N�����T�
;���&G����_2=u	^�/���L{R�����ZPT#SZj4���v�&?����fPo��Tj9*4������]�����@H�)oC�������t?�5w��0����emlgP��J������� _ ����J9�f}�*��V��0�Tk`��C��a��I7:<��������xU��k�'lBH�b��Z_������	.n;������${����4����vV��6[�J��5���j`p���:q"%��`�'�9��_����G�@�����������on?y���J�z
8sy�8�I
�U�p���"�����A]�D��)�����S����#���������:��jKk���}��
4/�N��x������LZ�;��g���N���&$�!G)������8y`]��'�[K[�����^��y3���&�J�T��v_�19Us�>#�9:��E:���2���~nW�4X]4W���:�I�$l���A��&]��]�}��X��
��
>���������)��.��q����_�U����dXb�6��th��T����x������_d������R��v[�����jTNh��/�Q���v��mX	�y`X�;}~���,�!fC���E�Tjm�T��V�5��O&��e��sQ]�s�0I�$t�:��~�7�	�TS,p���0�c�b�!��3������H��#��1sb��yl�z���ld�r��ycI�3q��F������p����O�]��3yALb���p6a_�������u.�?^��
=q1z�r?[��U�
����U����}U
%�m_fl��}!�t==V��5s����l�����3Vm��7�R-bf��e*�����S6{)���3\_L%�<:�3r����\^w�J���$>,�5f�����a_�|'������J_w}G������M�}�jZ9�I�~��s������3��T�u3'�u����T`q8k�o%��]�Z���jF��	6�����j� �o5v[k�5����7���?Y"�M&����m�F�6@Y������m�"XqW"
S��y�i�"rJ!�N1��>��)��PI
�����!�����d^�?��3�'{������}7S���79Rl�+wH���VJ�����lk���+�|W���\�zK�n�����;^�����;���K,��$Q���L�{O�?�}mNo�����+I��0969G���J�2��'��>���^�%/+�.���O�mH�N�����P�Vb g��=�k�Js�)�o2A�
�������nv����+���>���?��aL�C'���9��/I��-b�iFn���7�th���`�������:p+��,}6)����G�Tk�0�!�����	$�&S��u$,������u=R0��^<.=�9����fFb���5/j�29.��'���j^X��5�X:�g�	?��p7�7N����J(z��Mx�_�K�
��^��(;6{���iC�p���w�r/$P��Q6�g�cUn���z�$��Od��#�9���?TX
��&.[}$W���c1��U��9+um�|Kc�aNq������TG�y�9FJD����c�J�'���D���fcc���i�^xKn<�3E2q��� XC�f��OA�vG����� ��wy��=�Ej�};���+�+%�������}������p����=g�����}t)z�0���1[�3'��S�|�
����^'��U.d*�btC���8a%��nU9P�w[���U:>�k���F����~N�YqY�8[FQ��@3AuQ&i����g�s\����k�t����I�jR�����%��w�:�|1���,P����_���������q�x��Q��6�%#�P<�_����$�uC@�Z�ZM.O��y��8��L������$�$��q�,W_���l)1���z�c��uNV���}m��LX����jU��^k�.�s�(�
�B�a����!��].��VM��������Id����{�h�qO���������R����J�~td�:��tm;�x�S�$����:��k0�����_L�����[{W�,����m�]
m���"3�����WB�z�u[�{��Ak��{��nN�VqE��/��d[3~����t)�W~��i������������v��c�s^������_�/I����
z��f�1������d,iw��L������F��G�O��f�,���?�f��/�����x
�P���}~7���
5=��!��/�Z��5�/Z�7:��bl������[�b��7���f3a�x���5E��X�k��'n�>U������M1�����`��S���@�p�s����E��km������������?�B�W�D�N��Y1�zA�
�9����\������U���s
��K&��������L��p���������������<��[�	2�L�l��3���������e1�_�7r���CKd��n����Y�S��/�T4�l��=�qFr�������c��2�Y�~��`��������z��I,����E�R��H��tQ�' �+1S;u]����Z
�h4�.�l���C4�^���?Mk1Nm�T���*���Fy��h6�������E����{Y�h���J�!�����h����k.�*(�F�]��`�I��|��E{PY�����9�>�F��o��fl�������K������i��/&�_^wL
]��_:�W�;3K�����+�k�m7O�u�-B������6�������"��+"��!�~��IE�z��V=i<����[��&T*�4���r��\�x�5�1�<�V
���-c��R=�+�PA}����C�����$4M"������;�����?o����������&���?&j���_rN��u�fPU�������Ff9�V�7��P��HOdAOVl�%=�V��F�����j�=h����v�_����t��x��(��{��IQ�	��tqm����sxh����<{"��5������N�ncL���`L�7�Lo���g:���������|���%_u+1]��w��/m)�������$�����������n���J�O
m�7����n���:U/���r��<<����^v���
�Da�Eo�b%xF��f���yiVV6��'�E���w~�VD�9A@��rl��'4�O�C���"��\�o*�X�7\�G�Q���`�s9� =j���GxdH��]�o0G2f���J�o�8���Lf{�`�!�1�po�����+��U[S��6L�������U�{~z���s��1:��]2{���rj����/�����.m�`	��D����6V���~���c7[�V�� 3
d	1S�	py.�� ���������^��UN�O�5�T�X-��b��1��F2� ����+�'.�X����c~R�7�w��������M�.|]��r�{@�0m�����������w~Z=EG������h��e��opX �����{
������s-�8l��L!�8N[��������n�NNs�)��q�=g/�;�Y�p�{t��>��f.����9����W��
�IS���W�g�����33�g���0$�?�W`����@W�M+��|4vA�&�]���zA-`1�X�����}��#�B88�&����a�%�9�Ny��Q'
��.�-��u��%��"hm9Tp8`NMk��.D!���b�6r�n�q���]���?_����|����@gR�]��3����g�5u��{0����Yt�N��A���{���')����b&_��[��a���������A-���X�P���3��V$�
�;���O�����C�U���CJ8q���
��\�&�#e$����\�	v�Ku�PpW��mwX�|���yP�����N�Tta������
��V���Eew�9<Y����c��5��'4c�.��br�LI_��	�WE�)�'�Z���Fhsyr�x�8[�$a.F�4���RN��E|
����\��(z@�d�����U�6���2��T�F���w�=�=���[<�.=/y%��5�`�5f��"�
���������d�����&��z��KJ\.5�s�c��.��������^S�M�����TR����e�e�|���;�l�E,�6=���t��(�gG�tIl��vL��cnGc��9��&D����A�7I` ����P���<��+��/��C�A��,����7=^{c4��D�D�'�KT�B�@���9�y]��|t�L�t�F%���G�9~�F�*�
�5�$����r�ER�x+��pb��k$3"������;B�)����� 
���H��.�����c*��b�?5�%��8w�L��T����	M��J2��K�b��l�~ �}oo����^��?����;�k:��0|n� A��s�q(*�";Eqt��7&|�G���X��%��*������
Uz@<����$�yJFF��$dL ��c��bR[�pm#����)�?z�4;���C�qsm?S�\�a���Fa����[Ug����6���v�8
3a��q���m���a{b�p�J�1?�m�dww����� 	�d>a�ww�v�$�����	���~eG�����1��9�pH��<�V&�.m�I���
���e��L7x�*J���[�|��x��������w�]�%��j��BL��_�e���=e2���z�&F��,�bB�����1Rn���>0'�$�_";�8�@_@��%$v�r�1A�Y�Y�q��|'!��Y5i^	��+��5��$�1�X���14{��*�="EQoo4zz��cl@�DS����T�Is"�X�r��JP�_.����%�u*���w���o���m�|h$�5�D�������(T*.Qv�cz�U����2g�N�aj!O��)c�%����\�.�����a�rb�u��4���L?��*F/d�L�����t�b�{�)����3`����[>%��4�I`�pK]���nF����<j:vp�>��iL�wXO�>�k��GV��f}����#�F���xxzr�=:?}���{�y����u�}&�
w�Mi�Q3Z�c`�)pZj�*���c��'c�� �iU}W8��*4��W�V�1Q�-�Huz
����&��V����r���K�2~6�iV;����Cf6_�|z��*�x8�j����9��_�K?�y�� �/K4p�}4M{f��?c�%�;�h��-%�t���$���J�Q~D����	���H��2���� ������	S�B�����
Q���a��%T��
E��Q�����J�!�j�9#����E����S C�_�W����
�Q~�EL$����])k&���w�g�w��X�j9�	�KVE�������	V�W��e,���HK�boz��E�P�CGL���nJ|~���#�(�b��
�
�g�\k��=�=����qx'|?��/��C����p�
��/=Lg��������N����������5�6�M����C�.�����Y�T���b�(�
j���|[�TP\,�1���\�`���<�[���PD<����$!���x��\d`CC���y�EpbqZ�{�<��n�Y��V�g�g�#�e��uR���"�L��,a��j�����'ZU�k���Q<x�$_��������������������+���U`�J�����\�F�K��f�{��T�a/���j5j���Z�8cQ���L��l�Q�k
�BS�BS7	�M��O6�_�&M36�\���9�+������9�c�����{���j����M�X$��\�<U�R��4`�.
��'E|�?�!bs��A�@���G�U&���q`��������kRj�U��������Di�z�>�WQ�**�)�.@��H��q��!hyX�_�G�<IZ����_
y.T��x>\FCy���D������UEP�5R�$�t���T�������C���
��_��A��]%�Dp���U���L�{%���`�T����z��$IZ��"b���dK�,�s���t�K�!���Lg]�����<��R��Ck���0:j�h�n���8�w|a��X��q��~]�=�B��O[�lf��&,x�+�ux������i/�UWr���QnLsL�`Z���fT��o0$p��S�w�N1������(��?������o���y@���8D��#�����;��S����L�9�t�`M��	��I
�B�=��Kc>#�Rn!���
�/`���wF���q@��e��=k��#����C����=:�6`g���p6�����j	�z�n���[���L�BJ�����:7&��X�����g2�����"6���|@l���fn��\��I�Z����x��3	H�f#J���I��	G��M|�D�O����/�8��f�w~����N�J�(��s
���4��9 ��������'FR��m!�_.��,�����yP��=�,�h:$�V�w��Q�':����)��q�p�Jc��L�`�����h�W#��u��U����Sa�!���H,.������������/�+%G
���;�+nn������0�Kf���dDHfI��`�*/�6
y��h@�X)c��������o�����
7� ?E��f�Jn���3�Os��{wh�E0PQ1B���F��kb0��x|�Y�d�-4�O�<�Ijl���!7'E�D��R�������iN%M�a}�����������"��r
y���2�H��D=�0����,87�:�&�#��M�ju���� �#�q��1��8�8��9*�\Gv�5�O�����Z9u����fnL[>�"8���:���<c�S���q������B$�%�jp�f����
	�������HZ%��r�*�Z���Eja"�FE���SL�����<���?W�����V��v.fS �� �`��$~���\��<;9��i)`�������t��f���������_���^�V������j����F{��������Z�n��_'�����4�$�������/w[�Nm?'�k�_�DUW�[������D�G����M�dS�)1��+�$�r_�.n|"�Ff	���5�M3�l�s`�$�@���4������8��0��|��E"d��8�IFn���Y��X4��f.��"-���3i�^�f��L���>U��u�u@QR���D�2/�.�v�	��v���J�*�fj�� J�1�Q����n�����b��d����KMSJ�x�Kh������;��].��n��@�[�It>���M'00���c|���| ��-����II�j%:�I9�T���hz/����m��~I������;#"���^������D@_8�*���������h����������)�V,�O793``��!is?�Z/G\�6v�2�����,����Ig�2��_Xc�f8����gH�k�IZ�'��I���97���
��1i��+Z!O���&
����fz�hUBbH�����el�K���Is�X�'���:��>��S��&����e�Qg� ��|GM��3H?����)So8�$�C��>VL�Z������4k���0��E_�q/�Y~��d�8���M^����>"
8US��I>6��������j��_�����._Q���V������\>�x�$R�=.�K����x�;��
4|�o���p�����������%����r���E��&�#���Gg/�]=���jB�������4l���I.�zM@z?��9}�o��S �P�l����cP�M|��������x������q��C���!�s��@)��.������V�����V�Qi���+X7!A�M�$��HH��z�G-�z�w�:���$\���?D�=/���@P���"�9sC�O�$����Jg��F,X�qb9^"aS=�KA�(�'�NY*��1	)�M;JrG1�8�m�qz�q�r9��nR��
�!�/#ZJ�Z9b)zN�MD�Za]�W��W��9h7��Z������Z"�}�.O-!Z��a�K��g&�6,a��R5^\:�3�,�EO�����c���������K�;����9-#��
����-�2b�OK1������;����+�I�w�/����R��@Z�����)I���q{�������������q�k��b1��|���-\Z���6h���������'xpE��������jxk��A�e��S�)P=��^���,�1�Rq���J���h�h���A�6h���N���
����D�F�`)�B�	�L���O�+���H0�_���������|4�9�����sy�|�aY���Y�9�^P�����|7��^ePB����"u���k�dgn]uN;t���b�x_�Lz��k�\���B(�V
fAMJ�R�+���X7���L��� ��/a�V`E�!�����O}��������x�B^E�V��N�>L�B%��i������o���:�������������'�Y�m��������H�b���v����P�m<����/b�����c��]o���AL0_.&�`�,���=������S����d	2>���;��k��K�N���h��[����#��;����h���5�YY�\� �_lT���F�����8���?�F����N
���_�jA}��Nr8�&�����I�z��Ss�ASL��h"$C�~r�J�	[��!f�������9S���\�Zc�5`1#���.T����U�����)�������o�������-��?k���M���I���g�$��r����5"Y�XN����w��
�o���mS���������M���]XTQ�R�	��Y����m����k8+fd�g����M�=���v��F�;��r�e�5=�"�������4sZP����������\ch���}p]:nHH�	��������5�W�F�U�9���w�P���2�N���0!����N��4��������@�C���u����T1a�05��m�
w��WXi>Q8(.�T�^a�L[XW��JfP����_�_�V���v�C\~Gz��w�/���]��o��7��f�����k�������|��������ww���F�����A�{a?��5��A�������O�Ci������}Y����;�����]��3����]��������E������s
�S5:�m[�������L�&j����h<^ ���n����(�8�����pH��/��w'����M�qQ���O
�:Q������d��>M��^o&*���EE6j�{O�{k9�(
w�X�����B�c�|
3I8�'�*�O��?\R�������t��x+5�Y��;�~����	J�Fsx�W����!����1�
���w�����O���=�i��sV�[�������.�|y���H/�t�����-y������(o���_��I�s�^�s�^�����*�4�r0 ���.d�D5z��X��K�������nw�	xgt3!!E>MuTW+V�`�a�k>����le�M]���N�����^��n����q���
Z�	�*���R�U�k������>�z�Uo��SHt����3�;<=�]��[�_�F�����=!?���M'i����������g)�,�r����8���*7VT����B�������,��c*�W��r����+&|6o�P{�/�hB��E�����x�@�tb�vs�.�tYe�K�r��!�l<���V?\��0,����K�{M�|��b��t_��G��V���?*��������ZTv��������s?�q����I==�D���o�T��W��)�h�P���,�YO;����Z��f?�y�W�Abh�;u�8o��)��Z�5�bcOij�q�e
%���T��5�FC�����P��ReO�Y{O�`��7IK��Vw��fs?��&����J�r�!���)IGU<9�>��z�_��F9����}��T��!��*�[�`�,4������g^���J�U-��l���{*��w�ON��?R���QP�*��o��3{�FN��u��k*{�!��O�F{���5S����J�����E��K��������7
J����������������������~�����L�x\���=Lg��j���Z[L��=ln�u�� [���q;';2�O��@����xK�dY�3P�nH�8��)M1eq�!�^��_6T���:��n����px����W�)�}���~���AnK��7_��j�v;��O��������#J��*���D%�,����R�U��'���f��
{��+kh���0$v���f+Z�]����S��g��=������8�7�'"�.h�j&\��u�^��g���D�����=��^w.���7��M��0t�]]_�x!h6�/�w�g�A^�,��������v��������]��A=[+{��t�Y��>C�����H&��������a�w��A����w]����Uj�v���|����vl��8d1�6�X���u����h��@���@����&Z�<���J��)���}�����7v\	�i�g�$�h���&�Mx9

LV����]1kg>�X��9�
:�����?g������G��������?3�������j�%	�E�$���9����Hc��|6/I����:�:�������I��_���������H�$�-������>|O����go�S��3��M^i<}�f�\��2��L^;��qz.���/���T��t���D�O���9��u;�_~�n7�������e���hz��D���B�]~�L�Y.����FgYv�!����7?��7�f����`�W�Z��a��/d��p�n�~C��/f�3\���:�Z���-�����%�Q��\[����Ph�UzGoncQ:��!��WAI���k��k����P�U��7��O�)m%(�����Y�h�J�
������k2������+#�����[r/�l�_����������������W�]�����U����s�|���H>�~��������70t.)��Kni�7m_>n��g�&�d��Q�����9�����^��h}%>��)�f��|��|
Cy��-��b!�#��3;��-�P��yD��?���X�[��D�����eU�r�������v�z��7�(H���B�SV��[#�P�e0��3��������;�����S1�"�)Dyo����Tm[^�[+��J+���4V�o��I7w���J!/��|��;�4�e�����J�X����R�}�9?�����5�=?W�;=[u>=�<�6h����FeP������X�q�A�,��fr�y��A@�������l�@�t�j;)D$������i.��4�d��6���|���6�h0]�%>$����a����)�K0E2���-�;\u��L��m��I���������M��}���[���|r�\�K�����c�4��-�0��R��V���a#l�}nRY�{�ca�Aj(��2��S�Rd������vsL����Cn���;R�n�0�hX�sD����3Q��@E&*Ou�l!�n4�$����r����8�@�����	/���y�Es�����f+}�Lz)?�[%���a�����V2����l�DK��IZK���GG��h_��	N��T��@�e�h4(~?��8����o�e���Ea
Kf��h��vh� ��Q�Q��)��R>(B�pB���g�883��������?��:��J���r5�������"b��?�����E�~�t�c
������:�=�_�bF����"���jh|f"}z/pe�=v��$��t�)������gp���Eq��1[�Q��NN��}�4?��i�����9~�S��9u�O;u����NG�uu!�|����p�aw��?�����)�H��w4pg>��.f;&�O�A�t�x��s�)N,��9�yx��w6����1#�����(����h��&��0x`�[hB4fA6R<�����I�M��[�8%<��s����3I,���
cq������s��-�<���^1��X_�rp!�`�U�	���6W#�Y�5�!�md/2�����t�����q�cM�c'��n���P"� ��o15�h�-e:���U7��-<K��
��D�sm���A��~��;���
FF0��O+z H��z���6��Mk���Y�iF�}�&��d��#��bZ�D1D	r&h0�7D�FAE�#����eh(�Su�aSS��[�p4V(O����f^F*��L�	� �E�cd~�fH:����# �r��(�����I���6�Q�T	�e`"��c�����H�]!��+ '[��i7�� �&�x���=xr����e�v���Z$�h>xY.8y���
1kj�'��Idg�62�;��@���?��>�d[���� |\.����������w������^����]�i�H����A�E���_F-���4#W�Q4�����/&��og��"
��:��{3.W�)�^ge��{�b��k�N��/<�%b�n�
|�n��:n�v~>�,��<HxV���{.������B2����,~of�EY:��eA����;��.���K� g�%�h���IL��
�9�
]�O9��/Sz�]TO��e)��E��gj7��6���AX�
�&kO�}�=�k^;�o��+�?�V���D��[�~��Y{���{|n O���= �er�H_�O�0���SJ�i����O���?pX���3�C���7K�w�{Z��ukP���{��Z_���Z
f�H�N�Ji������x�||#����s��FLut��$F�4����g� �H�3��&�KE���tR�!���'9F��H����S��f[p��l�&Go�y4�E��#�����D���0_���U~��������wH�B����`�f�Y/���� �����w��A�<�@���*���%���53�4��L��fW%�m6"�+48a�~b;�s�~8y�^�������������!�o���^/���#\��J2�?|g���%oDZ�Vbm�F��Ml ���/�}��W/���������k,�g-�?tuK�y(�B{Q���S5x�)&���"�I�������^-���n��|�T��x:�'������������\RXN�C����T��m���?�Nl�*a��Z���l!Dp�xQ�-w�R\��d$@!�L�t�D%8#C�,5H^�C$�_V6�;)
������W3���\�m�v�]���%�[v}v�Ru.$w����vt��!q�VN�_sW��O���$�'��l�'�A%��Z4�������E%�te���v+U��'��_������
W�)5��_���1��[VK�B T��>����n�f���x����m�����=����cQ����6��Mv;d�Q�����;{I�E�"�ir�ry|zr�	�/�6�%����B�Z��?��������'z}�g����|�k��*���z���"C5�;ds�	i�n&���3s�nv4�8���8���$�J�f`����$G��]h���0
���den}��A�^K���c��qt3�^%��W����v��A���t���I����0��h`�wV #������%��*�IQ��%��t�EH	M#��yk�"�
��!��jjK���	����?�F��D��0��MD#�L\V���SN��7:|aX���1������Z{�-�;�E���=��{��4����vt�����M������ �T��O;��lz��=:��������]"$������W_|h���"�����'q�5��_Q�w��0���	��gK+����^S���U}���O<T�G����_�A�+�F�#Y�&��W���I^���$�0f���|:�[i�\�F�;��T^�6Bp�?���[���Ol>I���|	�7���>_���->�����+��w��#�|���?�!����Y9�_�4�8�nQxU�/vA��M�0O��_y(���W�E@�� ��i���-�:Hd��R��0w}����7!�]L���s+���w�K�F�ME�Q��AI�����
�V�r9�?�����k����6��	���.����������sA]�J�����r��������.$�����_M���L���~1[L�%�)��/�5p�'6��#l7`�9���p6�]���9`�r6������h����.8���P�U��YZ��\�h�������H�Nu%�������$�&���r�y
a���������t�H[�Q�g3��l���Q��G������X�n|���^8������L�OM@��
7��H��u�{��C�Gp�A�\n��{�����G��j��i���QO8�Y����w�2��Q���&�	S��OYO�
����d��~ij\�����X���p���f+��x�!
���u�tW����DA`������t���t���|��"���<��{�O{H�O�;}�N{�����������O>���Y>F3	�bw�'���26h�C������;��I48��dbj/�W�i�����9c\j~�.��d�q��J5c+���$b��-�{����qg����=o!E�b*�t��_v����L|���J�~.eBKtQ������E������/�'�|��3��1���G�v�Cbd4�`^��H\.l����+�M"�?��fK��p��`��K#��T7��i8���p<���l�.����md��O#���{���4���F�6��(m��^KT%8�J*Q\
��E$����?�i��t��N���&��0��v$ER�wL��G�Rw�
����i@f���v>Lu�&�rI�<� ��T?k���p�%%�?������6Z�m�B�����UO����1UkTw��\�Q�k�����ebc��
�����f?g����?!j���j�@z�����g�xF����A]��������3��k6����vi����^~��$�&^?�6��?���Wy�3��[|.���;�q'Sh�F���,�!����~������f�Sp���M�3�t��s�FTY�E��t�+Q��\�Mm��K�-f#@����7��m���m�}AJ�0�y�|��]���	����>���
��UQ���&!us�{��F�Y�k�
��W5�*�;U��P�*{����I,=�����J�f	��n������8}!����D������,��/�.�������jl�^���c����o���U��
����8�<����u��js'����%�,}U���T��E���Zu�+$��������[�����k3�([���D�/5��KC���>�������JK�e��$�n����G�����:�et�u�o��i���������`���7>��DT�<�I�I��)�~��v���k����/o2=c��"�J����~� �L�ZOf�[������&.;?����K��br���N{��lg�M>=[��`����]�7���j����~m]���Y��]I��Qo497~Jv�$[�o� �����#���L�$n���)�\(<U?���jT�?|Mw���:uq���&p�Vk�����*��^�F�	����]x�z��e������q&O��#\��l�G��Q��>�K�Z�A�O�T���	�]���K�Y��ve��G�n��f50kK�����~���~�����3j%����m����QP@d��.'e��m��$�mF�fX	����k�W��e3+��F`*�����4��ECZ����UMR�D��1�{+�w��m�z��6\X�����-wI�TZa���o����iw�+���9�}��5����@��I�~����������-&/������>��W�=��J��IU���7�����'�M��g�lGKr��T��QZ^�E�<ur���������xve��\������ Rr��-�����g\������������l�K�$�]IIn����.����N��}�i:'��Z^W�=��Ji,QR%�^�������A/l����Y��URY�4N�v�~4�q�qx~P�)�������`-mK,X��� Z&!��;c�p���)"M�{K�)4	��#_�.�1`�g,��+��3�gL4�8Tb������\����S����_a���X&�|,oZ���/��W	������-�'��_�
�m����&��!��!����33���EjN�,.YO	���H��{�A������GC�
�I���]���uh+��O[�� ����i���#{�z���K��
�[>�z������w{�{ef
AvW�f]	J�z���
����Nk.YW2R����a=��juoo0k�u�h��Ul4Q�������}{WW�o�;�5��Bj��[`c�%;Lc��tnV.��*A�%QI���~���JURa�Nz�g����s�}����|@vW]b6����|��v���q�#g��T�����
��^��^���!�+��|4�O�a�������+i��$,��/�Lc����J�������\d�g 9#���'dM�I^��A����<=9S{��'o?��=��G����#�q_/14.��N�T5��h�b�y��|���CG�O����|�N?��?8|�+8����{E��d6���e���������Sp��l��s��e�1s/�U��|x�����g��VGh����XG��\����`���e�%x�\�������'
Y$T����k�R�������k�o�v�;�w��,T���y��������C`��R�P�U�e�Fa��T�W"dTY�|%�UY�W��zp�"�R)�������m?�(��\M��p`Kq���T�l���7���e���^���M${��s*`t��	�C`���k8�8�Da;s�/l9��j+�5#$N�}o�k�5��������4��<��N�[��\���������	_N����>l�����1H|��e!^@! �>��9���p���^��?��%�q������F�����u��1��!jp2
������J�I?@��i��A8�������i4D�z��D1���L�����Ol0���,�����L	+\GO����m��#�f�6�w1H}�s�2�w���6���J��2����+���R�������	�@�X~�gAy]VA��r<
*/��^�z���_���M���M���7�Q��W����
^�4M?�5�o`���f=���W��^���5o�<��>1�1"EFa`�yW��_�t4
yq�?y��q�>�;k��		��B�t�X��il�[Lq�����p0��A��a&�*3�/H�|D�tqq����T�-�&��-��FE��W�����A;lo�J[KC�WY[T��uU��lqL_B?��������)�tCo�W�~2k�����I�S���oV���9�'�[�54�:fm���^�_o���)%ZU�,k1��[`	2�|O���.v�Y��='0�����}��hW��{e��F/��,�_�_����Ob>�zt��Y�,����1�Qp!���
� G07��*Z�x�
�V��{h��F/��@�_�_���~���U���Yd	���gH��".v��
A�n �]8�	���v�;�y�T���{���7�;n�	�1?�CgI�v��DE����;���XOd�z�g=�����<�5��F�cj~XV=}W��Q\2re���dpAA+} �� �N������~�?hu�d���#���d�_�g���t��m�(B����^��Ne�rbi���D�sh�������b��tv0�wV�9�dI����${�<M�>z�L��<�'[+�����x��J?����5����������?=��t���[������rg���E��1#l����{k��������N�����F�~��o��_�����}�}X����)oa���S���5���^�<,~�C���U���j5�P^4W�<�#4/gW�AE��.8����M�NM}�`�j����K�k��^��_��M�����xr������p��ni�L�TD��w@�J�]������-���7���+��>Z��9��da��D
4_x��''��g}�����35���L�H'O>S�������If�
��|�z�R�=��K�vU/��u�([l���������zH�U��[�f�V�n�n;,z��fV](�A�N��]�
����!w�/���+��4w)� �I�<%�}t���K�/
Etb]~�8�7��z��}37������8���m���Q�/���W��������8�.���6=����k5��S�c6zz�G�z:��X��iRU�2EI��#".�:������������Y��wW�Mr\��HW�K���
��C'���W"D���3>(7�2�' Q�I�R���K�$m�DA���@�K�� ���Zz&��Q���v{�Ri34Z\,3`�u��wc/)~�tj9�����+����j���W���v��8L�O��F�y�g�	�Yx��<�������)7z�6�V��F�Z%!!&��]�$����Fh���_cB�Uh9�=TYt��P�6vE�������7�F�^��� �.VG_�M�p��(bF_�c�b�
�������K��b��^:��D����_;3<^&��}�����|����2�G	�~&�G%�uWo��=�������^��_vu����-@���ZfR\�7�Z����7�
���8�O<2!!�]d
& �>�4IorY��O?�y�.e��S' C6m��>G���l��U�Z���0K��{VY��A��i�j�n�V�����C�>�������^!�/��9�C��c�BN-��hyfl��I�K�g1���vR�0��M��~�M��\J�J%H�%���+{C�+L���Y���R��U}#��u%������Ec5��S����q�"T�lo�����g�������!�a�K�����M�����2��7�s"�_�#�n6� �o�oNl_�E;2����=?���QOO��<7��
t�(|����P���Z���n��I�1t�M$?�3b5.A��!%Rk�W$_��J5�6E(x�(���PY%�_��F�w�����������Z������|����66�*�GF'�t���E�K�<��rW������l��rk.����3I�9��MB��j$ P�f.g���3F	�?f|g0������u?l��Z�����t����� �H1�'��/@���!Va����(��C��
������)��?�fw^|=���?#b%[�%X6�1BW��RE��g��'�Z������HQq<���?�h�����?"���]C	�_�g�Gd�z�^��j�~o�=��V�X����J?�����n���R��flm�������:�<�J�X�(��5�~�4	o����@��E��Z�������va+o�00<w�s:�E�W���;MXtm���AA�C���(�����\���Nj���~4*Tf�`}�������!�|T�	Y��' `	�7��rk�.�q�"C%0�;��9�+Lm6�F�9�&�gN��`�{	(�/��TA�n����r�����G�cj�N����bN�� |�\h*p
>|.�q6�#P��z����N���3�@Fc}�+���������2�WU��#�'��}������@3~��|�8�	x�u8��(���V�������������'�{TiP]����"G�����:/~��V����e\����
��J����Y����/'�$��D��xtc�n�x��A�6l5F����!m+��[��S���W��A>����Y�|�����A��;��db��8G�������^l+���Y�
c'��F_��=�	����-�V�?T������jC���Q>�3���K��:���A���hVH��o���`j=*G�\���}���H|�XHb;X��?��=5?o����_������";�z���E;F���_U�m���*���}�#�V�,��mEC/���Q
y�9�	O�������Wi�p)��^F���v�_g��mb5�Q��h��S��ho�Y�h�OP��h�OQ-����������v~��E;}�z���{��
|?���g�O^��wV��h��[q�h��S��@5�?X=����������C��>���B�s�����_�J��X�B%�Q�����x��WV��_-��j��F�k�d�t^O�]E����_��n���_���#v�^�V�����������45_1�����$��}J����p��V�7;����*�o��%!h�')_|�j-��'����`�s�V��K�6���v��	������U�����XM��B%`�W��Z��U]����g!��L�k�.�_���6:��v���;��N�e�X���CTbk�������+�>W1��*��g�%�y	n� ���im������^�AW�=�U��
ck=�3�m�����+ ���}�M�#�2e<��/�-�Fz_�8�j&oJ.a��C������5���`e�b3K�� ���G��f��U�B�R�.j��Qe0m�������B��\��?X	��)�W�H�rxKN���JL
������Z���oQ�V��G�9�3��T��~�(������'��W��^�?u)q��
� �4�l�/��=����E�Ds�D�f��Z���j
]Rm�k�_~�ZnOTmm���[k����������(Zc�Y�6~�E�~�e���=F��F{.��o_��G���1+��������;z�:X��<r�����nR~?�Z�(��G���D��z�]P�@���DO�xT��n}��;�Z{;v�"�����h�Y��c��;\�����!�s'���h+��W��b'���[�����(T�����W*o"
�y���^��g�.�]����4Z������V�����a�(���(<���kc!�oc�Ra���g�L�����G��\��/Z�j_���]^�E|[�����
����U���gJ�C�J��J�B���R���T���rxv�h�.��2�5��.\��A{���.�CtK8�~���E���vk��?S�������?n	��"_���sA�����;*5��Y�?
�_>����0��,�vh��������
�����<@�� ���@�0���n�zn�6��l�����]���h�n����N���?�f���F���7��V���:|�{�bSx��<��y��\������?o��1l5�;m�]��t�;���z}�oo�����[������lz��$��k������^v�����>�h�|��W��?�v�/��U8�?�k@�{%D�y�}�QM���?���A�ot^4�/
o����Kg��?�|���a���[�����S$�9$JVQ9� �8�?��~�_�������V��
���������{W���&{}��I0B�)��LNc4������3|��b�GI�������8
UVmD�(����)�@�����F��W5�S}2�nB:�x�^�~��a5�Z�p}Q����O�$�R_m�Dz����O	���t��%�����2�@��u^��e�����o��Z�>hu���\��������H�:�5�W����,f������*�G,����I�g����OB�T�������M���'��4���8�P��S��>�%U��G�3E`Q�f��������3��q
z(���?�1����I�6jp+\E�U�0�o���{��[�p���� �]�.������5��B��f�T�B����)����$��T����	���@��$�N,�=�#����I4�@^�)Ez(mH8�D���C.B{���|:���T;��Ib-1���6����r[G�����SW�pNq�>H����n:`��q+�,�>�����6B�V��Z-���B#��%�/�4)��@���%�%�q���
�5`.���F	��[D�"��a
s�+#O%�YA�;��-Y��	2O�hT�
���5�4Y�%a'D��T�5u��b�:��VL5��.���1��U����j���f� ���E��������7���^tiC�	��IBT�
��pom>��k�|����@B�x@�!�v���|Y������?�S|�#���O=��tX)���h�a��/g���<�/-���u�w =�6��D#�=�U,a�2��l�&�Y�k>��/�3��p_�\+�?��C���
(k�x}��%���s-�	X�6�E����{��6�����i�6.0�^L�m8-@�����$f�a\�	��w%e��P���uV�}4D�-g�%��[�t^�����?���I4���;�$�Fc�dJ�'�vC0��>�
�Wt�����R��WQ���2�;�'{�Yh�RU�
�����*���9fJ��#+0��L���HK$���co|iC�<N���H"��%^:��
D~�O�o[dt\BkF)e��|X,�0�,=|	42���RbjC���gZab��l�/�
��
B�&�rz*�@Z��Q�x�O}<�U��\O8��n����|�u��qo���[�O���)�����z�pI����I���v��
�(��osT������E�xUG�X���g�2bv��(����	y����*��*���,^���l����"���pJ	�t���H�$u���;�+23D���EI	^��h
+���O4`�9L#�U[��e��L?�%��U+>����lN#�V���\TD8�#\�H�������X4���c�i:	a��q2��	%)����G.o�s���)bB�*����(4�K��P���/��Ff;9�QL��Qb���%��7A�� ��0��T��,�&�R������8*������O� +�8�i2�+�'�(%��&S�`{_�p��!����c%p������r|,1�����?�������p;m��=������:������<����v�f��iw�v}������������a��	��A�8��7���5��������v������D��J����������AUGx����%q#d�%���5a�pO��
�]�3d��')o%�����Z�th����f"����U��~��5E��}V�F��J_N%�x�p@U�tBP�TG�Q����n+�R%N�6�k.���$� E=�q���Ix��j��GR"�5�~qF�����Wj���?��a��E���0v1*_�/t�!>~PQ�^$��3
.��mu!��ea/���S�siBl|�3���U���Pd�N��m�
V�������TL�0��4���l��5��u"���Je����%������������X;�k&Pj�<�*����l������K�_x p�@>�a�-����������B�;����#v(2]�Kv���j�|n��C���=B��I	�k�Q
��[��J�����p*&?���^1����X�s��Y�LL��l��qH��;��DY�@�>��XB�%G���L
'��1��d�{�����RU>b�R����������/�g8�d�M.��� ��a�y^���q�y�m8M���	��������x$�������7�A�xp8���HD��;��T��*6�	�p^�>h�x/�����b���o��l^���K�'��_��;����E�X�<2Bg<-����b����^}�[b����$��q�2-6�� �����;����8<:�m��Q��-VH����$���?�G�W���V����[~���=��d�G�w�B���� �
�nR^�.�?��Y�z'����O~�<�����{�X�?��������}���]����Xp��RS3��da��H��Y������b��4�b�/]�!P{h�ZL,��+x?��KSs~��Dgp���J����v����7��XX��XE��M��(��?�6`j#�
�-! mE���6Mb��L'l����k���d�^�a8]�]D��f�XI�`�B�K��)�J���h��������^�i��9j&g���"�	�;��2:����7�!n�A���.,6B2��&��8_�����B����x��1�ol{Cs���r�8�\�<5TV��Nf!��������f�U��@�Z3�_�.��e+G��Q#Z�TA������%.0jD���$�A��)o�1�6�_Ty�xZ���^�V��h��������Pc�����O���>=<�wh^���v�<��369��f)��ZQ<�m����H�Q�D�|~���?F������7����{����rF�!A�o�,��������RkB�j��W�]9PWywI9#Ra8��IG�O(T
�XX��UM_��G'��n����n����w��Sf���A��h5A\���k(@��K����_��
En���S�D0�w���2D��#�^o��		>{��0?:Cw������Pb���	� ���G��������E8	�|:����vZ���m-�#��]N��z��!7i��.T8����e����UkvM����K�%������;����%�(z�(j���U�N*�l5U��w�#�n�������d��UI$�T�1\���-!aW-�/�R��_�AgX��~g�	<=�|��3��}���:��C/d��now��x��
�?�_����S8�3����g'�d�Fp,��>�C����9�������Z}�0��6�t?�
�t���Z�����dg���j�$��&!���V]��#/8lc����<��y���t(���8��<��X0G�;�u��8�"���m�5������1����$Z��*]�FV<���0� ��D�U]�}���mU��������0����7�)p��l�7�O��Q��!�b��+�y}��T���
�����V�����L-1H���m���-MOeE()"e�����k�3j�5Q���Q������gcPF�^���5���+A�V�iG���6����:���v1��G]���`�#��g����["	����DC�-XF�-ye u��i�,|��+����
�n*6Z��#���B&m��Q!���*�H.^���������+cp�00���n��7�SHVEj[5|�����^�A�|��<\H:/-�d��x�s�(�	!s0x&�C�����'%2�h�|1m/2�%�H7�7
������7����X�V,�����/��Q���8	5��bn��d�7�SiO�R��&������&�H.���.��q?�;�v�����;pG�����2��y;��t�'e�[�,�fe������������)�D�}2�I*wOi3���2�(������hx�����q�%d7����b4�����>� ��S�/�+�t�`�pL!����q����I-�����	���h��~�5���[��g;���?�����Q�����|��K�K�x�����`�G�?��pz�n�����? ������+/W��@�1��������taj�}<�,�w�gg�o15��.@�J���F���.�@���.�	�"�k��JX�L��������?Eus���{"�~(�L�v4�����.7$v���L�g�0��0��H�eN�P�{�8��Oq+N�����G����>	���ji����TK������>�0E��AZ�j�X���iG��x���D�+�:�<�]1�]�gj�\C�&��\\�\�c����L���
X���n�V���nw�~��D�5����B���;=#al����&�E��#H���)��~!���JUz������z�8"\;b�`�-��e�Y��q,6�o�(W-[
22�'��e��)�!y���~v2	!x���?������|�[���������\"���%�5u!G�{>�X��X��Yr�}�;��49�_*��a���~��7v���e$���E��$���_7�x���@b���71S����
�����qi��(���?���?F��}�67S�l�7�i	��|�	��av��1���VU�S����	��aB��������P��1-cL������Z����0R�$`�	��si��cm����d���n���H����~���}3{G=����m-B����VtN[���M����7�dn=������������e���J�RR��%����4G�D��^�zM�gn�|����_���{�^��n�����B?2[��y���#����V���{Q~����0��x�����;����Nx[&��5\�1F�����Z��3Y7[���=�� ���3z�ur�[�~��M0�C�
��b?�!%�������s|�2�,�C���2�z5��i����Mv�K>��>U��mB_��eU��+^���"�~��_�>�AJ%�g�Yr��(d�Y�-��C�'X������p���A��l;V3��� a.1�?�j��������7���o�������OP��}x���o�o�_���'����=|
O����w�� ��~�@����C���O�����
W��@*n�
E��-B����n��Z�U_|{x�W���&����T@�������}h�F��[4�������TgA�e�!g�!���d2���S�p�e�����?��]J���w�E�V9T�0��!�z�����Q�K��zL���v�3���]����-xn��V��Q:;t��S'���I���^>����V|�u��
�1�#�PGN_F���=f�_��`��|@9W 3�%���:q�������*�KK�N������p�5k�
����������t��/�lA���O ���V��=��V*�h���9��@�n9u5�����+t�L�r>A�gTPn�~���y�z�b'�������H)��V�A'�_;��!������G@{��"���}<������6F:#��JV��V'RQK/��p�i����6�j[�2�:&Rcj3v�I8,�x��]D�1��[t�J�%f<��!�Kk9�����PD������& !�����+���B���'��q�w�3�Y^�S�'��I<��?1����U�x)�|��Qd��nQp�v��j?���K���.q���*�KA{��s9	� ��X�	b��Z�����p��^���>����R�B�7&d1�,��10�2z�h:��
~T�U%C5U������i��0:�J�"i����2G�m��s'��d+��dKOZ\2<n��
3�P�JU(%Jm�IF��s�v�����3Wj���q��h���F|���?�e��o(������.�&�B�^:�T��L���I�i�%������6�kU1�tt�����1�pXM��5[[�n���(���#;J$����/\��u�����)H������^V�+6\�0��S����s?c.R�:]�
�|�Y���i^o��K��z��B��'*�g
^[��\�����_��8���ZXnW�@9y�q�����Wc�������T��UH_k0�wP$jo7��
��n G���%��-q���p��c7��z����|<=;�-W+�Vx /K%e������?y?�(�+���K��^y��L0�/�X*8���F��\��t�|��s����M��/�K���V�����b���s�~���1�j\�-6{A�&�D3[�X��Q[WL�����T�A� 1�S�+Z0Yl0��V�R>5�z�-�����B_=>	���_���^�����Z���hc{���Em�|v=�]�N
�� ��H�N�"�d3����n_��G�x� �nDv�R��z��A���|�nP���v`w�?r4���Rs������Eq#���/c�&����htL�1B�q�F����:�����*�/���y�
5�oAen5��F��+	O�5dk����!���(����q83�-�<��)��:��:���x�!�oL������V��$a�z+)(��.+�p>[� ��������"�e�VeR�Fwn��{���D�qYY���
[ ���V�s;;�f�����Mv�=��������*MJ�4�L�2��IvvA/D�2��l��#V3�N�8�F���2�G��y�x''Jm��T�Hx��q����aP3Ls�����Z�H]K����b)���,QR� 'H���k�hOR���=y+�7��r�&:�K8����u	1�4[QD�e��dU9pu���
����I�����N���;4T3(�z%�0��\��%���:�=�����@B:�03	M�!��	�����r���B��'�	H�+����m&�%���5*������dHX6>��<h����(�C��SD|��AD�K:T�!�����T�D���@	S�A��?xG��x*���2��;�=�4��\F��<���V����C]a.���#Aa�N _���"���S]�W�6V�9��Q{
�R>�a�h��c$�j���q�1����j�PS�pPz�x�h�0��sUH<y[�I{����'�A��0U�}��+#D��c�G�`�)~���
��4��na'��:�K����Q~T�U�o|%/=�O�B%!VM
��vQ*�%�����20 [T���f��#���$�,=���SO00�������q@�a���nqo��PfE0sp�G���C��fp*A9&��+��-:'��F���{8���i���HzV�&�Z����w�������{��V��|��?jAB���i*D7��Lc&A�p�-"��|�IQ��&�(����D�k�?����/�a��t�:�y����}o��9�=%��h�F��q�OD�7��^�X���R��28'�r���n5����4�8����n�i����,��N����&�l���<�	0.a�05r��M����lO�5��{�4��fpj�:��sXU�E����5�2��]7ELS�k�|rL%�4U�w�2pU	S����_��������j�lO����Z��$%��MX�D��$q���P��&�?���rU�E�R������x���'fm9yy���Y
��T������D�	',jA5.[r>�L�������������p1c���~8a�$�����xRy���%����Sj�&$����+-�����Y��8�Gt��Q<��>��4;h���������8��
���,�,���n@4�����w7Cn��$���rf"�	�%�t�K
r� �X�j���&"��U����"���Q�FYX�t��B5���m@1���6�U���V|�R�)���4�����.��J����*~\=k1������59�X�aF�_�����h�U���w+�x��F�"�]o��
�<i�,���������O��g��c-
����ud:il)J@���pe
	g�"A��USd�+aQu.��&���o�t�� ��&�.cW��	z@���~l��?)!L�N�d�s��6���&��<�AC����h�D��)s�x�
X��rMP�B��n��D����h9����CI�U�+�����(R4T��L��'w�1`[������L�&�>���JL�*&�����.3b�r#�p�c�?���p�Rd����K%H���B� 1	�����*V�rvb�'\�F���J��0�Qk�\k�J�t�R�������e���6y�/�;�C�3c,=@���C�DT���$j@_N'�V���k��YE�%�*����]6������[)�����]r���L��zU���1g�e����q��J�P��#}PaR;�,k1�@����(J)O����M�����3�����9CI��.}��A����@��R�I�O���=kj\V����B������<�V�)�j4��P7>�����"�fR���feF���r�=�Q���V�����6�S�|R�*q2���T��[�������9���O��$p���K��`�t������MA��h��Z*;R��\|6�W�B8�j%��F��������1l�Q�>�l�����
�������-�\��D
V�N���!\Y+q��h��m�yU�f��
6�U��X�"�E�����_%��%��������� �5�o07J������zQH5}����4��>��?����``�@o���H�(���8��1o�4E�"'S��Vu6�Z�%��5�R��*�D{��@�nD��V�����H_�n��ya&�$�i
DW3���k*�0#7�����E��$����U*�!��/
�b�������:|Uv��
P�SYe��R#���yU������}�"�)
!��T��H������@�%�@v4�[������]��0=�`��\*�D�h�� �I��a���X(��R��M
kK�Y5��X�dL���u���u�	���?/��O>��� mw��[��)x'��L����%�=��\*)�Rg���G�Ti�Na:w��1f�D��"�U������K�!�L�i���iJ���^=���pe���U���"���0n��������M~F�������@)�v3���;��3��m��8{�+�Q���{�&��HK�[�eF�R���X����5Zn����1y�fjc&G���-��n�jET�������6j!6��;s�,!WNJ<����=����C�b��-�/��Lx�ioY(���3F����  ))���-�U��>��J����%;(��dy��M�"����}�p �~����Ba���M���'��:E&�btRsh���
PCl��<l=1�D9�$�"����_������������g��!3?�x\z��H��
�B $�������FVqXg���vC���u�*��2J��1<����;)%�r���l��XpB87o���Zc;3)��k-l/���9��k��-�T��h��8Z�OBv�Nf�NE�2f��/=�}E���@9�T�$��A��^���L���9�����_�A�:r��*6'A�h�0�)09����x^4�[��w�9��b+Rp����d�l4�KY�vq,@�0sugK�W���Y��`��.x 0q��T�uo���%+�E�������>5#�J������S��h���#5F��i_��O�f�]YQ�9;N�n�!:T�+������Qe+aQq"�uq9���_?��B�����#tGc�.��W����}���X�dt"�������v�Y[h������������f8V���Ws:�0��'�LGV��'4}<�x"�O�����>��:,=����v����}*���
�Hi��N��r����*K-�����}�������Q�_4E�m^���$�����qM�����jUJ*"w�����G�t������6)�"��c���yR����tGv y	�Tj:����q��zY�
*
�(����I;�9����P
z�u�I�@32H1���pW�w���dVC���Wd��Mz�����h�*R��Nb��uD+�u$����MQ�{X0��5"
�#q� �cA��rO�lw��["d��H��t�*+�����O���2K+n�ZX%n��ah�������a.
��(J�?��5Nh���d��0N���SCf0���C��������'����S��+p+�������T+�@gN������/��O=��e[�<eJvSH8�[�X!!�}JS�mjvwl2�[���)_r*PE��r�k�{j�����)H�@+SQV8��`>�c���{��%�[W��]����i�=�c13	m�Uyg_aI�������<Y�����5����9H}$�u{�F��h7����T�[�kA������K�?���y9�7�����E�G��������������4f�!Exp���N�
k�;��C��o�F�RQ�,�qm�fc����${�
������.��"�W@m���8��8/s�HS{s`����g��L
)6~i{td ��ku�j�$�L3ZK�@����l)��(
Y��G��[S�U���|�����%�[��h/'����8��v�YN���;O��vA������Y���f>���@w�T'��,
LP��d�Ms�<�7M
�V�P���/a[1�&��n,zo-�,��X��A���Kz�7C�	�{�,7�y��Z���Jc����s��#����OB3�C�Q��sk�����3��?������������[�"�O�-�s��?���B�$�%L���U�+
�P�����)�T���:k�|�k�h�s!��#������Tc�<7
L���x��%�v���<.��3�,�wK%23���%hv�9<�Us�f�f�D��4w[
T��Zu���;p��E+f�AV��v��������!�Q�oM��U\X5����.��Q|�,����A�?�������������<-�e�YB�%��K�"�O%��G���"s�d�H��j���.����'�����v70�3b����I��`�|TJ@�!�-/#���]���E������Tey�p\dKU�t����6�us���Q��G�p�������8 :�~���S#"#tP���/��>�
���P�/�c�T
��dKq�`J�D�TM�5�Vq����b�$�F��$6�DK�VP�e��#���q�"�h��*�~�RR)��C������S��y ���t���������$�U���x"��*x���P�&��)"$OB����mM������6�o��mn��j��*�� +�D�nL�����2�X)������0�����@��nnz�c��RU�U��rc�I`��=�s����6���M4�^�g�n�3.�.�wa��u��1��>*�)��@e[a���������+o��h���C�)DIPU�}iMJ��S�����G�d���%���bUF]��(��	W�jEV�5����?����'Kr��R#��8F��]g3����pbey���uYvn[%�����G�
N��������O��9��?2�����:)��pz��Q	�>%��d�i��T(�'�a���mcY����s�O�����(5�V�SUJ)sh��f�Y�(�
$X@��p�e�p������K�*�hv�����d�����d�m�Y����2Q�s�����>P�XN�9�^!��o[�t����)�6�J!<��n����L=�ak?��5��W]�
���������zN�{�Vc����a�o�Wng����������q-X�������9�����F���
N���\��2MP����>r�����\M����pn�����65�D�v3.R����CJa��xZ����X"~�V�*TK� N��)��[�/��4�
a����bX�_r�^�D~����c�9UB{�f}���BM\C��2��y
n(���n���(/���Qxk���C�5���������m-��Bt�6�<��N���5�l�!�)�FN�8J\��bUMK�e�1�<1<��At����*@�+n.���A'5�$aW����$������I��6��/)~�g�
b���
�!$��U`,����q#�;��0���D`�Zz��P)��7�������AN3����
�I|��!����z���(���K���\�@P(V�"*'�(4�C��Pa
����55r��p�������<I�TYY��@}?nI��uX)H&����F�5�h=��h��:����^��hrN�e�Sq9fA%	�Ym	�q;�9
Y��[����Q�(,;�V���e�@���aXq����a�9���]�����)�f����+!��
����[u4����_�hp��&����'3{���r�f�X	�V��-�sU���Y��$��DX�M�x���Z�0"�����j%b1d�d�-9�Q�n�����uPp?\��a
x�����j�j��H/���5x';uyY�C���H<Q������X(�V�)�i@�{��=;Rb�[��5I�E������������-m�d	�][#��IS9>�[D��
�Dq@$'*<�`?~�n]�\4��!�9>8U�S��QQ���m
f�pV��[;5�I(UTYu�4�:���($i9����e�FUL���W�&����-P
��]E����id}1�n�+��9?<u����H�g���Xlu�B�.L ��6"7������>`�.]��OU���d��
b���T%Db�QlH��8?�-�����,U����ng�;au"�Xp���&���������V�*-7#]����3*���?j�;���������$�E��*D�O�������������������?J�6
#230Jeff Janes
jeff.janes@gmail.com
In reply to: Peter Geoghegan (#229)
1 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Sun, Dec 28, 2014 at 3:19 PM, Peter Geoghegan <pg@heroku.com> wrote:

On Fri, Dec 26, 2014 at 4:22 PM, Peter Geoghegan <pg@heroku.com> wrote:

So looking at the way the system deals with its dependence on default
operator classes, I have a hard time justifying all this extra
overhead for the common case.

Attached pair of revised patch sets, V1.8:

Hi Peter,

Using the vallock2 version of V1.8, using the test I previously described,
I get some all-null rows, which my code should never create. Also, the
index and table don't agree, in this example I find 3 all-null rows in the
table, but only 2 in the index. I've attached an example output of
querying via index and via full table scan, and also the pageinspect output
of the blocks which have the 3 rows, in case that is helpful.

This was just a straight forward issue of firing queries at the database,
the crash-inducing part of my test harness was not active during this
test. I also ran it with my crashing patch reversed out, in case I
introduced the problem myself, and it still occurs.

Using V1.7 of the vallock2 patch, I saw the same thing with some all-null
rows. I also saw some other issues where two rows with the same key value
would be present twice in the table (violating the unique constraint) but
only one of them would appear in the index. I suspect it is caused by the
same issue as the all-null rows, and maybe I just didn't run v1.8 enough
times to find that particular manifestation under v1.8.

Cheers,

Jeff

Attachments:

output.sqlapplication/octet-stream; name=output.sqlDownload
#231Peter Geoghegan
pg@heroku.com
In reply to: Jeff Janes (#230)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

Hi Jeff,

On Mon, Dec 29, 2014 at 2:29 PM, Jeff Janes <jeff.janes@gmail.com> wrote:

Using the vallock2 version of V1.8, using the test I previously described, I
get some all-null rows, which my code should never create. Also, the index
and table don't agree, in this example I find 3 all-null rows in the table,
but only 2 in the index. I've attached an example output of querying via
index and via full table scan, and also the pageinspect output of the blocks
which have the 3 rows, in case that is helpful.

Interesting. Thanks a lot for your help!

This was just a straight forward issue of firing queries at the database,
the crash-inducing part of my test harness was not active during this test.
I also ran it with my crashing patch reversed out, in case I introduced the
problem myself, and it still occurs.

Using V1.7 of the vallock2 patch, I saw the same thing with some all-null
rows. I also saw some other issues where two rows with the same key value
would be present twice in the table (violating the unique constraint) but
only one of them would appear in the index. I suspect it is caused by the
same issue as the all-null rows, and maybe I just didn't run v1.8 enough
times to find that particular manifestation under v1.8.

This is almost certainly a latent bug with approach #2 to value
locking, that has probably been there all along. Semantics and syntax
have been a recent focus, and so the probability that I introduced a
regression of this nature in any recent revision seems low. I am going
to investigate the problem, and hope to have a diagnosis soon.

Once again, thanks!
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#232Peter Geoghegan
pg@heroku.com
In reply to: Jeff Janes (#230)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 29, 2014 at 2:29 PM, Jeff Janes <jeff.janes@gmail.com> wrote:

I've attached an example output of querying via index and via full table
scan, and also the pageinspect output of the blocks which have the 3 rows,
in case that is helpful.

You might have also included output from pageinspect's bt_page_items()
function. Take a look at the documentation patch I just posted if the
details are unclear.

Thanks
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#233Peter Geoghegan
pg@heroku.com
In reply to: Jeff Janes (#230)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 29, 2014 at 2:29 PM, Jeff Janes <jeff.janes@gmail.com> wrote:

Using the vallock2 version of V1.8, using the test I previously described, I
get some all-null rows, which my code should never create. Also, the index
and table don't agree, in this example I find 3 all-null rows in the table,
but only 2 in the index.

Just to be clear: You haven't found any such issue with approach #1 to
value locking, right?

I'm curious about how long it took you to see the issue with #2. Were
there any special steps? What were the exact steps involved in turning
off the hard crash mechanism you mention? It looks like the condition
you describe ought to be highlighted by the script automatically. Is
that right? (I don't know any Perl and the script isn't really
documented at a high level).

Thanks
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#234Jeff Janes
jeff.janes@gmail.com
In reply to: Peter Geoghegan (#233)
1 attachment(s)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 29, 2014 at 9:12 PM, Peter Geoghegan <pg@heroku.com> wrote:

On Mon, Dec 29, 2014 at 2:29 PM, Jeff Janes <jeff.janes@gmail.com> wrote:

Using the vallock2 version of V1.8, using the test I previously

described, I

get some all-null rows, which my code should never create. Also, the

index

and table don't agree, in this example I find 3 all-null rows in the

table,

but only 2 in the index.

Just to be clear: You haven't found any such issue with approach #1 to
value locking, right?

Correct, I haven't seen any problems with approach #1

I'm curious about how long it took you to see the issue with #2. Were
there any special steps? What were the exact steps involved in turning
off the hard crash mechanism you mention?

Generally the problem will occur early on in the process, and if not then
it will not occur at all. I think that is because the table starts out
empty, and so a lot of insertions collide with each other. Once the table
is more thoroughly populated, most query takes the CONFLICT branch and
therefore two insertion-branches are unlikely to collide.

At its simplest, I just use the count_upsert.pl script and your patch and
forget all the rest of the stuff from my test platform.

So:

pg_ctl stop -D /tmp/data2; rm /tmp/data2 -r;
../torn_bisect/bin/pg_ctl initdb -D /tmp/data2;
../torn_bisect/bin/pg_ctl start -D /tmp/data2 -o "--fsync=off" -w ;
createdb;
perl count_upsert.pl 8 100000

A run of count_upsert.pl 8 100000 takes about 30 seconds on my machine (8
core), and if it doesn't create a problem then I just destroy the database
and start over.

The fsync=off is not important, I've seen the problem once without it. I
just include it because otherwise the run takes a lot longer.

I've attached another version of the count_upsert.pl script, with some more
logging targeted to this particular issue.

The problem shows up like this:

init done at count_upsert.pl line 97.
sum is 1036
count is 9720
seq scan doesn't match index scan 1535 == 1535 and 1 == 6 $VAR1 = [
[
6535,
-21
],
.....
(Thousands of more lines, as it outputs the entire table twice, once
gathered by seq scan, once by bitmap index scan).

The first three lines are normal, the problem starts with the "seq scan
doesn't match"...

In this case the first problem it ran into was that key 1535 was present
once with a count column of 1 (found by seq scan) and once with a count
column of 6 (found by index scan). It was also in the seq scan with a
count of 6, but the way the comparison works is that it sorts each
representation of the table by the key column value and then stops at the
first difference, in this case count columns 1 == 6 failed the assertion.

If you get some all-NULL rows, then you will also get Perl warnings issued
when the RETURNING clause starts returning NULL when none are expected to
be.

The overall pattern seems to be pretty streaky. It could go 20 iterations
with no problem, and then it will fail several times in a row. I've seen
this pattern quite a bit with other race conditions as well, I think that
they may be sensitive to how memory gets laid out between CPUs, and that
might depend on some longer-term characteristic of the state of the machine
that survives an initdb.

By the way, I also got a new error message a few times that I think might
be a manifestation of the same thing:

ERROR: duplicate key value violates unique constraint "foo_index_idx"
DETAIL: Key (index)=(6106) already exists.
STATEMENT: insert into foo (index, count) values ($2,$1) on conflict
(index)
update set count=TARGET.count + EXCLUDED.count
returning foo.count

Cheers,

Jeff

Attachments:

count_upsert.plapplication/octet-stream; name=count_upsert.plDownload
#235Peter Geoghegan
pg@heroku.com
In reply to: Jeff Janes (#234)
Re: INSERT ... ON CONFLICT {UPDATE | IGNORE}

On Mon, Dec 29, 2014 at 11:52 PM, Jeff Janes <jeff.janes@gmail.com> wrote:

Correct, I haven't seen any problems with approach #1

That helps with debugging #2, then. That's very helpful.

Generally the problem will occur early on in the process, and if not then it
will not occur at all. I think that is because the table starts out empty,
and so a lot of insertions collide with each other. Once the table is more
thoroughly populated, most query takes the CONFLICT branch and therefore two
insertion-branches are unlikely to collide.

At its simplest, I just use the count_upsert.pl script and your patch and
forget all the rest of the stuff from my test platform.

I can reproduce this on my laptop now. I think that building at -O2
and without assertions helps. I'm starting to work through debugging
it.

I threw together a quick script for getting pg_xlogdump into a
Postgres table (a nice use of the new pg_lsn type). It's here:

https://github.com/petergeoghegan/jjanes_upsert/blob/master/pg_xlogdump2csv.py

It tells a story. Looking at the last segment before shutdown when the
problem occurred, I see:

postgres=# select count(*), tx from my_xlogdump group by tx having
count(*) > 4 order by 1;
count | tx
-------+---------
5 | 1917836
5 | 1902576
5 | 1909746
5 | 1901586
5 | 1916971
6 | 1870077
39 | 1918004
119 | 1918003
2246 | 0
(9 rows)

postgres=# select max(tx::text::int4) from my_xlogdump ;
max
---------
1918004
(1 row)

So the last two transactions (1918003 and 1918004) get into some kind
of live-lock situation, it looks like. Or at least something that
causes them to produce significant more WAL records than other xacts
due to some kind of persistent problem with conflicts.

Here is where the earlier of the two problematic transactions has its
first record:

postgres=# select * from my_xlogdump where tx = '1918003' order by
r_lsn asc limit 1;
rmgr | len_rec | len_tot | tx | r_lsn | prev_lsn |
descr
------+---------+---------+---------+------------+------------+----------------------------------------------------
Heap | 3 | 203 | 1918003 | 0/1783BB70 | 0/1783BB48 | INSERT
off 33 blkref #0: rel 1663/16471/12502 blk
(1 row)

After and including that record, until the trouble spot up to and
including shutdown, here is the rmgr breakdown:

postgres=# select count(*), rmgr from my_xlogdump where r_lsn >=
'0/1783BB70' group by rmgr order by 1;
count | rmgr
-------+-------------
1 | XLOG -- 1 CHECKPOINT_SHUTDOWN record
2 | Transaction -- commit records for the two xacts
20 | Heap2 -- all are CLEAN remxid records, tx is 0
76 | Heap -- All from our two xacts...
80 | Btree -- All from XID 1918003 only
(5 rows)

So looks like a bad interaction with VACUUM. Maybe it's a problem with
VACUUM interlocking. That was my first suspicion, FWIW.

I'll need to do more investigating, but I can provide a custom format
dump of the table, in case anyone wants to look at what I have here in
detail. I've uploaded it to:

http://postgres-benchmarks.s3-website-us-east-1.amazonaws.com/files/my_xlogdump.custom.dump.table
--
Peter Geoghegan

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers