`(wnA4EG*|5;gKD2&il#=RI zB$0^+?gaoDqoml)IG(1A;jP^%>uNx@nvBCVt@9O<$CNDxqo>0|Qa=E0E@<|s{@(VD z3L_r?xaoJ9jE(Hp>5!1(e8rlZc#eG1g2>R?{9j=YfLfhq!VBBlj!tYF#0zAN5`*nv zL5~07bLk}<72FO=cOq)3-h*ymY&x(nS#n3eX!2p`Fj8jh(QB;je>`s~$XodBLENPK z!+vFgcgJ^WU6Q?5Wd-i%hIJh{2tIin!leA@w&?D$m|wAha9`#qN$b_W&$%-9w|jkX z+Nz4Zch>Am5z2X$qB~YLGuv&<(GAYh9SY3$fEB`-#@bzcLoZm1f<)w;{m9txW?o6X zK^zGA^P;-ww(B&`K<}uuFk*>RbTPY>P-IBBZ@y*}0g2zq%s7r*HG{So8J0q8f+2DX zobW-oyZ{YQiWe}OyYv_UGM_p`pGAwoAmLp`N{6ah8^}A?FXv4_Zts9*oQCO*6RH9g z(GwPqp?Kw3R{?=5XS4{x2A9S#Su0vXsjSj!?6eFdNUeH%@n|YRQP-k`+ru+I3K9Sz zoTFVhCl}G3E6|J0R&mi7?VfJGcGaqH(nXLqq`?-I6{W00i_)M)lr`#@iVWTgKN|VJ zpm#QmK8drG?3*|6f~$)@0Nfkf9LwsbLAzTOptYim3=*U$K2~XrqRy7wuksbSr>IG4 z72|X1vM1RAa4)|_;|XYua+@QxDF4G;x_EW{taU20a~tcH|JpQ>AKw=gCWbfgZ6z85 z3%Hc5D}1-qOyIehX8XKB;p5%`tk25aJa1;ID`gmAxizF7^?s7RCnCs|wBwvB mZeXX_z%hIz$$#S8O|_vuL1hxVvFuwaXME$8%^yuK$~Qg%=NlG`h)Y z>jB`qKHz~+Q?$3wwwuCk36Q7iVt{fc%Z(q-tF%Qoh>yIkgikA^O6LoZB5D xq6>FEg)K>F+FZ+$8DL} z&|K-iOr0S5UFVlPuH=VZLEaBnz_Nj0DmgJv5B?@PVdu3}gHqEq+4jv2F^bIm&`P8Q z#;%&K##0hlpuC`<=xg3>drlGZi-N_5T#16LiJO>p&V=_`vzNFyTJwPk& W_gAN|l{G_OzO=SGNH+c4;C$9I6tIPW;r1>LuvkIw -X6tOBRO7a6Q!#jzX z)Nvh{c7s(KY?&&x?xcs_+p&lG%6}_hD|CM>Dpsv^HB29h2DgrvU$}{Jg+(J(3Td zqf>I-!zWX4yf=?&@m_Hb|8bSIu;y5}N&c|N{ro*xG&w>a5mQMZP5GPFaAj0ccmT}% zuI)dpK nm+Li}f*g7tbt z7kFV@ZwfVFm%2gAo#?u)(4$mu%CJ~)wEW(DRuzJj0n*z0Y<~@zmCUa2ggV4$tzMoy z0C2*_=X6ujEcgUAPJS_^|GKlgSf8EsSu)~oNbX!pKfN(Jgan5TdVOyAg9b-}ZkT7v zrWQHdlT+`D)u+cs^g6TAa9lV|lqg6lNfU(W_BK|C91EW$>0jr&)}MGycX$@=bb%LL z3mUq_bdIrHkbEX{+hlfgn4fSlC1SEZ@BXY<6O!2%BEC_uZZHT%s^{84y_H7|9JCgB z-m(d3RtaH<*?trWcc%5GRd9f=Wl@%8qPGMgpn HWDj8|8pN`o=-w!us86YqC) zzg4H;7#82r{d5WRissMYFbhB*{FWO3SBa>-1dez zt#{(q%9RO=Q|_*D;jV+b=RLla2><2O?DMoTMJknn_i *Z(B3W){jIeeT46xgZ__HKq|0oJ$qoE|+WKI=8)TZj$dD@0`b z{M{04IUlCga9B?z>y}tl9ZAv*rn@E-B&{XAv|xeZEyjFN(VmY~;xzkG);xH_!2*0f z@Lp0u$|fhrgSokFemzPp9fO)qtrYuIxe!gdqgS1#=Pn3Eki1%=UCCm&TbG*1^J z_zK}&R3*{<{Y4-zh@5GemB-#Z6L_cuuhmU~NjPHZ0#U7!{+!Y+ZBa_u%B{tYnDZ#d zG_E9g664aGR@s?nz=B?$g=%&C9Z z&NKniJARP`;G&?@Ab znpU|5YMdpRov1h3*`z3T)R@4X0TGI2m$?pvh^|Msn|_u*_Rp #mPI~jUfd;;+IgMM4{=hPfW8Q(cR0666m zB-plWRHX<>m2&^(*kh6Go%**cT3EHHbeh+{yo*>NagV+J%Zg9<$FxTizsjPW&{z4c z0N?H-!!HZEHdUKsM5Z(AOElB1M%x7ajw{RNBqWn&_|I7)n7(8ea}K2zr|86WKH1ur zXI}|F_H*yTmq8F^+aP+8vb{!Pp{@{+<5{T z#Dlx>JY~e6<Nl!!G@ohd;MJfpzliRue=#|nmjjLxBqcIDO=y(adL5CC z%Mc;{XKU3%Wl}&cE6v M&k;~GwiV +ISC=4BFC3ltLf@U3rl&pCfsEK_>zdSusqn-hEUk+AyrBlN;H;DK zW*m}?YIv&%n@1mp&2k4eftNndNY5j(?WIpZ&NFzPE3zH-Pm }+gRnr^?-%<%081%rCmNmOCa&ncA|m^rdS=G{vXSW zPPg03tx0)#^%q6Rk #^be!kvheNKoL!*9&LhRd)MYSzw~J zExr?2q5hQ6;SWuT@QCftR zEPD?=#kCDR9 zxvs+<*kjpE+Q?m3kBZ{z^etwckk__vOJ!*=UA5FrO4B3Pmtz&WO1w)`pHeZ7mvf^e z*>L+hAT2Mq`lCV0yiEMZ5A}iy%Q(ii5zL-LeKzg@ZyLC%7g=1@5$__`WsK&uXmxdw zY9#QD_tLSJ;#NJCLy`A4JO0k}d)*^7 z0^wYh4@M5%4$?QaA;C_3?Nz&1J(+MKGej`0M_A}r3fIV!!YixhzQw*3O{QD%Wz(Zg z!8n%3Z0C0%TTbso)&^TL(FW5j#DSA{)_>Ml-_`IdD0}jv+3++=KS<04@mk2on_S99 z@l}ivqGxzRp>?}=!=wYTz+s2rhAP==zxlJpk;<{hgvV^QniDAo5pshGf%+SARrLon zNJoY)RYK<#c9=YdeYQ3>(ywT9UntnP4EYDV`=~Xk>?8!5Qzd^(9}e|xvU1Q+h(wK5 zF=`lc!&u-3?Pnj<7#Nsj)y&yL`q_(}*+Yn`)pbLqxV14%EO|v*;VCI~ivbl<*|p1z z2#Klw %G_W=&N*QtA+UN@y=gPniNK_~pHUT9IIlhrGGa@#5*7Sj8NK z$O}xWK4#6~i>qf(GBN3XlWb$e^v1bx-9~?w0us@Aba)`~bKR=e(tfh0UP%`HeT9-) zfse+eR6KFL8$ZDoX*q$n0xkvh@01to%P#R_bw@Do?C$n;hF7hv^J&BSbzDUr#f7Y< zqr62=6TkE^+RSXF>o6rsfv+IIA$qvK6xt{M+LEA;n!v7Me|O=O7!xPvn_IHK6{Me& zDf90Tia{E>`oUi+1>szBvd$<7d`qSMVW~hmT_l{DOr&EhWkjjJri zHJ4|y`4S4XzCMy2jNmd0m1%jxf}Etoka!fBZKSY`;leuGgcQ?76ucu@BUgWQkFnRa zxiAO=YI}8N%=8PawEbP QM%SiM zZl%;4?0;r9?H#H+xIDjfMrw;fV?^J~=qP%38=ev;whM;y2lAhvC;wa()0m_T^-RjO zRg-us+R6kcpmuzNM^*PdWqs<&8EZ+yh_0^2_Efc35AYH%9GGh5#4;b?6s0KMKr*Am zI7*^A=CttMo$i@yqrURj Cr`_D3Lro0mK3^T^J zpNgo%Z?hWtB(nXT47c`~1ICjQb^GOs)jPxEW4nV9WO&KEL3{Q5$KN^CT`u^;pX h5EP%ow`&w5EFD*gy=F3BZ#;j(3pksmDZ#S6s3WtUP zwI -dB{-8}gqb>VL{jsv|7yRj3Rs=D?MS!h-(zWFT~T AJ+eY^yy9lMhpu$CM;E8@7KjPos)i|1mJL&n z{;Ih>iP^>7b@maPf?Ess5*MZ3-oL9LyEW6M)vkt*b#@Y>qyMgw|MvhDW86$ke^*hZ z(DF8rpBHN~$ugAt2SaV2o;n9Mb0JiYcB)yM;Hxo5F3}lQa3&)o{j2Xz#Q+rT4}goO zsY?}O|KGx0F-G!l8R}At&&_0TW@%)`%D-yHh-CkIQunvW_Gw6#KKx%4)xV}orZGJ7 zZ)yHLZI|E>PYT+ + +A reusable synchronous chat-completion call built from generic nodes. It builds an +OpenAI-style chat request body from a prompt, a system message, and a model name, +POSTs it to a URL the caller supplies, and extracts the reply text from the +response. It is provider-neutral: any endpoint that accepts that request shape and +returns the reply at a known path works. Import it independently, or publish it as +a composite and call it from a parent graph as a single node. + +The graph references no secrets, environment-specific graph IDs, or generated +media. + +## Data flow + +1. **Chat request body** (`n_json_template`) builds `model` plus a `messages` array + with one `system` and one `user` message. +2. **Model call** (`n_fetch_url`) POSTs the body to `url` with the `headers` input. + The request has a 60-second timeout. The response-size limit is the node default + and is not overridden here. +3. **Reply text** (`n_json_path`) reads `reply_path` from the JSON response. + +## Inputs and outputs + +| Input | Type | Meaning | +| --- | --- | --- | +| `url` | `url` | Required chat endpoint. Receives the `headers` value, so see the security notes | +| `headers` | `json` | Required request headers, built by the parent graph (see Authentication) | +| `prompt` | `str` | Required user message | +| `system` | `str` | Required system message | +| `model` | `str` | Required model name the endpoint understands | +| `reply_path` | `str` | Optional path to the reply text; defaults to `choices.0.message.content` | + +| Output | Type | Meaning | +| --- | --- | --- | +| `reply` | `json` | The value found at `reply_path` | +| `response` | `json` | The full JSON response from the endpoint | +| `status` | `int` | HTTP status code | + +Change `reply_path` for providers that return the text elsewhere. The `response` +output is there for inspection when the path does not match. + +## Authentication + +The graph never holds a credential. The parent graph owns the secret and passes +request headers in through the `headers` input: + +1. In the parent, add a JSON Template node with the template + `{"Authorization": "Bearer {{ secrets.LLM_API_KEY }}", "Content-Type": "application/json"}`. +2. Connect its `value` output to this graph's `headers` input. +3. Add the secret `LLM_API_KEY` in the parent graph's **Graph Settings → Execution + Profile**. Never paste a key into a graph, a fixture, or these notes. + +Use whatever header names and secret name your endpoint requires. Whether node +outputs and execution logs redact header values has not been verified, so do the +first run with a throwaway key and inspect the logs before using a real one. + +## Security guidance + +- **Use a literal URL in the parent graph.** The `url` input receives the headers, + including the bearer token. Do not feed it from request data, model output, or + any other untrusted value, or the token is sent to whatever host that value + names. Pin it to the provider origin you intend. +- **Use a low-privilege key.** Prefer a key scoped to this one use, with a spending + limit where the provider offers one. +- **The prompt leaves your instance.** Every run sends the prompt and system + message to the endpoint. Do not pass data you are not allowed to share with that + provider. + +## Cost and limits + +Each run makes one POST that can be billed by the provider. The graph does not +retry. If a run ends with an unknown outcome, check the provider before running it +again, because a second run can be billed again. Provider rate limits, context +limits, and terms apply. + +## Using it as a composite + +Publish the graph and call it from a parent that supplies `url` and `headers` as +literals or from its own secrets, and passes `prompt`, `system`, and `model` from +upstream nodes. Pin the published version when the parent depends on its behavior, +and record which version the parent was tested with. + +## Validation status + +The graph passes the repository validator and the production node-catalog check. +It has not been freshly imported and executed against a live provider, and no +provider request was made while adding it. Catalog validation is not evidence of +provider execution. Whether placeholders nested inside the array and object of the +request template resolve as intended has not been confirmed in a live run. The +Subfork version used for a manual test is not recorded because no manual test was +run. diff --git a/graphs/pipes/http/llm-call.subfork.json b/graphs/pipes/http/llm-call.subfork.json new file mode 100644 index 0000000..6d35bff --- /dev/null +++ b/graphs/pipes/http/llm-call.subfork.json @@ -0,0 +1,245 @@ +{ + "format": "subfork.graph/1", + "thumbnail": "data:image/jpeg;base64,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ymhNW10Ty6GeEVHC5fmt1uRkjMhcPWzCjNbqW7VNLNTU1vhtFPM5j5I7VSPpw8ta9ozgk8xI4EdR5exeQPGQphTDw0UwziAcThjPX6PVzwPV6kGyqmyaei1TRiCw19HbJbBLVudNK2Vk3+ob+9ETG1u+12cu5+lzw3GFA9X2mks93ZHQccUc9LT1cTKlwdIxssTX7rnAAOwSRkAZ9iwi65uijiJrTFEHNjjJk3WB3yg0dQB9YHX610vpquQgvhqHkANBcxxwByA6uoIMdF3+BVPZpvdO7k8CqezTe6d3KWkKL+m032rP4goncvnGr+3k/iKlvzVu1lY0xRxnfYx/oulcOprQefX1nqAyoZJI6aR8jzl73Fzj9ZOStOL9Q2UOKIi520REQFyY90Tw9jnMeOpzTgj9q4ogyPGVZ2uo987vTxlWdrqPfO71joreUZHjKs7XUe+d3p4yrO11Hvnd6x0S8jI8ZVna6j3zu9PGVZ2uo987vWOiXkZHjKs7XUe+d3p4yrO11Hvnd6x0S8jI8ZVna6j3zu9PGVZ2uo987vWOiXkZHjKs7XUe+d3p4yrO11Hvnd6x0S8jI8ZVna6j3zu9cZK2plYWSVM0jD1tfK4g/sJXSiXkERFFEREBZAuNWAAKuoAHqEzu9Y6IMjxlWdrqPfO708ZVna6j3zu9Y6K3lGR4yrO11Hvnd6eMqztdR753esdEvIyPGVZ2uo987vTxlWdrqPfO71jol5GR4yrO11Hvnd6eMqztdR753esdEvIyPGVZ2uo987vTxlWdrqPfO71jol5GR4yrO11Hvnd6eMqztdR753esdEvIyPGVZ2uo987vWOiKAiIiiIiDuirKiBm5HUTRsH+6yRzR+4FcvGVZ2uo987vWOit5RkeMqztdR753enjKs7XUe+d3rHRLyMjxlWdrqPfO708ZVna6j3zu9Y6JeRkeMqztdR753enjKs7XUe+d3rHRLyMjxlWdrqPfO708ZVna6j3zu9Y6JeRkeMqztdR753enjKs7XUe+d3rHRLyMjxlWdrqPfO708ZVna6j3zu9Y6JeRykkfM8vke6R563PcSf3lcURRRERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERB/9k=", + "definition": { + "version": "0.1.0", + "name": "LLM Call", + "description": "Synchronous chat-completion call over HTTP. Builds an OpenAI-style chat body from prompt, system, and model, POSTs it to the url input, and returns the extracted reply, the full response, and the HTTP status. Credentials arrive only through the headers input, which the parent graph builds from its own secrets. This graph references no secrets. Each run sends the prompt to the endpoint and can incur provider cost.", + "nodes": [ + { + "node_instance_id": "body", + "node_id": "n_json_template", + "node_version": "1.0.0", + "title": "Chat request body", + "params": { + "template": { + "model": "{{ inputs.model }}", + "messages": [ + { + "role": "system", + "content": "{{ inputs.system }}" + }, + { + "role": "user", + "content": "{{ inputs.prompt }}" + } + ] + } + }, + "custom_inputs": { + "prompt": "str", + "system": "str", + "model": "str" + }, + "exposed_inputs": [ + "prompt", + "system", + "model" + ], + "inputs_visibility_configured": true, + "exposed_outputs": null, + "outputs_visibility_configured": false, + "literal_inputs": {} + }, + { + "node_instance_id": "call", + "node_id": "n_fetch_url", + "node_version": "1.0.0", + "title": "Model call", + "params": { + "method": "POST", + "timeout_seconds": 60 + }, + "custom_inputs": {}, + "exposed_inputs": [ + "body" + ], + "inputs_visibility_configured": true, + "exposed_outputs": null, + "outputs_visibility_configured": false, + "literal_inputs": {} + }, + { + "node_instance_id": "reply", + "node_id": "n_json_path", + "node_version": "1.0.0", + "title": "Reply text", + "params": { + "path": "choices.0.message.content" + }, + "custom_inputs": {}, + "exposed_inputs": [], + "inputs_visibility_configured": false, + "exposed_outputs": null, + "outputs_visibility_configured": false, + "literal_inputs": {} + } + ], + "edges": [ + { + "source_node_id": "body", + "source_output": "value", + "target_node_id": "call", + "target_input": "body" + }, + { + "source_node_id": "call", + "source_output": "json", + "target_node_id": "reply", + "target_input": "value" + } + ], + "graph_inputs": { + "url": { + "type": "url", + "required": true, + "default_node": "call", + "default_param": "url" + }, + "headers": { + "type": "json", + "required": true, + "default_node": "call", + "default_param": "headers" + }, + "prompt": { + "type": "str", + "required": true, + "default_node": "body", + "default_input": "prompt" + }, + "system": { + "type": "str", + "required": true, + "default_node": "body", + "default_input": "system" + }, + "model": { + "type": "str", + "required": true, + "default_node": "body", + "default_input": "model" + }, + "reply_path": { + "type": "str", + "required": false, + "default_node": "reply", + "default_param": "path" + } + }, + "graph_outputs": { + "reply": { + "node_instance_id": "reply", + "output_name": "value" + }, + "response": { + "node_instance_id": "call", + "output_name": "json" + }, + "status": { + "node_instance_id": "call", + "output_name": "status" + } + }, + "metadata": { + "template": { + "category": "pipes", + "status": "network-probe", + "summary": "Synchronous chat-completion call: builds a chat body, POSTs it to a caller-supplied URL, extracts the reply.", + "composite_interface": { + "inputs": { + "url": { + "type": "url", + "required": true, + "default_node": "call", + "default_param": "url" + }, + "headers": { + "type": "json", + "required": true, + "default_node": "call", + "default_param": "headers" + }, + "prompt": { + "type": "str", + "required": true, + "default_node": "body", + "default_input": "prompt" + }, + "system": { + "type": "str", + "required": true, + "default_node": "body", + "default_input": "system" + }, + "model": { + "type": "str", + "required": true, + "default_node": "body", + "default_input": "model" + }, + "reply_path": { + "type": "str", + "required": false, + "default_node": "reply", + "default_param": "path" + } + }, + "outputs": { + "reply": { + "type": "json", + "node_instance_id": "reply", + "output_name": "value" + }, + "response": { + "type": "json", + "node_instance_id": "call", + "output_name": "json" + }, + "status": { + "type": "int", + "node_instance_id": "call", + "output_name": "status" + } + } + }, + "requires": { + "nodes": [ + "n_fetch_url", + "n_json_path", + "n_json_template" + ], + "panels": [ + "json" + ], + "capabilities": [ + "public-http" + ], + "secrets": [] + } + }, + "canvas": { + "positions": { + "body": { + "x": 80, + "y": 80 + }, + "call": { + "x": 380, + "y": 80 + }, + "reply": { + "x": 680, + "y": 80 + } + }, + "recommended_panels": [] + } + } + }, + "tags": [ + "pipes", + "http", + "ai" + ] +} diff --git a/graphs/pipes/http/llm-call.thumbnail.jpg b/graphs/pipes/http/llm-call.thumbnail.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a58de7c6b6b1cdf3df885eb385d99a427427c708 GIT binary patch literal 15521 zcmeIYbyQqSlsDQ0_Ym9(5)vGOYY6V{5(w_nI6(pl?gR)8G!~qOV2wiv2@ IoS+*
!Bxz{JJG#3dudCnWnXxBG7Z5*)NwXe;Pw%z#HEXy_zp z_dfvi4@y3$_LshYH!K_s>__OBXt)o<#*YDL=;&w|7`WItSeUrDe_8eD!2}X4>?fp8 zarpINWaJc7%(6P^83IBE*1%72Tox~%_o?*_g7UhBbv=} Z_-HEWrTunD&SkOO$QSzyx&5l>Q(xX%Z{#C~3om~MrA_qoqqPjaJ z|Di5Y&NXX%=acV1U@I|I9b~yIsgZM0RonY!3H%SW4y)$BXx$JcK#xR7@p^!tjocVa zuht%E{X<=z#!hj-NY6goOHG7wVaRG8BelP++&iAWEc=IAUxhT@FF7fFe>EXGs3}=( z{vVSk{-Lg9js4lK)UR^!KMwjI2mK%W1>wYWaihL7?HN_6`#8=1>_2t2xTw%63jm$s znYOaD2iUIr4%e&-9!Fli%O2Xe4RMU)h~JB%GuYoTg5}%anC`SUj#yNlZzuW^f}OXt z5dpR*p7K828Q@3;ntjRiVMYgCj#%bZ{P@+x{%kIcyG{SFXU$4(c?SnKisE-Y>jV2I z+Fj|l?g64^e?p)BnV8Rw5~-CkPbJGB2mL7s#-A|5o4c*#Cif7eQM`Ox)~5aKS( xJrm!|_x9J;z zf5(^UPlCdCY|0+eWC3G%m?nA2&WmwW-t#86QRuCKjt7i_l&U5zqbJ>9_*m`5%-J9~ zh6i{nN42#dQF*c3=jqwS3+Kr58W&DBl#pwGEv{;)wW2vi5aF+fz3tQeUG$Icc-S7g z*B)}KQASHM+GmjxB?aCt<8XEnR4iD-due>|+i}~9$cHB#J*1>8FnNzjly03ht}@ Qk!5Yx1le>u`p2An1L3# z#a-I6cN3ys)v1}0)AT|#h}W74mB8>W)pUw{c9#)0;n0R(W;p^4d^>T6UVM1igg5X1 zag3cZQTsyecfVwZ9Rxi+ihl?X^S7LzNbv=AbESn?5jO){gY=+=G13Dk^WCq@Uvvk% zblX5e53cnz=DH&0=P@xjG2#Ek4jmGj>sWhDUwaRzFbdm}4Yf&Xx|W62ezE^nv|}Mx zZ&8LEJb)YEwbTd-PG-DQ?7MDO9htR>9ic`mOO^g!DI-dMn!Nj_EI&Q{&i2Os_U-mP zAX7*-D(O%D$6oPXT^q?UhRu6GnZ+$;n~JN0?G5!DQNpx%k(xYZ&Z5I33fSbY-;TCr zu1|YT`VQcxINQSv0m_VEvU>n*^&Zf&e2jmdbt(bac6-NAjM>5nyKC$~D-L5{Hw8>x zrvt1)L;qrK-bQ&IF_Wd_R(b%XbdH6z32z%{Fyw%XGAoNzK>=3_i|y2&EFs-o=p)K( zhb~e$ho6E0JIU`{B%f8%ZkXyKj|JpqH*1$}KiQt$Eh8X2S%`Jh1N0IuFPWgEesUoY zR%FT&dA+|f_B}vXDS4(+YvW?~eS=2wKKQ6qI5n7J@VPH~4K!*{PD=62Ho=49^UMmI zj($4%;$xuH;~=vg4cao{OTAiO+(t`ONncS{9Hp)n|K~xBb?U?0@iz&%$_PR|p;)a)sg@a-=cA(2$I=k-Zf)%rD4S z7ro|nu7Y%H>rR>rN?rB2n5d5bu3)#~cHOt$IB8R}9IfY5;*V4?j;F)92Q;+E_)*N( znOvkgBS17Rcj=RDao83W7OwSgW({A|=tc_-zt7b)_WUN%eVG5YHO;Z>eeG12MWFZA zgx4R@UHcK8l|J<&_bVCn`1btk&VywmBR0U?(I!se9JXp_jticPn~R@s;oflLxpyNT zsE}y^^rb&nsHbJYJ`fAY)Ut-JQ(3S}5-=@pqqj#`vC|ptw3Dy-41V5>W{9jECA?@E z_{JK1%0lQ8Z#G1S=-6#_DJl6=U_n<^RAy`7n?aUXo ?z6THpey<2&;PVoM-p9DZzSDtdGQv|w+vp6xL#33%<7rJ;*-c)GRt znU?d_p`nzR2~~UdH|L@dPFlm+gq+$0%4YxIbOG _&wk*9g=hpSgN}R+;~GQ zew%b}D=6FphJ3^K5;RcPSedgC}b3=jH00iHTqr(WZ%R{XOi-AA8D!H~-9kX7HRw zA1o8w%y{&tu-z7R1Dv1YDTYyo(VJx3mKOVJMGj%H*=+K-? v9u!tDBED8KA653#Ix*k)35+G&VsDfhPjw8u?Z4KT!$}4`iRbk9e>T{#Ro Vh?Ys2DYS%wHF>NS&Pv%=L`oc@zvFRz)*ko zn1nARzKeq &X!eiP5c{Yh~>FmX9lIJn2)be{g9T`mzJJjTV0{UN*~Y1q9yY+ zPo$0 zRBiKZ@RopxKeeea! z5Nh|(;f?a5x*j!dZZOSn7fvTO*R-^)Ek_rsOND257otRjET4aCY-1K<4K=tVs?atp z?U~3@U-V$HeM&AL*ulPgQmnYDj}(T1DkGJrJ>qO$Cde+053kEuQtFiiuiMaFiY1Kh zsl^hGSz=dlQfD-HIR@_7!rG;vMl(Aej~7rv7OYWCwO&agS1gt+i=K;tOW48LR8)H$ z7H-wxxIyQ_(mL%a1&WMrz1Nr8ZAz+dE3!KzBX^&S(`_Z$wt!6x1~c>&nF&CKF?roo zE&~hxyeb{P8RR~14+K-X8kz2hz7t25U%3NkTP5aOw!MK-#LOYKK FDBz#z4Ke zGVcLwt65spb4V8+nvXwE2bDMjZhD%ynT3zly_)?Qz}~ }CsT4e` 05sO7b}8hhp-LLjM_e3_&r43T$1 z#(biw7|4zg!zQ0ejihpEy?$k7#UO{qQB~;@5K5{irA64Dda?<;q`l4D$R#fK)^(1( z=2|p;si>pH04jA)DeW+IsTQK-7+QcSZ!77t b(I=v R%3GA-p2SQ=FvMi9;7cVvLEvljx2b6@;(X$f%3_WT)xMko z+?;5@*;`D)nwmY8FE46*4<{gyq)%qfOyQ&R(YSEo?9pYan20Th&)aQimUakndioL} zUp*fbnZZjlS6>4^(^9F)b6; AQ5-zdV%Srn L#7i4V>efF#ua*y5+xm4xIjoapjCHDOHPkmK@hGtDZg^H z6}y>i6Rm>*#NNZlKWpbL?VC$f;|Z1;pE}kzM?Q6|DO-E<0Gli^^tVKBM86jK=JE9? zqO<)L^y8$0>%?g<1gCj7NTSgn=kq-PmmEvnNNV%v%z|getUdqUo+(d1}(N+|W*L zSlT)39u!K81!^{c$$3l?5GScZ2X)9oKaG0XE*R&roMIOyBmj);nl%)Hpn7w@SeemE zX6y)`NpE4WnA24q6fc4As3nVTwL|u_`L@uJx~kIoMNwI1X`s{U7#=knFq QU>{CR?YqmP%Nwu1i5P5~(I%ag4maomvS z=KjFeH1U{?P14L=Gbw#v0mPJ=-s4AN%Myz$0OX>V7!}H@rV^B0#r_UOs-`0`YQZ(e z8=Q<-Q{hnm(f|4>A|@W|H8T@4^P~Ui{@Z+jI=Bv*;u9z;^-{x#4Ps>{6GJIHMK*Y>RlS% z30@&Z3h5P?PrV~|@$%c6Ps-9iF)HidPIV_rizn_V=_q&P7F@qBJB0jk+StT~lgs#e ztZO9|2a!zb^0GgdPN}%53ZwZKnOc9zTrdC63aX9P&=IxHqL%AaRCN`(Sp9Ji@Xn`K zJZBlGcR4sSa~9RZ+GrH3u^zIVn3TQXvitC}RqZJWnGS_-J&b!SWOY9RXMh-_S)ip2 z0J3Lk-)$lTMIJ0y46W3;LU<|YjZ%&1;2>X6{$r2i--fvGCVlzOYWe?*JCYy#UMsw9 zmp0e;i`7oyWnLSb6$??Hr)gm1ZU3a rSjE8UD{bRF3zaIVnLpY88^FjOn*d6=R zPQ3)gptJ%50pTpEBnKkJM&Df92pQS2$qu^@6M`r^($ENIE`51<0^9ZZL5;(3fpzV^ z1YwcmIqV9^`K#M+&(%V;Z#moo`V%?*>uLK!mG}BIjT9+WoNKFvrAMLY{?o#GA&}bA ziMe+|W8_Vt>0exc9b3&TgjA9XN>dr>wb$Z{=ZTU17ww7C#dR?sj=*_QV$>vnSP_+{ zBijhLrr3HdMbT|3WG>!bZ_eqt(;=De+~sqpO&jy?0W#Sv!6{6KDIrRrG1x`_ypK@Q zA~3OTP|Ga>Tq%;W0-piRqDjen%jn*k=I?ei!j6YEE +Q2=CteRzg5)s? z3EE#BmT-YpNLt25ka`7>CTx|9h~+Z*M5l?Z`&}>bUi5Eg!PXO*mu^xR@}}7(pAt!C zxgn0 M*F9nHbN`r-G4UU{ea0{BC&tEv5tO`xBlgQ<+cyFzF1`^M|ACYsq zvu_HC>;|E{uSH~E`#q&9EhSGIVtey(A_6VbJhesT8@2t)_7G->;m-l<1A<}ew_1PR z^4`oXbZ3noBpd|Nb*x$Ui{*q)cgw6+IJfa>csFVoeL=a^>T7ALv6Y24wT4~L9A5&0 zeoNr1OirjN=?O`mv{A1H7pI9Nh}B?YkQ`ueHq_;b`9ih)Ti>{*86O&?>V2D2{y BbpEm$w!^+Cqh#{>`=O eK;j>gL{#Kc&x&(4{jCH!aqh*8Fms!(QLQi@w%x>hYqh-FOtdcN_$t!F&C zf-0`9b-moj4l;} Um;xi-AGUPUvMiEY2lFgbe*T6{U2X@=?MhB!OD$|3EjgsUBW-A^eONiFCIgR_*~_ z98XP1t*Xmob3YGS_C@X!F}?7mJfHJuayY>xZGE?Hba5I+Vp gCNFN^Aa z9-1N2{%+6YV(cD3j^pu*u|(r=SsW44a1Z$DW9^e!dEM*oTJ;4o^vblL!Mt1&=p63; z&4isOz%0#QmMK~!pUEq!dOhveoQEoBQhmduDHn9zuBgH~sVLBHP4j|eq#zs}4V9Xv z)WE64Neiph+D(+G=dN^ndt3V4x5O_)P|$ElXp&M#*f}c`6gwkrX37VUY`e83IlKp4 zyqtUhU 95YOS07_d)q; z8s42+9v#r6a6&PEg2c@Zs^!!l?oz@)#+K(vB|Fn!c%kClYQ;^7qoq+H?mij6#OJ9! zB7dE3$2z_JIQFhCoR3QJ_vQdEW#Hbdsg7l$(0GI5&TYZ|+MZwaq!GQ0*HomY{;UvT zDG0YL_s8zj;Ln43?OM-vmxvcX5zsH|*68gYX&?_jxs6|NRDGn#X+e59#W_{1+bKve z$`IaE6LIxgbWo>{6t-@u*6FL*e^GEdKYHCMR^=PjTrhE6tK%GRAODkk3hKh;UQa~M3`#7$USKXn2Ha8@3e_H6^3Upf#^`!qe#R>Cj!{M RFHx&u4rI33(|EbaX;R7KH36%4T6GnAL@@zx2rN<>*anCU zpo2qVJ26X)D5u;wuL&m1E+Aj3$=kqPgSL}~aaFk_mK85{j|f1y;Yd KL zE=IoYryZUIT5%Yy9D*XmbVSGVgQM#FB$-h=`ishgK55tQLJVV@DIRL`4$_ zMs~QqJZ~LlCRO 18ur(C-`;X6f<1WVLC;D+72}SJ9q@j+xO*Bu6EyPyMg6EU8g3)@mP%z>#9m*s$i? z_W82uEALGKYS#pHD?Jy~P5y@bz(oS{nPqrPc;uw_UsaaaPY)RF0}@mIaO `w%Uu*{XSG6lFz9~FXei?WF_gDF z)N{5!6@sIv_>;3LEMlab2kKE3ajU9}Ydad%_)9%hRqn`NZPzlyBISC64MnNiP*U zq2q1Gn2F@Cq$1m3r6WtfXKVpYBfcYBK||fdM7bPq -Vm5*yu+F+U6 z NBJV%si z&_brt#1@`!_>8#!31B=h%RFVzH_a^!{Pm)=O&&=vR^9~pu4a*T>59;6D?*hWo+p8p zb hGrEB`*|BAc+T3^B9G?W`em9U)}(5DBnLqQd0G z7UqGATf}L|71Yk@a?($2ziQBMmLS)t+iwoi?S$)kb`tOx12L2Oc^XDubBMp)6XR*~ zt^~tM9iLZ2gYu;3g@hWR%SIk~t4C#^Cuf<7h;UQcbJ;;L_F{{3gU a!h)z2&uT%n+jA2{aU)Z<29`vH&ji+XHwYy zs_DG`v8~O_HZ{ZAE6LZlt4Z<%kq3I`LsRE%;CZjO-coA&W@Dt!ru1hr-K(ZXAq?tb zreC&fKZ~=&wEK0(9U+B0`(VWp$u!|-uckX%6sUTQaYy%nNP0OWK7>RE7E1l~yHwLd zw)$3F(0L8*_<;Xm=}wkiDr`RbY<=r_58zg~;=c#XKCIx4tVSO-^iE+yKD!T D!1Se7eyl9;mj$G(5h)qIL>k`! zcRCiqI+M$;MgeRMef{c4+Jpl;bvF#}gnPiW4a>~Y1fuaU93f;THsuo(HLIn;=F4J7 zf;*e}=xSj&g-;W`A>lexxO~b##Kk{tJETPeSQB^;aFJ+ekxKB;qeTeRBEMVv`w0 z)PD6pvy2}~N 18H_**W!CdwO7PTTLsvX=F51g$J9iXFHdf zEn`(=a`7?OJX (tSL-$ai9^<-Cx_LQiyH7{ zGkqCDLIovj#N=Gs+EAwkLviz!{A0tq!qhQ*nyo{MI*6l(aLPE2 qOqH5LR{>Su%ubE_e78*buhu~U3 oB##vs%^m=gIwUJ}9hQ1T( (}fNClP6kz_qqvK& q9_=^bf z-)@GYCH4);7VbX@=1V*41f)j2Nqd<2)Itqa&O2324Ufa!x|Y?P<`uh&ib~^>;z0L+ zHw0wId;+4yZgRb*h@@8!ha-KTtD;b$rIm=bdQ`bfaU92dlk3!3KY&?ykaK8(2A7qf zWu3M5sr`@tC_lk2DS^_KqY~plN3uq52FG#>FU^z((; W zGJE%clHPe@c{79W)JNi~HJLp+1A`vbDN6E}q{)hMcLVv>Ln;>>Lw02$Y~*v`*AuKl zUVUr*9)g)CXg#PT3l|BeV5`Y?L&%zCm58Hp*h|;4A*UjSS|#c9?lnKH9i*jw&Zc8a zNQX=>^Z7$*nmv1XBv4XnVEgtSU=|{J;rB))Yv^$6M5OFbXx5Eg5%U>C&fWv0!g>DE zLEIY@Z9|LgmankyzN%Bsy|J)0ZI8o4u611W&1#V7(_z}nXu8AXiqOEw$PB6O1Mp>e zb-O53Ur)QA=tFd*>pPwHP@R6#E!UQ4`mOgnQKz>^bqkxc@r59AW517$^d)b&Cfh(G z#Ru0V2z=jktvM4t6a0BvdP%rIAQelgP2PZQO9Y>IW@o#PHoRS=-enIw-joNA%TYlF zaIwvWE|Tli#5sEjdiPCtw%2eorI^1W^xX0+_Lbrn(tzJq?A6k^s5;~O-XVuJplY2M z8Du_F2Z?oYF=(HpYPhX1C@J!dbqTrQK@p2}QeIj?O*29a)!oQzvxa>mGig+tsr@(8 zHH1>z%q1Ol8_h~!P>)#uopwiBRlm}KRK3*agSlm2aK5(gc)Qy4yb!75=ed@0j%{G> zRc}LYVDi%uY;2#PxQ}jnMS1OZ(2 (mZn~(%Eh11;*!wilCh> zQ}Agu$a?p@+b43@lGyKH(`a|SzW%HT=F}f2Ndn_oJKkw-`32F}9OL4kTXMuhvM!zB zL)6l??h=)mv`Lza_;uqGVI=lP;IP8 u8n&_!%ry5{V u%C~a6;vG`S0(GljxLB=t zestMxP#SSWPNr`_E?mw?0$FVoN>iu1d~}S6x)!CPSE0NSW5S84R|@%e5QXk9-rdG! z=dm?BcJJSPwFet_%uR34qkQ;bBtU3POypk^j>E(6H=^Mn|BmDF@+TS9oW(BR>Kli9 zK-|vvU2X$Z6f-k-HHN&b_>A8~_xLEHaTI#uk@!bV-}xPOV$XUIk-NyHMf+*PWKiaq z6whpln;+65Zzo8K;= h`TDjf;Pr!B%AbkvCWUKp@we6?*wb_IT zceAJ;u<%7Aw;S@eN?7~UATV>a9}ISv)RCWVDtaE!>gDlrIH6|50p6^M 0|+0VwAOI1=C!I8{ZeQYuB_>)6O{S{@xBT z5->?N$%jA&-H@9(uYv;J9tR0a+n)x{5~+nFc??uYUy#_6kZ8-xQ(gX@{V9IRygeh3 zsbSnKhj0J*GtziYLgH+nIq~ m8ZKJ8AAFufi=6Mqk7NyWke8yK>%uPZmr~Q9FAQ;&d zf9)nR*KidPyU^uTbrUEPQ(^b-!u|h-NMYa7#eoF$f}N^MJ;=vsC*()n6Yn~bI!M!q z5p8^3tCh{FpgcB5za%>|jj+U#vc8hd{o{9d4QTd h<8FV7caIx@9w!JrCVQ`(}Kl2 iCEhJ4uo9N{Zqo!F8_b zii{(NzuS1DNT)@m+hIgkO_1}pp01KIEj})9z|ayikV*)cJqE)s0zC-_tvC2H^{7+ z(>wc 7#sKN}_ z*7Q;AHIGDW()y}qb9`*=`8#}RlAdFabnr8=?cmzXL$PX&0w*<%_q8EkrrmphRZz9n zTASu!vky}35ZYGa9;Y#FvF-Pige`a;SdXgpJUos)?-(vGnu8ip>zu;Vo)G9{mlJoL z1^U_N8lT$o1ku#2s5B`a 1J~<$r`B<#u+eN)4JrkOyE`i T;*-nSJCO^aVweenH+ zxG*WT5y6gov8*l?D4FC9i~vr3oF*T=!K_2fRMzOs=iaeYQ2oYGm>s>?*~|?G9^eQ| z=I~6MA@rb$S!I1@63f_6M24OnNY>X?_hL(ammLsW+7JVt6i<-MA5G^N(9^3IRcT2> zY48TjxXqumJ?pH?6=Yxu%$I*8OO40o-fGEhKnx