From 5d512d2e425580f67844f5d0a1257213220d13bb Mon Sep 17 00:00:00 2001 From: batunii Date: Fri, 12 Jun 2026 19:16:45 +0100 Subject: [PATCH] Included all the relevant licenses and notices for the open tech used --- .github/workflows/release.yml | 4 +- NOTICE | 165 +++++++++++++++++++++++ README.md | 8 ++ app/public/mock-clan/spec/agent-guide.md | 2 +- app/public/mock-clan/spec/clan.md | 2 +- app/src-tauri/tauri.conf.json | 4 + crates/clan-sdk/src/toon.rs | 3 + spec/CLAN-SPEC.md | 2 +- spec/agent-guide.md | 2 +- spec/clan.md | 2 +- test-sandbox/TestResult.clan | Bin 25557 -> 25607 bytes 11 files changed, 187 insertions(+), 7 deletions(-) create mode 100644 NOTICE diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 2fe33a9..5a05a98 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -77,7 +77,7 @@ jobs: staging="clan-${{ github.ref_name }}-${{ matrix.target }}" mkdir "$staging" cp "target/${{ matrix.target }}/release/clan" "$staging/" - cp README.md LICENSE "$staging/" 2>/dev/null || true + cp README.md LICENSE NOTICE "$staging/" 2>/dev/null || true tar czf "$staging.tar.gz" "$staging" echo "ASSET=$staging.tar.gz" >> "$GITHUB_ENV" @@ -88,7 +88,7 @@ jobs: $staging = "clan-${{ github.ref_name }}-${{ matrix.target }}" New-Item -ItemType Directory -Path $staging | Out-Null Copy-Item "target/${{ matrix.target }}/release/clan.exe" $staging - Copy-Item README.md, LICENSE $staging -ErrorAction SilentlyContinue + Copy-Item README.md, LICENSE, NOTICE $staging -ErrorAction SilentlyContinue Compress-Archive -Path $staging -DestinationPath "$staging.zip" "ASSET=$staging.zip" | Out-File -FilePath $env:GITHUB_ENV -Append diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..4b33a2e --- /dev/null +++ b/NOTICE @@ -0,0 +1,165 @@ +NOTICE +====== + +CLAN — Context and Live Agent Notation +Copyright (c) 2026 Sai Eeshwar (https://github.com/saieeshward) +Copyright (c) 2026 Shreyansh Soni (https://github.com/batunii) + +This product is licensed under the Mozilla Public License 2.0 (see LICENSE). +The CLAN specification documents are licensed under CC BY 4.0 (see LICENSE-SPEC). + +This product includes the following third-party open-source components. +For each component the license family is noted; full license texts are +available at the URLs or in the dependency source trees. + +------------------------------------------------------------------------------- +Specifications +------------------------------------------------------------------------------- + +TOON — Token-Oriented Object Notation + Copyright (c) 2025-present Johann Schopplich + License: MIT + https://github.com/toon-format/spec + + The CLAN SDK implements the TOON serialisation format (spec §14) as defined + by the TOON specification. TOON is an independent open specification created + by Johann Schopplich. + +------------------------------------------------------------------------------- +Rust dependencies (CLI, SDK, and Desktop Viewer) +------------------------------------------------------------------------------- + +serde · serde_json · serde_derive + Copyright (c) 2014 Erick Tryzelaar + Copyright (c) 2014 David Tolnay + License: MIT OR Apache-2.0 + https://github.com/serde-rs/serde + +serde_yaml + Copyright (c) 2015 David Tolnay + License: MIT OR Apache-2.0 + https://github.com/dtolnay/serde-yaml + +sha2 (RustCrypto) + Copyright (c) 2006-present The RustCrypto Developers + License: MIT OR Apache-2.0 + https://github.com/RustCrypto/hashes + +uuid + Copyright (c) 2013-2014 The Rust Project Developers + Copyright (c) 2018 Contributors to the uuid crate + License: Apache-2.0 OR MIT + https://github.com/uuid-rs/uuid + +chrono + Copyright (c) 2014 Kang Seonghoon + Copyright (c) 2014 Brandon W Maister + License: MIT OR Apache-2.0 + https://github.com/chronotope/chrono + +zip + Copyright (c) 2014 Mathijs van de Nes + Copyright (c) 2020 Marli Frost + Copyright (c) 2022 Ryan Bleecker + License: MIT + https://github.com/zip-rs/zip2 + +jsonschema + Copyright (c) 2019 Dmitry Dygalo + License: MIT + https://github.com/Stranger6667/jsonschema-rs + +lol_html + Copyright (c) 2019 Cloudflare, Inc. + License: BSD-2-Clause + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + THE POSSIBILITY OF SUCH DAMAGE. + + https://github.com/cloudflare/lol-html + +thiserror · anyhow + Copyright (c) 2019 David Tolnay + License: MIT OR Apache-2.0 + https://github.com/dtolnay/thiserror + https://github.com/dtolnay/anyhow + +clap + Copyright (c) 2015-2022 Kevin K. + Copyright (c) 2022 The clap Developers + License: MIT OR Apache-2.0 + https://github.com/clap-rs/clap + +tempfile + Copyright (c) 2015 Steven Allen + Copyright (c) 2015 The Rust Project Developers + License: MIT OR Apache-2.0 + https://github.com/Stebalien/tempfile + +tokio + Copyright (c) 2023 Tokio Contributors + License: MIT + https://github.com/tokio-rs/tokio + +Tauri · tauri-build · tauri-plugin-dialog · tauri-plugin-single-instance +· wry · tao + Copyright (c) 2019-present The Tauri Programme within The Commons Conservancy + License: MIT OR Apache-2.0 + https://github.com/tauri-apps/tauri + +------------------------------------------------------------------------------- +JavaScript / frontend dependencies (Desktop Viewer only) +------------------------------------------------------------------------------- + +React · react-dom + Copyright (c) Meta Platforms, Inc. and affiliates + License: MIT + https://github.com/facebook/react + +@tauri-apps/api · @tauri-apps/plugin-dialog + Copyright (c) 2019-present The Tauri Programme within The Commons Conservancy + License: MIT OR Apache-2.0 + https://github.com/tauri-apps/tauri + +esbuild + Copyright (c) 2020 Evan Wallace + License: MIT + https://github.com/evanw/esbuild + +Vite + Copyright (c) 2019-present Evan You and Vite contributors + License: MIT + https://github.com/vitejs/vite + +------------------------------------------------------------------------------- +Complete transitive dependency list +------------------------------------------------------------------------------- + +To generate a full machine-readable license report for all transitive Rust +dependencies, install cargo-about and run: + + cargo install cargo-about + cargo about generate about.hbs > LICENSES-RUST.html + +For the JavaScript dependency tree (Desktop Viewer): + + cd app && npx license-checker --start . --out LICENSES-JS.csv diff --git a/README.md b/README.md index 579f89c..e746618 100644 --- a/README.md +++ b/README.md @@ -267,6 +267,14 @@ A CLAN file is live: it carries its own specification, so any agent can understa Maintained by [Sai Eeshwar](https://github.com/saieeshward) and [Shreyansh Soni](https://github.com/batunii). +## Built With + +The CLI and SDK are written in [Rust](https://www.rust-lang.org/). Key libraries: [serde](https://github.com/serde-rs/serde), [clap](https://github.com/clap-rs/clap), [jsonschema-rs](https://github.com/Stranger6667/jsonschema-rs), [lol_html](https://github.com/cloudflare/lol-html) (BSD-2-Clause, © Cloudflare, Inc.), [chrono](https://github.com/chronotope/chrono), [zip](https://github.com/zip-rs/zip2), [tokio](https://github.com/tokio-rs/tokio). + +The Desktop Viewer is built with [Tauri](https://tauri.app/) (© The Tauri Programme within The Commons Conservancy, MIT/Apache-2.0) and [React](https://react.dev/) (© Meta Platforms, Inc., MIT). Full third-party credits: [NOTICE](NOTICE). + +The CLI and SDK use [TOON (Token-Oriented Object Notation)](https://github.com/toon-format/spec) for token-efficient agent context injection (spec §14). TOON is an open specification by [Johann Schopplich](https://github.com/johannschopplich) (MIT License © 2025-present Johann Schopplich). + ## License [MPL-2.0](LICENSE) — the spec is open; implementations in any language are welcome. diff --git a/app/public/mock-clan/spec/agent-guide.md b/app/public/mock-clan/spec/agent-guide.md index 7a31281..8589623 100644 --- a/app/public/mock-clan/spec/agent-guide.md +++ b/app/public/mock-clan/spec/agent-guide.md @@ -14,7 +14,7 @@ CLAN (Context and Live Agent Notation) is a file format for passing structured c | `agent/output-schema.json` | JSON Schema | Exactly what you must return | | `human/patches.yaml` | YAML | Text edits made by humans (if included) | -`shared/data.yaml` and `agent/decision-chain.yaml` are serialised as **TOON (Token-Oriented Object Notation)** — same data as the source YAML files, ~40% fewer tokens. Read them as structured key-value data. +`shared/data.yaml` and `agent/decision-chain.yaml` are serialised as **TOON (Token-Oriented Object Notation)** (spec: https://github.com/toon-format/spec, © Johann Schopplich, MIT) — same data as the source YAML files, ~40% fewer tokens. Read them as structured key-value data. **⚠ Token-saving rule**: `clan read agent` includes all data (TOON-encoded). Do NOT also run `clan read data` — it returns the same content in a different format and wastes tokens. diff --git a/app/public/mock-clan/spec/clan.md b/app/public/mock-clan/spec/clan.md index 4b0a1f4..c75204b 100644 --- a/app/public/mock-clan/spec/clan.md +++ b/app/public/mock-clan/spec/clan.md @@ -88,7 +88,7 @@ $schema: "spec/schemas/document-type.schema.json" ## Agent Injection Serialisation -When the SDK assembles context for an agent, `shared/data.yaml` and `agent/decision-chain.yaml` are serialised as **TOON (Token-Oriented Object Notation)** — approximately 40% fewer tokens than equivalent JSON or YAML. Agent output is always returned as JSON and validated against `agent/output-schema.json` before packaging. +When the SDK assembles context for an agent, `shared/data.yaml` and `agent/decision-chain.yaml` are serialised as **TOON (Token-Oriented Object Notation)** (open spec by Johann Schopplich — https://github.com/toon-format/spec) — approximately 40% fewer tokens than equivalent JSON or YAML. Agent output is always returned as JSON and validated against `agent/output-schema.json` before packaging. --- diff --git a/app/src-tauri/tauri.conf.json b/app/src-tauri/tauri.conf.json index 8641d02..9da8f4d 100644 --- a/app/src-tauri/tauri.conf.json +++ b/app/src-tauri/tauri.conf.json @@ -25,6 +25,10 @@ "bundle": { "active": true, "targets": "all", + "resources": { + "../../NOTICE": "NOTICE", + "../../LICENSE": "LICENSE" + }, "icon": [ "icons/32x32.png", "icons/128x128.png", diff --git a/crates/clan-sdk/src/toon.rs b/crates/clan-sdk/src/toon.rs index 536f9d2..f0b81c2 100644 --- a/crates/clan-sdk/src/toon.rs +++ b/crates/clan-sdk/src/toon.rs @@ -4,6 +4,9 @@ //! TOON — Token-Oriented Object Notation (spec §14). //! +//! TOON is a format specification by Johann Schopplich. +//! Specification: https://github.com/toon-format/spec (MIT License © 2025-present Johann Schopplich) +//! //! TOON encodes the same data model as JSON/YAML using indentation and //! explicit `[n]` length declarations instead of brackets, for roughly 40% //! fewer tokens on structured data. It is an **input-side** serialisation: diff --git a/spec/CLAN-SPEC.md b/spec/CLAN-SPEC.md index e4d394a..f3f78d2 100644 --- a/spec/CLAN-SPEC.md +++ b/spec/CLAN-SPEC.md @@ -802,7 +802,7 @@ This ensures the SDK's I/O footprint matches the operation being performed, not ### TOON Serialisation for Injected Context -The SDK serialises `shared/data.yaml` and `agent/decision-chain.yaml` as **TOON (Token-Oriented Object Notation)** before injection. TOON encodes the same data model as JSON using indentation and explicit length declarations instead of brackets, achieving approximately 40% fewer tokens on structured data. This reduction applies on every agent call across the entire pipeline. +The SDK serialises `shared/data.yaml` and `agent/decision-chain.yaml` as **TOON (Token-Oriented Object Notation)** before injection. TOON is an open format specification by Johann Schopplich (https://github.com/toon-format/spec, MIT License © 2025-present Johann Schopplich). TOON encodes the same data model as JSON using indentation and explicit length declarations instead of brackets, achieving approximately 40% fewer tokens on structured data. This reduction applies on every agent call across the entire pipeline. ``` # shared/data.yaml injected as TOON — not raw YAML diff --git a/spec/agent-guide.md b/spec/agent-guide.md index 8716a23..1b1a821 100644 --- a/spec/agent-guide.md +++ b/spec/agent-guide.md @@ -14,7 +14,7 @@ CLAN (Context and Live Agent Notation) is a file format for passing structured c | `agent/output-schema.json` | JSON Schema | Exactly what you must return | | `human/patches.yaml` | YAML | Text edits made by humans (if included) | -`shared/data.yaml` and `agent/decision-chain.yaml` are serialised as **TOON (Token-Oriented Object Notation)** — same data as the source YAML files, ~40% fewer tokens. Read them as structured key-value data. +`shared/data.yaml` and `agent/decision-chain.yaml` are serialised as **TOON (Token-Oriented Object Notation)** (spec: https://github.com/toon-format/spec, © Johann Schopplich, MIT) — same data as the source YAML files, ~40% fewer tokens. Read them as structured key-value data. **⚠ Token-saving rule**: `clan read agent` includes all data (TOON-encoded). Do NOT also run `clan read data` — it returns the same content in a different format and wastes tokens. diff --git a/spec/clan.md b/spec/clan.md index ea1b8d0..05dc869 100644 --- a/spec/clan.md +++ b/spec/clan.md @@ -88,7 +88,7 @@ $schema: "spec/schemas/document-type.schema.json" ## Agent Injection Serialisation -When the SDK assembles context for an agent, `shared/data.yaml` and `agent/decision-chain.yaml` are serialised as **TOON (Token-Oriented Object Notation)** — approximately 40% fewer tokens than equivalent JSON or YAML. Agent output is always returned as JSON and validated against `agent/output-schema.json` before packaging. +When the SDK assembles context for an agent, `shared/data.yaml` and `agent/decision-chain.yaml` are serialised as **TOON (Token-Oriented Object Notation)** (open spec by Johann Schopplich — https://github.com/toon-format/spec) — approximately 40% fewer tokens than equivalent JSON or YAML. Agent output is always returned as JSON and validated against `agent/output-schema.json` before packaging. --- diff --git a/test-sandbox/TestResult.clan b/test-sandbox/TestResult.clan index 8b4faaf3f7568366c57db92448d6640da4b15127..96ffd859315593d374cbd1211773c38bbd512b99 100644 GIT binary patch delta 6083 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 tCEZE)57`Z{-`J@0oMPi{s(d>k(K}e delta 6014 zcmV-^7lG)9$N|;I0TWP50|XQR000O8001EXu_ln%s*w{#e`ON{$%n6AfThRb}duw!Li!rfX&E4E{+x+$SpZ_#p zc$%Akc{=s;v??Rx%=Ch@?4-0`E58Q#qIIiMtKB9luwMP4RIAkLbfo8G{YB{(bgR`S zdL2^;>Mg(Te+I^{+^(ADh$9d4%L435j!dl9mAI^JFoGTwtc5ft(luKZKUSQ^u5D^3 z^xN(BG<+KlKZfmRw%9C^ee5&sP&?l?*WXa9O+_2vVo53EV>CLY0Eoo~N>ogus8mee zWnC2*&>^an*y%{w$i~F|jBT?QNyZNQZenV7r#%kMfA@}mG`}t9H*z-d`1@)Jopl&_ z5}dY~#}mu=GLL!rI@i#2IE_Vym#Niq_o-d2n?<|nDEFv7qef6m)Ij^9Z1TMoIGqpDCsMyCqp7%*2-xk46=gDxsWU2S2*%17h8MO(r6 zoHb;xe~X0cE#B8tM|{sGCK%?+#1rPt+-GTRb{=$P<84H=r9?v!Em^sRf|`t01|W(T ziw{T+!8x5FI*vgldZR5k9EPr7zZP5L2k}lEL)#^`dBuJIj{B5)GohPQKue=wf%3)aKdB;6R zx7X;cx{v9flD2?W!C7sE!2u>9<23|OIbi{(F=peKDkNXXS5=D!VCytt$T9OB>Qr{T z#|P5GX+ECb<~ILLhv9+vebuwP*X##oM;a7sAF8<5=Rg#LC}_|wa_30NM@0;UwABGi ze=Sn;WJ|0yxTNmooo1=$2jp|?-V681pEW|3{v>@yI};!kPl_zo;8CioBxyS_fP8pJ zV1e|)Mup^RY(eOC!h0j^up1sor5$$56LFdR74qAv&mvb8*?=|GR5FMk&mAJ9Dd%O4(yZT*&y8`te{{ij;&W)*Nt64z+08egceyvNy(T?&@_^2X zK34-XnnKWlXh5F966WZzY)^uE=+Qca?PuIG^LUe9u*N?5`hW z><(i$zb-HI6Ry0;o>eXxRU{=Mdg%y1rp#@q@)OqF5T_XNF8d; z*y9%k2oy!MK!C~H%qoB&DT!K*J-a&*Bak3am6erw@?>W9 z!9Sc{o!tEV=}b(sS$MQ_P+XMj<1$m3E4-UZTCmQi^DjY_USq6F1x$E%)tkyu! zmbv3lVM4QTyVZJEN)I7Icb;PW;uF6y#p67Gl^X_k&`zi(*>VH+J-6*njC2bX+)cBg z=(buF?XmpA>gx;t#m^5a$pX&}i(#?WQ6W~l`;MpfG4-4JP^;oU}>(mUIxPFkQL(wC%h#~4Ej2H6j&=^K#E384Wk$H%z!XU+e zFJ!+%5yg?J%)Y#i=|w zzJ7nDKV4m(^M{+Ot4sdy@$w(fPHyy%AC5m>{>#Tt_;MjX*!tq=OB|kRf(vI@Qy?RU=!u7x8Sc97daU>Gu zkyZIS#R{L9gmnDeBp+|&@N&Tfw1AZ@?d7hVzof&zDEssA^K3$xK-r#U5ow8UMaRJ2n#z#GO2u`R-uQ#YLoUxk@_ zxZfSLg?s4qdIJEUio7Wx=3Wf?Ex?1Cs3c+8$@ktcUmgV%o`mf7t?oO2(S$zYR0-)= zt#>=*ux}W%W%b(o!VBG~>H50^Yz*Rnc; zJ`K@+!w?LgJvgT8r=r&0Yu6iaVJOqf@P>jJv+QD^AK8W~m^fWU6v-O6g?FSdeVDIh zTP?f=NLN)y#jQjGIITi|A}#?&hGKV@XCO!!mS{_NjQqPcSP|So)My%+`uBVM!3%>C z&n(^fT%`8_Xa`U{06eAGZ4eUgUio!Bx`EkJH|6Yjn#{tDJY~(kq-@*j>m16thR;kw z_YOkOVse`mDJc?Egk;YUzx>Dl@BmRP!Z^B9i5W`5az*Xj8EdzHsc#c0%x96C2(olB zN#Yrc0C(}?*(}J!VAAQ>`@I!`I3iWG_PaaaRJ-*KT=M}zJQYBt!Uqr@^AHnI(A}b+ z;uToTJWrpHW0Q zMLu-tZCs!F}M*Dg9N-b&a>M&6rkF-|Mc;aChGRZLV@??#N04i%fb^U*H@oEU;T7;EiSL*>G936a8u(FScseHAdrH6 zD{FN%PIWa5g16h5@+*Te*ZeS;ZQ;3I($823Z(Vg>L`KSjEo22qH#P z6GS7R4ebwY4@FQh!>+)QLYNEKpzss55Q_xyfB?x0bH*mN5Lm5jIWUjNk0%p?n*>=7 zv>@Vt38xKfUeR9JO%euq8`fc?gan8DT{0yL7Nz_F5l zahTl?9~qbO=st=Uk=Crh{|P~qrFH+1O1g4<)Yce~dNbuBB8&sZf3saoX?T#d%z@a2 zv}vn}3m+ldSZ*rl0_$}_T8C$x7O4~JG0lE+e{ILgq`0zc?Pi-cBjsq08WQPzbEysF zUy%!yU~W~(#2V$6rqJ$)y{x^=;12hHMJ<~W(#N5%S;+w4O(L6x<|(C1D+}WIUBfFm z-oft%vFY|kd_g#H!|Db;Q2vslxkOKh!UHD8S1Ne1dqSWGr&y>lGLfQ$ z$q!ZYZ$J+u?}#x>3(*CEBlkRxLe`3&%dEeu=*@Iq)Cd@6h(SJUvoX&7JC)sksyu0+ zGFoNX}qaHn78=%`9%~Cip%#*f-tp#eDVMurhiBmJE zCEez@>48xLz+M|~PXDraW3W{&5k#(#*D{yTFutWm_S*^0<2=7C zU`1r~L|L|HJueH&b-h%1#&KtGj{rL{DiaH4jqVsWAShcYJ@duvW|_=)tzIRWZ(03! z+h{BAsr-C%{N2SF|2!hXIGJEhQqwYFA-e_vqm%_q4a9a!s)N#nZ4V%Sj4o&N`~5Dy zRCAqQo!xLzr$}*hP-Xyg1})v-*sS)9R?zTu{^Q8=--@sON>?K6Tg1t|jsaf6%k)50 zki1=TawuKNcgcQSsS9Y zEz?+au_5~)8WBh=^q%X@r3`@57?>auN+>CqrPia1cyuD!yP@XmYiJbD1<=B@ zOs$3#Bq(l22m^>_bJC>_6R1&WSy=?1A}Fi|`3meRPbgYf>mgsT4UJeN_@ zxfa}L*VoK(GivRwy>x#3@d9OHGdMLDVS8j(P1@fk83r_p>d(pX`T5nw=@Xk!quL|u zZ7s7Qm{~D@Y1=6i(p2-vcF&Qt0lI_*0!W~AsTSmFT~vB9B}>z`#FmB?wz{nqw)H(Ca}#)}bJhu|$`=*@s9R)X0|)@q9T zWh|rc!HIt*%>94GA&vw^2%6e^Q)h45ULsVT<4>Z-d4SS@#xQp60=C8hnj4S96=vLc z61$#%L3-*C7AQ^6K?@tPQ9~{OnA?Yp)EI|~#XP$p=`>4nSO6+8X+z^ujUJ`ihAiN? z=tL66%qae4-~n8I1!ko2uu}FdbnwLLH90Eds~}j_hDu#fENJRTqJkk+m`r`p)D(>| z(fm|M(B(cf4!GhS24285Amn)&7#-z!l#cU%AqfgSlG zk5RE9wX(re-)P^~s=9ALMMwkPtO$GC3SdvfgiWw7VZO|KEb&t%^RZro)0^PD#TTwk zQ-b=yhA^-iaHqTUMIt10A_*Ha#Z?glfPGLegNRpA^!0O&=B7B}!aLPuf(?Z(ABjYN zE!$M!HC^K(T#~M~ZHj(wAAOw~)P_E!928}#;WFM@VSHyQu)DiDYuw%C5;c6mRmpAM*vrDa&-b#P8-82nbREZ3ou(=! z+6eO`fZH>xz;)cQ0{&DAu|PLYGA?%i7(o8-wI-rrtU_4Fi&fYPzWb z;f-3460CvF49b%TCTW=jy30x3F@%7OItZqFY(|p$Fhl8IrZK~H+u|8>;9(DcH>N6_ zqkI_O=O`&33gp0XM(ptfsT+4^&8S4+hlN`ezquR@W*`qfl&kZ}a^gx}K-)mi^TCXE zF~zkhc~aw(Qvr?zWmANho@pM8p6WD=D&_uClr3I}X7EL)Xwm+W>=~>)K$<3MA8vlQ z(AlDC%)kvF6t{`E^>nLI+plwzW!c!F<}3GOphWJb&vNZlW`NbVbsd0ze_)O8>F(Md zG8pL1oy{A96W^6qktMhtUg?Hc+u)`%{%kj#6zZ?`#3^K$5JH_k^DruMglU+|3`s&+ zrn9WO;^i>`K0EV@9(nz5xBsn=XZ;oX-B&Q1_@vL#(otI=86UJQ=tJeS zZ620~#KPd{0R0AZkB>HgmPyBd`4=`~^olgqPV<0LN3-OHUT#A#wNWgyv0P$bgC*ymi>3REB#k4s2(^eZV`Na8`OI{});|s6~zDRq!es%oU|p zfPuMSaone%1q?hilzyn+?5`kEN!*C`R5@FtaukI0RGtM;;Q>oY^r)N11b$0ns{noh z@D&AtXFYw|vAJ^AaV2@Skv-Q|j(XDRy(NnB5kq&wnl;>*o^cs#%)eI9|5jmBF9%Hu zj|WZjPhFb&pQimUvz$Ip4-)|b6ay3h000O8001EXu_ln%s*{dkPyyAG-(fictCJaG zKmpg2T4Fr{5h{}|DjJisVk!X!lip%I0b7$CV?6