docs(design): design set, with its origin and the method that made it
The five design documents plus the implementation brief, brought across
as issued. Adds two things the old repo never recorded:
00-origin/ the one-page idea the whole document set was generated from
README.md how the set was produced - idea -> basic design -> detailed
design -> implementation brief - so the team can repeat the
method for their own demos, including what to do differently
CTL-003 gains a dated amendment block. Its section 2 register map was
verified line by line against register-map.csv and is correct; its
sections 1 and 9 specify a MatIEC flat-file build that does not exist on
Runtime v4, and forbid the PLCopen route actually used. Nine corrections
listed, body unchanged.
Not brought across: superseded/WRPS-CTL-002_OpenPLC_Build_Brief.md - dead,
and its number collides with the live FDS.
This commit is contained in:
parent
d50dbc8e08
commit
11fb30268f
8 changed files with 1297 additions and 0 deletions
79
01-design/00-origin/scada-ai-usecase-pump-scheduling.md
Normal file
79
01-design/00-origin/scada-ai-usecase-pump-scheduling.md
Normal file
|
|
@ -0,0 +1,79 @@
|
|||
# SCADA++ AI Assistant — Demo Use Case: Pump Scheduling Decision Support
|
||||
|
||||
## Purpose
|
||||
|
||||
This is a curated, cross-industry demonstration of an embedded AI operator assistant running inside a CI Server operator workstation. The assistant sits alongside the operator interface and answers natural-language questions about the live plant — grounded in real-time process data, the historian, and contextual feeds such as energy tariffs and weather.
|
||||
|
||||
The scenario is designed to be **scalable in depth**: the same setup supports a two-minute "here's what it does" spiel or a full hour-long deep dive, without changing the underlying demo. All back-end components (microservices, containers, historian, contextual data feeds) are stood up as a realistic environment rather than a mock-up.
|
||||
|
||||
## Why pump scheduling
|
||||
|
||||
We deliberately avoided the obvious "how fast do I ramp the pump" example, because on any modern VSD the soft-start ramp is solved in the drive configuration — a technical audience will see through it immediately. The genuinely interesting decision isn't *how* to start a pump, it's **which pump, and when**. That's a judgement call the drive can't make for you, and it carries real cost and risk on both sides.
|
||||
|
||||
It also travels well. A pumping station with downstream storage reads naturally across every target market: gas (APLNG, Santos), water (Melbourne Water, SA Water), power generation, and prospective mining and water customers. One scenario, applicable to anyone in the room.
|
||||
|
||||
## The setup
|
||||
|
||||
A pumping station with three units feeding a network with storage downstream. The AI assistant has access to:
|
||||
|
||||
- Live tank levels and inflow rate
|
||||
- Pump run hours and maintenance/service intervals
|
||||
- Time-of-use energy tariff
|
||||
- Weather feed
|
||||
- The historian, for comparison against past operating conditions
|
||||
|
||||
## Narrative spine
|
||||
|
||||
It's a wet-weather evening. Inflow is climbing and the site is heading into peak electricity tariff. Three pumps are available, but one is approaching its service interval. The operator turns to the assistant and asks the simple question:
|
||||
|
||||
> "Do I need to start another pump?"
|
||||
|
||||
From that single question, the assistant reasons across risk, asset health, and cost — and the operator can stop at whichever layer suits the moment.
|
||||
|
||||
## The three layers
|
||||
|
||||
**Layer 1 — Risk and headroom (the two-minute wow).**
|
||||
The assistant weighs current inflow against remaining tank headroom and answers plainly: *yes — at the current inflow rate you'll breach tank headroom in roughly 90 minutes, so riding it out isn't an option.* Simple question, clear answer, with the reasoning attached.
|
||||
|
||||
**Layer 2 — Cost and timing.**
|
||||
Given a pump must run, timing becomes a trade-off. *If you start in 25 minutes rather than now, you clip the tariff peak and still stay ahead of the level — saving the associated energy cost without taking on spill risk.* Now the decision has dollars attached.
|
||||
|
||||
**Layer 3 — Asset health.**
|
||||
Which unit to start is not arbitrary. *Start unit three: unit one is near its service interval, and there's no reason to clock hours on it tonight.* The assistant optimises asset life, not just the immediate moment.
|
||||
|
||||
Stitched together, one question yields a layered answer: *you'll breach headroom in about 90 minutes, so you can't ride it out; start unit three rather than unit one because unit one is due for service; and if you start it in 25 minutes instead of now, you clip the tariff peak and stay ahead of the level.*
|
||||
|
||||
## Historical grounding
|
||||
|
||||
This is where the assistant earns trust — and where the historian integration quietly demonstrates itself, which for a CI Server audience is half the point.
|
||||
|
||||
The operator can push back on any claim:
|
||||
|
||||
> "Are you sure? What did inflow actually do last time we had rain like this?"
|
||||
|
||||
And the assistant pulls the comparison:
|
||||
|
||||
> "Last comparable wet-weather event, three weeks ago, inflow peaked about 20% higher than now and the tank reached 92% before it turned. Your average evening inflow this month is roughly half what you're seeing right now — so this is clearly an event, not normal load."
|
||||
|
||||
The operator now has context, not just a prediction. He can act on it or overrule it, but he's informed either way.
|
||||
|
||||
The positioning line for the pitch: **the assistant isn't replacing the operator's judgement — it's giving him five years of plant memory in a single sentence.**
|
||||
|
||||
## Demo positioning
|
||||
|
||||
- **Two-minute version:** ask the question, get the Layer 1 answer with reasoning. Done.
|
||||
- **Fifteen-minute version:** walk all three layers, show the single-question-to-layered-answer flow.
|
||||
- **Hour-long version:** add the historical push-back, expose the back-end components (historian queries, contextual feeds, the microservice architecture), and open into customer-specific "what if" variations.
|
||||
|
||||
The through-line to land with any audience: the operator can make the call himself with better data in front of him, or lean on the assistant for a fuller autonomous recommendation. It augments judgement — it doesn't remove the operator from the loop.
|
||||
|
||||
## Target markets
|
||||
|
||||
| Segment | Reference / prospective customers |
|
||||
|---|---|
|
||||
| Gas | APLNG, Santos |
|
||||
| Water | Melbourne Water, SA Water |
|
||||
| Power generation | Existing power-gen customers |
|
||||
| New business | Mining, water prospects |
|
||||
|
||||
One set of use case scenarios, applicable across all of the above.
|
||||
113
01-design/README.md
Normal file
113
01-design/README.md
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
# 01-design — the design authority
|
||||
|
||||
Everything downstream is built against these documents and checked back to them.
|
||||
The PLC code implements them; the register map is derived from them; the HMI
|
||||
displays what they define.
|
||||
|
||||
## The documents
|
||||
|
||||
| Document | What it is | Status |
|
||||
|---|---|---|
|
||||
| `00-origin/scada-ai-usecase-pump-scheduling.md` | **The seed.** One page of narrative describing the demo idea. Everything else grew from this. | Origin |
|
||||
| `WRPS-PRO-001_Process_Basis_of_Design.pdf` | The process: flows, volumes, pump curves, the wet well. Fixes the numbers the demo narrative rests on. | Current |
|
||||
| `WRPS-DRG-001_PID.pdf` | The P&ID — equipment, instruments, tag numbers. | Current |
|
||||
| `WRPS-INS-001_Instrument_Index_and_Equipment_List.xlsx` | Every instrument and item of plant, with ranges and units. | Current |
|
||||
| `WRPS-CTL-001_Control_Philosophy.pdf` | How the station is meant to be operated, and why. | Current |
|
||||
| `WRPS-CTL-002_Functional_Design_Specification.pdf` | The FDS. **Governs** — where any other document disagrees with it, this one wins. | Current |
|
||||
| `WRPS-CTL-003_OpenPLC_Implementation_Brief.md` | The bridge from design to code: register map, function blocks, control sequence, simulation model, acceptance tests. | Current, **with amendments** — see below |
|
||||
|
||||
Read them in that order. The origin file takes two minutes and makes the rest
|
||||
make sense.
|
||||
|
||||
## ⚠️ CTL-003 carries an amendment block
|
||||
|
||||
`WRPS-CTL-003` was written before the deployment route was settled, and its §1
|
||||
and §9 describe a build system (flat `.st` + MatIEC + a runtime web upload) that
|
||||
**does not exist on OpenPLC Runtime v4**. The document is kept as issued, with a
|
||||
dated **Amendments** section at the top listing nine corrections.
|
||||
|
||||
Its **§2 Modbus address map was verified line by line against the generated
|
||||
`03-plc/register-map.csv` and is correct in full**, as are §3–§8. Only the build
|
||||
system is wrong. See `03-plc/README.md` for how the program is really built.
|
||||
|
||||
One amendment is not a documentation defect but real outstanding work: **none of
|
||||
the 20 acceptance tests in §7 and §8.4 have been run.** The control behaviour is
|
||||
unverified.
|
||||
|
||||
---
|
||||
|
||||
## 📌 How these documents were made — and how to do it again
|
||||
|
||||
This matters more than the documents themselves, because it is the part you can
|
||||
reuse for the **next** demo.
|
||||
|
||||
**There was no real project.** There is no Waterloo Road Pump Station. The
|
||||
document set was generated with AI from the single page in `00-origin/`,
|
||||
deliberately following the shape of a real project lifecycle:
|
||||
|
||||
```
|
||||
an idea 00-origin/scada-ai-usecase-pump-scheduling.md
|
||||
│ one page of narrative — the demo you want to give
|
||||
▼
|
||||
basic design WRPS-PRO-001 Process Basis of Design
|
||||
│ WRPS-DRG-001 P&ID
|
||||
│ WRPS-INS-001 Instrument Index
|
||||
▼
|
||||
detailed design WRPS-CTL-001 Control Philosophy
|
||||
│ WRPS-CTL-002 Functional Design Specification
|
||||
▼
|
||||
implementation brief WRPS-CTL-003 addresses, function blocks, tests
|
||||
│
|
||||
▼
|
||||
code 03-plc/ ── 04-scada/ ── 05-tests/
|
||||
```
|
||||
|
||||
### Why bother with the paperwork for a demo
|
||||
|
||||
It would be quicker to write the PLC code straight from the idea. Three reasons
|
||||
not to:
|
||||
|
||||
1. **The demo has to survive questions.** An automation audience asks "why three
|
||||
pumps", "what's the firm capacity", "why does it start at 4.0 m". Answers that
|
||||
trace to a Basis of Design land; invented answers do not.
|
||||
2. **The numbers have to agree with each other.** Wet-well volume, pump curves,
|
||||
start levels and the time-to-spill figure on the HMI are all the same handful
|
||||
of numbers. Writing them down once, up front, is what stops the screen and the
|
||||
story contradicting each other on stage.
|
||||
3. **It is the artefact set a customer recognises.** Showing a P&ID and an FDS
|
||||
alongside the running system is itself part of the pitch.
|
||||
|
||||
### Doing it for your own demo
|
||||
|
||||
1. **Write the one-pager first.** Narrative, not specification: who is watching,
|
||||
what question gets asked, what makes them lean forward. `00-origin/` is the
|
||||
model — note how much of it is about the *audience*, not the plant.
|
||||
2. **Generate the basic design from it,** and read it properly. This is where you
|
||||
fix the physical numbers. Everything downstream inherits them, and an error
|
||||
here is expensive later.
|
||||
3. **Generate the detailed design from the basic design,** not from the idea.
|
||||
Each layer should cite the one above it. That is what keeps the set coherent.
|
||||
4. **Write the implementation brief last,** and make it explicit — addresses,
|
||||
enumerations, acceptance tests. It is the contract the code is written to and
|
||||
the thing you check the built system against.
|
||||
5. **State which document governs.** Here it is the FDS (CTL-002). Without that
|
||||
rule, two AI-generated documents will eventually disagree and nobody will know
|
||||
which to believe.
|
||||
|
||||
### What this project got wrong, so you needn't
|
||||
|
||||
- **CTL-003 was written before the deployment route was proven.** It specified a
|
||||
build system that turned out not to exist, and that error is now permanent in
|
||||
the record. **Prove the deployment path with a trivial program before writing
|
||||
the implementation brief.**
|
||||
- **Acceptance tests were specified and never run.** A test list in a document is
|
||||
not verification. Budget the time to actually run them, or do not claim them in
|
||||
the definition of done.
|
||||
- **A superseded document reused a live document number** (an earlier build brief
|
||||
was also numbered CTL-002, colliding with the FDS). Number superseded documents
|
||||
out of the live series, or give them a suffix.
|
||||
|
||||
> **Everything in this folder is AI-generated fiction built on a real process
|
||||
> engineering pattern.** It is realistic enough to demo and to build against. It
|
||||
> is not a real site, and no number in it should be quoted to a customer as a
|
||||
> reference project.
|
||||
207
01-design/WRPS-CTL-001_Control_Philosophy.pdf
Normal file
207
01-design/WRPS-CTL-001_Control_Philosophy.pdf
Normal file
|
|
@ -0,0 +1,207 @@
|
|||
%PDF-1.4
|
||||
%“Œ‹ž ReportLab Generated PDF document (opensource)
|
||||
1 0 obj
|
||||
<<
|
||||
/F1 2 0 R /F2 3 0 R
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/Contents 15 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/Contents 16 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/Contents 17 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/Contents 18 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
<<
|
||||
/Contents 19 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
9 0 obj
|
||||
<<
|
||||
/Contents 20 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
10 0 obj
|
||||
<<
|
||||
/Contents 21 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
11 0 obj
|
||||
<<
|
||||
/Contents 22 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 14 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
12 0 obj
|
||||
<<
|
||||
/PageMode /UseNone /Pages 14 0 R /Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
13 0 obj
|
||||
<<
|
||||
/Author (SCADA++ Demonstration Environment) /CreationDate (D:20260812052554+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260812052554+00'00') /Producer (ReportLab PDF Library - \(opensource\))
|
||||
/Subject (WRPS-CTL-001) /Title (Waterloo Road Pump Station - Control Philosophy) /Trapped /False
|
||||
>>
|
||||
endobj
|
||||
14 0 obj
|
||||
<<
|
||||
/Count 8 /Kids [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R ] /Type /Pages
|
||||
>>
|
||||
endobj
|
||||
15 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2979
|
||||
>>
|
||||
stream
|
||||
GauHN?$G$_%Xl[,^uKM`d7DcBji92pB<nG+As/[j07BN?g1Djt.O?t4J%m+;d;mg$Q'AoJBbODh!K\,5"m>r6r#;%'ZP)3`,Q.NaJ:PGq)M6%gi:/&)J%YQ*i@Xse9aQ'd1A/O2r_1BWMW+Pq$SR74$NY7!cc@kl`H(3s$U9.Si\:&bPUm;S"[$&VV(?R0MHT@Yi,]N$\8mt4\2O>FaYF2gD=iKhYGmeMqQYg5TS=cjno*59<CdGjP3-`8Q5)M=[,Fou(#2@--s=@AQ5?imeTUZk*l#SPY?L4!kpTkaBs:]%>Pe?eiTfRqj->\Z_`dktf7W;iZbrW+Up2!Nc*h,/ZiA2UP'UQ$7#;Lu>LtIM@4`5TXH]Gs<,][lc1S^7hgTo1cGU6rUaVXE:7DsX)5]\nNof'D%>/%Bj)7'<IS)s'@pF[nYY:>gN0+oc@UDBN"?q8?i;(^Zj7C+RlL,f#":KYS,gaRrEI^PoT%5-FL3h'qOUklu#D,,&^i&e3`6+Hp6Dc[k=[`%S<H.2t$UoS1]8]FBCM<s+hB2,#;&X[n\kM'45U:niYl==42sYX1(r^ou33bY^:E@=AAVWUZ.sAsrRRMWfJG\k3B!$e(LpgPC27a[8/oH(%:@KKH$8sAo,dBjqn'FmQCgKoR/IXs!nhDQ&gKVVoW49qC]c^K*m_ighC?n`JZ&\SK.qJn1A.=1R=j/jiqZ?N"&992uqE0'D9#JGeh/:rX!TK=(4HcG*aUQ,9@LlVA(\u6O<]Zqq^[U.48I?%I$A$2L0n%d>LS&\J'Lo":\8R,8A3\1hbe[f\H"(5Iljqtn]Q7g:0+RXsn4Y`+,N<Um[.<IGnpc^sN?h)3<]L$Z=jBe^iSpc!"sL1)k)!b4mL#r&#RO(.b*rg95nJAlZ6,tG=e.!J9bJ0+o+'m=.99<bno:@]^a!8S>RJ0tZL$>!bQrdb-_X1qf2\[.NsV6E9>fFuJp*2S=/*9^4WU[W>$VI5^_N^PY+mlj&p"D9&K&,Xkf/6>>:MPo1$hNleQM,80."lhIO8qC;Mb-2-NdiM+$@J;Za-3Omr\!P5G")77MR#kI`P-E(Di.+/KVM6`SR^ZX;Fq`lgYs&ji.n4q!t.:6rWgb^,2!?O*#NeQIh5m<DnerS(4a.:GC1Z^_r,b'n`T_Ws-p#.WTdfmQA!rcpu\mi%iR.^&i?JQ":F)_<OZd]Cb\eEN+2h"0$=<E7*g)0qkM2QY$8$1%"=:"/X4][MblX,KiiMQ#&lae]qi9SeY4i:g"!><8p@d.p;$X1tUH`>8DPQLK7r3<E]B78A5]*:pGt_H.E<!19:o*QT(7E1XEM\@_Hck:2T>1)6XAe6s3PE06'O@A@Zp`Y`\U)jQ.LOA=bpM.jWOg8-=89KJh&@+iTm[Fgn\ESE.>[)o^IkZgeLe4=+`h(A6'9gfA@-d@^`,;@!`e&@ao?)fY=`m?/Ya7'SOh[MXK+FfQP2`3/UC"<e^I5Z(@mbFRE.Po/)l^GPR%@P!jA3g27$c8gbmnX?44l0lQCHa^rM(E'RQNE<PhLG8FW3_U4P!0d*%12;K71Vu/]&JJmuZ$(1:Hb(","4lrOgBMlrT;UEJ]nObMhC4kt\q[]$7Yd,lhM\cXp<Vk4rYXXkgD7rDq`j61KgW\#][GJ")h4pe]0-:KG9!@n/Z2-bi6qPX^E2O*mnE)a@Pg8]s-RYJs1RNZ)>hM@EMEA0(%am!NL[K8U#7`Km/KnD%87:F*5*SrT.;8V52O*BEUJ1S3*RVG)6KCB]_O#!^EgkDfmN4%qB?hA>"&'M*$<K^TDOD=`PAOt$_7Z\o7C@VJT5r)FG8+,T2T3XDU`?V&X'pIjTn"rNHejj4\atZddZiRKIl-7'L$#s'FPIaapnm(/Zk.m\*?B3huUR%dp1Vr4A9e^H]((J;al`:rmGi4^5sb)MdnfD8:*&i.H;(fhQRL29n_`/,K3C@=d]N`OiZsl*^,/B=Qt+N>jAIMnl57jN6rBg=ld/_c<A=Z9@S:moaJ]^GX$G-p4\W]qmV+Nc5M.EJ/+pW@bjg#b5C%iAj#o:Olqo^E@CHk9C]6U$#1EBKpO,Xi)1uCF@<Se,S8[Fb)9:p;-eT_jm;tY`gJk%LJ5.m@tff>=pi(Qj7-,8-[L8tF*=M'or=<HgL--<Md_js:7gb]aG+`ZYc-(^4akJZ/J+4$Uj]">>2j=uG*cUNGbGG:#u2BN(t<ZjVJC,&i);l1-JP[K<>/XDXGbl=Z>g@fZ/SU6S\g!kqBu=Goq=rW=1fs,K-_[YNoa'l?_'M?mGal1i"Oph>mf/87Q6noGp)49(P('oCS9U$2?Q:KFFAXHKUC82'.1b,02[_Q7$j0J1ts'tGD]Bu2(#`!^%UAbl!7@Ja0@'m7A7&/*iIU*<=YjRie!N07Y:kCS))K&NJ$JlhgZJ)TEi$a,7)[q[E;``Rsl28o=![*p2ip,2I,V'P.>0V&$1ZqaUCj'gp:cE:_aD%X?Zq'cZH43KjNsdLFNYe^<:WEOIcK4_lk(K1X_RNBqOTR*G>phI3(2)^?O!1k#SPk_[u*]Zapma!S*&GH*?pDMjgOq6P*Z+3kR3Q/WKlD<<YnO)@]p)(:m"NTjcUP+arTqTl,s.(Ou[k<k6nP[Vs9.:7IG<HGM16O;o'^M(K+aUXCt^PbrGH<6hB7_5k9]dZO<u%VB*TbrU)lUh[;Ubdn]S]c3_H/&$gTUqQfPrAN]qE']b8?0*!sm9>"<;t'3p)n!"27(+oT@Yis8X:<E>[(l6a)T`hnWD`"sjO0hUj9FX'%Jh-_0EoOr^iXF5LOloL\J3-_Y/N(&BRWCDhVusWa4h?(]!aEOXr#J/Rj)WI.s&lWG#66hcSTC!U_Hq1l8mIuA0Q`i%@DeB%@]fsC=]e9'4%s5=cP+d<R]R1\ZRfj4^!5CqB)03AMdIdQ?lJ_'N^\RX+KYsd-7=[JA[r2V7t&,jL-[<^[<G0(0Ok7G9%Z#nbV!]?\=::!%P>,aT~>endstream
|
||||
endobj
|
||||
16 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2011
|
||||
>>
|
||||
stream
|
||||
Gatm<bBDVu&Dd46B'CWt_md_T*2d]0UUH2bF1R)t84#o]$j#)0htI0d+*&nolB*0_8._0)baggOnArSPB0W_cki7gi>^PQ-Zs8_03[$'ko\8s'gR0jAUEoBOM:9BP;I!^]*_(8GqjA,Fdof+:N%mQiBV)(r0R#Z0.1-\89)SM[XJ#HsSWl,]6;4tSJT3m]Z#UC'=<#l5:IC23[@,t?1``A;DWF%pBNW^Y5>:[GOHT#WbNZGeCV&+k$X(j\?-,\tZCos3.&<%!B);rf^XD\DOZHW+N)D%nk4<4Yhqd-r>V-a.0!qN<r^`B>l'#rhW=pYA)c!k*4PO`MLL'\3'81?B>>[=O[61@PCaeJCXH[W!4ksCMI_'q,rn2@!4c2^0-*Qsa>Dh@V`/FPA3O`hLae-fP!XJHu@_[+s*'.CEVZ;JA^ZXUrUZ^6Wn$j&K#p6>K*^c([mWn")?J#P?YU8+G_Nt?C"J.D6=p&^2KUiaI_%q+u*8bLN/_c!e[cNL;&SKdOfL*JH93S`'AhEj)oL?9XoS.R.iYD:18SEmF)kdOeN#M\t'b**FT2?ml*p$X<NMt)G^Y7@ULVL,pK6,<mLP^m&>B+,Pe"NmZ^/N4VN`R>WGMY4gK#R7Mo;!u_1F-3eo-?5'NHm!hPo/Hq-D$DHBgNUW&.2RIH?\N*Kf_*Ek]a/Zr#tb=1m&UOa#V$r1#;pTZ)bH2LPUZ;n%h/a:c:r%pk/]eb.=eu6\L<]TO]]I*7%9j'2$!qJa8uQ+S;5?pQH95r5^h`;&Hs(eIQ%o0i=m%g;(m?J7\_P,2P+E6BKeHSdAt;5lp;Wd6HU`+?2.?K9sP]hBZ.`i19OQ7,3((+*g/RXp^BF5WrqF&JDg-ZsA8NL:PMML#U697tLc/#43?KC"@fa6n,.D;1-a#Xb8%?$Z<fAd%BZ39Wo_H<m),&aG*d&%BJ'Gf]n&gqCn7pa?-*=04'8H)!WqU!g=@'(_1/Bc/EIo@d7KuYAWPFEY2(_?>fon4kdE$nGIKk'U/V"=+FgNXC+aoFi+sXc%:5llZD)HmMr<h7/015MX+H'8u$@Pc#uQ&X'/P3Xdi<:9AJZE!/kWi*(J0:p1.)&$AT$)JuDk'\ujV""e6eHdU.$F[0?/hX)hTg-u=L4A%1q]cm,!O$JmssGM.bA<>oGng[I:mr7f2UWC>]6?$%XS%s$4;P2udEaIO>9)+IV0ehbHQ4Ts[<5Yj16294H5o?;_[WQc"&O%,\9#)&RPoW"PAW8f<V#S1I"?#;JD%TM,D0H]uQIE[RXCCA$c,$!9EQLPm_S8>ir/EP5F.U[;IE<G=NP4ViX)QQR?`7H]$lMX+*joMi]=d)(DC`TqOSaoBi1=G@-FBRCKrd<\8reqWeMZpfu,8g!k+N2dMH:sZ>Z;qqt(WOC@1>P,O>ADlL7`u4Z6hb$TL.OP3C6T3UL6Aj;,;?0<^2Yh.ok.*LWZ\tq<USQLoG<f^NCA3h%[oaF)o+>WNUj"SgB,V.1<Tbi;OQk_VH>dY/77g:rkSQc=&0&fHTD/oUBI^hd".QgdhUU\gPnl3m=TjI8bYaBI6SQ2)[rTrmW?CTO.Ef4a*'jLU%Z;Q;u=W'hQ)j,?<k^2!qSd>4jJS;U<^*b2Tb9nq/W_4F&RHJ\i4i(puTf29>TK#<^75>BlUIIFF#hHL(XEUB<AW+#(PdJmu%GKBABl!-319+!ZL`qUg0QUk*WS!574pE2HZB@'a8&(\/&5"'s_!nJZ=A8=P83A'[1U)h-ap[K,<+@aX!rcV9kYi1TMfOACGI$73?d39,i%U!r\`nD>/V^9tONB_SCf;_`2bnPM81+V[7WM^mZCq)g_SSBY,RGDQk(gm0c"&mU3%O=Lh(3f[aC'cs$KkpidEF=A`b>F+^G+Vc@/eL7p1++'NMnD.Jd`G2fJ5`l?)=b2u,nD>W<(9<Eor]G$R8b1PA_">`[tA5B@/At8.pX:7'7qXq3PEIllpV6]#YE]B7(OD6_k*6n+Eh=Fo2k1!qn35*u$d+Nn,g-m"~>endstream
|
||||
endobj
|
||||
17 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3397
|
||||
>>
|
||||
stream
|
||||
Gb!#^>Bei3&UsJXQq)@%k427sDb8Z"dc5/VZ-UNJ6p_M!&l8R+3ndru)1X[!Q7]^`Rqun0]O68XDnc#OfDp<s0<i3L)W9Elr:YI;5mV[-#\#HA]5.2^h8PE_0CtAi&&Cp%\KB)d1C^ZMJM7&9n.OAZ84ZXk(X<-(k&W2uquCJ&U>/E40H72qE-ou8am__U1[f/<r@j(Jj=&8mD#?uDGoV?@d0i6!e%nZE-QZ"cB3<(5=4V=r.0X&m/)dA-2fRNU7OSREn6X4+WsWaqU/FHtf)*4uh)Dk@Kre%(Ng%#?#?c4gkV"m(=7>U\YC)j'I,S:S4*c7[ltGg`H/clnAImD(ANs9cR!V]#`i1igd?p5dYZ)N5?7T_.h65f2rS,*%rUnchf=BZDX^o[foD"I]N+!bQiLue][c.imhY7`dgqT#,I2LGc$g-[nJO/f:I/FVmrQiCFp^iRAhgQ)_$mcVDbJ]%Z)c!`*/#ZIic%5Q.m72_o^"@dqH*Ni*5fge[6saQiE4=t;3`)oGJS)#EGE_RT'7PHc@!KYKL4Z'umCWp&Q?5dkNRDoa_2@\h'Fqnsr5G?DAlGrthQ#BcrSfG4[:=Pn+0rB>+#hg?BfK-qB.,bBagYN9%oph1B^J=5%@Zm[pCnt:e5LE1;`"^VFIpWllB8%j]bb5kkCJu_o,OpM3Eh$r0,M>Ce9TM@J8^tp%KnIN$87.$\M&gI^!P^^\)[=V!s\T"p]<6)NKZ2O!9`l-'L\"O]C!Hs"GjpBe:%rU?CZ`>=]]F]$#ummr'sJ:WUIfTOIk"pm=pZpIpb#u;Tc<@H/nd!2I)Q8)6Gn?k60qpX"=PM/A>s?ofStoB[Dp\o,,WFf0T2G3MMRt(BS:YenPFIPC$u>BFGL'!:8NF'Pho@k/aVjQDonNaaglW\q]?^bsLB(E5hM?)%6Mh?B2eafG+<]\n2[*=+->*JEfDAQ`R<XOf+?$%nO8b'Uku2)%!uRa60'[r*n7uMt-nI/ht?tX.Dh(')ul)ID5A8Fb%>!W`hqmF090`=c0=0-]>_b840.;[hA1Ue#:LtTT3?GIE)@GbS3J^f9gZtbRDlL,%eqSQN`uj2i<LC)n^m2Nj.Y4ikpPd:<8(Z:&5?r"I>Mpk$_O'@h@AdFbI/'m@rTPXd"0m&u+HP=O:L^k.XgniWUo_M_:ZeH6OS1J"DQl4ti6M.#%9G4#I8gP5p(\?s'sSUn(tV#9LO[.S&JCaq4'3Ve"a7*R<i+X67<F-9q->RkUjO:"Kj)N:8/3B%7/U!o]Ga]jf#Ypb2R@p13J-gX[+;j6,((%D%q@;ThP=;XEMBp[%YR-L0d9/c=2Wn>FldHeD&=@jo0k`pi:-YP"7\ab,dI*Z<$l,5MD5D4kn-M2MBd3.H7jIidu3daSY3h[Rk:Y9/F(h[g"]Q22k0g0ESg("0fq%@@pA<$%C+j/eunbKnfcI[\IbRquf)7.Hfjd*9e#)bZ3Olq*!FR1cpV;a!?kn?JAiJ88=eZc=T6SH)fe(/hb9#B6Y&TcBA8<UFXE\>Ab?i#f7/0M*<hfWLD]B2;a^2^`i$TWO"+@hZ>)&<ddm#Mn9WYP,UoRl;_*4ub6:i;+t]oA_)]1>'G)#H#\8d,\TJ\!;E;<J-h]\JkKShd0Ys"b).&fK70oa-J[T&mM%_Z&<4E??SP6L>"P7M7lG?ZTuDL]:Eo?:Y(U(0$^dp%NP7]$E=&so8Wm=]GG*E']*og>--<CQWq5eAtu0\cA<W,TG']2lI(+^AdjN%^ttcRJ8b.K+st5="m`sRQ^u]OBgQ5oOb@;)D4.=.Z*'aFE6C9@\=b0TGeup?S->Ma'8#tAb&jaV(l^e/6Z/[]@g6/Bk]Z<IJ2iBSNg8mE8I01?5\aGrY&[i1`?.Z6Ttd5@+.n3#F^*VMV01AFGI:[B,AQ:-97mMgc<jlO738i3X1?JN-Mu'tfb8@ZMGoVF5/fH+d!j,JFZY_oIb;pGYRFuJJ1Uf7it_rL\eS%u-*eHO)*3eoLA$Y[_C3)OYYdKb#GJl&e<q3A:(FF*HDiQsf9&iFK+Vaf8<F5=)O0ctNJ!It/-J%O+#<QQa8#3)T:W,n\u)%T8O4(dDD8-oJiEDW$-S:5Hn'hF3k"NLNTYrTp"\\Sd-k+sZ+=<6CUV9Umt\LfpajSI)Bkbq[C<-B[nkFem*jT3\'hK,+*cr,"(idXZ*3#@B!'eL^eWeKfiI0ojI1%&BVAU41;jgbNAf$%M3j[ubUF#qP#q#:5G9Aj3g[Yck`j_P](Ep?E0OEDEqiu;r#nF7.BPf"@QL&#oI_4pc\g$8=J%;WKeD't7mk/2$e>5N=.u`')OfX.Z&k/l4a;Pg)92TnGDSVm:g,]&>_Yt/rbqsdX^Y#)BR6g9bc>UjBe*m)TitC^-_g:VSXB'8Zh8*hqL^b]l5u!4_4[H_%16=a8XX^;:+G3*\:dH775'Zu*0'c;?Rl;/1/AQ6<j%]BkY/#s;3qtLF;1/2oOhi0$=(Z0&)2b<2B=%NHBBFVNsXTCpe&WrYXJ.oAiB)r[Pru)Bmds)[P'?kkZQV([l_6):Z\fF@nE/AH8p*f=&d0AbXP"Y?[?nN9W2Xt4%'8V=-T43UE,eQZf`TP83t_k/LKfs*%BC3Bj=&MWi`Lem>L7kUDCMqEA$&JgC2kd2#=.OH>MS6EiDN%3LFbo+lf#^$?P,>FG007d.-lcAa7):c:Y3<4e"hM(JCn]BkL3TG*u9BcVH17o%,SOPOu.Y(f$Pe_ko?Ok"!U*6]#Z$QUlCT,q1HUSqZ=.5imh1&J?=JW3`DV2d\c'e*UJ#A!_gaEN_/EK3M?`20GKp6'tnb4i+GG$DaZ0lF,<JD51O72qD'Z/si:tl%Y`Z1O,=2FkG&)^N%>'3-O2WNLQiG`eU%dEBo?6SoD^j]*N,Y1W?BE.iR;.Zbq&/5'$diJiJ/^P`G(BGJ%<82-UI2->M`h.busn17)7Lp6^'DmUfrn5Gk*khP,A/^J4ep+P*&S1VogOYj`CC<DKomD08_-i->")*2j7@Z>L%<cbj/aVVsBBCr?Yq#1FEKVA#?*`]"TM$a!<8^sUa]\292D6-9"PaJY)rZP4qdGW$Sh7b`hsVpcG''d#TMI'7;OPn3oHML0]cC$t*8B:R<1>7/c"S+GV,DObtC)"m%ECqcZt4R8]lnajQTm$f]d[4Sb<Kr][Zb@d>95TORnSD`ONY+APK(gJkoCT3.$FPgd)'Q"^+aqfj3C!oUM(7f/G+!$+\b9Gsh*?h\H4E<P(B<shkJoMc`@l2JR+SKqU*t$H1`+S-(Qn;S6$De8Gh2VV\3Qe<R3KWTZDQP=]pcJm4h7$!95h@KNp-;P7G*Ikg<JMKA3XY,Ns6TM)3S;PO`l!^JIX$*G^RoO9@C^W'gO;@LNgO'tr&eG5i04>#8!i.o,N.S=E-u;2~>endstream
|
||||
endobj
|
||||
18 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1564
|
||||
>>
|
||||
stream
|
||||
Gatm;bAu>q']&(*mSZbqQ>_mYa)*m%U_Cf"9\'a]8][!D!e>=apH8L*MH6gsl.@&H+s-JucG@1j6m7"(s1`<*hC\!dpCThK/_:]55t]=]o]L8gD&+\>X=.Nbo!/Ob'$i[HU`&"g2%)0cS4UkDbf+-]Mm<bS72Slp=],B*&MHmh%6_o>0+2TLRr\"Lq)D#U3QVZ]`\WOr1a9VQ)knM(d7Y'`!<PQ?/^;$abB9Qoh()OT?.\N._(mO*UhdPAdV@=Zh,ZATW871:)_JhQnr<6%0qDof:dg5\RHaU\L[3^Va6O;adllU;c"-\smA(0]+q)k6g>ghIp30ZX7?F<jRX8*XN9PR]CSe#mXcg]h@h'$Y2h0VqI=!ltj^)UH>;#=7.:qGALpHfTT0'L?PYQCL#/S>3H$lDB8qO"c9*iH*?\T[e,s3n!;,DL'3-HS@jZ0/+'GNu=cuk$.8TS(MR>'L4:SCijk`lmD\f)e^XOu)#M?Y/8c_jA@.<Yc-@5k(#Rgn2h8"/>8G,OD"<'EOg1<PNJ8E3eEHIF_9Oi`JfoGXW1:o;V7.scWaN%c&2As=S@dnt5Lk`Z.E9JfSEYtSA2Z3JKQ*sbbT;V<YRe4K03e6af+N*7Adb:b(o@NNS)MKtFKn+8b>kb)jp"sejF"t3S@40;P",oU2&!I\&`0VOfsNKA%?fg1g'D@jEUXN`%"nO`gXAh@qF2Y[<Hkpm)'+!F)-[C#%sek3>@^i7!%XPT)Qf8:^I"nl9Gk6!J?4YLWJpA?qHs2NsJ+*P<HGJ'#8f>H<@l1=AHf)Kj?f>u(0Im6\_e!\Pn#Pm9jQ$+p>[ki6eF=d%d'?<n$H-XdTn"n[/$SP0.%gB[["15/m`IV%e%'7cfUlR)U?R.oq[\+uN-Xkr&)4He.-B@?=0n!1J1gbiWh),<!mU5oDF1N5!Em"s"iom[`Y4^/!\`A'XTLp*fcF?1?7DWaLoSEAIpI`<%s2ljM%9BjM0!):_g0PBKZ_h5ML0;!-4RsJIIF'-\n!(YOhCWNGi2:,fIPrm4RgkZ<8Z1S]cmQ2gMf)ChS&Vu4dhYi-o\FIrY53f$,fKXZUs1S?NMuYl]l4/3"k[;eD\_HC+jma2(5T"O>cq!Q%WMYTS?<GW4MPS3faPjOF*-Jg^3imD9`D0S!5X11f6=EGZn!sV@]m45$\WdGd!MH\?ZV83c;ij10,o\R4lap)A'opJOgc!0k^@p@ZqIudMuofq<K9F>O/d!.Fjmbr4=JJ+S^YE46['BPpk6q$7[3'H^.V^>]OG".%Cie\6O%K3\O%o#eI&Z.4nDt=2/gFU&IeB36"`6YbBGFBiM3>VZr#99<Wd03*Lb/X%R*Bb>BL/o2c,XF5g^X!.%CSA$>8E''$6#A.ZkNq%g_"CP>NMmd!oP^L+<5>jl6s/$e+]5XL"oqj;"dYfuN9dEP8tc\3'*G<:jlG60%tP@uV_^1[&dmfE&4Q`+kZ@\,_L(\'4K7$d%]H5:91V5oOQnMU@5\fNtaOUJ*]fem0b#@>]6[E-Jc5i0Ll2#XmZrGU!>4[mpKW(NPSeNY(a:%>&3l!BGJ(Mu~>endstream
|
||||
endobj
|
||||
19 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3326
|
||||
>>
|
||||
stream
|
||||
Gb!#^?$Dc/&q0MXkXY*#bl@eOjis!*2VI+Nn^u]^k;K[M$.)@)=AaPGhPpd5'\e``59u(MTV9!/lIN(AXTZM]hgiJ>Pn8H%MEfr%+pc0T8d(7mM;(\nn(X%U::u9&-V5`!q(hJQ9Dk<8M^T@ms#KUYYrSdP4NCR6%)cVcoO\Iq&=&&aM&.Pu@X#!i2^ePR$bV:,QMh^=&*!pOcfPPr`m6VL7Y*7/H6MK(*EPi1fRk?OYS*iUAZJM([CFdC'3AJiLmqGRKs&D*Gcg;_kYb[I7B*D,o'O31m3coN)m)/h3f981&hFe';dWnfSA2eO4SN9t\5r@`@e0A+gU!_8:LZPWDL9%JDu6#0KS_XGk0]]cH>dYu19o7sA?+(cD9];?S(AHp/q3j!i4c5[$`!#[ea:7YM@m`OLr916Y2icCGk/l3#k7?+4<23tO1\j\?NM&Ys1lZD+:`nh8&lE%>2bOOiIIVhU3jK@>Yo5e9j?+_+mTOQ\nQ,gB?7uf6ihc6@8iI%BL1hkecb!'hM=eT>LCtiCVOch@.3p;2o57NcAI-k%NB"da>Vi99%7-hVi8tQB7qu(T<9k55[b7<+M'%;>hs897^`"@92V^9<=6:&"]-=F9Hn>RlAU,Ek!n$/Q^JRW/Jtruf,k:-_tMB(%sIdWG\/0qDcFk-RX=$ieS^VOVc0ra"(=s-b3VgO\qQ9G/CUai`au@C'Feq3N)^Y.inl)LX_8+OX]m`Dm8GaqVWB)[5$K1Uo)cg_$,'LKBlo,;V6G3S<,U%=&Kt>r?Mos7$,srt896]YLui.-fX$p*#S.FHjF?5*X3*UsE%E!')MusF5Y#![]"Kl1RYGRmdM[BF0,[oB#)8oWXd#[=fN1T0"LPS[r/%uCeD.i`mNQEghlSk$k66_#O)df'544VmHWcU(Xsf3Ob9"4#]'NV^M2N;LQ>RP$@7]>Xod)3%N:md#Up;<Ihl5J70"$K;Cj0NSHN:-$?)`k#=r;S/?d_A\n$GsF1e,YF-Z1&QZ-(i<W<,(&>OQ,p%RQbiPTe=d20)Lo99MD]N!oQo\+g\Dn?DsDeSZaME!b'^1JSR+bm)(5KksR.;44:ejnK83Y=5TUA+t@lKJVVa5N/2@a;MI@6Co#?mYq,RL*sp#'uN=kRH$tCm9I*?3C=Z6Cg3^*77K.,[Zk@D\7H^DbTuseGV$(t-7."c0i`kBD!#6]a&?<UGlZ0rO.*(IKmJHq@;t[A[G"bF3p9PU?SMn0?,@oF0Ls\C(1M^?S0<Lj*S(nU?rVeZhW]A5Wm8'MousNEP2YYe<Ck!.K:*?uX_L++3sT\s89s-$IJ!dC`_moH51,Qr-PDh:+=XF8f+P%j4V!4e7)BH^eS2c$c+J]RnLWj1O>lG:7"qs!.r8/,F@_gV[m/C'K(7gYAV[4AjNPmUm-N%j23rNgdC(0ASI*^YU4>SG>.HE+Y"s>o*Jl#6j<9F0Zn3$3HC*9?T/rlI?G1&Faq)M--HG1f>R`?a]#*CJ-kmLB'mSRA*\%f_i_tP@2\JSA2+KXYMRKJ5*lU*b8WC/\pRW"9_]kkS;kp/-Jh3)PGe[<Z12T*UP+>46;6WAN2%\>/!$GI<]6Qtj1_Vg-_M1t??6*IjD!m!1.&!gl!//sE@Q=a9Wer":[Z+PMKTb]pF)Q(ZV7gR[SH<u\eo3Q@YI;itY0T._%Kcju?)Y!%/-e"QNmksQYGkUB(R;P(Nbsj8\H'W"UDn&`;=GAp2NZVGd"S5#Ju0pP-r\no9(lQK7ueWYc7@a="V>fI.2"G91ktLZ)_5HqBKL8?k]/.^X_aM-:dZBa\gnqh.O;uJ90!8f1f'S!6$8,7R%Y#h5c=<dRrfK>CcO(UV%YGe"RU3qMg&MkESFQ;iuXj@&N?_8[#$J)CX+(u"a8Oi+[gRdca-f5'jVQdgr`TQD*n;^C)Yc[Au@m!KGc6h#nn"Dpm2#Ljr,P`'CQH@=V."bYGu3;iB"diW,%m*SS[V.(M#'iO6ckijJcfo"EK+B!+8Cm).d<W-u'SheC_oA*CB(ZB[2g63<JuA1EnlG=V'b9<:<$ZUEAac*^^XN^i;,*\6+66IulG>-l53J^dEq[[b/a/Srd)DiRdak+L/s+>gNqtU8Ue!F"meMhe#?$,nNR8gD6$=XA.6ZC+ofK]7LA5Y=$]1_%CCDi>%.7IVhPsLSUlJYsG;C_^I1h\bkNF$YX3qD&!cu`>^'B61CU=Pe64g1Wr[e;@OA?klJ]s%MB@9G6Da!j\IbnHRD;iF(F#5VWOQs]Z7+0QBN*OkG`,K")PO5C:;/k+sV)4YIh[6FF$H2VU*l9K?QVX&gR]$"mdb_I(c@m7'+tfA>LJEYQ>k%`=:##b>W)01d;pe[2k9b&/6<;k]]'&TS[4fdG"1$&Bn+)p3<s_JMo)O7$+uXjiT$ESn9`*IYJ*o"=f1rEp#`a\B"@Q6cZQp*1\AC_mB!%M'!'%FQ#gd]U?W8F0cF7-jdO3=b?'o"GDBOYC8S'H!2$&_[_UNXiHW%!/gR8=^YXsEhH*N?GC-Y.mp;hlr;n%q[A"hGRjAZjK]St=&Z"oA?SFKc17eVfQ\,.i;1:+qJRP(Kp=1RRS[Z<>&CO!GWEVQ1]P"G#\FV$5o^q!@Yuq>oCD&7niZDSS/dkSn)!"IjM]jC@;;o=`POWh`Dk$sgi@(`kn/K*.>d,%#QJ\@K=#`DH#QOCc8(k0$]sPDBS,2f=SOY3^GQ2k$7:<K*:3tajQP(-1slV$*4YKS;I]'P]DaSlnp7Fa=Za#Q1YpaVC?<aog_"Jf">Fm)$epeIGb,q*3IsOi*m\otg\/>YnErYc"V,u2)N4*]]Q1h-V7mZRS/k%Nj24H&5Q+o+NZia`gR>tA+G`XYc[<8bA/NffXhM1&$1TrE+FnbAY\3!>MQ0QW!ROb<E]ZG:7qF+6m\p[>(3/t5a`(*L;n5%f(gIAREHgpI1&^>$B_HJL[Ybt(,sMc/2H_qQ<Q_`**B-_'OjF\6`4:NHi-.B6p&ol,H(Y^EH'pLU_hTt0F^hCdadm:bLO";*7[Ght8`]Fm<5hcj$%K<;*W"cT,$*c1YHXYEoI%a@o]tP0Y3gi39J^:A@UnW+S-ESJMa!,jC6[dH:C*7aG.&Nlhoi=cL6>bk9\.SB]!K"\@!E"5[3M^ejign*s-R7B;IOqT0iI7Ke<I9"?r1C,Z)E(hG=S[nVgNU+Ut`P3QVYI0[HTH&3JJR^i.(:il,aIt,Q:L\re_l=dJ/amak`U#Uj4qi*t7b#@<f?8+6DfsE1ZD,o(=[r>OE$moe>T*7sr#[ftA92hUJ,c[.g"R\MKZ5JN(5d7Xp*3s,R.dMB//,43@61o/H[a-iXGGYSRl~>endstream
|
||||
endobj
|
||||
20 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 816
|
||||
>>
|
||||
stream
|
||||
Gatm8gN&c;&:O:SlslL6W[&jO*o3W/dUB#5btO`9a>#+d.W@NKq^sXIZ0S9RW>Ue#Z0.XjM#kSRq.E_/]M7>/HNoErZ2uA/J0]knalMc@6rYYTJV74S5iWdR84Zj1Qk0SY8I[Gn4g#Yj>*C)'$n@?i,#[spLTQ6kA718@&S^mQJbr[Z6k2P;fXOPV"U"MO40V$8JONF-:^APPi8Sh3)-9uL$_-94hc(%9]<j))%9'dFFm!QIo6!paei)i4Y98+BjK`D=5msZK@Sq4K]pLINf1A*$W#c`:).k,f;:pFHTorB6_`l_-Y^_O^.h[Y7KV%J3D)WesQ$&1Xb1:Fmp+\,%B/d/tWtW+ET*o;tb1,8CO<iCR1!,K%k38XlE9)#""l?kEHsamDiP/3!A+]HG'FQPo=/J=h7/;T$X&Gdck_gl(,>)YR;hjgp1U+H\:li4=U@0]!H]&t,l_"uE@,PJra2rY_#o%XA5S^#6:`bkpL):#77@b/fBoZXB8'-E21;r,M)s=;:as,Tj-1.@0(G3#+*rMiAg!?&`7fhsE^l<V]Bl9TM88b(o^DR7eVR5+8B0lHd"r<_qn>QV^YSQR4ik&`YhHn?d#$@^5ftp+FIHa2_7@Q<diV'_DZ8H11R,Wnko(Ej43M^f3(Om#Miu!bADtG+fou=@%;WDS+ZHdN.9o!pq^'6u2@h7^k$tlRp%`bSAlcaVR'T5qfXs.M!o+CGh(CrXe%m6qI`aM)R4hgT!ro+,&gSm,qE'X"N1tqZl7u6fi7_S&:53=p;1Lg?)Gr"T55l>>Tq2i4[kjtHRb/:p-@.G=qXb+R~>endstream
|
||||
endobj
|
||||
21 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3320
|
||||
>>
|
||||
stream
|
||||
Gb!#^;0/6e&q9SYkXXO59n7d4fXEjg\]\!YEGXOo=U*-D[?+u(bf'O1]-Ui%Y@gNKXt!#r/gR-.[9DDbI3JY5rs/7A<W`3j%c4i/+:-qD"[V3<E;'t$h4=Lijt6Kj8ODq/C#[H:r&YE*;%,D`3qHh5SLKBXfGCCc/CN%;/c5T@LhDP\-fJOl-K4["Q*S1A;,#]d_#?$JE9>h9_7B)S*2ZR5Akao]Xerdr`/d&\">qahr%"hYO]oY^AiX*TjT]U<<XZ%f'!AUANL"Nh#cT>f.3AKiGCREa0-kZoFVL`[&hFeoVS9UT]tCrRGj2!sE5T/h*5"I;p+5n!8aJsbAbU'/ZN%@j0_&c&4ITJO+0)@"3NTT=S<mDZ[HZ7]HaS75r:SYhm9FL^dAl9-IXXjCmU6aHiLucW[cXe2]^Z.a\9hd.G2#!;]HEcCkSU],JWC<B4T0W:4$LkZ_OL:.k<gukmWn*6;DM1fk.*YME^YHYXn_i%ptjfj&<L\$$8X?B8h:]2X+]G]2T"qjQiat[BM>cm5&\fT*&WFDX'Aa7f*/5Lj-B%fJZu?L/_V98FTrRA>Z4p9CJLEuYLbo*<dB]l$>sOk<XYLGn8?FoA#iSKN"Mj!ClH_1e;lR(Bi:XHXtjlBB'97GU!QGY`E>[!3k7q,e"IHJZ?M#D$5BU>mCG!AUG/Nd%JLic.&l?d1p/\n)"b$ac9G91=NC&?hD3lhiKg<(#)`cVYM6A$"qfQE7ILD$Lm#PHOu.__g2%H5X'a/"40@7>)if<XO's,hHM>F^!+5UU#72jG3$1l]]Y<R!oX_I-d:FpG?C9Y*RT/Q"cBM/kUI)j@o^HKsTf8MYf:q?H744H'B\k1,^\c$nNTAVeWA,[)=3:lAa9jVArn"4^_rHkB?%h+I`*i;OeD#tE&k#m^3H`/(-p6"*NNiTG_r+q^$+"&m,#*D0EEpbp)FRkN\N53#HFK9c=<C.o8HKRibPj2dXo9p'"VgT%@ORKX:g)gU9\]+Ga>#fG7U\!q*ct=jOMf@5TlGAt2Mu@>OR-<Ej49)2N[?M[Ld"72^[+hFCbh(:I:U5NN)8S6XeS_!fNZ8_]ZDS0/6u>H\oNbi(u_M^XQgB]24`l:"U\:tP^<l0<&F9)j52rOF@t23YVossiVA1K1oS>r0aTA]89Cnq$!#r:OGuQ8.gGltDTAAiXmi`lnYr*9FKLUM2o;o8;rI#0`)!m\bl3RD$S3fK9LKs"Y5>Vb/gdse#.bM4IIEgg)<"PYRH\qpXbNB)&#_)@m!-8$kHAR)PK;-c,\IY58RO(:SQRXeEO-Bn8$])Hi\88Q<hRM+p8WANdFaFAJ)J_&^7tH7rqpaKDFG=Yq2c5>.eb6RI3tUQSb(pHdlquH#YPXgm;pnD%sr]YN"u#g0A-QCoQ]B'Y1Xm**"7+)+toP85O^5r_r\pVHYD*S9?[<TZmo?LT)X*^P<,3PKO+mq:nd#N$+#tW6#>CN*__XiB]2CNNsuKPj6FJVV3OSRH.3aa6Rde(kd07NS7@qb&:A/-[.o2Kd&%2?OD>5QC@&".)bY^:Dj[6N:t;"$CPt:p9^+TbkAR]6OHdMMN"Pd$P8jLcp:KtEV:%@nLYVr5U*U=))^X<PZ_>MP%>6u?E[pH1P;b(Jm'%T:I`OsC'atIN=@mlSS^HhdhP@H<GeTI2Au/[o.O,1$GIins'Ptsl:p;eXb-`YDjhVPKO4%QXC^uCGOV.TM[N>c8FPRG*i@o&:C4KrtJkL^!/#,bXRZ(Au7`V.nR,6f1md&p$Lt*&`+[o5u02;m&J#U&b_\[!"9LJ@2>1[_2^gP1k!RCk@cd_s,.b1Ik\AD1Jp1+DlR+Ut"FLE/rgTedR#*)'n`'9kE/Y2nq6hF!_?m8[:2.jg"%em%kHO7<3KHm>=\HeaoC,!WU_`g,)-b]2q0m:C]/=MB)_\r\B;!kMs(jL4+GWYqT=c6E$]HTS3p=\bm=&<Ru<u/)Q/HraQ$^3qX*aF,D>HF#J+W4U[@o[&[QTd*6D+.4qW$AjWh`Q3M1Zr3t.L1;Ck>L*a&H:FjTXns>\t+M[SM=5iaiAsP?ke"T/JUbFcr)Od>ESsGr)OY1`k6EJ6N2;DB#YR_;3Xg*fpV]4>b^d)'*3cq4L<mC?q`,.'"*[L,ne;2*$&eK:;E1P%b%C'Wf:PMf$D`b1Zu`Q&N*rmXmhIoIrPOba,hRMhNt,Y^&,f*!os!5%L<52@4Q]$P!+aYdY'YeGL<'XmC&P/1;9HZlp9m,jS>7nS]<00/c:It\RI=0,U4fO=__)[MsRNW$Bm,Xf9A)p9fKpiPA,2Q\B:@nnptSIW2jDZW$g>uA[cLDN`Mhmj0\'4Ye(Jb@?Lr))BQ2i]o/j.mLEO#(qJ9jn!Qm=WrA&NO]rK].[ai/VJ6KqSdc6!#\71Vq&!=iPB!du="A0g]cK)Prlq"f_hU\.QH=kgfLcD'qg?R9:tV6$,QTtAs%9c26ICg&/V,eFRZPdoc0"`VXZAmjG%R7:S[O'u`)1%+LP7M:9FCI^A)pAr#)>$jCZoGs^n2Whia^T*7#*GLkFNGMi,@b)qBgO*W^K30.<n0+"[b'0,[V6+dQEXVOtZ)**oW%2r\8fJ#tl=NN']aX9jN5?lM:/CN1l_YgVAma6E=C'k0=`+45:09MP-j7OPIP+3gfC(89S5TR`Y&!6fc,_U[;kjD9;P(9STa=aX)01\LUj?I;pk4W*qq1E)Y38E.0Mi;,@n"Sfqsu"urV$n-uI*8fJ-2*6#I-=K7?0J3U]]]s,#G5SSNq&@U[g/3LUqgp!ea'if5,@an'YH_]_8`8"!:n;+A5TJ&C(gJ6aW(5l_3Yk6,(0!WL97(fE;J/1J%q:eAr$s-ETJ:]rRhn$M@^:*`M=&U'8.cI=:Se\h2=dbbMbef/k5,<Y=HiG"^[\"qK)IkA\4po(:=UTL7:PDj1Lj*q7Tn@-'`'=JP7WQ@9m7.3,-2FRL(RU@g5&287h#_9!1J/%>e^-`CS@i$c@0H_>n11s/H1W&#n<VP*Nof0FRR1/KNP;EseZ?3&&9R_A`M<+ZQZ\hE8];qrL%sZgLB6<,hg-;3?!"][N\6N=!*;1M;XA$@f&F2N_f1Y3/tGu&eXgbD"Y_=9"aVig#<UaQljCoC+$RE<L<%2/En=[5^8Cufh[XmV,GnDfI^jQLo9hdIla=<@&`1A47dSK$f8N?OgCK>b>8-Il"3X@QboEH[9mlW-6s9P/MtHEJ1'(*2Kit]$'&T6<eS@-8E%U_8Y?m/ph;(;'Fsh[5f#dU0QeRAP^BhL%q<i2L(4bh-PNCL@Jd#M,/n,;;^kj;:KcMWJQXMkUIc9q[6-RJ8b~>endstream
|
||||
endobj
|
||||
22 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1841
|
||||
>>
|
||||
stream
|
||||
Gb!#[gN)%,&:N/3m%^#j/FOe[dS]D/j,U$WCj#:WOe@M`,SYipU;--t6rB3.M`dc[`#_Pu5[\f^*paq-AE28rT1MWHa..VWi/m!I4<qnUI%&s?TC^I>OYsP!.!!E:j2gq'I#%.>&*VuUOVQ5T<)F39cA`j5`j+W"D21^j]Z:F(GBt)Vk],*TR:7>``17@]]7H$6]eI=[p^Z*3GGnj5"]"5pD^D[k$]`$?P/a+s_s9W]HB9\SqmKbWA&B3./%VHj=Z*T<kWTf:<-"7BJ"cZSR_R<P#@%'kCdlWkHF!4]rSuH$r9h^^p[l8Q1`ItfK^H`Z(^7?4%(dVI_Yt\c2mPP1oL!-R<iMC_Pf]@l?HPktofe,Nle0PLrVMdu?EHXJX--Q/dien9@H7RZZ(66Mj:i&(HpWGZ91$+//IXecM8L1Kd.r`>,i0nrA'cAL15+$-WUr5!,X6=N.#K7\EY(FbS?d>`gMFLFTqRchW9*`kl<VAnK4R,[:1r\Lqj7aL\XGi22KgN)qq?ASNlK[4Pf+.fT8itq4PN2mhF6g\XMn(:ce<JH,X./?CK&9r^U:^Hpp5\WR_!Dp#\]/[kJZ5:gh:Xe.nMV(emoD.DgC,=aW>f#^(1/(gbK--ro'V9W4b+u8#fg^__SRSfCKWdDbQ%tccW4Ks%#`m5S\[k$d(G)(G,ASX@fJ/$UQ."WrZVQnY/R5UP2s1`1l"fO.saMU-U2P8l3Z,.oML@]Z0b#[M*uJAckKYKL00YMN,BYU@*jmY5)6L]JQ;c:KXYW2*&kgop&.;_FG$XOt19*P*AL_C:uk^caum=Ajl_bC<if\7"\T=4P$SLCf)0W="A_0UFtZWPC2X<-NA3<?-84XHUKWZ/T%$n`Kj?SGRa@G9<M-\O92'.AkS!tSWfL!PQB=kr?R^RiB-l:9Vk>5<[DOES>TG#3O6EZPqig2V:>C/M%4C6DR>V)J8M^?Q#)6s>^f$d^Q;5EAq"KcOo#MH10^kqq->+-][2L@o*Qc[J14[lg7/oL:Wg,a)OfK0ra=-E.5f4Bo^qR<G\)HDhH$2a^ci-'#\4oa,0)#>\4"Fs.6*Te&uBiE"+TA"bDVP12j2Ob=Gsi_+:ZQ$(.59##17As:\tGW*_tX-5@G)CD)6!^SKD%-$tf1mM&5m5TP[.&%NRY,jAlB;cNX!+Mh.dUa>.KHBEgPYBG@5n;#GE%^k6n'r1S?sPDA"$@!!38*=En>JqbmZKjZQ*N.Yt\S*?DZ4&a>[T7Y]tpFN'Pa)a)9%t3];)m7,bU;n!E6m`PtGJqeGL,PdJan3eW0DS1M'>o0eNdBHH;Si`4Gm:CF-DhGgZ7+d'<(fhcYN*V1>r1"8SMpH6FT@")Q^o1J6'Ue7PX?nt4A%HE1)BNlkq"5'pB<*4k9A%B`I[+0Mlpf1#e4WQ*^G<VlMe!W;nQG3[HN'J#(`)[O-g+Xbls_a>1Gsj\rn',CEuKa=@5=^C3_Ft]$eZWs*b00_=7GDKVGZFq7f38(jQJ+Jo)+B!&qZJ8E!?D"5#H8G4.)o#-R)7)B,S5"+^XE-nALQCX,5c$a'2:7-:?K@)6o]8X1JVSC!g3+kD5[)AE$UZDqKT%O.&"Q9Wc0=9Gst[*U7U:^p3U+:"3R%R@0[W'EQZ5dsltE-SKUlB@ui\s@QP^-:dAKF7ef>[n=2*C`P:)fna#-ZY#6GRbe'DZr?Y*`.%f;+#f:K%8snIqTs=bQ&M=Z+eM62S+S/0>3*.==bVL(bVW&$o2JRi^_Ch:nQLASrI?*BIh)JF:bQcd6(G590d$r`3EAjWOR1a\kjRR[C`g-CaXWI*%EU!9b*LC\o#ZM);QG3LArC<B_3BW]^cp~>endstream
|
||||
endobj
|
||||
xref
|
||||
0 23
|
||||
0000000000 65535 f
|
||||
0000000061 00000 n
|
||||
0000000102 00000 n
|
||||
0000000209 00000 n
|
||||
0000000321 00000 n
|
||||
0000000526 00000 n
|
||||
0000000731 00000 n
|
||||
0000000936 00000 n
|
||||
0000001141 00000 n
|
||||
0000001346 00000 n
|
||||
0000001551 00000 n
|
||||
0000001757 00000 n
|
||||
0000001963 00000 n
|
||||
0000002033 00000 n
|
||||
0000002365 00000 n
|
||||
0000002469 00000 n
|
||||
0000005540 00000 n
|
||||
0000007643 00000 n
|
||||
0000011132 00000 n
|
||||
0000012788 00000 n
|
||||
0000016206 00000 n
|
||||
0000017113 00000 n
|
||||
0000020525 00000 n
|
||||
trailer
|
||||
<<
|
||||
/ID
|
||||
[<3901e7adae00e78b141451dfa9fe1603><3901e7adae00e78b141451dfa9fe1603>]
|
||||
% ReportLab generated PDF document -- digest (opensource)
|
||||
|
||||
/Info 13 0 R
|
||||
/Root 12 0 R
|
||||
/Size 23
|
||||
>>
|
||||
startxref
|
||||
22458
|
||||
%%EOF
|
||||
251
01-design/WRPS-CTL-002_Functional_Design_Specification.pdf
Normal file
251
01-design/WRPS-CTL-002_Functional_Design_Specification.pdf
Normal file
|
|
@ -0,0 +1,251 @@
|
|||
%PDF-1.4
|
||||
%“Œ‹ž ReportLab Generated PDF document (opensource)
|
||||
1 0 obj
|
||||
<<
|
||||
/F1 2 0 R /F2 3 0 R /F3 8 0 R
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/Contents 18 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 17 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/Contents 19 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 17 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/Contents 20 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 17 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/Contents 21 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 17 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
<<
|
||||
/BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
9 0 obj
|
||||
<<
|
||||
/Contents 22 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 17 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
10 0 obj
|
||||
<<
|
||||
/Contents 23 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 17 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
11 0 obj
|
||||
<<
|
||||
/Contents 24 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 17 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
12 0 obj
|
||||
<<
|
||||
/Contents 25 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 17 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
13 0 obj
|
||||
<<
|
||||
/Contents 26 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 17 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
14 0 obj
|
||||
<<
|
||||
/Contents 27 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 17 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
15 0 obj
|
||||
<<
|
||||
/PageMode /UseNone /Pages 17 0 R /Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
16 0 obj
|
||||
<<
|
||||
/Author (SCADA++ Demonstration Environment) /CreationDate (D:20260812052555+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260812052555+00'00') /Producer (ReportLab PDF Library - \(opensource\))
|
||||
/Subject (WRPS-CTL-002) /Title (Waterloo Road Pump Station - Functional Design Specification) /Trapped /False
|
||||
>>
|
||||
endobj
|
||||
17 0 obj
|
||||
<<
|
||||
/Count 10 /Kids [ 4 0 R 5 0 R 6 0 R 7 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R ] /Type /Pages
|
||||
>>
|
||||
endobj
|
||||
18 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2941
|
||||
>>
|
||||
stream
|
||||
Gb!#^>?BiE&q9"Fe0@*i1mWMRHhN#FAstmLFG=>P^@5TJ-./f4,MUTCq^opV3-=L(nEu^A+gGRW8p10VVI8<meUPI>i:@k9\Y28+X>`Br@_qmN^9#Z[4<q";HQE:KpmtpjpusKaZJkf71Le8n=UMTiF3LQ?qE?W>K0fXJkn2Z[mX?^AeQG8Y`J$k&DeS&kZRstcF?J=t5AfOe']`:HTFIe>(!j)j14gJmE;o=!j>,"9\Bfa4Q;s*cWXML^V/QGo<>qm@5n)AX&DIn"3=j(uK_g^)Yl4aU5:I@oF=c/o*d-:?FRGKrMlZO,KjcZcHi=/7^#_BpQp,LPgT^N0kf+MYr,<qD&^tbO8!CM9MMap.aWs8:ajQoJm=A;>Qe.Qgs86W%Vb]WkBu8?iplTAlW(1]J87rfV3RHW?hbi.q&r3kUF\P2Na%%Wt\A;e5%;7?C^^CLQ57_mNJ<oIR2[lXc9S$&P$R=@f@.Q?"VUaj>P"cg%epO.Pe(X@M+4C[3L`+4PV<59'Id=N:%<O31n?\FLVk$S&RjqhqLTrs64O<c[JtcD!jKSIEbg?7<LXN(SoI3o*]q#I[Btd;/9K?gh,>W5mVu[UXFV\$#ef_)X7kP%#Jbu/W]_Mi:72b\_Em1cpA&aH475#IrR(?",'$J&r0qW:0!=$YKL-_d"47eS5c;bU3"DsD1m!$mPYA!SRkXh83Om[RE\[/1OH+?%S8i'A_OEOcDX.f`/0^#fG=`:'.c/W@/q5YfeIZUan0_,bPrF<4_Y]Q^mL\3C,G+fJN<(]kB:VCa8%hkjDUuQ*+>$m=ACkn#LS\9B1D+/8>r<&ec$m*9gV5BXS`gHdS.#0dBe"ql\2_]`-%PccMB+W)>D43s]l`_ma`&/G(k+jpS="1P6LNV"G"F1SOOcMu!cKAi9]9GDg,`d\:\s+nt@<3'pg@=Ys,;^u/<5UHR,^Gg@14'q5BtlNq]dIL&Q9#h]3b"/*lcr\s,'kIZV?ili2F<?OcsjeLk@3Y4^t1&,\#4(f/rCGm:%s-/BmTL%EP%Q(o_"FWLs`srM-#nH?[(Dtgt,4qaaA`"%qe,.8t7iX9!a/8FX*Z$.tUl$k#oMD80^CcY/7K-_\o0._R=;j]U]F@]iDhNq(N,U+j<[q&@DKfiZ"$N!m2O=8%oA&6rln#2L6LidSa[3'JDns'AX-8Bm,:HMJ@c4Xf+02!tjQO!BPDe\`[C_+rq4d*co:#NttQ4gcj/,$,VeelJbs2]<!Jj;b?%<ioWcjQb91ai)YO>V"^7u8>O<@PaU\0Wo866'6.&`q<k)SrQkcLo\n9Vi#0#dH<L'65pV=q.lgu#OhBEK[M\.<>*''5@]X2tLUF-TFN:(T7&QG]Q)Z%icUp_[W<+cQ2LlSIUj5gLVY<'b\Ob2V)/Jq/Y9g1YL]S&-@ub/VP1#g3p_&6A,t#d5\7$<8SrYP4/F[g2_B"[e>_?csnZZ@hS5Vo8EkbbZACPFaPtJTH5&kKu&0Q\p&2d++c3%4"(4MRh0+\i5^ZTTeMTd>$_7u<MKPgMh@;kju<Y))j"2?'N,oV2`15L2#nP<>'dqcXoo9b4qC7%F0k?H]Dh#dV+_mR\"/+#SMi8^3#TBI%]0oRWim&ej[5I9RY;QAFX'Wm$6a;9`M:`3lI\=RE(;e5(<GKB2sCdW!JDiL]Z?_LJZ&`a6On9Dh^^Z3GCX?KG?@"Mj]nkh7&47a3A;`dmSZ<>,J1X[=_9%i-KoCl&EknD?3p;`8T7:Hpod62eN4!Fg^T=9fe]`0la$o8N&at2UB!M=uG%uj/lkp@iTCZhRf4p33S:0CiZs#NjiZ]SON>fB0Tn66VnX*qXo(7<$mAE<5%^jnq9J,@u8g@8f$]K\7\+QD:d.)')\c1T^0k)'*?0't$W$/2#.C7@t*-/-[CnBDp2j)j):ZU=M\Y?S*f>5]o%l6``Y5?ObcgW;`LoPTVaP%&n]V:/8lrl3tPX.>l7ZN^RjLpKcEM>R9U`319E;RT@;Dl>Z)MqH&WG!u&(/51Mk+i_[t)Hs3)acd3#%u;2@UR,s/0n82&?2#_ZPZVl/O-oW_8bgM&r5G-`LrL]&SB"bL`"3)`Pq8B?^Onf\<91rp#o+WT4CZShM5/,I@j#q5"0H`4*5@4d=Ggaf&kF*MOOpFEKbuS*ITW*0#+B3JU(GU9'er-ZDZ>Rb?c[%?,#;uN="$bTr7?X:cpdoT!3JS;1Gp"@d6qr6/RSot?l6TT^Z(s=,!f&t'Z:`i]nOKm?6Ck`**o;Wfa\?>[28$T2/!?F(FV[L`HA?91sbE`aFZE8=aUWBRAB.P1n>C^gHGrCI$tS'@FgsR4+sgZ$S-o/.`"<=j57FLK(tjkQ1d1r3Gi7s8MujuLpbmnl5!FA3@[D(`^PQiB/u:ceH7.0JY0IL!qut2=.u2J(tmUo^4:g%Gp]bM_'/WK8L-T*Tct/'f17s=bGZQQ23?4l;"/\TJjS49X05k`.,)79HFLJt_[@-0&0YbkLS82@;]nNb(We[T'1mbk[0S\'I">,8YS(LhqSt7+@gp=3_+$+JTP?T9)P0A=5Dj):DoS\bS)K+/Vd?8V]Qraa;1&eo)KS&\(bOCP"3sASh<Ur4[46\.L!"25?U=H"`W?7+l@u:8=eRmQ]'G2m9nt>"4[^f#Y_T6S515HZZqKS/H"$>^M,%#+;S;?bQo63+NOUZA?s$8T]*V17I`o=7,9H.%AX]*(cW)\c7?&d6hRCkVjaF3KPN08^F#bSd@>NE)na-U%kS8nl.E#A_]*)W!fAWfE&6(5=,tsG%\t`S%D_5mYnM@8B<:EdU@_In-*X>-eFmcjAgW&bm;*XTLeJAMa"QU:j3ZX0Y@CG?XW!2Lo(?Qfb2ambT@!)9j(Sofs]!(4uHsMU*QtW?A=3io1AGWmVIu`!M_Q.ihoS&S)"'!KbrH3A\$AipN"%]eeT7TH9%pgJX3;Y@E%#gS~>endstream
|
||||
endobj
|
||||
19 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 764
|
||||
>>
|
||||
stream
|
||||
Gatm89lldX&A@ZchD%`6<>#q#A"#5K3uf60R@^Ai%N.GM^rbL&U0n5<T(HN-C^[APqtBD@8V#87h#FAU4sfuK.j-+#*'uB6,f]#cHh(:[[4r:FL^a#&)?Uj,NPu]pBtS[JF?jUs&dY7gq&pQQTRF_bOl;e3`6oT%6?4?=BZ-QdW>.kq"%0>-e1so'm<W^_A#=Se__n2W.)QC)hp^GjA^b&7U`&=LC4g)ip-hniL>-RY)ICl*2mt6f23o2n.e7'1G'lRGLu`qS@=k7r`/Fu>,Fl`#3P/&G)<VW7fOnG`ga=uK,8M-@e[,O-gK9)8-qV=('r\o6II4VJc&ak910ZVYf=*h.bNl3uX,Dl\]<.]`[](c]pSTHSC8__J*obDm[=t,qgf(\+/qMgNe/.`m7&5u3$kXj%.*sB:5_'`MNhKH1q5L'oap;TQA2"\8+0@t\mVs';[A-K1g^-^CA[]o"^-?(`&`[OePQcg^e5T:E$0-X._%>XC@IjSE;gujtWoW;lU-3@OefJtm&60629E-603!-`=/aD4,<.>-#r6o>'Bq)dI^C6U?l)d$KTPqKU]:0*f'PX,c,`ZTuUO,PTP$24h"mIhhL],O70+UKcd6CaWj(f>L]"Zj6Cj$-=QD`KC^BD[XLFqfaNnIQN$$"du<Fmt0K'tYp4hc8;.<eK`.3gm=H[4%U303M\n>Vs?1CM39:@+0U2a<,>%rL*ip<fd_Vo)2is#`I3%j*KLLJg;-CS-ACR.olbmiH^<!=n.&IK~>endstream
|
||||
endobj
|
||||
20 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2941
|
||||
>>
|
||||
stream
|
||||
GauHN8U&oY'#*[5e58e*"H=Fi'-iRYcD.!HM0ZZ,!Wl(.*\9,`.\'j1<S^bk!X'f3gQlNGpTM$/Wl[NF^J+S!@t<IgnEYE*9S<!RR%YA$?GXD.2rAKe>;[Ek"3#:$<Hmu^dVQgSa8apC-G8+Z?s;3[\I<<+<HMGV&;-rDMWnetq_!JuRq`ZW#N@LV[0F'TVL^PhQ@j8=Vl@32KC#!1Y\L)\.ZS6n\.RM)%(C_5"j`o"Ku_[Ni1Z,(n5OX$QmT%fpLW@5J%Z-EnN;1oi+^O9E#\YJa%rr=$L=<u$_;DKdo@B"gF);L5!1Fbf;jV*C&j=m!6`[W%L0MF=H9@!>n!0G'aEP98TPU%YRF/UoeFcc*l'\Y+Q.7.j@*)kkimQlDY_I/-gu>$#dZ@EGuC.sP)06_R&Tc1H17Ccka`<8U9s50Q<)2Y1)/kS/nt\A"&n`@_<GT><%@+=_QWF9>+nV&orXq'k<5_K-dN@%!RH+nT3pJ0'_gnc%7QIB@&.AD!M*Pu@%f&"1G&]_q?"-uBFEa0*5!7Gh1c6q*[]5G2M3A0F9kPDW'>qqj?1;G,bloMiVk(qaUUE80*rc]q_Y(VNT^=CFsqMR*`i#-I9;aM+$Qs/X,>;rfN$>e%)>Ya@Ro&qSN+H*RYj-1L;O_GE?/.8HGfo&J%ee!`"EqrgT!M*CFm(p%q)?t=5g3B"\T.`@THKk,(AV-6(&W$GllNaFh)F%R.1j?mk9U>ZVBfd\eWo?MXM?2;^WQ)`[0685C)A?nspRcOI(=B1=WCaF(n4\_6PW?46[sIPF%Ntogg5jDn!k+2PrV^12I"IZRn_Xd+MWm/(0G88uOXQfUqA/)'YKQk6iZ%-?kQI7GB-ZncJ"O<q74X*!MA8qi&m9';3gElP=%-q=Qou6<b?n,ZFfb=;mqJ'^q5@hB7^?(:#\e#cocfMd3j#(LH#1Nf!O^7t=@JoojSdm9Xt0^T3+1l#E0gLpu1@egS\@4"JJMAX)"$A'G;#4_#a6;\B#W=uhc\iC4"RgoJ47'h4jH\eOBMUJVRD_>qVH7gZ7:M%5RJ%chu^.HkSn`Y4t'!.4Tk'M=:^Y\uriL:<r'$Fb!mmMT(o`6m<_WY3Is<u,+C8Ed_IfL)CtJO&D[jsqo,!CePsEXCb](:#@*QtKp%=k\grR?o(dD7ucfHN)2_O:0W#=\(rn5#s,tDh^mN-,c*))0h;+*'jjV$m.j/<N3(C#jM1J2S@7TSd@'(IW4uPiPU6js$tr^E?^9'qj-^pD>0k/X[>!]PRPg!=.kg'JeVWI6KKAE+$ggY0Ll`_q^bFIYW)]"%6=!bGgo)!Z[ut"#5:a\2MeI<7(BE-%1u-aM!LEOeZA4$a[PcS,iO.`n:/gNq-ajU(&4@XO_/7=.'kfAiDaecPu'k'p@cVWT#:F9r:rCB%3$K1`WNh&Aq(7;VajAW7$Gmbo\E",U1lOY?6_Wl9q'IFdYt'FmEOk'e(IcO1%AL-RSL<uTBZX*m5Em$h9\6K4Hj5SB9mg6GFWn41:2M4p:>E.SXiG/Fnu2t-kW*l9W<,e^GCoMT7[H:C;1t3Cf4M><\p,?e6+D>.M%\U*e^jB,sM`lHTCCLCg/Wth@d.0j)!F"W:Dj+U@a0;3G#l#/1i=Q[V[rr5nY,*$n.6B,_:(-,"tOc_iA84aIru['8_+(XHW[jo?(=.2%#I5VbJ4Wqa)@-B;\%QH+2_fR?uu=/o8+7j*/?R%-6A`fGujMlFP^RE'/th](Yh3Rb=n<_ll_-B3fIK)LX1l*fDi.KH/^V3l)^A2=E:dr45L]s&Mpr'uk=.bnSJAWrgI*7L1IMIN$7;.&!`k8M\Z:($9As(?C#OmJP&SbFAgcc7#pgTM+Rl,-Vk1T61/gU@KYb(ACI1GU(YAeJY2>+ci74]hbU5lGtSf0=ldApq2g*%cO:bE"YQ1]%EbWlH4'NDBi8OCei9O9h=)Q>k(`?2'HAm<$fN58#.X13&"u%DKFU.Z3kg4056GtGV-rWKlB@bY%_sf"$mCnM)4ph([m4Bl].];3&4M3r:%IZc66nY.Cr<&^Ytuc@[bU3`[_=t0,!lfMbHhYN5?a,Hgi[+:FX-#IKqMUH!a`TDEjS0bp]"e3W*.*/b+q>06U@*70^U/@?D9&ZE[b&fU73*b/K:-V)h)\<BSlmQITihVn0^KqkM)N_rabI1:of;)kKc'V)o//-ZSL]j*?Ab[nl#8_f-'*Cn5*!dl!;f^q6UG8SiRG=F$;^C:<_kl`FTi]bIoCPBMfjX)o!?hA0["[&K]p27hc)e1PO:04BEOn<fCYaM[q9cC&dt<200F\<RbF+[c,DWU;X!Aes\Rq>rZhm*4VD[:Z26pLt7n-b$S`A*U(sfJ^)!>kP:laMq?7Pnj-]=1Al8OC>638_=kc]FE#nXt1_,h:#rE?>7S!ZjIO"qTD[$ELC[)_a,4jepMW;M,7jp'^2/:68@LQLIiVCA+mg5#g2/Z!Fi'(bdPFJbe\Z1K=_-%(7@DsKVVld#c_2iQW%7/fjkq3gu34(4!-VL-u=.u_D*rF5fe.`'F`$q<o,Y"i$%-90J2mRVd_43n`ZKqSBf,ZXj8W<F&UNR<C-#\#\oh,;<#-(eEq,e5/!MB1"Ku&Ca'C*3Y(Y`WdP3b)['o;Kio21IE.ilpt`E/YN-.:H`sH+c+;brP1Z9`J,4h]fPKl51=@NDC;(9VIFZH_I?*q-l*YW8XiI+s_8=rkOiZ!>;#5/jK)1.@eP%oRoE@"6C!72s+T)+!c[1h7$is!r'"gP92=LDpoXj*V`\HHF-*gL/UnEJek^Are<m%1acP;]Dp_Pq_9VnM*!AgMlHZV(<j6dr\#rT(>At9N44]>k1_cq`IcW-k7RolrKc#$D$X_rD50<6S4G8%sLn)YS&0G6f3dJp@RX_[O:1K?M>N]RdOoJl[LDuU#[+D&o@a)C_-kuW4aB9FDKDZ10Ue_AU~>endstream
|
||||
endobj
|
||||
21 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1082
|
||||
>>
|
||||
stream
|
||||
Gatm:;3T]l&:WeDlm#5V/'4)/p[+FARWb(?"dmE<cX+Dd/R;n.REMf&9%Z<pn"B%b#)m`%rH>sS,fG8]S,;Ze#5E<C5MpM>!]F9@;%UQU$,:=hhe#0kUf%8G3)qM'ko#C)P-Fe2(.e3adi`/kM3LAjVEpS'%Q2=("]C3<fiGq8etF@rOC6KHKD\&*'KM*e`MTOIBuIjUg]H>D3hRlJ"%n5%XC;)SCXH2&^rg0kg`>Yb=LVF;)@[(a4m:]"bUWC<9tA`WI_`VOQFWXX'5YD"k)E#BKG2Ha:cq=pE)q2K`V[o#_3b4)i?R-:QB+!2di_\S7:Qf3>K=QE8eNTZUH",oe/qD+^]Lsa6@lPl9l'WXf'dN@gq8&^Ak2f%>,,l_mE6eIC8g,iSDr=84+q:Si\P_h?P88L[9+dJ.o&Y^:(/Qr'gt;_T#M`Ojji<nV;42KWO7lJJPrJ!"XaAe,&H/\Qk+R\WE1#08eZj&L1JDkFD/<S3I@>)K7RufW[Y"LjeFSD=MfH>gQVKR'h6@1P,V%3^)]h(B8nm)Q(T*Grst3`!T#G2(gaC";+J9_TKI<NqbTX7YNH&[:QK1+=l:qSE_'gQ,f6Wsd!@^@/M,MsjasfMg-($OeG!XIq4Pp>+[((9$>B-9<P^i8&%(I>A5Lo+YQkW&ao=,Op3Aui[J:jOR\L8;VQY74!d:o=2R=tYZt8>rq\Z.3Cp8Wj-SQ'%>DDiODX*ZW"W+a<VneO&MQV/;6H#?pW77\u]Y_n(N`Gk1'p4\!C?lODQ-ji5&NZ&Pj$R/9UW7^1kVTRs214+qTf*)R#Gkbd8;Ki;'45Bd6GtO(Zr`&3F`&pLY]8Es2L]sA>@-@%isoms\YAV3LMdjO%2gufgCLTa.(fLi(]0rb-=en-(ODPVDR1F"G7*qi*3jNt*`*Zkb4g<e+WZgi5LNCXgd-'F6h/-:kth/']m(EQr+1hMUN<nnrY'HBGON'$8trR<M$Aa"<7f4Qa1X9&`\&/=8Et;^+88Mgp+UCpi]_^=Kc%#cL=6L^R?\e06THM/^(P4G^akY^PbnlF$NbfFV*;tq3#qt`1B4!F)eOR%6FjQg~>endstream
|
||||
endobj
|
||||
22 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2964
|
||||
>>
|
||||
stream
|
||||
Gb!#^flGh,(4GpYgde9s@L2ClWdaGZ-=]h_C)gG`H-$F^5nXfJ%?bbe?U+::M^Va:m;Q<o<:#\hE.NYRS-+q*M1:rm)'o94T>UPe%%%4i'em[I@/^K30u*MT_XL8Y#V7[B0JMl*Is[LM\8_Jo$c@\=M\KD,gT6Kf+,5O;Rg]pKmD*ZCbMV-6iSgN9iaYJ8'/hbQh/XMUg%GIe)h5J#kV,hKlG/jVG#e[n2/ja!_ZVU,n5?2EbMYSE9=V$c*$.^Yat/5aI&tbPrl\gH+:>YSi?9#">ffN$nIF^=@/^O.TkDDc6R-!Q5Ho3YpFuJmrb5u5(;RW9_KE&/%g+mM]YHCq4pKiV#(pP]Z3%pe4NGpJDMt5%93>a4Q6OH!U/^N3*e(m'E;f++KDQkK8sQ608B\nDEcFGKk$%Y*meBt9g["AIGJ!8%=m_f,Nkn%86n]]r?m]26)#iCL.MHX(nG]353g<9AIH_X=Tdl\-&@%#q47N'%H(,]NMp4'8E9\;pnhQ_cD-2)k&$9Qa&3VD'W@6\E,GP]IW@SER<GK<d$*jQ9j`-"R[02mM75"(">/j@"Xl,lj`!)_bU"JioL,:E3a#GK3)ZaZ</F^FLX<+iVl(o#B<`4dN0k0N^BNVHn5-1N<=[n<5K6s2=Qg+@ZD%F8OE">YOIL#@dD*-*9JS_7:0-h3+^l0BA".1fbHVacE^Kd.Pgj4i=^R4\Y]'RkU./:X%eu>!9Y;FUYRa!m-NOXtQ34_`>1,'&?Ila'`F2T1$pMIM"dY>E[*#k8TkEe*#[6IR'jYGtV=>W=\EHfB_.'Al#W)T)L65m1-M>eM[*HuJp'fOIhXRe\NB'Tu@FGfX#-$4GcK\FR>J0L'7Meq/-1O.gl'UCW052#,8R*aP'=`,L&2ojFY<`t\pl+BLd^a$;PX#PG?"fB6eWfej_\J,].CpHYJ)R]]J;AJ:bB:3GMc3RdFaOImo\4eX)67G>D/dmqm(F^o,J/8f`&o,oueV2uo!<9ochbN_q8+SAII%hQc!qpE(5n0uT1[6j^laG47qb;=c2Wt;#CXUgOUY0Q?okhT^k+N/KY?>5)kh+`MqbQpW3AcuZg@PUY9bJ$S\)&+A,<1Ctk@:pF6$bB!ehJ06B1j6QlrSu$ZYCjg8,_-JLjGQ,`!/)M3E,:32cZIF3&;Rr`"FFR=QfLKdk0kGNbJk'QP(5,MPA5c7/c?+7]n\7jdIQh(!D3)LKIkKPs^u4g#733Le'S`A3$-`4O+sj=AEQ#]$>=:S.Q)E\J/chW5f@E7]As<e^m^@4=@r.,0hB!264kMNAs4mA7_WP[RsBNjXMc"nppmZ"Hr9!8c$9)fCHXCJ0*kr4$Y/LG`A3pQQ-D4]dGlq*48/bJBCu[:Kk]d:FIh'Cdae(VQ^@Q!fsla1n:V6YBP\I,\^]LFR5/54O.1m#f@uPn*<(fG1rY$>]kEh,QMW*-<!lY..G;h#TBs7T1gJ,3us*Y.'jhDDT\=8"[,Uo['CC"i-qKN8-@jAP_bZY#cO_C0Bb&.<Ru&dfOAS\Vd<C9,oI7chA=E^=(C&?YV1IHK(9B=lAha&8MPcVl#%Oi>2=)mjts\q9lr/X\C<,T&Efl@nsDr7dX0a$j<VDtZKR#ci07hk71\*!L.$mm@@,<>rW2F$hWkO<,tHGJ,0aYu7=jCKB*L6FeWiH=E%bg<DpN^#e%l)GQ-P)j\N;ST&S297SWsg8_pW+[m\>,X+"+Et`tmRid!"O$:4h%P,8EG''\lue[=q]*&_t#M`SHJtH3utaQI>luSHnZGJrJAQ.`4Q3<J)IDW+KkJMs1AmAZZ1-X578#&Kal+VF*_"3k_RuE+]gMcoF<7g`DC4Uu"A`&]FZoLo3!eA27+Ef*M*>1nZ!J`A,oD'ltJBXqW%ZH%oBb-O,t\%cj+nd>9rGm593+fAmA4>CE8^[e=5H?+*Jd^?jVIn[s;Q?F:6&^Mc_Os0MbPFk6#:s$k,Vh1LL5BA5U>I%J.RW!'L1pD(a(LJQTOK3iVlcQUgk<>M2km'T";q_,DGd#n0u1NqiXQq]9P`)n,AFrE*d`O/6j_K[Ko>c_Sk0eZf8-/LqIUe>U/&/6@LbI,D3/`V9Zk@M=#qU;h'anSF:NfrqXKZVpg,NJ/-T2ZdZLbmL6IFCL&Qp8ILD$nlpR9dX,a_g?i>q0dk;TjFtGIN!uj]L!Y%>f=>eU&!Mgc.3!'3-T+/oR?M;E0';>`'9"if`;s>I^X[PC.e&;I-O6=e%QCmn[QbK0X[,8J(K^$LCX\W]2Ru_F]eLg_%\V6AtH[o9?[Fp5"!Wf=B-9$km72U4:&)?`2h,p$8SE@#WIbPM*Q:7^H.:B_Is(5u_JA(Qnj%k+GmM=(P]P*f=u381gJk>UQAnU^%J!#g#-$`VD,p:kEB]d"bgWE:e$o8B!Hk9X>mZJ!1[c"O[Q=317H5g-%V_gt^,@Bkc`YO=ug\Pc*LLM0N!T=VG.DODT\L;SR0"pOIagf5_#Ms$R0b#f$4/&bn:\.rqLcM!5JpWViHE&L9g73Vr:IQ$-"V^7h>I3,o\!XaO0\_Ah`$pC6fO/V]N9[&S4l0S9Ae.a'WuHq-RNT@i)H?gj1E`6(JUM[@?;iDgtBYG=dt6rYug.:u]s37<qnI=]I\LD%_rCF!L$22JZ<!SP0kA316FneL$]bBl]fms>,Z+"?fm#EQs=VL=]Q42(eeAKGo`<sYqG1+t?>7e!7sZ32?m7s**3lB<]PR>+H28X8F$br9il[>8D!6%PrOJ`<=dn)+?l+-ro*QjWK;FEdKZR@,Df%ZPkR117i4<3MADHY_&b:k-qILieTMJF$%%YTC7.]-/+QIS$:_Z'?#=,GZP67pL/o5!+uu`%@N40LGE"[!hpI3Yf==*b[mTiKRA_p5#NJbXtPD93FY%Y1@]LPWe<rl*Y?6\>iCVEf%p$2cLB\@@BS#[H.,Z%Xq67fl_";DEA8^^rNGSHPk%C!"*!/(U153bQ~>endstream
|
||||
endobj
|
||||
23 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1394
|
||||
>>
|
||||
stream
|
||||
Gatm;;0/3d&:XAWfZ.51'1j;XO(isOp;YQSD9qjBJ8E[8ad'Z5r;0^?J8p`5D9)1bQsFl:qY&[o6@n'MqX;'$Ge\pdHO?"REWn9,,$<.Kn)`WN,Y/1WJjBsGJqPRZA!TM&k5S*V%f;(a*i"al'Tt9^_LtaaJVPH-JgEoi"cGqg,sam,PBJZWcZk,7_cWRM]Q0<-'[58Kcu,[I'L?to$c*S/E:keuUoC_U\]tP,B^76$R]IsGJgoKa.X++`$9h'dXq`Lr1+u^?m[s7^QJZ-Hc7NH=-fSh_BTbK91OiM#5:gGG65[LCmbhtn5/JF9K33(*NA28\*<n1*`'b/+E>8:HT<2sA!@r#[OL8,t1&ZhB+7;>L?!fg[9=6:0<jboOlW`A9:dI*'NUr76-,_$dYF+_6,\Gl\@ZoZQ3(9,m18G%U&-6*O)H-opB89-FEcqc.e4,#o6DO[['EJ1Y@J+M)]]2@O4k#4")B3oZ//BX0\nJI/o'CZp$j+ZCWCF?*K_J*/?j9\R\N8F$G__E#]HlL2iI8/1Oj=Y[)A]gFB^piil*H3?;\G:$fHM!D(QaBTa'3F,fWMsT-EAW;[;&=alIK!3OCqSM<`kNHW<0Nq@o_4l.+pkOkABTcBR'\A?+%(.B%0t_9!sCC6fVEi96@_2V7D/S`$`RqI[aD6mfW3CbSHg79dsMe3RgWH;:Oh`TRO_=T@Ksiq[W3fXJiGA`eSE*fbiPJ2is`SfES]3Uk(""K3gi7^uEhq8gLcE6E*);)jqF1l[$Vg-KQ4jfENr5*.&Va6%0WZTCMU/#!mQ$5U\3`dTQbu;hu8uh;T<'9QG<_>C4h?<usnE45`b3\?eO`_o>'S8(W+P<#1^9>[Am*FDs>`Y*<1$e=A_Kp#&B_*G,WL35dh4J'9O$J+tr$(Q8%W.Z1b']ZTNA'5JkrdV:gnA2:QYkJ2njMq2n?2B6.M))C&+aL[qD+:8C*q?H3FMjhYWFM=ScKpA[\##)(FB1/=g7Ll5Ad1Ul.4JKu<W?G=?p$EG0Ec?ii+..:N"+sU,@ug.&^iG&Y2KESTdH8mR3(C'TKN'R0V_?1[q'bb(d)5cGS;/LDU`Zp^Xp`Rai96o'j)8Q_\kM+t+A:HYf*GUkX)=m&!%]*R8E-`j4n32BfRaW>p+`lZ-[&ptUfla:W3JM_%d['LQ.E?KE(;D>:u`_Q**`#r1F'"Y=;U161kQi(O'Up/Ft5L/Ad/%^k/k)[a+:BP@0/#%]*1;\U%l_Oh*tJu)Llo1r/:U4cb9EJrXAk$iuq11_rTuuh6?3F/36Y5kbu?1S"D+BTN<N2WRfu$8hS+5]^$:`*@pW^=-0\WG]=;hlh?V/GU6[8`j?PGP=J+R^$70,U&0JX^Z$B5r'3]+V)XOt=9!ins6rfqBE~>endstream
|
||||
endobj
|
||||
24 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3634
|
||||
>>
|
||||
stream
|
||||
GauHPh0.P_&\e!<bb_pe0a.:/4#`Wcl#CkegYM6K/O;9Rr6^[l*V\e[!(i9:9bDOrN)(]2+RfCfo?@[d$4LbKA*S3-!W:s^hL/qM38A>$\X!U^(\$DGjKB4IYe;aO@/3Z53t]4(4E*HnqWE^s_;e)sSr\"V@LtqijTIJo$p5oE]T<AH=UNb./P:O&&LM6IYb$1op?_Ptp5SM^O'DnNSSZ*qO_U--p+.0hN\H+75N5k2Bi2ZG&T?TJTC(RJNpEL^@0IbIq-&6+;trd\a^#D.40_Pha]dNj2n8YsDLRa9(uVo1A;)Q?%WJR'Y?112/loF*!Ns?CS.D&!ADfkA+*t@WP^tH&AajM.4L?*[GC9Yf\Z5@4"5BQ'NQ@!iWlo9HfC.%83WJp<K6!)=,\<*N,-P@FP(sARRE*?-QgpVs@*mm`C:e9@o1l3tCU(sAcq:)g0H2Y^*57J6AV23>hL4IU6$ZAYVi_.LAPii3'\KkJWCB7"E=e_ZL4b:u1dr5M]bs5:9N2KGa*&FKmY8pm_^L0Q6QJE@@/JE0Xh&A(Wf5b7A)l:m[Ch#GNm1lfA_E`IFK#&DX_--c@QQS;2jEC-6XmjGp.6\ClsU=h!CP%Z)]h)Vqm`p6H[^i'FC%$tk.HM[Z7S.YI"lhB#cAac7/6ttf!$1ue7Gq<l97sA8E5#E%ro<tYLfb09.9B'$"'nVMOd!J+k91^M&Or6QJpX8r)sN@Bq!$<]#]tRCFiBNl[.#RgK$[5nt]%MNr0B6au>0_F4D+cXCKEBhl?U@Pedcm5mDQt'N?OPN@:W2+Pq!5+6^f>-kq&c+6"Q*Dc8Ae7pa\Ae\t9@W*6t7Gb:q($7m`tek$%Vq,&lXrgR'_Os%;d+FD1rqX(lC/=dguS:2o_--Bq7ESAW8O6[K4MQ28;X(6?+ij?FL!ZBKA\o#V7K:<B%LZPXKPtmS1E_*K0CsX_%qK,\]4<tW3@j&>mnGa9Zn&]D[$_IampI6S$D1R]jYV7rVhGp,O`^tl=L9;aMb+sL'W"l4MR9=L3DJ.2!S,6'Acbt-/P]fH0L[Mf/UZ_ka2ZE;JU.!&29oDO+hN3h1rCir8TQpn&2BXBVR!bS-bC/5m:1]ucUfuZr-)MJ?FK<q5muM7or-Y8]JWVBVnd98g`*o5Hh_*rq<iXtD:E+T:2Vrh:DPZS\(Z0"-?2dQaBqM,'a-G_<fGmgaBTm2NS(C>AdqIl14GZrm52N3`F`W*X`YP5$[h3D_BUMT;qk)6E$M4RG"V5Ua(XfK&qmoBX!\gG(2PujmHI'k:4]-PbTJH+#JJrle'_SGJ<+EIR-o6<_9IWo?/BRWDhV>\^mD.+?nsLoi0iHj&o=Db<#":k!qA[!_Pg,nR7WGP)-&N]6K>"Wo)(?k38l=VSO,6P1A9D%NIrEC5ZGkJ;/'6"nlVF-LdJQ[,:TY.Q\#R-O^fonpETW[Uj/nY0U'UblAFq0:":"ZT-]=_N]*.6"&a_X>)+i,S8sDpm(edei-n9Ej,-XO;K9RZ6mQ.IBrF!0tN[`(<(RreZo(n_q.J)uS^rFJ/]h1jsc#8]ZTiXLc'^6BE-0)g:0#CgSL03]u9R6fJDOJPAV2.'+1*C,tpE\L+dKT%3F\<"1Pf$jkhS8R[T1=)M>dYN%1U,u00C'F*9n?PsbA%e\j6EL,=8Qf5l*J+HjTdA;JZe/'W04d(.N11&qDQ&PXMCm>_?kr3Gbn7I-HCj^Z\LEH.^o7M/:>sD]KFWD/%,[A%W6Qc,Kk/h5HrZ*%B@Kb$r!ZJS6*teai2#3%i>78Rmg4V#hmt:ea,W,Iei3=U!(uT9gs&X2]J0b@,-nZhP/&U=UPGD>37b!r*^9RlYj"fF(t:$7'70ag*b1H/?,K)@i#&N%%+':/rfU*,+WnCCfX78:!B^n)H>GoOb?oJV?o.&0-ct5.0oF"CXP_(7,&pWABL-p\4.Oi(0k9703q<dS9o`58LBq,7;aI3>fH)bJ$Q^sB(]-R,*VU!N;j`Z[Z\\[IS9"E%0HJ"jrL.og&+eG*R1GmKD-dqAmHh7WY&M=VL@>2`o71<f4,[;5[^Rn46BYXM]L2Mm'tHZ,&2^`9)(nLfs>9h!O"cEI+l=#r_K^.4&JXUkq8G*51T)dH+U$q@&f.V__.DIV/0S?c/iB'*Ng`I]$7V&a?%k=lKmN7ZVFV:Z2TK<rX;ern)Le.DjaZ\\n9H1kS`dc3BePOr:0"DqgOPEODVm`DDm-)EcRJip)D=I$%!?C9`o\i:>64K!AFJdEpW$B-Pckdi-D\n<1).H1YhLP`srqLk4H(dVBK"(KaoPDqd%2eW.WKiEs[^A_OFR]LPY-A@;)*RM=C-;!bQGo43C]5*VBl5RPiXljAU)C&,5W`/`-uH8dO:UisZ2dLjEXJeOADBRP"]?)7g)YcV6a9Bg:?.OV$r.?Pd`U@>d^5r)Vi;8!'.I9gt'$&`iqa.4aY5gYEMF:6K$l)_c:5Yb$nKJ8$piJXsW2!?K;O9ZTa/p-n)fa#<<O]'[sY%kUi>Vp:Ke'"Qh[RqEfhk\?]=bJ7fr/d0dGO:pu/Sq<2G"sbIb*CdtW,kN,"`7-L;d@n#++;rOe%+9fV$\7p">67J3Nss6cG%>"0/!ccKF>KD[SEnTlT4_Ni)3BmlhjAkGTI'eH"KnZ\12r\8KQ&7p,_Rrs,3A0'W5sCeCj5Y&<;UXU&R&j#OpsZ>9kCO`6\oD@6Sbl=!tm3eVC>%?2U1ufJ7N%7oV:HbljD*gq];gF!KYSn'9I/=P(MJBJqTN?VV75qEf(&X>\&"@&IIDiW(72,6:OS%bgDQ,YPaFY<Fe4t6.qB_D?,iWNWBmZ&.OH*"IQ&0Te,@u8-``l5rp\%!YTN_Q@8kjUV;LZ7@RqcPbVo`TJfmm;M#g_V5//hT]._GRZ)o=-?LMd1Ee"egcQlGraQ7KOJ1*^6.(gad#egdJ;e#H#0H*B1[Blg#%g1h1,'@SP(CkVd!>;f0OII>PK]81'T.X*#n8=L%>_M">YddT30P&A&C,rhKQ&8k,_VYb,bot>^Op?oBTk*QaAhDY+nn_@^;?d81eCTe^eDhZ"IQ&1)41^BahUS`8-UtF_MIWHj3oP985C\T+nnbABLiDC&/GT"$kh&Yk,+P;Lh8n@68Scs&u*X60q^Ra@%)rW8LiOEjR/uJ&]k"^BXe&.-6X7m6!d0<AO&L9/-Ga2@Ejt]UH?(s9L&?"oV^*_aJQL<3='a1a?9>*+f?C`dJR2O9f$`+[#TclBEg"57%4YnRYR,j4T7%ZCX8lFI[F?X.AS0ep)4!qTmsU2j<#86!W*YJdbJ%.X(*1gQ3$HqYRFW(B8s7Dcu?iY<uuG4Sg@e8ll$c4J'M,eafc$X+\a"%>lnm4pt??orUXe4"PCNmCeLr/.-EK%o#N"]q2hZ],^GBAe7f#i4GCQnm/;/ik]jRE\6CZ@/K!giN-,M_3[1N[Ei<.[9V&S"I\`,hf4T=J&ROaTMO8e(Hs!?T\nW:G:,nE'\ge!*/XlfINJ9Nr`(OCtg'930JZe-_HpA;4X)-slV(1[>=#r<FBm;7p5Ao-goOgOFj--1R_7<Bt#>Xg:JQ$B4i"YJfS;R*OTt9YAK@+C36%@OOkD`]FlQ:>RPVh*&QTd>i=/s%*j`@90HBWEH-LC?)qLb"3!J*rs&H~>endstream
|
||||
endobj
|
||||
25 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3137
|
||||
>>
|
||||
stream
|
||||
Gb!l"8UK2O'#"0De1oEhZ+2MXa%7U@T@<294>UW;Jh4jq_F854YFd:`&LE>Ll(E*cj@a;%"<UIDW_fVq%FFXK+o`'_JG5,ob9mB#'->b5fU<81GOY.mlJ%Tdl&P5%TXfWW>64_F:!\"@iLa2?"1tT:*#IAR^]6"n1s=>WLr$?Dc1+NsE%ch)<J0:>7t_0e$u@jC)rGJB5/%tc3bDb=O?ZYKUD[d$ip2VZ"2PShnF"&mjEZuen;spjgfJJ"bEA,79je!oW[+BI=Tfgk+eB?LAipcC&]uL#!KUUHnL#5A&'&hpbr7cR"R"`m\[[(#>NiX)nA)MPe*GkSJJDk$n*"q%#2Qs^#-Xn7qO2!-[O\&#/W,Fh@%HGaic1D$A_p0qH$f/Ak3&@4mdjs>nhc2K;P'MDK7s)U@ij[cZY'bsYK%a+G2'tn>>AI.1BKL#/Kn[ZFM'<co]Ir/3`q()b9sVr.#4aMBBU93SoG`.c7M`MQmJfmBE74N@,"j=HO.&leq5YId;TL0h7unC2Sd+K%\aPYT#PaH.kGt[jZ-^)n3;2#Q.Yf;LN:;krpCQ%66sn0MN(aa6;bUShR$]E>e<*/a"oUM0TSIhK<bN-f(8C-U!Yt8lK>`l-+7`*^*!-S0Mn)9#JC'#8s_36k:;NmQh*!pPO3T",(5d,9JXk]3a]U$f:9S)#%qYCP07".K=khWM`KMc+K0"K"hB2\&G5"/c,4Q5&OgG;pupJJN"`E#?LSS0'LA.FCtKF3_GplUQloF`E46ElGl\oPCC_"-_[Y<89j:d?=kF'#ng]2=%:@P`]S</,qMJfKRDPkUNi"L"MkQFN3AP]Z<J"8C9OL=-rkBag'gGDjHtBMk5=EF%4"(3BQ_^lW)#6O^a;>SAX%[0o:_Nh/@582tZ"MIW&GHRU?YUM?UoT/cR>BKo`+;IN1Qdna@7`Gaj>c)nb,bX:U>W.Nc7oW:A!f]=_O6`jT(JsH2cO14+N>^giM.l&=Oq/qm#sr.+aJcOQmI*5\C(apN#%.J>Xd*2d+Y]q.s+[r@Y=u9eZ]+U$>h%tcXZV*^-^'EDo.hdh*l^F;)F25*`#nPQ%;_5]DmnJ(,AoVQZTaFC*l.lF44*$&gb`!0*_i8BA%jY$.G1N^9FEM?#5rtHOY1kh^Vrs`L1k:Hk`$kVu\;V,0_GJTaGlW$d*'BRt:]QF,km&iP2Rk)&6@f<,b+2&+O**8!fH&OA.'Ifm]^/d5;l_;57QA9n@TF;-p_kT&">Um&n0ENdJn6[aF[B9mG1t_`o$7hs7-5>BG-pF5*,+NGlS0]J7jB]r`A>g3`&Mb;@865G6,/'=-THC-aEGj"1*_[)9@iJ&VuU[(h*?YJ5M)4l,otnF`GKiOg^;f6tVgh^Xc[PJ#GHm=_K^N4+iEjVdpkg^+nM=ho`ol+61"/j/Q@'l=Uj:i'eWIH$"j;i8CRKm/+g9$WSdaLiQT&r+[X=o?81'XfQm\-A!g.]Rq*%l^K[6/B.VP[:L^QNO0JPjF)D(9FPV]B'l:8Z4*f73l6ip(p.<@F6te"WG50U>imErGmoDj"a2dTnjuTV2h^>g"EU3'GHhd+P:N6DSLuKJKA.%P1"khR]L7u:ks$l<^9-X8kKP1:3.;tCQl-,V-:X=S`dVsjk\b0cn1DA.kmJ^-HF&aDG-P1c-,*IL0'.K;U,t?ZoR&s9jkW[Ze?b#4\?ZR(>gA.aZ1Z&\5`,^#fY]+a%_6pM`^%XfB^h;Of^0(,:Qf_V)U7P):mG,9(A02an`Lt:^0!<Cjmul61*s6'<\/uir^L.@S#*d-q0(I!M;^'9i/g48W9chG08Oj;7NT&OdcH,%2FZ'OkO:IL.p-C]q,fPkpOkLIA70Z:1=I3+$/'2EML0a)pP&5KNF@H("5>V`9`>#9)%7/PgZp7MG]*S1*!2/5sJ-?^7pX]_31-f.["g=0uq34,+'8mRC]5h#ia1#k[;?Wc?!O6UMDh^9-NF&^1LA%!Z?6Ok;\#ZaEsN!U6I)CQ9=b)BFF(p4Mt)'r>uf3eS01"Q0\-Ua(W@>B"m@=XlX,cU(a"kYei-IRYg/kJRO8"BNR;H^t/E<kQA^0U#5H^a*H)aA#lWb2\?'rAlQVh%S=C4Uj5-@On]N&_$&2O@GA:NQpeJ?7$A/ui/@a[#Zh4Xo9<]</`Su&#-KZnLsk*i[M;gcQT`F3N%;iUalK=<Xq9'`c.j320F-/D6FXV:7WsO^iLj=b6+=nH248Z"kSFZq^q)9hX0m%r)X#7nqi'-=eoH5Kr;?B2P`1rgT:&<Y6>0jQdg@7@gbU,(ejQF=&@pql2M]=r9pYc'lI)<Do;:Z[hJce5=rHr9BA2mW%+&m_3,XHuYcJ9-r=n!d=S)L>j<@X8+?u$/5'GeaTiE8Mj_Ho)rp)>G.PYpkTK(^EL[N5`#[PmuZTk;5a2P0bE8I1$TQ;[[Q;-krb+NUud8=d6'<DViO\7G*MfI[8hB-]'5\WBq2-J(E;u5u=R0pbNb$JC$;^%l$Mlf/MgJOp]G)T*p<UMLfM;S\Pq.",<"ZM3(<LDqTS<<I;:J0lbCB&Odr;ZL.6(L()VtB)18a6'MUZW<_LF4FFkg/iZR%?6YGC#:>b(efC+ntpo];df\,#F.UjUd!@X"3iH'+PU&_ttjCbI;3M6]l4ikK0^I<d(+5aAR-$790J:VM]KO,a8#Z.Jkr/n[ti.djIO_[XjT)22<_#mH[6f\'?V>Ns]qpZ%$Xb1f?;Mjg\nH+rP4/El74So!K05QLh4LX5ZsDQ3T/6W=hWi:W`/`4t"c`P^BY"r?t9D'N?6(g`5VW?-0[,a&-uDAQ^:_$+I95Es`%m3njV,K9aBoKTcBC&V!HCPX3!@IshG"2*9&uKrg@2AceUWEKN1cdP\NQ"kGD-a\%#k[>.T>@27gl0:\,*[Bu.Ue//,iiTU28X+=DG7<gkcF80jZ'-g*86t\pi<Pbl8`g,A,,)1PUQW(`hm(q*6EJeZV0=gYb?!:OChh5'\it4U_&s!CZf#4kApY\;>^1j4Fjq#UDE7O\&>4hdE]I&%@9+`43[[Nr@Km?$I/Z-r>-aDZQI]6O'Sp8=Q*VqrRj7ta$LH!rI2tFR3;.L96O1+cTnW9Ys7OLI^VibM1WB<cg7c^eBmtEfhQgf$^jtEWi"]t^++\pM1~>endstream
|
||||
endobj
|
||||
26 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3482
|
||||
>>
|
||||
stream
|
||||
Gau0F?$G<e%Xl[,^gjg:.&+G`DeWfq-[RUCR^d"%'oB@V,DiQo`D(i1!D9*J1j5*9[rWHlUa8:E-#`m:JW'PqrgVL>5;1sS1BZdU@L4T)!a+6nVo?dH-Vj#_8`G:7V2=N9p_e?s&AnBq:7Mm(-Ok_@c?Ujk3)(DXFrAd@qM>k4?G%5Xi8J4.''"s"-66XT]GCeIA3W]Ug%ZG2Bu$BId1'p=e4<0dcp:)s_\u:bAW!s^&9';.!q*XG!tQk[V.ed,5'K^r?aC)'E`oO`GhDMu>aDr"`P5gN*>Ul%$55EcQoYP3itlb(miKcX(,tEZlN,f4-b,]%5$7tPFeU.'KBX;AZ!e+@p.AZNpd#T^>1BsE*A:eL=t"VI)QDH\Kc[BL5@/g6n7%nH:Lu&FRQ'O)<sm?J#n+Fp3Hs/66TVd<=1%[G9B;'jN<4m3;2QbF0JF:r(qfe%2jFb78\"Q^NIVAXe>LN3@)8Z@RBLn`<I@U;lf*?T`:"Jf@OL@s@"^:7^iqoC_P\qlK-D<WGpTmq8l,T(_mWMRQP()uCC22gnA9b"rjV['9r9:,;a&$Ac!(Zmbs=HahEKon;c\$G6AFMPcUD(-iX?`6%!#P3/U2'%[6O0D&hPJt=ft0im(C"=?@_n@<ZuU*.gCNrr@0(=Mpa(3G[HPW\A*WK3D#A\E6]#KW"^e43cXhFqpj-Lh:7GDRE]U\"$r0aDp:l;@.ZiOeTH2=PJn'H,&WOqpUnG=]R0X)=18%GG1[VS(irpt`YQOBj_?B)K+cS,3Qt"nBi!`d5L>lK6rV9?<ul`m1hMj/4o\2*HYLcHQd%4^7>[Y_?/IdIqD^$OB2S]BcGG':m!Vo,%MaKQ(&8+l+4Or1lPi+8_-7iMS^\&t@5b_j__[rn9@_dO6e@Rd=B3p%F@0eB2]%H')ss*DW3'$.,E8icIU$03O6>5MO#I/)(*u`6'?u&g7EL$H:kYo8@jNDdbQ%oim/U\%'a%"Y/aoqgU$\;GCfY2a.4Ads;%@,.UW<E<Y?!04?3NGTKC=CSJeUF\2Nd"6N>.ip&L'N%PTY2i.5iJ:E(/o>[HLd#U$KQ!:(Dd$^U,;T!&>r`ot548_s$V(Ad:JC^Rb6mHR5k;]Q)k6WR`b^)AKRtm0G7qSGmB28+FOp?i0jEmkT@V(mlMn-C>:4F9a.N&d_!^n[h.#dW-j-+p\X9>BF,J&&_2cS=^tjr%V<(&\U%+lA^D`+FD8R.XS8l'PhbuAoZ3fV!0RV$lZiu',og<BNUKicj7%OM<FXOMio/q@F;HN/5W(I(0*YI(@J=A6V>9`(Ok.N1CWaJG+e^OBnNqMBU7XdLr%l's+)dWCFEEP[?Z/<Fp=GE'Q'h@%?*HkWiSA'@!jo;M3l+B@YYbX&d]t7>`'&5V]B(p9)dJ#%4j]6qog!]0'4(>[$%&2)^+pp@K9j^6mt9$fsB2[)p6g"$6<0NR4a>`Pkt$PiYf`YS[Jp.4hAa?eFg`h^4I.S%W12OIN'pu,nec$HH(;6ZGDG8]i4>B.pYaU3!sOE^3hqRkf($L&i-E/VQ@BJ`,Z0aXEeT?1JiiE5dI7r<Ip!L!tCR0:K0ls*#H?eg$@H"(l7W5;aTF$Y^Qg*Ga1E66Vn?I6r5W@6%3?WOU*mp&"he(]KKRJ1X^2W=r9*Pg`W'`([ad@<Pqp1"k+KjBT(2ePVkV)8nZZ-03'4r!MWL&r$&MN">07-I1Af5_'_FGpmp92T:gZhDX<2Y#V6bG"BIPc=;E2,MHH[Z`TFZW2n!4ll_^kV_q2!S0Z2FF>`;YrPJUiKF2g89-_#Z6>DeGr(G,]C.QL,:AZ#[2G0"alG3I#*:k7[qBDkaS4g3!Be_H5DMC"*J>VYti>hP?tJF\#DPfu\0=T$G_m(73o\uYp-86Lq/#3IX)\[&*seKDEabAKH(cmYT8rYI:W6':>tZ5[qqjBh(n+P/a@(jnZ>-"]'1`,&?r_.O6q!_W^OQal"6l;R*[fCf%fDg@Ofj@i,-NB+`N3<Lt$<'3Z+']PkFlkY6/AlFt:DPd"V-!>f/')JH%l'f9/FBuu>r!B8K-XX$*5W1_IUU9V12PN<S3eM,:D-!1[N/Fr9M3OqJq>H801\3.4H,!0.Ire?0QVi;C[reBe+c*\I_E5`u8BNB3]Uss`;tWWO+\Lr1r6)1Be/5LP&--nZ(V>=re"W(Pb7t8=YCZ61W'bTBQD3&k;KQZQgkrU5qcK/i4oV"taSp%jp,?LqI#M'Rl+&1Ika!X/R;mgeCJF6mG?oQml48@o747sWGP%.M/"7]T[<s4m"0UTNrgPd>fOhOZc)<O)'St\'As<o[9'gb@i4(B[.@/4VQOY`G^U]G=4)0cSSt#up^5\E!;C-^A#s&Z2\LEXtlXDS>pi(55GNm6oWeER5m],-o"JN/[Z,\[1+g>*mAi%TT('PmOgchi)EYL:.3nlC/7s*FYBlN[\eMTHc[nJjm6=]S?&2H/2;PP+@BU`"8'6_Zo('T7K?Y@W@*"R%5e9J`Plr8=sTsQeF+3?`FG>M9t5E8/\Rl+n<UF'hT+JJ!QHmaU#imEJ4kZ,=.\`s2`(L,\=>>D`6U99G=50Z&h\&>e^[b-mf1i@=t$;\b*V5Cdl><[%/[\BA0[Jl*aIm;Y))<c6:(P7Is$VcBm>uG=/T(9e4.D.K9DR;?VQfF;Pa3uKK1fH]G2hdT1MPYYuGWANEWB6ZF9/@<f]r?hTVL3<#$89X<0(!`f0?5LWn#Ze"R]0\52<`I^Z+\\\bAf#b>E!+%(?++JKZW:tpYXOqm&`Uh##7!Y;>9<L/YWK1gc>qWHU")!kgbGKThk]>UUt7Q=^_h]6<%tF;89it5J)Y<f:B?]c>)8`dlY1$jRf":CdOP32^WEWN6Zg'aU9H2])@di(`M;=,3Mj=cWnks-*NUE>VGUt'S>YXP;lr#MD"?:1md=(UXQ4IF9h9jr@L&_L2faC#".bLKk7SRJ'K;hJc:"0(a`9TcP`LBI$TZAJ;Hh*U.uVq-aM3Jr0lJMgPTV)!4h1\KlhTA^PZ3iUI#-V:tmIH``Qn(*N*IIn.!E&%@u2$PB4sN"gt@^llMuQ<N#[O*-*\.GoPW"lI7e.>U'!a6/<E\V(DTn%CQN<H[Q-:2cPp[2*+F+N9hgdY1@-B&BEO/A'-e1f<3^!;Tsd,Qe*>:%_).biGp!"[7T@3Q8"6Vl:mQdY0I0[pK<SIp&s5iS)#gRs-IlccK\`D74I].6$:n"N9(mJXpE,_Ehc>*V,ER?P']6sOd!P)gYfNIlr,oR^9,c,Iue/p.C0+D-afb\A_GWt\]n0BE,/O`F.:+-91^K?]GO:$DZe(T?*B1g`sPsM3VVpR:0'G7qR5OrhQ8sGReC^Ofs>Q9S7EmuZN=XTMW:j#D@$Ck93QcjD(mNK-)Q$7L2MZ:01FL@(8qNtYft5s,I4)*Qb?ZC-"U0D#]:\;$UPWrq2)[%;=LVHkBq;fQR(jp2jr7Kqcn(qoK!^D5FB=k?WFl(JT1/rUpuG<~>endstream
|
||||
endobj
|
||||
27 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 945
|
||||
>>
|
||||
stream
|
||||
Gatm:9lo#B&A@Zcp.1C?9!Vu#8")9*F>?brbk18U13I>96oJKEn%0>W0pI@"@ltmHo'3pEIF=Pb`JaQLU]gHLLQAnQ(l*A@9Fq6rHh]]F4:OhLV,A:(W"fauNZjI:K^"g(Og#m++@D[ZRR*`,#pRNb";rU3'ou[<"j@0TPR&9A7W1##SkFVb#GK#BEKj]9#&_gLYV"<eMP?7V&S,"\n9`q-=',i/)lGAmPtRK%EKf,a7W>u>P4ig!^l>>b70U#o8b+E.r"C/[rWr+RQ9kgH850eVU*H2mA2_#jhiB2I!)rItj,SI6#D"4qP#QOEYd\Ijn4-#SO[+RDoMBaS]eV$Iej4%C>Le_f"Z3h4hi'3AO6i`icCM(0;`1I?P)PQ#8:H@NM&-@5mC58d\T^4\h\DEbs$D]#C"8k*b!5re9SX%4o($I0<M<b6@VLO*6n,6G`%V5M$tL.VlIXjVe16N)V=D7Ep1+b]MoE+A8)p9q..C84-*GBVq*f"5\Aq;"*!Fk&%ndQ>S?!^I)H4?Va-7d,.Fo_K\Vua79gCun@7#bJ!Ie6S`k@4a<=eT8s+=e$:a6mKY?[-=j!&XmCpm8IjRm+l<ORGpe%jBkgl/($c^-Qrrf%Kt:(s)+gq(/?9as+S>/hXoTF$5f\'rdYV6*I<jXJ1WBCNQ9kKV<n_4a<C5)B'J6M`7gH!&aCQQCi)r^&%3e7=O$Ek1gr(fPkefN^=iE*g4MA!ktmCG^#;F^lG`Z0,-9'>_9hP+pJ1Uj87DL]*lj\_=$\#'kn4EKt"nFlmD'UQV-mcKe4U*&\Q9QP?LM5UV^'"nj09I[q9RO2[YLS!a&:P.orMn_FupiEo8,8;2J:hiI90mD/0cE8@)#]A3VWg8R#pE!t^\?>&!L+$e4@)tg'kCmW6-ANIo1H(UfYKD#Dc^J843jJDuqK%,,RHLM^ZIKR\";OI~>endstream
|
||||
endobj
|
||||
xref
|
||||
0 28
|
||||
0000000000 65535 f
|
||||
0000000061 00000 n
|
||||
0000000112 00000 n
|
||||
0000000219 00000 n
|
||||
0000000331 00000 n
|
||||
0000000536 00000 n
|
||||
0000000741 00000 n
|
||||
0000000946 00000 n
|
||||
0000001151 00000 n
|
||||
0000001256 00000 n
|
||||
0000001461 00000 n
|
||||
0000001667 00000 n
|
||||
0000001873 00000 n
|
||||
0000002079 00000 n
|
||||
0000002285 00000 n
|
||||
0000002491 00000 n
|
||||
0000002561 00000 n
|
||||
0000002906 00000 n
|
||||
0000003026 00000 n
|
||||
0000006059 00000 n
|
||||
0000006914 00000 n
|
||||
0000009947 00000 n
|
||||
0000011121 00000 n
|
||||
0000014177 00000 n
|
||||
0000015663 00000 n
|
||||
0000019389 00000 n
|
||||
0000022618 00000 n
|
||||
0000026192 00000 n
|
||||
trailer
|
||||
<<
|
||||
/ID
|
||||
[<0959a6e1e8445fa5821b75a119ee060f><0959a6e1e8445fa5821b75a119ee060f>]
|
||||
% ReportLab generated PDF document -- digest (opensource)
|
||||
|
||||
/Info 16 0 R
|
||||
/Root 15 0 R
|
||||
/Size 28
|
||||
>>
|
||||
startxref
|
||||
27228
|
||||
%%EOF
|
||||
404
01-design/WRPS-CTL-003_OpenPLC_Implementation_Brief.md
Normal file
404
01-design/WRPS-CTL-003_OpenPLC_Implementation_Brief.md
Normal file
|
|
@ -0,0 +1,404 @@
|
|||
# WRPS-CTL-003 — Waterloo Road Pump Station, OpenPLC implementation brief
|
||||
|
||||
**Target:** OpenPLC Runtime v4 on Windows, feeding Yokogawa CI Server over Modbus TCP.
|
||||
**Source documents:** WRPS-CTL-001 (Control Philosophy), WRPS-CTL-002 (Functional Design Specification), WRPS-PRO-001 (Process Basis of Design), WRPS-DRG-001 (P&ID), WRPS-INS-001 (Instrument index).
|
||||
**Status:** subordinate to WRPS-CTL-002. Where this brief and the FDS disagree, the FDS governs.
|
||||
**Deliverable:** a single IEC 61131-3 Structured Text file, uploadable directly through the OpenPLC Runtime web interface.
|
||||
|
||||
---
|
||||
|
||||
## Amendments — 2026-09-02
|
||||
|
||||
**This document is retained as issued.** The body below is unchanged. The
|
||||
corrections here were found during the repo audit, by checking the document
|
||||
against the system that was actually built and is running.
|
||||
|
||||
**§2 (the Modbus address map) was verified line by line against the generated
|
||||
`03-plc/register-map.csv` and is correct in full.** So are §3–§8. The errors are
|
||||
confined to the build system described in §1 and §9, which was superseded before
|
||||
any code was written.
|
||||
|
||||
| # | Where | As issued | Correction |
|
||||
|---|---|---|---|
|
||||
| A1 | Header | "OpenPLC Runtime v4 on **Windows**" | Linux, in Docker, on `yau-sls-poc-lin001` (`10.0.0.17`). See `02-environment/`. |
|
||||
| A2 | §1, §9 | "OpenPLC's **MatIEC** compiler takes one flat `.st` file" | Runtime v4 **removed MatIEC** and rejects its output. It requires STruC++ codegen, which ships only inside the OpenPLC Editor GUI. The flat-file build system this section specifies does not exist on v4. |
|
||||
| A3 | Header, §1 | Uploadable "through the OpenPLC Runtime **web interface** … Programs → Upload Program" | Runtime v4 has **no browser UI**. A program reaches it either through the Editor (compile + upload) or through the REST API on port 8443. See `03-plc/DEPLOY.md`. |
|
||||
| A4 | §1 | "**Do not** attempt to generate OpenPLC Editor PLCopen XML" | This is now the **required** route. `gen_project.py` generates the Editor project from `src/`, because it is the only path that reaches a v4 runtime. |
|
||||
| A5 | Header, §10 | "Deliverable: a **single** … Structured Text file" | The deliverable is a generated OpenPLC Editor project. `build.py`'s flat `build/wrps.st` survives as a single-file review artefact only; nothing consumes it. |
|
||||
| A6 | §1, §7 | A `tests/` directory in the source tree | Never created. The verification that exists is `05-tests/verify_modbus.py`, which proves the register map against the running PLC — not the control behaviour. |
|
||||
| A7 | §9 | "Port 502 may already be bound on that **Windows server**" | Applies to the Linux host. 502 and 8443 are published on `10.0.0.17` only — see `02-environment/README.md`. |
|
||||
| A8 | §9, §10 | "`docs/register-map.csv`" | The file is `03-plc/register-map.csv`, generated by `build.py`. |
|
||||
| A9 | §10 | Definition of done requires all 14 pass-1 and 6 pass-2 tests "documented with actual observed values" | **Not met.** None of the 20 acceptance tests have been run. The program compiles, is loaded, and publishes its registers correctly, but its **control behaviour is unverified**. This is the largest open item in the project. |
|
||||
|
||||
**A2, A3 and A4 share one cause:** this brief was written before the deploy
|
||||
spike established that Runtime v4 had dropped MatIEC. §1 therefore specifies a
|
||||
build system that never existed on the target, and §4 of §1 forbids the method
|
||||
actually used. Read §1 and §9 as historical intent; read `03-plc/README.md` for
|
||||
how the program is really built.
|
||||
|
||||
**A9 is not a documentation defect.** It is real outstanding work, recorded here
|
||||
so it is not mistaken for done.
|
||||
|
||||
|
||||
---
|
||||
|
||||
## 0. How to use this brief
|
||||
|
||||
Build in two passes, in this order, and **do not start pass 2 until pass 1 passes its acceptance tests**:
|
||||
|
||||
- **Pass 1 — control logic only.** The PLC reads level, flow and status from located input variables. Nothing simulates them. Test by writing values into the input image manually.
|
||||
- **Pass 2 — simulation.** Add a separate program that models the wet well and pumps, and switch the control logic's inputs from the located variables to the simulated ones through a single mux layer.
|
||||
|
||||
The control logic must never contain simulation code, and must never be edited to accommodate the simulator. If pass 2 requires a change inside a control POU, that is a design error in the mux layer — fix the mux, not the control.
|
||||
|
||||
---
|
||||
|
||||
## 1. Build system
|
||||
|
||||
OpenPLC's MatIEC compiler takes one flat `.st` file. To keep control and simulation genuinely separate in the source tree while still producing one uploadable artefact, use a concatenating build.
|
||||
|
||||
```
|
||||
wrps-plc/
|
||||
├── src/
|
||||
│ ├── 10_globals.st # VAR_GLOBAL, located variables, constants
|
||||
│ ├── 20_fb_pump.st # FB_PUMP
|
||||
│ ├── 21_fb_duty_selector.st # FB_DUTY_SELECT
|
||||
│ ├── 22_fb_level_control.st # FB_LEVEL_CTRL
|
||||
│ ├── 23_fb_headroom.st # FB_HEADROOM (time-to-breach calculation)
|
||||
│ ├── 30_prog_control.st # PROGRAM CONTROL
|
||||
│ ├── 40_prog_simulation.st # PROGRAM SIMULATION <-- pass 2 only
|
||||
│ ├── 50_prog_io_mux.st # PROGRAM IO_MUX
|
||||
│ ├── 90_config_field.st # CONFIGURATION, field build
|
||||
│ └── 91_config_sim.st # CONFIGURATION, simulation build
|
||||
├── build.py # concatenates in order, emits build/wrps.st
|
||||
├── build/
|
||||
└── tests/
|
||||
```
|
||||
|
||||
`build.py` requirements:
|
||||
|
||||
- `python build.py --mode field` → concatenates everything except `40_prog_simulation.st` and `91_config_sim.st`.
|
||||
- `python build.py --mode sim` → concatenates everything except `90_config_field.st`.
|
||||
- Concatenation order is lexical by filename. Emit a header comment with the mode, git short hash and UTC timestamp.
|
||||
- Fail loudly if any source file is missing, rather than silently emitting a short file.
|
||||
- Do not attempt to generate OpenPLC Editor PLCopen XML. The `.st` file is uploaded directly through the Runtime web UI (Programs → Upload Program).
|
||||
|
||||
---
|
||||
|
||||
## 2. Modbus address map
|
||||
|
||||
OpenPLC's located-variable to Modbus mapping (**verify against your runtime version before wiring CI Server** — the offsets have changed between v3 and v4):
|
||||
|
||||
| IEC | Modbus object | Access from CI Server |
|
||||
|---|---|---|
|
||||
| `%IX0.0`+ | Discrete input | Read only |
|
||||
| `%QX0.0`+ | Coil | Read/write (PLC overwrites each scan) |
|
||||
| `%IW0`+ | Input register | Read only |
|
||||
| `%QW0`+ | Holding register | Read/write (PLC overwrites each scan) |
|
||||
| `%MW0`+ | Holding register | Read/write, PLC does not overwrite |
|
||||
|
||||
Because the PLC rewrites `%QX` and `%QW` every scan, **all commands from CI Server go into `%MW` only**. Never expect a SCADA write to a coil to persist.
|
||||
|
||||
### 2.1 Field inputs — `%IW` / `%IX`
|
||||
|
||||
Used in field mode. In simulation mode these are left unwired and the mux takes the simulated values instead.
|
||||
|
||||
| Address | Tag | Engineering value | Raw scaling |
|
||||
|---|---|---|---|
|
||||
| `%IW0` | LIT-101 | Wet well level | mm, 0–7000 |
|
||||
| `%IW1` | FIT-201 | Inlet flow | L/s × 10 |
|
||||
| `%IW2` | FIT-301 | Discharge flow | L/s × 10 |
|
||||
| `%IW3` | PIT-302 | Manifold pressure | kPa |
|
||||
| `%IW4/5/6` | PIT-311/321/331 | Pump discharge pressure | kPa |
|
||||
| `%IW7/8/9` | VE-314/324/334 | Bearing vibration | mm/s × 10 |
|
||||
| `%IX0.0` | LSHH-102 | High high level | TRUE = wet |
|
||||
| `%IX0.1` | LSLL-103 | Low low level | TRUE = wet (fail-safe: FALSE = dry) |
|
||||
| `%IX0.2` | LSH-104 | Spill detected | TRUE = spilling |
|
||||
| `%IX0.3/4/5` | TE-312/322/332 | Motor thermal trip | TRUE = healthy |
|
||||
| `%IX0.6/7`, `%IX1.0` | MSE-313/323/333 | Seal leak | TRUE = leak |
|
||||
| `%IX1.1` | XA-502 | Mains healthy | TRUE = healthy |
|
||||
|
||||
### 2.2 PLC outputs — `%QX` / `%QW` (read by CI Server)
|
||||
|
||||
| Address | Description | Units |
|
||||
|---|---|---|
|
||||
| `%QX0.0/1/2` | PU-301/302/303 run command | |
|
||||
| `%QX0.3/4/5` | PU-301/302/303 running | |
|
||||
| `%QX0.6/7`, `%QX1.0` | PU-301/302/303 available | |
|
||||
| `%QX1.1` | Station in auto | |
|
||||
| `%QX1.2` | High level alarm | |
|
||||
| `%QX1.3` | Spill active | |
|
||||
| `%QX1.4/5/6` | PU-301/302/303 tripped | |
|
||||
| `%QW0` | Wet well level | mm |
|
||||
| `%QW1` | Inflow | L/s × 10 |
|
||||
| `%QW2` | Total discharge flow | L/s × 10 |
|
||||
| `%QW3` | Pumps running | count |
|
||||
| `%QW4` | Common drive speed | Hz × 10 |
|
||||
| `%QW5` | Time to spill weir | seconds, 32767 = drawing down |
|
||||
| `%QW6` | Time to LSHH | seconds, 32767 = drawing down |
|
||||
| `%QW7` | Net accumulation | L/s × 10, signed |
|
||||
| `%QW8/9/10` | PU-301/302/303 run hours | hours |
|
||||
| `%QW11` | Volume remaining to spill | m³ |
|
||||
| `%QW12` | Station state | enum, §3.1 |
|
||||
| `%QW13/14/15` | Pump state | enum, §3.2 |
|
||||
| `%QW16` | Current duty pump | 0 = none, 1–3 |
|
||||
| `%QW17` | Alarm bitmask | §6 |
|
||||
| `%QW20` | Command acknowledge | echoes `%MW1` when executed |
|
||||
|
||||
### 2.3 Commands and setpoints — `%MW` (written by CI Server)
|
||||
|
||||
| Address | Description | Default |
|
||||
|---|---|---|
|
||||
| `%MW0` | Station mode: 1 = auto, 2 = off | 1 |
|
||||
| `%MW1` | Command word, §3.3 | 0 |
|
||||
| `%MW2` | Command parameter (pump number, etc.) | 0 |
|
||||
| `%MW3` | Level control setpoint | 4200 mm |
|
||||
| `%MW4` | Start duty level | 4000 mm |
|
||||
| `%MW5` | Start pump 2 level | 4500 mm |
|
||||
| `%MW6` | Start pump 3 level | 5000 mm |
|
||||
| `%MW7` | Stop all level | 1000 mm |
|
||||
| `%MW8` | High level alarm | 5200 mm |
|
||||
| `%MW9` | Minimum drive speed | 380 (Hz × 10) |
|
||||
| `%MW10` | Service interval | hours, default 4000 |
|
||||
| `%MW11–19` | Reserved | |
|
||||
| `%MW20–29` | Simulation control, §8 — **simulation build only** | |
|
||||
|
||||
Clamp every setpoint on read. If CI Server writes nonsense, hold the previous good value and raise an alarm rather than acting on it. A start level above the spill weir must never be accepted.
|
||||
|
||||
---
|
||||
|
||||
## 3. Enumerations
|
||||
|
||||
### 3.1 Station state (`%QW12`)
|
||||
`0` Off · `1` Idle · `2` Pumping · `3` High level · `4` Emergency (LSHH) · `5` Dry run lockout · `6` Fault
|
||||
|
||||
### 3.2 Pump state (`%QW13/14/15`)
|
||||
`0` Unavailable · `1` Available, stopped · `2` Start delay · `3` Running · `4` Min-run inhibit · `5` Min-off inhibit · `6` Tripped · `7` Maintenance lockout
|
||||
|
||||
### 3.3 Command word (`%MW1`)
|
||||
`0` None · `1` Reset all trips · `2` Reset trip on pump in `%MW2` · `3` Lock out pump in `%MW2` · `4` Release lockout on pump in `%MW2` · `5` Reset run hours on pump in `%MW2` (service done) · `6` Acknowledge alarms
|
||||
|
||||
Handshake: PLC executes on rising edge of a non-zero `%MW1`, writes the same value to `%QW20`, and takes no further action until `%MW1` returns to 0. CI Server writes 0 after it sees the echo.
|
||||
|
||||
---
|
||||
|
||||
## 4. Control logic specification
|
||||
|
||||
Scan task: **100 ms**, cyclic. All timers in `TIME` literals, never scan counts.
|
||||
|
||||
### 4.1 FB_PUMP
|
||||
|
||||
One instance per pump. Owns everything about a single unit.
|
||||
|
||||
**Inputs:** `RunRequest : BOOL`, `SpeedRef : REAL` (Hz), `ThermalOK : BOOL`, `SealLeak : BOOL`, `Vibration : REAL`, `DischPressure : REAL`, `ResetTrip : BOOL`, `Lockout : BOOL`
|
||||
|
||||
**Outputs:** `RunCmd : BOOL`, `Running : BOOL`, `Available : BOOL`, `Tripped : BOOL`, `State : INT`, `RunHours : REAL`, `ServiceDue : BOOL`
|
||||
|
||||
**Behaviour:**
|
||||
|
||||
- `Available` = `ThermalOK AND NOT Tripped AND NOT Lockout`. A seal leak does **not** remove availability — it raises an alarm only (per WRPS-PRO-001 §5.5).
|
||||
- Minimum run 5 min: once `Running`, ignore a falling `RunRequest` until the timer expires.
|
||||
- Minimum off 5 min: once stopped, block restart until expired. Overridden only by the LSHH emergency condition.
|
||||
- No-flow trip: 20 s after `RunCmd` goes true, if `DischPressure < 150 kPa`, set `Tripped`, drop `RunCmd`, latch alarm. This is the condition that must cause the duty selector to promote the next available unit.
|
||||
- Vibration: alarm above 7.1 mm/s, trip above 11.0 mm/s.
|
||||
- `RunHours` accumulates only while `Running`, in scan-time increments. `ServiceDue` when `RunHours >= %MW10`.
|
||||
- Trips latch. They clear only on the reset command, never automatically.
|
||||
|
||||
### 4.2 FB_DUTY_SELECT
|
||||
|
||||
Decides *which* units run, never *how many*.
|
||||
|
||||
**Inputs:** `Available[1..3] : BOOL`, `RunHours[1..3] : REAL`, `ServiceDue[1..3] : BOOL`, `RunningNow[1..3] : BOOL`, `PumpsRequired : INT`
|
||||
|
||||
**Outputs:** `RunRequest[1..3] : BOOL`, `DutyPump : INT`
|
||||
|
||||
**Ranking rule**, best first:
|
||||
|
||||
1. Unavailable units are excluded entirely.
|
||||
2. Units not due for service rank above units due for service.
|
||||
3. Within each group, lower accumulated run hours ranks first.
|
||||
4. Ties break by ascending pump number, so the result is deterministic and repeatable in a demo.
|
||||
|
||||
Then: assign `RunRequest` to the top `PumpsRequired` ranked units.
|
||||
|
||||
**Two rules that matter more than the ranking:**
|
||||
|
||||
- **Never stop a running unit to start a better-ranked one.** If a unit is already running and is still available, it keeps its slot. Re-ranking applies only when a slot opens. Without this the station will churn pumps every time run hours cross over.
|
||||
- **Service-due is a preference, never a veto.** If the only available unit is due for service, it runs. Rank 2 above must not be able to produce an empty selection while an available unit exists.
|
||||
|
||||
### 4.3 FB_LEVEL_CTRL
|
||||
|
||||
**Inputs:** `Level : REAL` (m), `Setpoint : REAL`, `Enable : BOOL`, `MinSpeed`, `MaxSpeed : REAL`
|
||||
|
||||
**Output:** `Speed : REAL` (Hz), common to all running units.
|
||||
|
||||
- PI control, no derivative term. Suggested starting gains: Kp = 12 Hz/m, Ti = 120 s. Expect to retune.
|
||||
- Output clamped 38.0–50.0 Hz. Below 38 Hz the 22 m static lift means no delivery, so the clamp is a hard physical limit, not a preference.
|
||||
- Anti-windup: freeze the integrator whenever the output is clamped.
|
||||
- On `Enable` false, hold output at `MinSpeed` and reset the integrator, so a restart doesn't inherit stale integral action.
|
||||
|
||||
### 4.4 FB_HEADROOM
|
||||
|
||||
Pure calculation. No control action, no alarms. Publishes the quantity the demo narrative is built on.
|
||||
|
||||
```
|
||||
NetInflow = Inflow - TotalDischarge (L/s)
|
||||
VolToSpill = (6.000 - Level) * 120.0 (m³)
|
||||
VolToLSHH = (5.500 - Level) * 120.0 (m³)
|
||||
TimeToSpill = VolToSpill * 1000.0 / NetInflow (s)
|
||||
```
|
||||
|
||||
- If `NetInflow <= 0.5 L/s`, output `32767` — drawing down or holding, the figure is meaningless.
|
||||
- Clamp outputs to `0 .. 32767`. Never emit a negative time.
|
||||
- Filter `Inflow` through a 30 s first-order lag before use. Raw flow-meter noise on a near-zero denominator produces wild swings, which on a demo screen looks broken.
|
||||
|
||||
### 4.5 PROGRAM CONTROL
|
||||
|
||||
Execution order per scan, and it matters:
|
||||
|
||||
1. Read and clamp setpoints from `%MW`.
|
||||
2. Process the command word and write the acknowledge.
|
||||
3. Determine `PumpsRequired` from level:
|
||||
- `Level >= StartP3` → 3
|
||||
- `Level >= StartP2` → 2
|
||||
- `Level >= StartDuty` → 1
|
||||
- `Level <= StopAll` → 0
|
||||
- otherwise hold the previous value (this hysteresis band is the whole point — do not recompute from scratch)
|
||||
4. **Override:** if `LSHH` then `PumpsRequired := 3` and bypass min-off timers.
|
||||
5. **Override:** if `LSLL` then `PumpsRequired := 0`, latch dry-run lockout, require a manual reset.
|
||||
6. **Override:** if station mode is off, `PumpsRequired := 0`.
|
||||
7. Call `FB_DUTY_SELECT`.
|
||||
8. Call `FB_LEVEL_CTRL`. On LSHH force 50.0 Hz.
|
||||
9. Call each `FB_PUMP`.
|
||||
10. Call `FB_HEADROOM`.
|
||||
11. Stagger starts: when more than one unit is being started, hold the second and third by 30 s each, to limit the inrush and the hydraulic transient.
|
||||
12. Publish all `%QW` / `%QX`.
|
||||
|
||||
---
|
||||
|
||||
## 5. Interlocks that must be provable
|
||||
|
||||
These map to the cause-and-effect table in WRPS-PRO-001 §5.5. Each needs a test in §7.
|
||||
|
||||
| Initiator | Action | Reset |
|
||||
|---|---|---|
|
||||
| LSLL-103 | Stop all, inhibit start | Manual, after level recovers above stop level |
|
||||
| LSHH-102 | Start all available at 50 Hz, bypass min-off | Automatic on level falling below LSHH |
|
||||
| TE-31x | Trip that unit, promote next available | Manual |
|
||||
| VE-31x > 11.0 mm/s | Trip that unit | Manual |
|
||||
| PIT-31x low, 20 s after start | Trip that unit, promote next available | Manual |
|
||||
| LIT-101 out of range or frozen | Alarm, fall back to LSHH/LSLL discrete control | Automatic |
|
||||
|
||||
**Level signal failure detection:** raise the fault if the raw value sits outside 0–7000 mm, or if it does not change by more than 1 mm for 10 minutes while a pump is running. A frozen transmitter reading a plausible value is the failure mode that actually causes spills, and it is invisible to a range check alone.
|
||||
|
||||
---
|
||||
|
||||
## 6. Alarm bitmask (`%QW17`)
|
||||
|
||||
`bit0` High level · `bit1` High high level · `bit2` Low low level · `bit3` Spill active · `bit4–6` Pump 1/2/3 tripped · `bit7–9` Pump 1/2/3 seal leak · `bit10–12` Pump 1/2/3 high vibration · `bit13` Level signal fault · `bit14` Mains failure · `bit15` Setpoint rejected
|
||||
|
||||
---
|
||||
|
||||
## 7. Pass 1 acceptance tests
|
||||
|
||||
Run these with the simulation absent, by writing directly into the input image. Automate them in `tests/` if practical; otherwise document the manual procedure with expected `%QW` values.
|
||||
|
||||
1. **Cold start.** Level 2.0 m, no pumps. Expect: 0 pumps, state Idle.
|
||||
2. **Duty start.** Raise level to 4.1 m. Expect: exactly 1 pump requested, lowest-run-hours unit selected, speed ramping.
|
||||
3. **Hysteresis.** Fall to 3.9 m. Expect: still 1 pump. Fall to 0.9 m. Expect: 0 pumps.
|
||||
4. **Assist staging.** Raise to 4.6 m then 5.1 m. Expect 2 then 3 pumps, each staged 30 s apart.
|
||||
5. **Rotation.** Set PU-301 run hours to 500, others to 100. Trigger a duty start. Expect PU-302 (lowest hours, tie broken by number).
|
||||
6. **Service due.** Set PU-302 run hours above the service interval. Expect PU-303 selected ahead of it, but PU-302 still selected if it is the only available unit.
|
||||
7. **No churn.** With PU-302 running, set its run hours above PU-303's. Expect PU-302 keeps running.
|
||||
8. **No-flow trip.** Start a pump, hold PIT-31x at 100 kPa. Expect trip after 20 s, next available unit promoted, alarm bit set.
|
||||
9. **Thermal trip.** Drop TE-312. Expect PU-301 unavailable, promotion, trip latched through a level cycle, clears only on command 2.
|
||||
10. **LSHH.** Assert LSHH-102. Expect all available units at 50.0 Hz regardless of min-off timers.
|
||||
11. **LSLL.** Assert LSLL-103. Expect all stopped, lockout latched, and no restart until reset even after level recovers.
|
||||
12. **Frozen transmitter.** Hold `%IW0` constant for 10 minutes with a pump running. Expect the level fault alarm.
|
||||
13. **Setpoint rejection.** Write 6500 mm to `%MW4`. Expect rejection, previous value retained, bit15 set.
|
||||
14. **Time to breach.** Level 4.00 m, inflow 165 L/s, one pump at 120 L/s. Expect `%QW5` ≈ 5333 s and `%QW7` = 450.
|
||||
|
||||
Test 14 is the one the demo narrative rests on. It must reproduce the figure in WRPS-PRO-001 §7.3 exactly, or the Basis of Design and the running system disagree.
|
||||
|
||||
---
|
||||
|
||||
## 8. Pass 2 — simulation
|
||||
|
||||
Only start this once every test above passes.
|
||||
|
||||
### 8.1 The mux layer
|
||||
|
||||
Add `PROGRAM IO_MUX`, which runs **before** `CONTROL` in the task list and is the only place that touches located input variables.
|
||||
|
||||
- In the field build, `IO_MUX` copies `%IW` / `%IX` into the global process variables that `CONTROL` reads.
|
||||
- In the simulation build, `IO_MUX` copies the simulation program's outputs into those same globals instead.
|
||||
- `CONTROL` reads only the globals. It must contain no `%IW`, `%IX` reference at all. Grep for it as a build check.
|
||||
|
||||
### 8.2 PROGRAM SIMULATION
|
||||
|
||||
Runs on the same 100 ms task, **after** `CONTROL`, so it sees this scan's run commands.
|
||||
|
||||
**Wet well integration:**
|
||||
|
||||
```
|
||||
dt = 0.1 * TimeScale (simulated seconds this scan)
|
||||
NetFlow = Inflow - SumPumpFlow (L/s)
|
||||
Volume = Volume + NetFlow * dt / 1000.0 (m³)
|
||||
Level = Volume / 120.0 (m)
|
||||
```
|
||||
|
||||
Clamp `Level` to `0.0 .. 6.0`. On reaching 6.00 m, spill: hold level at 6.00, set the spill flag, and discard the excess. The station must be seen to spill in the demo, not to have its level run off scale.
|
||||
|
||||
**Per-pump flow model.** For each unit with `RunCmd` true:
|
||||
|
||||
- Start delay: 3 s from command to delivering flow, so the no-flow trip logic has something real to detect.
|
||||
- Speed to flow, linear between the two physical anchors: 38 Hz → 65 L/s, 50 Hz → 120 L/s. Below 38 Hz, flow is 0 — this is the static-lift cutoff and must be modelled, or the level controller's clamp looks arbitrary.
|
||||
- Parallel derating: with *n* units running, multiply each unit's flow by `1.00 / 0.94 / 0.88` for n = 1 / 2 / 3. Three units then give roughly 360 L/s at full speed, matching the design basis rather than a naive 3 × 120.
|
||||
- Discharge pressure: `220 + 1.4 * PumpFlow` kPa while delivering, `80` kPa otherwise. This is what makes the no-flow trip testable.
|
||||
|
||||
**Inflow generator**, selected by `%MW21`:
|
||||
|
||||
| Mode | Behaviour |
|
||||
|---|---|
|
||||
| 0 | Manual — inflow held at `%MW20` (L/s × 10) |
|
||||
| 1 | Diurnal dry weather — sinusoid, 40–110 L/s, 24 h simulated period |
|
||||
| 2 | Wet weather event — ramp from current to 300 L/s over 20 simulated minutes, hold 40 min, decay over 90 min |
|
||||
| 3 | **Demo reference** — start at exactly 165 L/s with the level at 4.00 m and one pump running, then ramp slowly |
|
||||
|
||||
Mode 3 must reproduce the §7.3 reference condition on demand, so the demo can be reset to a known state between audiences. Command `%MW22 = 1` resets the simulation to the initial conditions of the selected mode.
|
||||
|
||||
**Time scaling.** `%MW23` holds the time scale, 1–120, default 1. All simulation integration multiplies by it. **The control logic must not know about it** — its timers stay in real seconds. This means a 5-minute minimum-run timer at 60× covers 5 simulated hours, which is wrong but harmless for the demo. Note the discrepancy in the README rather than trying to scale the control timers; scaling both is what makes these demos impossible to debug.
|
||||
|
||||
Sensible defaults: 1× while testing logic, 30–60× when presenting.
|
||||
|
||||
### 8.3 Noise
|
||||
|
||||
Add small noise to the published measurements — ±0.5% on level, ±2% on flow — using a simple LCG, not a library call. Perfectly smooth trends are the giveaway that a plant screen is fake, and the inflow filter in FB_HEADROOM needs something to filter or you cannot show that it works.
|
||||
|
||||
### 8.4 Pass 2 acceptance tests
|
||||
|
||||
1. Dry weather mode for 24 simulated hours: expect ~7 start/stop cycles per unit and no high level alarm.
|
||||
2. Demo reference mode: expect `%QW5` to count down from ≈5333 s, and the spill to occur at ≈89 simulated minutes if no second pump starts.
|
||||
3. Wet weather mode with all three available: expect the level to peak below 5.50 m and no spill.
|
||||
4. Wet weather mode with PU-301 locked out: expect the level to reach LSHH and, with two units, to spill.
|
||||
5. Reset command returns level, volume, run hours and trip states to initial conditions.
|
||||
6. Time scale 60× produces the same level trajectory as 1×, sampled at the same simulated times.
|
||||
|
||||
Test 3 versus test 4 is the demonstration that firm capacity of 240 L/s is below PWWF of 300 L/s. That contrast is worth building the demo around.
|
||||
|
||||
---
|
||||
|
||||
## 9. Constraints
|
||||
|
||||
- OpenPLC's MatIEC is not a full IEC 61131-3 implementation. Stay on: `BOOL`, `INT`, `DINT`, `REAL`, `TIME`, one-dimensional `ARRAY`, `TON`, `TOF`, `R_TRIG`, `F_TRIG`, `CTU`. Avoid `STRING` manipulation, nested `STRUCT`, `REF_TO`, and `VAR_IN_OUT` on complex types.
|
||||
- Everything the demo needs must survive a runtime restart being the reset mechanism. Do not rely on retained variables.
|
||||
- Port 502 may already be bound on that Windows server. Check before assuming.
|
||||
- No floating-point over Modbus. Every published value is a scaled 16-bit integer, per §2. Document the scaling in a `docs/register-map.csv` generated from the same source of truth as the ST, so CI Server tag configuration and the PLC cannot drift apart.
|
||||
|
||||
## 10. Definition of done
|
||||
|
||||
- `python build.py --mode field` and `--mode sim` both emit a file that OpenPLC Runtime compiles without warnings.
|
||||
- All 14 pass-1 tests and all 6 pass-2 tests documented with actual observed values.
|
||||
- `docs/register-map.csv` generated, matching §2.
|
||||
- `README.md` covering: how to build, how to upload, how to select a scenario, how to reset between demos, and the time-scaling caveat in §8.2.
|
||||
- Grep confirms no located variable reference outside `10_globals.st` and `50_prog_io_mux.st`.
|
||||
74
01-design/WRPS-DRG-001_PID.pdf
Normal file
74
01-design/WRPS-DRG-001_PID.pdf
Normal file
File diff suppressed because one or more lines are too long
BIN
01-design/WRPS-INS-001_Instrument_Index_and_Equipment_List.xlsx
Normal file
BIN
01-design/WRPS-INS-001_Instrument_Index_and_Equipment_List.xlsx
Normal file
Binary file not shown.
169
01-design/WRPS-PRO-001_Process_Basis_of_Design.pdf
Normal file
169
01-design/WRPS-PRO-001_Process_Basis_of_Design.pdf
Normal file
|
|
@ -0,0 +1,169 @@
|
|||
%PDF-1.4
|
||||
%“Œ‹ž ReportLab Generated PDF document (opensource)
|
||||
1 0 obj
|
||||
<<
|
||||
/F1 2 0 R /F2 3 0 R
|
||||
>>
|
||||
endobj
|
||||
2 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<<
|
||||
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
|
||||
>>
|
||||
endobj
|
||||
4 0 obj
|
||||
<<
|
||||
/Contents 13 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 12 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<<
|
||||
/Contents 14 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 12 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<<
|
||||
/Contents 15 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 12 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
7 0 obj
|
||||
<<
|
||||
/Contents 16 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 12 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
8 0 obj
|
||||
<<
|
||||
/Contents 17 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 12 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
9 0 obj
|
||||
<<
|
||||
/Contents 18 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 12 0 R /Resources <<
|
||||
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
|
||||
>> /Rotate 0 /Trans <<
|
||||
|
||||
>>
|
||||
/Type /Page
|
||||
>>
|
||||
endobj
|
||||
10 0 obj
|
||||
<<
|
||||
/PageMode /UseNone /Pages 12 0 R /Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
11 0 obj
|
||||
<<
|
||||
/Author (SCADA++ Demonstration Environment) /CreationDate (D:20260811041206+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260811041206+00'00') /Producer (ReportLab PDF Library - \(opensource\))
|
||||
/Subject (WRPS-PRO-001) /Title (Waterloo Road Pump Station - Process Basis of Design and Process Description) /Trapped /False
|
||||
>>
|
||||
endobj
|
||||
12 0 obj
|
||||
<<
|
||||
/Count 6 /Kids [ 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R ] /Type /Pages
|
||||
>>
|
||||
endobj
|
||||
13 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2685
|
||||
>>
|
||||
stream
|
||||
Gb!Sn96].!'&NLebVElaKEU1*eW*l.jKtrSF0kCk+s@7%75=jW7K)m"J.GMk,"4Sp:[_#<,Ei6b1Z*TO^aLNHpt+$q7U(D8*oOqq#pt@]'ppnaiSbGtI(8rt5s3'TI1!n%I)?<\e"rZ'^tm<Q`.?`5$BC%jBOHE."N9j>'=Qh$5&ku8*UY4mIo/l/n3n$)e2$MRF_ojdEdc^^591Zp-A]'U_5oM2V>,d4:_D2r$h$97"VXIn_-IhrYUHt@g_XD8ZP7#U&6ZrIKV(TQ-"JO9As0@Hp[IZ"4T(j?GP8KdO*DFt5MlEXEBd[_rB<$a"Lqr;0^l[2Z/#bClT9jW[Cs7Tg\tQW:nLjuCV*d"Xct,i@?h.TfeuK7+W<`9YNFI.++JZ]T;>=gAEfDV`G(MUFJNh9oN9B_>Ve&qDu>/mDI.<sj%I]BB&Em7Nh-CaD&4<f9EQqAGlE!T6N]0F+)WKoStZ3B'aFrUGbjJ94Y44Ga!`PX?r_Lqj3<JO>)s`A5a]PCRIF6&GWo"c8r$8c4WAld[1<ZS1)o_h6IFE$VmK57GUdZKh^#oXpb4LdAfqqlI^h*(^6Oi7.RRE/gF-qg!LEC6O&6XnQ-XikWM+2P=P$\T.dfT+DO4&hJq<fn=8_:c5O]k*^#H!V&5%og%E5:/Eld(&BbB+8N%l?](_FC?Cr7Bm*OsRT;o)MW?@e-:#gOr3REoDd1[8,gfImnQ>,PqlM!INqG@TXEjk,6rbg4aR6>;h\k2j1="]0i_kG^A%,7ZT6`VZU2SP\BKr:tE<$aFgjK#S!sI,":L=/tVa>,TYo6f05.rK>I*S]CSQi5Oied9YF.F)!5b=R$D.?&R&8Va=*,mgglI7pfPA?+2C)V\d]fHsO"in#e.)^7(K<dVXI^po6iZrflsXF00.;`5g_K;Lp&J9H3R:b$>:=LP!MD69UN/bGA,E^"T^SbCE8*M/'QOPTo:90!_AUREeISfkZao_pkYR<>g-C?+4X@9'?^#=<b8tg3=#DF8Y6qnPfj$&br12e+Itr:F1"(QFd*lV")u2kNu"NdFVkX+D1Z!6bF=;rRuClCL@$b9]bS?]YF;O=5pshk\7FpcYCNuLD@YsVT:R8F>kVC/FTbHXTjfFb.dfCCSB.`lN=8A7;-h>fjJ/*2[?@MXa%u6'H77%h7CU+a1Bb@XI9_09KjM?PPt:U&jkA@0K.,)@gq-lXpuheGHtPij2D4h0$=tn`V+,g$N*JY9+=IobLI6ufjm1H;tD&F_UF+50tpRsJB2/6?j(@Ib0VZ6/1j8U,Wo?kQ5ggX`a!(LG?ZB#IUCVU"j$;3>c".Z(.[oP/qJF&H*2'2*)i0WUS@h1]e%gEQ+\Zr8BD4&#$@;"Lp)'!<?UHBJ5%bl0BXGj[uUOp!&gO(-"CX`KGa2>"NchW9\C*EHOV\4;bft1VSNS2=koXU>8t!6)?oNRiY"0H=G18&,?];eKtI&?:rmPGKGCRpJ7M&)PJ*-?'NNn<bg6T'dAiFACE?d44R!gdo\6DXc)D!cl1=UBQ?f&.oQomV#uQL%TX9,V$#YC:X@&g(g:cM'e?saT`DD>$_Q%Pmj%[iDhWlsi:^o6U>%dDehf?Yq(C3N3(6Z_>,.L5tlM+M\E#7]W$4#rPEEK>d*>R'@NS*VHX4*[7S']Y&20^-QVg0iTR'p):Y*BiYa@-j3g(S&&=1i+uI3?[c8HQslQ#-\?q9;itccmU_lN@!32_*@D/SD*8'?j*!k9/,c<n&,A?p'D<3V>Fc_]r,tA_fQ[C.H?"VUsKr`>]2oOKr>^M(bEE,g^ff0oFI;(YKL3O1%L;&]-$S26`/1,\(e#iu^Ct++]=bGb%t3=0_.f@Ziu;@+rU?K2no#L/lpm;C0[H?LD7H;H@Emao?,..'_&dRq3@m\1OUpT@K4$9gXqSq"pa[@J$E#P-Eq[K;Cd:8Si+2Ij;j[O0__@Bc1@>R)UBM`"Ps`P?@Q(?!B.#/1LfVp1*H3BZJuulcU]-]=,"&otPuEg$1gCRi#W?*s%p?T^MVo4]'0O!_p)"P<:s)GJFN^*WKI'rB*4AD(M2TnDH6Z4E%ODmB^-^RYPYjDMNrQk*4NRrcUL9S*@j$+`i/9J&P/eA+[$C[Qe1=*e<B7VE-*@\U+$-%\+sO&&H`e5DotH17@6n4k<k#$S>L=22NF4^VLbeK+/heS@8L\>VA#;V=Cl&cgD8S4M..a36q&16!lP]HNtXr*i8(HdWqpt7u^G..o-[Tg'(tU.OXcM*N)a!FA(b?Q#2F9m]IlOfT^8@Ys2U)9eRX_`96AbQ6b-YcQ5DHiHSH>;P-%BO!a.0n0q%'-D/U/#g?40eo&>=4)H6[=KSV6/S\#m/e>o7ca*>1`u#`F"=%N15@NmQ[1'<u/3&jL0%/55<2ec0W*ad5g<_@='6Mt7JW?=&W]EeY*K*EEBtclb_"F8u_$4W$Gd0KRGs8Jf9hZr+5K_UVdq3>,_tN;9o(6#5DpsToJ\&r+s(c!Nd:,/1BPQ2FGu,k&33SC`e<oW+-m2=&1f^6!cM@k%]D3,hVtF0Y@E1\CFoa*e:fn+gf:Qsc3ec,gPNh'FnEE;)cWV,Y-F!:f(Wm9bX3\u,=Q409a9;sdSAK_0')Mu81!PjM:FQshK5[E=p'(u*`k)!bi>Cn,,C)J8*gSOHk7\/D5c9tEh<cLr=4NB,s'^!GL0Z?8r!g'7R6:~>endstream
|
||||
endobj
|
||||
14 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3342
|
||||
>>
|
||||
stream
|
||||
Gatm>96].!'&NLebiYMW1`"7nWUAP&\T*\q\@*>p]R`UE6:2@m84rFNolgT_.8$jU-=N?4&jTi2hn/qM@,l`sr\qq"IXclTh`Kc+n?;o5[sWFf_7PK/05"<r#BB*^'i&8nS)S)E7Xb>]s#m[ifU`fhKK/-i*JgRkbDU0AEX9>1$=YsJNFd'Yekh3B+d/6O1iV:\I,*B_A)&"f"*a#lTU)t#BfPLY`-,N3,KO:'kDu_(.[(M5,YR+)cI[#BYtE(=-?-"r_TNR@B;I"B0&VVR@Tg?pLO\:A(F%\ih[^n]nrWeKrcbjGPM<^1',sAj42-9hhX[9)hUDnm_"RZ2G@QX!hh^:3QKO$PW(C9]A^+.U8-LHgAPlL.($,@TbH&gqD\'j5Yn9SD3A7D!71.D'YnOYEFDfcpKA0W#2d3at'"SNfJaMC)E/Nj%&56rJ^(:#'9LB&d=JLIA<8]er,*Vl.A&[spL5CNi!6&C:bF,Ik2Q"t0ZSfVT%UU6_i.bQ*c"X*rI-q(<aV'VSgt%0]mqU=eN'pVrkD5'[.Jn-H;/H&ak7NQ"@Tgs:'(fGTZMhibOe@I%;1b`Bho@*oN0\NMl]G8Qj]MfRN"s,BB*2,FU]1shG41IDE@0Z"EG`cS8U<Lppp:&!VhB-#)qMXRH4ZZeM1oa'.hTWO:N$HiAjhX7nYBX5ZHeh(<tGQ3Fb9%Pa<FIebu8e,_m->P^_!Ifiu=R!YhNj`;=S1KVt3S//;'0eoe8Id`k`r.YJi+['Mtnc&#:t[.:s3MJ^*;2)tf`,L`MJ0Mu0nIT!hl4\&X<S6Z%qd()W1r`sl+Ki@S"AGg=j&(WeK06mh]gK[QE93gL^UoiVu%fZ4IQO)QX#\L)4B\pB+:@]DJ?b0CJ;6U)U9]^TSko3SoNLjU'>`";`JGWfN1a;td:mlG!PFVN@S:Zjh:OL7^OS3_n`Z1ZQqErDUceX2m)XKeu@*62#;F["uG$L0JagrE'LSO#^i4[eJ.&T^ZsG`,?@#`Eg(HiY9,+L(le9$a(fRT&F)7Ph<8@^"!?VWe\L'@(4)QG=tL/g@K^'diGcBB]C@N6$clkRttTU;G%QndAPJOm!S%3L.h8'[BfCr$='G!B"3&Ee"loUDjC+q=+N6h!bu.DnTWAJ0nbg"tnMC-,3W>H"7'$V,F<RQEc5PK&m<p:W!c;->k<r9$%,,dYO,P0dYI7j-Y1LKiEm<^Arul>d[J"6X>N5Gl6mO0d9+H&f0IWnmXRF:gSR?R2j?!WGXDIa"$9'h"X1QK#0/'3$^SdN(2]_@7"r2nA!Qi58qqa6m;+^DaZ4_YF=e"U^^!F'H^"=1]D`pE_+iO,m%#^'.,,uJ;;WB,B?'r&a"f![6Gk[)8kI<XL,lrX=Gba9!1&r3Rp^uc:I$"$ab&B;&%_uh]&`sd28S&@?BnIUNjhoe3]kie@g9)#l_;oO7,l9?]8UjlQS\t>:R')Q01gTYNpL&nlIcDD%AY0(pE)-lk"29FM4D\Ik1\[P(NK`jc2e%lGap?fs/WOehk=HiEC5rh*fAj"PKWW@nH#_r;YZ<G9FW6"$tYW'Pldt%%MdpZ2\T<5-`b4e-"M`e[rLdr7OfthSDfIcqZ[mhB`'dVS[;%V&AKorHN5nIs+cYoO+L:kb]A5DpiX:WN!ME;#bD\,JQGXq;"FMm'"jPgIX'`:Z8LJkQaf$]iB6*`n&%.fU>WDA+Wd$#PQDU+,nocXL%/_R?-^bA)IVF?=G_[kRUelFpu2((agF;`hu,tpORg:[likarEGkEDW\A$&^>HlnM/qdY26B^?\i91m\u4mq2Pj'Zf:H9_T,*I[nek'T&lF4^>kQ3MC0BZp_*4M,h?pODS^X*f#nd^cp8b,c9)dTnLLJ#"r&Ag'2ZA`rG?ViIaQ;_rqJH=FtIscm6On$F0*LfFV'6X-:oPNODsPr`1gRI1T_#j/1#36R<Z/]!W(8^5/!jQqM\U"`<QaSX@8"?0ThX)("I%8[*Pcfml7W2*D9FZIn3"rXE=EJPEM_6`C?X\EcH6^Tu9Q26&!QP<?W[BRUk8QE(j:pq$\4.D)e]:jq%,_i51M[-tR#_Wunod<L1]ga$Ca4GAPW@Z&i+g2cI?\A%`?e&#&B?2cQ<gnm@-oAHB)"T%7QFR!6dmq4?:cC$b?U)XDlQ-WR9.fpeIS!6)nm*Nb=@RZsQ+:as[>IGqCgpX-bC=UZ[^]P?V;;&AA.6^0:.(CRB:4/1(Al77gaOgY0<9O/r.AtHoK>]/e`R'V0r3o(nJs5T\pflb:=f`Y[<1`,4g.8NCL#[Wu:qWa6NLf38?L6#qU:<=C*o//G82-hR[R;2sC>]jdl8uHU0A*aS6_%-k9[R"E7g?poH\q@KM\tZ?6DNT,4Cto5S4t#ZQ4?(f/c73ob@u?htDc[!1(!ku23uE9)Dm&Wr68.<^6m(A2f5"]W"sf0WRmRY#^jqt$fe[95E?B8mbqj7Q^ef2RC9j#9L?Es0X"EL'U[]*[.*",OO?d'uV4/(dFXXauDmWIT=P^S*.5)>\f#&,O)`a5Uj#g-iU0fOW=uIA1f&dl9gAV]461hH)>W;XS:i8'_6<GoXO(`,k0qrFMT4tBMphh:4"of8c`oL)^UVAUT;7%G\1g.7Q!@+QEDMO-Le>f2.U?"Z!^.g<-V(*la&:'9g8`/-iID16sGthC,gpE0[(7uXh*8PM@N0qCj(t%Pa7I!Do?ETF.&i8$@UpqT86E)UO"_T<3^+dtSeoO<cPS+_uQKkr#FPB0#9K>\nhC18DXK8B;9a.A%ijV"$4F_kZ0QAOuU9i?P2OR2H);9^>X__-Z3iauGl.(l%=r$++-<Dknl&KaEjFPt;<<<Wu?2&cM]82;=O)u_[A@/7@A?Hh*GU/r7)"*+""G7D:lf,Cf!$:'fe:.@LDgq!g0!qed$m=t!^$=t'7*sr-F+dKd=JeJ1E+8WoTl)IpSP:J$d0mD[f<lO"LR3W?j#6XuF*_@5%*="[HGXjBSSLZ`F@eaP>q;A#NgK^&fuVT-NSXuph=l%I2D:M\4nff-J0bt3pbS,p@$F9Hk9T)aVGHtCUbSTnWO5E9k<FAr-`iV':q%gNH"GsA*;d426fn)4bG`noH'-Z,h7i<_*n<mHOkP/-3WR&pBXuSGrm$-/caL]W6gRK>g^a`+91;_$]$u93Af)(!'+f9UNRKGXclZ1;h0%D8;mECWph3ThO7Z(4\t21;A$LQ,1<6bmp7iUmL@c)he]3p4b?"6,=Z,05>1"XQj<i6C9gBVI1;p_.f">SNPV/u,^7G5m)pI_7HpI\e5!6(L-2%TKZhrDaV`h%^;+W``d1RGigZ"s.CqE"Kfc]toML`:2ia:G?kC`'HMK&9=]esmi~>endstream
|
||||
endobj
|
||||
15 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 2802
|
||||
>>
|
||||
stream
|
||||
Gatm=gNM>[&q0LUbbIo`0t`G0>LFcE3QjF*D6NZ$,!cMa8Z3m\g&:d8)3PWog9TMQ>U0n(0UKI-(^qCin^ioLU`fMQ:[^J/jLB<(OlKY0h-\X/ql;rbXLT?>O\8`bLhq!\n'IX&!T!bLapMg3<DjC&cWrLe?S!aHDECfoi'gZX\as<8:3Td1PW8q7bbC;PIQ-aNZPQ)u)rH4Yn/\N04M^2<4\1Fr^k*cWYb9,,EMKPh(qMSE8iPL66[)8[BN*?<DCUjK\u$!XX_T[0I8mU\Q2dQTmr\R3M]U+2#BO\K62^!F[l8N;S(h:^2GBcJ[A3JKi<.iJKb[(.m14%uZurhW_\>&84?rI*&bWQ7[jn5u<0XE"P]]ptL>;b*ro<ktIsf\Ib+5\/=fAWOhP:-:7S_m5b.3@1MS-c]?\*5^,]nAa6WPsIJ/q;ba*&5l6VkHm+gT4"$1C'iZtLV+>lMI78RQgqN\4B\P+S(X0<FB^Z@1&V>4E)$$c5'MA`5H"Ea0aQd/BO_TAjBU)^\1WEkPCO%4uG.ITKJ'OQQ\\`\_[1CB[2$$/Pk;ogYq1UAM?mqQXp;dInsBC8WI7`MV(kWlaAm?s:f#9ISLq6ZJOf2VXrm]\-9H5o5nJIjE'PLLcZF"BWZ<\'6./\_13Z5pc'0<[T]#VU-VYf2F/Y]LO)hB+L54.W.9^j$gWon:r$1^+['Fq.n+[;R=@OpfAso>iSZnAE[J1h):-.=0?isHr/'oW=i.Pd(lM3J!"3TDG/e*rHbJ/(r3EClVhH3n^d#j#Qr,Qa.pS+\QF'A.FKMZi[W5pQ/ag1N#>Np2$0doGS094#fQfnTg0"`?8q213/knB0_J+Q`fIfa';2[#9O\gYBrZFoN*s,gTb<S?d-W1\:asq;<84]h/K1rn!2f$Er"S+oV(o&c'nL6"G-d2>0lPLcgZUu3+L?@(C,KSR=nK*qohMDh9[L653a'K<K#XZS1u1Jkn-%%aN=iHZd`pD@RHHQYp4qr>/`aD(*$lO`[EN_mo_Le\bVOK]<78#&F&QSk?(>D)+V;Z#bY@X5RWPf3^o+bs.gU@8R%_^$CUF7%TRKh-r,iI#\RWlSA?/+hDHlEd$hBUja(!lB/X3Sj(:C4bn;(RG>UKl?Jj8gl0WSNL4KZU$@(kKWV;IZ"$ogN'/HQD/SV1@m7.kqt$@sI%#uQ?jkr+lQ$!-\;cEKNO3oQV;F!bfL0a70H("gk;Qg$eZ]:^:^/AHfWr!%`ul[:Ud<,j5QFOP:&g)-pL+n[:09QD2\m(uf#+#oq"LVs:([gY>fU<0kspq^!Vkn"909ND\@)qLV-<aqoA@]0kV9L3VMB'uI$^t6@2/a)MK[B8qD[f!kjr>$bM@[B>NfWP=XWDZa(!IkPTfsnHC<ZPhWb%:0Xh/j&t]m!D?+<2R-Bo.J6<+WX?L[ArqTa0HL]If="['_>!h/+i(dtr%Rh*s>/G.*Y%XAXOcFX=Ca-u2pfB'(cUZG?-C>/f59'BT&ME+b_P#FXcUQE!:$.T\*+k%Y7hfdEj?qIdFMdbI#"c=,^ihrI1_<a0AC(p,FDPlf\Z2b=?9B4Xt4*WRRG+WLRLf<t/3@)/8>ETWSeEn&48<m@4;cfV0.n*1[O%QR\_bu7jNC0biScGdV:&<gp!W'gTXbQ6,SW70iXi2#_Xr1pWW=!9K<8j?P\RV1Bmi4Q:6Y42hUXd^Lpn$&9R*euR3+?snJ-sB"qF0N'f@`j/0Z=W%HST8nZ>;-R8VaD@tS:eQ_'OaC&P"92m4,WZJHI5FI=&p/_A'4_,eYcoq[hjb0IUFaT*9"mNHJ>bU5&W(_ofS3/G>atZ;El?QiLkE@qZW!$;?$7Ep%?P6]dY*?VgEU&"\p.:JNLsSqNQLhNjW1;Vf-e&D;",*ft\e&$toD!OE&9<l\f)OC!@_DquT\a'7G<'jU32NhZh29ipYSX"c1+/=Qd>4Fm3)R1%.DkOu@I">B*Z5_.+(;a-2M.o.FsrBU+N))i+J*s)f#FPkgnV/)*d9p`.N/K8F.qQ%`$Do1?o*'N2k*8Bdiko_QRQ-Z=f@&RVan7[&3!#mWY\hN@!DVrtc(a*>HO]kMOJg%qsFE.U%qcBH=cq`':G;Di)P#SuGP#K>kTXA>@H?UnNm_;FYt#Z#u4:X=A.L_8al\r^AkJR*j<$G,:JAlgcDjcm&5?:e/'<n0qmkE^hjN25%&#>%4*HJ*''3[UVYrf$sK"VCM%/dPFO$#d]q=/N3'idCal6L"C/isZj/3uUimhc2*K=lSN.G`4&`X%isHnp)cY]aW#=nm;`*m>b&DLM!d"F4[r;1=dKr3?4Zph@d=fP7Bu7k(8:ADOAR+O'9QU-+N0;l_HiK6hObEane\Rmsk-4rTlt?0,J%n_N1WT*Z+X7ms_(Ujet9-P_MQ7j.(3PcCo%4Sdq"J^2r]Q]B9*d,7%%7a`HA(c%fSL3iEWR;)0&KZA1TO1g=C,\K$ih,GjACd(\0sH$/W)Z]eOCa+)0n4$oSPZrCEIU@Tf2qGKbtSO`^SE,qh7'@Oq8B`<<@_K?mB+0erGZRM2<=ZI8cq\u7r`E^0E;U&j7MKW4(0B,lB-;T[;rk>=L]7#7-XiY(i@]9j&J4XMLHm,Iu\\aM%BK)9#OFY7@:8cor".rl/_Jf!^JS8,/2kEGh'r*nRqJs6+2.i*[gePiT=FQW.BbLdWg'S_E>t/eDPs-6HWmShQSZnV'U`Nhe_C"Xr.Qcmmp(HFgQ7<VVX;ktYN>^TCR&8!e?:%9(>`D>gK4L0_+*[kY[oYY6>A>b7YdZbZB/m.f,gpi(T_)sgMQZp_DacO/~>endstream
|
||||
endobj
|
||||
16 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3051
|
||||
>>
|
||||
stream
|
||||
Gb!;g968iI'#+6EoMIEL&V=q=eJp?dAs4[q`abu+(LJ9tOuQ)I$:meLJ%lH^+iuGbfKl?Kj0BsC!kq.uLIS$XU#=i>eUQ$\i:dDfrCDLNYZLr!M%>MKpugZ%gD,R8+HB_M@1kY.K!1jeq#T:Nl\YhL^T&C^Z->uk6qK_XaIuEsi5Hsth<=@0JGE3+&n+:`8U:e]G68pWp;.Ze`n/"#HjXnr3m_3]&LDT%JqBYK--X*/L<Dmh\/-]K]=-M3]O=Me._($k.8jL(n2m]B)T2tHn2aoX^VJh^=T#1lO2gpHLdW<$T8nDN2nuo8s)R/X']>SOi8%9)UUb^X$0/hkO68\jlf\9'<8<jcIcuP*l>p7?4G/o\ORZ4JFX)Zubhp24nF"Pj-dR(GbGD.0?8^&).6p8?1iQ61mb!t\J(3LS[.;QiF9c$)5+tQ8+?L8DW.Q0?4FK@MOTV1AGl,l/L_M6NcU%]BI)cVndgaXWJtIQX&+<@.]bm>1`:"tEMHqW\7pIX_]:sgBa\W)'*(o'YNc17na._1*f^f;snOkAXPD"]o+];?+`gX?KmN;E4%WNI:++>C&+&TBkmflG>Z7XEK37LQX;NFm<@XH"M@[QCRK9OIl%m5WWLP[AgXu[Zo[@;EB=/24/V>;J=/gW`Z,`\'*DVP@kT%1#GNZPW-O'^FueqQ8hlB*8UA,7r,]5%"^<fZjO%dD3mg%]!1$C[Q!6pa*D,;b\NVL_N;W$sQ^3J'p4#ID\k]ePf38#;t3qRmdo<7G"Nri'>gNK<brNdc4BC`4S;Fo9=T[Q7ck=7RW<)`T)M^"=OqJupEZ4;nmbNBN2=+588.4%1D;3iLY]d3i<F/l)T3fu#lRG@6@e\G8$Q#IWa*1a%`7e/JM$=9JH+it@pM*Z>'ljDrMGoFZLTOn0;?D:td\/#Tie,a7C#DWQY-6/QED-_#q+$)&mOI`g7]fVh#\IkorI7I](-Vb]8$E=E1cF370gqcr^Y)@=An"1Uu+gTeD!bC[VI6cf*D_5KMC\L-sSLZeF:jK]!aBk.rnR*!d,>Lp#s5;/+#e::ZP+MV_QL?06ulH*@"-%NC_-ujl8JR-t3PL-&U1>)d^!rB0Qe$=cgf;hrS;t)E'as+&EX"7^42S%&)Xn&@`<m:gZ/fRYuB@mp;[S1JD"58Ahit+^-=[P:1dI\22o#M`N0oPBmPc(7%0o8`aei\W5:1k0cM[d*UMg4\ZeOWP&c'tiV:XUs2FKu0i9IQAD/k!sjRmMo_e6C3S8:)'o^Xdd9!<Mu!4^*<\.[,k;)OqT^3%&KTSTDs-k#$K(bCm0UCeQ3lL`^\@2_T;LY%s$@e;-X2!=aiq&T-C_,#sDgo1,:48J\"Z\RZ<D]dQNNkrdmX6S8-Y>6ZBdSAW/XfuhD2Z%4:.AO<X,Q&m`E%p4IThqfQ"V??aK)mZ"NJ4r.YCb+.1dI=-!gE64ff@f/NYDZnH)QMg_Gt?D.%oc7o2uE,:,CUW%guM%&rEsH=oV@VtYpjZg46k-ZA)n^j7K1pN"K/s*kFp:]NgoOe-q=,&aS;^#F55d=a!;W=P<?\I*h;IU4EaK6HM"%H#:"etrW1DX75S&l;*u3M^20T0-VH<,4YG8%'(G]0=[_2s@jY>_j=-m@bL.B>IYM;.L9jP\0qCNHjmf,@'fE<p*^qYd,U.k3']'@`U`5p)f0BJ*P2sS+p`A/Jfs2WQ#3A,kqn1VGl<9m5bTUR0D51jX24(p;jcJ*Pq@;;pXfl0JajU^g^Jg(fCUj92oqV@1V7O2VY&9RCFAtu[$7KoHHsH$E,n>m//\1G%G@.u-Ste@\:_cD6W,O=W<s_:J,[Uk*-i(5P4-N.l!(ZiRr4HT`Xf%<G&l;q^A?,6WXchVogAYA8Z)dZb7!K083n,["T9H:JMrV*S/`a5'YS"0DWD,TmAR;KY,Rbs/bXI7Yi=ui"4@6@j#N82:;-&<aV3`IG[n/S:HX?!j/1"rn`^#22+caN6nH.7M(-=-!V)P*sHDl1da1#+>6nM%HU*;AtZf'S11juZ.Yst.S;=fm^A@Wapg$qBJB<:-lSpHhf,Oft@29kW1L;qrHlN!rZHl-HLpTC]Fp&q@V%O`]+$t\["O;?A2%.r^1,^uHdW"6U?=)Z%krA>trKAV]BmtJd$:'GRp@?t!+hK+<F)qN!,C=`1H>SVMuSd)CVhmDpgWWi=6.&.17V,]#.IrFkA;@iKalg=tm@$,G[.U,NR=7abV^*93U2GttG"7fU:RF9N`/\9JhcE$.[HYcP:hH&.:!]*rO\3IZ9NuF#Tgu;Fm!d10uPHqd7!cc*.,M0BR2fJ6ok$9*`94',].GA*&W'tO=T)D!n;0dl=#X96ONeSoChM',c\2XBUAI0`i<#C+G\sn`>]n##nj]]V"gbJP3L7?f*M[i<HU*)uX,-+@>[0iiI];JF9O\at%Q"6rsru7<MV>5FT7,ebJ4lksZoK(.-GL<2CZ[X"7G7kP-(qJC"f!+OVchoS6$Qnl&eOMdSYX6]XlkgOl2>D7G]O;7O".R:KBl=IHc'auZCq$@_Bsa#!f$I[Si$eoRr*1i(@[d1IUH09>ac29J[4$_8<@u'b(#Mnj+*0(+efsUC$$0tC?"U6>/ffPZT2?Z?k:;L&.m+EEl<g]hYD:dBLIK-C(Bk3u[O)FmK?GOKL\;o!>D%@a:JZ!VYVe93b[n&A^_Tq]_8F1pf5!+#^DLu)f?`PKVAX/H"Rk.=c@N;;nQa&e5'M.;[2+=Q63`nm2.<Z4!ZuI7\J-sSWZs&)3Pk%?(p&mU#0upTo%"_H,-;ZM]%Wbo.Tcd/E3hbV82)\XrI5N3F@PDg^.""h5Y#1P-if7a0IZur.VuEg6iGW4f$<?j4ZLArLNM/c]c!W`*;/a=&ih5-peOgbUBH9CAUGRml5]IHYBU8ZJ7aFO@(6;<Lio:qG;is8DnQlch'L!TSc0;??.ll*\6La.GKDd[Q](Q6!D-Fj.OQ,&Z@Q/F=lm%`(:#g@X1A=dUMhkBd$5?2NDs&&oaF-3V<Ss6E$eR?oajIjN`\/o@a]IeChBc1S7U_hmqEsYY5SYJh=e_~>endstream
|
||||
endobj
|
||||
17 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1701
|
||||
>>
|
||||
stream
|
||||
Gatm;gN)%,&:N/3m%]`r#XK*9oZ]sr:-+f_(JXjk(RTe"Ua2W6TN(UM])XLYPZ[KeA;rtj^uF]5%Mf9`!rPmp>>tUkB(5L="WG6o!Al,XbW`r5ZcVqJ8HY8i+cmtqJgeZP&uIC9q`cE\_0/]Y9<^(n.AV5aU,8N>!K/_MZ7t+DQ1-Kl:f9,<R(U>PrfG)YF-L2p2a1B3`t\0o):6[X!@8*j5tB;>$Drm>$=,+bpPR;U[].jI@(DQ&L24<LWY!1c4)Uhp[=Ae)aCY;WB&@"ig-Le^O',*'#iQ<W^V>3,^:jPe*FK.l0/dc*1*=IVjWqrM&<C<Cg:Gpd#UR\c'IRn[Tfs@CLcI#NL:O6^D63.-H$Fi1iTACSUNTLQUfMUaCA[Ua(bT>g=a5aDbEi:_aPm\2\Mm*scF"plK]Yjdlu45k"'kdAn;3,=8EO(6QDetME<^DP8XAHU>Z2%Q["--]8`6L`(Xhn*nGEUuFq(SUN?U2pd:e;UoK4Be!28FMKbK6'q0<(on/8*I%Bln@]7V6H@>6VX25Z^/rL9.5GSUpskcZ2X,G[h<@4TJ59!Jui$_k9NE_M&b.K4HNDsRsmjk@.<I!p,]niZa0,Tf,;WEtg(HTpKu6ILP'kI1Y?4U3QuXHt;$9sY5$\lr]22g'NUE/=6t\6itO9e@r9$Wq)H,+5hMo./V(JP3n;fNE[.SH"9Ok=*ct:$ISlq#jq64D&4-`P^pq8.Sa8=,sE"/5+dF>9UDtI,anRq5AX9IKnE!%'\'i$e$ftn_EWP$%N3;O+D"e+qnC0Z)l8^[84a:a=i@n+Gq?s=2<F'Xo=S#d_=L&Q9uta`eosZ\8_'j\QlO,^8s@J0Z%/9KhKf8![QY6kt'59l1bq,hbIq*fP<p/%c'UVp3NELE"^9:;gQe^l-P]NLPGfAmnDb]<uMSiN#c*tpV&FUa'JHu\<.dlR>n;"EDPM^8^`BL;J9m%Y:%Qjk$U#b1up"t&JhoA+C6:&W`csF0#cN>']0pnB@(uVGG93+HS:QCaJ"8T",TQqH(ZaKXof<TPX``r/_4uS`G]-GP!<ZsM\U21]Tk/nrL"-G<R-RK]X.m#7V`^HY]6Cp^o&)DUD#fGY(Z3p:t=SVmM'OiXL4G=_XaU&TTtiB+.UT80^YFhWb65-ST4rrYBQYjU6X6@7#>4-&Wc52Y0aUB\a<[-#sQs5<DYOYV1fM-,G=%B.;LTinLFt0L<s,g.p0Ea8?7f!e.,.1dCS8A'_C1BW?4E6k'WEn$$Su2^c_`gaIO,JWtNY%=AbcMmM5n?Y'D>_qW$bYJHcc5CEN$BcJj!n94cV![3O#KO$*ZpGV&Yt=@T#k%-R#[NeUgW8TDrN$X'_bb#93jmm&RMhuJJ-r^;Z8fUljQ\J+AM_TdkVO"R8c="ZZmgKloon<@XVU1AZDV(I[:(WC@g%=j"JKWW]&?q@M!-.9\BrNK=#GC$a;d]X,c-QA2/Sec^`Y>%Lo$g*mrEAL^aX)39*c7<#>NPjpC\Y>o;#0NQ;@j/]`\PeFTYfF*:M2/!%h%J3;nfR"AkFYNH&U0($jt=%9hMAbqFZW;*7rtVoD-?,+U(TDah_'q?h)=l7mJ5:R\&.C%L>1,*2Ka5q7@PZ-iapB69t.Tos6Z+e6c5!s-&nOa^eO^_<)+;A@C)_>pLD]^Yobc0%qF4,9Ii%u.?n7C5HmTl*p/9Y0_lf<5XNE~>endstream
|
||||
endobj
|
||||
18 0 obj
|
||||
<<
|
||||
/Filter [ /ASCII85Decode /FlateDecode ] /Length 3050
|
||||
>>
|
||||
stream
|
||||
GauHN8TWq#'#+6Eo[-7M*:BON-RYKWq,J3N;E\B-JOiU*_CZlZO7MUD2o&-/;9OW2B$-DC&4!#f6SBNpJVjCYofL@tITXMbNtthUXCJJ>_hId0n6pb:pPlF3]caPqn<\^j/Fh2u(Tn"h5M[.t]\_`-q:K=5/QaQjL9iQcaM;iu_[GhMd$DQ6VHmba"*'`?]*@u`Sr5BdIXlM"Ve7Yg$fmTX=KSCt.Y6h%-jWG4_<hW2\P.n_SdQ=M;j3KNW`^p2*:D`V(*Tk2pjlG>Jg,pS?AWOu%BTS_os_=#BR\Q;(^gS85FhcLBm'1Br7dd!>C^A#KDX'cdGCFji<Pt=Nq_D>[<qpi.s>;[Y4)4%WQ2#RGQ`"0+lZXe=1.BQZMO+jiVpIXhR)m%-Y/?P4Kjfaa[8E"Q=h;Bo>J'Wr6^>XdE:8VhsP=F]8!`cQ\Z+QJS!gW$f6=RR`GVe<d=YlmXXA\M/NIu*cn\ebg7?Fnd+e1^FNOSLqIQhl9Ls$&il8_\6:(l@CTJhMZAMf3JOZ3=sk;TSYjB,aL;_cRK8TlfT(fQD,U;4L)Q\`>!-Yj)PR:%YK96OPYBX2.XG^E.Lt9h_BQ0pO[@ja+cS;YQeKpLh'R%d%gs8K[1eQnDKs5@S=lb"6lr68cU/12agIsJMO"cAKn!k1]o"Yc;7'6OA2qhG%uJruA<?@&+-s'go6U'2F0*uiM<EXtr7$$%eG1K*jtmQD^)L0D&1dpnZOl>N)i28B1"EX7qoY+i9%eCV7s\"+"\]nZPne0,(`HP.R[7V/,<c`b-MM1VQ=3tR@b)i,73b/`\Yeb>qXi+EB'78]8,KUi`:Bj5<;Mr`C;!bm/M^',-Z&@DbO$?c-:Jn]TQ&AkG4V#@>`*0#j,$0;=(/t@-KX\]A7Zp"`-kq<U$7V<GOhb^<V,RiM%KX;C!)iAeU8G/Ycc=Xn<ck*U7p=,s%nU^]o)n%"aW@Q*DAVPVg)#:U?:a.p)E5@XZGPeb@s@41BM>>Pl0u>8A4\>JpqgY=X8nLRm-Hc/F5"ojkDr!BIfPl&j-cT%_Ti8IjH_F!-'*8:"H,!!$H=DIubQJ(*+e[\X7OO4VD@+Mp=4[(iS\&TT*&l;JN>Dg^/)kJjSH,I65I?n1R,M$+%1fD"=^bY"o)$\\NYMb4#e6eT::lOKfc]'$=Z95.?P.$^0pOgmIK'(KeFM-trd%"g<ag'87D;UGMiYEf@.6]6TsG1T;G3,>]7F?>-@l<);$5"-ZBLiPlHL9q(L*9]MAr0nl)ikqAPUYu)]=33#Wgk'W):pk3=U9IAma3cAGN-<CfH6rh;k'R@8Ki)b#u(sJ6!+:l\b]#aA_L;:1N<UN7SUHECkd]R'qq@ET'H*TPQ<I'8GffmQB%>g9dTW3ORK>k>2^NCQ'0^c_p?&-*5GMos5_]6.TWnHl'.GR9.>jp1HY1XdX3-sZ,7#'mO5;6(0L)TThX[j,AGtn3#R@dAc2WUbP'oO=p0%saNd+*s&jY[l0./fHrpp3]"j)iKiSr*tggg%C)Cgh`ahaUml;X\]EDnQ5J$NjEU-0.$PTUS1W;$fA8hfh(Z=B)\sP#W7#iKZ4P",n]>.L'jRncT4q>nD-T`/KUhOc1H<nKB>*IOZ/Lg$&a<3M-]g)TMXCqTA)JXg^\oLkTYGWq$6\g^<]<o"5P%dPm[6bI\8n>r_.=_/]i44`+1-HK^`!<0X-lJo)uCFiBG^<]-[S.LHV]1UXg6l7OZe'B^T)WeNtJZiXj59c?lSVHaT+s%l__NNNK3X25>^@o]&%aDB?$pD$gBbZBoi9Q&2`LgdQ@=k=V>2BC*F"N>Cqcb%N)`1R,T7K?jO01Ulok8X/CA$K.]X6A*uZjdgUQnnp7HdfRAW8;QtP4/D/jWbd6hh7WZCWb]%75m6(fcN';]>3S#M5:P#9'S,81`=:?<?,MCf<R06lg<f7`'5)I/jRBlLAJ%5`#%P>@-FNs.721eaRNual"$N6D)"/4(Ae0?bdQ:onOhZ'ZOCNj`,;<9a$Ns.V'8-dD[n2#Y;O-A(%BF'N7=,M$p!bnh*FTNcj^^S5-_s#Y:gD809&@7-;8;+2o&;MO<dATXU$RFeb/jh'_$UjR&=*,84ZHX+Ne0`WSQCXSG<lMY%NMbTZt"ID)3fCmMA2\7BG][gP4sM[E$n,9[f4PIM'-3R]PP(0n6;t_AJt:Ojsag.>R/i6&j"f:g2RPmGjA-MNk%P;-ndK)7A(B.*Pf`I)\Kb^p[2UA+AHt*T)>elK[5Jc\&+TX,\$oS#Ds)=sBuYgQ]?E=\dQKN,V-*7g"MnnL9HWZ0YatE,53mC2Qs-_WZeabY_FQ<"UOb%rd>L=XWD&3#`ZhgY*BVPNeg@()alfMn9F9&sMH[C`CNb`SeC0Xnu4jLYZ2j:.$WJ4#+8)kj@cqs,huH2nee_S;HC>IEYWC+AkqW'kmTG]AEDZ\A#;)r!oJpa=bZ5k7[6u//=;GpYBC!h123:C9'$oF!J37/ktWjMZt.DmQ@H1')HZGd2h"+P,q61k^4<r4T+O2d!PMaIi_KDnS7AXEXjDX_fWEQ.[6bY:DJYjj!/lF/7n?CA?=qX*ZU`sT1@I+;SKM#XZkCKKErGm!@Vqf%=-q"X/M5V_&,R.c:'bj9Hm7/-;s9)8+`pP*/BWmj=qZ]_++^t)\u1+FL7Z/,j[h+C?W8]s.C%?IUsji.$*mHr-As=3BVPVamAjW@PXj(36>^b?LS+4f5[Ak&HnkuVP1YYMQe7rH,1F7[Ujppmq3R<oG\N30jX'&8)t9^Us]>(c:ZWQ@Ta%fkgsPjIpLH;21L"KfiO$%,AISpF;D,41<k>m445Df2YY6Y:%RlP'2>7YZKNqCb=#a_;O#:0O)",`eXI8q).4L*MHK(Ef=t/08^T09gXdmcS*+:<N;lX93*bSU040fVllMo8e0XA8b8^Tj4aJflJ0;3#F&oGcIA#_Ya&k1I/_HOO@"dZ&'&lbCT4lT9)kO8S2rKhTNG5T+om$/^kBF7_;-NIO#K(N+g3H*6aEO)#7ou3/)O2X;__@<+dS.,^1AY]b2*AMno2^3Wo0;nOXRl~>endstream
|
||||
endobj
|
||||
xref
|
||||
0 19
|
||||
0000000000 65535 f
|
||||
0000000061 00000 n
|
||||
0000000102 00000 n
|
||||
0000000209 00000 n
|
||||
0000000321 00000 n
|
||||
0000000526 00000 n
|
||||
0000000731 00000 n
|
||||
0000000936 00000 n
|
||||
0000001141 00000 n
|
||||
0000001346 00000 n
|
||||
0000001551 00000 n
|
||||
0000001621 00000 n
|
||||
0000001982 00000 n
|
||||
0000002072 00000 n
|
||||
0000004849 00000 n
|
||||
0000008283 00000 n
|
||||
0000011177 00000 n
|
||||
0000014320 00000 n
|
||||
0000016113 00000 n
|
||||
trailer
|
||||
<<
|
||||
/ID
|
||||
[<83f0477fc92acea31bd101536aec0164><83f0477fc92acea31bd101536aec0164>]
|
||||
% ReportLab generated PDF document -- digest (opensource)
|
||||
|
||||
/Info 11 0 R
|
||||
/Root 10 0 R
|
||||
/Size 19
|
||||
>>
|
||||
startxref
|
||||
19255
|
||||
%%EOF
|
||||
Loading…
Add table
Reference in a new issue