From 6e0b888c23cf8dbfbbce1ea933b665eaaa8be3ee Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 5 Oct 2026 00:22:05 -0700 Subject: [PATCH 01/23] test: expose source-function runtime and admission gaps --- .../tests/executable_operation_package.rs | 1 + .../tests/source_functions/mod.rs | 52 +++++ .../tests/edict_source_functions_tests.rs | 182 ++++++++++++++++++ 3 files changed, 235 insertions(+) create mode 100644 crates/echo-edict-provider-verifier/tests/source_functions/mod.rs create mode 100644 crates/warp-core/tests/edict_source_functions_tests.rs diff --git a/crates/echo-edict-provider-verifier/tests/executable_operation_package.rs b/crates/echo-edict-provider-verifier/tests/executable_operation_package.rs index 477ffe9d2..aeeefe6ee 100644 --- a/crates/echo-edict-provider-verifier/tests/executable_operation_package.rs +++ b/crates/echo-edict-provider-verifier/tests/executable_operation_package.rs @@ -14,6 +14,7 @@ mod pure_profile; mod pure_projection_bounds; mod pure_relation; mod pure_source; +mod source_functions; const TARGET_PROFILE: &[u8] = include_bytes!("../resources/target-profile.echo-dpo.cbor"); const PACKAGE_ROLE: &str = "executable-operation-package.echo"; diff --git a/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs b/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs new file mode 100644 index 000000000..758c3c0db --- /dev/null +++ b/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +//! Deliberately rebound native-provider tests, not compiler acceptance evidence. +use super::*; + +fn fixture_with_functions(functions: CanonicalValueV1) -> (FixtureNames<'static>, RawFixture, Vec) { + let (names, mut fixture, package) = pure_relation::compiler_fixture(); + let mut core = decode_canonical_cbor_v1(&fixture.core).expect("Core"); + let CanonicalValueV1::Map(fields) = &mut core else { panic!("Core map") }; + fields.push((text("functions"), functions)); + fixture.core = canonical_bytes(&core); + let core_reference = raw_ref(names.application, "edict.core.module/v1", &fixture.core); + let mut target = decode_canonical_cbor_v1(&fixture.target_ir).expect("Target"); + *map_field_mut(map_field_mut(&mut target, "semanticClosure"), "sourceCore") = map([ + ("id", text(names.application)), + ("digest", CanonicalValueV1::Array(vec![text("sha256"), CanonicalValueV1::Bytes(core_reference.digest.clone())])), + ]); + fixture.target_ir = canonical_bytes(&target); + // Construct the independent verifier request without asking the lowerer to + // endorse this changed Core. Rebind the retained package's exact carriers. + let mut package = decode_canonical_cbor_v1(&package).expect("package"); + let CanonicalValueV1::Bytes(bytes) = map_field(&package, "program") else { panic!("program") }; + let mut program = decode_canonical_cbor_v1(bytes).expect("program"); + for (name, bytes) in [("core_artifact", &fixture.core), ("target_ir_artifact", &fixture.target_ir)] { + *map_field_mut(&mut program, name) = CanonicalValueV1::Bytes(bytes.clone()); + } + *map_field_mut(&mut package, "program") = CanonicalValueV1::Bytes(canonical_bytes(&program)); + let closure = map_field_mut(&mut package, "semantic_closure"); + *map_field_mut(closure, "core_identity") = CanonicalValueV1::Bytes(core_reference.digest); + *map_field_mut(closure, "target_ir_identity") = CanonicalValueV1::Bytes(raw_ref("echo.span-ir/v1", "edict.target-ir.artifact/v1", &fixture.target_ir).digest); + (names, fixture, canonical_bytes(&package)) +} + +#[test] +fn lowerer_rejects_unused_malformed_source_function_authority() { + let (names, fixture, _) = fixture_with_functions(map([("unused", CanonicalValueV1::Null)])); + assert!(lowerer::lower(lowering_request(names, &fixture)).is_err(), + "lowerer ignored authenticated malformed source function"); +} + +#[test] +fn verifier_independently_rejects_unused_malformed_source_function_authority() { + let (names, fixture, package) = fixture_with_functions(map([("unused", CanonicalValueV1::Null)])); + match verifier::verify(verification_request(names, &fixture, package)) { + Err(_) => {} + Ok(success) => { + let report = decode_canonical_cbor_v1(&success.outputs[0].artifact.bytes).expect("report"); + assert_ne!(text_field(&report, "outcome"), Some("accepted"), + "verifier ignored authenticated malformed source function"); + } + } +} diff --git a/crates/warp-core/tests/edict_source_functions_tests.rs b/crates/warp-core/tests/edict_source_functions_tests.rs new file mode 100644 index 000000000..3c0f81108 --- /dev/null +++ b/crates/warp-core/tests/edict_source_functions_tests.rs @@ -0,0 +1,182 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +//! Synthetic runtime boundary tests. Rebound pins are deliberately test-owned; +//! these are not public compiler, provider verification or release witnesses. +#![cfg(feature = "trusted_runtime")] +#![allow(clippy::unwrap_used, clippy::panic)] + +#[path = "support/edict_byte_concat.rs"] +mod concat; + +use echo_edict_canonical::{ + decode_canonical_cbor_v1 as decode, digest_canonical_value_bytes_v1 as digest, + encode_canonical_cbor_v1 as encode, CanonicalValueV1 as Value, +}; +use concat::{field, field_mut, record, set_field}; +use warp_core::edict_pure::{evaluate, EvaluationError}; + +fn text(value: &str) -> Value { Value::Text(value.into()) } +fn array(values: Vec) -> Value { Value::Array(values) } +fn insert(value: &mut Value, key: &str, replacement: Value) { + let Value::Map(entries) = value else { panic!("map") }; + assert!(!entries.iter().any(|(name, _)| name == &text(key))); + entries.push((text(key), replacement)); +} +fn local(id: &str, ty: &str) -> Value { + record([("id", text(id)), ("alphaName", text(id)), ("type", text(ty))]) +} +fn reference(local: &Value) -> Value { + record([("kind", text("local")), ("ref", local.clone())]) +} +fn call(callee: &str, args: Vec) -> Value { + record([("kind", text("call")), ("callee", text(callee)), + ("args", array(args)), ("typeArgs", array(vec![]))]) +} +fn function(params: Vec, ty: &str, locals: Vec, bindings: Vec, result: Value) -> Value { + record([("params", array(params)), ("returnType", text(ty)), + ("body", record([("locals", array(locals)), ("bindings", array(bindings)), ("result", result)]))]) +} +fn embedded(program: &Value, name: &str) -> Value { + let Value::Bytes(bytes) = field(program, name) else { panic!("artifact bytes") }; + decode(bytes).unwrap() +} +fn rewrite(raw: Vec, edit: impl FnOnce(&mut Value, &mut Value, &mut Value)) -> (Vec, [u8; 32]) { + let mut package = decode(&raw).unwrap(); + let mut program = embedded(&package, "program"); + let mut core = embedded(&program, "core_artifact"); + let mut target = embedded(&program, "target_ir_artifact"); + edit(&mut program, &mut core, &mut target); + let core_digest = digest("edict.core.module/v1", &core).unwrap(); + let core_ref = record([("id", field(&core, "coordinate").clone()), + ("digest", array(vec![text("sha256"), Value::Bytes(core_digest.into())]))]); + set_field(field_mut(&mut target, "semanticClosure"), "sourceCore", core_ref); + for (key, closure, domain, value) in [ + ("core_artifact", "core_identity", "edict.core.module/v1", core), + ("target_ir_artifact", "target_ir_identity", "edict.target-ir.artifact/v1", target), + ] { + set_field(&mut program, key, Value::Bytes(encode(&value).unwrap())); + set_field(field_mut(&mut package, "semantic_closure"), closure, + Value::Bytes(digest(domain, &value).unwrap().into())); + } + set_field(&mut package, "program", Value::Bytes(encode(&program).unwrap())); + let pin = digest("echo.operation-package/v1", &package).unwrap(); + (encode(&package).unwrap(), pin) +} +fn factored_concat() -> (Vec, [u8; 32]) { + rewrite(concat::package(), |_, core, target| { + let coordinate = match field(core, "coordinate") { Value::Text(value) => value.clone(), _ => panic!("coordinate") }; + let left = local("arg.0", "Bytes"); + let right = local("arg.1", "Bytes"); + let saved = local("local.0", "Bytes"); + let mut intrinsic = call("core.bytes.concat", vec![reference(&left), reference(&right)]); + set_field(&mut intrinsic, "typeArgs", array(vec![text("Bytes"), text("Bytes")])); + let join = function(vec![left.clone(), right.clone()], "Bytes", vec![], vec![], intrinsic); + let binding = record([("kind", text("let")), ("binding", saved.clone()), + ("value", call(&format!("{coordinate}.join"), vec![reference(&left), reference(&right)]))]); + let assemble = function(vec![left, right], "Bytes", vec![saved.clone()], vec![binding], reference(&saved)); + insert(core, "functions", record([("assemble", assemble), ("join", join)])); + for (artifact, bindings) in [(core, "nodes"), (target, "pureBindings")] { + let intent = field_mut(field_mut(artifact, "intents"), "assembleRange"); + let body = if bindings == "nodes" { field_mut(intent, "body") } else { intent }; + let Value::Array(nodes) = field_mut(body, bindings) else { panic!("bindings") }; + let args = match field(field(&nodes[0], "value"), "args") { Value::Array(args) => args.clone(), _ => panic!("args") }; + set_field(&mut nodes[0], "value", call(&format!("{coordinate}.assemble"), args)); + } + }) +} + +#[test] +fn source_functions_nested_forward_calls_and_bindings_use_fresh_parameter_frames() { + let (package, pin) = factored_concat(); + for (left, right) in [(b"".as_slice(), b"".as_slice()), (b"ab", b"cd"), (b"cd", b"ab"), (&[0,255], &[128,127])] { + let result = evaluate(&package, pin, &concat::input(left, right), concat::limits()).unwrap(); + let expected = [left, right].concat(); + assert_eq!(result.output, encode(&record([("bytes", Value::Bytes(expected))])).unwrap()); + } +} + +#[test] +fn source_functions_nested_frames_share_the_same_cumulative_meter() { + let (package, pin) = factored_concat(); + let supplied = concat::input(b"ab", b"cde"); + let result = evaluate(&package, pin, &supplied, concat::limits()).unwrap(); + let mut exact = concat::limits(); + exact.max_steps = result.steps; + exact.max_allocated_bytes = result.allocated_bytes; + assert_eq!(evaluate(&package, pin, &supplied, exact).unwrap(), result); + let mut short = exact; + short.max_steps -= 1; + assert_eq!(evaluate(&package, pin, &supplied, short), Err(EvaluationError::StepBudgetExceeded)); + short = exact; + short.max_allocated_bytes -= 1; + assert_eq!(evaluate(&package, pin, &supplied, short), Err(EvaluationError::AllocationBudgetExceeded)); +} + +#[test] +fn source_functions_unused_malformed_definition_is_not_silently_ignored() { + let (package, pin) = rewrite(concat::package(), |_, core, _| { + insert(core, "functions", record([("unused", Value::Null)])); + }); + assert!(evaluate(&package, pin, &concat::input(b"a", b"b"), concat::limits()).is_err(), + "runtime ignored authenticated malformed source authority"); +} + +#[test] +fn source_functions_bounded_read_passes_a_real_retained_atom_to_a_helper() { + use warp_core::edict_read::{evaluate as read, ReadBasis, ReadLimits, ReadView}; + use warp_core::{make_node_id, make_type_id, AtomPayload, AttachmentValue, GraphStore, NodeKey, NodeRecord, + WorldlineFrontier, WorldlineId, WorldlineState}; + let original = hex::decode(include_str!("fixtures/edict-node-read/single-executable-operation-package.hex").trim()).unwrap(); + let (package, pin) = rewrite(original, |program, core, target| { + let coordinate = match field(core, "coordinate") { Value::Text(value) => value.clone(), _ => panic!("coordinate") }; + let output_type = match field(field(field(core, "intents"), "replaceRange"), "output") { Value::Text(value) => value.clone(), _ => panic!("output") }; + let parameter = local("arg.0", &output_type); + insert(core, "functions", record([("retain", function(vec![parameter.clone()], &output_type, vec![], vec![], reference(¶meter)))])); + let saved = local("source.return", &output_type); + let body = field_mut(field_mut(field_mut(core, "intents"), "replaceRange"), "body"); + let helper = call(&format!("{coordinate}.retain"), vec![field(body, "result").clone()]); + let Value::Array(locals) = field_mut(body, "locals") else { panic!("locals") }; + locals.push(saved.clone()); + let Value::Array(nodes) = field_mut(body, "nodes") else { panic!("nodes") }; + nodes.push(record([("kind", text("let")), ("binding", saved.clone()), ("value", helper.clone())])); + set_field(body, "result", reference(&saved)); + let intent = field_mut(field_mut(target, "intents"), "replaceRange"); + let binding = record([("id", text("replaceRange.binding.source")), ("binding", saved.clone()), ("value", helper)]); + if let Value::Map(entries) = intent { + if let Some((_, Value::Array(bindings))) = entries.iter_mut().find(|(key, _)| key == &text("pureBindings")) { bindings.push(binding); } + else { entries.push((text("pureBindings"), array(vec![binding]))); } + } + let Value::Array(order) = field_mut(intent, "executionOrder") else { panic!("order") }; + order.push(text("replaceRange.binding.source")); + set_field(intent, "result", reference(&saved)); + let mut projection = embedded(program, "result_projection_artifact"); + set_field(&mut projection, "expression", record([("kind", text("source")), + ("source", record([("kind", text("pureBinding")), ("bindingId", text("replaceRange.binding.source"))])), + ("path", array(vec![]))])); + set_field(program, "result_projection_artifact", Value::Bytes(encode(&projection).unwrap())); + }); + let mut store = GraphStore::default(); + let node = make_node_id("source-function-read"); + store.insert_node(node, NodeRecord { ty: make_type_id("node") }); + store.set_node_attachment(node, Some(AttachmentValue::Atom(AtomPayload { + type_id: make_type_id("document"), bytes: b"alpha".to_vec().into(), + }))); + let key = NodeKey { warp_id: store.warp_id(), local_id: node }; + let state = WorldlineState::from_root_store(store, node).unwrap(); + let frontier = WorldlineFrontier::new(WorldlineId::from_bytes([7; 32]), state); + let before = frontier.state().state_root(); + let basis = ReadBasis::at(&frontier); + let aperture = [key]; + let view = ReadView::new(&frontier, basis, &aperture).unwrap(); + let supplied = encode(&record([("address", record([ + ("warpId", Value::Bytes(key.warp_id.0.to_vec())), + ("nodeId", Value::Bytes(key.local_id.0.to_vec())), + ("typeId", Value::Bytes(make_type_id("document").0.to_vec()))])), + ("expected", Value::Bytes(b"alpha".to_vec()))])).unwrap(); + let limits = ReadLimits { evaluation: concat::limits(), max_reads: 1, max_read_bytes: 5 }; + let result = read(&package, pin, &supplied, &view, limits).unwrap(); + assert_eq!(decode(&result.output).unwrap(), Value::Bytes(b"alpha".to_vec())); + assert_eq!((result.reads, result.read_bytes), (1, 5)); + assert_eq!(result.basis, basis); + assert_eq!(frontier.state().state_root(), before); +} From efb822246eb9e52ef3b4b2f7e2b3e90735b86bb4 Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 5 Oct 2026 02:51:14 -0700 Subject: [PATCH 02/23] feat: execute generic source functions in pure and read programs Implement fresh lexical frames, ordered argument evaluation, shared metering and independent complete-closure provider admission. Select the source-function contract publication explicitly while preserving legacy publications. Native behavior and package assets are verified; independent component reproduction and the public compiler/runtime witness remain required before merge. --- .github/workflows/ci.yml | 4 +- CHANGELOG.md | 6 + .../src/executable_operation.rs | 2 + .../src/executable_operation/bounded_read.rs | 25 +- .../bounded_read/relation.rs | 7 +- .../bounded_read/relation/types.rs | 128 +- .../executable_operation/source_functions.rs | 762 ++++++++++++ .../src/executable_operation.rs | 2 + .../bounded_read/audit.rs | 31 +- .../bounded_read/audit/types.rs | 134 ++- .../executable_operation/source_functions.rs | 690 +++++++++++ .../source_functions/types.rs | 216 ++++ .../tests/bounded_read.rs | 3 + .../tests/bounded_read/source_functions.rs | 366 ++++++ .../tests/source_functions/mod.rs | 713 +++++++++++- crates/echo-wesley-gen/README.md | 22 +- .../edict-provider-contracts.cddl | 1036 +++++++++++++++++ .../source-functions-v1/manifest.json | 83 ++ .../provenance.provider-generation.json | 2 +- .../evidence/review.provider-generation.json | 2 +- .../package/v1/provider-manifest.echo.json | 22 +- .../source_functions_publication_witness.rs | 76 ++ .../src/bin/echo-edict-provider-assets.rs | 10 +- .../src/provider_contract_pack.rs | 9 + .../tests/provider_package_assets.rs | 2 +- .../tests/provider_publication_binding.rs | 20 + .../provider_source_function_contract_pack.rs | 375 ++++++ crates/warp-core/Cargo.toml | 4 + crates/warp-core/src/edict_pure.rs | 1 + crates/warp-core/src/edict_pure/decode.rs | 53 +- crates/warp-core/src/edict_pure/evaluate.rs | 21 +- crates/warp-core/src/edict_pure/functions.rs | 616 ++++++++++ crates/warp-core/src/edict_pure/model.rs | 11 +- crates/warp-core/src/edict_pure/syntax.rs | 10 +- crates/warp-core/src/edict_read/decode.rs | 12 + crates/warp-core/src/edict_read/evaluate.rs | 14 +- crates/warp-core/src/edict_read/model.rs | 4 +- .../tests/edict_source_functions_tests.rs | 868 ++++++++++++-- .../application-contract-hosting.md | 84 +- schemas/edict-provider/README.md | 10 +- .../contracts/source-functions-v1/README.md | 67 ++ .../edict-provider-contracts.cddl | 1036 +++++++++++++++++ .../source-functions-v1/manifest.json | 83 ++ .../provenance.provider-generation.json | 2 +- .../evidence/review.provider-generation.json | 2 +- .../provenance.provider-generation.json | 2 +- .../evidence/review.provider-generation.json | 2 +- .../package/v1/provider-manifest.echo.json | 22 +- .../source-functions-publication.py | 519 +++++++++ scripts/verify-local.sh | 6 +- 50 files changed, 7981 insertions(+), 216 deletions(-) create mode 100644 crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs create mode 100644 crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs create mode 100644 crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs create mode 100644 crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs create mode 100644 crates/echo-wesley-gen/assets/v1/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl create mode 100644 crates/echo-wesley-gen/assets/v1/edict-provider/contracts/source-functions-v1/manifest.json create mode 100644 crates/echo-wesley-gen/examples/source_functions_publication_witness.rs create mode 100644 crates/echo-wesley-gen/tests/provider_source_function_contract_pack.rs create mode 100644 crates/warp-core/src/edict_pure/functions.rs create mode 100644 schemas/edict-provider/contracts/source-functions-v1/README.md create mode 100644 schemas/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl create mode 100644 schemas/edict-provider/contracts/source-functions-v1/manifest.json create mode 100644 scripts/consumer-witnesses/source-functions-publication.py diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d38adbed2..3dafc990b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -151,7 +151,7 @@ jobs: cargo clippy -p warp-core --features native_rule_bootstrap,trusted_runtime,host_test --test executable_operation_pipeline_tests -- -D warnings -D missing_docs - name: cargo clippy (compiler-produced pure evaluation) - run: cargo clippy -p warp-core --features trusted_runtime --lib --test edict_pure_evaluation_tests --test edict_pure_unsigned_subtraction_tests --test edict_pure_byte_length_tests --test edict_byte_equality_tests --test edict_byte_slice_tests --test edict_node_read_tests --test edict_byte_concat_tests -- -D warnings -D missing_docs + run: cargo clippy -p warp-core --features trusted_runtime --lib --test edict_pure_evaluation_tests --test edict_pure_unsigned_subtraction_tests --test edict_pure_byte_length_tests --test edict_byte_equality_tests --test edict_byte_slice_tests --test edict_node_read_tests --test edict_byte_concat_tests --test edict_source_functions_tests -- -D warnings -D missing_docs clippy-det-fixed: name: Clippy (det_fixed) @@ -322,7 +322,7 @@ jobs: cargo test -p warp-core --features native_rule_bootstrap,trusted_runtime,host_test --test executable_operation_pipeline_tests - name: cargo test (compiler-produced pure evaluation) run: | - cargo test -p warp-core --features trusted_runtime --test edict_pure_evaluation_tests --test edict_pure_unsigned_subtraction_tests --test edict_pure_byte_length_tests --test edict_byte_equality_tests --test edict_byte_slice_tests --test edict_node_read_tests --test edict_byte_concat_tests + cargo test -p warp-core --features trusted_runtime --test edict_pure_evaluation_tests --test edict_pure_unsigned_subtraction_tests --test edict_pure_byte_length_tests --test edict_byte_equality_tests --test edict_byte_slice_tests --test edict_node_read_tests --test edict_byte_concat_tests --test edict_source_functions_tests cargo test -p warp-core --features trusted_runtime --lib edict_pure:: - name: cargo test --doc (warp-core) run: cargo test -p warp-core --doc diff --git a/CHANGELOG.md b/CHANGELOG.md index d99c3899b..648d2bed8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -89,6 +89,12 @@ ### Added +- Generic source-owned Edict functions execute through both private pure and + bounded-read evaluation with fresh lexical frames, ordered argument evaluation, + ordered local bindings, and one cumulative budget. Independent provider + judgments validate the complete source/imported closure, supported types, + totality, combined runtime depth, and conservative whole-operation costs. + - Bounded pure evaluation supports generic `core.bytes.concat` with independent operand byte bounds, checked maximum composition, and combined-byte work and result storage charged before allocation/copy. Application names and text diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation.rs b/crates/echo-edict-provider-lowerer/src/executable_operation.rs index 534f15593..f46b30fd9 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation.rs @@ -3,6 +3,7 @@ //! Generic data-only lowering into Echo's bounded executable-operation profile. mod bounded_read; +mod source_functions; use std::collections::BTreeSet; @@ -227,6 +228,7 @@ fn lower_compiler_produced_pure( intent, )?; validate_pure_target_ir(target_ir, request, closure.lawpack, intent_name, intent)?; + source_functions::validate(core, exports, false)?; validate_pure_result_projection( result_projection, closure.result_projection, diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read.rs b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read.rs index 01d11a6ad..736480f27 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read.rs @@ -67,18 +67,19 @@ pub(super) fn lower( )?; let source = validate_bound(&closure.source.artifact, SOURCE_DOMAIN)?; let source = validate_source(&source, closure.source, &request.core)?; - require_exact_fields( - &core, - &[ - "apiVersion", - "coordinate", - "imports", - "types", - "intents", - "requiredCoreCapabilities", - ], - SUBJECT, - )?; + let mut core_fields = vec![ + "apiVersion", + "coordinate", + "imports", + "types", + "intents", + "requiredCoreCapabilities", + ]; + if map_field(&core, "functions").is_some() { + core_fields.push("functions"); + } + require_exact_fields(&core, &core_fields, SUBJECT)?; + super::source_functions::validate(&core, &exports, true)?; require_exact_fields( &configuration, &["apiVersion", "programKind", "maxReads", "maxReadBytes"], diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation.rs b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation.rs index d695ba5b2..d79573b82 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation.rs @@ -84,7 +84,12 @@ impl ReadRelation<'_> { } let body = field(intent, "body")?; require_exact_fields(body, &["locals", "nodes", "result"], SUBJECT)?; - let mut scope = Scope::new(self.core, array(body, "locals")?, text(intent, "input")?)?; + let mut scope = Scope::new( + self.core, + self.exports, + array(body, "locals")?, + text(intent, "input")?, + )?; if scope.expression(field(intent, "basis")?, 0)? != ReadType::Bytes(32, 32) { return Err(invalid()); } diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs index 88ab99f7c..2d75a22c6 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs @@ -32,6 +32,12 @@ impl ReadType { (Self::Bytes(min, max), Self::Bytes(actual_min, actual_max)) => { min <= actual_min && actual_max <= max } + (Self::Record(expected), Self::Record(actual)) => { + expected.len() == actual.len() + && expected + .iter() + .all(|(name, ty)| actual.get(name).is_some_and(|value| ty.accepts(value))) + } _ => self == actual, } } @@ -39,6 +45,7 @@ impl ReadType { pub(super) struct Scope<'a> { core: &'a Value, + exports: &'a Value, inventory: BTreeMap<&'a str, &'a Value>, available: BTreeMap<&'a str, &'a Value>, used: BTreeSet<&'a str>, @@ -49,6 +56,7 @@ pub(super) struct Scope<'a> { impl<'a> Scope<'a> { pub(super) fn new( core: &'a Value, + exports: &'a Value, locals: &'a [Value], input_type: &str, ) -> Result { @@ -67,6 +75,7 @@ impl<'a> Scope<'a> { } let scope = Self { core, + exports, inventory, available: BTreeMap::from([("arg.0", input)]), used: BTreeSet::from(["arg.0"]), @@ -116,6 +125,16 @@ impl<'a> Scope<'a> { if let Some(max) = spec.strip_prefix("max=") { return Ok(ReadType::Bytes(0, canonical_number(max)?)); } + if let Some((left, right)) = spec + .strip_prefix("min=") + .and_then(|value| value.split_once(",max=")) + { + let min = canonical_number(left)?; + let max = canonical_number(right)?; + if min < max { + return Ok(ReadType::Bytes(min, max)); + } + } return Err(invalid()); } let prefix = format!("{}.", text(self.core, "coordinate")?); @@ -134,6 +153,7 @@ impl<'a> Scope<'a> { Ok(ReadType::Bytes(min, max)) } "Int" => self.resolve(text(value, "width")?, depth + 1), + "Nominal" => self.resolve(text(value, "representation")?, depth + 1), "Record" => { let fields = entries(field(value, "fields")?)? .iter() @@ -227,17 +247,120 @@ impl<'a> Scope<'a> { .collect::, ProviderRefusalV1>>()?; Ok(ReadType::Record(fields)) } + "const" => { + require_exact_fields(value, &["kind", "value"], SUBJECT)?; + let literal = field(value, "value")?; + require_exact_fields(literal, &["kind", "value", "width"], SUBJECT)?; + let width = text(literal, "width")?; + if text(literal, "kind")? != "int" || !["U32", "U64"].contains(&width) { + return Err(invalid()); + } + let ReadType::Unsigned(max) = self.ty(width)? else { + return Err(invalid()); + }; + if required_u64(literal, "value", SUBJECT)? > max { + return Err(invalid()); + } + Ok(ReadType::Unsigned(max)) + } + "if" => { + require_exact_fields(value, &["kind", "predicate", "then", "else"], SUBJECT)?; + self.predicate_at(field(value, "predicate")?, depth + 1)?; + let yes = self.expression(field(value, "then")?, depth + 1)?; + let no = self.expression(field(value, "else")?, depth + 1)?; + match (yes, no) { + (ReadType::Bytes(a, b), ReadType::Bytes(c, d)) => { + Ok(ReadType::Bytes(a.min(c), b.max(d))) + } + (a, b) if a == b => Ok(a), + _ => Err(invalid()), + } + } + "call" => self.call(value, depth), + _ => Err(invalid()), + } + } + + fn call(&self, value: &Value, depth: usize) -> Result { + require_exact_fields(value, &["kind", "callee", "args", "typeArgs"], SUBJECT)?; + let args = super::array(value, "args")?; + let types = super::array(value, "typeArgs")?; + let name = text(value, "callee")?; + let actual = args + .iter() + .map(|value| self.expression(value, depth + 1)) + .collect::, _>>()?; + let prefix = format!("{}.", text(self.core, "coordinate")?); + let signature = if let Some(member) = name.strip_prefix(&prefix) { + Some(field(field(self.core, "functions")?, member)?) + } else { + None + }; + if let Some(function) = signature { + let params = super::array(function, "params")?; + if !types.is_empty() || params.len() != actual.len() { + return Err(invalid()); + } + for (parameter, ty) in params.iter().zip(&actual) { + if !self.ty(text(parameter, "type")?)?.accepts(ty) { + return Err(invalid()); + } + } + return self.ty(text(function, "returnType")?); + } + if let Some(function) = super::array(self.exports, "pureFunctions")? + .iter() + .find(|function| super::text_field(function, "coordinate") == Some(name)) + { + if !types.is_empty() + || !args.is_empty() + || !super::array(function, "parameterTypes")?.is_empty() + { + return Err(invalid()); + } + return self.ty(text(function, "returnType")?); + } + let declared = types + .iter() + .map(|value| { + let Value::Text(name) = value else { + return Err(invalid()); + }; + self.ty(name) + }) + .collect::, _>>()?; + match (name, actual.as_slice(), declared.as_slice()) { + ("core.bytes.length", [actual], [expected @ ReadType::Bytes(_, _)]) + if expected.accepts(actual) => + { + Ok(ReadType::Unsigned(u64::MAX)) + } + ( + "core.bytes.concat", + [left, right], + [a @ ReadType::Bytes(a_min, a_max), b @ ReadType::Bytes(b_min, b_max)], + ) if a.accepts(left) && b.accepts(right) => Ok(ReadType::Bytes( + a_min.checked_add(*b_min).ok_or_else(invalid)?, + a_max.checked_add(*b_max).ok_or_else(invalid)?, + )), _ => Err(invalid()), } } pub(super) fn predicate(&self, value: &Value) -> Result<(), ProviderRefusalV1> { + self.predicate_at(value, 0) + } + + fn predicate_at(&self, value: &Value, depth: usize) -> Result<(), ProviderRefusalV1> { + if depth > 64 { + return Err(invalid()); + } require_exact_fields(value, &["kind", "op", "left", "right"], SUBJECT)?; if text(value, "kind")? != "compare" { return Err(invalid()); } - let left = self.expression(field(value, "left")?, 0)?; - let right = self.expression(field(value, "right")?, 0)?; + let left = self.expression(field(value, "left")?, depth + 1)?; + let right = self.expression(field(value, "right")?, depth + 1)?; match (text(value, "op")?, left, right) { ("==", ReadType::Bytes(_, _), ReadType::Bytes(_, _)) => Ok(()), ("==" | "<=", ReadType::Unsigned(left), ReadType::Unsigned(right)) if left == right => { @@ -307,6 +430,7 @@ mod tests { ]); let scope = Scope { core: &core, + exports: &core, inventory: BTreeMap::new(), available: BTreeMap::new(), used: BTreeSet::new(), diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs b/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs new file mode 100644 index 000000000..a0a29da1e --- /dev/null +++ b/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs @@ -0,0 +1,762 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +//! Lowerer-owned forward type, totality, depth and deterministic cost judgment. +//! Applies to the complete source-function module, including unused definitions. +use super::ProviderRefusalV1; +use echo_edict_canonical::CanonicalValueV1 as Value; +use std::collections::{BTreeMap, BTreeSet}; + +type Check = Result; +const DEPTH: usize = 64; +const WORK: usize = 65_536; +#[derive(Clone, Debug, PartialEq, Eq)] +enum Ty { + Word(u64), + Bytes(u64, u64), + Record(BTreeMap), +} +#[derive(Clone, Copy, Default)] +struct Cost { + steps: u64, + bytes: u64, +} +impl Cost { + fn plus(self, other: Self) -> Check { + Ok(Self { + steps: self.steps.checked_add(other.steps).ok_or(())?, + bytes: self.bytes.checked_add(other.bytes).ok_or(())?, + }) + } + fn maximum(self, other: Self) -> Self { + Self { + steps: self.steps.max(other.steps), + bytes: self.bytes.max(other.bytes), + } + } +} +#[derive(Clone)] +struct Fact { + ty: Ty, + cost: Cost, + depth: usize, +} +#[derive(Clone, Copy)] +struct Function<'a> { + params: &'a [Value], + body: &'a Value, + result: &'a str, + source: bool, +} +type Scope<'a> = BTreeMap; +struct Judgment<'a> { + core: &'a Value, + functions: BTreeMap>, + completed: BTreeMap, + active: BTreeSet, + work: usize, +} + +pub(super) fn validate(core: &Value, exports: &Value, read: bool) -> Result<(), ProviderRefusalV1> { + if super::map_field(core, "functions").is_none() { + return Ok(()); + } + run(core, exports, read) + .map_err(|()| super::super::unsupported_semantics("core.source-functions")) +} +fn run(core: &Value, exports: &Value, read: bool) -> Check<()> { + let mut functions = BTreeMap::new(); + for item in list(get(exports, "pureFunctions")?)? { + if string(get(item, "source")?)? != "edict" { + return Err(()); + } + let implementation = get(item, "body")?; + let body = get(implementation, "body")?; + for (value, key) in [ + (item, "parameterTypes"), + (item, "typeParameters"), + (implementation, "params"), + (body, "locals"), + (body, "bindings"), + ] { + if !list(get(value, key)?)?.is_empty() { + return Err(()); + } + } + let name = string(get(item, "coordinate")?)?; + if name.starts_with("core.") + || functions + .insert( + name.to_owned(), + Function { + params: list(get(implementation, "params")?)?, + body, + result: string(get(item, "returnType")?)?, + source: false, + }, + ) + .is_some() + { + return Err(()); + } + } + for (name, function) in members(get(core, "functions")?)? { + let name = string(name)?; + if !identifier(name) + || super::map_field(get(core, "intents")?, name).is_some() + || super::map_field(get(core, "types")?, name).is_some() + { + return Err(()); + } + exact(function, &["params", "returnType", "body"])?; + let name = format!("{}.{}", string(get(core, "coordinate")?)?, name); + if name.starts_with("core.") + || functions + .insert( + name, + Function { + params: list(get(function, "params")?)?, + body: get(function, "body")?, + result: string(get(function, "returnType")?)?, + source: true, + }, + ) + .is_some() + { + return Err(()); + } + } + let mut proof = Judgment { + core, + functions, + completed: BTreeMap::new(), + active: BTreeSet::new(), + work: WORK, + }; + for name in proof.functions.keys().cloned().collect::>() { + proof.function(&name, 1)?; + } + for (_, intent) in members(get(core, "intents")?)? { + proof.intent(intent, read)?; + } + Ok(()) +} +impl Judgment<'_> { + fn charge(&mut self, depth: usize) -> Check<()> { + self.work = self.work.checked_sub(1).ok_or(())?; + if depth > DEPTH { + Err(()) + } else { + Ok(()) + } + } + fn ty(&mut self, name: &str, depth: usize) -> Check { + self.charge(depth)?; + if let Some(max) = match name { + "U8" => Some(u8::MAX.into()), + "U16" => Some(u16::MAX.into()), + "U32" => Some(u32::MAX.into()), + "U64" => Some(u64::MAX), + _ => None, + } { + return Ok(Ty::Word(max)); + } + if let Some(bounds) = name + .strip_prefix("Bytes<") + .and_then(|value| value.strip_suffix('>')) + { + if let Some(n) = bounds.strip_prefix("exact=") { + let n = decimal(n)?; + return Ok(Ty::Bytes(n, n)); + } + if let Some(n) = bounds.strip_prefix("max=") { + return Ok(Ty::Bytes(0, decimal(n)?)); + } + if let Some((min, max)) = bounds + .strip_prefix("min=") + .and_then(|v| v.split_once(",max=")) + { + let (min, max) = (decimal(min)?, decimal(max)?); + if min < max { + return Ok(Ty::Bytes(min, max)); + } + } + return Err(()); + } + let prefix = format!("{}.", string(get(self.core, "coordinate")?)?); + let definition = get( + get(self.core, "types")?, + name.strip_prefix(&prefix).unwrap_or(name), + )?; + match string(get(definition, "kind")?)? { + "Nominal" => self.ty(string(get(definition, "representation")?)?, depth + 1), + "Bytes" => { + let min = super::map_field(definition, "min") + .map(number) + .transpose()? + .unwrap_or(0); + let max = number(get(definition, "max")?)?; + if min > max { + return Err(()); + } + Ok(Ty::Bytes(min, max)) + } + "Record" => { + let mut fields = BTreeMap::new(); + for (key, value) in members(get(definition, "fields")?)? { + if fields + .insert(string(key)?.to_owned(), self.ty(string(value)?, depth + 1)?) + .is_some() + { + return Err(()); + } + } + Ok(Ty::Record(fields)) + } + _ => Err(()), + } + } + fn declaration<'a>(&mut self, value: &'a Value, scope: &mut Scope<'a>) -> Check { + exact(value, &["id", "type", "alphaName"])?; + let id = string(get(value, "id")?)?; + string(get(value, "alphaName")?)?; + let ty = self.ty(string(get(value, "type")?)?, 0)?; + if scope.insert(id.to_owned(), (value, ty.clone())).is_some() { + return Err(()); + } + Ok(ty) + } + fn function(&mut self, name: &str, prefix: usize) -> Check { + self.charge(prefix)?; + if self.active.contains(name) { + return Err(()); + } + if let Some(fact) = self.completed.get(name) { + if prefix.checked_add(fact.depth).ok_or(())? > DEPTH { + return Err(()); + } + self.work = self + .work + .checked_sub(usize::try_from(shape(&fact.ty)?.0.steps).map_err(|_| ())?) + .ok_or(())?; + return Ok(fact.clone()); + } + let function = *self.functions.get(name).ok_or(())?; + self.active.insert(name.to_owned()); + exact(function.body, &["locals", "bindings", "result"])?; + let mut scope = BTreeMap::new(); + let mut depth = 0; + for parameter in function.params { + depth = depth.max(shape(&self.declaration(parameter, &mut scope)?)?.3); + } + let mut pending = BTreeMap::new(); + for local in list(get(function.body, "locals")?)? { + exact(local, &["id", "type", "alphaName"])?; + let id = string(get(local, "id")?)?; + if scope.contains_key(id) || pending.insert(id, local).is_some() { + return Err(()); + } + } + let mut cost = Cost::default(); + for binding in list(get(function.body, "bindings")?)? { + exact(binding, &["kind", "binding", "value"])?; + if string(get(binding, "kind")?)? != "let" { + return Err(()); + } + let local = get(binding, "binding")?; + if pending.remove(string(get(local, "id")?)?) != Some(local) { + return Err(()); + } + let fact = self.expression(get(binding, "value")?, &scope, function.source, prefix)?; + let expected = self.declaration(local, &mut scope)?; + if !includes(&expected, &fact.ty) { + return Err(()); + } + let (_, validations, _, ty_depth) = shape(&expected)?; + cost = cost.plus(fact.cost)?.plus(Cost { + steps: validations, + bytes: 0, + })?; + depth = depth.max(fact.depth).max(ty_depth); + } + if !pending.is_empty() { + return Err(()); + } + let result = self.expression( + get(function.body, "result")?, + &scope, + function.source, + prefix, + )?; + let ty = self.ty(function.result, 0)?; + if !includes(&ty, &result.ty) { + return Err(()); + } + let (_, validations, _, ty_depth) = shape(&ty)?; + let fact = Fact { + ty, + cost: cost.plus(result.cost)?.plus(Cost { + steps: validations, + bytes: 0, + })?, + depth: depth.max(result.depth).max(ty_depth), + }; + if prefix.checked_add(fact.depth).ok_or(())? > DEPTH { + return Err(()); + } + self.active.remove(name); + self.completed.insert(name.to_owned(), fact.clone()); + Ok(fact) + } + fn expression( + &mut self, + value: &Value, + scope: &Scope<'_>, + source: bool, + prefix: usize, + ) -> Check { + self.charge(prefix)?; + let mut cost = Cost { steps: 1, bytes: 0 }; + let mut depth = 0; + let ty = match string(get(value, "kind")?)? { + "local" => { + exact(value, &["kind", "ref"])?; + let local = get(value, "ref")?; + let (declared, ty) = scope.get(string(get(local, "id")?)?).ok_or(())?; + if *declared != local { + return Err(()); + } + let copied = shape(ty)?.0; + self.work = self + .work + .checked_sub(usize::try_from(copied.steps).map_err(|_| ())?) + .ok_or(())?; + cost = cost.plus(copied)?; + ty.clone() + } + "const" => { + exact(value, &["kind", "value"])?; + let literal = get(value, "value")?; + exact(literal, &["kind", "value", "width"])?; + let width = string(get(literal, "width")?)?; + if string(get(literal, "kind")?)? != "int" || !["U32", "U64"].contains(&width) { + return Err(()); + } + let ty = self.ty(width, 0)?; + let Ty::Word(max) = ty else { + return Err(()); + }; + if number(get(literal, "value")?)? > max { + return Err(()); + } + cost = cost.plus(Cost { + steps: 1, + bytes: 64, + })?; + ty + } + "field" => { + exact(value, &["kind", "base", "field"])?; + let base = self.expression(get(value, "base")?, scope, source, prefix + 1)?; + cost = cost.plus(base.cost)?; + depth = base.depth + 1; + let Ty::Record(mut fields) = base.ty else { + return Err(()); + }; + fields.remove(string(get(value, "field")?)?).ok_or(())? + } + "record" => { + exact(value, &["kind", "fields"])?; + cost.bytes = 64; + let mut fields = BTreeMap::new(); + for (key, value) in members(get(value, "fields")?)? { + let key = string(key)?; + let fact = self.expression(value, scope, source, prefix + 1)?; + cost = cost.plus(fact.cost)?.plus(Cost { + steps: 0, + bytes: 64_u64.checked_add(key.len() as u64).ok_or(())?, + })?; + depth = depth.max(fact.depth + 1); + if fields.insert(key.to_owned(), fact.ty).is_some() { + return Err(()); + } + } + Ty::Record(fields) + } + "if" => { + exact(value, &["kind", "predicate", "then", "else"])?; + let predicate = + self.predicate(get(value, "predicate")?, scope, source, prefix + 1)?; + let yes = self.expression(get(value, "then")?, scope, source, prefix + 1)?; + let no = self.expression(get(value, "else")?, scope, source, prefix + 1)?; + cost = cost.plus(predicate.0)?.plus(yes.cost.maximum(no.cost))?; + depth = predicate.1.max(yes.depth).max(no.depth) + 1; + union(yes.ty, no.ty)? + } + "call" => { + exact(value, &["kind", "callee", "args", "typeArgs"])?; + let name = string(get(value, "callee")?)?; + let arguments = list(get(value, "args")?)?; + let types = list(get(value, "typeArgs")?)?; + let mut actual = Vec::new(); + for argument in arguments { + let fact = self.expression(argument, scope, source, prefix + 1)?; + cost = cost.plus(fact.cost)?; + depth = depth.max(fact.depth + 1); + actual.push(fact.ty); + } + if let Some(function) = self.functions.get(name).copied() { + if !types.is_empty() + || arguments.len() != function.params.len() + || (!source && function.source) + { + return Err(()); + } + for (actual, parameter) in actual.iter().zip(function.params) { + let ty = self.ty(string(get(parameter, "type")?)?, 0)?; + if !includes(&ty, actual) { + return Err(()); + } + let (_, validations, _, ty_depth) = shape(&ty)?; + cost = cost.plus(Cost { + steps: validations, + bytes: 0, + })?; + depth = depth.max(ty_depth + 1); + } + let result = self.function(name, prefix + 1)?; + cost = cost.plus(result.cost)?; + depth = depth.max(result.depth + 1); + result.ty + } else { + let declared = types + .iter() + .map(|value| self.ty(string(value)?, prefix + 1)) + .collect::>>()?; + depth = depth.max(1); + match (name, actual.as_slice(), declared.as_slice()) { + ("core.bytes.length", [actual], [expected @ Ty::Bytes(_, _)]) + if includes(expected, actual) => + { + cost = cost.plus(Cost { + steps: 2, + bytes: 64, + })?; + Ty::Word(u64::MAX) + } + ( + "core.bytes.concat", + [left, right], + [a @ Ty::Bytes(a_min, a_max), b @ Ty::Bytes(b_min, b_max)], + ) if includes(a, left) && includes(b, right) => { + let min = a_min.checked_add(*b_min).ok_or(())?; + let max = a_max.checked_add(*b_max).ok_or(())?; + cost = cost.plus(Cost { + steps: max.checked_add(3).ok_or(())?, + bytes: max.checked_add(64).ok_or(())?, + })?; + Ty::Bytes(min, max) + } + ("core.integer.subtract", [left, right], [expected @ Ty::Word(_)]) + if includes(expected, left) && includes(expected, right) => + { + literal(&arguments[0])? + .checked_sub(literal(&arguments[1])?) + .ok_or(())?; + cost = cost.plus(Cost { + steps: 3, + bytes: 64, + })?; + expected.clone() + } + ( + "core.bytes.slice", + [actual, Ty::Word(a), Ty::Word(b)], + [expected @ Ty::Bytes(min, _)], + ) if *a == u64::MAX && *b == u64::MAX && includes(expected, actual) => { + let start = literal(&arguments[1])?; + let end = literal(&arguments[2])?; + if start > end || end > *min { + return Err(()); + } + let count = end - start; + cost = cost.plus(Cost { + steps: count.checked_add(4).ok_or(())?, + bytes: count.checked_add(64).ok_or(())?, + })?; + Ty::Bytes(0, count) + } + _ => return Err(()), + } + } + } + _ => return Err(()), + }; + if prefix.checked_add(depth).ok_or(())? > DEPTH { + return Err(()); + } + Ok(Fact { ty, cost, depth }) + } + fn predicate( + &mut self, + value: &Value, + scope: &Scope<'_>, + source: bool, + prefix: usize, + ) -> Check<(Cost, usize)> { + self.charge(prefix)?; + exact(value, &["kind", "op", "left", "right"])?; + if string(get(value, "kind")?)? != "compare" { + return Err(()); + } + let left = self.expression(get(value, "left")?, scope, source, prefix + 1)?; + let right = self.expression(get(value, "right")?, scope, source, prefix + 1)?; + let extra = match (string(get(value, "op")?)?, &left.ty, &right.ty) { + ("==", Ty::Bytes(_, a), Ty::Bytes(_, b)) => (*a).max(*b), + ("==" | "<=", Ty::Word(a), Ty::Word(b)) if a == b => 0, + _ => return Err(()), + }; + Ok(( + left.cost.plus(right.cost)?.plus(Cost { + steps: extra.checked_add(1).ok_or(())?, + bytes: 0, + })?, + left.depth.max(right.depth) + 1, + )) + } + fn intent(&mut self, intent: &Value, read: bool) -> Check<()> { + let body = get(intent, "body")?; + exact(body, &["locals", "nodes", "result"])?; + let mut pending = BTreeMap::new(); + for declaration in list(get(body, "locals")?)? { + exact(declaration, &["id", "type", "alphaName"])?; + string(get(declaration, "alphaName")?)?; + self.ty(string(get(declaration, "type")?)?, 0)?; + if pending + .insert(string(get(declaration, "id")?)?, declaration) + .is_some() + { + return Err(()); + } + } + let input = pending.remove("arg.0").ok_or(())?; + if get(input, "type")? != get(intent, "input")? { + return Err(()); + } + let mut scope = BTreeMap::new(); + let ty = self.declaration(input, &mut scope)?; + let (copy, validation, _, _) = shape(&ty)?; + let mut cost = copy.plus(Cost { + steps: validation, + bytes: 0, + })?; + if let Some(basis) = super::map_field(intent, "basis") { + let checked = self.expression(basis, &scope, true, 0)?; + // The pure profile retains basis authority without executing it. + if read { + cost = cost.plus(checked.cost)?; + } + } else if read { + return Err(()); + } + for constraint in list(get(intent, "inputConstraints")?)? { + cost = cost.plus( + self.predicate(get(constraint, "predicate")?, &scope, true, 0)? + .0, + )?; + } + for node in list(get(body, "nodes")?)? { + if read { + cost = cost.plus(Cost { steps: 1, bytes: 0 })?; + } + let kind = string(get(node, "kind")?)?; + if kind == "let" || (read && kind == "effect") { + let binding = get(node, "binding")?; + if pending.remove(string(get(binding, "id")?)?) != Some(binding) { + return Err(()); + } + } + match kind { + "let" => { + exact(node, &["kind", "binding", "value"])?; + let fact = self.expression(get(node, "value")?, &scope, true, 0)?; + let ty = self.declaration(get(node, "binding")?, &mut scope)?; + if !includes(&ty, &fact.ty) { + return Err(()); + } + cost = cost.plus(fact.cost)?.plus(Cost { + steps: shape(&ty)?.1, + bytes: 0, + })?; + } + "effect" if read => { + cost = + cost.plus(self.expression(get(node, "input")?, &scope, true, 0)?.cost)?; + let Ty::Bytes(_, max) = self.declaration(get(node, "binding")?, &mut scope)? + else { + return Err(()); + }; + cost = cost.plus(Cost { + steps: max.checked_add(1).ok_or(())?, + bytes: max.checked_add(64).ok_or(())?, + })?; + } + "require" if read => { + cost = + cost.plus(self.predicate(get(node, "predicate")?, &scope, true, 0)?.0)?; + } + _ => return Err(()), + } + } + // Failure-handler declarations on the read route are checked by its + // full ordered relation; a pure intent has no other declaration owner. + if !read && !pending.is_empty() { + return Err(()); + } + let result = self.expression(get(body, "result")?, &scope, true, 0)?; + let expected = self.ty(string(get(intent, "output")?)?, 0)?; + if !includes(&expected, &result.ty) { + return Err(()); + } + let (scratch, validations, output, _) = shape(&expected)?; + cost = cost.plus(result.cost)?.plus(scratch)?.plus(Cost { + steps: validations, + bytes: 0, + })?; + let budget = get(intent, "coreEvaluationBudget")?; + if cost.steps > number(get(budget, "maxSteps")?)? + || cost.bytes > number(get(budget, "maxAllocatedBytes")?)? + || output > number(get(budget, "maxOutputBytes")?)? + { + return Err(()); + } + Ok(()) + } +} +fn shape(ty: &Ty) -> Check<(Cost, u64, u64, usize)> { + match ty { + Ty::Word(_) => Ok(( + Cost { + steps: 1, + bytes: 64, + }, + 1, + 9, + 0, + )), + Ty::Bytes(_, max) => Ok(( + Cost { + steps: 1, + bytes: max.checked_add(64).ok_or(())?, + }, + 1, + max.checked_add(9).ok_or(())?, + 0, + )), + Ty::Record(fields) => { + let mut cost = Cost { + steps: 1, + bytes: 64, + }; + let mut validations = 1_u64; + let mut encoded = 9_u64; + let mut depth = 0; + for (name, ty) in fields { + let (child, validation, bytes, child_depth) = shape(ty)?; + cost = cost.plus(child)?.plus(Cost { + steps: 1, + bytes: 64_u64.checked_add(name.len() as u64).ok_or(())?, + })?; + validations = validations.checked_add(validation).ok_or(())?; + encoded = encoded + .checked_add(9) + .and_then(|v| v.checked_add(name.len() as u64)) + .and_then(|v| v.checked_add(bytes)) + .ok_or(())?; + depth = depth.max(child_depth + 1); + } + Ok((cost, validations, encoded, depth)) + } + } +} +fn includes(expected: &Ty, actual: &Ty) -> bool { + match (expected, actual) { + (Ty::Bytes(a, b), Ty::Bytes(c, d)) => a <= c && d <= b, + (Ty::Record(a), Ty::Record(b)) => { + a.len() == b.len() + && a.iter() + .all(|(name, ty)| b.get(name).is_some_and(|actual| includes(ty, actual))) + } + _ => expected == actual, + } +} +fn union(left: Ty, right: Ty) -> Check { + match (left, right) { + (Ty::Bytes(a, b), Ty::Bytes(c, d)) => Ok(Ty::Bytes(a.min(c), b.max(d))), + (a, b) if a == b => Ok(a), + _ => Err(()), + } +} +fn identifier(value: &str) -> bool { + !value.is_empty() + && value.len() <= 1024 + && value + .bytes() + .enumerate() + .all(|(i, c)| c == b'_' || c.is_ascii_alphabetic() || (i > 0 && c.is_ascii_digit())) +} +fn get<'a>(value: &'a Value, name: &str) -> Check<&'a Value> { + super::map_field(value, name).ok_or(()) +} +fn members(value: &Value) -> Check<&[(Value, Value)]> { + if let Value::Map(values) = value { + Ok(values) + } else { + Err(()) + } +} +fn list(value: &Value) -> Check<&[Value]> { + if let Value::Array(values) = value { + Ok(values) + } else { + Err(()) + } +} +fn string(value: &Value) -> Check<&str> { + if let Value::Text(value) = value { + if !value.is_empty() && value.len() <= 1024 { + return Ok(value); + } + } + Err(()) +} +fn number(value: &Value) -> Check { + if let Value::Integer(value) = value { + u64::try_from(*value).map_err(|_| ()) + } else { + Err(()) + } +} +fn decimal(value: &str) -> Check { + let parsed: u64 = value.parse().map_err(|_| ())?; + if parsed.to_string() != value { + return Err(()); + } + Ok(parsed) +} +fn literal(value: &Value) -> Check { + if string(get(value, "kind")?)? != "const" { + return Err(()); + } + number(get(get(value, "value")?, "value")?) +} +fn exact(value: &Value, names: &[&str]) -> Check<()> { + let fields = members(value)?; + if fields.len() != names.len() + || fields + .iter() + .any(|(key, _)| !names.contains(&string(key).unwrap_or(""))) + { + return Err(()); + } + Ok(()) +} diff --git a/crates/echo-edict-provider-verifier/src/executable_operation.rs b/crates/echo-edict-provider-verifier/src/executable_operation.rs index ba67fd0d8..324b964eb 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation.rs @@ -3,6 +3,7 @@ //! Independent verification for generic bounded executable-operation packages. mod bounded_read; +mod source_functions; use std::collections::BTreeSet; @@ -263,6 +264,7 @@ fn verify_compiler_produced_pure( request, )?; validate_pure_target_ir(target_ir, request, closure.lawpack, intent_name, intent)?; + source_functions::validate(core, exports, false)?; if !crate::pure_relation::preserves(intent, target_ir, intent_name) { return Err(super::unsupported_semantics("target-ir.echo-pure-relation")); } diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit.rs b/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit.rs index bdb9365d7..a33ce5148 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit.rs @@ -26,17 +26,19 @@ pub(super) fn check(e: &Evidence<'_>) -> Check<()> { { return Err(()); } - exact( - &e.core, - &[ - "apiVersion", - "coordinate", - "imports", - "types", - "intents", - "requiredCoreCapabilities", - ], - )?; + let mut fields = vec![ + "apiVersion", + "coordinate", + "imports", + "types", + "intents", + "requiredCoreCapabilities", + ]; + if super::map_field(&e.core, "functions").is_some() { + fields.push("functions"); + } + exact(&e.core, &fields)?; + super::super::source_functions::validate(&e.core, &e.exports, true).map_err(|_| ())?; if text(&e.core, "apiVersion")? != "edict.core/v1" || text(&e.core, "coordinate")? != e.request.core.reference.coordinate || !sequence(&e.core, "requiredCoreCapabilities")?.is_empty() @@ -150,7 +152,12 @@ pub(super) fn check(e: &Evidence<'_>) -> Check<()> { )?; let body = get(intent, "body")?; exact(body, &["locals", "nodes", "result"])?; - let mut symbols = Symbols::new(&e.core, sequence(body, "locals")?, text(intent, "input")?)?; + let mut symbols = Symbols::new( + &e.core, + &e.exports, + sequence(body, "locals")?, + text(intent, "input")?, + )?; if symbols.expression(get(target, "basis")?, 0)? != (Schema::Bytes { lower: 32, diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs b/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs index c5871898e..640d2e033 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs @@ -31,6 +31,12 @@ impl Schema { (Self::Bytes { lower, upper }, Self::Bytes { lower: a, upper: b }) => { lower <= a && b <= upper } + (Self::Row(expected), Self::Row(actual)) => { + expected.len() == actual.len() + && expected + .iter() + .all(|(name, ty)| actual.get(name).is_some_and(|value| ty.includes(value))) + } _ => self == actual, } } @@ -38,6 +44,7 @@ impl Schema { pub(super) struct Symbols<'a> { core: &'a Value, + exports: &'a Value, declared: BTreeMap, live: BTreeSet, claimed: BTreeSet, @@ -45,7 +52,12 @@ pub(super) struct Symbols<'a> { } impl<'a> Symbols<'a> { - pub(super) fn new(core: &'a Value, declarations: &[Value], input: &str) -> Check { + pub(super) fn new( + core: &'a Value, + exports: &'a Value, + declarations: &[Value], + input: &str, + ) -> Check { let mut declared = BTreeMap::new(); for declaration in declarations { exact(declaration, &["id", "type", "alphaName"])?; @@ -63,6 +75,7 @@ impl<'a> Symbols<'a> { } let mut symbols = Self { core, + exports, declared, live: BTreeSet::from(["arg.0".to_owned()]), claimed: BTreeSet::from(["arg.0".to_owned()]), @@ -109,6 +122,16 @@ impl<'a> Symbols<'a> { upper: decimal(value)?, }); } + if let Some((left, right)) = bound + .strip_prefix("min=") + .and_then(|value| value.split_once(",max=")) + { + let lower = decimal(left)?; + let upper = decimal(right)?; + if lower < upper { + return Ok(Schema::Bytes { lower, upper }); + } + } return Err(()); } let prefix = format!("{}.", text(self.core, "coordinate")?); @@ -129,6 +152,7 @@ impl<'a> Symbols<'a> { Ok(Schema::Bytes { lower, upper }) } "Int" => self.schema(text(value, "width")?, depth + 1), + "Nominal" => self.schema(text(value, "representation")?, depth + 1), "Record" => { let mut fields = BTreeMap::new(); for (key, value) in members(get(value, "fields")?)? { @@ -200,17 +224,121 @@ impl<'a> Symbols<'a> { } Ok(Schema::Row(fields)) } + "const" => { + exact(value, &["kind", "value"])?; + let literal = get(value, "value")?; + exact(literal, &["kind", "value", "width"])?; + let width = text(literal, "width")?; + if text(literal, "kind")? != "int" || !["U32", "U64"].contains(&width) { + return Err(()); + } + let Schema::Word(max) = self.schema(width, 0)? else { + return Err(()); + }; + if number(get(literal, "value")?)? > max { + return Err(()); + } + Ok(Schema::Word(max)) + } + "if" => { + exact(value, &["kind", "predicate", "then", "else"])?; + self.predicate_at(get(value, "predicate")?, depth + 1)?; + let yes = self.expression(get(value, "then")?, depth + 1)?; + let no = self.expression(get(value, "else")?, depth + 1)?; + match (yes, no) { + ( + Schema::Bytes { lower: a, upper: b }, + Schema::Bytes { lower: c, upper: d }, + ) => Ok(Schema::Bytes { + lower: a.min(c), + upper: b.max(d), + }), + (a, b) if a == b => Ok(a), + _ => Err(()), + } + } + "call" => self.call(value, depth), + _ => Err(()), + } + } + + fn call(&mut self, value: &Value, depth: usize) -> Check { + exact(value, &["kind", "callee", "args", "typeArgs"])?; + let name = text(value, "callee")?; + let args = super::sequence(value, "args")?; + let types = super::sequence(value, "typeArgs")?; + let mut actual = Vec::new(); + for argument in args { + actual.push(self.expression(argument, depth + 1)?); + } + let core = self.core; + let prefix = format!("{}.", text(core, "coordinate")?); + if let Some(member) = name.strip_prefix(&prefix) { + let definition = get(get(core, "functions")?, member)?; + let parameters = super::sequence(definition, "params")?; + if !types.is_empty() || actual.len() != parameters.len() { + return Err(()); + } + for (parameter, argument) in parameters.iter().zip(&actual) { + if !self.schema(text(parameter, "type")?, 0)?.includes(argument) { + return Err(()); + } + } + return self.schema(text(definition, "returnType")?, 0); + } + let exports = self.exports; + if let Some(function) = super::sequence(exports, "pureFunctions")? + .iter() + .find(|function| text(function, "coordinate") == Ok(name)) + { + if !types.is_empty() + || !args.is_empty() + || !super::sequence(function, "parameterTypes")?.is_empty() + { + return Err(()); + } + return self.schema(text(function, "returnType")?, 0); + } + let mut declared = Vec::new(); + for coordinate in types { + declared.push(self.schema(string(coordinate)?, 0)?); + } + match (name, actual.as_slice(), declared.as_slice()) { + ("core.bytes.length", [actual], [expected @ Schema::Bytes { .. }]) + if expected.includes(actual) => + { + Ok(Schema::Word(u64::MAX)) + } + ( + "core.bytes.concat", + [left, right], + [a @ Schema::Bytes { + lower: a_min, + upper: a_max, + }, b @ Schema::Bytes { + lower: b_min, + upper: b_max, + }], + ) if a.includes(left) && b.includes(right) => Ok(Schema::Bytes { + lower: a_min.checked_add(*b_min).ok_or(())?, + upper: a_max.checked_add(*b_max).ok_or(())?, + }), _ => Err(()), } } pub(super) fn predicate(&mut self, value: &Value) -> Check<()> { + self.predicate_at(value, 0) + } + + fn predicate_at(&mut self, value: &Value, depth: usize) -> Check<()> { + self.charge(depth)?; exact(value, &["kind", "op", "left", "right"])?; if text(value, "kind")? != "compare" { return Err(()); } - let left = self.expression(get(value, "left")?, 0)?; - let right = self.expression(get(value, "right")?, 0)?; + let left = self.expression(get(value, "left")?, depth + 1)?; + let right = self.expression(get(value, "right")?, depth + 1)?; match (text(value, "op")?, left, right) { ("==", Schema::Bytes { .. }, Schema::Bytes { .. }) => Ok(()), ("==" | "<=", Schema::Word(a), Schema::Word(b)) if a == b => Ok(()), diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs new file mode 100644 index 000000000..a9dcc9f06 --- /dev/null +++ b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs @@ -0,0 +1,690 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +//! Independent verifier judgment: inventory authority, eliminate dependency leaves, +//! then audit ordered lexical frames and conservative whole-operation charges. +mod types; +use super::ProviderRefusalV1; +use echo_edict_canonical::CanonicalValueV1 as Value; +use std::collections::{BTreeMap, BTreeSet}; +use types::{Charge, Schema, Types}; +type Check = Result; + +struct Definition<'a> { + source: bool, + params: &'a [Value], + body: &'a Value, + parameter_types: Vec, + result: Schema, +} +#[derive(Clone, Copy)] +struct Summary { + charge: Charge, + height: usize, +} +struct Expression { + schema: Schema, + charge: Charge, + height: usize, +} +struct Frame<'a> { + declared: BTreeMap<&'a str, &'a Value>, + values: BTreeMap<&'a str, (&'a Value, Schema)>, +} +impl<'a> Frame<'a> { + fn new( + declarations: impl IntoIterator, + types: &mut Types<'_>, + ) -> Check { + let mut declared = BTreeMap::new(); + for local in declarations { + types.local(local)?; + if declared.insert(string(get(local, "id")?)?, local).is_some() { + return Err(()); + } + } + Ok(Self { + declared, + values: BTreeMap::new(), + }) + } + fn define(&mut self, local: &'a Value, schema: Schema) -> Check<()> { + let id = string(get(local, "id")?)?; + if self.declared.get(id).copied() != Some(local) + || self.values.insert(id, (local, schema)).is_some() + { + return Err(()); + } + Ok(()) + } + fn complete(&self) -> Check<()> { + if self.values.len() == self.declared.len() { + Ok(()) + } else { + Err(()) + } + } +} + +pub(super) fn validate(core: &Value, exports: &Value, read: bool) -> Result<(), ProviderRefusalV1> { + if super::map_field(core, "functions").is_none() { + return Ok(()); + } + audit(core, exports, read) + .map_err(|()| super::super::unsupported_semantics("core.source-functions-verification")) +} +fn audit(core: &Value, exports: &Value, read: bool) -> Check<()> { + let mut types = Types::new(core); + let definitions = inventory(core, exports, &mut types)?; + let mut pending = BTreeMap::new(); + let mut callers: BTreeMap<&str, Vec<&str>> = BTreeMap::new(); + for (name, definition) in &definitions { + let mut edges = BTreeSet::new(); + let mut expressions = Vec::new(); + for binding in sequence(get(definition.body, "bindings")?)? { + expressions.push((get(binding, "value")?, 0)); + } + expressions.push((get(definition.body, "result")?, 0)); + while let Some((expression, depth)) = expressions.pop() { + types.step(depth)?; + match string(get(expression, "kind")?)? { + "const" | "local" => {} + "field" => expressions.push((get(expression, "base")?, depth + 1)), + "record" => { + for (_, value) in members(get(expression, "fields")?)? { + expressions.push((value, depth + 1)); + } + } + "if" => { + let predicate = get(expression, "predicate")?; + expressions.push((get(predicate, "left")?, depth + 2)); + expressions.push((get(predicate, "right")?, depth + 2)); + expressions.push((get(expression, "then")?, depth + 1)); + expressions.push((get(expression, "else")?, depth + 1)); + } + "call" => { + let callee = string(get(expression, "callee")?)?; + if let Some(target) = definitions.get(callee) { + if !definition.source && target.source { + return Err(()); + } + edges.insert(callee); + } else if ![ + "core.bytes.length", + "core.bytes.concat", + "core.bytes.slice", + "core.integer.subtract", + ] + .contains(&callee) + { + return Err(()); + } + for argument in sequence(get(expression, "args")?)? { + expressions.push((argument, depth + 1)); + } + } + _ => return Err(()), + } + } + pending.insert(name.as_str(), edges.len()); + for edge in edges { + callers.entry(edge).or_default().push(name); + } + } + let mut ready: BTreeSet<&str> = pending + .iter() + .filter_map(|(name, degree)| (*degree == 0).then_some(*name)) + .collect(); + let mut summaries = BTreeMap::new(); + // No native recursion crosses a function edge. Dependencies receive their + // own complete summary before any caller can use it, in either name order. + while let Some(name) = ready.pop_first() { + types.step(0)?; + let definition = definitions.get(name).ok_or(())?; + let summary = Checker { + types: &mut types, + definitions: &definitions, + summaries: &summaries, + } + .function(definition)?; + if summary.height + 1 > 64 { + return Err(()); + } + summaries.insert(name.to_owned(), summary); + if let Some(users) = callers.get(name) { + for user in users { + let degree = pending.get_mut(user).ok_or(())?; + *degree = degree.checked_sub(1).ok_or(())?; + if *degree == 0 { + ready.insert(user); + } + } + } + } + if summaries.len() != definitions.len() { + return Err(()); + } + let mut checker = Checker { + types: &mut types, + definitions: &definitions, + summaries: &summaries, + }; + for (_, intent) in members(get(core, "intents")?)? { + checker.intent(intent, read)?; + } + Ok(()) +} +fn inventory<'a>( + core: &'a Value, + exports: &'a Value, + types: &mut Types<'_>, +) -> Check>> { + let mut definitions = BTreeMap::new(); + for export in sequence(get(exports, "pureFunctions")?)? { + if string(get(export, "source")?)? != "edict" { + return Err(()); + } + let implementation = get(export, "body")?; + let body = get(implementation, "body")?; + for (value, key) in [ + (export, "parameterTypes"), + (export, "typeParameters"), + (implementation, "params"), + (body, "locals"), + (body, "bindings"), + ] { + if !sequence(get(value, key)?)?.is_empty() { + return Err(()); + } + } + exact(body, &["locals", "bindings", "result"])?; + let name = string(get(export, "coordinate")?)?; + if name.starts_with("core.") + || definitions + .insert( + name.to_owned(), + Definition { + source: false, + params: sequence(get(implementation, "params")?)?, + body, + parameter_types: vec![], + result: types.resolve(string(get(export, "returnType")?)?, 0)?, + }, + ) + .is_some() + { + return Err(()); + } + } + for (name, definition) in members(get(core, "functions")?)? { + types.step(0)?; + let name = string(name)?; + if !name.bytes().enumerate().all(|(index, byte)| { + byte == b'_' || byte.is_ascii_alphabetic() || (index > 0 && byte.is_ascii_digit()) + }) || super::map_field(get(core, "types")?, name).is_some() + || super::map_field(get(core, "intents")?, name).is_some() + { + return Err(()); + } + exact(definition, &["params", "returnType", "body"])?; + let body = get(definition, "body")?; + exact(body, &["locals", "bindings", "result"])?; + let params = sequence(get(definition, "params")?)?; + let mut parameter_types = Vec::new(); + for parameter in params { + parameter_types.push(types.local(parameter)?); + } + let name = format!("{}.{}", string(get(core, "coordinate")?)?, name); + if name.starts_with("core.") + || definitions + .insert( + name, + Definition { + source: true, + params, + body, + parameter_types, + result: types.resolve(string(get(definition, "returnType")?)?, 0)?, + }, + ) + .is_some() + { + return Err(()); + } + } + Ok(definitions) +} + +struct Checker<'a, 'b> { + types: &'b mut Types<'a>, + definitions: &'b BTreeMap>, + summaries: &'b BTreeMap, +} +impl Checker<'_, '_> { + fn function(&mut self, definition: &Definition<'_>) -> Check { + let declarations = sequence(get(definition.body, "locals")?)?; + let mut frame = Frame::new(definition.params.iter().chain(declarations), self.types)?; + let mut height = definition.result.measure()?.height; + for (local, schema) in definition.params.iter().zip(&definition.parameter_types) { + height = height.max(schema.measure()?.height); + frame.define(local, self.types.copy_type(schema)?)?; + } + let mut charge = Charge::default(); + for binding in sequence(get(definition.body, "bindings")?)? { + exact(binding, &["kind", "binding", "value"])?; + if string(get(binding, "kind")?)? != "let" { + return Err(()); + } + let local = get(binding, "binding")?; + let value = self.expression(get(binding, "value")?, &frame, 0)?; + let declared = self.types.local(local)?; + if !declared.encloses(&value.schema) { + return Err(()); + } + let size = declared.measure()?; + charge.append(value.charge)?; + charge.append(Charge { + ticks: size.checks, + storage: 0, + })?; + height = height.max(value.height).max(size.height); + frame.define(local, declared)?; + } + frame.complete()?; + let value = self.expression(get(definition.body, "result")?, &frame, 0)?; + if !definition.result.encloses(&value.schema) { + return Err(()); + } + charge.append(value.charge)?; + charge.append(Charge { + ticks: definition.result.measure()?.checks, + storage: 0, + })?; + Ok(Summary { + charge, + height: height.max(value.height), + }) + } + fn expression(&mut self, value: &Value, frame: &Frame<'_>, depth: usize) -> Check { + self.types.step(depth)?; + let mut charge = Charge { + ticks: 1, + storage: 0, + }; + let mut height = 0; + let schema = match string(get(value, "kind")?)? { + "const" => { + exact(value, &["kind", "value"])?; + let literal = get(value, "value")?; + exact(literal, &["kind", "value", "width"])?; + let width = string(get(literal, "width")?)?; + if string(get(literal, "kind")?)? != "int" || !["U32", "U64"].contains(&width) { + return Err(()); + } + let Schema::Word(max) = self.types.resolve(width, 0)? else { + return Err(()); + }; + if unsigned(get(literal, "value")?)? > max { + return Err(()); + } + charge.append(Charge { + ticks: 1, + storage: 64, + })?; + Schema::Word(max) + } + "local" => { + exact(value, &["kind", "ref"])?; + let local = get(value, "ref")?; + let (declared, schema) = frame.values.get(string(get(local, "id")?)?).ok_or(())?; + if *declared != local { + return Err(()); + } + charge.append(schema.measure()?.copy)?; + self.types.copy_type(schema)? + } + "field" => { + exact(value, &["kind", "base", "field"])?; + let base = self.expression(get(value, "base")?, frame, depth + 1)?; + charge.append(base.charge)?; + height = base.height + 1; + let Schema::Fields(mut fields) = base.schema else { + return Err(()); + }; + fields.remove(string(get(value, "field")?)?).ok_or(())? + } + "record" => { + exact(value, &["kind", "fields"])?; + charge.storage = 64; + let mut fields = BTreeMap::new(); + for (name, child) in members(get(value, "fields")?)? { + let name = string(name)?; + let child = self.expression(child, frame, depth + 1)?; + height = height.max(child.height + 1); + charge.append(child.charge)?; + charge.append(Charge { + ticks: 0, + storage: 64 + name.len() as u128, + })?; + if fields.insert(name.to_owned(), child.schema).is_some() { + return Err(()); + } + } + Schema::Fields(fields) + } + "if" => { + exact(value, &["kind", "predicate", "then", "else"])?; + let (predicate, predicate_height) = + self.predicate(get(value, "predicate")?, frame, depth + 1)?; + let yes = self.expression(get(value, "then")?, frame, depth + 1)?; + let no = self.expression(get(value, "else")?, frame, depth + 1)?; + height = predicate_height.max(yes.height).max(no.height) + 1; + charge.append(predicate)?; + charge.append(Charge::choice(yes.charge, no.charge))?; + yes.schema.choice(no.schema)? + } + "call" => { + exact(value, &["kind", "callee", "args", "typeArgs"])?; + let name = string(get(value, "callee")?)?; + let arguments = sequence(get(value, "args")?)?; + let types = sequence(get(value, "typeArgs")?)?; + let mut argument_schemas = Vec::new(); + for argument in arguments { + let argument = self.expression(argument, frame, depth + 1)?; + charge.append(argument.charge)?; + height = height.max(argument.height + 1); + argument_schemas.push(argument.schema); + } + if let Some(definition) = self.definitions.get(name) { + if !types.is_empty() || arguments.len() != definition.parameter_types.len() { + return Err(()); + } + for (expected, actual) in + definition.parameter_types.iter().zip(&argument_schemas) + { + if !expected.encloses(actual) { + return Err(()); + } + let size = expected.measure()?; + charge.append(Charge { + ticks: size.checks, + storage: 0, + })?; + height = height.max(size.height + 1); + } + let summary = self.summaries.get(name).ok_or(())?; + charge.append(summary.charge)?; + height = height.max(summary.height + 1); + self.types.copy_type(&definition.result)? + } else { + let mut declared = Vec::new(); + for coordinate in types { + declared.push(self.types.resolve(string(coordinate)?, depth + 1)?); + } + height = height.max(1); + let (schema, intrinsic) = + intrinsic(name, arguments, &argument_schemas, &declared)?; + charge.append(intrinsic)?; + schema + } + } + _ => return Err(()), + }; + if depth.checked_add(height).ok_or(())? > 64 { + return Err(()); + } + Ok(Expression { + schema, + charge, + height, + }) + } + fn predicate( + &mut self, + predicate: &Value, + frame: &Frame<'_>, + depth: usize, + ) -> Check<(Charge, usize)> { + self.types.step(depth)?; + exact(predicate, &["kind", "op", "left", "right"])?; + if string(get(predicate, "kind")?)? != "compare" { + return Err(()); + } + let left = self.expression(get(predicate, "left")?, frame, depth + 1)?; + let right = self.expression(get(predicate, "right")?, frame, depth + 1)?; + let mut charge = left.charge; + charge.append(right.charge)?; + let compare = match (string(get(predicate, "op")?)?, &left.schema, &right.schema) { + ("==", Schema::Blob { high: a, .. }, Schema::Blob { high: b, .. }) => { + u128::from((*a).max(*b)) + } + ("==" | "<=", Schema::Word(a), Schema::Word(b)) if a == b => 0, + _ => return Err(()), + }; + charge.append(Charge { + ticks: compare + 1, + storage: 0, + })?; + let height = left.height.max(right.height) + 1; + if depth.checked_add(height).ok_or(())? > 64 { + return Err(()); + } + Ok((charge, height)) + } + fn intent(&mut self, intent: &Value, read: bool) -> Check<()> { + let body = get(intent, "body")?; + exact(body, &["locals", "nodes", "result"])?; + let mut frame = Frame::new(sequence(get(body, "locals")?)?, self.types)?; + let input = *frame.declared.get("arg.0").ok_or(())?; + if get(input, "type")? != get(intent, "input")? { + return Err(()); + } + let input_type = self.types.local(input)?; + let size = input_type.measure()?; + let mut charge = size.copy; + charge.append(Charge { + ticks: size.checks, + storage: 0, + })?; + frame.define(input, input_type)?; + if let Some(basis) = super::map_field(intent, "basis") { + let checked = self.expression(basis, &frame, 0)?; + if read { + charge.append(checked.charge)?; + } + } else if read { + return Err(()); + } + for constraint in sequence(get(intent, "inputConstraints")?)? { + charge.append(self.predicate(get(constraint, "predicate")?, &frame, 0)?.0)?; + } + for node in sequence(get(body, "nodes")?)? { + if read { + charge.append(Charge { + ticks: 1, + storage: 0, + })?; + } + match string(get(node, "kind")?)? { + "let" => { + let value = self.expression(get(node, "value")?, &frame, 0)?; + let local = get(node, "binding")?; + let expected = self.types.local(local)?; + if !expected.encloses(&value.schema) { + return Err(()); + } + charge.append(value.charge)?; + charge.append(Charge { + ticks: expected.measure()?.checks, + storage: 0, + })?; + frame.define(local, expected)?; + } + "require" if read => { + charge.append(self.predicate(get(node, "predicate")?, &frame, 0)?.0)?; + } + "effect" if read => { + charge.append(self.expression(get(node, "input")?, &frame, 0)?.charge)?; + let local = get(node, "binding")?; + let expected = self.types.local(local)?; + let Schema::Blob { high, .. } = expected else { + return Err(()); + }; + charge.append(Charge { + ticks: u128::from(high) + 1, + storage: u128::from(high) + 64, + })?; + frame.define(local, expected)?; + } + _ => return Err(()), + } + } + if !read { + frame.complete()?; + } + let output = self.expression(get(body, "result")?, &frame, 0)?; + let expected = self.types.resolve(string(get(intent, "output")?)?, 0)?; + if !expected.encloses(&output.schema) { + return Err(()); + } + let size = expected.measure()?; + charge.append(output.charge)?; + charge.append(size.copy)?; + charge.append(Charge { + ticks: size.checks, + storage: 0, + })?; + let ceiling = get(intent, "coreEvaluationBudget")?; + if charge.ticks > u128::from(unsigned(get(ceiling, "maxSteps")?)?) + || charge.storage > u128::from(unsigned(get(ceiling, "maxAllocatedBytes")?)?) + || size.encoded > u128::from(unsigned(get(ceiling, "maxOutputBytes")?)?) + { + return Err(()); + } + Ok(()) + } +} +fn intrinsic( + name: &str, + arguments: &[Value], + actual: &[Schema], + declared: &[Schema], +) -> Check<(Schema, Charge)> { + let literal = |value: &Value| -> Check { + if string(get(value, "kind")?)? != "const" { + return Err(()); + } + unsigned(get(get(value, "value")?, "value")?) + }; + match (name, actual, declared) { + ("core.bytes.length", [actual], [expected @ Schema::Blob { .. }]) + if expected.encloses(actual) => + { + Ok(( + Schema::Word(u64::MAX), + Charge { + ticks: 2, + storage: 64, + }, + )) + } + ( + "core.bytes.concat", + [left, right], + [a @ Schema::Blob { + low: a_low, + high: a_high, + }, b @ Schema::Blob { + low: b_low, + high: b_high, + }], + ) if a.encloses(left) && b.encloses(right) => { + let low = a_low.checked_add(*b_low).ok_or(())?; + let high = a_high.checked_add(*b_high).ok_or(())?; + Ok(( + Schema::Blob { low, high }, + Charge { + ticks: u128::from(high) + 3, + storage: u128::from(high) + 64, + }, + )) + } + ("core.integer.subtract", [left, right], [expected @ Schema::Word(_)]) + if expected.encloses(left) && expected.encloses(right) => + { + literal(&arguments[0])? + .checked_sub(literal(&arguments[1])?) + .ok_or(())?; + Ok(( + expected.clone(), + Charge { + ticks: 3, + storage: 64, + }, + )) + } + ( + "core.bytes.slice", + [actual, Schema::Word(a), Schema::Word(b)], + [expected @ Schema::Blob { low, .. }], + ) if *a == u64::MAX && *b == u64::MAX && expected.encloses(actual) => { + let start = literal(&arguments[1])?; + let end = literal(&arguments[2])?; + if start > end || end > *low { + return Err(()); + } + let high = end - start; + Ok(( + Schema::Blob { low: 0, high }, + Charge { + ticks: u128::from(high) + 4, + storage: u128::from(high) + 64, + }, + )) + } + _ => Err(()), + } +} +fn get<'a>(value: &'a Value, name: &str) -> Check<&'a Value> { + super::map_field(value, name).ok_or(()) +} +fn members(value: &Value) -> Check<&[(Value, Value)]> { + if let Value::Map(values) = value { + Ok(values) + } else { + Err(()) + } +} +fn sequence(value: &Value) -> Check<&[Value]> { + if let Value::Array(values) = value { + Ok(values) + } else { + Err(()) + } +} +fn string(value: &Value) -> Check<&str> { + if let Value::Text(value) = value { + if !value.is_empty() && value.len() <= 1024 { + return Ok(value); + } + } + Err(()) +} +fn unsigned(value: &Value) -> Check { + if let Value::Integer(value) = value { + u64::try_from(*value).map_err(|_| ()) + } else { + Err(()) + } +} +fn exact(value: &Value, fields: &[&str]) -> Check<()> { + let values = members(value)?; + if values.len() != fields.len() { + return Err(()); + } + for (name, _) in values { + if !fields.contains(&string(name)?) { + return Err(()); + } + } + Ok(()) +} diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs new file mode 100644 index 000000000..a770d0c1f --- /dev/null +++ b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs @@ -0,0 +1,216 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +//! Verifier-owned bounded representations and independently accumulated charges. +use super::{exact, get, members, string, unsigned, Check}; +use echo_edict_canonical::CanonicalValueV1 as Value; +use std::collections::BTreeMap; + +#[derive(Clone, PartialEq, Eq)] +pub(super) enum Schema { + Word(u64), + Blob { low: u64, high: u64 }, + Fields(BTreeMap), +} +#[derive(Clone, Copy, Default)] +pub(super) struct Charge { + pub ticks: u128, + pub storage: u128, +} +impl Charge { + pub(super) fn append(&mut self, other: Self) -> Check<()> { + self.ticks = self.ticks.checked_add(other.ticks).ok_or(())?; + self.storage = self.storage.checked_add(other.storage).ok_or(())?; + if self.ticks > u128::from(u64::MAX) || self.storage > u128::from(u64::MAX) { + return Err(()); + } + Ok(()) + } + pub(super) fn choice(a: Self, b: Self) -> Self { + Self { + ticks: a.ticks.max(b.ticks), + storage: a.storage.max(b.storage), + } + } +} +#[derive(Clone, Copy)] +pub(super) struct Size { + pub copy: Charge, + pub checks: u128, + pub encoded: u128, + pub height: usize, +} +impl Schema { + pub(super) fn encloses(&self, other: &Self) -> bool { + match (self, other) { + (Self::Blob { low, high }, Self::Blob { low: a, high: b }) => low <= a && b <= high, + (Self::Fields(a), Self::Fields(b)) => { + a.len() == b.len() + && a.iter() + .all(|(name, ty)| b.get(name).is_some_and(|value| ty.encloses(value))) + } + _ => self == other, + } + } + pub(super) fn choice(self, other: Self) -> Check { + match (self, other) { + (Self::Blob { low: a, high: b }, Self::Blob { low: c, high: d }) => Ok(Self::Blob { + low: a.min(c), + high: b.max(d), + }), + (a, b) if a == b => Ok(a), + _ => Err(()), + } + } + pub(super) fn measure(&self) -> Check { + let mut size = Size { + copy: Charge { + ticks: 1, + storage: 64, + }, + checks: 1, + encoded: 9, + height: 0, + }; + match self { + Self::Word(_) => {} + Self::Blob { high, .. } => { + size.copy.storage += u128::from(*high); + size.encoded += u128::from(*high); + } + Self::Fields(fields) => { + for (name, ty) in fields { + let child = ty.measure()?; + size.copy.append(child.copy)?; + size.copy.append(Charge { + ticks: 1, + storage: 64 + name.len() as u128, + })?; + size.checks = size.checks.checked_add(child.checks).ok_or(())?; + size.encoded = size + .encoded + .checked_add(9 + name.len() as u128) + .and_then(|value| value.checked_add(child.encoded)) + .ok_or(())?; + size.height = size.height.max(child.height + 1); + } + } + } + if size.copy.storage > u128::from(u64::MAX) || size.encoded > u128::from(u64::MAX) { + return Err(()); + } + Ok(size) + } +} + +pub(super) struct Types<'a> { + pub module: &'a Value, + remaining: usize, +} +impl<'a> Types<'a> { + pub(super) fn new(module: &'a Value) -> Self { + Self { + module, + remaining: 65_536, + } + } + pub(super) fn step(&mut self, depth: usize) -> Check<()> { + if depth > 64 { + return Err(()); + } + self.remaining = self.remaining.checked_sub(1).ok_or(())?; + Ok(()) + } + pub(super) fn copy_type(&mut self, schema: &Schema) -> Check { + let count = usize::try_from(schema.measure()?.copy.ticks).map_err(|_| ())?; + self.remaining = self.remaining.checked_sub(count).ok_or(())?; + Ok(schema.clone()) + } + pub(super) fn resolve(&mut self, name: &str, depth: usize) -> Check { + self.step(depth)?; + if let Some(width) = match name { + "U8" => Some(u8::MAX.into()), + "U16" => Some(u16::MAX.into()), + "U32" => Some(u32::MAX.into()), + "U64" => Some(u64::MAX), + _ => None, + } { + return Ok(Schema::Word(width)); + } + if let Some(spec) = name + .strip_prefix("Bytes<") + .and_then(|s| s.strip_suffix('>')) + { + let decimal = |s: &str| -> Check { + let value = s.parse::().map_err(|_| ())?; + if value.to_string() != s { + return Err(()); + } + Ok(value) + }; + if let Some(s) = spec.strip_prefix("max=") { + return Ok(Schema::Blob { + low: 0, + high: decimal(s)?, + }); + } + if let Some(s) = spec.strip_prefix("exact=") { + let value = decimal(s)?; + return Ok(Schema::Blob { + low: value, + high: value, + }); + } + if let Some((a, b)) = spec + .strip_prefix("min=") + .and_then(|s| s.split_once(",max=")) + { + let (low, high) = (decimal(a)?, decimal(b)?); + if low < high { + return Ok(Schema::Blob { low, high }); + } + } + return Err(()); + } + let prefix = format!("{}.", string(get(self.module, "coordinate")?)?); + let definition = get( + get(self.module, "types")?, + name.strip_prefix(&prefix).unwrap_or(name), + )?; + match string(get(definition, "kind")?)? { + "Nominal" => self.resolve(string(get(definition, "representation")?)?, depth + 1), + "Bytes" => { + let high = unsigned(get(definition, "max")?)?; + let low = super::super::map_field(definition, "min") + .map(unsigned) + .transpose()? + .unwrap_or(0); + if low > high { + return Err(()); + } + Ok(Schema::Blob { low, high }) + } + "Record" => { + let mut fields = BTreeMap::new(); + for (name, coordinate) in members(get(definition, "fields")?)? { + if fields + .insert( + string(name)?.to_owned(), + self.resolve(string(coordinate)?, depth + 1)?, + ) + .is_some() + { + return Err(()); + } + } + Ok(Schema::Fields(fields)) + } + _ => Err(()), + } + } + pub(super) fn local(&mut self, value: &Value) -> Check { + exact(value, &["id", "type", "alphaName"])?; + string(get(value, "id")?)?; + string(get(value, "alphaName")?)?; + self.resolve(string(get(value, "type")?)?, 0) + } +} diff --git a/crates/echo-edict-provider-verifier/tests/bounded_read.rs b/crates/echo-edict-provider-verifier/tests/bounded_read.rs index 6678e188b..b2de9416e 100644 --- a/crates/echo-edict-provider-verifier/tests/bounded_read.rs +++ b/crates/echo-edict-provider-verifier/tests/bounded_read.rs @@ -15,6 +15,9 @@ use echo_edict_provider_lowerer::{ use echo_edict_provider_verifier as verifier; +#[path = "bounded_read/source_functions.rs"] +mod source_functions; + const PACKAGE: &str = "echo.operation-package/v1"; fn bound(coordinate: &str, domain: &str, bytes: Vec) -> BoundArtifact { diff --git a/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs b/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs new file mode 100644 index 000000000..1064f2978 --- /dev/null +++ b/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs @@ -0,0 +1,366 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +//! Native, synthetically rebound read-provider coverage; not public compilation. +use super::*; + +fn text(value: &str) -> Value { + Value::Text(value.to_owned()) +} +fn map(fields: impl IntoIterator) -> Value { + Value::Map( + fields + .into_iter() + .map(|(name, value)| (text(name), value)) + .collect(), + ) +} +fn local(id: &str, ty: &str) -> Value { + map([ + ("id", text(id)), + ("alphaName", text(id)), + ("type", text(ty)), + ]) +} +fn reference(local: &Value) -> Value { + map([("kind", text("local")), ("ref", local.clone())]) +} +fn field_mut<'a>(value: &'a mut Value, name: &str) -> &'a mut Value { + let Value::Map(entries) = value else { + panic!("map") + }; + &mut entries + .iter_mut() + .find(|(key, _)| key == &text(name)) + .expect("field") + .1 +} +fn insert(value: &mut Value, name: &str, replacement: Value) { + let Value::Map(entries) = value else { + panic!("map") + }; + assert!(!entries.iter().any(|(key, _)| key == &text(name))); + entries.push((text(name), replacement)); +} +fn intent(value: &mut Value) -> &mut Value { + field_mut(field_mut(value, "intents"), "replaceRange") +} +fn read_helper() -> LoweringRequestV1 { + read_helper_with_budget(4_194_304) +} +fn read_helper_with_budget(max_steps: u64) -> LoweringRequestV1 { + let mut source = fixture(); + let mut core = decode(&source.core.artifact.bytes).expect("core"); + let mut target = decode(&source.semantic_inputs[5].artifact.artifact.bytes).expect("target"); + let mut projection = + decode(&source.semantic_inputs[6].artifact.artifact.bytes).expect("projection"); + let Value::Text(coordinate) = field(&core, "coordinate") else { + panic!("coordinate") + }; + let coordinate = coordinate.clone(); + let Value::Text(output_type) = field(intent(&mut core), "output") else { + panic!("output type") + }; + let output_type = output_type.clone(); + let parameter = local("arg.0", &output_type); + let helper_local = local("local.0", &output_type); + insert( + &mut core, + "functions", + map([( + "retain", + map([ + ("params", Value::Array(vec![parameter.clone()])), + ("returnType", text(&output_type)), + ( + "body", + map([ + ("locals", Value::Array(vec![helper_local.clone()])), + ( + "bindings", + Value::Array(vec![map([ + ("kind", text("let")), + ("binding", helper_local.clone()), + ("value", reference(¶meter)), + ])]), + ), + ("result", reference(&helper_local)), + ]), + ), + ]), + )]), + ); + let saved = local("source.return", &output_type); + let body = field_mut(intent(&mut core), "body"); + let call = map([ + ("kind", text("call")), + ("callee", text(&format!("{coordinate}.retain"))), + ("args", Value::Array(vec![field(body, "result").clone()])), + ("typeArgs", Value::Array(vec![])), + ]); + let Value::Array(locals) = field_mut(body, "locals") else { + panic!("locals") + }; + locals.push(saved.clone()); + let Value::Array(nodes) = field_mut(body, "nodes") else { + panic!("nodes") + }; + nodes.push(map([ + ("kind", text("let")), + ("binding", saved.clone()), + ("value", call.clone()), + ])); + *field_mut(body, "result") = reference(&saved); + let target_intent = intent(&mut target); + let binding = map([ + ("id", text("replaceRange.binding.0")), + ("binding", saved.clone()), + ("value", call), + ]); + let Value::Map(entries) = target_intent else { + panic!("intent") + }; + match entries + .iter_mut() + .find(|(key, _)| key == &text("pureBindings")) + { + Some((_, Value::Array(bindings))) => bindings.push(binding), + None => entries.push((text("pureBindings"), Value::Array(vec![binding]))), + _ => panic!("pure bindings"), + } + let Value::Array(order) = field_mut(target_intent, "executionOrder") else { + panic!("order") + }; + order.push(text("replaceRange.binding.0")); + *field_mut(target_intent, "result") = reference(&saved); + *field_mut(&mut projection, "expression") = map([ + ("kind", text("source")), + ( + "source", + map([ + ("kind", text("pureBinding")), + ("bindingId", text("replaceRange.binding.0")), + ]), + ), + ("path", Value::Array(vec![])), + ]); + // This synthetic fixture explicitly increases its declared step ceiling. + // At FactBytes.max=1 MiB, read work plus the required byte equality already + // exceeds the legacy 1 MiB step ceiling. Allocation stays at its old 16 MiB. + for artifact in [&mut core, &mut target] { + *field_mut( + field_mut(intent(artifact), "coreEvaluationBudget"), + "maxSteps", + ) = Value::Integer(i128::from(max_steps)); + } + fork_adapter_budget(&mut source, &mut core, &mut target, max_steps); + source.core = bound( + &coordinate, + "edict.core.module/v1", + encode(&core).expect("core bytes"), + ); + *field_mut(field_mut(&mut target, "semanticClosure"), "sourceCore") = map([ + ("id", text(&coordinate)), + ( + "digest", + Value::Array(vec![ + text("sha256"), + Value::Bytes(source.core.reference.digest.bytes.clone()), + ]), + ), + ]); + for (index, value) in [(5, target), (6, projection)] { + let artifact = &mut source.semantic_inputs[index].artifact; + *artifact = bound( + &artifact.reference.coordinate, + &artifact.artifact.domain, + encode(&value).expect("changed artifact"), + ); + } + source +} + +#[test] +fn bounded_read_source_function_is_admitted_after_a_real_read_producer() { + let source = read_helper(); + let lowered = lower(source.clone()).expect("read plus pure source helper lowers"); + assert_eq!( + lowered, + lower(source.clone()).expect("repeat native lowering") + ); + let verification = request(source); + let response = + verifier::verify(verification.clone()).expect("independent read helper verification"); + let report = decode(&response.outputs[0].artifact.bytes).expect("report"); + assert_eq!(field(&report, "outcome"), &text("accepted")); + assert_eq!( + response, + verifier::verify(verification).expect("repeat independent judgment") + ); +} + +#[test] +fn bounded_read_source_call_target_substitution_rejects_after_coherent_rebinding() { + let mut verification = request(read_helper()); + changed_target(&mut verification, |intent| { + let Value::Array(bindings) = field_mut(intent, "pureBindings") else { + panic!("bindings") + }; + // Wrong arity is rehashed into the package and Target, while authenticated + // Core still calls retain(actual). The lowerer never endorses this change. + *field_mut(field_mut(&mut bindings[0], "value"), "args") = Value::Array(vec![]); + }); + if let Ok(response) = verifier::verify(verification) { + let report = decode(&response.outputs[0].artifact.bytes).expect("report"); + assert_ne!(field(&report, "outcome"), &text("accepted")); + } +} + +// A budget is adapter-owned authority, not a free Core number. This synthetic +// fixture forks the complete adapter/lawpack/source/import closure explicitly. +fn fork_adapter_budget( + source: &mut LoweringRequestV1, + core: &mut Value, + target: &mut Value, + max_steps: u64, +) { + let mut adapter = decode(&source.semantic_inputs[0].artifact.artifact.bytes).expect("adapter"); + let Value::Map(profiles) = field(&adapter, "operationProfiles") else { + panic!("profiles") + }; + let Value::Text(obligation) = field(&profiles[0].1, "budgetObligation") else { + panic!("budget obligation") + }; + let obligation = obligation.clone(); + *field_mut( + field_mut(field_mut(&mut adapter, "budgets"), &obligation), + "maxSteps", + ) = Value::Integer(i128::from(max_steps)); + let adapter_id = source.semantic_inputs[0] + .artifact + .reference + .coordinate + .clone(); + let owner_identity = digest(&adapter_id, &adapter) + .expect("adapter owner identity") + .to_vec(); + source.semantic_inputs[0].artifact = bound( + &adapter_id, + "edict.lawpack-adapter/v1", + encode(&adapter).expect("adapter bytes"), + ); + let mut lawpack = decode(&source.semantic_inputs[2].artifact.artifact.bytes).expect("lawpack"); + let Value::Array(adapters) = field_mut(&mut lawpack, "targetAdapters") else { + panic!("adapters") + }; + *field_mut(field_mut(&mut adapters[0], "adapter"), "digest") = + Value::Array(vec![text("sha256"), Value::Bytes(owner_identity)]); + let old_digest = source.semantic_inputs[2] + .artifact + .reference + .digest + .bytes + .clone(); + source.semantic_inputs[2].artifact = bound( + "jedit.text@1", + "edict.lawpack/v1", + encode(&lawpack).expect("lawpack bytes"), + ); + let new_digest = source.semantic_inputs[2] + .artifact + .reference + .digest + .bytes + .clone(); + let lawpack_ref = map([ + ("id", text("jedit.text@1")), + ( + "digest", + Value::Array(vec![text("sha256"), Value::Bytes(new_digest.clone())]), + ), + ]); + let Value::Array(imports) = field_mut(core, "imports") else { + panic!("imports") + }; + *field_mut(&mut imports[0], "ref") = lawpack_ref.clone(); + *field_mut(field_mut(target, "semanticClosure"), "lawpacks") = Value::Array(vec![lawpack_ref]); + let Value::Bytes(authored) = + decode(&source.semantic_inputs[3].artifact.artifact.bytes).expect("source") + else { + panic!("source bytes") + }; + let authored = String::from_utf8(authored).expect("UTF-8 source"); + let old = format!("sha256:{}", hex::encode(old_digest)); + assert_eq!( + authored.matches(&old).count(), + 1, + "one imported lawpack pin" + ); + let authored = authored.replace(&old, &format!("sha256:{}", hex::encode(new_digest))); + source.semantic_inputs[3].artifact = bound( + "jedit.text.replace_range@1", + "edict.source/v1", + encode(&Value::Bytes(authored.into_bytes())).expect("source bytes"), + ); +} + +#[test] +fn bounded_read_source_helper_refuses_the_original_insufficient_step_ceiling() { + let rejected = read_helper_with_budget(1_048_576); + let refusal = + lower(rejected.clone()).expect_err("whole-operation cost exceeds the original authority"); + assert_eq!( + refusal.kind, + echo_edict_provider_lowerer::ProviderRefusalKind::UnsupportedSemantics + ); + // Build only the valid positive through the lowerer, then independently + // replace every affected budget/authority carrier from the rejected request. + let mut verification = request(read_helper()); + verification.core = transport(rejected.core.clone()); + verification.target_ir = transport(rejected.semantic_inputs[5].artifact.clone()); + for input in &mut verification.semantic_inputs { + if let Some(replacement) = rejected + .semantic_inputs + .iter() + .find(|candidate| candidate.role == input.role) + { + input.artifact = transport(replacement.artifact.clone()); + } + } + change_package(&mut verification, |package| { + *field_mut(field_mut(package, "budget_ceiling"), "max_steps") = Value::Integer(1_048_576); + let closure = field_mut(package, "semantic_closure"); + for (key, artifact) in [ + ("canonical_meaning_identity", &rejected.core), + ("core_identity", &rejected.core), + ("target_ir_identity", &rejected.semantic_inputs[5].artifact), + ("lawpack_identity", &rejected.semantic_inputs[2].artifact), + ( + "edict_source_identity", + &rejected.semantic_inputs[3].artifact, + ), + ] { + *field_mut(closure, key) = Value::Bytes(artifact.reference.digest.bytes.clone()); + } + let Value::Bytes(raw) = field(package, "program") else { + panic!("program bytes") + }; + let mut program = decode(raw).expect("program"); + for (key, artifact) in [ + ("core_artifact", &rejected.core), + ("target_ir_artifact", &rejected.semantic_inputs[5].artifact), + ( + "lawpack_adapter_artifact", + &rejected.semantic_inputs[0].artifact, + ), + ("lawpack_artifact", &rejected.semantic_inputs[2].artifact), + ("source_artifact", &rejected.semantic_inputs[3].artifact), + ] { + *field_mut(&mut program, key) = Value::Bytes(artifact.artifact.bytes.clone()); + } + *field_mut(package, "program") = Value::Bytes(encode(&program).expect("program bytes")); + }); + if let Ok(response) = verifier::verify(verification) { + let report = decode(&response.outputs[0].artifact.bytes).expect("report"); + assert_ne!(field(&report, "outcome"), &text("accepted")); + } +} diff --git a/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs b/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs index 758c3c0db..71155e80d 100644 --- a/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs +++ b/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs @@ -3,50 +3,735 @@ //! Deliberately rebound native-provider tests, not compiler acceptance evidence. use super::*; -fn fixture_with_functions(functions: CanonicalValueV1) -> (FixtureNames<'static>, RawFixture, Vec) { +fn fixture_with_functions( + functions: CanonicalValueV1, +) -> (FixtureNames<'static>, RawFixture, Vec) { + edited_fixture(|core, _| add_field(core, "functions", functions)) +} + +fn edited_fixture( + edit: impl FnOnce(&mut CanonicalValueV1, &mut CanonicalValueV1), +) -> (FixtureNames<'static>, RawFixture, Vec) { let (names, mut fixture, package) = pure_relation::compiler_fixture(); let mut core = decode_canonical_cbor_v1(&fixture.core).expect("Core"); - let CanonicalValueV1::Map(fields) = &mut core else { panic!("Core map") }; - fields.push((text("functions"), functions)); + let mut target = decode_canonical_cbor_v1(&fixture.target_ir).expect("Target"); + edit(&mut core, &mut target); fixture.core = canonical_bytes(&core); let core_reference = raw_ref(names.application, "edict.core.module/v1", &fixture.core); - let mut target = decode_canonical_cbor_v1(&fixture.target_ir).expect("Target"); *map_field_mut(map_field_mut(&mut target, "semanticClosure"), "sourceCore") = map([ ("id", text(names.application)), - ("digest", CanonicalValueV1::Array(vec![text("sha256"), CanonicalValueV1::Bytes(core_reference.digest.clone())])), + ( + "digest", + CanonicalValueV1::Array(vec![ + text("sha256"), + CanonicalValueV1::Bytes(core_reference.digest.clone()), + ]), + ), ]); fixture.target_ir = canonical_bytes(&target); // Construct the independent verifier request without asking the lowerer to // endorse this changed Core. Rebind the retained package's exact carriers. let mut package = decode_canonical_cbor_v1(&package).expect("package"); - let CanonicalValueV1::Bytes(bytes) = map_field(&package, "program") else { panic!("program") }; + let CanonicalValueV1::Bytes(bytes) = map_field(&package, "program") else { + panic!("program") + }; let mut program = decode_canonical_cbor_v1(bytes).expect("program"); - for (name, bytes) in [("core_artifact", &fixture.core), ("target_ir_artifact", &fixture.target_ir)] { + for (name, bytes) in [ + ("core_artifact", &fixture.core), + ("target_ir_artifact", &fixture.target_ir), + ] { *map_field_mut(&mut program, name) = CanonicalValueV1::Bytes(bytes.clone()); } *map_field_mut(&mut package, "program") = CanonicalValueV1::Bytes(canonical_bytes(&program)); + let budget = map_field( + map_field(map_field(&core, "intents"), names.intent), + "coreEvaluationBudget", + ); + for (package_key, core_key) in [ + ("max_steps", "maxSteps"), + ("max_allocated_bytes", "maxAllocatedBytes"), + ("max_output_bytes", "maxOutputBytes"), + ] { + *map_field_mut(map_field_mut(&mut package, "budget_ceiling"), package_key) = + map_field(budget, core_key).clone(); + } let closure = map_field_mut(&mut package, "semantic_closure"); + *map_field_mut(closure, "canonical_meaning_identity") = + CanonicalValueV1::Bytes(core_reference.digest.clone()); *map_field_mut(closure, "core_identity") = CanonicalValueV1::Bytes(core_reference.digest); - *map_field_mut(closure, "target_ir_identity") = CanonicalValueV1::Bytes(raw_ref("echo.span-ir/v1", "edict.target-ir.artifact/v1", &fixture.target_ir).digest); + *map_field_mut(closure, "target_ir_identity") = CanonicalValueV1::Bytes( + raw_ref( + "echo.span-ir/v1", + "edict.target-ir.artifact/v1", + &fixture.target_ir, + ) + .digest, + ); (names, fixture, canonical_bytes(&package)) } #[test] fn lowerer_rejects_unused_malformed_source_function_authority() { let (names, fixture, _) = fixture_with_functions(map([("unused", CanonicalValueV1::Null)])); - assert!(lowerer::lower(lowering_request(names, &fixture)).is_err(), - "lowerer ignored authenticated malformed source function"); + assert!( + lowerer::lower(lowering_request(names, &fixture)).is_err(), + "lowerer ignored authenticated malformed source function" + ); } #[test] fn verifier_independently_rejects_unused_malformed_source_function_authority() { - let (names, fixture, package) = fixture_with_functions(map([("unused", CanonicalValueV1::Null)])); + let (names, fixture, package) = + fixture_with_functions(map([("unused", CanonicalValueV1::Null)])); match verifier::verify(verification_request(names, &fixture, package)) { Err(_) => {} Ok(success) => { - let report = decode_canonical_cbor_v1(&success.outputs[0].artifact.bytes).expect("report"); - assert_ne!(text_field(&report, "outcome"), Some("accepted"), - "verifier ignored authenticated malformed source function"); + let report = + decode_canonical_cbor_v1(&success.outputs[0].artifact.bytes).expect("report"); + assert_ne!( + text_field(&report, "outcome"), + Some("accepted"), + "verifier ignored authenticated malformed source function" + ); + } + } +} + +#[test] +fn valid_unused_source_function_has_coherent_package_carriers() { + let function = map([ + ("params", CanonicalValueV1::Array(vec![])), + ("returnType", text("U32")), + ( + "body", + map([ + ("locals", CanonicalValueV1::Array(vec![])), + ("bindings", CanonicalValueV1::Array(vec![])), + ( + "result", + map([ + ("kind", text("const")), + ( + "value", + map([ + ("kind", text("int")), + ("width", text("U32")), + ("value", integer(1)), + ]), + ), + ]), + ), + ]), + ), + ]); + let (names, fixture, package) = fixture_with_functions(map([("unused", function)])); + let lower = + lowerer::lower(lowering_request(names, &fixture)).expect("valid unused definition lowers"); + assert_eq!( + lower.outputs[0].artifact.bytes, package, + "independently rebound carriers match real lowering" + ); + let success = verifier::verify(verification_request(names, &fixture, package)) + .expect("valid source authority"); + let report = decode_canonical_cbor_v1(&success.outputs[0].artifact.bytes).expect("report"); + assert_eq!(text_field(&report, "outcome"), Some("accepted")); +} + +#[test] +fn stale_canonical_meaning_identity_is_a_carrier_disagreement_control() { + let (names, fixture, package) = + fixture_with_functions(map([("unused", CanonicalValueV1::Null)])); + let mut package = decode_canonical_cbor_v1(&package).expect("package"); + *map_field_mut( + map_field_mut(&mut package, "semantic_closure"), + "canonical_meaning_identity", + ) = CanonicalValueV1::Bytes(vec![0; 32]); + if let Ok(success) = verifier::verify(verification_request( + names, + &fixture, + canonical_bytes(&package), + )) { + let report = decode_canonical_cbor_v1(&success.outputs[0].artifact.bytes).expect("report"); + assert_ne!(text_field(&report, "outcome"), Some("accepted")); + } +} + +fn add_field(value: &mut CanonicalValueV1, name: &str, replacement: CanonicalValueV1) { + let CanonicalValueV1::Map(fields) = value else { + panic!("map") + }; + assert!(!fields.iter().any(|(key, _)| key == &text(name))); + fields.push((text(name), replacement)); +} +fn list(values: Vec) -> CanonicalValueV1 { + CanonicalValueV1::Array(values) +} +fn local(id: &str, ty: &str) -> CanonicalValueV1 { + map([ + ("id", text(id)), + ("alphaName", text(id)), + ("type", text(ty)), + ]) +} +fn reference(local: &CanonicalValueV1) -> CanonicalValueV1 { + map([("kind", text("local")), ("ref", local.clone())]) +} +fn call(name: &str, args: Vec) -> CanonicalValueV1 { + map([ + ("kind", text("call")), + ("callee", text(name)), + ("args", list(args)), + ("typeArgs", list(vec![])), + ]) +} +fn literal(width: &str, n: i128) -> CanonicalValueV1 { + map([ + ("kind", text("const")), + ( + "value", + map([ + ("kind", text("int")), + ("width", text(width)), + ("value", CanonicalValueV1::Integer(n)), + ]), + ), + ]) +} +fn function( + params: Vec, + ty: &str, + locals: Vec, + bindings: Vec, + result: CanonicalValueV1, +) -> CanonicalValueV1 { + map([ + ("params", list(params)), + ("returnType", text(ty)), + ( + "body", + map([ + ("locals", list(locals)), + ("bindings", list(bindings)), + ("result", result), + ]), + ), + ]) +} +fn intent(artifact: &mut CanonicalValueV1) -> &mut CanonicalValueV1 { + map_field_mut(map_field_mut(artifact, "intents"), "replaceRange") +} +fn called_fixture( + edit: impl FnOnce(&mut CanonicalValueV1, &mut CanonicalValueV1), +) -> (FixtureNames<'static>, RawFixture, Vec) { + edited_fixture(|core, target| { + let coordinate = text_field(core, "coordinate") + .expect("coordinate") + .to_owned(); + let a = local("arg.0", "U64"); + let b = local("arg.1", "U64"); + let value = local("local.0", "U64"); + let binding = map([ + ("kind", text("let")), + ("binding", value.clone()), + ( + "value", + call(&format!("{coordinate}.passNext"), vec![reference(&a)]), + ), + ]); + let condition = map([ + ("kind", text("if")), + ( + "predicate", + map([ + ("kind", text("compare")), + ("op", text("==")), + ("left", reference(&a)), + ("right", reference(&b)), + ]), + ), + ("then", literal("U32", 1)), + ("else", literal("U32", 0)), + ]); + add_field( + core, + "functions", + map([ + ( + "pass", + function( + vec![a.clone()], + "U64", + vec![value.clone()], + vec![binding], + reference(&value), + ), + ), + ( + "passNext", + function(vec![a.clone()], "U64", vec![], vec![], reference(&a)), + ), + ( + "empty", + function(vec![a, b], "U32", vec![], vec![], condition), + ), + ]), + ); + for (artifact, key) in [(&mut *core, "nodes"), (&mut *target, "pureBindings")] { + let body = if key == "nodes" { + map_field_mut(intent(artifact), "body") + } else { + intent(artifact) + }; + let CanonicalValueV1::Array(bindings) = map_field_mut(body, key) else { + panic!("bindings") + }; + let original = map_field(&bindings[0], "value").clone(); + *map_field_mut(&mut bindings[0], "value") = + call(&format!("{coordinate}.pass"), vec![original]); + let predicate = map_field(map_field(&bindings[1], "value"), "predicate"); + let arguments = vec![ + map_field(predicate, "left").clone(), + map_field(predicate, "right").clone(), + ]; + *map_field_mut(&mut bindings[1], "value") = + call(&format!("{coordinate}.empty"), arguments); + } + edit(core, target); + }) +} +fn verifier_accepts(names: FixtureNames<'_>, fixture: &RawFixture, package: Vec) -> bool { + verifier::verify(verification_request(names, fixture, package)).is_ok_and(|success| { + let report = decode_canonical_cbor_v1(&success.outputs[0].artifact.bytes).expect("report"); + text_field(&report, "outcome") == Some("accepted") + }) +} +fn both_refuse(names: FixtureNames<'_>, fixture: &RawFixture, package: Vec, case: &str) { + let lower = lowerer::lower(lowering_request(names, fixture)).is_ok(); + let verify = verifier_accepts(names, fixture, package); + assert!( + !lower && !verify, + "{case}: lowerer accepted={lower}, verifier accepted={verify}" + ); +} + +#[test] +fn source_functions_called_forward_bindings_conditions_and_imported_arguments_are_admitted() { + let (names, fixture, package) = called_fixture(|_, _| {}); + let lowered = + lowerer::lower(lowering_request(names, &fixture)).expect("called source functions lower"); + assert_eq!( + lowered.outputs[0].artifact.bytes, package, + "independent carrier construction" + ); + assert!(verifier_accepts(names, &fixture, package)); +} + +#[test] +fn source_functions_unused_bodies_have_fresh_complete_typed_lexical_frames() { + for case in [ + "duplicate_parameter", + "capture", + "return_type", + "unknown_callee", + "recursion", + "unsupported_bool", + "unused_local", + "forward_local", + "partial_subtract", + ] { + let (names, fixture, package) = called_fixture(|core, _| { + let coordinate = text_field(core, "coordinate") + .expect("coordinate") + .to_owned(); + let a = local("arg.0", "U64"); + let b = local("arg.1", "U64"); + let saved = local("local.0", "U64"); + let mut definition = function(vec![a.clone()], "U64", vec![], vec![], reference(&a)); + match case { + "duplicate_parameter" => { + *map_field_mut(&mut definition, "params") = list(vec![a.clone(), a]); + } + "capture" => { + *map_field_mut(map_field_mut(&mut definition, "body"), "result") = + reference(&b); + } + "return_type" => *map_field_mut(&mut definition, "returnType") = text("U32"), + "unknown_callee" | "recursion" => { + let callee = if case == "recursion" { + "unused" + } else { + "missing" + }; + *map_field_mut(map_field_mut(&mut definition, "body"), "result") = + call(&format!("{coordinate}.{callee}"), vec![reference(&a)]); + } + "unsupported_bool" => *map_field_mut(&mut definition, "returnType") = text("Bool"), + "unused_local" => { + *map_field_mut(map_field_mut(&mut definition, "body"), "locals") = + list(vec![saved]); + } + "forward_local" => { + *map_field_mut(map_field_mut(&mut definition, "body"), "locals") = + list(vec![saved.clone()]); + *map_field_mut(map_field_mut(&mut definition, "body"), "bindings") = + list(vec![map([ + ("kind", text("let")), + ("binding", saved.clone()), + ("value", reference(&saved)), + ])]); + } + "partial_subtract" => { + *map_field_mut(&mut definition, "params") = list(vec![a.clone(), b.clone()]); + let mut subtraction = + call("core.integer.subtract", vec![reference(&a), reference(&b)]); + *map_field_mut(&mut subtraction, "typeArgs") = list(vec![text("U64")]); + *map_field_mut(map_field_mut(&mut definition, "body"), "result") = subtraction; + } + _ => panic!("case"), + } + add_field(map_field_mut(core, "functions"), "unused", definition); + }); + both_refuse(names, &fixture, package, case); + } +} + +#[test] +fn source_functions_core_calls_require_the_exact_declared_signature() { + for case in ["arity", "argument_type", "generic"] { + let (names, fixture, package) = called_fixture(|core, target| { + for (artifact, key) in [(core, "nodes"), (target, "pureBindings")] { + let body = if key == "nodes" { + map_field_mut(intent(artifact), "body") + } else { + intent(artifact) + }; + let CanonicalValueV1::Array(bindings) = map_field_mut(body, key) else { + panic!("bindings") + }; + let expression = map_field_mut(&mut bindings[0], "value"); + match case { + "arity" => *map_field_mut(expression, "args") = list(vec![]), + "argument_type" => { + *map_field_mut(expression, "args") = list(vec![literal("U32", 1)]); + } + "generic" => *map_field_mut(expression, "typeArgs") = list(vec![text("U64")]), + _ => panic!("case"), + } + } + }); + both_refuse(names, &fixture, package, case); + } +} + +#[test] +fn source_functions_independent_relation_rejects_coherently_rebound_target_call_substitution() { + let (names, fixture, package) = called_fixture(|_, target| { + let CanonicalValueV1::Array(bindings) = map_field_mut(intent(target), "pureBindings") + else { + panic!("bindings") + }; + *map_field_mut(map_field_mut(&mut bindings[0], "value"), "args") = + list(vec![literal("U64", 7)]); + }); + assert!( + !verifier_accepts(names, &fixture, package), + "valid hashes cannot endorse a different call argument" + ); +} + +#[test] +fn source_functions_pure_intent_inventory_is_complete_and_unique() { + for case in ["missing", "extra", "duplicate"] { + let (names, fixture, package) = called_fixture(|core, _| { + let CanonicalValueV1::Array(locals) = + map_field_mut(map_field_mut(intent(core), "body"), "locals") + else { + panic!("locals") + }; + match case { + "missing" => { + locals.pop().expect("declared let"); + } + "extra" => locals.push(local("ghost", "U64")), + "duplicate" => locals.push(locals[0].clone()), + _ => panic!("case"), + } + }); + both_refuse(names, &fixture, package, case); + } +} + +#[test] +fn source_functions_combined_source_import_depth_counts_shared_suffixes_in_both_orders() { + for count in [63, 64] { + for shallow_first in [false, true] { + let (names, fixture, package) = edited_fixture(|core, _| { + let coordinate = text_field(core, "coordinate") + .expect("coordinate") + .to_owned(); + let CanonicalValueV1::Array(nodes) = + map_field(map_field(intent(core), "body"), "nodes") + else { + panic!("nodes") + }; + let imported = map_field(&nodes[0], "value").clone(); + let name = |index: usize| { + format!( + "f{:03}", + if shallow_first { + count - 1 - index + } else { + index + } + ) + }; + let mut functions = Vec::new(); + for index in 0..count { + let result = if index + 1 == count { + imported.clone() + } else { + call(&format!("{coordinate}.{}", name(index + 1)), vec![]) + }; + functions.push(( + text(name(index)), + function(vec![], "U64", vec![], vec![], result), + )); + } + add_field(core, "functions", CanonicalValueV1::Map(functions)); + }); + if count == 63 { + lowerer::lower(lowering_request(names, &fixture)).expect("exact combined 64 depth"); + assert!( + verifier_accepts(names, &fixture, package), + "exact depth with shallow_first={shallow_first}" + ); + } else { + both_refuse( + names, + &fixture, + package, + "over combined source/import depth", + ); + } + } + } +} + +fn diamond(core: &mut CanonicalValueV1, layers: usize) -> String { + let coordinate = text_field(core, "coordinate") + .expect("coordinate") + .to_owned(); + let mut functions = Vec::new(); + for layer in 0..=layers { + let body = if layer == layers { + function(vec![], "U64", vec![], vec![], literal("U64", 1)) + } else { + let a = local("local.0", "U64"); + let b = local("local.1", "U64"); + let binding = |local: &CanonicalValueV1| { + map([ + ("kind", text("let")), + ("binding", local.clone()), + ( + "value", + call(&format!("{coordinate}.f{:03}", layer + 1), vec![]), + ), + ]) + }; + function( + vec![], + "U64", + vec![a.clone(), b.clone()], + vec![binding(&a), binding(&b)], + reference(&a), + ) + }; + functions.push((text(format!("f{layer:03}")), body)); + } + add_field(core, "functions", CanonicalValueV1::Map(functions)); + format!("{coordinate}.f000") +} + +#[test] +fn source_functions_diamond_cost_counts_occurrences_and_refuses_u64_storage_overflow() { + // Helper storage B(n)=2*B(n-1)+64, B(0)=64. B(57)=2^64-64 + // fits, B(58)=2^65-64 does not. Both graphs fit the depth aperture. + for layers in [57, 58] { + let (names, fixture, package) = edited_fixture(|core, _| { + diamond(core, layers); + }); + if layers == 57 { + lowerer::lower(lowering_request(names, &fixture)) + .expect("checked u64 storage just below overflow"); + assert!(verifier_accepts(names, &fixture, package)); + } else { + both_refuse(names, &fixture, package, "diamond cost overflow"); + } + } +} + +#[test] +fn source_functions_called_diamond_must_fit_the_whole_operation_budget() { + for layers in [0, 20] { + let (names, fixture, package) = edited_fixture(|core, target| { + let root = diamond(core, layers); + for (artifact, key) in [(core, "nodes"), (target, "pureBindings")] { + let body = if key == "nodes" { + map_field_mut(intent(artifact), "body") + } else { + intent(artifact) + }; + let CanonicalValueV1::Array(bindings) = map_field_mut(body, key) else { + panic!("bindings") + }; + *map_field_mut(&mut bindings[0], "value") = call(&root, vec![]); + } + }); + if layers == 0 { + lowerer::lower(lowering_request(names, &fixture)) + .expect("small called body fits operation"); + assert!(verifier_accepts(names, &fixture, package)); + } else { + both_refuse( + names, + &fixture, + package, + "each repeated call occurrence must spend budget", + ); + } + } +} + +#[test] +fn source_functions_coherent_declared_budgets_cannot_omit_entry_and_result_materialization() { + for key in ["maxSteps", "maxAllocatedBytes"] { + let (names, fixture, package) = called_fixture(|core, target| { + for artifact in [core, target] { + *map_field_mut(map_field_mut(intent(artifact), "coreEvaluationBudget"), key) = + integer(1); + } + }); + both_refuse(names, &fixture, package, key); + } +} + +#[test] +fn source_functions_signature_value_depth_is_part_of_the_call_aperture() { + for layers in [63, 64] { + let (names, fixture, package) = edited_fixture(|core, _| { + let coordinate = text_field(core, "coordinate") + .expect("coordinate") + .to_owned(); + for layer in 0..layers { + let child = if layer + 1 == layers { + "U64".to_owned() + } else { + format!("{coordinate}.Deep{}", layer + 1) + }; + add_field( + map_field_mut(core, "types"), + &format!("Deep{layer}"), + map([ + ("kind", text("Record")), + ("fields", map([("child", text(child))])), + ]), + ); + } + let ty = format!("{coordinate}.Deep0"); + let parameter = local("arg.0", &ty); + add_field( + core, + "functions", + map([( + "identity", + function( + vec![parameter.clone()], + &ty, + vec![], + vec![], + reference(¶meter), + ), + )]), + ); + }); + if layers == 63 { + lowerer::lower(lowering_request(names, &fixture)) + .expect("63 record levels plus one call frame"); + assert!(verifier_accepts(names, &fixture, package)); + } else { + both_refuse( + names, + &fixture, + package, + "record validation would exceed call aperture", + ); + } + } +} + +#[test] +fn source_functions_pure_input_identity_does_not_depend_on_declaration_inventory_order() { + let (names, fixture, package) = called_fixture(|core, _| { + let CanonicalValueV1::Array(locals) = + map_field_mut(map_field_mut(intent(core), "body"), "locals") + else { + panic!("locals") + }; + assert!(locals.len() > 1); + locals.reverse(); + }); + let lowered = lowerer::lower(lowering_request(names, &fixture)) + .expect("declaration inventory order carries no execution order"); + assert_eq!(lowered.outputs[0].artifact.bytes, package); + assert!(verifier_accepts(names, &fixture, package)); +} + +#[test] +fn source_functions_pure_basis_has_complete_input_only_call_authority() { + for case in ["none", "valid", "null", "unknown", "arity", "capture"] { + let (names, fixture, package) = called_fixture(|core, target| { + let coordinate = text_field(core, "coordinate") + .expect("coordinate") + .to_owned(); + let parameter = local("arg.0", "Bytes"); + add_field( + map_field_mut(core, "functions"), + "basisValue", + function( + vec![parameter.clone()], + "Bytes", + vec![], + vec![], + reference(¶meter), + ), + ); + let original = map_field(intent(core), "basis").clone(); + let expression = match case { + "none" | "null" => CanonicalValueV1::Null, + "valid" => call(&format!("{coordinate}.basisValue"), vec![original]), + "unknown" => call(&format!("{coordinate}.missing"), vec![]), + "arity" => call(&format!("{coordinate}.basisValue"), vec![]), + "capture" => reference(&local("local.0", "U64")), + _ => panic!("case"), + }; + for artifact in [core, target] { + if case == "none" { + let CanonicalValueV1::Map(fields) = intent(artifact) else { + panic!("intent map") + }; + fields.retain(|(name, _)| name != &text("basis")); + } else { + *map_field_mut(intent(artifact), "basis") = expression.clone(); + } + } + }); + if ["none", "valid"].contains(&case) { + let lowered = lowerer::lower(lowering_request(names, &fixture)) + .expect("coherent valid optional basis"); + assert_eq!(lowered.outputs[0].artifact.bytes, package); + assert!(verifier_accepts(names, &fixture, package)); + } else { + both_refuse(names, &fixture, package, case); } } } diff --git a/crates/echo-wesley-gen/README.md b/crates/echo-wesley-gen/README.md index c7b6ef677..852ac99ff 100644 --- a/crates/echo-wesley-gen/README.md +++ b/crates/echo-wesley-gen/README.md @@ -57,11 +57,13 @@ validation does not install an artifact or confer Echo runtime authority. `admit_provider_contract_pack_for_publication_v1(...)` also permits explicit selection of the [ordered-instruction publication](../../schemas/edict-provider/contracts/ordered/README.md) -from Edict #219. Its schema and manifest have separate fixed digests and a +from Edict #219 and the +[source-function publication](../../schemas/edict-provider/contracts/source-functions-v1/README.md) +from Edict #226. Each schema/manifest pair has separate fixed digests and a publication-specific size bound. The original entry point and checked provider generation still select the original pure-binding publication. Neither API infers a publication from input bytes or treats schema admission as support for -ordered execution or stateful effects. +source-function execution, ordered execution, or stateful effects. `provider_generation::build_provider_generation_input_v1(...)` joins that admitted pack with exact Echo semantic-source bytes and the checked versioned @@ -176,7 +178,7 @@ unique expected inventory before resolving the root, caps that inventory at 256 files and 64 MiB, caps an actual scan at 1,024 entries, and never opens or reads an unexpected regular file. -`echo-edict-provider-assets` maintains the exact 40-file package-local carrier +`echo-edict-provider-assets` maintains the exact 42-file package-local carrier tree under `assets/v1/`. The physical carrier names are packaging locations, not replacement source identities: generator provenance continues to name the original repository-relative authored paths. Read-only mode requires every @@ -253,6 +255,20 @@ leaving provider component bytes unchanged. Verify that boundary separately with the authenticated component build/check and the standalone package admission witness. Do not edit generated files or hash locks manually to bypass drift. +The source-function publication is an explicit candidate route: + +```bash +cargo +1.96.0 run --locked -p echo-wesley-gen \ + --example source_functions_publication_witness -- /owned-data/source-functions-provider +``` + +Run this only inside the same guarded worker, after refreshing the checked +component carriers, with a new destination in its guarded data root. It selects +`ProviderContractPublicationV1::SourceFunctions` and admits the complete package +before writing it. The default checked generators retain the pure-binding +publication. Neither route grants runtime authority merely by generating a +schema-valid package. + ## Usage ```bash diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl b/crates/echo-wesley-gen/assets/v1/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl new file mode 100644 index 000000000..c7a0e9dd4 --- /dev/null +++ b/crates/echo-wesley-gen/assets/v1/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl @@ -0,0 +1,1036 @@ +; SPDX-License-Identifier: Apache-2.0 +; edict-provider-contracts.cddl +; Generated from Edict-owned ABI fragments. DO NOT EDIT. + +; --- edict-common.cddl --- +; edict-common.cddl +; Shared CDDL types for the Edict ABIs, defined ONCE here so they cannot drift +; (EDICT-ABI-NODUP-001). Two groups: +; - resource-ref, sha256-digest, effect-failure-body, effect-kind, authority-class, +; core-type-ref, core-named-type-ref: assembled with edict-core.cddl, +; edict-target-profile.cddl, and +; edict-lawpack.cddl by the build; those schemas do not redefine them. +; - operation-profile, optic-template, aperture-requirement and their refs: +; consumed by the Core/optic layer (edict-core.cddl) and referenced by the +; language/target-profile specs. +; Authoritative byte encoding: edict.canonical-cbor/v1. + +; A normative subcomponent referenced by identity plus digest. Manifests never +; embed their own self-digest in their preimage (EDICT-CORE-SELFHASH-001). +resource-ref = { id: tstr, digest: sha256-digest } + +; Digests are authoritative as typed byte values, never hex strings. Review JSON +; renders this as "sha256:<64 lowercase hex>" (EDICT-DIGEST-WIRE-001). +sha256-digest = [ algorithm: "sha256", bytes: bstr .size 32 ] + +; A named low-level failure an effect can raise. The source obstruction map +; binds it (by coordinate) and constructs a typed domain obstruction from its +; payload (EDICT-ABI-FAILURE-NAMED-001). +; An effect's `effectFailures` list MUST have unique `coordinate`s: since the +; obstruction map is keyed by coordinate, two failures sharing a coordinate (even +; with different authorityClass/payloadType) make exhaustive mapping and binder +; typing ambiguous and are rejected (EDICT-ABI-FAILURE-UNIQUE-001). +; +; Effects carry their failures as a map `{ failure-ident => effect-failure-body }` +; (see the target/lawpack effect schemas). The failure coordinate is the map +; KEY, so it is not repeated in the body and cannot disagree with the key. +effect-failure-body = { + authorityClass: authority-class, + payloadType: core-type-ref, ; typed, bounded (may be empty record) +} + +; A failure coordinate must be a bare Edict `ident` (letter/underscore then +; letters/digits/underscores) AND must not be a reserved keyword (e.g. `else`, +; `basis`, `where`, `require`, `for`, `if`). The source obstruction-map LHS only +; accepts a non-keyword `ident`, so a hyphen/dot/keyword coordinate would be +; ABI-valid yet impossible to map exhaustively in source. The regex captures the +; lexical shape; keyword exclusion is an additional validation rule +; (EDICT-ABI-FAILURE-IDENT-001). +failure-ident = tstr .regexp "[A-Za-z_][A-Za-z0-9_]*" + +effect-kind = "read" / "create" / "ensure" / "replace" / "delete" / + "append" / "reduce" / "semantic.emit" / "custom" + +authority-class = "domainMappable" / "participantOwned" / "integrityFault" / + "resourceFault" / "internalFault" + +; The normative lexical and semantic grammar for Core type references lives in +; SPEC_edict-language-v1.md. CDDL can express only the wire-level text shape. +core-type-ref = tstr + +; A core.types map key is narrower than a general core-type-ref: it must be a +; named identity, never an intrinsic or canonical structural reference. The +; formal spec and executable Core validator enforce that semantic distinction. +core-named-type-ref = tstr + +; An operation profile supplies the optic template a Core intent resolves its +; opticKind/boundaryKind/supportPolicy/lossDisposition from. Target profiles and +; lawpacks publish these as a map `{ coordinate => operation-profile }`, so the +; coordinate is the KEY, not a value field (EDICT-OPTIC-TEMPLATE-OWNER-001, +; EDICT-ABI-OPPROFILE-UNIQUE-001). +operation-profile = { + opticTemplate: optic-template, + effectPredicate: tstr, ; coordinate of the operation-mode predicate +} + +optic-template = { + opticKind: "revelation" / "affectReintegration", + boundaryKind: "projection" / "affect", + supportPolicy: tstr, ; canonical support-policy coordinate + lossDisposition: tstr, ; canonical loss-disposition coordinate + ? basisTemplate: tstr, ; optional digest-locked basis template coord + ; the aperture requirement this template supplies. Required when the template + ; is the source of a Core optic's apertureRequirement (i.e. the intent has no + ; source `footprint <= ...`), since apertureRequirement is mandatory in Core + ; (EDICT-OPTIC-APERTURE-REF-001). + ? apertureRequirement: aperture-requirement, +} + +; apertureRequirement is a typed reference, never a free-form string. A review +; rendering may show its coordinate (EDICT-OPTIC-APERTURE-REF-001). +aperture-requirement = footprint-ceiling-ref / abstract-footprint-obligation-ref +footprint-ceiling-ref = { kind: "footprintCeiling", ref: tstr } +abstract-footprint-obligation-ref = { kind: "abstractFootprintObligation", ref: tstr } + +; --- edict-core.cddl --- +; edict-core.cddl +; Normative schema for the Edict Core v1 semantic model. +; +; Scope boundary: this file defines Core meaning and schema shape only. It does +; not define a canonical encoder, Core module hash fields, hash fixtures, target +; lowering, admission bundles, or target-owned IR. + +core-module = { + apiVersion: "edict.core/v1", + coordinate: tstr, + imports: [* core-import], + types: { * core-named-type-ref => core-type }, + ? functions: { + tstr => core-source-function }, + intents: { + tstr => core-intent }, + requiredCoreCapabilities: [* tstr], +} + +core-import = { + kind: "lawpack" / "target" / "core" / "capability", + ref: resource-ref, + ? alias: tstr, +} + +; --- types --------------------------------------------------------------- + +core-type = core-scalar-type / core-record-type / core-variant-type / + core-option-type / core-list-type / core-map-type / + core-capability-ref-type / core-external-action-request-type / + core-nominal-type + +core-scalar-type = core-bool-type / core-int-type / core-string-type / + core-bytes-type / core-unit-type + +core-bool-type = { kind: "Bool" } +core-unit-type = { kind: "Unit" } +core-int-type = { + kind: "I64" / "U64" / "I32" / "U32" / "I16" / "U16" / "I8" / "U8", +} +core-string-type = { + kind: "String", + max: uint, + canonical: "unicode-scalar-nfc" / "raw-utf8", +} +core-bytes-type = { + kind: "Bytes", + ? min: uint, + max: uint, +} +core-nominal-type = { + kind: "Nominal", + contract: tstr, + representation: core-type-ref, +} +core-record-type = { + kind: "Record", + fields: { * tstr => core-type-ref }, +} +core-variant-type = { + kind: "Variant", + cases: { + tstr => variant-case-body }, +} +variant-case-body = { + ? payload: core-type-ref, +} +core-option-type = { + kind: "Option", + item: core-type-ref, +} +core-list-type = { + kind: "List", + item: core-type-ref, + max: uint, +} +core-map-type = { + kind: "Map", + key: core-type-ref, + value: core-type-ref, + max: uint, +} +core-capability-ref-type = { + kind: "CapabilityRef", + item: core-type-ref, +} +core-external-action-request-type = { + kind: "ExternalActionRequest", + settlement: core-type-ref, +} + +; core-type-ref is defined in edict-common.cddl and assembled with this schema. + +; --- references and values ---------------------------------------------- + +; Local identity is alpha-stable. `id` is the compiler-owned local coordinate; +; `alphaName` is the normalized human/debug name. Source binder spelling is not +; identity. +local-ref = { + id: tstr, + alphaName: tstr, + type: core-type-ref, +} + +core-value = core-null-value / core-bool-value / core-int-value / + core-string-value / core-bytes-value / core-record-value / + core-variant-value / core-list-value / core-map-value / + core-capability-value + +core-null-value = { kind: "null" } +core-bool-value = { kind: "bool", value: bool } +core-int-value = { kind: "int", width: tstr, value: int } +core-string-value = { kind: "string", value: tstr } +core-bytes-value = { kind: "bytes", value: bstr } +core-record-value = { kind: "record", fields: { * tstr => core-value } } +core-variant-value = { + kind: "variant", + type: core-type-ref, + case: tstr, + ? payload: core-value, +} +core-list-value = { kind: "list", values: [* core-value] } +core-map-value = { kind: "map", entries: [* [key: core-value, value: core-value]] } +core-capability-value = { + kind: "capability", + receipt: sha256-digest, +} + +; Edict-authored pure helpers use a pure Core function body. The body can bind +; pure expressions and return an expression, but it cannot contain Core effect, +; guard, branch, loop, match-node, or proof-obligation nodes. +; Source-owned functions use the same pure body algebra, with their result type +; authenticated by the enclosing module. An empty function table is omitted. +core-source-function = { + params: [* local-ref], + returnType: core-type-ref, + body: core-pure-block, +} + +core-fn-body = { + params: [* local-ref], + body: core-pure-block, +} + +core-pure-block = { + locals: [* local-ref], + bindings: [* pure-let-node], + result: core-expr, +} + +pure-let-node = { + kind: "let", + binding: local-ref, + value: core-expr, +} + +; --- expressions and predicates ----------------------------------------- + +core-expr = local-expr / const-expr / record-expr / field-expr / + variant-expr / match-expr / call-expr / list-expr / map-expr / + if-expr + +local-expr = { kind: "local", ref: local-ref } +const-expr = { kind: "const", value: core-value } +record-expr = { kind: "record", fields: { * tstr => core-expr } } +field-expr = { kind: "field", base: core-expr, field: tstr } +variant-expr = { + kind: "variant", + type: core-type-ref, + case: tstr, + ? payload: core-expr, +} +match-expr = { + kind: "match", + scrutinee: core-expr, + arms: [+ match-arm], +} +match-arm = { + case: tstr, + ? binder: local-ref, + body: core-expr, +} +call-expr = { + kind: "call", + callee: tstr, + typeArgs: [* core-type-ref], + args: [* core-expr], +} +list-expr = { kind: "list", values: [* core-expr] } +map-expr = { kind: "map", entries: [* [key: core-expr, value: core-expr]] } +if-expr = { + kind: "if", + predicate: core-predicate, + then: core-expr, + else: core-expr, +} + +core-predicate = true-predicate / false-predicate / not-predicate / + all-predicate / any-predicate / compare-predicate / + call-predicate / obstruction-predicate + +true-predicate = { kind: "true" } +false-predicate = { kind: "false" } +not-predicate = { kind: "not", value: core-predicate } +all-predicate = { kind: "all", values: [+ core-predicate] } +any-predicate = { kind: "any", values: [+ core-predicate] } +compare-predicate = { + kind: "compare", + op: "==" / "!=" / "<" / "<=" / ">" / ">=", + left: core-expr, + right: core-expr, +} +call-predicate = { + kind: "call", + predicate: tstr, + args: [* core-expr], +} +obstruction-predicate = { + kind: "obstruction", + coordinate: failure-ident, + payload: core-expr, +} + +input-constraint = { + coordinate: tstr, + source: "where" / "compiler", + predicate: core-predicate, +} + +; --- intents, blocks, and nodes ----------------------------------------- + +core-intent = { + input: core-type-ref, + output: core-type-ref, + requiredOperationProfile: tstr, + ? basis: core-expr, + inputConstraints: [* input-constraint], + coreEvaluationBudget: core-budget, + body: core-block, + ? optic: core-optic, +} + +core-budget = { + maxSteps: uint, + maxAllocatedBytes: uint, + maxOutputBytes: uint, +} + +core-optic = { + opticKind: "revelation" / "affectReintegration", + boundaryKind: "projection" / "affect", + apertureRequirement: aperture-requirement, + supportPolicy: tstr, + lossDisposition: tstr, +} + +core-block = { + locals: [* local-ref], + nodes: [* core-node], + result: core-expr, +} + +core-node = let-node / require-node / effect-node / + external-action-request-node / guard-node / branch-node / + for-node / match-node / proof-obligation-node + +let-node = { + kind: "let", + binding: local-ref, + value: core-expr, +} +require-node = { + kind: "require", + predicate: core-predicate, + onFailure: require-failure-arm, +} +require-failure-arm = terminal-require-failure / + continue-obstructed-require-failure +terminal-require-failure = { + kind: "terminal", + reason: obstruction-reason, +} +continue-obstructed-require-failure = { + kind: "continueObstructed", + reason: obstruction-reason, +} +obstruction-reason = { + reasonKind: tstr, + payload: { * tstr => core-expr }, +} +effect-node = { + kind: "effect", + binding: local-ref, + effect: tstr, + input: core-expr, + obstructionMap: { * failure-ident => obstruction-arm }, +} +external-action-request-node = { + kind: "externalActionRequest", + binding: local-ref, + operation: resource-ref, + inputType: core-type-ref, + settlementType: core-type-ref, + inputSchema: resource-ref, + settlementSchema: resource-ref, + input: core-expr, + authorityScope: core-expr, + basis: core-expr, + budget: external-action-budget, + reconciliationLaw: resource-ref, + state: "awaitingSettlement", + settlementAdmission: "schemaRequired", +} +external-action-budget = { + maxSettlementBytes: core-expr, + maxAttempts: core-expr, +} +obstruction-arm = { + binder: local-ref, + value: core-expr, +} +guard-node = { + kind: "guard", + predicate: core-predicate, + obstruction: core-expr, +} +branch-node = { + kind: "branch", + ? binding: local-ref, + predicate: core-predicate, + then: core-block, + else: core-block, +} +for-node = { + kind: "for", + binder: local-ref, + iter: core-expr, + bound: core-bound, + body: core-block, +} +match-node = { + kind: "match", + scrutinee: core-expr, + arms: [+ match-block-arm], +} +match-block-arm = { + case: tstr, + ? binder: local-ref, + body: core-block, +} +proof-obligation-node = { + kind: "proof", + coordinate: tstr, + predicate: core-predicate, +} + +core-bound = literal-bound / coordinate-bound +literal-bound = { kind: "literal", value: uint } +coordinate-bound = { kind: "coordinate", ref: tstr } + +; Shared resource-ref, sha256-digest, failure-ident, aperture-requirement, +; core-type-ref, and core-named-type-ref are defined once in edict-common.cddl. + +; --- edict-lawpack.cddl --- +; edict-lawpack.cddl +; Canonical schema for the Edict lawpack manifest and export surface. +; Authoritative byte encoding: edict.canonical-cbor/v1. JSON in the prose specs +; is a review rendering generated from this schema (EDICT-ABI-NODUP-001). + +lawpack-manifest = { + apiVersion: "edict.lawpack/v1", + id: tstr, + version: tstr, + acceptedCoreAbi: [+ tstr], + dependencies: [* lawpack-dep], ; acyclic, digest-locked (EDICT-LAWPACK-DAG-001) + exports: resource-ref, + ? targetAdapters: [+ target-adapter], ; required only if any runtime effect exists + ? helperComponent: executable-component, ; executable helpers carry their own sandbox+fuel + verifier: verifier, ; classified: declarative or executable + compatibility: resource-ref, + conformanceFixtureCorpus: resource-ref, +} + +; A verifier is either a declarative ruleset (no runtime) or an executable +; component. An executable verifier MUST carry its own sandbox and fuel model, +; so the schema enforces that no executable component is left unbounded +; (EDICT-ABI-VERIFIER-BOUND-001). +verifier = declarative-verifier / executable-verifier +declarative-verifier = { class: "declarative", ruleset: resource-ref } +executable-verifier = { + class: "executable", + component: resource-ref, + sandbox: resource-ref, + fuelModel: resource-ref, +} + +; Any executable component is bounded by its own sandbox + fuel model. +executable-component = { + component: resource-ref, + sandbox: resource-ref, + fuelModel: resource-ref, +} + +lawpack-dep = { id: tstr, version: tstr, digest: sha256-digest } + +; Adapter selection keys SOLELY off the digest-locked `acceptedTargetProfile` +; (its `id` is the profile id; its `digest` pins the exact profile/version). There +; are no independent display strings that could disagree with the lock, so a +; resolver cannot bind an adapter to one target while the lock proves another +; (EDICT-LAWPACK-ADAPTER-TARGETIR-001). +target-adapter = { + acceptedTargetProfile: resource-ref, ; digest-locked, authoritative selector + acceptedTargetIr: resource-ref, ; digest-locked + adapter: resource-ref, +} + +; Shared types resource-ref and sha256-digest are defined once in +; edict-common.cddl and assembled with this schema (EDICT-ABI-NODUP-001). + +; --- export surface ------------------------------------------------------ + +lawpack-exports = { + types: [* exported-type], + constants: [* exported-constant], + pureFunctions: [* pure-function], + effects: [* semantic-effect], + obstructions: [* obstruction-def], + ; keyed by operation-profile coordinate → uniqueness enforced + ; (EDICT-ABI-OPPROFILE-UNIQUE-001) + ; operation-profile records this lawpack exports (optic templates that + ; `implements`/`profile` clauses resolve against). operation-profile is + ; defined in edict-common.cddl (EDICT-ABI-OPPROFILE-SLOT-001). + operationProfiles: { * tstr => operation-profile }, ; keyed by coordinate +} + +exported-type = { coordinate: tstr, definition: core-type-ref } +exported-constant = { coordinate: tstr, type: core-type-ref, value: any } + +; A pure helper is a discriminated union by `source`, so the schema itself +; guarantees an implementation exists (EDICT-LAWPACK-PURE-IMPL-001): +; - "edict": authored in Edict/Core; the Core body is carried inline (hashed +; with the export surface). The schema requires the `body` field. +; - "component": implemented outside Edict; carries no inline body and instead +; carries its own digest-locked `implementation` (sandbox + fuel). It does +; not depend on the optional manifest-level helperComponent. +pure-function = edict-pure-function / component-pure-function + +pure-function-common = ( + coordinate: tstr, + typeParameters: [* tstr], + parameterTypes: [* core-type-ref], ; all bounded + returnType: core-type-ref, ; bounded + costTemplate: tstr, + determinismClass: "total" / "total-with-typed-diagnostic", +) + +edict-pure-function = { + pure-function-common, + source: "edict", + body: core-fn-body, ; inline, hash-significant +} + +component-pure-function = { + pure-function-common, + source: "component", + ; the digest-locked component implementing this helper. Required at the schema + ; level so a component helper can never validate without a hash-bound, + ; sandbox+fuel-described implementation (EDICT-LAWPACK-PURE-IMPL-001). + implementation: executable-component, +} + +; core-fn-body is defined by edict-core.cddl and assembled with this lawpack +; schema. It is a pure Core function body, not an effect-capable core-block. + +semantic-effect = { + coordinate: tstr, + typeParameters: [* tstr], + inputType: core-type-ref, ; bounded + outputType: core-type-ref, ; bounded + executionClass: "proofOnly" / "runtime", ; orthogonal to writeClass + effectKindHint: effect-kind, + footprintObligation: tstr, + costObligation: tstr, + effectFailures: { * failure-ident => effect-failure-body }, ; keyed by coordinate; unique + guardSupport: bool, +} + +obstruction-def = { + coordinate: tstr, + authorityClass: authority-class, + payloadSchema: core-type-ref, ; typed, bounded (may be empty record) +} + +; effect-failure-body, effect-kind, authority-class, and core-type-ref are defined +; once in edict-common.cddl and assembled with this schema (EDICT-ABI-NODUP-001). + +; --- edict-lawpack-adapter.cddl --- +; edict-lawpack-adapter.cddl +; Canonical schema for one direct declarative lawpack target adapter. +; Authoritative byte encoding: edict.canonical-cbor/v1. +; +; The enclosing lawpack manifest selects the exact target profile, target IR, +; and adapter resource digest. Those identities are not repeated here. + +lawpack-adapter = { + apiVersion: "edict.lawpack-adapter/v1", + class: "declarative", + operationProfiles: { + * tstr => lawpack-adapter-operation-profile + }, + effectImplementations: { + * tstr => lawpack-adapter-effect + }, + budgets: { + * tstr => lawpack-adapter-budget + }, +} + +; Keys are canonical lawpack operation-profile coordinates. +lawpack-adapter-operation-profile = + { + core: tstr, + semanticEffects: [+ tstr], + ? budgetObligation: tstr, + ? targetConfiguration: resource-ref, + } / + { + core: tstr, + semanticEffects: [], + budgetObligation: tstr, + targetConfiguration: resource-ref, + } + +; Keys are canonical lawpack semantic-effect coordinates. Footprint, cost, and +; failure fields must exactly discharge the matching exported effect. +lawpack-adapter-effect = { + targetIntrinsic: tstr, + targetConfiguration: resource-ref, + writeClass: lawpack-adapter-write-class, + footprintObligation: tstr, + costObligation: tstr, + failureMappings: { * failure-ident => tstr }, +} + +; Keys are canonical exported cost-obligation coordinates. +lawpack-adapter-budget = { + maxSteps: uint, + maxAllocatedBytes: uint, + maxOutputBytes: uint, +} + +lawpack-adapter-write-class = "none" / "read" / "create" / "ensure" / + "append" / "replace" / "delete" / "custom" + +; failure-ident is defined in edict-common.cddl. + +; --- edict-target-profile.cddl --- +; edict-target-profile.cddl +; Canonical schema for the Edict target profile manifest. +; Authoritative byte encoding: edict.canonical-cbor/v1 +; (see SPEC_continuum-contract-bundle-v1.md). JSON in the prose specs is a +; review rendering generated from this schema; this CDDL is the single source +; of truth (EDICT-ABI-NODUP-001). + +target-profile-manifest = { + apiVersion: "edict.target-profile/v1", + id: tstr, ; e.g. "echo.dpo" + version: tstr, ; e.g. "1" + acceptedCoreAbi: [+ tstr], ; e.g. ["edict.core/v1"] + + intrinsics: resource-ref, + intrinsicNamespace: tstr, + ; publishes this profile's operation-profile records (optic templates that + ; `profile`/`implements` clauses resolve against). References an + ; operation-profiles-document (EDICT-ABI-OPPROFILE-SLOT-001). + operationProfiles: resource-ref, + footprintAlgebra: resource-ref, + costAlgebra: resource-ref, + targetIr: resource-ref, + obstructionTaxonomy: resource-ref, + verifier: resource-ref, + lowerer: resource-ref, + sandbox: resource-ref, + fuelModel: resource-ref, + + ; fields the language spec requires of every profile + bundleProfile: resource-ref, + generatedArtifactProfiles: [* resource-ref], + canonicalEncodingRules: resource-ref, + ; A profile that accepts the direct declarative lawpack-adapter ABI names it + ; exactly once. Profiles that do not consume lawpack adapters leave this + ; optional slot absent or empty. + ? acceptedLawpackAdapterAbi: [] / ["edict.lawpack-adapter/v1"], + diagnosticAbi: resource-ref, + + ; application doctrine + applicationModel: "atomic", + readConsistency: "application-snapshot" / tstr, + guardEvaluation: "precommit-atomic" / tstr, + obstructionRollback: "no-visible-effects" / tstr, + multiTarget: bool, + ; whether the target can evaluate precommit postcondition (`guarantee`) checks + ; inside the atomic application unit (EDICT-TARGET-POSTCOND-001) + postconditionSupport: bool, + + deterministicExecution: resource-ref, + conformanceFixtureCorpus: resource-ref, +} + +; Shared types resource-ref and sha256-digest are defined once in +; edict-common.cddl and assembled with this schema by the build +; (EDICT-ABI-NODUP-001). They are not redefined here. + +; --- intrinsic signature ------------------------------------------------- +; The artifact referenced by the manifest's `intrinsics` resource-ref is the +; intrinsic-signature corpus document below. Its layout is fixed so two +; independent profiles validate/hash the corpus identically +; (EDICT-ABI-INTRINSICS-DOC-001). + +; intrinsics is a MAP keyed by coordinate, so the schema itself enforces +; coordinate uniqueness. A provider receives the resolved corpus as a +; digest-bound semantic input and resolves coordinates within that artifact. +; Each map key MUST equal its record's `coordinate` field +; (EDICT-ABI-INTRINSIC-UNIQUE-001). +intrinsics-document = { + apiVersion: "edict.target-profile.intrinsics/v1", + intrinsics: { * tstr => intrinsic }, +} + +; The artifact referenced by the manifest's `operationProfiles` resource-ref. +; operation-profile / optic-template are defined in edict-common.cddl. Keyed by +; coordinate so resolution can't pick between two same-coordinate profiles +; (EDICT-ABI-OPPROFILE-SLOT-001, EDICT-ABI-OPPROFILE-UNIQUE-001). +operation-profiles-document = { + apiVersion: "edict.target-profile.operation-profiles/v1", + profiles: { * tstr => operation-profile }, +} + +; A typed pre-lowering question that can be proposed by Watson or an agent and +; checked by the compiler. It is canonical-CBOR encoded under +; `edict.lowering-requirements/v1`; the compiler checks this artifact, not the +; prose that produced it. +lowering-requirements = { + apiVersion: "edict.lowering-requirements/v1", + operationProfile: tstr, + semanticEffects: [* semantic-effect-requirement], + requiredWriteClasses: [* write-class], + guardKinds: [* guard-kind], + atomicity: atomicity-requirement, + postconditionSupport: bool, + obstructionCoordinates: [* tstr], + footprintObligations: [* tstr], + costObligations: [* tstr], + opticContract: tstr, +} + +semantic-effect-requirement = { + coordinate: tstr, + writeClass: write-class, + guardKinds: [* guard-kind], + obstructionCoordinates: [* tstr], + footprintObligations: [* tstr], + costObligations: [* tstr], +} + +write-class = "none" / "read" / "create" / "ensure" / "append" / + "replace" / "delete" / tstr +guard-kind = "precommit-atomic" / tstr +atomicity-requirement = "atomic" / tstr + +; A genuine union: pure constructors carry no effect kind or failures; effect +; intrinsics must (EDICT-TARGET-INTRINSIC-CLASS-001). The schema enforces this, +; not a comment. + +; The intrinsic's coordinate is the intrinsics map KEY, not a value field, so the +; key and coordinate can never disagree (EDICT-ABI-INTRINSIC-UNIQUE-001). +intrinsic = pure-intrinsic / effect-intrinsic + +pure-intrinsic = { + intrinsicClass: "pure", + typeParameters: [* tstr], + argumentTypes: [* core-type-ref], + returnType: core-type-ref, + guardSupport: false, + footprintTemplate: tstr, + costTemplate: tstr, + writeClass: "none", +} + +effect-intrinsic = { + intrinsicClass: "effect", + typeParameters: [* tstr], + argumentTypes: [* core-type-ref], + returnType: core-type-ref, + effectKind: effect-kind, + ; map keyed by failure coordinate (failure-ident); the failure coordinate is + ; the key, not a value field, so uniqueness is structural + ; (EDICT-ABI-FAILURE-UNIQUE-001). + effectFailures: { * failure-ident => effect-failure-body }, + guardSupport: bool, + footprintTemplate: tstr, + costTemplate: tstr, + writeClass: "read" / "create" / "ensure" / "append" / "replace" / + "delete" / "custom", + canParticipateInAtomicGuard: bool, +} + +; effect-failure-body, effect-kind, authority-class, and core-type-ref are defined +; once in edict-common.cddl and assembled with this schema (EDICT-ABI-NODUP-001). + +; --- edict-authority-facts.cddl --- +; edict-authority-facts.cddl +; Canonical schema for the first compiler-context authority-facts document. +; Authoritative byte encoding: edict.canonical-cbor/v1. +; +; This schema is assembled with edict-common.cddl so source.digest uses the +; shared sha256-digest typed value. JSON is a review/input rendering: its +; `sha256:<64 hex>` source digest is projected to [`sha256`, 32 raw bytes] on +; the wire, and its fact arrays project to the coordinate-keyed maps below. + +authority-facts = { + apiVersion: "edict.authority-facts/v1", + source: authority-fact-source, + operationProfiles: { * tstr => authority-operation-profile-fact }, + effectWriteClasses: { * tstr => authority-write-class }, + budgets: { * tstr => authority-budget-fact }, +} + +authority-fact-source = { + kind: "lawpack" / "targetProfile", + coordinate: tstr, + digest: sha256-digest, +} + +; The map key is the source operation-profile coordinate. It is not repeated in +; the value, so a key and embedded coordinate cannot disagree. Allowed write +; classes are a canonical map-set: the class is the unique key and null is the +; unit marker. Canonical CBOR fixes key order without a second ordering rule. +authority-operation-profile-fact = { + core: tstr, + allowedWriteClasses: { * authority-write-class => null }, +} + +; The effectWriteClasses map key is the semantic effect coordinate. The budgets +; map key is the source budget coordinate. Canonical CBOR map-key uniqueness +; makes duplicate fact coordinates structurally unrepresentable. +authority-budget-fact = { + maxSteps: uint, + maxAllocatedBytes: uint, + maxOutputBytes: uint, +} + +; AuthorityFactsDocument v1 intentionally accepts only the write classes the +; current compiler model can consume. `custom` is the sole v1 custom spelling; +; arbitrary target-profile extension strings do not enter this compiler path. +authority-write-class = "none" / "read" / "create" / "ensure" / "append" / + "replace" / "delete" / "custom" + +; --- edict-result-projection.cddl --- +; SPDX-License-Identifier: Apache-2.0 +; edict-result-projection.cddl +; Canonical schema for compiler-owned application-result projections. +; Authoritative byte encoding: edict.canonical-cbor/v1. + +result-projection = { + schema: "edict.result-projection/v1", + operationCoordinate: bounded-projection-text, + outputType: bounded-projection-text, + maxOutputBytes: uint .gt 0, + expression: result-projection-expr, +} + +result-projection-expr = result-projection-record / result-projection-source + +result-projection-record = { + kind: "record", + ; The root record counts as one of the Rust decoder's 256 expression nodes. + ; Nested aggregate node count remains an authoritative decoder check. + fields: { 0*255 bounded-projection-text => result-projection-expr }, +} + +result-projection-source = { + kind: "source", + source: result-projection-source-kind, + ; Matches MAX_RESULT_PROJECTION_PATH_SEGMENTS in edict-syntax. + path: [0*32 bounded-projection-text], +} + +result-projection-source-kind = + { kind: "applicationInput" } / + { + kind: "pureBinding", + bindingId: bounded-projection-text, + } / + { + kind: "capabilityResult", + stepId: bounded-projection-text, + } + +bounded-projection-text = tstr .size (1..1024) + +; --- edict-target-ir.cddl --- +; SPDX-License-Identifier: Apache-2.0 +; edict-target-ir.cddl +; Canonical schema for the Edict-owned Target IR artifact envelope. +; Authoritative byte encoding: edict.canonical-cbor/v1. +; +; This schema is assembled with edict-common.cddl and edict-core.cddl. It +; deliberately reuses Core expressions, predicates, budgets, local references, +; obstruction reasons, and obstruction arms so the schema matches the value +; emitted by the canonical Target IR encoder rather than restating those types. +; It describes the structural shape of valid lowering-produced artifacts. The +; lowering and encoder contracts separately enforce semantic identifier rules +; and canonical ordering/deduplication for set-like values. + +; Target IR encoding rejects an empty target-profile coordinate before bytes +; exist, so this root tightens the shared structural resource-ref accordingly. +target-ir-resource-ref = { + id: tstr .regexp "(?s).+", + digest: sha256-digest, +} + +target-ir-artifact = target-ir-phased-artifact / target-ir-ordered-artifact + +target-ir-phased-artifact = target-ir-closed-artifact / target-ir-legacy-artifact + +target-ir-artifact-common = ( + domain: tstr, + targetProfile: target-ir-resource-ref, + sourceCoreCoordinate: tstr .regexp "(?s).+", +) + +; v2 binds one execution order over the instruction tables. The encoder also +; validates the exact permutation and producer-before-consumer dependencies. +target-ir-ordered-artifact = target-ir-ordered-closed / target-ir-ordered-legacy + +target-ir-ordered-common = ( + domain: "echo.span-ir/v2", + targetProfile: target-ir-resource-ref, + sourceCoreCoordinate: tstr .regexp "(?s).+", +) + +target-ir-ordered-closed = { + kind: "orderedTargetIrArtifact", + target-ir-ordered-common, + semanticClosure: target-ir-semantic-closure, + intents: { * tstr => target-ir-ordered-intent }, +} + +target-ir-ordered-legacy = { + kind: "orderedTargetIrArtifact", + target-ir-ordered-common, + intents: { * tstr => target-ir-ordered-legacy-intent }, +} + +target-ir-ordered-intent = { + target-ir-intent-common, + ? basis: core-expr, + ? pureBindings: [1* target-ir-pure-binding], + executionOrder: [* tstr .regexp "(?s).+"], +} + +target-ir-ordered-legacy-intent = { + target-ir-intent-common, + executionOrder: [* tstr .regexp "(?s).+"], +} + +target-ir-closed-artifact = { + kind: "targetIrArtifact", + target-ir-artifact-common, + semanticClosure: target-ir-semantic-closure, + intents: { * tstr => target-ir-intent }, +} + +target-ir-legacy-artifact = { + kind: "targetIrArtifact", + target-ir-artifact-common, + intents: { * tstr => target-ir-legacy-intent }, +} + +target-ir-semantic-closure = { + sourceCore: target-ir-resource-ref, + lawpacks: [* target-ir-resource-ref], + ? capabilities: [* target-ir-resource-ref], +} + +target-ir-intent = { + target-ir-intent-common, + ? basis: core-expr, + ? pureBindings: [1* target-ir-pure-binding], + ? externalActionRequests: [* target-ir-external-action-request], +} + +target-ir-legacy-intent = { + target-ir-intent-common, +} + +target-ir-intent-common = ( + operationProfile: tstr, + inputConstraints: [* input-constraint], + coreEvaluationBudget: core-budget, + requirements: [* target-ir-requirement], + steps: [* target-ir-step], + result: core-expr, +) + +target-ir-requirement = { + id: tstr, + predicate: core-predicate, + onFailure: require-failure-arm, +} + +target-ir-pure-binding = { + id: tstr .regexp "(?s).+", + binding: local-ref, + value: core-expr, +} + +target-ir-step = { + id: tstr, + binding: local-ref, + effect: tstr, + targetIntrinsic: tstr, + input: core-expr, + obstructionFailures: [* failure-ident], + obstructionArms: { * failure-ident => obstruction-arm }, +} + +target-ir-external-action-request = { + id: tstr, + binding: local-ref, + operation: target-ir-resource-ref, + inputType: core-type-ref, + settlementType: core-type-ref, + inputSchema: target-ir-resource-ref, + settlementSchema: target-ir-resource-ref, + input: core-expr, + authorityScope: core-expr, + basis: core-expr, + budget: external-action-budget, + reconciliationLaw: target-ir-resource-ref, + state: "awaitingSettlement", + settlementAdmission: "schemaRequired", +} diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/contracts/source-functions-v1/manifest.json b/crates/echo-wesley-gen/assets/v1/edict-provider/contracts/source-functions-v1/manifest.json new file mode 100644 index 000000000..267a5878a --- /dev/null +++ b/crates/echo-wesley-gen/assets/v1/edict-provider/contracts/source-functions-v1/manifest.json @@ -0,0 +1,83 @@ +{ + "apiVersion": "edict.provider-contract-pack/v1", + "coordinate": "edict.provider-contract-pack.cddl@1", + "license": "Apache-2.0", + "schema": { + "bytesHex": "3b20535044582d4c6963656e73652d4964656e7469666965723a204170616368652d322e300a3b2065646963742d70726f76696465722d636f6e7472616374732e6364646c0a3b2047656e6572617465642066726f6d2045646963742d6f776e65642041424920667261676d656e74732e20444f204e4f5420454449542e0a0a3b202d2d2d2065646963742d636f6d6d6f6e2e6364646c202d2d2d0a3b2065646963742d636f6d6d6f6e2e6364646c0a3b20536861726564204344444c20747970657320666f722074686520456469637420414249732c20646566696e6564204f4e4345206865726520736f20746865792063616e6e6f742064726966740a3b202845444943542d4142492d4e4f4455502d303031292e2054776f2067726f7570733a0a3b2020202d207265736f757263652d7265662c207368613235362d6469676573742c206566666563742d6661696c7572652d626f64792c206566666563742d6b696e642c20617574686f726974792d636c6173732c0a3b2020202020636f72652d747970652d7265662c20636f72652d6e616d65642d747970652d7265663a20617373656d626c656420776974682065646963742d636f72652e6364646c2c0a3b202020202065646963742d7461726765742d70726f66696c652e6364646c2c20616e640a3b202020202065646963742d6c61777061636b2e6364646c20627920746865206275696c643b2074686f736520736368656d617320646f206e6f74207265646566696e65207468656d2e0a3b2020202d206f7065726174696f6e2d70726f66696c652c206f707469632d74656d706c6174652c2061706572747572652d726571756972656d656e7420616e6420746865697220726566733a0a3b2020202020636f6e73756d65642062792074686520436f72652f6f70746963206c61796572202865646963742d636f72652e6364646c2920616e64207265666572656e636564206279207468650a3b20202020206c616e67756167652f7461726765742d70726f66696c652073706563732e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e0a0a3b2041206e6f726d617469766520737562636f6d706f6e656e74207265666572656e636564206279206964656e7469747920706c7573206469676573742e204d616e696665737473206e657665720a3b20656d626564207468656972206f776e2073656c662d64696765737420696e20746865697220707265696d616765202845444943542d434f52452d53454c46484153482d303031292e0a7265736f757263652d726566203d207b2069643a20747374722c206469676573743a207368613235362d646967657374207d0a0a3b20446967657374732061726520617574686f726974617469766520617320747970656420627974652076616c7565732c206e657665722068657820737472696e67732e20526576696577204a534f4e0a3b2072656e64657273207468697320617320227368613235363a3c3634206c6f77657263617365206865783e22202845444943542d4449474553542d574952452d303031292e0a7368613235362d646967657374203d205b20616c676f726974686d3a2022736861323536222c2062797465733a2062737472202e73697a65203332205d0a0a3b2041206e616d6564206c6f772d6c6576656c206661696c75726520616e206566666563742063616e2072616973652e2054686520736f75726365206f62737472756374696f6e206d61700a3b2062696e64732069742028627920636f6f7264696e6174652920616e6420636f6e73747275637473206120747970656420646f6d61696e206f62737472756374696f6e2066726f6d206974730a3b207061796c6f6164202845444943542d4142492d4641494c5552452d4e414d45442d303031292e0a3b20416e20656666656374277320606566666563744661696c7572657360206c697374204d555354206861766520756e697175652060636f6f7264696e61746560733a2073696e6365207468650a3b206f62737472756374696f6e206d6170206973206b6579656420627920636f6f7264696e6174652c2074776f206661696c757265732073686172696e67206120636f6f7264696e61746520286576656e0a3b207769746820646966666572656e7420617574686f72697479436c6173732f7061796c6f61645479706529206d616b652065786861757374697665206d617070696e6720616e642062696e6465720a3b20747970696e6720616d626967756f757320616e64206172652072656a6563746564202845444943542d4142492d4641494c5552452d554e495155452d303031292e0a3b0a3b2045666665637473206361727279207468656972206661696c757265732061732061206d617020607b206661696c7572652d6964656e74203d3e206566666563742d6661696c7572652d626f6479207d600a3b202873656520746865207461726765742f6c61777061636b2065666665637420736368656d6173292e20546865206661696c75726520636f6f7264696e61746520697320746865206d61700a3b204b45592c20736f206974206973206e6f7420726570656174656420696e2074686520626f647920616e642063616e6e6f74206469736167726565207769746820746865206b65792e0a6566666563742d6661696c7572652d626f6479203d207b0a2020617574686f72697479436c6173733a20617574686f726974792d636c6173732c0a20207061796c6f6164547970653a20636f72652d747970652d7265662c202020202020202020202020203b2074797065642c20626f756e64656420286d617920626520656d707479207265636f7264290a7d0a0a3b2041206661696c75726520636f6f7264696e617465206d7573742062652061206261726520456469637420606964656e746020286c65747465722f756e64657273636f7265207468656e0a3b206c6574746572732f6469676974732f756e64657273636f7265732920414e44206d757374206e6f742062652061207265736572766564206b6579776f72642028652e672e2060656c7365602c0a3b20606261736973602c20607768657265602c206072657175697265602c2060666f72602c2060696660292e2054686520736f75726365206f62737472756374696f6e2d6d6170204c4853206f6e6c790a3b20616363657074732061206e6f6e2d6b6579776f726420606964656e74602c20736f20612068797068656e2f646f742f6b6579776f726420636f6f7264696e61746520776f756c642062650a3b204142492d76616c69642079657420696d706f737369626c6520746f206d617020657868617573746976656c7920696e20736f757263652e20546865207265676578206361707475726573207468650a3b206c65786963616c2073686170653b206b6579776f7264206578636c7573696f6e20697320616e206164646974696f6e616c2076616c69646174696f6e2072756c650a3b202845444943542d4142492d4641494c5552452d4944454e542d303031292e0a6661696c7572652d6964656e74203d2074737472202e72656765787020225b412d5a612d7a5f5d5b412d5a612d7a302d395f5d2a220a0a6566666563742d6b696e64203d20227265616422202f202263726561746522202f2022656e7375726522202f20227265706c61636522202f202264656c65746522202f0a202020202020202020202020202022617070656e6422202f202272656475636522202f202273656d616e7469632e656d697422202f2022637573746f6d220a0a617574686f726974792d636c617373203d2022646f6d61696e4d61707061626c6522202f20227061727469636970616e744f776e656422202f2022696e746567726974794661756c7422202f0a202020202020202020202020202020202020227265736f757263654661756c7422202f2022696e7465726e616c4661756c74220a0a3b20546865206e6f726d6174697665206c65786963616c20616e642073656d616e746963206772616d6d617220666f7220436f72652074797065207265666572656e636573206c6976657320696e0a3b20535045435f65646963742d6c616e67756167652d76312e6d642e204344444c2063616e2065787072657373206f6e6c792074686520776972652d6c6576656c20746578742073686170652e0a636f72652d747970652d726566203d20747374720a0a3b204120636f72652e7479706573206d6170206b6579206973206e6172726f776572207468616e20612067656e6572616c20636f72652d747970652d7265663a206974206d75737420626520610a3b206e616d6564206964656e746974792c206e6576657220616e20696e7472696e736963206f722063616e6f6e6963616c207374727563747572616c207265666572656e63652e205468650a3b20666f726d616c207370656320616e642065786563757461626c6520436f72652076616c696461746f7220656e666f72636520746861742073656d616e7469632064697374696e6374696f6e2e0a636f72652d6e616d65642d747970652d726566203d20747374720a0a3b20416e206f7065726174696f6e2070726f66696c6520737570706c69657320746865206f707469632074656d706c617465206120436f726520696e74656e74207265736f6c766573206974730a3b206f707469634b696e642f626f756e646172794b696e642f737570706f7274506f6c6963792f6c6f7373446973706f736974696f6e2066726f6d2e205461726765742070726f66696c657320616e640a3b206c61777061636b73207075626c6973682074686573652061732061206d617020607b20636f6f7264696e617465203d3e206f7065726174696f6e2d70726f66696c65207d602c20736f207468650a3b20636f6f7264696e61746520697320746865204b45592c206e6f7420612076616c7565206669656c64202845444943542d4f505449432d54454d504c4154452d4f574e45522d3030312c0a3b2045444943542d4142492d4f5050524f46494c452d554e495155452d303031292e0a6f7065726174696f6e2d70726f66696c65203d207b0a20206f7074696354656d706c6174653a206f707469632d74656d706c6174652c0a20206566666563745072656469636174653a20747374722c20202020202020202020203b20636f6f7264696e617465206f6620746865206f7065726174696f6e2d6d6f6465207072656469636174650a7d0a0a6f707469632d74656d706c617465203d207b0a20206f707469634b696e643a2022726576656c6174696f6e22202f20226166666563745265696e746567726174696f6e222c0a2020626f756e646172794b696e643a202270726f6a656374696f6e22202f2022616666656374222c0a2020737570706f7274506f6c6963793a20747374722c202020202020202020202020203b2063616e6f6e6963616c20737570706f72742d706f6c69637920636f6f7264696e6174650a20206c6f7373446973706f736974696f6e3a20747374722c20202020202020202020203b2063616e6f6e6963616c206c6f73732d646973706f736974696f6e20636f6f7264696e6174650a20203f20626173697354656d706c6174653a20747374722c20202020202020202020203b206f7074696f6e616c206469676573742d6c6f636b65642062617369732074656d706c61746520636f6f72640a20203b2074686520617065727475726520726571756972656d656e7420746869732074656d706c61746520737570706c6965732e205265717569726564207768656e207468652074656d706c6174650a20203b2069732074686520736f75726365206f66206120436f7265206f707469632773206170657274757265526571756972656d656e742028692e652e2074686520696e74656e7420686173206e6f0a20203b20736f757263652060666f6f747072696e74203c3d202e2e2e60292c2073696e6365206170657274757265526571756972656d656e74206973206d616e6461746f727920696e20436f72650a20203b202845444943542d4f505449432d41504552545552452d5245462d303031292e0a20203f206170657274757265526571756972656d656e743a2061706572747572652d726571756972656d656e742c0a7d0a0a3b206170657274757265526571756972656d656e742069732061207479706564207265666572656e63652c206e65766572206120667265652d666f726d20737472696e672e2041207265766965770a3b2072656e646572696e67206d61792073686f772069747320636f6f7264696e617465202845444943542d4f505449432d41504552545552452d5245462d303031292e0a61706572747572652d726571756972656d656e74203d20666f6f747072696e742d6365696c696e672d726566202f2061627374726163742d666f6f747072696e742d6f626c69676174696f6e2d7265660a666f6f747072696e742d6365696c696e672d726566203d207b206b696e643a2022666f6f747072696e744365696c696e67222c207265663a2074737472207d0a61627374726163742d666f6f747072696e742d6f626c69676174696f6e2d726566203d207b206b696e643a20226162737472616374466f6f747072696e744f626c69676174696f6e222c207265663a2074737472207d0a0a3b202d2d2d2065646963742d636f72652e6364646c202d2d2d0a3b2065646963742d636f72652e6364646c0a3b204e6f726d617469766520736368656d6120666f722074686520456469637420436f72652076312073656d616e746963206d6f64656c2e0a3b0a3b2053636f706520626f756e646172793a20746869732066696c6520646566696e657320436f7265206d65616e696e6720616e6420736368656d61207368617065206f6e6c792e20497420646f65730a3b206e6f7420646566696e6520612063616e6f6e6963616c20656e636f6465722c20436f7265206d6f64756c652068617368206669656c64732c20686173682066697874757265732c207461726765740a3b206c6f776572696e672c2061646d697373696f6e2062756e646c65732c206f72207461726765742d6f776e65642049522e0a0a636f72652d6d6f64756c65203d207b0a202061706956657273696f6e3a202265646963742e636f72652f7631222c0a2020636f6f7264696e6174653a20747374722c0a2020696d706f7274733a205b2a20636f72652d696d706f72745d2c0a202074797065733a207b202a20636f72652d6e616d65642d747970652d726566203d3e20636f72652d74797065207d2c0a20203f2066756e6374696f6e733a207b202b2074737472203d3e20636f72652d736f757263652d66756e6374696f6e207d2c0a2020696e74656e74733a207b202b2074737472203d3e20636f72652d696e74656e74207d2c0a20207265717569726564436f72654361706162696c69746965733a205b2a20747374725d2c0a7d0a0a636f72652d696d706f7274203d207b0a20206b696e643a20226c61777061636b22202f202274617267657422202f2022636f726522202f20226361706162696c697479222c0a20207265663a207265736f757263652d7265662c0a20203f20616c6961733a20747374722c0a7d0a0a3b202d2d2d207479706573202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a636f72652d74797065203d20636f72652d7363616c61722d74797065202f20636f72652d7265636f72642d74797065202f20636f72652d76617269616e742d74797065202f0a202020202020202020202020636f72652d6f7074696f6e2d74797065202f20636f72652d6c6973742d74797065202f20636f72652d6d61702d74797065202f0a202020202020202020202020636f72652d6361706162696c6974792d7265662d74797065202f20636f72652d65787465726e616c2d616374696f6e2d726571756573742d74797065202f0a202020202020202020202020636f72652d6e6f6d696e616c2d747970650a0a636f72652d7363616c61722d74797065203d20636f72652d626f6f6c2d74797065202f20636f72652d696e742d74797065202f20636f72652d737472696e672d74797065202f0a20202020202020202020202020202020202020636f72652d62797465732d74797065202f20636f72652d756e69742d747970650a0a636f72652d626f6f6c2d74797065203d207b206b696e643a2022426f6f6c22207d0a636f72652d756e69742d74797065203d207b206b696e643a2022556e697422207d0a636f72652d696e742d74797065203d207b0a20206b696e643a202249363422202f202255363422202f202249333222202f202255333222202f202249313622202f202255313622202f2022493822202f20225538222c0a7d0a636f72652d737472696e672d74797065203d207b0a20206b696e643a2022537472696e67222c0a20206d61783a2075696e742c0a202063616e6f6e6963616c3a2022756e69636f64652d7363616c61722d6e666322202f20227261772d75746638222c0a7d0a636f72652d62797465732d74797065203d207b0a20206b696e643a20224279746573222c0a20203f206d696e3a2075696e742c0a20206d61783a2075696e742c0a7d0a636f72652d6e6f6d696e616c2d74797065203d207b0a20206b696e643a20224e6f6d696e616c222c0a2020636f6e74726163743a20747374722c0a2020726570726573656e746174696f6e3a20636f72652d747970652d7265662c0a7d0a636f72652d7265636f72642d74797065203d207b0a20206b696e643a20225265636f7264222c0a20206669656c64733a207b202a2074737472203d3e20636f72652d747970652d726566207d2c0a7d0a636f72652d76617269616e742d74797065203d207b0a20206b696e643a202256617269616e74222c0a202063617365733a207b202b2074737472203d3e2076617269616e742d636173652d626f6479207d2c0a7d0a76617269616e742d636173652d626f6479203d207b0a20203f207061796c6f61643a20636f72652d747970652d7265662c0a7d0a636f72652d6f7074696f6e2d74797065203d207b0a20206b696e643a20224f7074696f6e222c0a20206974656d3a20636f72652d747970652d7265662c0a7d0a636f72652d6c6973742d74797065203d207b0a20206b696e643a20224c697374222c0a20206974656d3a20636f72652d747970652d7265662c0a20206d61783a2075696e742c0a7d0a636f72652d6d61702d74797065203d207b0a20206b696e643a20224d6170222c0a20206b65793a20636f72652d747970652d7265662c0a202076616c75653a20636f72652d747970652d7265662c0a20206d61783a2075696e742c0a7d0a636f72652d6361706162696c6974792d7265662d74797065203d207b0a20206b696e643a20224361706162696c697479526566222c0a20206974656d3a20636f72652d747970652d7265662c0a7d0a636f72652d65787465726e616c2d616374696f6e2d726571756573742d74797065203d207b0a20206b696e643a202245787465726e616c416374696f6e52657175657374222c0a2020736574746c656d656e743a20636f72652d747970652d7265662c0a7d0a0a3b20636f72652d747970652d72656620697320646566696e656420696e2065646963742d636f6d6d6f6e2e6364646c20616e6420617373656d626c65642077697468207468697320736368656d612e0a0a3b202d2d2d207265666572656e63657320616e642076616c756573202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a3b204c6f63616c206964656e7469747920697320616c7068612d737461626c652e20606964602069732074686520636f6d70696c65722d6f776e6564206c6f63616c20636f6f7264696e6174653b0a3b2060616c7068614e616d656020697320746865206e6f726d616c697a65642068756d616e2f6465627567206e616d652e20536f757263652062696e646572207370656c6c696e67206973206e6f740a3b206964656e746974792e0a6c6f63616c2d726566203d207b0a202069643a20747374722c0a2020616c7068614e616d653a20747374722c0a2020747970653a20636f72652d747970652d7265662c0a7d0a0a636f72652d76616c7565203d20636f72652d6e756c6c2d76616c7565202f20636f72652d626f6f6c2d76616c7565202f20636f72652d696e742d76616c7565202f0a20202020202020202020202020636f72652d737472696e672d76616c7565202f20636f72652d62797465732d76616c7565202f20636f72652d7265636f72642d76616c7565202f0a20202020202020202020202020636f72652d76617269616e742d76616c7565202f20636f72652d6c6973742d76616c7565202f20636f72652d6d61702d76616c7565202f0a20202020202020202020202020636f72652d6361706162696c6974792d76616c75650a0a636f72652d6e756c6c2d76616c7565203d207b206b696e643a20226e756c6c22207d0a636f72652d626f6f6c2d76616c7565203d207b206b696e643a2022626f6f6c222c2076616c75653a20626f6f6c207d0a636f72652d696e742d76616c7565203d207b206b696e643a2022696e74222c2077696474683a20747374722c2076616c75653a20696e74207d0a636f72652d737472696e672d76616c7565203d207b206b696e643a2022737472696e67222c2076616c75653a2074737472207d0a636f72652d62797465732d76616c7565203d207b206b696e643a20226279746573222c2076616c75653a2062737472207d0a636f72652d7265636f72642d76616c7565203d207b206b696e643a20227265636f7264222c206669656c64733a207b202a2074737472203d3e20636f72652d76616c7565207d207d0a636f72652d76617269616e742d76616c7565203d207b0a20206b696e643a202276617269616e74222c0a2020747970653a20636f72652d747970652d7265662c0a2020636173653a20747374722c0a20203f207061796c6f61643a20636f72652d76616c75652c0a7d0a636f72652d6c6973742d76616c7565203d207b206b696e643a20226c697374222c2076616c7565733a205b2a20636f72652d76616c75655d207d0a636f72652d6d61702d76616c7565203d207b206b696e643a20226d6170222c20656e74726965733a205b2a205b6b65793a20636f72652d76616c75652c2076616c75653a20636f72652d76616c75655d5d207d0a636f72652d6361706162696c6974792d76616c7565203d207b0a20206b696e643a20226361706162696c697479222c0a2020726563656970743a207368613235362d6469676573742c0a7d0a0a3b2045646963742d617574686f72656420707572652068656c70657273207573652061207075726520436f72652066756e6374696f6e20626f64792e2054686520626f64792063616e2062696e640a3b20707572652065787072657373696f6e7320616e642072657475726e20616e2065787072657373696f6e2c206275742069742063616e6e6f7420636f6e7461696e20436f7265206566666563742c0a3b2067756172642c206272616e63682c206c6f6f702c206d617463682d6e6f64652c206f722070726f6f662d6f626c69676174696f6e206e6f6465732e0a3b20536f757263652d6f776e65642066756e6374696f6e7320757365207468652073616d65207075726520626f647920616c67656272612c207769746820746865697220726573756c7420747970650a3b2061757468656e746963617465642062792074686520656e636c6f73696e67206d6f64756c652e20416e20656d7074792066756e6374696f6e207461626c65206973206f6d69747465642e0a636f72652d736f757263652d66756e6374696f6e203d207b0a2020706172616d733a205b2a206c6f63616c2d7265665d2c0a202072657475726e547970653a20636f72652d747970652d7265662c0a2020626f64793a20636f72652d707572652d626c6f636b2c0a7d0a0a636f72652d666e2d626f6479203d207b0a2020706172616d733a205b2a206c6f63616c2d7265665d2c0a2020626f64793a20636f72652d707572652d626c6f636b2c0a7d0a0a636f72652d707572652d626c6f636b203d207b0a20206c6f63616c733a205b2a206c6f63616c2d7265665d2c0a202062696e64696e67733a205b2a20707572652d6c65742d6e6f64655d2c0a2020726573756c743a20636f72652d657870722c0a7d0a0a707572652d6c65742d6e6f6465203d207b0a20206b696e643a20226c6574222c0a202062696e64696e673a206c6f63616c2d7265662c0a202076616c75653a20636f72652d657870722c0a7d0a0a3b202d2d2d2065787072657373696f6e7320616e642070726564696361746573202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a636f72652d65787072203d206c6f63616c2d65787072202f20636f6e73742d65787072202f207265636f72642d65787072202f206669656c642d65787072202f0a20202020202020202020202076617269616e742d65787072202f206d617463682d65787072202f2063616c6c2d65787072202f206c6973742d65787072202f206d61702d65787072202f0a20202020202020202020202069662d657870720a0a6c6f63616c2d65787072203d207b206b696e643a20226c6f63616c222c207265663a206c6f63616c2d726566207d0a636f6e73742d65787072203d207b206b696e643a2022636f6e7374222c2076616c75653a20636f72652d76616c7565207d0a7265636f72642d65787072203d207b206b696e643a20227265636f7264222c206669656c64733a207b202a2074737472203d3e20636f72652d65787072207d207d0a6669656c642d65787072203d207b206b696e643a20226669656c64222c20626173653a20636f72652d657870722c206669656c643a2074737472207d0a76617269616e742d65787072203d207b0a20206b696e643a202276617269616e74222c0a2020747970653a20636f72652d747970652d7265662c0a2020636173653a20747374722c0a20203f207061796c6f61643a20636f72652d657870722c0a7d0a6d617463682d65787072203d207b0a20206b696e643a20226d61746368222c0a20207363727574696e65653a20636f72652d657870722c0a202061726d733a205b2b206d617463682d61726d5d2c0a7d0a6d617463682d61726d203d207b0a2020636173653a20747374722c0a20203f2062696e6465723a206c6f63616c2d7265662c0a2020626f64793a20636f72652d657870722c0a7d0a63616c6c2d65787072203d207b0a20206b696e643a202263616c6c222c0a202063616c6c65653a20747374722c0a202074797065417267733a205b2a20636f72652d747970652d7265665d2c0a2020617267733a205b2a20636f72652d657870725d2c0a7d0a6c6973742d65787072203d207b206b696e643a20226c697374222c2076616c7565733a205b2a20636f72652d657870725d207d0a6d61702d65787072203d207b206b696e643a20226d6170222c20656e74726965733a205b2a205b6b65793a20636f72652d657870722c2076616c75653a20636f72652d657870725d5d207d0a69662d65787072203d207b0a20206b696e643a20226966222c0a20207072656469636174653a20636f72652d7072656469636174652c0a20207468656e3a20636f72652d657870722c0a2020656c73653a20636f72652d657870722c0a7d0a0a636f72652d707265646963617465203d20747275652d707265646963617465202f2066616c73652d707265646963617465202f206e6f742d707265646963617465202f0a2020202020202020202020202020202020616c6c2d707265646963617465202f20616e792d707265646963617465202f20636f6d706172652d707265646963617465202f0a202020202020202020202020202020202063616c6c2d707265646963617465202f206f62737472756374696f6e2d7072656469636174650a0a747275652d707265646963617465203d207b206b696e643a20227472756522207d0a66616c73652d707265646963617465203d207b206b696e643a202266616c736522207d0a6e6f742d707265646963617465203d207b206b696e643a20226e6f74222c2076616c75653a20636f72652d707265646963617465207d0a616c6c2d707265646963617465203d207b206b696e643a2022616c6c222c2076616c7565733a205b2b20636f72652d7072656469636174655d207d0a616e792d707265646963617465203d207b206b696e643a2022616e79222c2076616c7565733a205b2b20636f72652d7072656469636174655d207d0a636f6d706172652d707265646963617465203d207b0a20206b696e643a2022636f6d70617265222c0a20206f703a20223d3d22202f2022213d22202f20223c22202f20223c3d22202f20223e22202f20223e3d222c0a20206c6566743a20636f72652d657870722c0a202072696768743a20636f72652d657870722c0a7d0a63616c6c2d707265646963617465203d207b0a20206b696e643a202263616c6c222c0a20207072656469636174653a20747374722c0a2020617267733a205b2a20636f72652d657870725d2c0a7d0a6f62737472756374696f6e2d707265646963617465203d207b0a20206b696e643a20226f62737472756374696f6e222c0a2020636f6f7264696e6174653a206661696c7572652d6964656e742c0a20207061796c6f61643a20636f72652d657870722c0a7d0a0a696e7075742d636f6e73747261696e74203d207b0a2020636f6f7264696e6174653a20747374722c0a2020736f757263653a2022776865726522202f2022636f6d70696c6572222c0a20207072656469636174653a20636f72652d7072656469636174652c0a7d0a0a3b202d2d2d20696e74656e74732c20626c6f636b732c20616e64206e6f646573202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a636f72652d696e74656e74203d207b0a2020696e7075743a20636f72652d747970652d7265662c0a20206f75747075743a20636f72652d747970652d7265662c0a202072657175697265644f7065726174696f6e50726f66696c653a20747374722c0a20203f2062617369733a20636f72652d657870722c0a2020696e707574436f6e73747261696e74733a205b2a20696e7075742d636f6e73747261696e745d2c0a2020636f72654576616c756174696f6e4275646765743a20636f72652d6275646765742c0a2020626f64793a20636f72652d626c6f636b2c0a20203f206f707469633a20636f72652d6f707469632c0a7d0a0a636f72652d627564676574203d207b0a20206d617853746570733a2075696e742c0a20206d6178416c6c6f636174656442797465733a2075696e742c0a20206d61784f757470757442797465733a2075696e742c0a7d0a0a636f72652d6f70746963203d207b0a20206f707469634b696e643a2022726576656c6174696f6e22202f20226166666563745265696e746567726174696f6e222c0a2020626f756e646172794b696e643a202270726f6a656374696f6e22202f2022616666656374222c0a20206170657274757265526571756972656d656e743a2061706572747572652d726571756972656d656e742c0a2020737570706f7274506f6c6963793a20747374722c0a20206c6f7373446973706f736974696f6e3a20747374722c0a7d0a0a636f72652d626c6f636b203d207b0a20206c6f63616c733a205b2a206c6f63616c2d7265665d2c0a20206e6f6465733a205b2a20636f72652d6e6f64655d2c0a2020726573756c743a20636f72652d657870722c0a7d0a0a636f72652d6e6f6465203d206c65742d6e6f6465202f20726571756972652d6e6f6465202f206566666563742d6e6f6465202f0a20202020202020202020202065787465726e616c2d616374696f6e2d726571756573742d6e6f6465202f2067756172642d6e6f6465202f206272616e63682d6e6f6465202f0a202020202020202020202020666f722d6e6f6465202f206d617463682d6e6f6465202f2070726f6f662d6f626c69676174696f6e2d6e6f64650a0a6c65742d6e6f6465203d207b0a20206b696e643a20226c6574222c0a202062696e64696e673a206c6f63616c2d7265662c0a202076616c75653a20636f72652d657870722c0a7d0a726571756972652d6e6f6465203d207b0a20206b696e643a202272657175697265222c0a20207072656469636174653a20636f72652d7072656469636174652c0a20206f6e4661696c7572653a20726571756972652d6661696c7572652d61726d2c0a7d0a726571756972652d6661696c7572652d61726d203d207465726d696e616c2d726571756972652d6661696c757265202f0a20202020202020202020202020202020202020202020636f6e74696e75652d6f6273747275637465642d726571756972652d6661696c7572650a7465726d696e616c2d726571756972652d6661696c757265203d207b0a20206b696e643a20227465726d696e616c222c0a2020726561736f6e3a206f62737472756374696f6e2d726561736f6e2c0a7d0a636f6e74696e75652d6f6273747275637465642d726571756972652d6661696c757265203d207b0a20206b696e643a2022636f6e74696e75654f627374727563746564222c0a2020726561736f6e3a206f62737472756374696f6e2d726561736f6e2c0a7d0a6f62737472756374696f6e2d726561736f6e203d207b0a2020726561736f6e4b696e643a20747374722c0a20207061796c6f61643a207b202a2074737472203d3e20636f72652d65787072207d2c0a7d0a6566666563742d6e6f6465203d207b0a20206b696e643a2022656666656374222c0a202062696e64696e673a206c6f63616c2d7265662c0a20206566666563743a20747374722c0a2020696e7075743a20636f72652d657870722c0a20206f62737472756374696f6e4d61703a207b202a206661696c7572652d6964656e74203d3e206f62737472756374696f6e2d61726d207d2c0a7d0a65787465726e616c2d616374696f6e2d726571756573742d6e6f6465203d207b0a20206b696e643a202265787465726e616c416374696f6e52657175657374222c0a202062696e64696e673a206c6f63616c2d7265662c0a20206f7065726174696f6e3a207265736f757263652d7265662c0a2020696e707574547970653a20636f72652d747970652d7265662c0a2020736574746c656d656e74547970653a20636f72652d747970652d7265662c0a2020696e707574536368656d613a207265736f757263652d7265662c0a2020736574746c656d656e74536368656d613a207265736f757263652d7265662c0a2020696e7075743a20636f72652d657870722c0a2020617574686f7269747953636f70653a20636f72652d657870722c0a202062617369733a20636f72652d657870722c0a20206275646765743a2065787465726e616c2d616374696f6e2d6275646765742c0a20207265636f6e63696c696174696f6e4c61773a207265736f757263652d7265662c0a202073746174653a20226177616974696e67536574746c656d656e74222c0a2020736574746c656d656e7441646d697373696f6e3a2022736368656d615265717569726564222c0a7d0a65787465726e616c2d616374696f6e2d627564676574203d207b0a20206d6178536574746c656d656e7442797465733a20636f72652d657870722c0a20206d6178417474656d7074733a20636f72652d657870722c0a7d0a6f62737472756374696f6e2d61726d203d207b0a202062696e6465723a206c6f63616c2d7265662c0a202076616c75653a20636f72652d657870722c0a7d0a67756172642d6e6f6465203d207b0a20206b696e643a20226775617264222c0a20207072656469636174653a20636f72652d7072656469636174652c0a20206f62737472756374696f6e3a20636f72652d657870722c0a7d0a6272616e63682d6e6f6465203d207b0a20206b696e643a20226272616e6368222c0a20203f2062696e64696e673a206c6f63616c2d7265662c0a20207072656469636174653a20636f72652d7072656469636174652c0a20207468656e3a20636f72652d626c6f636b2c0a2020656c73653a20636f72652d626c6f636b2c0a7d0a666f722d6e6f6465203d207b0a20206b696e643a2022666f72222c0a202062696e6465723a206c6f63616c2d7265662c0a2020697465723a20636f72652d657870722c0a2020626f756e643a20636f72652d626f756e642c0a2020626f64793a20636f72652d626c6f636b2c0a7d0a6d617463682d6e6f6465203d207b0a20206b696e643a20226d61746368222c0a20207363727574696e65653a20636f72652d657870722c0a202061726d733a205b2b206d617463682d626c6f636b2d61726d5d2c0a7d0a6d617463682d626c6f636b2d61726d203d207b0a2020636173653a20747374722c0a20203f2062696e6465723a206c6f63616c2d7265662c0a2020626f64793a20636f72652d626c6f636b2c0a7d0a70726f6f662d6f626c69676174696f6e2d6e6f6465203d207b0a20206b696e643a202270726f6f66222c0a2020636f6f7264696e6174653a20747374722c0a20207072656469636174653a20636f72652d7072656469636174652c0a7d0a0a636f72652d626f756e64203d206c69746572616c2d626f756e64202f20636f6f7264696e6174652d626f756e640a6c69746572616c2d626f756e64203d207b206b696e643a20226c69746572616c222c2076616c75653a2075696e74207d0a636f6f7264696e6174652d626f756e64203d207b206b696e643a2022636f6f7264696e617465222c207265663a2074737472207d0a0a3b20536861726564207265736f757263652d7265662c207368613235362d6469676573742c206661696c7572652d6964656e742c2061706572747572652d726571756972656d656e742c0a3b20636f72652d747970652d7265662c20616e6420636f72652d6e616d65642d747970652d7265662061726520646566696e6564206f6e636520696e2065646963742d636f6d6d6f6e2e6364646c2e0a0a3b202d2d2d2065646963742d6c61777061636b2e6364646c202d2d2d0a3b2065646963742d6c61777061636b2e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f7220746865204564696374206c61777061636b206d616e696665737420616e64206578706f727420737572666163652e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e204a534f4e20696e207468652070726f73652073706563730a3b2069732061207265766965772072656e646572696e672067656e6572617465642066726f6d207468697320736368656d61202845444943542d4142492d4e4f4455502d303031292e0a0a6c61777061636b2d6d616e6966657374203d207b0a202061706956657273696f6e3a202265646963742e6c61777061636b2f7631222c0a202069643a20747374722c0a202076657273696f6e3a20747374722c0a20206163636570746564436f72654162693a205b2b20747374725d2c0a2020646570656e64656e636965733a205b2a206c61777061636b2d6465705d2c202020202020202020203b20616379636c69632c206469676573742d6c6f636b6564202845444943542d4c41575041434b2d4441472d303031290a20206578706f7274733a207265736f757263652d7265662c0a20203f2074617267657441646170746572733a205b2b207461726765742d616461707465725d2c2020203b207265717569726564206f6e6c7920696620616e792072756e74696d6520656666656374206578697374730a20203f2068656c706572436f6d706f6e656e743a2065786563757461626c652d636f6d706f6e656e742c203b2065786563757461626c652068656c70657273206361727279207468656972206f776e2073616e64626f782b6675656c0a202076657269666965723a2076657269666965722c202020202020202020202020202020202020202020203b20636c61737369666965643a206465636c61726174697665206f722065786563757461626c650a2020636f6d7061746962696c6974793a207265736f757263652d7265662c0a2020636f6e666f726d616e636546697874757265436f727075733a207265736f757263652d7265662c0a7d0a0a3b2041207665726966696572206973206569746865722061206465636c617261746976652072756c6573657420286e6f2072756e74696d6529206f7220616e2065786563757461626c650a3b20636f6d706f6e656e742e20416e2065786563757461626c65207665726966696572204d55535420636172727920697473206f776e2073616e64626f7820616e64206675656c206d6f64656c2c0a3b20736f2074686520736368656d6120656e666f726365732074686174206e6f2065786563757461626c6520636f6d706f6e656e74206973206c65667420756e626f756e6465640a3b202845444943542d4142492d56455249464945522d424f554e442d303031292e0a7665726966696572203d206465636c617261746976652d7665726966696572202f2065786563757461626c652d76657269666965720a6465636c617261746976652d7665726966696572203d207b20636c6173733a20226465636c61726174697665222c2072756c657365743a207265736f757263652d726566207d0a65786563757461626c652d7665726966696572203d207b0a2020636c6173733a202265786563757461626c65222c0a2020636f6d706f6e656e743a207265736f757263652d7265662c0a202073616e64626f783a207265736f757263652d7265662c0a20206675656c4d6f64656c3a207265736f757263652d7265662c0a7d0a0a3b20416e792065786563757461626c6520636f6d706f6e656e7420697320626f756e64656420627920697473206f776e2073616e64626f78202b206675656c206d6f64656c2e0a65786563757461626c652d636f6d706f6e656e74203d207b0a2020636f6d706f6e656e743a207265736f757263652d7265662c0a202073616e64626f783a207265736f757263652d7265662c0a20206675656c4d6f64656c3a207265736f757263652d7265662c0a7d0a0a6c61777061636b2d646570203d207b2069643a20747374722c2076657273696f6e3a20747374722c206469676573743a207368613235362d646967657374207d0a0a3b20416461707465722073656c656374696f6e206b65797320534f4c454c59206f666620746865206469676573742d6c6f636b65642060616363657074656454617267657450726f66696c65600a3b20286974732060696460206973207468652070726f66696c652069643b206974732060646967657374602070696e73207468652065786163742070726f66696c652f76657273696f6e292e2054686572650a3b20617265206e6f20696e646570656e64656e7420646973706c617920737472696e6773207468617420636f756c64206469736167726565207769746820746865206c6f636b2c20736f20610a3b207265736f6c7665722063616e6e6f742062696e6420616e206164617074657220746f206f6e6520746172676574207768696c6520746865206c6f636b2070726f76657320616e6f746865720a3b202845444943542d4c41575041434b2d414441505445522d54415247455449522d303031292e0a7461726765742d61646170746572203d207b0a2020616363657074656454617267657450726f66696c653a207265736f757263652d7265662c202020203b206469676573742d6c6f636b65642c20617574686f72697461746976652073656c6563746f720a2020616363657074656454617267657449723a207265736f757263652d7265662c2020202020202020203b206469676573742d6c6f636b65640a2020616461707465723a207265736f757263652d7265662c0a7d0a0a3b20536861726564207479706573207265736f757263652d72656620616e64207368613235362d6469676573742061726520646566696e6564206f6e636520696e0a3b2065646963742d636f6d6d6f6e2e6364646c20616e6420617373656d626c65642077697468207468697320736368656d61202845444943542d4142492d4e4f4455502d303031292e0a0a3b202d2d2d206578706f72742073757266616365202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a6c61777061636b2d6578706f727473203d207b0a202074797065733a205b2a206578706f727465642d747970655d2c0a2020636f6e7374616e74733a205b2a206578706f727465642d636f6e7374616e745d2c0a20207075726546756e6374696f6e733a205b2a20707572652d66756e6374696f6e5d2c0a2020656666656374733a205b2a2073656d616e7469632d6566666563745d2c0a20206f62737472756374696f6e733a205b2a206f62737472756374696f6e2d6465665d2c0a20203b206b65796564206279206f7065726174696f6e2d70726f66696c6520636f6f7264696e61746520e2869220756e697175656e65737320656e666f726365640a20203b202845444943542d4142492d4f5050524f46494c452d554e495155452d303031290a20203b206f7065726174696f6e2d70726f66696c65207265636f7264732074686973206c61777061636b206578706f72747320286f707469632074656d706c6174657320746861740a20203b2060696d706c656d656e7473602f6070726f66696c656020636c6175736573207265736f6c766520616761696e7374292e206f7065726174696f6e2d70726f66696c652069730a20203b20646566696e656420696e2065646963742d636f6d6d6f6e2e6364646c202845444943542d4142492d4f5050524f46494c452d534c4f542d303031292e0a20206f7065726174696f6e50726f66696c65733a207b202a2074737472203d3e206f7065726174696f6e2d70726f66696c65207d2c20203b206b6579656420627920636f6f7264696e6174650a7d0a0a6578706f727465642d7479706520202020203d207b20636f6f7264696e6174653a20747374722c20646566696e6974696f6e3a20636f72652d747970652d726566207d0a6578706f727465642d636f6e7374616e74203d207b20636f6f7264696e6174653a20747374722c20747970653a20636f72652d747970652d7265662c2076616c75653a20616e79207d0a0a3b204120707572652068656c7065722069732061206469736372696d696e6174656420756e696f6e2062792060736f75726365602c20736f2074686520736368656d6120697473656c660a3b2067756172616e7465657320616e20696d706c656d656e746174696f6e20657869737473202845444943542d4c41575041434b2d505552452d494d504c2d303031293a0a3b2020202d20226564696374223a20617574686f72656420696e2045646963742f436f72653b2074686520436f726520626f6479206973206361727269656420696e6c696e6520286861736865640a3b20202020207769746820746865206578706f72742073757266616365292e2054686520736368656d61207265717569726573207468652060626f647960206669656c642e0a3b2020202d2022636f6d706f6e656e74223a20696d706c656d656e746564206f7574736964652045646963743b2063617272696573206e6f20696e6c696e6520626f647920616e6420696e73746561640a3b20202020206361727269657320697473206f776e206469676573742d6c6f636b65642060696d706c656d656e746174696f6e60202873616e64626f78202b206675656c292e20497420646f65730a3b20202020206e6f7420646570656e64206f6e20746865206f7074696f6e616c206d616e69666573742d6c6576656c2068656c706572436f6d706f6e656e742e0a707572652d66756e6374696f6e203d2065646963742d707572652d66756e6374696f6e202f20636f6d706f6e656e742d707572652d66756e6374696f6e0a0a707572652d66756e6374696f6e2d636f6d6d6f6e203d20280a2020636f6f7264696e6174653a20747374722c0a202074797065506172616d65746572733a205b2a20747374725d2c0a2020706172616d6574657254797065733a205b2a20636f72652d747970652d7265665d2c2020202020203b20616c6c20626f756e6465640a202072657475726e547970653a20636f72652d747970652d7265662c20202020202020202020202020203b20626f756e6465640a2020636f737454656d706c6174653a20747374722c0a202064657465726d696e69736d436c6173733a2022746f74616c22202f2022746f74616c2d776974682d74797065642d646961676e6f73746963222c0a290a0a65646963742d707572652d66756e6374696f6e203d207b0a2020707572652d66756e6374696f6e2d636f6d6d6f6e2c0a2020736f757263653a20226564696374222c0a2020626f64793a20636f72652d666e2d626f64792c2020202020202020202020202020202020202020203b20696e6c696e652c20686173682d7369676e69666963616e740a7d0a0a636f6d706f6e656e742d707572652d66756e6374696f6e203d207b0a2020707572652d66756e6374696f6e2d636f6d6d6f6e2c0a2020736f757263653a2022636f6d706f6e656e74222c0a20203b20746865206469676573742d6c6f636b656420636f6d706f6e656e7420696d706c656d656e74696e6720746869732068656c7065722e2052657175697265642061742074686520736368656d610a20203b206c6576656c20736f206120636f6d706f6e656e742068656c7065722063616e206e657665722076616c696461746520776974686f7574206120686173682d626f756e642c0a20203b2073616e64626f782b6675656c2d64657363726962656420696d706c656d656e746174696f6e202845444943542d4c41575041434b2d505552452d494d504c2d303031292e0a2020696d706c656d656e746174696f6e3a2065786563757461626c652d636f6d706f6e656e742c0a7d0a0a3b20636f72652d666e2d626f647920697320646566696e65642062792065646963742d636f72652e6364646c20616e6420617373656d626c656420776974682074686973206c61777061636b0a3b20736368656d612e2049742069732061207075726520436f72652066756e6374696f6e20626f64792c206e6f7420616e206566666563742d63617061626c6520636f72652d626c6f636b2e0a0a73656d616e7469632d656666656374203d207b0a2020636f6f7264696e6174653a20747374722c0a202074797065506172616d65746572733a205b2a20747374725d2c0a2020696e707574547970653a20636f72652d747970652d7265662c2020202020202020202020202020203b20626f756e6465640a20206f7574707574547970653a20636f72652d747970652d7265662c20202020202020202020202020203b20626f756e6465640a2020657865637574696f6e436c6173733a202270726f6f664f6e6c7922202f202272756e74696d65222c2020203b206f7274686f676f6e616c20746f207772697465436c6173730a20206566666563744b696e6448696e743a206566666563742d6b696e642c0a2020666f6f747072696e744f626c69676174696f6e3a20747374722c0a2020636f73744f626c69676174696f6e3a20747374722c0a20206566666563744661696c757265733a207b202a206661696c7572652d6964656e74203d3e206566666563742d6661696c7572652d626f6479207d2c20203b206b6579656420627920636f6f7264696e6174653b20756e697175650a20206775617264537570706f72743a20626f6f6c2c0a7d0a0a6f62737472756374696f6e2d646566203d207b0a2020636f6f7264696e6174653a20747374722c0a2020617574686f72697479436c6173733a20617574686f726974792d636c6173732c0a20207061796c6f6164536368656d613a20636f72652d747970652d7265662c20202020202020202020203b2074797065642c20626f756e64656420286d617920626520656d707479207265636f7264290a7d0a0a3b206566666563742d6661696c7572652d626f64792c206566666563742d6b696e642c20617574686f726974792d636c6173732c20616e6420636f72652d747970652d7265662061726520646566696e65640a3b206f6e636520696e2065646963742d636f6d6d6f6e2e6364646c20616e6420617373656d626c65642077697468207468697320736368656d61202845444943542d4142492d4e4f4455502d303031292e0a0a3b202d2d2d2065646963742d6c61777061636b2d616461707465722e6364646c202d2d2d0a3b2065646963742d6c61777061636b2d616461707465722e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f72206f6e6520646972656374206465636c61726174697665206c61777061636b2074617267657420616461707465722e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e0a3b0a3b2054686520656e636c6f73696e67206c61777061636b206d616e69666573742073656c6563747320746865206578616374207461726765742070726f66696c652c207461726765742049522c0a3b20616e642061646170746572207265736f75726365206469676573742e2054686f7365206964656e74697469657320617265206e6f7420726570656174656420686572652e0a0a6c61777061636b2d61646170746572203d207b0a202061706956657273696f6e3a202265646963742e6c61777061636b2d616461707465722f7631222c0a2020636c6173733a20226465636c61726174697665222c0a20206f7065726174696f6e50726f66696c65733a207b0a202020202a2074737472203d3e206c61777061636b2d616461707465722d6f7065726174696f6e2d70726f66696c650a20207d2c0a2020656666656374496d706c656d656e746174696f6e733a207b0a202020202a2074737472203d3e206c61777061636b2d616461707465722d6566666563740a20207d2c0a2020627564676574733a207b0a202020202a2074737472203d3e206c61777061636b2d616461707465722d6275646765740a20207d2c0a7d0a0a3b204b657973206172652063616e6f6e6963616c206c61777061636b206f7065726174696f6e2d70726f66696c6520636f6f7264696e617465732e0a6c61777061636b2d616461707465722d6f7065726174696f6e2d70726f66696c65203d0a20207b0a20202020636f72653a20747374722c0a2020202073656d616e746963456666656374733a205b2b20747374725d2c0a202020203f206275646765744f626c69676174696f6e3a20747374722c0a202020203f20746172676574436f6e66696775726174696f6e3a207265736f757263652d7265662c0a20207d202f0a20207b0a20202020636f72653a20747374722c0a2020202073656d616e746963456666656374733a205b5d2c0a202020206275646765744f626c69676174696f6e3a20747374722c0a20202020746172676574436f6e66696775726174696f6e3a207265736f757263652d7265662c0a20207d0a0a3b204b657973206172652063616e6f6e6963616c206c61777061636b2073656d616e7469632d65666665637420636f6f7264696e617465732e20466f6f747072696e742c20636f73742c20616e640a3b206661696c757265206669656c6473206d7573742065786163746c792064697363686172676520746865206d61746368696e67206578706f72746564206566666563742e0a6c61777061636b2d616461707465722d656666656374203d207b0a2020746172676574496e7472696e7369633a20747374722c0a2020746172676574436f6e66696775726174696f6e3a207265736f757263652d7265662c0a20207772697465436c6173733a206c61777061636b2d616461707465722d77726974652d636c6173732c0a2020666f6f747072696e744f626c69676174696f6e3a20747374722c0a2020636f73744f626c69676174696f6e3a20747374722c0a20206661696c7572654d617070696e67733a207b202a206661696c7572652d6964656e74203d3e2074737472207d2c0a7d0a0a3b204b657973206172652063616e6f6e6963616c206578706f7274656420636f73742d6f626c69676174696f6e20636f6f7264696e617465732e0a6c61777061636b2d616461707465722d627564676574203d207b0a20206d617853746570733a2075696e742c0a20206d6178416c6c6f636174656442797465733a2075696e742c0a20206d61784f757470757442797465733a2075696e742c0a7d0a0a6c61777061636b2d616461707465722d77726974652d636c617373203d20226e6f6e6522202f20227265616422202f202263726561746522202f2022656e7375726522202f0a20202020202020202020202020202020202020202020202020202020202022617070656e6422202f20227265706c61636522202f202264656c65746522202f2022637573746f6d220a0a3b206661696c7572652d6964656e7420697320646566696e656420696e2065646963742d636f6d6d6f6e2e6364646c2e0a0a3b202d2d2d2065646963742d7461726765742d70726f66696c652e6364646c202d2d2d0a3b2065646963742d7461726765742d70726f66696c652e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f7220746865204564696374207461726765742070726f66696c65206d616e69666573742e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76310a3b202873656520535045435f636f6e74696e75756d2d636f6e74726163742d62756e646c652d76312e6d64292e204a534f4e20696e207468652070726f736520737065637320697320610a3b207265766965772072656e646572696e672067656e6572617465642066726f6d207468697320736368656d613b2074686973204344444c206973207468652073696e676c6520736f757263650a3b206f66207472757468202845444943542d4142492d4e4f4455502d303031292e0a0a7461726765742d70726f66696c652d6d616e6966657374203d207b0a202061706956657273696f6e3a202265646963742e7461726765742d70726f66696c652f7631222c0a202069643a20747374722c202020202020202020202020202020202020202020202020203b20652e672e20226563686f2e64706f220a202076657273696f6e3a20747374722c20202020202020202020202020202020202020203b20652e672e202231220a20206163636570746564436f72654162693a205b2b20747374725d2c20202020202020203b20652e672e205b2265646963742e636f72652f7631225d0a0a2020696e7472696e736963733a207265736f757263652d7265662c0a2020696e7472696e7369634e616d6573706163653a20747374722c0a20203b207075626c697368657320746869732070726f66696c652773206f7065726174696f6e2d70726f66696c65207265636f72647320286f707469632074656d706c6174657320746861740a20203b206070726f66696c65602f60696d706c656d656e74736020636c6175736573207265736f6c766520616761696e7374292e205265666572656e63657320616e0a20203b206f7065726174696f6e2d70726f66696c65732d646f63756d656e74202845444943542d4142492d4f5050524f46494c452d534c4f542d303031292e0a20206f7065726174696f6e50726f66696c65733a207265736f757263652d7265662c0a2020666f6f747072696e74416c67656272613a207265736f757263652d7265662c0a2020636f7374416c67656272613a207265736f757263652d7265662c0a202074617267657449723a207265736f757263652d7265662c0a20206f62737472756374696f6e5461786f6e6f6d793a207265736f757263652d7265662c0a202076657269666965723a207265736f757263652d7265662c0a20206c6f77657265723a207265736f757263652d7265662c0a202073616e64626f783a207265736f757263652d7265662c0a20206675656c4d6f64656c3a207265736f757263652d7265662c0a0a20203b206669656c647320746865206c616e67756167652073706563207265717569726573206f662065766572792070726f66696c650a202062756e646c6550726f66696c653a207265736f757263652d7265662c0a202067656e657261746564417274696661637450726f66696c65733a205b2a207265736f757263652d7265665d2c0a202063616e6f6e6963616c456e636f64696e6752756c65733a207265736f757263652d7265662c0a20203b20412070726f66696c65207468617420616363657074732074686520646972656374206465636c61726174697665206c61777061636b2d6164617074657220414249206e616d65732069740a20203b2065786163746c79206f6e63652e2050726f66696c6573207468617420646f206e6f7420636f6e73756d65206c61777061636b206164617074657273206c6561766520746869730a20203b206f7074696f6e616c20736c6f7420616273656e74206f7220656d7074792e0a20203f2061636365707465644c61777061636b416461707465724162693a205b5d202f205b2265646963742e6c61777061636b2d616461707465722f7631225d2c0a2020646961676e6f737469634162693a207265736f757263652d7265662c0a0a20203b206170706c69636174696f6e20646f637472696e650a20206170706c69636174696f6e4d6f64656c3a202261746f6d6963222c0a202072656164436f6e73697374656e63793a20226170706c69636174696f6e2d736e617073686f7422202f20747374722c0a202067756172644576616c756174696f6e3a2022707265636f6d6d69742d61746f6d696322202f20747374722c0a20206f62737472756374696f6e526f6c6c6261636b3a20226e6f2d76697369626c652d6566666563747322202f20747374722c0a20206d756c74695461726765743a20626f6f6c2c0a20203b207768657468657220746865207461726765742063616e206576616c7561746520707265636f6d6d697420706f7374636f6e646974696f6e20286067756172616e746565602920636865636b730a20203b20696e73696465207468652061746f6d6963206170706c69636174696f6e20756e6974202845444943542d5441524745542d504f5354434f4e442d303031290a2020706f7374636f6e646974696f6e537570706f72743a20626f6f6c2c0a0a202064657465726d696e6973746963457865637574696f6e3a207265736f757263652d7265662c0a2020636f6e666f726d616e636546697874757265436f727075733a207265736f757263652d7265662c0a7d0a0a3b20536861726564207479706573207265736f757263652d72656620616e64207368613235362d6469676573742061726520646566696e6564206f6e636520696e0a3b2065646963742d636f6d6d6f6e2e6364646c20616e6420617373656d626c65642077697468207468697320736368656d6120627920746865206275696c640a3b202845444943542d4142492d4e4f4455502d303031292e205468657920617265206e6f74207265646566696e656420686572652e0a0a3b202d2d2d20696e7472696e736963207369676e6174757265202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a3b20546865206172746966616374207265666572656e63656420627920746865206d616e696665737427732060696e7472696e7369637360207265736f757263652d726566206973207468650a3b20696e7472696e7369632d7369676e617475726520636f7270757320646f63756d656e742062656c6f772e20497473206c61796f757420697320666978656420736f2074776f0a3b20696e646570656e64656e742070726f66696c65732076616c69646174652f686173682074686520636f72707573206964656e746963616c6c790a3b202845444943542d4142492d494e5452494e534943532d444f432d303031292e0a0a3b20696e7472696e736963732069732061204d4150206b6579656420627920636f6f7264696e6174652c20736f2074686520736368656d6120697473656c6620656e666f726365730a3b20636f6f7264696e61746520756e697175656e6573732e20412070726f766964657220726563656976657320746865207265736f6c76656420636f7270757320617320610a3b206469676573742d626f756e642073656d616e74696320696e70757420616e64207265736f6c76657320636f6f7264696e617465732077697468696e20746861742061727469666163742e0a3b2045616368206d6170206b6579204d55535420657175616c20697473207265636f726427732060636f6f7264696e61746560206669656c640a3b202845444943542d4142492d494e5452494e5349432d554e495155452d303031292e0a696e7472696e736963732d646f63756d656e74203d207b0a202061706956657273696f6e3a202265646963742e7461726765742d70726f66696c652e696e7472696e736963732f7631222c0a2020696e7472696e736963733a207b202a2074737472203d3e20696e7472696e736963207d2c0a7d0a0a3b20546865206172746966616374207265666572656e63656420627920746865206d616e6966657374277320606f7065726174696f6e50726f66696c657360207265736f757263652d7265662e0a3b206f7065726174696f6e2d70726f66696c65202f206f707469632d74656d706c6174652061726520646566696e656420696e2065646963742d636f6d6d6f6e2e6364646c2e204b657965642062790a3b20636f6f7264696e61746520736f207265736f6c7574696f6e2063616e2774207069636b206265747765656e2074776f2073616d652d636f6f7264696e6174652070726f66696c65730a3b202845444943542d4142492d4f5050524f46494c452d534c4f542d3030312c2045444943542d4142492d4f5050524f46494c452d554e495155452d303031292e0a6f7065726174696f6e2d70726f66696c65732d646f63756d656e74203d207b0a202061706956657273696f6e3a202265646963742e7461726765742d70726f66696c652e6f7065726174696f6e2d70726f66696c65732f7631222c0a202070726f66696c65733a207b202a2074737472203d3e206f7065726174696f6e2d70726f66696c65207d2c0a7d0a0a3b2041207479706564207072652d6c6f776572696e67207175657374696f6e20746861742063616e2062652070726f706f73656420627920576174736f6e206f7220616e206167656e7420616e640a3b20636865636b65642062792074686520636f6d70696c65722e2049742069732063616e6f6e6963616c2d43424f5220656e636f64656420756e6465720a3b206065646963742e6c6f776572696e672d726571756972656d656e74732f7631603b2074686520636f6d70696c657220636865636b7320746869732061727469666163742c206e6f74207468650a3b2070726f736520746861742070726f64756365642069742e0a6c6f776572696e672d726571756972656d656e7473203d207b0a202061706956657273696f6e3a202265646963742e6c6f776572696e672d726571756972656d656e74732f7631222c0a20206f7065726174696f6e50726f66696c653a20747374722c0a202073656d616e746963456666656374733a205b2a2073656d616e7469632d6566666563742d726571756972656d656e745d2c0a202072657175697265645772697465436c61737365733a205b2a2077726974652d636c6173735d2c0a202067756172644b696e64733a205b2a2067756172642d6b696e645d2c0a202061746f6d69636974793a2061746f6d69636974792d726571756972656d656e742c0a2020706f7374636f6e646974696f6e537570706f72743a20626f6f6c2c0a20206f62737472756374696f6e436f6f7264696e617465733a205b2a20747374725d2c0a2020666f6f747072696e744f626c69676174696f6e733a205b2a20747374725d2c0a2020636f73744f626c69676174696f6e733a205b2a20747374725d2c0a20206f70746963436f6e74726163743a20747374722c0a7d0a0a73656d616e7469632d6566666563742d726571756972656d656e74203d207b0a2020636f6f7264696e6174653a20747374722c0a20207772697465436c6173733a2077726974652d636c6173732c0a202067756172644b696e64733a205b2a2067756172642d6b696e645d2c0a20206f62737472756374696f6e436f6f7264696e617465733a205b2a20747374725d2c0a2020666f6f747072696e744f626c69676174696f6e733a205b2a20747374725d2c0a2020636f73744f626c69676174696f6e733a205b2a20747374725d2c0a7d0a0a77726974652d636c617373203d20226e6f6e6522202f20227265616422202f202263726561746522202f2022656e7375726522202f2022617070656e6422202f0a2020202020202020202020202020227265706c61636522202f202264656c65746522202f20747374720a67756172642d6b696e64203d2022707265636f6d6d69742d61746f6d696322202f20747374720a61746f6d69636974792d726571756972656d656e74203d202261746f6d696322202f20747374720a0a3b20412067656e75696e6520756e696f6e3a207075726520636f6e7374727563746f7273206361727279206e6f20656666656374206b696e64206f72206661696c757265733b206566666563740a3b20696e7472696e73696373206d757374202845444943542d5441524745542d494e5452494e5349432d434c4153532d303031292e2054686520736368656d6120656e666f7263657320746869732c0a3b206e6f74206120636f6d6d656e742e0a0a3b2054686520696e7472696e736963277320636f6f7264696e6174652069732074686520696e7472696e73696373206d6170204b45592c206e6f7420612076616c7565206669656c642c20736f207468650a3b206b657920616e6420636f6f7264696e6174652063616e206e65766572206469736167726565202845444943542d4142492d494e5452494e5349432d554e495155452d303031292e0a696e7472696e736963203d20707572652d696e7472696e736963202f206566666563742d696e7472696e7369630a0a707572652d696e7472696e736963203d207b0a2020696e7472696e736963436c6173733a202270757265222c0a202074797065506172616d65746572733a205b2a20747374725d2c0a2020617267756d656e7454797065733a205b2a20636f72652d747970652d7265665d2c0a202072657475726e547970653a20636f72652d747970652d7265662c0a20206775617264537570706f72743a2066616c73652c0a2020666f6f747072696e7454656d706c6174653a20747374722c0a2020636f737454656d706c6174653a20747374722c0a20207772697465436c6173733a20226e6f6e65222c0a7d0a0a6566666563742d696e7472696e736963203d207b0a2020696e7472696e736963436c6173733a2022656666656374222c0a202074797065506172616d65746572733a205b2a20747374725d2c0a2020617267756d656e7454797065733a205b2a20636f72652d747970652d7265665d2c0a202072657475726e547970653a20636f72652d747970652d7265662c0a20206566666563744b696e643a206566666563742d6b696e642c0a20203b206d6170206b65796564206279206661696c75726520636f6f7264696e61746520286661696c7572652d6964656e74293b20746865206661696c75726520636f6f7264696e6174652069730a20203b20746865206b65792c206e6f7420612076616c7565206669656c642c20736f20756e697175656e657373206973207374727563747572616c0a20203b202845444943542d4142492d4641494c5552452d554e495155452d303031292e0a20206566666563744661696c757265733a207b202a206661696c7572652d6964656e74203d3e206566666563742d6661696c7572652d626f6479207d2c0a20206775617264537570706f72743a20626f6f6c2c0a2020666f6f747072696e7454656d706c6174653a20747374722c0a2020636f737454656d706c6174653a20747374722c0a20207772697465436c6173733a20227265616422202f202263726561746522202f2022656e7375726522202f2022617070656e6422202f20227265706c61636522202f0a20202020202020202020202020202264656c65746522202f2022637573746f6d222c0a202063616e5061727469636970617465496e41746f6d696347756172643a20626f6f6c2c0a7d0a0a3b206566666563742d6661696c7572652d626f64792c206566666563742d6b696e642c20617574686f726974792d636c6173732c20616e6420636f72652d747970652d7265662061726520646566696e65640a3b206f6e636520696e2065646963742d636f6d6d6f6e2e6364646c20616e6420617373656d626c65642077697468207468697320736368656d61202845444943542d4142492d4e4f4455502d303031292e0a0a3b202d2d2d2065646963742d617574686f726974792d66616374732e6364646c202d2d2d0a3b2065646963742d617574686f726974792d66616374732e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f722074686520666972737420636f6d70696c65722d636f6e7465787420617574686f726974792d666163747320646f63756d656e742e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e0a3b0a3b205468697320736368656d6120697320617373656d626c656420776974682065646963742d636f6d6d6f6e2e6364646c20736f20736f757263652e6469676573742075736573207468650a3b20736861726564207368613235362d6469676573742074797065642076616c75652e204a534f4e2069732061207265766965772f696e7075742072656e646572696e673a206974730a3b20607368613235363a3c3634206865783e6020736f75726365206469676573742069732070726f6a656374656420746f205b60736861323536602c203332207261772062797465735d206f6e0a3b2074686520776972652c20616e64206974732066616374206172726179732070726f6a65637420746f2074686520636f6f7264696e6174652d6b65796564206d6170732062656c6f772e0a0a617574686f726974792d6661637473203d207b0a202061706956657273696f6e3a202265646963742e617574686f726974792d66616374732f7631222c0a2020736f757263653a20617574686f726974792d666163742d736f757263652c0a20206f7065726174696f6e50726f66696c65733a207b202a2074737472203d3e20617574686f726974792d6f7065726174696f6e2d70726f66696c652d66616374207d2c0a20206566666563745772697465436c61737365733a207b202a2074737472203d3e20617574686f726974792d77726974652d636c617373207d2c0a2020627564676574733a207b202a2074737472203d3e20617574686f726974792d6275646765742d66616374207d2c0a7d0a0a617574686f726974792d666163742d736f75726365203d207b0a20206b696e643a20226c61777061636b22202f202274617267657450726f66696c65222c0a2020636f6f7264696e6174653a20747374722c0a20206469676573743a207368613235362d6469676573742c0a7d0a0a3b20546865206d6170206b65792069732074686520736f75726365206f7065726174696f6e2d70726f66696c6520636f6f7264696e6174652e204974206973206e6f7420726570656174656420696e0a3b207468652076616c75652c20736f2061206b657920616e6420656d62656464656420636f6f7264696e6174652063616e6e6f742064697361677265652e20416c6c6f7765642077726974650a3b20636c61737365732061726520612063616e6f6e6963616c206d61702d7365743a2074686520636c6173732069732074686520756e69717565206b657920616e64206e756c6c206973207468650a3b20756e6974206d61726b65722e2043616e6f6e6963616c2043424f52206669786573206b6579206f7264657220776974686f75742061207365636f6e64206f72646572696e672072756c652e0a617574686f726974792d6f7065726174696f6e2d70726f66696c652d66616374203d207b0a2020636f72653a20747374722c0a2020616c6c6f7765645772697465436c61737365733a207b202a20617574686f726974792d77726974652d636c617373203d3e206e756c6c207d2c0a7d0a0a3b20546865206566666563745772697465436c6173736573206d6170206b6579206973207468652073656d616e7469632065666665637420636f6f7264696e6174652e2054686520627564676574730a3b206d6170206b65792069732074686520736f757263652062756467657420636f6f7264696e6174652e2043616e6f6e6963616c2043424f52206d61702d6b657920756e697175656e6573730a3b206d616b6573206475706c6963617465206661637420636f6f7264696e61746573207374727563747572616c6c7920756e726570726573656e7461626c652e0a617574686f726974792d6275646765742d66616374203d207b0a20206d617853746570733a2075696e742c0a20206d6178416c6c6f636174656442797465733a2075696e742c0a20206d61784f757470757442797465733a2075696e742c0a7d0a0a3b20417574686f726974794661637473446f63756d656e7420763120696e74656e74696f6e616c6c792061636365707473206f6e6c792074686520777269746520636c6173736573207468650a3b2063757272656e7420636f6d70696c6572206d6f64656c2063616e20636f6e73756d652e2060637573746f6d602069732074686520736f6c6520763120637573746f6d207370656c6c696e673b0a3b20617262697472617279207461726765742d70726f66696c6520657874656e73696f6e20737472696e677320646f206e6f7420656e746572207468697320636f6d70696c657220706174682e0a617574686f726974792d77726974652d636c617373203d20226e6f6e6522202f20227265616422202f202263726561746522202f2022656e7375726522202f2022617070656e6422202f0a202020202020202020202020202020202020202020202020227265706c61636522202f202264656c65746522202f2022637573746f6d220a0a3b202d2d2d2065646963742d726573756c742d70726f6a656374696f6e2e6364646c202d2d2d0a3b20535044582d4c6963656e73652d4964656e7469666965723a204170616368652d322e300a3b2065646963742d726573756c742d70726f6a656374696f6e2e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f7220636f6d70696c65722d6f776e6564206170706c69636174696f6e2d726573756c742070726f6a656374696f6e732e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e0a0a726573756c742d70726f6a656374696f6e203d207b0a2020736368656d613a202265646963742e726573756c742d70726f6a656374696f6e2f7631222c0a20206f7065726174696f6e436f6f7264696e6174653a20626f756e6465642d70726f6a656374696f6e2d746578742c0a20206f7574707574547970653a20626f756e6465642d70726f6a656374696f6e2d746578742c0a20206d61784f757470757442797465733a2075696e74202e677420302c0a202065787072657373696f6e3a20726573756c742d70726f6a656374696f6e2d657870722c0a7d0a0a726573756c742d70726f6a656374696f6e2d65787072203d20726573756c742d70726f6a656374696f6e2d7265636f7264202f20726573756c742d70726f6a656374696f6e2d736f757263650a0a726573756c742d70726f6a656374696f6e2d7265636f7264203d207b0a20206b696e643a20227265636f7264222c0a20203b2054686520726f6f74207265636f726420636f756e7473206173206f6e65206f66207468652052757374206465636f6465722773203235362065787072657373696f6e206e6f6465732e0a20203b204e657374656420616767726567617465206e6f646520636f756e742072656d61696e7320616e20617574686f7269746174697665206465636f64657220636865636b2e0a20206669656c64733a207b20302a32353520626f756e6465642d70726f6a656374696f6e2d74657874203d3e20726573756c742d70726f6a656374696f6e2d65787072207d2c0a7d0a0a726573756c742d70726f6a656374696f6e2d736f75726365203d207b0a20206b696e643a2022736f75726365222c0a2020736f757263653a20726573756c742d70726f6a656374696f6e2d736f757263652d6b696e642c0a20203b204d617463686573204d41585f524553554c545f50524f4a454354494f4e5f504154485f5345474d454e545320696e2065646963742d73796e7461782e0a2020706174683a205b302a333220626f756e6465642d70726f6a656374696f6e2d746578745d2c0a7d0a0a726573756c742d70726f6a656374696f6e2d736f757263652d6b696e64203d0a20207b206b696e643a20226170706c69636174696f6e496e70757422207d202f0a20207b0a202020206b696e643a20227075726542696e64696e67222c0a2020202062696e64696e6749643a20626f756e6465642d70726f6a656374696f6e2d746578742c0a20207d202f0a20207b0a202020206b696e643a20226361706162696c697479526573756c74222c0a202020207374657049643a20626f756e6465642d70726f6a656374696f6e2d746578742c0a20207d0a0a626f756e6465642d70726f6a656374696f6e2d74657874203d2074737472202e73697a652028312e2e31303234290a0a3b202d2d2d2065646963742d7461726765742d69722e6364646c202d2d2d0a3b20535044582d4c6963656e73652d4964656e7469666965723a204170616368652d322e300a3b2065646963742d7461726765742d69722e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f72207468652045646963742d6f776e65642054617267657420495220617274696661637420656e76656c6f70652e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e0a3b0a3b205468697320736368656d6120697320617373656d626c656420776974682065646963742d636f6d6d6f6e2e6364646c20616e642065646963742d636f72652e6364646c2e2049740a3b2064656c696265726174656c792072657573657320436f72652065787072657373696f6e732c20707265646963617465732c20627564676574732c206c6f63616c207265666572656e6365732c0a3b206f62737472756374696f6e20726561736f6e732c20616e64206f62737472756374696f6e2061726d7320736f2074686520736368656d61206d617463686573207468652076616c75650a3b20656d6974746564206279207468652063616e6f6e6963616c2054617267657420495220656e636f64657220726174686572207468616e20726573746174696e672074686f73652074797065732e0a3b2049742064657363726962657320746865207374727563747572616c207368617065206f662076616c6964206c6f776572696e672d70726f6475636564206172746966616374732e205468650a3b206c6f776572696e6720616e6420656e636f64657220636f6e7472616374732073657061726174656c7920656e666f7263652073656d616e746963206964656e7469666965722072756c65730a3b20616e642063616e6f6e6963616c206f72646572696e672f64656475706c69636174696f6e20666f72207365742d6c696b652076616c7565732e0a0a3b2054617267657420495220656e636f64696e672072656a6563747320616e20656d707479207461726765742d70726f66696c6520636f6f7264696e617465206265666f72652062797465730a3b2065786973742c20736f207468697320726f6f74207469676874656e732074686520736861726564207374727563747572616c207265736f757263652d726566206163636f7264696e676c792e0a7461726765742d69722d7265736f757263652d726566203d207b0a202069643a2074737472202e7265676578702022283f73292e2b222c0a20206469676573743a207368613235362d6469676573742c0a7d0a0a7461726765742d69722d6172746966616374203d207461726765742d69722d7068617365642d6172746966616374202f207461726765742d69722d6f7264657265642d61727469666163740a0a7461726765742d69722d7068617365642d6172746966616374203d207461726765742d69722d636c6f7365642d6172746966616374202f207461726765742d69722d6c65676163792d61727469666163740a0a7461726765742d69722d61727469666163742d636f6d6d6f6e203d20280a2020646f6d61696e3a20747374722c0a202074617267657450726f66696c653a207461726765742d69722d7265736f757263652d7265662c0a2020736f75726365436f7265436f6f7264696e6174653a2074737472202e7265676578702022283f73292e2b222c0a290a0a3b2076322062696e6473206f6e6520657865637574696f6e206f72646572206f7665722074686520696e737472756374696f6e207461626c65732e2054686520656e636f64657220616c736f0a3b2076616c69646174657320746865206578616374207065726d75746174696f6e20616e642070726f64756365722d6265666f72652d636f6e73756d657220646570656e64656e636965732e0a7461726765742d69722d6f7264657265642d6172746966616374203d207461726765742d69722d6f7264657265642d636c6f736564202f207461726765742d69722d6f7264657265642d6c65676163790a0a7461726765742d69722d6f7264657265642d636f6d6d6f6e203d20280a2020646f6d61696e3a20226563686f2e7370616e2d69722f7632222c0a202074617267657450726f66696c653a207461726765742d69722d7265736f757263652d7265662c0a2020736f75726365436f7265436f6f7264696e6174653a2074737472202e7265676578702022283f73292e2b222c0a290a0a7461726765742d69722d6f7264657265642d636c6f736564203d207b0a20206b696e643a20226f72646572656454617267657449724172746966616374222c0a20207461726765742d69722d6f7264657265642d636f6d6d6f6e2c0a202073656d616e746963436c6f737572653a207461726765742d69722d73656d616e7469632d636c6f737572652c0a2020696e74656e74733a207b202a2074737472203d3e207461726765742d69722d6f7264657265642d696e74656e74207d2c0a7d0a0a7461726765742d69722d6f7264657265642d6c6567616379203d207b0a20206b696e643a20226f72646572656454617267657449724172746966616374222c0a20207461726765742d69722d6f7264657265642d636f6d6d6f6e2c0a2020696e74656e74733a207b202a2074737472203d3e207461726765742d69722d6f7264657265642d6c65676163792d696e74656e74207d2c0a7d0a0a7461726765742d69722d6f7264657265642d696e74656e74203d207b0a20207461726765742d69722d696e74656e742d636f6d6d6f6e2c0a20203f2062617369733a20636f72652d657870722c0a20203f207075726542696e64696e67733a205b312a207461726765742d69722d707572652d62696e64696e675d2c0a2020657865637574696f6e4f726465723a205b2a2074737472202e7265676578702022283f73292e2b225d2c0a7d0a0a7461726765742d69722d6f7264657265642d6c65676163792d696e74656e74203d207b0a20207461726765742d69722d696e74656e742d636f6d6d6f6e2c0a2020657865637574696f6e4f726465723a205b2a2074737472202e7265676578702022283f73292e2b225d2c0a7d0a0a7461726765742d69722d636c6f7365642d6172746966616374203d207b0a20206b696e643a202274617267657449724172746966616374222c0a20207461726765742d69722d61727469666163742d636f6d6d6f6e2c0a202073656d616e746963436c6f737572653a207461726765742d69722d73656d616e7469632d636c6f737572652c0a2020696e74656e74733a207b202a2074737472203d3e207461726765742d69722d696e74656e74207d2c0a7d0a0a7461726765742d69722d6c65676163792d6172746966616374203d207b0a20206b696e643a202274617267657449724172746966616374222c0a20207461726765742d69722d61727469666163742d636f6d6d6f6e2c0a2020696e74656e74733a207b202a2074737472203d3e207461726765742d69722d6c65676163792d696e74656e74207d2c0a7d0a0a7461726765742d69722d73656d616e7469632d636c6f73757265203d207b0a2020736f75726365436f72653a207461726765742d69722d7265736f757263652d7265662c0a20206c61777061636b733a205b2a207461726765742d69722d7265736f757263652d7265665d2c0a20203f206361706162696c69746965733a205b2a207461726765742d69722d7265736f757263652d7265665d2c0a7d0a0a7461726765742d69722d696e74656e74203d207b0a20207461726765742d69722d696e74656e742d636f6d6d6f6e2c0a20203f2062617369733a20636f72652d657870722c0a20203f207075726542696e64696e67733a205b312a207461726765742d69722d707572652d62696e64696e675d2c0a20203f2065787465726e616c416374696f6e52657175657374733a205b2a207461726765742d69722d65787465726e616c2d616374696f6e2d726571756573745d2c0a7d0a0a7461726765742d69722d6c65676163792d696e74656e74203d207b0a20207461726765742d69722d696e74656e742d636f6d6d6f6e2c0a7d0a0a7461726765742d69722d696e74656e742d636f6d6d6f6e203d20280a20206f7065726174696f6e50726f66696c653a20747374722c0a2020696e707574436f6e73747261696e74733a205b2a20696e7075742d636f6e73747261696e745d2c0a2020636f72654576616c756174696f6e4275646765743a20636f72652d6275646765742c0a2020726571756972656d656e74733a205b2a207461726765742d69722d726571756972656d656e745d2c0a202073746570733a205b2a207461726765742d69722d737465705d2c0a2020726573756c743a20636f72652d657870722c0a290a0a7461726765742d69722d726571756972656d656e74203d207b0a202069643a20747374722c0a20207072656469636174653a20636f72652d7072656469636174652c0a20206f6e4661696c7572653a20726571756972652d6661696c7572652d61726d2c0a7d0a0a7461726765742d69722d707572652d62696e64696e67203d207b0a202069643a2074737472202e7265676578702022283f73292e2b222c0a202062696e64696e673a206c6f63616c2d7265662c0a202076616c75653a20636f72652d657870722c0a7d0a0a7461726765742d69722d73746570203d207b0a202069643a20747374722c0a202062696e64696e673a206c6f63616c2d7265662c0a20206566666563743a20747374722c0a2020746172676574496e7472696e7369633a20747374722c0a2020696e7075743a20636f72652d657870722c0a20206f62737472756374696f6e4661696c757265733a205b2a206661696c7572652d6964656e745d2c0a20206f62737472756374696f6e41726d733a207b202a206661696c7572652d6964656e74203d3e206f62737472756374696f6e2d61726d207d2c0a7d0a0a7461726765742d69722d65787465726e616c2d616374696f6e2d72657175657374203d207b0a202069643a20747374722c0a202062696e64696e673a206c6f63616c2d7265662c0a20206f7065726174696f6e3a207461726765742d69722d7265736f757263652d7265662c0a2020696e707574547970653a20636f72652d747970652d7265662c0a2020736574746c656d656e74547970653a20636f72652d747970652d7265662c0a2020696e707574536368656d613a207461726765742d69722d7265736f757263652d7265662c0a2020736574746c656d656e74536368656d613a207461726765742d69722d7265736f757263652d7265662c0a2020696e7075743a20636f72652d657870722c0a2020617574686f7269747953636f70653a20636f72652d657870722c0a202062617369733a20636f72652d657870722c0a20206275646765743a2065787465726e616c2d616374696f6e2d6275646765742c0a20207265636f6e63696c696174696f6e4c61773a207461726765742d69722d7265736f757263652d7265662c0a202073746174653a20226177616974696e67536574746c656d656e74222c0a2020736574746c656d656e7441646d697373696f6e3a2022736368656d615265717569726564222c0a7d0a", + "rawSha256": "e484eabd615584a38cb57454b52747786f2314c135c13f99da6f6bae619a709f" + }, + "contracts": [ + {"contract": "authority-facts", "rootRule": "authority-facts"}, + {"contract": "core-module", "rootRule": "core-module"}, + {"contract": "lawpack-adapter", "rootRule": "lawpack-adapter"}, + {"contract": "lawpack-exports", "rootRule": "lawpack-exports"}, + {"contract": "lawpack-manifest", "rootRule": "lawpack-manifest"}, + {"contract": "lowering-requirements", "rootRule": "lowering-requirements"}, + {"contract": "result-projection", "rootRule": "result-projection"}, + {"contract": "target-ir-artifact", "rootRule": "target-ir-artifact"}, + {"contract": "target-profile-intrinsics", "rootRule": "intrinsics-document"}, + {"contract": "target-profile-manifest", "rootRule": "target-profile-manifest"}, + {"contract": "target-profile-operation-profiles", "rootRule": "operation-profiles-document"} + ], + "domains": [ + {"domain": "edict.authority-facts/v1", "rootRule": "authority-facts"}, + {"domain": "edict.core.module/v1", "rootRule": "core-module"}, + {"domain": "edict.lawpack/v1", "rootRule": "lawpack-manifest"}, + {"domain": "edict.lowering-requirements/v1", "rootRule": "lowering-requirements"}, + {"domain": "edict.result-projection.artifact/v1", "rootRule": "result-projection"}, + {"domain": "edict.target-ir.artifact/v1", "rootRule": "target-ir-artifact"}, + {"domain": "edict.target-profile/v1", "rootRule": "target-profile-manifest"} + ], + "resources": [ + { + "coordinate": "edict.canonical-cbor/v1", + "canonicalBytesHex": "a368636f6e7472616374a96a76616c75654d6f64656c8765617272617964626f6f6c65627974657367696e7465676572636d6170646e756c6c64746578746b6469676573744672616d656f65646963742e6469676573742f76316b6d61704f72646572696e67781b63616e6f6e6963616c2d656e636f6465642d6b65792d62797465736c74657874456e636f64696e67657574662d386d747261696c696e6742797465736672656a6563746f696e7465676572456e636f64696e676873686f727465737470636f6e7461696e65724c656e6774687368646566696e697465706475706c69636174654d61704b6579736672656a656374736d6178696d756d4e657374696e67446570746818806a61706956657273696f6e782965646963742e7461726765742d70726f66696c652e636f6e74726163742d7265736f757263652f76316a636f6f7264696e6174657765646963742e63616e6f6e6963616c2d63626f722f7631", + "rawSha256": "8306e4f08c1e4e7d29ab22bcf55c324312712aac3eeeb675857ced57c3e48bdc", + "domainFramedDigest": "sha256:d1ea6d3de2a9762a438cbf4fac1d5ae2f357a4b27d13e0347e94ea655bf40f9d", + "provenance": { + "repository": "https://github.com/flyingrobots/edict", + "sourcePath": "fixtures/target-profile/contract-resources/canonical-cbor.cbor" + } + }, + { + "coordinate": "edict.determinism/v1", + "canonicalBytesHex": "a368636f6e7472616374aa6c616d6269656e74436c6f636bf46e616d6269656e744e6574776f726bf46e6f75747075744964656e74697479781e686f73742d636f6d70757465642d61667465722d76616c69646174696f6e6e72656769737472794c6f6f6b7570f471616d6269656e7446696c6573797374656df471616d6269656e7452616e646f6d6e657373f472616d6269656e74456e7669726f6e6d656e74f4756d757461626c654e616d655265736f6c7574696f6ef477667265736853746f7265506572496e766f636174696f6ef5782263616e6f6e6963616c526573756c74496e646570656e64656e744f664c696d697473f56a61706956657273696f6e782965646963742e7461726765742d70726f66696c652e636f6e74726163742d7265736f757263652f76316a636f6f7264696e6174657465646963742e64657465726d696e69736d2f7631", + "rawSha256": "84073f5c1734b625e16799048e28458d43e0a10befdae56a79d906f5e37ef76a", + "domainFramedDigest": "sha256:af4e6c774d5ea82db30e680be2ba7abc5ba04c6aead146139de32d8c5bb4981e", + "provenance": { + "repository": "https://github.com/flyingrobots/edict", + "sourcePath": "fixtures/target-profile/contract-resources/determinism.cbor" + } + }, + { + "coordinate": "edict.diagnostics/v1", + "canonicalBytesHex": "a368636f6e7472616374a7666669656c64738464636f6465687365766572697479676d65737361676566726570616972686f72646572696e67781c636f64652d73657665726974792d6d6573736167652d726570616972697265636f7264416269782f65646963743a7461726765742d70726f76696465722f70726f746f636f6c40312e302e3023646961676e6f737469636a7472756e636174696f6e69666f7262696464656e6d73657665726974794f7264657283656572726f72677761726e696e6764696e666f6e6c697374436f756e74426f756e64f57261676772656761746542797465426f756e64f56a61706956657273696f6e782965646963742e7461726765742d70726f66696c652e636f6e74726163742d7265736f757263652f76316a636f6f7264696e6174657465646963742e646961676e6f73746963732f7631", + "rawSha256": "e465a28f1170fe478db5ff65d96a1fdbfbbcb95d327e6965021c252437991e4b", + "domainFramedDigest": "sha256:28fd72a98223153982ca084c29dbb1b2d430623967ab3b6db9d7fee668e614b9", + "provenance": { + "repository": "https://github.com/flyingrobots/edict", + "sourcePath": "fixtures/target-profile/contract-resources/diagnostics.cbor" + } + }, + { + "coordinate": "edict.fuel/v1", + "canonicalBytesHex": "a368636f6e7472616374a6687265717569726564f56a6163636f756e74696e67781864657465726d696e69737469632d67756573742d776f726b6a627564676574556e6974646675656c6a65786861757374696f6e72686f73742d6f776e65642d6661696c7572656d706572496e766f636174696f6ef57165706f6368496e74657272757074696f6e736e6f742d612d7265706c61792d6275646765746a61706956657273696f6e782965646963742e7461726765742d70726f66696c652e636f6e74726163742d7265736f757263652f76316a636f6f7264696e6174656d65646963742e6675656c2f7631", + "rawSha256": "c712c2d831cc8e731bdc1dfb8ea536f4630f38f0b0e0c6448b2df57176d3d0bd", + "domainFramedDigest": "sha256:006c6ebc01a3c5d36d50bd390b69d47e42378be61074e3b5c96ecb9f5ee53207", + "provenance": { + "repository": "https://github.com/flyingrobots/edict", + "sourcePath": "fixtures/target-profile/contract-resources/fuel.cbor" + } + }, + { + "coordinate": "edict.wasm-component/v1", + "canonicalBytesHex": "a368636f6e7472616374a7647761736969666f7262696464656e6e70726f746f636f6c496d706f727469747970652d6f6e6c796f63616c6c61626c65496d706f72747369666f7262696464656e70636f6e74726163744964656e746974796565786163747070726f7669646572436f6e7472616374781b65646963743a7461726765742d70726f766964657240312e302e3077667265736853746f7265506572496e766f636174696f6ef5781b636f6d706f6e656e74446967657374566572696669636174696f6e6d6265666f72652d6465636f64656a61706956657273696f6e782965646963742e7461726765742d70726f66696c652e636f6e74726163742d7265736f757263652f76316a636f6f7264696e6174657765646963742e7761736d2d636f6d706f6e656e742f7631", + "rawSha256": "cd09d702db1d10be825e72effe35627bec56963cb3d78601b69478c58787e34d", + "domainFramedDigest": "sha256:095b4dd18f1a6a7276533f758665be319c5f476e7bdc70cc56d30b6b3e9f0a80", + "provenance": { + "repository": "https://github.com/flyingrobots/edict", + "sourcePath": "fixtures/target-profile/contract-resources/wasm-component.cbor" + } + } + ] +} diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json index 83cdbd543..2a01bb289 100644 --- a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json +++ b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/review.provider-generation.json b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/review.provider-generation.json index 95605ec67..b960179af 100644 --- a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/review.provider-generation.json +++ b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/generated/evidence/review.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:cbaf79293ebb33cd8825847b4ba848c20c2dab9b4e6cf26931c3e830bf9e7ca1","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:9490680660ecb2ff932c5fbd650252a45252e7be0fffd7fda7b70f47c64b20d1","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json index ce5c8a3b3..bb3cbcad4 100644 --- a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json +++ b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json @@ -3,7 +3,7 @@ "providerAbi": "edict:target-provider@1.0.0", "provider": { "coordinate": "echo.edict-provider@1", - "digest": "sha256:0e58e22e034ce81ecbb57d085505ab314c769bcda24b2d06bfa77d9062729116" + "digest": "sha256:945376a32cb52425388cb7f5ca71ee6a8622a8448f40bb02cae7482834ca974c" }, "artifacts": [ { @@ -21,7 +21,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -40,7 +40,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -59,7 +59,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -78,7 +78,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -102,7 +102,7 @@ "artifactKind": "generationProvenance", "resource": { "coordinate": "echo.edict-provider-generation-provenance@1", - "digest": "sha256:399c917c5cc9e86854a96852bdce898ec79df7b1236a8edb13a13b1afa72b664" + "digest": "sha256:2b27a04863c3660e8ce716cabfd63fd047d3f75a884e28d4222de5564c254142" }, "source": { "kind": "generated", @@ -112,7 +112,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -121,7 +121,7 @@ "artifactKind": "reviewArtifact", "resource": { "coordinate": "echo.edict-provider-generation-review@1", - "digest": "sha256:8b7d9873deb7c517cb92a2dfc8256ff1395636eaeaaba308a9a6d3d0423913e7" + "digest": "sha256:8000857ec83afd059b0747376c01699b8c97052c84ff6a69d3e7eed407910a8a" }, "source": { "kind": "generated", @@ -131,7 +131,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -150,7 +150,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -169,7 +169,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, diff --git a/crates/echo-wesley-gen/examples/source_functions_publication_witness.rs b/crates/echo-wesley-gen/examples/source_functions_publication_witness.rs new file mode 100644 index 000000000..3e467ad7e --- /dev/null +++ b/crates/echo-wesley-gen/examples/source_functions_publication_witness.rs @@ -0,0 +1,76 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +//! Generates an explicitly selected source-function publication candidate. +//! Supports public compiler witnesses; generation grants no runtime authority. + +use anyhow::{bail, Context, Result}; +use echo_wesley_gen::provider_artifacts::generate_provider_primary_artifacts_v1; +use echo_wesley_gen::provider_contract_pack::{ + admit_provider_contract_pack_for_publication_v1, ProviderContractPublicationV1, +}; +use echo_wesley_gen::provider_corpus::checked_provider_generator_source_bundle_v1; +use echo_wesley_gen::provider_generation::build_provider_generation_input_v1; +use echo_wesley_gen::provider_package::{ + admit_provider_package_v1, assemble_provider_package_v1, ProviderPackageComponentMaterialV1, +}; +use echo_wesley_gen::provider_provenance::generate_provider_generation_provenance_v1; +use echo_wesley_gen::provider_review::generate_provider_generation_review_v1; +use std::path::PathBuf; + +fn main() -> Result<()> { + if !std::path::Path::new("/.dockerenv").is_file() { + bail!("run this consumer witness in a guarded Docker worker with copied sources"); + } + let mut arguments = std::env::args_os().skip(1); + let output = PathBuf::from( + arguments + .next() + .context("expected a new output directory")?, + ); + if arguments.next().is_some() || output.exists() { + bail!("expected exactly one new output directory"); + } + let contracts = admit_provider_contract_pack_for_publication_v1( + ProviderContractPublicationV1::SourceFunctions, + include_bytes!( + "../assets/v1/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl" + ), + include_bytes!("../assets/v1/edict-provider/contracts/source-functions-v1/manifest.json"), + )?; + let input = build_provider_generation_input_v1( + include_bytes!("../assets/v1/edict-provider/echo-provider-semantics-v1.json"), + &contracts, + include_bytes!("../assets/v1/edict-provider/generation-settings-v1.json"), + )?; + let primary = generate_provider_primary_artifacts_v1(&input, &contracts)?; + let generator = checked_provider_generator_source_bundle_v1()?.generator_material()?; + let provenance = generate_provider_generation_provenance_v1(&input, &primary, &generator)?; + let review = generate_provider_generation_review_v1(&input, &provenance)?; + let candidate = assemble_provider_package_v1( + &input, + &primary, + &generator, + &provenance, + &review, + vec![ + ProviderPackageComponentMaterialV1::new( + "lowerer.echo-dpo", + include_bytes!("../assets/v1/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm"), + )?, + ProviderPackageComponentMaterialV1::new( + "verifier.echo-dpo", + include_bytes!("../assets/v1/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm"), + )?, + ], + )?; + let admitted = + admit_provider_package_v1(candidate.files().to_vec(), candidate.provider_reference())?; + // Publish only after the complete generated package has passed digest admission. + std::fs::create_dir(&output)?; + for file in admitted.files() { + let path = output.join(file.relative_path()); + std::fs::create_dir_all(path.parent().context("package file parent")?)?; + std::fs::write(path, file.bytes())?; + } + Ok(()) +} diff --git a/crates/echo-wesley-gen/src/bin/echo-edict-provider-assets.rs b/crates/echo-wesley-gen/src/bin/echo-edict-provider-assets.rs index d8256ce3a..350640b4e 100644 --- a/crates/echo-wesley-gen/src/bin/echo-edict-provider-assets.rs +++ b/crates/echo-wesley-gen/src/bin/echo-edict-provider-assets.rs @@ -49,7 +49,7 @@ impl AssetSpec { } } -const ASSETS: [AssetSpec; 40] = [ +const ASSETS: [AssetSpec; 42] = [ AssetSpec::new( "edict-provider/contracts/ordered/edict-provider-contracts.cddl", "schemas/edict-provider/contracts/ordered/edict-provider-contracts.cddl", @@ -58,6 +58,14 @@ const ASSETS: [AssetSpec; 40] = [ "edict-provider/contracts/ordered/manifest.json", "schemas/edict-provider/contracts/ordered/manifest.json", ), + AssetSpec::new( + "edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl", + "schemas/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl", + ), + AssetSpec::new( + "edict-provider/contracts/source-functions-v1/manifest.json", + "schemas/edict-provider/contracts/source-functions-v1/manifest.json", + ), AssetSpec::new( "edict-provider/contracts/v1/edict-provider-contracts.cddl", "schemas/edict-provider/contracts/v1/edict-provider-contracts.cddl", diff --git a/crates/echo-wesley-gen/src/provider_contract_pack.rs b/crates/echo-wesley-gen/src/provider_contract_pack.rs index 09f59362f..0631e6493 100644 --- a/crates/echo-wesley-gen/src/provider_contract_pack.rs +++ b/crates/echo-wesley-gen/src/provider_contract_pack.rs @@ -50,6 +50,8 @@ pub enum ProviderContractPublicationV1 { PureBindings, /// Ordered-instruction publication from Edict commit `2405a550e93e1e97fff640caa44bbd0f65ffff3c`. OrderedInstructions, + /// Source-owned pure functions, selected by the exact upstream publication pair. + SourceFunctions, } impl ProviderContractPublicationV1 { @@ -59,6 +61,9 @@ impl ProviderContractPublicationV1 { Self::OrderedInstructions => { "82273f3ea016a421c881f15b0fd451802205903ac9177bac8accbf3173f66d2c" } + Self::SourceFunctions => { + "e484eabd615584a38cb57454b52747786f2314c135c13f99da6f6bae619a709f" + } } } @@ -68,6 +73,9 @@ impl ProviderContractPublicationV1 { Self::OrderedInstructions => { "6303668861667a30418870ef25e5f169017905ae1f9d261451ba298120afdd9d" } + Self::SourceFunctions => { + "aebc2e4133407ae433c18b55421a89bf15dc5d489368f82ce4874f948d4f9c79" + } } } @@ -75,6 +83,7 @@ impl ProviderContractPublicationV1 { match self { Self::PureBindings => EDICT_PROVIDER_CONTRACT_PACK_MANIFEST_MAX_BYTES, Self::OrderedInstructions => 75_359, + Self::SourceFunctions => 75_989, } } } diff --git a/crates/echo-wesley-gen/tests/provider_package_assets.rs b/crates/echo-wesley-gen/tests/provider_package_assets.rs index 211e348dc..4d53cfeba 100644 --- a/crates/echo-wesley-gen/tests/provider_package_assets.rs +++ b/crates/echo-wesley-gen/tests/provider_package_assets.rs @@ -7,7 +7,7 @@ use std::path::{Path, PathBuf}; use std::process::{Command, Output}; use std::sync::atomic::{AtomicU64, Ordering}; -const EXPECTED_ASSET_FILE_COUNT: usize = 40; +const EXPECTED_ASSET_FILE_COUNT: usize = 42; const EXPECTED_LOWERER_RESOURCE_COUNT: usize = 4; const EXPECTED_VERIFIER_RESOURCE_COUNT: usize = 15; static NEXT_TEMP_DIRECTORY: AtomicU64 = AtomicU64::new(0); diff --git a/crates/echo-wesley-gen/tests/provider_publication_binding.rs b/crates/echo-wesley-gen/tests/provider_publication_binding.rs index d1eee3109..0dbaacdb5 100644 --- a/crates/echo-wesley-gen/tests/provider_publication_binding.rs +++ b/crates/echo-wesley-gen/tests/provider_publication_binding.rs @@ -29,6 +29,14 @@ fn pack(publication: ProviderContractPublicationV1) -> AdmittedProviderContractP ), include_bytes!("../assets/v1/edict-provider/contracts/ordered/manifest.json"), ), + ProviderContractPublicationV1::SourceFunctions => ( + include_bytes!( + "../../../schemas/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl" + ), + include_bytes!( + "../../../schemas/edict-provider/contracts/source-functions-v1/manifest.json" + ), + ), }; admit_provider_contract_pack_for_publication_v1(publication, schema, manifest) .expect("exact publication admits") @@ -74,6 +82,7 @@ fn each_matching_publication_generates_its_bound_schema() { for publication in [ ProviderContractPublicationV1::PureBindings, ProviderContractPublicationV1::OrderedInstructions, + ProviderContractPublicationV1::SourceFunctions, ] { let bound = pack(publication); let input = build_provider_generation_input_v1(SOURCE, &bound, SETTINGS) @@ -84,3 +93,14 @@ fn each_matching_publication_generates_its_bound_schema() { assert_eq!(primary.generation_input_digest(), input.digest()); } } + +#[test] +fn source_function_generation_rejects_every_other_publication_in_both_directions() { + for other in [ + ProviderContractPublicationV1::PureBindings, + ProviderContractPublicationV1::OrderedInstructions, + ] { + rejects_crossed_publication(ProviderContractPublicationV1::SourceFunctions, other); + rejects_crossed_publication(other, ProviderContractPublicationV1::SourceFunctions); + } +} diff --git a/crates/echo-wesley-gen/tests/provider_source_function_contract_pack.rs b/crates/echo-wesley-gen/tests/provider_source_function_contract_pack.rs new file mode 100644 index 000000000..0e3b255ba --- /dev/null +++ b/crates/echo-wesley-gen/tests/provider_source_function_contract_pack.rs @@ -0,0 +1,375 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +#![allow(clippy::expect_used)] +//! Explicit upstream publication admission is separate from executable support. + +use echo_wesley_gen::provider_canonical::{encode_canonical_cbor_v1, CanonicalValueV1 as Value}; +use echo_wesley_gen::provider_contract_pack::{ + admit_provider_contract_pack_for_publication_v1, admit_provider_contract_pack_v1, + AdmittedProviderContractPackV1, ProviderContractPackError, ProviderContractPackErrorKind, + ProviderContractPublicationV1, ProviderContractValidationErrorKind, +}; +use sha2::{Digest, Sha256}; + +const LEGACY_CDDL: &[u8] = + include_bytes!("../assets/v1/edict-provider/contracts/v1/edict-provider-contracts.cddl"); +const LEGACY_MANIFEST: &[u8] = + include_bytes!("../assets/v1/edict-provider/contracts/v1/manifest.json"); +const ORDERED_CDDL: &[u8] = + include_bytes!("../assets/v1/edict-provider/contracts/ordered/edict-provider-contracts.cddl"); +const ORDERED_MANIFEST: &[u8] = + include_bytes!("../assets/v1/edict-provider/contracts/ordered/manifest.json"); +const SOURCE_CDDL: &[u8] = include_bytes!( + "../assets/v1/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl" +); +const SOURCE_MANIFEST: &[u8] = + include_bytes!("../assets/v1/edict-provider/contracts/source-functions-v1/manifest.json"); + +#[test] +fn exact_upstream_source_function_pair_is_the_test_input() { + assert_eq!(SOURCE_CDDL.len(), 34_460); + assert_eq!(SOURCE_MANIFEST.len(), 75_989); + assert_eq!( + hex::encode(Sha256::digest(SOURCE_CDDL)), + "e484eabd615584a38cb57454b52747786f2314c135c13f99da6f6bae619a709f" + ); + assert_eq!( + hex::encode(Sha256::digest(SOURCE_MANIFEST)), + "aebc2e4133407ae433c18b55421a89bf15dc5d489368f82ce4874f948d4f9c79" + ); +} + +#[test] +fn existing_publications_still_admit_their_exact_bytes() { + let legacy = admit_provider_contract_pack_v1(LEGACY_CDDL, LEGACY_MANIFEST) + .expect("default admission retains the original publication"); + assert_eq!( + legacy.publication(), + ProviderContractPublicationV1::PureBindings + ); + assert_eq!(legacy.schema_bytes(), LEGACY_CDDL); + assert_eq!(legacy.manifest_bytes(), LEGACY_MANIFEST); + let ordered = admit_provider_contract_pack_for_publication_v1( + ProviderContractPublicationV1::OrderedInstructions, + ORDERED_CDDL, + ORDERED_MANIFEST, + ) + .expect("explicit ordered admission retains its original publication"); + assert_eq!(ordered.schema_bytes(), ORDERED_CDDL); + assert_eq!(ordered.manifest_bytes(), ORDERED_MANIFEST); +} + +#[test] +fn source_function_bytes_never_silently_upgrade_an_existing_selection() { + for publication in [ + ProviderContractPublicationV1::PureBindings, + ProviderContractPublicationV1::OrderedInstructions, + ] { + assert_eq!( + admit_provider_contract_pack_for_publication_v1( + publication, + SOURCE_CDDL, + SOURCE_MANIFEST, + ) + .expect_err("an existing publication must not discover the new schema") + .kind(), + ProviderContractPackErrorKind::ManifestSizeExceeded, + ); + } + assert_eq!( + admit_provider_contract_pack_v1(SOURCE_CDDL, SOURCE_MANIFEST) + .expect_err("default admission must retain its original publication") + .kind(), + ProviderContractPackErrorKind::ManifestSizeExceeded, + ); +} + +#[test] +fn source_function_publication_has_an_explicit_admission_route() { + // Exactly one explicit selector admits these bytes; neither existing + // publication is upgraded by recognizing a new manifest. + let publications = [ + ProviderContractPublicationV1::PureBindings, + ProviderContractPublicationV1::OrderedInstructions, + ProviderContractPublicationV1::SourceFunctions, + ]; + let results = publications.map(|publication| { + admit_provider_contract_pack_for_publication_v1(publication, SOURCE_CDDL, SOURCE_MANIFEST) + }); + assert_eq!( + results.iter().filter(|result| result.is_ok()).count(), + 1, + "one explicit publication must admit the pinned source-function pair: {results:?}", + ); + let selected = results + .into_iter() + .find_map(Result::ok) + .expect("the exact source-function publication has been selected"); + assert_eq!( + selected.publication(), + ProviderContractPublicationV1::SourceFunctions + ); + assert_eq!(selected.schema_bytes(), SOURCE_CDDL); + assert_eq!(selected.manifest_bytes(), SOURCE_MANIFEST); + assert_eq!(selected.contract_count(), 11); + assert_eq!(selected.domain_count(), 7); + assert_eq!(selected.resource_count(), 5); +} + +fn admit_source_functions( + schema: &[u8], + manifest: &[u8], +) -> Result { + admit_provider_contract_pack_for_publication_v1( + ProviderContractPublicationV1::SourceFunctions, + schema, + manifest, + ) +} + +#[test] +fn source_selection_rejects_old_publications_and_crossed_pairs() { + for (schema, manifest) in [ + (LEGACY_CDDL, LEGACY_MANIFEST), + (ORDERED_CDDL, ORDERED_MANIFEST), + ] { + assert_eq!( + admit_source_functions(schema, manifest) + .expect_err("explicit new selection cannot accept an old publication") + .kind(), + ProviderContractPackErrorKind::SchemaDigestMismatch, + ); + for (crossed_schema, crossed_manifest) in + [(SOURCE_CDDL, manifest), (schema, SOURCE_MANIFEST)] + { + assert_eq!( + admit_source_functions(crossed_schema, crossed_manifest) + .expect_err("schema and manifest must come from one publication") + .kind(), + ProviderContractPackErrorKind::SchemaBytesMismatch, + ); + } + } +} + +#[test] +fn source_publication_rejects_tampering_and_self_consistent_republication() { + let mut schema = SOURCE_CDDL.to_vec(); + schema[0] ^= 1; + assert_eq!( + admit_source_functions(&schema, SOURCE_MANIFEST) + .expect_err("changed CDDL must reject") + .kind(), + ProviderContractPackErrorKind::SchemaBytesMismatch, + ); + let mut manifest: serde_json::Value = serde_json::from_slice(SOURCE_MANIFEST).expect("JSON"); + manifest["schema"]["bytesHex"] = hex::encode(&schema).into(); + manifest["schema"]["rawSha256"] = hex::encode(Sha256::digest(&schema)).into(); + assert_eq!( + admit_source_functions(&schema, &serde_json::to_vec(&manifest).expect("JSON")) + .expect_err("internal consistency does not authorize a new publication") + .kind(), + ProviderContractPackErrorKind::SchemaDigestMismatch, + ); +} + +#[test] +fn source_manifest_requires_exact_bytes_and_checks_size_before_parsing() { + let manifest: serde_json::Value = serde_json::from_slice(SOURCE_MANIFEST).expect("JSON"); + assert_eq!( + admit_source_functions(SOURCE_CDDL, &serde_json::to_vec(&manifest).expect("JSON")) + .expect_err("reformatting changes the pinned manifest") + .kind(), + ProviderContractPackErrorKind::ManifestDigestMismatch, + ); + for oversized in [ + [SOURCE_MANIFEST, b" "].concat(), + vec![b'{'; SOURCE_MANIFEST.len() + 1], + ] { + assert_eq!( + admit_source_functions(SOURCE_CDDL, &oversized) + .expect_err("size ceiling applies before JSON parsing") + .kind(), + ProviderContractPackErrorKind::ManifestSizeExceeded, + ); + } +} + +#[test] +fn source_manifest_still_checks_api_and_embedded_resources() { + for (field, expected) in [ + ("api", ProviderContractPackErrorKind::UnsupportedApiVersion), + ( + "resource", + ProviderContractPackErrorKind::ResourceRawDigestMismatch, + ), + ] { + let mut manifest: serde_json::Value = + serde_json::from_slice(SOURCE_MANIFEST).expect("JSON"); + if field == "api" { + manifest["apiVersion"] = "edict.provider-contract-pack/v99".into(); + } else { + manifest["resources"][0]["rawSha256"] = "0".repeat(64).into(); + } + assert_eq!( + admit_source_functions(SOURCE_CDDL, &serde_json::to_vec(&manifest).expect("JSON")) + .expect_err("invalid publication") + .kind(), + expected, + ); + } +} + +fn text(value: &str) -> Value { + Value::Text(value.to_owned()) +} + +fn map(entries: impl IntoIterator) -> Value { + Value::Map( + entries + .into_iter() + .map(|(key, value)| (text(key), value)) + .collect(), + ) +} + +fn parameter() -> Value { + map([ + ("id", text("arg.0")), + ("alphaName", text("arg.0")), + ("type", text("U64")), + ]) +} + +fn identity_function(return_type: Option) -> Value { + let mut fields = vec![ + ("params", Value::Array(vec![parameter()])), + ( + "body", + map([ + ("locals", Value::Array(vec![])), + ("bindings", Value::Array(vec![])), + ( + "result", + map([("kind", text("local")), ("ref", parameter())]), + ), + ]), + ), + ]; + if let Some(return_type) = return_type { + fields.push(("returnType", return_type)); + } + map(fields) +} + +// Structural CDDL specimens only. Public compiler/provider/runtime witnesses +// independently establish source meaning and executable capability support. +fn core_module(functions: Option) -> Value { + let mut fields = vec![ + ("apiVersion", text("edict.core/v1")), + ("coordinate", text("conformance.source-functions@1")), + ("imports", Value::Array(vec![])), + ("types", map([])), + ( + "intents", + map([( + "observe", + map([ + ("input", text("U64")), + ("output", text("U64")), + ( + "requiredOperationProfile", + text("continuum.profile.read-only/v1"), + ), + ("inputConstraints", Value::Array(vec![])), + ( + "coreEvaluationBudget", + map([ + ("maxSteps", Value::Integer(100)), + ("maxAllocatedBytes", Value::Integer(1024)), + ("maxOutputBytes", Value::Integer(64)), + ]), + ), + ( + "body", + map([ + ("locals", Value::Array(vec![])), + ("nodes", Value::Array(vec![])), + ( + "result", + map([ + ("kind", text("const")), + ( + "value", + map([ + ("kind", text("int")), + ("width", text("U64")), + ("value", Value::Integer(7)), + ]), + ), + ]), + ), + ]), + ), + ]), + )]), + ), + ("requiredCoreCapabilities", Value::Array(vec![])), + ]; + if let Some(functions) = functions { + fields.push(("functions", functions)); + } + map(fields) +} + +#[test] +fn schema_preserves_function_free_core_and_requires_new_selection_for_functions() { + let source = admit_source_functions(SOURCE_CDDL, SOURCE_MANIFEST).expect("source schema"); + let legacy = admit_provider_contract_pack_v1(LEGACY_CDDL, LEGACY_MANIFEST).expect("legacy"); + let ordered = admit_provider_contract_pack_for_publication_v1( + ProviderContractPublicationV1::OrderedInstructions, + ORDERED_CDDL, + ORDERED_MANIFEST, + ) + .expect("ordered"); + let baseline = encode_canonical_cbor_v1(&core_module(None)).expect("canonical control"); + let functions = encode_canonical_cbor_v1(&core_module(Some(map([( + "identity", + identity_function(Some(text("U64"))), + )])))) + .expect("canonical source-function specimen"); + for pack in [&legacy, &ordered, &source] { + pack.validate_contract_bytes("core-module", &baseline) + .expect("function-free Core keeps its old schema shape"); + } + source + .validate_contract_bytes("core-module", &functions) + .expect("new schema admits source-owned function shape"); + for pack in [&legacy, &ordered] { + assert_eq!( + pack.validate_contract_bytes("core-module", &functions) + .expect_err("old schemas must not discover source authority") + .kind(), + ProviderContractValidationErrorKind::SchemaMismatch, + ); + } +} + +#[test] +fn schema_refuses_empty_function_tables_and_missing_or_malformed_return_types() { + let source = admit_source_functions(SOURCE_CDDL, SOURCE_MANIFEST).expect("source schema"); + for table in [ + map([]), + map([("identity", identity_function(None))]), + map([("identity", identity_function(Some(Value::Null)))]), + ] { + let bytes = encode_canonical_cbor_v1(&core_module(Some(table))).expect("canonical"); + assert_eq!( + source + .validate_contract_bytes("core-module", &bytes) + .expect_err("malformed function table must reject") + .kind(), + ProviderContractValidationErrorKind::SchemaMismatch, + ); + } +} diff --git a/crates/warp-core/Cargo.toml b/crates/warp-core/Cargo.toml index 2588de508..b1c4fc660 100644 --- a/crates/warp-core/Cargo.toml +++ b/crates/warp-core/Cargo.toml @@ -130,6 +130,10 @@ required-features = ["trusted_runtime"] name = "edict_byte_concat_tests" required-features = ["trusted_runtime"] +[[test]] +name = "edict_source_functions_tests" +required-features = ["trusted_runtime"] + [build-dependencies] blake3 = "1.0" diff --git a/crates/warp-core/src/edict_pure.rs b/crates/warp-core/src/edict_pure.rs index 8351ac56a..f27165b37 100644 --- a/crates/warp-core/src/edict_pure.rs +++ b/crates/warp-core/src/edict_pure.rs @@ -8,6 +8,7 @@ mod decode; pub(crate) mod evaluate; +pub(crate) mod functions; pub(crate) mod model; pub(crate) mod syntax; pub(crate) mod values; diff --git a/crates/warp-core/src/edict_pure/decode.rs b/crates/warp-core/src/edict_pure/decode.rs index fe86cf868..096c26224 100644 --- a/crates/warp-core/src/edict_pure/decode.rs +++ b/crates/warp-core/src/edict_pure/decode.rs @@ -7,7 +7,7 @@ use echo_edict_canonical::{ CanonicalValueV1 as Value, }; -use super::model::{Binding, Helper, Program, MAX_PROGRAM_NODES}; +use super::model::{Binding, Program, MAX_PROGRAM_NODES}; use super::syntax::Parser; use super::values::{array, bytes, exact_fields, field, number, require_text, text_field}; use super::{EvaluationError as Error, EvaluationLimits}; @@ -117,7 +117,8 @@ pub(super) fn package( } } let input_local = array(field(field(core_intent, "body")?, "locals")?)? - .first() + .iter() + .find(|local| text_field(local, "id") == Ok("arg.0")) .ok_or(Error::InvalidArtifact)?; let input_id = text_field(input_local, "id")?.to_owned(); if text_field(input_local, "type")? != text_field(core_intent, "input")? { @@ -168,7 +169,18 @@ pub(super) fn package( parser.predicate(field(constraint, "predicate")?, 0)?, )); } - let helpers = helpers(&exports, &mut parser)?; + let helpers = super::functions::decode(&core, &exports, &mut parser)?; + if !array(field(&exports, "effects")?)?.is_empty() { + return Err(Error::UnsupportedProgram); + } + super::functions::check_roots( + &helpers, + bindings + .iter() + .map(|binding| &binding.value) + .chain(std::iter::once(&result)), + constraints.iter().map(|(_, predicate)| predicate), + )?; let budget = field(value, "budget_ceiling")?; let core_budget = field(core_intent, "coreEvaluationBudget")?; if field(target_intent, "coreEvaluationBudget")? != core_budget { @@ -209,38 +221,3 @@ pub(super) fn package( fn embedded(program: &Value, key: &str) -> Result { decode(bytes(field(program, key)?)?).map_err(|_| Error::InvalidArtifact) } - -fn helpers(exports: &Value, parser: &mut Parser<'_>) -> Result, Error> { - let mut result = BTreeMap::new(); - for helper in array(field(exports, "pureFunctions")?)? { - require_text(helper, "source", "edict")?; - let implementation = field(helper, "body")?; - let body = field(implementation, "body")?; - for (value, name) in [ - (helper, "parameterTypes"), - (helper, "typeParameters"), - (implementation, "params"), - (body, "bindings"), - (body, "locals"), - ] { - if !array(field(value, name)?)?.is_empty() { - return Err(Error::UnsupportedProgram); - } - } - let definition = Helper { - result: parser.expr(field(body, "result")?, 0)?, - ty: parser.ty(text_field(helper, "returnType")?, 0)?, - }; - if result - .insert(text_field(helper, "coordinate")?.to_owned(), definition) - .is_some() - { - return Err(Error::InvalidArtifact); - } - } - // Reject effects even when a malformed package claims an empty authority profile. - if !array(field(exports, "effects")?)?.is_empty() { - return Err(Error::UnsupportedProgram); - } - Ok(result) -} diff --git a/crates/warp-core/src/edict_pure/evaluate.rs b/crates/warp-core/src/edict_pure/evaluate.rs index ba95925c0..4363a182b 100644 --- a/crates/warp-core/src/edict_pure/evaluate.rs +++ b/crates/warp-core/src/edict_pure/evaluate.rs @@ -204,10 +204,25 @@ pub(crate) fn expression( }; expression(branch, locals, helpers, meter, depth + 1) } - Expr::Call(name) => { + Expr::Call(name, args) => { let helper = helpers.get(name).ok_or(Error::UnsupportedProgram)?; - // A helper has its own lexical scope, never the caller's local bindings. - let value = expression(&helper.result, &BTreeMap::new(), helpers, meter, depth + 1)?; + if args.len() != helper.params.len() { + return Err(Error::InvalidArtifact); + } + // Arguments run once, left to right in the caller's frame. Move each + // value into the fresh frame; later local reads charge their own copies. + let mut frame = BTreeMap::new(); + for (argument, parameter) in args.iter().zip(&helper.params) { + let value = expression(argument, locals, helpers, meter, depth + 1)?; + validate(&value, ¶meter.ty, meter, depth + 1)?; + frame.insert(parameter.id.clone(), value); + } + for binding in &helper.bindings { + let value = expression(&binding.value, &frame, helpers, meter, depth + 1)?; + validate(&value, &binding.ty, meter, depth + 1)?; + frame.insert(binding.id.clone(), value); + } + let value = expression(&helper.result, &frame, helpers, meter, depth + 1)?; validate(&value, &helper.ty, meter, depth + 1)?; Ok(value) } diff --git a/crates/warp-core/src/edict_pure/functions.rs b/crates/warp-core/src/edict_pure/functions.rs new file mode 100644 index 000000000..e869c45bb --- /dev/null +++ b/crates/warp-core/src/edict_pure/functions.rs @@ -0,0 +1,616 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +//! Closed source/imported helper authority, lexical scopes, and runtime apertures. +use super::{ + model::{ + Binding, Expr, Helper, Parameter, Predicate, RuntimeType, MAX_DEPTH, MAX_PROGRAM_NODES, + }, + syntax::Parser, + values::{array, exact_fields, field, map, number, require_text, text, text_field}, + EvaluationError as Error, +}; +use echo_edict_canonical::CanonicalValueV1 as Value; +use std::collections::{BTreeMap, BTreeSet}; + +struct Definition<'a> { + params: &'a [Value], + body: &'a Value, + result_type: &'a str, + source_owned: bool, +} + +pub(crate) fn decode( + core: &Value, + exports: &Value, + parser: &mut Parser<'_>, +) -> Result, Error> { + let mut definitions = BTreeMap::new(); + for item in array(field(exports, "pureFunctions")?)? { + require_text(item, "source", "edict")?; + let implementation = field(item, "body")?; + let body = field(implementation, "body")?; + // This publication preserves the previous imported helper subset. It + // does not upgrade imported authority merely because source fn exists. + for (value, name) in [ + (item, "parameterTypes"), + (item, "typeParameters"), + (implementation, "params"), + (body, "locals"), + (body, "bindings"), + ] { + if !array(field(value, name)?)?.is_empty() { + return Err(Error::UnsupportedProgram); + } + } + let name = text_field(item, "coordinate")?; + if name.starts_with("core.") + || definitions + .insert( + name.to_owned(), + Definition { + params: array(field(implementation, "params")?)?, + body, + result_type: text_field(item, "returnType")?, + source_owned: false, + }, + ) + .is_some() + { + return Err(Error::InvalidArtifact); + } + } + if let Ok(functions) = field(core, "functions") { + for (name, value) in map(functions)? { + let name = text(name)?; + if name.is_empty() + || name.len() > 1024 + || !name.bytes().enumerate().all(|(i, c)| { + c == b'_' || c.is_ascii_alphabetic() || (i > 0 && c.is_ascii_digit()) + }) + { + return Err(Error::InvalidArtifact); + } + if field(field(core, "intents")?, name).is_ok() + || field(field(core, "types")?, name).is_ok() + { + return Err(Error::InvalidArtifact); + } + exact_fields(value, &["params", "returnType", "body"])?; + let coordinate = format!("{}.{}", parser.coordinate, name); + if coordinate.starts_with("core.") + || definitions + .insert( + coordinate, + Definition { + params: array(field(value, "params")?)?, + body: field(value, "body")?, + result_type: text_field(value, "returnType")?, + source_owned: true, + }, + ) + .is_some() + { + return Err(Error::InvalidArtifact); + } + } + } + let mut helpers = BTreeMap::new(); + // Collect all signatures before resolving calls: definition order carries + // no execution meaning. Every body is checked, including unused functions. + for (name, definition) in &definitions { + parser.enter(0)?; + exact_fields(definition.body, &["locals", "bindings", "result"])?; + let mut scope = BTreeMap::new(); + let mut params = Vec::new(); + for parameter in definition.params { + local(parameter)?; + let id = text_field(parameter, "id")?; + if scope.insert(id, parameter).is_some() { + return Err(Error::InvalidArtifact); + } + params.push(Parameter { + id: id.to_owned(), + ty: parser.ty(text_field(parameter, "type")?, 0)?, + }); + } + let mut pending = BTreeMap::new(); + for declaration in array(field(definition.body, "locals")?)? { + local(declaration)?; + let id = text_field(declaration, "id")?; + if scope.contains_key(id) || pending.insert(id, declaration).is_some() { + return Err(Error::InvalidArtifact); + } + } + let mut bindings = Vec::new(); + for binding in array(field(definition.body, "bindings")?)? { + exact_fields(binding, &["kind", "binding", "value"])?; + require_text(binding, "kind", "let")?; + let declaration = field(binding, "binding")?; + let id = text_field(declaration, "id")?; + if pending.remove(id) != Some(declaration) { + return Err(Error::InvalidArtifact); + } + let value = field(binding, "value")?; + let actual = infer( + value, + &scope, + &definitions, + definition.source_owned, + parser, + 0, + )?; + let ty = parser.ty(text_field(declaration, "type")?, 0)?; + if !accepts(&ty, &actual) { + return Err(Error::InvalidArtifact); + } + bindings.push(Binding { + id: id.to_owned(), + ty, + value: parser.expr(value, 0)?, + }); + scope.insert(id, declaration); + } + if !pending.is_empty() { + return Err(Error::InvalidArtifact); + } + let result = field(definition.body, "result")?; + let actual = infer( + result, + &scope, + &definitions, + definition.source_owned, + parser, + 0, + )?; + let ty = parser.ty(definition.result_type, 0)?; + if !accepts(&ty, &actual) { + return Err(Error::InvalidArtifact); + } + helpers.insert( + name.clone(), + Helper { + source_owned: definition.source_owned, + params, + bindings, + result: parser.expr(result, 0)?, + ty, + }, + ); + } + let mut basis_roots = Vec::new(); + if field(core, "functions").is_ok() { + for (_, intent) in map(field(core, "intents")?)? { + let Some(basis) = map(intent)? + .iter() + .find_map(|(key, value)| (text(key) == Ok("basis")).then_some(value)) + else { + continue; + }; + let input = array(field(field(intent, "body")?, "locals")?)? + .iter() + .find(|value| text_field(value, "id") == Ok("arg.0")) + .ok_or(Error::InvalidArtifact)?; + local(input)?; + let scope = BTreeMap::from([("arg.0", input)]); + // A pure basis is retained authority, not executed work. Admit its + // input-only scope, calls and combined depth without spending Meter. + infer(basis, &scope, &definitions, true, parser, 0)?; + basis_roots.push(parser.expr(basis, 0)?); + } + } + check_roots(&helpers, basis_roots.iter(), std::iter::empty())?; + Ok(helpers) +} + +fn local(value: &Value) -> Result<(), Error> { + exact_fields(value, &["id", "type", "alphaName"])?; + for name in ["id", "type", "alphaName"] { + let value = text_field(value, name)?; + if value.is_empty() || value.len() > 1024 { + return Err(Error::InvalidArtifact); + } + } + Ok(()) +} + +fn accepts(expected: &RuntimeType, actual: &RuntimeType) -> bool { + match (expected, actual) { + (RuntimeType::Bytes { min, max }, RuntimeType::Bytes { min: a, max: b }) => { + min <= a && b <= max + } + (RuntimeType::Record(left), RuntimeType::Record(right)) => { + left.len() == right.len() + && left.iter().all(|(key, ty)| { + right + .iter() + .find(|(name, _)| name == key) + .is_some_and(|(_, value)| accepts(ty, value)) + }) + } + _ => expected == actual, + } +} + +fn join(left: RuntimeType, right: RuntimeType) -> Result { + match (left, right) { + (RuntimeType::Bytes { min: a, max: b }, RuntimeType::Bytes { min: c, max: d }) => { + Ok(RuntimeType::Bytes { + min: a.min(c), + max: b.max(d), + }) + } + (left, right) if left == right => Ok(left), + _ => Err(Error::UnsupportedProgram), + } +} + +type Scope<'a> = BTreeMap<&'a str, &'a Value>; +fn infer( + value: &Value, + scope: &Scope<'_>, + definitions: &BTreeMap>, + source: bool, + parser: &mut Parser<'_>, + depth: usize, +) -> Result { + parser.enter(depth)?; + match text_field(value, "kind")? { + "local" => { + exact_fields(value, &["kind", "ref"])?; + let reference = field(value, "ref")?; + if scope.get(text_field(reference, "id")?).copied() != Some(reference) { + return Err(Error::InvalidArtifact); + } + parser.ty(text_field(reference, "type")?, 0) + } + "const" => { + exact_fields(value, &["kind", "value"])?; + let literal = field(value, "value")?; + exact_fields(literal, &["kind", "value", "width"])?; + require_text(literal, "kind", "int")?; + let ty = parser.ty(text_field(literal, "width")?, 0)?; + if !matches!(ty, RuntimeType::Unsigned(max) if number(field(literal, "value")?)? <= max) + { + return Err(Error::UnsupportedProgram); + } + Ok(ty) + } + "field" => { + exact_fields(value, &["kind", "base", "field"])?; + let RuntimeType::Record(fields) = infer( + field(value, "base")?, + scope, + definitions, + source, + parser, + depth + 1, + )? + else { + return Err(Error::InvalidArtifact); + }; + fields + .into_iter() + .find_map(|(name, ty)| { + (text_field(value, "field") == Ok(name.as_str())).then_some(ty) + }) + .ok_or(Error::InvalidArtifact) + } + "record" => { + exact_fields(value, &["kind", "fields"])?; + let fields = map(field(value, "fields")?)? + .iter() + .map(|(name, expression)| { + Ok(( + text(name)?.to_owned(), + infer(expression, scope, definitions, source, parser, depth + 1)?, + )) + }) + .collect::, Error>>()?; + Ok(RuntimeType::Record(fields)) + } + "if" => { + exact_fields(value, &["kind", "predicate", "then", "else"])?; + check_predicate( + field(value, "predicate")?, + scope, + definitions, + source, + parser, + depth + 1, + )?; + let left = infer( + field(value, "then")?, + scope, + definitions, + source, + parser, + depth + 1, + )?; + let right = infer( + field(value, "else")?, + scope, + definitions, + source, + parser, + depth + 1, + )?; + join(left, right) + } + "call" => { + exact_fields(value, &["kind", "callee", "args", "typeArgs"])?; + let name = text_field(value, "callee")?; + let arguments = array(field(value, "args")?)?; + let types = array(field(value, "typeArgs")?)?; + if let Some(callee) = definitions.get(name) { + if (!source && callee.source_owned) + || !types.is_empty() + || arguments.len() != callee.params.len() + { + return Err(Error::InvalidArtifact); + } + for (argument, parameter) in arguments.iter().zip(callee.params) { + let actual = infer(argument, scope, definitions, source, parser, depth + 1)?; + let expected = parser.ty(text_field(parameter, "type")?, 0)?; + if !accepts(&expected, &actual) { + return Err(Error::InvalidArtifact); + } + } + return parser.ty(callee.result_type, 0); + } + let actual = arguments + .iter() + .map(|argument| infer(argument, scope, definitions, source, parser, depth + 1)) + .collect::, _>>()?; + let declared = types + .iter() + .map(|coordinate| parser.ty(text(coordinate)?, depth + 1)) + .collect::, _>>()?; + match (name, actual.as_slice(), declared.as_slice()) { + ("core.bytes.length", [actual], [expected @ RuntimeType::Bytes { .. }]) + if accepts(expected, actual) => + { + Ok(RuntimeType::Unsigned(u64::MAX)) + } + ( + "core.bytes.concat", + [left, right], + [a @ RuntimeType::Bytes { + min: a_min, + max: a_max, + }, b @ RuntimeType::Bytes { + min: b_min, + max: b_max, + }], + ) if accepts(a, left) && accepts(b, right) => Ok(RuntimeType::Bytes { + min: a_min.checked_add(*b_min).ok_or(Error::InvalidArtifact)?, + max: a_max.checked_add(*b_max).ok_or(Error::InvalidArtifact)?, + }), + // No caller where proof crosses a fresh frame. This target's + // first source-function subset proves partial intrinsics only + // from literal offsets/operands, refusing all other cases. + ("core.integer.subtract", [left, right], [expected @ RuntimeType::Unsigned(_)]) + if accepts(expected, left) && accepts(expected, right) => + { + let left = unsigned_literal(&arguments[0])?; + let right = unsigned_literal(&arguments[1])?; + left.checked_sub(right).ok_or(Error::UnsupportedProgram)?; + Ok(expected.clone()) + } + ( + "core.bytes.slice", + [actual, RuntimeType::Unsigned(a), RuntimeType::Unsigned(b)], + [expected @ RuntimeType::Bytes { min, .. }], + ) if *a == u64::MAX && *b == u64::MAX && accepts(expected, actual) => { + let start = unsigned_literal(&arguments[1])?; + let end = unsigned_literal(&arguments[2])?; + if start > end || end > *min { + return Err(Error::UnsupportedProgram); + } + Ok(RuntimeType::Bytes { + min: 0, + max: end - start, + }) + } + _ => Err(Error::UnsupportedProgram), + } + } + _ => Err(Error::UnsupportedProgram), + } +} + +fn unsigned_literal(value: &Value) -> Result { + if text_field(value, "kind")? != "const" { + return Err(Error::UnsupportedProgram); + } + number(field(field(value, "value")?, "value")?) +} +fn check_predicate( + value: &Value, + scope: &Scope<'_>, + definitions: &BTreeMap>, + source: bool, + parser: &mut Parser<'_>, + depth: usize, +) -> Result<(), Error> { + parser.enter(depth)?; + exact_fields(value, &["kind", "op", "left", "right"])?; + require_text(value, "kind", "compare")?; + let left = infer( + field(value, "left")?, + scope, + definitions, + source, + parser, + depth + 1, + )?; + let right = infer( + field(value, "right")?, + scope, + definitions, + source, + parser, + depth + 1, + )?; + match (text_field(value, "op")?, left, right) { + ("==", RuntimeType::Bytes { .. }, RuntimeType::Bytes { .. }) => Ok(()), + ("==" | "<=", RuntimeType::Unsigned(left), RuntimeType::Unsigned(right)) + if left == right => + { + Ok(()) + } + _ => Err(Error::UnsupportedProgram), + } +} + +/// Prove the actual combined expression/predicate/call aperture before running +/// any instruction. Suffix height is intrinsic, independent of traversal order. +pub(crate) fn check_roots<'a>( + helpers: &BTreeMap, + expressions: impl IntoIterator, + predicates: impl IntoIterator, +) -> Result<(), Error> { + let mut heights = Heights { + helpers, + completed: BTreeMap::new(), + visiting: BTreeSet::new(), + remaining: MAX_PROGRAM_NODES, + }; + for name in helpers.keys() { + if heights.helper(name, 1)? + 1 > MAX_DEPTH { + return Err(Error::UnsupportedProgram); + } + } + for expression in expressions { + heights.expr(expression, 0)?; + } + for predicate in predicates { + heights.predicate(predicate, 0)?; + } + Ok(()) +} +struct Heights<'a> { + helpers: &'a BTreeMap, + completed: BTreeMap, + visiting: BTreeSet, + remaining: usize, +} +impl Heights<'_> { + fn enter(&mut self, depth: usize) -> Result<(), Error> { + if depth > MAX_DEPTH { + return Err(Error::UnsupportedProgram); + } + self.remaining = self + .remaining + .checked_sub(1) + .ok_or(Error::UnsupportedProgram)?; + Ok(()) + } + fn helper(&mut self, name: &str, prefix: usize) -> Result { + self.enter(prefix)?; + if self.visiting.contains(name) { + return Err(Error::InvalidArtifact); + } + if let Some(height) = self.completed.get(name) { + if prefix + height > MAX_DEPTH { + return Err(Error::UnsupportedProgram); + } + return Ok(*height); + } + let helper = self.helpers.get(name).ok_or(Error::UnsupportedProgram)?; + self.visiting.insert(name.to_owned()); + let mut height = type_height(&helper.ty); + for parameter in &helper.params { + height = height.max(type_height(¶meter.ty)); + } + for binding in &helper.bindings { + height = height + .max(self.expr(&binding.value, prefix)?) + .max(type_height(&binding.ty)); + } + height = height.max(self.expr(&helper.result, prefix)?); + if prefix + height > MAX_DEPTH { + return Err(Error::UnsupportedProgram); + } + self.visiting.remove(name); + self.completed.insert(name.to_owned(), height); + Ok(height) + } + fn expr(&mut self, expression: &Expr, depth: usize) -> Result { + self.enter(depth)?; + let height = match expression { + Expr::Constant(_) | Expr::Local(_) => 0, + Expr::Field(base, _) => self.expr(base, depth + 1)? + 1, + Expr::Record(fields) => { + let mut maximum = 0; + for (_, value) in fields { + maximum = maximum.max(self.expr(value, depth + 1)? + 1); + } + maximum + } + Expr::If(condition, yes, no) => { + self.predicate(condition, depth + 1)? + .max(self.expr(yes, depth + 1)?) + .max(self.expr(no, depth + 1)?) + + 1 + } + Expr::Call(name, args) => { + let helper = self.helpers.get(name).ok_or(Error::UnsupportedProgram)?; + if helper.params.len() != args.len() { + return Err(Error::InvalidArtifact); + } + if helper.source_owned + && self + .visiting + .iter() + .any(|owner| !self.helpers[owner].source_owned) + { + return Err(Error::InvalidArtifact); + } + let mut maximum = self.helper(name, depth + 1)?; + for argument in args { + maximum = maximum.max(self.expr(argument, depth + 1)?); + } + maximum + 1 + } + Expr::ByteLength { value, .. } => self.expr(value, depth + 1)? + 1, + Expr::ByteSlice { + value, start, end, .. + } => { + self.expr(value, depth + 1)? + .max(self.expr(start, depth + 1)?) + .max(self.expr(end, depth + 1)?) + + 1 + } + Expr::ByteConcat { left, right, .. } | Expr::UnsignedSubtract { left, right, .. } => { + self.expr(left, depth + 1)? + .max(self.expr(right, depth + 1)?) + + 1 + } + }; + if depth + height > MAX_DEPTH { + return Err(Error::UnsupportedProgram); + } + Ok(height) + } + fn predicate(&mut self, predicate: &Predicate, depth: usize) -> Result { + self.enter(depth)?; + let height = self + .expr(&predicate.left, depth + 1)? + .max(self.expr(&predicate.right, depth + 1)?) + + 1; + if depth + height > MAX_DEPTH { + return Err(Error::UnsupportedProgram); + } + Ok(height) + } +} +fn type_height(ty: &RuntimeType) -> usize { + match ty { + RuntimeType::Record(fields) => fields + .iter() + .map(|(_, ty)| type_height(ty) + 1) + .max() + .unwrap_or(0), + _ => 0, + } +} diff --git a/crates/warp-core/src/edict_pure/model.rs b/crates/warp-core/src/edict_pure/model.rs index 099c738b6..04a40b19f 100644 --- a/crates/warp-core/src/edict_pure/model.rs +++ b/crates/warp-core/src/edict_pure/model.rs @@ -17,7 +17,7 @@ pub(crate) enum Expr { Field(Box, String), Record(Vec<(String, Expr)>), If(Box, Box, Box), - Call(String), + Call(String, Vec), ByteLength { min: u64, max: u64, @@ -58,6 +58,7 @@ pub(crate) enum Comparison { LessOrEqual, } +#[derive(Clone, Debug, PartialEq, Eq)] pub(crate) enum RuntimeType { Unsigned(u64), Bytes { min: u64, max: u64 }, @@ -70,7 +71,15 @@ pub(crate) struct Binding { pub value: Expr, } +pub(crate) struct Parameter { + pub id: String, + pub ty: RuntimeType, +} + pub(crate) struct Helper { + pub source_owned: bool, + pub params: Vec, + pub bindings: Vec, pub result: Expr, pub ty: RuntimeType, } diff --git a/crates/warp-core/src/edict_pure/syntax.rs b/crates/warp-core/src/edict_pure/syntax.rs index 3d513cce0..557dcd45c 100644 --- a/crates/warp-core/src/edict_pure/syntax.rs +++ b/crates/warp-core/src/edict_pure/syntax.rs @@ -15,7 +15,7 @@ pub(crate) struct Parser<'a> { } impl Parser<'_> { - fn enter(&mut self, depth: usize) -> Result<(), Error> { + pub(crate) fn enter(&mut self, depth: usize) -> Result<(), Error> { if depth > MAX_DEPTH { return Err(Error::UnsupportedProgram); } @@ -196,10 +196,14 @@ impl Parser<'_> { right: Box::new(self.expr(right, depth + 1)?), }); } - if !args.is_empty() || !types.is_empty() { + if !types.is_empty() { return Err(Error::UnsupportedProgram); } - Ok(Expr::Call(callee.to_owned())) + let args = args + .iter() + .map(|value| self.expr(value, depth + 1)) + .collect::, _>>()?; + Ok(Expr::Call(callee.to_owned(), args)) } pub fn predicate(&mut self, value: &Value, depth: usize) -> Result { diff --git a/crates/warp-core/src/edict_read/decode.rs b/crates/warp-core/src/edict_read/decode.rs index bf6b64853..ac9302a83 100644 --- a/crates/warp-core/src/edict_read/decode.rs +++ b/crates/warp-core/src/edict_read/decode.rs @@ -152,6 +152,17 @@ pub(super) fn package(raw: &[u8], pin: [u8; 32], host: ReadLimits) -> Result = constraints.iter().map(|(_, predicate)| predicate).collect(); + for instruction in &ordered.ordered { + match instruction { + super::model::Instruction::Read(read) => expressions.push(&read.input), + super::model::Instruction::Let { value, .. } => expressions.push(value), + super::model::Instruction::Require { predicate, .. } => predicates.push(predicate), + } + } + crate::edict_pure::functions::check_roots(&helpers, expressions, predicates)?; Ok(Program { input_id, input_type, @@ -160,6 +171,7 @@ pub(super) fn package(raw: &[u8], pin: [u8; 32], host: ReadLimits) -> Result { - let address = expression(&read.input, &locals, &helpers, &mut meter, 0)?; + let address = expression(&read.input, &locals, helpers, &mut meter, 0)?; let (node, expected_type) = address_value(&address)?; if !view.contains(node) { return Err(ReadError::OutsideAperture(node)); @@ -75,7 +75,7 @@ pub(super) fn run( locals.insert(read.binding.clone(), value); } Instruction::Let { binding, ty, value } => { - let value = expression(value, &locals, &helpers, &mut meter, 0)?; + let value = expression(value, &locals, helpers, &mut meter, 0)?; validate(&value, ty, &mut meter, 0)?; locals.insert(binding.clone(), value); } @@ -83,7 +83,7 @@ pub(super) fn run( predicate: condition, obstruction, } => { - if !predicate(condition, &locals, &helpers, &mut meter, 0)? { + if !predicate(condition, &locals, helpers, &mut meter, 0)? { return Err(ReadError::Obstructed { coordinate: obstruction.clone(), cause: ReadObstruction::Guard, @@ -92,7 +92,7 @@ pub(super) fn run( } } } - let value = expression(&program.result, &locals, &helpers, &mut meter, 0)?; + let value = expression(&program.result, &locals, helpers, &mut meter, 0)?; validate(&value, &program.output_type, &mut meter, 0)?; meter.charge(&value, 0)?; let output = encode(&value).map_err(|_| Error::InvalidArtifact)?; diff --git a/crates/warp-core/src/edict_read/model.rs b/crates/warp-core/src/edict_read/model.rs index ef4ae76c7..adf9346b4 100644 --- a/crates/warp-core/src/edict_read/model.rs +++ b/crates/warp-core/src/edict_read/model.rs @@ -2,7 +2,8 @@ // © James Ross Ω FLYING•ROBOTS use super::ReadLimits; pub(super) use crate::edict_pure::model::MAX_ARTIFACT_BYTES; -use crate::edict_pure::model::{Expr, Predicate, RuntimeType}; +use crate::edict_pure::model::{Expr, Helper, Predicate, RuntimeType}; +use std::collections::BTreeMap; pub(super) struct ReadInstruction { pub binding: String, @@ -36,5 +37,6 @@ pub(super) struct Program { pub constraints: Vec<(String, Predicate)>, pub instructions: Vec, pub result: Expr, + pub helpers: BTreeMap, pub limits: ReadLimits, } diff --git a/crates/warp-core/tests/edict_source_functions_tests.rs b/crates/warp-core/tests/edict_source_functions_tests.rs index 3c0f81108..e9f6f7970 100644 --- a/crates/warp-core/tests/edict_source_functions_tests.rs +++ b/crates/warp-core/tests/edict_source_functions_tests.rs @@ -3,84 +3,260 @@ //! Synthetic runtime boundary tests. Rebound pins are deliberately test-owned; //! these are not public compiler, provider verification or release witnesses. #![cfg(feature = "trusted_runtime")] -#![allow(clippy::unwrap_used, clippy::panic)] +#![allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)] -#[path = "support/edict_byte_concat.rs"] -mod concat; +mod concat { + use echo_edict_canonical::{encode_canonical_cbor_v1 as encode, CanonicalValueV1 as Value}; + use warp_core::edict_pure::EvaluationLimits; + pub fn package() -> Vec { + hex::decode( + include_str!("fixtures/edict-byte-concat/executable-operation-package.cbor.hex").trim(), + ) + .unwrap() + } + + pub fn limits() -> EvaluationLimits { + EvaluationLimits { + max_package_bytes: 32_768, + max_input_bytes: 2_097_152, + max_steps: 10_000, + max_allocated_bytes: 16_777_216, + max_output_bytes: 2_097_152, + } + } + + pub fn record(fields: impl IntoIterator) -> Value { + Value::Map( + fields + .into_iter() + .map(|(key, value)| (Value::Text(key.into()), value)) + .collect(), + ) + } + + pub fn input(left: &[u8], right: &[u8]) -> Vec { + encode(&record([ + ("firstFragment", Value::Bytes(left.into())), + ("secondFragment", Value::Bytes(right.into())), + ])) + .unwrap() + } + + pub fn field<'a>(value: &'a Value, name: &str) -> &'a Value { + let Value::Map(fields) = value else { + panic!("map") + }; + &fields + .iter() + .find(|(key, _)| key == &Value::Text(name.into())) + .unwrap() + .1 + } + + pub fn field_mut<'a>(value: &'a mut Value, name: &str) -> &'a mut Value { + let Value::Map(fields) = value else { + panic!("map") + }; + &mut fields + .iter_mut() + .find(|(key, _)| key == &Value::Text(name.into())) + .unwrap() + .1 + } + + pub fn set_field(value: &mut Value, name: &str, replacement: Value) { + *field_mut(value, name) = replacement; + } +} + +use concat::{field, field_mut, record, set_field}; use echo_edict_canonical::{ decode_canonical_cbor_v1 as decode, digest_canonical_value_bytes_v1 as digest, encode_canonical_cbor_v1 as encode, CanonicalValueV1 as Value, }; -use concat::{field, field_mut, record, set_field}; use warp_core::edict_pure::{evaluate, EvaluationError}; -fn text(value: &str) -> Value { Value::Text(value.into()) } -fn array(values: Vec) -> Value { Value::Array(values) } +fn text(value: &str) -> Value { + Value::Text(value.into()) +} +fn array(values: Vec) -> Value { + Value::Array(values) +} fn insert(value: &mut Value, key: &str, replacement: Value) { - let Value::Map(entries) = value else { panic!("map") }; + let Value::Map(entries) = value else { + panic!("map") + }; assert!(!entries.iter().any(|(name, _)| name == &text(key))); entries.push((text(key), replacement)); } fn local(id: &str, ty: &str) -> Value { - record([("id", text(id)), ("alphaName", text(id)), ("type", text(ty))]) + record([ + ("id", text(id)), + ("alphaName", text(id)), + ("type", text(ty)), + ]) } fn reference(local: &Value) -> Value { record([("kind", text("local")), ("ref", local.clone())]) } fn call(callee: &str, args: Vec) -> Value { - record([("kind", text("call")), ("callee", text(callee)), - ("args", array(args)), ("typeArgs", array(vec![]))]) + record([ + ("kind", text("call")), + ("callee", text(callee)), + ("args", array(args)), + ("typeArgs", array(vec![])), + ]) } -fn function(params: Vec, ty: &str, locals: Vec, bindings: Vec, result: Value) -> Value { - record([("params", array(params)), ("returnType", text(ty)), - ("body", record([("locals", array(locals)), ("bindings", array(bindings)), ("result", result)]))]) +fn function( + params: Vec, + ty: &str, + locals: Vec, + bindings: Vec, + result: Value, +) -> Value { + record([ + ("params", array(params)), + ("returnType", text(ty)), + ( + "body", + record([ + ("locals", array(locals)), + ("bindings", array(bindings)), + ("result", result), + ]), + ), + ]) } fn embedded(program: &Value, name: &str) -> Value { - let Value::Bytes(bytes) = field(program, name) else { panic!("artifact bytes") }; + let Value::Bytes(bytes) = field(program, name) else { + panic!("artifact bytes") + }; decode(bytes).unwrap() } -fn rewrite(raw: Vec, edit: impl FnOnce(&mut Value, &mut Value, &mut Value)) -> (Vec, [u8; 32]) { +fn rewrite( + raw: Vec, + edit: impl FnOnce(&mut Value, &mut Value, &mut Value), +) -> (Vec, [u8; 32]) { let mut package = decode(&raw).unwrap(); let mut program = embedded(&package, "program"); let mut core = embedded(&program, "core_artifact"); let mut target = embedded(&program, "target_ir_artifact"); edit(&mut program, &mut core, &mut target); let core_digest = digest("edict.core.module/v1", &core).unwrap(); - let core_ref = record([("id", field(&core, "coordinate").clone()), - ("digest", array(vec![text("sha256"), Value::Bytes(core_digest.into())]))]); - set_field(field_mut(&mut target, "semanticClosure"), "sourceCore", core_ref); + set_field( + field_mut(&mut package, "semantic_closure"), + "canonical_meaning_identity", + Value::Bytes(core_digest.into()), + ); + let core_ref = record([ + ("id", field(&core, "coordinate").clone()), + ( + "digest", + array(vec![text("sha256"), Value::Bytes(core_digest.into())]), + ), + ]); + set_field( + field_mut(&mut target, "semanticClosure"), + "sourceCore", + core_ref, + ); for (key, closure, domain, value) in [ - ("core_artifact", "core_identity", "edict.core.module/v1", core), - ("target_ir_artifact", "target_ir_identity", "edict.target-ir.artifact/v1", target), + ( + "core_artifact", + "core_identity", + "edict.core.module/v1", + core, + ), + ( + "target_ir_artifact", + "target_ir_identity", + "edict.target-ir.artifact/v1", + target, + ), ] { set_field(&mut program, key, Value::Bytes(encode(&value).unwrap())); - set_field(field_mut(&mut package, "semantic_closure"), closure, - Value::Bytes(digest(domain, &value).unwrap().into())); + set_field( + field_mut(&mut package, "semantic_closure"), + closure, + Value::Bytes(digest(domain, &value).unwrap().into()), + ); } - set_field(&mut package, "program", Value::Bytes(encode(&program).unwrap())); + set_field( + &mut package, + "program", + Value::Bytes(encode(&program).unwrap()), + ); let pin = digest("echo.operation-package/v1", &package).unwrap(); (encode(&package).unwrap(), pin) } fn factored_concat() -> (Vec, [u8; 32]) { rewrite(concat::package(), |_, core, target| { - let coordinate = match field(core, "coordinate") { Value::Text(value) => value.clone(), _ => panic!("coordinate") }; + let coordinate = match field(core, "coordinate") { + Value::Text(value) => value.clone(), + _ => panic!("coordinate"), + }; let left = local("arg.0", "Bytes"); let right = local("arg.1", "Bytes"); let saved = local("local.0", "Bytes"); - let mut intrinsic = call("core.bytes.concat", vec![reference(&left), reference(&right)]); - set_field(&mut intrinsic, "typeArgs", array(vec![text("Bytes"), text("Bytes")])); - let join = function(vec![left.clone(), right.clone()], "Bytes", vec![], vec![], intrinsic); - let binding = record([("kind", text("let")), ("binding", saved.clone()), - ("value", call(&format!("{coordinate}.join"), vec![reference(&left), reference(&right)]))]); - let assemble = function(vec![left, right], "Bytes", vec![saved.clone()], vec![binding], reference(&saved)); - insert(core, "functions", record([("assemble", assemble), ("join", join)])); + let mut intrinsic = call( + "core.bytes.concat", + vec![reference(&left), reference(&right)], + ); + set_field( + &mut intrinsic, + "typeArgs", + array(vec![text("Bytes"), text("Bytes")]), + ); + let join = function( + vec![left.clone(), right.clone()], + "Bytes", + vec![], + vec![], + intrinsic, + ); + let binding = record([ + ("kind", text("let")), + ("binding", saved.clone()), + ( + "value", + call( + &format!("{coordinate}.join"), + vec![reference(&left), reference(&right)], + ), + ), + ]); + let assemble = function( + vec![left, right], + "Bytes", + vec![saved.clone()], + vec![binding], + reference(&saved), + ); + insert( + core, + "functions", + record([("assemble", assemble), ("join", join)]), + ); for (artifact, bindings) in [(core, "nodes"), (target, "pureBindings")] { let intent = field_mut(field_mut(artifact, "intents"), "assembleRange"); - let body = if bindings == "nodes" { field_mut(intent, "body") } else { intent }; - let Value::Array(nodes) = field_mut(body, bindings) else { panic!("bindings") }; - let args = match field(field(&nodes[0], "value"), "args") { Value::Array(args) => args.clone(), _ => panic!("args") }; - set_field(&mut nodes[0], "value", call(&format!("{coordinate}.assemble"), args)); + let body = if bindings == "nodes" { + field_mut(intent, "body") + } else { + intent + }; + let Value::Array(nodes) = field_mut(body, bindings) else { + panic!("bindings") + }; + let args = match field(field(&nodes[0], "value"), "args") { + Value::Array(args) => args.clone(), + _ => panic!("args"), + }; + set_field( + &mut nodes[0], + "value", + call(&format!("{coordinate}.assemble"), args), + ); } }) } @@ -88,10 +264,19 @@ fn factored_concat() -> (Vec, [u8; 32]) { #[test] fn source_functions_nested_forward_calls_and_bindings_use_fresh_parameter_frames() { let (package, pin) = factored_concat(); - for (left, right) in [(b"".as_slice(), b"".as_slice()), (b"ab", b"cd"), (b"cd", b"ab"), (&[0,255], &[128,127])] { - let result = evaluate(&package, pin, &concat::input(left, right), concat::limits()).unwrap(); + for (left, right) in [ + (b"".as_slice(), b"".as_slice()), + (b"ab", b"cd"), + (b"cd", b"ab"), + (&[0, 255], &[128, 127]), + ] { + let result = + evaluate(&package, pin, &concat::input(left, right), concat::limits()).unwrap(); let expected = [left, right].concat(); - assert_eq!(result.output, encode(&record([("bytes", Value::Bytes(expected))])).unwrap()); + assert_eq!( + result.output, + encode(&record([("bytes", Value::Bytes(expected))])).unwrap() + ); } } @@ -106,10 +291,16 @@ fn source_functions_nested_frames_share_the_same_cumulative_meter() { assert_eq!(evaluate(&package, pin, &supplied, exact).unwrap(), result); let mut short = exact; short.max_steps -= 1; - assert_eq!(evaluate(&package, pin, &supplied, short), Err(EvaluationError::StepBudgetExceeded)); + assert_eq!( + evaluate(&package, pin, &supplied, short), + Err(EvaluationError::StepBudgetExceeded) + ); short = exact; short.max_allocated_bytes -= 1; - assert_eq!(evaluate(&package, pin, &supplied, short), Err(EvaluationError::AllocationBudgetExceeded)); + assert_eq!( + evaluate(&package, pin, &supplied, short), + Err(EvaluationError::AllocationBudgetExceeded) + ); } #[test] @@ -117,66 +308,597 @@ fn source_functions_unused_malformed_definition_is_not_silently_ignored() { let (package, pin) = rewrite(concat::package(), |_, core, _| { insert(core, "functions", record([("unused", Value::Null)])); }); - assert!(evaluate(&package, pin, &concat::input(b"a", b"b"), concat::limits()).is_err(), - "runtime ignored authenticated malformed source authority"); + assert!( + evaluate(&package, pin, &concat::input(b"a", b"b"), concat::limits()).is_err(), + "runtime ignored authenticated malformed source authority" + ); } #[test] fn source_functions_bounded_read_passes_a_real_retained_atom_to_a_helper() { use warp_core::edict_read::{evaluate as read, ReadBasis, ReadLimits, ReadView}; - use warp_core::{make_node_id, make_type_id, AtomPayload, AttachmentValue, GraphStore, NodeKey, NodeRecord, - WorldlineFrontier, WorldlineId, WorldlineState}; - let original = hex::decode(include_str!("fixtures/edict-node-read/single-executable-operation-package.hex").trim()).unwrap(); + use warp_core::{ + make_node_id, make_type_id, AtomPayload, AttachmentValue, GraphStore, NodeKey, NodeRecord, + WorldlineFrontier, WorldlineId, WorldlineState, + }; + let original = hex::decode( + include_str!("fixtures/edict-node-read/single-executable-operation-package.hex").trim(), + ) + .unwrap(); let (package, pin) = rewrite(original, |program, core, target| { - let coordinate = match field(core, "coordinate") { Value::Text(value) => value.clone(), _ => panic!("coordinate") }; - let output_type = match field(field(field(core, "intents"), "replaceRange"), "output") { Value::Text(value) => value.clone(), _ => panic!("output") }; + let coordinate = match field(core, "coordinate") { + Value::Text(value) => value.clone(), + _ => panic!("coordinate"), + }; + let output_type = match field(field(field(core, "intents"), "replaceRange"), "output") { + Value::Text(value) => value.clone(), + _ => panic!("output"), + }; let parameter = local("arg.0", &output_type); - insert(core, "functions", record([("retain", function(vec![parameter.clone()], &output_type, vec![], vec![], reference(¶meter)))])); + insert( + core, + "functions", + record([( + "retain", + function( + vec![parameter.clone()], + &output_type, + vec![], + vec![], + reference(¶meter), + ), + )]), + ); let saved = local("source.return", &output_type); - let body = field_mut(field_mut(field_mut(core, "intents"), "replaceRange"), "body"); - let helper = call(&format!("{coordinate}.retain"), vec![field(body, "result").clone()]); - let Value::Array(locals) = field_mut(body, "locals") else { panic!("locals") }; + let body = field_mut( + field_mut(field_mut(core, "intents"), "replaceRange"), + "body", + ); + let helper = call( + &format!("{coordinate}.retain"), + vec![field(body, "result").clone()], + ); + let Value::Array(locals) = field_mut(body, "locals") else { + panic!("locals") + }; locals.push(saved.clone()); - let Value::Array(nodes) = field_mut(body, "nodes") else { panic!("nodes") }; - nodes.push(record([("kind", text("let")), ("binding", saved.clone()), ("value", helper.clone())])); + let Value::Array(nodes) = field_mut(body, "nodes") else { + panic!("nodes") + }; + nodes.push(record([ + ("kind", text("let")), + ("binding", saved.clone()), + ("value", helper.clone()), + ])); set_field(body, "result", reference(&saved)); let intent = field_mut(field_mut(target, "intents"), "replaceRange"); - let binding = record([("id", text("replaceRange.binding.source")), ("binding", saved.clone()), ("value", helper)]); + let binding = record([ + ("id", text("replaceRange.binding.source")), + ("binding", saved.clone()), + ("value", helper), + ]); if let Value::Map(entries) = intent { - if let Some((_, Value::Array(bindings))) = entries.iter_mut().find(|(key, _)| key == &text("pureBindings")) { bindings.push(binding); } - else { entries.push((text("pureBindings"), array(vec![binding]))); } + if let Some((_, Value::Array(bindings))) = entries + .iter_mut() + .find(|(key, _)| key == &text("pureBindings")) + { + bindings.push(binding); + } else { + entries.push((text("pureBindings"), array(vec![binding]))); + } } - let Value::Array(order) = field_mut(intent, "executionOrder") else { panic!("order") }; + let Value::Array(order) = field_mut(intent, "executionOrder") else { + panic!("order") + }; order.push(text("replaceRange.binding.source")); set_field(intent, "result", reference(&saved)); let mut projection = embedded(program, "result_projection_artifact"); - set_field(&mut projection, "expression", record([("kind", text("source")), - ("source", record([("kind", text("pureBinding")), ("bindingId", text("replaceRange.binding.source"))])), - ("path", array(vec![]))])); - set_field(program, "result_projection_artifact", Value::Bytes(encode(&projection).unwrap())); + set_field( + &mut projection, + "expression", + record([ + ("kind", text("source")), + ( + "source", + record([ + ("kind", text("pureBinding")), + ("bindingId", text("replaceRange.binding.source")), + ]), + ), + ("path", array(vec![])), + ]), + ); + set_field( + program, + "result_projection_artifact", + Value::Bytes(encode(&projection).unwrap()), + ); }); let mut store = GraphStore::default(); let node = make_node_id("source-function-read"); - store.insert_node(node, NodeRecord { ty: make_type_id("node") }); - store.set_node_attachment(node, Some(AttachmentValue::Atom(AtomPayload { - type_id: make_type_id("document"), bytes: b"alpha".to_vec().into(), - }))); - let key = NodeKey { warp_id: store.warp_id(), local_id: node }; + store.insert_node( + node, + NodeRecord { + ty: make_type_id("node"), + }, + ); + store.set_node_attachment( + node, + Some(AttachmentValue::Atom(AtomPayload { + type_id: make_type_id("document"), + bytes: b"alpha".to_vec().into(), + })), + ); + let key = NodeKey { + warp_id: store.warp_id(), + local_id: node, + }; let state = WorldlineState::from_root_store(store, node).unwrap(); let frontier = WorldlineFrontier::new(WorldlineId::from_bytes([7; 32]), state); let before = frontier.state().state_root(); let basis = ReadBasis::at(&frontier); let aperture = [key]; let view = ReadView::new(&frontier, basis, &aperture).unwrap(); - let supplied = encode(&record([("address", record([ - ("warpId", Value::Bytes(key.warp_id.0.to_vec())), - ("nodeId", Value::Bytes(key.local_id.0.to_vec())), - ("typeId", Value::Bytes(make_type_id("document").0.to_vec()))])), - ("expected", Value::Bytes(b"alpha".to_vec()))])).unwrap(); - let limits = ReadLimits { evaluation: concat::limits(), max_reads: 1, max_read_bytes: 5 }; + let supplied = encode(&record([ + ( + "address", + record([ + ("warpId", Value::Bytes(key.warp_id.0.to_vec())), + ("nodeId", Value::Bytes(key.local_id.0.to_vec())), + ("typeId", Value::Bytes(make_type_id("document").0.to_vec())), + ]), + ), + ("expected", Value::Bytes(b"alpha".to_vec())), + ])) + .unwrap(); + let limits = ReadLimits { + evaluation: concat::limits(), + max_reads: 1, + max_read_bytes: 5, + }; let result = read(&package, pin, &supplied, &view, limits).unwrap(); - assert_eq!(decode(&result.output).unwrap(), Value::Bytes(b"alpha".to_vec())); + assert_eq!( + decode(&result.output).unwrap(), + Value::Bytes(b"alpha".to_vec()) + ); assert_eq!((result.reads, result.read_bytes), (1, 5)); assert_eq!(result.basis, basis); assert_eq!(frontier.state().state_root(), before); } + +#[test] +fn source_functions_complete_graph_depth_counts_every_shared_suffix_in_both_orders() { + for count in [64, 65] { + for shallow_first in [false, true] { + let (package, pin) = rewrite(concat::package(), |_, core, _| { + let Value::Text(coordinate) = field(core, "coordinate") else { + panic!("coordinate") + }; + let coordinate = coordinate.clone(); + let name = |index: usize| { + format!( + "f{:03}", + if shallow_first { + count - 1 - index + } else { + index + } + ) + }; + let mut functions = Vec::new(); + for index in 0..count { + let result = if index + 1 == count { + record([ + ("kind", text("const")), + ( + "value", + record([ + ("kind", text("int")), + ("width", text("U64")), + ("value", Value::Integer(7)), + ]), + ), + ]) + } else { + call(&format!("{coordinate}.{}", name(index + 1)), vec![]) + }; + functions.push(( + text(&name(index)), + function(vec![], "U64", vec![], vec![], result), + )); + } + insert(core, "functions", Value::Map(functions)); + }); + let result = evaluate(&package, pin, &concat::input(b"a", b"b"), concat::limits()); + if count == 64 { + assert!( + result.is_ok(), + "exact depth, shallow first {shallow_first}: {result:?}" + ); + } else { + assert_eq!( + result, + Err(EvaluationError::UnsupportedProgram), + "over depth, shallow first {shallow_first}" + ); + } + } + } +} + +#[test] +fn source_functions_unused_definition_cannot_collide_with_an_intent() { + let (package, pin) = rewrite(concat::package(), |_, core, _| { + let result = record([ + ("kind", text("const")), + ( + "value", + record([ + ("kind", text("int")), + ("width", text("U64")), + ("value", Value::Integer(7)), + ]), + ), + ]); + insert( + core, + "functions", + record([( + "assembleRange", + function(vec![], "U64", vec![], vec![], result), + )]), + ); + }); + assert!( + evaluate(&package, pin, &concat::input(b"a", b"b"), concat::limits()).is_err(), + "a source function and intent cannot share one module member" + ); +} + +// The expected counters below are derived from the public fixed-cell meter: +// input materialization S = 347 + L + R; each field selection copies S; +// repeat(N) costs 18 + 2*N steps and S + 192 + 4*N storage. The unused +// second parameter must still pay for its argument exactly once. +fn metered_arguments(reverse: bool, lazy: Option) -> (Vec, [u8; 32]) { + rewrite(concat::package(), |_, core, target| { + let Value::Text(coordinate) = field(core, "coordinate") else { + panic!("coordinate") + }; + let coordinate = coordinate.clone(); + let value = local("arg.0", "Bytes"); + let left = local("arg.0", "Bytes"); + let right = local("arg.1", "Bytes"); + let mut duplicate = call( + "core.bytes.concat", + vec![reference(&value), reference(&value)], + ); + set_field( + &mut duplicate, + "typeArgs", + array(vec![text("Bytes"), text("Bytes")]), + ); + insert( + core, + "functions", + record([ + ( + "repeat", + function(vec![value], "Bytes", vec![], vec![], duplicate), + ), + ( + "first", + function( + vec![left.clone(), right], + "Bytes", + vec![], + vec![], + reference(&left), + ), + ), + ]), + ); + for (artifact, bindings) in [(core, "nodes"), (target, "pureBindings")] { + let intent = field_mut(field_mut(artifact, "intents"), "assembleRange"); + let body = if bindings == "nodes" { + field_mut(intent, "body") + } else { + intent + }; + let Value::Array(nodes) = field_mut(body, bindings) else { + panic!("bindings") + }; + let Value::Array(original) = field(field(&nodes[0], "value"), "args") else { + panic!("args") + }; + let repeat = |argument| call(&format!("{coordinate}.repeat"), vec![argument]); + let first = match lazy { + None => repeat(original[0].clone()), + Some(expensive_else) => { + let predicate = record([ + ("kind", text("compare")), + ("op", text("==")), + ("left", original[0].clone()), + ("right", original[1].clone()), + ]); + let cheap = original[0].clone(); + let costly = repeat(cheap.clone()); + let (yes, no) = if expensive_else { + (cheap, costly) + } else { + (costly, cheap) + }; + record([ + ("kind", text("if")), + ("predicate", predicate), + ("then", yes), + ("else", no), + ]) + } + }; + let mut args = vec![first, repeat(original[1].clone())]; + if reverse { + args.reverse(); + } + set_field( + &mut nodes[0], + "value", + call(&format!("{coordinate}.first"), args), + ); + } + }) +} + +#[test] +fn source_functions_evaluate_used_and_unused_arguments_once_with_fixed_cost_oracles() { + let (package, pin) = metered_arguments(false, None); + for (left, right) in [ + (b"".as_slice(), b"".as_slice()), + (b"ab", b"cde"), + (b"12345678", b"12345678"), + ] { + let (l, r) = (left.len() as u64, right.len() as u64); + let mut exact = concat::limits(); + exact.max_steps = 59 + 2 * (l + r); + exact.max_allocated_bytes = 1883 + 13 * l + 7 * r; + let input = concat::input(left, right); + let result = + evaluate(&package, pin, &input, exact).expect("independently calculated exact budget"); + assert_eq!( + (result.steps, result.allocated_bytes), + (exact.max_steps, exact.max_allocated_bytes) + ); + assert_eq!( + decode(&result.output).unwrap(), + record([("bytes", Value::Bytes([left, left].concat()))]) + ); + let mut short = exact; + short.max_steps -= 1; + assert_eq!( + evaluate(&package, pin, &input, short), + Err(EvaluationError::StepBudgetExceeded) + ); + short = exact; + short.max_allocated_bytes -= 1; + assert_eq!( + evaluate(&package, pin, &input, short), + Err(EvaluationError::AllocationBudgetExceeded) + ); + } +} + +#[test] +fn source_functions_argument_order_is_observable_through_distinct_budget_refusals() { + let mut limits = concat::limits(); + limits.max_steps = 30; + limits.max_allocated_bytes = 890; + let input = concat::input(b"12345678", b""); + let (package, pin) = metered_arguments(false, None); + assert_eq!( + evaluate(&package, pin, &input, limits), + Err(EvaluationError::StepBudgetExceeded) + ); + let (package, pin) = metered_arguments(true, None); + assert_eq!( + evaluate(&package, pin, &input, limits), + Err(EvaluationError::AllocationBudgetExceeded) + ); +} + +#[test] +fn source_functions_only_the_selected_valid_branch_spends_execution_budget() { + let input = concat::input(b"12345678", b""); + for expensive_else in [false, true] { + let (package, pin) = metered_arguments(false, Some(expensive_else)); + let mut exact = concat::limits(); + exact.max_steps = if expensive_else { 99 } else { 72 }; + exact.max_allocated_bytes = if expensive_else { 2697 } else { 2449 }; + let result = evaluate(&package, pin, &input, exact).expect("selected branch exact budget"); + assert_eq!( + (result.steps, result.allocated_bytes), + (exact.max_steps, exact.max_allocated_bytes) + ); + let expected = if expensive_else { + b"1234567812345678".as_slice() + } else { + b"12345678".as_slice() + }; + assert_eq!( + decode(&result.output).unwrap(), + record([("bytes", Value::Bytes(expected.to_vec()))]) + ); + } +} + +#[test] +fn source_functions_executed_call_depth_includes_surrounding_predicate_frames() { + for count in [62, 63] { + for shallow_first in [false, true] { + let (package, pin) = rewrite(concat::package(), |_, core, target| { + let Value::Text(coordinate) = field(core, "coordinate") else { + panic!("coordinate") + }; + let coordinate = coordinate.clone(); + let name = |index: usize| { + format!( + "f{:03}", + if shallow_first { + count - 1 - index + } else { + index + } + ) + }; + let one = record([ + ("kind", text("const")), + ( + "value", + record([ + ("kind", text("int")), + ("width", text("U64")), + ("value", Value::Integer(1)), + ]), + ), + ]); + let functions = (0..count) + .map(|index| { + let result = if index + 1 == count { + one.clone() + } else { + call(&format!("{coordinate}.{}", name(index + 1)), vec![]) + }; + ( + text(&name(index)), + function(vec![], "U64", vec![], vec![], result), + ) + }) + .collect(); + insert(core, "functions", Value::Map(functions)); + for (artifact, key) in [(core, "nodes"), (target, "pureBindings")] { + let intent = field_mut(field_mut(artifact, "intents"), "assembleRange"); + let body = if key == "nodes" { + field_mut(intent, "body") + } else { + intent + }; + let Value::Array(nodes) = field_mut(body, key) else { + panic!("nodes") + }; + let original = field(&nodes[0], "value").clone(); + let predicate = record([ + ("kind", text("compare")), + ("op", text("==")), + ("left", call(&format!("{coordinate}.{}", name(0)), vec![])), + ("right", one.clone()), + ]); + set_field( + &mut nodes[0], + "value", + record([ + ("kind", text("if")), + ("predicate", predicate), + ("then", original.clone()), + ("else", original), + ]), + ); + } + }); + let result = evaluate(&package, pin, &concat::input(b"ab", b"c"), concat::limits()); + if count == 62 { + let result = result.expect( + "62 function frames plus two surrounding predicate frames execute at 64", + ); + assert_eq!( + decode(&result.output).unwrap(), + record([("bytes", Value::Bytes(b"abc".to_vec()))]) + ); + } else { + assert_eq!( + result, + Err(EvaluationError::UnsupportedProgram), + "65 total frames, shallow first {shallow_first}" + ); + } + } + } +} + +#[test] +fn source_functions_pure_input_uses_arg_zero_identity_after_declaration_reordering() { + let (original, _) = factored_concat(); + let (package, pin) = rewrite(original, |_, core, _| { + let body = field_mut( + field_mut(field_mut(core, "intents"), "assembleRange"), + "body", + ); + let Value::Array(locals) = field_mut(body, "locals") else { + panic!("locals") + }; + assert!(locals.len() > 1); + locals.reverse(); + }); + let result = evaluate( + &package, + pin, + &concat::input(b"ab", b"cd"), + concat::limits(), + ) + .expect("provider-admitted declaration inventory order"); + assert_eq!( + decode(&result.output).unwrap(), + record([("bytes", Value::Bytes(b"abcd".to_vec()))]) + ); +} + +#[test] +fn source_functions_pure_basis_is_admitted_but_does_not_spend_execution_budget() { + let (baseline, baseline_pin) = factored_concat(); + let input = concat::input(b"ab", b"cd"); + let expected = evaluate(&baseline, baseline_pin, &input, concat::limits()).unwrap(); + for case in ["none", "valid", "null", "unknown", "arity", "capture"] { + let (package, pin) = rewrite(baseline.clone(), |_, core, target| { + let Value::Text(coordinate) = field(core, "coordinate") else { + panic!("coordinate") + }; + let coordinate = coordinate.clone(); + let one = record([ + ("kind", text("const")), + ( + "value", + record([ + ("kind", text("int")), + ("width", text("U64")), + ("value", Value::Integer(1)), + ]), + ), + ]); + insert( + field_mut(core, "functions"), + "basisValue", + function(vec![], "U64", vec![], vec![], one.clone()), + ); + let expression = match case { + "none" | "null" => Value::Null, + "valid" => call(&format!("{coordinate}.basisValue"), vec![]), + "unknown" => call(&format!("{coordinate}.missing"), vec![]), + "arity" => call(&format!("{coordinate}.basisValue"), vec![one]), + "capture" => reference(&local("local.0", "Bytes")), + _ => panic!("case"), + }; + if case != "none" { + for artifact in [core, target] { + insert( + field_mut(field_mut(artifact, "intents"), "assembleRange"), + "basis", + expression.clone(), + ); + } + } + }); + let result = evaluate(&package, pin, &input, concat::limits()); + if ["none", "valid"].contains(&case) { + assert_eq!(result.unwrap(), expected); + } else { + assert!(result.is_err(), "invalid basis {case} was ignored"); + } + } +} diff --git a/docs/architecture/application-contract-hosting.md b/docs/architecture/application-contract-hosting.md index 659899bd7..906d7c320 100644 --- a/docs/architecture/application-contract-hosting.md +++ b/docs/architecture/application-contract-hosting.md @@ -185,14 +185,15 @@ clock, native callback, or WAL access and produces no Tick or Receipt. The interpreter implements the generic subset demanded by the first real compiler witness: unsigned integer constants, records, locals, field access, integer equality and ordering, bounded byte equality, lazy conditionals, and -zero-argument authored pure helpers, plus `core.integer.subtract` with -two operands. Subtraction +source-owned pure functions with ordered parameters and local bindings, +separately authenticated zero-argument imported helpers, and +`core.integer.subtract` with two operands. Subtraction validates both values against the declared unsigned width and refuses underflow with `InvalidArtifact`; it never wraps or saturates. Operands and the result use the ordinary execution meter. The compiler and target verifier own static totality evidence; the interpreter additionally checks runtime values even when -the supplied package pin matches. Calls resolve opaque lawpack coordinates to retained Edict bodies -with separate lexical scope. No application coordinate selects a native +the supplied package pin matches. Calls resolve opaque source or lawpack +coordinates to retained Edict bodies with separate lexical scope. No application coordinate selects a native implementation. Unsupported expression forms are rejected during decoding, including unselected branches. Authored runtime types constrain input, bindings, helper returns, and output. Nominal contracts resolve their declared @@ -251,6 +252,70 @@ the canonical decoder's node limit, and a 64-level interpreter depth limit. Syntax and type expansion share a 65,536-node decode budget. Decode and code storage are bounded by those admission apertures, outside execution accounting. +Source functions remain authoritative in `Core.functions`; Target IR retains +calls to their fully qualified coordinates. Both pure and bounded-read providers +validate the complete source/imported function closure, including unused +functions. The lowerer derives a forward judgment, while the independent +verifier audits dependency summaries and lexical frames before checking the +Core/Target relation. Rebinding artifact hashes does not establish that relation. +Unknown or colliding function names, wrong argument types or arity, generic +calls, cycles, undeclared or duplicate locals, forward local references, and +caller-local captures reject. Imported functions cannot refer back to +source-owned functions. The imported subset remains zero-argument bodies without +local bindings. + +Each call evaluates every argument once, from left to right in the caller's +frame, including unused arguments. Validated argument values move into a fresh +parameter-only frame. Ordered local bindings and the return value are validated +there. Parameter reads incur their ordinary copy charges. The operation shares +one cumulative execution meter across arguments, nested calls, bindings and +returns; returning from a frame does not refund allocation charges. Conditional +branches are checked during admission, but only the selected branch executes. +Read instructions obtain opaque atom bytes before passing ordinary values to a +pure helper; helpers gain no read or mutation authority. + +The pure profile retains an optional authored basis and checks any present +expression under the input-only scope, including call signatures and combined +depth. `basis none` omits the canonical field; a present null rejects. Private +pure evaluation does not resolve, execute or charge that basis, so valid basis +helpers do not change its result or runtime counters. The bounded-read profile +executes and charges its basis expression as part of the operation. This is a +target-profile distinction, not permission to retain malformed basis authority. + +The source-function target subset supports unsigned words, bounded bytes, +records and nominal representations, with U32/U64 integer literals. Boolean, +string, list, variant and effectful helper forms receive provider refusal. +For modules containing source functions, partial subtraction and slicing need +literal evidence sufficient for totality: ordered unsigned operands, or ordered +U64 slice offsets within the operand's guaranteed minimum length. Caller +`where` constraints are not inherited into helper frames. Function-free legacy +fixtures retain their existing admission and runtime behavior. + +Source-function admission derives conservative bounds for the whole operation: +input validation and materialization, every argument and call occurrence, +ordered bindings, parameter and return checks, predicate and byte work, +bounded reads, output validation, and encoding scratch. Branch bounds take +the maximum after predicate work. Checked arithmetic rejects overflow, and +shared dependency summaries do not deduplicate repeated execution. A declared +step, allocation or output ceiling below the derived bound rejects before +package acceptance; tighter host ceilings can still refuse an evaluation. + +The combined interpreter aperture is 64 levels across surrounding expressions, +predicates and calls, including nested parameter, binding and return validation. +Admission checks every source and imported suffix independently of traversal +order. This is stricter than Edict's separate 128-source-helper compiler limit; +that compiler limit does not promise 128-frame Echo execution. Syntax and type +expansion remain bounded separately from runtime value materialization. + +The native +[`edict_source_functions_tests.rs`](../../crates/warp-core/tests/edict_source_functions_tests.rs) +uses deliberately rebound test-owned packages to check fresh frames, argument +order and single evaluation, cumulative fixed-cost oracles, lazy branches, +combined depth, malformed authority, and a real stored atom passed to a helper. +These synthetic boundary controls establish no public compiler or release +provenance by themselves. Its Cargo target requires `trusted_runtime`; CI and +local affected-test routing select the same feature explicitly. + The executable witness is [`edict_pure_evaluation_tests.rs`](../../crates/warp-core/tests/edict_pure_evaluation_tests.rs). It consumes retained exact external compiler output, checks both authored @@ -340,9 +405,12 @@ selects the original publication. The native lowerer source additionally recognizes the opt-in `compiler-produced-bounded-read/v1` configuration. This separate profile carries explicit read-count and aggregate read-byte ceilings; it does not reinterpret -pure packages as effectful programs. Its current expression subset covers -locals, record construction/selection, byte equality, and unsigned equality or -ordering guards. Reads select opaque atom bytes by WARP/node/expected-type IDs. +pure packages as effectful programs. Its expression subset includes typed +source/imported helper calls, U32/U64 constants, lazy conditionals, byte length +and concatenation, locals, record construction/selection, byte equality, and +unsigned equality or ordering guards. The source-function totality and resource +rules above also apply to this route. Reads select opaque atom bytes by +WARP/node/expected-type IDs. Core and ordered Target IR must agree on every producer, guard, failure mapping, and result, with exact imported read signatures and scoped local identities. The package retains source, Core, Target IR, exports, lawpack, adapter, @@ -521,7 +589,7 @@ proofs establish schema, identity-graph, component-contract, and request readiness only. They still do not install, authorize, schedule, execute, commit, observe, or receipt anything in Echo. -The publishable Rust crate uses a separate 40-file package-local carrier tree +The publishable Rust crate uses a separate 42-file package-local carrier tree for exact repository sources and provider bytes that would otherwise live above the crate root. Carrier locations never replace the logical authored paths in generation provenance. Generated artifacts and components remain authoritative; diff --git a/schemas/edict-provider/README.md b/schemas/edict-provider/README.md index 6bd0e7df3..59c6938ef 100644 --- a/schemas/edict-provider/README.md +++ b/schemas/edict-provider/README.md @@ -338,7 +338,15 @@ proofs without guest invocation. Schema-valid resource substitution, reference swaps, authority-source disagreement, and malformed contract material fail before execution. This does not grant Echo runtime authority. -The crate-local `assets/v1/` tree is an exact 40-file publication carrier for +The [source-function contract publication](contracts/source-functions-v1/README.md) +is selected explicitly through `ProviderContractPublicationV1::SourceFunctions`. +It preserves the existing pure-binding and ordered publication bytes and does +not change the default checked generation route. Its candidate generator uses +the same artifact/provenance/package admission libraries with the selected new +pair and the refreshed checked component carriers. Source-owned call authority +and runtime capability still require independent provider validation. + +The crate-local `assets/v1/` tree is an exact 42-file publication carrier for the same provider bytes plus the repository sources needed for generator provenance. The compile-time generator identity enumerates a 20-file source closure, including the provider-generic registry implementation. Carrier paths diff --git a/schemas/edict-provider/contracts/source-functions-v1/README.md b/schemas/edict-provider/contracts/source-functions-v1/README.md new file mode 100644 index 000000000..79822c0c7 --- /dev/null +++ b/schemas/edict-provider/contracts/source-functions-v1/README.md @@ -0,0 +1,67 @@ + + + +# Source-function Edict contract publication + +This complete Apache-2.0 contract pair was copied from Edict commit +[`acd71fce03d2b5fc6d78c2a92ca922a45da6bac2`](https://github.com/flyingrobots/edict/commit/acd71fce03d2b5fc6d78c2a92ca922a45da6bac2), +under `fixtures/provider-contracts/source-functions-v1/`, for +[Edict #226](https://github.com/flyingrobots/edict/issues/226). + +The CDDL contains 34,460 bytes with SHA-256 +`e484eabd615584a38cb57454b52747786f2314c135c13f99da6f6bae619a709f`. +The manifest contains 75,989 bytes with SHA-256 +`aebc2e4133407ae433c18b55421a89bf15dc5d489368f82ce4874f948d4f9c79`. +Keep the pair byte-for-byte intact. Replace both only from one explicit upstream +publication, updating the digest pins and provenance together. + +Select this pair with `admit_provider_contract_pack_for_publication_v1` and +`ProviderContractPublicationV1::SourceFunctions`. The unchanged manifest API and +coordinate do not select a publication: exact digests and the explicit enum +variant do. Admission checks the 75,989-byte ceiling before parsing JSON, +embedded schema/resource consistency, provenance, and both pinned raw digests. +It performs no discovery or automatic upgrade. + +The [pure-binding](../v1/README.md) and +[ordered-instruction](../ordered/README.md) pairs and selectors remain separate. +The original admission API and checked artifact/package generators still select +pure bindings. This schema accepts function-free Core and adds an optional, +nonempty `functions` map whose entries carry typed parameters, a return type, +ordered pure bindings, and a result. Old publications reject that new map. +Omitting an empty map preserves the old canonical shape. + +Schema admission does not establish call authority, lexical scope, totality, +combined call depth, resource bounds, or executable support. The provider and +its independent verifier must validate source-owned definitions against the +exact authenticated Core, separately from imported lawpack authority. Runtime +support and limits belong to the +[application contract hosting contract](../../../../docs/architecture/application-contract-hosting.md). + +## Explicit candidate generation + +The [candidate generator](../../../../crates/echo-wesley-gen/examples/source_functions_publication_witness.rs) +selects this pair, generates provider artifacts with the normal owned library, +assembles the exact checked lowerer/verifier component bytes, and digest-admits +the complete package before writing a new destination directory. It does not +replace the existing checked pure-binding corpus or choose a Jedit producer pin. +Run it only after the component and asset refresh described in the +[generator operating instructions](../../../../crates/echo-wesley-gen/README.md#refreshing-source-bound-provider-publication). + +Inside the admitted guarded Docker worker, using its accounted Cargo target: + +```sh +cargo +1.96.0 run --locked -p echo-wesley-gen \ + --example source_functions_publication_witness -- /owned-data/source-functions-provider +``` + +The new directory must be inside the runner's guarded data root. The Docker +presence check does not enforce shared storage budgets, free-space floors, +exclusive ownership, CPU/memory ceilings, log caps, or process cleanup; the +outer runner must enforce them. No new worker or Cargo cache is required. + +Changing generator source changes its exact source identity and therefore +regenerated provenance and provider-package identity. Preserving old contract +publication bytes does not mean those newly generated package identities stay +unchanged. Retain an exact old provider package for compatibility controls. +Component reproducibility remains subject to the independent designated-build +policy in [the component contract](../../components/v1/README.md). diff --git a/schemas/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl b/schemas/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl new file mode 100644 index 000000000..c7a0e9dd4 --- /dev/null +++ b/schemas/edict-provider/contracts/source-functions-v1/edict-provider-contracts.cddl @@ -0,0 +1,1036 @@ +; SPDX-License-Identifier: Apache-2.0 +; edict-provider-contracts.cddl +; Generated from Edict-owned ABI fragments. DO NOT EDIT. + +; --- edict-common.cddl --- +; edict-common.cddl +; Shared CDDL types for the Edict ABIs, defined ONCE here so they cannot drift +; (EDICT-ABI-NODUP-001). Two groups: +; - resource-ref, sha256-digest, effect-failure-body, effect-kind, authority-class, +; core-type-ref, core-named-type-ref: assembled with edict-core.cddl, +; edict-target-profile.cddl, and +; edict-lawpack.cddl by the build; those schemas do not redefine them. +; - operation-profile, optic-template, aperture-requirement and their refs: +; consumed by the Core/optic layer (edict-core.cddl) and referenced by the +; language/target-profile specs. +; Authoritative byte encoding: edict.canonical-cbor/v1. + +; A normative subcomponent referenced by identity plus digest. Manifests never +; embed their own self-digest in their preimage (EDICT-CORE-SELFHASH-001). +resource-ref = { id: tstr, digest: sha256-digest } + +; Digests are authoritative as typed byte values, never hex strings. Review JSON +; renders this as "sha256:<64 lowercase hex>" (EDICT-DIGEST-WIRE-001). +sha256-digest = [ algorithm: "sha256", bytes: bstr .size 32 ] + +; A named low-level failure an effect can raise. The source obstruction map +; binds it (by coordinate) and constructs a typed domain obstruction from its +; payload (EDICT-ABI-FAILURE-NAMED-001). +; An effect's `effectFailures` list MUST have unique `coordinate`s: since the +; obstruction map is keyed by coordinate, two failures sharing a coordinate (even +; with different authorityClass/payloadType) make exhaustive mapping and binder +; typing ambiguous and are rejected (EDICT-ABI-FAILURE-UNIQUE-001). +; +; Effects carry their failures as a map `{ failure-ident => effect-failure-body }` +; (see the target/lawpack effect schemas). The failure coordinate is the map +; KEY, so it is not repeated in the body and cannot disagree with the key. +effect-failure-body = { + authorityClass: authority-class, + payloadType: core-type-ref, ; typed, bounded (may be empty record) +} + +; A failure coordinate must be a bare Edict `ident` (letter/underscore then +; letters/digits/underscores) AND must not be a reserved keyword (e.g. `else`, +; `basis`, `where`, `require`, `for`, `if`). The source obstruction-map LHS only +; accepts a non-keyword `ident`, so a hyphen/dot/keyword coordinate would be +; ABI-valid yet impossible to map exhaustively in source. The regex captures the +; lexical shape; keyword exclusion is an additional validation rule +; (EDICT-ABI-FAILURE-IDENT-001). +failure-ident = tstr .regexp "[A-Za-z_][A-Za-z0-9_]*" + +effect-kind = "read" / "create" / "ensure" / "replace" / "delete" / + "append" / "reduce" / "semantic.emit" / "custom" + +authority-class = "domainMappable" / "participantOwned" / "integrityFault" / + "resourceFault" / "internalFault" + +; The normative lexical and semantic grammar for Core type references lives in +; SPEC_edict-language-v1.md. CDDL can express only the wire-level text shape. +core-type-ref = tstr + +; A core.types map key is narrower than a general core-type-ref: it must be a +; named identity, never an intrinsic or canonical structural reference. The +; formal spec and executable Core validator enforce that semantic distinction. +core-named-type-ref = tstr + +; An operation profile supplies the optic template a Core intent resolves its +; opticKind/boundaryKind/supportPolicy/lossDisposition from. Target profiles and +; lawpacks publish these as a map `{ coordinate => operation-profile }`, so the +; coordinate is the KEY, not a value field (EDICT-OPTIC-TEMPLATE-OWNER-001, +; EDICT-ABI-OPPROFILE-UNIQUE-001). +operation-profile = { + opticTemplate: optic-template, + effectPredicate: tstr, ; coordinate of the operation-mode predicate +} + +optic-template = { + opticKind: "revelation" / "affectReintegration", + boundaryKind: "projection" / "affect", + supportPolicy: tstr, ; canonical support-policy coordinate + lossDisposition: tstr, ; canonical loss-disposition coordinate + ? basisTemplate: tstr, ; optional digest-locked basis template coord + ; the aperture requirement this template supplies. Required when the template + ; is the source of a Core optic's apertureRequirement (i.e. the intent has no + ; source `footprint <= ...`), since apertureRequirement is mandatory in Core + ; (EDICT-OPTIC-APERTURE-REF-001). + ? apertureRequirement: aperture-requirement, +} + +; apertureRequirement is a typed reference, never a free-form string. A review +; rendering may show its coordinate (EDICT-OPTIC-APERTURE-REF-001). +aperture-requirement = footprint-ceiling-ref / abstract-footprint-obligation-ref +footprint-ceiling-ref = { kind: "footprintCeiling", ref: tstr } +abstract-footprint-obligation-ref = { kind: "abstractFootprintObligation", ref: tstr } + +; --- edict-core.cddl --- +; edict-core.cddl +; Normative schema for the Edict Core v1 semantic model. +; +; Scope boundary: this file defines Core meaning and schema shape only. It does +; not define a canonical encoder, Core module hash fields, hash fixtures, target +; lowering, admission bundles, or target-owned IR. + +core-module = { + apiVersion: "edict.core/v1", + coordinate: tstr, + imports: [* core-import], + types: { * core-named-type-ref => core-type }, + ? functions: { + tstr => core-source-function }, + intents: { + tstr => core-intent }, + requiredCoreCapabilities: [* tstr], +} + +core-import = { + kind: "lawpack" / "target" / "core" / "capability", + ref: resource-ref, + ? alias: tstr, +} + +; --- types --------------------------------------------------------------- + +core-type = core-scalar-type / core-record-type / core-variant-type / + core-option-type / core-list-type / core-map-type / + core-capability-ref-type / core-external-action-request-type / + core-nominal-type + +core-scalar-type = core-bool-type / core-int-type / core-string-type / + core-bytes-type / core-unit-type + +core-bool-type = { kind: "Bool" } +core-unit-type = { kind: "Unit" } +core-int-type = { + kind: "I64" / "U64" / "I32" / "U32" / "I16" / "U16" / "I8" / "U8", +} +core-string-type = { + kind: "String", + max: uint, + canonical: "unicode-scalar-nfc" / "raw-utf8", +} +core-bytes-type = { + kind: "Bytes", + ? min: uint, + max: uint, +} +core-nominal-type = { + kind: "Nominal", + contract: tstr, + representation: core-type-ref, +} +core-record-type = { + kind: "Record", + fields: { * tstr => core-type-ref }, +} +core-variant-type = { + kind: "Variant", + cases: { + tstr => variant-case-body }, +} +variant-case-body = { + ? payload: core-type-ref, +} +core-option-type = { + kind: "Option", + item: core-type-ref, +} +core-list-type = { + kind: "List", + item: core-type-ref, + max: uint, +} +core-map-type = { + kind: "Map", + key: core-type-ref, + value: core-type-ref, + max: uint, +} +core-capability-ref-type = { + kind: "CapabilityRef", + item: core-type-ref, +} +core-external-action-request-type = { + kind: "ExternalActionRequest", + settlement: core-type-ref, +} + +; core-type-ref is defined in edict-common.cddl and assembled with this schema. + +; --- references and values ---------------------------------------------- + +; Local identity is alpha-stable. `id` is the compiler-owned local coordinate; +; `alphaName` is the normalized human/debug name. Source binder spelling is not +; identity. +local-ref = { + id: tstr, + alphaName: tstr, + type: core-type-ref, +} + +core-value = core-null-value / core-bool-value / core-int-value / + core-string-value / core-bytes-value / core-record-value / + core-variant-value / core-list-value / core-map-value / + core-capability-value + +core-null-value = { kind: "null" } +core-bool-value = { kind: "bool", value: bool } +core-int-value = { kind: "int", width: tstr, value: int } +core-string-value = { kind: "string", value: tstr } +core-bytes-value = { kind: "bytes", value: bstr } +core-record-value = { kind: "record", fields: { * tstr => core-value } } +core-variant-value = { + kind: "variant", + type: core-type-ref, + case: tstr, + ? payload: core-value, +} +core-list-value = { kind: "list", values: [* core-value] } +core-map-value = { kind: "map", entries: [* [key: core-value, value: core-value]] } +core-capability-value = { + kind: "capability", + receipt: sha256-digest, +} + +; Edict-authored pure helpers use a pure Core function body. The body can bind +; pure expressions and return an expression, but it cannot contain Core effect, +; guard, branch, loop, match-node, or proof-obligation nodes. +; Source-owned functions use the same pure body algebra, with their result type +; authenticated by the enclosing module. An empty function table is omitted. +core-source-function = { + params: [* local-ref], + returnType: core-type-ref, + body: core-pure-block, +} + +core-fn-body = { + params: [* local-ref], + body: core-pure-block, +} + +core-pure-block = { + locals: [* local-ref], + bindings: [* pure-let-node], + result: core-expr, +} + +pure-let-node = { + kind: "let", + binding: local-ref, + value: core-expr, +} + +; --- expressions and predicates ----------------------------------------- + +core-expr = local-expr / const-expr / record-expr / field-expr / + variant-expr / match-expr / call-expr / list-expr / map-expr / + if-expr + +local-expr = { kind: "local", ref: local-ref } +const-expr = { kind: "const", value: core-value } +record-expr = { kind: "record", fields: { * tstr => core-expr } } +field-expr = { kind: "field", base: core-expr, field: tstr } +variant-expr = { + kind: "variant", + type: core-type-ref, + case: tstr, + ? payload: core-expr, +} +match-expr = { + kind: "match", + scrutinee: core-expr, + arms: [+ match-arm], +} +match-arm = { + case: tstr, + ? binder: local-ref, + body: core-expr, +} +call-expr = { + kind: "call", + callee: tstr, + typeArgs: [* core-type-ref], + args: [* core-expr], +} +list-expr = { kind: "list", values: [* core-expr] } +map-expr = { kind: "map", entries: [* [key: core-expr, value: core-expr]] } +if-expr = { + kind: "if", + predicate: core-predicate, + then: core-expr, + else: core-expr, +} + +core-predicate = true-predicate / false-predicate / not-predicate / + all-predicate / any-predicate / compare-predicate / + call-predicate / obstruction-predicate + +true-predicate = { kind: "true" } +false-predicate = { kind: "false" } +not-predicate = { kind: "not", value: core-predicate } +all-predicate = { kind: "all", values: [+ core-predicate] } +any-predicate = { kind: "any", values: [+ core-predicate] } +compare-predicate = { + kind: "compare", + op: "==" / "!=" / "<" / "<=" / ">" / ">=", + left: core-expr, + right: core-expr, +} +call-predicate = { + kind: "call", + predicate: tstr, + args: [* core-expr], +} +obstruction-predicate = { + kind: "obstruction", + coordinate: failure-ident, + payload: core-expr, +} + +input-constraint = { + coordinate: tstr, + source: "where" / "compiler", + predicate: core-predicate, +} + +; --- intents, blocks, and nodes ----------------------------------------- + +core-intent = { + input: core-type-ref, + output: core-type-ref, + requiredOperationProfile: tstr, + ? basis: core-expr, + inputConstraints: [* input-constraint], + coreEvaluationBudget: core-budget, + body: core-block, + ? optic: core-optic, +} + +core-budget = { + maxSteps: uint, + maxAllocatedBytes: uint, + maxOutputBytes: uint, +} + +core-optic = { + opticKind: "revelation" / "affectReintegration", + boundaryKind: "projection" / "affect", + apertureRequirement: aperture-requirement, + supportPolicy: tstr, + lossDisposition: tstr, +} + +core-block = { + locals: [* local-ref], + nodes: [* core-node], + result: core-expr, +} + +core-node = let-node / require-node / effect-node / + external-action-request-node / guard-node / branch-node / + for-node / match-node / proof-obligation-node + +let-node = { + kind: "let", + binding: local-ref, + value: core-expr, +} +require-node = { + kind: "require", + predicate: core-predicate, + onFailure: require-failure-arm, +} +require-failure-arm = terminal-require-failure / + continue-obstructed-require-failure +terminal-require-failure = { + kind: "terminal", + reason: obstruction-reason, +} +continue-obstructed-require-failure = { + kind: "continueObstructed", + reason: obstruction-reason, +} +obstruction-reason = { + reasonKind: tstr, + payload: { * tstr => core-expr }, +} +effect-node = { + kind: "effect", + binding: local-ref, + effect: tstr, + input: core-expr, + obstructionMap: { * failure-ident => obstruction-arm }, +} +external-action-request-node = { + kind: "externalActionRequest", + binding: local-ref, + operation: resource-ref, + inputType: core-type-ref, + settlementType: core-type-ref, + inputSchema: resource-ref, + settlementSchema: resource-ref, + input: core-expr, + authorityScope: core-expr, + basis: core-expr, + budget: external-action-budget, + reconciliationLaw: resource-ref, + state: "awaitingSettlement", + settlementAdmission: "schemaRequired", +} +external-action-budget = { + maxSettlementBytes: core-expr, + maxAttempts: core-expr, +} +obstruction-arm = { + binder: local-ref, + value: core-expr, +} +guard-node = { + kind: "guard", + predicate: core-predicate, + obstruction: core-expr, +} +branch-node = { + kind: "branch", + ? binding: local-ref, + predicate: core-predicate, + then: core-block, + else: core-block, +} +for-node = { + kind: "for", + binder: local-ref, + iter: core-expr, + bound: core-bound, + body: core-block, +} +match-node = { + kind: "match", + scrutinee: core-expr, + arms: [+ match-block-arm], +} +match-block-arm = { + case: tstr, + ? binder: local-ref, + body: core-block, +} +proof-obligation-node = { + kind: "proof", + coordinate: tstr, + predicate: core-predicate, +} + +core-bound = literal-bound / coordinate-bound +literal-bound = { kind: "literal", value: uint } +coordinate-bound = { kind: "coordinate", ref: tstr } + +; Shared resource-ref, sha256-digest, failure-ident, aperture-requirement, +; core-type-ref, and core-named-type-ref are defined once in edict-common.cddl. + +; --- edict-lawpack.cddl --- +; edict-lawpack.cddl +; Canonical schema for the Edict lawpack manifest and export surface. +; Authoritative byte encoding: edict.canonical-cbor/v1. JSON in the prose specs +; is a review rendering generated from this schema (EDICT-ABI-NODUP-001). + +lawpack-manifest = { + apiVersion: "edict.lawpack/v1", + id: tstr, + version: tstr, + acceptedCoreAbi: [+ tstr], + dependencies: [* lawpack-dep], ; acyclic, digest-locked (EDICT-LAWPACK-DAG-001) + exports: resource-ref, + ? targetAdapters: [+ target-adapter], ; required only if any runtime effect exists + ? helperComponent: executable-component, ; executable helpers carry their own sandbox+fuel + verifier: verifier, ; classified: declarative or executable + compatibility: resource-ref, + conformanceFixtureCorpus: resource-ref, +} + +; A verifier is either a declarative ruleset (no runtime) or an executable +; component. An executable verifier MUST carry its own sandbox and fuel model, +; so the schema enforces that no executable component is left unbounded +; (EDICT-ABI-VERIFIER-BOUND-001). +verifier = declarative-verifier / executable-verifier +declarative-verifier = { class: "declarative", ruleset: resource-ref } +executable-verifier = { + class: "executable", + component: resource-ref, + sandbox: resource-ref, + fuelModel: resource-ref, +} + +; Any executable component is bounded by its own sandbox + fuel model. +executable-component = { + component: resource-ref, + sandbox: resource-ref, + fuelModel: resource-ref, +} + +lawpack-dep = { id: tstr, version: tstr, digest: sha256-digest } + +; Adapter selection keys SOLELY off the digest-locked `acceptedTargetProfile` +; (its `id` is the profile id; its `digest` pins the exact profile/version). There +; are no independent display strings that could disagree with the lock, so a +; resolver cannot bind an adapter to one target while the lock proves another +; (EDICT-LAWPACK-ADAPTER-TARGETIR-001). +target-adapter = { + acceptedTargetProfile: resource-ref, ; digest-locked, authoritative selector + acceptedTargetIr: resource-ref, ; digest-locked + adapter: resource-ref, +} + +; Shared types resource-ref and sha256-digest are defined once in +; edict-common.cddl and assembled with this schema (EDICT-ABI-NODUP-001). + +; --- export surface ------------------------------------------------------ + +lawpack-exports = { + types: [* exported-type], + constants: [* exported-constant], + pureFunctions: [* pure-function], + effects: [* semantic-effect], + obstructions: [* obstruction-def], + ; keyed by operation-profile coordinate → uniqueness enforced + ; (EDICT-ABI-OPPROFILE-UNIQUE-001) + ; operation-profile records this lawpack exports (optic templates that + ; `implements`/`profile` clauses resolve against). operation-profile is + ; defined in edict-common.cddl (EDICT-ABI-OPPROFILE-SLOT-001). + operationProfiles: { * tstr => operation-profile }, ; keyed by coordinate +} + +exported-type = { coordinate: tstr, definition: core-type-ref } +exported-constant = { coordinate: tstr, type: core-type-ref, value: any } + +; A pure helper is a discriminated union by `source`, so the schema itself +; guarantees an implementation exists (EDICT-LAWPACK-PURE-IMPL-001): +; - "edict": authored in Edict/Core; the Core body is carried inline (hashed +; with the export surface). The schema requires the `body` field. +; - "component": implemented outside Edict; carries no inline body and instead +; carries its own digest-locked `implementation` (sandbox + fuel). It does +; not depend on the optional manifest-level helperComponent. +pure-function = edict-pure-function / component-pure-function + +pure-function-common = ( + coordinate: tstr, + typeParameters: [* tstr], + parameterTypes: [* core-type-ref], ; all bounded + returnType: core-type-ref, ; bounded + costTemplate: tstr, + determinismClass: "total" / "total-with-typed-diagnostic", +) + +edict-pure-function = { + pure-function-common, + source: "edict", + body: core-fn-body, ; inline, hash-significant +} + +component-pure-function = { + pure-function-common, + source: "component", + ; the digest-locked component implementing this helper. Required at the schema + ; level so a component helper can never validate without a hash-bound, + ; sandbox+fuel-described implementation (EDICT-LAWPACK-PURE-IMPL-001). + implementation: executable-component, +} + +; core-fn-body is defined by edict-core.cddl and assembled with this lawpack +; schema. It is a pure Core function body, not an effect-capable core-block. + +semantic-effect = { + coordinate: tstr, + typeParameters: [* tstr], + inputType: core-type-ref, ; bounded + outputType: core-type-ref, ; bounded + executionClass: "proofOnly" / "runtime", ; orthogonal to writeClass + effectKindHint: effect-kind, + footprintObligation: tstr, + costObligation: tstr, + effectFailures: { * failure-ident => effect-failure-body }, ; keyed by coordinate; unique + guardSupport: bool, +} + +obstruction-def = { + coordinate: tstr, + authorityClass: authority-class, + payloadSchema: core-type-ref, ; typed, bounded (may be empty record) +} + +; effect-failure-body, effect-kind, authority-class, and core-type-ref are defined +; once in edict-common.cddl and assembled with this schema (EDICT-ABI-NODUP-001). + +; --- edict-lawpack-adapter.cddl --- +; edict-lawpack-adapter.cddl +; Canonical schema for one direct declarative lawpack target adapter. +; Authoritative byte encoding: edict.canonical-cbor/v1. +; +; The enclosing lawpack manifest selects the exact target profile, target IR, +; and adapter resource digest. Those identities are not repeated here. + +lawpack-adapter = { + apiVersion: "edict.lawpack-adapter/v1", + class: "declarative", + operationProfiles: { + * tstr => lawpack-adapter-operation-profile + }, + effectImplementations: { + * tstr => lawpack-adapter-effect + }, + budgets: { + * tstr => lawpack-adapter-budget + }, +} + +; Keys are canonical lawpack operation-profile coordinates. +lawpack-adapter-operation-profile = + { + core: tstr, + semanticEffects: [+ tstr], + ? budgetObligation: tstr, + ? targetConfiguration: resource-ref, + } / + { + core: tstr, + semanticEffects: [], + budgetObligation: tstr, + targetConfiguration: resource-ref, + } + +; Keys are canonical lawpack semantic-effect coordinates. Footprint, cost, and +; failure fields must exactly discharge the matching exported effect. +lawpack-adapter-effect = { + targetIntrinsic: tstr, + targetConfiguration: resource-ref, + writeClass: lawpack-adapter-write-class, + footprintObligation: tstr, + costObligation: tstr, + failureMappings: { * failure-ident => tstr }, +} + +; Keys are canonical exported cost-obligation coordinates. +lawpack-adapter-budget = { + maxSteps: uint, + maxAllocatedBytes: uint, + maxOutputBytes: uint, +} + +lawpack-adapter-write-class = "none" / "read" / "create" / "ensure" / + "append" / "replace" / "delete" / "custom" + +; failure-ident is defined in edict-common.cddl. + +; --- edict-target-profile.cddl --- +; edict-target-profile.cddl +; Canonical schema for the Edict target profile manifest. +; Authoritative byte encoding: edict.canonical-cbor/v1 +; (see SPEC_continuum-contract-bundle-v1.md). JSON in the prose specs is a +; review rendering generated from this schema; this CDDL is the single source +; of truth (EDICT-ABI-NODUP-001). + +target-profile-manifest = { + apiVersion: "edict.target-profile/v1", + id: tstr, ; e.g. "echo.dpo" + version: tstr, ; e.g. "1" + acceptedCoreAbi: [+ tstr], ; e.g. ["edict.core/v1"] + + intrinsics: resource-ref, + intrinsicNamespace: tstr, + ; publishes this profile's operation-profile records (optic templates that + ; `profile`/`implements` clauses resolve against). References an + ; operation-profiles-document (EDICT-ABI-OPPROFILE-SLOT-001). + operationProfiles: resource-ref, + footprintAlgebra: resource-ref, + costAlgebra: resource-ref, + targetIr: resource-ref, + obstructionTaxonomy: resource-ref, + verifier: resource-ref, + lowerer: resource-ref, + sandbox: resource-ref, + fuelModel: resource-ref, + + ; fields the language spec requires of every profile + bundleProfile: resource-ref, + generatedArtifactProfiles: [* resource-ref], + canonicalEncodingRules: resource-ref, + ; A profile that accepts the direct declarative lawpack-adapter ABI names it + ; exactly once. Profiles that do not consume lawpack adapters leave this + ; optional slot absent or empty. + ? acceptedLawpackAdapterAbi: [] / ["edict.lawpack-adapter/v1"], + diagnosticAbi: resource-ref, + + ; application doctrine + applicationModel: "atomic", + readConsistency: "application-snapshot" / tstr, + guardEvaluation: "precommit-atomic" / tstr, + obstructionRollback: "no-visible-effects" / tstr, + multiTarget: bool, + ; whether the target can evaluate precommit postcondition (`guarantee`) checks + ; inside the atomic application unit (EDICT-TARGET-POSTCOND-001) + postconditionSupport: bool, + + deterministicExecution: resource-ref, + conformanceFixtureCorpus: resource-ref, +} + +; Shared types resource-ref and sha256-digest are defined once in +; edict-common.cddl and assembled with this schema by the build +; (EDICT-ABI-NODUP-001). They are not redefined here. + +; --- intrinsic signature ------------------------------------------------- +; The artifact referenced by the manifest's `intrinsics` resource-ref is the +; intrinsic-signature corpus document below. Its layout is fixed so two +; independent profiles validate/hash the corpus identically +; (EDICT-ABI-INTRINSICS-DOC-001). + +; intrinsics is a MAP keyed by coordinate, so the schema itself enforces +; coordinate uniqueness. A provider receives the resolved corpus as a +; digest-bound semantic input and resolves coordinates within that artifact. +; Each map key MUST equal its record's `coordinate` field +; (EDICT-ABI-INTRINSIC-UNIQUE-001). +intrinsics-document = { + apiVersion: "edict.target-profile.intrinsics/v1", + intrinsics: { * tstr => intrinsic }, +} + +; The artifact referenced by the manifest's `operationProfiles` resource-ref. +; operation-profile / optic-template are defined in edict-common.cddl. Keyed by +; coordinate so resolution can't pick between two same-coordinate profiles +; (EDICT-ABI-OPPROFILE-SLOT-001, EDICT-ABI-OPPROFILE-UNIQUE-001). +operation-profiles-document = { + apiVersion: "edict.target-profile.operation-profiles/v1", + profiles: { * tstr => operation-profile }, +} + +; A typed pre-lowering question that can be proposed by Watson or an agent and +; checked by the compiler. It is canonical-CBOR encoded under +; `edict.lowering-requirements/v1`; the compiler checks this artifact, not the +; prose that produced it. +lowering-requirements = { + apiVersion: "edict.lowering-requirements/v1", + operationProfile: tstr, + semanticEffects: [* semantic-effect-requirement], + requiredWriteClasses: [* write-class], + guardKinds: [* guard-kind], + atomicity: atomicity-requirement, + postconditionSupport: bool, + obstructionCoordinates: [* tstr], + footprintObligations: [* tstr], + costObligations: [* tstr], + opticContract: tstr, +} + +semantic-effect-requirement = { + coordinate: tstr, + writeClass: write-class, + guardKinds: [* guard-kind], + obstructionCoordinates: [* tstr], + footprintObligations: [* tstr], + costObligations: [* tstr], +} + +write-class = "none" / "read" / "create" / "ensure" / "append" / + "replace" / "delete" / tstr +guard-kind = "precommit-atomic" / tstr +atomicity-requirement = "atomic" / tstr + +; A genuine union: pure constructors carry no effect kind or failures; effect +; intrinsics must (EDICT-TARGET-INTRINSIC-CLASS-001). The schema enforces this, +; not a comment. + +; The intrinsic's coordinate is the intrinsics map KEY, not a value field, so the +; key and coordinate can never disagree (EDICT-ABI-INTRINSIC-UNIQUE-001). +intrinsic = pure-intrinsic / effect-intrinsic + +pure-intrinsic = { + intrinsicClass: "pure", + typeParameters: [* tstr], + argumentTypes: [* core-type-ref], + returnType: core-type-ref, + guardSupport: false, + footprintTemplate: tstr, + costTemplate: tstr, + writeClass: "none", +} + +effect-intrinsic = { + intrinsicClass: "effect", + typeParameters: [* tstr], + argumentTypes: [* core-type-ref], + returnType: core-type-ref, + effectKind: effect-kind, + ; map keyed by failure coordinate (failure-ident); the failure coordinate is + ; the key, not a value field, so uniqueness is structural + ; (EDICT-ABI-FAILURE-UNIQUE-001). + effectFailures: { * failure-ident => effect-failure-body }, + guardSupport: bool, + footprintTemplate: tstr, + costTemplate: tstr, + writeClass: "read" / "create" / "ensure" / "append" / "replace" / + "delete" / "custom", + canParticipateInAtomicGuard: bool, +} + +; effect-failure-body, effect-kind, authority-class, and core-type-ref are defined +; once in edict-common.cddl and assembled with this schema (EDICT-ABI-NODUP-001). + +; --- edict-authority-facts.cddl --- +; edict-authority-facts.cddl +; Canonical schema for the first compiler-context authority-facts document. +; Authoritative byte encoding: edict.canonical-cbor/v1. +; +; This schema is assembled with edict-common.cddl so source.digest uses the +; shared sha256-digest typed value. JSON is a review/input rendering: its +; `sha256:<64 hex>` source digest is projected to [`sha256`, 32 raw bytes] on +; the wire, and its fact arrays project to the coordinate-keyed maps below. + +authority-facts = { + apiVersion: "edict.authority-facts/v1", + source: authority-fact-source, + operationProfiles: { * tstr => authority-operation-profile-fact }, + effectWriteClasses: { * tstr => authority-write-class }, + budgets: { * tstr => authority-budget-fact }, +} + +authority-fact-source = { + kind: "lawpack" / "targetProfile", + coordinate: tstr, + digest: sha256-digest, +} + +; The map key is the source operation-profile coordinate. It is not repeated in +; the value, so a key and embedded coordinate cannot disagree. Allowed write +; classes are a canonical map-set: the class is the unique key and null is the +; unit marker. Canonical CBOR fixes key order without a second ordering rule. +authority-operation-profile-fact = { + core: tstr, + allowedWriteClasses: { * authority-write-class => null }, +} + +; The effectWriteClasses map key is the semantic effect coordinate. The budgets +; map key is the source budget coordinate. Canonical CBOR map-key uniqueness +; makes duplicate fact coordinates structurally unrepresentable. +authority-budget-fact = { + maxSteps: uint, + maxAllocatedBytes: uint, + maxOutputBytes: uint, +} + +; AuthorityFactsDocument v1 intentionally accepts only the write classes the +; current compiler model can consume. `custom` is the sole v1 custom spelling; +; arbitrary target-profile extension strings do not enter this compiler path. +authority-write-class = "none" / "read" / "create" / "ensure" / "append" / + "replace" / "delete" / "custom" + +; --- edict-result-projection.cddl --- +; SPDX-License-Identifier: Apache-2.0 +; edict-result-projection.cddl +; Canonical schema for compiler-owned application-result projections. +; Authoritative byte encoding: edict.canonical-cbor/v1. + +result-projection = { + schema: "edict.result-projection/v1", + operationCoordinate: bounded-projection-text, + outputType: bounded-projection-text, + maxOutputBytes: uint .gt 0, + expression: result-projection-expr, +} + +result-projection-expr = result-projection-record / result-projection-source + +result-projection-record = { + kind: "record", + ; The root record counts as one of the Rust decoder's 256 expression nodes. + ; Nested aggregate node count remains an authoritative decoder check. + fields: { 0*255 bounded-projection-text => result-projection-expr }, +} + +result-projection-source = { + kind: "source", + source: result-projection-source-kind, + ; Matches MAX_RESULT_PROJECTION_PATH_SEGMENTS in edict-syntax. + path: [0*32 bounded-projection-text], +} + +result-projection-source-kind = + { kind: "applicationInput" } / + { + kind: "pureBinding", + bindingId: bounded-projection-text, + } / + { + kind: "capabilityResult", + stepId: bounded-projection-text, + } + +bounded-projection-text = tstr .size (1..1024) + +; --- edict-target-ir.cddl --- +; SPDX-License-Identifier: Apache-2.0 +; edict-target-ir.cddl +; Canonical schema for the Edict-owned Target IR artifact envelope. +; Authoritative byte encoding: edict.canonical-cbor/v1. +; +; This schema is assembled with edict-common.cddl and edict-core.cddl. It +; deliberately reuses Core expressions, predicates, budgets, local references, +; obstruction reasons, and obstruction arms so the schema matches the value +; emitted by the canonical Target IR encoder rather than restating those types. +; It describes the structural shape of valid lowering-produced artifacts. The +; lowering and encoder contracts separately enforce semantic identifier rules +; and canonical ordering/deduplication for set-like values. + +; Target IR encoding rejects an empty target-profile coordinate before bytes +; exist, so this root tightens the shared structural resource-ref accordingly. +target-ir-resource-ref = { + id: tstr .regexp "(?s).+", + digest: sha256-digest, +} + +target-ir-artifact = target-ir-phased-artifact / target-ir-ordered-artifact + +target-ir-phased-artifact = target-ir-closed-artifact / target-ir-legacy-artifact + +target-ir-artifact-common = ( + domain: tstr, + targetProfile: target-ir-resource-ref, + sourceCoreCoordinate: tstr .regexp "(?s).+", +) + +; v2 binds one execution order over the instruction tables. The encoder also +; validates the exact permutation and producer-before-consumer dependencies. +target-ir-ordered-artifact = target-ir-ordered-closed / target-ir-ordered-legacy + +target-ir-ordered-common = ( + domain: "echo.span-ir/v2", + targetProfile: target-ir-resource-ref, + sourceCoreCoordinate: tstr .regexp "(?s).+", +) + +target-ir-ordered-closed = { + kind: "orderedTargetIrArtifact", + target-ir-ordered-common, + semanticClosure: target-ir-semantic-closure, + intents: { * tstr => target-ir-ordered-intent }, +} + +target-ir-ordered-legacy = { + kind: "orderedTargetIrArtifact", + target-ir-ordered-common, + intents: { * tstr => target-ir-ordered-legacy-intent }, +} + +target-ir-ordered-intent = { + target-ir-intent-common, + ? basis: core-expr, + ? pureBindings: [1* target-ir-pure-binding], + executionOrder: [* tstr .regexp "(?s).+"], +} + +target-ir-ordered-legacy-intent = { + target-ir-intent-common, + executionOrder: [* tstr .regexp "(?s).+"], +} + +target-ir-closed-artifact = { + kind: "targetIrArtifact", + target-ir-artifact-common, + semanticClosure: target-ir-semantic-closure, + intents: { * tstr => target-ir-intent }, +} + +target-ir-legacy-artifact = { + kind: "targetIrArtifact", + target-ir-artifact-common, + intents: { * tstr => target-ir-legacy-intent }, +} + +target-ir-semantic-closure = { + sourceCore: target-ir-resource-ref, + lawpacks: [* target-ir-resource-ref], + ? capabilities: [* target-ir-resource-ref], +} + +target-ir-intent = { + target-ir-intent-common, + ? basis: core-expr, + ? pureBindings: [1* target-ir-pure-binding], + ? externalActionRequests: [* target-ir-external-action-request], +} + +target-ir-legacy-intent = { + target-ir-intent-common, +} + +target-ir-intent-common = ( + operationProfile: tstr, + inputConstraints: [* input-constraint], + coreEvaluationBudget: core-budget, + requirements: [* target-ir-requirement], + steps: [* target-ir-step], + result: core-expr, +) + +target-ir-requirement = { + id: tstr, + predicate: core-predicate, + onFailure: require-failure-arm, +} + +target-ir-pure-binding = { + id: tstr .regexp "(?s).+", + binding: local-ref, + value: core-expr, +} + +target-ir-step = { + id: tstr, + binding: local-ref, + effect: tstr, + targetIntrinsic: tstr, + input: core-expr, + obstructionFailures: [* failure-ident], + obstructionArms: { * failure-ident => obstruction-arm }, +} + +target-ir-external-action-request = { + id: tstr, + binding: local-ref, + operation: target-ir-resource-ref, + inputType: core-type-ref, + settlementType: core-type-ref, + inputSchema: target-ir-resource-ref, + settlementSchema: target-ir-resource-ref, + input: core-expr, + authorityScope: core-expr, + basis: core-expr, + budget: external-action-budget, + reconciliationLaw: target-ir-resource-ref, + state: "awaitingSettlement", + settlementAdmission: "schemaRequired", +} diff --git a/schemas/edict-provider/contracts/source-functions-v1/manifest.json b/schemas/edict-provider/contracts/source-functions-v1/manifest.json new file mode 100644 index 000000000..267a5878a --- /dev/null +++ b/schemas/edict-provider/contracts/source-functions-v1/manifest.json @@ -0,0 +1,83 @@ +{ + "apiVersion": "edict.provider-contract-pack/v1", + "coordinate": "edict.provider-contract-pack.cddl@1", + "license": "Apache-2.0", + "schema": { + "bytesHex": "3b20535044582d4c6963656e73652d4964656e7469666965723a204170616368652d322e300a3b2065646963742d70726f76696465722d636f6e7472616374732e6364646c0a3b2047656e6572617465642066726f6d2045646963742d6f776e65642041424920667261676d656e74732e20444f204e4f5420454449542e0a0a3b202d2d2d2065646963742d636f6d6d6f6e2e6364646c202d2d2d0a3b2065646963742d636f6d6d6f6e2e6364646c0a3b20536861726564204344444c20747970657320666f722074686520456469637420414249732c20646566696e6564204f4e4345206865726520736f20746865792063616e6e6f742064726966740a3b202845444943542d4142492d4e4f4455502d303031292e2054776f2067726f7570733a0a3b2020202d207265736f757263652d7265662c207368613235362d6469676573742c206566666563742d6661696c7572652d626f64792c206566666563742d6b696e642c20617574686f726974792d636c6173732c0a3b2020202020636f72652d747970652d7265662c20636f72652d6e616d65642d747970652d7265663a20617373656d626c656420776974682065646963742d636f72652e6364646c2c0a3b202020202065646963742d7461726765742d70726f66696c652e6364646c2c20616e640a3b202020202065646963742d6c61777061636b2e6364646c20627920746865206275696c643b2074686f736520736368656d617320646f206e6f74207265646566696e65207468656d2e0a3b2020202d206f7065726174696f6e2d70726f66696c652c206f707469632d74656d706c6174652c2061706572747572652d726571756972656d656e7420616e6420746865697220726566733a0a3b2020202020636f6e73756d65642062792074686520436f72652f6f70746963206c61796572202865646963742d636f72652e6364646c2920616e64207265666572656e636564206279207468650a3b20202020206c616e67756167652f7461726765742d70726f66696c652073706563732e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e0a0a3b2041206e6f726d617469766520737562636f6d706f6e656e74207265666572656e636564206279206964656e7469747920706c7573206469676573742e204d616e696665737473206e657665720a3b20656d626564207468656972206f776e2073656c662d64696765737420696e20746865697220707265696d616765202845444943542d434f52452d53454c46484153482d303031292e0a7265736f757263652d726566203d207b2069643a20747374722c206469676573743a207368613235362d646967657374207d0a0a3b20446967657374732061726520617574686f726974617469766520617320747970656420627974652076616c7565732c206e657665722068657820737472696e67732e20526576696577204a534f4e0a3b2072656e64657273207468697320617320227368613235363a3c3634206c6f77657263617365206865783e22202845444943542d4449474553542d574952452d303031292e0a7368613235362d646967657374203d205b20616c676f726974686d3a2022736861323536222c2062797465733a2062737472202e73697a65203332205d0a0a3b2041206e616d6564206c6f772d6c6576656c206661696c75726520616e206566666563742063616e2072616973652e2054686520736f75726365206f62737472756374696f6e206d61700a3b2062696e64732069742028627920636f6f7264696e6174652920616e6420636f6e73747275637473206120747970656420646f6d61696e206f62737472756374696f6e2066726f6d206974730a3b207061796c6f6164202845444943542d4142492d4641494c5552452d4e414d45442d303031292e0a3b20416e20656666656374277320606566666563744661696c7572657360206c697374204d555354206861766520756e697175652060636f6f7264696e61746560733a2073696e6365207468650a3b206f62737472756374696f6e206d6170206973206b6579656420627920636f6f7264696e6174652c2074776f206661696c757265732073686172696e67206120636f6f7264696e61746520286576656e0a3b207769746820646966666572656e7420617574686f72697479436c6173732f7061796c6f61645479706529206d616b652065786861757374697665206d617070696e6720616e642062696e6465720a3b20747970696e6720616d626967756f757320616e64206172652072656a6563746564202845444943542d4142492d4641494c5552452d554e495155452d303031292e0a3b0a3b2045666665637473206361727279207468656972206661696c757265732061732061206d617020607b206661696c7572652d6964656e74203d3e206566666563742d6661696c7572652d626f6479207d600a3b202873656520746865207461726765742f6c61777061636b2065666665637420736368656d6173292e20546865206661696c75726520636f6f7264696e61746520697320746865206d61700a3b204b45592c20736f206974206973206e6f7420726570656174656420696e2074686520626f647920616e642063616e6e6f74206469736167726565207769746820746865206b65792e0a6566666563742d6661696c7572652d626f6479203d207b0a2020617574686f72697479436c6173733a20617574686f726974792d636c6173732c0a20207061796c6f6164547970653a20636f72652d747970652d7265662c202020202020202020202020203b2074797065642c20626f756e64656420286d617920626520656d707479207265636f7264290a7d0a0a3b2041206661696c75726520636f6f7264696e617465206d7573742062652061206261726520456469637420606964656e746020286c65747465722f756e64657273636f7265207468656e0a3b206c6574746572732f6469676974732f756e64657273636f7265732920414e44206d757374206e6f742062652061207265736572766564206b6579776f72642028652e672e2060656c7365602c0a3b20606261736973602c20607768657265602c206072657175697265602c2060666f72602c2060696660292e2054686520736f75726365206f62737472756374696f6e2d6d6170204c4853206f6e6c790a3b20616363657074732061206e6f6e2d6b6579776f726420606964656e74602c20736f20612068797068656e2f646f742f6b6579776f726420636f6f7264696e61746520776f756c642062650a3b204142492d76616c69642079657420696d706f737369626c6520746f206d617020657868617573746976656c7920696e20736f757263652e20546865207265676578206361707475726573207468650a3b206c65786963616c2073686170653b206b6579776f7264206578636c7573696f6e20697320616e206164646974696f6e616c2076616c69646174696f6e2072756c650a3b202845444943542d4142492d4641494c5552452d4944454e542d303031292e0a6661696c7572652d6964656e74203d2074737472202e72656765787020225b412d5a612d7a5f5d5b412d5a612d7a302d395f5d2a220a0a6566666563742d6b696e64203d20227265616422202f202263726561746522202f2022656e7375726522202f20227265706c61636522202f202264656c65746522202f0a202020202020202020202020202022617070656e6422202f202272656475636522202f202273656d616e7469632e656d697422202f2022637573746f6d220a0a617574686f726974792d636c617373203d2022646f6d61696e4d61707061626c6522202f20227061727469636970616e744f776e656422202f2022696e746567726974794661756c7422202f0a202020202020202020202020202020202020227265736f757263654661756c7422202f2022696e7465726e616c4661756c74220a0a3b20546865206e6f726d6174697665206c65786963616c20616e642073656d616e746963206772616d6d617220666f7220436f72652074797065207265666572656e636573206c6976657320696e0a3b20535045435f65646963742d6c616e67756167652d76312e6d642e204344444c2063616e2065787072657373206f6e6c792074686520776972652d6c6576656c20746578742073686170652e0a636f72652d747970652d726566203d20747374720a0a3b204120636f72652e7479706573206d6170206b6579206973206e6172726f776572207468616e20612067656e6572616c20636f72652d747970652d7265663a206974206d75737420626520610a3b206e616d6564206964656e746974792c206e6576657220616e20696e7472696e736963206f722063616e6f6e6963616c207374727563747572616c207265666572656e63652e205468650a3b20666f726d616c207370656320616e642065786563757461626c6520436f72652076616c696461746f7220656e666f72636520746861742073656d616e7469632064697374696e6374696f6e2e0a636f72652d6e616d65642d747970652d726566203d20747374720a0a3b20416e206f7065726174696f6e2070726f66696c6520737570706c69657320746865206f707469632074656d706c617465206120436f726520696e74656e74207265736f6c766573206974730a3b206f707469634b696e642f626f756e646172794b696e642f737570706f7274506f6c6963792f6c6f7373446973706f736974696f6e2066726f6d2e205461726765742070726f66696c657320616e640a3b206c61777061636b73207075626c6973682074686573652061732061206d617020607b20636f6f7264696e617465203d3e206f7065726174696f6e2d70726f66696c65207d602c20736f207468650a3b20636f6f7264696e61746520697320746865204b45592c206e6f7420612076616c7565206669656c64202845444943542d4f505449432d54454d504c4154452d4f574e45522d3030312c0a3b2045444943542d4142492d4f5050524f46494c452d554e495155452d303031292e0a6f7065726174696f6e2d70726f66696c65203d207b0a20206f7074696354656d706c6174653a206f707469632d74656d706c6174652c0a20206566666563745072656469636174653a20747374722c20202020202020202020203b20636f6f7264696e617465206f6620746865206f7065726174696f6e2d6d6f6465207072656469636174650a7d0a0a6f707469632d74656d706c617465203d207b0a20206f707469634b696e643a2022726576656c6174696f6e22202f20226166666563745265696e746567726174696f6e222c0a2020626f756e646172794b696e643a202270726f6a656374696f6e22202f2022616666656374222c0a2020737570706f7274506f6c6963793a20747374722c202020202020202020202020203b2063616e6f6e6963616c20737570706f72742d706f6c69637920636f6f7264696e6174650a20206c6f7373446973706f736974696f6e3a20747374722c20202020202020202020203b2063616e6f6e6963616c206c6f73732d646973706f736974696f6e20636f6f7264696e6174650a20203f20626173697354656d706c6174653a20747374722c20202020202020202020203b206f7074696f6e616c206469676573742d6c6f636b65642062617369732074656d706c61746520636f6f72640a20203b2074686520617065727475726520726571756972656d656e7420746869732074656d706c61746520737570706c6965732e205265717569726564207768656e207468652074656d706c6174650a20203b2069732074686520736f75726365206f66206120436f7265206f707469632773206170657274757265526571756972656d656e742028692e652e2074686520696e74656e7420686173206e6f0a20203b20736f757263652060666f6f747072696e74203c3d202e2e2e60292c2073696e6365206170657274757265526571756972656d656e74206973206d616e6461746f727920696e20436f72650a20203b202845444943542d4f505449432d41504552545552452d5245462d303031292e0a20203f206170657274757265526571756972656d656e743a2061706572747572652d726571756972656d656e742c0a7d0a0a3b206170657274757265526571756972656d656e742069732061207479706564207265666572656e63652c206e65766572206120667265652d666f726d20737472696e672e2041207265766965770a3b2072656e646572696e67206d61792073686f772069747320636f6f7264696e617465202845444943542d4f505449432d41504552545552452d5245462d303031292e0a61706572747572652d726571756972656d656e74203d20666f6f747072696e742d6365696c696e672d726566202f2061627374726163742d666f6f747072696e742d6f626c69676174696f6e2d7265660a666f6f747072696e742d6365696c696e672d726566203d207b206b696e643a2022666f6f747072696e744365696c696e67222c207265663a2074737472207d0a61627374726163742d666f6f747072696e742d6f626c69676174696f6e2d726566203d207b206b696e643a20226162737472616374466f6f747072696e744f626c69676174696f6e222c207265663a2074737472207d0a0a3b202d2d2d2065646963742d636f72652e6364646c202d2d2d0a3b2065646963742d636f72652e6364646c0a3b204e6f726d617469766520736368656d6120666f722074686520456469637420436f72652076312073656d616e746963206d6f64656c2e0a3b0a3b2053636f706520626f756e646172793a20746869732066696c6520646566696e657320436f7265206d65616e696e6720616e6420736368656d61207368617065206f6e6c792e20497420646f65730a3b206e6f7420646566696e6520612063616e6f6e6963616c20656e636f6465722c20436f7265206d6f64756c652068617368206669656c64732c20686173682066697874757265732c207461726765740a3b206c6f776572696e672c2061646d697373696f6e2062756e646c65732c206f72207461726765742d6f776e65642049522e0a0a636f72652d6d6f64756c65203d207b0a202061706956657273696f6e3a202265646963742e636f72652f7631222c0a2020636f6f7264696e6174653a20747374722c0a2020696d706f7274733a205b2a20636f72652d696d706f72745d2c0a202074797065733a207b202a20636f72652d6e616d65642d747970652d726566203d3e20636f72652d74797065207d2c0a20203f2066756e6374696f6e733a207b202b2074737472203d3e20636f72652d736f757263652d66756e6374696f6e207d2c0a2020696e74656e74733a207b202b2074737472203d3e20636f72652d696e74656e74207d2c0a20207265717569726564436f72654361706162696c69746965733a205b2a20747374725d2c0a7d0a0a636f72652d696d706f7274203d207b0a20206b696e643a20226c61777061636b22202f202274617267657422202f2022636f726522202f20226361706162696c697479222c0a20207265663a207265736f757263652d7265662c0a20203f20616c6961733a20747374722c0a7d0a0a3b202d2d2d207479706573202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a636f72652d74797065203d20636f72652d7363616c61722d74797065202f20636f72652d7265636f72642d74797065202f20636f72652d76617269616e742d74797065202f0a202020202020202020202020636f72652d6f7074696f6e2d74797065202f20636f72652d6c6973742d74797065202f20636f72652d6d61702d74797065202f0a202020202020202020202020636f72652d6361706162696c6974792d7265662d74797065202f20636f72652d65787465726e616c2d616374696f6e2d726571756573742d74797065202f0a202020202020202020202020636f72652d6e6f6d696e616c2d747970650a0a636f72652d7363616c61722d74797065203d20636f72652d626f6f6c2d74797065202f20636f72652d696e742d74797065202f20636f72652d737472696e672d74797065202f0a20202020202020202020202020202020202020636f72652d62797465732d74797065202f20636f72652d756e69742d747970650a0a636f72652d626f6f6c2d74797065203d207b206b696e643a2022426f6f6c22207d0a636f72652d756e69742d74797065203d207b206b696e643a2022556e697422207d0a636f72652d696e742d74797065203d207b0a20206b696e643a202249363422202f202255363422202f202249333222202f202255333222202f202249313622202f202255313622202f2022493822202f20225538222c0a7d0a636f72652d737472696e672d74797065203d207b0a20206b696e643a2022537472696e67222c0a20206d61783a2075696e742c0a202063616e6f6e6963616c3a2022756e69636f64652d7363616c61722d6e666322202f20227261772d75746638222c0a7d0a636f72652d62797465732d74797065203d207b0a20206b696e643a20224279746573222c0a20203f206d696e3a2075696e742c0a20206d61783a2075696e742c0a7d0a636f72652d6e6f6d696e616c2d74797065203d207b0a20206b696e643a20224e6f6d696e616c222c0a2020636f6e74726163743a20747374722c0a2020726570726573656e746174696f6e3a20636f72652d747970652d7265662c0a7d0a636f72652d7265636f72642d74797065203d207b0a20206b696e643a20225265636f7264222c0a20206669656c64733a207b202a2074737472203d3e20636f72652d747970652d726566207d2c0a7d0a636f72652d76617269616e742d74797065203d207b0a20206b696e643a202256617269616e74222c0a202063617365733a207b202b2074737472203d3e2076617269616e742d636173652d626f6479207d2c0a7d0a76617269616e742d636173652d626f6479203d207b0a20203f207061796c6f61643a20636f72652d747970652d7265662c0a7d0a636f72652d6f7074696f6e2d74797065203d207b0a20206b696e643a20224f7074696f6e222c0a20206974656d3a20636f72652d747970652d7265662c0a7d0a636f72652d6c6973742d74797065203d207b0a20206b696e643a20224c697374222c0a20206974656d3a20636f72652d747970652d7265662c0a20206d61783a2075696e742c0a7d0a636f72652d6d61702d74797065203d207b0a20206b696e643a20224d6170222c0a20206b65793a20636f72652d747970652d7265662c0a202076616c75653a20636f72652d747970652d7265662c0a20206d61783a2075696e742c0a7d0a636f72652d6361706162696c6974792d7265662d74797065203d207b0a20206b696e643a20224361706162696c697479526566222c0a20206974656d3a20636f72652d747970652d7265662c0a7d0a636f72652d65787465726e616c2d616374696f6e2d726571756573742d74797065203d207b0a20206b696e643a202245787465726e616c416374696f6e52657175657374222c0a2020736574746c656d656e743a20636f72652d747970652d7265662c0a7d0a0a3b20636f72652d747970652d72656620697320646566696e656420696e2065646963742d636f6d6d6f6e2e6364646c20616e6420617373656d626c65642077697468207468697320736368656d612e0a0a3b202d2d2d207265666572656e63657320616e642076616c756573202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a3b204c6f63616c206964656e7469747920697320616c7068612d737461626c652e20606964602069732074686520636f6d70696c65722d6f776e6564206c6f63616c20636f6f7264696e6174653b0a3b2060616c7068614e616d656020697320746865206e6f726d616c697a65642068756d616e2f6465627567206e616d652e20536f757263652062696e646572207370656c6c696e67206973206e6f740a3b206964656e746974792e0a6c6f63616c2d726566203d207b0a202069643a20747374722c0a2020616c7068614e616d653a20747374722c0a2020747970653a20636f72652d747970652d7265662c0a7d0a0a636f72652d76616c7565203d20636f72652d6e756c6c2d76616c7565202f20636f72652d626f6f6c2d76616c7565202f20636f72652d696e742d76616c7565202f0a20202020202020202020202020636f72652d737472696e672d76616c7565202f20636f72652d62797465732d76616c7565202f20636f72652d7265636f72642d76616c7565202f0a20202020202020202020202020636f72652d76617269616e742d76616c7565202f20636f72652d6c6973742d76616c7565202f20636f72652d6d61702d76616c7565202f0a20202020202020202020202020636f72652d6361706162696c6974792d76616c75650a0a636f72652d6e756c6c2d76616c7565203d207b206b696e643a20226e756c6c22207d0a636f72652d626f6f6c2d76616c7565203d207b206b696e643a2022626f6f6c222c2076616c75653a20626f6f6c207d0a636f72652d696e742d76616c7565203d207b206b696e643a2022696e74222c2077696474683a20747374722c2076616c75653a20696e74207d0a636f72652d737472696e672d76616c7565203d207b206b696e643a2022737472696e67222c2076616c75653a2074737472207d0a636f72652d62797465732d76616c7565203d207b206b696e643a20226279746573222c2076616c75653a2062737472207d0a636f72652d7265636f72642d76616c7565203d207b206b696e643a20227265636f7264222c206669656c64733a207b202a2074737472203d3e20636f72652d76616c7565207d207d0a636f72652d76617269616e742d76616c7565203d207b0a20206b696e643a202276617269616e74222c0a2020747970653a20636f72652d747970652d7265662c0a2020636173653a20747374722c0a20203f207061796c6f61643a20636f72652d76616c75652c0a7d0a636f72652d6c6973742d76616c7565203d207b206b696e643a20226c697374222c2076616c7565733a205b2a20636f72652d76616c75655d207d0a636f72652d6d61702d76616c7565203d207b206b696e643a20226d6170222c20656e74726965733a205b2a205b6b65793a20636f72652d76616c75652c2076616c75653a20636f72652d76616c75655d5d207d0a636f72652d6361706162696c6974792d76616c7565203d207b0a20206b696e643a20226361706162696c697479222c0a2020726563656970743a207368613235362d6469676573742c0a7d0a0a3b2045646963742d617574686f72656420707572652068656c70657273207573652061207075726520436f72652066756e6374696f6e20626f64792e2054686520626f64792063616e2062696e640a3b20707572652065787072657373696f6e7320616e642072657475726e20616e2065787072657373696f6e2c206275742069742063616e6e6f7420636f6e7461696e20436f7265206566666563742c0a3b2067756172642c206272616e63682c206c6f6f702c206d617463682d6e6f64652c206f722070726f6f662d6f626c69676174696f6e206e6f6465732e0a3b20536f757263652d6f776e65642066756e6374696f6e7320757365207468652073616d65207075726520626f647920616c67656272612c207769746820746865697220726573756c7420747970650a3b2061757468656e746963617465642062792074686520656e636c6f73696e67206d6f64756c652e20416e20656d7074792066756e6374696f6e207461626c65206973206f6d69747465642e0a636f72652d736f757263652d66756e6374696f6e203d207b0a2020706172616d733a205b2a206c6f63616c2d7265665d2c0a202072657475726e547970653a20636f72652d747970652d7265662c0a2020626f64793a20636f72652d707572652d626c6f636b2c0a7d0a0a636f72652d666e2d626f6479203d207b0a2020706172616d733a205b2a206c6f63616c2d7265665d2c0a2020626f64793a20636f72652d707572652d626c6f636b2c0a7d0a0a636f72652d707572652d626c6f636b203d207b0a20206c6f63616c733a205b2a206c6f63616c2d7265665d2c0a202062696e64696e67733a205b2a20707572652d6c65742d6e6f64655d2c0a2020726573756c743a20636f72652d657870722c0a7d0a0a707572652d6c65742d6e6f6465203d207b0a20206b696e643a20226c6574222c0a202062696e64696e673a206c6f63616c2d7265662c0a202076616c75653a20636f72652d657870722c0a7d0a0a3b202d2d2d2065787072657373696f6e7320616e642070726564696361746573202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a636f72652d65787072203d206c6f63616c2d65787072202f20636f6e73742d65787072202f207265636f72642d65787072202f206669656c642d65787072202f0a20202020202020202020202076617269616e742d65787072202f206d617463682d65787072202f2063616c6c2d65787072202f206c6973742d65787072202f206d61702d65787072202f0a20202020202020202020202069662d657870720a0a6c6f63616c2d65787072203d207b206b696e643a20226c6f63616c222c207265663a206c6f63616c2d726566207d0a636f6e73742d65787072203d207b206b696e643a2022636f6e7374222c2076616c75653a20636f72652d76616c7565207d0a7265636f72642d65787072203d207b206b696e643a20227265636f7264222c206669656c64733a207b202a2074737472203d3e20636f72652d65787072207d207d0a6669656c642d65787072203d207b206b696e643a20226669656c64222c20626173653a20636f72652d657870722c206669656c643a2074737472207d0a76617269616e742d65787072203d207b0a20206b696e643a202276617269616e74222c0a2020747970653a20636f72652d747970652d7265662c0a2020636173653a20747374722c0a20203f207061796c6f61643a20636f72652d657870722c0a7d0a6d617463682d65787072203d207b0a20206b696e643a20226d61746368222c0a20207363727574696e65653a20636f72652d657870722c0a202061726d733a205b2b206d617463682d61726d5d2c0a7d0a6d617463682d61726d203d207b0a2020636173653a20747374722c0a20203f2062696e6465723a206c6f63616c2d7265662c0a2020626f64793a20636f72652d657870722c0a7d0a63616c6c2d65787072203d207b0a20206b696e643a202263616c6c222c0a202063616c6c65653a20747374722c0a202074797065417267733a205b2a20636f72652d747970652d7265665d2c0a2020617267733a205b2a20636f72652d657870725d2c0a7d0a6c6973742d65787072203d207b206b696e643a20226c697374222c2076616c7565733a205b2a20636f72652d657870725d207d0a6d61702d65787072203d207b206b696e643a20226d6170222c20656e74726965733a205b2a205b6b65793a20636f72652d657870722c2076616c75653a20636f72652d657870725d5d207d0a69662d65787072203d207b0a20206b696e643a20226966222c0a20207072656469636174653a20636f72652d7072656469636174652c0a20207468656e3a20636f72652d657870722c0a2020656c73653a20636f72652d657870722c0a7d0a0a636f72652d707265646963617465203d20747275652d707265646963617465202f2066616c73652d707265646963617465202f206e6f742d707265646963617465202f0a2020202020202020202020202020202020616c6c2d707265646963617465202f20616e792d707265646963617465202f20636f6d706172652d707265646963617465202f0a202020202020202020202020202020202063616c6c2d707265646963617465202f206f62737472756374696f6e2d7072656469636174650a0a747275652d707265646963617465203d207b206b696e643a20227472756522207d0a66616c73652d707265646963617465203d207b206b696e643a202266616c736522207d0a6e6f742d707265646963617465203d207b206b696e643a20226e6f74222c2076616c75653a20636f72652d707265646963617465207d0a616c6c2d707265646963617465203d207b206b696e643a2022616c6c222c2076616c7565733a205b2b20636f72652d7072656469636174655d207d0a616e792d707265646963617465203d207b206b696e643a2022616e79222c2076616c7565733a205b2b20636f72652d7072656469636174655d207d0a636f6d706172652d707265646963617465203d207b0a20206b696e643a2022636f6d70617265222c0a20206f703a20223d3d22202f2022213d22202f20223c22202f20223c3d22202f20223e22202f20223e3d222c0a20206c6566743a20636f72652d657870722c0a202072696768743a20636f72652d657870722c0a7d0a63616c6c2d707265646963617465203d207b0a20206b696e643a202263616c6c222c0a20207072656469636174653a20747374722c0a2020617267733a205b2a20636f72652d657870725d2c0a7d0a6f62737472756374696f6e2d707265646963617465203d207b0a20206b696e643a20226f62737472756374696f6e222c0a2020636f6f7264696e6174653a206661696c7572652d6964656e742c0a20207061796c6f61643a20636f72652d657870722c0a7d0a0a696e7075742d636f6e73747261696e74203d207b0a2020636f6f7264696e6174653a20747374722c0a2020736f757263653a2022776865726522202f2022636f6d70696c6572222c0a20207072656469636174653a20636f72652d7072656469636174652c0a7d0a0a3b202d2d2d20696e74656e74732c20626c6f636b732c20616e64206e6f646573202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a636f72652d696e74656e74203d207b0a2020696e7075743a20636f72652d747970652d7265662c0a20206f75747075743a20636f72652d747970652d7265662c0a202072657175697265644f7065726174696f6e50726f66696c653a20747374722c0a20203f2062617369733a20636f72652d657870722c0a2020696e707574436f6e73747261696e74733a205b2a20696e7075742d636f6e73747261696e745d2c0a2020636f72654576616c756174696f6e4275646765743a20636f72652d6275646765742c0a2020626f64793a20636f72652d626c6f636b2c0a20203f206f707469633a20636f72652d6f707469632c0a7d0a0a636f72652d627564676574203d207b0a20206d617853746570733a2075696e742c0a20206d6178416c6c6f636174656442797465733a2075696e742c0a20206d61784f757470757442797465733a2075696e742c0a7d0a0a636f72652d6f70746963203d207b0a20206f707469634b696e643a2022726576656c6174696f6e22202f20226166666563745265696e746567726174696f6e222c0a2020626f756e646172794b696e643a202270726f6a656374696f6e22202f2022616666656374222c0a20206170657274757265526571756972656d656e743a2061706572747572652d726571756972656d656e742c0a2020737570706f7274506f6c6963793a20747374722c0a20206c6f7373446973706f736974696f6e3a20747374722c0a7d0a0a636f72652d626c6f636b203d207b0a20206c6f63616c733a205b2a206c6f63616c2d7265665d2c0a20206e6f6465733a205b2a20636f72652d6e6f64655d2c0a2020726573756c743a20636f72652d657870722c0a7d0a0a636f72652d6e6f6465203d206c65742d6e6f6465202f20726571756972652d6e6f6465202f206566666563742d6e6f6465202f0a20202020202020202020202065787465726e616c2d616374696f6e2d726571756573742d6e6f6465202f2067756172642d6e6f6465202f206272616e63682d6e6f6465202f0a202020202020202020202020666f722d6e6f6465202f206d617463682d6e6f6465202f2070726f6f662d6f626c69676174696f6e2d6e6f64650a0a6c65742d6e6f6465203d207b0a20206b696e643a20226c6574222c0a202062696e64696e673a206c6f63616c2d7265662c0a202076616c75653a20636f72652d657870722c0a7d0a726571756972652d6e6f6465203d207b0a20206b696e643a202272657175697265222c0a20207072656469636174653a20636f72652d7072656469636174652c0a20206f6e4661696c7572653a20726571756972652d6661696c7572652d61726d2c0a7d0a726571756972652d6661696c7572652d61726d203d207465726d696e616c2d726571756972652d6661696c757265202f0a20202020202020202020202020202020202020202020636f6e74696e75652d6f6273747275637465642d726571756972652d6661696c7572650a7465726d696e616c2d726571756972652d6661696c757265203d207b0a20206b696e643a20227465726d696e616c222c0a2020726561736f6e3a206f62737472756374696f6e2d726561736f6e2c0a7d0a636f6e74696e75652d6f6273747275637465642d726571756972652d6661696c757265203d207b0a20206b696e643a2022636f6e74696e75654f627374727563746564222c0a2020726561736f6e3a206f62737472756374696f6e2d726561736f6e2c0a7d0a6f62737472756374696f6e2d726561736f6e203d207b0a2020726561736f6e4b696e643a20747374722c0a20207061796c6f61643a207b202a2074737472203d3e20636f72652d65787072207d2c0a7d0a6566666563742d6e6f6465203d207b0a20206b696e643a2022656666656374222c0a202062696e64696e673a206c6f63616c2d7265662c0a20206566666563743a20747374722c0a2020696e7075743a20636f72652d657870722c0a20206f62737472756374696f6e4d61703a207b202a206661696c7572652d6964656e74203d3e206f62737472756374696f6e2d61726d207d2c0a7d0a65787465726e616c2d616374696f6e2d726571756573742d6e6f6465203d207b0a20206b696e643a202265787465726e616c416374696f6e52657175657374222c0a202062696e64696e673a206c6f63616c2d7265662c0a20206f7065726174696f6e3a207265736f757263652d7265662c0a2020696e707574547970653a20636f72652d747970652d7265662c0a2020736574746c656d656e74547970653a20636f72652d747970652d7265662c0a2020696e707574536368656d613a207265736f757263652d7265662c0a2020736574746c656d656e74536368656d613a207265736f757263652d7265662c0a2020696e7075743a20636f72652d657870722c0a2020617574686f7269747953636f70653a20636f72652d657870722c0a202062617369733a20636f72652d657870722c0a20206275646765743a2065787465726e616c2d616374696f6e2d6275646765742c0a20207265636f6e63696c696174696f6e4c61773a207265736f757263652d7265662c0a202073746174653a20226177616974696e67536574746c656d656e74222c0a2020736574746c656d656e7441646d697373696f6e3a2022736368656d615265717569726564222c0a7d0a65787465726e616c2d616374696f6e2d627564676574203d207b0a20206d6178536574746c656d656e7442797465733a20636f72652d657870722c0a20206d6178417474656d7074733a20636f72652d657870722c0a7d0a6f62737472756374696f6e2d61726d203d207b0a202062696e6465723a206c6f63616c2d7265662c0a202076616c75653a20636f72652d657870722c0a7d0a67756172642d6e6f6465203d207b0a20206b696e643a20226775617264222c0a20207072656469636174653a20636f72652d7072656469636174652c0a20206f62737472756374696f6e3a20636f72652d657870722c0a7d0a6272616e63682d6e6f6465203d207b0a20206b696e643a20226272616e6368222c0a20203f2062696e64696e673a206c6f63616c2d7265662c0a20207072656469636174653a20636f72652d7072656469636174652c0a20207468656e3a20636f72652d626c6f636b2c0a2020656c73653a20636f72652d626c6f636b2c0a7d0a666f722d6e6f6465203d207b0a20206b696e643a2022666f72222c0a202062696e6465723a206c6f63616c2d7265662c0a2020697465723a20636f72652d657870722c0a2020626f756e643a20636f72652d626f756e642c0a2020626f64793a20636f72652d626c6f636b2c0a7d0a6d617463682d6e6f6465203d207b0a20206b696e643a20226d61746368222c0a20207363727574696e65653a20636f72652d657870722c0a202061726d733a205b2b206d617463682d626c6f636b2d61726d5d2c0a7d0a6d617463682d626c6f636b2d61726d203d207b0a2020636173653a20747374722c0a20203f2062696e6465723a206c6f63616c2d7265662c0a2020626f64793a20636f72652d626c6f636b2c0a7d0a70726f6f662d6f626c69676174696f6e2d6e6f6465203d207b0a20206b696e643a202270726f6f66222c0a2020636f6f7264696e6174653a20747374722c0a20207072656469636174653a20636f72652d7072656469636174652c0a7d0a0a636f72652d626f756e64203d206c69746572616c2d626f756e64202f20636f6f7264696e6174652d626f756e640a6c69746572616c2d626f756e64203d207b206b696e643a20226c69746572616c222c2076616c75653a2075696e74207d0a636f6f7264696e6174652d626f756e64203d207b206b696e643a2022636f6f7264696e617465222c207265663a2074737472207d0a0a3b20536861726564207265736f757263652d7265662c207368613235362d6469676573742c206661696c7572652d6964656e742c2061706572747572652d726571756972656d656e742c0a3b20636f72652d747970652d7265662c20616e6420636f72652d6e616d65642d747970652d7265662061726520646566696e6564206f6e636520696e2065646963742d636f6d6d6f6e2e6364646c2e0a0a3b202d2d2d2065646963742d6c61777061636b2e6364646c202d2d2d0a3b2065646963742d6c61777061636b2e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f7220746865204564696374206c61777061636b206d616e696665737420616e64206578706f727420737572666163652e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e204a534f4e20696e207468652070726f73652073706563730a3b2069732061207265766965772072656e646572696e672067656e6572617465642066726f6d207468697320736368656d61202845444943542d4142492d4e4f4455502d303031292e0a0a6c61777061636b2d6d616e6966657374203d207b0a202061706956657273696f6e3a202265646963742e6c61777061636b2f7631222c0a202069643a20747374722c0a202076657273696f6e3a20747374722c0a20206163636570746564436f72654162693a205b2b20747374725d2c0a2020646570656e64656e636965733a205b2a206c61777061636b2d6465705d2c202020202020202020203b20616379636c69632c206469676573742d6c6f636b6564202845444943542d4c41575041434b2d4441472d303031290a20206578706f7274733a207265736f757263652d7265662c0a20203f2074617267657441646170746572733a205b2b207461726765742d616461707465725d2c2020203b207265717569726564206f6e6c7920696620616e792072756e74696d6520656666656374206578697374730a20203f2068656c706572436f6d706f6e656e743a2065786563757461626c652d636f6d706f6e656e742c203b2065786563757461626c652068656c70657273206361727279207468656972206f776e2073616e64626f782b6675656c0a202076657269666965723a2076657269666965722c202020202020202020202020202020202020202020203b20636c61737369666965643a206465636c61726174697665206f722065786563757461626c650a2020636f6d7061746962696c6974793a207265736f757263652d7265662c0a2020636f6e666f726d616e636546697874757265436f727075733a207265736f757263652d7265662c0a7d0a0a3b2041207665726966696572206973206569746865722061206465636c617261746976652072756c6573657420286e6f2072756e74696d6529206f7220616e2065786563757461626c650a3b20636f6d706f6e656e742e20416e2065786563757461626c65207665726966696572204d55535420636172727920697473206f776e2073616e64626f7820616e64206675656c206d6f64656c2c0a3b20736f2074686520736368656d6120656e666f726365732074686174206e6f2065786563757461626c6520636f6d706f6e656e74206973206c65667420756e626f756e6465640a3b202845444943542d4142492d56455249464945522d424f554e442d303031292e0a7665726966696572203d206465636c617261746976652d7665726966696572202f2065786563757461626c652d76657269666965720a6465636c617261746976652d7665726966696572203d207b20636c6173733a20226465636c61726174697665222c2072756c657365743a207265736f757263652d726566207d0a65786563757461626c652d7665726966696572203d207b0a2020636c6173733a202265786563757461626c65222c0a2020636f6d706f6e656e743a207265736f757263652d7265662c0a202073616e64626f783a207265736f757263652d7265662c0a20206675656c4d6f64656c3a207265736f757263652d7265662c0a7d0a0a3b20416e792065786563757461626c6520636f6d706f6e656e7420697320626f756e64656420627920697473206f776e2073616e64626f78202b206675656c206d6f64656c2e0a65786563757461626c652d636f6d706f6e656e74203d207b0a2020636f6d706f6e656e743a207265736f757263652d7265662c0a202073616e64626f783a207265736f757263652d7265662c0a20206675656c4d6f64656c3a207265736f757263652d7265662c0a7d0a0a6c61777061636b2d646570203d207b2069643a20747374722c2076657273696f6e3a20747374722c206469676573743a207368613235362d646967657374207d0a0a3b20416461707465722073656c656374696f6e206b65797320534f4c454c59206f666620746865206469676573742d6c6f636b65642060616363657074656454617267657450726f66696c65600a3b20286974732060696460206973207468652070726f66696c652069643b206974732060646967657374602070696e73207468652065786163742070726f66696c652f76657273696f6e292e2054686572650a3b20617265206e6f20696e646570656e64656e7420646973706c617920737472696e6773207468617420636f756c64206469736167726565207769746820746865206c6f636b2c20736f20610a3b207265736f6c7665722063616e6e6f742062696e6420616e206164617074657220746f206f6e6520746172676574207768696c6520746865206c6f636b2070726f76657320616e6f746865720a3b202845444943542d4c41575041434b2d414441505445522d54415247455449522d303031292e0a7461726765742d61646170746572203d207b0a2020616363657074656454617267657450726f66696c653a207265736f757263652d7265662c202020203b206469676573742d6c6f636b65642c20617574686f72697461746976652073656c6563746f720a2020616363657074656454617267657449723a207265736f757263652d7265662c2020202020202020203b206469676573742d6c6f636b65640a2020616461707465723a207265736f757263652d7265662c0a7d0a0a3b20536861726564207479706573207265736f757263652d72656620616e64207368613235362d6469676573742061726520646566696e6564206f6e636520696e0a3b2065646963742d636f6d6d6f6e2e6364646c20616e6420617373656d626c65642077697468207468697320736368656d61202845444943542d4142492d4e4f4455502d303031292e0a0a3b202d2d2d206578706f72742073757266616365202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a0a6c61777061636b2d6578706f727473203d207b0a202074797065733a205b2a206578706f727465642d747970655d2c0a2020636f6e7374616e74733a205b2a206578706f727465642d636f6e7374616e745d2c0a20207075726546756e6374696f6e733a205b2a20707572652d66756e6374696f6e5d2c0a2020656666656374733a205b2a2073656d616e7469632d6566666563745d2c0a20206f62737472756374696f6e733a205b2a206f62737472756374696f6e2d6465665d2c0a20203b206b65796564206279206f7065726174696f6e2d70726f66696c6520636f6f7264696e61746520e2869220756e697175656e65737320656e666f726365640a20203b202845444943542d4142492d4f5050524f46494c452d554e495155452d303031290a20203b206f7065726174696f6e2d70726f66696c65207265636f7264732074686973206c61777061636b206578706f72747320286f707469632074656d706c6174657320746861740a20203b2060696d706c656d656e7473602f6070726f66696c656020636c6175736573207265736f6c766520616761696e7374292e206f7065726174696f6e2d70726f66696c652069730a20203b20646566696e656420696e2065646963742d636f6d6d6f6e2e6364646c202845444943542d4142492d4f5050524f46494c452d534c4f542d303031292e0a20206f7065726174696f6e50726f66696c65733a207b202a2074737472203d3e206f7065726174696f6e2d70726f66696c65207d2c20203b206b6579656420627920636f6f7264696e6174650a7d0a0a6578706f727465642d7479706520202020203d207b20636f6f7264696e6174653a20747374722c20646566696e6974696f6e3a20636f72652d747970652d726566207d0a6578706f727465642d636f6e7374616e74203d207b20636f6f7264696e6174653a20747374722c20747970653a20636f72652d747970652d7265662c2076616c75653a20616e79207d0a0a3b204120707572652068656c7065722069732061206469736372696d696e6174656420756e696f6e2062792060736f75726365602c20736f2074686520736368656d6120697473656c660a3b2067756172616e7465657320616e20696d706c656d656e746174696f6e20657869737473202845444943542d4c41575041434b2d505552452d494d504c2d303031293a0a3b2020202d20226564696374223a20617574686f72656420696e2045646963742f436f72653b2074686520436f726520626f6479206973206361727269656420696e6c696e6520286861736865640a3b20202020207769746820746865206578706f72742073757266616365292e2054686520736368656d61207265717569726573207468652060626f647960206669656c642e0a3b2020202d2022636f6d706f6e656e74223a20696d706c656d656e746564206f7574736964652045646963743b2063617272696573206e6f20696e6c696e6520626f647920616e6420696e73746561640a3b20202020206361727269657320697473206f776e206469676573742d6c6f636b65642060696d706c656d656e746174696f6e60202873616e64626f78202b206675656c292e20497420646f65730a3b20202020206e6f7420646570656e64206f6e20746865206f7074696f6e616c206d616e69666573742d6c6576656c2068656c706572436f6d706f6e656e742e0a707572652d66756e6374696f6e203d2065646963742d707572652d66756e6374696f6e202f20636f6d706f6e656e742d707572652d66756e6374696f6e0a0a707572652d66756e6374696f6e2d636f6d6d6f6e203d20280a2020636f6f7264696e6174653a20747374722c0a202074797065506172616d65746572733a205b2a20747374725d2c0a2020706172616d6574657254797065733a205b2a20636f72652d747970652d7265665d2c2020202020203b20616c6c20626f756e6465640a202072657475726e547970653a20636f72652d747970652d7265662c20202020202020202020202020203b20626f756e6465640a2020636f737454656d706c6174653a20747374722c0a202064657465726d696e69736d436c6173733a2022746f74616c22202f2022746f74616c2d776974682d74797065642d646961676e6f73746963222c0a290a0a65646963742d707572652d66756e6374696f6e203d207b0a2020707572652d66756e6374696f6e2d636f6d6d6f6e2c0a2020736f757263653a20226564696374222c0a2020626f64793a20636f72652d666e2d626f64792c2020202020202020202020202020202020202020203b20696e6c696e652c20686173682d7369676e69666963616e740a7d0a0a636f6d706f6e656e742d707572652d66756e6374696f6e203d207b0a2020707572652d66756e6374696f6e2d636f6d6d6f6e2c0a2020736f757263653a2022636f6d706f6e656e74222c0a20203b20746865206469676573742d6c6f636b656420636f6d706f6e656e7420696d706c656d656e74696e6720746869732068656c7065722e2052657175697265642061742074686520736368656d610a20203b206c6576656c20736f206120636f6d706f6e656e742068656c7065722063616e206e657665722076616c696461746520776974686f7574206120686173682d626f756e642c0a20203b2073616e64626f782b6675656c2d64657363726962656420696d706c656d656e746174696f6e202845444943542d4c41575041434b2d505552452d494d504c2d303031292e0a2020696d706c656d656e746174696f6e3a2065786563757461626c652d636f6d706f6e656e742c0a7d0a0a3b20636f72652d666e2d626f647920697320646566696e65642062792065646963742d636f72652e6364646c20616e6420617373656d626c656420776974682074686973206c61777061636b0a3b20736368656d612e2049742069732061207075726520436f72652066756e6374696f6e20626f64792c206e6f7420616e206566666563742d63617061626c6520636f72652d626c6f636b2e0a0a73656d616e7469632d656666656374203d207b0a2020636f6f7264696e6174653a20747374722c0a202074797065506172616d65746572733a205b2a20747374725d2c0a2020696e707574547970653a20636f72652d747970652d7265662c2020202020202020202020202020203b20626f756e6465640a20206f7574707574547970653a20636f72652d747970652d7265662c20202020202020202020202020203b20626f756e6465640a2020657865637574696f6e436c6173733a202270726f6f664f6e6c7922202f202272756e74696d65222c2020203b206f7274686f676f6e616c20746f207772697465436c6173730a20206566666563744b696e6448696e743a206566666563742d6b696e642c0a2020666f6f747072696e744f626c69676174696f6e3a20747374722c0a2020636f73744f626c69676174696f6e3a20747374722c0a20206566666563744661696c757265733a207b202a206661696c7572652d6964656e74203d3e206566666563742d6661696c7572652d626f6479207d2c20203b206b6579656420627920636f6f7264696e6174653b20756e697175650a20206775617264537570706f72743a20626f6f6c2c0a7d0a0a6f62737472756374696f6e2d646566203d207b0a2020636f6f7264696e6174653a20747374722c0a2020617574686f72697479436c6173733a20617574686f726974792d636c6173732c0a20207061796c6f6164536368656d613a20636f72652d747970652d7265662c20202020202020202020203b2074797065642c20626f756e64656420286d617920626520656d707479207265636f7264290a7d0a0a3b206566666563742d6661696c7572652d626f64792c206566666563742d6b696e642c20617574686f726974792d636c6173732c20616e6420636f72652d747970652d7265662061726520646566696e65640a3b206f6e636520696e2065646963742d636f6d6d6f6e2e6364646c20616e6420617373656d626c65642077697468207468697320736368656d61202845444943542d4142492d4e4f4455502d303031292e0a0a3b202d2d2d2065646963742d6c61777061636b2d616461707465722e6364646c202d2d2d0a3b2065646963742d6c61777061636b2d616461707465722e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f72206f6e6520646972656374206465636c61726174697665206c61777061636b2074617267657420616461707465722e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e0a3b0a3b2054686520656e636c6f73696e67206c61777061636b206d616e69666573742073656c6563747320746865206578616374207461726765742070726f66696c652c207461726765742049522c0a3b20616e642061646170746572207265736f75726365206469676573742e2054686f7365206964656e74697469657320617265206e6f7420726570656174656420686572652e0a0a6c61777061636b2d61646170746572203d207b0a202061706956657273696f6e3a202265646963742e6c61777061636b2d616461707465722f7631222c0a2020636c6173733a20226465636c61726174697665222c0a20206f7065726174696f6e50726f66696c65733a207b0a202020202a2074737472203d3e206c61777061636b2d616461707465722d6f7065726174696f6e2d70726f66696c650a20207d2c0a2020656666656374496d706c656d656e746174696f6e733a207b0a202020202a2074737472203d3e206c61777061636b2d616461707465722d6566666563740a20207d2c0a2020627564676574733a207b0a202020202a2074737472203d3e206c61777061636b2d616461707465722d6275646765740a20207d2c0a7d0a0a3b204b657973206172652063616e6f6e6963616c206c61777061636b206f7065726174696f6e2d70726f66696c6520636f6f7264696e617465732e0a6c61777061636b2d616461707465722d6f7065726174696f6e2d70726f66696c65203d0a20207b0a20202020636f72653a20747374722c0a2020202073656d616e746963456666656374733a205b2b20747374725d2c0a202020203f206275646765744f626c69676174696f6e3a20747374722c0a202020203f20746172676574436f6e66696775726174696f6e3a207265736f757263652d7265662c0a20207d202f0a20207b0a20202020636f72653a20747374722c0a2020202073656d616e746963456666656374733a205b5d2c0a202020206275646765744f626c69676174696f6e3a20747374722c0a20202020746172676574436f6e66696775726174696f6e3a207265736f757263652d7265662c0a20207d0a0a3b204b657973206172652063616e6f6e6963616c206c61777061636b2073656d616e7469632d65666665637420636f6f7264696e617465732e20466f6f747072696e742c20636f73742c20616e640a3b206661696c757265206669656c6473206d7573742065786163746c792064697363686172676520746865206d61746368696e67206578706f72746564206566666563742e0a6c61777061636b2d616461707465722d656666656374203d207b0a2020746172676574496e7472696e7369633a20747374722c0a2020746172676574436f6e66696775726174696f6e3a207265736f757263652d7265662c0a20207772697465436c6173733a206c61777061636b2d616461707465722d77726974652d636c6173732c0a2020666f6f747072696e744f626c69676174696f6e3a20747374722c0a2020636f73744f626c69676174696f6e3a20747374722c0a20206661696c7572654d617070696e67733a207b202a206661696c7572652d6964656e74203d3e2074737472207d2c0a7d0a0a3b204b657973206172652063616e6f6e6963616c206578706f7274656420636f73742d6f626c69676174696f6e20636f6f7264696e617465732e0a6c61777061636b2d616461707465722d627564676574203d207b0a20206d617853746570733a2075696e742c0a20206d6178416c6c6f636174656442797465733a2075696e742c0a20206d61784f757470757442797465733a2075696e742c0a7d0a0a6c61777061636b2d616461707465722d77726974652d636c617373203d20226e6f6e6522202f20227265616422202f202263726561746522202f2022656e7375726522202f0a20202020202020202020202020202020202020202020202020202020202022617070656e6422202f20227265706c61636522202f202264656c65746522202f2022637573746f6d220a0a3b206661696c7572652d6964656e7420697320646566696e656420696e2065646963742d636f6d6d6f6e2e6364646c2e0a0a3b202d2d2d2065646963742d7461726765742d70726f66696c652e6364646c202d2d2d0a3b2065646963742d7461726765742d70726f66696c652e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f7220746865204564696374207461726765742070726f66696c65206d616e69666573742e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76310a3b202873656520535045435f636f6e74696e75756d2d636f6e74726163742d62756e646c652d76312e6d64292e204a534f4e20696e207468652070726f736520737065637320697320610a3b207265766965772072656e646572696e672067656e6572617465642066726f6d207468697320736368656d613b2074686973204344444c206973207468652073696e676c6520736f757263650a3b206f66207472757468202845444943542d4142492d4e4f4455502d303031292e0a0a7461726765742d70726f66696c652d6d616e6966657374203d207b0a202061706956657273696f6e3a202265646963742e7461726765742d70726f66696c652f7631222c0a202069643a20747374722c202020202020202020202020202020202020202020202020203b20652e672e20226563686f2e64706f220a202076657273696f6e3a20747374722c20202020202020202020202020202020202020203b20652e672e202231220a20206163636570746564436f72654162693a205b2b20747374725d2c20202020202020203b20652e672e205b2265646963742e636f72652f7631225d0a0a2020696e7472696e736963733a207265736f757263652d7265662c0a2020696e7472696e7369634e616d6573706163653a20747374722c0a20203b207075626c697368657320746869732070726f66696c652773206f7065726174696f6e2d70726f66696c65207265636f72647320286f707469632074656d706c6174657320746861740a20203b206070726f66696c65602f60696d706c656d656e74736020636c6175736573207265736f6c766520616761696e7374292e205265666572656e63657320616e0a20203b206f7065726174696f6e2d70726f66696c65732d646f63756d656e74202845444943542d4142492d4f5050524f46494c452d534c4f542d303031292e0a20206f7065726174696f6e50726f66696c65733a207265736f757263652d7265662c0a2020666f6f747072696e74416c67656272613a207265736f757263652d7265662c0a2020636f7374416c67656272613a207265736f757263652d7265662c0a202074617267657449723a207265736f757263652d7265662c0a20206f62737472756374696f6e5461786f6e6f6d793a207265736f757263652d7265662c0a202076657269666965723a207265736f757263652d7265662c0a20206c6f77657265723a207265736f757263652d7265662c0a202073616e64626f783a207265736f757263652d7265662c0a20206675656c4d6f64656c3a207265736f757263652d7265662c0a0a20203b206669656c647320746865206c616e67756167652073706563207265717569726573206f662065766572792070726f66696c650a202062756e646c6550726f66696c653a207265736f757263652d7265662c0a202067656e657261746564417274696661637450726f66696c65733a205b2a207265736f757263652d7265665d2c0a202063616e6f6e6963616c456e636f64696e6752756c65733a207265736f757263652d7265662c0a20203b20412070726f66696c65207468617420616363657074732074686520646972656374206465636c61726174697665206c61777061636b2d6164617074657220414249206e616d65732069740a20203b2065786163746c79206f6e63652e2050726f66696c6573207468617420646f206e6f7420636f6e73756d65206c61777061636b206164617074657273206c6561766520746869730a20203b206f7074696f6e616c20736c6f7420616273656e74206f7220656d7074792e0a20203f2061636365707465644c61777061636b416461707465724162693a205b5d202f205b2265646963742e6c61777061636b2d616461707465722f7631225d2c0a2020646961676e6f737469634162693a207265736f757263652d7265662c0a0a20203b206170706c69636174696f6e20646f637472696e650a20206170706c69636174696f6e4d6f64656c3a202261746f6d6963222c0a202072656164436f6e73697374656e63793a20226170706c69636174696f6e2d736e617073686f7422202f20747374722c0a202067756172644576616c756174696f6e3a2022707265636f6d6d69742d61746f6d696322202f20747374722c0a20206f62737472756374696f6e526f6c6c6261636b3a20226e6f2d76697369626c652d6566666563747322202f20747374722c0a20206d756c74695461726765743a20626f6f6c2c0a20203b207768657468657220746865207461726765742063616e206576616c7561746520707265636f6d6d697420706f7374636f6e646974696f6e20286067756172616e746565602920636865636b730a20203b20696e73696465207468652061746f6d6963206170706c69636174696f6e20756e6974202845444943542d5441524745542d504f5354434f4e442d303031290a2020706f7374636f6e646974696f6e537570706f72743a20626f6f6c2c0a0a202064657465726d696e6973746963457865637574696f6e3a207265736f757263652d7265662c0a2020636f6e666f726d616e636546697874757265436f727075733a207265736f757263652d7265662c0a7d0a0a3b20536861726564207479706573207265736f757263652d72656620616e64207368613235362d6469676573742061726520646566696e6564206f6e636520696e0a3b2065646963742d636f6d6d6f6e2e6364646c20616e6420617373656d626c65642077697468207468697320736368656d6120627920746865206275696c640a3b202845444943542d4142492d4e4f4455502d303031292e205468657920617265206e6f74207265646566696e656420686572652e0a0a3b202d2d2d20696e7472696e736963207369676e6174757265202d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d2d0a3b20546865206172746966616374207265666572656e63656420627920746865206d616e696665737427732060696e7472696e7369637360207265736f757263652d726566206973207468650a3b20696e7472696e7369632d7369676e617475726520636f7270757320646f63756d656e742062656c6f772e20497473206c61796f757420697320666978656420736f2074776f0a3b20696e646570656e64656e742070726f66696c65732076616c69646174652f686173682074686520636f72707573206964656e746963616c6c790a3b202845444943542d4142492d494e5452494e534943532d444f432d303031292e0a0a3b20696e7472696e736963732069732061204d4150206b6579656420627920636f6f7264696e6174652c20736f2074686520736368656d6120697473656c6620656e666f726365730a3b20636f6f7264696e61746520756e697175656e6573732e20412070726f766964657220726563656976657320746865207265736f6c76656420636f7270757320617320610a3b206469676573742d626f756e642073656d616e74696320696e70757420616e64207265736f6c76657320636f6f7264696e617465732077697468696e20746861742061727469666163742e0a3b2045616368206d6170206b6579204d55535420657175616c20697473207265636f726427732060636f6f7264696e61746560206669656c640a3b202845444943542d4142492d494e5452494e5349432d554e495155452d303031292e0a696e7472696e736963732d646f63756d656e74203d207b0a202061706956657273696f6e3a202265646963742e7461726765742d70726f66696c652e696e7472696e736963732f7631222c0a2020696e7472696e736963733a207b202a2074737472203d3e20696e7472696e736963207d2c0a7d0a0a3b20546865206172746966616374207265666572656e63656420627920746865206d616e6966657374277320606f7065726174696f6e50726f66696c657360207265736f757263652d7265662e0a3b206f7065726174696f6e2d70726f66696c65202f206f707469632d74656d706c6174652061726520646566696e656420696e2065646963742d636f6d6d6f6e2e6364646c2e204b657965642062790a3b20636f6f7264696e61746520736f207265736f6c7574696f6e2063616e2774207069636b206265747765656e2074776f2073616d652d636f6f7264696e6174652070726f66696c65730a3b202845444943542d4142492d4f5050524f46494c452d534c4f542d3030312c2045444943542d4142492d4f5050524f46494c452d554e495155452d303031292e0a6f7065726174696f6e2d70726f66696c65732d646f63756d656e74203d207b0a202061706956657273696f6e3a202265646963742e7461726765742d70726f66696c652e6f7065726174696f6e2d70726f66696c65732f7631222c0a202070726f66696c65733a207b202a2074737472203d3e206f7065726174696f6e2d70726f66696c65207d2c0a7d0a0a3b2041207479706564207072652d6c6f776572696e67207175657374696f6e20746861742063616e2062652070726f706f73656420627920576174736f6e206f7220616e206167656e7420616e640a3b20636865636b65642062792074686520636f6d70696c65722e2049742069732063616e6f6e6963616c2d43424f5220656e636f64656420756e6465720a3b206065646963742e6c6f776572696e672d726571756972656d656e74732f7631603b2074686520636f6d70696c657220636865636b7320746869732061727469666163742c206e6f74207468650a3b2070726f736520746861742070726f64756365642069742e0a6c6f776572696e672d726571756972656d656e7473203d207b0a202061706956657273696f6e3a202265646963742e6c6f776572696e672d726571756972656d656e74732f7631222c0a20206f7065726174696f6e50726f66696c653a20747374722c0a202073656d616e746963456666656374733a205b2a2073656d616e7469632d6566666563742d726571756972656d656e745d2c0a202072657175697265645772697465436c61737365733a205b2a2077726974652d636c6173735d2c0a202067756172644b696e64733a205b2a2067756172642d6b696e645d2c0a202061746f6d69636974793a2061746f6d69636974792d726571756972656d656e742c0a2020706f7374636f6e646974696f6e537570706f72743a20626f6f6c2c0a20206f62737472756374696f6e436f6f7264696e617465733a205b2a20747374725d2c0a2020666f6f747072696e744f626c69676174696f6e733a205b2a20747374725d2c0a2020636f73744f626c69676174696f6e733a205b2a20747374725d2c0a20206f70746963436f6e74726163743a20747374722c0a7d0a0a73656d616e7469632d6566666563742d726571756972656d656e74203d207b0a2020636f6f7264696e6174653a20747374722c0a20207772697465436c6173733a2077726974652d636c6173732c0a202067756172644b696e64733a205b2a2067756172642d6b696e645d2c0a20206f62737472756374696f6e436f6f7264696e617465733a205b2a20747374725d2c0a2020666f6f747072696e744f626c69676174696f6e733a205b2a20747374725d2c0a2020636f73744f626c69676174696f6e733a205b2a20747374725d2c0a7d0a0a77726974652d636c617373203d20226e6f6e6522202f20227265616422202f202263726561746522202f2022656e7375726522202f2022617070656e6422202f0a2020202020202020202020202020227265706c61636522202f202264656c65746522202f20747374720a67756172642d6b696e64203d2022707265636f6d6d69742d61746f6d696322202f20747374720a61746f6d69636974792d726571756972656d656e74203d202261746f6d696322202f20747374720a0a3b20412067656e75696e6520756e696f6e3a207075726520636f6e7374727563746f7273206361727279206e6f20656666656374206b696e64206f72206661696c757265733b206566666563740a3b20696e7472696e73696373206d757374202845444943542d5441524745542d494e5452494e5349432d434c4153532d303031292e2054686520736368656d6120656e666f7263657320746869732c0a3b206e6f74206120636f6d6d656e742e0a0a3b2054686520696e7472696e736963277320636f6f7264696e6174652069732074686520696e7472696e73696373206d6170204b45592c206e6f7420612076616c7565206669656c642c20736f207468650a3b206b657920616e6420636f6f7264696e6174652063616e206e65766572206469736167726565202845444943542d4142492d494e5452494e5349432d554e495155452d303031292e0a696e7472696e736963203d20707572652d696e7472696e736963202f206566666563742d696e7472696e7369630a0a707572652d696e7472696e736963203d207b0a2020696e7472696e736963436c6173733a202270757265222c0a202074797065506172616d65746572733a205b2a20747374725d2c0a2020617267756d656e7454797065733a205b2a20636f72652d747970652d7265665d2c0a202072657475726e547970653a20636f72652d747970652d7265662c0a20206775617264537570706f72743a2066616c73652c0a2020666f6f747072696e7454656d706c6174653a20747374722c0a2020636f737454656d706c6174653a20747374722c0a20207772697465436c6173733a20226e6f6e65222c0a7d0a0a6566666563742d696e7472696e736963203d207b0a2020696e7472696e736963436c6173733a2022656666656374222c0a202074797065506172616d65746572733a205b2a20747374725d2c0a2020617267756d656e7454797065733a205b2a20636f72652d747970652d7265665d2c0a202072657475726e547970653a20636f72652d747970652d7265662c0a20206566666563744b696e643a206566666563742d6b696e642c0a20203b206d6170206b65796564206279206661696c75726520636f6f7264696e61746520286661696c7572652d6964656e74293b20746865206661696c75726520636f6f7264696e6174652069730a20203b20746865206b65792c206e6f7420612076616c7565206669656c642c20736f20756e697175656e657373206973207374727563747572616c0a20203b202845444943542d4142492d4641494c5552452d554e495155452d303031292e0a20206566666563744661696c757265733a207b202a206661696c7572652d6964656e74203d3e206566666563742d6661696c7572652d626f6479207d2c0a20206775617264537570706f72743a20626f6f6c2c0a2020666f6f747072696e7454656d706c6174653a20747374722c0a2020636f737454656d706c6174653a20747374722c0a20207772697465436c6173733a20227265616422202f202263726561746522202f2022656e7375726522202f2022617070656e6422202f20227265706c61636522202f0a20202020202020202020202020202264656c65746522202f2022637573746f6d222c0a202063616e5061727469636970617465496e41746f6d696347756172643a20626f6f6c2c0a7d0a0a3b206566666563742d6661696c7572652d626f64792c206566666563742d6b696e642c20617574686f726974792d636c6173732c20616e6420636f72652d747970652d7265662061726520646566696e65640a3b206f6e636520696e2065646963742d636f6d6d6f6e2e6364646c20616e6420617373656d626c65642077697468207468697320736368656d61202845444943542d4142492d4e4f4455502d303031292e0a0a3b202d2d2d2065646963742d617574686f726974792d66616374732e6364646c202d2d2d0a3b2065646963742d617574686f726974792d66616374732e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f722074686520666972737420636f6d70696c65722d636f6e7465787420617574686f726974792d666163747320646f63756d656e742e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e0a3b0a3b205468697320736368656d6120697320617373656d626c656420776974682065646963742d636f6d6d6f6e2e6364646c20736f20736f757263652e6469676573742075736573207468650a3b20736861726564207368613235362d6469676573742074797065642076616c75652e204a534f4e2069732061207265766965772f696e7075742072656e646572696e673a206974730a3b20607368613235363a3c3634206865783e6020736f75726365206469676573742069732070726f6a656374656420746f205b60736861323536602c203332207261772062797465735d206f6e0a3b2074686520776972652c20616e64206974732066616374206172726179732070726f6a65637420746f2074686520636f6f7264696e6174652d6b65796564206d6170732062656c6f772e0a0a617574686f726974792d6661637473203d207b0a202061706956657273696f6e3a202265646963742e617574686f726974792d66616374732f7631222c0a2020736f757263653a20617574686f726974792d666163742d736f757263652c0a20206f7065726174696f6e50726f66696c65733a207b202a2074737472203d3e20617574686f726974792d6f7065726174696f6e2d70726f66696c652d66616374207d2c0a20206566666563745772697465436c61737365733a207b202a2074737472203d3e20617574686f726974792d77726974652d636c617373207d2c0a2020627564676574733a207b202a2074737472203d3e20617574686f726974792d6275646765742d66616374207d2c0a7d0a0a617574686f726974792d666163742d736f75726365203d207b0a20206b696e643a20226c61777061636b22202f202274617267657450726f66696c65222c0a2020636f6f7264696e6174653a20747374722c0a20206469676573743a207368613235362d6469676573742c0a7d0a0a3b20546865206d6170206b65792069732074686520736f75726365206f7065726174696f6e2d70726f66696c6520636f6f7264696e6174652e204974206973206e6f7420726570656174656420696e0a3b207468652076616c75652c20736f2061206b657920616e6420656d62656464656420636f6f7264696e6174652063616e6e6f742064697361677265652e20416c6c6f7765642077726974650a3b20636c61737365732061726520612063616e6f6e6963616c206d61702d7365743a2074686520636c6173732069732074686520756e69717565206b657920616e64206e756c6c206973207468650a3b20756e6974206d61726b65722e2043616e6f6e6963616c2043424f52206669786573206b6579206f7264657220776974686f75742061207365636f6e64206f72646572696e672072756c652e0a617574686f726974792d6f7065726174696f6e2d70726f66696c652d66616374203d207b0a2020636f72653a20747374722c0a2020616c6c6f7765645772697465436c61737365733a207b202a20617574686f726974792d77726974652d636c617373203d3e206e756c6c207d2c0a7d0a0a3b20546865206566666563745772697465436c6173736573206d6170206b6579206973207468652073656d616e7469632065666665637420636f6f7264696e6174652e2054686520627564676574730a3b206d6170206b65792069732074686520736f757263652062756467657420636f6f7264696e6174652e2043616e6f6e6963616c2043424f52206d61702d6b657920756e697175656e6573730a3b206d616b6573206475706c6963617465206661637420636f6f7264696e61746573207374727563747572616c6c7920756e726570726573656e7461626c652e0a617574686f726974792d6275646765742d66616374203d207b0a20206d617853746570733a2075696e742c0a20206d6178416c6c6f636174656442797465733a2075696e742c0a20206d61784f757470757442797465733a2075696e742c0a7d0a0a3b20417574686f726974794661637473446f63756d656e7420763120696e74656e74696f6e616c6c792061636365707473206f6e6c792074686520777269746520636c6173736573207468650a3b2063757272656e7420636f6d70696c6572206d6f64656c2063616e20636f6e73756d652e2060637573746f6d602069732074686520736f6c6520763120637573746f6d207370656c6c696e673b0a3b20617262697472617279207461726765742d70726f66696c6520657874656e73696f6e20737472696e677320646f206e6f7420656e746572207468697320636f6d70696c657220706174682e0a617574686f726974792d77726974652d636c617373203d20226e6f6e6522202f20227265616422202f202263726561746522202f2022656e7375726522202f2022617070656e6422202f0a202020202020202020202020202020202020202020202020227265706c61636522202f202264656c65746522202f2022637573746f6d220a0a3b202d2d2d2065646963742d726573756c742d70726f6a656374696f6e2e6364646c202d2d2d0a3b20535044582d4c6963656e73652d4964656e7469666965723a204170616368652d322e300a3b2065646963742d726573756c742d70726f6a656374696f6e2e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f7220636f6d70696c65722d6f776e6564206170706c69636174696f6e2d726573756c742070726f6a656374696f6e732e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e0a0a726573756c742d70726f6a656374696f6e203d207b0a2020736368656d613a202265646963742e726573756c742d70726f6a656374696f6e2f7631222c0a20206f7065726174696f6e436f6f7264696e6174653a20626f756e6465642d70726f6a656374696f6e2d746578742c0a20206f7574707574547970653a20626f756e6465642d70726f6a656374696f6e2d746578742c0a20206d61784f757470757442797465733a2075696e74202e677420302c0a202065787072657373696f6e3a20726573756c742d70726f6a656374696f6e2d657870722c0a7d0a0a726573756c742d70726f6a656374696f6e2d65787072203d20726573756c742d70726f6a656374696f6e2d7265636f7264202f20726573756c742d70726f6a656374696f6e2d736f757263650a0a726573756c742d70726f6a656374696f6e2d7265636f7264203d207b0a20206b696e643a20227265636f7264222c0a20203b2054686520726f6f74207265636f726420636f756e7473206173206f6e65206f66207468652052757374206465636f6465722773203235362065787072657373696f6e206e6f6465732e0a20203b204e657374656420616767726567617465206e6f646520636f756e742072656d61696e7320616e20617574686f7269746174697665206465636f64657220636865636b2e0a20206669656c64733a207b20302a32353520626f756e6465642d70726f6a656374696f6e2d74657874203d3e20726573756c742d70726f6a656374696f6e2d65787072207d2c0a7d0a0a726573756c742d70726f6a656374696f6e2d736f75726365203d207b0a20206b696e643a2022736f75726365222c0a2020736f757263653a20726573756c742d70726f6a656374696f6e2d736f757263652d6b696e642c0a20203b204d617463686573204d41585f524553554c545f50524f4a454354494f4e5f504154485f5345474d454e545320696e2065646963742d73796e7461782e0a2020706174683a205b302a333220626f756e6465642d70726f6a656374696f6e2d746578745d2c0a7d0a0a726573756c742d70726f6a656374696f6e2d736f757263652d6b696e64203d0a20207b206b696e643a20226170706c69636174696f6e496e70757422207d202f0a20207b0a202020206b696e643a20227075726542696e64696e67222c0a2020202062696e64696e6749643a20626f756e6465642d70726f6a656374696f6e2d746578742c0a20207d202f0a20207b0a202020206b696e643a20226361706162696c697479526573756c74222c0a202020207374657049643a20626f756e6465642d70726f6a656374696f6e2d746578742c0a20207d0a0a626f756e6465642d70726f6a656374696f6e2d74657874203d2074737472202e73697a652028312e2e31303234290a0a3b202d2d2d2065646963742d7461726765742d69722e6364646c202d2d2d0a3b20535044582d4c6963656e73652d4964656e7469666965723a204170616368652d322e300a3b2065646963742d7461726765742d69722e6364646c0a3b2043616e6f6e6963616c20736368656d6120666f72207468652045646963742d6f776e65642054617267657420495220617274696661637420656e76656c6f70652e0a3b20417574686f7269746174697665206279746520656e636f64696e673a2065646963742e63616e6f6e6963616c2d63626f722f76312e0a3b0a3b205468697320736368656d6120697320617373656d626c656420776974682065646963742d636f6d6d6f6e2e6364646c20616e642065646963742d636f72652e6364646c2e2049740a3b2064656c696265726174656c792072657573657320436f72652065787072657373696f6e732c20707265646963617465732c20627564676574732c206c6f63616c207265666572656e6365732c0a3b206f62737472756374696f6e20726561736f6e732c20616e64206f62737472756374696f6e2061726d7320736f2074686520736368656d61206d617463686573207468652076616c75650a3b20656d6974746564206279207468652063616e6f6e6963616c2054617267657420495220656e636f64657220726174686572207468616e20726573746174696e672074686f73652074797065732e0a3b2049742064657363726962657320746865207374727563747572616c207368617065206f662076616c6964206c6f776572696e672d70726f6475636564206172746966616374732e205468650a3b206c6f776572696e6720616e6420656e636f64657220636f6e7472616374732073657061726174656c7920656e666f7263652073656d616e746963206964656e7469666965722072756c65730a3b20616e642063616e6f6e6963616c206f72646572696e672f64656475706c69636174696f6e20666f72207365742d6c696b652076616c7565732e0a0a3b2054617267657420495220656e636f64696e672072656a6563747320616e20656d707479207461726765742d70726f66696c6520636f6f7264696e617465206265666f72652062797465730a3b2065786973742c20736f207468697320726f6f74207469676874656e732074686520736861726564207374727563747572616c207265736f757263652d726566206163636f7264696e676c792e0a7461726765742d69722d7265736f757263652d726566203d207b0a202069643a2074737472202e7265676578702022283f73292e2b222c0a20206469676573743a207368613235362d6469676573742c0a7d0a0a7461726765742d69722d6172746966616374203d207461726765742d69722d7068617365642d6172746966616374202f207461726765742d69722d6f7264657265642d61727469666163740a0a7461726765742d69722d7068617365642d6172746966616374203d207461726765742d69722d636c6f7365642d6172746966616374202f207461726765742d69722d6c65676163792d61727469666163740a0a7461726765742d69722d61727469666163742d636f6d6d6f6e203d20280a2020646f6d61696e3a20747374722c0a202074617267657450726f66696c653a207461726765742d69722d7265736f757263652d7265662c0a2020736f75726365436f7265436f6f7264696e6174653a2074737472202e7265676578702022283f73292e2b222c0a290a0a3b2076322062696e6473206f6e6520657865637574696f6e206f72646572206f7665722074686520696e737472756374696f6e207461626c65732e2054686520656e636f64657220616c736f0a3b2076616c69646174657320746865206578616374207065726d75746174696f6e20616e642070726f64756365722d6265666f72652d636f6e73756d657220646570656e64656e636965732e0a7461726765742d69722d6f7264657265642d6172746966616374203d207461726765742d69722d6f7264657265642d636c6f736564202f207461726765742d69722d6f7264657265642d6c65676163790a0a7461726765742d69722d6f7264657265642d636f6d6d6f6e203d20280a2020646f6d61696e3a20226563686f2e7370616e2d69722f7632222c0a202074617267657450726f66696c653a207461726765742d69722d7265736f757263652d7265662c0a2020736f75726365436f7265436f6f7264696e6174653a2074737472202e7265676578702022283f73292e2b222c0a290a0a7461726765742d69722d6f7264657265642d636c6f736564203d207b0a20206b696e643a20226f72646572656454617267657449724172746966616374222c0a20207461726765742d69722d6f7264657265642d636f6d6d6f6e2c0a202073656d616e746963436c6f737572653a207461726765742d69722d73656d616e7469632d636c6f737572652c0a2020696e74656e74733a207b202a2074737472203d3e207461726765742d69722d6f7264657265642d696e74656e74207d2c0a7d0a0a7461726765742d69722d6f7264657265642d6c6567616379203d207b0a20206b696e643a20226f72646572656454617267657449724172746966616374222c0a20207461726765742d69722d6f7264657265642d636f6d6d6f6e2c0a2020696e74656e74733a207b202a2074737472203d3e207461726765742d69722d6f7264657265642d6c65676163792d696e74656e74207d2c0a7d0a0a7461726765742d69722d6f7264657265642d696e74656e74203d207b0a20207461726765742d69722d696e74656e742d636f6d6d6f6e2c0a20203f2062617369733a20636f72652d657870722c0a20203f207075726542696e64696e67733a205b312a207461726765742d69722d707572652d62696e64696e675d2c0a2020657865637574696f6e4f726465723a205b2a2074737472202e7265676578702022283f73292e2b225d2c0a7d0a0a7461726765742d69722d6f7264657265642d6c65676163792d696e74656e74203d207b0a20207461726765742d69722d696e74656e742d636f6d6d6f6e2c0a2020657865637574696f6e4f726465723a205b2a2074737472202e7265676578702022283f73292e2b225d2c0a7d0a0a7461726765742d69722d636c6f7365642d6172746966616374203d207b0a20206b696e643a202274617267657449724172746966616374222c0a20207461726765742d69722d61727469666163742d636f6d6d6f6e2c0a202073656d616e746963436c6f737572653a207461726765742d69722d73656d616e7469632d636c6f737572652c0a2020696e74656e74733a207b202a2074737472203d3e207461726765742d69722d696e74656e74207d2c0a7d0a0a7461726765742d69722d6c65676163792d6172746966616374203d207b0a20206b696e643a202274617267657449724172746966616374222c0a20207461726765742d69722d61727469666163742d636f6d6d6f6e2c0a2020696e74656e74733a207b202a2074737472203d3e207461726765742d69722d6c65676163792d696e74656e74207d2c0a7d0a0a7461726765742d69722d73656d616e7469632d636c6f73757265203d207b0a2020736f75726365436f72653a207461726765742d69722d7265736f757263652d7265662c0a20206c61777061636b733a205b2a207461726765742d69722d7265736f757263652d7265665d2c0a20203f206361706162696c69746965733a205b2a207461726765742d69722d7265736f757263652d7265665d2c0a7d0a0a7461726765742d69722d696e74656e74203d207b0a20207461726765742d69722d696e74656e742d636f6d6d6f6e2c0a20203f2062617369733a20636f72652d657870722c0a20203f207075726542696e64696e67733a205b312a207461726765742d69722d707572652d62696e64696e675d2c0a20203f2065787465726e616c416374696f6e52657175657374733a205b2a207461726765742d69722d65787465726e616c2d616374696f6e2d726571756573745d2c0a7d0a0a7461726765742d69722d6c65676163792d696e74656e74203d207b0a20207461726765742d69722d696e74656e742d636f6d6d6f6e2c0a7d0a0a7461726765742d69722d696e74656e742d636f6d6d6f6e203d20280a20206f7065726174696f6e50726f66696c653a20747374722c0a2020696e707574436f6e73747261696e74733a205b2a20696e7075742d636f6e73747261696e745d2c0a2020636f72654576616c756174696f6e4275646765743a20636f72652d6275646765742c0a2020726571756972656d656e74733a205b2a207461726765742d69722d726571756972656d656e745d2c0a202073746570733a205b2a207461726765742d69722d737465705d2c0a2020726573756c743a20636f72652d657870722c0a290a0a7461726765742d69722d726571756972656d656e74203d207b0a202069643a20747374722c0a20207072656469636174653a20636f72652d7072656469636174652c0a20206f6e4661696c7572653a20726571756972652d6661696c7572652d61726d2c0a7d0a0a7461726765742d69722d707572652d62696e64696e67203d207b0a202069643a2074737472202e7265676578702022283f73292e2b222c0a202062696e64696e673a206c6f63616c2d7265662c0a202076616c75653a20636f72652d657870722c0a7d0a0a7461726765742d69722d73746570203d207b0a202069643a20747374722c0a202062696e64696e673a206c6f63616c2d7265662c0a20206566666563743a20747374722c0a2020746172676574496e7472696e7369633a20747374722c0a2020696e7075743a20636f72652d657870722c0a20206f62737472756374696f6e4661696c757265733a205b2a206661696c7572652d6964656e745d2c0a20206f62737472756374696f6e41726d733a207b202a206661696c7572652d6964656e74203d3e206f62737472756374696f6e2d61726d207d2c0a7d0a0a7461726765742d69722d65787465726e616c2d616374696f6e2d72657175657374203d207b0a202069643a20747374722c0a202062696e64696e673a206c6f63616c2d7265662c0a20206f7065726174696f6e3a207461726765742d69722d7265736f757263652d7265662c0a2020696e707574547970653a20636f72652d747970652d7265662c0a2020736574746c656d656e74547970653a20636f72652d747970652d7265662c0a2020696e707574536368656d613a207461726765742d69722d7265736f757263652d7265662c0a2020736574746c656d656e74536368656d613a207461726765742d69722d7265736f757263652d7265662c0a2020696e7075743a20636f72652d657870722c0a2020617574686f7269747953636f70653a20636f72652d657870722c0a202062617369733a20636f72652d657870722c0a20206275646765743a2065787465726e616c2d616374696f6e2d6275646765742c0a20207265636f6e63696c696174696f6e4c61773a207461726765742d69722d7265736f757263652d7265662c0a202073746174653a20226177616974696e67536574746c656d656e74222c0a2020736574746c656d656e7441646d697373696f6e3a2022736368656d615265717569726564222c0a7d0a", + "rawSha256": "e484eabd615584a38cb57454b52747786f2314c135c13f99da6f6bae619a709f" + }, + "contracts": [ + {"contract": "authority-facts", "rootRule": "authority-facts"}, + {"contract": "core-module", "rootRule": "core-module"}, + {"contract": "lawpack-adapter", "rootRule": "lawpack-adapter"}, + {"contract": "lawpack-exports", "rootRule": "lawpack-exports"}, + {"contract": "lawpack-manifest", "rootRule": "lawpack-manifest"}, + {"contract": "lowering-requirements", "rootRule": "lowering-requirements"}, + {"contract": "result-projection", "rootRule": "result-projection"}, + {"contract": "target-ir-artifact", "rootRule": "target-ir-artifact"}, + {"contract": "target-profile-intrinsics", "rootRule": "intrinsics-document"}, + {"contract": "target-profile-manifest", "rootRule": "target-profile-manifest"}, + {"contract": "target-profile-operation-profiles", "rootRule": "operation-profiles-document"} + ], + "domains": [ + {"domain": "edict.authority-facts/v1", "rootRule": "authority-facts"}, + {"domain": "edict.core.module/v1", "rootRule": "core-module"}, + {"domain": "edict.lawpack/v1", "rootRule": "lawpack-manifest"}, + {"domain": "edict.lowering-requirements/v1", "rootRule": "lowering-requirements"}, + {"domain": "edict.result-projection.artifact/v1", "rootRule": "result-projection"}, + {"domain": "edict.target-ir.artifact/v1", "rootRule": "target-ir-artifact"}, + {"domain": "edict.target-profile/v1", "rootRule": "target-profile-manifest"} + ], + "resources": [ + { + "coordinate": "edict.canonical-cbor/v1", + "canonicalBytesHex": "a368636f6e7472616374a96a76616c75654d6f64656c8765617272617964626f6f6c65627974657367696e7465676572636d6170646e756c6c64746578746b6469676573744672616d656f65646963742e6469676573742f76316b6d61704f72646572696e67781b63616e6f6e6963616c2d656e636f6465642d6b65792d62797465736c74657874456e636f64696e67657574662d386d747261696c696e6742797465736672656a6563746f696e7465676572456e636f64696e676873686f727465737470636f6e7461696e65724c656e6774687368646566696e697465706475706c69636174654d61704b6579736672656a656374736d6178696d756d4e657374696e67446570746818806a61706956657273696f6e782965646963742e7461726765742d70726f66696c652e636f6e74726163742d7265736f757263652f76316a636f6f7264696e6174657765646963742e63616e6f6e6963616c2d63626f722f7631", + "rawSha256": "8306e4f08c1e4e7d29ab22bcf55c324312712aac3eeeb675857ced57c3e48bdc", + "domainFramedDigest": "sha256:d1ea6d3de2a9762a438cbf4fac1d5ae2f357a4b27d13e0347e94ea655bf40f9d", + "provenance": { + "repository": "https://github.com/flyingrobots/edict", + "sourcePath": "fixtures/target-profile/contract-resources/canonical-cbor.cbor" + } + }, + { + "coordinate": "edict.determinism/v1", + "canonicalBytesHex": "a368636f6e7472616374aa6c616d6269656e74436c6f636bf46e616d6269656e744e6574776f726bf46e6f75747075744964656e74697479781e686f73742d636f6d70757465642d61667465722d76616c69646174696f6e6e72656769737472794c6f6f6b7570f471616d6269656e7446696c6573797374656df471616d6269656e7452616e646f6d6e657373f472616d6269656e74456e7669726f6e6d656e74f4756d757461626c654e616d655265736f6c7574696f6ef477667265736853746f7265506572496e766f636174696f6ef5782263616e6f6e6963616c526573756c74496e646570656e64656e744f664c696d697473f56a61706956657273696f6e782965646963742e7461726765742d70726f66696c652e636f6e74726163742d7265736f757263652f76316a636f6f7264696e6174657465646963742e64657465726d696e69736d2f7631", + "rawSha256": "84073f5c1734b625e16799048e28458d43e0a10befdae56a79d906f5e37ef76a", + "domainFramedDigest": "sha256:af4e6c774d5ea82db30e680be2ba7abc5ba04c6aead146139de32d8c5bb4981e", + "provenance": { + "repository": "https://github.com/flyingrobots/edict", + "sourcePath": "fixtures/target-profile/contract-resources/determinism.cbor" + } + }, + { + "coordinate": "edict.diagnostics/v1", + "canonicalBytesHex": "a368636f6e7472616374a7666669656c64738464636f6465687365766572697479676d65737361676566726570616972686f72646572696e67781c636f64652d73657665726974792d6d6573736167652d726570616972697265636f7264416269782f65646963743a7461726765742d70726f76696465722f70726f746f636f6c40312e302e3023646961676e6f737469636a7472756e636174696f6e69666f7262696464656e6d73657665726974794f7264657283656572726f72677761726e696e6764696e666f6e6c697374436f756e74426f756e64f57261676772656761746542797465426f756e64f56a61706956657273696f6e782965646963742e7461726765742d70726f66696c652e636f6e74726163742d7265736f757263652f76316a636f6f7264696e6174657465646963742e646961676e6f73746963732f7631", + "rawSha256": "e465a28f1170fe478db5ff65d96a1fdbfbbcb95d327e6965021c252437991e4b", + "domainFramedDigest": "sha256:28fd72a98223153982ca084c29dbb1b2d430623967ab3b6db9d7fee668e614b9", + "provenance": { + "repository": "https://github.com/flyingrobots/edict", + "sourcePath": "fixtures/target-profile/contract-resources/diagnostics.cbor" + } + }, + { + "coordinate": "edict.fuel/v1", + "canonicalBytesHex": "a368636f6e7472616374a6687265717569726564f56a6163636f756e74696e67781864657465726d696e69737469632d67756573742d776f726b6a627564676574556e6974646675656c6a65786861757374696f6e72686f73742d6f776e65642d6661696c7572656d706572496e766f636174696f6ef57165706f6368496e74657272757074696f6e736e6f742d612d7265706c61792d6275646765746a61706956657273696f6e782965646963742e7461726765742d70726f66696c652e636f6e74726163742d7265736f757263652f76316a636f6f7264696e6174656d65646963742e6675656c2f7631", + "rawSha256": "c712c2d831cc8e731bdc1dfb8ea536f4630f38f0b0e0c6448b2df57176d3d0bd", + "domainFramedDigest": "sha256:006c6ebc01a3c5d36d50bd390b69d47e42378be61074e3b5c96ecb9f5ee53207", + "provenance": { + "repository": "https://github.com/flyingrobots/edict", + "sourcePath": "fixtures/target-profile/contract-resources/fuel.cbor" + } + }, + { + "coordinate": "edict.wasm-component/v1", + "canonicalBytesHex": "a368636f6e7472616374a7647761736969666f7262696464656e6e70726f746f636f6c496d706f727469747970652d6f6e6c796f63616c6c61626c65496d706f72747369666f7262696464656e70636f6e74726163744964656e746974796565786163747070726f7669646572436f6e7472616374781b65646963743a7461726765742d70726f766964657240312e302e3077667265736853746f7265506572496e766f636174696f6ef5781b636f6d706f6e656e74446967657374566572696669636174696f6e6d6265666f72652d6465636f64656a61706956657273696f6e782965646963742e7461726765742d70726f66696c652e636f6e74726163742d7265736f757263652f76316a636f6f7264696e6174657765646963742e7761736d2d636f6d706f6e656e742f7631", + "rawSha256": "cd09d702db1d10be825e72effe35627bec56963cb3d78601b69478c58787e34d", + "domainFramedDigest": "sha256:095b4dd18f1a6a7276533f758665be319c5f476e7bdc70cc56d30b6b3e9f0a80", + "provenance": { + "repository": "https://github.com/flyingrobots/edict", + "sourcePath": "fixtures/target-profile/contract-resources/wasm-component.cbor" + } + } + ] +} diff --git a/schemas/edict-provider/generated/v1/evidence/provenance.provider-generation.json b/schemas/edict-provider/generated/v1/evidence/provenance.provider-generation.json index 83cdbd543..2a01bb289 100644 --- a/schemas/edict-provider/generated/v1/evidence/provenance.provider-generation.json +++ b/schemas/edict-provider/generated/v1/evidence/provenance.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file diff --git a/schemas/edict-provider/generated/v1/evidence/review.provider-generation.json b/schemas/edict-provider/generated/v1/evidence/review.provider-generation.json index 95605ec67..b960179af 100644 --- a/schemas/edict-provider/generated/v1/evidence/review.provider-generation.json +++ b/schemas/edict-provider/generated/v1/evidence/review.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:cbaf79293ebb33cd8825847b4ba848c20c2dab9b4e6cf26931c3e830bf9e7ca1","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:9490680660ecb2ff932c5fbd650252a45252e7be0fffd7fda7b70f47c64b20d1","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file diff --git a/schemas/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json b/schemas/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json index 83cdbd543..2a01bb289 100644 --- a/schemas/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json +++ b/schemas/edict-provider/package/v1/generated/evidence/provenance.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-provenance-manifest/v1","contractVersions":{"generatorAbi":"wesley.extension-generator/v1","inputSchema":"wesley.extension-generation-input/v1","provenanceSchema":"wesley.generation-provenance-manifest/v1"},"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df","version":"0.1.0"},"settingsDigest":"sha256:0f708e76898de6fdb8186352e81d0f5c445adf94bb6c7de9204952d9fe913d4a","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file diff --git a/schemas/edict-provider/package/v1/generated/evidence/review.provider-generation.json b/schemas/edict-provider/package/v1/generated/evidence/review.provider-generation.json index 95605ec67..b960179af 100644 --- a/schemas/edict-provider/package/v1/generated/evidence/review.provider-generation.json +++ b/schemas/edict-provider/package/v1/generated/evidence/review.provider-generation.json @@ -1 +1 @@ -{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:cbaf79293ebb33cd8825847b4ba848c20c2dab9b4e6cf26931c3e830bf9e7ca1","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file +{"apiVersion":"wesley.generation-review/v1","authoritative":false,"emittedArtifacts":[{"coordinate":"echo.dpo-authority-facts@1","digest":"sha256:e2a6a539a7156296c18ff1bc02f80dcabf62b42bb4314d0737527869e43986d6"},{"coordinate":"echo.dpo-lawpack-authority-facts@1","digest":"sha256:ce1af559551f8b8242c4b290b620c5a28323b9e43f8bc6bb161a191001b6f4b9"},{"coordinate":"echo.dpo-lawpack@1","digest":"sha256:8c570362671a0b1cd1a992d8210e4a90ffd153ad06dcdf1e0cb36033cc971e2c"},{"coordinate":"echo.dpo.registration/v1","digest":"sha256:4ef3aaad0d2131ba7129a3e2ae178d10c44f7e9b062af2c1fe211de781462f34"},{"coordinate":"echo.dpo@1","digest":"sha256:1b105d1b1f6cdf5fecdef98b7adeb238525047d43581fe9fd8c44fd213e1788e"},{"coordinate":"echo.provider-artifacts.cddl@1","digest":"sha256:9078b84c47f2e5b722f8fea56cd0bca585cfd150c8114c22994b67cf19f6d9ab"}],"generationInputDigest":"sha256:0c07274803d465ec212c313f74dd46396851f43019fa0f97da9571a167c84587","generator":{"coordinate":"echo-wesley-gen.provider-artifact-generator@1","digest":"sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df","version":"0.1.0"},"projectionRoles":["authority-facts.echo-dpo","authority-facts.echo-lawpack","generated-artifact-profile.echo-dpo-registration","lawpack.echo-dpo","schema.echo-provider-artifacts","target-profile.echo-dpo"],"provenanceManifestDigest":"sha256:9490680660ecb2ff932c5fbd650252a45252e7be0fffd7fda7b70f47c64b20d1","sourceArtifacts":[{"coordinate":"echo.semantic-schema@1","digest":"sha256:322d9eb5eb8273108eaa602f2eb58ba591efcf829fecb10bb705717efae18852"},{"coordinate":"edict.provider-contract-pack.cddl@1","digest":"sha256:8d77c84ecbd7d7e38496479b2f8346c15504a56f076170d79c0eca2a57fdb3a5"},{"coordinate":"edict.provider-contract-pack.manifest@1","digest":"sha256:bc222c4a669b888a60df6f398412bae232967c11841b9a27c7ba6c18eb41e362"}]} \ No newline at end of file diff --git a/schemas/edict-provider/package/v1/provider-manifest.echo.json b/schemas/edict-provider/package/v1/provider-manifest.echo.json index ce5c8a3b3..bb3cbcad4 100644 --- a/schemas/edict-provider/package/v1/provider-manifest.echo.json +++ b/schemas/edict-provider/package/v1/provider-manifest.echo.json @@ -3,7 +3,7 @@ "providerAbi": "edict:target-provider@1.0.0", "provider": { "coordinate": "echo.edict-provider@1", - "digest": "sha256:0e58e22e034ce81ecbb57d085505ab314c769bcda24b2d06bfa77d9062729116" + "digest": "sha256:945376a32cb52425388cb7f5ca71ee6a8622a8448f40bb02cae7482834ca974c" }, "artifacts": [ { @@ -21,7 +21,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -40,7 +40,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -59,7 +59,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -78,7 +78,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -102,7 +102,7 @@ "artifactKind": "generationProvenance", "resource": { "coordinate": "echo.edict-provider-generation-provenance@1", - "digest": "sha256:399c917c5cc9e86854a96852bdce898ec79df7b1236a8edb13a13b1afa72b664" + "digest": "sha256:2b27a04863c3660e8ce716cabfd63fd047d3f75a884e28d4222de5564c254142" }, "source": { "kind": "generated", @@ -112,7 +112,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -121,7 +121,7 @@ "artifactKind": "reviewArtifact", "resource": { "coordinate": "echo.edict-provider-generation-review@1", - "digest": "sha256:8b7d9873deb7c517cb92a2dfc8256ff1395636eaeaaba308a9a6d3d0423913e7" + "digest": "sha256:8000857ec83afd059b0747376c01699b8c97052c84ff6a69d3e7eed407910a8a" }, "source": { "kind": "generated", @@ -131,7 +131,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -150,7 +150,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, @@ -169,7 +169,7 @@ }, "generator": { "coordinate": "echo-wesley-gen.provider-artifact-generator@1", - "digest": "sha256:dd2532814deb3022e05d020706bfc2ab9a56167cccc89ea2545b1cce78e69547" + "digest": "sha256:cb9c6569a8f3c0ed3a0bd500151a3673f7f03b6f9d06d3b7edf227760fa895df" } } }, diff --git a/scripts/consumer-witnesses/source-functions-publication.py b/scripts/consumer-witnesses/source-functions-publication.py new file mode 100644 index 000000000..2314fba74 --- /dev/null +++ b/scripts/consumer-witnesses/source-functions-publication.py @@ -0,0 +1,519 @@ +# SPDX-License-Identifier: Apache-2.0 +# © James Ross Ω FLYING•ROBOTS +"""Build authored source functions with Edict and explicitly selected providers. + +Run only in an admitted, resource-guarded reusable Docker worker. This witness +does not build compilers/components, synthesize IR, or execute Echo programs. +The paired runtime witness consumes its unchanged package/report bytes. + +The caller supplies a hash-pinned JSON --input-manifest whose fields are the +selected_inputs() result, in addition to the pinned compiler source snapshot. +The compiler binary hash identifies the executed binary; source-to-binary build +provenance belongs to the caller's guarded build receipt. This script does not +claim reproducible compilation from a source/binary hash pair alone. + +Eight sequential variants retain at most 64 MiB / 2048 filesystem entries here, +with 1 MiB per child-created file and 120 seconds per compiler invocation. +The shared runner must also enforce the aggregate project budget and host/VM +free-space floors, covering this work root, compiler caches and container layer. +On failure, compiler process groups are stopped and partial evidence is kept. +""" + +import argparse +import hashlib +import json +import os +from pathlib import Path +import re +import resource +import shutil +import signal +import stat +import subprocess +import time + + +MAX_INPUT_BYTES = 16 * 1024 * 1024 +MAX_INPUT_FILES = 256 +MAX_CHILD_FILE_BYTES = 1024 * 1024 +MAX_WORK_BYTES = 64 * 1024 * 1024 +MAX_WORK_ENTRIES = 2048 +BUILD_TIMEOUT_SECONDS = 120 +READ_OLD_STEPS = 1_048_576 +READ_HELPER_STEPS = 4_194_304 +READ_BUDGET = "jedit.text@1.replaceRangeBudget" +OUTPUTS = {"executable-operation-package.cbor", "verification-report.cbor"} +PURE_COORDINATE = "jedit.text.replace_range@1" +RENAMED_COORDINATE = "consumer.fragment_assembly@1" +PURE_HELPERS = """fn assembleFragments(left: Bytes, right: Bytes) -> Bytes { + let bytes = joinFragments(left, right); + return bytes; +} + +fn joinFragments(left: Bytes, right: Bytes) -> Bytes { + let bytes = left + right; + return bytes; +} + +""" +READ_HELPER = """fn retainBytes(value: text.FactBytes) -> text.FactBytes { + let bytes = value; + return bytes; +} + +""" + + +def regular_file(path, maximum=MAX_INPUT_BYTES): + if path.is_symlink() or not path.is_file() or path.stat().st_size > maximum: + raise RuntimeError(f"Expected a bounded regular file: {path}") + return path + + +def sha256(path): + digest = hashlib.sha256() + with regular_file(path, maximum=256 * 1024 * 1024).open("rb") as stream: + for block in iter(lambda: stream.read(1024 * 1024), b""): + digest.update(block) + return digest.hexdigest() + + +def inventory(root): + """Bound selected trees before copying; reject links and non-file leaves.""" + if root.is_symlink() or not root.is_dir(): + raise RuntimeError(f"Expected a regular directory: {root}") + result, size = {}, 0 + for path in root.rglob("*"): + if path.is_symlink(): + raise RuntimeError(f"Selected tree contains a symlink: {path}") + if path.is_dir(): + continue + if not path.is_file(): + raise RuntimeError(f"Selected tree contains a special file: {path}") + size += path.stat().st_size + if size > MAX_INPUT_BYTES or len(result) >= MAX_INPUT_FILES: + raise RuntimeError(f"Selected tree exceeds witness bounds: {root}") + result[str(path.relative_to(root))] = sha256(path) + return dict(sorted(result.items())) + + +def verify_compiler(args): + manifest = json.loads(regular_file(args.compiler_manifest).read_text()) + if not manifest.get("files") or len(manifest["files"]) > 16384: + raise RuntimeError("Expected a bounded, nonempty compiler source snapshot") + if manifest["head"] != args.compiler_revision: + raise RuntimeError("Compiler source revision differs from explicit selection") + for name, expected in manifest["files"].items(): + relative = Path(name) + if relative.is_absolute() or ".." in relative.parts: + raise RuntimeError("Unsafe compiler snapshot path") + path = args.compiler_source / relative + if not path.resolve(strict=True).is_relative_to(args.compiler_source): + raise RuntimeError("Compiler source escaped its explicit root") + if sha256(path) != expected: + raise RuntimeError(f"Compiler source changed: {name}") + + +def selected_inputs(args): + return { + "compilerBinarySha256": sha256(args.compiler), + "compilerManifestSha256": sha256(args.compiler_manifest), + "pureApplicationSha256": sha256(args.pure_application_source / "edict.application.json"), + "pureSourceSha256": sha256(args.pure_source), + "pureCasesSha256": sha256(args.pure_cases), + "pureVendor": inventory(args.pure_application_source / "vendor"), + "readApplicationSha256": sha256(args.read_application_source / "edict.application.json"), + "readLawpackSha256": sha256(args.read_application_source / "edict.lawpack.json"), + "readSourceSha256": sha256(args.read_source), + "oldProvider": inventory(args.old_provider), + "provider": inventory(args.provider), + } + + +def replace_once(source, old, new): + if source.count(old) != 1: + raise RuntimeError(f"Expected one source anchor: {old!r}") + return source.replace(old, new, 1) + + +def source_variants(args): + baseline = regular_file(args.pure_source).read_text() + pure = replace_once(baseline, "intent assembleRange(", PURE_HELPERS + "intent assembleRange(") + pure = replace_once(pure, + "let bytes = input.firstFragment + input.secondFragment;", + "let bytes = assembleFragments(input.firstFragment, input.secondFragment);") + renamed = replace_once(pure, f"package {PURE_COORDINATE};", + f"package {RENAMED_COORDINATE};") + renamed = replace_once(renamed, "intent assembleRange(", "intent combineFragments(") + for old, new in (("assembleFragments", "composePieces"), ("joinFragments", "appendPieces")): + if renamed.count(old) != 2: + raise RuntimeError(f"Expected one definition and call for {old}") + renamed = renamed.replace(old, new) + changed = replace_once(pure, "let bytes = left + right;", "let bytes = right + left;") + read = regular_file(args.read_source).read_text() + read = replace_once(read, "intent replaceRange(", READ_HELPER + "intent replaceRange(") + read = replace_once(read, " return actual;", + " let retained = retainBytes(actual);\n return retained;") + return {"function-free": baseline, "pure": pure, "renamed-pure": renamed, + "changed-body": changed, "read": read} + + +def child_limits(): + # This caps every child-created file, including artifacts and both streams. + resource.setrlimit(resource.RLIMIT_FSIZE, (MAX_CHILD_FILE_BYTES, MAX_CHILD_FILE_BYTES)) + resource.setrlimit(resource.RLIMIT_CORE, (0, 0)) + + +def stop_group(child): + try: + os.killpg(child.pid, signal.SIGTERM) + except ProcessLookupError: + return + try: + child.wait(timeout=5) + except subprocess.TimeoutExpired: + pass + try: + os.killpg(child.pid, signal.SIGKILL) + except ProcessLookupError: + pass + child.wait() + + +def check_work_bound(root): + """Supplement the shared guard with a live bound on this witness's outputs.""" + total, entries = 0, 0 + for path in root.rglob("*"): + entries += 1 + if entries > MAX_WORK_ENTRIES: + raise RuntimeError("Witness output count exceeded") + try: + metadata = path.lstat() + except FileNotFoundError: + # Atomic compiler publication can remove a temporary regular file. + continue + if stat.S_ISDIR(metadata.st_mode): + continue + if not stat.S_ISREG(metadata.st_mode): + raise RuntimeError(f"Witness output is not a regular file: {path}") + total += metadata.st_size + if total > MAX_WORK_BYTES: + raise RuntimeError("Witness outputs exceed the 64 MiB local ceiling") + return {"bytes": total, "entries": entries} + + +def compiler_build(args, root, document, label): + request = {"schema": "edict.compiler.settings/v1", "type": "compilerSettings", + "operation": "build", document: f"edict.{document}.json"} + logs = root / "logs" + logs.mkdir(exist_ok=True) + temporary = root / "temporary" + temporary.mkdir(exist_ok=True) + environment = dict(os.environ, TMPDIR=str(temporary), TMP=str(temporary), + TEMP=str(temporary), XDG_CACHE_HOME=str(temporary / "cache")) + streams = [logs / f"{label}.stdout.jsonl", logs / f"{label}.stderr.jsonl"] + check_work_bound(args.work_root) + with streams[0].open("xb") as stdout, streams[1].open("xb") as stderr: + child = subprocess.Popen([str(args.compiler)], cwd=root, stdin=subprocess.PIPE, + stdout=stdout, stderr=stderr, start_new_session=True, + env=environment, preexec_fn=child_limits) + deadline = time.monotonic() + BUILD_TIMEOUT_SECONDS + payload = (json.dumps(request) + "\n").encode() + try: + while True: + try: + child.communicate(payload, timeout=0.25) + break + except subprocess.TimeoutExpired: + payload = None + check_work_bound(args.work_root) + if time.monotonic() >= deadline: + raise RuntimeError(f"Compiler exceeded {BUILD_TIMEOUT_SECONDS}s; " + f"partial streams retained at {logs}") + finally: + # Kill descendants even after their direct parent exits successfully. + stop_group(child) + check_work_bound(args.work_root) + events = [] + for path in streams: + regular_file(path, MAX_CHILD_FILE_BYTES) + for line in path.read_text().splitlines(): + event = json.loads(line) + if not isinstance(event, dict): + raise RuntimeError(f"Non-object compiler event retained in {path}") + events.append(event) + statuses = [event for event in events if event.get("type") == "status"] + if len(statuses) != 1 or statuses[0].get("exitCode") != child.returncode: + raise RuntimeError(f"Compiler status disagrees with exit {child.returncode}: {streams}") + output = root / "application-output" + return {"exitCode": child.returncode, + "diagnostics": [event for event in events if event.get("type") == "diagnostic"], + "artifacts": inventory(output) if output.exists() else {}, + "stdoutSha256": sha256(streams[0]), "stderrSha256": sha256(streams[1])} + + +def require_success(result, application=True): + if result["exitCode"] != 0 or result["diagnostics"]: + raise RuntimeError(f"Public compiler refused the authored program: {result}") + if application and set(result["artifacts"]) != OUTPUTS: + raise RuntimeError(f"Compiler did not emit exactly one package/report pair: {result}") + + +def require_old_refusal(result): + diagnostics = result["diagnostics"] + if (result["exitCode"] != 2 or result["artifacts"] or len(diagnostics) != 1 + or diagnostics[0].get("kind") != "InvalidProviderInvocation" + or "ArtifactSchemaMismatch" not in diagnostics[0].get("message", "") + or "core.artifact" not in diagnostics[0].get("message", "")): + raise RuntimeError(f"Old provider did not explicitly refuse source Core: {result}") + + +def require_budget_refusal(result): + diagnostics = result["diagnostics"] + if result["exitCode"] != 2 or result["artifacts"] or len(diagnostics) != 1: + raise RuntimeError(f"Original budget did not produce one explicit refusal: {result}") + diagnostic = diagnostics[0] + message = diagnostic.get("message", "") + boundaries = { + "ApplicationCompilationFailed": ("InvalidBound", "pure-helper cost", + "exceeds operation budget"), + "ProviderLowererRefused": ("UnsupportedSemantics", "core.source-functions"), + } + required = boundaries.get(diagnostic.get("kind")) + if required is None or any(detail not in message for detail in required): + raise RuntimeError(f"Unexpected original-budget refusal: {result}") + return diagnostic["kind"] + + +def relative_path(text): + path = Path(text) + if not text or path.is_absolute() or ".." in path.parts or path == Path("."): + raise RuntimeError(f"Expected a contained relative authored path: {text}") + return path + + +def prepare_application(args, root, source, *, read=False, renamed=False, read_steps=None): + root.mkdir() + original = args.read_application_source if read else args.pure_application_source + original_application = regular_file(original / "edict.application.json") + shutil.copyfile(original_application, root / "upstream-application.json") + application = json.loads(original_application.read_text()) + application["sources"] = ["source.edict"] + application["target"]["providerPackage"] = "provider" + application["outputDirectory"] = "application-output" + for bundle in application["lawpacks"]: + for value in bundle.values(): + if relative_path(value).parts[0] != "vendor": + raise RuntimeError("Selected lawpack inputs must remain in vendor/") + if renamed: + if application["coordinate"] != PURE_COORDINATE: + raise RuntimeError("Unexpected original application coordinate") + application["coordinate"] = RENAMED_COORDINATE + (root / "edict.application.json").write_text(json.dumps(application, indent=2) + "\n") + (root / "source.edict").write_text(source) + shutil.copyfile(args.read_source if read else args.pure_source, + root / "upstream-source.edict") + if not read: + shutil.copytree(original / "vendor", root / "vendor") + if root.name in {"pure", "renamed-pure"}: + shutil.copyfile(args.pure_cases, root / "cases.json") + return None + original_lawpack = regular_file(original / "edict.lawpack.json") + shutil.copyfile(original_lawpack, root / "upstream-lawpack.json") + lawpack = json.loads(original_lawpack.read_text()) + if lawpack["dependencyBundles"]: + raise RuntimeError("The read seed must have no external dependency bundles") + output = relative_path(lawpack["outputDirectory"]) + if output != Path("vendor/atom-read"): + raise RuntimeError("Expected the explicit node-atom-read output directory") + authored = lawpack["lawpack"] + if len(authored["targetAdapters"]) != 1: + raise RuntimeError("Expected exactly one authored read adapter") + adapter = authored["targetAdapters"][0] + if adapter["coordinate"] != "jedit.text.echo-adapter/v1": + raise RuntimeError("Unexpected read adapter coordinate") + budget = adapter["budgets"][READ_BUDGET] + if budget != {"maxSteps": READ_OLD_STEPS, "maxAllocatedBytes": 16_777_216, + "maxOutputBytes": 8_388_608}: + raise RuntimeError("Original read budget differs from the explicit seed") + configs = [item for item in authored["localResources"] if item["name"] == "echo-config"] + if (len(configs) != 1 or configs[0]["value"]["programKind"] + != "compiler-produced-bounded-read/v1"): + raise RuntimeError("Read seed must already select the bounded-read profile") + for item in [adapter, *authored["localResources"]]: + relative_path(item["output"]) + if read_steps not in {READ_OLD_STEPS, READ_HELPER_STEPS}: + raise RuntimeError("Unexpected authored budget variant") + budget["maxSteps"] = read_steps + definition = root / "edict.lawpack.json" + if read_steps == READ_OLD_STEPS: + shutil.copyfile(original_lawpack, definition) + else: + definition.write_text(json.dumps(lawpack, indent=2) + "\n") + result = compiler_build(args, root, "lawpack", "lawpack") + require_success(result, application=False) + new_digest = regular_file(root / output / "manifest.sha256").read_text().strip() + if not re.fullmatch(r"sha256:[0-9a-f]{64}", new_digest): + raise RuntimeError("Public lawpack build emitted an invalid manifest digest") + pattern = r'(use lawpack jedit\.text@1 digest ")[^"\n]+(" as text;)' + updated, count = re.subn(pattern, lambda match: match[1] + new_digest + match[2], source) + if count != 1: + raise RuntimeError("Expected exactly one explicit authored lawpack import") + (root / "source.edict").write_text(updated) + return {"build": result, "manifestDigest": new_digest, + "outputs": inventory(root / output), + "upstreamLawpackSha256": sha256(root / "upstream-lawpack.json"), + "authoredLawpackSha256": sha256(definition), + "authoredChanges": [] if read_steps == READ_OLD_STEPS else [{ + "path": f"/lawpack/targetAdapters/0/budgets/{READ_BUDGET}/maxSteps", + "before": READ_OLD_STEPS, "after": read_steps}], + "authoredBeforeImportSha256": hashlib.sha256(source.encode()).hexdigest(), + "authoredAfterImportSha256": sha256(root / "source.edict")} + + +def run_variant(args, name, source, provider, *, refusal=None, read=False, + renamed=False, read_steps=None): + root = args.work_root / name + lawpack = prepare_application(args, root, source, read=read, renamed=renamed, + read_steps=read_steps) + shutil.copytree(provider, root / "provider") + authored_hash = sha256(root / "source.edict") + result = compiler_build(args, root, "application", "first") + provenance = {"kind": "public-compiler-output", "compilerRevision": args.compiler_revision, + "compilerBinarySha256": sha256(args.compiler), + "compilerManifestSha256": sha256(args.compiler_manifest), + "providerManifestSha256": sha256(provider / "provider-manifest.echo.json"), + "inputManifestSha256": args.input_manifest_sha256, + "applicationSha256": sha256(root / "edict.application.json"), + "upstreamApplicationSha256": sha256(root / "upstream-application.json"), + "sourceSha256": authored_hash, "firstBuild": result, + "upstreamSourceSha256": sha256(root / "upstream-source.edict"), + "authoredTransformation": name, + "casesSha256": sha256(root / "cases.json") if (root / "cases.json").exists() else None, + "lawpack": lawpack} + (root / "provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") + if refusal == "old-publication": + require_old_refusal(result) + provenance["refusalBoundary"] = "InvalidProviderInvocation" + elif refusal == "original-budget": + provenance["refusalBoundary"] = require_budget_refusal(result) + else: + require_success(result) + repeated = compiler_build(args, root, "application", "repeated") + provenance["repeatedBuild"] = repeated + (root / "provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") + require_success(repeated) + if result["artifacts"] != repeated["artifacts"]: + raise RuntimeError(f"Repeated public build changed exact output bytes: {name}") + for filename in sorted(OUTPUTS): + original = root / "application-output" / filename + if original.stat().st_size == 0: + raise RuntimeError("Compiler emitted an empty artifact") + shutil.copyfile(original, root / filename) + if sha256(root / filename) != result["artifacts"][filename]: + raise RuntimeError("Retained compiler output bytes changed during copy") + (root / "provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") + if sha256(root / "source.edict") != authored_hash: + raise RuntimeError("Public compilation changed authored source") + # All authoritative provider inputs are retained externally and rehashed. + # Recycle only this witness's disposable copy to keep peak storage bounded. + if inventory(root / "provider") != inventory(provider): + raise RuntimeError("Public compilation changed its provider copy") + shutil.rmtree(root / "provider") + check_work_bound(args.work_root) + print(json.dumps({"variant": name, **provenance}, sort_keys=True), flush=True) + return provenance + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + for name in ("compiler", "compiler-source", "compiler-manifest", "pure-application-source", + "pure-source", "pure-cases", "read-application-source", "read-source", + "old-provider", "provider", "data-root", "work-root", "input-manifest"): + parser.add_argument("--" + name, type=Path, required=True) + for name in ("compiler-revision", "old-provider-manifest-sha256", "provider-manifest-sha256", + "input-manifest-sha256"): + parser.add_argument("--" + name, required=True) + args = parser.parse_args() + if not Path("/.dockerenv").is_file(): + raise RuntimeError("This witness requires the shared guarded Docker worker") + if args.work_root.exists() or not args.work_root.resolve().is_relative_to(args.data_root.resolve()): + raise RuntimeError("Use a new work directory inside the guarded data root") + for name, value in vars(args).items(): + if isinstance(value, Path): + if value.is_symlink(): + raise RuntimeError(f"Explicit input may not be a symlink: {value}") + setattr(args, name, value.resolve(strict=name != "work_root")) + if sha256(args.input_manifest) != args.input_manifest_sha256: + raise RuntimeError("Input manifest differs from explicit selection") + expected_inputs = json.loads(regular_file(args.input_manifest).read_text()) + for name, value in vars(args).items(): + if isinstance(value, Path) and name not in {"data_root", "work_root"}: + if value == args.work_root or value.is_relative_to(args.work_root): + raise RuntimeError("Authoritative inputs must remain outside the output root") + verify_compiler(args) + for root, expected in [(args.old_provider, args.old_provider_manifest_sha256), + (args.provider, args.provider_manifest_sha256)]: + if sha256(root / "provider-manifest.echo.json") != expected: + raise RuntimeError("Provider manifest differs from explicit selection") + original = selected_inputs(args) + if original != expected_inputs: + raise RuntimeError("Compiler/source/provider inputs differ from the selected manifest") + cases = json.loads(regular_file(args.pure_cases).read_text()) + if len(cases["cases"]) != 12: + raise RuntimeError("Expected the original twelve literal assembly cases") + variants = source_variants(args) + args.work_root.mkdir() + evidence = {"selectedInputs": original, "inputManifestSha256": args.input_manifest_sha256, + "limits": {"workBytes": MAX_WORK_BYTES, "workEntries": MAX_WORK_ENTRIES, + "childFileBytes": MAX_CHILD_FILE_BYTES, + "buildTimeoutSeconds": BUILD_TIMEOUT_SECONDS}, "results": {}} + shutil.copyfile(args.input_manifest, args.work_root / "selected-inputs.json") + try: + specs = [ + ("function-free-old", variants["function-free"], args.old_provider, {}), + ("source-function-old", variants["pure"], args.old_provider, {"refusal": "old-publication"}), + ("function-free-new", variants["function-free"], args.provider, {}), + ("pure", variants["pure"], args.provider, {}), + ("renamed-pure", variants["renamed-pure"], args.provider, {"renamed": True}), + ("changed-body", variants["changed-body"], args.provider, {}), + ("read-original-budget", variants["read"], args.provider, + {"read": True, "read_steps": READ_OLD_STEPS, "refusal": "original-budget"}), + ("read", variants["read"], args.provider, + {"read": True, "read_steps": READ_HELPER_STEPS}), + ] + for name, source, provider, options in specs: + evidence["results"][name] = run_variant(args, name, source, provider, **options) + (args.work_root / "evidence.json").write_text(json.dumps(evidence, indent=2) + "\n") + pure = evidence["results"]["pure"]["firstBuild"]["artifacts"] + for name in ["renamed-pure", "changed-body"]: + other = evidence["results"][name]["firstBuild"]["artifacts"] + if any(pure[path] == other[path] for path in OUTPUTS): + raise RuntimeError(f"Changing {name} did not change package and report identity") + if (evidence["results"]["read-original-budget"]["lawpack"]["manifestDigest"] + == evidence["results"]["read"]["lawpack"]["manifestDigest"]): + raise RuntimeError("Authored budget change did not change lawpack authority") + if sha256(args.input_manifest) != args.input_manifest_sha256: + raise RuntimeError("Selected input manifest changed during the witness") + if selected_inputs(args) != original: + raise RuntimeError("An authoritative input changed during the witness") + verify_compiler(args) + evidence["finalUsage"] = check_work_bound(args.work_root) + evidence["outcome"] = "public-compiler-and-provider-verifier-accepted" + evidence["runtimeExecution"] = "not-run-by-this-witness" + (args.work_root / "evidence.json").write_text(json.dumps(evidence, indent=2) + "\n") + except BaseException as error: + evidence["failure"] = {"type": type(error).__name__, "message": str(error)} + (args.work_root / "evidence.json").write_text(json.dumps(evidence, indent=2) + "\n") + raise + print("SOURCE_FUNCTION_PUBLIC_COMPILER_AND_VERIFIER_ACCEPTED", flush=True) + + +def cancelled(signum, _frame): + # Convert the runner's cancellation into finally cleanup of the compiler group. + raise RuntimeError(f"Witness cancelled by signal {signum}") + + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, cancelled) + main() diff --git a/scripts/verify-local.sh b/scripts/verify-local.sh index 7c961d75d..39d650db6 100755 --- a/scripts/verify-local.sh +++ b/scripts/verify-local.sh @@ -1178,7 +1178,7 @@ pre_push_feature_string_for_test_target() { warp-core:parallel_parallel_exec) printf '%s\n' "delta_validate" ;; - warp-core:scheduler_fault_recovery_authority|warp-core:edict_pure_evaluation_tests|warp-core:edict_pure_unsigned_subtraction_tests|warp-core:edict_pure_byte_length_tests|warp-core:edict_byte_equality_tests|warp-core:edict_byte_slice_tests|warp-core:edict_node_read_tests|warp-core:edict_byte_concat_tests) + warp-core:scheduler_fault_recovery_authority|warp-core:edict_pure_evaluation_tests|warp-core:edict_pure_unsigned_subtraction_tests|warp-core:edict_pure_byte_length_tests|warp-core:edict_byte_equality_tests|warp-core:edict_byte_slice_tests|warp-core:edict_node_read_tests|warp-core:edict_byte_concat_tests|warp-core:edict_source_functions_tests) printf '%s\n' "trusted_runtime" ;; warp-math:determinism_policy_tests) @@ -1383,7 +1383,7 @@ prepare_warp_core_scope() { while IFS= read -r file; do [[ -z "$file" ]] && continue case "$file" in - crates/warp-core/src/edict_pure.rs|crates/warp-core/src/edict_pure/*.rs|crates/warp-core/tests/fixtures/edict-pure-jedit/*|crates/warp-core/tests/fixtures/edict-pure-subtraction/*|crates/warp-core/tests/fixtures/edict-pure-byte-length/*|crates/warp-core/tests/fixtures/edict-byte-equality/*|crates/warp-core/tests/fixtures/edict-byte-slice/*|crates/warp-core/src/edict_read.rs|crates/warp-core/src/edict_read/*.rs|crates/warp-core/tests/fixtures/edict-node-read/*|crates/warp-core/tests/fixtures/edict-byte-concat/*) + crates/warp-core/src/edict_pure.rs|crates/warp-core/src/edict_pure/*.rs|crates/warp-core/tests/fixtures/edict-pure-jedit/*|crates/warp-core/tests/fixtures/edict-pure-subtraction/*|crates/warp-core/tests/fixtures/edict-pure-byte-length/*|crates/warp-core/tests/fixtures/edict-byte-equality/*|crates/warp-core/tests/fixtures/edict-byte-slice/*|crates/warp-core/src/edict_read.rs|crates/warp-core/src/edict_read/*.rs|crates/warp-core/tests/fixtures/edict-node-read/*|crates/warp-core/tests/fixtures/edict-byte-concat/*|crates/warp-core/tests/fixtures/edict-source-functions/*) append_unique "edict_pure_evaluation_tests" FULL_SCOPE_WARP_CORE_EXTRA_TESTS append_unique "edict_pure_evaluation_tests" FULL_SCOPE_WARP_CORE_CLIPPY_TESTS append_unique "edict_pure_unsigned_subtraction_tests" FULL_SCOPE_WARP_CORE_EXTRA_TESTS @@ -1398,6 +1398,8 @@ prepare_warp_core_scope() { append_unique "edict_node_read_tests" FULL_SCOPE_WARP_CORE_CLIPPY_TESTS append_unique "edict_byte_concat_tests" FULL_SCOPE_WARP_CORE_EXTRA_TESTS append_unique "edict_byte_concat_tests" FULL_SCOPE_WARP_CORE_CLIPPY_TESTS + append_unique "edict_source_functions_tests" FULL_SCOPE_WARP_CORE_EXTRA_TESTS + append_unique "edict_source_functions_tests" FULL_SCOPE_WARP_CORE_CLIPPY_TESTS ;; crates/warp-core/tests/support/edict_byte_concat.rs) append_unique "edict_byte_concat_tests" FULL_SCOPE_WARP_CORE_EXTRA_TESTS From cc0b0626dc94f6a7599bed1b0bc84879ac944240 Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 5 Oct 2026 03:20:15 -0700 Subject: [PATCH 03/23] test: reject source functions colliding with imported effects --- .../tests/bounded_read/source_functions.rs | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) diff --git a/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs b/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs index 1064f2978..0c78bba1d 100644 --- a/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs +++ b/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs @@ -364,3 +364,168 @@ fn bounded_read_source_helper_refuses_the_original_insufficient_step_ceiling() { assert_ne!(field(&report, "outcome"), &text("accepted")); } } + + +fn rename_owned_coordinates(value: &mut Value, previous: &str, replacement: &str) { + match value { + Value::Text(name) => { + if name == previous { + *name = replacement.to_owned(); + } else if let Some(member) = name.strip_prefix(&format!("{previous}.")) { + *name = format!("{replacement}.{member}"); + } + } + Value::Array(values) => { + for value in values { + rename_owned_coordinates(value, previous, replacement); + } + } + Value::Map(entries) => { + for (key, value) in entries { + rename_owned_coordinates(key, previous, replacement); + rename_owned_coordinates(value, previous, replacement); + } + } + _ => {} + } +} + +// Only source-owned coordinates move. The actual imported read effect and its +// authenticated exports, adapter, lawpack and configuration stay byte-identical. +fn same_package_source_function(collision: bool) -> LoweringRequestV1 { + let mut source = read_helper(); + let exports = decode(&source.semantic_inputs[1].artifact.artifact.bytes).expect("exports"); + let Value::Array(effects) = field(&exports, "effects") else { + panic!("effects") + }; + let Value::Text(effect) = field(&effects[0], "coordinate") else { + panic!("effect coordinate") + }; + let (coordinate, effect_name) = effect.rsplit_once('.').expect("qualified read effect"); + assert_eq!(effect, "jedit.text@1.readFact"); + let previous = source.core.reference.coordinate.clone(); + let mut core = decode(&source.core.artifact.bytes).expect("core"); + let mut target = decode(&source.semantic_inputs[5].artifact.artifact.bytes).expect("target"); + let mut projection = + decode(&source.semantic_inputs[6].artifact.artifact.bytes).expect("projection"); + for value in [&mut core, &mut target, &mut projection] { + rename_owned_coordinates(value, &previous, coordinate); + } + // Core permits module-relative named-type table keys. Once the module is + // in the imported package, move those definitions to the relative spelling + // expected by this runtime aperture; keep their qualified references and + // exact definitions. Do not create duplicate aliases or fork the lawpack. + let Value::Map(types) = field_mut(&mut core, "types") else { + panic!("type inventory") + }; + let prefix = format!("{coordinate}."); + let mut names = std::collections::BTreeSet::new(); + for (key, definition) in types { + let Value::Text(name) = key else { + panic!("type name") + }; + if let Some(relative) = name.strip_prefix(&prefix) { + assert_ne!(field(definition, "kind"), &text("Nominal"), + "this fixture must not move a nominal authority definition"); + *name = relative.to_owned(); + } + assert!(names.insert(name.clone()), "type inventory remains unique"); + } + let unused_name = if collision { effect_name } else { "unusedRead" }; + let functions = field_mut(&mut core, "functions"); + let unused = field(functions, "retain").clone(); + insert(functions, unused_name, unused); + source.core = bound(coordinate, "edict.core.module/v1", encode(&core).expect("core bytes")); + *field_mut(field_mut(&mut target, "semanticClosure"), "sourceCore") = map([ + ("id", text(coordinate)), + ("digest", Value::Array(vec![text("sha256"), + Value::Bytes(source.core.reference.digest.bytes.clone())])), + ]); + let Value::Bytes(authored) = + decode(&source.semantic_inputs[3].artifact.artifact.bytes).expect("source") + else { + panic!("source bytes") + }; + let mut authored = String::from_utf8(authored).expect("UTF-8 source"); + let package_header = format!("package {previous};"); + assert_eq!(authored.matches(&package_header).count(), 1); + authored = authored.replace(&package_header, &format!("package {coordinate};")); + let helpers = format!( + "fn retain(value: text.FactBytes) -> text.FactBytes {{ let bytes = value; return bytes; }}\n\ + fn {unused_name}(value: text.FactBytes) -> text.FactBytes {{ let bytes = value; return bytes; }}\n" + ); + assert_eq!(authored.matches("intent replaceRange(").count(), 1); + authored = authored.replace("intent replaceRange(", &format!("{helpers}intent replaceRange(")); + assert_eq!(authored.matches(" return actual;").count(), 1); + authored = authored.replace(" return actual;", " let retained = retain(actual);\n return retained;"); + source.semantic_inputs[3].artifact = bound(coordinate, "edict.source/v1", + encode(&Value::Bytes(authored.into_bytes())).expect("source bytes")); + source.semantic_inputs[5].artifact = bound("echo.span-ir/v2", "edict.target-ir.artifact/v1", + encode(&target).expect("target bytes")); + source.semantic_inputs[6].artifact = bound(&format!("{coordinate}.replaceRange"), + "edict.result-projection.artifact/v1", encode(&projection).expect("projection bytes")); + source +} + +fn collision_verification() -> verifier::VerificationRequestV1 { + let positive = same_package_source_function(false); + let negative = same_package_source_function(true); + for index in [0, 1, 2, 4, 6] { + assert_eq!(positive.semantic_inputs[index].artifact, negative.semantic_inputs[index].artifact, + "changing an unused source name must preserve imported authority and result projection"); + } + // Only the disjoint control goes through the lowerer. The collision package + // is assembled independently, so a future lowerer refusal cannot mask a + // verifier that still accepts the same authenticated ownership ambiguity. + let mut verification = request(positive); + verification.core = transport(negative.core.clone()); + verification.target_ir = transport(negative.semantic_inputs[5].artifact.clone()); + verification.semantic_inputs.iter_mut().find(|input| input.role == "04-source") + .expect("source input").artifact = transport(negative.semantic_inputs[3].artifact.clone()); + change_package(&mut verification, |package| { + let closure = field_mut(package, "semantic_closure"); + for (key, artifact) in [ + ("canonical_meaning_identity", &negative.core), + ("core_identity", &negative.core), + ("target_ir_identity", &negative.semantic_inputs[5].artifact), + ("edict_source_identity", &negative.semantic_inputs[3].artifact), + ] { + *field_mut(closure, key) = Value::Bytes(artifact.reference.digest.bytes.clone()); + } + let Value::Bytes(raw) = field(package, "program") else { + panic!("program bytes") + }; + let mut program = decode(raw).expect("program"); + for (key, artifact) in [ + ("core_artifact", &negative.core), + ("target_ir_artifact", &negative.semantic_inputs[5].artifact), + ("source_artifact", &negative.semantic_inputs[3].artifact), + ] { + *field_mut(&mut program, key) = Value::Bytes(artifact.artifact.bytes.clone()); + } + *field_mut(package, "program") = Value::Bytes(encode(&program).expect("program bytes")); + }); + verification +} + +#[test] +fn bounded_read_disjoint_source_functions_share_the_imported_effect_package() { + let source = same_package_source_function(false); + lower(source.clone()).expect("same-package disjoint called and unused source functions lower"); + let verification = request(source); + let response = verifier::verify(verification).expect("same-package independent verification"); + let report = decode(&response.outputs[0].artifact.bytes).expect("report"); + assert_eq!(field(&report, "outcome"), &text("accepted")); +} + +#[test] +fn lowerer_source_function_names_cannot_shadow_imported_read_effects() { + let source = same_package_source_function(true); + let refusal = lower(source).expect_err("unused source function collides with imported read effect"); + assert_eq!(refusal.kind, echo_edict_provider_lowerer::ProviderRefusalKind::UnsupportedSemantics); +} + +#[test] +fn verifier_source_function_names_cannot_shadow_imported_read_effects() { + assert_rejected(collision_verification()); +} From afd37cc25144111c60b4b4e5833fa41f9716a664 Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 5 Oct 2026 03:25:48 -0700 Subject: [PATCH 04/23] test: challenge runtime effect and source function ownership --- .../tests/edict_source_functions_tests.rs | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) diff --git a/crates/warp-core/tests/edict_source_functions_tests.rs b/crates/warp-core/tests/edict_source_functions_tests.rs index e9f6f7970..999bdf731 100644 --- a/crates/warp-core/tests/edict_source_functions_tests.rs +++ b/crates/warp-core/tests/edict_source_functions_tests.rs @@ -902,3 +902,139 @@ fn source_functions_pure_basis_is_admitted_but_does_not_spend_execution_budget() } } } + +mod effect_name_collision { + use super::*; + use warp_core::edict_read::{evaluate as read, ReadBasis, ReadError, ReadLimits, ReadView}; + use warp_core::{ + make_node_id, make_type_id, AtomPayload, AttachmentValue, GraphStore, NodeKey, + NodeRecord, WorldlineFrontier, WorldlineId, WorldlineState, + }; + + fn rename(value: &mut Value, previous: &str, coordinate: &str) { + match value { + Value::Text(name) => { + if name.as_str() == previous { + *name = coordinate.to_owned(); + } else if let Some(member) = name.strip_prefix(&format!("{previous}.")) { + *name = format!("{coordinate}.{member}"); + } + } + Value::Array(values) => { + for value in values { + rename(value, previous, coordinate); + } + } + Value::Map(entries) => { + for (key, value) in entries { + rename(key, previous, coordinate); + rename(value, previous, coordinate); + } + } + _ => {} + } + } + + fn package(collision: bool) -> (Vec, [u8; 32]) { + let original = hex::decode( + include_str!("fixtures/edict-node-read/single-executable-operation-package.hex").trim(), + ).unwrap(); + let (raw, _) = rewrite(original, |program, core, target| { + let exports = embedded(program, "lawpack_exports_artifact"); + let Value::Array(effects) = field(&exports, "effects") else { panic!("effects") }; + assert_eq!(field(&effects[0], "coordinate"), &text("jedit.text@1.readFact")); + let Value::Text(previous) = field(core, "coordinate") else { panic!("coordinate") }; + let previous = previous.clone(); + let coordinate = "jedit.text@1"; + for value in [&mut *core, target] { + rename(value, &previous, coordinate); + } + // The admitted synthetic Core uses unique module-relative type keys; + // qualified type references and imported authority remain unchanged. + let Value::Map(types) = field_mut(core, "types") else { panic!("types") }; + let prefix = format!("{coordinate}."); + let mut names = std::collections::BTreeSet::new(); + for (key, definition) in types { + let Value::Text(name) = key else { panic!("type name") }; + if let Some(relative) = name.strip_prefix(&prefix) { + assert_ne!(field(definition, "kind"), &text("Nominal")); + *name = relative.to_owned(); + } + assert!(names.insert(name.clone())); + } + let name = if collision { "readFact" } else { "unusedRead" }; + let result = record([ + ("kind", text("const")), + ("value", record([ + ("kind", text("int")), + ("width", text("U64")), + ("value", Value::Integer(0)), + ])), + ]); + insert(core, "functions", record([( + name, function(vec![], "U64", vec![], vec![], result), + )])); + let mut projection = embedded(program, "result_projection_artifact"); + rename(&mut projection, &previous, coordinate); + set_field(program, "result_projection_artifact", Value::Bytes(encode(&projection).unwrap())); + let Value::Bytes(source) = embedded(program, "source_artifact") else { panic!("source") }; + let mut source = String::from_utf8(source).unwrap(); + let header = format!("package {previous};"); + assert_eq!(source.matches(&header).count(), 1); + source = source.replace(&header, &format!("package {coordinate};")); + assert_eq!(source.matches("intent replaceRange(").count(), 1); + source = source.replace("intent replaceRange(", &format!( + "fn {name}() -> U64 {{ return 0u64; }}\nintent replaceRange(")); + set_field(program, "source_artifact", Value::Bytes(encode(&Value::Bytes(source.into_bytes())).unwrap())); + }); + let mut package = decode(&raw).unwrap(); + let program = embedded(&package, "program"); + let source = embedded(&program, "source_artifact"); + set_field(&mut package, "operation_coordinate", text("jedit.text@1.replaceRange")); + set_field(field_mut(&mut package, "semantic_closure"), "edict_source_identity", + Value::Bytes(digest("edict.source/v1", &source).unwrap().into())); + let pin = digest("echo.operation-package/v1", &package).unwrap(); + (encode(&package).unwrap(), pin) + } + + #[test] + fn runtime_refuses_an_unused_source_function_named_for_an_imported_effect() { + let mut store = GraphStore::default(); + let node = make_node_id("effect-name-control"); + store.insert_node(node, NodeRecord { ty: make_type_id("node") }); + store.set_node_attachment(node, Some(AttachmentValue::Atom(AtomPayload { + type_id: make_type_id("document"), bytes: b"alpha".to_vec().into(), + }))); + let key = NodeKey { warp_id: store.warp_id(), local_id: node }; + let frontier = WorldlineFrontier::new(WorldlineId::from_bytes([7; 32]), + WorldlineState::from_root_store(store, node).unwrap()); + let before = frontier.state().state_root(); + let basis = ReadBasis::at(&frontier); + let aperture = [key]; + let view = ReadView::new(&frontier, basis, &aperture).unwrap(); + let supplied = encode(&record([ + ("address", record([ + ("warpId", Value::Bytes(key.warp_id.0.to_vec())), + ("nodeId", Value::Bytes(key.local_id.0.to_vec())), + ("typeId", Value::Bytes(make_type_id("document").0.to_vec())), + ])), + ("expected", Value::Bytes(b"alpha".to_vec())), + ])).unwrap(); + let limits = ReadLimits { evaluation: concat::limits(), max_reads: 1, max_read_bytes: 5 }; + let (positive, pin) = package(false); + let result = read(&positive, pin, &supplied, &view, limits).expect("disjoint unused function admits"); + assert_eq!(decode(&result.output).unwrap(), Value::Bytes(b"alpha".to_vec())); + assert_eq!((result.reads, result.read_bytes), (1, 5)); + assert_eq!(result.basis, basis); + let (negative, pin) = package(true); + let positive_program = embedded(&decode(&positive).unwrap(), "program"); + let negative_program = embedded(&decode(&negative).unwrap(), "program"); + for name in ["lawpack_exports_artifact", "lawpack_adapter_artifact", "lawpack_artifact", + "target_configuration_artifact", "result_projection_artifact"] { + assert_eq!(field(&positive_program, name), field(&negative_program, name)); + } + assert_eq!(read(&negative, pin, &supplied, &view, limits), + Err(ReadError::Evaluation(EvaluationError::InvalidArtifact))); + assert_eq!(frontier.state().state_root(), before); + } +} From b02d76a2b6f2664cab18d3d18c5d42a440028f68 Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 5 Oct 2026 03:30:53 -0700 Subject: [PATCH 05/23] fix: reserve imported effect names in source function inventories --- CHANGELOG.md | 2 + .../executable_operation/source_functions.rs | 7 + .../executable_operation/source_functions.rs | 7 + .../tests/bounded_read/source_functions.rs | 83 ++++++--- crates/warp-core/src/edict_pure/functions.rs | 7 + .../tests/edict_source_functions_tests.rs | 164 +++++++++++++----- .../application-contract-hosting.md | 8 +- 7 files changed, 207 insertions(+), 71 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 648d2bed8..9b161be54 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -94,6 +94,8 @@ ordered local bindings, and one cumulative budget. Independent provider judgments validate the complete source/imported closure, supported types, totality, combined runtime depth, and conservative whole-operation costs. + Providers and runtime reject source functions that shadow authenticated + imported effects, including otherwise valid unused definitions. - Bounded pure evaluation supports generic `core.bytes.concat` with independent operand byte bounds, checked maximum composition, and combined-byte work and diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs b/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs index a0a29da1e..414bfbd59 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs @@ -99,6 +99,12 @@ fn run(core: &Value, exports: &Value, read: bool) -> Check<()> { return Err(()); } } + // Exported effects own their coordinates even when no source body calls them. + // This exclusion does not add effects to the pure-call inventory. + let effect_names = list(get(exports, "effects")?)? + .iter() + .map(|effect| string(get(effect, "coordinate")?)) + .collect::>>()?; for (name, function) in members(get(core, "functions")?)? { let name = string(name)?; if !identifier(name) @@ -110,6 +116,7 @@ fn run(core: &Value, exports: &Value, read: bool) -> Check<()> { exact(function, &["params", "returnType", "body"])?; let name = format!("{}.{}", string(get(core, "coordinate")?)?, name); if name.starts_with("core.") + || effect_names.contains(name.as_str()) || functions .insert( name, diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs index a9dcc9f06..037cb19df 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs @@ -215,6 +215,12 @@ fn inventory<'a>( return Err(()); } } + // Exported effects own their coordinates even when no source body calls them. + // This exclusion does not add effects to the pure-call inventory. + let effect_names = sequence(get(exports, "effects")?)? + .iter() + .map(|effect| string(get(effect, "coordinate")?)) + .collect::>>()?; for (name, definition) in members(get(core, "functions")?)? { types.step(0)?; let name = string(name)?; @@ -235,6 +241,7 @@ fn inventory<'a>( } let name = format!("{}.{}", string(get(core, "coordinate")?)?, name); if name.starts_with("core.") + || effect_names.contains(name.as_str()) || definitions .insert( name, diff --git a/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs b/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs index 0c78bba1d..025356fb3 100644 --- a/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs +++ b/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs @@ -365,12 +365,11 @@ fn bounded_read_source_helper_refuses_the_original_insufficient_step_ceiling() { } } - fn rename_owned_coordinates(value: &mut Value, previous: &str, replacement: &str) { match value { Value::Text(name) => { if name == previous { - *name = replacement.to_owned(); + replacement.clone_into(name); } else if let Some(member) = name.strip_prefix(&format!("{previous}.")) { *name = format!("{replacement}.{member}"); } @@ -425,8 +424,11 @@ fn same_package_source_function(collision: bool) -> LoweringRequestV1 { panic!("type name") }; if let Some(relative) = name.strip_prefix(&prefix) { - assert_ne!(field(definition, "kind"), &text("Nominal"), - "this fixture must not move a nominal authority definition"); + assert_ne!( + field(definition, "kind"), + &text("Nominal"), + "this fixture must not move a nominal authority definition" + ); *name = relative.to_owned(); } assert!(names.insert(name.clone()), "type inventory remains unique"); @@ -435,11 +437,20 @@ fn same_package_source_function(collision: bool) -> LoweringRequestV1 { let functions = field_mut(&mut core, "functions"); let unused = field(functions, "retain").clone(); insert(functions, unused_name, unused); - source.core = bound(coordinate, "edict.core.module/v1", encode(&core).expect("core bytes")); + source.core = bound( + coordinate, + "edict.core.module/v1", + encode(&core).expect("core bytes"), + ); *field_mut(field_mut(&mut target, "semanticClosure"), "sourceCore") = map([ ("id", text(coordinate)), - ("digest", Value::Array(vec![text("sha256"), - Value::Bytes(source.core.reference.digest.bytes.clone())])), + ( + "digest", + Value::Array(vec![ + text("sha256"), + Value::Bytes(source.core.reference.digest.bytes.clone()), + ]), + ), ]); let Value::Bytes(authored) = decode(&source.semantic_inputs[3].artifact.artifact.bytes).expect("source") @@ -455,15 +466,30 @@ fn same_package_source_function(collision: bool) -> LoweringRequestV1 { fn {unused_name}(value: text.FactBytes) -> text.FactBytes {{ let bytes = value; return bytes; }}\n" ); assert_eq!(authored.matches("intent replaceRange(").count(), 1); - authored = authored.replace("intent replaceRange(", &format!("{helpers}intent replaceRange(")); + authored = authored.replace( + "intent replaceRange(", + &format!("{helpers}intent replaceRange("), + ); assert_eq!(authored.matches(" return actual;").count(), 1); - authored = authored.replace(" return actual;", " let retained = retain(actual);\n return retained;"); - source.semantic_inputs[3].artifact = bound(coordinate, "edict.source/v1", - encode(&Value::Bytes(authored.into_bytes())).expect("source bytes")); - source.semantic_inputs[5].artifact = bound("echo.span-ir/v2", "edict.target-ir.artifact/v1", - encode(&target).expect("target bytes")); - source.semantic_inputs[6].artifact = bound(&format!("{coordinate}.replaceRange"), - "edict.result-projection.artifact/v1", encode(&projection).expect("projection bytes")); + authored = authored.replace( + " return actual;", + " let retained = retain(actual);\n return retained;", + ); + source.semantic_inputs[3].artifact = bound( + coordinate, + "edict.source/v1", + encode(&Value::Bytes(authored.into_bytes())).expect("source bytes"), + ); + source.semantic_inputs[5].artifact = bound( + "echo.span-ir/v2", + "edict.target-ir.artifact/v1", + encode(&target).expect("target bytes"), + ); + source.semantic_inputs[6].artifact = bound( + &format!("{coordinate}.replaceRange"), + "edict.result-projection.artifact/v1", + encode(&projection).expect("projection bytes"), + ); source } @@ -471,8 +497,10 @@ fn collision_verification() -> verifier::VerificationRequestV1 { let positive = same_package_source_function(false); let negative = same_package_source_function(true); for index in [0, 1, 2, 4, 6] { - assert_eq!(positive.semantic_inputs[index].artifact, negative.semantic_inputs[index].artifact, - "changing an unused source name must preserve imported authority and result projection"); + assert_eq!( + positive.semantic_inputs[index].artifact, negative.semantic_inputs[index].artifact, + "changing an unused source name must preserve imported authority and result projection" + ); } // Only the disjoint control goes through the lowerer. The collision package // is assembled independently, so a future lowerer refusal cannot mask a @@ -480,15 +508,22 @@ fn collision_verification() -> verifier::VerificationRequestV1 { let mut verification = request(positive); verification.core = transport(negative.core.clone()); verification.target_ir = transport(negative.semantic_inputs[5].artifact.clone()); - verification.semantic_inputs.iter_mut().find(|input| input.role == "04-source") - .expect("source input").artifact = transport(negative.semantic_inputs[3].artifact.clone()); + verification + .semantic_inputs + .iter_mut() + .find(|input| input.role == "04-source") + .expect("source input") + .artifact = transport(negative.semantic_inputs[3].artifact.clone()); change_package(&mut verification, |package| { let closure = field_mut(package, "semantic_closure"); for (key, artifact) in [ ("canonical_meaning_identity", &negative.core), ("core_identity", &negative.core), ("target_ir_identity", &negative.semantic_inputs[5].artifact), - ("edict_source_identity", &negative.semantic_inputs[3].artifact), + ( + "edict_source_identity", + &negative.semantic_inputs[3].artifact, + ), ] { *field_mut(closure, key) = Value::Bytes(artifact.reference.digest.bytes.clone()); } @@ -521,8 +556,12 @@ fn bounded_read_disjoint_source_functions_share_the_imported_effect_package() { #[test] fn lowerer_source_function_names_cannot_shadow_imported_read_effects() { let source = same_package_source_function(true); - let refusal = lower(source).expect_err("unused source function collides with imported read effect"); - assert_eq!(refusal.kind, echo_edict_provider_lowerer::ProviderRefusalKind::UnsupportedSemantics); + let refusal = + lower(source).expect_err("unused source function collides with imported read effect"); + assert_eq!( + refusal.kind, + echo_edict_provider_lowerer::ProviderRefusalKind::UnsupportedSemantics + ); } #[test] diff --git a/crates/warp-core/src/edict_pure/functions.rs b/crates/warp-core/src/edict_pure/functions.rs index e869c45bb..a429ffa07 100644 --- a/crates/warp-core/src/edict_pure/functions.rs +++ b/crates/warp-core/src/edict_pure/functions.rs @@ -60,6 +60,12 @@ pub(crate) fn decode( } } if let Ok(functions) = field(core, "functions") { + // Imported effect names remain reserved authority, including when the + // colliding source definition is unused. They are never pure helpers. + let effect_names = array(field(exports, "effects")?)? + .iter() + .map(|effect| text_field(effect, "coordinate")) + .collect::, Error>>()?; for (name, value) in map(functions)? { let name = text(name)?; if name.is_empty() @@ -78,6 +84,7 @@ pub(crate) fn decode( exact_fields(value, &["params", "returnType", "body"])?; let coordinate = format!("{}.{}", parser.coordinate, name); if coordinate.starts_with("core.") + || effect_names.contains(coordinate.as_str()) || definitions .insert( coordinate, diff --git a/crates/warp-core/tests/edict_source_functions_tests.rs b/crates/warp-core/tests/edict_source_functions_tests.rs index 999bdf731..c5828660c 100644 --- a/crates/warp-core/tests/edict_source_functions_tests.rs +++ b/crates/warp-core/tests/edict_source_functions_tests.rs @@ -907,15 +907,15 @@ mod effect_name_collision { use super::*; use warp_core::edict_read::{evaluate as read, ReadBasis, ReadError, ReadLimits, ReadView}; use warp_core::{ - make_node_id, make_type_id, AtomPayload, AttachmentValue, GraphStore, NodeKey, - NodeRecord, WorldlineFrontier, WorldlineId, WorldlineState, + make_node_id, make_type_id, AtomPayload, AttachmentValue, GraphStore, NodeKey, NodeRecord, + WorldlineFrontier, WorldlineId, WorldlineState, }; fn rename(value: &mut Value, previous: &str, coordinate: &str) { match value { Value::Text(name) => { if name.as_str() == previous { - *name = coordinate.to_owned(); + coordinate.clone_into(name); } else if let Some(member) = name.strip_prefix(&format!("{previous}.")) { *name = format!("{coordinate}.{member}"); } @@ -938,12 +938,20 @@ mod effect_name_collision { fn package(collision: bool) -> (Vec, [u8; 32]) { let original = hex::decode( include_str!("fixtures/edict-node-read/single-executable-operation-package.hex").trim(), - ).unwrap(); + ) + .unwrap(); let (raw, _) = rewrite(original, |program, core, target| { let exports = embedded(program, "lawpack_exports_artifact"); - let Value::Array(effects) = field(&exports, "effects") else { panic!("effects") }; - assert_eq!(field(&effects[0], "coordinate"), &text("jedit.text@1.readFact")); - let Value::Text(previous) = field(core, "coordinate") else { panic!("coordinate") }; + let Value::Array(effects) = field(&exports, "effects") else { + panic!("effects") + }; + assert_eq!( + field(&effects[0], "coordinate"), + &text("jedit.text@1.readFact") + ); + let Value::Text(previous) = field(core, "coordinate") else { + panic!("coordinate") + }; let previous = previous.clone(); let coordinate = "jedit.text@1"; for value in [&mut *core, target] { @@ -951,11 +959,15 @@ mod effect_name_collision { } // The admitted synthetic Core uses unique module-relative type keys; // qualified type references and imported authority remain unchanged. - let Value::Map(types) = field_mut(core, "types") else { panic!("types") }; + let Value::Map(types) = field_mut(core, "types") else { + panic!("types") + }; let prefix = format!("{coordinate}."); let mut names = std::collections::BTreeSet::new(); for (key, definition) in types { - let Value::Text(name) = key else { panic!("type name") }; + let Value::Text(name) = key else { + panic!("type name") + }; if let Some(relative) = name.strip_prefix(&prefix) { assert_ne!(field(definition, "kind"), &text("Nominal")); *name = relative.to_owned(); @@ -965,34 +977,58 @@ mod effect_name_collision { let name = if collision { "readFact" } else { "unusedRead" }; let result = record([ ("kind", text("const")), - ("value", record([ - ("kind", text("int")), - ("width", text("U64")), - ("value", Value::Integer(0)), - ])), + ( + "value", + record([ + ("kind", text("int")), + ("width", text("U64")), + ("value", Value::Integer(0)), + ]), + ), ]); - insert(core, "functions", record([( - name, function(vec![], "U64", vec![], vec![], result), - )])); + insert( + core, + "functions", + record([(name, function(vec![], "U64", vec![], vec![], result))]), + ); let mut projection = embedded(program, "result_projection_artifact"); rename(&mut projection, &previous, coordinate); - set_field(program, "result_projection_artifact", Value::Bytes(encode(&projection).unwrap())); - let Value::Bytes(source) = embedded(program, "source_artifact") else { panic!("source") }; + set_field( + program, + "result_projection_artifact", + Value::Bytes(encode(&projection).unwrap()), + ); + let Value::Bytes(source) = embedded(program, "source_artifact") else { + panic!("source") + }; let mut source = String::from_utf8(source).unwrap(); let header = format!("package {previous};"); assert_eq!(source.matches(&header).count(), 1); source = source.replace(&header, &format!("package {coordinate};")); assert_eq!(source.matches("intent replaceRange(").count(), 1); - source = source.replace("intent replaceRange(", &format!( - "fn {name}() -> U64 {{ return 0u64; }}\nintent replaceRange(")); - set_field(program, "source_artifact", Value::Bytes(encode(&Value::Bytes(source.into_bytes())).unwrap())); + source = source.replace( + "intent replaceRange(", + &format!("fn {name}() -> U64 {{ return 0u64; }}\nintent replaceRange("), + ); + set_field( + program, + "source_artifact", + Value::Bytes(encode(&Value::Bytes(source.into_bytes())).unwrap()), + ); }); let mut package = decode(&raw).unwrap(); let program = embedded(&package, "program"); let source = embedded(&program, "source_artifact"); - set_field(&mut package, "operation_coordinate", text("jedit.text@1.replaceRange")); - set_field(field_mut(&mut package, "semantic_closure"), "edict_source_identity", - Value::Bytes(digest("edict.source/v1", &source).unwrap().into())); + set_field( + &mut package, + "operation_coordinate", + text("jedit.text@1.replaceRange"), + ); + set_field( + field_mut(&mut package, "semantic_closure"), + "edict_source_identity", + Value::Bytes(digest("edict.source/v1", &source).unwrap().into()), + ); let pin = digest("echo.operation-package/v1", &package).unwrap(); (encode(&package).unwrap(), pin) } @@ -1001,40 +1037,76 @@ mod effect_name_collision { fn runtime_refuses_an_unused_source_function_named_for_an_imported_effect() { let mut store = GraphStore::default(); let node = make_node_id("effect-name-control"); - store.insert_node(node, NodeRecord { ty: make_type_id("node") }); - store.set_node_attachment(node, Some(AttachmentValue::Atom(AtomPayload { - type_id: make_type_id("document"), bytes: b"alpha".to_vec().into(), - }))); - let key = NodeKey { warp_id: store.warp_id(), local_id: node }; - let frontier = WorldlineFrontier::new(WorldlineId::from_bytes([7; 32]), - WorldlineState::from_root_store(store, node).unwrap()); + store.insert_node( + node, + NodeRecord { + ty: make_type_id("node"), + }, + ); + store.set_node_attachment( + node, + Some(AttachmentValue::Atom(AtomPayload { + type_id: make_type_id("document"), + bytes: b"alpha".to_vec().into(), + })), + ); + let key = NodeKey { + warp_id: store.warp_id(), + local_id: node, + }; + let frontier = WorldlineFrontier::new( + WorldlineId::from_bytes([7; 32]), + WorldlineState::from_root_store(store, node).unwrap(), + ); let before = frontier.state().state_root(); let basis = ReadBasis::at(&frontier); let aperture = [key]; let view = ReadView::new(&frontier, basis, &aperture).unwrap(); let supplied = encode(&record([ - ("address", record([ - ("warpId", Value::Bytes(key.warp_id.0.to_vec())), - ("nodeId", Value::Bytes(key.local_id.0.to_vec())), - ("typeId", Value::Bytes(make_type_id("document").0.to_vec())), - ])), + ( + "address", + record([ + ("warpId", Value::Bytes(key.warp_id.0.to_vec())), + ("nodeId", Value::Bytes(key.local_id.0.to_vec())), + ("typeId", Value::Bytes(make_type_id("document").0.to_vec())), + ]), + ), ("expected", Value::Bytes(b"alpha".to_vec())), - ])).unwrap(); - let limits = ReadLimits { evaluation: concat::limits(), max_reads: 1, max_read_bytes: 5 }; + ])) + .unwrap(); + let limits = ReadLimits { + evaluation: concat::limits(), + max_reads: 1, + max_read_bytes: 5, + }; let (positive, pin) = package(false); - let result = read(&positive, pin, &supplied, &view, limits).expect("disjoint unused function admits"); - assert_eq!(decode(&result.output).unwrap(), Value::Bytes(b"alpha".to_vec())); + let result = read(&positive, pin, &supplied, &view, limits) + .expect("disjoint unused function admits"); + assert_eq!( + decode(&result.output).unwrap(), + Value::Bytes(b"alpha".to_vec()) + ); assert_eq!((result.reads, result.read_bytes), (1, 5)); assert_eq!(result.basis, basis); let (negative, pin) = package(true); let positive_program = embedded(&decode(&positive).unwrap(), "program"); let negative_program = embedded(&decode(&negative).unwrap(), "program"); - for name in ["lawpack_exports_artifact", "lawpack_adapter_artifact", "lawpack_artifact", - "target_configuration_artifact", "result_projection_artifact"] { - assert_eq!(field(&positive_program, name), field(&negative_program, name)); + for name in [ + "lawpack_exports_artifact", + "lawpack_adapter_artifact", + "lawpack_artifact", + "target_configuration_artifact", + "result_projection_artifact", + ] { + assert_eq!( + field(&positive_program, name), + field(&negative_program, name) + ); } - assert_eq!(read(&negative, pin, &supplied, &view, limits), - Err(ReadError::Evaluation(EvaluationError::InvalidArtifact))); + assert_eq!( + read(&negative, pin, &supplied, &view, limits), + Err(ReadError::Evaluation(EvaluationError::InvalidArtifact)) + ); assert_eq!(frontier.state().state_root(), before); } } diff --git a/docs/architecture/application-contract-hosting.md b/docs/architecture/application-contract-hosting.md index 906d7c320..03daee324 100644 --- a/docs/architecture/application-contract-hosting.md +++ b/docs/architecture/application-contract-hosting.md @@ -260,9 +260,11 @@ verifier audits dependency summaries and lexical frames before checking the Core/Target relation. Rebinding artifact hashes does not establish that relation. Unknown or colliding function names, wrong argument types or arity, generic calls, cycles, undeclared or duplicate locals, forward local references, and -caller-local captures reject. Imported functions cannot refer back to -source-owned functions. The imported subset remains zero-argument bodies without -local bindings. +caller-local captures reject. Source function coordinates must be disjoint from +both authenticated imported pure-function and effect exports, including unused +source definitions. Reserving an effect name does not permit calling it from a +pure helper. Imported functions cannot refer back to source-owned functions. +The imported subset remains zero-argument bodies without local bindings. Each call evaluates every argument once, from left to right in the caller's frame, including unused arguments. Validated argument values move into a fresh From a64d1d79a7edac1b88e670982d79635e8a0005ee Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 5 Oct 2026 03:38:09 -0700 Subject: [PATCH 06/23] test: preserve same-package imported pure call authority --- .../tests/bounded_read/imported_calls.rs | 190 ++++++++++++++++++ .../tests/bounded_read/source_functions.rs | 3 + 2 files changed, 193 insertions(+) create mode 100644 crates/echo-edict-provider-verifier/tests/bounded_read/imported_calls.rs diff --git a/crates/echo-edict-provider-verifier/tests/bounded_read/imported_calls.rs b/crates/echo-edict-provider-verifier/tests/bounded_read/imported_calls.rs new file mode 100644 index 000000000..98ba2f8bb --- /dev/null +++ b/crates/echo-edict-provider-verifier/tests/bounded_read/imported_calls.rs @@ -0,0 +1,190 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +//! Synthetic mixed read/pure authority; retained export body, not public compilation. +use super::*; + +fn retained_unsigned_export() -> Value { + let raw = hex::decode(include_str!("../fixtures/compiler-produced-pure/package.cbor.hex").trim()) + .expect("retained public compiler package"); + let package = decode(&raw).expect("package"); + let Value::Bytes(program) = field(&package, "program") else { panic!("program") }; + let program = decode(program).expect("program"); + let Value::Bytes(exports) = field(&program, "lawpack_exports_artifact") else { panic!("exports") }; + let exports = decode(exports).expect("exports"); + let Value::Array(functions) = field(&exports, "pureFunctions") else { panic!("functions") }; + let [function] = functions.as_slice() else { panic!("one retained helper") }; + assert_eq!(field(function, "coordinate"), &text("jedit.text@1.maxCreatedLeafCount")); + assert_eq!(field(function, "returnType"), &text("U64")); + assert_eq!(field(function, "parameterTypes"), &Value::Array(vec![])); + function.clone() +} + +fn add_imported_authority(source: &mut LoweringRequestV1, core: &mut Value, + target: &mut Value, authored: &mut String) { + let mut exports = decode(&source.semantic_inputs[1].artifact.artifact.bytes).expect("read exports"); + let Value::Array(functions) = field_mut(&mut exports, "pureFunctions") else { panic!("functions") }; + assert!(functions.is_empty()); + functions.push(retained_unsigned_export()); + let exports_id = source.semantic_inputs[1].artifact.reference.coordinate.clone(); + let exports_owner = digest(&exports_id, &exports).expect("exports owner identity"); + source.semantic_inputs[1].artifact = bound(&exports_id, "edict.lawpack-exports/v1", + encode(&exports).expect("exports bytes")); + let mut lawpack = decode(&source.semantic_inputs[2].artifact.artifact.bytes).expect("lawpack"); + *field_mut(field_mut(&mut lawpack, "exports"), "digest") = + Value::Array(vec![text("sha256"), Value::Bytes(exports_owner.into())]); + let old = format!("sha256:{}", hex::encode(&source.semantic_inputs[2].artifact.reference.digest.bytes)); + source.semantic_inputs[2].artifact = bound("jedit.text@1", "edict.lawpack/v1", + encode(&lawpack).expect("lawpack bytes")); + let identity = source.semantic_inputs[2].artifact.reference.digest.bytes.clone(); + let lawpack_ref = map([ + ("id", text("jedit.text@1")), + ("digest", Value::Array(vec![text("sha256"), Value::Bytes(identity.clone())])), + ]); + let Value::Array(imports) = field_mut(core, "imports") else { panic!("imports") }; + *field_mut(&mut imports[0], "ref") = lawpack_ref.clone(); + *field_mut(field_mut(target, "semanticClosure"), "lawpacks") = Value::Array(vec![lawpack_ref]); + assert_eq!(authored.matches(&old).count(), 1); + *authored = authored.replace(&old, &format!("sha256:{}", hex::encode(identity))); +} + +fn imported_call_request(same_package: bool, unknown: bool) -> LoweringRequestV1 { + let mut source = read_helper(); + let mut core = decode(&source.core.artifact.bytes).expect("core"); + let mut target = decode(&source.semantic_inputs[5].artifact.artifact.bytes).expect("target"); + let mut projection = decode(&source.semantic_inputs[6].artifact.artifact.bytes).expect("projection"); + let Value::Bytes(authored) = decode(&source.semantic_inputs[3].artifact.artifact.bytes).expect("source") + else { panic!("source bytes") }; + let mut authored = String::from_utf8(authored).expect("source UTF-8"); + add_imported_authority(&mut source, &mut core, &mut target, &mut authored); + let member = if unknown { "unknownImportedHelper" } else { "maxCreatedLeafCount" }; + let binding = local("source.imported", "U64"); + let call = map([ + ("kind", text("call")), ("callee", text(&format!("jedit.text@1.{member}"))), + ("args", Value::Array(vec![])), ("typeArgs", Value::Array(vec![])), + ]); + let body = field_mut(intent(&mut core), "body"); + let Value::Array(locals) = field_mut(body, "locals") else { panic!("locals") }; + locals.push(binding.clone()); + let Value::Array(nodes) = field_mut(body, "nodes") else { panic!("nodes") }; + nodes.push(map([("kind", text("let")), ("binding", binding.clone()), ("value", call.clone())])); + let target_intent = intent(&mut target); + let Value::Array(bindings) = field_mut(target_intent, "pureBindings") else { panic!("bindings") }; + bindings.push(map([ + ("id", text("replaceRange.binding.imported")), ("binding", binding), ("value", call), + ])); + let Value::Array(order) = field_mut(target_intent, "executionOrder") else { panic!("order") }; + order.push(text("replaceRange.binding.imported")); + assert_eq!(authored.matches("intent replaceRange(").count(), 1); + authored = authored.replace("intent replaceRange(", + "fn retain(value: text.FactBytes) -> text.FactBytes { let bytes = value; return bytes; }\nintent replaceRange("); + assert_eq!(authored.matches(" return actual;").count(), 1); + authored = authored.replace(" return actual;", &format!( + " let retained = retain(actual);\n let imported = text.{member}();\n return retained;")); + let previous = source.core.reference.coordinate.clone(); + let coordinate = if same_package { "jedit.text@1" } else { &previous }; + if same_package { + for value in [&mut core, &mut target, &mut projection] { + rename_owned_coordinates(value, &previous, coordinate); + } + // This isolates call ownership using the supported relative Core table + // spelling. It does not establish exact-key-first type lookup or public + // compiler compatibility for a same-package imported type closure. + let Value::Map(types) = field_mut(&mut core, "types") else { panic!("types") }; + let prefix = format!("{coordinate}."); + let mut names = std::collections::BTreeSet::new(); + for (key, definition) in types { + let Value::Text(name) = key else { panic!("type name") }; + if let Some(relative) = name.strip_prefix(&prefix) { + assert_ne!(field(definition, "kind"), &text("Nominal")); + *name = relative.to_owned(); + } + assert!(names.insert(name.clone())); + } + let header = format!("package {previous};"); + assert_eq!(authored.matches(&header).count(), 1); + authored = authored.replace(&header, &format!("package {coordinate};")); + } + source.core = bound(coordinate, "edict.core.module/v1", encode(&core).expect("core bytes")); + *field_mut(field_mut(&mut target, "semanticClosure"), "sourceCore") = map([ + ("id", text(coordinate)), + ("digest", Value::Array(vec![text("sha256"), Value::Bytes(source.core.reference.digest.bytes.clone())])), + ]); + source.semantic_inputs[3].artifact = bound(coordinate, "edict.source/v1", + encode(&Value::Bytes(authored.into_bytes())).expect("source bytes")); + source.semantic_inputs[5].artifact = bound("echo.span-ir/v2", "edict.target-ir.artifact/v1", + encode(&target).expect("target bytes")); + source.semantic_inputs[6].artifact = bound(&format!("{coordinate}.replaceRange"), + "edict.result-projection.artifact/v1", encode(&projection).expect("projection bytes")); + source +} + +fn independently_rebound_request(candidate: LoweringRequestV1) -> verifier::VerificationRequestV1 { + let admitted = imported_call_request(false, false); + for index in [0, 1, 2, 4] { + assert_eq!(admitted.semantic_inputs[index].artifact, candidate.semantic_inputs[index].artifact, + "package naming or unknown call cannot change imported authority"); + } + // Only the separate-package positive is lowered. Same-package verification + // must remain observable even while its independent lowerer control is RED. + let mut verification = request(admitted); + verification.core = transport(candidate.core.clone()); + verification.target_ir = transport(candidate.semantic_inputs[5].artifact.clone()); + for input in &mut verification.semantic_inputs { + if let Some(replacement) = candidate.semantic_inputs.iter().find(|value| value.role == input.role) { + input.artifact = transport(replacement.artifact.clone()); + } + } + change_package(&mut verification, |package| { + *field_mut(package, "operation_coordinate") = text(&format!("{}.replaceRange", candidate.core.reference.coordinate)); + let closure = field_mut(package, "semantic_closure"); + for (key, artifact) in [ + ("canonical_meaning_identity", &candidate.core), ("core_identity", &candidate.core), + ("target_ir_identity", &candidate.semantic_inputs[5].artifact), + ("edict_source_identity", &candidate.semantic_inputs[3].artifact), + ] { + *field_mut(closure, key) = Value::Bytes(artifact.reference.digest.bytes.clone()); + } + let Value::Bytes(raw) = field(package, "program") else { panic!("program bytes") }; + let mut program = decode(raw).expect("program"); + for (key, artifact) in [ + ("core_artifact", &candidate.core), + ("target_ir_artifact", &candidate.semantic_inputs[5].artifact), + ("source_artifact", &candidate.semantic_inputs[3].artifact), + ("result_projection_artifact", &candidate.semantic_inputs[6].artifact), + ] { + *field_mut(&mut program, key) = Value::Bytes(artifact.artifact.bytes.clone()); + } + *field_mut(package, "program") = Value::Bytes(encode(&program).expect("program bytes")); + }); + verification +} + +#[test] +fn separate_package_direct_imported_pure_call_is_admitted() { + let source = imported_call_request(false, false); + lower(source.clone()).expect("separate-package direct pure call lowers"); + let response = verifier::verify(request(source)).expect("separate-package independent report"); + let report = decode(&response.outputs[0].artifact.bytes).expect("report"); + assert_eq!(field(&report, "outcome"), &text("accepted")); +} + +#[test] +fn lowerer_same_package_imported_pure_call_is_not_claimed_by_source_prefix() { + lower(imported_call_request(true, false)).expect("exact source membership permits disjoint imported helper"); +} + +#[test] +fn verifier_same_package_imported_pure_call_is_not_claimed_by_source_prefix() { + let verification = independently_rebound_request(imported_call_request(true, false)); + let response = verifier::verify(verification).expect("coherently rebound same-package report"); + let report = decode(&response.outputs[0].artifact.bytes).expect("report"); + assert_eq!(field(&report, "outcome"), &text("accepted")); +} + +#[test] +fn an_unknown_qualified_pure_call_remains_rejected_by_both_judgments() { + let source = imported_call_request(true, true); + let refusal = lower(source.clone()).expect_err("unknown imported coordinate is not authority"); + assert_eq!(refusal.kind, echo_edict_provider_lowerer::ProviderRefusalKind::UnsupportedSemantics); + assert_rejected(independently_rebound_request(source)); +} diff --git a/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs b/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs index 025356fb3..532c06cfd 100644 --- a/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs +++ b/crates/echo-edict-provider-verifier/tests/bounded_read/source_functions.rs @@ -568,3 +568,6 @@ fn lowerer_source_function_names_cannot_shadow_imported_read_effects() { fn verifier_source_function_names_cannot_shadow_imported_read_effects() { assert_rejected(collision_verification()); } + +#[path = "imported_calls.rs"] +mod imported_calls; From b3e595e7578d1aa03c455941fea469610ade16e0 Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 5 Oct 2026 03:44:45 -0700 Subject: [PATCH 07/23] fix: resolve imported pure calls by exact source membership --- CHANGELOG.md | 3 +- .../bounded_read/relation/types.rs | 9 +- .../bounded_read/audit/types.rs | 7 +- .../tests/bounded_read/imported_calls.rs | 228 +++++++++++++----- .../application-contract-hosting.md | 3 + 5 files changed, 187 insertions(+), 63 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b161be54..f7e821ef3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -95,7 +95,8 @@ judgments validate the complete source/imported closure, supported types, totality, combined runtime depth, and conservative whole-operation costs. Providers and runtime reject source functions that shadow authenticated - imported effects, including otherwise valid unused definitions. + imported effects, including otherwise valid unused definitions. Bounded-read + call lookup admits disjoint imported pure functions in the same package. - Bounded pure evaluation supports generic `core.bytes.concat` with independent operand byte bounds, checked maximum composition, and combined-byte work and diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs index 2d75a22c6..f872d13da 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs @@ -291,11 +291,10 @@ impl<'a> Scope<'a> { .map(|value| self.expression(value, depth + 1)) .collect::, _>>()?; let prefix = format!("{}.", text(self.core, "coordinate")?); - let signature = if let Some(member) = name.strip_prefix(&prefix) { - Some(field(field(self.core, "functions")?, member)?) - } else { - None - }; + let signature = name.strip_prefix(&prefix).and_then(|member| { + super::map_field(self.core, "functions") + .and_then(|functions| super::map_field(functions, member)) + }); if let Some(function) = signature { let params = super::array(function, "params")?; if !types.is_empty() || params.len() != actual.len() { diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs b/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs index 640d2e033..ab94f6df0 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs @@ -273,8 +273,11 @@ impl<'a> Symbols<'a> { } let core = self.core; let prefix = format!("{}.", text(core, "coordinate")?); - if let Some(member) = name.strip_prefix(&prefix) { - let definition = get(get(core, "functions")?, member)?; + let source_definition = name.strip_prefix(&prefix).and_then(|member| { + super::super::map_field(core, "functions") + .and_then(|functions| super::super::map_field(functions, member)) + }); + if let Some(definition) = source_definition { let parameters = super::sequence(definition, "params")?; if !types.is_empty() || actual.len() != parameters.len() { return Err(()); diff --git a/crates/echo-edict-provider-verifier/tests/bounded_read/imported_calls.rs b/crates/echo-edict-provider-verifier/tests/bounded_read/imported_calls.rs index 98ba2f8bb..a5afd2665 100644 --- a/crates/echo-edict-provider-verifier/tests/bounded_read/imported_calls.rs +++ b/crates/echo-edict-provider-verifier/tests/bounded_read/imported_calls.rs @@ -4,43 +4,85 @@ use super::*; fn retained_unsigned_export() -> Value { - let raw = hex::decode(include_str!("../fixtures/compiler-produced-pure/package.cbor.hex").trim()) - .expect("retained public compiler package"); + let raw = + hex::decode(include_str!("../fixtures/compiler-produced-pure/package.cbor.hex").trim()) + .expect("retained public compiler package"); let package = decode(&raw).expect("package"); - let Value::Bytes(program) = field(&package, "program") else { panic!("program") }; + let Value::Bytes(program) = field(&package, "program") else { + panic!("program") + }; let program = decode(program).expect("program"); - let Value::Bytes(exports) = field(&program, "lawpack_exports_artifact") else { panic!("exports") }; + let Value::Bytes(exports) = field(&program, "lawpack_exports_artifact") else { + panic!("exports") + }; let exports = decode(exports).expect("exports"); - let Value::Array(functions) = field(&exports, "pureFunctions") else { panic!("functions") }; - let [function] = functions.as_slice() else { panic!("one retained helper") }; - assert_eq!(field(function, "coordinate"), &text("jedit.text@1.maxCreatedLeafCount")); + let Value::Array(functions) = field(&exports, "pureFunctions") else { + panic!("functions") + }; + let [function] = functions.as_slice() else { + panic!("one retained helper") + }; + assert_eq!( + field(function, "coordinate"), + &text("jedit.text@1.maxCreatedLeafCount") + ); assert_eq!(field(function, "returnType"), &text("U64")); assert_eq!(field(function, "parameterTypes"), &Value::Array(vec![])); function.clone() } -fn add_imported_authority(source: &mut LoweringRequestV1, core: &mut Value, - target: &mut Value, authored: &mut String) { - let mut exports = decode(&source.semantic_inputs[1].artifact.artifact.bytes).expect("read exports"); - let Value::Array(functions) = field_mut(&mut exports, "pureFunctions") else { panic!("functions") }; +fn add_imported_authority( + source: &mut LoweringRequestV1, + core: &mut Value, + target: &mut Value, + authored: &mut String, +) { + let mut exports = + decode(&source.semantic_inputs[1].artifact.artifact.bytes).expect("read exports"); + let Value::Array(functions) = field_mut(&mut exports, "pureFunctions") else { + panic!("functions") + }; assert!(functions.is_empty()); functions.push(retained_unsigned_export()); - let exports_id = source.semantic_inputs[1].artifact.reference.coordinate.clone(); + let exports_id = source.semantic_inputs[1] + .artifact + .reference + .coordinate + .clone(); let exports_owner = digest(&exports_id, &exports).expect("exports owner identity"); - source.semantic_inputs[1].artifact = bound(&exports_id, "edict.lawpack-exports/v1", - encode(&exports).expect("exports bytes")); + source.semantic_inputs[1].artifact = bound( + &exports_id, + "edict.lawpack-exports/v1", + encode(&exports).expect("exports bytes"), + ); let mut lawpack = decode(&source.semantic_inputs[2].artifact.artifact.bytes).expect("lawpack"); *field_mut(field_mut(&mut lawpack, "exports"), "digest") = Value::Array(vec![text("sha256"), Value::Bytes(exports_owner.into())]); - let old = format!("sha256:{}", hex::encode(&source.semantic_inputs[2].artifact.reference.digest.bytes)); - source.semantic_inputs[2].artifact = bound("jedit.text@1", "edict.lawpack/v1", - encode(&lawpack).expect("lawpack bytes")); - let identity = source.semantic_inputs[2].artifact.reference.digest.bytes.clone(); + let old = format!( + "sha256:{}", + hex::encode(&source.semantic_inputs[2].artifact.reference.digest.bytes) + ); + source.semantic_inputs[2].artifact = bound( + "jedit.text@1", + "edict.lawpack/v1", + encode(&lawpack).expect("lawpack bytes"), + ); + let identity = source.semantic_inputs[2] + .artifact + .reference + .digest + .bytes + .clone(); let lawpack_ref = map([ ("id", text("jedit.text@1")), - ("digest", Value::Array(vec![text("sha256"), Value::Bytes(identity.clone())])), + ( + "digest", + Value::Array(vec![text("sha256"), Value::Bytes(identity.clone())]), + ), ]); - let Value::Array(imports) = field_mut(core, "imports") else { panic!("imports") }; + let Value::Array(imports) = field_mut(core, "imports") else { + panic!("imports") + }; *field_mut(&mut imports[0], "ref") = lawpack_ref.clone(); *field_mut(field_mut(target, "semanticClosure"), "lawpacks") = Value::Array(vec![lawpack_ref]); assert_eq!(authored.matches(&old).count(), 1); @@ -51,37 +93,68 @@ fn imported_call_request(same_package: bool, unknown: bool) -> LoweringRequestV1 let mut source = read_helper(); let mut core = decode(&source.core.artifact.bytes).expect("core"); let mut target = decode(&source.semantic_inputs[5].artifact.artifact.bytes).expect("target"); - let mut projection = decode(&source.semantic_inputs[6].artifact.artifact.bytes).expect("projection"); - let Value::Bytes(authored) = decode(&source.semantic_inputs[3].artifact.artifact.bytes).expect("source") - else { panic!("source bytes") }; + let mut projection = + decode(&source.semantic_inputs[6].artifact.artifact.bytes).expect("projection"); + let Value::Bytes(authored) = + decode(&source.semantic_inputs[3].artifact.artifact.bytes).expect("source") + else { + panic!("source bytes") + }; let mut authored = String::from_utf8(authored).expect("source UTF-8"); add_imported_authority(&mut source, &mut core, &mut target, &mut authored); - let member = if unknown { "unknownImportedHelper" } else { "maxCreatedLeafCount" }; + let member = if unknown { + "unknownImportedHelper" + } else { + "maxCreatedLeafCount" + }; let binding = local("source.imported", "U64"); let call = map([ - ("kind", text("call")), ("callee", text(&format!("jedit.text@1.{member}"))), - ("args", Value::Array(vec![])), ("typeArgs", Value::Array(vec![])), + ("kind", text("call")), + ("callee", text(&format!("jedit.text@1.{member}"))), + ("args", Value::Array(vec![])), + ("typeArgs", Value::Array(vec![])), ]); let body = field_mut(intent(&mut core), "body"); - let Value::Array(locals) = field_mut(body, "locals") else { panic!("locals") }; + let Value::Array(locals) = field_mut(body, "locals") else { + panic!("locals") + }; locals.push(binding.clone()); - let Value::Array(nodes) = field_mut(body, "nodes") else { panic!("nodes") }; - nodes.push(map([("kind", text("let")), ("binding", binding.clone()), ("value", call.clone())])); + let Value::Array(nodes) = field_mut(body, "nodes") else { + panic!("nodes") + }; + nodes.push(map([ + ("kind", text("let")), + ("binding", binding.clone()), + ("value", call.clone()), + ])); let target_intent = intent(&mut target); - let Value::Array(bindings) = field_mut(target_intent, "pureBindings") else { panic!("bindings") }; + let Value::Array(bindings) = field_mut(target_intent, "pureBindings") else { + panic!("bindings") + }; bindings.push(map([ - ("id", text("replaceRange.binding.imported")), ("binding", binding), ("value", call), + ("id", text("replaceRange.binding.imported")), + ("binding", binding), + ("value", call), ])); - let Value::Array(order) = field_mut(target_intent, "executionOrder") else { panic!("order") }; + let Value::Array(order) = field_mut(target_intent, "executionOrder") else { + panic!("order") + }; order.push(text("replaceRange.binding.imported")); assert_eq!(authored.matches("intent replaceRange(").count(), 1); authored = authored.replace("intent replaceRange(", "fn retain(value: text.FactBytes) -> text.FactBytes { let bytes = value; return bytes; }\nintent replaceRange("); assert_eq!(authored.matches(" return actual;").count(), 1); - authored = authored.replace(" return actual;", &format!( - " let retained = retain(actual);\n let imported = text.{member}();\n return retained;")); + authored = authored.replace( + " return actual;", + &format!( + " let retained = retain(actual);\n let imported = text.{member}();\n return retained;"), + ); let previous = source.core.reference.coordinate.clone(); - let coordinate = if same_package { "jedit.text@1" } else { &previous }; + let coordinate = if same_package { + "jedit.text@1" + } else { + &previous + }; if same_package { for value in [&mut core, &mut target, &mut projection] { rename_owned_coordinates(value, &previous, coordinate); @@ -89,11 +162,15 @@ fn imported_call_request(same_package: bool, unknown: bool) -> LoweringRequestV1 // This isolates call ownership using the supported relative Core table // spelling. It does not establish exact-key-first type lookup or public // compiler compatibility for a same-package imported type closure. - let Value::Map(types) = field_mut(&mut core, "types") else { panic!("types") }; + let Value::Map(types) = field_mut(&mut core, "types") else { + panic!("types") + }; let prefix = format!("{coordinate}."); let mut names = std::collections::BTreeSet::new(); for (key, definition) in types { - let Value::Text(name) = key else { panic!("type name") }; + let Value::Text(name) = key else { + panic!("type name") + }; if let Some(relative) = name.strip_prefix(&prefix) { assert_ne!(field(definition, "kind"), &text("Nominal")); *name = relative.to_owned(); @@ -104,25 +181,46 @@ fn imported_call_request(same_package: bool, unknown: bool) -> LoweringRequestV1 assert_eq!(authored.matches(&header).count(), 1); authored = authored.replace(&header, &format!("package {coordinate};")); } - source.core = bound(coordinate, "edict.core.module/v1", encode(&core).expect("core bytes")); + source.core = bound( + coordinate, + "edict.core.module/v1", + encode(&core).expect("core bytes"), + ); *field_mut(field_mut(&mut target, "semanticClosure"), "sourceCore") = map([ ("id", text(coordinate)), - ("digest", Value::Array(vec![text("sha256"), Value::Bytes(source.core.reference.digest.bytes.clone())])), + ( + "digest", + Value::Array(vec![ + text("sha256"), + Value::Bytes(source.core.reference.digest.bytes.clone()), + ]), + ), ]); - source.semantic_inputs[3].artifact = bound(coordinate, "edict.source/v1", - encode(&Value::Bytes(authored.into_bytes())).expect("source bytes")); - source.semantic_inputs[5].artifact = bound("echo.span-ir/v2", "edict.target-ir.artifact/v1", - encode(&target).expect("target bytes")); - source.semantic_inputs[6].artifact = bound(&format!("{coordinate}.replaceRange"), - "edict.result-projection.artifact/v1", encode(&projection).expect("projection bytes")); + source.semantic_inputs[3].artifact = bound( + coordinate, + "edict.source/v1", + encode(&Value::Bytes(authored.into_bytes())).expect("source bytes"), + ); + source.semantic_inputs[5].artifact = bound( + "echo.span-ir/v2", + "edict.target-ir.artifact/v1", + encode(&target).expect("target bytes"), + ); + source.semantic_inputs[6].artifact = bound( + &format!("{coordinate}.replaceRange"), + "edict.result-projection.artifact/v1", + encode(&projection).expect("projection bytes"), + ); source } fn independently_rebound_request(candidate: LoweringRequestV1) -> verifier::VerificationRequestV1 { let admitted = imported_call_request(false, false); for index in [0, 1, 2, 4] { - assert_eq!(admitted.semantic_inputs[index].artifact, candidate.semantic_inputs[index].artifact, - "package naming or unknown call cannot change imported authority"); + assert_eq!( + admitted.semantic_inputs[index].artifact, candidate.semantic_inputs[index].artifact, + "package naming or unknown call cannot change imported authority" + ); } // Only the separate-package positive is lowered. Same-package verification // must remain observable even while its independent lowerer control is RED. @@ -130,27 +228,43 @@ fn independently_rebound_request(candidate: LoweringRequestV1) -> verifier::Veri verification.core = transport(candidate.core.clone()); verification.target_ir = transport(candidate.semantic_inputs[5].artifact.clone()); for input in &mut verification.semantic_inputs { - if let Some(replacement) = candidate.semantic_inputs.iter().find(|value| value.role == input.role) { + if let Some(replacement) = candidate + .semantic_inputs + .iter() + .find(|value| value.role == input.role) + { input.artifact = transport(replacement.artifact.clone()); } } change_package(&mut verification, |package| { - *field_mut(package, "operation_coordinate") = text(&format!("{}.replaceRange", candidate.core.reference.coordinate)); + *field_mut(package, "operation_coordinate") = text(&format!( + "{}.replaceRange", + candidate.core.reference.coordinate + )); let closure = field_mut(package, "semantic_closure"); for (key, artifact) in [ - ("canonical_meaning_identity", &candidate.core), ("core_identity", &candidate.core), + ("canonical_meaning_identity", &candidate.core), + ("core_identity", &candidate.core), ("target_ir_identity", &candidate.semantic_inputs[5].artifact), - ("edict_source_identity", &candidate.semantic_inputs[3].artifact), + ( + "edict_source_identity", + &candidate.semantic_inputs[3].artifact, + ), ] { *field_mut(closure, key) = Value::Bytes(artifact.reference.digest.bytes.clone()); } - let Value::Bytes(raw) = field(package, "program") else { panic!("program bytes") }; + let Value::Bytes(raw) = field(package, "program") else { + panic!("program bytes") + }; let mut program = decode(raw).expect("program"); for (key, artifact) in [ ("core_artifact", &candidate.core), ("target_ir_artifact", &candidate.semantic_inputs[5].artifact), ("source_artifact", &candidate.semantic_inputs[3].artifact), - ("result_projection_artifact", &candidate.semantic_inputs[6].artifact), + ( + "result_projection_artifact", + &candidate.semantic_inputs[6].artifact, + ), ] { *field_mut(&mut program, key) = Value::Bytes(artifact.artifact.bytes.clone()); } @@ -170,7 +284,8 @@ fn separate_package_direct_imported_pure_call_is_admitted() { #[test] fn lowerer_same_package_imported_pure_call_is_not_claimed_by_source_prefix() { - lower(imported_call_request(true, false)).expect("exact source membership permits disjoint imported helper"); + lower(imported_call_request(true, false)) + .expect("exact source membership permits disjoint imported helper"); } #[test] @@ -185,6 +300,9 @@ fn verifier_same_package_imported_pure_call_is_not_claimed_by_source_prefix() { fn an_unknown_qualified_pure_call_remains_rejected_by_both_judgments() { let source = imported_call_request(true, true); let refusal = lower(source.clone()).expect_err("unknown imported coordinate is not authority"); - assert_eq!(refusal.kind, echo_edict_provider_lowerer::ProviderRefusalKind::UnsupportedSemantics); + assert_eq!( + refusal.kind, + echo_edict_provider_lowerer::ProviderRefusalKind::UnsupportedSemantics + ); assert_rejected(independently_rebound_request(source)); } diff --git a/docs/architecture/application-contract-hosting.md b/docs/architecture/application-contract-hosting.md index 03daee324..32c3ce1f0 100644 --- a/docs/architecture/application-contract-hosting.md +++ b/docs/architecture/application-contract-hosting.md @@ -265,6 +265,9 @@ both authenticated imported pure-function and effect exports, including unused source definitions. Reserving an effect name does not permit calling it from a pure helper. Imported functions cannot refer back to source-owned functions. The imported subset remains zero-argument bodies without local bindings. +Source-call ownership requires exact membership in `Core.functions`. Disjoint +imported pure functions remain callable when they share the source package's +coordinate prefix. Each call evaluates every argument once, from left to right in the caller's frame, including unused arguments. Validated argument values move into a fresh From 74bc0ec9d5ac4fb64b76ddd9002d6bb9e113dce9 Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 5 Oct 2026 03:55:17 -0700 Subject: [PATCH 08/23] test: retain nominal identities in source function signatures --- .../tests/source_functions/mod.rs | 2 + .../tests/source_functions/nominal_types.rs | 140 ++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 crates/echo-edict-provider-verifier/tests/source_functions/nominal_types.rs diff --git a/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs b/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs index 71155e80d..4666d4817 100644 --- a/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs +++ b/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs @@ -735,3 +735,5 @@ fn source_functions_pure_basis_has_complete_input_only_call_authority() { } } } + +mod nominal_types; diff --git a/crates/echo-edict-provider-verifier/tests/source_functions/nominal_types.rs b/crates/echo-edict-provider-verifier/tests/source_functions/nominal_types.rs new file mode 100644 index 000000000..9dd46be81 --- /dev/null +++ b/crates/echo-edict-provider-verifier/tests/source_functions/nominal_types.rs @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +//! Synthetic Core extensions, not public compiler acceptance evidence. +//! The retained source and imported authority remain unchanged. The independent +//! carrier helper rebinds changed Core/Target/package identities without lowering. +use super::*; + +fn add_nominal_types(core: &mut CanonicalValueV1) { + for name in ["A", "B"] { + // Exact bare keys and matching contracts avoid the separate qualified-key + // lookup question. Equal U64 representation does not equate A with B. + add_field( + map_field_mut(core, "types"), + name, + map([ + ("kind", text("Nominal")), + ("contract", text(name)), + ("representation", text("U64")), + ]), + ); + } +} + +fn return_fixture(result_type: &str) -> (FixtureNames<'static>, RawFixture, Vec) { + edited_fixture(|core, _| { + add_nominal_types(core); + let parameter = local("arg.0", "A"); + add_field( + core, + "functions", + map([( + "unusedIdentity", + function( + vec![parameter.clone()], + result_type, + vec![], + vec![], + reference(¶meter), + ), + )]), + ); + }) +} + +fn argument_fixture(parameter_type: &str) -> (FixtureNames<'static>, RawFixture, Vec) { + edited_fixture(|core, _| { + add_nominal_types(core); + let coordinate = text_field(core, "coordinate").expect("coordinate"); + let call_name = format!("{coordinate}.constant"); + let argument = local("arg.0", "A"); + add_field( + core, + "functions", + map([ + ( + "constant", + function( + vec![local("arg.0", parameter_type)], + "U64", + vec![], + vec![], + literal("U64", 0), + ), + ), + ( + "unusedCaller", + function( + vec![argument.clone()], + "U64", + vec![], + vec![], + call(&call_name, vec![reference(&argument)]), + ), + ), + ]), + ); + }) +} + +fn assert_admitted((names, fixture, package): (FixtureNames<'_>, RawFixture, Vec)) { + let lowered = lowerer::lower(lowering_request(names, &fixture)) + .expect("same-nominal source signature is valid"); + assert_eq!( + lowered.outputs[0].artifact.bytes, package, + "independently rebound package matches actual lowering" + ); + assert!( + verifier_accepts(names, &fixture, package), + "independent verifier admits the same-nominal control" + ); +} + +#[test] +fn unused_same_nominal_return_is_admitted() { + assert_admitted(return_fixture("A")); +} + +#[test] +fn lowerer_rejects_distinct_nominal_return_with_identical_representation() { + // Only the unused helper's return declaration differs from the valid A -> A. + let (names, fixture, _) = return_fixture("B"); + assert!( + lowerer::lower(lowering_request(names, &fixture)).is_err(), + "U64 representation must not authorize returning A as distinct nominal B" + ); +} + +#[test] +fn verifier_independently_rejects_distinct_nominal_return_with_identical_representation() { + let (names, fixture, package) = return_fixture("B"); + assert!( + !verifier_accepts(names, &fixture, package), + "coherent carriers must not authorize returning A as distinct nominal B" + ); +} + +#[test] +fn unused_same_nominal_call_argument_is_admitted() { + assert_admitted(argument_fixture("A")); +} + +#[test] +fn lowerer_rejects_distinct_nominal_call_argument_with_identical_representation() { + // Both helpers still return a valid U64. Only the callee's parameter type + // changes; its literal body is valid for either signature. The caller has A. + let (names, fixture, _) = argument_fixture("B"); + assert!( + lowerer::lower(lowering_request(names, &fixture)).is_err(), + "U64 representation must not authorize passing A to a parameter of nominal B" + ); +} + +#[test] +fn verifier_independently_rejects_distinct_nominal_call_argument_with_identical_representation() { + let (names, fixture, package) = argument_fixture("B"); + assert!( + !verifier_accepts(names, &fixture, package), + "coherent carriers must not authorize passing A to a parameter of nominal B" + ); +} From 20e380e1460caf6339f97b97040c3eb9820084a0 Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 5 Oct 2026 04:06:23 -0700 Subject: [PATCH 09/23] fix: preserve nominal authority in source function validation --- CHANGELOG.md | 5 +- .../executable_operation/source_functions.rs | 41 +++++-- .../executable_operation/source_functions.rs | 18 +++- .../source_functions/types.rs | 36 +++++-- .../tests/source_functions/mod.rs | 25 ++++- .../tests/source_functions/nominal_types.rs | 101 +++++++++++++++++- .../application-contract-hosting.md | 20 +++- 7 files changed, 217 insertions(+), 29 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7e821ef3..43138fb4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -96,7 +96,10 @@ totality, combined runtime depth, and conservative whole-operation costs. Providers and runtime reject source functions that shadow authenticated imported effects, including otherwise valid unused definitions. Bounded-read - call lookup admits disjoint imported pure functions in the same package. + call lookup distinguishes source and imported functions by exact membership, + including disjoint names under one package prefix. + Independent provider checks retain nominal type identity for source-function + compatibility while deriving runtime costs from the underlying representation. - Bounded pure evaluation supports generic `core.bytes.concat` with independent operand byte bounds, checked maximum composition, and combined-byte work and diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs b/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs index 414bfbd59..04ffa7a96 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs @@ -14,6 +14,15 @@ enum Ty { Word(u64), Bytes(u64, u64), Record(BTreeMap), + Nominal(String, Box), +} +impl Ty { + fn representation(&self) -> &Self { + match self { + Self::Nominal(_, representation) => representation.representation(), + _ => self, + } + } } #[derive(Clone, Copy, Default)] struct Cost { @@ -190,12 +199,18 @@ impl Judgment<'_> { return Err(()); } let prefix = format!("{}.", string(get(self.core, "coordinate")?)?); - let definition = get( - get(self.core, "types")?, - name.strip_prefix(&prefix).unwrap_or(name), - )?; + let key = name.strip_prefix(&prefix).unwrap_or(name); + let definition = get(get(self.core, "types")?, key)?; match string(get(definition, "kind")?)? { - "Nominal" => self.ty(string(get(definition, "representation")?)?, depth + 1), + "Nominal" => { + if string(get(definition, "contract")?)? != key { + return Err(()); + } + Ok(Ty::Nominal( + key.to_owned(), + Box::new(self.ty(string(get(definition, "representation")?)?, depth + 1)?), + )) + } "Bytes" => { let min = super::map_field(definition, "min") .map(number) @@ -517,7 +532,15 @@ impl Judgment<'_> { } let left = self.expression(get(value, "left")?, scope, source, prefix + 1)?; let right = self.expression(get(value, "right")?, scope, source, prefix + 1)?; - let extra = match (string(get(value, "op")?)?, &left.ty, &right.ty) { + match (&left.ty, &right.ty) { + (Ty::Nominal(..), _) | (_, Ty::Nominal(..)) if left.ty != right.ty => return Err(()), + _ => {} + } + let extra = match ( + string(get(value, "op")?)?, + left.ty.representation(), + right.ty.representation(), + ) { ("==", Ty::Bytes(_, a), Ty::Bytes(_, b)) => (*a).max(*b), ("==" | "<=", Ty::Word(a), Ty::Word(b)) if a == b => 0, _ => return Err(()), @@ -598,8 +621,8 @@ impl Judgment<'_> { "effect" if read => { cost = cost.plus(self.expression(get(node, "input")?, &scope, true, 0)?.cost)?; - let Ty::Bytes(_, max) = self.declaration(get(node, "binding")?, &mut scope)? - else { + let declared = self.declaration(get(node, "binding")?, &mut scope)?; + let Ty::Bytes(_, max) = declared.representation() else { return Err(()); }; cost = cost.plus(Cost { @@ -641,6 +664,8 @@ impl Judgment<'_> { } fn shape(ty: &Ty) -> Check<(Cost, u64, u64, usize)> { match ty { + // Nominal identity is static authority, not an extra runtime value cell. + Ty::Nominal(_, representation) => shape(representation), Ty::Word(_) => Ok(( Cost { steps: 1, diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs index 037cb19df..540cd1cbd 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs @@ -460,7 +460,17 @@ impl Checker<'_, '_> { let right = self.expression(get(predicate, "right")?, frame, depth + 1)?; let mut charge = left.charge; charge.append(right.charge)?; - let compare = match (string(get(predicate, "op")?)?, &left.schema, &right.schema) { + if (matches!(left.schema, Schema::Nominal { .. }) + || matches!(right.schema, Schema::Nominal { .. })) + && left.schema != right.schema + { + return Err(()); + } + let compare = match ( + string(get(predicate, "op")?)?, + left.schema.representation(), + right.schema.representation(), + ) { ("==", Schema::Blob { high: a, .. }, Schema::Blob { high: b, .. }) => { u128::from((*a).max(*b)) } @@ -533,12 +543,12 @@ impl Checker<'_, '_> { charge.append(self.expression(get(node, "input")?, &frame, 0)?.charge)?; let local = get(node, "binding")?; let expected = self.types.local(local)?; - let Schema::Blob { high, .. } = expected else { + let Schema::Blob { high, .. } = expected.representation() else { return Err(()); }; charge.append(Charge { - ticks: u128::from(high) + 1, - storage: u128::from(high) + 64, + ticks: u128::from(*high) + 1, + storage: u128::from(*high) + 64, })?; frame.define(local, expected)?; } diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs index a770d0c1f..87b324b5c 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs @@ -8,8 +8,15 @@ use std::collections::BTreeMap; #[derive(Clone, PartialEq, Eq)] pub(super) enum Schema { Word(u64), - Blob { low: u64, high: u64 }, + Blob { + low: u64, + high: u64, + }, Fields(BTreeMap), + Nominal { + identity: String, + representation: Box, + }, } #[derive(Clone, Copy, Default)] pub(super) struct Charge { @@ -40,6 +47,12 @@ pub(super) struct Size { pub height: usize, } impl Schema { + pub(super) fn representation(&self) -> &Self { + match self { + Self::Nominal { representation, .. } => representation.representation(), + _ => self, + } + } pub(super) fn encloses(&self, other: &Self) -> bool { match (self, other) { (Self::Blob { low, high }, Self::Blob { low: a, high: b }) => low <= a && b <= high, @@ -72,6 +85,8 @@ impl Schema { height: 0, }; match self { + // Nominal types retain identity without adding physical value tags. + Self::Nominal { representation, .. } => return representation.measure(), Self::Word(_) => {} Self::Blob { high, .. } => { size.copy.storage += u128::from(*high); @@ -172,12 +187,21 @@ impl<'a> Types<'a> { return Err(()); } let prefix = format!("{}.", string(get(self.module, "coordinate")?)?); - let definition = get( - get(self.module, "types")?, - name.strip_prefix(&prefix).unwrap_or(name), - )?; + let resolved = name.strip_prefix(&prefix).unwrap_or(name); + let definition = get(get(self.module, "types")?, resolved)?; match string(get(definition, "kind")?)? { - "Nominal" => self.resolve(string(get(definition, "representation")?)?, depth + 1), + "Nominal" => { + let identity = string(get(definition, "contract")?)?; + if identity != resolved { + return Err(()); + } + let representation = + self.resolve(string(get(definition, "representation")?)?, depth + 1)?; + Ok(Schema::Nominal { + identity: identity.to_owned(), + representation: Box::new(representation), + }) + } "Bytes" => { let high = unsigned(get(definition, "max")?)?; let low = super::super::map_field(definition, "min") diff --git a/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs b/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs index 4666d4817..205200c34 100644 --- a/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs +++ b/crates/echo-edict-provider-verifier/tests/source_functions/mod.rs @@ -688,18 +688,33 @@ fn source_functions_pure_input_identity_does_not_depend_on_declaration_inventory #[test] fn source_functions_pure_basis_has_complete_input_only_call_authority() { - for case in ["none", "valid", "null", "unknown", "arity", "capture"] { + for case in [ + "none", + "valid", + "representation", + "null", + "unknown", + "arity", + "capture", + ] { let (names, fixture, package) = called_fixture(|core, target| { let coordinate = text_field(core, "coordinate") .expect("coordinate") .to_owned(); - let parameter = local("arg.0", "Bytes"); + // The retained basis is input.basisHeadId: nominal HeadId, not its + // structural byte representation. Keep the old signature as refusal. + let parameter_type = if case == "representation" { + "Bytes" + } else { + "jedit.text@1.HeadId" + }; + let parameter = local("arg.0", parameter_type); add_field( map_field_mut(core, "functions"), "basisValue", function( vec![parameter.clone()], - "Bytes", + parameter_type, vec![], vec![], reference(¶meter), @@ -708,7 +723,9 @@ fn source_functions_pure_basis_has_complete_input_only_call_authority() { let original = map_field(intent(core), "basis").clone(); let expression = match case { "none" | "null" => CanonicalValueV1::Null, - "valid" => call(&format!("{coordinate}.basisValue"), vec![original]), + "valid" | "representation" => { + call(&format!("{coordinate}.basisValue"), vec![original]) + } "unknown" => call(&format!("{coordinate}.missing"), vec![]), "arity" => call(&format!("{coordinate}.basisValue"), vec![]), "capture" => reference(&local("local.0", "U64")), diff --git a/crates/echo-edict-provider-verifier/tests/source_functions/nominal_types.rs b/crates/echo-edict-provider-verifier/tests/source_functions/nominal_types.rs index 9dd46be81..bdf2330cc 100644 --- a/crates/echo-edict-provider-verifier/tests/source_functions/nominal_types.rs +++ b/crates/echo-edict-provider-verifier/tests/source_functions/nominal_types.rs @@ -22,9 +22,16 @@ fn add_nominal_types(core: &mut CanonicalValueV1) { } fn return_fixture(result_type: &str) -> (FixtureNames<'static>, RawFixture, Vec) { + typed_return_fixture("A", result_type) +} + +fn typed_return_fixture( + parameter_type: &str, + result_type: &str, +) -> (FixtureNames<'static>, RawFixture, Vec) { edited_fixture(|core, _| { add_nominal_types(core); - let parameter = local("arg.0", "A"); + let parameter = local("arg.0", parameter_type); add_field( core, "functions", @@ -138,3 +145,95 @@ fn verifier_independently_rejects_distinct_nominal_call_argument_with_identical_ "coherent carriers must not authorize passing A to a parameter of nominal B" ); } + +fn predicate_fixture( + right_type: &str, + representation: &str, + operator: &str, +) -> (FixtureNames<'static>, RawFixture, Vec) { + edited_fixture(|core, _| { + add_nominal_types(core); + for name in ["A", "B"] { + *map_field_mut( + map_field_mut(map_field_mut(core, "types"), name), + "representation", + ) = text(representation); + } + let left = local("arg.0", "A"); + let right = local("arg.1", right_type); + let predicate = map([ + ("kind", text("compare")), + ("op", text(operator)), + ("left", reference(&left)), + ("right", reference(&right)), + ]); + let result = map([ + ("kind", text("if")), + ("predicate", predicate), + ("then", literal("U32", 1)), + ("else", literal("U32", 0)), + ]); + add_field( + core, + "functions", + map([( + "unusedCompare", + function(vec![left, right], "U32", vec![], vec![], result), + )]), + ); + }) +} + +#[test] +fn same_nominal_comparisons_preserve_the_supported_representation_aperture() { + for (representation, operator) in [("U64", "=="), ("U64", "<="), ("Bytes", "==")] { + assert_admitted(predicate_fixture("A", representation, operator)); + } +} + +#[test] +fn predicates_refuse_distinct_nominal_or_bare_representation_operands() { + for representation in ["U64", "Bytes"] { + for right in ["B", representation] { + let (names, fixture, package) = predicate_fixture(right, representation, "=="); + both_refuse(names, &fixture, package, "nominal comparison authority"); + } + } +} + +#[test] +fn nominal_and_bare_representation_are_not_interchangeable_return_types() { + for (parameter, result) in [("A", "U64"), ("U64", "A")] { + let (names, fixture, package) = typed_return_fixture(parameter, result); + both_refuse( + names, + &fixture, + package, + "nominal is not its representation", + ); + } +} + +#[test] +fn nominal_contract_must_match_the_resolved_type_table_key() { + let (names, fixture, package) = edited_fixture(|core, _| { + add_nominal_types(core); + *map_field_mut(map_field_mut(map_field_mut(core, "types"), "A"), "contract") = text("B"); + let parameter = local("arg.0", "A"); + add_field( + core, + "functions", + map([( + "unusedIdentity", + function( + vec![parameter.clone()], + "A", + vec![], + vec![], + reference(¶meter), + ), + )]), + ); + }); + both_refuse(names, &fixture, package, "nominal contract authority"); +} diff --git a/docs/architecture/application-contract-hosting.md b/docs/architecture/application-contract-hosting.md index 32c3ce1f0..3f012c5d6 100644 --- a/docs/architecture/application-contract-hosting.md +++ b/docs/architecture/application-contract-hosting.md @@ -265,9 +265,12 @@ both authenticated imported pure-function and effect exports, including unused source definitions. Reserving an effect name does not permit calling it from a pure helper. Imported functions cannot refer back to source-owned functions. The imported subset remains zero-argument bodies without local bindings. -Source-call ownership requires exact membership in `Core.functions`. Disjoint -imported pure functions remain callable when they share the source package's -coordinate prefix. +Source-call ownership requires exact membership in `Core.functions`. A shared +package prefix alone does not make an imported pure function source-owned. +Calls must also satisfy the type-resolution aperture: same-prefix named types +currently resolve through module-relative `Core.types` keys; fully qualified +imported type keys under that prefix remain a provider/runtime compatibility +limitation. Each call evaluates every argument once, from left to right in the caller's frame, including unused arguments. Validated argument values move into a fresh @@ -288,8 +291,15 @@ executes and charges its basis expression as part of the operation. This is a target-profile distinction, not permission to retain malformed basis authority. The source-function target subset supports unsigned words, bounded bytes, -records and nominal representations, with U32/U64 integer literals. Boolean, -string, list, variant and effectful helper forms receive provider refusal. +records and nominal types, with U32/U64 integer literals. Provider compatibility +retains each nominal type's contract identity, which must match its resolved +Core type-table key. Equal representations do not permit assignment, arguments, +returns or comparisons across distinct nominal identities, or between a nominal +type and its representation. Same-nominal byte and unsigned-word comparisons +use the ordinary representation costs. Runtime values carry no additional +nominal tag; materialization, validation and encoding bounds remain based on +the representation. Boolean, string, list, variant and effectful helper forms +receive provider refusal. For modules containing source functions, partial subtraction and slicing need literal evidence sufficient for totality: ordered unsigned operands, or ordered U64 slice offsets within the operand's guaranteed minimum length. Caller From 7a0986007a2596891f1c3626bc49efe7c1397c8a Mon Sep 17 00:00:00 2001 From: James Ross Date: Mon, 5 Oct 2026 04:17:10 -0700 Subject: [PATCH 10/23] docs: distinguish frozen host and current compiler witnesses --- docs/architecture/application-contract-hosting.md | 2 +- schemas/edict-provider/README.md | 5 +++-- .../contracts/source-functions-v1/README.md | 12 +++++++++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/architecture/application-contract-hosting.md b/docs/architecture/application-contract-hosting.md index 3f012c5d6..4cfedf8fe 100644 --- a/docs/architecture/application-contract-hosting.md +++ b/docs/architecture/application-contract-hosting.md @@ -594,7 +594,7 @@ directory capabilities and reports drift without repair. This distribution copy is a release occurrence, not a second semantic authority. Native readiness is a later, independent crossing pinned to Edict revision -`c75c3f550d049485ba00eae0dc272c6dd6aca11f`. The exact manifest constructs the +`2e3f52f9e6d615f96eb594a40126e223a9253d98`. The exact manifest constructs the immutable schema registry; all five canonical primaries and 14 generated resources validate under their owning roots; every lawpack/target-profile field is bound to the expected coordinate and independently recomputed domain-framed diff --git a/schemas/edict-provider/README.md b/schemas/edict-provider/README.md index 59c6938ef..538231879 100644 --- a/schemas/edict-provider/README.md +++ b/schemas/edict-provider/README.md @@ -330,8 +330,9 @@ writes only the two exact components, those generated members, and the derived manifest. Run `echo-edict-provider-package --check` to report drift without creating, deleting, or rewriting package files. -The isolated Edict c75 host gate then consumes that exact checked package. It -constructs all 24 native schema bindings, validates the five canonical primaries +The isolated legacy Edict host gate pins revision +`2e3f52f9e6d615f96eb594a40126e223a9253d98` and consumes that exact checked package. +It constructs all 31 native schema bindings, validates the five canonical primaries and 14 generated resources, proves every owner field names the expected exact resource digest, prepares both components, and obtains both opaque request proofs without guest invocation. Schema-valid resource substitution, reference diff --git a/schemas/edict-provider/contracts/source-functions-v1/README.md b/schemas/edict-provider/contracts/source-functions-v1/README.md index 79822c0c7..434d5d9c9 100644 --- a/schemas/edict-provider/contracts/source-functions-v1/README.md +++ b/schemas/edict-provider/contracts/source-functions-v1/README.md @@ -6,7 +6,9 @@ This complete Apache-2.0 contract pair was copied from Edict commit [`acd71fce03d2b5fc6d78c2a92ca922a45da6bac2`](https://github.com/flyingrobots/edict/commit/acd71fce03d2b5fc6d78c2a92ca922a45da6bac2), under `fixtures/provider-contracts/source-functions-v1/`, for -[Edict #226](https://github.com/flyingrobots/edict/issues/226). +[Edict #226](https://github.com/flyingrobots/edict/issues/226). The pair is byte-identical at the +merged compiler revision +[`01161c1745baad0d713234ba1a671b9a26923aa4`](https://github.com/flyingrobots/edict/commit/01161c1745baad0d713234ba1a671b9a26923aa4). The CDDL contains 34,460 bytes with SHA-256 `e484eabd615584a38cb57454b52747786f2314c135c13f99da6f6bae619a709f`. @@ -37,6 +39,14 @@ exact authenticated Core, separately from imported lawpack authority. Runtime support and limits belong to the [application contract hosting contract](../../../../docs/architecture/application-contract-hosting.md). +The isolated `tests/edict-provider-host-v1` suite retains its frozen +`2e3f52f9e6d615f96eb594a40126e223a9253d98` compiler/host and exact compatibility +corpus. Source-function consumer checks use the separately pinned public +compiler, whose application build invokes both provider components through its +actual host. Record that compiler revision and the exact emitted package/report +bytes for runtime checks. Preserve the frozen suite's broader refusal and replay +checks when refreshing the provider components. + ## Explicit candidate generation The [candidate generator](../../../../crates/echo-wesley-gen/examples/source_functions_publication_witness.rs) From 024e844be52dd42fe27c65399672d32e111de982 Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 21:11:57 -0700 Subject: [PATCH 11/23] Fix imported helper audits without source function declarations --- .../executable_operation/source_functions.rs | 55 +++++++++++++++++-- .../executable_operation/source_functions.rs | 55 +++++++++++++++++-- 2 files changed, 100 insertions(+), 10 deletions(-) diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs b/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs index 04ffa7a96..9fc2d21ca 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs @@ -66,15 +66,16 @@ struct Judgment<'a> { } pub(super) fn validate(core: &Value, exports: &Value, read: bool) -> Result<(), ProviderRefusalV1> { - if super::map_field(core, "functions").is_none() { - return Ok(()); - } run(core, exports, read) .map_err(|()| super::super::unsupported_semantics("core.source-functions")) } fn run(core: &Value, exports: &Value, read: bool) -> Check<()> { let mut functions = BTreeMap::new(); - for item in list(get(exports, "pureFunctions")?)? { + let imported_functions = super::map_field(exports, "pureFunctions") + .map(list) + .transpose()? + .unwrap_or(&[]); + for item in imported_functions { if string(get(item, "source")?)? != "edict" { return Err(()); } @@ -114,7 +115,11 @@ fn run(core: &Value, exports: &Value, read: bool) -> Check<()> { .iter() .map(|effect| string(get(effect, "coordinate")?)) .collect::>>()?; - for (name, function) in members(get(core, "functions")?)? { + let source_functions = super::map_field(core, "functions") + .map(members) + .transpose()? + .unwrap_or(&[]); + for (name, function) in source_functions { let name = string(name)?; if !identifier(name) || super::map_field(get(core, "intents")?, name).is_some() @@ -151,6 +156,9 @@ fn run(core: &Value, exports: &Value, read: bool) -> Check<()> { for name in proof.functions.keys().cloned().collect::>() { proof.function(&name, 1)?; } + if super::map_field(core, "functions").is_none() { + return Ok(()); + } for (_, intent) in members(get(core, "intents")?)? { proof.intent(intent, read)?; } @@ -792,3 +800,40 @@ fn exact(value: &Value, names: &[&str]) -> Check<()> { } Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + + fn map(fields: impl IntoIterator) -> Value { + Value::Map( + fields + .into_iter() + .map(|(key, value)| (Value::Text(key.into()), value)) + .collect(), + ) + } + + #[test] + fn imported_inventory_is_audited_without_source_functions() { + let core = map([("types", map([])), ("intents", map([]))]); + let exports = map([ + ("effects", Value::Array(vec![])), + ( + "pureFunctions", + Value::Array(vec![map([("source", Value::Text("component".into()))])]), + ), + ]); + assert!(validate(&core, &exports, true).is_err()); + } + + #[test] + fn empty_inventory_without_source_functions_is_valid() { + let core = map([("types", map([])), ("intents", map([]))]); + let exports = map([ + ("effects", Value::Array(vec![])), + ("pureFunctions", Value::Array(vec![])), + ]); + assert!(validate(&core, &exports, true).is_ok()); + } +} diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs index 540cd1cbd..473c76ba4 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs @@ -66,9 +66,6 @@ impl<'a> Frame<'a> { } pub(super) fn validate(core: &Value, exports: &Value, read: bool) -> Result<(), ProviderRefusalV1> { - if super::map_field(core, "functions").is_none() { - return Ok(()); - } audit(core, exports, read) .map_err(|()| super::super::unsupported_semantics("core.source-functions-verification")) } @@ -168,6 +165,9 @@ fn audit(core: &Value, exports: &Value, read: bool) -> Check<()> { definitions: &definitions, summaries: &summaries, }; + if super::map_field(core, "functions").is_none() { + return Ok(()); + } for (_, intent) in members(get(core, "intents")?)? { checker.intent(intent, read)?; } @@ -179,7 +179,11 @@ fn inventory<'a>( types: &mut Types<'_>, ) -> Check>> { let mut definitions = BTreeMap::new(); - for export in sequence(get(exports, "pureFunctions")?)? { + let imported_functions = super::map_field(exports, "pureFunctions") + .map(sequence) + .transpose()? + .unwrap_or(&[]); + for export in imported_functions { if string(get(export, "source")?)? != "edict" { return Err(()); } @@ -221,7 +225,11 @@ fn inventory<'a>( .iter() .map(|effect| string(get(effect, "coordinate")?)) .collect::>>()?; - for (name, definition) in members(get(core, "functions")?)? { + let source_functions = super::map_field(core, "functions") + .map(members) + .transpose()? + .unwrap_or(&[]); + for (name, definition) in source_functions { types.step(0)?; let name = string(name)?; if !name.bytes().enumerate().all(|(index, byte)| { @@ -705,3 +713,40 @@ fn exact(value: &Value, fields: &[&str]) -> Check<()> { } Ok(()) } + +#[cfg(test)] +mod tests { + use super::*; + + fn map(fields: impl IntoIterator) -> Value { + Value::Map( + fields + .into_iter() + .map(|(key, value)| (Value::Text(key.into()), value)) + .collect(), + ) + } + + #[test] + fn imported_inventory_is_audited_without_source_functions() { + let core = map([("types", map([])), ("intents", map([]))]); + let exports = map([ + ("effects", Value::Array(vec![])), + ( + "pureFunctions", + Value::Array(vec![map([("source", Value::Text("component".into()))])]), + ), + ]); + assert!(validate(&core, &exports, true).is_err()); + } + + #[test] + fn empty_inventory_without_source_functions_is_valid() { + let core = map([("types", map([])), ("intents", map([]))]); + let exports = map([ + ("effects", Value::Array(vec![])), + ("pureFunctions", Value::Array(vec![])), + ]); + assert!(validate(&core, &exports, true).is_ok()); + } +} From 382bc73728b9edc6b1766d89af24cc5cffbe0757 Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 21:19:40 -0700 Subject: [PATCH 12/23] Fix bounded-read nominal identity without source declarations --- .../bounded_read/relation.rs | 6 +- .../bounded_read/relation/types.rs | 67 ++++++++++++- .../bounded_read/audit.rs | 6 +- .../bounded_read/audit/types.rs | 95 ++++++++++++++++--- .../application-contract-hosting.md | 2 +- 5 files changed, 155 insertions(+), 21 deletions(-) diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation.rs b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation.rs index d79573b82..a827b7e34 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation.rs @@ -90,7 +90,11 @@ impl ReadRelation<'_> { array(body, "locals")?, text(intent, "input")?, )?; - if scope.expression(field(intent, "basis")?, 0)? != ReadType::Bytes(32, 32) { + if scope + .expression(field(intent, "basis")?, 0)? + .representation() + != &ReadType::Bytes(32, 32) + { return Err(invalid()); } for constraint in array(intent, "inputConstraints")? { diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs index f872d13da..f6249a072 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation/bounded_read/relation/types.rs @@ -14,17 +14,27 @@ pub(super) enum ReadType { Bytes(u64, u64), Unsigned(u64), Record(BTreeMap), + Nominal(String, Box), } impl ReadType { + pub(super) fn representation(&self) -> &Self { + match self { + Self::Nominal(_, inner) => inner.representation(), + _ => self, + } + } + pub(super) fn is_address(&self) -> bool { let Self::Record(fields) = self else { return false; }; fields.len() == 3 - && ["nodeId", "typeId", "warpId"] - .iter() - .all(|key| fields.get(*key) == Some(&Self::Bytes(32, 32))) + && ["nodeId", "typeId", "warpId"].iter().all(|key| { + fields + .get(*key) + .is_some_and(|ty| ty.representation() == &Self::Bytes(32, 32)) + }) } fn accepts(&self, actual: &Self) -> bool { @@ -153,7 +163,15 @@ impl<'a> Scope<'a> { Ok(ReadType::Bytes(min, max)) } "Int" => self.resolve(text(value, "width")?, depth + 1), - "Nominal" => self.resolve(text(value, "representation")?, depth + 1), + "Nominal" => { + if text(value, "contract")? != key { + return Err(invalid()); + } + Ok(ReadType::Nominal( + key.to_owned(), + Box::new(self.resolve(text(value, "representation")?, depth + 1)?), + )) + } "Record" => { let fields = entries(field(value, "fields")?)? .iter() @@ -360,7 +378,16 @@ impl<'a> Scope<'a> { } let left = self.expression(field(value, "left")?, depth + 1)?; let right = self.expression(field(value, "right")?, depth + 1)?; - match (text(value, "op")?, left, right) { + if (matches!(left, ReadType::Nominal(..)) || matches!(right, ReadType::Nominal(..))) + && left != right + { + return Err(invalid()); + } + match ( + text(value, "op")?, + left.representation(), + right.representation(), + ) { ("==", ReadType::Bytes(_, _), ReadType::Bytes(_, _)) => Ok(()), ("==" | "<=", ReadType::Unsigned(left), ReadType::Unsigned(right)) if left == right => { Ok(()) @@ -412,6 +439,36 @@ mod tests { ) } + #[test] + fn distinct_nominals_without_source_functions_do_not_convert() -> Result<(), ProviderRefusalV1> + { + let nominal = |contract: &str| { + map([ + ("kind", Value::Text("Nominal".into())), + ("contract", Value::Text(contract.into())), + ("representation", Value::Text("U64".into())), + ]) + }; + let core = map([ + ("coordinate", Value::Text("example@1".into())), + ("types", map([("A", nominal("A")), ("B", nominal("B"))])), + ]); + let scope = Scope { + core: &core, + exports: &core, + inventory: BTreeMap::new(), + available: BTreeMap::new(), + used: BTreeSet::new(), + input: &core, + remaining_type_work: Cell::new(65_536), + }; + let a = scope.ty("A")?; + assert!(scope.ty("example@1.A")?.accepts(&a)); + assert!(!scope.ty("B")?.accepts(&a)); + assert!(!scope.ty("U64")?.accepts(&a)); + Ok(()) + } + #[test] fn named_types_starting_with_u_are_not_unsigned_widths() { let core = map([ diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit.rs b/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit.rs index a33ce5148..d40c09999 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit.rs @@ -158,8 +158,10 @@ pub(super) fn check(e: &Evidence<'_>) -> Check<()> { sequence(body, "locals")?, text(intent, "input")?, )?; - if symbols.expression(get(target, "basis")?, 0)? - != (Schema::Bytes { + if symbols + .expression(get(target, "basis")?, 0)? + .representation() + != &(Schema::Bytes { lower: 32, upper: 32, }) diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs b/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs index ab94f6df0..1de0a2bfa 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation/bounded_read/audit/types.rs @@ -7,23 +7,39 @@ use std::collections::{BTreeMap, BTreeSet}; #[derive(Clone, PartialEq, Eq)] pub(super) enum Schema { - Bytes { lower: u64, upper: u64 }, + Bytes { + lower: u64, + upper: u64, + }, Word(u64), Row(BTreeMap), + Nominal { + identity: String, + storage: Box, + }, } impl Schema { + pub(super) fn representation(&self) -> &Self { + match self { + Self::Nominal { storage, .. } => storage.representation(), + _ => self, + } + } + pub(super) fn address(&self) -> bool { let Self::Row(fields) = self else { return false; }; fields.len() == 3 && ["nodeId", "warpId", "typeId"].iter().all(|key| { - fields.get(*key) - == Some(&Self::Bytes { - lower: 32, - upper: 32, - }) + fields.get(*key).is_some_and(|ty| { + ty.representation() + == &Self::Bytes { + lower: 32, + upper: 32, + } + }) }) } fn includes(&self, actual: &Self) -> bool { @@ -135,10 +151,8 @@ impl<'a> Symbols<'a> { return Err(()); } let prefix = format!("{}.", text(self.core, "coordinate")?); - let value = get( - get(self.core, "types")?, - name.strip_prefix(&prefix).unwrap_or(name), - )?; + let key = name.strip_prefix(&prefix).unwrap_or(name); + let value = get(get(self.core, "types")?, key)?; match text(value, "kind")? { "Bytes" => { let upper = number(get(value, "max")?)?; @@ -152,7 +166,15 @@ impl<'a> Symbols<'a> { Ok(Schema::Bytes { lower, upper }) } "Int" => self.schema(text(value, "width")?, depth + 1), - "Nominal" => self.schema(text(value, "representation")?, depth + 1), + "Nominal" => { + if text(value, "contract")? != key { + return Err(()); + } + Ok(Schema::Nominal { + identity: key.to_owned(), + storage: Box::new(self.schema(text(value, "representation")?, depth + 1)?), + }) + } "Record" => { let mut fields = BTreeMap::new(); for (key, value) in members(get(value, "fields")?)? { @@ -342,7 +364,16 @@ impl<'a> Symbols<'a> { } let left = self.expression(get(value, "left")?, depth + 1)?; let right = self.expression(get(value, "right")?, depth + 1)?; - match (text(value, "op")?, left, right) { + if (matches!(left, Schema::Nominal { .. }) || matches!(right, Schema::Nominal { .. })) + && left != right + { + return Err(()); + } + match ( + text(value, "op")?, + left.representation(), + right.representation(), + ) { ("==", Schema::Bytes { .. }, Schema::Bytes { .. }) => Ok(()), ("==" | "<=", Schema::Word(a), Schema::Word(b)) if a == b => Ok(()), _ => Err(()), @@ -365,3 +396,43 @@ fn decimal(value: &str) -> Check { } Ok(number) } + +#[cfg(test)] +mod tests { + use super::*; + fn map(fields: impl IntoIterator) -> Value { + Value::Map( + fields + .into_iter() + .map(|(key, value)| (Value::Text(key.into()), value)) + .collect(), + ) + } + #[test] + fn distinct_nominals_without_source_functions_do_not_convert() -> Check<()> { + let nominal = |contract: &str| { + map([ + ("kind", Value::Text("Nominal".into())), + ("contract", Value::Text(contract.into())), + ("representation", Value::Text("U64".into())), + ]) + }; + let core = map([ + ("coordinate", Value::Text("example@1".into())), + ("types", map([("A", nominal("A")), ("B", nominal("B"))])), + ]); + let mut symbols = Symbols { + core: &core, + exports: &core, + declared: BTreeMap::new(), + live: BTreeSet::new(), + claimed: BTreeSet::new(), + work: 65_536, + }; + let a = symbols.schema("A", 0)?; + assert!(symbols.schema("example@1.A", 0)?.includes(&a)); + assert!(!symbols.schema("B", 0)?.includes(&a)); + assert!(!symbols.schema("U64", 0)?.includes(&a)); + Ok(()) + } +} diff --git a/docs/architecture/application-contract-hosting.md b/docs/architecture/application-contract-hosting.md index 7f979d42e..24f5520b4 100644 --- a/docs/architecture/application-contract-hosting.md +++ b/docs/architecture/application-contract-hosting.md @@ -302,7 +302,7 @@ returns or comparisons across distinct nominal identities, or between a nominal type and its representation. Same-nominal byte and unsigned-word comparisons use the ordinary representation costs. Runtime values carry no additional nominal tag; materialization, validation and encoding bounds remain based on -the representation. Boolean, string, list, variant and effectful helper forms +the representation. Both bounded-read provider judgments preserve nominal identity even when the optional source-function table is absent; basis and address roles inspect physical representation only at their explicit role checks. Boolean, string, list, variant and effectful helper forms receive provider refusal. For modules containing source functions, partial subtraction and slicing need literal evidence sufficient for totality: ordered unsigned operands, or ordered From e99d2198081191f3cc115eb064999c55b040c71d Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 21:21:12 -0700 Subject: [PATCH 13/23] Fix public compilation repeatability witness output isolation --- .../source-functions-publication.py | 1 + .../source_functions_publication_test.py | 63 +++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 scripts/tests/source_functions_publication_test.py diff --git a/scripts/consumer-witnesses/source-functions-publication.py b/scripts/consumer-witnesses/source-functions-publication.py index 2314fba74..37d6de068 100644 --- a/scripts/consumer-witnesses/source-functions-publication.py +++ b/scripts/consumer-witnesses/source-functions-publication.py @@ -399,6 +399,7 @@ def run_variant(args, name, source, provider, *, refusal=None, read=False, provenance["refusalBoundary"] = require_budget_refusal(result) else: require_success(result) + shutil.rmtree(root / "application-output") repeated = compiler_build(args, root, "application", "repeated") provenance["repeatedBuild"] = repeated (root / "provenance.json").write_text(json.dumps(provenance, indent=2) + "\n") diff --git a/scripts/tests/source_functions_publication_test.py b/scripts/tests/source_functions_publication_test.py new file mode 100644 index 000000000..92e7bee15 --- /dev/null +++ b/scripts/tests/source_functions_publication_test.py @@ -0,0 +1,63 @@ +# SPDX-License-Identifier: Apache-2.0 +# © James Ross Ω FLYING•ROBOTS +"""Deterministic publication-witness regressions; execute only in Docker.""" +import contextlib +import importlib.util +import io +from pathlib import Path +import tempfile +from types import SimpleNamespace +import unittest +from unittest.mock import patch + +SPEC = importlib.util.spec_from_file_location( + "publication", Path(__file__).parents[1] / "consumer-witnesses/source-functions-publication.py") +publication = importlib.util.module_from_spec(SPEC) +SPEC.loader.exec_module(publication) + + +class PublicationTests(unittest.TestCase): + def repeat(self, emit_repeated): + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + provider = root / "selected-provider" + provider.mkdir() + (provider / "provider-manifest.echo.json").write_text("{}") + compiler = root / "compiler" + compiler.write_bytes(b"selected compiler") + manifest = root / "compiler-manifest" + manifest.write_text("{}") + work = root / "work" + work.mkdir() + args = SimpleNamespace(work_root=work, compiler_revision="selected", + compiler=compiler, compiler_manifest=manifest, input_manifest_sha256="selected") + + def prepare(args, destination, source, **options): + destination.mkdir() + for name in ["source.edict", "upstream-source.edict", "edict.application.json", "upstream-application.json"]: + (destination / name).write_text(source) + return {} + + def build(args, destination, document, label): + output = destination / "application-output" + if label == "first" or emit_repeated: + output.mkdir(exist_ok=True) + for name in publication.OUTPUTS: + (output / name).write_bytes(b"first build") + return {"exitCode": 0, "diagnostics": [], + "artifacts": publication.inventory(output) if output.exists() else {}} + + with patch.object(publication, "prepare_application", prepare), patch.object(publication, "compiler_build", build), contextlib.redirect_stdout(io.StringIO()): + return publication.run_variant(args, "repeat", "authored source", provider) + + def test_successful_repeat_without_outputs_cannot_reuse_first_build(self): + with self.assertRaisesRegex(RuntimeError, "did not emit exactly one package/report pair"): + self.repeat(False) + + def test_repeat_emitting_the_same_pair_is_accepted(self): + result = self.repeat(True) + self.assertEqual(result["firstBuild"]["artifacts"], result["repeatedBuild"]["artifacts"]) + + +if __name__ == "__main__": + unittest.main() From 6d96380219e53a478d15d23982d51ee69fdd1827 Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 21:24:32 -0700 Subject: [PATCH 14/23] Fix exact bounded final publication evidence accounting --- .../source-functions-publication.py | 45 ++++++++++++++++--- .../source_functions_publication_test.py | 17 +++++++ 2 files changed, 56 insertions(+), 6 deletions(-) diff --git a/scripts/consumer-witnesses/source-functions-publication.py b/scripts/consumer-witnesses/source-functions-publication.py index 37d6de068..76ecaf079 100644 --- a/scripts/consumer-witnesses/source-functions-publication.py +++ b/scripts/consumer-witnesses/source-functions-publication.py @@ -426,6 +426,38 @@ def run_variant(args, name, source, provider, *, refusal=None, read=False, return provenance +def retain_evidence(root, evidence, *, final=False): + """Preflight the exact replacement and include final report bytes in usage.""" + usage = check_work_bound(root) + destination = root / "evidence.json" + previous_bytes = destination.stat().st_size if destination.exists() else 0 + entries = usage["entries"] + (0 if destination.exists() else 1) + if final: + evidence["finalUsage"] = dict(usage, entries=entries) + for _ in range(8): + encoded = (json.dumps(evidence, indent=2) + "\n").encode("utf-8") + projected = {"bytes": usage["bytes"] - previous_bytes + len(encoded), + "entries": entries} + if final and evidence["finalUsage"] != projected: + evidence["finalUsage"] = projected + continue + if projected["bytes"] > MAX_WORK_BYTES or entries > MAX_WORK_ENTRIES: + raise RuntimeError("Final evidence exceeds the local witness ceiling") + destination.write_bytes(encoded) + measured = check_work_bound(root) + if measured != projected: + raise RuntimeError("Witness evidence usage changed during publication") + return + raise RuntimeError("Final evidence usage did not stabilize") + + +def finalize_evidence(root, evidence): + evidence["outcome"] = "public-compiler-and-provider-verifier-accepted" + evidence["runtimeExecution"] = "not-run-by-this-witness" + retain_evidence(root, evidence, final=True) + + + def main(): parser = argparse.ArgumentParser(description=__doc__) for name in ("compiler", "compiler-source", "compiler-manifest", "pure-application-source", @@ -485,7 +517,7 @@ def main(): ] for name, source, provider, options in specs: evidence["results"][name] = run_variant(args, name, source, provider, **options) - (args.work_root / "evidence.json").write_text(json.dumps(evidence, indent=2) + "\n") + retain_evidence(args.work_root, evidence) pure = evidence["results"]["pure"]["firstBuild"]["artifacts"] for name in ["renamed-pure", "changed-body"]: other = evidence["results"][name]["firstBuild"]["artifacts"] @@ -499,13 +531,14 @@ def main(): if selected_inputs(args) != original: raise RuntimeError("An authoritative input changed during the witness") verify_compiler(args) - evidence["finalUsage"] = check_work_bound(args.work_root) - evidence["outcome"] = "public-compiler-and-provider-verifier-accepted" - evidence["runtimeExecution"] = "not-run-by-this-witness" - (args.work_root / "evidence.json").write_text(json.dumps(evidence, indent=2) + "\n") + finalize_evidence(args.work_root, evidence) except BaseException as error: + evidence.pop("outcome", None) evidence["failure"] = {"type": type(error).__name__, "message": str(error)} - (args.work_root / "evidence.json").write_text(json.dumps(evidence, indent=2) + "\n") + try: + retain_evidence(args.work_root, evidence) + except RuntimeError as retention_error: + print(f"Failure report could not fit the witness bound: {retention_error}", flush=True) raise print("SOURCE_FUNCTION_PUBLIC_COMPILER_AND_VERIFIER_ACCEPTED", flush=True) diff --git a/scripts/tests/source_functions_publication_test.py b/scripts/tests/source_functions_publication_test.py index 92e7bee15..04b32128f 100644 --- a/scripts/tests/source_functions_publication_test.py +++ b/scripts/tests/source_functions_publication_test.py @@ -59,5 +59,22 @@ def test_repeat_emitting_the_same_pair_is_accepted(self): self.assertEqual(result["firstBuild"]["artifacts"], result["repeatedBuild"]["artifacts"]) + def test_final_usage_includes_final_evidence_bytes(self): + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + (root / "evidence.json").write_text("{}\n") + evidence = {"results": {}} + publication.finalize_evidence(root, evidence) + self.assertEqual(evidence["finalUsage"], publication.check_work_bound(root)) + + def test_final_evidence_cannot_finish_above_the_local_ceiling(self): + with tempfile.TemporaryDirectory() as temporary: + root = Path(temporary) + (root / "evidence.json").write_text("{}\n") + with patch.object(publication, "MAX_WORK_BYTES", 4): + with self.assertRaises(RuntimeError): + publication.finalize_evidence(root, {"results": {}}) + + if __name__ == "__main__": unittest.main() From 91c5fba22ae9eda58e86a4700dd8d7dfc24806c1 Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 21:28:40 -0700 Subject: [PATCH 15/23] Borrow program identifiers in deterministic helper scopes --- crates/warp-core/src/edict_pure/evaluate.rs | 14 +++++++------- crates/warp-core/src/edict_read/evaluate.rs | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/crates/warp-core/src/edict_pure/evaluate.rs b/crates/warp-core/src/edict_pure/evaluate.rs index 4363a182b..6f0e6329c 100644 --- a/crates/warp-core/src/edict_pure/evaluate.rs +++ b/crates/warp-core/src/edict_pure/evaluate.rs @@ -130,7 +130,7 @@ pub(super) fn run(program: &Program, input: Value) -> Result Result Result, + locals: &BTreeMap<&str, Value>, helpers: &BTreeMap, meter: &mut Meter, depth: usize, @@ -166,7 +166,7 @@ pub(crate) fn expression( meter.step(depth)?; match expr { Expr::Constant(value) => meter.copy(value), - Expr::Local(id) => meter.copy(locals.get(id).ok_or(Error::InvalidArtifact)?), + Expr::Local(id) => meter.copy(locals.get(id.as_str()).ok_or(Error::InvalidArtifact)?), Expr::Field(base, name) => { let record = expression(base, locals, helpers, meter, depth + 1)?; let Value::Map(fields) = record else { @@ -215,12 +215,12 @@ pub(crate) fn expression( for (argument, parameter) in args.iter().zip(&helper.params) { let value = expression(argument, locals, helpers, meter, depth + 1)?; validate(&value, ¶meter.ty, meter, depth + 1)?; - frame.insert(parameter.id.clone(), value); + frame.insert(parameter.id.as_str(), value); } for binding in &helper.bindings { let value = expression(&binding.value, &frame, helpers, meter, depth + 1)?; validate(&value, &binding.ty, meter, depth + 1)?; - frame.insert(binding.id.clone(), value); + frame.insert(binding.id.as_str(), value); } let value = expression(&helper.result, &frame, helpers, meter, depth + 1)?; validate(&value, &helper.ty, meter, depth + 1)?; @@ -339,7 +339,7 @@ fn byte_slice( pub(crate) fn predicate( predicate: &Predicate, - locals: &BTreeMap, + locals: &BTreeMap<&str, Value>, helpers: &BTreeMap, meter: &mut Meter, depth: usize, diff --git a/crates/warp-core/src/edict_read/evaluate.rs b/crates/warp-core/src/edict_read/evaluate.rs index 6cba7dd1b..36a0f309c 100644 --- a/crates/warp-core/src/edict_read/evaluate.rs +++ b/crates/warp-core/src/edict_read/evaluate.rs @@ -27,7 +27,7 @@ pub(super) fn run( } })?; meter.charge(&input, 0)?; - let mut locals = BTreeMap::from([(program.input_id.clone(), input)]); + let mut locals = BTreeMap::from([(program.input_id.as_str(), input)]); let helpers = &program.helpers; let application_basis = expression(&program.basis, &locals, helpers, &mut meter, 0)?; let application_basis = bytes(&application_basis)? @@ -72,12 +72,12 @@ pub(super) fn run( )?; let value = Value::Bytes(bytes.to_vec()); validate(&value, &read.ty, &mut meter, 0)?; - locals.insert(read.binding.clone(), value); + locals.insert(read.binding.as_str(), value); } Instruction::Let { binding, ty, value } => { let value = expression(value, &locals, helpers, &mut meter, 0)?; validate(&value, ty, &mut meter, 0)?; - locals.insert(binding.clone(), value); + locals.insert(binding.as_str(), value); } Instruction::Require { predicate: condition, From 0bcc95b0332e0c480182c6648b96d24ec2da45cc Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 22:07:41 -0700 Subject: [PATCH 16/23] Publish reproducible source-function provider component identities --- crates/echo-edict-provider-lowerer/README.md | 4 ++-- crates/echo-edict-provider-verifier/README.md | 4 ++-- .../lowerer.echo-dpo.component.wasm | Bin 381459 -> 457033 bytes .../verifier.echo-dpo.component.wasm | Bin 389503 -> 469651 bytes .../package/v1/provider-manifest.echo.json | 8 ++++---- schemas/edict-provider/README.md | 8 ++++---- .../edict-provider/components/v1/README.md | 8 ++++---- .../v1/lowerer.echo-dpo.component.wasm | Bin 381459 -> 457033 bytes .../v1/verifier.echo-dpo.component.wasm | Bin 389503 -> 469651 bytes .../lowerer.echo-dpo.component.wasm | Bin 381459 -> 457033 bytes .../verifier.echo-dpo.component.wasm | Bin 389503 -> 469651 bytes .../package/v1/provider-manifest.echo.json | 8 ++++---- xtask/src/provider_lowerer_component.rs | 4 ++-- 13 files changed, 22 insertions(+), 22 deletions(-) diff --git a/crates/echo-edict-provider-lowerer/README.md b/crates/echo-edict-provider-lowerer/README.md index 808ac50c5..2a840c6c2 100644 --- a/crates/echo-edict-provider-lowerer/README.md +++ b/crates/echo-edict-provider-lowerer/README.md @@ -138,8 +138,8 @@ proposal constructor supports mutations and refuses a `Query`; authored reads remain a separate bounded observer/optic path and must never be represented as synthetic mutations. -The refreshed 381,459-byte checked lowerer component has SHA-256 -`4b594a8165079f0a973741b9e27b468cf041f4ad53108fccae641dc35355bd2a` and has +The refreshed 457,033-byte checked lowerer component has SHA-256 +`d48bb8c5fd54e963dcc4cadc66d656b92b7ae76728f92c891fa3082aef25c393` and has crossed the reproducible promotion boundary. The pinned Edict host admits its generated envelope under the owning `generated-artifact` CDDL root, and the isolated host fixture exercises the exact helper binding, typed codecs, EINT diff --git a/crates/echo-edict-provider-verifier/README.md b/crates/echo-edict-provider-verifier/README.md index ebe32cc99..3e59714e1 100644 --- a/crates/echo-edict-provider-verifier/README.md +++ b/crates/echo-edict-provider-verifier/README.md @@ -108,9 +108,9 @@ route's fixed 64 KiB output ceiling. The `wasm32` guest adapter vendors Edict's exact frozen `edict:target-provider/verifier@1.0.0` WIT world and performs only exhaustive -transport-to-model conversion. Its reproducibly built 389,503-byte checked +transport-to-model conversion. Its reproducibly built 469,651-byte checked component has SHA-256 -`d0be4d283399aefc45d75b395b3568f9983521ca5543c9dfd23b9495758050ed`. +`e6f29e90fc324ea80b2a3c8d56ea34e7d6833be599cec8ab27910c43d1837456`. Component identity and admitted host replay remain separate propositions: the pinned Edict host preflights the request artifacts and declared output schema, invokes the checked component, then admits and manifests each returned accepted diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm index 903933cd7c4047821af6c731496b9097d5421458..9ac319d0ae40401402c9055bced3b587532565de 100644 GIT binary patch delta 155778 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%0DNSU|-59S}3mk-px|nr0n;N}^ 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 delta 97633 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 wI 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 F{{b{PmPh~q diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm index 14c6c1479e42122e52c5f46450de28e215c4ae9d..21ac1df91baa85e13807a9e66e677a9e7409b430 100644 GIT binary patch literal 469651 zcmeFa36xz&dGEWYGjyNR-CI%{M5Kg$4!TJz%L>YkV|#($McWHcf%_m?toOXu|tG@c?`s%ByVB5ayCW0_%y>2YL_}p-B+_-Mr?C!lUXg*Tq2;?)e|#-e|0P)Of*5_HW;pBtg@aj)MjT#;@MJd+#+n zuHVKx|Du@$-M!oQ?Y?pE)!R4i-TuNjXi>0v&F<^A?YMqlSxtM}-u*jXxb5owaWJNq zD7k&__Uo_S-Y(yaC&AWbl z4c5N8z(*3S8}-rN?Kj*AN#bA)-=)`WySb?CYVfiDCDVFx&5ms^x_>wx9!+VqvO@bagc?3 zzCYa4gJoN;`F;IP^?u(|hP%4&#;dQUM(gT^@VdtIjo0tHagX=~JPF5}VAk)eKO98) zIrUcs%J)67{?wyEy!)gb*Wa{l*N$s86(vj2NrH1A;!QiQF@AmFjr%~VWBeZ!YwGfc zTKjH%!R+>{_pcl3k#xx5m(n3K;cWO{!i`DrgaM+!XgBWKZ~gt@@r_}yVf!^ZuHOH& zs#jLiQwxUM@}obp`A0T4g68@VwX_(UjDLT)=({)wo9p!PB5;ha4;OnC2XXkaKV2W7 zOTz%A_#a`mH9Bx0(4X+Y*7$(^1c6-zTSML?JmaUSA6+yK9C)dIL;t}`gRL$1t|~=U z6yv}0qAJ9rwlB{I@qw38LBK<6hu^W{C2u?BwQrfGttKGQ6E&<$J~R0AHab9sRIAIE z8jO^%`VH&`4bo)%wbqeVjCODE&;8L)&}cTA&8U?$TTT9JH=9AT(P)f;tMb3`V9fnX zl14K0pFYx~@&y;=wUrI*uN4cZ8|};!>el}o;lO`1eDwd4PBZM<=Lz8JzljN&pn=KB zBxnV#WWm3w&ZvK_*5qWfImLfL8mw|v1;JPphGYD*d%?(mU_(%2d&0=Ut`~L%Hk*?H z|684`PLgQS{R^A?M!GiqfFkwZ{!Q|u|LgA>{zh2%rnQ#PPU0JK*WBn4{~t?Qt2?V( z{OjnVGui5ZX8zHMraCe?x!V6{=ysSl;PnU8fSk!rLSgrBvg7_WTV`bPuU@~Y;r-JGnsND)0ognA{5*L%L zHI8$+>xN-G)(Dd|VX!)0vnEa&YbJpRunguWJn@M^)Lr|e#`i@5)Syk+5rj5iCRhnh zn(Bausi{QNfdrGQo2#K07sAY>(H}_ADb`PY4bJp&uudwzh{Ir2^GWf6FrS;74>|{e{7vuufc@UD-_}j7 z=5^bz!>I%prs`i39BHIiW4Er_ga2`rfA+79C)=~V+qdo7wfpL;Uc6)fRWHD-ylDIN zS8cxP$1l8UbMTEuw_YUpPGkJ4tFGC$f7?~talyjQRaafRecPU^Ua)Q7_Ba~5CJgeh z^VC0Y-P`(d>u-}+hX2y|yW|hT4@B>eULSs^aclGC%}+GH)_iO0j@GxDk2Sy3{ATmf z=6^JQx%KMSYg(^ueY^Rp)+<|gwf?jD&erd=ez*0G)_tvywEnX7(bflApK1M5>w(tC zT7T0Tf5k1|ccc{soex9%15cUbzaYPeg@ zv$O_I^DuqvHo+1DelLlDlwRi6F|NAS(dZJo*`Q0&x5p8o3`oz9y8JZGr_X^}O@JeL zTA;>L-}qDqG^mdJ?l;cQ1?g}8EbRoHKZwGy0;C7xo&Csx8g0oB#%f1BIvBf#LSa14 z_z47Cw8fC$Zx|{1&C4hr_gdYMuIHO~^+0YG&t{FCy_UXd156Wg#B}vwJPTI(ZIIm? z%i1E@IApOGYI3$80=VcC=F|H1BpT!X!h#-c(I?C|7x&}b%oI0mZZdyEXXXQSrf7OT z@R;Lcz>Ik4+ zJA3>A33LT8dI6ma($`oGfon7rql99V0UFFlbsEeWtwn=5PwbVW!CbTm4R~>aX`rT$ ziw3XoG?Q|Za)!|8x0!bb7O1W_8X>ZnxZrO)Sd0aH7F;D z4|DUREiUf2jg?Rx5vn5t%c!XhS-Vs~*=%|XeT3ckFnyU_Hl>!Nn@W8H+e1ET(rjBGwq>e)4K0X4Q zGf}EP(sq6Nb$~ZO&JSb}F*QkY*ek(xFMeDW+V+HIU(_H_DAgELs!>h@_oZqKg&R49rA~xX<+Mcwr^+KJ_|qHak=_8RvtnFvwfE@0 z*ZW^L6o&_t)S<9&9}k5q?LHm~7ja#9ae@tnnqCgWEN~wWdf7R=;>zxUnz9=(6w6n3 z^2?5LbFPhW9fz%KLfS z0y9+S>iY+{`iPAqq>qmHF~pGR1?O}*=pV5Yl=dfrR`De56Sx+{)Vg?P(TG(S} zjeDJJ9Nwd*UKh?7uRI_78dEY3Pk9DRxbYs(3}eD^QEJ@YWi$qdW!lq9)dzox8cl4+k;(wWGbx@VouPU!-vBk|=I#85<6ThzHuev9ir5YttUV3}#%Sad};ou*4gA)C&9 z0S02fLDnU}bK>#0;oc2?M4wGuz=(=Q&X2M#HoFB0QE9k3ZrBsJ#(67rRcw1xok+nZ zLVrX&!zfM^U?D!!57I*-C8MQJ>zB}U@!XBr@JaOisEmq^`# z*?g{jg%nWiG!5ZFub&8FO2`>`7Lmz3?3vtaFxt792pVn203?~qEr#denWzEZ&y@vB9d&P3hmo1v;AZu=tjgmh#%VsH152E(0eg% zIf!j(7PiHi6bo2(`)wPks3v_l=He&{RANTtEA`Pbz{RDYZK|NXC`MZ-F}XZm!!@PE z@1NTw+$(c&XcO2xW2pPRv>&uPerC z0%orT))F4c+F}g!GX~~nggBMqCF9f?KT_ZhFB5-~khKu)%z?MR`asXjBor}TV!Nfi zxYBMso}Wu;+#3vh5oU|?H!w`Fr*-qJ;P@Lf)8cJ2jX2wE<%Mczn`1e+ZwN1lA5fTs zG9KaX+KhmhpV|(Eef$yCXV%%Z=z_r318<)37YXrK7CMpLqK$jPUdIUQq6rEtIH)U@ zQh47#E7__EsE#$GA{@SMNaax z3`NR-5R*Jkn@+T0gbBcN@e9P$5sUjaSY!L2N=&=`UOCR?`6IN7MWe21-!`xQp#P#P?@7FSV%FHJQ%m zs!Rba=5ZQ79tA&xvl%^aLQoMUX=E)j2gj9rHl8P!PDEWL=veK^#X&DpJiuxv7mb2r ze1N}OL~U9O-7gM%ig{%bE^+6qES{Cc$59sF5`~Q-l&TbvC8z0ZW-Z)n;XrXe<1b5! zlRz>oL)r>cEb++@A7m)Khhc9Z0aENaBiF7a8F#^ES*0X@qC#FzoZT1%7XSo-bYQGS?#yU!wuGJ=(8vYZ6j^Z0qoyA8n2^g2raLXfH5`_GP+9jl$4$wdwx zM}2f_ZMgtR_MwwMrJi;BByJ#P{a9-OEWMu87R*0(IWD63ZrTLpg6E()1+ui6K2pN0 zzC{qb?ut}i<(M;RftgR|Y*tsEyBGJ@Eendx%YY*N!&?w30NQ{e^q0(OFBi7W3t{`E z6@o3T5)76NP@0bb=$j!XBw}t4FHAY{xlN;k-2==;W_pqSflNT(B_Bh=Uf=?#O15dE zJuT-Zd20C6&%rPxHkk=gan`QvlZU2!9nwO0^VIP9U@l}%gTJmgq{Wi3F2oEBOE-A! zlDnaPw0~Br&lZiy7sU41EfxB89=MZCak9ol{1D|Z2x;HW>(l&DynlA8lYjm7^K(J^ z7n+<5I{B?{sNKCas_cS-%#r6;OU8oL(6*XMN`I}if%J7xKQ3lyyuozyx0VFO^p1U8 z37tL0B)Z3CI2P1yjIX>PzK}+^dhP}BW>o&U@^>TrQvQ4$t$(fsP@P%ssY?LjvR5d! zG2SdKXY)VYTrp`F66noF2}2Ud3E-GfMlpD4w>Yzxq9n zre(3y17Z5cvv@i>I~|PESD(ex(eZRBN#F84j;Cd*r#rW!Z4!rZ!PTyQ%X%q1SqVB{G@>bz95rb#QyHUPNL=d6x*X`lG zxNw3N+x1E4rcQzZK5`(JDd_Qy>cJ~&DU4_yQ7w$%E3gK!)^kTd3qenZCJE>#M1F-%ff#y7)}UU3>n!_MujZE)Nfjd zsc+FD_l^_^R%p0X6-COUtZe~m`2BekF@bLa)a|T6+?gzDg{UpgMUQNOYpd7nP`BlU zDl(O86?Ll!kkcEwVr$6Ok_yM-XvRr-c*8{4)ygufkA8QFm@&v%@1V>2h!P78JXl(C z2UtYd3@nCL&*QBJi!O`+YrTSUgy39Yyisp!Jy|sBObzG_0$R=MPc{JhT8FmFT`oze zXr=H2N3A7nnZ8NHyqMhwlbb;`8^32^`g_7upA7{-k(fR-j^wh9vK8|Bji-ip#TvZR8H7v} zpNVddG~$Ok8lMv`erk9yX6P=e^Vff&sS>@n8J3Lb0q>g@`y_a*@%!B|FI|N}zv*tN z(l5Vf{7&a$w|PSB#_uq(i69lP-KF^%v2AzPY<_119EJ)nt`u8(c)uN`0GSm!B1&sy z=9-9-9XaPKjTR zs;zDgHp&$PWOL{^r!OON9ODmY8T9B$>C`^{akhQRv$Ns%FnqvjsQ>Ac`W!7?4~rl^BVIBN+=!rOb#t1tQsO7Gwx|o#i5wn2>Sd~oiR;T@yr(Inq5@#%roU~Y>de%7Dga0H*4JuF>B+YGG=X)$o8lV zm=}B%6?|nufAby0SGKId0a&a@)ECrC!f~Abi8|?cO4Aj~;3@GE(%^;x@RB*2&#ZXq zleH~EvKm&QWra~RKAgW0p$uG^`Yw2@QR6Mke{IxhcC|^RlMkwZDpzDxt&w zs^~BvaBa5=pk%k(!)k-M+O}-c{sv10EKwk-VEt+Ln>+uzsbX!TVqGv1v3HD$O;UO? zK8z&_?XEpzP01b(GyTjIz3}s4Yzd!KN#IL*-AFu9zFp6?3C> z#a~niU%sxeT^Gza6iGJ6s4F~HYGQmsbcHojYoyQ>Zr6yquBcN{+YkE;CCoy*^_(M_m;P5L(# z74Vci70607Hz=vR?%M<=?xF_?|Gx5d8s66d4g<92>R3#fmOwHC6v7cM$quJTF(V5& zIp)_GSuU0Ge)&;VKDjPaWIE$>AnzO%TSMw&g|YRCWn$|UH3fpxSP<0|NTa|aI}SH% zSZsMLY9^%|Q#sYqDji1Ka8~=}fDOo6IE)HG<1*f2;Aw1ns<@1wst~rM#yx3X_R9^x znwMR7HV!RxHhxRxPnOF#Kj3W4k8(CXQz3l$F5};RS4VPRofIsXkbdbV(UPHA`_gT3GNpKwHIx3K`_4j}m#`QL>(s?S z5e>4~pDYBowu#Jo7ZR>)BxSQ6d!u3%%jn()OqN%gHh*Wnj0Fn3`{I2qX0FpJT(@35 z_B)W+pfS#Q6sLb@&{+t0fF|jv5b(TqFpzl77tS!^W#Db7A{TE6E3{N`2AkMD8b$^Y zf_bqBgtO3y2)0uJVWFoUr?Y7rmYNw-Fgnfw^Pyl{WLDFP%XHpN4wC%5D$2TY&imm- zP(B>6IR@u_2{BM7R!|D=blhC|Q=f{fDUdd5$3I>L|sde z%|*#C*C>YJf#1UqZ-o38rsoVon7)EAQsAWkb1>OEQnI(esQ_`IJXo?EU?`3!N3iT6 z;%U1yS_#9(XeG6kF9fWLAirO%m`Q4+9DInG7M;TRl0F(9d>B${Q#cPsVY^UoN=2_s z20nj9SShDHOioax%a^w?0Vpu1So^4gH2g#NxD1}#3lh$>@iX<&cOOMJ!dkk%U6twj z{kHK76AcZI*FryxneXZJ!`R@2k=`V1U#*EEZBXqK`B}Rvx{iykP2cXg2wH3}HtzXB znf^4RrpFysnR4^&#WvW*Y?FFWU}OLvgvslL&hR}u z*2c0d<(8M<-HMdDi>MC3|dQN_cfqKaP@d~T{~`7Yw$>m##a z$2kMxu_8KWCD%(2iFhkFeQC|q8Yx)G;CDjf$3`pVBA)b_jE5_F4)`L&hVi70v2HT} zYu-d%faa0~0(76spDY17WGCA=I}tJ<8ZrO>)e7Ou7oc19kpyTispf2L`l@C;mYVvcm|p#CbV;e9~p)NJWrSQ$~JqSVm4d z%D#50qwJ1hl>J6jMScd=iextZy2=-7#RpUvMB+0OMG>=_b{PntZ0IrcutX}KP&b2i zu}Fap?lc5tphozlJ~-2i6=4KstW+lgRcubh=+GX?J(f)QX)l%XN~L(@XTmb8-#$XA z{Ch=^fx+7JsKMIEV2gETrcx@uorK*3S-2_qekLTCcU;R#3w}~`s%9ZU3-8v01Ma4K z?u0rPI&fz@6El_=>y48f-obs1ShGNWHVO4YF)?{%=WDdl>$(U1_}qZi>G^?Y+fYoa z$@%E9@CHj}m*xobXWU>9pL~NhKIZLJ&!X%YTU%$zUOx}SgkjUSi`W~IDs)yIhE5tyZAqJQT{Yx!aPnYz0G?9++fnC*X*Y0b(|xen>@ z5LcTge?K^7no?xS#@UIr(d%lE?=Q1PHV&7wOKLX0vp+#0c5TVV*_>6=PV5CrBu%?G z1)VpKjM0J0x|m6B7|*CJCt{UVa??G4N`=6)ASBn+tXLJ2qqn|fnVo5(ta`WZ~%aHwTr$<2yP%I52^6aMT3Ge^kQ0Ob-GL_X>R^PvXdNj!r#Rgwhi^ zI<;nMjTFwc!4LS=wD3u{g5Rjj>tRV9ri5urTb%j0-H4CjX49w)% z#z}dUe#>eJF-1MzNpc&e0J!X;|1}LiWF2|47L&ja)94W@q+&Da)1stLvK0BB*t2q)#BfBv5~?_ShfG5ZkIN zt(y|#wR6;xRBm$VIw??f(-y=5q4b>g_wT%EP|uZ^Ts9WvSO6GlkRTIyEX32&kIztV zjnIBA(|#-`6eMh!<+L9qrTyHlcQ_BO>z$vi5qonzf?%rnw}n?>g0|J^x;jS8PLRjr zeVL&FQbvOiT&+T;+DT-_KRZ@J|m08**c|4ceDRIJ0I^?a>sZ0qfr?nw&yNz|o#TA(B9cx5{nwYXxy@%mLw+Ah~4FZ%bqW zS(;0Kja-9(^``m#ubQ7LH~hhe(H21(Lo-2{zFCE+osM&Eu>2}}Wtd>Cx>aEd{|sz> zSc=3Jkca}ZTpNCN0vz(JrHQ>rHTq4gBEN|hZAb!+A&%U6{Iao~0_-9GIMg{#Zxu~8zxG{no5EPGW zj8N`*8`&Bf`SfimObrw80NvN=ZPrRuN=N6nq_^mUNQ*`e^P9D4pl%^0w|1&Gqka&5 z#k%xgwBr&}EZptPn(Oida%Dr#lI%5Y+O=utO!I_ZG^}OiFaYl#YQ<s2ei<1gKKUV>I2lRLHEBg=rzPMP_qLV$9`J`24Ixp>dtNz@Fn+Tz7*11ap>QCW!G-G&!zJd= zZ6`NxNfRwG17Izsw~KSG;47FE6g-*qeKDtshUl*zAKSzpJ;@rCguoxhUCs|=<_;!u zDWBNkRKo0*E@&LX&_GUv#EMNGe@@lQ<1L&4<=2**0L>!EZNDo?+>m(pFCtGhcIIw6678% zB}nH=P=B??Ns3n#oU~k)hir;2lsqb~0*~cAIP5y6nUT5x=_RW_SaHk(R!2HK$J{>X zU3mDcSuvm*GfEk~)od)*G;vxx>sjhQOO`^crp@FGvXnj;JLsU9wR1(ZdKR>_I5F`E`cfT zQs@1&T}&+LwWL>M@=ZPJ#~Dp0F=XbzV7cpAC!>9|`VRsXopNP*a#)u5``8ylG0Y=cc!lRxw= z#DhZ>UmUuSA`o`mgX`q4JN{3P-X7Ir*R1k2Q? z?|73DVndxTJ8sSpkfPO94H+!zFc32Q66%T$)3zHlBJ;8hfM_8v`7oCG!gIbJF4Vi^-!ZbuoHCt!|jh=ZXrb;g;#KnjIMj00SY4=lq81J=Wd>z zjFM0hw~h405TqfW@riA(p(|V~e!3bWTbC?Z5=EF>4fc4W&rItXgyT-92TM`QXgOYY5*i?iGBbqt}6L*!T&KCv#{ z>1@uqHV~;x!AkRnw6+^xz`PGzKMsEM9s|GB`vC|2DIn4L*8n|tv%h%Gc0~zWs5IXCE|ZJS~Fp8k1nIh%P7NBnS~ejx7E zRYIKGKAtMOsvJJk6@StKOOc)@wMH3~&?xQLc&DuXr_>iFAJtY$Tk3bXuk)s)N@}e6 zwuoQs`lG}TD%6%+S#&YZ{k41uV!f+-xx3Rw(mdQCnX{p^idAa=bA^hWz+f5 zv$->%d32Gx25aX>7rIjC>e2bp3_r}NvOkJ#qzz7j%T$-Pfa2$w{&m3XE&9U0-t1my z0E7n;;eDmQ3oS)hSdD#*6!wjBPTxWtc(T41q9o<3GPbjldWvY+$WB~L%?PoSphZkF z*1{zE)2>J$jDsgS1+}ACv_^G$T1zgoWHJsyMB7MhME|J?W-UYzQROE&H2^grKCqWR ziJBmKPVBr+)9$VYJ0etL!%cxi$F(dRx_?Mcs|hOOq@l!Tre;(!yp&K|$=51l!o8AMU-xv5@3X z5f_9)WO1m~QLVx@+M4GIh=OPHN5os9N+ye9SqNPc%QzO1l-++TfigA4*d3q}8g!E$ zrWvd$co^~~jz??`PM;qmAp*0%aN;8R{dH&c`Y=4v>?X=ptfm=5y(UOKkDwic(0x-T#~eGF-&#Zy7_`3#vi5 zXRzIpXZ`Uu)ER*na=P_X)CPM>lpZgVtMNRoxT7?R86jB%XY?4#p*s8l*qFg?{_3~T znY`h}7Y9)0-31P^u(Nw)GwKH#rfRJ?I@{)-hFf!SBeT8g1{kc=1xCKsUeLMNt;`Idq6LjHnU6 zX<(tgvrr+i4Pp^RH0*BL-D#AhM*9?)ac_v0ftDWHxhLO9pPs8yih|e=&MqBI|F_H` zm&G(o=RA5k8Yc_7sj$gC)|1M;H%`Xp3|G-PfvA4#QmDT7ltJ}3hf)0$umu04Z+Gw$ zen@}aU*d$?d4ei_ zm;bU-9haI)FfpsNPcK0A3@H!5C{F|lq>UtRg*IBYSj>#-9$m72(8Pv97N0RnD|(ga zl#&K;!z!_zuXQ2*PCtm~0{TZsuF)u-b^4pG_o;o~=`7WR6UL>RIM;Lx6)#ksUTX_a z?y~cPB|MdGk>)bZ1FnC^2)QIoZ#M8Frs0OWo#ZpV+xZe`dyoH~9F^e;Y_B<+8>wvy z*X^TXWtD6~66L$I#{-Plx$KpSeR53lGKbXs+#!y*zUZ)-G)2l|)#lB*J7X`}qJMh4 zb}|kFjeo@guHFL&(a+D@wq*lo?dKTq$AoozevQiiPEa;>6C#vl1^l*j#ao_-9H z!9?tUIQ)Ok{J67ybmo{p=EoSKc*=gm<>SM(>ql$XES!S7-ei@^$iB^2de zBe%{;X>lo~S6mA{#r0fRU4x$T`F!pAaP4|dkp^G=q1yF)?fP)-dM@_m84sEhQG9HI z?)XHcD2{~+V0{R&kb!nQULET^n1thn3pTLpBx0H&xcPhDIzK0m_e*l$ozx+BxZ0`P zg-wa`gduqFY{FjrT&~G+JaOXN{A_X2?(^~knmbqGX{Pu*v2Uh7gY-jUA;O8c*<-49 zQ}6@w=9PeJQS!2uaaA_0A$2UdSFBAxSxZxwmUkN}%*8UrSu$?(EtgNY{l_gM*HndG z^_xn^ZMbyYhUMYfiB3)8Jj%mmC&ipRT&B*susqzZa&9|&-N8>C-B8vg;3}Tba0$5N zk6Hq*RaTUWE%UZp%e=K6Q8)?Il2MsQAuyJQJsl0o%mQ^O$2Q2>rCQgiu0fct=aMVd zY3n!=7F>ESS*lhI9yqfAZlahURW+tZn%q#3V+i4)LpYGr9tb5&=0{I$Xo!N=!*0K^ zQ#B&I%q+U8brKg;pGHF{T182rQkAlZTR#p>p+o+#hI{F!#4VgS8pmypV|AN>(-Dlm zB~(xMHM@~%U+!|5@vLtN5BdW>#mZ7*79;pH^jKAOct> zDc)P7^k93wCL0rj`4+(HbVNF_o@fxVUbx^P5kQ+|$-#cNtK?@oN~-a5CUhVxT_r94 zIm|jRX`_^9K$zAq-i1acU6o*xW;&Z-E{y1KQ=H5k7P$h?A<(y)tDa7i_LEM;a+QexaZ7LbJx2>l(cnVj@l>X7Kak+ls@X$ShzfFuKGQ8jW zv|x(<#`)@-@*}$I+FkRe^7W)W=vEIVastJQQ0udzlCsp{k(Es3G2bv>!8f!4^=zWD zUc*Gu@VwQ4Y$}MI#XEawFOynsj6>iZ6gwmXF_z_Fb8;rNflF&7?^|M1+oI>LB%G)# z-^e2j?*s!NNr>4{wU5jRa^0b(5KxKbuw@`wJBk8SehVzx!rv<|voPoB*snHjp&)C;<03qK0$ z1F9xn-e%Xqi4zX7Je3Q~%Yyo&InY+_sdF(H{3 zDNqqwWKhdh%8;<^7EjJ}##zAR7Wt@w6O2JN19z2a! zg+_~b@yGI3q=+n$Mj0%;?$AHx#>B-|_8wCQUl3^=KWyTRLU&R@&O@DaA{M~?`(2?) z_J;e7QMWcR`qrz$EH42<9Twx&rh5*a!8r=~#)x9=CvwoNVFQ zmPt9_{;32G*M_WS8Qq}5p^B%UVj+NxDwm(pr9)@zw_{VB#9s1?b^!A-?qyb09i0!b z@M8fw?>7eW=)B)Az9`T+uM0f08ah8+LL6-hzFTxYP^`=tKc86 z=j~`62*P`jomt)?FdtY+Fb|hGV6XY^sGi;-dBC1TCN~w$jk+JLgvC)8&&w; zGhb!0cPyn#`H%i5NMw!u7@(NcY6;LK7_-Upo8vcX0EfZw5_An##X9is0;D@orY#iqEO zy12}bg7Z)v&O<|R-oFse53VGf3`dFg>?V(m4uU1 z+(*DUH_AF5uH*CY5I&DA#OGhGB%FjfJe+gxd>bs$qmMnts#XiwWwK)NP57?!(XKwe zu!c=w4w;j->|hZL;JteUTv+!1Q;YQ9Jzv;=_uTbAaQzQl|H+1u7S;lXk^K*f z{*yjEjMi1_6wS*R8;0A2C zq_0u7RzJz;nDlsEnQC%Z)}Tck zK$G9EZy+gfF+SsgTg5R57jXr_)wWd}VW(3;riKi>3W|@@l&t^^6&P`AJp^!=f0|om z?iXd_ymB@EFb+GG&$8e6TYqkbto#hKbt4NH4d;hKy?k|~zaO;gyCcxa-G@WCgH!fO zv?@8Y<-zZ_)@c|L@IAG#Fh$*OA)De1B%q;{00;KvPreE0+4_q`jY>t^K#8P$NUGWf zJ)Pd40IT}QlOnH2HX=A`5?OxGW~(!qvYYb1YEvZeXj#fi55 zro4SaNi*PpX8sxV6L@e+f@^7lx>mFOgbR|jjbuh9@`b%(S@@0V#+|}*aCsjJDSewJ zMKXxqHX0g#By1oD7k zg$MLa5J9Aq<2fztDo?$w2kmH!dTO@X^$x(U=r@b@Kz7!Cj@6_~+m`@a$5%Ypz!h3i z4_8y2^g$O~yxl1=>P2@*wT{NDDVD@kuW$=4Q7)P$exPTB;J3xuMVsE z^GK0OTn2_;gkI(8h~s4*clBf01K#@GKzP-1r`QnSOh04NCFSR@iMF;0Pvkt@RKl0+?%2g zZB%-bAbp%i`^}Gt*Y#W40tG0GZlvfDY8pfLTc_AJ)Dmb*T+@#NFk<3FZPHI$|MXN? zu!)Tx%FM#}2##iH;%v$ZjlzG7mzgTaiEXBLze0*fP9w-mKWA!&5=BJrhR9Njlp?+c%+QosLOCM+3Mwg``puyRnFV=sr(I5XCMDW;dpcc()qV+S`Fr zim*Vdwn)bwq@Hw>L!_G+K{{t4YNYGjqf}#0x4A0#=Y{FeFNj3^U1U||c~01p^a~!V zOqiha^@ntNF)MU4ld_X~+^WhiTG6;3sN}2s#|8^1@>eaWyt&GuW6mXV0*?wJo=2>Q zRKN1DM2pCWV4n-Z(bDB80ZVJNNjtxfggpX>fg(kk+G3tZ8ptO76q$2Pbp9cU$q9Vv zWPu{Z9h>eQZ8&XnvDACb9yXde;3DVvzRFPpfp-~JgOg+<2&!F`$C-u9AvdnsCv`jCEs+tCF^ zcNMJN%_ePn&&_LDsZ|iTzgk+BIYs?U&-TyB;%D*Y>TG;(F^8)emUDI*V7(_$IbUc^ z*%Pug2I87L-20+D+@Jq9MxFqByMP4@Rq4yQPHDMxoUu2_h~m_Cj;k#jPk%u*Wap^P zaBpv1xYkW?ypydGN>_oobLbjUgzNw=3WKip&hfa;&Y8_p9ZWA8@F^(B#!-sEtQkB(2XjC{0Skdg0gF*8qc$&In!~j?`?1^9pA}~ChfY@pN1uxfb^gBX zRN!xUr^{gPSBzk9b!jwryV3*P{fnn8cY9##-2M1lnZG}pm9YYYR_2US_WvOSoG!}# zQ31PrW$%g)h{LI?>^-n2R~#NbnmAa2GgutHbvlW|w~tL6T=COH96YcmR~){2G;y#3 zXRtUtb~=f}+z4OEhL)q9C0G135eEcJg_HM9F81K9IU_@EDpDvPU7&g zV-p8g{4@~<5A4Ymhp!z?9IU_@EDqlg0#296(l-U{@*_*G_-P^z9@vvB4qrc-I9P!* zSRDTIbP|W}9Gf_};-`r?cwkSiIQ;LUiGvk5gT>+Hr<1dE>#;dYuJ~yp4j$OLID9P* zTeg2ZiR4N_)=YLDDJ4beGD>x-|5Mu9ewT#3LDx4I*=yt`))H`)-$w#2X{{`sW*>Og zkFx$bXIBgoD)J9ALq1O4z_{O>o`t~KxDp1G2+04-)Iw!Fjrk-^mJyFL*{?(!Ef?;R zAVW4UlkI(-gQRKtsuA*lj;9fFuvs6vcq3Z;t27|er>|gzGhO>X=}$}8igIC#a}MYz zmn<^Pqi1mGaG)tGxqFVtaWfRK+c zuB;yQSg8wBa$g!E5?LJl|B7`y*Ctb7In)11&KXml0hur)E2K8zL<{zD=U0V@c|%_7fotW3@Tv~?#A%dF%&()FSuHIZfC;NLC4 zBppa;D%UIR+IpoEa~4Uw)FO&@*@AUiqM)-D)MJOjj7%Li@p!dq#CR#wSaisD%% zb4Dr|$1Z1;%vmLKEK0`GBUV<)SZdE%C38k98OJVXmCRWsb1X{6rWIFK$=H)3D4b>|<}j zPcALi#L7-!$L!oSs~vZ2`kJjNSoY2=w%?;-ESuC8M`KoinQUNMiHU4mNL;F#FV!Zp z*{I^U=CL2rbmf4ixv-qZZm@8Bu~}@lJzX)29k^NSz|CSOZWcRPd=@(>X0ekKGmFhM zuI;omp*<|@I?y@7Ob2TwJHDyd1wJb#vLTM!qDe^?{J%DV&E1Fz>@l0be(mT9Z1(KZ z1a`NYz-I3XO<<=yX)iv1O@;#V*RL6zzt-~kMW?Ubn*V{>YsVwUrC*xq=Zo3va`)M@ zlh@x1lh?MlNU2y>Btyn_wHeSXXES6_N;8<=(>_DSvCDDkn6nu&OXvEX!5K2PlyPO1 zj4i`Gt7Oi|fs$jFvr6V{H0D^MF}6T-WtEIAZa%AI&PXNW*k$FE%-?Hg_-fbBYG*_{ zvVjPVwj*T!J2u}Y;G)54az&rblkLDUcG*>8JlXEbTwd3U3F_Dmuzkys*2Z~lmyyk` z%Nk#@=`5RdYQILV{CKRY8rM25N znmlQxWpkrbxcpHV&1xISFMYTDWaK*7P4@phmR@RDym%)Mj_BlF$K1&esgor9Yn4Jn zu`*5@(@(qCjM=)??{VMszp>xsURzYU?d}=%*K*;Bt|`x4o11G>V-<572fGF!Hl(w} zdg#o~;MEq#+S%0a&~7}zOUEbdMXG)68y-RqCc2C)d!^a?-8yw#P$8LRK`b|E(y&&wm>9A}sB5=Ge?P2H%;|^#qy28%9qk&s44@sp ztz|obz;+ntO2Jp#V|*!&VK09lU2H0zs1EpT%LOKzrottD`*(xVVRisYcCNSOPADKP zN&y3I_g&k;+ieByG!VyAvKec}rp>khMk^@_)x;MtjcvFcb1;y2#D=w6!8fB@f`GNH z`iTV=yYXu$Z$K8)w@Ny&|FagYxQ(uLdoiESij}rZJ+L za#v>#7oobarvoijkJGDm+?X_@J8F#Q9DV3$KDLu>sTIPtU1+prsn#s9;jG~A2rWF2 zxW=|^xYNr;a~)TTP25?#)HNm_)27fb^XtvNdjiyO&uI%D^DIq~2rNQ?#jwvJwGo)> zpmKD&6e8xkWFbp^ThVSUmya6e3Sft$ZWB~?OE$=1MQ9z2kp0iGiOMc z#`GegjsA5Ks}l)UV3k2-7J2ytD$tk{!oA|S91CXqTdS@;MO{dGe{!J0?uZJfT!m9w zX2lr<1ehjf`y6yht&_D{uPtj$>$Qr)(^l)?$pqSqo3jmEty3%#%epZ0f?BugcvshR z&Km4bl+dc)^&{#ncjFhdoE_24ra-FIJK>=P5XX6(p^SVL!teAD-Re))@m{uHHoYv& z>!gtZ%+p=hDoBr6e>bRd9F1wq^h}*%e*19_QytbZ+SFV+Vo?<%b~7OGEVL!N6pZY! z{EMvZu~BYsZWg*cUw{RH(kY)iar|sMm3z`UMjjWX6Ew_7eun3qE~#V3^RqfpvNBqe zlW`;&BP%TV8Fo{J6HXV6X6YEObf99#%XSdN@L?MzOS4;tD%L3vl9ffcTE|?M3@w-) zJCCfow}^so=8Z^7b)PfxXa8qt~f0?oepz{Ip{4EdjdP1|vbP zJ>~8EQPx{B+|iQXJj(C;*!*0OKOw*OvG?=)l>E=__s@d#Zu9u>i>t$`*ek#7miyu? zv4?rg3Sssl_dAKh+U;U$kVeJnxp^C0bu|^5nK0|H1LrTKkKV?>DWBm0-LL7YA6nlft(7{Bao8PUobW?w%0B7FMq`&1?$Xe%z3TUpCt_*(ljHA#y z$$#~?L}wNU8=ZeB|EGs_e~u^jb2+*-=j09>0EhS5X8WdqFNkH)?XYJ~Je~!*U;AyK z&3~Y*=#{^t`*pq|hl-$cbOwCcpW1heG2pTH=u_6CCwM@P{rkWEiZJqh{`>#SFp9D@ zOH}ZNaAM~G!vb~^X^4WR5Tx~T^$#Cf;cm@ax1RW2f_3NL2&}b>Vf*OhD)?s+eR1sQ ze#FpS@XaF(!HW=(_7@0i`wNH!(H0xRN>@MwSyKkWc@y80-3GFFQvi2f#$F7l{q80D zbR_1nnjf8D*m8|4}F z?bASwG^`Ph*U-@^z|rN@aSo2+s@(%fU@>hL(s8JTOWK5X z&TDMtzxNx$QrRn=a>#j#t)cVULH*`S*vEt4^Ylx|V*tC*zCi~D@p+jQe3vy)kiiOu z3_vM8aGJcTo)MIdg4XBa8a-?ud%DtrChqUQeoG9tx}bHFvyAdjTe+xUI>GXQJ!)1+ z(ZgHqboyGk5RTya5i4Bd&CK_9gX`Eg?R{&YGSQ}~K8E;x)WPB5pVgKmz)xS+_F<5j zh~xWUD+q3+L{d3))Y18piI!+X`*6TB(zlj;_|nta8yt4 zbvj0f;4G+ie#`$9U^N*gQfsV(g5sAFcUp<5su}c*l_2h|W`5S**SaRAF!mZkQ!{}4 z?floR{F(*i0Trqap$C~>XA%3B&Wc=gO&(Z9nx+(k73eaww{q+ZqwgbpmR9;U^%O19 zf*kGq^}ZK%WE4yxcn8H!Dnx2qhmck+4hz4v0BaPCapcXyWy!F5{v~@O7 z`>)vh0(p85FsAEdC@Vy0lR|1=gWni7jGLWd+si0EbTH?`nTY05y# ziCuuItxd9^a}}p$$*rOqvnpb3vnCeY1^5`FA_QH6m7zU|qXDjoQo_+)NK`;9Sd7*S zGjtzQ6o!6-KJNVXST&*Y0M<0BSyPP)@-Pc`I&Ux9qJL^j3NIMcM!<-xi_+7?2HP>| z`aI0)8%*~k-u6%#+V_w>E9?<`Md$SVE%rPv?391{w!x=X@*VYOm|)g4pm-JO`&+VlE;kjztdTwWbeBA?0}KblMma27lX(FWM&e_jiQ3*)_Vt-kxz%14R{pEXQL_pTsomWu{yrr_q<)-whC-mzu$9@ zo)y@Hx?t^HhKo+2-ARo!RJ_-t$on(mb8N`4Q$g2eY7{%y39Kj>f&trn}{OEEn8Pz?LpKrM*TVQg= zo#G93X+FTS<53uIp$9yM3luw($Vu+Jp!GvZ5rJ{-{zONcHPj`BIwky4!&?3FVR>@i;oZTfle{UfLG35NsCPGEHuG@N4$T9 zXSI=TZ6pIeQeM_Od0E>FVlOWo0{C)G(O8vx(M*e35&qAYQ zBmWb7+AO%xKmFr@vVng(D7!o@{#pI^nVK4sc6(O90eb<*@7uFN1EA)4_DA-t(3_z> z`-s8dW#*EJ3C}GL+2c|&CqT)dUrNTdj`>ryV)VY(bcK4mY+?djA{I>5Y-k!QIpfgLOJc0Dr(613Wf#7mxm>Y zra>t*!st$jSOR1-3qZFFLZ&QTRHL)LhNNMwEJnA)gyZ=@+eR z-xc(N(?|;`-Nc66L<-GYp;DX3Z2y8O_?o-RLt&Y5gN`LOX|qB15DJuf1I>aV6zEfs zFRf?#q>Kp(CG)6wjVS6K4aYcN+6NC{2Xx@ZaFV_Aikm|yVn5T+)ak8*y+DgCbdvQ@ zvYGzVZF6%LeFDj)k8@SAZQd!?GJyaW_e85oI|uA8h{K0Vs2!BU*`q?iiP#Ys>+6O-Vw8+wt(iNzwKEb6>2bmK&UC+QcI(2h~X=L1v@yz_YicJDhdYk|8baRj#b zhplqeAPE;?tnV~zG?}wURs(FIa{YvoMP=^#Qdif%>mb|Azow11_%^<*=WuD%xkfVv zfn+*^4ne6gxsuc?Nl91jzA>ss#43{IQa<*=m3!~IB}v}bvU;%Gd3I@!u7sU0grwe7 ziGfi`u()hiO~`*xb%Iw&?U_DFq)){BqzNfXD{MrL4g(aWDrCghVy+`=&|v?!YZAt4 z9*Xx^bB!TpMADhvVI2ONTijwvUS#!a zDs!?Ggi)L{n({t0Z54D0{80JEIJh7N2Vz*o;mUhPXkyUv9ySy&x_h6VTfRKDkIlKa zqqCV8`m`O3{mEC*cc6#`8Kko~jkg12cvzdRU_3)r@Ip3k^lwkpKm#8o?mBH}6HHjpg+!o&WuzYL= zs3ohU^giyGI#fcE9g&_P6gIbK8Eo7!x|AAis6!@w>M*^s9;KhX)%CZ@YuWumwwWt( z0f_we`rO}5l5jJhibEOpMohSU;oV6LXIrdEaN`eagyp_}&l;u|RiAp-DDy-}&!m zSuxYerj$tKLKx8oO5rhemgM*UiRj-er<*_iS9b5=jM7_7YWB198zWW_ zJ4XkVVBQXIB#Y^+vnHJr1n9>M@F%Yzpf4W9LgmE%=!w~tV4ycHK}orirmQ>_yR)8l zM#aSFIY=W9k&)`SRn`fh-*8^T7fm33Xa(u_b0ghP%oaf?W?_y%R zoLqQs5;N}av!J+w#nXFkK@=D%{*HbJT}s!+Wy@6g_nW2p(UsE)|BrESDgEBa;Z0qMcVX%d@i|G|TgYD~I$Gq~Gp% zNQ(Hste||{JVL*jb@V2(OkMht*u!UzK%4K{0s2H3C$P>U=1L4y2x&Z-1i0XGzh|Op z4Ro3Az)KBqBpGhl7^Ef7Hv%r=67Mr#G=fiDOoG9P6rbL*rNupSAD9bLbBfb>mBi&# z6-=@IvHQ>sX5^gq7-?t3CX|?l%d0#y;v}SJ@k6$nW{p_BB5PXm+hrJF0GB&z-Xyw2 zb5&9)b{L4vuurIw(N+BRpKk>U0<;gCTlyDr*MrUs^|++HXbV!>_Gx>>K=XFKwoFzF zI=>o)2`#G4d@j7g>drL`(wQ)NmXd%>xK$7Gm`DPT<~WF?r=fzn3O*5-hwPMyzj9*< zp+oNo5_v*IbVhYuF%i02se(t0`SNGnK)ZXN7Q}Y9`lkGd?%ccPP33D6d??(l9)u!U zy@ImD;gJ=D8oW^6d;Rq8DWzd;%=@I4Nn8ve8bE*g_dpQwWLgW?bsP|g!mZf?k(FbJa1#%S8qzH*IQwCz6-zV6ZB_KfKNBd^I`2_?ZyE!=}cRlvBMDglIq3ek;vMKg4QrEk9Nu&JVq2UUM=` zD!UDFgsA*&dRQLl5|@KZLJF~MZe^nANG^KQJEdYoVy2kbPu|txF+5|2R?mo*Tw&qF za^;>U*8$&A+X?{J-Y+|4RMoyzcUu{NaJ8@3FEo`J?rxUyh@3+vrSuFvJVf zBY2@ZzzcOIAR8K909B%IvFg<3#zk018RZ}nRvaT?+%V%3??iQnb*WWbxKWVOaR9{f z9MH_#jsr&VoDTg`&K;~Ecg>h>d^YRq%6P&Fb-@#aiNH1lwIF58g{W`b!SeyuP;eE7 zAS2tD#;@GP(?d}}&=5}W1PvWQjT1aUB?fdlEC|||Xw(V%HW9WY=ea^=s=j6l8v|UiS7R7MTm{TgkZ~L%mc&PVSrpA9bL3sl};+{uuJl z7IWmiOWaxUhphK8(aL*}v}-DKoE3Wq_PG^O{YfD#q~kc!lRk~!3%ta6%!kySp5o|TFrv-@+Ur#`X{)D~;7}2DkN<(C+Br}_^dMFlV6gi(Q{t~ebBJF+pVCjQbrJ2r2k_R(VA#GxgDNg+Fl@ z%U(iA2{}xD=mnM$-r4VsJe_n42?XR=WN8siD|R3HX(d(X@w5 z3d_mBL4P`BPysx^TG&m5Hep{)Debkpa4W7wKBTUS=?c^Zi`KM3U>U_nWBI_nLjC%l z+vpR^BJ2~N#tX5lVwQDIIVDx!SDZNH53hw@t9zW4VH3eyZ z?FI1+Uv@pzEUoibWEl7>h6@Jun4r$IGE|L^32K#DYmOCVinaw+V9jOLQY)hoso*uH zKl8i!ZdJCX(3u@QZGkNryy9V7xUhv$t0=n~=&Lu-!rsVb!rb~*Q)X~mM*70wQi_3t zv>Wp>`Q0&Y5>QBe_pMR3G?32J8|0$awzJHu1epGHfVXI#3gwqc*=DGfH&Ce-d}t4V zKEA-y!-E>@!Q{8g%%ESjzTY4)-_&_#=BvpwQ_``q2c_&&mVw!)-l=0KEtOv!51O^` z%^>J}aVp`7^V2@mjM60qOqdjcP$@FzBSehF4RsM45UoPqVsVjH>wzpNZvM3_EK-6s zbpExylmMzZLSteye!cTe=DkqV(M~Kvu~uc6MA=e5e2ZOu@?~VVrAkc&#AU=L* zY@9~Kxlk4AiWCFO=}g2pQr3z2>bjVx*(!rcEBE^2K-K4UCFX6xm+J8vC+2NkPfN_l zSx4^XWz$TGK<{yM{S^n&(llS&mLY1`-g)t6d951EtSu{L)weThMn*IOVq68OxU>$C zn@INMPrABbh_0_J6tm#81k`1cWg1`#@<^^s>I(PMK!ZWG2zq9N2X^60FQmScpVdK8(TR%#Rldlbwbr zk250o{=+oPSVA-?-Fy6cx%W=rSF%A6Xes|BJ+$Eok^fLWV<8!;jYe z_R`ZI@kQzBKT!X|d-@+c9#6ma(PEyyMW|OKZg@B>9Q`lCJE+#b}YTf^S71_mX`F()p2o(v~aNXSy$j?YxJm_EB3%zSGl8dF;SqaosVQODZp4= zxH{(VcJqh%fIXRtrxpmaSMsG-&DP&wA?yt?33=J>8})Xr+gw4Hrm4r|WjFJOfIxOZ z%Cyfj!SCE_-oTAxRin-Yu-b7Q2$WRq4!PG4Q|X|4eOU7u=(j8B^Rao?d}-cw88IDp zuE(5nT~mH1C7s6@MA_j;J4&AqNTdVrJ7z5b$exL`z24i_AaJt^?Y zV5Ot@-tgiA_ZlKs!Eom}*Mi|DKNg@f55Y!ixR&1cF1NUlSK+^6~R4-OB^p#J}18yY*5oa_YRqQ@wQiXT@d~>cjx#9T~lvK%`?kQGl4KQ$E zIHylpIm$~sTCUBbHK{WWU&@sgqaUj)Ya-xWnMGV#xYJzOD-j@z$}Qr_j^NJ6#gVWIMxzVVc=1M{JQl!pTCX;7r4Z!ER#y|?aw6KbLB!U>&{9)*`td_Im1NZtu0iFv=A zP$|VOPM^GT;z~H7FwdlXw<|#w%!9CjBdDM$fWim;q6WuL52X~S()*wf5$RQ6*?drm zNa2I3E!P94zk#LjL3KUkg9@C|2c47;YT%fT9&|y=ee@Wg6fS5LVIFiri==^L3pW3C zNP>FhBZM3LthJ0)(r4i^_D0$uh(Q8q2%Z|=5%z6AAn2zFO@8DkTaeTqDZ3%oBRYh~ zpTRK9Uu2j!x#fNQ&Vyl}hiiGr&7E?4ihA>gW;BHaW~Aet`D2g8H>7_fS5gTFx4w$t zdH$sQkba9GdKMYU!qNxtyf2AlEqt#A4ff%|p;QN@R;Gy?@Dob$(Ad6u7 z72_-&hZ$uHF#LQs4h)M&S}1cT%s9dKj4inW06)J{1WcrUMHd$^5siExMTshMh} zilq^xFgHn?Y}#iY_5vMk(nNPo2i`vjn9?T#_h^rL2G;{iIq}?3QgMU|}wB zc9e@E`fB42&F;bgGZBgs*AxPy2nK2#SzSWFSrK6>GigR)Xwn7tm7Xv!w1i2{dpetb z%8;P!6U&E^Qg&Az-WNu{bAPD4jOka<51)!IXF`MB1~p9RH+QO0;L{vx*2HhlLkYAr z9dTpk{CjN;?0_rj;R;LKE|h=4(n&Dh>? z1)yf5^&AThcznZ^96&rj!lxUf%<|4O^b0Kz1{zT2#t`i3fpxL;5>;EU471h` z*E1XsLx5U}V?sJWEywZSldxU5JQA?jF{|@)k_aD1T2LAhrIuJ?nNw+7k@SZ2S;KUc zcF9!4Rbf{z2=<7sTjbVBn>|82EPm@B`DA6Khe?X~KK(^ydeb%{mAWmixSG~@DeUX$W?%i zy_A@GrSzQ-f2zrR+$|O)uyTHMpus zTU|3htslW*A2Zw(j11sVsEuq~klBtspajM;uPYl%KcntsjR{NfEZoTD9`)+q zG7pD&)GWm)9@Q>5=L#Y1+4Pqx9zEABL(t+Mz2~jY1}In+&v_KD!jqJjbXC0i`HENX zRALQ0b%*_m7Epa8x8gqDlxbDn3KztfUEH#b7607hdjk;j{ zg~)b@IKng2bBd4fKDj~!`LYNyC>k&`;v&IVOhUFUNe`>ie?C$` zaHSU&kKY&=<48xJ;)JLVwZ9w5_=n?>j3eY%E+HAN&ZQ+oo8K-X6@#kkt4oeIA0nab z)KFEQ7?h0qe2Li(i?KyD+kx^I4*hu39Ni%OijjkDCs^KxcyO_p$Y z-YiEX%VFE;;r{s=Ju#?{ZRl;sk-~0h;+d?O8Zjb5F2%UA^8uZbWYLs9qpD)?AN#?- zLdl3L19*Z^Huxu!gHdvABxG?_VJTupgr!;*TPcVSy(E{2}|+EhovGPmLi;9gr#g%BGZ2IFF!R%n&UR>|9Ct~>nK*l>ReK5 z5k#*MC$1BRbGK>{LbD%>MrO`9o9^Pd&T0%=k|j*YLrdFqSLf22i&4x{HhrZOvy1B; zWB1SmODSeo=hEF9)CB|Vwo+aDm*cTH^GkQl)wy)nmThzXST<)d2OvMZq|G^5@%Hb= z3HaCJA;_Vn$1ASRr3tcm!0rt2+MpBgx+TXeuRdjT+uH}%^7z>*j2QM=lR(Tgry5S` zpEIgMvsaooB2dY^k&HN&*-c?#$N$Y}MA-CLr?09iN7pwzZ$Ny==I|6~>}Je!x^>Jh z?rH%jx49O+M%QMpRFIX%dZpuMD5!l&RSRh?>UqKsJ!eQ-o89{30mq`4-HQF})_`N7 zO}gYNfIkJ37I!KV=TvB}t8^-u>r!Pz`ADQ*L8szvCyvzrzHCx&Wx!NTR4zj4vbvK* z=|38vv>#iYK7{_{AfapCW8`JnhlOkg8txwv7K%zo+zfh?FS+opJ<%YvfFeQ7!k>rL znXs_=nt}R!eBXjhZm2*t+PajVG7?k@Fp?_)1|$h0jsb$`g5Qb)5AR-8Oh-$GkzIYs zWUJ-f*(9lk6^I|7I;p32wi%GrYnuUTKl+D?G#6uw&I#0&k1kt)m~>c%1eNujBncYS zl|`KBdrySES@|hP5h0sQI;sej^_`|7^!@?OT8#fj56X&zC?mCijZscTuW6->>35c`2_9`M$C#G&ou-;#kT;6yoza>=(>tf4 zDp)Drn6vroGAK8$~>QG;b)LekSwA%a+X>hnA%`%KFX--YCK>qj^JN zmQ#^8zB;h?Ci~Yl{OmLI4MRO67uu^v-dtgc3t(I=X>}4=|8Vq zy22ueST*zd(OcWjib7M-T3YbT>beXl6}HCNVy9fYDwns4t#t`kDk0RyvrC0G2oR0~ z3W!7)Lz*B!fE@&wL?Ons!2tm#2m(P#Owt%J5#S8MI2jFb#{2pHe&?Kf-|N?}pZ*w` z*+sbTefOSw{`~%*-}#;2VGAwmEIN>{rwnnLMR_D>qsD}W?1nfmsG+B=9=ueFhqRB` zW<;R~@vD_0DLaUTnT8^qNnJL9Q%CWpYDNAX714~U#ngyDa{J`_jZABb#pDRWR+)P4 zU}ZAO?tscG&Xm%C;~0RXbL%J8$|rI zg7xyxseF$^cdpKkYo&-Q0c#d~#%z_{DEDhmm?tn@Q7EzPi(zPOwWld#7;4+YDid_t z8hV)_oyHUdt!ZRs%E~lUz9WUY(I~zz=D3RW1urqazVl&WKkcmp`^o8MaL_bYV=&xP zL(?a~3K3R)`jZ#(LuT3TV*3k~BpiBZoWqQW0s3tXq9N{;(3!z8ZzL87ZJpk#2@M;WGbJM4eXfMxc(@hPvevbq4|7 zYSi6n3D#_ie@MQEyNqt)B;UZnz?CP<2Y%r=+FvhYafkEge_ESAiJ|D>_uDJkBl_4| z)aSB6hB=_Y(m^>fsxHSW@BH;hz^~6cCn5sIW)?yLJKM7u_2th2H^Wfeo&*MZ>XVCRB>L>#j2jqoF|ljqN?YiK}s)y zD((WL|Cs1}E!9KRK}9b_)e`l}c&ewOS5~W@3Z~3jdy7HTEbM+!^~MX-D}NGEG^Sp; zPvu>&SoXM8dc_hHIwz1etZn)DE<~?fIIH|pAFG79hUxymDvvu}ZR*go4cA)Vu@dvF@{nD&1XFANp?R0a=<^R2&=9&d$}s;>(4LF)&P)4% z6h?%kViZ)6|K|WA_0y*wFS0pCCP1lF{yPpRtn3(dSMU7QNI02s6X0ZX1P53C`3RpG zpQo<{A6^@LTuK;xq*PYH2Lm+%C~ntCs^-E0_O5yfG3~@i(n6vF8G5QJEOI;O4@<=M z<~4QRG=JO_F|$%LuqZC*9B<3nwPy3Vj8}aZ4%M*R%5go>R9SNqK$S+%BaqXV48i*O z1acB92m!7U$munPfEp?e*iFm6G6Yt~n~TnZ;lU9J6|y2;C=3l$HnQE>ZVyP&Vz%Fx z8wtq`535!74|>LW&5B`>t=;Te%#+Rh0-CvLY5uU!`A#FqN?+~p1x?W?*yO@!HMNLc z?7Xesm(ro+CiZN0C@87GrL!-8C{~@9v@Q|St7{lKGYuBDQL!hO%+CFLg1_WEXB|*K zL5*Wpn`YQWGS?!E2GGM{ z)@?Q`H+DY!KA;P@iSW0Z$UcAx8JR2%E$E_ORiBcdoPg!yVdji_ER+- zQ%$m+fuo)O;P4bn%4&1DA?lWU#U5^rGbG#8J=x>9rmjt#oGREdCR?`@iy-B+WuOi_ zvj1mDrOWvq-ONIzf#MmbSiT`-78pLSeikRL(xV)07w1qCS5}hXnNSDw_gve3eYbJX zezv4_exi6@Zj8qB?+Irmo|neK^Sejl+1{>&=l_Gu-JsD#9NYZGFWiS+k2nVX9Va+| zWGD%6GXT*MgqqprQaef`s?DO#%bFci0l!0R1;lz~XFY2A_|u1)juQkbf-b4)K4YqS zakfz`Lw4&?(|Tk5v2P(t_h zt(~8!?RHV&Te9f@aqyB40$UurObOD;A3s6mOS4Orw%yz>>SF>G97MnJA;y1t>LK@I(^}#YOF7i?-G=!O~9Jikkjx`bH zFjVr;D7}q;E005TX_0#4Vwc!H8Qb}3Sz^1ZS>}K`$N@`jhd65(@)((u_w`O*pn&{9 zTg=I;yB+KU=dxYSGI#m5nSc@_B^Od~`|^GdNw>J{<{(He*O5t-%Pv;sxLhMwg&`MT z8d}XWo-6yB<DfmKr#k53V{c9Irvj)}dj2xW#8`M`-ZT+-H z#_VU=B{}xg897SIp#csXUmBX+sn=-PQ;E6g*wxt%b@l3OyA~kHK(9ZHh*VDaX69z{ zzY%SaK9ND8q#Mffq;t(gxU4GSU$jFaScb9R)s3Mr!6#R0PZ z21qDG3jmx_Bl6mk4Nd-?X?NagZ$19WV!6-pXpq|D1>09OcH_j;S#}5O!42J?Ozbcb zc9mpelb9NnWMYpr%XD`uEEP-yLQ-N_CnRF!4kl6pCY!?=3rsyxkYPv^r_x->Rh@z| zNLXMg#r6n}IlgT!S~TG@uMC-_oPwITEFf9A?10j^Y=_dg?3x3IMq>Qv_DIcqgP$xE zTAJH{gN$7N!X+SoUVR0$UdOG6uklX(pD3XHO4BgtL>$J3YWFvs zSNCHd%}qC<{8_P9=t(Zw37u-RM?QSAbY7ip<3g7g)a9$Qc`js2?{YE!zEO?^Pm;A= z1j$i}btR}KdvE@*5u~MGKVA1+c`WIZ<4FuQD|%e1b0i_vlE1pULF5RWn#vFF9pTqr zZ}$dzc?vFc7#R)?N?(oS2px+YE4ieHk)sgi1v$%MyOHCBgo@KrKRKQr%x!nNn%nMh zMXoJZ<(j(1%GH5Hi3p2YNs0Wr&IQ|U6Ku(fMeD*g<(rP$(E~I^LSw5&tf~>J@ywuVq^Uu@_`2aFG)^!3 z6{ETm2*^j};|gJ?VC{Uh;x|k3!9FzdAxh84XC-LGGw4idKz^@9K6eH3IV|!y+)qAV zJ8$yYlgKBk#HHcn!|Fmm`JAn)#7{O#m8krhLsjDKiG~nAFtxT&7DJ} zNUZ|Pn1gJW>+FNxe|GqE0G&qiR`T^5td7X1i&~emB=e4 znzeL#b@nQ5U5VUk&G6@O(^+cQ^~h_Z5Gak~v3pu}N@_&i2~r>q&+KE`Du*XgAd?+U zg1s(HVz&I%+4XB^l9f^vumWtNfEZ8{1w@FNCOI243BT781rG&La6+QsL;yOs!9f12 z^P>^)dUKKnHw9&Ka=0`&$BvMSGMQu@yP{0)YSlNye9()KQ<4TwOIXKmO4KA~@`;w2 zRZvY&x!{S}PN%@i+|mQAT!z-`guogv&jT?>7lSQ6m(@7Avw@)|J~Z>W=63To9poUp z+05tda~t*R8qUk&vWt^_xa^*LMi4IiSm<4`zz&n%W@$B@?_eiEaSE;shl%bL&#T{u zuzo4GE@H0dZlZVyVpIgI+ld=d>u-)i#)it#@JNHS2W6TcDKe0d&N5U;^8szi8FwV9 zyC#%o(}}tq0T^I2#VHoP$;WK#8?*_;jA}{DjhfIg6t}dma7&xl#_tW?%@TAJMleP}$FEn>2qkU> zYUdLC;532n8Qhk;DW&!IO`!#3=W{T#)%d(slo6A6R%}uN#FD#DU}akTmi-a^nr`}G zGu(CEpy4QC&0Ds*xstn`B0TeO#*LTBgkZpQgCFF|+veOXC~gaY^IWi5_6pf;AR{Yu zfxC7w&v}EKHl``xTh$L$Ykjck?pn>M6x9nYv}YJK|J#7OqZ!T#Xo$>ia_izoH!gy+ zV=p!)f?d82(v&9j@Q9x1D>k7dM_lNq9U36yVBJ*w8<5LTAxu}hUa);trURViZi}(R zosT!`(~&dRbfMjmFjNt&!S7^7!aPPoU<9c%XrQr2tg*$F{$^MDxz8xJxzbx^X^K%UGiDSkFv)e?>STqhDPFqFT;YqBnOWq& zWk`+Pmcq}GC8@7ENN~))+AL$E;Tq+gYH-KcR=PruwsC=FzPICy!bjt)jM-vAwu8jADlL>?F|A{K*< z9Aj3%4IYOC-aG*!dBw0QL^W`QR5v6xlxls;#5 zeR#aleRS36{@n$Sj!d8B@D3o}IO#b?w_ft`9UE_aA6qrP|K)s9b&M#ep@FY+7F#AYCJ1T8w!M4D3Z>lV2N)pzqQp& zbQ@%V+-wBai@s08v0bWzRUtL#ilF3!heVOvi)CFSMHVYs6e+sJ$?DU0kM6i7a2n`1 z`d(ce*74LUYy*{1ACXFXy^DA}E~Ja!NnPaY)vzUdNV5oCG=;{2g1FX*qc$kUt$V{Z z!m5mR7_(<5%#1WOgFn;!%nxfTr)ZY`vdj@s9i-fPI?V8lt{`G1J3mY;)malZ0mkR6 zhY2PcahL@0(`oZ4Nlw|u%&={U?L@W`Rizc%gdw#6R@e|>uBS|0tesyEe+p=Ye83XU z+3w+dXc?*o$eHaemPMdK%hLHXslBDmGx{I-Mt-&Z^F{j5XN#5y>}Hl;k9IKCJLmI=>V; z&qA1W{@{6b{^yW@`8h39WxHLwmTOi`9#q_neMOfL(-n_oUMw}&DrzQ4S?eS=%34JU zLGM3R?7r&CYhMT0%+v1@J=$KYR%PxH#Ao8^z0w=3J*?-K+ z=oeFSqP$kR>(>_;LU> z41NZ<5M_F~Yj`7bo1#-3`5nxu{1b10T5Fx+QJVxT6o>5Teg5>b87Ead$AFD*Vl?0p zD-L*MN$4iphs1b80UtpLpICYbfg2c@TnSQT2y7?&VQYthWoiT1+JVR2b_v^E71&Oi zyb1?z)65I%Ch^vWZS0qAh&5UWqOMUoX~u`+_v@@M%3&gMZ6tDKPA>b@$n|z8#%V^h zBoIPNZ67aS;q-Ih*pNYL6Ge1J!z@^4)lK|7nq1FKS_PbCJ8he+q^?z_J6!@Lo=Tpn zMxf@}JphJwSGh;jkPNl)2m9fyTux1z9KnfDak3|mQ+wB77zj}=Wg?^`YLXO`(O%U&dWC>Q zMI><^86qho97PleHvIUSiQWv;Os!W|H52{m(@Zu$bsnf_Ca~f2f8LNJAgU$PQ7UE% zsghe@!6zY=K_w^a__+8%Mci~piyLN7jtiztE^Y#-wK^K6K4M@zqiJenib+ei@x2yk zm1(d_r9lu)1aaLeIL`zpug(=8DUMVQ_v*x;NU8#VLc|b(pCa>0ab(j!Lj}vBNgRdV z2D>1QCg7kP4LF%M{XRaxmn%j=^*GvL))?lxL)=2mjQUA=Ih6V%J!i@pDCcM71&sAz zst*DAaEpL8hFJvL`z!)Y0;(2)O(WKz>DZ|NU$`+$9@w@V15w6@;A<)nTt`DA6CnD#Px>VZDj ztBHI>8Y8XqM{NN4PE_zEh43{; zsaWHlEy%vc(6+B}`g-H1%g=ZC=iBwh8ej0wJ&7HknYWIs1-|*`-zz`A#y{VcKHu(r z_oQ9+IR=G&euK);_rEK@?(&F{Z`B($o^9^zUSs5ZEelE&{D-oFRfDg2@BdUq9P(Jg z);zH~-u`#W&tK~8Umx3V>=~#1Gi3#9weLw#Y1iT{xLSOLxBva}^C7^u@ehYy9RDZ) z);e#lbHZD;JI)<3vsu7Jb@kdhRejK{YCbHdh)0UuFu(!Fw z)c<6?vlh+it_2_pVeP)WH?1yP_*t}aSy}VEKDM@&LSd$vM)W2mWZm9oV(XsnFddli zkI3t1kLjf4$@9+3Qer4tr1Ei3F<3ER=ixEOfz^Mh#)0iVFb++y$sTDF?aDahVg@0` zLoE5(dPHUO0*D(qx<~4rf2wN^XN2PV9ml+;bEdpC^#Toscj73XM-WkOTDZbjASg|W zivzBvyAv<(b%ZNR&eg_fGqUQ=IN19>A)F3lz?=y35Xcm0(TuKv4#UshqzuGL{FRxu zS}q(w7-mT@4ko2xE8$ymjPN^|LM>Y<7K8p*L!w7)_F+hDu-`0ZxtYX6uIaV{9?-Z! z2DDzD95|Xui?S?d7uPtqfPq9=ay&~q%eM#&wf+)p;fASHqYHdIK^~xO!rDieZ$l#$ zp6cvxX6-URkZi1$t5+j3>pilHqvAWiKrno3Zld5=P`!f$jV2)!y{QpAFhwlLRPq1p z+mO{V)`~4e25I66piS^O8*9;}mH)^@FA*s-L>fSF3PC26bEl$wlqjrK>|l5>STlbj z7FAFJ6S3`cbu^H?INBSuB?7=KCVPYt>M$}rWse}W@JR7VGv?;f8sa=;OQTzLD%w=> z@Au737wx$T^~mBk*6n@QdQSksTxtoa}tHfu4Gf zJKri{=>g9seVTB+FVyxEMIEA;f+(h|M8QKR3Z}UbM!h5oi?vY5g@sSy6!MsDaH$ZH z{CDiifb%J0 z=0%0;ca9K}(7A0-W#`zN_nyG0-PzcWqpn}sU8iSnOm^TbZ-mU3K z;F7ajAQ2Z?tW|TTX4{KQMMB{p}XKg@pGCT=)wF zD>;ezBhJqMITq87212zGSF4%w6Y~m)geDXaiHv7=A^0}ui|Fa zBo|4aJm*mb^VF%pxx~#=6$!q6$AaRa665Bib}nJZ*5Tx`CGqF2#>rLb{96-cc%f6gSmWNz_70bit1?}#nY)#B$vo$e2&5W6fw&uV`mFhaInDi|FtPD)8_G(gL ztG;HYW?|tbJ`L&1J7_aF^d>H-3r!m^aWplB0!4_L&1msOnjN!Pk{z2$)am4}QWm4a z3c$Ynag#eyi0aas}B_6B`hD-it0ejhYPe$+5RF~h%m~ju(!zO z9Rd~vFJJ+)8`u>L>&|w>;axO-^wrvUG+?OBPFVSlIE49^&?fN(E%-H{ByS&VD?zZ!z zDr6MVWKjAzP(%`!GI%+r2L2tVF)ZEC*v+FFlXt7y*g7JRNssq5u&>Cn+==pm$x;AT zat=GhoipWB0nAzg86p5}k|F^JMAIZC2tX~71Oe!@jCQjnAFEg%haTMK6YR+GHhmrB zcq8Si0Mw$qeC~0w-7hsYQ4a#dCf-2+LJdr~;{-el^1|oiupDYt%LHLsZTU;NCM&=NZAp)U`KahuYvgR-SU#M_~>IA028l*ILsu7BV~6>%G%Vj?S_d-+3}#eCqcKO zj$YCSU3B_-a@Kln&^71XC4(+@g=p0gBiQisqM+;ky;0D`$Q*#Kgmbx>jnmCE4|QR$z9%>X=1{8_fGA0wSD+eIKNMYjF4P7Cqf!3 zoY!v*;jHboXacf z3Y3BXc5o>AJK3(tUw^tPB)HTlWmB~$<$D{;p1iYl z>FvooO96O`n|S20dKr{qC#&JC))acl1fVD)*^^EYLq*`)_GD}f5f~b~VN_$uo(zqR zAq1_b6&98tEL|*@Z&mUiOfqPZ%+~eHu2^GL@;}F-PoGuE)cf^UC4VBlA6%96Mt|y7 zCEsPdx8ADcd#%(@d{r`bZuF|;CF|U}ysZV=*xKq<$zy%1lA0^F=F@719B&pI^~eRs z8<^u?i<2?lKxYaO0U7{|8=~_%iby;B%;b=4t^ZVk}gy+2fMW* zQp_uo3HyU8i+T5Zm~!35L+Y6y8bvT(pSD|{khqt;PsWA7px!sMDi>~5ZUly9M?cML zS*Y}=RNdWU#|Ah8%2j@*~uW&Bm;!hFc``|qoi@FWeW zj~!1*0alm#*KcbyQ>C_~04r^c#Uu7H8gMm_e6){8G!YoaBlp`Z>q263UA}kXDKg0(XOioUNy0>3b;ji>W0Kv*B#m7| znPj|9?T$=x={sdy0u&;b_}GH42HqfDicgl|5_TNy5|@;A;$s67<%#(u)iOC$w4|^q zg2qvJAzZR{kjmRd|1gjF9W8m8`5h-ptbxvn{QW8>mx{9qt3v%# z>eEkNmxLvyNmv|C8KqCEGpfs~Pu^B?N(kq&$drLtGZWJntxsZGKLLFbG0`6l_7CEf zES>`?xHspMgmSx!<sj+$aLa7v zVzQ1E$8I>nmxWiwq;t_^+rn0x%3@y6ziUiHknki?f)=B3jn}rzYuiC-0>+vl{4YNj z%9Ge#(I13nkk+ot9r|gD>(b5qLiXicrft`xT<^_3r*KlGG@nGT}Ceqc3J7N zn(lbEG*Id?4PTNj(-T4yVI^XLly=DgV2UY#AQ^9f;2H-30p~k_f(kFEg_+-Ll(7nB zZZ{z{+l?M@Obvu87!gP*oo}Q9zA^(g7j;}tH9TwiJB-h4C2X5{E)=IX&)fN^Bii{9 zD`Nq?`U=aT8t`S0Dgj?)N>iv`vgxW34C{0P``S9;jr4q{%i5js_n7=zm{_YD>#DJG zd~WPj61+WF*-|JCmN{2CM-n3b7{_(xo&}eao^3C=o%qZS8pR)At+ev*xGDt*>3DdpFgSV{D>1M3MH>@ zR!%+G<%YAcxOe^J0e@M6Vs|wVAL00-kipG>_=tdD!YG_c+zK0^5P|F%k=Jlt7@np~ z6DAr4!!vAc8xMvnB-j-UNs%=Qgvd65P_m7fkr3tz)Fk@&daKi?1_NLd=ODD~Q62;2 zv!YvW!5kB`pQ(VB4TOXAdAmUSw<16m{-Mv?E1<=%F7o^jkvz4*a2(LGBXCX7lIwa* z&>k2Mw6cH0o(Mq8p~W&`0Ifg{XaTvVMuKD5W|8sRnRI;mT&@5SF+2#ww=@8vp9Nz; zWRIZHCwl}Flb?=Iv=#I*2=s7cZ7AN=7#E79Dl!69j=E74D)#|k#82V}|3IkX@r4SD z?{J82=S|FSIX(nGF&cv369oO-0D~Z##tniiK+uTLw@Jnbu`$4Rb_Dny9~*pU0{H01 zNbm_ZfNwkCvn3yaFXaq^8nrqLHSW3~*sVi-_X~EOoZ4W=E^mV!NvIR``94X&r+w|? z@bK~o@I5#-_{jfd)JIoFg72xOzWXcGC);_Df$x--_ES#`gzPXj5VFJA$@O9P4Xpsc1@R z`oUZ;=#q+#!T#jrg$qz2e^DX9{~Ar43XI&u39ze}IHrd;m-dZow8}d#~ z#;tEdNOLXwMglt6H@^QL;=DZe4b$CGidmG1W|`sQ_6?Jn0sDq&ga(7YPH;Sb6X)XX zMBmDP+2FX23EoeiPm!JYIwkw*)<6T+wBjDy`Z3w7DF!-BNouIyo^8^{5)7N$<1|&t zWtgQ!M8*yKXe>ohhx1~X=qaMQ+_2yO5ieqO(@GlWo8I}z!yZ}R)W@zGENUAYziUsK z7RKDLwrV3W7Xs0(W3nc~?-nNo?wiXp6Uy2yUn?|Pk3OosT=UY9Sj_VRkQrQa&$xdk z{xriKH-_@pQ5TCwn(MXz;KpQWhsPWWi_@8uT=ojuAbDtci&TY=K}X zuw#lgCAg~qJN_(zt$-S!l_g*s{tVdICMB?i0|z#S2qbGMR|2s4#DV?J64*`QfvD9! zQ5reGsNO=|!N$u)&Qq3FB9OBNFS4F;$_zi1ZzIfyZO>K78@S1sXZAEntodGf#ssk` zMTf!1aB59OV$}Wt!KL00pZHU07jTl0f8%x>CK|8cW7cwARlc%|jMZ69ZHUp%F(~1~ zWR=|&?lc1iILjh+Lj?tye7bkY)o!cSYJnM*i$%|ZK$Lrz)BiSz)gsf8@vMFK2AF|@YYxH zI$bvKMtTc-<>F6=j?x)C;^1uzl3#mYf#+oy`K<`Nczkc53&!e+`aU-%c+u^b3cN8P zN(o*Om2su8vI@L<3-1xwFN!Vs_~HQ>=yVt$MW;z<4$$dPK)#^_WS^bB2Kz#ciG4+k zVme(b?8{GFmPVTFiW6_xf-53?70VibQCc+B$Ff;q*{CoAO~s!Nacn(tEKP`G zQ6J0@hH>m(7ic*RvAOzd+LoLvg0Hz?3?t6 zz8GLxH-@wis%i|`OeO8wTi-a6^XU>AN7_&Yxt7LJN!_@z<}&mVljIuQ7WMTR@-;|b zugC)leH+iYzW(P@U$X@Wv{0Gbs4#2@3btz4YgSE8WQ@$-%A}U2QRBTbIgwHpO9GVp zC7t*ElS*)^gRM@gB(ob^^5|4Yiz*D!mX*YKh2VfY(Z(u2x;!1Ajd0^## zmL$Lm_L3RE>E)c0G%E{~y$I-J`XQ45_v%&IUdxfnF-%MfHd#ZKa=Koe!MnF9v}VTa zCff8Wm?-C=j=E1GIKfkNsE6Q ztxbw?u)4T@meSpho2Rp|yB&eciH+gZC_IHaa11%iS(H?#d5H;IDmPfOLhoiTRU(wA zlE&uhq94om#UXN}5q$BibcWgraI_xz$ueey$5H5zlWxPiQ>QzI)QvhyVMT{nVHN4f z9=fB&JO<23bo9W^@a1HIIa&oZML5r=%Y<75X;cbAs&si&;~#nUo17@r9^Uyk&f$0|BVZcI_Bn z5P=r>LR%#(917x%NjJzt1d}G`&n(1}JU?PsB{fzDH_E@{3`-HTbmUcf6YJ>a!DVEd zWaHVjp=(NwOxLKzx+cNFcctLaX|pA}&Q{rVqdZXbKue*s1MIpXu&X>rIxE|ba%B|e zGy?kOG}<5r*)WV>+5aehl}n251%5r;sPOBC3csqc$gk>BQ{%W^rgoWZ234N3WAM8f4hgXmQsSyL$0U z#IA2{Hacj=Cb?O`5WFgw-a@+lm?tsX;77Qmr>liMb9c$WpGF zZk+7RNOidqoTctgcgA>dgS4CJi=YHuMewnmtWdp zdpU8Kg({A{6phcAiYs-}bXNm65@*)T7_r=>kyZ#4l17rptEbTVM$kxV$Ok1cBU2gG z=Ywjf51IENQ8vdNdmorGBt<0I$(kO}q;k>qK@=b{*nNsfadVJ2-|4un^C0HGYnQ7) z%IVW^I|=0IOl>*UW%n3mD1oO$WgAr(#V!f)uF52KZvY&)FD2PwWLZCQp1G?7_YDHG zZNfLWIU06`Gl7#P?vy+t2s>{ViKye@<1^)TKyuzp8}i0`s#cwnO1YFJREdXr5G4A7 zK3hsZB;=D%Hh#5eYVW!wnb%&y&%Xv)VEAM5u?5|fVRFbERnQCb4m&D##!OTl@QqnW zl}gjso6xP7QgW&|%?BxfZf*Vf!rjGLx8v2U2TLZkNN6@dWjP^{8#UmLTvY zT(BbcaADeW9T%IgG5eM0ybo%xD%$_Y@QLAqhW&?S*$Z)`wrr>!WuFF03^!IX+}A9J9TU9mt}7flyd1 zWHk8+$G*yJnXSS7+-y}b2_!4VgRU2|LPfAhv!ecd4)I}Lw;(|ykc&l9pbrSz&Qmb6 zjSG|D1xl2uoW9vEBLP;J|3^ma=P!v+J6eTlAJihRg4l|A30?_ft1^2vhJXcL@0bI^8g$^InaD*1Uubxhbqrhu z5|hS1FXe)DBBlZXVk&1N&|B!sdj92-kJLX3>ljxGi@Ish8WK`3wxN@uAv&iPU|2~N z=cKL9Nf+M4X0ehD2-^QZ$xD}@MsbtXXxy~bxoL}Y(`IoKd*Ma+jRFb?%=D#_nYxjg z<|8v%F;KdYTQOm`JHSlcn#WDoBoU3L>>w^p`C%ubJB1(xB*IQ1AW{CSC`YB^U0-$1 zwo3L=IPrP0*Nu_8WP~_xIB%_D3xfHhZt3R=#mU1J4_3J%@8b%HU0ktwCqen>Z$ZPd z;p=WeOmU;}ge2|ez!Te?C+6p7`gnpgR<2pL4`m7I5~xnPgu|5K00B{nXq_dt(*PgV z^FJ*)LVcqwdQ4@tX@Kvn8R7fln)z(W52~M@DdyVwK|1VW8XyqG2LtWiQ*y%vcR1E3 zUa9?SyE-ygEKoT#uc#GJ zFvA6!7b9pF2Nz?I%E4%zA2qXyS2yFvmZggACY2&OwZ-g(j0spXGh<&T4jU7r_Hd-h znvqrNMG&oet2hAgL*pWf=Fd~++V1PGl`HU9UbR!kfwZJ0=*{vE3+DVdXTn*>H1HBJ zofz~0f*uzZfYXcQiEb2n!L(V&t??qAS0onEX?wTQHg^j<8wbqBih1>b+a8#e%Wh3v z-eT)5IA*#W?+sTqq&o2EOYvivW0!X`Z0E_jDG?eU9Bjy=hqv6aXX#9EeujD&cOCsF zkA?)}8!d?t#_Yqi&Qk&)Mr`t^&h|6qDgc-)sJ^Xb_tq@%e!|PC7mZ z43m01!xY%^?R(Mvksc7$NCjemS&ge^T0bx38zu4T|x2gF<4cBVbicw?9ieUzU6{9@@vSM(!%8FU4M=^W5h^`)q zZcxxxhz>8^T13YdX(KunSw(b`4G`TU^(xUJHvklW;Lj|#Q@#1&I?sr%nR!-?&E_=5B3gyUT%g&4&sz=!DsFQdd5y7m-leqI)G!ORj65$AbdCBzM zke12i(3^0iS-2}wt#5gVYgp{#}hQU$pETn%sli(D6ACD#G0hz3qQ-k10n(al%QTT|L2^W^fk@xE3E)SQB&Z0Fe5&oTgz~1U6#t9=T>6V4 zmE+W?Bekh=149jA3`ft~0@H;I`7MJ(KDOSFO;xNrWXZ~bA^W4tKjho%16Y3FdPBZl zqHWzFE3{@{$o}Z^5BYn8SU$eqkiRz;VJpgDV95UH@(=k=?KPGJkGy=(dPBZb(RS-% zS%HuPL-t3Pf5@u{`vdC@`KO++9~tE3d)FIsv@b?WY$^N!Ec>I&kLAY(3HzPv4f(OL z2wPDU14H&lmw3oOIDfqyOpnCM?^$oe!5kTlW7!x31NKLkc);JR*PFu)k(p?Sl;%j2 zqp#|k%aiFJvtBbVo7!tuBFh15Owk`)YBo{BN~q`e>Hu`v1O}mcQ7ia3fAV#jQ<}-b zNfUfm)L%4PH{-=(lfr^0=8vzWP?H-}SRXPpWKdPj3pQ(6Ju}7OcP)>Wo9M=Q+cH1R`I2$FBR4Vd*BFBF`L+KaJ@ zYgm+&tLvhND&E!fPyUwruXTRCFTN*QnF$ejvAv3jx;kR0&{Bybqd0x40?vRRH}7QL z25f*E^)>=vy>?lQU$@<3-?)HwZ|h&Q4d~9Wr;R}M2a{T1v~r{~L@*68KDZyi3f;Uc z0P^CkN+h7dbC#z9{0hxN&Kj83bj2y|jaiwJf|#n7TfeZ14!@j$uQf6d>EotMIas?N?Qq+r$Y!5^D#TU z#e+&I2!*IHevGoP3fWJxCp|9abPjF{0`yk=Whr0h6pBk{QSJ(MfvaPJM$K;Y#8LY1tt^4?qBUSVIm(= zk?X03#dNO79R?bf{p6fI8&+=;R%4+y|Cr;8?uR+rMA81ggkI*%T@EbN4;IApFIXo^ z?(Q7P%Huk=_sxjqY4Y*d994M4_r+zVCtkN9v`OGmH4^=DS|Z z^2OIno>-9?zaR$*+~D0W&q-|XgV71}`MuJvpa4gyRf{9FW|~x?Ufu(OYO2Ok>X#VY zJJbtxH%HZ-oV4OGsd~wNyF(JK?tZ2HL+1q;Q&tX`Wym7b3~?s7P(pB#V0XA|T?Lj8 z2e1$aAz%-K%B#kK3N;S^rLX33U{dzH0+REim9;?fP)RGRVDivvTKP}_%0m}RE2?_{ zEd6zl2ba|S3Sce`tt_lfD+{Y=1&;N?*<6!6f#)0+IzC_v59>+nmxNW;c{)uSZta`F)PpQk{4(mUZwiBcA)ub2NzvH4BTOypqd0Qcaycim zM}{B-PsNCrS%>UQ!tQ?qTBQOnCl6>KWGZ3{+nKoj{HqeOw5rJ*Te+cu#apG_m=Vx6 zP!5)Hb%HQn-CLisx(P75pt|>t1rylusRD|oY)@6)nwDKi-J6XZunZvp(0xjVb?4E^ z`b;FB>I!0`c(BI$9)z2-wil*>OuhER$@g{g1fYl)vX|K8+pN8;XulF;N>+H$U{=H( zt7Y6xGPBZJFUbn$SQy5@ox+cxnNs<$JB?}Go7phY#(U9dwwSXJCefWDK5Qe|08k;j zq4-FjIzC2!I*5-2P1YFSHeCZgM%OTikNz4QA0unfEOQyth1sWZL3c)TK+(SF=HF0;Yz9BwU+X=N8j2@iUU}XQYKtR_pGLzQ{guPU48SpUfA|JhkSS$N`JSOc z-7E1^bn>s8z;B$M-u@; z9BjBOf&MT?j*Jxfc(R|5AE;wBxPfY>s{$HCY{9WM*D?xaI3h&(Gc}&>#EWROPLqT# z5L$z)fm?Kb(Uc#T5bK#@k%Ivh!bdledKfA)DDV`j8V@M5Kp?tRFLrAvZ1iwanVUgA zsoL2&cDq1YIArL+G@|S#g@Y=l^7WFnY#T1e!Be!n;D$G`lT6^F9@7JDb3ga)IstNaY#CuBHM{ z)QUxW*~|~CR&QCyO%!}82(?~xrTMs1B~}iT3JxT@g#OTF+4Ws^Ht`joyt3DR`CQHR z`m)J;t_coEd~3}@?l(aJ0rsN)Tg2792}6K>->l!lfihon9^v4i7sUG%)PT1Y_uFs@ zS(dEP^A;H7v-mv0irDn@**wUZC_fSF(_M4U7AM~?SVeGvb4)7*%L!nR6T|zh0AUB1 zXY_S|)ikU&0Gkk%tSW~~Oq^wF!^T)scqa1A$gdxzdQM2vWRHrVTdzV9 zOFcYiySljKsIdJ?=;j)J;HywtekA)IE->76To@j&cLOR^ZA+w^pWYAnLfDVkeE{wn zzxu*98Hss={np}--zQKd*o#h4YE!FGMg(-AQ(Co;H$yK+jPUYAsmu?G2al=BPKg`K zS~OLB!pcsSq>m5Punh=6U8A_?9(_0ysJPAgqlSYi#bNe_(MEX1XWE$_B)^wY3X>v8 z1kpS8Kg$gcGp4|T8Gw`^acF(e%m$T`GjQIWkL}L>df&=UJ-m=zk=&6ckg^_9L93a7 z658uYS<_Jr43aYS(L17z{Z_&`9g>*(vH_?OfrcC{H3GwGyts3uUV7V53z_%AgoJvc z{6nG^xx~enz>XehwG_Q!fzRhYD^NbOxaTXn{!D&m|KeiJzPGhMjn<~`DxQB_s!R%8 zlY3OgcU5?n*+>h)4A|sG7W?odqoH|+Rinc?dU77n%eKF;R_gLJ25c!D&9Eb!wTkyY z`2bydPVoi1e!i9;HVuUUmmbiLnO;_;4)Uobi^hc^nznkjNV;gSW`Nlv6q&D=01Np! zO)+Uq+3s%RxivVNK~Uc6wNKNc8Fto)erYRU9CGKjtaQ_`C=}2l$k0r!c<)D-7bUh` zs5qCY?Uvd`z_N!h+(}GjqLo^4P8M#F1+H-SiujWe@P+9`{h5sHBos40zAv-|>=wn$ zdKgrhm&o5{Z%nk=7tL2dW+d0X_xm)M`+SsG$>-O!q0#K7RD;Y9{ZI|Ud0g-5Had6o z^GBnCbE8Z^FATOKWg2hTdVnp)HjBT0uf{u_e}6xf3p?TtOTJ;Dy^I*XHccQ3WMxtu z8!6BxbJ2H&?RLG>^Z>O9A)p=$3ThBZ^9SF3@#L@XD;974g)5yRnlHXm6m66uf|2EX z=@{=dpVct0d}Q8iIFBvlsRg7w9W5pJt|r7Qd{*%(Z(}lB=#vMk5e=I7*Sht{8RHg(ewdD3(OhPwI(Q@bPB0{vj zCJ7sb*GiJ~jn3yLGwq)a&d-YXD%-7pU5f{4NVBTe!{Q0--e&$EOTyjl2cJS-*Uhy< z@^j0_c(_4}#CNfMS8|-FDlbnFZZxOiviv!ATsT^ zV{6}5{oH|#BculCi=nRxJE^$c;YmTc+ch_9j6XM<-}hST>LCOS16-BxfVvzm8Zy@Z zY<^0`Xq|Oa@-AuiDFcBWNSV{W>FXwYk25SHcll;WKhI=jql_7%s6 zqLZ17Z#L*nB&=q>fDBm(uXHKs98gKh2jNA}W`xsmi<(zU3{k}@&NAu)_`9hL|`7RyboQYge z+td;S!w6%m8=N2QsHLnq(ca8-L}k%gCZ` zv3Q7UOi}dKdg+(KDyYvRuomH6kZLNCl_zkh|14QjU5q|2$*8k0?AK=hmGjHACj}P# z4ZAmx=5tw5pQAHYc$-RTdxu@nmkcOBE6(9IYU<7_%03a8QTIMk0PC=pe^5kE_mFEC zTSyn^%Vy&2oV{hA4wLR>`EBO0&hppTwfbfF&Zfep<=S~o#b{mK=Ev7;vxlUjRb|I( zhE|)QRXK!6j}~m1&jiWG(EBCgDF= z6B2=hk=a8@n0)L)(<7C zb`2=~>L`+Z|C;?VNwcIs zmdK7z`8HeFncd4qJKb*WP3&wO)sA6p`Q>|zpIB5?vM5dHVtS-ccJvp0v zvf_kokPc0>nD!8NY3>Bd#y(kai@ay?eyY-*GE>*yV{e0|R?Mwbu-i0r zOuj?1nZ$0YAA8FYT^~lI!91QyX&mG?seW@yWgKjq);P}jILhwp!C?2#sr!0C_sgE^ z!C=o13a+ONH#C2^Y~CIMaGUIuk2R8m^_|)2fSmngc-+}I#RhObKbp#EEcd2ghKHqk zWiWSB#Y|U5ui8#C9?bp()`)ZwPTw%}U~m}AW;rd_vD%@y`|8Zd?8$NFyDRD{@qQ17 zE1gw$+lqI^eXEfa?8x@M;P?2P^VUN4P^j)is_wy2)oo3+-Ce2egwR+HAlce%dJp2XU1GU4UnS&w%UNWTr zqE2MHsgSAq(Tvp%naA#Yd~R)7lO0~%oz3ydLUt^(`3kvFoNZ^|meShKx*eMbK#biw zPU-~>dw+oKqOJhx2`bW6gy?;z7oT-dFa_u_jnYy!gNrUh(Xco?{f^Vy;8N6F5!7Pn zMK9^`(Czy|w;2Z0EE@)d_A---zt!YHBj_6+ z9yI%MV0@VV14Fc7k?#;=6#>P|lwyT9&#OK21+{1M=1RSJ);^q*0)+s9yyWJ&waw43 zX~%ej)FzZORM|WzE6!%Y^V?Z|d%cmry73#y`Fm_b628K8{3oCtuX~J|v4-3j3)!+L zi|f6lOT5M9^s%~DH#N(ZCkIz4G26_0ir@b@ASwPu@Z-qoakDMAdWtBDC`A-`7L`@a z9Q#)Os^lx3X?NrSrm>?Wh?N_qsaSGcGdwy{FNm0#YiaTWoflhi7}DEv)5;Ft93?bv z_eEFkb`khpyQ+5R)AUS%4{E)rE!6JTgRAWU?paD4DN8UF=D}U@K~`|K@B!RInyv0v zO!ci2z2XEp+!o6HGkK5clGbEqCSpI$0ssT9LEVZVOp6}E@$@@Cx6Vi z^RK*)hUpCybaEC5aY(27bQc~JNrC6q{+6dkYsERd7(DY|qRDUa>IL97b5G-EmQ>yy&+2_}O1b3>bugt!n z_QP;bvm}ePW^r$=kdk9jU4R+BMk2$Q4(ZM~rO&$`n8vs?`Zr*C^; zZ5TW_J`5gQ7Y069pAS1c`l=7`SfWWSmL!E1!0;X$po8Jv;oiYuEe9|htAOE%-8&fW z);%qJSXaPskFJ1WiK~I(*c(TH;l%i0IAIl!A_W>`jKM8n_^*Pbuc-i%6$i=MB=T)F z8c5_@;of0m-3hQcYj2!HPTRf1=26|#)DLt8Hh-@xuvy{iB=V*auz6^F*gRwvuLBzf zn_x2nPJPV=I4zRlc^K)u*7TZ_&TZk|!DBrN;5le-96bB&-obN+?rGu8x&ofx(iQM5 za&;;4+athpa(wWd90xp%F@a}HQ1x{ofNIG>wKhq;N23fR_3m)*Ftct(cC$AQvm$f4zBWG0zBUfb7;J*s1;DSbI{|*nYmnM!G|&LH2g1FB z&3YQZcGBKB*dDZd2irrsr-d);3fR7+D_~pZYG6Bfcm&u^jSsd{ZGg zK)A9V34U9nk5Vn%J1njHQL5RSAl2+XNHyKl)DLu(RMS;bjjO?O<<1eXe0Y3VK0FRA z8Ek^(C4_5VHv?Q3StlPV1vT>s;Jhu|J2-6wQ3~3dAO-C{NI~7x!kcxK6x3BxkgI`n z@tq^Uc?@G~Ok3)hQjm?brD%{bCU8DQpzZ5&0PT{4)(1SyR(p@25~XIicNp8SqSUlE zL2BB4kea%usSoQasi~`^CRbjq^z!zvRnxBu;of0y!;Mne-UO*^_dzP_o~C}FtE957lFD2S_J`g-0`>>ThyB5E zV9#I^>@Oo8`i2$oun0E~mEvOED8<9QgWpCRrMSHbQrzx?6xTg1yjfRCaa|?Fxf=K% zKe`(H?KmS|8Xx>iQ_h19{WdI1+ zSg|(--w?!pMo*;VqJzNvZ8!{=l?zjI*c8uYj&5-{Pq@>;T?O@5;GxKp_lxYQHKIhG zFvr6aQ|@>;H|36p$EWam-~p|EKl=)tl9lf}_Prbzlw6#4m!-|U&B^2b@0zaw<9c{i<4jq}3b)5p z$r&rZXeMOz6cj7zVWpB&UdaIxl^U|HYAkYlQk5Jq-|13+C5!1{rIK@A$0zak!+LmC<3w4>GPegoeR0CdW64x2Sxyftl^pj<&Xkp`aC=OZoU!tY zCcsOWq=%JCPI)B%j#_ynYIQhE z>0zak!+Hoz%1V~GJt*hY2`i6Ws8+I^9#$$j?vOPx!(x-`H!jeK251T~jX>Q@{7TwcG1i14BwSQ&8 z0T1B|>JPg(aJIH`KVNBtRXT5qX1$TD_*g^FTsFmui%;3ZbJlQrctQ_h8J0^#?bFY% zag-g~B&p-(pDVq6mrX-nd0qM=jP~+*O&b<(loyW5#|eezpXfK-Rs8g zH6qkMC+HBO+z<7y1eiS=s1t`Ap>FO3ew}57(~1<&c9={1M2Kgx>hD?A`9Re_4psll z{;F+uP1OfkWwRp1zZ_BZ+drsYcLu6HqNmWx&-PbsGfmM7Ra=qbXGc_hzg2z3K-FIf zRrmUika^yr zr-6AYXf&HyutpYGk;poIXe_=MzFv@ZAP)VgHS+Axf7^8z>6y&CVjwXB>ETsgd@5=z z%u}v`5dQEZtKq-%frw6wY&b;8mUR|bAaYA&aRN((czB4bAz3G~p!L8JImAK*xq zRy-E!o2zz{ykv4s)6HXa(~1;x!-mx@X4DA*S&8C#YgPGa zRY0DzQWkwRRQYrLRl4+_DC~9db3^K*JrST<&A%i#_mQ?gf4~+HCy<=l5BV3gogeq$ zWx`i&lP`;LRf-gWQJ;TjwO2f9*Ii++k8S0#(f4oVu}9bwaoyeQ zF6t|n=26TUDb8z>z|BG%@U#aD!UM7Xn^Q{zWZ7&4IWF2ZqyM%z@|Wt-iLl*Bfy&kz zTA4zR+RKIF&|g&xsR-dZ3L&Bso}SC%aBy1%_TOxs4OVfs!=jG0r?chDw_;&>qkXk3 zY1@jtZLPI{an|mevZwUJqK%zhiMUXlQvS8b3aYQ!Umq>S`mAr>jaX}?yH+==%nC-2 z%kqHA7R05kYrYUZC)WX1ii{N$uC`{(6iXS=6&NfUe9p0++3sS$c3rb4_Tg^{PWwaJ z&P+Q@9;{PR3&QnRm~6z*)2${?Qqn}!Zx9Lj-Z^lk)2McJXSv%(5FktW%1KV#o}YyvxT(xV_1vOggtOAJ7YQFAzUKfi z*Ztx|?-{I@H@nYxKO++x(hFm$cg(8RyKHkouc>$lCJ>5J;TVpl8PvsD{Zx>-_}uvE zoLB)O4dABS%1p4aAgE_)?*-PbCk-)d^HgzkJf)Ay<`SPGF|^y1XX>CTZ0Y_AI?E;k z>L6Dl<>{6-zY|Ub|Je^de1_e1uh0ctKc7ej`Uy$9gC#Q*v00Ab6JofgB7O{g3wpe* zJKf#b_jrdM@9O5=P37aPU{dGADn!F_7E}WK$a5l*qv_f(G=9*~xFev^$U;S-_7pEO zd~cqWeu80EDe*p_lT6~z88eLcFy+*O}h=}Z&g2rB@hF&}QON8-X!yFT>~id_ z{FskAjk^_vLEyqs;}$s>ryr^eT@UG3g%^GF#@g}#F#0y}r)kj6h#Y&L#(F>k;3`HC z7|;O2;O#`5njjuzPdnD)gAY8KiT`esn1LPNsA~(?DpxV0e;l^Cnr2~hne9>q1njU@ z?TKGqfEd+x*=n=~#S35MCpOM8K7r;req%rr( zU@ZJN26H98{!KHVwv-IRE0;vYd+b$(ml_IH3+9P(F%X{i4_{h_H~*XBz-jU5pR)T` zv=q&aLZxDnFIkbDp@hK$_1`G=e@CBgO6A^Wzpr*-1Q0Kkkpep4_Imye*K=ZMSwBI^ z{igX4vumI&Bc*qkJ?jzJk-y(+&xq_py+BkdC+)MNw|QsnwG&;lJxwv$?r|$%oA<2B zT9;A*GQZ2g)&Y*TPML__R3p*JW*Ncg#>PnnLF*PtY#j_s5REFW|0@VQ@cI7$jq5fp zA86u-r5U3%Va6y=&SC^QPyrv% z>DC$XHCz;rslP{~9r@^oM6?@y=EFYW{4WOtV1Dm__)BE+{a|oN1{oUu$xM!ZJ@6wp zLrnTr=w$zd2<6)|;}ME6$bTYAIoi3{Qjt!??pP@-3z(I)sbZ<1D20RWV( z5((DyfeAvBra>5rP$Uego4>$al_LcIDpHF$5!uvYK6|HvVexd3SI4wBs+V;CDsV=b zx4E94nIjoAiBi6@A9*mRilIPIoqtLX_z7l+x(z=Ge0_dx9${fNu6F1)U4_^LA?4YJ|bKzy;H@FZn1p;=0z0n5$-a-qhzl>)1jf&>be|g zrxg^yZPDKPF2Oz1-V|OQbPXTv>qVwB*JQgrS9kzn$Q7PYJ0HQs$f>Xb8ZhKgBorMc z5$-0twQEHZTQrre0EqjfTJ=1E$GApF)H3n-j8ytXBzvO}fu>8fy4fcreYtbBko0I>nVdUo-<@`Cy28~g zWml(@#TkRil@TV;f=?CJhKkHo+b7YlHXJZ+G+zuA4La1(?g?**-e4Bc&+=eRwk7=N}jJR-`M z#sZAC$Kkv2K~`*Jk3$gd`*mgYYmuwuCqw3nO#PG#c;_Ux(^`=wgXK`L!YT?EUPwjFc$O2_(%|aS6MYnn~;9?XoUVj(HgVOwRb2P3=eQ{V*acV((mhVAwkmuxG9> zwk}DlChRQ_jL2QEl4lo#yKX0r#i*oM{4(^_2f3+Ha2u0Cy2Nyp5Stl7@kozI@8&x+ zh-nwkLhX>c8X9C1d>pIQ$zbeF51|UY#k4rI@={OcmH4dvg#pYzb zC0;}IR_Sl!_-#v(ndTkJY~78qc`@AG*8HYb&C3d?Hg8l|B@`)#^I~$!tJ2q)P1c^1 z)7R_^d!QeJcKRV=O+S{ZKNjPUna%pDtg}*GwKnckW!$H_xKCAqdmP2bp`k7^@LpY^ z1>03a41w*Uft!x%IdbBNuE@qEuBNecfKc(Fj|q`mqPkjFS*@+YFH%!IQ(%$)R&FNI zLS=&E5~+vR+} zYBf>(gF)ljmmeBebnxXyIIuC>$Fiwgj(d4<+LxNy8#Hcxj;bBi8#eO3<&w!N;naMXG*Y}5}_M*aCPYPYKxwNg{{^5Uz8{O4T$ag&+L z`F<0b9D>-E%}qY8DDjiLUvUV`CV8(1Kwwk+Fv|OHRUq))00Fm?fPiUKR?#>lF3t=N zOvo=~K?h2cCJS?-x2c>Rph`5Ct?YQ0mMUEY!9gJv%#^jeNly1!4Ga|J?@%kVvOe_d zqxQ?@Ce{}wob==Y?}-UKd`?l@fvOE@0W%202p4bNJ;G+n_ZX<@$gRTalbskDGz z9p@nS4$?~U%cNU zK>=lt?LF;PJ{|0MbAasD>3Hl#U#D%=$JTk5z0$eKrL8W~Dv36{ z-TbppXSq>IQxxQ+RdyGC+wA^z)y7(LB8K}L(@4YJYSSchT+2+b0Q zO9;p*7|1%IC7uS+9l?WX0O8wbxVS}-Tw!;t1tM4tJlkH_YXDrEA%-@#Mc8PtyJE|` zV$xJ==@^3Vm;}6kOi8bzh#yNk-7O!y08;0=gwElYbHRhg@h2n?w%cQt9=;GrNaGDl zAQG9Vqw2zdQN~F^w!};*%z=0`f}2K)+_+@Hh_3=rz80c{m@`u*DA>dVlwv6xDy16Q zy{0)df0x;;yYl)#?S^cg=N}8}H`)+H1*>|zv?29)P^_)fV>V1|h@#tiy|lr5ZSrAclD8E=*wzFS|P{tM((NEKIBG{47?9Q)AAfxj;Tw9aZe;VV+4Q$5023o0`n+4 zPL!o0^Ty=B%A7bWt`Ws$IDH!zhpNvor>gX69IHIn zeSD7mO67GQpRb?;Jukgm-0^;?@*Mjkm07vaE&nq=Bclc0JvBR!$tWxKgOIHFr1>iU z#TsEjfqAS7n5Q|z^xu{aR@H}O8Pdx1(5FP(0&qlpewSE=>{MNUq?rZ~H#O)Q0Qt!i z#;@mQkuBN%vRh}s=$KXEp3h+@G(jD4s2@X-s24-AXrB*5qh72;99g~9A4}CAblg#C z-$Y#6H`O1EEUcSrwNSIUxo7BlXkzXP00eyR!cnTUWawok3R2XQTu?}w21p2~&c#@b zwH8z0kbO75KalaU4g2P`P+jYMYN4U@k<;<;!h@6P3?I`0jbiy-%ZTZTd{JN)Px6Dk zsuJ=o?FAsB>^3XXPDdFaPFP)T50pKN(kJI!m$&!U^V?KiMzq>Oc9!E_d_rL}zOs7B zipM!rd?%^Wpkf5@eRbP`@M+nu-#f-gMn%SWhkd`XI>w`Q9phHQ!@34kNPkx^4*j0M_UxoEsYnS9r-xOv z)K?Kp>{bbB*@jd?dPpj{$7(MRkD$%NLo2zfUi^`j4JVihfi3NQ!K?Tu_F_YINC$^j za;RQ>-pZzPhE&M`tK{VBN)8OIO z_PfNW>wGk4YK_^)V8SOpR*VWn{Wk`&xVtVZA#Lx;1W9NdGH^3Ce*QYIyTX0cOu!(R z{-ISfRmIy)Rlu9z62vhZg}axLinEr#zN93RN46)VD(aNHR_2TP&rL8n$Op)Cbdf(# z(KkR`vTG*^OkHxFFv(>i!oJDh5Jtez8^s$;y0ij3E0UA#JytWFWgkU;U_>vyDEsq= z_3|vwNA&V>#Ioe;StXC8EPokS{yWkaAl07b?=$T|=jd|1__2W*!$5SaZdC=o^@ZfS zboxmv*C(oO7$|BwVQ=xqcSEgAoU6RV<~~sRb$ioS$MpksBq#}`FYU3IJ%G}VZ}SN# zwGOVVfl@sm0j$$Psb&GLj3lz~C!DEYubm$iO4rk~mYbL4rW4oJe#y4F)TIZCzqJt! zm3pp5o?EN=DM@V2*fLo2RSjz7MgH%s%0}^HoraP28uklOOIe9f`Mx#Ttn$U40SO4P zaS$=0C~dl7h!tGx#VTAIQ!lTD>)lm6xy-xHWL}az>K2rT9J-c_#3rL&EAe2{ElDn> zRxYo&Cx5a{zao`NAl|>9(!A3~TjsU)iW@kzM=Szw#EWO!csiKGxo-U$n=G8njJo+U znCVtaFw?b(mEm&+-0uszaZ6>zzG%4My3^i=2;Khi@_k#VY}*dFBn7n@mfcs{f;p!; z8pS(;ec}5XD-yuK+r2uwL!fw6EfG(o`=1R${;U3MQO|Hm8vsA)&rHZ~4nqC|{!D-_ z7PBC+^4E%~MRG=V(;|Qab~@LTbz2tM6rJr(>&}N_cj*})?9b-Vf=F;+jh7|s&9E)~ zApPmidcU=o&iYK>_v<hj(?%V`31Sz`Cz-)8vvrx)om zPw+K0iVqsxuBfWnUA>u7cR0yiV;!UcRj39{?MVr=bc|5Gyq_vjwRRNEk~A%yI2^8b zbG?=}7Z-hxj=0%&N$2ar`~Y zP;KUhJ5MNH7!42?^8xK;wKnjl%@*&nq8%3v!r}JbCRMUY_e#}}PF+*m3;N^(_DL`v zRcxW>?dpD8@fY^`g#LCnT**4sY_UN%$%CY`9W?;&GA4zH;;emD>2mRHdlHY51MVEd zhwb6&>5Wo5_ThJ}Sk#|ZY`QpfL;z?e0JMNTFo=f|nkA^-b}K!fFYXOr8Hm(gOODp* z;`QOVnVkA;i@jXPwptn7rqjjkR%X(PQDyQ_X0w$+I87IeRwhiARA#bg{jFmXYLK!9I?rxU%{JF_qJ;yQUiTMHE zRgIN8nOvH5x!DziQA7Tl8lHH_wIxsKd%mPzhx=3E9y-sze49TPqkbbi*Zp6HdxV*n zk$20~1wHH4)3g+>v3i*wcq;3TF%ma`A;0L|`gNCLK)R z@5p|m7xXB;VA?O9^U}twvX~Br&Fik>P7-u3)Nl+%C`$#CuLvIE^`kIYTs(I2UO3G(L)aG z^ntkg|GU7>$`r(Y7KgmbC5%`YzJHrUl*I@D>EoH!5`n^1jbnCex^#RQLs!;kV-|;! zWGkf;E=qqYDYd>Z!*WTLToMVS-8f!jd1nGMiY5I>gVT?pLP{?VPVSor4Jeuaof9|< zwlP7IwPZ1JRvUpHvJ=Us@Jc&{F~j21rYku#GV=W6xnMqDIqF3N9~c(8X>MF zgA3xsqC)`L{+nnJiVDH z!A|=HnOBo0fVc^r4rj{`kLC#tk;zbjUbf9h7Hj?D(p}K0}Tw@zhn(brzaX2f8(1G`2>lr|VRuNo0n^7q(Q4YYe^8Ize}5gYW`H4umrcb!&zN z9IDRgqGg2naz`M)Iq6BEW$GTDzAjEHMQPEAdfAB#_+5NA3_fZepS-vvWT&}HP;k$wl-j$_pEQFKv-Kx`(|IiU zIhn-th!jVU>DJHktqq)Soxvc;JVFW|RBzJh)fSfG@~lSB1iE}@Z3j(}ptai-l51?Y zp5wuSNQdZ*7{_RAfF3ojlSdd(7vvgXTRk^<@HY#-S}@jcFo(yv3cdzMg64ES|Cr}U z`uZkTm9p|svgLXb8=`2y2}HK_lw7YX|Msil|82;e2Wr3IJ~S<5K`c)G80q)Dm(enp z4U@9kwNKXPw84p*pxfepdmRpvr_yVme6mq}|G?_^Pd>S^TH?XM60Z(#y}xVywbnmp z-?sCkZvZfEHDQ!x1x8P!_`mlR|0e&egq5WKb{jLj#q`8t1- zs6nM=y~*A&*bs`Y^WMQp9Vfknq*Yok{@m(odS?KyPC@%d_1Oz&k;8@7D8Og_VC>n= zI#8N7tYuIsmtR3c`$`eBwuS7L{*KgRN7xDArBqv`uhd1aui_-EoegfujMQMMQf`&n z44t<(Y(n#IB}DC824N%hvy#fOQczX(CjZyj4b(enb?Tt4R441w=9z%7YW-)ctHuSv z-SqD^k{_9?`)119%n;X<=A}^nAzjZ1SXi{&%O80cSA~Gw!o|Rb2TPAyWPO5a59<@S z&&Clvk&H%d+EA|R1-hVF>soM|2c5ypU-N$ak_CP?4mZ+KdL$coIiI;!v4fymlE$n- zzK5>i(5S3ob;HVr5k<%Ofwt#+)5ST%ddqpnoc8ho{Ifj`tdgECzE3rW<-PRu4feDh zYltW(4BY%if_B`YOVWn_2SySkX8Jp4C0s>}zrFbTz z&!eI&v1zN|a7eG1zW^uyZ8`m%zHTm>G77Au`xfN7L9qc?xol;^z&kqm5Yt0MF8yPR z8|kFP8J#>WtGH3T)$ll3Is&%{RjdSRv|I5q24Z;OER)s$m$$bKw(BbIJkQzZ+m!%L_##?2;Dd=iJsVP?~AN;`|Tn--y!v|NFCcc2c&Ojz2 zIEe|6RzP5bZIHnUA~@j^l*CLNB7-L*f-?~vlZfC+L~yE2Ob_$>|DUz?+56lp;pV07 z(%t*4z4qE`J@4yzp0$>Hr=rOIk?}?o?{yP(R5`ji@=P}Ia}%m+cdJp~f@)7tolOL% z-T{ajs=5!TlJl%xuK4Ol{MDIB$Dyp3FAW%cH@K1Q%Al|K$Rh9cs*m}VY`r1U zlWv{~=58DR3mmH5m+jvzZY*`8d60=FyRm&8eU3PKuZQ%jw!eY{CA&5eo<50umB6C- ze7+z3zw+nX&`S-H1F3!Rc$-H1V|_zKa5#M2mzZG(#Y5$5xsz-|QByEFRKCU)x(lD! z*6U$+&E#wz*g~t+&L8Kp+T#Kby$L?QULCT~E*1UR!Lo zYv$`&ezMl9ugTv`TUQE{vX3LGUDsrKW|IuNGX+c40jq5Rv z$}i104~g&~Hqhz~a!iGs#0sixZW$rKX{Kt!Ug>3tZ3TO3WVMgHnX(;>98OzBTp!VE zdF~=5BV4C;yok%Nsj-ghP_w3+;=+DK2&%TZ-JpS?1l5czn5NwwrM2CS$u%6~SFznK zO9=jwc_cf*c6YEUx8#F)TyD`~N{jNPm3r&g-9BzLqSxBaR`Rab+EW6w9Tim}_Oycv z(IK)0y32F)S^NEgWcDVFz$D~yeQ`T@Vd`}omw5zRYEy~}=U$IsXikSRJ+uTVbz$*j zGRA$_Mq1#-hGVg_vfU}OFny9{HpFKov*Ni0>dmwT0r8i4o}1z?u&T{)zWxBjC_B7C zFaj*yB+8%7aLoT3rp@qv#p`XV~MsGe%FuS`4HC$i8hsq|G6& z{KIkx{b4(IMih{cfb^Il9CSwnwcup?PrRlC1I?Pqx@K$haf$of~qMobM=}{APT1{nODqBxO+Bz;q{}2ft zhz|i479IVaO+*`PT6_5G(hZFXs=sF?HJ#l>i%fx9J)_x>({*y3RxzcXTMa=SNe!h^ zjC1qr3g^;mK%+3Pd!7lR~tu4A^hK|e97Uzl>d_IBIYuHyU(`aJs8w`tHa zof&C&O&*)w2#Qu>nae`kb4Tfs$}CSwfO0kL!ICzQO36!0sOH4Faw$5(rL}Fg79;#->g;IEa+#a|ot zgq{EN!OnpIaoJz^+iuY%{r@Ea@=0)q27r*jSmaE7#;CbE;Tl!;x%HkVZXeGoU;wca zKA=*kdhQgIQZ1IV_m{Kw&_~Lk4dxl1uSp&990(rL2k12MKid!C)7J#Qp8D6}0qneW zA2`IJXLZD;v+&)5XC8wQ;)w7jfJDiJea5pGFwAks2^#7AC$VV+(&*Hh`&<= zZ(7dii%osy>}|;vb)z$$^o*Z<#4vN$Dj(lY(LQn}E_x^D1P4WMiroH^zdPVDh^WZMYPDL2Q2Lm`{?7iksQB~V1p50YQ7#d6SoPu= zVZl_sq1Wkk;fkJI-C`f{5FV4DZ_RdZ3AX7;3w8At8xWg`V9DH2Uy_fm>R;^nDRW{s zyoV)KYAP6E4t~KjYGkOO#5&+FzES?Tjv1coW{C`w+F!8ZNn)Gl)WqCAI&SE+9fP|H}xI8X8HMAb}+f+rmWP z&~O|F53w>4CX{ENf&d1kG=xdryo8D1Y=~Q!6gUHt#F$z5%CK9z7f#_`7^Eiyfp#Ao z6>-^}P^!Qdf{`FDg27U~6qQ0>+qt>p33(JzN-Qx4eUIrbv#A-|x#p`zMDHpK5C z?)7d;ib}9R2)b{#v^h>=!K5knHw-oOPoA0(Y#T4;2j*w6ETB+z-g)as=_uA%tDbnr*=VJ#Fg zTJndnC@Bc&z+4b4Kc96WodjgLP}=ecgF)mTrpn3+qdLlOc89+QU&t-Kg?{ALNkk($ zlACL?utCES^kj?#Nl=$+qXz^BPEp{eK8q?hLh4m3QH-_Y;@a9V0y$B|)~K4Vz6DG+HU08bT07uBiVcZ@!wF6y2ogdsu}F7yU6MzkJL*X}wx z`;e`|5HCr{6dQ_}j;$Ls8Jf;>@c(cJHdwcB3UV+4#R)d+^ck4TD&zlH2+KG@ZqD5UEam~E{w7C4yqW@kJY91 z9*5=+bw>Yqw@9+p7V0Mj1r+ylU*w9F!bk2B0Hk^RL~}ov>^$4OV%QQ?j-GXcXz?L} zsaIWxaFN`CE*i{6(Lqjo;c{KA^>6V0rH;9i_FK+ot&g6+0d)nF9pp09Q8$no8Y}r% zWj*kjWP|zEQ|Z!8K@a$_7(QkJ!d`Q+-oz@vCU7rqXp_P}bSFv#qq7JC0RA@cTLK$h z+!LmyVN+&B%sBpK--h7)-as$l-RET#e zJIJXgBqN2r&;bGTk-QSyLf*QYqSSeEAON3QY>)M`qhjf zIfFgkb(pqT?_I{ZNU)ZR$j~0DSCg0{p}d07y2)Mfy1=3Izvdmu%Y-*qUM9H(?b?OV z25naki%^%cP(v(sG)v<6F;DHs8)&Ka*F-51tc{e0*9Q8-l(O^TFwg)nuO9n^h?^t< z>~5*fKL9{Se|ZeflmtT6qE+@3H8H4CroNkGYa($;HdB1C`oH$(P;yX({esRZ2KIVs^y+)^U1cq1pFpK=lq zuu>R(9^&7)zIcOgFX|Sl-LDAl@)uZ-9+kWhI{3Qynt|e1BcTI-L!GhGt1b#ARgQhw z9fwRP3sORD%W3ShUTdq+0>LE1IT&yt+DLRW09`1KTXzqb=*xX)hnN<>1aLul~@C^q9{dBB)}rc@?M~y|4#su zW%mzag-FUk`w(I2qS=|2F!zzwy+Ru`Yu_o9R$wlA1LTV8{qD+SIW`>#Q{3#!?hX`e zWk#1aZ&_#X!zNSY?I848?Zc5dGtXi?l0{j#RMQA@q#n?`2+-Ehd~#D4>$s`Ka-y)3 z%o}iwMaBrSqlhm;DrW741$|PLiM20myYIwr&RV>vrGrWRm`{LfbfNNO}NGYU0k;7QVxPM z{76$d&F30LOyt=#5EG|7I^JAvIs$-g@3?Hw(eaij>v*0A^|Mix5+pdjY#7cnQgSut zmKQ^`7kaXZ9PW{OwbNhsVX0W`Cj{c?bjJ}ulOA`-P`fKKF&vSBMxyx^@?TW@kZIE3 zbsyWV&vm<~@0`g*rXLdr>3e4<4wUoL?ki39_k{-tydh@ntH1zz6?p7c$37ydo}=6{ z&EVH=)r#v29Jr<>lI_>pTAlP;lg%C=lWz5b2_gp}JpJt{3<8QEP*Yz-AJpE>6K5;O zE$)3oBnk3tBf_AaB&XEny*r9 zAFo1PYrc9NUq#yO4|xI>eex`$*{-Y%NJ72l4--u|y~XHFa4kkKi|iX=8wH7KN=q@7Czbtb)1Eh`@3Z>!#`TeEOxCo zcwjUL?1M_j5Isw8ii=c{t5&+$x8QOJ+U4wgm*bk4g^o26)s=@qA!L6+6xp(i8eh=l zk_l7YGQVkgy2ahmVo8hGG5UTohfpn)B(&MJ4EXjKhN0@HX`F&ApDX5fU6OqEHs%vV zIt#ycU2hjofL?Y2oF^x?8&9D_qq{nxWSr`WH8SpuOY(j`rse)iI~}PmV43FLz8f97 z>!^~&U&n*q)TRtC;=S)(%ZpWgh!H|>dnB^|t9l@ZGAByN@!YSz9VG&srbD zTb;!~x%Z>=Z1mJI(H)%f6sPM|#Mn8YGv3e+m0flE9DfNVWnhE%nUseD|6>`_9E{W9 zORF7DpsJX9zs-%ReDtZeaPN;kj-}O!Zdb|P)rTMNW|hN_C%V;1^{ZOS-fDFh708=k zl^?MA=4$iJGhLC`iDFCwiO(2sth4A=r`>{)!5IQ?jsEQ^PMbdY?qiX{VcgWaXM`pc zz05){jFseb*`WwMgo^GlR`t05N=ZY`7|YA|--xdkV^Z@Pvc2U(I4|4)-lv5dth1-! z$2^-m%l#pC6nI)?fJ+4PU3sU#jqac0-g~m>+O00mpxe(;m;0wR=X_pupJ9Z?MC6{U zxAd`q6~{&OUBfhO-DPB)qB^;6F5jM#Wr4$~uGXMyQy+eCO4Oqd3g(TYM-#FodLe{P zwF2i^N}kjj^jY-JcoBcmZ>&oJ*u}hJ;s(ey7RWa9JdjVaUzVWDNMLC;7iifhjE5>G zFr3vzT&6l9ulka^II&T9s~we3wdaMpykQXUcLbWH>i9z%;cTX8zKoxfHooF!^Xhy) zrIfAuyX>a5>K7ZQ+d_D^X(Nx@*FNfcnlUvT^`9xmq)~R)`U^MOIJ>edA2Qu}!QI(9 z!4yellQ-W9eXJ$>rRs0|R^ARG)nAM~lK=sba)rEMNmQu*&YfuN$iP{(%njcroEkSE z9h?55tK~fo7|aS=y#XOJ3O|n-m-MWh2K`b9!J5&+XV+phhGRzaz=q?+U^BkXzTfh3 zMza6Urms;rl&4ZB@apgRZWbTlNoH>(F3(nMfpP;>dRBBVHzz4S5_z-L`yY16{wUeU zWi{&T;g(7NZZ5wXbxLm8Kx7w}w?@f!ZjrZJx%^iFMZv^bNq4|jJs&0XPbJ#D=`+!? zs2nHj^YmEU{Tx^QzSw2|3rKUZdRVPjX=@;a4+DE14>fEcL~-$mFD8b$h)jP>Z-h*D zJ^^jcvhG$VhR|cp4c(@uka_~|^5N%gP)S-iPN;Vp+#pZKVt|JgX|cAAj@%h*w%miG zYs5sQ6t3Y;rsrgXUtc^c!IoftLH7Xt8C?^M&+8uGSO6yINWdvC+=B9H0CB@1jacgR5 zPHz0U>N#T~rBYJT6-jthUk?iKsMty0qk1aJJSq_CQ9Ti5>yFAXQ9^tk6U!)KOycNH z>IV3x`{DsC7sjQ5h@d765bZwjbUZ!2%Cwp?c@XL_?cWJ1`p9RXb=j?pjO+ zOctv5yZ&JET~R6CL_P*h4%>U-i6Y++gaBCe>rImn5$gc_$CA(}s!tiPdD>`!zf_&_ z=Q3dRtqXi>sXFQM*@=$0JwC%HUN26t{weC+(rU82b-W-MolO$B4LxC2xNY<+S?izW zKrS;-wJ$1v7uK=ukHMl4WZH|`#?*IZL@fr-R;`(5e570PHa1hT*aZaIXEBh>bt`LG z)2_=+GOD8-t2)Z-2`H4c7m7d7Qu$K&&eMRELpQnrHehDJP-rtx>D=Sva?Tv@v7v(u zrqQoy*2#R$-%Mt?b_nTK=givXL0G$1$F~?d8pzMfV~@Ov|9iehum=HAUjsZb z133zz0=aD-m08G@?PORSl6WP_9`g!i=9MHtTM{5i%oeYlLjr7M$PleeObf2FeRYgY z@=3Wu#t9J0suoZdYT@}2dA)_^MNvYKr>3*?i$Fput;c>?W4EL|GRC#l!TAdaONF%UIU00FNlKH|W*`nqadSp((WF7@7xG6HCQPjS;26l1d?AoMk0zY6TbS&MCX zIw9nVbUlL)R#S30+2u&x5wnQTjqz8ImA_t8a80>+^nYpMA&{J9poY!4{`lH-d!GF!GF_L~s@Bu} zaT&TAE;rGD{cFpzO-Kk$m6>YM%!#;!y3-$Dg&(pcQ%RdcHk(K+EH)!7yl})g|CnFQ zjO1#Yt8*^Qxu#H;rtO>C=CFEwP$L?~2yUn@_^o>4Gvtl4F3QoFs9YU$Uf!hjYpZ{C zwJi3pQJdE!HNhQff&v{)TV7jTbk)WLZh!Pa(4t4zRrk8}ymb|ugH|7K$sp}&iYp^n zBZedPfQzT$B@wj{SuRRW4J_wPgl6S`3o7Cm2qyAm7^82(rzzUPCx2~SD#zU3-Z_V) zkx%U3@7ri{bK22olbXyeZBk3QflUzAq=8L!1BEx{2~ir%4NFh<*xB>)@n*&#dKPEI z7B~!4h2kd>d0nVhYIcgqbMWqdHYA0TQ8DfNaxQn0;?Gu{Ex_s?^Gu80WMLnhPA!URaC zmU+NEQg0z{r1h_z()!m*>(7=~l{->A@hZV+2Y-^@ze=RELokYXBQQc+$cKd&sI_zF zwV>M)Gc>jqM+Oq1>@uDR^z~>hds8{hr*e(^(PfQz8V{qBz_I3&NIY$!nEB8yCn?V8SuGvD@j=Pg z+5po#iF`trqXX8J4z&~j6J`CQ$l^aa<+JbfY8(L~5h?Gaxure2SM8TIxA03wn2``AaTSfH24;MIb-8rReIbK?Di z7oHJnMqhqA%ujVZUIp3#%`dY7iRc}$h?s%%&yYNz9?MX=q|eW0>bebiHmOhC?S2wv{hlNA3BpknfSDvxKV z?hr{JQ-xR-c+w%fW1i-)m+VvpJ|lx`kDP6fcmmY$D6tSB9*Z*-rDsI@M(<8db*l52 zxxMPy)Nkj>y0y|#v@}Dir#@x0=2muB_gYKu$QFt^fqv^%=lt51$wYp8<27{Ep5g+q z+fzJSdr;UbLiq%k)y|%Q)Yq$nlveYt{h3vBl*UNd-*W>9Y#m4pWyWHWdb-A2wPmF^ zg{Ro{rn?5&+*Bd+TEAW6p;vv;1IH=DEEmN)f^eIU)>?`Ml07L1>=PiA0*` zGSNJN`s#awSLum;nAN?XTSW|}DTv+}OnFY&A-9j5S>sMoO**2C7@STgpyukY{*bmv zLKkI|zjmL>aQNM;t3523hw0fn)3bYYbxIf8+vph+^%a%j@cORuc6{K1j250TwS7)y zJiDl?vwxWEr)L+qdIHK`lEwJ~?*N8AfYH*?@kZv;^5GeR$KmZai`ZW>of^XAP_ML1STXvbDrPT3HR%rcBm;_XsD0gVJ``wJ)zue*BX7oxfEXM z%l_cV!VTpRrX@c}IWv5I^oVNc2MyJkK)R3RzX%y)?n2Sd(nTtyBV`iFwWNZ8XF?F2 zK#2n2qQt`Ji|!De3{p@<0!aalXOksDp&<1P=GA?*7y^IDe5Z|MC&1*BxM?jJ2zk_k zNU0UtC}~slC8tVCCc*!kDNTZC9$uqEH|SlhD~j#aZm4AttM)|x8#86_TPTmALL8G^4d@lA4F3h~#C_7zcp?bpHnz>&4skg-=?*AFQ=567iYHN6p zwl%0N;y&)hc5GS+m@HV~zSB+aJ0af=k@`7`q=K zr?X6h>jUT$@upg*s73z8!dgiT3=*6YC)fO@;k704#`PpIO01kulGq8#^AnnJg7SQ# z7ElTIGkvop-mC$k&j2-Yr|KpV3^t_emB?%nytN|1k`)0Q)bOJa#Umv2sN5v(mh6>K zf}%z8NcAbmz7v>P?1PWA@3MEBRmY*5&KUJT*EJ+~XWIdD7Q>mCax}~D6T%MH`?%r= z7x6>HxXbPz&oHc25e)Rmj28^R!9qCIiBa&I{4;%r4WwO36sSs~GF37a^4yfRUm6L5 z9Q}dp(BQ}Yk-NZ$uUn4gpngwETJJ*>zCO?Okj&RrSWY2cWv1IctEas1R73OAdT>>i z`v6u3sG}g$8<4O(!>$zth((|rrIy5lqr#GoIVx-sZ{|>-HwB03sHhAM6}%M~h8iS2 zh(v5OD&61qj97+Rz<`gs#pXw!k?om3N{9H`jK2nE^tFvbiM|%o}+9bYvzm1SP=UzzA{%No^TXEAeBb^GxKHe``aO>D{JK zb(DSj!;ENRnLG8^ixN!RI`SJU8*!)pkbrP^wpyOnsxqiprBEf;bHEG2lwDn$LKS6yNtx~9?Z3hlI= z#8`xcnL2u=S}WO%x(C;eB!~#Oo;~s#OSC`XLAAG4d)CO)u(UKIKdHXn-dRizR+WC< z7@Xc&?29g~_YiZ<)(&E_Vm8)`uP#kUb6EinOu?3AR)Azk&5h0r-Wqdtt1KuH_&g9@ z{VY@^h0P}GaSOE}0l|hcY%Re{z5kIE$Yk0sHy;@>`-Ku+h>uu3xt??{5qX21tsXVO0ph8546h_tr4Dd)sF4jdK2(tp|#y6NzXuINxAk zaDJF5*}m}9ZR1qDjP431?PPP(F$m~aMI<>#SJ#NUCj`cJ$AU=7ycLlG%qclX-d-!Q z9LY8dh!ZGuZA!MM*R~&$ja6`JpA3%4z>^&PifJq-KOn9(3@!M)^k<&E)MpIhn%6>r zrqBF!>oZ{YGVOo&Qth)ARl~ptp9~{JuvTAeoZfTFCc7jma}`_6Sb~bL8+zW|0DRBN zI2NJR#_5YAvUfJ+4K1QYzAurHx@Cq+#8y-{k^%{#+anE`-4A(?5?1>IQex1?OQYg_ zYkLtGH;e?T2F4Sp5N+#;uX7DkM`q6p$5vJ(g|UuC|D5jW{^-BxUdQ2DagZ5Er9C*W zCW?cfWDoLTn{hvs`d|)07bJe)5#m=0=1j6&9@Ev6da8}yBTW%1I{#J2aGF?OOEL?^ zSMZK*cPq2NP3!hbZV~mGu`1b_59(HK4NLhqdh&`}kQ9MNHZ!Nn=Jl9ICD5QLX9>ePN=is zW%N77GpFdKY?hiCP&mmtvg%nR4KdB?M5WTxa*>fXGc)>C8x5R$it->qyu>l76F$SD zFfD7PUY<8aIh`7FiX3pGInA5y!55Nkr&mrk~vzRybw5tz6^%nd$ef#CTs>FZw_N?T02`VZ5HAZ>|Bmc?z(eSG53( zixi7KG_c&S5cBAxY7%(}CiU-CI|0%Lp;yPbu_9FGveipLcdVTWq}eqz7>nLTfa8Jp z72Zi&%r5?2&A)A;9@8kFk^*1M54c{#zg@C4s`q_v6`42jk4$!Q48%K$D5u%bl0K&X zc{=akL;9PeyU7wk*iS`|-OTjdgiJrcp1{pKo5ahYiO%T34EL2@c8zQ)uS^6T5+Iw8 zinl~iJIZYaN`T-+*^r)W5y@Z4pVYz@VeU%))W2!%N?K|VVDAD17%m0PGC6!nb~VoO zRk2Dz_pJYYw>{Kzn`sjFPd5voCQpss*k6n9P zx$6im>~ihpvMjGXLK~2Yw)zSa zYl2-SIK{GrU`YE$@K^`~GIl)mLIU(80nQ89s76@DK(E=yVsZv}g}_>3VFI#J{KT|m zDe=|LEBB8yx`urw%C^h$4V#xyC^Zt-6E z15oIXoIcU^(C5O0j*6O8u1TaaGa;30%b7N*6regtWm)Lmc?3CHlgdulZjef$lsD*! zHjHV#eRa94-`5^?;MJg8Bdm)|LSy>0OGK3V1Q9{b>eEhPum*08zUo!bI5DA+@NVYiLk^ZI}#a%Q}Tp$40)!bw}surbF4l* zWNhE^79>Dg`XmD?JNWzP2F+Kz^-Q=HNLtYAszS^G=_PHa=tJlblqo%AR{>g=DTh9g zfzg+oi*rGl4yHNffD^Z*N5mviJxn@rM;})=mrf*~%HYz^Gv=I|m3Lm-RB}S_Hil|) zM1)OsUJ`CPnBlEMx|dz?p)oCLj=;!mZ}m`Go>zb|g9F8>X(Jy*j|Pm{>0|UzlA?^J z&_dFoV%kYqB-5i!Fe(H!qkjtO5x8p4PhGrU`U8pNXby|M9YFyp_ zz0YxdN%epF`UO@Vh(7hgYVVHS>T+k{*ruXS*!?B`RUL0_`t}?N%Jrs%)m#2Vt?nHC zz7QmP;wZ$#d?$XSUC?f1bb;N-lvt&;YJ4-o)Nf1V~o2iyFvK(QT94pXZwch zW8*MRP*0GIy|EuL;r)xJUB~&ILmikDCKIdbCL7`emL>BiZ zGI56bA4G6^3jP<4(RVd`=kl=d7v40Uo5DTY)`MSp3j_7Fk>(>DqpUXMOb((0IdbHb zFdU-SLq)cV8uy$a-D|6>|NkT!Ve#{th7xs<#1 z;z=Bn5dw*c;*^Z1CArq@GE-d1`5}`^ESRZEi11bhM=mA@N#5eU6HqUy|CdlNxz<|@ zp`Dkig;I}?=_>e`%16H~>K5q5Xw!H;hBDEvwQD5`jDP1c%1`gDfL~Njx!~>Cl`a-~ zMe{j7Mo>NH&h<0;6mXc=!_l$?GtzXnUPqlUEE@(%r~gZ@Ft>Qr`Ce9nDZ4Q?uj#VQ zlH8>+u(`azE(31#$%z14JIKpvObxR!D#K8)o2&kx6QZdt^(TJJw8fV@!KYi1ruA2U zR|At0mlbk(G7)r+*SkZ0XKQyMZw9eCGj*O|Ks~`;7OJ+tnSnYX(HshN$}FhCPA>6P zcj&=@-9}kvLLoB-ZM3yERK)vE=S%AYr0~*v?7i+&v)26rnX|2$b}82i6CJqxxG?jQw(2#pL}zs;hfTaNWUaexD+pJ}ojVI zH9KKS!P3^qOb+a@&Eo`ii^7f~rr>8W&7P(o%h#qEjQ*s(!}T404VS&hBVo)gf-~-W zH?4KXRT=%uVP0EYl(E=d$Y}EtpV#Z4Op*oe@JFdd4Mk#H*y%acT@vz z9!h-_H*2d|o54xs_k+B&HiMWeCC}5p=vQ6&Jl2s<-xdaA9ns@_L$z6Wa4Q2u{u-YB zSV$TOWViYnfmEfHlxr-OktKt4#Mb0x`OS6Y-&qEa*MD9eV994j3JVW$IXm&12;vgA z7pcg?L%CD$p-+@5ZmP^|RvQW~S^&hYf(FAn9-NU1(4JELM4)F=e!RN~@M}~$tvyOX z@N7a!9Llh_ce`-QxAyjKHI{`7*30nifN5Hw+OIw8eFUIv?m>GuI!PbxSZat46NsSE zAQeSlMALcwTp{Yn@`LxOc)wFW-LT^SpBl}nHx3)f73vC1VQFRyYTP=eb;pmL-h*9j-P@M}U|UZy5# zY?7#bh@x20NbL@e6XZdH#z*E;kK;UbdzRZlaNW^jQi)i>b;ghk15>)3N(VCwkIT3Mo-EYVxd9y8mpbWa0xV% z)kshKE-<(jAs`U_aXxSrBR8ym-=5EgVQvGkF8P z6t@&XIuJAjAoQbM(hXGUn*F{7mIpdV_(l?SZT&#G^+zE+0m#LXe5989_ds|vax!E% zNZhZe7Vb`~k6-yP=#l#H*E+8`(0Q{S3;pXV4DZ=2R`nWO&+ezl$Ts^l0eO9!rozIo zUe(mW1Ts2dH(A`D)4iO43GOm4^@`hac!EgYQ($K(jIbnJYDLmln%#{iok^8K%o@b-;%n&sKkR+GQ&$Ba`hYm#3oIo!tIg`L1TG zhoaIOxZR<1lPQThw{skf0J{G`acis!34(e8}N`1 zpm0kfjt~J(y^XSvkgkW6iL#K7l+9M9wt>bJy}r1a3qGowC}h#sjr7>viM`1c4v7{4sP7Jko1HQ|?yZiL^o&yDcACGh*_ zQ3w2L>z>=Vh?lmq>rP|wkGHuQRBy5+l+f#4d}3PN!P1*EZtql$CT@FEyYqOPAH@XI z9!c7}OjaG*R^f20Kc)kmB6v*Tg7}p>Ctd|^pD<8Isr3Z6$37#tu~IF8mks5#t(j&I zq+n~tkLwvFPwUz%hp~-`{XZmtZPwZdt{+tsm^R$gkwsL-2^IfV6yK*}d8-mSwk1~k z_V4>Gp+ozI7!|P0F}?akJQFJPOsF83EHwOGJOLGE1ckWFjpDRN;#uaj^JE?0N-?;6 zpBfcf1Rl`Rf$K=#QvQj8Lx5aCse&@VC|2N9c{q)7c9Isu0Sld+?s--(NDlM zE2cAZ)xGLLb#=%sLme(F<7gbXgh{qwNxH3^%=}4CX0f}scbKd0F*-I+B;WSN+q;a3 z_1+#<4;s07Hw!S|EjzNowRvj{Ud%MqpT*ICw)zOMVZe-j7v)S3S^U`@qerw#Eu;u4 zc}gfmIg3A|yk7jtw3)@9$daE0Iov+UZN)7Mp>8a0OwB#;2ZGQ-LrEC zaT;tbPW#n(B2I$^#b&Ue*z7IwKmt#*5@xQEpAp~QMRyXOJt(f?(#ag1f2MT?5uAd2>q7O8bSRx)S#MD!+UnfjM3 z7zJv?+AP5AAOx&ts14nO7NYZm;NiMRE;{SVo2M4a&C1*f1E?G<{A;&cpVKm`*WyaA zE05V{+HsZ`bAE4%T$3MV2km|;I$WI{lK;X_B`BT^#=x&e14L9-P-H{t{PHRitcC1Gx7 zfZiV)_X1<&>4YZHJWkz*LqzWGIKG9F!p={34^x2C5pzq^_?x+OU)GViHGe%_^|Kq| z*}?dA9T&X(`=iP}F8_Y&Q0S@S{WIkZgaqfa-L0#E7p0d1#&&RFq$kimP#&@U$1$*UQuqSL~Re< zI~GfT9d!=9Kyo=QfWH!b=);^g@{7_-^lzE-xJfP~{4Cn1WUIt4-5^DkU)L#fg8nb# zb5rh=To9ZJKy@HAPwpgrnlCjVev`KP@6*Wi>=(3I*bXh>AKLEE*R9jdXwW zn7n)oeqmys!$R=6GV$HS`i8wpfd~f5!w{NQ@|u#1>*vkxnzIo4s`uxN<;+5yL8qmDCUt0*b*Hk^AZ_aZ*jp; zB+$_jMfFQwTfj?QR%(DleXUoi1}qk@*Kh7zX5|HFDd%>A`#GBC1{`>|2?p}hT`Mmr zQ?{Yb4mzPL1S@T&-_}(8wsB59sVVgk&2^I7>M15e@#S#3ep^DE&N1+x4>yk}RzGhU zYtMIynCq&a9{q_TkTk^u*6pek;4o3Ul`aL zmqy-@O@Ik;(^Z1#IDZPMj8Nixya)ui>JM94o5e{z&615$p9HnIcIRFmar7kwY+2ZR zgVQK=p3;Xr*=-y^m!`D-@NRv5PwPW_^xD4apWKJE!bkSYY&uY9HZMjM+|z+ND0KnZ z`k#u=r;~JmrL5+#2ebjM!IBayXa~#7l1kx%NUQ+8Mu8Jsdba~jNqPGCdNP-4LC;AG zinwCVl)Ybwk0K<~cQR#M_|U3)+#Quk%$P`;hwl`c9F zEgQX$1+x=jO)&#W`5kc|`5mUj#yYIos+?5g*0r=;;Svq#0kqs~0d@x!7I4-x*G-uh zIBBbMM%>m*#D!^dy0BA3+6%H9Oh?GR) znjAY)$nPXG{A>34ef4haf^AJ8vES&0T zhfEqYE9`vQ8zC*Ecr*1n*%0Tx-?sf@uas*)P56N($@R1du~X6Jdd4T9mTg(6S*v1jB5;kYIJu69ZNj=OR%_Nu>ik#n;+@mEE9 zgXNe9I$xG;320r@-ZWPT$D67$pX3rURW4^7(Fg-x8D~!`bNuXz?p2%cJZR1P4vS>$c}BM!=sY5iIb-{@uKkyFPU*_#GB(pM z7&tpKaHc@>-d-Ct$I+xa*Ffiksuh_;)6jW$??pj}*BM4~*<1VQOF#;nFOSRnZsID^ z9vvAzsx<|livb_!TMHbO3V_diZb#5Gd~j?VKHp04`A&k*MP0R#JyVA2t#(mvzXW`~ zIt8C^8WL^NxioOT{Gx%w7?R6u4WQ0uK$)Zr8V_6LhL%Zcu?CsSr$Ba!B1mciG8L=~ zva<R$~om|Db+P(VvUfr@xsOO@BEADG}5F<*CN~Wx#rzEj*{`lA>w4 zq-dHhr-6C#QouZp`DMCH!2C`E=EVd|d9td{n=UtAO8!j&^P6jd`L~w_=9gbIFd4&y zE*tkh0ASB%z)sU^hVC@It_ATairVx_!TR)?K>UcVqE}r-uew67+X3--zWS1Z{E|xm z`GqMUzhia{#lF==>r(8uUo?;zRt@AIA;2#J94I-d?NG@SLCFimr?Vzkttm=goi&)f zzpYd0VemXND|_(WigwV;?_&?rF@{sa`^Nx2UTx{qJA&J-rT=68-K6uj9+ zl-CJiY;I6*&a)Y2|fCe%5wM_)R70q=BAvD=G#-;>iY*(6OpNrMD|5b;o>Np zyshO3G@w0zc}uq!xh<)uO;&;Y_yZ1h+R*k-0H{kvq*cbXY_b zHrilT>3&SwxXA6TRMc`PK54mJk0iXADr~fIk808nCk{kExLuLA?6ez!Pn#WKrlyXx z8zH&Q9ho$8k=qk$dSRuB=GXqI{DeVnUElE62?T z5*^&+G6r3opH4R^@u0rS8?Q)q}ukh|nkaV?9go$9k4j zQC;z6J|@;72y50B3?;;X90BU9hO~F$g zAt2)c$HF73Tx1|AS3HXc=DXo2z!AXVkrsL34*=UB%02;H`DrdIDwDL39OFi_Wj%Bc zRJ|uV!kK0|zMZC@*SM(ioW`}6{28u?Smd{IzIOoF@dM}ld9FH7;sIX5c~n$;UXKgs zAvFP+@)w*O>WqGm*MtYY9ki&wr)NgLr8wqf;H!8fW0HSrka~L#f!8D6Ta)0~SxuHt z@dXzC&EgKE-Mu|%)Zgd2X{CiJciDq6-zNxqmuM^Z?AG}A81B0opn)-#8 zRkyddRmLDfMi^-|$`A_06F}co?>cIrCjVZA66EPwt33ljq$av}7E-Hr%gLC#vOD4= zDIBAtq^uJ|=+&PUprQUCL;wwhr7DJ;M=N4w!AK%Cq~hrJ1Z;R<^!apCtqyW9>e=oj z5LdPXaUj84JeP_$OdO>|97e0*4=Ve3gL3{LG|eNd1^tmtFHIsjK4huG2YgX-hYsNXx%DHM(l+&jRdmkv@quKVM1P>fEBp@MPrSHYCy zz3gs3JEsWII^_D?*VX>#3FM0JG%kX|RK~fb7%WXsfDliRwNajdAvf*b-hHUXbA()V zPe$Y%-mAHC?tW}z?W~D$=B8i3=D=n7^c)pBFlF@)`aWAdJ7?+Bldp~g%3Su$oUOA3 z*V9W+&5aiibiSRub*^i)xQ4OkHaRp$uMEO6ixJ)3Q+{W5u+7>A0lXUF*Z54BPxzhP zyUthCJBVPm`U-)})X}eTI~4Za#S8peO4gW$+Okj7&{EE`sk_ia1mldZ zUl1xuD99-52FiE>AAs$=`lgt|otSuC+p-xXOgSy8V#RPS$ zjN*QFw`ij7tEdXF@WgCJ-8WTGJspO1LfzlG?5QxUC#X9!E7W}%xj^smN&~}7qb^YP z_oVO=ZObsO&JyDUWg6L&wZ%JIopZ04FJzQ`W3EQox450JQT9B)Hst1nvd{UQvk-w$ z_BGM&(#tyMxmM2vs-WOm9VYseuHv$y$z^R0yCjw_8cRR@-w8`EOk?RC40{?&Z*|!v zu=MR0hb0=7oEW7UP$2ChNSa2--E+$Mo*;6C-(tK5785oWusHODW3yQ33R9ZZp5)hr z@xH*X;7FFgbw1ZG>U9CL$X8yL72YFh16ip7MbI9q))s0wS*ec>-Jj?PLO zhTK-1ZFSJJ^kBF%gYn#<@}B#bA^mufm>NOb`+ZjGoO@IraUeW?oGtjpnj-4^1OJqb zoOuopd;RhT{wh^~8iR5PxQx!J0x|6+9WFLr!rW5)UM=VajJNmUWs=>;UhEVT_)S;3 z(HIFW{jm*c(*I0gf_In-Mx-XE$R@-e+QM@?NgM`zpmRnHMv^vj&yYeqKH>Z7@sQ7* z`{GgOb722n+~+iZ2xf2RJ=lMe*MCncGs_%n+Bwf}i(5V&X>O{fH{Qh?B=$RLZ$g{+ zggA~c2rm&GJyVA{Yow!~C7slVL~5h+Z#U+IwX%}EbEhm-107d|YjI6Rxmqc99{_fd zywW7EFws)iiqfhxnptaK{?*^Fu5_w@lMES?TpjwP%?N6$ODN$%^h&va^lNW%0yACF z#mCWJxtp^39rU$mj?#8~@m_25)d3<~^NKL1=fb##7@VZUdw_UdE%l%~{6EzlRYorCL>FGZ zpVjRDtkRY-RQ?w0u%}%C~ z5~yN1tqP)21qq^Q?h<8Y3^i1aV%qH?#|yPVWJxY+J}s+Minc^5%7~=mpD~MJxcf4I zzN+8V4NVL3%PzWZ%7EN0BjoeRyZ3#Jkkp~iNHnGhdW|zkD&-E?rj_Qmqkk5$0DNlc z6DAjiryn%o$Qz+1_lDU*a&joUH{%>z&~SomMXQ!Kk6?Uw^^bp@=2tDWfJJ9n&8$L> zYUg((oe^25NZ&ms5l0sPSxIVA-dJ?W-r}K$R#lHBNGDWAUcIDx_3e0O$$pN{%vS2s zpdOUI_GV<^ld25y@>fdi&omR$y-P&Y4+(QM2T7@slk6%Ja7kCA5o$v^yEQGcdDZ|~ z@@z`hqYp#cpNEQ?61!3X?KR9sb@yF^F_wi@3ns(YAR$5N8@e+3^NCnTMm4$OdBRQq zJ*0Uc13c>)m+m3WJmcb5O|2h~F$cXe_lf~ui~-BCY14-uB$Jj0jlt?ci#`A~MOS6h z$G?`F#;qRjnWPZV$3zskXgu5}brm6S^^8Q%G!3zKLDPB`Dbh>R5JruZ<*(rSu>@Crfw?4} zSON3mFyyA7`CfOm`0g+Z&IkSSJ7ezM4`6=KWyhxH-p_HGIgycJfYWs^4Nm&^>tdcz zz{gPp39Qly4f&`i39fq5U;sUFZ#&;nZ*ANCR89S#>oh?sPk#%Z-|{QR;Wq*FC%FJm z<<4Tk?&gxr@G=0W9?CEUT{cl=jDu#WT@(IU zmry=>IHW_CiD%g;AiHNix`j!{us(giUm>tstemw7@Pe3aZB`S?f z#MA3bp3(K|L2~CcEJZz4ruc!b=i(UwXUW&jCm8;>R8Aa?zf!(WB;|Y7C6tdI31Pru zpn}}=WH)^#4DY9l%>RGp`f<(=a{%Mz^DcX)n3ASX72^L-zBt2M_L5j2H0o?3Boq4} z(k=g#d6~vQkDCHvHBHx4+>izw>86o?MIAS79ryDF{ipyj9~1$3nS=_deNyFE{=$?o zdFI}uE8ssa!>G~8OgRA0)4EbbD&YQJlB;|o4I~XHM)JaxG5QW`&6Y9xRu`?WpI)Rf znwXF-p^u{*F^d$X%U)zYC9}vVRKT0L)1YY(E8xu>3leN8$$JMD>o2kwRyToFxqB`l zDZqZ}A$78>NdsVEacj`bf$y}L(|W6CWNU%MD3;jY9S_n zF4BUa-SKb{g<>yFKf)-2znVl8_p6_>b?!z`X4(h#CnqI{W-UtFTbIykXE|EsYh^`W z>jg9{TH3u#XXMaejj{JB+e0e8_j&1b2vayh*;?! zVt|;33fRJSC7{zNW0_ag{a?x9kKcl(#)J!MH}@-iY@@?7q{p|Dtbe)Nu?{8jvb8E5 z4^=2;y{ONbZ?1xiE5r8yPP&3yM=_hxxNG&%EjtwoM)}YF-QhQL3T>fM|HhuvL8S4U z*mbm_pw5?i-F^<>?Ei&vk$O)1tdvnFx?X zN;sE4w{ZS|>lB*rYPsjwV_U?#Qvp zdvs6898dskjyl%b7cd}f`N^)hEEYH7AS`GA!uwQULqqVYRHfo9E8^c7U662$C4%5J z_J_9ju=8>sqCoFv=$$T*fz}48;R42}w1B{)>2K(D`dzwHL*q5P#NrsI{Hu?n-xBEu zR0IwUXCx#p8k0FD=wbH9JfusG%Z-HyzTPcXZrDRzv-uCZq~ z(@wsY{rfTH?T6wJ4tNvcTB6w%qGul=%&%qEWC7Y?0&O|m(3|OZ7+#!fQUj7*c(tht zjxbJg6C~Lzlhy0oWk|AiPb4N+8MZM``riLukc`bkQcN95updx!;anULJoCDp2Smgw z;hbPyM)BYX4~E)VADfRB`SY6CNv{6=+WI#g;ys?51ms{0hD*@1W!pf2BY!REACy_! z0yvpR0I7wOQgA=eI|%p=rlSS)9RV}#+dUgsmDNIN;hsUixNDZM?QGsr_5>>@i=dB; ztGF5)qQG%)LhU_}(&+*SvHQ4xXzr*0bmU?1-aoY3If@;vU;RU!<>8_3@*J$w!_v@2 zBt2Z7hb=|=mBkpFQ4wCefim0_2lYr>%NCLXtet`=IVg<9zv6Bxi2bS15EDFuvO*$y~!Rz zd~KB(8=e7Mt-O1qRt0hjwJ>sc3_v!Pi$}&?mV8lg%h556%C6fS*>Hq9OWt*xJ%sl5 zZXGWkWl}y+UGhxW+3M(clj{nGC4XFZ#Hn3#+V^|Jj_>H}g4Kabe1Q_6{91l*JapG< z%5FJ2tPQ={M_;SK*)vl8q!K}rM%@ki&>O~^j*90JpAxcwi4UG z!o5v&iw%l_AS>Tk9VwB_KTd5xrU$t3YHQyrIZbT$ty6@*Qkf2kDUUDK=wjf1nTwfgK8IhTr zxsZo(kPA|B50|9_z3mdz*lWRS3ojIw({%#H`KFx4K07J;5+^Dxs3RJ)ToTiLkN-Bl zF3Bxupqv5q)HPAdT)KZe(27ztP>OE|c>`9u^(QPYKz26tJKds(@^TtvQ^sFH-q=it~i z{QjBt^X{R$bk4Ww5z3al6i6HW`BT5ZNvL;6f65t@9x z=yw0S**{*^xBl<;x5%Vc%B?O;9C8wlgsI^_Bi5L;k*p>7H(mz+qhg1 z7`5zpM){1drz$VwJUqyqAbNel)@0nVHuU;}o%=A7`2$wd!dmE6@QV#%#)*WyGTGg1 zpB{`P)>3x4BM_3D5TZnT9BgERr75P?UV`*qY=%b4Y|K0h-b-N99cPVMi{p6> zc4f$V^_us*S*#TR_CU4rVX@pGSkB*2>GLL{w9!^wdbjJ=rx4~Zdlyt-bsYfUvX5T= zN~#&Xr1L{{UR`6mp1R9v%U4A6;@B(Qxf?Q@g~xmtm3JT1-kPLqBLJ5nPC;0=g$%3Q zrg5t+ShDnY_R_3}5(I+*;++x7YH;G~KIqY8Zxds;+!@YgC zKQ+w6@3Uhef)_*cVe&xR7)|vu{DPNz)qCCQh6bkvsRmhzIO_wVfpnJKkgDY^zM~cm zFj;NTfOlBlBU}aPdN(-XU;8dY0y?AAG#$J3GndpZh{bJKI*eQ-QqBjlRvgVVdh!^A zpoy)T06E@dUptm@FPTZQt&TTQd|kR*#maV;@k5lL8qrF;|ONhGwn01=ws77mwNc`5|(EKlzLrisP zK%EO5{)qGryOv3)V1x}0bq>vw82^uVi{V>s!S&!bCM&5`HAM$J!)A4X=P7ePms}l^ zbtuvv;;rJ$9yciY%H+|zXmBsWMnhNK(f8h_?@@G+$pn|{!t=-74L(FDj`)FjW+MlV zfk|;f)zXMw4}kQCAG#Rbw%!1aK9lIex2CMpO@%gR__jka@AoFCqhHBnkqb*V+@9`(*vQYTJ8u{k$ ztgg_tEU%^;nUY(*b^1~=!?)-HKAjLW3m@;YmnW1f>#`$q81w^x}-*`^6iPfTEUP@dC3v&hhr3o~~nL3_Bf)}&=#$2t90 z>0CMp56BPTgCoRK*&!r3AHL)wioggWszJtOcj2QyIltg3l6;8;!l}={`W&KDY{WVf zBrjO-vBrdnIfZ6TgIf2Nl7P%W0fuKy;3aRi7iQK#R3HJZnr?1T!%>btWYUx|m@CHD z*ZV6c;1Ku6u=>J>MaxZ-P^F(uc`Za*R9P*hN~97=+gQS>s0#aNqsHtgg+VA z*5L4a^HYf}Av_H`JznwSY&ti;kN8n z7MJm)gRKAEy{e6uW^FxJpJ+vgq1B@?=ZCvykNR{m|{{))vB>vMI!rjD>h7j35%7CP!sTWvV1TO7_;ajR@IO6BO=p*Ph6 z|8!{Q)^Z`8$4RBK%W-$Ta(f&x7(^r6lszZ6G;AM}D?4*0`!_zN_^dzVMKxp2zLO=S zPQab<#7sNBMo$W>F#e=A#L>_{HNs|gBuYEpCYxHOQ}1+lJUY~O`PGCX(>dfchg3(_dgUT1mT|(5Zk~hlDJD0Ce)!WCL%PrOR*WWQ- zF0V?mZdpLPN-Z8%NU)6ABFaqqt3eb+PAR zVvK#6=4PZyuFJ$4pj-b6Na>eEk8*wLws;Euy@^{4DX?z^JZtGxRDazX zaXrU3M`cjUzc4-G=F}rq7HhSc?ouo_DPM2UYG=JstNb#w0x4jh~Jan~Hu6VIkxlJzFaz}93R=K_*4ZGfTDaSiu!kw?v{hjbMmp$WaUnjdM69Y-kIVL5TFq={k&NMy;05nb?MwMlM3tG7rJOCZ<_ zCr-kS9(}OMKr%oi781)LK@_sZ?_Ul%BUH3dylSV!`w&uca#-*rlfNt*Rcx<-$hkfn z&ZPJ#q{ulJLdkG(Q<~+K^ug!QDwiV;q}?p%`|AD3B>8A98^rreEm2Ck+?ELVS4_ZJ z0k;TPEG<wYjjiFRY2NYBuVwVq5;M@qD2Kq*D(LEM{c#)sG!Z=eMW zNEbf2rYxY*9nx_8fpU9d6_spKoo&*Bn_Q>CGd+%0-U$z6>ef5xSN%41i|=-nS4g%| zB&9of5(F<3goK%09DN$A{X@K2`^BT>iSr9R0$4R4L4VcM56SODlUyZS6y=q`9pA-_ z*LYXYc53p6sqw0a%;h38nfqHo+L^H+uwb!rITL?qZaXi;8%6b$86ZtQm*%Xad~8lV z(QD`^-pCR=E5|8XX>+#guNB&3jt7>K(UZ2S8gH6B`H>0k@zy5g?6|z}7R%j>=+Sf( z+DSruhlIFf9+Fo=Jc+w*PkwH&;S-5EvgwQJVoMO?x25daM4Jg*6OA#_#A$l2 z-4M)rt`=(8S`cfl*@_-;UV$2tuRXjHgV8^F8s2J3j~erFw7u;^3D9wh`O}DT(zXm! zFVMfMT|^Jp$GhW8Q4~+lp_wPnX?0HTU{PWW_>)qkACjWV-)qx=Uf5dW`=|`h9}eNt zRPweL)v*?K#2ZERjSot7awfK%T*?|u=v}nWsaxHfuxHiUFqqThk65eb*BcPmbA6zV zyfyBmlJ6L6%U4i)a^_!j=liy|4l$(m&^-_3uFKDeJF|L&LNwWbbVg6*U`pnL>=aQ0 zhR;x>q9h}xHIvA0mYTCF&5o}chi&yrCqgjd=r-1yd@6x?8LQ__p%LFu7U&g7=T6N* zBxQp`4W`RtO*I5|OEuDY8nF_Ao5$On<%3stf^1ODBy-26PIkaE zzt2)2!Z>y3a(k1S*;QXkazNK2X!68>wvu(S)bV*w_7bt{Z89jcYrjm>7eYMT$05})Q2D!Bmbjx#Y zqoQY$LR;j5@ef4RRr%9qQ5`_K2cTiZcEgC(mv#$dIEI$(7`lC#30Sa$obE7SIlmL0 z!UqJDi_yoL95SWo;53JlVF*qz8Iy^rA!uW=nd*u9a0MTstOS5(ks)rGIqY`JYw z2WYVSm{f&6seNglSh1v*0JSZ)@aGw}*l+R6G*&zNBw?A0GHNi^7iIKyYyo=E=lga_ z%y$L7jSyf&QmnpD6kLHd%w`9IOYCv6lsih#YG)DVawwf;oKrp zdpDNsps%`=DUL9DAW=UG<+z=Hui!iEx0dGB^8((&gyZK0xdr~D=ZTAhofKB1cb2-MFotMKBKR_0paMMkMYbpP;$3kC-#&ydM;SIQpp<5w08+a?Y9bUks3$@$MzTe5?NxH;@5QU6KmiU;4nZ)UR6Q$l%K?9* zPRl&eC3lu+_G)*$K^eeg!=kD7_8v&(kE6-iy265jL|{^Q?P61M?*?gdGL7Y8;|+oU zo9Z8@$UROyga+K@nt`I@2EX$$l9Sw1#_?83W+y{$Qo+qf$5*6e=uOIW-egQ|!Tq_pfvIgEW<+4?3fVI% z-*nig=OkH8azL@UV ztsTyQ8V$CmQum%3gjXWlj#-W z24R|bQ*u=%5k!Z>G>Kh0!OA+5D}@q1A&YnRP~x<%IpfCVkz|dh8% zDaITG%|cLCyU>HS0CZtS`6YOk#pCRi8^K18z0JLHlSw|Cf5*r=LkipSYQ%^RdB;7ryYQiAirWP$Ae2cS3n@gE*QBStPDx z>xLB~qr`ln@-|~&o|-X|L`aN*dn5@DNG;4;UQJwrrjTw!5fQ18j|g{r{RkjSqhK`o zz{MdoG++6z4@m;$Xd<|k%)KmOsse1>me%W$W6k~4{_ksR$zR{C9PJJtObC5uLg<$zxMV9Lx@;@@l(xM+ zxF96gdbT2hi`8qj;4&9TL2Z;t#2?#=o1uCusEuLBL$bBZiac((Jk3{Jw;6^$%eF?mX&a6d@AXW#7g0o;63v&jO6z;<)E({{Dss-I)o3z)$obn z;hQ@3*`%9}vL=~3g#kp*U0Fi44|%*f`mxEbHV+ki0u00?dVkfeU$3D|yU^lck&{ z!Mrn7U(#pVN?o@a6{ncA6&hL7Y*@2;OJ0FNb<#aab}K#chhKO=NXe)7;H1_G`%}nN-NyE2{5#$a(5ATmx&Yl00NWpY3cX zMw_F#tP$>i4jME#vN2@h7 z8852u7*Bb#lSm1#XKs@?v6K{ZI{P|vV<@rZE~8f%$r~{wLq5Wgn62I+h1$0!+dra) zs;wAuuB~XxgXWsNx?r=KB#fpJcodt(((H{8n<8Lx>wPY3Ud1w0*~87|WTF#dAt=e8 z*DlS-U+V8O*YK)xmcm;WgA1n6uiL4q#ylAUb9T2*-s~+9yqhD@XkLa-Tf*SYV12mI ziR$Yjl#MdEw1syGS<6>W*a;LREd+4xq&k;_c#pd&(MyhGg$nFV)+%)^XT&5WZ-NWt zH(50*{?Icb4Ewo2jeEFgE%ll{N;q4hH+(EGO_t6JUmO%&&S-o|IE6Vna&EV8GZv<= z>TdO*$tRt}OD|RSSgWk-vSXi>1l*QZB6_IRb3XGu?Mb0%v1Whri$JKXmwY*Y0L=Ed z?B}9La@2t@%0qX(R*x`8;tp=fR?R$#s+{GZ8Gf(AdH-=6(rj~qY2PdDEbk~8#79pM zZc(E!SZbcTNmFxyXx#OOv@0|~7RUkeA)i>&IdoU7Xj7y~ORzY@^_5FQn)D?%iDuAA zQhbKHN#jx&mSuQO)69b+$p;3@5JgY(KR4+z0Zg~A)Os<4cKKkWub_r@+`y@%0VBO) z#07qIj~NPywOzvqSgNv`);7|lvGePedL=?Er3Ggx>{RQu)-?h5NgO zR?Z=>3Pv-X5#nHfFG+e&%h-e{`{?{zdnUHlh1iyz@+3qv>lW5lCzi99wh3C?BgT}a zSqK~2Bz)o5f3lci{Y(-(icBqp;6I;4d9G z+vtFlgIZJ)I4iZHBhjPO5idr{y~$-dSI7~g7$tF9em`U0L;6>2hFi_YalcJa?-?(O5Ek{( zebq_NahK{%9bn=m8wC0@oD}CVeLKwKdQ2D0jP+P9H4=nm;H>tgF4(BU%#HHe=W1Lk z{BbjmFF-RVGV~fcMB$<&Fn(LPp8deVzByC`0M&EmcY28GhdeX(6Z|iO{ihQ`JV9hI zPk|T>r9~CAC!}~NqK3&(gcNqwEe;1Ngd5J9x;Zd%6Bj7s#^{k+C^Gae(WAgAE!-9@ z+!`=q_y1>%t?l{!pr{|1eiGBv9TX{yJeh<`~BSNy9zz>7m$wPRQDEXzj&H9vTq8mx-rXo<}*U+ zt3w*zyu3j@B85&a%>^ALi19O)R8?2^7KbBEo^!ceBRxPJN$5$@;C)jf2fA|q9g2gF zeq*9%^r0WAmWfXet9Lrax2gJjOZlCnrbJ{0bgA#IClMu8)?p=$T`XhNka}V*SBvyv zEg;F(OahWSHXPOi3&_O^0l8RHHUcPh_7Vc9-RFd*)6l%|BS0@!kDY+Zs*Sm!QIj=( zY@_Z;A!uw;U|G6<|DjBz_$xJM)~e;0n@Y#sra!k=|37i>A7yD(-Fe^p+v(E?avGJ5AJOb5Q`FCzo`G`-W!b`6-eQqE08H8=+Kex}e6rXJ^eP)-X z!KDnO+@BEJ%KyQ>+>l>w0KK@vPNRd_=~qyEy)X{f}^sInG%bh zg=Qk+jNF~n`@bH!%}q|e0n=G840|8G%+Mr6yiZf+%aoiHW6`+uY6Pw%b2F5{n#iDi zKI%&ql2e<=|My*rYJin-i*o7a z_=$}1UU$~C`GPjoV$lZH#BVm0zuVYpDnMcNY!lA-#2VF=ix$C#q9eb9Gi$wlgL70S zR~;U_SQN6-a0$LyMm8+Kzu>w1A>(sAz||l|qEn}8B`zfnmZSv7V_8c0)1)MeJM=UV z_v#O;6TS(cf1)yEh6H-E9QhIWW<@3e#>=Z^h%7@fZb!9=FpDk$^P!$IgtovFKCAE2wI{^(rV5p z3duva*JRVe_)P`9!#j~|Sz5ZLh>vt)XfYe+PqPp4R~3#7K&2}a2XW)N>3cMta1lQw zj&vG|rTjt#`i9aWWtl&FHas&07Qht}qbWZKkG2RC8;F4ya0{@9Z&~`}h%o$CFZA}0 zobR;Q=-ku%V>p9RDE(tSqbPX3A&JhxX3m`J9 zL_Mvh{m>t@io|AI{V?Kt5>f`)o?cVtf!QQPDsTiyBUGk_oD7YMCwS(rIqvYxul--9 z%;VLVO!(7;crXJNH+PCa-0lKUKqH-N%_QfrCBwI(B=`-57zk#&o6|amQ_to@ez^aN zW6=-3R|-|rsGq=TXyac0X}i8R#@3;az~ZxY3=f-E$Bp1?%Ze^22^BXjZu_F$E8b0u z%=wz$s$)F*9gXqVeT*{fEMowOdE*H)0#n)8T zDt7Hr8}Rk+ZnEyqi6~WjUROL;1ML@9_hnvJfNc+z^&D@6n7pD{+y%q7chd=N_@G6* zhdpkD$g*K5a=py>)|Z~A@`r8_4rbG&0FoQ|?Y7r38I}#yYv_6n(VORX{x7Efr~Mmk zhv^7d=sTM{+9V%h*b?g{?gMNtrfLee;wDA@P`hF8ON1e9h)fHfg81Tn{& z4V%?SGF6iDlaWLSmy}DTIW=s%*7HFYf@6efuagG1Ph?7282C$x^~ap^G-k-dCii(W6f^Ux6H>U?h#y1?=NZ)YRIV;B--$!#QgH1Tet|0G9aiHEK9-V4K zywi1;4bd0%V@hT}#{RQH<_IbQKHbsXn<1WQr|NBC{U{FdRLCwG6l_SOM!uX`sKOy( zX_M>W_RGKf;>7p$GvEm8WU)V z1l-%=I!RbZNLzcPRdAMQIbc6~!k@p#pC*l8HO_Ep9E8|rP4b@&VlB?buv#(-K(Hfv zEPn{#B{F|2e)7^#kvUZsfi#!?VVxVyvg;3v%YQ4FEWvOnE3p$MivK1W4r8)|T|rLX z+G%#;#EelD;bC5}f=1P^>9cMp?_Erz@g#u@EkSWT zkyly9nc#v(4ARNVZP=L1P%D4L zCD$R=2kmMRoz*HSXA~&0E^La|fJ=T@{-Ohcx41~I*FOk zx*2k$|BPDthh+x3=WN;ol|7>KITnti}*enQprm!;tz;DZVz zDyTrBf`O3W+L>{fc`QF*u!tFEJr6yx5!YJ1Wqm`|izC$UdF7*4StLu9_ixl# zM2_lU<~LIOBD`1n{iOpor)QwKO}}Om;X&qEW4fxzWwIMnPY118ktFqW!it3NYEP?b zZS$_|n127vds+#tK0vEas+_x?oE*1ZF6w>B?XY}=+a`H2$MTMROp-up4xqqbm}~nq zs@OIERvtFh#hMImDx0(SvgEtX-0oxf0+u;i%d7dSE*Mm_hc~Mmnri2ZcLPX1oo2^d zzhZxf6}Gh$oIU>RJ|N&))O|Zu(|!pHOfAoQij@ehOh%i>Z8_?t$*MBYZ<|s`F?V{K zBgpF#>Taf$TzPJa;1=^i-5GTfMpF2GcWWhyhu_ia_&cYu7{glfJ0w>5{hkT5xyw*~ ztCbxxyBrv->?X>_SqSU$+|&VPXye-8YPN69I;SYqSxd#h2vJ-cIA(eJ%XU z!DPan-&HF#MR#veC|0dPDx8Gv}0k)N*g7t2h&nz zCDSr^!<1siF|N5`LN-1BY)Lwd`{<>z3iX?>a>uIEmDZw`K9LI3(WJ5b#R#%u?yvkD zY{t$X&uU1@dqw5eBaB_pP@^kT@f%r*isMd2U3EQ{SE;D0t|JEyBIX^;rW%GdaWZ0Z zN3{((heR`W54Dj~#l}F8b7o_rvWiXmApOjySR6@uP}b|*gua|nYy-8spAY6Mw>|Ei zpzIb$&zznYy((96h<#F3l-g~2eZN;-)bom0)nmCT%KVth9`&j#dKRLY)4CO0S22B* zVVrd_b%V$RWIsLt+26M^Pjg{H5bZ z#)RR-_KzGX1wzF14-P=cHwGZ&J}Y~|kyNN|$Hv{QQHRkA-)X5~*h+7Rzus+Sx0$6;GODiQxa;o5PsVz+dDu-U ziG`b2C8O$n<4Q1L@?Yq)7#>VnXSti-dK-R!M{+iHt z`iqe?uCZ@cc~3C4XFf&UC!Bl{b6BRmsSR^8zVj|Mo_!n>J;zfrR?o z$$GnhG_u|f?*_iRi$`0|8(B3on+XxgdW(HCFLRR*ZV_KkysF_7vXgV6TcY6oM!}fK z!F*&+!SUyqf-@5}8WOh?sfa}xEDh04u8u);>{RG@N1cxM4WQ%QYtix6Q==nLy7KV( zFRT{^(C8jWjf*OgdNI;sTNDZh)q3fkVzUruyRJU4EU8zIeP zOfGyqVD7P5NACo5noL&ApXP=3rK+to%99BxqHHcX9;#O6lH;*zuLCp5QNa?*oE)ox zsZ^%Pvo>=)9%c^NRc>hRvup)s3b{W_Uon~cC1%p1synM8=uJt7<2;y~pqPNlW13sO zri?V;#}+Y(kR@Bge%eyS@{G0M@jAs#CehGfe2qh8sRtww;p<||uU z%lQ%Ho7MmB#;r0X35zgGUz8MP4eqL^W&yn9H+j2S34kTM1iKs8sN9*Fq&xq7t59`j zf?n<`*|Nc5lw2rA5*Y_2k_b?9YN|Xfi5c&X7P*6?AvVvW9BWc}W)goYAVy`EnOm07 zmuqB5WP3FCUq*N(uZ~ZKp;0G4vzYZ%Zj<>(3O|BXHr7_<@l;u3{s7W;Tq<|Tkjm$Y zl>2GQ2EeQGz*KHnRe2g1mXiIc@f~*6tj8rD7x24FJjY9hrp(tUg1z)2-)WTXf9Hm# zjO*G*ZfHsxYA@W-)SOs*;fAJouJ*zWO;Zxl0(QWb%>peejR>*X<|1@#DqpnCi;^~x zk8ZJ5)+R)LxjH!*>Z*ZcnjVaG^D}Uz$~66gbHr-NG(F*_DF{!d=?ZpgO~L%QFils2 zy+CtR3;~$pBl_-s%I!*f^Fe*1&~;}qTl$M@Y-sBh#CsvVZ?_ZYE9eRvuz+*6c!TV zMj%lkQ`*D{!5!{B#o0y)dpWvU84Rr%=t2)MOlb19kxbhCg`U$37)Z7gLq79~t7qEO6T*oQTw>OnY4l4a4znM;=<;N8DB2BWcoG zwQw5A7u@S>_Ymri)m-2gd~ANOOR#&QP4g<{y>s57E{V{Tk)kRU=Dv6~g7 zP)G8g(X_8E?0Tn>{8Az`V*z?{B>&^0fU!3INNI^?88<%!(=*55Wb%FJ7%f4NknKy| z8L;mYU%;<#l@ga{bpiuIwfIqwtPtdZ2)Fw})3SqAu;oRz$4MIt1@D!jEgsgT- z5xJuL7{C$RuK*X@g|VCpuycO*^^(@|eXlCrYjKdNR2Z?Ky%>0L)B-O;@FrYDP$I2M>68g(nz^a@ z%OZq11;A{iP4{h@cxANIbn*2Tm-1`T-csC{$=B8*Jdx>JW?QeM2x+FS2q`Kl!ZJ)Y z<5xA;PYmg=48#}^-#>2^B5@VMhgLdd9Iqp99TzJZ%5G}=SqFFq8Q?B={Y(YD>T|qM zVreYGbwi1#sjCUE3g23qwdv?s7f+k28Gwgn8|F(3JOrjh|C&`|L$#1bAKJOqV|weI z3JnafEt8E7f`TvPM%Y|VF^&hTCn7Rm@~~%#NmR8vv1y6P14J3O;b^X&r)u_@il$L6 zG90lsdIT6q2A ziB^D|s6ll|lw5wI#rD`P0vh<0KOQoK8qX@Q{jFv;3A@xVR%sWtvvNSdEcXak>5hHz!8LoESWC2q;>9xa}FZdhkpD)1-QV39Vg`@OJgBtp4I%!=5NL6WgY z2jR}vdXe)(JF@MH=gY*HVI}C#z7pi#0@y|?0=p_+JrvB7u~$twMW;o6QHzZoyBi#3 z(9`tp28ivo#d_APAcF?@2#!Tt&4vZ*URc;x)+UT-pNJVVi|a9PFWlYgS*HowUOXEI zYH5cHrM)HFz6%4;D-HHdGacn+fKQatO8vmC_-DT8-aimb3q3O98ijMs({7 zY@)j)IyZ1}UvJ+Hy%GLT4{pmCHw{FnC@AuQj=8L;(~;;Si*(R+RI& zr7DtL(^i$!VzJZijOXDNEL-|h=8^u=)TjO_W%Ox<(ZzHmadd7)*sz+=Y~Y|S^flc! zX)5q2H@OC-MP5r{mPQGy3>scbMp$7?AQ>Tqj;FC1q&7^cipJK2qWjEv*3=88&h=+1 zl2Fi=>_jH#Ssq3(L|17fSg-mym$S+I>_p}9b9P~nG$92v!${h~Xl!_}R2-fdpZGix z3w`G*Kid2S>7){c+LHrR&^vav7A~~{wX2pAa)FeS9d9~kPOh}GSHshb6nQsLGjgWt|;3hWDU%h)i+;xHtTT1YUn_06v5!NBb+}%<^>0{mv(|a>@Ksn4TO${-z6*!FaA;(4RKw;vT9UtnpRIjEEc_)pqSrUXf&P*(LQGG6@Ycr-J34V|g1Up&>gt=VS}QPqWE>uOVC2x4ULQx(X{-l4r|CEuRDL z4xzH~9Qba^wB4?MN+}+S3BcDaCu>Y&E?g`h8ZR6brStdfhhosmO<_0lW%(z9aJib~ z(9Ii|H2HbG&f>!sJYG;te+_U#3}2YaF}JL_@}3S#NT^`yLrMApcoZ{dKc#Yrh!esh z3?KQDIEm{t)`H==gkY;fu!WyyHSvazlrTgIfFYorf7rrvg6Cf4T)N;#l@ADTt)j=I z-!J5aZLLayr^mDDWQ=Gk%?Nth!qZNBn&N4e5|$T+iSBJW+^%u<^v`zXJL>A6a8yfr5^2NRC&hW66|8S$bJXTS7w- z6&f0UYjohMBP+XLq&s3Tk*++i7@c%@cG_Ok$0fc|8&*`>UZcCvkB{*0Y=j#VySTA# zBW%VI);nD12oYqBF!d~-O7Ad9_QG(gtFO|?0o!*P{E6>~Wn@ldZ7Hd|Em}uq?8D2VJ@kCX28hl#jd0YOl zy$)M$HqQloK4W&q3-Y^z8cN$JuQxjK@dd?#R~iuKc)?dAYNbXIl$Sw)IK15<=K%GJ@Ciaup5~>R6eQ#>G6j6zJn9wH`aX6e;@|v==$shgZ zU2~26NA~aHPkHWMW%H+7^_cUv2h3Ege4l7q%&+{wx2UIela*}YXTeKIIiot;_+ffe zowL;^nD(s~F&mRQV^ArPfgiq-mHKApg%`^$2D;^ zwLHddue3ZEkXqi-g*0oa<;|onRuv$S3041;9MPTph?%4@wftq@U{v|mVqx(n%Y8yq zTyR%b6)K$F2X9KyrA^H`V8a$}h2>=aqE;;dyj^wLl~d4_(_+b|FYJn+xFy$kx|3);h^L=J z8ap-nc$%5%<7O|O{{I6YHl?>kI8BCx?3FFoo}m$LdLzu|h@7ujJa&aAp4vB2)5H}D znzQJ296XA+A8I6l4;ePk6^EWeTfvlCyGQYO;XOUp%{IKV9fR|inB{{tg~(Z?OW$6x z3+mPoiY&Zr>(4AI^98%Mnp~8s#FWaOv0Yd;nN8WAT`;@EoX?i6{IqnFo+~Fl-yWlQ z6pvBThbRR+Y)F{gAsGq!qGMZ=tS07Y5=jsxftYuif{}T%_O0Jm{;>5smHPFtMf#m} zb8)-2=rv-Dm|FLk|3UOK9Gs~;`jOmM_vdT9{>Xam4(b)FLW9=yYQ0vbR|Y+#R}_nS zWj57VnN3S$rKz?Bm(5-ByHFxbE10XY4~2)k9U)1F9;)GHRY;oj03_R!2~{4yxFAEL zMtm5;14yaAEcG||YdsyQ2ejSK6{Gb@#M&_u@g_u^5!tZivX;cxuXm znMU1_1xKUfm~44;SAA1tKRtC96O#&kzW*=&Y;g=Y=^@xB211#zaYyX*CdXD`9K_p7 zpJjVm)1tFm`OOC3_^%4zX|cUeTYD4FzCD>$y-hmt(mlVWJA_X=f2pBgurxcf`TT$P zUzD9f&@)K~EDSLte{~HcTcEd@WTpI^=C=>qm41!hrroVs3Q^hH`9Wp(_+i@6ek;?4 z_FLf#?YF`g+Hb8grAwasnu93(D-1_dg*dzkJVK{mD=f2CHjm~vVRk9GYgaa9BgGNG z`Qiv*;YUcBoGrvxM!-E{cr(1(oDrkHv6->*afJ)38w2=L*?QMZ$DD7C)Ye2^R;-C! zC_Oi&`Rc)+jxEx6CI4{7+#$;)?CO|3S_|eg&S^)YLtgOWysQ!M2Fsd zkZ&r@kt6bFR1ZH^?Epa7*$2Y8B@*y`-3?07U;+d%oNyrW5l>CRd^y&Qs!3yZRW~A? zW2Yu@Sb7p>b6#G=`Q6r5;rfl({7_{_%h$;^ObV(=m`ex=D4_oN&ph-0zC-`~7wE>u zus}$b(9@=sz7Vq3RKE|fr%RsZElq> zE{WSiZ|~!aca->o7HV!uYZV4bwzV;ptFz!>sPcujip+z-+D(p(ZKQA+k-I}Oc5m2l zB^ctu80+rml~F663uz?3k711DPxx8oOy}%JazDR(%+EA)dY&?EZM|`3; zWiGV$7J=kBcY0KkkVVj)dr%T6Q%)!U*C5(B@RggzB_SQX7|{eXqdi4v93tpj-hJag zNfGP}-S6-N7!5_+H?_lIeUe)y00C6Qu%}ydBG+*5Rk#Vs40Z2@>vz~O(F_MJ8RvyW zO_jb4&p z27(PkAs9;X>e6mtzj$H|xh4xCOws!rN&Qv4wd>-3x)k^O#Ngb|h>=N7Bl;2W@tkbk zy=M0dd*|lF{xUuMK)8m@=@9*Fnc4Wd4eb_7D_|-G&Y|9rylD^ckf2W{OS0+AQ)APr zDM`!7cDiF;%Zg{iLfk>zp5lVbK}zM|QE~2XJU?=Q)o%BwffR;vS(90b-@TS8)$p1h zQ1{*M2)DpD%k_8YmZ`T~Ji}iuXD9?s5)OL`&DB*`%AatVP}?K=v$v6LUiMQ8nT#id z`(?7?Re3fDMQ65^n;?q+2d)z-RszvfGee2iU{lF~Q_ zZ_t>QGR1>n_t^|T1=JRiKg9*6P0x;nIGQYu%PE5lkIO5wH>fzqh=k(&Q}A}LgKZ%> zxi?tW9`UEA(8iIGpETM9XC7Lk?CoyMr2-(D`SwCdKRnAR@s%~%;}yX z2!dHzYK#294{Bpf5!M2~srG$VE!X(MW;C=!--&V@Tb%(RsF?1(*GyyFr znD36W`0_WTR*l&>vDj>37~Vi6Mr}k=xlAoG-B~6-(WQkw$5~|_Z41k2Aw=(j551Js zh==uvxo{}_F7Ycx8@jmia;AXpgDe|Fyg4i9ZJ@E?7zTi7jZ1iM)-&nzY2$pYGG&#cw!#8)NL4h^=lImcf9h?d zKu9p>X!5Ho4jZJl=1kmTYf-PAFlPQ2FN;od^+!rww?>=~@uQpRvjGOW&djx#lckaE z;g;j6{OgP0Cr_mTma2|h`nKwXo1LB$#`5Wqr4*9zl(n8cZ#KGV3-9VSLxJl#kNtPm zX|`g;E~xBWn&KO>ID*1j90hA2Y%JMot)->b1X>mSS~y7w9S^(;Pl>n8w&GtbCg+1@ zcSV{7H*9I44uo2HN>7I+x_NN@i)4LKD;j66FYlD(@@bp}fL61B{@&ZvCW|+a<$KNC zeChBFh38;h7Q2Jyhl~)U%!unU;eqLF0%*g=lXt0lKuhTo^8XedAA3Yidjast! zQByy9gG19lV+tY7W>8FeGf*+@w+Tb!LopixWgr*2X)j1NRQLuJL9jnD@kgYAESES6wq4 z5HOF3E3YTRNDe2Q`E-ZAjQG`eN=%#Zt2agyy@4j?@iLmYGP8+5lj^ciV2XGExa=be z++KuLR7P!Xn7VU-9iH;kolNf^I><>_0-(Lb9ca;aQ z^~MII&lu2D7)ROSWbAre=J67V(d@KxOY@Pu4PE`SWsM>2hXK5;h)0!3lcerc zFla~%&7z+%^)t0bKQM2tAC*-4QNf^o4u^j7zkEncQDj~|?jIB=QvppDm{P$&Okrej zI*U}&oB0iSsaJS5qe*v}EpN_bEm?kI9fg6rqMYd3uq#ie>@G3Pu5A8vgvzr5?>}9P zCLTzYgI-$F2T1FoqVi#@EHcN+=hN|iopZyPKF_aiPPzAu*o>HR^ z`n%Pl;RANWPh^V?>q?6w`e>g}h<&&vfqc{|3-_tAjJ_98Ib^h+dqJwa?*$s4u$n4c zeqphw>y0m&-ryQFxj{KW#FXE6bJJJhEA;#HE*| zu~$nOcC6Y8R`#m0A`6WEo68>gzSt&QMeZ%7Q+X&0kL%Y7u;tCw9d004*(|e(e83@r zy>;OWYp^6oZxYe8i)b(%*{mHA?iH}Lq1V-JC~HFx9r(F3u(D&D<&0N`Wuf`!Xi$u+hW3d9 zdVz5h_iSwPQG_)upBB4DzFkDj1iK*y@InOmJDa7ee1%G8Yl^MUhbf+_6dQgXqqrN3 zp={#;v=!4gxu!e%5(C8I4H$n{rbuz8825tR)}daw7i>|_!pAu1Do|2K%1xG?yNZ-+ zt*nZa4_nzoj;K0ft{7PdV&+Fo^`t@ODgY$~GE@Mq6Vf6Y=0_OPilbqiN9v_XjjAW9$g1&)o+rrQd)bJ8`G&DPv~WafXb6lRWsX*?e=4{ zn>@pIr}0Sjgc)52CK|-+!1NsKiOoU}PB?KW{}ddGYPFQ?;a)FOM2G0VAC-qf;+V1g z8-|}1TlbI~$prL1D?4hcEeh@3jz=#m`1A0X1ow{hAn{;CBA}J;22i;nQRO8hs@#yM z@+uO)NanADLZa{v5~Uxho{-3`1xGZkhKszG^(=(cF7k40Cxbg3SBk4a14U6Bb6&l1} zDGDX@!ruZKKA*F<3u6W9P8hu@r;B8N9gU<@dGeodk6j?$j@CZQ#imK4HOJ!$@yo^C z3N{6so{bk01Y?C4gd72fluzy55~~AOHMJM3_F@IaQhTvr*M4c9ti4#a7m}jdi#fa9 zOHAZ1=uoxBxP=+`{XQ=Vpy2Gk$jc10c#)SHvD*^VK;(XL_ala=39j|!^+p->y65xI)P(^hgq$dgXME1)D|o z&A1~EZ(74=Xx4NK8t< z1Yu<)fFL9RLZ#<9N%2fjWncH6rOL#x>iJT=XX=p_+=`h*%*a!!mF|UBe|FJ>=BH}M zi*)?`Fv;1BCPpH(J)Swbr#$r9o&FD^(NsaQf* z_S8t(5?X}<2C1O1=(v(ibZo?IBH3-A=p;4~-MJ178Y4~?=}!?m-8jL0D)Cl{VA4ib z5Fn+AO#qrUQF%!xtK3w^V~i)L9^vQV5$s=ahUfzfZF{tY+ zVXmexlD-h^dQ!+s+CsKuhxi7=8rkQT0~pC1I3ay(2g zJ6gv(?(9&B*=<;}RlPfrTlVF%UBew9?luY&UUZU4lzw&8nTs{}FiA%T(4tby&tzTQ+)=}iUY-XgXS#$Mk059;Nd zHF`PP*NaLjy{KSNFDtQ^lluneIMnN!CSpz{m0naZsF!_OED2+`+E~_-j01hWsHD=1 z3I_FJm)okBllvT(`+8AHr56

g8x0%ia~yg(zyjd~}eQpXlpGC6#VeFsPfk;BU+y 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 od7nokwT*=ra&5ejmd~ji50({r~b_W~Ptos_N?M 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 RF5n(KkFB;ZUc)!*{{^D*#yJ20 diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json index bb3cbcad4..70ec7d72a 100644 --- a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json +++ b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json @@ -87,13 +87,13 @@ "artifactKind": "lowerer", "resource": { "coordinate": "echo.dpo.lowerer/component@1", - "digest": "sha256:4b594a8165079f0a973741b9e27b468cf041f4ad53108fccae641dc35355bd2a" + "digest": "sha256:d48bb8c5fd54e963dcc4cadc66d656b92b7ae76728f92c891fa3082aef25c393" }, "source": { "kind": "component", "component": { "coordinate": "echo.dpo.lowerer/component@1", - "digest": "sha256:4b594a8165079f0a973741b9e27b468cf041f4ad53108fccae641dc35355bd2a" + "digest": "sha256:d48bb8c5fd54e963dcc4cadc66d656b92b7ae76728f92c891fa3082aef25c393" } } }, @@ -178,13 +178,13 @@ "artifactKind": "verifier", "resource": { "coordinate": "echo.dpo.verifier/component@1", - "digest": "sha256:d0be4d283399aefc45d75b395b3568f9983521ca5543c9dfd23b9495758050ed" + "digest": "sha256:e6f29e90fc324ea80b2a3c8d56ea34e7d6833be599cec8ab27910c43d1837456" }, "source": { "kind": "component", "component": { "coordinate": "echo.dpo.verifier/component@1", - "digest": "sha256:d0be4d283399aefc45d75b395b3568f9983521ca5543c9dfd23b9495758050ed" + "digest": "sha256:e6f29e90fc324ea80b2a3c8d56ea34e7d6833be599cec8ab27910c43d1837456" } } } diff --git a/schemas/edict-provider/README.md b/schemas/edict-provider/README.md index 538231879..c6b39955e 100644 --- a/schemas/edict-provider/README.md +++ b/schemas/edict-provider/README.md @@ -169,10 +169,10 @@ nor manifest. Independent fresh-store replay and separate host processes reproduce all three completed outcomes identically. Both checked components remain uninstalled package material; neither they nor the generated authority-facts documents are runtime Echo authority. The promoted lowerer is -381,459 bytes with SHA-256 -`4b594a8165079f0a973741b9e27b468cf041f4ad53108fccae641dc35355bd2a`; the -promoted verifier is 389,503 bytes with SHA-256 -`d0be4d283399aefc45d75b395b3568f9983521ca5543c9dfd23b9495758050ed`. +457,033 bytes with SHA-256 +`d48bb8c5fd54e963dcc4cadc66d656b92b7ae76728f92c891fa3082aef25c393`; the +promoted verifier is 469,651 bytes with SHA-256 +`e6f29e90fc324ea80b2a3c8d56ea34e7d6833be599cec8ab27910c43d1837456`. The checked schema/components also support the explicit `compiler-produced-bounded-read/v1` configuration with required `maxReads` diff --git a/schemas/edict-provider/components/v1/README.md b/schemas/edict-provider/components/v1/README.md index 22881fcd0..855546117 100644 --- a/schemas/edict-provider/components/v1/README.md +++ b/schemas/edict-provider/components/v1/README.md @@ -23,8 +23,8 @@ is componentized with `wit-component` 0.251.0. The source WIT is the exact 7,392-byte Edict contract with SHA-256 `2971fe44def7e51d5271dfc0f04f3088aa58754cffdc847681a587605aac749e`. -The checked component is 381,459 bytes with SHA-256 -`4b594a8165079f0a973741b9e27b468cf041f4ad53108fccae641dc35355bd2a`. +The checked component is 457,033 bytes with SHA-256 +`d48bb8c5fd54e963dcc4cadc66d656b92b7ae76728f92c891fa3082aef25c393`. Its sole contract attestation is the top-level custom section `edict:target-provider-contract` containing `edict:target-provider/lowerer@1.0.0`. Its only imports are the frozen WIT's @@ -35,9 +35,9 @@ capability imports. `verifier.echo-dpo.component.wasm` implements `edict:target-provider/verifier@1.0.0`. It uses the same immutable builder, authenticated Rust/Cargo identities, frozen WIT bytes, path-remapping law, and -`wit-component` version recorded above. Its checked component is 389,503 bytes +`wit-component` version recorded above. Its checked component is 469,651 bytes with SHA-256 -`d0be4d283399aefc45d75b395b3568f9983521ca5543c9dfd23b9495758050ed`. +`e6f29e90fc324ea80b2a3c8d56ea34e7d6833be599cec8ab27910c43d1837456`. Its sole contract attestation is the top-level custom section `edict:target-provider-contract` containing `edict:target-provider/verifier@1.0.0`. Its only imports are the frozen WIT's diff --git a/schemas/edict-provider/components/v1/lowerer.echo-dpo.component.wasm b/schemas/edict-provider/components/v1/lowerer.echo-dpo.component.wasm index 903933cd7c4047821af6c731496b9097d5421458..9ac319d0ae40401402c9055bced3b587532565de 100644 GIT binary patch delta 155778 zcmd>n349gR+4ntj=Pt>;34;U(5Mb^lKtRBtVX2^ItOzP9uEnK_ty=>ssBLX+djkoJ zhzbrexFDdoqoAm`paz$!6%kwa6_r}6w&GH2>%#Z{KWFAH*$91o-}n1{pR}1fXU?4E z+0L__Gw!PHPk+{H?VgeF2k-TAM?}7u_CV~uSU6;cB4$Ybi-aPfP$U|~|DrK78ZU|( zv1r7MMnfuuqG+fnS`>+digj&N4Ss}BR$OfQ|3#z0FMY+Ers>v4d$?Y-Yj^a9?$9aU zR@wjDjnQ&4QNR0)OLccNV}x>zXYejOc_DdiLVF+;@$$854*sFPxgp=N&~ z=)i~;g|h$aWb&VBsHlPeii+@mOf9PaZ(@jYW2#V*X@o3X@yLuCn3@a*myG=O?>Pv0 z66;hHE9#Vpb;7?yCo`h|MWaRdFIE)mK(UATZF%y0ptmCear6ys{#UW)`5wqA(F~HKqto46DiAuyUfe`;hqY7|H6vgmg zQE?2&jYbniaRZIVVi=Mc>WtF(y3+UvHR9739}6WiA*cQ&Tw~|QqGz3U);Z_?$_PcK zo%74n&J8^f>Gac6e)6-Er=N4)`6uh52P5tUMXB8$izMaAxu=~nZQ40M4LuccZ!79I z<_t7__ zuSegAJ{kQoS|6Jk`$zPj(WS8^u`6Q>V%Nv+iCq=DI<_oUynS~0eK8}H_)e*)tDY@$ z`;~s+4o*}WPtSHIC8osJUei<`vc8_P?!LqfrB=FI%e$|0N{)(@JTtq#K4cq?U1x2Y z?XKMI40Y$aqAtG)>MSdp=Kpk4-99W0YHtro^&Z_P6tAt<4b&^QbCj?CNKl>O&)q>9*+@ zBaH)anSHJMaIXsWw)=XoW7NOh;T5)e&poo@hsOPlu2*qd<+pRtN+@B69J9_bZH1{U zowu<*lBqZ^@l+AsQFa7SN*9kbLKv4_XBXKKJ6>gk993s65h$2dMpY`J zCu!rxcGL{c4?inY#qRPR6`9CL!?eS;v=X*sgN)E9BW{NstIm!&@jAH=;l7;rRvns0 ze~y`oBvk?fFb^zI=sjMiUkEDbqIj;2Fgn$(hvRrHg4X~e+sq6K$46lVA*ZYkFO~Zp z;6BNFt8P#j0}3U>3A;EIv5W2K_>xc};Y3mqzK_v!@=c+-N=z7_`*2X$%!GfZGX3P< zS)rz;P5lf52xGDu8a_u)qnP3w(p<#)oCHx4@=M=owe)={jW(rE{Gtl{L4e$4}t|quJc0~w=oC;3i zgHR6qf{v}BfB<}aypk*6{3ii*$pjGrI=92tmyH>;nk-J}?g7+!E7)Cj7}nniT);xW z8EFR2qe*&MaOS!OEt<|7xvu>|6Z>XXVGSzO&(<=J2G+h zf>GH~GKz+m?z3Likq5yWsxBS1{wXsXExpyNbhue}jVf<)i&eA9El}>;M|8^w;MlI= z)N8=yrqZZVVLcbL-W+oC(0X<@OI0&8F3fdD7T|1z?ek|t9>^$2f~b}qKG+-uegpKM z!edQR6>L0>W>^fy^NY(kqjY=}8QmEjlqRLLNJ>dCN2iNNg{w8#r3vACNC47cG6NYV zKkZ^I6G)sI*mlsOmI%^IxdnZlhHjc2m)iL!;qwD0k7$d%|SD5upICP-Z1^} zWZ=-K0r0-Un;LNrR##v|U{0X|u}(?tWUxFyI-}gs1v%WXrE>HZo`hCG6lWT>{D&nf z-guL&Kon1q7+;ZVO87p(nw1kB5?7h_2wkrq^YSPkxUC19m|VC*4wf;>8m?ww2MqUu zbexwdX^hb>I<^-{NFGer4<_peN8^E|@t&!(me0iSF%7wrQss^EQCQ@BIVMEvg9%!O z54tSm{1NEs<0%(jzqT#|u)|!3HK4JC$*+1Yx~BkSe$QD-G@P|U?nWT^3ngxIsk9S` zD?%x+?VF|TNKPmnoidDCEnk~A-C_9(#flP%Ycqf*ET7k9(;?Dl_`hX75BMu=-jW~V zY>rNG6_+)t`Lqg`{Hz$aV`y+FqZ>kivor`qZe@M4FptWJO)SEW}p z;IyJJuEcbvr@~MhGvRS1e7v2H>!9L$ErNNK74%CUfMFPu@U(7`!lU*gioPK$$%LHg#^pckAMBCzyLPUggR^o|> z)T|^L<(3R2m{pgKfR6%kSS>Qm7k0P-AL@lHD-avOZ!D{}<2P|hgkm@-JQ~`#=~M?& zKtl(NCvcBs3HCEl3^X|bP8lGLat2}~kP#HBxdn{m7uJ=qjz`p;HZU+57mzC# zy)bmR==pUcjiYg6!WbNBoG8?yN#6RCtQ@kA#<4h~bZnrtaUC{lu>KI!RYrA-+0~9R z%7AOp*`b(KxgQF4b#?9v+nZ#drwtC%^I0`R^dgp%7_V=vImny>vCCtu5LMJi?|8R+ca zub!Ks`rA=Ow^acq1BCQxReqsdi?5c_3mOKLgp4n~v{Kwmd_kY1^ddn)ei>S&hs`dU zoCrLhE`;<(Q|biLEHGH}mPmia%C7uE7CqWFi=CtTWzb%{&bpUGpUiR|%fxQHqJazu zTBR0f-7rhoG53N%ro2GTwkq04x~*BZ;i^nP_5g0g_i6Yht=4FRGP0gnwb2|;Tq8Wu zzEs9jQkr;uFQq?VjUB?^u^ z>8P$8gYRJo)Q%*)Khotc(ZPS{;m9P-|H0nq>MGPKsIlydWt0>09j11py$RN}#a9{w zc|JQ4T^({7!3N{nr_C4sUZLp1bL)HmvuD#nxT>sKb3t06gro3pi(ld{>hn&q_W2gU zJ-qHWeQT6)>m2tkdz|kI4m)cNaRoDE=#B4hP4!XcB2yK) zUzZQch-Vf0KU6vhTVJ_z%yXN2TeU4K_H1Nm2h^sXnJf(mv?D}{ITHp3a?cZNH6NcHgQAf%9~OGT4lv%w0yo}N2mN6o153jq~g`mfo22g=6R_UwLbGl!PUZv(sS|aI%i+&Iro%dJ<~6@ zs6^_CvYv^0)+debvSAZd%>8g!KZ^V)aFn8-<2Q9&5@pI!+`cL8n7T7?Uc`awiA4%7 zT0DIx|7kBQQERwF(V9IqZNduXujyzOmuWDwhzux4xH}UA@N1TjI|4LS5#W6qte3ICzVH%F;27npAOK z%k{peMSJE^t%6Y%f6nQIySciX`>#E1w|Z!77`_x{0sj&OaUIz|?=Ip<`O8Src${pZo!*UJ4Due`}20+LJK*$3unj%Px za}FLd!)Q2qQL;{Rf($3@td_n?bA1WpfMe+V(HR2%hq)YPx4H0o76Czk2ubO;R&F98p%TOu&WLN$)hn@P5eMZG8bqdY)98wTD_2;n;4Cyb?gH@=Pq=QtvNn} z2fkXGHQ%gS!EWjlSHKi=%-9AbkX?#A%Q=`>@b>F4m zH>gH0I3`e|P3q%JzAsGm|^Y&MX#^7k9zARBMDb{i?~FRT2f9!9$QHph##E!nDGC-ZfCW6#XyR|bd;@=faj`pbY}$C?Vt4x3 zZap_$EVWkT)w+hiAHUdLF}9nr;bQl`u|vyO=vo)#nmQjpw`_2~9lMY5%4P1@ee5H@ z6C%eTVLNM)secRMpf(1dE64Ake4&{u=WktJ=B(f0-my=&{TDOWWTdf`;axRGt>BVh zGSXPg>!P`U)<|O^f8$j^V+Bi)o&_+V3|%^nJKX5Lmt?g3DYF7OgqU`AH2kf}TbzWL z0MOc$hf`Cc*MjOTdBrhwxYftA?hq8=bj@0XQdWhbrfhe&{d%UqW!+IBY9e5O(4f#) zxdPm6pSjUJ{D*zrv-Z2oSU=ZI)!x|c+1WC|dQ9H#v3F=IF|&5A`)2Kr#=WE;ttDJ2 z5M+$jO(XzF5s3LoPK;unK81j~o+Naf-p)3;)_}Tx<=i%Q9;wlnQF%nYw4fMljbWR< z>p;5@OzUQM%Kirr4X};bXR+D_6~Kk^^8S0$Oiui;Z~vRwg$9TPfK-L~S8EzYCeQWW9%VXxxyB6}+h% z5~9YCIXE4KCE%=;3f>%d>4C%D$p==pTB#{lX>OlYS2v-_uSsU1L>a^qIq#!XIOa^KJi4wL()Pnb@5^X`N(RezU6z5&kSi!fyexbS)0%F!i$ zV)Yz%&}jFuqo3@!oWj~Vc+{@dUwPbleO3oT23B1J>og*?#deXuI^FK>dHgE1a^1_v zKOc_QOWq}9+uD=L{hJ+g+$|?bV&<18?W0z^H7CzEo@;cQPPXGsewL>D!O6AxHr9qI zC-3ejx|vS1D&!dPT&2hI{suW{#qyhHSLxi$UucBjQ^=}Mu@J~-MU?yMk)3f8->0z)|&2q!1 zo;&n&5*8!uqJ$Y*;UqvzXMv>Nsr**1JN1O!B>G<1c&F2TT%2bf{^GQ025iD@r!7}6 zx{aq_Z@j&(gR_>ayy`=I`GXv^H% zTXbEiDf&IezmuAk?t-7ywBKt|8#HX|jpgpJy3;^wi|Y>OEdC7Dcj-#E_tfhC!7Knp z3^BTQXp)ZwN%P6x7%aftzy?_+Mo(VBrn7uFW!o{lzVU*0uGYjrUHPdbMUIy{4{+a_r4kpj&f z+H#e4geq`oCIf^+i*`1K#C(DNr!~Pq&xexNnrAZx5(1OA>DkPC-iBwBHEbh;_M162 z)&7~381zuL0~1nu z&&9N-@Csh2S6W{dpujLiePp!2SZyZ)F1AVwoNYU2UFXHw9J@jDU3PcqQJg61U zuYyK0{)}Wk`y&)WhzIkLxuzKH&|P4FaFk9h1d#70)ja_Ss4gIa^AiK0YqL3|!l0bs zpLgNDW->z~Jm>S&hPF=s&zhOYgi5B1a%>v0i?|IS5@_X9@Do;9BLT9V&eM@V9^?yB zL>A!6Oe%y>YVk`T${Y~>gui5@k(tN07^34uEvkVi0E(j?toC>1bV=??K=Q$UA ze6k`<+&G*%#ZC*isPGA&G;^+EK*dg>yHt}1EZAfxwizw-ex;T8zhcP}gq}GnVq zB?Sn0#d<)5qd!7s%4X>gZ3gaapFE*IX>!T}sBNMYk`yi|3N${h_M8miB(7{BvcQcU zPzQyu5QoNqP(vQ4i}V4^K^q`p@m1@!SVJ5sUE|@#_2)w&os~uU7sgN)*aPxYo2ejb zzh(xQ^?!liR zK|*A~Dhbz@hBSK*u(GfIttTOBZtx`kLH1QD4!K5}l>7AAwPhL_Vc&Enm%&QzeNK(> zhuQ8?=Zx>%{CU!Q=T$X0leA=`7w}=#RcaM-Scvnq)=}L{>-8Ux?-QL~e30TwW!(!1 z#aV`mz@bdT)uzC7LVS)ls9D*3VEsXwLbzLemSzea2rvy~8c>Eag(q$9p)L;}jw+@& zqTy+TsyWZ#2oOZ1AjG3R)WR@gr3g}TCHCI{^TX?0$G|1KLlel|BarCmFwU=Y7Kiar zHyDEMDz|7dQ^J<99+7ggp?xjTZDUO%&}D+m-BF{WP*A3Aam z03YCi5P=e&V?2XghcU4*%XEM(f=gsSrSm@UgF{9eS(Tc(3UY&DGF-Ti=D2(cG7ur~ zF+bUR`&rd%gdSnsTE-C)If&}=VoEYFek6q*(Jvgfz1Sy4?arNksJha9arzI<2e7@= zo6*DUn(+f{fJM@}s&KwxCjz;RBn^o=$h7?#X621coALWrr_EP^9Z7k~pEITj!V$Sr zAw~q`kE|}?T+jh+R=d`WYPG_3X6#Tu_0H*GcK4?LPDRv%?t)(p&VUpwR6?TQ1`Zq4 zk%Q98uu25x#g@?2w4tF#RD%4d907s2m}wcCLMy2V3#=64oLYuLsWiASz%rAPY-&$f z7PU;VhAR9g$cneF3lK3jg^@59Cybu(!`8bfaYIq+pqkERi&~5Iu%p}tP!2U5qO%N_ zB7dcgg3RF5%PzvjQ~febE)z;!Z}KnfTd_n}NAv7YS4)Vn|kBArI$-(zPbe*t(f z_HxyOlBl-$hQ4H{iZ^I9*VM?P-K?_5|BAP zY=trC!}Mu+a0mm3OtO3m@mB&r8U%KLfRw#5i3I62Kxnn#)64WQV|mnTS$7bgf?$BX zJpI2AzKy-lRv%J!&tb2MCvz?R`PZ4Y<%_T3-uf)*4@QYGIZTaBtFsTM&b zKupLM+0Ag_3gxl_sJn>NorJ!MOPnMM?U3b3{mZUPmFQn+tQ2yXd<)`FcOsRC5kG?* zphjmnjWn?sf?3UERNtK}1A!wVOzanv&|##=wql?d=vXU@l)%<8x4+rT9r)|P>S@%kbbs;d2YR&mj(1k0s&RjNVU2fAquLWOA#X;#+S9E@ei1?z z8|T=@*K^!cygk$=cab;HePrUh@=LQ`P=A!xA8qKZ*1B68dh@j%4gFE4f8#Q~_ITsDz1EWwXfsV` z$Q%D%pqB+@t#yx>Em@GCUMDkJJA1f#!5w$~K(}bl0et=NIr|^5%244zYBymS_T%%Q zO==z1eQccq8?=Q!$~EbSv5bQ_5de0|nQd8jLtkuH5&9>a;Z-te-r6Qb+4Tm>AXyVS zq^Me;U+M|4$(ZvYZG*VD;FAi`D)a#PRgH%i}*E zg{C2*Q7>Xpq@m|xy+_8oA0~Rxd;Uz-wHs=&r(l+1c{--Ma7piJoY^*d@Ie0zD8ZjQ z4I`%I#WXuu6f#q=dv>P6JZzC8*OP~?4Jk{7IKL;qAB`u7W4Cni$YzxHN^{CvH+R2g zRbFde<^6e`GuP&!lUh{{ofxjN9w|hp9iVe`fX*tQ)2FAgv47F$idO%mVT0!#&5f)xGXQcLcfQNp}ctzHrm-L02T*@I_tR zW3K7s&cCH68+I=Gx!UT_uebZrMSaMl({D|w``tU2?PQUcm>Mxl4emzz!Yl2oVPa9xZ4KR0G=I;LBvcY)a z)XNSs5P@BD*+AU9d|CfY!3%eUb9!DOiH!z{ky)Ymr# z?no&ph&xu10g&Z;_`JrB3TJGvk*vAGU7%zxbE5TVZiB+1`AyPRY`UL?0COTLOVcvj zJesD1)jzUCOjoYqB4e^_Y=q868O=U+mR%}?A%nqXBotzmm^}<$TlY?m%damS(VAQv zjrv$RIbe z2)sC{88iL8xhx!gMYVd={mm^^tms^Hr2FS9`l;>7GnOk&hz35bA7oAFBP($nnYS-WrF`q>M zxR2b>rytg&O8UffKTf62MdO;Ji*P1|55KPN_60GwVo_;lS=lNBc^^tV-uXIC{>4!&t#rT;aZW&N6aZ5OpMpE0^G@29@=0o2<) zXL)u7+nCQB8{P61#}%UAsGsTDR}OGLUU6`42|K@8oms4Nwtl{cd-rwC^iiX6rhDM^ zNAmeq*UxSC?wo>myWUW(9(NDCA;}D}r~88&d&K>9af4`f?m0I` zPF>G$A<@2N>QmIJwge@kFEzn{895VoIUESg&Yg3hMn;FDZHGDh_eVG zBy?si5)haorqXmC!|xBzhq$Am1=9Onp)d4UD7z<{feBM-Q#Ha4Pk*lT{jOfqS8a1Q ztvLny>9Dnx>SE9Oi|Psw{TLr)ue-Od?cdpxE;(5kj8z2u^K17~OWkkp?gL+U#XUVs zuhQ`I-NSDDQG1Avw6t_I!p%^{AO<5N43s1ii96jzcaB%k0qz;p?Gx!MZ0SCsvgrz1f@-Sz8+sEE65T`e*L``_KavV8k%%E{yfqcf`%YhNTqb-1$MiyRKqFG-jIhUjr(p%Xz+1y zss%KyeU;d?5*#uJ8yOqCgwU((402lJU_rW)s7}4s!uQUT=Yl~2C;r65&=01-6`lJ@Cy2EoKoDL7?ihx~_z}>>uOQHk zW&$^;AA*ed2SQ0~9{T)W?jHe9FW6q3@=@6?5we@@(g2U-{PIWpJ5}^Mp;8m7MF?P` z=OnHC?v&pheI2?-aeGK0`XOrbzO1)E)Xzk0D?!lLVKg1Ai1qM-VU>0why_opK?Iqktc^#PU)4Z~7CFL76MqR{m4-$x25X7BEl z6f(Owt`N>EZjVH7?g)wI4XaBw+DY>JzmG&SyF#K|dHByZOT!@un*!=Aq}C%#upWVm zeNt{lx&lQZ-4nhy+HFa??yC>&Qxxo!-sbjwcreA68A6GHt;uO@8EPiH6EzUntw?m#Y$2_wkMZ2$P@-Q5 z@TRnI>XC@!pT<%ctxa@%1g(t}DuQ(v`+``(zRI=!&#F4>_GTk+huoIfqdTN}H3*M6wx8Mn)C_xVQ~E4MYWSCz{h=*IEg=eJ}z z)l?~=Gy2&(1v;agMD6YQUAQ8n6V|B1Vrz9yeZ;uvAk!x`@A_itr@?_RT3IZS6$RXA z#E%!pdTwy7V7{s~xC7P#V2l%xS~Jrd_FdSXs1K@ae=d_xmp(7uSt>a=H4!yhTm**@Jyxe_A$F$|C$IIs_+mI7G;P|)yh17EZk*pW6WTizqxH)WH`ED6oDm3cVz62(aD~znh6!UW zCK#ZlKp%yy3=a*(g1x;+P`ZZ?brKDN4mef-8jcPG1Rj5CvRLxjO$ZHUZMAvscbk6d z5BXVl+0)0Cd?=i5z}UcMYIozNvBrnW-LYwayWgg&xT8(|4_H$@#EH1E&EpcfbS_8X z&ZzI=)@`0pqW4nMD~0XU?jxHU{a)VA1J{!0j`JNM7tM5k{CwKDf2Oi`~;-7|~-Zfsvw>C9Vq?U_hj8T3g+1)G?W#utBV)&>U9*KPPyw;u1d(ZIXXz`O1r z{v-{2`KQ7Lj^|izeQ^md`@eLCd-^Mt{JG$jp}eS=}+eVca_W1#OW74qY)kn>N5>S46ws(8f>=WPSZzT05 z?QRZT5;G?oH_UZcetNQd=?7hmIkUXYF|)yKdVioXcb0qjUx##^%Y8HnyPMsWgRr~U z#nxrB+=YK#$_fj&Pgb9b-|@TcU5h@`leC)LicibcXYO+!GT`4zx9;&D`Q4sp%<{Wj z{c)AiFw1@CtD#*RT6TGR6$%^vS3$%7%5V6)nHrIRs@mZ`|Bqo^cW9c($D?i+&oA44Tpk*~E@<}a z{ATCnjrSrw-iz8CFDev{_uGPozs+xWL0-d`=!P$8vtd-&^vx7-qqnwHjpKD=clA@b zc2SFrk7j$HbW+Ev9o{<$b)@>2_g$I#0eqlG>=?p2sxvm8;M$Z#RurxecU98XJAF{@ z&GO#v3@LH_N=Jx8Kdp$9TZg*DBi{{xLF-luY)kXi(+b$`oeoHrbelEyxrnT zMqC?jG2-stnz%ZE@Bf1juaRMQ^@bIx#E82&EN0`x_D87B5?`egOa#nKOBJF?kG9Cc zZ|kaA-q}TJ9}b~&sp{9G^_fMjzj=Qx($H!T^5A2ya}RZd`s{lLy)@nS2myPqTB%dA zAiqbcegb8J{1c@P&4PS+h58jqWwW7CAXJmKJ&ZtfPH7@e0=vlQiIc*Q_{6%6vHr!ZO%<`7o>bY)-vKRsxsw0JxEb0UH^l@ST($VRjaAIJAJq^ly~s% z>NkAjsonLPJ%&J#;QpK;>R4W%90CD@>;6O4E8dT*<`I*VKqd8s42FRpsvO*E~05)Ec!Crf^K}H+!kERqejusO*j%Z+(qAy5B>8 z<2<@&KgseIKcnV!&VE5Ews*)oXQUdI1>zF|TLO_2X)({4>jiXpeD4S~uJ`r)#2S2I ztwVC-2(@?5tJ?&2A@*LEj=P}cJ4UL3JytB@KzGXye1QzS7asq8q^cS4+A4HRAAoW? z(+8lOr*(-$?U-AvoQ>*1PSf z6X?B+3~_`Lm#bXTbY2Ri#*5BHV#)_vE8Kq@4X`V24cD={qA;jJCth$vkGG7+bvUBJAU4wIbf2u7SEZ=U&Jn z)JvYBa^SB@+6F&(cO=rqGZL zMtfUEtMP-|6(a?aX}&Z$D<5w7hK-XCQ+ulk-e*5h-CFSKO~R|Abe$=?wGKAref0%Y03s$cr$rEv zB5-F~Z_zso&Ri&&-2PVDDzwwjdXzpEqgH|u`he^ZD3%e9;Mi+#;u!VwJ`$=Ym7!by zk>I&-auN|=@9i;aAN7FOd#u{u_*0{I%2+k1Y`#h}X;XMp%QtI-ckNhpVDI^u6%y$8 zQ1h|r3ja&u6c|W92$HGRLmpb{I=q!CaM|iA4+|JW`!nr>p?*BD9`S}Bq-xY7-f#AS zfjI9V)klTAhxbvtCvb2|6l1_H=K0>62dOc}LgfwLS4}u<0bIYb5fZ{ne8Ei3=8lrJ zi<`9F7uI&4WOCofLhB;mMh)j2x^I|95;Wyax&W5ZoBOJ=3@6U*D#^nsBbk~N;eFI$%zHn^UpO!9m&c`|Kb!l!DBXyOq5uh5N=e}s9zku>e z@ph8=GNdfHp3^)r2%G<6_R%(JL99#ro zGAWpeAdrj@;3YtQjx#{u*DL{&pq72(5m|FIvYZ7=S-Pjw#A~*6ieSoF^0 zd==-#&$}|O@+0{;#`eu_qnhJ5S%~8T+y)58I^ZqXU)f&OVW1LG-(_(E`lh9m1SVD< zJ3+MB$$X@g0H_)tXjkI{6*V#Ns3&5+xGf@)6aNc{1P%?mxCa4SWRq~v0(bg>AcQ=; z=WA7Wuk;udizuMl^j`mw>X#|Oz=&t12Zqg9$nv6g0h}S)kL(s3XFLMEAU(Dv#}Ww` zh%+iJg0q;;ED7S=c{sa|xXWVaDZ%7k&NqJPA@%jd&H};CK5ms z$&d5vzGkXU-r*OhUS93J%G5FnqjIkiUR6bnPPm zEK_V3Qxt*4DRo4XDsl`cJ%H@j>s9&$oZ&8L?i7rNhdID!&V9auYgt~B6k)(Mq$RuJ z3{zli(nN&wuS=Kkh=&b|$|o}nP3xiA-X%w>z60*Ninto=Y~wYH?&cWu4xfOdi8sn} z;ccFvD%7L0E-X1nRdju<75V?Tmj91u<^Sis+ZE&MmmaJxHIDqR35?d{#rg{lg+KDl zpyBqZy8gdR)a!>#QYRb6u0yxKH-D_^qJB>h|3p1W=nn7tR4b5uT0{2f^;lWEshvP| z&AzHv_`d_H75l5Vjm-ZPR0S^|MpUODtJc;h6#VWkwb%OF$Egzp;>8noiJtqnrV%}} zbB$=z&NZTETfy6AjknENjySkYRVed4sX||xVX8vd9$F z5f)~cW=z!xd+J0R!pUh=jbi#n&XdSM5I*Y`hnSbDBk0IU~!5F4`a1}?#(mkqrQp- zLv%9gK!oG$IGHatF%j01E{~Z|@?)is;#Df5I8{NvD!Uga+q8*NSOnzdG(XTTD}5Z= zS>E!#D=Jwkr<1iNV!@s3Z#hbRr2c2+!5e0{7}SkV`_ux#SO=4tfTjT=02D=KX(4DH z#Rsj9&IA;i+U0@oQ;^u9sUg!{C|i#3h~pekk}h|7q>^ZvDj+q85|U7g*D~ zY2g4^XMD>p1qVp`c*h@y9PI?+DnX(u@wJx{9i`|12T~hrF{NS7!RPu@jw(o#laye9FMQ!hyi4xQQAl)hlBzhhb&GV z2c&6(2Whzj7Jwf(po1FEy2)^?6d$E#3=?S%kAmY}-UMB#hqIQ~Kv%L2*@UA43)H)J zvbu4YtlS-cXU8$>x*mVzs?pjz-UG*~KNuI!@#g$UJu&rvaMATnu2ToAPrO^}V9Rg! z-mZfg|B3fq9U`d_oXseM4W&SH;b8V5+nax!ny6k}a<&?z7I-I~s4CTq-pmuB3%}$& zbfVhJd+2BCbVdQx32Lm##BJGVHA2$Bm=OuGG?4veJ=s9)QProm52pg2;TMR3D*+a# zK}Nav^^euCA3VjHSa;~d@jod8_M}*qn%T@#Ab+c%&Ud-YbUQET<=uRo8m3;!AMYzN z-VL!r?GYjQ(_VDy(Jfo#lB!5X;!5 z=p}y)d*k`z)v%60;^~e;V&otGBS>hJy-pA;IbQWgaEAEm_C{|0JWNT?-SmEWJo0-r z{?0I-Y4GY!PzM^D8oawsP*sUM`07^QVyoVp=fTXYI}r-&TbdT$CM{eUOx|1kW3{{S zM1!~S$LdVu_YL0eC#g}@d2NLfgW(>_ddIe6jq|@BNB0;$PY{BC%)9&~wM?z_s!vvj z7_T*Wzdc!2UT zjWP>=uM?{KW5>yrl{&mo0KNqjjydlljzU)iU-DEnLtW?n?o@S@@p^;zr&D2wZ1YB* z2KkHIDW|D}jXyPbt4~usqkj@Q^Y%Se_4fXHnmVNHx&V&YqUHneId8)0>PEFVqHLZbv_%tW{OU(r{WgW$T8i3*@zUC~=`* zXM;&N)o_V3G9d^k~0mxsoRh_|&)^;UnE=Lc06j5JTohZ1)e2)wHz^su%i@D{fs@rD&P@L{;U2DTY3 zMW(mqOhDl+J*oSrV#06fNqsXF!SK%rh$ES*0~mNOPg9o#(gq9BB0JpG%RFR8y|pKp z5NX|UTH+V8yp_BH0?%|eD|!EEcXPi)-j+UZRJnP+RfwXiB7!2d*n7F$lrXnoXw_L* z-@b(KJ4}5^kyq|joUhLCHlM9#23Txk9AEk4*dEs7z41J~9D@UP%??}8cXX!V`<>w|Oo;q7qaU~kSn@MLQMsVMBRq8D| zKL-g0Bl`XdGK3C5gfTv+d@yPu8bBDPRs$e+d53RuQ(BNgpw~Lp<7l7RR9LFD@~#*} z0r$x*7f&h+_=BdyR-=e}EM3r0_#`;ZDDkP{$t&&?i!E>KW)-irD930GLZj7D8~i{B zL0L`G1cY=al$go|-DcqIWD*|bZL z$)~KS=)vfchZI`bt;~$#*^wh;^Dsb=*8uKjjs(v7o^leStc{c(lR0_yQ=oTfGM^P_vOZTKg-+-7bZO^ec6&@sNHQ zOZ~5YiN&DbuhpU6**(m@#@DmF%X(n(TG-&-*~6S*+~44R-NPJ)ir-@3-a$RhV>>_< z^#ozNETpLd*0!b!#?UlXP|ep=ArF13@SposA$5c*f(A$xK^>tAL?xSX-{n447<-4x z3b?OhRI$Dds<@Bk9ifVTqzXO8fGUD9%b~PXQoQP4tJ=&bJLS56?v(3bs^u|Fz%d=- zI{#Qqz&DRGTXG%HRG!}l?t*S;(6z>xi+vP80OH%Hc>?fCBYX4|4piQ>xM*iQ`fwpO zjt_YBksLO*w#uU)!g0n(5$J6jeR&@n6taOFqyTKmxjmDZ4`(ZnyoZ0O#(2|zt!(SH zd^F%h8gIp~)dc?-41Be^m4nyiV`IL0-k|hmsHqUe@B~4azU+$y==x^b&?^s;Z6Fxs z03}%xa%1JmX^eQ`97a6%H5U0PN3j+d=ze44z1j?t0HI~9&8R;1Qh}DZtuO%VO5P%v z?=<-avu8J|GUF;NoU>E~ul2pmL-{ri-#pS-)9BqcOVu6tg+!5j^ZH1nS=rcDZX2Rp zW2M?^q$8r2(?x}RrajaLVM)PpR^X#+sMrfe6=Em*{Z`#%KaG_pq$MIpbWQ6cTIP=k z*X#eW!TgMgiU1{9Xyx}V< z%rSn$J-th3s=N-+b@w3@bjZU7ax&&SDSXH45eQbS}E^ceR zm(_kRxaP31ws|kW!tj#E!#I1Mn3fnM5F&6}U_V)i?mJrVXpP?yuDOnGZr)Mv2DNu~ zCeY_)CU+LX>#o*2Sm$?ut57)J77D*j_pvhyUuZU`@TCz=;aeik3M_Cr3U8ed?`eHl z_xi)aH8=0uo6j3)%u-|KI#b1hcv(H7H&I_-lNAR{0xk5P?98Y&BxN9;6EcX(RKp*F z%Md14>J!?c^0iXF9h}mJ=Lf*0h09nZ_u*0tXF4u5*j~)%Oy$& zcPa_XTFzykfJ>NPG~ihsbawE-)rpYCP?n;r#TwKg3lRWv|$QZHOI?SccA@;B*}-qztmM>X#8kxd9>xkt{BILN7@!~aBgr9kC3x|a(u0eXUb zXp~{;0T5nj@cuSW^*(M(zAw`jupFS%5pfF6SSV4NW zw+&vhx4Fvr4z9i4<|6ul#`Q6OWIWs8UE9a(9S^$q9_wQc%v_U4Z3|ncwwaB2)aIW> zEYu>DRxOk!pQaTO(YW)^s7192n$l`Dr5&ItZ8Ry3<7TmsU!;#jZ*?7 zG32KQfsh!m^(99x!jPjDf^9Zx`NEP6JDE4;?C^wIIWBQia%QQLz!^~D4=!d8XPVmWfML@2FUj6OOz53hp#9|_UMQv)Gei|Bad`p&qazbvR zCZGvIKuxk)At%}qW6&-mkkAxOLX$NKov2A@k|v>}^Vd^o8a@Sqb8}K|8WI^vHA|7a zd_GYlR5Kl560!5KPz~1vgCH>Gqgh0{L}$4Pl5i-9A?jqg zm$jZUXhIvJ?hTT)EU0kIYPx~{O6UgOEm=>OMr>J6aSyr~+3JFd?{y2|+(*K>uZ5_4 zPSeihR%mBRmUbrlwA0i&?X1Ajv3W~s9O_;+BIJ#_2tx5+4c_q=sX3kg9k41UhSROQ z`il?@Ow5NV`WoceeArV6PtBj7FTd8zhYZ5CiucvZ47zerwnJt*z>K zYcLDjYHfwz+6|4~WtX-wr=H%cm#Xgm#8!C!yj1n^YWkX!2d!|M>O)SovxV0n&hKoe zy5-o;)?BIg#ieS>kPcT5B_8z7UZnbD5G*mBgruXx^}&2s@yf!lEUB!4SE3#7EUUux z3|E9Nl6i75lSIHu&$cJ!ow-QeIUv7sJ9U43nVPmMv;VWq z-a(|N#q6;bG@pHIJ{i`DobNrmNDYb0H+tcU@jhLox{TqX!bxKhkx6egnoYW$c_bIA z-*$A)fX~!v+I1(#UD846yYl43O9M-I;C{@Zgr)#T2i0FjH*Xh4w`QSoGabVSL}jx` z`3fFCn+x?qD4AKI)T}BD^Fov0@!Z;%X;$~C=Ii8Bxw_4&E;gDqyVz)J1PhxBsf83$ zoKyxXW8q3IQY1Gq6M~?vW?^|3!eC2IFgI&;8zM4!;4+tmZ`-hr-quTT3gdE*zW=LWW4M;cxd zRxx}lq>Hzwi~Sdn3L1{07784Fp7pDl#8a?*e3zQ64=1z0iE;dU{F9;5eJpa z`NWyMK~@{kRm5Qh*=!i)7$xGZ4RmQlW^f=m&QZi5gZX7W=r)V&oJYONuab4LBgW_( zUqEXIvHF;>a!xTor7;*qxM;S)Y8p_J^ zI1JPQeCBf)=74Ss63W0~StipD%SXZR(O;Ex%8%mHEKB0E3Czv$@Bb4Nec!+h_#qFt zeo+B%S@wSkaC00{esBO>5JL#ukOi*L%P!Hs_pd8d!&uoy2Wm3Ls6B0HNNBY~;&2w$ z0C&c`E|iC74)bMr3lUDbXGSX&G`aeFhOV{E5t*HfTplZE=@_%&dk}FIk0EqkM2EJC z1rcId4JZ)`b~P>%%L-S?sf3meMz-?$K)nB6?tQ+9_lE@U8p zb;g1;i*-$!g)OIN`c|&Zi6}yw6ZnKGR=75?kBoGd_l<4#=>2}KYPqh;Z`VmxBe{Nr zrw&oZ{5jsNrK+D=<(++{N^@&yj5}iSz51zH8PA*uN_U>JpOf;zZ5k2rtip$7iVC1! zcR`ZGH7#y@VK@0V9$yr06P zyBZ&4ja-eGJ_<)%oh>|%4_~}m-D6zR=qoloIlV{t2R6o!Ss&EU{%Jag7?7cg`jqVTjwL# zW9X;P$04zCK!8Hd2|lR`uSJn_VO=RcV1|U*2v^B;v0hwcsl;=vG}yOo)Ed~OK@heKOMD(U5wtf>tA%JUnu?VCU`r+%)kq1pWHx&%ue}5pW!ZVnbZ{=o!P0DK zcZ+|U_O5L-@|IR&6wBumU0hQN93)eh?HTyzL^=CAh%{j(nFUM{CSz zAQWZ8YBLaFH>rRq5`d`LyLqh&h$JM75OA?pTYU8;;%71G+qC=0jrkygY3b`Hbf{=B z7=h!5RvPrMz^j!7Cm=*{!Ua?dXD=H56*luYQ68HB*UiqshfkCfRQyh~hM({$(ne5N zk%|jxY49N$wNvnM*aALO&Zn@p!MC^1=Q*t8!7mFwe6)e27JyG~1$?LHC@dd*L?fxF zZScWYPHM~pA2TMlWD}FO^Xub2?`{owuP#TzGtvQ(2sAoFzbrtDD4nKE$uHq%U~6t8 z#S?rD+<6t{Hx%%hCivzg%%=rJ)Vhq7#Gglj%$I$%a-+W@0&#{%3K<+xP5;e1%V23J z=uP%{NpH}d+U^ajNU_38x(# zvdf8fWgvq9RnqF^zQmIljz~Q4rGP+WAJY>}>w`etRbvR$z%{6ZS!;N_3rsEwJHp?N z?~GdwA6BwAznIo7)@IJR*cau6;KhRgP%#2Zi#QD+WYb81E0PIVR0GQYCTJE=3z~O+{1funfe7%J9k{Gx+WoGO!;7+^=^ZA z*0s#~L8`0(@VpvTT@^lrT# zD(j_<-j?fe^e65`g~k2YRjNk^R9Muc3Tu56Hln!e;s??_!cPp5amYH9 z@iEGH7*SA8W03JNk?|n|sueN=$(&G<#o?5dZTbtw*55?7K|GX0^y8ppk}LcYqhO4M z8IBA)HJ~VKJF0b}6TzrrJ?5z>_q@$}XQV7Ct~&~cO3*r9uAm+nql}0{M&NuYxQshA z3R^}2^`OmBG#iAB;;^(%pbZzy1D^%wm@zR-qJq@{?H-lpB7A@A zwn{UluJE3%G=G7+1NsMd6Vf{&>xgxQx23|Ij6XMc{ceCh^BFd7 z-Jnj%FaJZXe2CZgMhq8~oEz0$#+*j)AH2W3(OY&CcDx*N6Q~`97v7XD9A&ph%@GT) zBDK1E=a=(Thvs(C|39jO_7lmv21`g(2MTDACj>MNBc79$wFtNt%W|n-3k;<^wV_O} zd$gCdp=3dBVO8cTYW*e99BNx?4hM+lP>a0M|4q%o-)XIUg(A211rrWHk<%RXlLF0Q zbf7uFAvZctb0CEM6%fKUHC1gG| zw_g^D@_`N;T*}irnW#QbiWSBnRW-TQeO1mX4 z$rE>5n^{VXbOmc^o*M`Tu66^#j>bwF&9{^g+iKNPQU(`cv6PVfM>kN;vT0`X&<)g@ zr9@p8QJs!hN(iO-ZlIV1(t?1Rwv<3e5-tl${T*9OQp1uunKT4V{b*c45|aXP7YMbh zA|3Pod>jb1NnlBa{PKJkM{A)*nFbgGgw6H&Obgo)z@yiqP@%Uwq|XByzBv>nG@#E{ zQ~lKrivSoDRLn2Xz(DvH@?ER#S4B`~izN8?ex5CU_LA@%;ROyPxWIaoD7>PDX3tLi zJXt_Z_5lUMCxcCPVmO|d^YV}yJ7oEYckI6gs7z6NkdlW!qy$jfN^TEOfDi!%`U(I= z86_SIaaiPgbhd}4dao_Vu0`xL-HA(QK~6|b6ALFiX%uq@5ysA0I7>uG5rbMv!KI@y z*s7R<3~c5<%DQxd-XNy@-jE^Hc5hiD$M3BJf=Y(!a~$ai`Mj0&MFOFX2Evt}_BVS) zPfD2<@}{b9#*Q~wHizD<-a7p8oyS-%HjoTT?E|NC?xFTfg{?QqqDW0aiZ&ub3~qpi z;mLps`s-WN!vj0e=tF3f$60i#k%p0n_aQd8Sj>KeC!H-LZi1`CO%QxVlt2ef#LK>9 zHL#2=HCt{~J&iBI-tPvORmC6hLoARyTMci`0JG1jL>fZ~0jEmzB`*yKq{ZM1-r#3` z@&aRE0jC2~c!^Wk`mR}4O3+{i@8Tp~3t46}Z`E;|<+rL&I|7TQ02Vy4Sz5ZBu+SOu z0tkt*xXAvc8a1Z*B%2o>6kc4@s%EF zfOAF5Kp|LUL*o@W|0FRxANF+2w+s8rGvW023;dR_hr2lod+nD;Ru3^p*q`o)?KJRF zTmXD{>e~hOQi5lfU`;cr0M>D0NML;p8Y=> zIm3uDRbrkr<(+khvim?#_~#pHK|$sg3rSesn?KO3${^+r#?grhpbH#d$fI_JWrZui zJ2{qBHdq=mgNi?|exxP1MJ5Kr7IJc)&{#wgu|P#BrD@F6N6JM(W7yabO2@qgcOniq z4=rfFDm~@!yP~?Lua9!`V-n>~co_!3f5OU{wgqWRUWTodf1QxGajv86ZQI}@5 zut2_I3xLRfLXtTlgtU>4de7gkx@7bjmCXFigKlsuNg_yFV5X-)mxltQ89+BDEmxuS zELD-QwY0=?iiJi_|L{3DD=p=t?){)Z*N42id(>{;Gj}5Ke`%w4{XN)Cg=^|AHKOxU zp0({uR_ozfi4-P*59+k#P@4vlA^-N+912!hXx z_lPTdoYta83^0^<&kQFDPk8Lu0gqOYZ6a~mP+HDdPT_2Fp;m9vB*euL;Fhx)OW=hU zR>0wotsmN0j6IsbkUq4r6Y7@Y76&kjy}y zyb~CC4t;O}BWDvFG{StPj-J3+>Yu<^$|S7(6Bv)>x$#Mymz7Rp1CW2pG*fO`oWMw# z(eV=)TPK}seA2;{q|>u?(s{>JR_J$BOfH+7GfKPW0juHn&`PlD7+>}srV|GOW4FFU6R8SBJPWq-eAR*cbEoDnV z7-F%>!JS1AvX}@)?VWVD>eaoFLW+YkI=zK=t5i*AjFln?K72hDQbdb0#&L$Pe*hDbofAVAa}fRt&dAw+YmhE_u{ZfZslj&gF1F}CuE2F+}Ty$C-->G@Ql2#ebDXuO!kNpgzzjdgu$b% zB*;h}Ks2umU$3ZPY8fin`U?vDS*1_P<+nk|ElwGic$5#p?nGQFQzhPv2M}tlW{xiC zHkS~|W1T0UZ8#+kzy)8zsKrHG^I>iNgsagYUR2g54i8VUa&b7Q%K$9uns6fGy(GU& zLKL>uO{Qc0=)<|g9GYa4GiQa42p&9;q`$K59@_7~{r3(3hr2g{ldG!s{p;+i?yjz$ zP7g^s15jNA=rCx&kVNESPA(vd$`p`E4PNxd=zRkEyxb>R4JHs3H41X#1tCZfl)-># z5F8pA42lpC6%;TiDk@?`yqBwp|LIv^;RE7$hF08li3&MkOIc%SZwl8^dq; zp;Z@gYb|iK0TR{5FscQvH;5N zguPPjHX_gdvmIN&VPjKe6ErK2`SZ$lk{{|@Lv}KdCOgY+kylz-_q6F)Wu&CvSz(gW zqSO3I+R`mW+5TwejIukLD4RHNQTA8Fe|xiYQhi%k>yTD#)T%3|W+&9TKUx8w=PBk- zP$UOEcENi*Z5~!gPf9|GWhh4wgAW5zw7scp`axgUHNfOgEBpDxmb1-ev z3POK14)cpI*%2?gIoNGN){QqajG~(hO=RpaS%%q;kI0dkL&=#qMFqhp!+*1hmJ@IG z;KI8ThZm2eKN?s3rGai5XYs8(wmH^~8rJAbi>?%}`bMw|2l`(7jbKJ6(+LyCs5>{l z_Z#Sgr;M{M`CzcPdiG+emZzMd+gY`VgFoFYX~WCJ5Bwm4hZdNHZHGrrOdxxPiRae% zjQV@KkS-|9{GMGy=6+C@c=276ILZboTq9(gSHOloAI9c($Qk#(&DtV1?YNdt8b6)x z`|?slB&kE^Z9>P%m%K6X3y?%k)oX!W5`(ESx~aLkVU!@2O+SGI+AK-mDcHsG`>LtA zKBNOR2Mo)~D^9`<0w;M48xU!m@KM|`9-QmeuGsL2@!*|~owyq+w+3eirK{7eQFF$F zzHMOrW!u8~r#;q%Qj;N7FGFU581OnAFS<3D%C2K+5)Ogh7N2x$Ftgq^(kUT`O?*|r z;-78HCL3!Q`7pwGWGA@plm=bHR#Tz@lxqnIS#D^+d0COHA(aQ$4XIGwiGCTg6*M23 z7=N~gXDOc(kgLWdrXX#JDF6|*&5c*x#;$3O3R*o{+9`heHs;>wO?=Eo z0;6uYor9G)J<9U@{Py4@mOS{M3Jrqd%s>kILJkB{7I|T=8!gSAqNN@3W~75mCi>c0 z?ZqQ^1Q$5YbF$hVxFfj7abi!}*ny5ynC#2V8`E}vRcvX8qqVFZ0(jNV5C*o^cDBUT zJAx%S@HuwLss;RAhh(^D0qlHV;FWg{A=%wor4vXc z;n?NTZFc$lPdzwNx#ga{zbUb~A#29S*s4L-J;1hxS>WcUy-wmc$ z=KU|>H3+}9BL2?3!Qy!MdqJQ3`ii)EU$Fm3Rvfc>L|_fY!F7%6>FgJ0r@Z$*98KdZ z;>+&~e&KGnI!D|cD>hvB-5?0ut-g`?JNE}=cN;N)_j4uZB^r6j4ZA)vyoD&e?**@D zZi{0^leRi(OTTFAW8VvAcYMQ(qBwXkIJ`6uwL1>KAIw3+-tYUtah)5_w7R2t@uLq0 zyZi6o`aUNUkZ<-6g586!#fSZX<8;3kU-bi|DXDz@r?~n69zS2zw0Ow_+@5n?yzGJC zgvxbEeRmbC!nV5#YO(K!!Osf){$Ow%4^{;8R2P|Em(^MSVKC5n zb5hx?_|ykDtL((@2fM@%@*%i6e&UD0yq9K6h{O%iHL5*H$+-(v#DB7%*x8KYw-Za_ za`Eq8RNAGTh^O$Pv*Sm96ma0?+41E+;$Vf`?>9UYEGW&&=OAU@c3lYAoa?16rS@&- zY}$ODsSgJShyss!n2X-8jxTsPSXmxVxINzakzh}KJmQhyPvtR7U3+$X?~l2=@7+HR z`je!;BuUr(IM~sBe}%p;a`)JCB%Zf9xUy07q(>>*{%F3aB}I?=qWrL;JV)Z&9u01< zr?5Z@g|6j+O9fB$ZMDG5o#gsPrhQGOa<_!{8ePd|Zize-$Ap&hJ}L86X!(u~#QvTD z)yY>`bzN+P)de}z+#>yNqMZ9D16MSyIEa5VkD%46J@z+ zi@Gdw>Cb}U(z%@G9p8O-dVD(5s8$=g-xc9oK;5aLH~D#$-j<@DU99qz@G;2+@P=d{ zpjK*=X%}36MyG$Td8CJ^)^O@A!DI@4(exQT0=z zw59wuYB zR=p)taleAX8Ey2K*n9zPm*mH#@n3!sEXlf;+*{q!yjD^KG@FN4993(XwzT)5k^doFV2+ zo%J`9`q5nEql6gO14r6J@9#Fp5H}x4!>hZNovG&g#e0M*Xx<|hN~qH{bTTddNrOnd zhGxG+G-#6_=L8(FfxJ<&8REi|n#$rKDxIbko8FlEEq?kC3=SxyP-HPu2qMSZeM*@B zi!krI=DUY%$e7q_KtKrpiF6>?j5?DaKx1#i{^kXm+pf%YZRnt$Odb>^4~G4;t?KhP z&-#3uRsbe;Xe`fuJ;>^MmVVAdVF6^u)~<#XGwrXthx|y)^B!Ol7moB$Kj`lXe^Qs6 zsPV%N800CWQyJBP8Fd;PVh@M7k&Wg#%?s_DPhgiocp;mM32l*FK}}$w@E>b9P)AjZ z3^y_hurkvTZ`EW0Gj1z5U?l|APHfv^lSOjkYqDqAD4`MD0lX}^v%zMF4F-*LnQ!V( zMMGL;HM>08Y!$YSXn>tls|b!3O9qxBK^&GSlAsNZt=`0=Hn3berlC<>w2-Y^Q(GJ4Ze>3Nc(ec=>19i-#Vb3V`eQ5t#%`o zPXpOmkHot_9el2m+{X@h@gq+MyH>vbC6%16-@Sj}ckcTEe+Xvo+xQNsJ!WPlbTMMx zi&CXO<>=x&RK+gQt@gaLz}4y>`9tt3cm5yaAO0cug!}NB@u~lXO^7Cb{$Ihd(-O@@ zmKlXXqF)dw&Nv|WM%XFMVy^R4NWmL&~R{N@9Q}R3| zFRb=g2O7yPTHm%j1g`1-6YNocF1{7`cZ+`VC-q~Vzv8{SUEpmdkOwK1b#>xx@gkdU zHaJ;VqGFWZcRvv+mXrPAjNz!;*dC?p?K(9;1W5j-WJ~2fsL|{!s05tof@cM1U$hlq z46nX_)B#`+On8gfTLM4#)8UU9bq`I&p{SS5+-4rFF&s=0IUM`PptkTD`@LfxbySBR z=P^w6mzgB-gJ|`V{s3~iGyFn){U3uL*S~G0b9`c55Db*Q)=GDVU)1cMq}eE&&CXB{ zfiVG0IzCMWtY67kQ6NQ3<$_OYWH*W;XFMC+rK?;Xe>OO{zTz*!U_uZ*s9RN?x^sc0 z_W8b|$tmsfd`@Ogyir_!RH|}mVF?NxjBa1As%9pIoC1$6PlQJb&ks2^SQS%~9061K zj3f(3GC9lg9m_I-V&Tq>VDhh-E3A24S`4z1s3lMIt`=T(D2jdH(0sILo3>%y9=z zZ_WLn<(?j1_=$7eTX*@&^~#$Fy>!vR5Us}yl`XI0DS_K%LPbwmMKi3T6XVYZZrb$R z(nS^AcbzKl&_d_Oft$W$>=ONMKT6Ch4zcd4GLn$``z+zLwrfeom*b5u?xS$Jl5tuI9WsYw7DY> zXdQ>^ZN&FUM%dItV2HGK?Tj9?kG1G*!||@L!5iD%QCq3|z_{GuUNX2oVd~ZN1YnUJ zH^i^)aK9P4Zo-GpoE0Bdc6XPz7{1n?y zkw2`sz1-Nx;?6F2g1hA_@mspwk#55y@l9QBom+WvytJFu$c5jI*YGSqzM8=g&pb2! zezzNUH{GbOQ{roS+{@f;H^#r}akCm(dVAedZsjGh>vQwm)f?i4eQq~*{f79YKDUSa z`iA%;dfvSuzFE%)uZth=b8~0<2EHxY0`~U(3S-j5J)|!Q-51^UE8|~+@qJuG-Q#kLN@p}g8 z{ij#PpBr@lqKth*t~PjKYsOE1Gd^(0XME?7dt>=(We6$u!y#YnDG;(SAsvB%n#s^`U1EWn`xNKb2dpqP~_dvnX@1iPO>MF9SPJX04Uk zx#i1_lu0KS55esCsvX_;+^UuFSv$Fl#Um>1Tq+`zhO z*T9XfjOUKHtMzHA9al?VTdS(3nU0pr6GcNAt_So~A8g16VUj0dx$CL&b`zTc)zpx@cemD22 z`kh7t4%wLAMyJ=i1U|KFW<*m#srNKpl$NIJJx$k08wXNWBb~krCF#2cI(=WeEcXKu zmwk{_&N8L%-GeMZrI)Ruc3aFR?j%}!8ZFpGPZ`zkn5i5&jpLC~x8uRhr8wSvlDb&m zPm;=-i&i8q&t4fXp5tCtUn3lO3&14EGcKA8d-^ab`m98XC;i9}s2>>y^+PDk3G@_) z`jjD2KMafU?A_f#I~g)@V~2N~>4$bpIkA# z7gvw)4&Sct6tUCBr%f*n)L9(?htvZ9e^P&Mu}}<{P>V8PQ<>S^kD)$n?>NKxbL@!i zn8aGf*_tZVjV4WP-2kSlJZMEbmjOG)NXZm%ZF!mvuCQBF)nj&KVhYhuOd%@5ZVMgH z#XF|8DA1+EG7sqXAsI~A{FB_)sRyPtaNu_xg&X~>CG-eYqASiUV8u}gA2$TDgarO- zDg3qg)=*KXA4E6U!N#R!-XcdVc2&4l&2ABMRS~ROe@eYY{0XSI89t7nkbcW}A|S(c z8f}jkAw>Nl7*B8f$yR38Pi`|6r2U4ol7dnTGz2K;{qE)&bz4)VMu%!!*Oe7lsuxo` zu_JeDhg3?a&Qu*Kfu0VmYmmX}iyaeS zs_k?js8Z#eI#C>Q#LM{Dp~EkoS+s16T1UhYrpa&l>q}zFq>Xc|?#}SZZPe|miYl2< zHLWI%Qfa-Z)-$cv(%)QbQ>CfHz(5reW?`h}!AT%)(as(#m1e9oLmuybaB(Nylx}-z zoAIn4 zTM=tHY8na}nG4#iv0;n$u~s{`g|+iedC72HQ3P-sU4_@GxcD1uIyL42$_FtKf-uJs z_Ebgjg5(H_<;a)$ZiSwPsQGS8@02x)<+7ac6XHdmkNZ)we3Y$sEEctMN}3f~sP3!8 zN0Jg_V|4vM-_$G~atH9hV?E?^@)w*bG@%e)L`?}BjafKfha5N=7#!jw%$c{a!?Y8E z;b@Esz;~@nZcJZ-m6m~lJxE`=?Th-oBB=E&C@zI%bQEniWL@5xkB=ZZfQAToOu-Td zo>syys6U=N1(FT3ny%ZnFxs|^x=F$}Y;F}Aw&abJ03;8F?r)Me#e)k_#Z`gIpA1?^ zJA?|z;mxQza|sDY5~Goxg9Kb!d3)-AQMBXayq_@8S%`{cWZYN9 z@kRT%msC=rykcei;685U^sP#X_}^dRe&W7#PJF^V_sVT#`|3P*sJr2uxU#R?QEQ*w z_jQNPGSk9{qV_l`E72(Z`&}#JkL~NK+o;+|J6p2k zh2rs-x#KDg$rZnRp<5PQ6ra1lTNrO%=#B_Y)F7?Ljmm3n@%}G$FFx5{8YFCG{zjiA zaqA>*M{^D75L+tH7q4BI^rybWwSaRJg0SLfJB_&~{`^bbiEl<`(F}fen?GhiIN-}4 z)1*3m9SQYqdje4#Spizac?A_}0w~5G-p}n*$u)iFe(sI_{FhQP%h(~v3aSK@Bzyry zTzt`n)?_Ru1tEh@8XeU?A4r-FXRAjRK^V z*LsT5;ZPR4^@n&@z40eg*UV(i-JO!-OdfnH)zrMywW53iY5h{S`9T%@;YWTjTCmm_ zrR_l=^LTbuP5raeUAcimUC~zZ$kk*jZy+~tn%{HNr4oGE=%flCOp8hXlv>dbqgM_} zbKJW!jjt4~2r_LzV!sqUTSybm`^6ExyIR+LE8p;~g#WXG@m0;IBVc&EYovJIU55>y zxA3*YuVku57Z!BVD~LYPJjHZsHu)6XJFKE|z9MYUs;DCcxqRN7*X|ad@Xy65^IA)P z#Y(q(9nphfu8Vh#pcL!(DYZ^Yzo?!>m|7rX4hYTeCwdGn(E|~W4^R7}gwPUiOB2MF z6zUj$-{yu=w9o>frRsqqh(ePuC4|o6!mQ;6syQ-_k7M}g6#UABUW&N(DJf|BwMfe* zc`_Ck+MxKb%N(@uxXGGagJgxwJu7t0O4A0 z8Xyha{`88^3u%F#V`pO($Ho&wP_#t~x{g38Ev922icbqcS=HXEyn$NjA0Btt2_k_2 z5P&@Dj+j*|VtP{;hJF&8A3mi>keQlX-lnxvA-vY~VA~n%JJ}g+Nya=!dh}2obmvuH zJNLXpkD5_u%5H}(Ej{#?KvtO#4WI>4SfwC!MB7{qP6Tyh(f}G&t(a9F$66o+ zFG~pAkYr0%P7LkRY;{xOine;nHn!(NI0m`GG1Fy+V-|bKxUplfoYN_3;1nN1Yo`SJ zT!}^r>Ve2E*7Trzh0^pjKhG$+&b|y&C($6uZiHDQ-ax0lL3~z;U3=hlNHSNokrDuV zy*6ol27oBL$@)Ntq}6mh6tkjV2I_D$!V{!BB`FG;5`k9gN>Iy6K$4Wx-_`T9k42ba_Kw1)JyjOzl7_VAnGSZ!NyR+VsX{TGmqeY3B=Ssafz~ie_<*>mX2eV+&}k642cj5# z*dXZj5TtFo7CJrSyqCUq+CE-Ti69|`j3Aj0f%EiSmCZ<~%jnU91n`0>!wXU3_60io zHZmb<$n@<05CTLLv0b7wXaUGzM#v;1fFrK6t8JPo=-8J%q5~Rm`LWBM>tOsjeBYFFz z)uK+QYb5!hY?}jA{3+ME&mgd<`}k{c#$9&SSaN>4$%cTDpab9~y=246Qk&OLMdNG? zkaw^c1qYikLIqC8pPRKZs#e05R>lg>)2kOjnw*GTQd@NzgJQ(tHhm>68C9ri?i~Rt z#Ek4bObpPMt?R@oh6e(c8VEqzEarZCo^CpsWf0Dw0_G8qTsqXkB1T6OYddK2>cmfCfJwTtwVu3kt38p@{X%Pd z{Z?yJU6UX~$*dy`8+y-fh3(qXmA6Ei`gz{(UO)A`&R2KUH<{jfzcE85u~WTM7(JW~ zg=75Jm@b$2X~uK|iUUh3q&>(=vl-0KN{Vyq=9GFrAF`4%Z+K!Fe2JRCEUm{9osQ|7 z#JJJaB&$c{u2)Ak#s7Pu8+o0bd*2p4{b`Brj?@|@iHf5GLf>c~O5qmCT-Az_>#Khk zVI$4evuRE=3`>{dlkRhab*rQ?TV}hP6ouXB3;VXjpv*qu1yq>u-r?!=&xSMA7-6kx zNG|P#GxeNf;Xqr>g5tTK%;w&b_85~oTK(&aHH< zVx^^$1c?rFAM2-ckC(d)FKsUrFXlcPHmx^)`+Y2DwuvI$DxtteCLB=ocgBt(XVAKa zGB*J`)^=5hZ^4d_E|!Xyh97(EXbgtaNkf!^$z4mV@)h#fh;^w8N&guMBELjb*Iaam zq0%)LFvl_#)s2#kpbxKQ3pOwET@xKQv5w|p2`spUxlft|M5|UU&QUa%TNiFcqq6*U zUqD!pk0|Mnt-HPNDqRa(CrxQme6r6uY(6S$c*LPp%O7K_=rps!#Q&6Z+h$YrFwM)^ z;oco}IWn+HfHz{$U(sXkNTvx*V{)TwPHm$zFpQZ?lsKVQW4hE6CqZMsUf7{x3bMH%}y(4D3I+V@3hL9L6{3QfQ{B#oL1A@snvB| z5nsEH8_5isD_6$uboXBOt5W>TKjVwPDBkHn_f&8}JaCZvNPNvf?&Jf#>JM|H5&FKe zgW3oW-~$NY`B5IkpFNoKc=i+$hT?kL}TXG{O7yET@~4Ho45RmTvt@ znORRPgjqnUT_aeIdbKt#NB3Mdt|jn7UXknbs`YYor%#$o5{$SfkK268D6a&2&*pKX zPpR_CS?sfTtn(?uyoPc(l%w-~O314jQp(XseM;Hq;l`rqFCuQ(JSr1Jk3(vH{Makp zlzkpnMmDBdu$XvBn-&C$P69!7y&OF8x_ zI*I6ziw|*O#oCKPq*Z+5A?^)3KWhzTk&?KCqRoi4qVG;L#0(K1dZ>HtRI!l%=JMY@ z^-6dA%*5o_C~Q5am85XI^i{6Al1rr2QLljA%GFA0uhg~)Lr)qa$C}c$q;wiv*!Y<} zfh#rGniU@EhIaeUbwb!wk1+If4=PkutyQA+_OU+!=hR?*{MAFhhBi-J0C}OVoVl(>8+>F*mD5Gg|7L8!^gK4Lt<)>Ie*;q*Q zDDs8H!4Vubvis-AEmYwr@2|pl60> z?Hk?DFsI-Y8nVwwv4R2Vg80$5xWQmkTtCW99rlO=7PM>W^NDwOQ+&-)Zf0p{0a&{0 zC|6s|@jgjq1fr8&rmdo~8x|h2G-1#?bo+erGbHy(dB+VM#B-N$Q{DZNRW!0i{_!mw zhoO#knWpNqkpcr%H1G4rtFmZ$+^jaA_)`jv6XW)bA{D~R&V=_xys9XjzNxNavkuTe zld0(Trm+r80n0dY=#6i5JH>||=W6kW*SX&Ky+^z0mH)PNU8mS;?a}V_Z!xmd2pQ&j zz}$Z~xD^&@9hVyzmr~Uhd461)*Ofjkx309|sl+E8gL$vHHENzEX~(&l<00#X>HZ3`PUH*2v8 znUutAE=Ahk03xeMq4h%OCZhs;Fx6fi zNtlxiT|QrC;ii{!fJcnj*;SpQh5Hm+?+Es2b06S!Mwccs_vlqJCSewL}_18L|xaP4*%YVWW#e6u;;M_vRTH zy22`u_UDW}@iiy7*VQ|SAoBlLXI5uG4vp<g;43m#j z8YQ!G2+b4U=w4s9PkyMX;?h>3*{YhoP@#!vD0JuAPeDtj&iJG^;y%s3SE6&T5Pn>y zaM|i2q4ty9yhc|LD4AU^-fyXU-R{)VU+s-9vKq>%fiBh0E71!3(60GHUC+0ANZ0d!$#7^2mUf8rA;j`wi5+_+;B+oq92D zOBY)`_D5T+)`=YDg)9PNAX;^$h-yNXy)6q9>uqZI%C*+;xZathzoMr>?AL4ZW8V;O zdb1mvC3dMSN9Fcw1kMhX77DkGani0A%qO`8Z>jLTR*CQ^W1%tN!GX2Hx-+5w=b3D` zQ+1p^n05AV(;C}NYwU`b|Et?)$rh8#HBfKDSkhlfXzhs2G^skx-b_1`bk2`5=n!q4 zoa)9)Yct|o-idi&>}1zbpJ9@|p$T@UeV_%JL|;b_9j*=}Z>ElK!Kt(~!KLphKWH}m zeG}_tq>NoC$6HeT{S*!B9hlDBtPXr)PSrE11w7kB$8Ua}(J#(=qu;fnwdbW@83Swq zGdWi`n0hvv!*=GxWV?Mi=P_wcl{PZ9+H){=O?k4ntK@5H+n4Xqc+uNj*YmB7KmRs2 ztzrf+=2?XDrneE^mHU0w+udQi7X2vaT zcVBvnJ9=UPGl!r*g4@rY;*PK6e)pW}j(=0mfC6I!&!b5TnQ(eK7*S{xOw0)Ztr&YI zzpj;J$P7=3orWdkou|4z_CkQ8S6qXELfTcwUIpxgQHMMP9np_8Mspk&Uo0r-_pjrT z)7;<=KeeGtmbiWPN!d=W4J{~qH$LJtSL@=#UFGdxEnb3^#gGlVQ>DN?Qwx>*>p=JKz4UvA;KPSfpnJjILHRi81!? zcdhgY202-}-Yp&2%Lm2N{q5wH1ox96Zgr4EX9 zX-MrC;{K~jQ+jcq$f2W1HwlHyPIqtY_Pmanr94uKuRGl>jt~D2*BjgvzwtlZjBUXG z@&9l~YqR7p|HEC}f0Zd%TpuRiP%%7nWxVG9xPPr|u;gCJx6b#l3m4I*p!vGrr)Y8X zHn58McwPsN+&dfyZasTVx;Bi(F+$GHiYKQK`)GSba3&m*tXUCZsP$_LwQezv{ zc2&Q88`Yz$o}vCqPS1Cz^J<2o_J*OTUAikbw56)+GG1jT!p_}+F{V8_AE`l@4{w_b z@!s!sQ}#5y)p!2S@=m~LAtmM7cGyI zZR)TtH|_SJ&bMc_Y2VkOc=NTzX>s^IHpibI&w8JmdBm6r0vlS1G=+%)c|)YxmEOQ+ zrV1LF1oCwai6+Qbz0d7fUzBry*nr7ugJ`R12-(TnK8GWO(L4P}${=5>M34L7RHsTc z7!&$7dP@43(oJ_>qo9||GPAGmB?2}6z;e3S9{={8Zd&}>x~nV_4&^$Eert_PNfri% zzwWf=Cd*}W&GDJb-QZH+Ko)FS@aIGobgp_rm>Tx(s(|+lPXlWLi<kN>ws3Vyew@ty-py2c!x7xHNJYx4Ick- zt1FAHNe7}Fee&a&(n_=x$)=WSz<8p>GP`odo?QRT5u&CXq6# zB~?@#z;FIrfo~WK+tl9$rS#>` z4oZ>qWYQ0_7^f}dDTh04C*kh22@sM>QxRyPn{^1#E<+JayY#HJ(3d#7^f9HSQrceY zXykk37>5(z??#6a%qLT6X}`i!aWx{u)U3D1m%QKY_;#4i4-$PYMFjPhs$J;i31$<; z!h_TiedsF2G?Ln#VwvoQWTWz>jp**6YCX&Y1U$E_aMe1iIIGXst=K^>bB!f!Lu%|Go*_5h+MV##KcHRq2jSV|E_oHnfC zNRgpUtkbfP!HmkZ;P-R3XVD$bc6kYOKEL+iWbS{1i6V@U)kET-HwYT zR@wAG2nvnciUTw1+Q3CfHc*!PdQQJjgpy-LQI z_SDxH`l(UL%$w~BG(-og^;@zrcWpqM-2BFE&8UU=p%1zl9tdkdq?rW}YJY%lzw>YI%IL|iOO88E@b(poDbnptppeBX!MPKOfi;L(eD$RCg-j5H>5P@9kdgVw6D zOgI1FrIBtBND7Q)7UJ9*l**67|cJ z;Cs|?<>zPjzos|ZcWr*-lxRdUX|U=41(Jy${Gi*RZj+qcckQX)nvK}%>|K_Y5fP+k z$;1PAA|wPr1my`8iYzXxQSw0M0Fp+jU{rO2z|Wis0!2rpBmrey@W4-T^ugt*VQeAa z-^75~g#G^~0~!$E#@N=QuSTG5LHw#-d$ie@v+%EV>Qf$xV0X0Ie+AJ_1B(ks@(2&t zA3N#e7~VX!xSWYUL7P{jguvWHsWsD9{g;9y7WyGx~6oz%_*xY z6qb5MMN}e0c8`o{j@xSc(4rO;+bJWKNAY(*HfWhnrCdL`;)=M z_|@am0G3wUwIfh#R)m^Th@Ftm#@#FPiF42^TU#xZ!qbEyF|-|mswSO{z=GHFYEmu@ z>&&Z~j}Y@h?t#^1-F|qC@hO;D6ZC#pGHcs?Fn*x0p$N#RFRv$bq!iLRvA608-1^99 zBW?1A0+9?yM|kDeq)mr+9122ad0RU}+6f&_qCYf~Hl5Bp5`9p&C(T204FQPO>WM)n znMTYdvh{Ei z;(J~|osS+3hbC}RjF?v0oBgPEWu974KGEKjV{{w89C|a&(wlswTd_pR*ImigUH^Mm z-jl0*JL;~#Ajpf+e;UdMvps=-D|R@wJ3|i|eJALLyASb?MY7!Z{}G#nT;dnN2I##4 zRqn&Ip9Jx1CJ-BK!z63wJySY;*2Huje|R~5##Sb5%z?Q;9R_wOs)USqosuXPAw63+ z;9(uwb7WAD(UGBOsZ>NHiX9Whj+ASV4$DWTpjdD5uTyy?l%`ajs+9`bVfZR-}TKUebTW}Qi)NaLJ*$tvP(W;wMhN!Mo z?MoKEY-fpV;XBw^_!6l}H(72eR42#FnIU8w0?&phwQ!x(iu2SSWef>$_MI7X(&oUh zy1%s6Is;EGkywWf9b%JkR&jUqtVW|XjAU!|KEHvtx%yIc{pK*ms&K#4Nn=>+PrJFpP)Tt$#Fcn7P`!~sodl_7B{ToXAx2<~f)mDdK zwZV}NRgVB^;(tin5L$}PwLZ)9ognn&)Eql;J=;3OCwLN?s9Bg$3v^qE@F-ROEWhzIZ=HbYxgUw+qhNkUSi&Co5ErZ_glaRDzxvon%M714J(+MakJ+*cr zPp3`v1ixj5)2tUL9_(6cuO}@u9gXsLZ6Rr(`ScXV!25aXNPtq>-t*XDGRCW#&#cUY z?npE>(=D57q1-9esY!qujpfOV2(^~PIn)cpGR-pkx8-BV}Bv(~v0Jzu`g%?d7$Ph97ob?eTF zkH6f#TVW{oUG5GjueAfKSDX_Mf5v@Osh|CfTd3zxKjYrf;g7lhReanP9PfQkeC8GI zsNtv52tJ+XjnOUOD4?ho-V;A@h1+qLHQyd*(V=VhkWJEA*{IH`a;&DJyKdAc`L*L0 zU+Jdokk7(VR>T=Z>1}mnIq6C_V{SgnsIu%CU1|*^SM7PF7+c!;GAnMmIKJvicYu5D z?D*GLl1SHg{;b>6k$%Ky-7$4^R@9@Grp!15p#gBj9?N$F6r4+?hoKyHDuUr>c#nUeU1UO_dj7JcE?Co|7!A$NA*xnAP zt(mQTNV~AE!`z+i;ba}yJ-&Ord#Qmo(g1Ca2d&xwt%Pe4&>B}KY%gdNaoY+PU~#kD z^C7lt&ZLNa>^irvK_4}sf2D_>aZeFjX4eDIH?DX12SdMme9!e9?5_bosR7qpJzPs0 zaIvvfa5ZkJ_y@x^fn0kg$LcS>kYM%99KC)(?-1-5&lIs?%_0a=d9nQz`}}0F6>|OF z4GCf|&4KpW1hlm|(1viXf!oF<9DhIDP72xt-1be5+bv&AaC=Lx19v7J7|(T}yEdQ> z+?w4y@(=F7?(rjEN^tvV4zyn;plwb;D@KH@v$ZJ*SJ_m{9KWW6uxOs=cWBd$gY!n6 zNnA}w$%$AdakD@VqoDl4nzc;1%E<-XnxLhP*$aZMXfB76d{dJc;+u=w_hb&UJD_xt z0s`Hi)oIr~*_oW$Z#;_+7Ac{#%`MLm54&tiS22_#w#mrqVfR<5RZG#~MYnANp&f&7qe0Ns(gCVt14-A>EwwPQp_ zmo*w(Z4GvByTL0>bJ$92YbR^%B`;qCD2wZ7EQVjIOXNNB1DD}$TV@lo#*coPfqJK-+5w0&d5EL8EYZ{K~?}KkxR<~o$B+9NjW>! zhvKQ!*_M%|2O=#rgZ6?*&)P6(Mds+P{N2KC89OaV=(rz&s^=!>1?*jJq~9ZIBX_8^ z(BT7Y>r#`Rd zeKFNvq_i{D>-oUOJNv2hewWH}Al*i8I+hrvaY91L%=-;`-=xf6Nf#1H?1!hiQuLU~ zk_p=_d`Fo*TRXZfslF@`>rLK|te-~arRYv;a5(WnfnWH1P!9uen+EQux89S>%OuVyk@+GkI3!S=Ck`7k+5cX6kSP z&}fbJyi?#rTs7LEm1r`4mDA9pDe)S5r(wpgnDtv2_9JWD^mvDHHxz7%_ZfG)yvFlr zkqbmK?i+j|-1mQh`KBbyXT$;XCBy;qO>H3#W4_Le`Qn$~;^x=IN*n@^Gx%^&@O<}# zxCJ%OxCR|;qkc30KAx3s|wJU|%8cb zm2#j&Uk3K$9_&VaN@%K23C;D@0a#FONh=JvDI?k_goJBtducJc$gY}D7yK@T0{s=| zQLb=4;@f&xI<3}+7oKBVFWQhVyq2^2nwpH1l0nrb+^vnzyv+?BA|WgU3Z5&`mT|63 zsBYtg>XedIr`k47tZkEO>z!EJmI<{frKz?pRvTo}fbAL8#)74_t82Jwy1A=LX{t>L zP*!7ziu+-(YE-?pjjF?mRoBNS)UA}Jx|Oi4x;Luso{4ooKA~!*G*$h0{dwx%qPhnr z*3H#|Ehte+Q{76~7T9ar8Pht8vUT7ovaRdv(BNGf^cbfXK`(AmGrflSu-q# z&#z-bjQ-n~T-}*M6|LzMP~w0rH^-FRrpzC`!MZTs$h^@qi@>wYRQU}}N z8dv!=u}1VFHZJM;XOB>6s?kWI^4dH^5VO*RCv+^P*a|_&#R#zY3qrzkrF9uQktf=} z89$F}GEeaHSbNR2=n7BM-3&dCwa4#ymz!}sf;~k8DuOPFq@|4>4eEVOsa_JQ{~PJQ zbcv_M{?l3T@LWtp;@Ila0{3`3CxLZD+Hyo6;{CqmUcKZoWdw4C6opqZ$)X$Re?Nw) ziC~p6{Z>}&W1wV$ePEW3xYZJ>7(ObTC{Xj4b*&u9W z5QTK(GRq@E$P5hTMd9ny?djUsIOj1+T_kxtTMi?GB|hdZcR*dszDpA>Wu27uLhs(O z=WS>W$DUaqvoffE**g}e>>VXCd*6)1Fl}Qz_m0DEfu-vRAK#&gqttqd0h1J2|4MU9 z)?2kVX?OKOHp8sHO4yusMnAG1cfE#RS)cVO>$DY0duoO9Kj^o0n-AFwF6i>zZlAu) z;fK8>yliFs%DY*5KNsH$rS2B3-YAOYy21E8cXN)+L>FEBi@V(`dVN}O^>|Bftxc5M zCUZ-hPA25!iSC+RD#u&dHu`g^md*|!%$h4BuT|OhMp;%kDoda^Z&p@5_`h@<>VKDU zhpzmx%GBFZN4$=JOV8lFSfJN9(z%HG+niWYVh767h&s>u>Tn((R9*Akt0lq}yIzw0 z`am9bEbn}ciav1ll|Ja|E4y)u(}(MP!7M$OB(`J7-fr8c&EBrKquKsLmB)vLAhWmY z1GaY4y*3f>5E3`vW~gXm=EJMGkt^kN=LCvy+j4HouqA`=r#&;ugN)%BE+4IPB$@9m zU%5&}SOep2)ovs!5p~^+1AcrRG?Lm4v+OJ815LOYRPZ^L%&hLJ%#8++TlD#>-6^W7=n3^cx-2O((7z;5FP zFArQ3_0Us*8=>RCL^B=PMNDMo0-PMJ*~S8+7w%T|^a6BIVZQ?7AgnVE8c2{Y2yk== z0-PLHxA%o?WQnYM-uOf8g!MQ4n4B(^u4U%uLi$K=MYY5mEW!)#ve|dQSnF+Q-n5z^$fE%KY@}=Aj-3!mm z9LEX4$9m2LyFs%TCWo)~27ej9szt~qYKJ#<-fzl;hM#T-6Qqun4+8;h;-HRdTRmcq zK&vuD-k^|90~?)VeITl~lRLO}VL6n>1t~w)U5PaClz`RGhQiCaS&HJv`2^g zq|QToEY`M7-W|vpK^0^Mri?^rt6Fz#val3@;)*E0<+p)V<;iE^AYBX6;f7}EAy%lF zF@S_Z31e7ykX$J>f!vgI)zA5^z6|u!TlvhA%kLm3SwZDjW4y%j_luX4_q&86ZfnzC zH<4jU=N+=7^2tyUmL6r-ASS2!qw-&x@mZV%}#hC|9+~}DxsRCy7RS=4v zFr&P3K@&5Ay1$7T>*B^vWL>8Y!}YhdsoNMw#l(r^RN%4icZoaiBza8sj*X2Yea{8m zi+PR-?Tpsxd085Ic}|#G$)a)Y@j6pcet`Nh*?TlzUlJWVU`rg;!`#VwHDt zF#O6v=aiu#X*BYr!LfeP_1_{9HMKFYws^ZM8EDS$a#8o&nGnpGYSoTunL)kJ2-p?D z^166W+oxILnBbw)%xsKJLS-!SxV*|5wRdrK)fI^SkBD^yb66wrmvJT|6?8+p&#H{h?eZr$`FF3H8X1PyslU2-M)^nD zIEln9iuRQB(TQk#rqcw?8ykSF@Fp+zCasoRG;Pjg!ZR_!v?piM*5omIkq09M4>n5! z3r(Q<`<<1m#0NF3HI|{=x~BZr1w$i|flUr>bz>4il`sU-RwuKGt8%)KbQ#H8`TVF| zg3#!wE zfs~AfC}_(zeR}{V$y~G0OR0UHgy{gxExo1;o(tjUng3Htgb)uVTSv7!@#u2ethO|v zBqgW*OBQzXC;4vt)Iwx!*#YL;1(S>FOLbXfDOv+pd$72G`!lFqMkqlWtMItKW zCi42b>Z7*sehF)1CD9HnH4Iy(myPBIW+1!9!6z~Tj8@gv8|M(&;9i{!@;W^;-bIK- zI)Uz^Vq8ejSQn1hWZa)2tUpCqZ7@Mue~Pl&P=+*wPeU-QuT$&lT&>do=*OJmaE<+v zgvFo1IkHoh__XTC6p$R-~?lhcJ+#H<2@u$6N-k^D$-_xp7j`!DXWwJ#QV=9L#O&ghFh6(C0t{3Zh>C*+o z=U+Asv4;)aLhMq9wxyt0o1U|2tapS%`bVazGS4;eI2$#cRI2Q7?i_{XdY%lG_59;m z&xKaU4q72L>5{W9)r(c@(h@!=Eyl6zLNPQh%l{t{;JNF?Dfp#t26)BLCAJR$0}FxNFS+u!&d35r4ihshO_zP<9(U z5p{IC$*<&Gc1An3kpGAJCRjfXjrH@r#G&PW?i)-Ik`71>ao z(Zqgy*Nwx|Q;sS!GYQ&>fF`Mek_$ky+cvziM+~HZPFDHSn#qnTR}EADk;Qy2`DmSV+L%9 z5yqzF?Hm@y{~3*c>$upkB;((Vb|B*T0zWtQR;OxsOq_^|r}*J&nrD)!Go5CV(l)PC z*lw{e&SlCO$Zm1-Sdi93-|QwX_L;Pz1~Uq%VLH=EL$I9PJ1nMa_t$xGuk!O0nWiH3 z(3eS1y?&lDQ>>X|drUM5FGguia!Nn6fXTi{ar)T`#z$Y!-NGAeS>UUX{xgwUb2U&V zs~}$sAR``wXGzhRR*CATGJ zuY29BS?S(^%tGEFD~T>Wdg$i(&G)*)wTEfLz3zaQTMpu(xk5^4FqOx@`(>lu&Sw{4 zq4Gb`()tfq#PjZRr&UrYFJ2k1zfZo#Re%GB8zxTUtPWd4XX1Mk&B`q5` z^DF9LqeE0l`kUep-p_@1xq8>#?~bddv7e6_zuIjD)dlWdFrYygtx{#-Ub;rfu`<^>)QSxCcBWYK7 zMlS9DB)Q`M^?f(XeeSII)E{uY&=uczuj;(g;4FoY#ee+1o6(uZzdaW3@B_EoUN%l% zF%GI_Zkd-&S-^ItN0es3u2`vBkLOs>7G#>mP7$t(|WK-j_NB5HW<}Fvnl*^ApS$|I>r+^;^xC zDzj<6%dEa>6Y9I$>KjVxJ8>8JJS_+_7cZMMeZ6Jv;RuKe9&-QMGdF*NWPIvF?sb)~ zTMnIq6o2eT?#-2(tWn*fs1n%?s%L>#Wxvfnmx;fPuYK6PA)foN8_Z{V&BJ7}0Dkr& z`b_^?$#ra}M?gShuOe8N+HBCaM{DdjhGGKC8<6i>-lk~wV}x?Uiat%uJX1~1KTmo$XYT<^-PeQ`T+?^1(kKY!r|Am`d_jb#bXHqY15-d{XF-|ud=loo1 z=e_aAHI(qs)63;I2%w~OCi~4F^c(qB}@?M4UO4P9{=0;pE(fVH5!fU>{srfVD7yh z=Jg!d=KlxcX4QtpS6XLr+jTw?T)N@OCkSz^KAP03{;Y##YK3=kOP^Qsi5D94JNf#*zfWP?X{UDR<^!~s%K&d#`&rjwqjv>3`Pn?XtIi> zCkk}&c67Q-k~CQwDe9p!*|-jRIZY6qgx=XWc%90tg18F+Kt!?Y(^JZAb_;g!KF3r4 zk~n}d_qKYi&38ND0Bk6u-jJ=m>2=m#ew*1Xg;$D25$w2Kn9x&}NsC3Zbksi)X5p_j z#)G{s*H_CuphXaKs2QR+VSVk)?2xSRH`$eH zSyrlHt?)olt1Q;IgHuXq4_$L_qx*b*$;2AI|e_>Fv%pq24 zufos>D}FQ@O!hK!`-4Wy{-pL2#(feCW)c>x#ms+BM>X*G2P2_?6y$zg%mdSE*rN92vB3^gWj`M_<3}@Z1eSg|9_pu!^eJNzK$TLpXoSqD48*GgToShEZL||s z`x4u+*%$g4=ES;eCWbyJGx^@8n?09Ow@_rwHxDU{X53{2kYup6m+m5Nm#y7=<<9^F zl+M3HXF~eEBELrKmr1nWOrqBBA->Xmodng};tpwVAWOGPYKXD*waL1j^v$1ZZzu5C z@Rk+vpePRg^{8x@i)1V_0m*BU6gC4zuMa%QR>!$E?K^Gen}q&+vdo%<04(N~UH%PP z_mMDkKh)T%SIO9E7{R87ae!AF#?wZoP--f{*TJbH(^QGcj}~)Pj##>_|JYiSbFVIz z=<^pgdtOuqx*Q5z8~soa_DPhDmGiQIQ*Zdh%D36{i~1=Hx0rbQ8mKl1`syvt8AU-P z=$ssa;YlG#=?fRJ0W+LffsOgh`7hQ>&rl@6V8e1JUsqdVm1t_)Be@!IRI=G-y~~1P zRwaAB^DH4yy){WTlf;^2EWBDiHPJqeGb5+YnyeCh-C2jB_|P2bwPx$;>OU3Qez8mhgLOT?y++;L=znOxJIjjVjgY z`rV#qK~SNaE!oe|NpE1qS|{k4$dX2si3w#8svHuF4jt4}(S>z}`NR?tUaa`xCc3Lk zN_RL#Tj@?2B_=fuht+}byMEq*4sqXsYZPXH8$h-2t~(t|Z{h?+F~D)>sjM!ybwY43 zfAU74iuLt@pe4ps#X!`(nbLUO6D4zDjwTI`jZ7K@ zy88NtQc>SVNSg&^`1I_&K3pSnn8FsgR|7af7l#O7<>l}2@{~#ozB=enpAr+YL6FUr z&jcfIkH~QZvNV~8$=NrXo!{ltv1|KuCLVvTm!K#fqML|mzM>yTBYeLK z3+tM_z3DkekdR(9*JzPKb!v*{COU|Q$4{!_o`y|yB8AI9nWZ9Zd@*n6k%mak8da-I zl$=(q_q1l-!=KgFtwuS0AImO3yP_1drN`WCDP%FLMy#%N8g60)H0Dgin1pF-<~Efg4mqc(2hQ(Z@c*wu;ir2bHjV;du$&0o!N-nYK*Tk7d=xPiuYd}lr4HEPjRTV00{t!i^$8*>J*I&{JC6Inus(oJ|^wgOM`-I&~tKS{(`O zI#<+oTc0fMTu`i53mmXt9Ogk#8yBnC&oU3)kZA?y6vJAFxi(oBrbT_3y2_@Rs|c3G zoo85`yy5bsK6x~OYiNWplaZo97NCBn(6J_PTBkDccn=?W7ZH=df)3GoMvY~&LKF~K zbBc$b!8)%)KfB~_Ri=8dFH>{3+B$=^q2;Y8@3Ci~Hz0@!BU=3KW9-p+24b>Xb+jwp zT3D(yE7hgI1ky%1vE8l;B@CciWF^2x7$~I$&E1S=C!uq7@|Qt5ItRUHd8Jh!8)(34 z736}|D!Z9LY83)a@nnKci1R|p-n9O1(Ai~sl)CDUiwaBWGI~6JRiTEzBnjo}2zafg zJ0xpa$-&fup)H!YmZpK!mg^PqjtSzbBU8jN$#rwt-vouIbx|JI4=8ol&4MTNM-L@& zw7)-l%rDRxxpMTxq^XZin)-7~&0-_mBCFwdmYQsJHV#w0$$`3cZ)Ib@1ZL+%Yz%nWUAHT&U3QG`q!s$=+77OD<>BWf4SvBUtpVI78g`WdzU>af(MY5FIA`MNzU`*$HJ4-P9 za{Ww*t$WbyD624o$Q;ymXnOMai8W-vs9PdP{NaP=-!zW1?c17YQsiu~)WPnFdI**WsszzF!`7WDq{MnD%Pj_OqACwJ@Ov~0L zeI|Wfv}!E?uxISUT1@rGir`ved~&?mFB^sQuN2`vxIMH`ABqb9Xka-LN4JWMx+@X> zf`4rQ2t2tqWZ0S-OPZe`1|~L@4yx*7K$D9y{M1M@en9c{w1Y)02U5Ce46im%7)fxp zg_Mx|fYc{#m>JdR%7^9*Bi?JC#?ZpS#zH7(f#)Hj6B`rtTd{1LQA97$Xxe~GM3smW3epP4qbO6GEE%=QCueFC zn;JM>!)|PA*9H{gR-sT)X&L3-^!`I3{S3((}`FY2V!D~ktgR-aL9*h^yjoJ8#jqqNa==6`u8 z7_Pi@N(i}GsntybUNQ|VR!-s3Fg{7pqlsdH4&5RqV-K8 zqGWi(fC(|A_RE}_)C<>u?(wyCWtiwINWR}>A|)-Ko7nW78d{XjNqAg0v}=hhLL|`M z>MJGoRMm%l-8@EGzKbq0VUkWeL~@gs28&FXW_mnLHQQBkG^6hmXr?~d#9%csa^ha+4Y!(|5-k?A&TVx>=N%#6qqCrKJNA0%(sl{tu^E`s!>{n6VE z`GAo*$;w2Ty!j{`1SCFeVbd^*K;!Hq9G2cYY3oTia|n|L!mMC< zPs15h&v|XNEsIP}|6Vz>R;CDAu)O6$H~!^J@GGo2S!9%w8Q--Su2Luf{1sG04c)aN zvGZR#UXyFHE{~cG9+=g54^7~_X2q5Ks0N9Fswgd95wF0fS)-^iktrzoZtB-k4>wnJ zB@PgE#7_~M3&aw8+l3JelA~WkEe{A9q?sV((a^kZvpQ=NEi_!j!ozVs+3<2xg|b1b z4&z1D+Pg*wW6_oj#_Vh4HtoZH)N9sVygnq$bN8lqvFJZvKe5*HYPTj+od+>|P!l_& zqM3<_OGImjshHAma*dF}*k^;`sZn3n`ry*1!-XnWDnV|^0XJ6t${K2p?>>qP^ zhRp^L#`ijs2)=89U>rp@ z4?+T?N2c7WLi;g*4tC#*(0-4-+o-o0ZcDpB$m_!GshGFzvGtngLW!#?L zL<1e#9v(lxOay9jO#*6=vLw0<6~7OKPEE{o?3yR2{9U`V`qauooMLF(HpC7%~meD%bHCW4lF!4eb(0j1EkFo)5IdbrNwl0mga7>ND%d;jl$P+ zX%uQ=B_mx!;)(#oD>UFN^Z77$q;5tKo1|JZNYTB+;7zv_;&Yp@pD}lyLHkJ1+}=n~ zWQk_fY(SuNq5GL#7b6C+jI?RbkN`;_v@{Bl$L~%{_NIZ4j_6MbFlLBnCZ=YzFF)8+ zW3gdQUT}!nA^E7Jz+*yDB(l=}tm^7fw$Opu;4ZnP%SZOKiBD94ra_#1@)t3g>mf;0 zIfig5n?f5!id~Bd2s49(A0)4eif4!M`S8H^Q>k{@3WfR7((3X6byvH*u(5J}lssEH z$%9UBC7@l~foDFTLX|7z%nM^aEq>veDf0lC$09sVCOY z(B_FTmle3Zgb;Z$i6$c9zG6^{Pn}*GtlJ*)l<-)L^_GXVT%e-eH4dEM0llh5C6#JyUSkQNe zk#dbsqk5;~QJ~0CEe7QGl5ix*byXw zta=7%h`=}@0!5!|F(=@qBk7-2*X!B}^eUiNI+nu>Oh+&8EtZ0k7an^R3eg@CFtT$f zmu$H0m=K}?v>!2&$~nHcsQ)my6FxDYiwYjjk|5%Y8!erzSjXbZ`>N$@&Olw)8B8^V zBvqtk5J8NFCc2Krg~gS{h44#KN)(dVs0#vt=jz%`r!|dLtGa-I4`O8MXW`O$d~z6p zt&enkA@;VR@CK_9Lr7U?B}Vhm97ULD)95rh=t&Kdv=Hkok9j6?^tQikwYAND1ht@A z`1laICcik_O5_)}gN)}@rHDaZ$#Ox*;>}BUeA%nt@MU$eN|bd1>W6HqCAn^j@-O=# z!{%jR?B5)6b-Qzci%+>em>M5|Q-4=TqqkHDToKxHiJqb`<3v%gr1J8(esC~lN3rDd zSX z3@=&;`S=Hs_NZ5O5F1sm?*w%Q*y}tfI0^8X&I5HM;Ag$dE{wXURAi$nZs?uI_^&{i zNJji%)$4CLyjT)Vs253PMecvA9-s!Ygt=-k!zD8lUuq1LHWbhiyEvjs^%h6h#!584 zbW1Q;FI@rcBOMvwWZGgqr|CwmYPqWTVz&q#CJDhP_ZHhq1^Ak^|8f?oskGq0sBZK~ z6dt?2o7h6V@h1}(Sl%Tev|_52^@UrR>WR3}k!X;%350%@%XNm%&^HDbR5J#niuTK5%|$U)132I zR8lgyDWVOT3yLri9~+vh(B*$MW~-tCfINqET@g6N?<3sM78uHAEwgx#j(#snfS5_f zm|YW?ow3Iksgb2-hrd+Upv5q0`Uh8qtR07}QWei9s&2DZ3ax&VuVFg$d|ii^pm-R& z>+%;nbfPpuViUS{#diWH4zUyr{3b1`A{TA8=g#RJ!HKl4jJi{5U6E+p3?dcn-<5C0 zit{oD?*Rkt)3L@Xovvo)*b1kGyZ^7ZHvx>Q*8az5ZZhpKrR`9ll(xXMl)db$$aayX z$nMHRMG6$zmr?{3og(cN0TpEl3L*%|B1l1?ECnippt1{!3W`ruo}!}i6t&3jbCTRU z(^B+(-}n3fqto1+oFpeFCnqO+7F~QqjX2!<0%<$wTou92wv1Co)SP_CKi?T7fa;qP z+=5j<9Q{y)D2g;84rJ}O$+3XG2%5`7Y*lK*y0FijA@6 z!IccM|D``6M;FW5ZMe|K4rW>uP!ZDYDR!U9NV^T@Hqp$;620-2Ds-&V! z#kNt=;1^tiDK!9{xuD?>Rx2S}R^4gl{YBjsIu$#&JCOiL+(OGxa7)ywCPk7+br~cP zl=zJz+MGdbrQL2G9}WWcQXEZ#gL>_vNTSjh7E^9QlByJ>&`zb$MwK0tar!{66<^5% z)jyP4sRr=(0s#I&;%)M5u`6#KP|ck$quos)`By3PAx4k;*VAFw>Ke15bJI%h&xYkKJJ!D$GA zMNN=GYSQ|93neL2priQo*#_xuS5Vw+pfaV0JrRV4s9#_yA~!#be@LUh4KdrdkV6CQV56VKF>88m~W48C1`xLjbhe1^Q)JoiIA+ zq#1nw>NET185zG? zX#HZN17&Y>5ra>pN(%SC(?J*@`P1wk%ZJOH>|Et(dzD?Vw88wOg`>pT>J}v((!wEl zNdt%M5uK4Lq`r2*JmdfWrIaCgyG(t>fhwxsEWu%%vHm~hFqCNsgQK7*tZLN^hAkE< zPybgO#xV`hDUZM8ne_%5}W!P0s6K=@< z#g&wOEOyg~>rPg!O(5c!({wC5oG378&nu+)>%*6AW?<^aV<~C%mnEeG10e zQ+mpd1JYySYz?Z=y2<~ulf?g9^h+0rG9lS8AvgciHtG))pt&CJL7zz7gsEG|cZjNoK_+|EGGzC^Gn3G;(rDsM8i>#`Q1vp;P&H46Bxu&MRI*o-xhfq| zYH~p(c@s6SvsK#CJSVlPzHmNSYR?Fo=b{^6kqq62MNJ+j6>zo*qjI_&0H;`|XJ=FJ zc3BI>)^=ZFFsT%lFQ=WbcUq0b$jz4nVtmLM8RE3t{5+)1mgF=Q`bI|k|4W0EiVWIR zz02X|Rw@8ZkjwT5=BrBZ$Xk!8aV=JTZ3r?HIYy7$usfAR&hsnQ-f$0e5}Mm z4b_9oBvK=VggntvBq3SD(uH6VxLVJ+SzqDzmDO2b&QYppDg^PB*11TQ|cqUAhTg}ks` zH6#P+?3{|)jY}LkhB`Cor*RVzfme^tGMv~mRmTGoDejMi8 z5*VRXIju<2LMml}Z*H!av(`z7BOa;1S{ks?%&(jk%erxD_*c$AS@5wjtbdfA!iU;( z(RGZ6W7vcDf29w4$Puix1+koBzo(<2Ad$LXm)-ud_fRPs>h_1trD3$<=QK~fPH@_Z z;i4P$@+z`>qmD|LjE~s>aj7C3Z@d~14^(1ZDwk=p2ocZH#GjQ|T+|^M7x(BOJzT|> zQki9xE`_Mf9=QLK#M28m^1_X9P_t|eQ4^tfP3$aHiVd<9wRI`vo+6Y2ujNTN%sEwx zez7RUld_7iClRomT(LElW!{8(XBWwT` z%->5yr)Z+kVQJQ0lyIA<;wm6YpVG0|lOD%%?AN1?7EwAiko+%kEaQGF`Nb04TqjSh zrxa7R%X~lMK*S3Doj9`=9XF+#77a*a-Qr;r+;^LKL%lC+dj=4C31ejn9s z)*of!l|r|<$iRsoQdth#lJCX?sYYu@LmiKHCSaD&%ziU8>Mb&ANF*For&#TDEYN0O zS4P)R_$VKc0bP-dBj?x?NOVyMj06>etEjMS6%vAB58fMHMC(H;lsM9ZNPw4AsJEvKA*O$^qIWyOYDk9)e!i>Q6Ki5d%m z;la;*x~2|m9xKV!4}LDgcW08C%czIBbkN&f&r!d%V-w*Z&Ute2_$HnhcU#YT9+znT zdX8IKJ3c2khUq!jePBOE%8X9*%4s9S0#w*q-1IQcnH`{k9S@mS3ll)p1wg29{bfJ2HZD^Zz|Ob&eo0}gIVDlp(2*ioA!uv9_*n3nP29i z&l<|UKG?GDSsqFJd?Ohbv7C28jiPwkF7PPZ4411(JqbCHLc7E$QSSLr0NEsB^qeTU zFH;Fx8EXvRLvAxk%krPpWbo83A=Jh~E4gPBY!Q6}Z$7zFg+L&%#mPtdl(x#y(Rf^N zg1=yydP@{cw(ls+b}dX`^_>?)g9O&0ETiGE1lG8mbp+>vcq4%&dltV(Y^Im?#AgYt ziLo&tDkQQ_^({4j?kt5{&uoU#%8YdZqWnIbD;`T^@AT0#=Cp%}n#6}PT9{U|wEG)S zbtH%ObV%QFDRnptVny=Vn~TKr)mTonJi(J>MP4pyRcF4@H{R??$})xyi&5 zO-Ul7x|oZ|UxG4u|DcUH*a&pOC*J#6uDHd=5>h{-pm=o3kW|z(;L=asGDCvru$k4lA5)`D9Q^O=dPR$JY~)RH z?J zAzEr<7GM8)=?!kshaSUl+-ZKco`gHf&K31Ip)p(hSIO6E!iKlFdG=CW((19=d>PV6 z#oi{Y>R+Y&Qxn$IehA=?O8}er-p|B zhBRZn=^=nkz-%wO6kOQpri+l20+63-S18>Eiy$ZmaLIZGz{(q33Tw{Bc`QGk0eGT0 z8(=>JV8Ky`kF;RvqDKo>*ZolrMA^IiNdg6*0kBY!B;bQ_yES!4Fbd<`~fu|@byFnO@y`1*z0~f^ix3DsHCFlwd?n_kI?9;Xoduw6ef&(w@R>-)u=pF*!cPkqi8oy;b#J85MEj%=vm)o&N zL-A_1X9HubrCtjU`8?a6ZM$FlZ^m+EyP1E3g^H19IqQ;3k{gCS$lkSLc?b6RJt3^Y z(3P3jUm-EH)-0t&U|O$>mWK<}W7@BBsMMIfVrx;4QiA#i#K2B0LY(c$qGMi^4XL6< zDRluBMnXBe$%rR9u`1z(TIQB?VyWSl03Peas`~$?oc}R5NKF4GEiI-cup-Tx=0e(v zj?NOsY?jHIhv?{hlO?9#FsVsfk|DMw=QUv>d6U)NUNV;|nY*MIrUrEa8F`5IwS-r& zck4nd8g^#GW3Ebgc^i&-xK*9mu$Y{~vhqUV3AeHAs(QDtJwy!7Ol`T1-5YNO-#9`L ztJ7FFF}e$j`-?P|bYX+KOF4q-q@C>$qxp&wtZ@QOD4ryOB+$9Qo63c|=mL@I2=9e1$dX35nFtchY_MXw1ct$~q5IkSi+gs9kdOMmVdCEW^1Z@QoL5Nq#b zUOQWR23&xUEV_%0DNSU|-59S}3mk-px|nr0n;N}^ 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 delta 97633 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 wI z+L;^V^?6zoIsIuqh|m6BEP9&H;y+f3BcFjy3m^|a!$;)X(ogH_^1xR*EKf(f6m8Ki)@&8O`~TaLQ^#0Z9;&hl&HR#CqWxo((ZJEGCAdRf{46l(n06!TVl>1uy(e757D77SFxFua12t>&a2Tl?Eq9Gl$8Y zJ#~KCcF#cg40L7h6_A9~IGBG=rAQz|aK&4_5`$Btc~{81h+vX=*RFe!cV=l@#3_emJ;sD_&#q}l`O1oUVIy!S>%XAjOXrNb2!5a&dDjGr&Q45N6qEK)$@>7JK) z>(Fg(6(V;l%*a|%zLj5-yIX#i#ImIq-pCC7vs$rbD?g*Lk-FD5eqrm|?99|ASZp

@fj_rlVwd}=^V#QQoI94Z_g3qxAUpNnG~j_-;V)jJHNRxK)1fi zj}h;@!ZZ7(w(A-h;nmGeN`pwh}MeEo2cu}*1SLOWBAjh9oqTn_Da`1b}z1_8I_q@i#3`?lLzRs&kWJe^5 z7lM5Ep)&D-zVI?fEP4ZequN`@G3(E!YBm-{cX# z;8`*DOmQ1|(Hq7zMeWN(0o_EgrSTVl@=g5=SL2UmJlCi0tH>aXI z>v=R=q!yjOQDp1_XFtY#a2FpPypJ;Icv`fJpG(DpAMkeiI!dMEyy2oO^{n0~j`~2A zneYKWk8-{G0go2f#VdyuiBrJ0#fu>@4J9{k6fHhfB?o@U#}w_L42Y6+y9rJ_M8i;! z2I27U5BXU|AIUsv4f0e%ERe_C%}=)XmIfj?X-^gYk=lSBpxxCrOL}mJGJ2>?e6tO9 zpe&Q#T)soy@-eZx#M%-oGkA8qGQ3cAiFP0H<3e@IiNFHgZb*TKY$@h_#`}tIKjKxP z+53I{%g6kp&03+pYVT%ev_}W8hiaIO200Za!G^NkA-&1f^AdYe9o7JoMB1f z`wM@wMx5{^mI!y$fS=gjuGsdTe4;OKkhsdeixKD3nzh@%gu{_R{+v~PF^9Gh9Qw%fP7fbqRGV(@oZ z3VA?m`HmmbX$e7xM@QL7j!o%^5X8bYA#bY@ZNKO9Vh_mqpqwc>+7^>W^?3q_2pZc- zrh6xygwRQ+dncVlO7>h}KoaHL6Y|bI$$)deFqZHD&FQ`%jqhf1?$fgoluj1h6nsG| z$*$w(_pt1_xkq-0BG+7rTPsTO;8cF%P6?j~_aB{BB-a1H1IH#;meDAP%tli&7XhiH zli#Qj;U9VL*t^sO6ol0%Pbs-krqYW>xhhLI?4t*luk_$DmL7<+38RL?T6*R3mL4Q? z#aBP_0c|9YFTo&gbtA2OE=k2!@7=cR+8 za6i?#*O$|fM_~b&WZ@lMaL7Y{<7C{?A|$zv~Q_0%~SLjs{QCg`AvlduRv6}WFtBkvKt zr4uMd$fGvG%R`CB$S-6UMg59+@@7j%D_!8pme4^Kg$Vg3Ml`S^=BE>}aVn}jr8x1J zRG}JlKV1j{YLtF}_Yg{rV%_IS{kJ;Zp z;$T9$A){O<*oDp{14{@`Oj_Z>jbSj<*OR=VRk&$XM97CR2IsrWQ|%xZ_k?>t+&>U-Ivz(JjqXSEm)qR%zY>X9 z29RqPs@17G1X9kx1`q>eN{}&)ctKEuDNy$#2!KNT1QaKD2s2gGftj)aPg{JNB9XjIFN{fvDET3VW{L_YQ9q7W_8<@b<>R^|?>S5Ph~ zs?;&mQ81*77BXjO_(a17m@oe1@y$CMw$xSPzzxily6@wca?Jgf?Bl~?>!^Q1ZA!Q# zWv=Jp`xmJ|yZF4?4^g9e2RgAfu|ogZX<6t+z(z>sS{hhM1$&gdt9HeUJBicCQ*7T7 z)8$HuaY7v4a}r)>r_)k}vK)D9ROWczJ0&rg_7M(5In_LCgLZhx-f^S9Rx|5&ZBm0h zO78a~#T=%6z<eV6#*x2=w=z6*@S3I=d8x*&AwU$jlTkqAT(Uztm zKCMk-6XTdqi!_%0h);{MJ>oT=)|Nk4BYyR1XNTg$kvPY%jc4=3i+=4U>+qABi;DtU z$uanD1J;CTngu!0^z|eSG?Rl&Nq;pKSY3ZL7L(De@{1oB8sbBe_$i=`ipdWUKJWGYF!1uIzGO>OlY8ADC{AfQ-7K**a3O2R#5XLUe+g0XSWxR0NX@>7P zVx8FM(?%vTeMrb*dN1*HNbAJ7C=6>?E8{G%l+GIkGN6ELA^Ib0jCnXQn#?LP^z4JZ z+~SXhw|j_W6Vq#!n-@ zYMTN#nPhPceH+%{(0a)s`x~Cbm%qlLtP~cBhsJ67iZgJz{C~w%PnKT>d;J`GZJcQX9mdxr|Kh6h4Jg3?C&n(&$pg z5}J=}P?&hIndoD}P%2cT;iz(8=ICDV&{oO_cu7*Lj^H6ty>So4q_H!I&k7|715^P` z|KyR#nmGke?y=28F~n?y6f@1}sa;DpaT%Y83sAfab_+MZu(_ZHXYh<%34jABk1)F< zN|lX+>LLk(!NRrMJtUYvGh~PPR`J5Bd%%X zN5HgLLNTC|09-z~iq5skT=NAQ2*a6_82uiyuE4sK_aeTRPg3C9|VnM0aM%*x1D-dg*(egT?kJI6`UrLbfnkj+^X+j6d zlcbnA7~VwR_S(=~s66$GC%$^Vopwem+lY#nl|&Izp@e4?IEB877BoVR@r7=v zn1ZkVNy-u2hm-Rq4NgiLHKBo4^B8IL6ExCPan=3tctr*x1~v2M1;oNURS|l)!Wn{Q zL__96`LY>(#Y?O&(asV(I%qjK!|byTTDw@C+~64iPYitLZZm@Q=;U5}Vht}4cu6*| zyAcCHgJno3mS7TvuzAeLf2ZyYB*E_DWY0mMly`SsNK_&|_~TVc1RBJEA#vz-vWB(#Qi$@!7E;`YH^LWFn-S4N0QDRBM%BKcOConA6Ot zow^(9HtlmA`rsDlI`qQDKG%T`2u64<9sRVDFr}V{BZKi#Lbx2$;2TtQA^4H_o`$2A zp)jGgu$G@rS7@prwSN&lS1m>!qFvm?6sztO?F7-WlU5MAaUqqV@B4|towV`IXUpeA zCX4O8w4tXXXcmH05TTQu(BfFmyhY~pa+N}hrbm1U9P z4R-dMRdFh7$2u<8xxmKCc1XiB4S8aE&Hed4c$%E+>})ysB5*8pKC)Tga`G&v!Chq z-jMmk-PGaIsKZU}s-4vbVcSafWw*}IpC=LBj|7yWZ@JS$loF9{T6QOr1LLO`=I)qPd;w*!mPtjsEeLfWWB!x+$$^xN*;R{1Dy=Nw96qAw8_TT zpQr|O1+AWJeY^2=YCL>On!{AK<)kU$gN0p07Ns1eNGy_Pkt8u2yKC9K>6JR9UrG%0 zR2}3>PP%jO$-`)lsi`9qR7XlPZ?m=XOEn^^hjw~<7%}RVrp!k(Gu}euRp%NP$rBrU zV{DdY*U*ky=t!`JW@Z=&DeMl^qGibhmJK?J?xbz8n3x2yo6D%lq!}ar?4cD7QfNn7 z^vC`Z2y?DhjyiByD!N#-8L;l`!AM5lJc(OVjFP?dFsZ;$De_Zm56(Lod6nl^SwbGMnfMXIC*V}3kK zb8~m&S@Pqx7|mVP_HvE18IoTDUUP>)2eu6$PFTpSy{8W9IPo*OVtsFz{4RQ-#O90k(N6D(SFk0_nX+WUw;L3+ zkomi$)K40o$Vr5@;=s`Em06_KT6L6mR?KBaCcakfDv7!ST2}UYlo}Jz!)-RH-j`0j zPwF}~)1tAu@tLR3WA?-P3yo?82|SrAu?#6QO%(OS*1@;?YJE)?TPEeWPG-y0w-V+A z5O}-o=QEJxB1SG9XGrUX#!np5$d{821sLwnu8W3^tkdF?8#G08gXRoaP1&a8t}Sv> zH-_CvT^gUdcjVyZIB)BZ(asx2>Y3)Do9Ox)y-ZTkbDMa;*rWSt4bGFt*#% zfJ`+F(9yw2f-eLYXodiOlb?amrY_Y?fx~pOag#H3C_PAvv&C?iYH7#(J$9#G+MOYB z^3htiqwbS~n2|{f-qNU~1Q?YeC&9>eAASQ?=FR{-&x;^8vQ*XCeycE<>qONK{gT%(^UkAinL7gw_SKQ=@bf7uT(47iaxLTw#=AKI3nZeLLZFC7KF369;~%) z)gbpCnVU4Y7(Q4#F_FUMgSFue3rNQW3_Wz7!V|SKLJ7~6cs|GGAz5FT-oewl-G<<{ zO)a*rs&S{1Cr7nl7?^@hJ+6m^=7*`aYb6(bhG>VJ1+9!p?fsRYo+|6?83T_Kedi8< zzo2F*jn4V{07h+|BG209iLB(3%wGpafLx8Qasd5oPK2!k(Vz={9(zr%qNU zQ9&VnPc6t%0O%JfQ>s-8Mc9ieL$yMjFCoSbf?Tg3sulNJ0d|owjR}^F2ML%9kr8Va z&UYB4&jGo#g*2Nc{g))wkzv|77g0L}z9Dz&YgDiDU#Z2@qxm7F2m#O9N=K~4Me2Ax2;UF_+>MV}sA{10|i zxF&m=BapnJ7+no3H%n)2*CMXF{q-7w<*Mt&@uzB0PUGpR+Gx7Ie5!UvcUKj}Ieowd zCNXNbHk=}uR}I(ZH(M$Vr*sNMBmMkJjX38t?SjxMnVd;V>($e=bK@H?-NyPMv#*;V(nA5Z0o6wD58o_+oBL3h=B%Cqm4u#M76c%aM~~%0~oM zvIY^HwQ;u&mg+^>Z)yc6!+!2SMd(mb?&v zu(!t&sa!3o#DRMQMr!R&P;7H1xEp03L?u(0iu0^hXCNr%rAB&AMYXm|Sz@vh6~+iR zIII!eVt-_>IEpU`2C;Y&(6_7Vr8b9wj7U-p>~!(FEUp`cQ?vci<%Q>9Uih4fuZWW0Brsb$1$;D-5y1f6S}QVJq$DOCGUCk?{x8KMT|78m3yVw6()=+3Z z(<431E({1?EUAB`$U_1Uu!bUfRUenahbEM`yRGImf0t0QY%i&z%n?Gb3pJ_rnxonj zsN%b`wUQW?Wot>7hz^dHl*Ua{c0?VV&W=2;tBz2 zYf&T#a7vYO8%bC!Kg$6$E2+~;=uJv{3V78>;*G1dT=Cf$E#oXn677zMe9^vOMXUC| zfhLGp3FowiaNzTXvk3v?BnNUL?>DpMB;Id6MA^&uI(iRZ&tr65$0~60k0+9j|Gjds z#SlAqtX7aX#KMqBiXM#1A-NzxoNGud8mo0WjnrYl+$fRDPSPJ54HV%>|T74lQ%Irow70`i;|!m_(bHgQJKblPU54YQS|n!32E(Z4MwiJ5 zds(##@ONs^&?X3eRkGU%BcL;#o?2S0$C{o_8g)3TSUn4h&#`9kbq|cXxW=W zuoZ?Nr)~;qrjmQXDXQePiE?|m7WvrJ-NL^ElD=$s}#9Kpc;XM9^91EkS2HsZy%E< zMYbnyTpi>ujiEJZp%lZH)7t;1DnraTS8GclWbTF@g(Q8AodPhRS%@>V*+*&);z>b8 zG@afhH7=TcpwVn8zIM%x=KVb<7rg5Zn#4Y>K#-|^&ZQh&MjpoX|)2wUy6QDveEzv6C|2}5I}no+9tCR32oH$ z#J=-N7>4m_SE?Sx!0U<&KoGzz1rVdXl$#8gq6vm57)@Oaixi6CjboBV^g5lFLU+2^#4w6DqysB_Mgeg-F=-b_STw+< zHLClQi2I+>21}|IA54eqW@()r#NzLd&I=>iZ`P7FpkP|? z2GOUhX`}5dP_LjAC}@fpNySQ`zGz4X1F4MMWWs;7mU*HKjC4C!K&>Mars!018!Z~!o?bOFxTo|f0ryJI zcw4CBHB<9)bE7odX^p^97EFe-0oH#;hKy#5C4&i??@MkagRzyue+EXHU5-k!HAEb! z^pR-hjnYAq+(r~3^dA$K1QptX^pXt~)gu0x7BwJ+G4M9zuKp`Qbh520qwDs zfqSTA3eI1%0igbjChCV2H<*eh>6e265D#DY%LGXH&J26M6lmrhvVpSIB-?G6|DIDZ zn^iO)Lwi7Rj8~U26oI7vpwrXgO6=@G2$EWhGAg3k@)6rKY;)m1v`=F0SRQxa?Z-f| z?Gpe@C!aO&CGS6mPOPJJir_q03Ubah$B^lUX(esr)o-k!!b2{p=(eN z!FB_==QvER4xBSgJ`4tv0d5Wo>(91b966u>E{-%KC+^}SZLD~^7`8zp`!SZcWEn&s17ss`(F(Tukd{S)VUeif^Y;T+4zYu! zVc|jwo4->FCPg%%f%Xfhk(GxtiOPh4(qsT>=FDaPB>>W=`v)MSy-TFPCbdzvOGB#g zB=TxMtV&X~V#{1DJ;u@K^cR;I8jz`jNZ96Aa*(k_p2kV48gdq2g92Y|0ner@1U$#Z zG50_ME{?xTD}pJH5;-`Y?h(n<#q?_gT1E5B3=@oK6-_vk&p|+TQ5?^j=+KtKI1q>n za;iWz+QVYB8bC2ks_w?U2{;*A5{CfZ{RnHLb<2f@T=dDDNPs{<2PLTxf_WM^nr2Rw zv^zl@3Rv9uNi}p2qP1xq;Am;)O7AjFDR8VZ0Ad2WImr{1Iyf}qiK3;XL}_&gASn-N zDe+XP*f*w6{)##Yl!>gXHQ!*VPh4L))^{b(-1TL(t=Mg#RH%*g^3+b43Ltq`G01`* zcP#b4C}sAN6Ci+cM?uD;d|pBcrWg+Y3n&RdHb@{8LL~J@ndGR`Z{q_&s<@}nCe82TK?x0o$s&%C973LF z)+IafDTgsim(5P-4HHh8aWC~cLVv-}(W~t*xZK78uP?(;`$~4E%))YzjXc*k_w!fIXqK?=>c5Hd1@RdY) z{O_5bz=L+=XFmWBa2o0MQCe;xi8Ia*nhxI-6gAySPZ1?=6Qwcjc)n(mm>9!JJ8LE( z3wGJqp74;GUt$Fbr>$4$3&rY~_B;P{l6a(2yP5((J636ZgHz?vhMOme%c`{Ll*+2L zUUcnUtz8<}J*^Il{jZ6Y)mjI(T)bJ0oyro7bW*{y0~3mwu?jP)FRzjaBCG}|fQ#6i zD!1_?77=OY+-Fgfb80`8rXBwDlWs0vO|KHdCy>;63tGb0x@BmB9YEf$4nk+wl!1Ene;abPmU*@VBp4&jNdv*8y9qrYZARDgC*Fw zb>3v{0elg?*^SyEO+*t8zfrpfxqiM;>(@lCVNas)c|k4m(C(Dp(u9Su~y}#n(4$ zo!V{X6;V1XhB9J(CaqM(3v1?Mh=s*sPKe%#@>{gdu_~0pIV-5ba}#dUh}B0*1PE~) zI$D6mU97an50X7t0ti;CR2m!-W(MTCwO?q3 z{LtNlMXe!kQ}F^?84`4pj14!=*gm&vJtX#K9Q)%H_T_QxgVMs4B$tL;kQqpG$3%)QBNnQlXYQfPtcu*km2CdzVo z$|8!Oh=_=Q6lIa!-RBgUDi3*56%8U{Rd!H8mLjs0ML>2C5f!i?Dk=gh0{T$D|4DN1 z%(Ml4?|V;wC6nabP1~bUsC`4fQ(JqA9Mnv^2r2}_ zoxq>S^)Ke6iE;4ZM;MNyJt6}m54%Kh!IWsrnUuJ$&yEt9QCqBVsf`cdw6r+$92^$0 zDJ4BWRd3<~A^EC+Qf*PXCjs28aKNH;K>jec3>YUE)y=i5e<*UgY?HRqpK1iLGN{ z>yAbO%UD$J`o+5kn9=XLlbzQ&9HU$5%sUxWON8oH%6L)wj`E15VG<(yucRWa2XrmY zn;**RfLzD{+J#oNl`SR(CZaYBb!bbf0Q`tv4XSR9bhYDkfri7r9Rl40DYO}9(e(f( zZQ&IebP;3Olepy zhA0t7w@e$Gh4gzheT>_eS5hb|hYJRP@q3m5LgU~Uj=VU!wD!SJjFV!oev1TMiK8&o zP&t7VZ)Z3z^zTV_x1EwxQ|#Adh3VRIi%K93%28$D*z#_*F*`oRqybPD9bYyZmM?bY z81Z6`nE0}p*&)UMX|&)j(OZ8$SBM*DnCUl3IgMgr4)Ego)6f1Jh2E}&e_*Ix+MuP4 zIYs%HjX99u&j+noJHu> zDIK#pjTmAka$q{BeiwT1d%yhM!q|gQ3tkc&DcFiL<%IyKY%%h%S77*eOvq`I<8iw) z#`23s`~?;~ITNR4!7cV#Ic93YQsRIf3dTbVkvfRXam6F8ePeRq`atT4 zy2h1$qIb+Z*;Lfx7z(6VLE($3mJm+;xMffZN{^Z%A=m{zAp!dd~4Hf|D<`~EXF4KP;L=p zvZlQv0yOQda*;qo%mqd*X9;*Z@qY{Bj0+sHFGy$_KrZx3sQ^u6@{BzV3VH=~F<}6& zyjc`3R^{Z=Z>S&pDO{t{_TV=Lk!L(>=~)u*B6U!fNkhb~CLQ`p2&Oc9xB4=tj0-)n z42?`00WLIdh*?I!Un}6n5#W^)m>ApzM$yL!_`CuxiU6OGz{IW+I7FnZf^s{|$=xf(ys16wV%zK{olVXxI&L9-6|B6hTQ{ zwX?L|E9W7l_ewfJ^THI1dtLzpwD2!l&MYt zmpuE$ABT;MK2cPF0xq56z`2SF)OdX*x~7)763wR@sE^a=uY?s4!VW+wCy%u>4q6>> ztlOruLqJdbJjcAD=Y9eN;Vx@luMMyo_8$d^ByFz9N z$8u@M!1T{1R-!}Elt+e!m<&{fSU!GRM?c1Kxus$V>=jun zMmV;VMVDM@fy32qjwG+%=)t|X&1~kMO`V#h&0NkCvij{j)zQxTy6V9+N*hS4bI?}x zRWzHfL^o5v$Z;rPh*ey?^|-&GR=U57u(zcy%m94UZ|s1nvz^$OSNOA#VTW+XA zx2Y7N_MykH?$i;vHz&cImQbWHI^wpMa@+>XZ=6=jZ=xekn~|X!PZ0SDLu-(1^CWmr z;?9f;!dz&UOL4cm$Oeknk!vnAv)reOCvPakk{0jQh}#z8Dxi{26^o4v%}%sio45$~ zZG4m~8ZR=dx}VS8NS_Dr`CW_5hHmm1S!zop&s=1tWt1#cB8hS67fUyobyM}rA-3~^ zIJVtRZ!pKE?p#jA$3>@)+h~r8+SvPkqnVlMY?QbyjU&4N-4uFoxv06x>`r^G4{kEs zwv!N$!f}#;)X-ADWk0D~TI40P*qJ*~tad!`es+^N#^+#pY=Ri|K8SW&!X>*{;)aqD zo6P~D&1SPs{0bVS{$IvZ(!Hs_l`InJ1I6`QOn-E_gSMErha6j=dZj*&?xqQ}G{!+T zNeu1q3Q)&C31$x342>gA4EjAK;*zzfkJ9mx{$xh6Pw2=V_(tAOUDg&7y9_+wjv@nM z%x3d;@xoT~_VzlXl#N#ENcEhI;k3ULDADi(Y?eOpglMu2CzbE{z`VZ9EQu$>JHo3z zFe{gFEFF8r;SbC!8pwW<51&D(#E&79tm>6A&RKmI*^eersW+FML+vi-CZn@J**n`p zY?ENZtR%O7oF>X+!6g1^|NGL-6OFc;O;T4crLv>V`C`m=b4c){Oizhy_H(Sa;Ia@_ z@G#qm-?p1~UJ@?i>8RlTCBKVuyw&B+k?G}id3|fr%qAaNi87&T&`AW#sY`_o5vKUOuA>-vjLAkJw}O6K8gt z<)VR-_Mp&7(lj5Zf$s4|HSO~~AVDz?3|J0`RF*weUN|rBh6ghJU;GY2zGhDVLh)<~$Toy{)wGZwaUrZ2UpSd$xU)hfxCXRt4#(ZdQGA^tZ zt@fMM2d#zUvaiTLpdxjMQz)TCBhd={Fv- zgyw){c?1j#le3hyO@W<}r9s8UZX#{W`@f)CNo^7vJ~DTwI;F$vGt0tfAFmN_959cV^KK0B@! zO!Rm-!Cst9>l8Sg(5r7HC$xg=J~MCk8mrcd{6l87Oy`O^RXXlbc1rjA=Zja4zx8+-L*{|D>CmezFI5V9W`szQB-yMhZr=5yx`^I^lro1wPNy7Grhe6$1Q0w zP??(Jr>t{09_lwnin5!@Cp;vpFI*>%A2k~o>(+^K$IKqa_H|9Zv8Z20 zjJiEvyn4*Mwcuw z<7?G!!`Z&H|B&rY$E${tDtOrm7j6d7?x`l-@?^B9-^FQwelJD??A-t_!fXcGdJ)Z| zbIcdyE!^^FZ=}G_x+f55Ow)dhzUB^G)YUjhx7`GQX>Frf$?exToZodW3yYf3L4WE` z!`b?9+ojYqw>_6?4H@RBgor%@FO#5^FyX0mcOfbpISq|OfF;n$DN$W*9mQLJyV?*#V1;EL^1j0yroH7W%6U zQ<7iwIEg|tie0th;8rHPwRl}2+BUvqzeNZa+t0+bsz1?0$tX}2BD9J^;;H;XND;VD z>M;||TM0lWgs(AFqAn?m>aEyH|D3s0XGuh$yP(rtL=v2f{#`^4sKJX3WQth;AE|Z0~Ctkv>xydjR(m-h? zfn*+@_@EaI)!@PHGXa>7?f!niwrTk8oN3~%zwG1qchb->eqCi z0e&WWqX29?>HFE7HKi$&u%mUIsgDiA>v_ z#OwgeZ11de_c{=@qo%t0_8Pg!k6Ix6Xm_ZL?JQ{b3NrgfE>l%RDP!wZti4};Uqu@v zRJTHnFRfeMDdgW5N}&L5CUwRY*dxHP26C!)?hixdk=93qvSeY!%MPbXIapF(k=;N# zj#Cr$e;FIAag1?0#jP+}0{{2h8r@VvfZNY43(*t+2~-NP*?*nb^aQ0t0irdGk|DS1 z|1Gh(txXwjeQL1L90z&vza%!Nxdh%`G}t8B$$&%8krOJ^|5f}^ZI6hIVvI(-?ds=h zBEF1z?vPnAns%UZ+aBRFob0)Tto(lrssL@j>bZ*g*}`5NT2edx+WZTuW@2j# zK|0Fuk?L=_PGx(=qqSIdGVSNrVioA7dCX^82wXyUrjjChL`T{a14q|EN4tJ*iYr|v z)hjnDy!gruOJOzh$WCrbyd9a2snmSTy71G3;KU=nu(**nMd^+jAU0gVYJ`-chE|gL zCa($vczZZ=|MB2Z{B?E4oXw=^W|BTQ`Na+*)Kz-V4xeDq;rtx_lXq-6%>as*A9N)Y z6fivw7ph_I-l-*R9&$bE3e>++8MW43eCn1<^%?vP^_gbz5K(6u-tvrUEe(u6X)Wfm z(h;C<-QJ55F_iB1VANa|if-*$Ifala$Q`Q#q4yt>)|pV9K6fY!C6x?7)PI&g6*(UL#8c&Clbw#$7QR4;+WJ0; zGpA=AIll+T4#421bbE)UOtL==Nto=c6U}_nQLE8Jlax%^xxjxan31{|SOff`mu%n? zq&w;EatguQXk>E_*>RHG5pizH+Yv88b~)B!hgw9SQhKaFbr+F1_wSG&oDiV%{&cl3 z_lKfIIk}vm;?kJwKb7Q8#c~}{Mm-kjJl0E{haCfpgeYVv5qPQzDTv87SOz%a2VF}H zKV_w!+IZ3eFf+`ddgt2_C+0k9$->(~YCT5bJZVwD57#~rZ|{{%=Zhw|TA)Vec_ z)adz7DK4il^gjqdd_c;*|0UY%BO9VDnpoWqQFq9tq{OO7O{`JSu3-dsE|b=Qf8yOe zlx+nxN}4JusFvd-s$+%63<=aw0io{NKqyPy2%_&K#5(>zng`HE={$lWufak9L3>>F zq4-<+E}mQk{IvU_&t3r35~#J)OuX|>edxgzQL+>B%$A-vouNV7W8}VeG3M)c)z|vF z$Y;3zSk(xY)^=&N7{*dXW?)(hV((RYjj9~CPyItf?gR8Hi91Dz!|~b07$?4wT-Dli!P`)Ju@opj3&r&cGBZC$t#^ zZaZGGY95Y3gyek;B9u@HBB7Qht&F8e0^QSz?wew8*?S3G;2^AUsZDgIzQqY4bsW`a zpD-zrx-2S@Jo3o8LLPY(l1E+$BQzh84m5S2K_8JF26Xo<@WL05pzu`@h47EtPoeg_ z+oR#$1>8|e2Q$I}*5~*O<}gD#BF0I%0>?mPk%>fmuIbnLT7-QhZEaNs;B?M?)y9FFwZG0xyAo->3M6~!DM zCs%rXyqfwS$F*l@46!4r_fJ55{LZ5-6cQ`YK-}wSXqq6eLs_T7(KUBTI~?)7sxqRF z%JcJRj5d5}?Q~GU2l=BkQtSp0@zkD)p~E73F+}VnVWS&XKz!IzoAxDSmXe z?xNFRF2VeRHfiBFs-?1#Qa8A!6xZnt141H?a|6-3;5=z%#poobvvg=8sEr_TQ8Mz)rl3>ky0_OT62N)rxYa`m47jIJ20#C850N)tF^np|_U(Sk@s_2$Y~)g!{I_!Cy$xquwhWp3&SF-Hlt?1v3-Pw1Rti!Kc!Dy-gHu6bD+^DDgov<5S ztQGTDQrm0kR?zbvHdy zG+UmtCfQ53*udNIo3O}f#jbTLj*#J_R_r!6`K&CrI`C<870cvOhZduosirg#Z(PM1 ziWcoy(7RXM-j1~`jeF;}V~xsaH%9oh9R;+{xk3h3o22%vvGG$_v}@1W*LB)^^Z=2; zaT~Vih_kc%FMsES#r*c{gKpZbk?sp3;ryBW%+fj}T`G-KefKC`HApe#ix5YTSgVf$ zkxN<%Z59qm3lf}%qrvgqv34OhaV)z)_R(b_u=)TBwT*{t=UNzaohKm! z^<3&Zaijxl?)J@$kBLYX(Kj{z#vV2P85Xboja7|YGPC7x?CHL*$$8#Hr`vO%A^6Jv zHz=tx&4X{YG$-N+HE{%vlcZpFb2BBEV6RF8lg}=0KboaWqyBgyEZ(}7J?4Ez)Vq%L zLGa{ttWKv>>#35erHD6&Ga+E);X0VqE)6WsT?a{XCM@ph$Qmb4k<}VB`(RoUvpceW z#*bmaJF)gjP97XZkacq>W?z|4RR#Fm0Phf(IF}r;YS2IWRw8t*ft7{kC;1Z}Ztlc7 zw{ptbB+GN>A;~9*%WZmHHr7 z1AbbeV?rQ@#quQ`AIMMyl;uBBjt@A^K{|}<_uy2eOdKfchAc1SCw_ExjaXuG7dEr9 zhAgFD#I@J62QQc3|0dQ$)auI0r?{@DL|{12tzTf2t8H(R?ahezdOBF@9rOSiL;io^ zu54s!0s`e%6qz@$Ym=XqMg%TDAXniV*y9}>cS&WKBG-B>H;vBVN4h)g1l6q_eaXjO zkw?E-C(A)EG`x`wO-Hkn3S~`%tQM9{>rCcJjck-97Qw0in zw084N?7n1uzodhR-JOl0ORbi7XWi&hE8c?*DXqMm9_*o1{p_5*Wh0fFM$@nFW|mt< zvl&F`w40%;K+{-pGYeGKV5N2NnVZ>wGR~80dqtmHSmnAUo=xMVWqO@!+}&Eyl9{)# zmoHcREj`)bW|yv>cm)#=*wPAM=tT`i@qJHL>2f6pZe>ke5BS5H4(QOkZ)Ia#5BR9` zuWx0;qm;J3y;yol5BPX;Pv{JjCp_Tuda)bH1O9VBwoxANWssBU40QQZEtTXYXYnKi zKqbfj-KiT?YIYkN;dA2fe_wPP>+Sl#JL%}dtlL?C@j!1@Cw?gzr2PLHuaYj_#^PNk zcn2Qk0)AK{Cw`1Rp;?@Kvvp!=J^tS9tjV<{oUUlL2?R0q!6lx4*KqGE((@=Os951a z6%@UXgbPu-PiXw0;|n&H6d?eYt3C_TCYN4cxXn^<}r0 zol9UT(O^sZvJp^W0(Y{CaXED5n}3pMdncz*XKEjM+euebQ;BbP-NpQ=+P^*u zR-Czu4T&!E?*14?&gQgJCWg_@{_K%xxE=#opHycf*MS2&t{K2q^wsf8^`g?%94syc zg}#>W4AiEO=w#Wohx*5h-2>U*dqoW(@VZ%Svyt8-G4XcOwdzZ|XoF<2@#q-2D5TO% zcO%xp9<2oScZxsmW|dR*I|>exG#faX2`vq&D`e5-$x@YbUh2~vL$%|9!fR>F5$1Lw zjUcf2wn41E%kRGpVwFPwElSa-_>;2qsEC0|vZHTU6t8EqE2HH3k!+SZz`3E!rMN-1 zS8wFDLdou!X8b|v2o5!uG^}-!mFq`j3n_m1>^qrW*7XPm%iJ-T4Nko%(-YlvEE_)@ z%m$@S+zis${^;~B_pqEw+N0Ptz(v+m$L?Xb)pW8;`nF4SJ+!Uj5#tB5pvbwGHMvZ2 z+wNuk(q-epI)>`+X$mQb>-Ixf`Ccn2>Yje0bHarZAW`pqgI%N&6_ARseJB=O(dD@O zBFSwh=(1o4=<qo~KLDLJ{hhiP2Z36?tVW9ne}k1J55qhfGX-Nc zgwOOdZkW;I$+j_gBpd6l5FO8vLNgVp5sqgY0= z7NxRS^nKcB_IKZBlGxS!nANL}VZ+jJ2`*4D9Kj`FA(xPsldKo~4qA)GuyM(IrFsuv zP1KJv8;)hq7^f!`tR2ftZ~561a&kOUgi)a;-o1Kug7|10PN&VDApRJ~(hS5a-p_iv zt@~7>d^IqB?0yzGx9M)&iMQ@&6)XQLkuGgPDn7rT4RA}#-%bR$0;TnMfK7A_RfH=v z&aWR}gY8&zn?YXd#f)wAa7!T!=#1Lv%7Pa@prTu#X#b<^dU5bUmf}|HT6QR}XR2$2 zqk5&yM(llvRT3i~XHCSshnU~Bs%au_euxb(j%@pfvEFekcLaw{S@|$~DCIe#F;IlS zwEQsRwR?o!s>E-iWdEEA;+aR;Ey<3#OJOZe zKg#ZO&0HGMK98}U>`2NoNx_PcCOHwO{$+-*^a@wlE-8a-p{^xZwFl>Be z$ok^%QTRrh(erUOkgOsrAIC5~4ZaMqDcY1!#ty@Rfo1=DAr_9$lcg?zc9_GSa`A|m zzR)vW8Y(pW(`nKs`%eA zW{9y*uwcB}LHagFyz&I={kK>nC>GbKAkqHlbrb-fB}d+u#$AUbcVVMi(koNa3p@zk z%#&S*V+y74(uoP+rDf7UNd9M%$*nLOPV32WVOB5eZ6Y$XYdg_BP;aT`NqZvrpfJqp zc;|?3!>o4Yd|6fXQgkPYRV64-5_e$bSS2;DOvz=p8#xQax4CSlCfErvytH>(-KUf!I-TPwoKiIhP zrIvB+B-XR^oJEt^^~Q=_;=&{}ZOS^){b`uP4(}AFUt?)v=F@om5lwsZY4*3OlXn40 z>~Y~HZrf<>$)OM@6wj7Jcz&lyp3LeQvv!HADa4_#dndE{Rid{g<&i)-xP>h}bnvOL zSTdOnZ>l$>Tkdu%)6McenDy`sgf^*=r%ss(*1{Z(Wo8&aB@Lc#T`_`=l zCph<~0zjYO+(W+!7?n6DIM+SLCNz_#W8Bmjd!8+FS}j3mlu;q32b`CC;CXfz9k=`V zd3L8fy4m6d)Y0eZRW%FUwMi|jh%)GjgjMOGs| zZ#U=;uMhFui|l42f4BJRMJ5l^#tAm1p0aJrZi9^1*x*288S+nXqYw_jYrSCEz)RGg z2IK8~F<~0}#dvGCc>E>S)L6G$yz>%krcu}`zJG}g$UH?=+t-vnB8E<9gG=Z4ye3*!7vO?ZIw=Cll%?%U8WktldfT)tckMMv}RjQ2WF%uxa zNszszgA}Zs$!d8spW08wv?;xmUtdKjpGpWkwp?mO1M(qq#5>~6e3qZN>7&aOHsm!J zCim_Z@4m*G84LE1P^xF-uN9fEBgE;~F0W%Edt$E`Lm`g0zD(&5Vp}PEdY|~2LI|_q z8wii>6E{(~>qGGvg+F{K=2M6Rtq0y6-btP1AZ=;{&K=%&unO*P$o{yW>-^K za}HZle?39dK~y>dm|08}fSwzjD2%zR?oCU6MlHAy7&rnGFERQc1kzO3!sw5mT0mm= z?i_(uc0uXJD_BsKX#vi77SI#}))*P-b^t0u4&fYRWDoOFW9=j7#9MQr`J6l_%Fkmr zgk+Xac)PXCMR~Z21eTgy+*D-o=q*Y`tU|HT3 zqU{3K&$~^$vVaA=tHs&{n484}QD!0QdUGjljzgPIO47z%0#md(9&L^xjHc_%E{t1~t0P?i`6Ea_R+|mE;cS^J!zk%(h}AqZ37Kb^e4IO*^A{8lnmQBOIY{P_Fj%H zVfU7KUxHZxyX76$p)|0$@33CChM(Dp9^vXZg0$p8Yv7S%1agpL(H~FalJ?>8JJB83 zdWBCLcH9ojQy6{}CDt!8%8S8ES%$k5StRSJ0u}$crEFYj=%g=WrCywH{W4ZJt#qT4 zD7&1M%ZNEq;m?(_lYAKbe~cF^m$BjH^(LNbBglxX38K|z*u#fFl0$8$$_*je@Mm?8pcJtJrJNrxwyt2W8W$!M3@KnY zdMmsuDFbO2!R^9$v3(`hD!)t+SG|iTZ(f~3{gCGW6)f>C^rB7Y#L9Qsy~e@`BDe}{ zJzsQR1*rf-!po~zS46*F#cncAzam<_2L_R(hbu7&Iy__w|1w;@GE=Rind0Dk z7$?hSip15xZr)7MX0<#2tQF%{vw@}c$BES}v(j{GuyP5}8nq-J6zVE#*g)@ck+X)~ z?cMwQtZWiod@cJMG4=IpS*W=ZT!kc)V?7)UwP&~gSu~%N!r#|Iu&&P) zBi6B22K4=T>)4}B=l=pRV5i#O$uM9){VT;`jgZ~J?LBmyRt|CX8|d9y$l53B$4hXF z7Q8cFD`Z!@C9RhwRJA{sVKcX+c`Q;A{YFX2>)GctU7lXgHr3B}YJ?NijtT35#iks? z&I?oLl@IXRewt&w>F z`>+hRc#x5UfzR!dXsPrf*Qtct^jq!ofe2B}pxuefY+((|z4-CY z7S_r96hAI*Vb#2^i_ER8irbtuvKidX&WpAhG)}p8)xLUj+{2#D8{JK>-5v=&= z2ds5dhcI9NMufS-en$2|bC(rM_M!M1-)ZxY;t8~}(Kfb`*z@c*Hlmg!2bp#(#aYGl zIfd19F>yOvb>Ct#1Cji~o|sL2ERRNU@;`6~6a9902mYc#L+2PO701);Ya-D2=>WSg zj&bt20h({`U@dAmW7Gkp?@K_I*~wlu{xw0&*~!{@^Tby>S%diFQao(Q6&br&vofwf zh3LJDW!|k_B_jJG@CJw1z3rr{EhHG<(v@xr|7+4}k4OzF+5HTph_iRSPMr~_B((@?|LDPoC)sPJR0^iJwLLSjWsUf zioU(LJK4#0=RXnH$42=a6$DM0zAp;wEm;b=b8X)THxbNj?LK4~J|~&xwh!4ozAq(_ zN#_tBeHium`||TlqU(M(w2bqz>0a^he)uMpB!JkmpWS=4%MD;*?Rbox!ZRHGsakr0 zUPyKKl1%qmR#cz&5v!bNy3fI?ls1I;?vH@DgAfou`w_d-SUpADa)7lXzn7^8u#}ts zvRHqBRq&}hrF`HXQFMT1gdEnwbWbReRqrf$Z%dBEG)=$rF@xaBuVj0N?Eh4)C;M#N zuse&62*@2!*v{xTWB~!E;5r_sF4!LSQ;S~tcKg^M`d@wV^h3*kbT)f%9i4Hf59zNrMnj? z>A25c=FTLrLeRk zIkTj#x%kt%&pjQDGZSru|k zEuNihiPz;#LR(1P0pLWz#Yz95lgT54gCCtC9HKkcTg)72Wcfd}r^ zo!|?~m6U{bfc=NjM_8B8FT_0dAKuY$yfbk)9fv;&3~bXuuOAY!3~*)Ng0Uh z4!kZ2Jraea2z|~nuP=eLqE#F<-`g?Cq=T(^9@bu?``2v(8i1{@=<>e&oMn}9%G)ba zidcmV=Vn7CVX-VWWLLz~T+yzGwZL144-~Nu-LwFe`wdcCO(BXZ*}Fuxtgii;47CHc z%!hHHbPl(UvYNGKzl_$mz1*bN9y9K)FsSvYm6DEkGgN?R#SzF=*Pe}u)TFW4+7 z8U<;`S(-Qg!)wn{5=d92rSTX790_{}wW&R3)TyzYD!CkRbe7k z$daah! zyPk?Tfc)ootb0v~WI~`ij;;pNK^$Eb*@Fm27D%V6jFYOW<|kP}q=2(0S?x%y#`n>M z-}gPc<%XDkuun{(VNy?*d{D*|!~xY)mxU0Cr&vb%>zZ2CVcpyzDITZ^)7B2r?i9;x zyIAMqB0$+L+Y_jY`Hg5QM|w?aC9!~RC8(}jS&>@#(ka!-9jDleNV_JTjwa~4r&-%b z-XEt~*MWc9E_6OFBA@6*h+P@*0#)jFngaYUD&`5GRgwV`0J6szS_48G6azmkI)l|U zSZ(o-@Lxt)?FSXwKVaHNe8dl|7KJbVfWZ+3cV6fJ@guA1!ytyFB>opS{D{jK5RU%w zlJK?qt8tQ0&g%_9%z6DUQ7^%tz(`3*Aqk1{{L?8dC845*kpuZ<35UZTDUokyM83s1 zq|)Z)irk-YAJ4=vN=RrYJIH7s@RD)}`K9cpv_w_Q^(=X4T2=~K@dSO8g)LAciLAv& zLKeQaJqP~Zrvv<*fi=~UK&%0@y=0PZbe7ets7-H% zC&8~Sy*)K#Lj^^ONe#1QeT$ zVr{SO#RI!y&(ExS+q@TmG@Yk1I^b@LM95mKg(xKxKQBy`nd!jMz!XVG%y54n2qAsh z{ktI%&#|We-!fi1$HtVOMO9&dn)X!s1=1hL6<3^R6Dvk?aEr{INap7AY=QAoSfu~L zT8jA>*nK)OHGcIpl;Gc-Td?dGfEX`^3;JJV3Eub}PWss2SbQ>p|2=`fLt&FdJ}Z6` zk;0Fa)!{_m#+VTnnMwRA%DpX#XH&Q~iMONlKa%(@@l#(U=&51RCz%g2UWTfY%;(iV zuFC)kJqdOIw%@ZdWh?QZOi8fA^2<}XVrmNiyYXsRl=DMJK-k95?=hx_#T-AMW4sa; z-OBQ3fxS3dmjBb3iD@U5Uvcwf)hBTJ?Es4woe-NP%iF1HKv&@na{NkzL*f8BDtFV!=#9Pig)f6NDlUFflo7fTA*XPqL-mFLY{FQ#gPILZnR zp}EHP)G_ACG#mn@H1hFBTE0wUl!mDWH~76!@I-lD&q#Zb*g3$#Y;cpAU{|~c8t>cE0VEfcYRCTs5nvs>6CZQoQe7BPzA~Rg_2*aSFSzv=FV!C@RP@f^J&cn= zEX?5jub(V=(CI8+fCSkqgj!{%W>qJh`m#WX84}*IjA%?iu%M%LD~a6ra2jR!x95tlGWnIpys*fq!f!E(z*kjxmH5>&D0f}1 zc!5%p`)w6|v#}s7+E(RHk-Xkgl{bo?C(F19<78Fv?4q!!U5)oQeh-UD)%X?k)zWIb zmhoFyd{&L$N%7VJ{wc-NvUs5UTe^?@cA>|=fFcR)p1Y8dv{Kw+-@4ApU&2a{-DzuA*W_khe1435)It-ZTnN1-T4!61;Vc ze?gR02jd~!o#bswA#QD~EMBY58&YI%b^aiQ*Vo_!DSWF2uS;RIa^6bfryA&BL^{^w z^2>GQycNZ>H9-(0uByrNYb?_Z#2ODBA^-KOH28c<9#{cHYw?9}`0xw~hIihsDpe`CMZu*rE>b zLIwNk@ZQF|VNt&>uUl~yeQdzy1?AMllQ^2J;=Z~(GgFdRt}=lfN+gwRy{8L!brlY5 z)#c5MgJH3^innU~B8P3f^?0uFO|E#ns`oDObv<6rcn=cu3hx9Fst-!6hW)xeuU}y` zRhtkbxemp$oP*R{e6Sl{eU~kSY$!djN6M{!OsI$B~E4p6=wpkw*q6u$Lm{jZPtsXoibGK;GivcGa zg%z4=Wt`nu4Cv$SBJOF*`=za=L?SAk8;1KQWQ>1ZSX8~k+gK!A$!{n82VcnxsKM2m zaj%yWg3b9I6o#7fAryYA!&_VM1qA4A$>&JG`K=V7brl~>fFpEx;3__g03U13dw7kF zVUf4jTU)Hz>8(YPqP^aBAOI8sjPypkyuZ+=>(_X%5i{EGYQ~1J_~#Kc>U~%(k9a#9 z+rr|PBi@F__OST%6K_@VU|ar0V2h+I4poxy^!m5TX0inPq$Ca`cHoq^yzv1f<~QC< z3ST?p%@89`d7FxaZ@oRe2SopGy~E;XNKOLyhu?ayCV{j5XAHo~Hm_>z!wmhacb4%X z5VkQV?hK2e|MK2u>!f!D99^(1?;7Yb*NL=I{hR#%g~*xM9W|BZ)2 zi>5=`!5VakLjN|^f%asX8n91Br`Cn?rZhsMy}i14nX9Qx^ecGULkd=w2V)9j1~vox zqAaeqJ?rJDN)k?by_UG@TE6AFWis7S4N8S>LzQorZ7^)l)!s?y4C!4?q{eXE6Bf^A z8JPtGuH$9B#@?_P*OC8$u;Bhq{BEzYKP*1&46*i6SX}JP@AvK(OWNS7VioOF9c#V) zgoEAOo-C=a2|-0;aN>A1l$|c%cM#mZ9#R$6-E}=bT6NQ9F)!%XmG|>fPkSdD)x_Z& zpkzT_JbNR*J^qX%FMhm{-}9GM+5xV-Iruu!64MmqO#`u_F0W?Mp0y*6R>ov6yopz* zNodbayiQ3B`gTXlRzf^>=T%5duIbM2sG_uclQs^ZWgAjY&%x}el=S93_#-r9F6n{6 z0VMYI;6E8hFgM=J$494+e${Bn{QfA&Ew{kL@)dDP!iysBuorLE^yHNZscJo=$&%BP zXSIsVhgs-mJ2W(irAb19T>4;J-km(9Hc!o0b7_vqpNPkBPW8kTjNzPiE2epbU2o+d z87IRc*o)UUHe&+p#cQOdjllubfFev?ffRg+2u62)7aRyD8*jbTv_%~6K6n}Wa=K`T@*QJI{=*zE;pY)~oC$2czLR&WtGbcl zjS>F|`ck6h|Bimb@QGM6M_&?m_2aebmH?uaBfgF(RZa=w?S9}-bocgt;B|y2`|fkzsWd@71CgCi>n6m1mk>IbR5W^_r3lG0o5iTdnms` z`0nPFj0^DSx|U;VGzAG;OQT?x1I)mSpofzHJhV286}&Y<`<@PNLe)_yzOlVBRabDc=v~ zHyHnt`5ohEhuHrqR$TY+CPdr!?%_8YOTxl;FCP`ZRm!rXQ1pcz6gfRpqu5 zTZZte(S@HL!aMse(07UhL6SS8^XCn9E4OKdVdByiVDL#;{B0QTM;N>@jQ>o$K7Bav zO1=K|aNat@WpGn2mtvTlsGb68DYHPFGJcdY=05&({0WKw=V8G|@H57DVR3#0zpjCl zZ3K>^Yl=}N7XCLS&w?FscL6D|5V#*h=8WWz(tQ$NjpTbX7fN1X_9SJYs0~(y>gGpq z;T7@WC|Csp%-%+O$>uq@hhQ|X)j;YAI5|q@7qCW9yU^j47Ec|| zQ#4RpdaxR$Sk6qbYBZE+u>GmgyeBOyt{uahX3f_aLFLBEg*X{ceUXZoQ^;ze!ylG}>pOMyXl3VwSW1&dThgZos-t4LqG+oj{8GBlUmsu1^fOd+6gKh#W zOJ-vLB5}_QF=-r@JL7Z3rg6MxXRV^3`6;$D0|Q%9T4*?W>?u-e)p3U-Ov&tx59Xu$E49oE;cwwh?@F8z#CDG&prTl1?zNrkawZ*xd*{YCtekwKgcsG zEhBN*!iY90k+BD-w$D7mD~h@g@g4CqUIPrxAU{0JgCg)SkFTzzI@k=ipNx^0pTej? z_c$5$$tdUyG5BGg7QZ7ZDP7EXn3s<~bcV+=;yN04*!g+2Oc)Uc6D#A>^%WEc!oJYA`>AaK^S1X`Idd3e^ zutDPF(?@xOv}Gjm{HKVz=o-qCqNe|2JRsUU#*<0`h^LPM(4c&YkNxMv1+P8EcX~+< zj(VIA^IfC{N|`Lae4MxUjh7PkN)lU*Li}Oh0oevAao-8?PEnGhz|27}XRIXDnR#VI_i*A9jZjsD7o-2MG&-WXDgbVgO!JqaTPvnX_!+a`* zrzi1RqEaq@jv{a7MkNk;QYHTOWK`n2PpQNkCq^Zf`3E8sa>c9v;47(^+b6l1t0;Zp z(<(iCvYTE@bbmp8RPaxgIr^EX%m!2VR6c>4D*njl)x|ecu;xI?kL5)HMO8aUG<^=E z8xRwpb0M6%2Z^>*Rp!*GZe|PugT(bODv10SqaaGbqOIsPO+hZ276loD%E0LgV&!xf zB7(|@87gzr3^%hFDv!)m5PN1uL6nNhllcnrP(EKwZGYx99?Hy-{a+74oNRq(B!3l2 zHaL)5Q0I02k@wmc6njIn#U2)kFyjIN(4}S48hA#>u#|EkCeDq9$eAlT%;NiuXL3c_ zY?ub~D3{g*?Pl|OzI=*d_JDP|%RVd~v67rR8(JR14YQ#XJcXwn=kVWUIG2wwp1{I% zE-#-brvt6%7ZlFr+-v0T5L@Q)?9`RJQKbDi#-sVbgQM{@{BF^9KJOA-t<$lCmr3a| zo-mPl4Yh0WX0Dh&pEtJOq9zB?I-D`1Po&_24c#_J+a~VBwt+8PdnqfR)^&^M3w`sG ze@d>Xynt5??H~YLMosgJE(zPWv{bVn8XYtNhmTMI1P4|O{)H;)!p2ra#xqRUhF?~d zV6;c;a*Qr|5&tZGn}SrMJ$)|;Af~*{(;La3fW6=yZ7<#lgiw{*AdzW7L#Jk;Y zT^g#^rz9loHoQzMT*$lm^J#x(XqKs(w0gHFvxqlJlzkRps2?fUF5;`JET*;xQ494D z2RQISs9qpGrik*2-mAavb zNNT;T^J8XC){swF5btYV!PLyg@xpMtZ(LR)MvuVl79a z!nIyYRN-CD1GS|rBXTH=;CUm7Bg-M~aWU$$oM$8{jN%kVV)SxePSXNjUlNIDm-8ky z6y3cfP;h9|K?zwmaO1! z5$u2h9!_;yLdS;G+#t>u@T#?BOTg5ImbTbTS7Q^>KB^s8uXI@y`>+vN3o)cfi?oQW z1vW(6+?Bk^t+HA4THV`9j=_jU<;HYqz`Thrm?VPAQ4>T{Xnc`9$UaUS2nKmO2a%kd z$42{?ViV$B9=v6b%z@1%9@`B;jB}X)`pFT!pK`%Q*qZE$M-ye#saKA68tZCYdrS}@ z;Gwac^DfT_9g?3)8w!$%rYICWA=8O9{-}o6)CmabIQ_DSqyv7&!$DC01hgz0z>?u0 z&s7cx17J)xI;wMJDu4@-Om{2qh=rzP)L?I=5RK7MnG9yp(LE~nkdA6#nTl@@s@&tT zz%muNMJo3s0^IHELd#@CPpIs(`eO|(Q;~Z{h{ybfS*R5I*6t(L5cMA#UuAjZV{18KR3~qxm{2L-eJrA6V=7Je@5=oRW); zF4j>QqK|cSC57nY*j$;4k_%Ptj#yxsirlTcLaL8-wuauSqkGiHhjdgXgY$Ltpvpb2 zqZ(MIqUa)(domVSrXu%*$~`OVk3h?0M9-+~i~3^?EmM(uLFI& zHSj!He{VXIXLIe5%DI9c9mQxzFlOElZF!+fE$S+Y~oU@L=j38A8%u`fgZ6%z6 zQ98|pMi+>DDXt|Ivf?1=#jERZZbgz+#lKz0D~H~p+Planb!Z~N)*Q;qB2yHm17yMD zw#U#cpo3B!dgEA%?0-HC(+<+(U}fu)5#*{nvS1Xl(-mEGKRArz(;xbV1rroND2S6Z z5za}FoP+DEWq;G9JeqUpdY(&h4yr?I$3T?m(DD#1FL2ESiKRUvK zj<-_vdnrl;gh)vx0woQFj~A|nJFuR&tR?v!y+O(lIwvb0rNWr6M<8I34VDhmo?=-nt+@^TDDB!Ha`5J?$LD`Ig}gTedVMxJ3n$Bf^^yQMrY zd0(FRX8y&wB6|}YY!FV_#9O7!mo)T(T9IFQa8%pGJ6tc>1ll$Agv!M#iR6Gc67}a% z0W`!^FM{|+g6YAYB1V&6P^Kqg6Kx-+iO~D-0$Vv>q-^HtmFK7|Dv%cFz<_)Oai6!! zH|FGuI-6l+$qkDxo3U&?G*1lM%v-lUIS+i~->JT?=0W$uLz{Zni~6QgGOdOEve5}+ zVK1ScMgkiA`DWg%;d2VaUP;CryP@6^es&%|qdMnaOgg8%pwS{*}br=;@!n`k8wc}Qh8-|uqTX|X+MN&eRX&Od|OTQ#F zu@sfWL_=`Bw9_$88Wmf(TkPJ-gCW@~;1-iOhO~DoSJn|>33Om=ZOVFsDUhrXkHfeG zj|y~_%b(OCiYHw>TxJYdcs3@$x+al@*>60bE5>|)J>2KuC-VWXNG$ik2jnXS1MCO9 zNk|eK9D$|&U!%8VmwyK~(&DU=RHdhf1ErHylL>+&LL40E4X|Obrb(NTqKO=W_z9ZG zzIFO0p}R*iR&nObl27t#{!7V{_t{DZ7B6vNgYCS2#~EZTBAE)eSNR*vV%VO}kgVP; zEIu1}PLN=gf)?)bGNR_i8TIgz{@er+hO^=_VJyaGf0Zr&`I zCrM%1p&MjtE!j4iXtXDuo4P|R-ObzhrxF}S6r3NCI&H^`dw7K&5)Lj5ct{BygayA! z@X#3pNi=e~rvCT(=c?hYyp$0SQ@pY#p*DGVdx0QIoxG!9@E+dVTWvqJ0DC7N5Rk;5 zJd*)IJBMFEHtvPL3Y?k#wHMw62&?VG`znX%BjkfnWE)OXKGF%PNV5;f0=XZp|NA~( zx6;G~l0bKei)0bH6HS-_0kMbz8Rlgl|y zLWX~}YUL5Hu;2G)iea;OlDL0ANPapLF+Z$R|@ zh@Y>i_AcqgV>7aUNjeoJvG~bc@!}`&K;4&H@ZBeTp<#gF z(+=^*73VDjV&E=pEUBNs$^RMVi$lC#wZg5)l>X_(I!h9-g~+-En~Uua!)!P+SM)i| zZ>)Td>P4s0{~!QVQTiv*Uj+ZR!)U?p%f*x<5SEBHKLWqWNW5U)5x&$&*+m7=j0V25 z=PeaOkAl&5VISlu{AEAP6%~*1V5bF3f!ELm9xywu=0|nx0Xt>19hF>8CdU^~PL;`t zI$7i#;}whrONBTFmqvu&9^QOl6Y zey6gU$7Ll24;|-anXzM=c=`mIhVbnZ@RUNhD=KWYV;hx2L`WDHFuG<0O|nu(rv_o; z>Ij9{=z=Y7C{rq5bod5t^(z;O`QPw8?JurIDRzB({~8MScpjqg$Ms15>o zAr4MU_y!{HB9AkcZF4>axx}G!c>Y$iUtzD8rIjw#Z}@9)3S|Ct3@qlQD+x~ znbq8Dz`gZ7ZnZbUtHp2Jn&`3z&PKH`nnAkFdQVKVtl{yRZ+eIxr+5XC6=zlQpC`P7 z*j6nMI|#`saB4YmXPmXE@<|#!ey3ry8dWJ<;qDr5^@~3w^HKS0@m5$DWKuzmYSX=Dt$Ky6Mun%x4WNH+}`aRbr0JF$s3g3h{)`s-6~`VdLsT zTM1`J&liLeE zPqIGriV3M!g@THH>q@V9GuiTqx64||;{Ed0)q4B^69bwf+zo$2Te;4QRltFk5@tY8S3E=X@;#o2-9!aw*8?)lXTZgS$Vs)C; zGj$sCd+tDHwpSIB%EW=gR#nlyqSaWGKVmhm;y}D)8_p`w-UI~4Et zv_VPJn5dj?H8l`+OSf7C9r){kCN;x}Z($x!bp`*{5vwD?pGvptQdqf?)q%o(m7wJz zd=a6G=@pj8lcv5q0=OinycS4L5=+vp3Ziu-5Vd<{E8hL6C1t9QhE}#_QlY*Kt98iv z_%UEcG)x6K?n2lbjcXhgPeZ&>RQxsku7SVJrr*;Q;R%qhBElcMeotr0L);$~4;#6|B%V$?pMuJOg!jFNI=Frj=2Dz?gd) zHXirzsO%ww1`Ho{?|^Ot?#rH!Y>>k<8zC_9EJR4CizPL|IJK%+8KJvJjvO;+$cO>s zvKyjq`Cm%1-$TEtu(892j2P76;c?kxyNnojbN1Z;9y}y__@J>54jDA=-unhTbl;E> zFM^VN0RKGxvhX*2V94 z_r>8Zpq>=K$EB(;Emdp?TKx(#t6R+LTUt&byQZ9|Tf=&?+xLjmDDsx~dnzDILs%JM zV}t>OqXs-YeB^*ZJ;7q0r6@U>(vU~YJ`gOIJ;vjij5uMMT~_>F!^*k~Ts1s98+<;N zIMYUmOs9G4H1PWfiP=6tNc~M8oz-b$N8Uf??(9(m#@!qF&Z?l`Jr!`2%c^D6OfDEv z(;DjScLOr0<2e|L!bxe0-T}mkZqMrYG=%AhV=Ua9Jz&sS9m+A|l<_#qqLvi_mXJD; zCep638a8+O;5ywWaR>?dKXe@o%u2GUJVK&oRz=h${@&24ES|r@s!--M<{gr0FBB}f z!rJb2<9kGI9jjekhc@9#ijWSr8TYevZKJljUH$cL0z=2 zXH7EpR~DP=S;5Nfb#w0?K49$FLD>k#3>Y`$f$Xvw!l-XG^tZ`SWsXBXWshqxM2xRz zRj7$doPo3rZK2*SKA^h##Uu5tRle4s6%Cu3$)aroYm(2A8i?;}U_D-^Ddc!tsx5U`a#kc{AzSEWalMV3NH>m!{T-Mwy_fdZpFY=oS?H zuC!JdwX2J?W>(O+p?X2(%ib*=a98o1#zyqRoBg~DeAPat_(Oeou{vx&kOEvW&LEjMGX_9ud!ODF0JR66R0DRQ<4i-U1N1j z4z+Kln65WM8dhU;d=kP8FNU4RlY?aW-|XgoPbPk?M;Jutz0V7K-7% zLYRug#^`Ngzzc|1gD4(8^1`RNH-|9mVVUc>5~Qzz(22viBxge>jy;i> z__c`Fj)L!mI8EUpOKj+7)k<}~>+8Z5{MyZW65h2|!4o~K-^X9`8<>Q8G5hX&M>ZTZ zYGlKK_m3DfocPw`S+qgneka0CfSGuWitj~8v=Xljx6+NG4dTFuR#n5ZvEbZ?)&>}x zHu^meAp1px)bx1>G5dO!AtdCEBMd~PvrT?aEyRn%*F|~{q(6#~^pFJzn<5;0?|`Pw zTeNnG^fiPCDOI|$S9?w%As9*U)Q9XN{&A?$9&s8-YGid8V~-g(WblBy$AKtg4p=yQ z1@i6t*xF?*-y&W=XzdC)A0}d&pq4al()7w^&0Dl=b=81@cMr-Q?BpjSpE}uzrxc5) zBTg-F^6Mi`YTex~)e=y#f*U2%=5}1v`Wy?6vrP2)90U5yE^+L0t8LSz=y)1S-{G$={+#$p{KklOq zjm4#wxVgw`Z6JK62n!Hw74D<>ncX7!sP(|j&iDNw2Wj4P;(dz6dlie{Tr7Tz8y5$T zTGzXHlG+}ODt8^?Bx0Rj2GN|%(~u7h|c`Nn(lpGTy@-PXMhfm9JhKUU5$2A zdzYY}%cup>kH;aDuC_$#msZo%R{NFqbR$CIgTa>Q^`$kv@>#@*|3+f|4dtVY2Ugdm9Ld4wdF-Z(7goU%FwHz7`1)NX{tEk7e9ZR$6KD2d>bPg_;% zI&k%msM+%kr20<9>Tewh=%8^XMC+dwbuB%=F@`B=d20F F{{b{PmPh~q diff --git a/schemas/edict-provider/components/v1/verifier.echo-dpo.component.wasm b/schemas/edict-provider/components/v1/verifier.echo-dpo.component.wasm index 14c6c1479e42122e52c5f46450de28e215c4ae9d..21ac1df91baa85e13807a9e66e677a9e7409b430 100644 GIT binary patch literal 469651 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

g8x0%ia~yg(zyjd~}eQpXlpGC6#VeFsPfk;BU+y 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 od7nokwT*=ra&5ejmd~ji50({r~b_W~Ptos_N?M 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 RF5n(KkFB;ZUc)!*{{^D*#yJ20 diff --git a/schemas/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm b/schemas/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm index 903933cd7c4047821af6c731496b9097d5421458..9ac319d0ae40401402c9055bced3b587532565de 100644 GIT binary patch delta 155778 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%0DNSU|-59S}3mk-px|nr0n;N}^ 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 delta 97633 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 wI z+L;^V^?6zoIsIuqh|m6BEP9&H;y+f3BcFjy3m^|a!$;)X(ogH_^1xR*EKf(f6m8Ki)@&8O`~TaLQ^#0Z9;&hl&HR#CqWxo((ZJEGCAdRf{46l(n06!TVl>1uy(e757D77SFxFua12t>&a2Tl?Eq9Gl$8Y zJ#~KCcF#cg40L7h6_A9~IGBG=rAQz|aK&4_5`$Btc~{81h+vX=*RFe!cV=l@#3_emJ;sD_&#q}l`O1oUVIy!S>%XAjOXrNb2!5a&dDjGr&Q45N6qEK)$@>7JK) z>(Fg(6(V;l%*a|%zLj5-yIX#i#ImIq-pCC7vs$rbD?g*Lk-FD5eqrm|?99|ASZp

@fj_rlVwd}=^V#QQoI94Z_g3qxAUpNnG~j_-;V)jJHNRxK)1fi zj}h;@!ZZ7(w(A-h;nmGeN`pwh}MeEo2cu}*1SLOWBAjh9oqTn_Da`1b}z1_8I_q@i#3`?lLzRs&kWJe^5 z7lM5Ep)&D-zVI?fEP4ZequN`@G3(E!YBm-{cX# z;8`*DOmQ1|(Hq7zMeWN(0o_EgrSTVl@=g5=SL2UmJlCi0tH>aXI z>v=R=q!yjOQDp1_XFtY#a2FpPypJ;Icv`fJpG(DpAMkeiI!dMEyy2oO^{n0~j`~2A zneYKWk8-{G0go2f#VdyuiBrJ0#fu>@4J9{k6fHhfB?o@U#}w_L42Y6+y9rJ_M8i;! z2I27U5BXU|AIUsv4f0e%ERe_C%}=)XmIfj?X-^gYk=lSBpxxCrOL}mJGJ2>?e6tO9 zpe&Q#T)soy@-eZx#M%-oGkA8qGQ3cAiFP0H<3e@IiNFHgZb*TKY$@h_#`}tIKjKxP z+53I{%g6kp&03+pYVT%ev_}W8hiaIO200Za!G^NkA-&1f^AdYe9o7JoMB1f z`wM@wMx5{^mI!y$fS=gjuGsdTe4;OKkhsdeixKD3nzh@%gu{_R{+v~PF^9Gh9Qw%fP7fbqRGV(@oZ z3VA?m`HmmbX$e7xM@QL7j!o%^5X8bYA#bY@ZNKO9Vh_mqpqwc>+7^>W^?3q_2pZc- zrh6xygwRQ+dncVlO7>h}KoaHL6Y|bI$$)deFqZHD&FQ`%jqhf1?$fgoluj1h6nsG| z$*$w(_pt1_xkq-0BG+7rTPsTO;8cF%P6?j~_aB{BB-a1H1IH#;meDAP%tli&7XhiH zli#Qj;U9VL*t^sO6ol0%Pbs-krqYW>xhhLI?4t*luk_$DmL7<+38RL?T6*R3mL4Q? z#aBP_0c|9YFTo&gbtA2OE=k2!@7=cR+8 za6i?#*O$|fM_~b&WZ@lMaL7Y{<7C{?A|$zv~Q_0%~SLjs{QCg`AvlduRv6}WFtBkvKt zr4uMd$fGvG%R`CB$S-6UMg59+@@7j%D_!8pme4^Kg$Vg3Ml`S^=BE>}aVn}jr8x1J zRG}JlKV1j{YLtF}_Yg{rV%_IS{kJ;Zp z;$T9$A){O<*oDp{14{@`Oj_Z>jbSj<*OR=VRk&$XM97CR2IsrWQ|%xZ_k?>t+&>U-Ivz(JjqXSEm)qR%zY>X9 z29RqPs@17G1X9kx1`q>eN{}&)ctKEuDNy$#2!KNT1QaKD2s2gGftj)aPg{JNB9XjIFN{fvDET3VW{L_YQ9q7W_8<@b<>R^|?>S5Ph~ zs?;&mQ81*77BXjO_(a17m@oe1@y$CMw$xSPzzxily6@wca?Jgf?Bl~?>!^Q1ZA!Q# zWv=Jp`xmJ|yZF4?4^g9e2RgAfu|ogZX<6t+z(z>sS{hhM1$&gdt9HeUJBicCQ*7T7 z)8$HuaY7v4a}r)>r_)k}vK)D9ROWczJ0&rg_7M(5In_LCgLZhx-f^S9Rx|5&ZBm0h zO78a~#T=%6z<eV6#*x2=w=z6*@S3I=d8x*&AwU$jlTkqAT(Uztm zKCMk-6XTdqi!_%0h);{MJ>oT=)|Nk4BYyR1XNTg$kvPY%jc4=3i+=4U>+qABi;DtU z$uanD1J;CTngu!0^z|eSG?Rl&Nq;pKSY3ZL7L(De@{1oB8sbBe_$i=`ipdWUKJWGYF!1uIzGO>OlY8ADC{AfQ-7K**a3O2R#5XLUe+g0XSWxR0NX@>7P zVx8FM(?%vTeMrb*dN1*HNbAJ7C=6>?E8{G%l+GIkGN6ELA^Ib0jCnXQn#?LP^z4JZ z+~SXhw|j_W6Vq#!n-@ zYMTN#nPhPceH+%{(0a)s`x~Cbm%qlLtP~cBhsJ67iZgJz{C~w%PnKT>d;J`GZJcQX9mdxr|Kh6h4Jg3?C&n(&$pg z5}J=}P?&hIndoD}P%2cT;iz(8=ICDV&{oO_cu7*Lj^H6ty>So4q_H!I&k7|715^P` z|KyR#nmGke?y=28F~n?y6f@1}sa;DpaT%Y83sAfab_+MZu(_ZHXYh<%34jABk1)F< zN|lX+>LLk(!NRrMJtUYvGh~PPR`J5Bd%%X zN5HgLLNTC|09-z~iq5skT=NAQ2*a6_82uiyuE4sK_aeTRPg3C9|VnM0aM%*x1D-dg*(egT?kJI6`UrLbfnkj+^X+j6d zlcbnA7~VwR_S(=~s66$GC%$^Vopwem+lY#nl|&Izp@e4?IEB877BoVR@r7=v zn1ZkVNy-u2hm-Rq4NgiLHKBo4^B8IL6ExCPan=3tctr*x1~v2M1;oNURS|l)!Wn{Q zL__96`LY>(#Y?O&(asV(I%qjK!|byTTDw@C+~64iPYitLZZm@Q=;U5}Vht}4cu6*| zyAcCHgJno3mS7TvuzAeLf2ZyYB*E_DWY0mMly`SsNK_&|_~TVc1RBJEA#vz-vWB(#Qi$@!7E;`YH^LWFn-S4N0QDRBM%BKcOConA6Ot zow^(9HtlmA`rsDlI`qQDKG%T`2u64<9sRVDFr}V{BZKi#Lbx2$;2TtQA^4H_o`$2A zp)jGgu$G@rS7@prwSN&lS1m>!qFvm?6sztO?F7-WlU5MAaUqqV@B4|towV`IXUpeA zCX4O8w4tXXXcmH05TTQu(BfFmyhY~pa+N}hrbm1U9P z4R-dMRdFh7$2u<8xxmKCc1XiB4S8aE&Hed4c$%E+>})ysB5*8pKC)Tga`G&v!Chq z-jMmk-PGaIsKZU}s-4vbVcSafWw*}IpC=LBj|7yWZ@JS$loF9{T6QOr1LLO`=I)qPd;w*!mPtjsEeLfWWB!x+$$^xN*;R{1Dy=Nw96qAw8_TT zpQr|O1+AWJeY^2=YCL>On!{AK<)kU$gN0p07Ns1eNGy_Pkt8u2yKC9K>6JR9UrG%0 zR2}3>PP%jO$-`)lsi`9qR7XlPZ?m=XOEn^^hjw~<7%}RVrp!k(Gu}euRp%NP$rBrU zV{DdY*U*ky=t!`JW@Z=&DeMl^qGibhmJK?J?xbz8n3x2yo6D%lq!}ar?4cD7QfNn7 z^vC`Z2y?DhjyiByD!N#-8L;l`!AM5lJc(OVjFP?dFsZ;$De_Zm56(Lod6nl^SwbGMnfMXIC*V}3kK zb8~m&S@Pqx7|mVP_HvE18IoTDUUP>)2eu6$PFTpSy{8W9IPo*OVtsFz{4RQ-#O90k(N6D(SFk0_nX+WUw;L3+ zkomi$)K40o$Vr5@;=s`Em06_KT6L6mR?KBaCcakfDv7!ST2}UYlo}Jz!)-RH-j`0j zPwF}~)1tAu@tLR3WA?-P3yo?82|SrAu?#6QO%(OS*1@;?YJE)?TPEeWPG-y0w-V+A z5O}-o=QEJxB1SG9XGrUX#!np5$d{821sLwnu8W3^tkdF?8#G08gXRoaP1&a8t}Sv> zH-_CvT^gUdcjVyZIB)BZ(asx2>Y3)Do9Ox)y-ZTkbDMa;*rWSt4bGFt*#% zfJ`+F(9yw2f-eLYXodiOlb?amrY_Y?fx~pOag#H3C_PAvv&C?iYH7#(J$9#G+MOYB z^3htiqwbS~n2|{f-qNU~1Q?YeC&9>eAASQ?=FR{-&x;^8vQ*XCeycE<>qONK{gT%(^UkAinL7gw_SKQ=@bf7uT(47iaxLTw#=AKI3nZeLLZFC7KF369;~%) z)gbpCnVU4Y7(Q4#F_FUMgSFue3rNQW3_Wz7!V|SKLJ7~6cs|GGAz5FT-oewl-G<<{ zO)a*rs&S{1Cr7nl7?^@hJ+6m^=7*`aYb6(bhG>VJ1+9!p?fsRYo+|6?83T_Kedi8< zzo2F*jn4V{07h+|BG209iLB(3%wGpafLx8Qasd5oPK2!k(Vz={9(zr%qNU zQ9&VnPc6t%0O%JfQ>s-8Mc9ieL$yMjFCoSbf?Tg3sulNJ0d|owjR}^F2ML%9kr8Va z&UYB4&jGo#g*2Nc{g))wkzv|77g0L}z9Dz&YgDiDU#Z2@qxm7F2m#O9N=K~4Me2Ax2;UF_+>MV}sA{10|i zxF&m=BapnJ7+no3H%n)2*CMXF{q-7w<*Mt&@uzB0PUGpR+Gx7Ie5!UvcUKj}Ieowd zCNXNbHk=}uR}I(ZH(M$Vr*sNMBmMkJjX38t?SjxMnVd;V>($e=bK@H?-NyPMv#*;V(nA5Z0o6wD58o_+oBL3h=B%Cqm4u#M76c%aM~~%0~oM zvIY^HwQ;u&mg+^>Z)yc6!+!2SMd(mb?&v zu(!t&sa!3o#DRMQMr!R&P;7H1xEp03L?u(0iu0^hXCNr%rAB&AMYXm|Sz@vh6~+iR zIII!eVt-_>IEpU`2C;Y&(6_7Vr8b9wj7U-p>~!(FEUp`cQ?vci<%Q>9Uih4fuZWW0Brsb$1$;D-5y1f6S}QVJq$DOCGUCk?{x8KMT|78m3yVw6()=+3Z z(<431E({1?EUAB`$U_1Uu!bUfRUenahbEM`yRGImf0t0QY%i&z%n?Gb3pJ_rnxonj zsN%b`wUQW?Wot>7hz^dHl*Ua{c0?VV&W=2;tBz2 zYf&T#a7vYO8%bC!Kg$6$E2+~;=uJv{3V78>;*G1dT=Cf$E#oXn677zMe9^vOMXUC| zfhLGp3FowiaNzTXvk3v?BnNUL?>DpMB;Id6MA^&uI(iRZ&tr65$0~60k0+9j|Gjds z#SlAqtX7aX#KMqBiXM#1A-NzxoNGud8mo0WjnrYl+$fRDPSPJ54HV%>|T74lQ%Irow70`i;|!m_(bHgQJKblPU54YQS|n!32E(Z4MwiJ5 zds(##@ONs^&?X3eRkGU%BcL;#o?2S0$C{o_8g)3TSUn4h&#`9kbq|cXxW=W zuoZ?Nr)~;qrjmQXDXQePiE?|m7WvrJ-NL^ElD=$s}#9Kpc;XM9^91EkS2HsZy%E< zMYbnyTpi>ujiEJZp%lZH)7t;1DnraTS8GclWbTF@g(Q8AodPhRS%@>V*+*&);z>b8 zG@afhH7=TcpwVn8zIM%x=KVb<7rg5Zn#4Y>K#-|^&ZQh&MjpoX|)2wUy6QDveEzv6C|2}5I}no+9tCR32oH$ z#J=-N7>4m_SE?Sx!0U<&KoGzz1rVdXl$#8gq6vm57)@Oaixi6CjboBV^g5lFLU+2^#4w6DqysB_Mgeg-F=-b_STw+< zHLClQi2I+>21}|IA54eqW@()r#NzLd&I=>iZ`P7FpkP|? z2GOUhX`}5dP_LjAC}@fpNySQ`zGz4X1F4MMWWs;7mU*HKjC4C!K&>Mars!018!Z~!o?bOFxTo|f0ryJI zcw4CBHB<9)bE7odX^p^97EFe-0oH#;hKy#5C4&i??@MkagRzyue+EXHU5-k!HAEb! z^pR-hjnYAq+(r~3^dA$K1QptX^pXt~)gu0x7BwJ+G4M9zuKp`Qbh520qwDs zfqSTA3eI1%0igbjChCV2H<*eh>6e265D#DY%LGXH&J26M6lmrhvVpSIB-?G6|DIDZ zn^iO)Lwi7Rj8~U26oI7vpwrXgO6=@G2$EWhGAg3k@)6rKY;)m1v`=F0SRQxa?Z-f| z?Gpe@C!aO&CGS6mPOPJJir_q03Ubah$B^lUX(esr)o-k!!b2{p=(eN z!FB_==QvER4xBSgJ`4tv0d5Wo>(91b966u>E{-%KC+^}SZLD~^7`8zp`!SZcWEn&s17ss`(F(Tukd{S)VUeif^Y;T+4zYu! zVc|jwo4->FCPg%%f%Xfhk(GxtiOPh4(qsT>=FDaPB>>W=`v)MSy-TFPCbdzvOGB#g zB=TxMtV&X~V#{1DJ;u@K^cR;I8jz`jNZ96Aa*(k_p2kV48gdq2g92Y|0ner@1U$#Z zG50_ME{?xTD}pJH5;-`Y?h(n<#q?_gT1E5B3=@oK6-_vk&p|+TQ5?^j=+KtKI1q>n za;iWz+QVYB8bC2ks_w?U2{;*A5{CfZ{RnHLb<2f@T=dDDNPs{<2PLTxf_WM^nr2Rw zv^zl@3Rv9uNi}p2qP1xq;Am;)O7AjFDR8VZ0Ad2WImr{1Iyf}qiK3;XL}_&gASn-N zDe+XP*f*w6{)##Yl!>gXHQ!*VPh4L))^{b(-1TL(t=Mg#RH%*g^3+b43Ltq`G01`* zcP#b4C}sAN6Ci+cM?uD;d|pBcrWg+Y3n&RdHb@{8LL~J@ndGR`Z{q_&s<@}nCe82TK?x0o$s&%C973LF z)+IafDTgsim(5P-4HHh8aWC~cLVv-}(W~t*xZK78uP?(;`$~4E%))YzjXc*k_w!fIXqK?=>c5Hd1@RdY) z{O_5bz=L+=XFmWBa2o0MQCe;xi8Ia*nhxI-6gAySPZ1?=6Qwcjc)n(mm>9!JJ8LE( z3wGJqp74;GUt$Fbr>$4$3&rY~_B;P{l6a(2yP5((J636ZgHz?vhMOme%c`{Ll*+2L zUUcnUtz8<}J*^Il{jZ6Y)mjI(T)bJ0oyro7bW*{y0~3mwu?jP)FRzjaBCG}|fQ#6i zD!1_?77=OY+-Fgfb80`8rXBwDlWs0vO|KHdCy>;63tGb0x@BmB9YEf$4nk+wl!1Ene;abPmU*@VBp4&jNdv*8y9qrYZARDgC*Fw zb>3v{0elg?*^SyEO+*t8zfrpfxqiM;>(@lCVNas)c|k4m(C(Dp(u9Su~y}#n(4$ zo!V{X6;V1XhB9J(CaqM(3v1?Mh=s*sPKe%#@>{gdu_~0pIV-5ba}#dUh}B0*1PE~) zI$D6mU97an50X7t0ti;CR2m!-W(MTCwO?q3 z{LtNlMXe!kQ}F^?84`4pj14!=*gm&vJtX#K9Q)%H_T_QxgVMs4B$tL;kQqpG$3%)QBNnQlXYQfPtcu*km2CdzVo z$|8!Oh=_=Q6lIa!-RBgUDi3*56%8U{Rd!H8mLjs0ML>2C5f!i?Dk=gh0{T$D|4DN1 z%(Ml4?|V;wC6nabP1~bUsC`4fQ(JqA9Mnv^2r2}_ zoxq>S^)Ke6iE;4ZM;MNyJt6}m54%Kh!IWsrnUuJ$&yEt9QCqBVsf`cdw6r+$92^$0 zDJ4BWRd3<~A^EC+Qf*PXCjs28aKNH;K>jec3>YUE)y=i5e<*UgY?HRqpK1iLGN{ z>yAbO%UD$J`o+5kn9=XLlbzQ&9HU$5%sUxWON8oH%6L)wj`E15VG<(yucRWa2XrmY zn;**RfLzD{+J#oNl`SR(CZaYBb!bbf0Q`tv4XSR9bhYDkfri7r9Rl40DYO}9(e(f( zZQ&IebP;3Olepy zhA0t7w@e$Gh4gzheT>_eS5hb|hYJRP@q3m5LgU~Uj=VU!wD!SJjFV!oev1TMiK8&o zP&t7VZ)Z3z^zTV_x1EwxQ|#Adh3VRIi%K93%28$D*z#_*F*`oRqybPD9bYyZmM?bY z81Z6`nE0}p*&)UMX|&)j(OZ8$SBM*DnCUl3IgMgr4)Ego)6f1Jh2E}&e_*Ix+MuP4 zIYs%HjX99u&j+noJHu> zDIK#pjTmAka$q{BeiwT1d%yhM!q|gQ3tkc&DcFiL<%IyKY%%h%S77*eOvq`I<8iw) z#`23s`~?;~ITNR4!7cV#Ic93YQsRIf3dTbVkvfRXam6F8ePeRq`atT4 zy2h1$qIb+Z*;Lfx7z(6VLE($3mJm+;xMffZN{^Z%A=m{zAp!dd~4Hf|D<`~EXF4KP;L=p zvZlQv0yOQda*;qo%mqd*X9;*Z@qY{Bj0+sHFGy$_KrZx3sQ^u6@{BzV3VH=~F<}6& zyjc`3R^{Z=Z>S&pDO{t{_TV=Lk!L(>=~)u*B6U!fNkhb~CLQ`p2&Oc9xB4=tj0-)n z42?`00WLIdh*?I!Un}6n5#W^)m>ApzM$yL!_`CuxiU6OGz{IW+I7FnZf^s{|$=xf(ys16wV%zK{olVXxI&L9-6|B6hTQ{ zwX?L|E9W7l_ewfJ^THI1dtLzpwD2!l&MYt zmpuE$ABT;MK2cPF0xq56z`2SF)OdX*x~7)763wR@sE^a=uY?s4!VW+wCy%u>4q6>> ztlOruLqJdbJjcAD=Y9eN;Vx@luMMyo_8$d^ByFz9N z$8u@M!1T{1R-!}Elt+e!m<&{fSU!GRM?c1Kxus$V>=jun zMmV;VMVDM@fy32qjwG+%=)t|X&1~kMO`V#h&0NkCvij{j)zQxTy6V9+N*hS4bI?}x zRWzHfL^o5v$Z;rPh*ey?^|-&GR=U57u(zcy%m94UZ|s1nvz^$OSNOA#VTW+XA zx2Y7N_MykH?$i;vHz&cImQbWHI^wpMa@+>XZ=6=jZ=xekn~|X!PZ0SDLu-(1^CWmr z;?9f;!dz&UOL4cm$Oeknk!vnAv)reOCvPakk{0jQh}#z8Dxi{26^o4v%}%sio45$~ zZG4m~8ZR=dx}VS8NS_Dr`CW_5hHmm1S!zop&s=1tWt1#cB8hS67fUyobyM}rA-3~^ zIJVtRZ!pKE?p#jA$3>@)+h~r8+SvPkqnVlMY?QbyjU&4N-4uFoxv06x>`r^G4{kEs zwv!N$!f}#;)X-ADWk0D~TI40P*qJ*~tad!`es+^N#^+#pY=Ri|K8SW&!X>*{;)aqD zo6P~D&1SPs{0bVS{$IvZ(!Hs_l`InJ1I6`QOn-E_gSMErha6j=dZj*&?xqQ}G{!+T zNeu1q3Q)&C31$x342>gA4EjAK;*zzfkJ9mx{$xh6Pw2=V_(tAOUDg&7y9_+wjv@nM z%x3d;@xoT~_VzlXl#N#ENcEhI;k3ULDADi(Y?eOpglMu2CzbE{z`VZ9EQu$>JHo3z zFe{gFEFF8r;SbC!8pwW<51&D(#E&79tm>6A&RKmI*^eersW+FML+vi-CZn@J**n`p zY?ENZtR%O7oF>X+!6g1^|NGL-6OFc;O;T4crLv>V`C`m=b4c){Oizhy_H(Sa;Ia@_ z@G#qm-?p1~UJ@?i>8RlTCBKVuyw&B+k?G}id3|fr%qAaNi87&T&`AW#sY`_o5vKUOuA>-vjLAkJw}O6K8gt z<)VR-_Mp&7(lj5Zf$s4|HSO~~AVDz?3|J0`RF*weUN|rBh6ghJU;GY2zGhDVLh)<~$Toy{)wGZwaUrZ2UpSd$xU)hfxCXRt4#(ZdQGA^tZ zt@fMM2d#zUvaiTLpdxjMQz)TCBhd={Fv- zgyw){c?1j#le3hyO@W<}r9s8UZX#{W`@f)CNo^7vJ~DTwI;F$vGt0tfAFmN_959cV^KK0B@! zO!Rm-!Cst9>l8Sg(5r7HC$xg=J~MCk8mrcd{6l87Oy`O^RXXlbc1rjA=Zja4zx8+-L*{|D>CmezFI5V9W`szQB-yMhZr=5yx`^I^lro1wPNy7Grhe6$1Q0w zP??(Jr>t{09_lwnin5!@Cp;vpFI*>%A2k~o>(+^K$IKqa_H|9Zv8Z20 zjJiEvyn4*Mwcuw z<7?G!!`Z&H|B&rY$E${tDtOrm7j6d7?x`l-@?^B9-^FQwelJD??A-t_!fXcGdJ)Z| zbIcdyE!^^FZ=}G_x+f55Ow)dhzUB^G)YUjhx7`GQX>Frf$?exToZodW3yYf3L4WE` z!`b?9+ojYqw>_6?4H@RBgor%@FO#5^FyX0mcOfbpISq|OfF;n$DN$W*9mQLJyV?*#V1;EL^1j0yroH7W%6U zQ<7iwIEg|tie0th;8rHPwRl}2+BUvqzeNZa+t0+bsz1?0$tX}2BD9J^;;H;XND;VD z>M;||TM0lWgs(AFqAn?m>aEyH|D3s0XGuh$yP(rtL=v2f{#`^4sKJX3WQth;AE|Z0~Ctkv>xydjR(m-h? zfn*+@_@EaI)!@PHGXa>7?f!niwrTk8oN3~%zwG1qchb->eqCi z0e&WWqX29?>HFE7HKi$&u%mUIsgDiA>v_ z#OwgeZ11de_c{=@qo%t0_8Pg!k6Ix6Xm_ZL?JQ{b3NrgfE>l%RDP!wZti4};Uqu@v zRJTHnFRfeMDdgW5N}&L5CUwRY*dxHP26C!)?hixdk=93qvSeY!%MPbXIapF(k=;N# zj#Cr$e;FIAag1?0#jP+}0{{2h8r@VvfZNY43(*t+2~-NP*?*nb^aQ0t0irdGk|DS1 z|1Gh(txXwjeQL1L90z&vza%!Nxdh%`G}t8B$$&%8krOJ^|5f}^ZI6hIVvI(-?ds=h zBEF1z?vPnAns%UZ+aBRFob0)Tto(lrssL@j>bZ*g*}`5NT2edx+WZTuW@2j# zK|0Fuk?L=_PGx(=qqSIdGVSNrVioA7dCX^82wXyUrjjChL`T{a14q|EN4tJ*iYr|v z)hjnDy!gruOJOzh$WCrbyd9a2snmSTy71G3;KU=nu(**nMd^+jAU0gVYJ`-chE|gL zCa($vczZZ=|MB2Z{B?E4oXw=^W|BTQ`Na+*)Kz-V4xeDq;rtx_lXq-6%>as*A9N)Y z6fivw7ph_I-l-*R9&$bE3e>++8MW43eCn1<^%?vP^_gbz5K(6u-tvrUEe(u6X)Wfm z(h;C<-QJ55F_iB1VANa|if-*$Ifala$Q`Q#q4yt>)|pV9K6fY!C6x?7)PI&g6*(UL#8c&Clbw#$7QR4;+WJ0; zGpA=AIll+T4#421bbE)UOtL==Nto=c6U}_nQLE8Jlax%^xxjxan31{|SOff`mu%n? zq&w;EatguQXk>E_*>RHG5pizH+Yv88b~)B!hgw9SQhKaFbr+F1_wSG&oDiV%{&cl3 z_lKfIIk}vm;?kJwKb7Q8#c~}{Mm-kjJl0E{haCfpgeYVv5qPQzDTv87SOz%a2VF}H zKV_w!+IZ3eFf+`ddgt2_C+0k9$->(~YCT5bJZVwD57#~rZ|{{%=Zhw|TA)Vec_ z)adz7DK4il^gjqdd_c;*|0UY%BO9VDnpoWqQFq9tq{OO7O{`JSu3-dsE|b=Qf8yOe zlx+nxN}4JusFvd-s$+%63<=aw0io{NKqyPy2%_&K#5(>zng`HE={$lWufak9L3>>F zq4-<+E}mQk{IvU_&t3r35~#J)OuX|>edxgzQL+>B%$A-vouNV7W8}VeG3M)c)z|vF z$Y;3zSk(xY)^=&N7{*dXW?)(hV((RYjj9~CPyItf?gR8Hi91Dz!|~b07$?4wT-Dli!P`)Ju@opj3&r&cGBZC$t#^ zZaZGGY95Y3gyek;B9u@HBB7Qht&F8e0^QSz?wew8*?S3G;2^AUsZDgIzQqY4bsW`a zpD-zrx-2S@Jo3o8LLPY(l1E+$BQzh84m5S2K_8JF26Xo<@WL05pzu`@h47EtPoeg_ z+oR#$1>8|e2Q$I}*5~*O<}gD#BF0I%0>?mPk%>fmuIbnLT7-QhZEaNs;B?M?)y9FFwZG0xyAo->3M6~!DM zCs%rXyqfwS$F*l@46!4r_fJ55{LZ5-6cQ`YK-}wSXqq6eLs_T7(KUBTI~?)7sxqRF z%JcJRj5d5}?Q~GU2l=BkQtSp0@zkD)p~E73F+}VnVWS&XKz!IzoAxDSmXe z?xNFRF2VeRHfiBFs-?1#Qa8A!6xZnt141H?a|6-3;5=z%#poobvvg=8sEr_TQ8Mz)rl3>ky0_OT62N)rxYa`m47jIJ20#C850N)tF^np|_U(Sk@s_2$Y~)g!{I_!Cy$xquwhWp3&SF-Hlt?1v3-Pw1Rti!Kc!Dy-gHu6bD+^DDgov<5S ztQGTDQrm0kR?zbvHdy zG+UmtCfQ53*udNIo3O}f#jbTLj*#J_R_r!6`K&CrI`C<870cvOhZduosirg#Z(PM1 ziWcoy(7RXM-j1~`jeF;}V~xsaH%9oh9R;+{xk3h3o22%vvGG$_v}@1W*LB)^^Z=2; zaT~Vih_kc%FMsES#r*c{gKpZbk?sp3;ryBW%+fj}T`G-KefKC`HApe#ix5YTSgVf$ zkxN<%Z59qm3lf}%qrvgqv34OhaV)z)_R(b_u=)TBwT*{t=UNzaohKm! z^<3&Zaijxl?)J@$kBLYX(Kj{z#vV2P85Xboja7|YGPC7x?CHL*$$8#Hr`vO%A^6Jv zHz=tx&4X{YG$-N+HE{%vlcZpFb2BBEV6RF8lg}=0KboaWqyBgyEZ(}7J?4Ez)Vq%L zLGa{ttWKv>>#35erHD6&Ga+E);X0VqE)6WsT?a{XCM@ph$Qmb4k<}VB`(RoUvpceW z#*bmaJF)gjP97XZkacq>W?z|4RR#Fm0Phf(IF}r;YS2IWRw8t*ft7{kC;1Z}Ztlc7 zw{ptbB+GN>A;~9*%WZmHHr7 z1AbbeV?rQ@#quQ`AIMMyl;uBBjt@A^K{|}<_uy2eOdKfchAc1SCw_ExjaXuG7dEr9 zhAgFD#I@J62QQc3|0dQ$)auI0r?{@DL|{12tzTf2t8H(R?ahezdOBF@9rOSiL;io^ zu54s!0s`e%6qz@$Ym=XqMg%TDAXniV*y9}>cS&WKBG-B>H;vBVN4h)g1l6q_eaXjO zkw?E-C(A)EG`x`wO-Hkn3S~`%tQM9{>rCcJjck-97Qw0in zw084N?7n1uzodhR-JOl0ORbi7XWi&hE8c?*DXqMm9_*o1{p_5*Wh0fFM$@nFW|mt< zvl&F`w40%;K+{-pGYeGKV5N2NnVZ>wGR~80dqtmHSmnAUo=xMVWqO@!+}&Eyl9{)# zmoHcREj`)bW|yv>cm)#=*wPAM=tT`i@qJHL>2f6pZe>ke5BS5H4(QOkZ)Ia#5BR9` zuWx0;qm;J3y;yol5BPX;Pv{JjCp_Tuda)bH1O9VBwoxANWssBU40QQZEtTXYXYnKi zKqbfj-KiT?YIYkN;dA2fe_wPP>+Sl#JL%}dtlL?C@j!1@Cw?gzr2PLHuaYj_#^PNk zcn2Qk0)AK{Cw`1Rp;?@Kvvp!=J^tS9tjV<{oUUlL2?R0q!6lx4*KqGE((@=Os951a z6%@UXgbPu-PiXw0;|n&H6d?eYt3C_TCYN4cxXn^<}r0 zol9UT(O^sZvJp^W0(Y{CaXED5n}3pMdncz*XKEjM+euebQ;BbP-NpQ=+P^*u zR-Czu4T&!E?*14?&gQgJCWg_@{_K%xxE=#opHycf*MS2&t{K2q^wsf8^`g?%94syc zg}#>W4AiEO=w#Wohx*5h-2>U*dqoW(@VZ%Svyt8-G4XcOwdzZ|XoF<2@#q-2D5TO% zcO%xp9<2oScZxsmW|dR*I|>exG#faX2`vq&D`e5-$x@YbUh2~vL$%|9!fR>F5$1Lw zjUcf2wn41E%kRGpVwFPwElSa-_>;2qsEC0|vZHTU6t8EqE2HH3k!+SZz`3E!rMN-1 zS8wFDLdou!X8b|v2o5!uG^}-!mFq`j3n_m1>^qrW*7XPm%iJ-T4Nko%(-YlvEE_)@ z%m$@S+zis${^;~B_pqEw+N0Ptz(v+m$L?Xb)pW8;`nF4SJ+!Uj5#tB5pvbwGHMvZ2 z+wNuk(q-epI)>`+X$mQb>-Ixf`Ccn2>Yje0bHarZAW`pqgI%N&6_ARseJB=O(dD@O zBFSwh=(1o4=<qo~KLDLJ{hhiP2Z36?tVW9ne}k1J55qhfGX-Nc zgwOOdZkW;I$+j_gBpd6l5FO8vLNgVp5sqgY0= z7NxRS^nKcB_IKZBlGxS!nANL}VZ+jJ2`*4D9Kj`FA(xPsldKo~4qA)GuyM(IrFsuv zP1KJv8;)hq7^f!`tR2ftZ~561a&kOUgi)a;-o1Kug7|10PN&VDApRJ~(hS5a-p_iv zt@~7>d^IqB?0yzGx9M)&iMQ@&6)XQLkuGgPDn7rT4RA}#-%bR$0;TnMfK7A_RfH=v z&aWR}gY8&zn?YXd#f)wAa7!T!=#1Lv%7Pa@prTu#X#b<^dU5bUmf}|HT6QR}XR2$2 zqk5&yM(llvRT3i~XHCSshnU~Bs%au_euxb(j%@pfvEFekcLaw{S@|$~DCIe#F;IlS zwEQsRwR?o!s>E-iWdEEA;+aR;Ey<3#OJOZe zKg#ZO&0HGMK98}U>`2NoNx_PcCOHwO{$+-*^a@wlE-8a-p{^xZwFl>Be z$ok^%QTRrh(erUOkgOsrAIC5~4ZaMqDcY1!#ty@Rfo1=DAr_9$lcg?zc9_GSa`A|m zzR)vW8Y(pW(`nKs`%eA zW{9y*uwcB}LHagFyz&I={kK>nC>GbKAkqHlbrb-fB}d+u#$AUbcVVMi(koNa3p@zk z%#&S*V+y74(uoP+rDf7UNd9M%$*nLOPV32WVOB5eZ6Y$XYdg_BP;aT`NqZvrpfJqp zc;|?3!>o4Yd|6fXQgkPYRV64-5_e$bSS2;DOvz=p8#xQax4CSlCfErvytH>(-KUf!I-TPwoKiIhP zrIvB+B-XR^oJEt^^~Q=_;=&{}ZOS^){b`uP4(}AFUt?)v=F@om5lwsZY4*3OlXn40 z>~Y~HZrf<>$)OM@6wj7Jcz&lyp3LeQvv!HADa4_#dndE{Rid{g<&i)-xP>h}bnvOL zSTdOnZ>l$>Tkdu%)6McenDy`sgf^*=r%ss(*1{Z(Wo8&aB@Lc#T`_`=l zCph<~0zjYO+(W+!7?n6DIM+SLCNz_#W8Bmjd!8+FS}j3mlu;q32b`CC;CXfz9k=`V zd3L8fy4m6d)Y0eZRW%FUwMi|jh%)GjgjMOGs| zZ#U=;uMhFui|l42f4BJRMJ5l^#tAm1p0aJrZi9^1*x*288S+nXqYw_jYrSCEz)RGg z2IK8~F<~0}#dvGCc>E>S)L6G$yz>%krcu}`zJG}g$UH?=+t-vnB8E<9gG=Z4ye3*!7vO?ZIw=Cll%?%U8WktldfT)tckMMv}RjQ2WF%uxa zNszszgA}Zs$!d8spW08wv?;xmUtdKjpGpWkwp?mO1M(qq#5>~6e3qZN>7&aOHsm!J zCim_Z@4m*G84LE1P^xF-uN9fEBgE;~F0W%Edt$E`Lm`g0zD(&5Vp}PEdY|~2LI|_q z8wii>6E{(~>qGGvg+F{K=2M6Rtq0y6-btP1AZ=;{&K=%&unO*P$o{yW>-^K za}HZle?39dK~y>dm|08}fSwzjD2%zR?oCU6MlHAy7&rnGFERQc1kzO3!sw5mT0mm= z?i_(uc0uXJD_BsKX#vi77SI#}))*P-b^t0u4&fYRWDoOFW9=j7#9MQr`J6l_%Fkmr zgk+Xac)PXCMR~Z21eTgy+*D-o=q*Y`tU|HT3 zqU{3K&$~^$vVaA=tHs&{n484}QD!0QdUGjljzgPIO47z%0#md(9&L^xjHc_%E{t1~t0P?i`6Ea_R+|mE;cS^J!zk%(h}AqZ37Kb^e4IO*^A{8lnmQBOIY{P_Fj%H zVfU7KUxHZxyX76$p)|0$@33CChM(Dp9^vXZg0$p8Yv7S%1agpL(H~FalJ?>8JJB83 zdWBCLcH9ojQy6{}CDt!8%8S8ES%$k5StRSJ0u}$crEFYj=%g=WrCywH{W4ZJt#qT4 zD7&1M%ZNEq;m?(_lYAKbe~cF^m$BjH^(LNbBglxX38K|z*u#fFl0$8$$_*je@Mm?8pcJtJrJNrxwyt2W8W$!M3@KnY zdMmsuDFbO2!R^9$v3(`hD!)t+SG|iTZ(f~3{gCGW6)f>C^rB7Y#L9Qsy~e@`BDe}{ zJzsQR1*rf-!po~zS46*F#cncAzam<_2L_R(hbu7&Iy__w|1w;@GE=Rind0Dk z7$?hSip15xZr)7MX0<#2tQF%{vw@}c$BES}v(j{GuyP5}8nq-J6zVE#*g)@ck+X)~ z?cMwQtZWiod@cJMG4=IpS*W=ZT!kc)V?7)UwP&~gSu~%N!r#|Iu&&P) zBi6B22K4=T>)4}B=l=pRV5i#O$uM9){VT;`jgZ~J?LBmyRt|CX8|d9y$l53B$4hXF z7Q8cFD`Z!@C9RhwRJA{sVKcX+c`Q;A{YFX2>)GctU7lXgHr3B}YJ?NijtT35#iks? z&I?oLl@IXRewt&w>F z`>+hRc#x5UfzR!dXsPrf*Qtct^jq!ofe2B}pxuefY+((|z4-CY z7S_r96hAI*Vb#2^i_ER8irbtuvKidX&WpAhG)}p8)xLUj+{2#D8{JK>-5v=&= z2ds5dhcI9NMufS-en$2|bC(rM_M!M1-)ZxY;t8~}(Kfb`*z@c*Hlmg!2bp#(#aYGl zIfd19F>yOvb>Ct#1Cji~o|sL2ERRNU@;`6~6a9902mYc#L+2PO701);Ya-D2=>WSg zj&bt20h({`U@dAmW7Gkp?@K_I*~wlu{xw0&*~!{@^Tby>S%diFQao(Q6&br&vofwf zh3LJDW!|k_B_jJG@CJw1z3rr{EhHG<(v@xr|7+4}k4OzF+5HTph_iRSPMr~_B((@?|LDPoC)sPJR0^iJwLLSjWsUf zioU(LJK4#0=RXnH$42=a6$DM0zAp;wEm;b=b8X)THxbNj?LK4~J|~&xwh!4ozAq(_ zN#_tBeHium`||TlqU(M(w2bqz>0a^he)uMpB!JkmpWS=4%MD;*?Rbox!ZRHGsakr0 zUPyKKl1%qmR#cz&5v!bNy3fI?ls1I;?vH@DgAfou`w_d-SUpADa)7lXzn7^8u#}ts zvRHqBRq&}hrF`HXQFMT1gdEnwbWbReRqrf$Z%dBEG)=$rF@xaBuVj0N?Eh4)C;M#N zuse&62*@2!*v{xTWB~!E;5r_sF4!LSQ;S~tcKg^M`d@wV^h3*kbT)f%9i4Hf59zNrMnj? z>A25c=FTLrLeRk zIkTj#x%kt%&pjQDGZSru|k zEuNihiPz;#LR(1P0pLWz#Yz95lgT54gCCtC9HKkcTg)72Wcfd}r^ zo!|?~m6U{bfc=NjM_8B8FT_0dAKuY$yfbk)9fv;&3~bXuuOAY!3~*)Ng0Uh z4!kZ2Jraea2z|~nuP=eLqE#F<-`g?Cq=T(^9@bu?``2v(8i1{@=<>e&oMn}9%G)ba zidcmV=Vn7CVX-VWWLLz~T+yzGwZL144-~Nu-LwFe`wdcCO(BXZ*}Fuxtgii;47CHc z%!hHHbPl(UvYNGKzl_$mz1*bN9y9K)FsSvYm6DEkGgN?R#SzF=*Pe}u)TFW4+7 z8U<;`S(-Qg!)wn{5=d92rSTX790_{}wW&R3)TyzYD!CkRbe7k z$daah! zyPk?Tfc)ootb0v~WI~`ij;;pNK^$Eb*@Fm27D%V6jFYOW<|kP}q=2(0S?x%y#`n>M z-}gPc<%XDkuun{(VNy?*d{D*|!~xY)mxU0Cr&vb%>zZ2CVcpyzDITZ^)7B2r?i9;x zyIAMqB0$+L+Y_jY`Hg5QM|w?aC9!~RC8(}jS&>@#(ka!-9jDleNV_JTjwa~4r&-%b z-XEt~*MWc9E_6OFBA@6*h+P@*0#)jFngaYUD&`5GRgwV`0J6szS_48G6azmkI)l|U zSZ(o-@Lxt)?FSXwKVaHNe8dl|7KJbVfWZ+3cV6fJ@guA1!ytyFB>opS{D{jK5RU%w zlJK?qt8tQ0&g%_9%z6DUQ7^%tz(`3*Aqk1{{L?8dC845*kpuZ<35UZTDUokyM83s1 zq|)Z)irk-YAJ4=vN=RrYJIH7s@RD)}`K9cpv_w_Q^(=X4T2=~K@dSO8g)LAciLAv& zLKeQaJqP~Zrvv<*fi=~UK&%0@y=0PZbe7ets7-H% zC&8~Sy*)K#Lj^^ONe#1QeT$ zVr{SO#RI!y&(ExS+q@TmG@Yk1I^b@LM95mKg(xKxKQBy`nd!jMz!XVG%y54n2qAsh z{ktI%&#|We-!fi1$HtVOMO9&dn)X!s1=1hL6<3^R6Dvk?aEr{INap7AY=QAoSfu~L zT8jA>*nK)OHGcIpl;Gc-Td?dGfEX`^3;JJV3Eub}PWss2SbQ>p|2=`fLt&FdJ}Z6` zk;0Fa)!{_m#+VTnnMwRA%DpX#XH&Q~iMONlKa%(@@l#(U=&51RCz%g2UWTfY%;(iV zuFC)kJqdOIw%@ZdWh?QZOi8fA^2<}XVrmNiyYXsRl=DMJK-k95?=hx_#T-AMW4sa; z-OBQ3fxS3dmjBb3iD@U5Uvcwf)hBTJ?Es4woe-NP%iF1HKv&@na{NkzL*f8BDtFV!=#9Pig)f6NDlUFflo7fTA*XPqL-mFLY{FQ#gPILZnR zp}EHP)G_ACG#mn@H1hFBTE0wUl!mDWH~76!@I-lD&q#Zb*g3$#Y;cpAU{|~c8t>cE0VEfcYRCTs5nvs>6CZQoQe7BPzA~Rg_2*aSFSzv=FV!C@RP@f^J&cn= zEX?5jub(V=(CI8+fCSkqgj!{%W>qJh`m#WX84}*IjA%?iu%M%LD~a6ra2jR!x95tlGWnIpys*fq!f!E(z*kjxmH5>&D0f}1 zc!5%p`)w6|v#}s7+E(RHk-Xkgl{bo?C(F19<78Fv?4q!!U5)oQeh-UD)%X?k)zWIb zmhoFyd{&L$N%7VJ{wc-NvUs5UTe^?@cA>|=fFcR)p1Y8dv{Kw+-@4ApU&2a{-DzuA*W_khe1435)It-ZTnN1-T4!61;Vc ze?gR02jd~!o#bswA#QD~EMBY58&YI%b^aiQ*Vo_!DSWF2uS;RIa^6bfryA&BL^{^w z^2>GQycNZ>H9-(0uByrNYb?_Z#2ODBA^-KOH28c<9#{cHYw?9}`0xw~hIihsDpe`CMZu*rE>b zLIwNk@ZQF|VNt&>uUl~yeQdzy1?AMllQ^2J;=Z~(GgFdRt}=lfN+gwRy{8L!brlY5 z)#c5MgJH3^innU~B8P3f^?0uFO|E#ns`oDObv<6rcn=cu3hx9Fst-!6hW)xeuU}y` zRhtkbxemp$oP*R{e6Sl{eU~kSY$!djN6M{!OsI$B~E4p6=wpkw*q6u$Lm{jZPtsXoibGK;GivcGa zg%z4=Wt`nu4Cv$SBJOF*`=za=L?SAk8;1KQWQ>1ZSX8~k+gK!A$!{n82VcnxsKM2m zaj%yWg3b9I6o#7fAryYA!&_VM1qA4A$>&JG`K=V7brl~>fFpEx;3__g03U13dw7kF zVUf4jTU)Hz>8(YPqP^aBAOI8sjPypkyuZ+=>(_X%5i{EGYQ~1J_~#Kc>U~%(k9a#9 z+rr|PBi@F__OST%6K_@VU|ar0V2h+I4poxy^!m5TX0inPq$Ca`cHoq^yzv1f<~QC< z3ST?p%@89`d7FxaZ@oRe2SopGy~E;XNKOLyhu?ayCV{j5XAHo~Hm_>z!wmhacb4%X z5VkQV?hK2e|MK2u>!f!D99^(1?;7Yb*NL=I{hR#%g~*xM9W|BZ)2 zi>5=`!5VakLjN|^f%asX8n91Br`Cn?rZhsMy}i14nX9Qx^ecGULkd=w2V)9j1~vox zqAaeqJ?rJDN)k?by_UG@TE6AFWis7S4N8S>LzQorZ7^)l)!s?y4C!4?q{eXE6Bf^A z8JPtGuH$9B#@?_P*OC8$u;Bhq{BEzYKP*1&46*i6SX}JP@AvK(OWNS7VioOF9c#V) zgoEAOo-C=a2|-0;aN>A1l$|c%cM#mZ9#R$6-E}=bT6NQ9F)!%XmG|>fPkSdD)x_Z& zpkzT_JbNR*J^qX%FMhm{-}9GM+5xV-Iruu!64MmqO#`u_F0W?Mp0y*6R>ov6yopz* zNodbayiQ3B`gTXlRzf^>=T%5duIbM2sG_uclQs^ZWgAjY&%x}el=S93_#-r9F6n{6 z0VMYI;6E8hFgM=J$494+e${Bn{QfA&Ew{kL@)dDP!iysBuorLE^yHNZscJo=$&%BP zXSIsVhgs-mJ2W(irAb19T>4;J-km(9Hc!o0b7_vqpNPkBPW8kTjNzPiE2epbU2o+d z87IRc*o)UUHe&+p#cQOdjllubfFev?ffRg+2u62)7aRyD8*jbTv_%~6K6n}Wa=K`T@*QJI{=*zE;pY)~oC$2czLR&WtGbcl zjS>F|`ck6h|Bimb@QGM6M_&?m_2aebmH?uaBfgF(RZa=w?S9}-bocgt;B|y2`|fkzsWd@71CgCi>n6m1mk>IbR5W^_r3lG0o5iTdnms` z`0nPFj0^DSx|U;VGzAG;OQT?x1I)mSpofzHJhV286}&Y<`<@PNLe)_yzOlVBRabDc=v~ zHyHnt`5ohEhuHrqR$TY+CPdr!?%_8YOTxl;FCP`ZRm!rXQ1pcz6gfRpqu5 zTZZte(S@HL!aMse(07UhL6SS8^XCn9E4OKdVdByiVDL#;{B0QTM;N>@jQ>o$K7Bav zO1=K|aNat@WpGn2mtvTlsGb68DYHPFGJcdY=05&({0WKw=V8G|@H57DVR3#0zpjCl zZ3K>^Yl=}N7XCLS&w?FscL6D|5V#*h=8WWz(tQ$NjpTbX7fN1X_9SJYs0~(y>gGpq z;T7@WC|Csp%-%+O$>uq@hhQ|X)j;YAI5|q@7qCW9yU^j47Ec|| zQ#4RpdaxR$Sk6qbYBZE+u>GmgyeBOyt{uahX3f_aLFLBEg*X{ceUXZoQ^;ze!ylG}>pOMyXl3VwSW1&dThgZos-t4LqG+oj{8GBlUmsu1^fOd+6gKh#W zOJ-vLB5}_QF=-r@JL7Z3rg6MxXRV^3`6;$D0|Q%9T4*?W>?u-e)p3U-Ov&tx59Xu$E49oE;cwwh?@F8z#CDG&prTl1?zNrkawZ*xd*{YCtekwKgcsG zEhBN*!iY90k+BD-w$D7mD~h@g@g4CqUIPrxAU{0JgCg)SkFTzzI@k=ipNx^0pTej? z_c$5$$tdUyG5BGg7QZ7ZDP7EXn3s<~bcV+=;yN04*!g+2Oc)Uc6D#A>^%WEc!oJYA`>AaK^S1X`Idd3e^ zutDPF(?@xOv}Gjm{HKVz=o-qCqNe|2JRsUU#*<0`h^LPM(4c&YkNxMv1+P8EcX~+< zj(VIA^IfC{N|`Lae4MxUjh7PkN)lU*Li}Oh0oevAao-8?PEnGhz|27}XRIXDnR#VI_i*A9jZjsD7o-2MG&-WXDgbVgO!JqaTPvnX_!+a`* zrzi1RqEaq@jv{a7MkNk;QYHTOWK`n2PpQNkCq^Zf`3E8sa>c9v;47(^+b6l1t0;Zp z(<(iCvYTE@bbmp8RPaxgIr^EX%m!2VR6c>4D*njl)x|ecu;xI?kL5)HMO8aUG<^=E z8xRwpb0M6%2Z^>*Rp!*GZe|PugT(bODv10SqaaGbqOIsPO+hZ276loD%E0LgV&!xf zB7(|@87gzr3^%hFDv!)m5PN1uL6nNhllcnrP(EKwZGYx99?Hy-{a+74oNRq(B!3l2 zHaL)5Q0I02k@wmc6njIn#U2)kFyjIN(4}S48hA#>u#|EkCeDq9$eAlT%;NiuXL3c_ zY?ub~D3{g*?Pl|OzI=*d_JDP|%RVd~v67rR8(JR14YQ#XJcXwn=kVWUIG2wwp1{I% zE-#-brvt6%7ZlFr+-v0T5L@Q)?9`RJQKbDi#-sVbgQM{@{BF^9KJOA-t<$lCmr3a| zo-mPl4Yh0WX0Dh&pEtJOq9zB?I-D`1Po&_24c#_J+a~VBwt+8PdnqfR)^&^M3w`sG ze@d>Xynt5??H~YLMosgJE(zPWv{bVn8XYtNhmTMI1P4|O{)H;)!p2ra#xqRUhF?~d zV6;c;a*Qr|5&tZGn}SrMJ$)|;Af~*{(;La3fW6=yZ7<#lgiw{*AdzW7L#Jk;Y zT^g#^rz9loHoQzMT*$lm^J#x(XqKs(w0gHFvxqlJlzkRps2?fUF5;`JET*;xQ494D z2RQISs9qpGrik*2-mAavb zNNT;T^J8XC){swF5btYV!PLyg@xpMtZ(LR)MvuVl79a z!nIyYRN-CD1GS|rBXTH=;CUm7Bg-M~aWU$$oM$8{jN%kVV)SxePSXNjUlNIDm-8ky z6y3cfP;h9|K?zwmaO1! z5$u2h9!_;yLdS;G+#t>u@T#?BOTg5ImbTbTS7Q^>KB^s8uXI@y`>+vN3o)cfi?oQW z1vW(6+?Bk^t+HA4THV`9j=_jU<;HYqz`Thrm?VPAQ4>T{Xnc`9$UaUS2nKmO2a%kd z$42{?ViV$B9=v6b%z@1%9@`B;jB}X)`pFT!pK`%Q*qZE$M-ye#saKA68tZCYdrS}@ z;Gwac^DfT_9g?3)8w!$%rYICWA=8O9{-}o6)CmabIQ_DSqyv7&!$DC01hgz0z>?u0 z&s7cx17J)xI;wMJDu4@-Om{2qh=rzP)L?I=5RK7MnG9yp(LE~nkdA6#nTl@@s@&tT zz%muNMJo3s0^IHELd#@CPpIs(`eO|(Q;~Z{h{ybfS*R5I*6t(L5cMA#UuAjZV{18KR3~qxm{2L-eJrA6V=7Je@5=oRW); zF4j>QqK|cSC57nY*j$;4k_%Ptj#yxsirlTcLaL8-wuauSqkGiHhjdgXgY$Ltpvpb2 zqZ(MIqUa)(domVSrXu%*$~`OVk3h?0M9-+~i~3^?EmM(uLFI& zHSj!He{VXIXLIe5%DI9c9mQxzFlOElZF!+fE$S+Y~oU@L=j38A8%u`fgZ6%z6 zQ98|pMi+>DDXt|Ivf?1=#jERZZbgz+#lKz0D~H~p+Planb!Z~N)*Q;qB2yHm17yMD zw#U#cpo3B!dgEA%?0-HC(+<+(U}fu)5#*{nvS1Xl(-mEGKRArz(;xbV1rroND2S6Z z5za}FoP+DEWq;G9JeqUpdY(&h4yr?I$3T?m(DD#1FL2ESiKRUvK zj<-_vdnrl;gh)vx0woQFj~A|nJFuR&tR?v!y+O(lIwvb0rNWr6M<8I34VDhmo?=-nt+@^TDDB!Ha`5J?$LD`Ig}gTedVMxJ3n$Bf^^yQMrY zd0(FRX8y&wB6|}YY!FV_#9O7!mo)T(T9IFQa8%pGJ6tc>1ll$Agv!M#iR6Gc67}a% z0W`!^FM{|+g6YAYB1V&6P^Kqg6Kx-+iO~D-0$Vv>q-^HtmFK7|Dv%cFz<_)Oai6!! zH|FGuI-6l+$qkDxo3U&?G*1lM%v-lUIS+i~->JT?=0W$uLz{Zni~6QgGOdOEve5}+ zVK1ScMgkiA`DWg%;d2VaUP;CryP@6^es&%|qdMnaOgg8%pwS{*}br=;@!n`k8wc}Qh8-|uqTX|X+MN&eRX&Od|OTQ#F zu@sfWL_=`Bw9_$88Wmf(TkPJ-gCW@~;1-iOhO~DoSJn|>33Om=ZOVFsDUhrXkHfeG zj|y~_%b(OCiYHw>TxJYdcs3@$x+al@*>60bE5>|)J>2KuC-VWXNG$ik2jnXS1MCO9 zNk|eK9D$|&U!%8VmwyK~(&DU=RHdhf1ErHylL>+&LL40E4X|Obrb(NTqKO=W_z9ZG zzIFO0p}R*iR&nObl27t#{!7V{_t{DZ7B6vNgYCS2#~EZTBAE)eSNR*vV%VO}kgVP; zEIu1}PLN=gf)?)bGNR_i8TIgz{@er+hO^=_VJyaGf0Zr&`I zCrM%1p&MjtE!j4iXtXDuo4P|R-ObzhrxF}S6r3NCI&H^`dw7K&5)Lj5ct{BygayA! z@X#3pNi=e~rvCT(=c?hYyp$0SQ@pY#p*DGVdx0QIoxG!9@E+dVTWvqJ0DC7N5Rk;5 zJd*)IJBMFEHtvPL3Y?k#wHMw62&?VG`znX%BjkfnWE)OXKGF%PNV5;f0=XZp|NA~( zx6;G~l0bKei)0bH6HS-_0kMbz8Rlgl|y zLWX~}YUL5Hu;2G)iea;OlDL0ANPapLF+Z$R|@ zh@Y>i_AcqgV>7aUNjeoJvG~bc@!}`&K;4&H@ZBeTp<#gF z(+=^*73VDjV&E=pEUBNs$^RMVi$lC#wZg5)l>X_(I!h9-g~+-En~Uua!)!P+SM)i| zZ>)Td>P4s0{~!QVQTiv*Uj+ZR!)U?p%f*x<5SEBHKLWqWNW5U)5x&$&*+m7=j0V25 z=PeaOkAl&5VISlu{AEAP6%~*1V5bF3f!ELm9xywu=0|nx0Xt>19hF>8CdU^~PL;`t zI$7i#;}whrONBTFmqvu&9^QOl6Y zey6gU$7Ll24;|-anXzM=c=`mIhVbnZ@RUNhD=KWYV;hx2L`WDHFuG<0O|nu(rv_o; z>Ij9{=z=Y7C{rq5bod5t^(z;O`QPw8?JurIDRzB({~8MScpjqg$Ms15>o zAr4MU_y!{HB9AkcZF4>axx}G!c>Y$iUtzD8rIjw#Z}@9)3S|Ct3@qlQD+x~ znbq8Dz`gZ7ZnZbUtHp2Jn&`3z&PKH`nnAkFdQVKVtl{yRZ+eIxr+5XC6=zlQpC`P7 z*j6nMI|#`saB4YmXPmXE@<|#!ey3ry8dWJ<;qDr5^@~3w^HKS0@m5$DWKuzmYSX=Dt$Ky6Mun%x4WNH+}`aRbr0JF$s3g3h{)`s-6~`VdLsT zTM1`J&liLeE zPqIGriV3M!g@THH>q@V9GuiTqx64||;{Ed0)q4B^69bwf+zo$2Te;4QRltFk5@tY8S3E=X@;#o2-9!aw*8?)lXTZgS$Vs)C; zGj$sCd+tDHwpSIB%EW=gR#nlyqSaWGKVmhm;y}D)8_p`w-UI~4Et zv_VPJn5dj?H8l`+OSf7C9r){kCN;x}Z($x!bp`*{5vwD?pGvptQdqf?)q%o(m7wJz zd=a6G=@pj8lcv5q0=OinycS4L5=+vp3Ziu-5Vd<{E8hL6C1t9QhE}#_QlY*Kt98iv z_%UEcG)x6K?n2lbjcXhgPeZ&>RQxsku7SVJrr*;Q;R%qhBElcMeotr0L);$~4;#6|B%V$?pMuJOg!jFNI=Frj=2Dz?gd) zHXirzsO%ww1`Ho{?|^Ot?#rH!Y>>k<8zC_9EJR4CizPL|IJK%+8KJvJjvO;+$cO>s zvKyjq`Cm%1-$TEtu(892j2P76;c?kxyNnojbN1Z;9y}y__@J>54jDA=-unhTbl;E> zFM^VN0RKGxvhX*2V94 z_r>8Zpq>=K$EB(;Emdp?TKx(#t6R+LTUt&byQZ9|Tf=&?+xLjmDDsx~dnzDILs%JM zV}t>OqXs-YeB^*ZJ;7q0r6@U>(vU~YJ`gOIJ;vjij5uMMT~_>F!^*k~Ts1s98+<;N zIMYUmOs9G4H1PWfiP=6tNc~M8oz-b$N8Uf??(9(m#@!qF&Z?l`Jr!`2%c^D6OfDEv z(;DjScLOr0<2e|L!bxe0-T}mkZqMrYG=%AhV=Ua9Jz&sS9m+A|l<_#qqLvi_mXJD; zCep638a8+O;5ywWaR>?dKXe@o%u2GUJVK&oRz=h${@&24ES|r@s!--M<{gr0FBB}f z!rJb2<9kGI9jjekhc@9#ijWSr8TYevZKJljUH$cL0z=2 zXH7EpR~DP=S;5Nfb#w0?K49$FLD>k#3>Y`$f$Xvw!l-XG^tZ`SWsXBXWshqxM2xRz zRj7$doPo3rZK2*SKA^h##Uu5tRle4s6%Cu3$)aroYm(2A8i?;}U_D-^Ddc!tsx5U`a#kc{AzSEWalMV3NH>m!{T-Mwy_fdZpFY=oS?H zuC!JdwX2J?W>(O+p?X2(%ib*=a98o1#zyqRoBg~DeAPat_(Oeou{vx&kOEvW&LEjMGX_9ud!ODF0JR66R0DRQ<4i-U1N1j z4z+Kln65WM8dhU;d=kP8FNU4RlY?aW-|XgoPbPk?M;Jutz0V7K-7% zLYRug#^`Ngzzc|1gD4(8^1`RNH-|9mVVUc>5~Qzz(22viBxge>jy;i> z__c`Fj)L!mI8EUpOKj+7)k<}~>+8Z5{MyZW65h2|!4o~K-^X9`8<>Q8G5hX&M>ZTZ zYGlKK_m3DfocPw`S+qgneka0CfSGuWitj~8v=Xljx6+NG4dTFuR#n5ZvEbZ?)&>}x zHu^meAp1px)bx1>G5dO!AtdCEBMd~PvrT?aEyRn%*F|~{q(6#~^pFJzn<5;0?|`Pw zTeNnG^fiPCDOI|$S9?w%As9*U)Q9XN{&A?$9&s8-YGid8V~-g(WblBy$AKtg4p=yQ z1@i6t*xF?*-y&W=XzdC)A0}d&pq4al()7w^&0Dl=b=81@cMr-Q?BpjSpE}uzrxc5) zBTg-F^6Mi`YTex~)e=y#f*U2%=5}1v`Wy?6vrP2)90U5yE^+L0t8LSz=y)1S-{G$={+#$p{KklOq zjm4#wxVgw`Z6JK62n!Hw74D<>ncX7!sP(|j&iDNw2Wj4P;(dz6dlie{Tr7Tz8y5$T zTGzXHlG+}ODt8^?Bx0Rj2GN|%(~u7h|c`Nn(lpGTy@-PXMhfm9JhKUU5$2A zdzYY}%cup>kH;aDuC_$#msZo%R{NFqbR$CIgTa>Q^`$kv@>#@*|3+f|4dtVY2Ugdm9Ld4wdF-Z(7goU%FwHz7`1)NX{tEk7e9ZR$6KD2d>bPg_;% zI&k%msM+%kr20<9>Tewh=%8^XMC+dwbuB%=F@`B=d20F F{{b{PmPh~q diff --git a/schemas/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm b/schemas/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm index 14c6c1479e42122e52c5f46450de28e215c4ae9d..21ac1df91baa85e13807a9e66e677a9e7409b430 100644 GIT binary patch literal 469651 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

g8x0%ia~yg(zyjd~}eQpXlpGC6#VeFsPfk;BU+y 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 od7nokwT*=ra&5ejmd~ji50({r~b_W~Ptos_N?M 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 RF5n(KkFB;ZUc)!*{{^D*#yJ20 diff --git a/schemas/edict-provider/package/v1/provider-manifest.echo.json b/schemas/edict-provider/package/v1/provider-manifest.echo.json index bb3cbcad4..70ec7d72a 100644 --- a/schemas/edict-provider/package/v1/provider-manifest.echo.json +++ b/schemas/edict-provider/package/v1/provider-manifest.echo.json @@ -87,13 +87,13 @@ "artifactKind": "lowerer", "resource": { "coordinate": "echo.dpo.lowerer/component@1", - "digest": "sha256:4b594a8165079f0a973741b9e27b468cf041f4ad53108fccae641dc35355bd2a" + "digest": "sha256:d48bb8c5fd54e963dcc4cadc66d656b92b7ae76728f92c891fa3082aef25c393" }, "source": { "kind": "component", "component": { "coordinate": "echo.dpo.lowerer/component@1", - "digest": "sha256:4b594a8165079f0a973741b9e27b468cf041f4ad53108fccae641dc35355bd2a" + "digest": "sha256:d48bb8c5fd54e963dcc4cadc66d656b92b7ae76728f92c891fa3082aef25c393" } } }, @@ -178,13 +178,13 @@ "artifactKind": "verifier", "resource": { "coordinate": "echo.dpo.verifier/component@1", - "digest": "sha256:d0be4d283399aefc45d75b395b3568f9983521ca5543c9dfd23b9495758050ed" + "digest": "sha256:e6f29e90fc324ea80b2a3c8d56ea34e7d6833be599cec8ab27910c43d1837456" }, "source": { "kind": "component", "component": { "coordinate": "echo.dpo.verifier/component@1", - "digest": "sha256:d0be4d283399aefc45d75b395b3568f9983521ca5543c9dfd23b9495758050ed" + "digest": "sha256:e6f29e90fc324ea80b2a3c8d56ea34e7d6833be599cec8ab27910c43d1837456" } } } diff --git a/xtask/src/provider_lowerer_component.rs b/xtask/src/provider_lowerer_component.rs index 1ed2a24b3..0c3e29d23 100644 --- a/xtask/src/provider_lowerer_component.rs +++ b/xtask/src/provider_lowerer_component.rs @@ -53,7 +53,7 @@ const PINNED_CARGO_COMMIT: &str = "840b83a10fb0e039a83f4d70ad032892c287570a"; /// Reviewed identity that the portable promotion command is permitted to install. pub(crate) const APPROVED_CHECKED_COMPONENT_SHA256: &str = - "4b594a8165079f0a973741b9e27b468cf041f4ad53108fccae641dc35355bd2a"; + "d48bb8c5fd54e963dcc4cadc66d656b92b7ae76728f92c891fa3082aef25c393"; pub(crate) const CHECKED_COMPONENT_REPOSITORY_PATH: &str = "schemas/edict-provider/components/v1/lowerer.echo-dpo.component.wasm"; @@ -62,7 +62,7 @@ pub(crate) const VERIFIER_CHECKED_COMPONENT_REPOSITORY_PATH: &str = "schemas/edict-provider/components/v1/verifier.echo-dpo.component.wasm"; /// Approved SHA-256 identity of the checked verifier component. pub(crate) const APPROVED_CHECKED_VERIFIER_COMPONENT_SHA256: &str = - "d0be4d283399aefc45d75b395b3568f9983521ca5543c9dfd23b9495758050ed"; + "e6f29e90fc324ea80b2a3c8d56ea34e7d6833be599cec8ab27910c43d1837456"; #[derive(Clone, Copy, Debug, Eq, PartialEq)] struct ProviderComponentSpec { From db91aeaa77c88863fbeb552d451aa129917cba88 Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 22:19:25 -0700 Subject: [PATCH 17/23] Refresh exact current-package occurrence hash after component publication --- crates/echo-wesley-gen/tests/provider_package.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/echo-wesley-gen/tests/provider_package.rs b/crates/echo-wesley-gen/tests/provider_package.rs index 48a7fe2e0..dfafb6b21 100644 --- a/crates/echo-wesley-gen/tests/provider_package.rs +++ b/crates/echo-wesley-gen/tests/provider_package.rs @@ -65,7 +65,7 @@ const SEMANTIC_DIGEST: &str = const RELEASE_DIGEST: &str = "sha256:c39449495281b51f978468d08c21e93bcfa423176063b41675da61e4674b0066"; const PACKAGE_ARTIFACT_SHA256: &str = - "0e58e22e034ce81ecbb57d085505ab314c769bcda24b2d06bfa77d9062729116"; + "09dd57c8119fa138325a87d7e2d9bfaa69276d5f24844420b2be2e03f8efe608"; const OTHER_PACKAGE_ARTIFACT_SHA256: &str = "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"; @@ -302,6 +302,10 @@ fn checked_materials_assemble_one_digest_locked_provider_package() { let reordered = assemble(true); assert_eq!(package, reordered); + assert_eq!( + package.provider_reference().digest, + format!("sha256:{PACKAGE_ARTIFACT_SHA256}") + ); assert_eq!(package.members().len(), 24); assert_eq!(package.files().len(), 25); assert_eq!(package.manifest().artifacts.len(), 10); From 49971253a31a4cefe2152e65034136f92cf0ac79 Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 22:36:41 -0700 Subject: [PATCH 18/23] Fix named unsigned Int aliases in source helper judgments --- .../executable_operation/source_functions.rs | 52 +++++++++++++++++++ .../executable_operation/source_functions.rs | 51 ++++++++++++++++++ .../source_functions/types.rs | 1 + 3 files changed, 104 insertions(+) diff --git a/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs b/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs index 9fc2d21ca..0c30c8c61 100644 --- a/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs +++ b/crates/echo-edict-provider-lowerer/src/executable_operation/source_functions.rs @@ -210,6 +210,7 @@ impl Judgment<'_> { let key = name.strip_prefix(&prefix).unwrap_or(name); let definition = get(get(self.core, "types")?, key)?; match string(get(definition, "kind")?)? { + "Int" => self.ty(string(get(definition, "width")?)?, depth + 1), "Nominal" => { if string(get(definition, "contract")?)? != key { return Err(()); @@ -836,4 +837,55 @@ mod tests { ]); assert!(validate(&core, &exports, true).is_ok()); } + #[test] + fn source_functions_accept_named_unsigned_int_aliases() { + let parameter = map([ + ("id", Value::Text("arg.0".into())), + ("type", Value::Text("Count".into())), + ("alphaName", Value::Text("count".into())), + ]); + let core = map([ + ("coordinate", Value::Text("example@1".into())), + ( + "types", + map([( + "Count", + map([ + ("kind", Value::Text("Int".into())), + ("width", Value::Text("U64".into())), + ]), + )]), + ), + ("intents", map([])), + ( + "functions", + map([( + "identity", + map([ + ("params", Value::Array(vec![parameter.clone()])), + ("returnType", Value::Text("Count".into())), + ( + "body", + map([ + ("locals", Value::Array(vec![])), + ("bindings", Value::Array(vec![])), + ( + "result", + map([ + ("kind", Value::Text("local".into())), + ("ref", parameter), + ]), + ), + ]), + ), + ]), + )]), + ), + ]); + let exports = map([ + ("effects", Value::Array(vec![])), + ("pureFunctions", Value::Array(vec![])), + ]); + assert!(validate(&core, &exports, false).is_ok()); + } } diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs index 473c76ba4..fd9d77abf 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions.rs @@ -749,4 +749,55 @@ mod tests { ]); assert!(validate(&core, &exports, true).is_ok()); } + #[test] + fn source_functions_accept_named_unsigned_int_aliases() { + let parameter = map([ + ("id", Value::Text("arg.0".into())), + ("type", Value::Text("Count".into())), + ("alphaName", Value::Text("count".into())), + ]); + let core = map([ + ("coordinate", Value::Text("example@1".into())), + ( + "types", + map([( + "Count", + map([ + ("kind", Value::Text("Int".into())), + ("width", Value::Text("U64".into())), + ]), + )]), + ), + ("intents", map([])), + ( + "functions", + map([( + "identity", + map([ + ("params", Value::Array(vec![parameter.clone()])), + ("returnType", Value::Text("Count".into())), + ( + "body", + map([ + ("locals", Value::Array(vec![])), + ("bindings", Value::Array(vec![])), + ( + "result", + map([ + ("kind", Value::Text("local".into())), + ("ref", parameter), + ]), + ), + ]), + ), + ]), + )]), + ), + ]); + let exports = map([ + ("effects", Value::Array(vec![])), + ("pureFunctions", Value::Array(vec![])), + ]); + assert!(validate(&core, &exports, false).is_ok()); + } } diff --git a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs index 87b324b5c..5c7a3caa9 100644 --- a/crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs +++ b/crates/echo-edict-provider-verifier/src/executable_operation/source_functions/types.rs @@ -190,6 +190,7 @@ impl<'a> Types<'a> { let resolved = name.strip_prefix(&prefix).unwrap_or(name); let definition = get(get(self.module, "types")?, resolved)?; match string(get(definition, "kind")?)? { + "Int" => self.resolve(string(get(definition, "width")?)?, depth + 1), "Nominal" => { let identity = string(get(definition, "contract")?)?; if identity != resolved { From 4d8dc13ee66012ca72e481a17deb7a074a729571 Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 22:36:41 -0700 Subject: [PATCH 19/23] Refresh checked package root and exact manifest byte golden --- .../v1/edict-provider/package/v1/provider-manifest.echo.json | 2 +- crates/echo-wesley-gen/tests/provider_package_corpus.rs | 4 ++-- schemas/edict-provider/package/v1/provider-manifest.echo.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json index 70ec7d72a..13a4be2ef 100644 --- a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json +++ b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/provider-manifest.echo.json @@ -3,7 +3,7 @@ "providerAbi": "edict:target-provider@1.0.0", "provider": { "coordinate": "echo.edict-provider@1", - "digest": "sha256:945376a32cb52425388cb7f5ca71ee6a8622a8448f40bb02cae7482834ca974c" + "digest": "sha256:09dd57c8119fa138325a87d7e2d9bfaa69276d5f24844420b2be2e03f8efe608" }, "artifacts": [ { diff --git a/crates/echo-wesley-gen/tests/provider_package_corpus.rs b/crates/echo-wesley-gen/tests/provider_package_corpus.rs index 098935813..1baa0ab8a 100644 --- a/crates/echo-wesley-gen/tests/provider_package_corpus.rs +++ b/crates/echo-wesley-gen/tests/provider_package_corpus.rs @@ -11,9 +11,9 @@ use std::sync::atomic::{AtomicU64, Ordering}; use sha2::{Digest as _, Sha256}; const EXPECTED_PROVIDER_DIGEST: &str = - "sha256:0e58e22e034ce81ecbb57d085505ab314c769bcda24b2d06bfa77d9062729116"; + "sha256:09dd57c8119fa138325a87d7e2d9bfaa69276d5f24844420b2be2e03f8efe608"; const EXPECTED_MANIFEST_RAW_SHA256: &str = - "12be23c8ffcac95ed7bc51bbdf5497b72891650bdd7a4439bcb79c15fbcfa971"; + "c284bc650620a6455177d678202df507ec53e96a9e0312403a80cd29aa49bfbd"; const PACKAGE_PATHS: [&str; 25] = [ "components/lowerer.echo-dpo.component.wasm", diff --git a/schemas/edict-provider/package/v1/provider-manifest.echo.json b/schemas/edict-provider/package/v1/provider-manifest.echo.json index 70ec7d72a..13a4be2ef 100644 --- a/schemas/edict-provider/package/v1/provider-manifest.echo.json +++ b/schemas/edict-provider/package/v1/provider-manifest.echo.json @@ -3,7 +3,7 @@ "providerAbi": "edict:target-provider@1.0.0", "provider": { "coordinate": "echo.edict-provider@1", - "digest": "sha256:945376a32cb52425388cb7f5ca71ee6a8622a8448f40bb02cae7482834ca974c" + "digest": "sha256:09dd57c8119fa138325a87d7e2d9bfaa69276d5f24844420b2be2e03f8efe608" }, "artifacts": [ { From bc51676102f1225de5fedec8dccf75376e9b417e Mon Sep 17 00:00:00 2001 From: James Ross Date: Wed, 7 Oct 2026 22:47:51 -0700 Subject: [PATCH 20/23] Publish Int-aware component pair and regenerated package identity --- crates/echo-edict-provider-lowerer/README.md | 4 ++-- crates/echo-edict-provider-verifier/README.md | 4 ++-- .../lowerer.echo-dpo.component.wasm | Bin 457033 -> 457154 bytes .../verifier.echo-dpo.component.wasm | Bin 469651 -> 469772 bytes .../package/v1/provider-manifest.echo.json | 10 +++++----- .../echo-wesley-gen/tests/provider_package.rs | 2 +- .../tests/provider_package_corpus.rs | 4 ++-- schemas/edict-provider/README.md | 8 ++++---- .../edict-provider/components/v1/README.md | 8 ++++---- .../v1/lowerer.echo-dpo.component.wasm | Bin 457033 -> 457154 bytes .../v1/verifier.echo-dpo.component.wasm | Bin 469651 -> 469772 bytes .../lowerer.echo-dpo.component.wasm | Bin 457033 -> 457154 bytes .../verifier.echo-dpo.component.wasm | Bin 469651 -> 469772 bytes .../package/v1/provider-manifest.echo.json | 10 +++++----- xtask/src/provider_lowerer_component.rs | 4 ++-- 15 files changed, 27 insertions(+), 27 deletions(-) diff --git a/crates/echo-edict-provider-lowerer/README.md b/crates/echo-edict-provider-lowerer/README.md index 2a840c6c2..07b9343aa 100644 --- a/crates/echo-edict-provider-lowerer/README.md +++ b/crates/echo-edict-provider-lowerer/README.md @@ -138,8 +138,8 @@ proposal constructor supports mutations and refuses a `Query`; authored reads remain a separate bounded observer/optic path and must never be represented as synthetic mutations. -The refreshed 457,033-byte checked lowerer component has SHA-256 -`d48bb8c5fd54e963dcc4cadc66d656b92b7ae76728f92c891fa3082aef25c393` and has +The refreshed 457,154-byte checked lowerer component has SHA-256 +`dc3edc7c4f194bd2fdd2b5a1ecc79f8fb7a24a5a31294a1f1fc30369c053b8d4` and has crossed the reproducible promotion boundary. The pinned Edict host admits its generated envelope under the owning `generated-artifact` CDDL root, and the isolated host fixture exercises the exact helper binding, typed codecs, EINT diff --git a/crates/echo-edict-provider-verifier/README.md b/crates/echo-edict-provider-verifier/README.md index 3e59714e1..747bcc9c3 100644 --- a/crates/echo-edict-provider-verifier/README.md +++ b/crates/echo-edict-provider-verifier/README.md @@ -108,9 +108,9 @@ route's fixed 64 KiB output ceiling. The `wasm32` guest adapter vendors Edict's exact frozen `edict:target-provider/verifier@1.0.0` WIT world and performs only exhaustive -transport-to-model conversion. Its reproducibly built 469,651-byte checked +transport-to-model conversion. Its reproducibly built 469,772-byte checked component has SHA-256 -`e6f29e90fc324ea80b2a3c8d56ea34e7d6833be599cec8ab27910c43d1837456`. +`23d1d256ec66138697f93babcd2be57a4f56de1eb2d1fb6910e5aef881c4dd0e`. Component identity and admitted host replay remain separate propositions: the pinned Edict host preflights the request artifacts and declared output schema, invokes the checked component, then admits and manifests each returned accepted diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/lowerer.echo-dpo.component.wasm index 9ac319d0ae40401402c9055bced3b587532565de..555e4dcf64d4d2275907f9427e3c6eb30506ee83 100644 GIT binary patch delta 463 zcmX^4N&3)d=?zA#Ob?%IHep@G%Ji~r^8>E(a;6tTnBwGJDIsXol#(NcDoBu*@ku_Ao;kx%Upn4fz|Np|A@@Jx>Blo#cLn+tRW)Q=pKCv-00=796rnhm?!4Z9eDm|Hs3=BpL3=Gp41sME+^dBJK0Ezz=$X7$+zXS5kk@#D-|J7piIR^mNplDYB delta 393 zcmX@~S^DHB=?zA#OfMd9Hep@G%JiXi^8>E(a;Eo!nx3vrwu=d%jS4!{(%MtM`nR}4Gj$pN{qY=P7I3dJiOcrjJgaAj!f>n zj0%jJ%o0uvK@gSzP?l%%qc&wRPLO_(A~rW(1_cI37BeOW9`4D~?dgnslbhRJ7i~Fic|o#9Uk!=>7RWb8;&0wwrp@Ma F4ggg4UF`q> diff --git a/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm b/crates/echo-wesley-gen/assets/v1/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm index 21ac1df91baa85e13807a9e66e677a9e7409b430..74fe228fd44c4b9b6975aaf763d763c7d7ca0c7b 100644 GIT binary patch delta 424 zcmYk2PfG$p7{+Jj-Cb>F*A^lu5S)zu95U(>-D*H1_s~ZOyn5&()JBB_C4q;xONTCk zmk>g{D!FPzU_o6v_AQdIaWU)gFo$P;&-1=-=`DWo9mLm$veKa!!Gj0*VqD;U2bMS&Y+JHr7ER(Fg*B|TAVp*N*@F35t}RFrqO2W< zNTQ4lMr>OH*rTw3=>WFqB%TJ4rVc&^u&$qe0Ou<)Ax*WJcW;kNz41d2o!PIJ!siVB|qgjXk2Z*E+^pzx&hN5}5 ge5NaGj@X67^k1}|WOOF0(CmVip=H*aUF$XX0~{P{KmY&$ delta 342 zcmYk1Jxjw-6ozx}dv9%WQ>fHhgn+RsDCp2dq#!nfiunx=x;pt2;s+K%rPARDg4m^_ z2t~3MY>b%{K^Lv)-_Sv?V#VR*9L~pkp0oex)E}ISWy!W$zWkJIciUH0UokBn`Ux=5`KmY7W+9gGg8brsWw;iVQchHH3Y zh8wn}XX%b%oK_;t(`y7tXAvq)(OZO)4!LXWP1(wo-t2m|u^9w^yQXsCoj2Qo;URk* z=uS~AWF+;+7#5at1sw@E)E8q?Gn8VCDW!UcOE(a;6tTnBwGJDIsXol#(NcDoBu*@ku_Ao;kx%Upn4fz|Np|A@@Jx>Blo#cLn+tRW)Q=pKCv-00=796rnhm?!4Z9eDm|Hs3=BpL3=Gp41sME+^dBJK0Ezz=$X7$+zXS5kk@#D-|J7piIR^mNplDYB delta 393 zcmX@~S^DHB=?zA#OfMd9Hep@G%JiXi^8>E(a;Eo!nx3vrwu=d%jS4!{(%MtM`nR}4Gj$pN{qY=P7I3dJiOcrjJgaAj!f>n zj0%jJ%o0uvK@gSzP?l%%qc&wRPLO_(A~rW(1_cI37BeOW9`4D~?dgnslbhRJ7i~Fic|o#9Uk!=>7RWb8;&0wwrp@Ma F4ggg4UF`q> diff --git a/schemas/edict-provider/components/v1/verifier.echo-dpo.component.wasm b/schemas/edict-provider/components/v1/verifier.echo-dpo.component.wasm index 21ac1df91baa85e13807a9e66e677a9e7409b430..74fe228fd44c4b9b6975aaf763d763c7d7ca0c7b 100644 GIT binary patch delta 424 zcmYk2PfG$p7{+Jj-Cb>F*A^lu5S)zu95U(>-D*H1_s~ZOyn5&()JBB_C4q;xONTCk zmk>g{D!FPzU_o6v_AQdIaWU)gFo$P;&-1=-=`DWo9mLm$veKa!!Gj0*VqD;U2bMS&Y+JHr7ER(Fg*B|TAVp*N*@F35t}RFrqO2W< zNTQ4lMr>OH*rTw3=>WFqB%TJ4rVc&^u&$qe0Ou<)Ax*WJcW;kNz41d2o!PIJ!siVB|qgjXk2Z*E+^pzx&hN5}5 ge5NaGj@X67^k1}|WOOF0(CmVip=H*aUF$XX0~{P{KmY&$ delta 342 zcmYk1Jxjw-6ozx}dv9%WQ>fHhgn+RsDCp2dq#!nfiunx=x;pt2;s+K%rPARDg4m^_ z2t~3MY>b%{K^Lv)-_Sv?V#VR*9L~pkp0oex)E}ISWy!W$zWkJIciUH0UokBn`Ux=5`KmY7W+9gGg8brsWw;iVQchHH3Y zh8wn}XX%b%oK_;t(`y7tXAvq)(OZO)4!LXWP1(wo-t2m|u^9w^yQXsCoj2Qo;URk* z=uS~AWF+;+7#5at1sw@E)E8q?Gn8VCDW!UcOE(a;6tTnBwGJDIsXol#(NcDoBu*@ku_Ao;kx%Upn4fz|Np|A@@Jx>Blo#cLn+tRW)Q=pKCv-00=796rnhm?!4Z9eDm|Hs3=BpL3=Gp41sME+^dBJK0Ezz=$X7$+zXS5kk@#D-|J7piIR^mNplDYB delta 393 zcmX@~S^DHB=?zA#OfMd9Hep@G%JiXi^8>E(a;Eo!nx3vrwu=d%jS4!{(%MtM`nR}4Gj$pN{qY=P7I3dJiOcrjJgaAj!f>n zj0%jJ%o0uvK@gSzP?l%%qc&wRPLO_(A~rW(1_cI37BeOW9`4D~?dgnslbhRJ7i~Fic|o#9Uk!=>7RWb8;&0wwrp@Ma F4ggg4UF`q> diff --git a/schemas/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm b/schemas/edict-provider/package/v1/components/verifier.echo-dpo.component.wasm index 21ac1df91baa85e13807a9e66e677a9e7409b430..74fe228fd44c4b9b6975aaf763d763c7d7ca0c7b 100644 GIT binary patch delta 424 zcmYk2PfG$p7{+Jj-Cb>F*A^lu5S)zu95U(>-D*H1_s~ZOyn5&()JBB_C4q;xONTCk zmk>g{D!FPzU_o6v_AQdIaWU)gFo$P;&-1=-=`DWo9mLm$veKa!!Gj0*VqD;U2bMS&Y+JHr7ER(Fg*B|TAVp*N*@F35t}RFrqO2W< zNTQ4lMr>OH*rTw3=>WFqB%TJ4rVc&^u&$qe0Ou<)Ax*WJcW;kNz41d2o!PIJ!siVB|qgjXk2Z*E+^pzx&hN5}5 ge5NaGj@X67^k1}|WOOF0(CmVip=H*aUF$XX0~{P{KmY&$ delta 342 zcmYk1Jxjw-6ozx}dv9%WQ>fHhgn+RsDCp2dq#!nfiunx=x;pt2;s+K%rPARDg4m^_ z2t~3MY>b%{K^Lv)-_Sv?V#VR*9L~pkp0oex)E}ISWy!W$zWkJIciUH0UokBn`Ux=5`KmY7W+9gGg8brsWw;iVQchHH3Y zh8wn}XX%b%oK_;t(`y7tXAvq)(OZO)4!LXWP1(wo-t2m|u^9w^yQXsCoj2Qo;URk* z=uS~AWF+;+7#5at1sw@E)E8q?Gn8VCDW!UcO Date: Thu, 8 Oct 2026 00:09:45 -0700 Subject: [PATCH 21/23] test: execute provenance-bound public source-function artifacts --- .../application-contract-hosting.md | 2 + .../source_functions_public_runtime.rs | 312 ++++++++++++++++++ 2 files changed, 314 insertions(+) create mode 100644 xtask/examples/source_functions_public_runtime.rs diff --git a/docs/architecture/application-contract-hosting.md b/docs/architecture/application-contract-hosting.md index 24f5520b4..1a00667de 100644 --- a/docs/architecture/application-contract-hosting.md +++ b/docs/architecture/application-contract-hosting.md @@ -344,6 +344,8 @@ reports and reproduction coordinates. Reversed input ordering, invalid runtime representations, package substitution, noncanonical input, and exhausted host budgets produce errors without returning an application result. +The guarded public source-function consumer in `xtask/examples/source_functions_public_runtime.rs` selects the complete compiler evidence by an externally supplied SHA-256. It binds the original literal cases and exact repeated package/report bytes to that selection, checks verifier approval and artifact-domain bindings, and consumes the same owned byte vectors through the public pure and immutable-read interpreters. The read witness selects an explicit frontier and aperture and checks unchanged state. These results establish private computation and reading evidence; they do not claim installation, a decided Tick, a causal Receipt, or physical power-loss durability. + The paired nominal-ID and variable-payload equality witnesses in [`edict_byte_equality_tests.rs`](../../crates/warp-core/tests/edict_byte_equality_tests.rs) consume separately verified packages built from Jim-owned source using the diff --git a/xtask/examples/source_functions_public_runtime.rs b/xtask/examples/source_functions_public_runtime.rs new file mode 100644 index 000000000..cc79debac --- /dev/null +++ b/xtask/examples/source_functions_public_runtime.rs @@ -0,0 +1,312 @@ +// SPDX-License-Identifier: Apache-2.0 +// © James Ross Ω FLYING•ROBOTS +#![allow(clippy::print_stdout)] +//! Consumes unchanged public compiler package/report pairs; never synthesizes IR. +use anyhow::{anyhow, bail, ensure, Context, Result}; +use echo_edict_canonical::{ + decode_canonical_cbor_v1 as decode, digest_canonical_value_bytes_v1 as digest, + encode_canonical_cbor_v1 as encode, CanonicalValueV1 as Value, +}; +use sha2::{Digest, Sha256}; +use std::io::Read; +use std::path::Path; +use warp_core::edict_pure::{self, EvaluationError, EvaluationLimits}; +use warp_core::edict_read::{ReadBasis, ReadView}; +use warp_core::{ + make_node_id, make_type_id, AtomPayload, AttachmentValue, GraphStore, NodeKey, NodeRecord, + WorldlineFrontier, WorldlineId, WorldlineState, +}; + +fn field<'a>(value: &'a Value, name: &str) -> Result<&'a Value> { + let Value::Map(fields) = value else { + bail!("expected map"); + }; + fields + .iter() + .find_map(|(key, value)| (key == &Value::Text(name.into())).then_some(value)) + .context("missing field") +} +fn text(value: &Value) -> Result<&str> { + let Value::Text(value) = value else { + bail!("expected text"); + }; + Ok(value) +} +fn bytes(value: &Value) -> Result<&[u8]> { + let Value::Bytes(value) = value else { + bail!("expected bytes"); + }; + Ok(value) +} +fn hash(value: &Value) -> Result<[u8; 32]> { + bytes(value)?.try_into().context("expected bytes32") +} +fn resource(value: &Value, id: &str) -> Result<[u8; 32]> { + ensure!(text(field(value, "id")?)? == id, "wrong resource identity"); + let Value::Array(values) = field(value, "digest")? else { + bail!("expected digest pair"); + }; + ensure!( + values.len() == 2 && text(&values[0])? == "sha256", + "wrong digest algorithm" + ); + hash(&values[1]) +} +fn record(fields: impl IntoIterator) -> Value { + Value::Map( + fields + .into_iter() + .map(|(key, value)| (Value::Text(key.into()), value)) + .collect(), + ) +} +fn read(path: &Path) -> Result> { + let metadata = path.symlink_metadata()?; + ensure!( + metadata.is_file() && metadata.len() <= 1_048_576, + "unbounded/nonregular witness input" + ); + let mut data = Vec::new(); + std::fs::File::open(path)? + .take(1_048_577) + .read_to_end(&mut data)?; + ensure!( + data.len() <= 1_048_576, + "witness input grew above its bound" + ); + Ok(data) +} +fn emitted(root: &Path, evidence: &serde_json::Value) -> Result<(Vec, Vec)> { + let name = root + .file_name() + .and_then(|name| name.to_str()) + .context("variant name")?; + let result = &evidence["results"][name]; + ensure!( + result["firstBuild"]["exitCode"] == 0 + && result["firstBuild"]["diagnostics"] + .as_array() + .is_some_and(|items| items.is_empty()), + "compiler/verifier did not succeed" + ); + let package = read(&root.join("executable-operation-package.cbor"))?; + let report = read(&root.join("verification-report.cbor"))?; + for (filename, data) in [ + ("executable-operation-package.cbor", &package), + ("verification-report.cbor", &report), + ] { + let expected = result["firstBuild"]["artifacts"][filename] + .as_str() + .context("missing emitted digest")?; + ensure!( + result["repeatedBuild"]["artifacts"][filename].as_str() == Some(expected), + "repeat did not corroborate exact bytes" + ); + ensure!( + hex::encode(Sha256::digest(data)) == expected, + "retained emitted bytes changed" + ); + } + Ok((package, report)) +} +fn checked_pair(package: Vec, report_bytes: Vec) -> Result<(Vec, [u8; 32])> { + let value = decode(&package)?; + let report = decode(&report_bytes)?; + ensure!( + text(field(&report, "apiVersion")?)? == "echo.operation-package-verifier-report/v1", + "wrong report ABI" + ); + ensure!( + text(field(&report, "outcome")?)? == "accepted" + && bytes(field(&report, "diagnosticBytes")?)?.is_empty(), + "verifier did not accept" + ); + let pin = resource( + field(&report, "package")?, + "executable-operation-package.echo", + )?; + ensure!( + pin == digest("echo.operation-package/v1", &value)?, + "report/package mismatch" + ); + let closure = field(&value, "semantic_closure")?; + let target = field(&report, "targetIr")?; + ensure!( + ["echo.span-ir/v1", "echo.span-ir/v2"].contains(&text(field(target, "id")?)?), + "unsupported Target IR role" + ); + ensure!( + resource(target, text(field(target, "id")?)?)? + == hash(field(closure, "target_ir_identity")?)?, + "report/Target IR mismatch" + ); + let program = decode(bytes(field(&value, "program")?)?)?; + let projection = decode(bytes(field(&program, "result_projection_artifact")?)?)?; + ensure!( + resource( + field(&report, "applicationResultProjection")?, + text(field(&value, "operation_coordinate")?)? + )? == digest("edict.result-projection.artifact/v1", &projection)?, + "report/projection mismatch" + ); + let _ = resource(field(&report, "diagnosticAbi")?, "edict.diagnostics/v1")?; + Ok((package, pin)) +} +fn limits() -> EvaluationLimits { + EvaluationLimits { + max_package_bytes: 1_048_576, + max_input_bytes: 32_768, + max_steps: 16_777_216, + max_allocated_bytes: 67_108_864, + max_output_bytes: 32_768, + } +} +fn pure(root: &Path, name: &str, reversed: bool, evidence: &serde_json::Value) -> Result { + let directory = root.join(name); + let (package_bytes, report_bytes) = emitted(&directory, evidence)?; + let (package, pin) = checked_pair(package_bytes, report_bytes)?; + let case_bytes = read(&root.join("pure/cases.json"))?; + let case_hash = hex::encode(Sha256::digest(&case_bytes)); + ensure!( + evidence["results"]["pure"]["casesSha256"].as_str() == Some(case_hash.as_str()) + && evidence["selectedInputs"]["pureCasesSha256"].as_str() == Some(case_hash.as_str()), + "original literal cases changed" + ); + let cases: serde_json::Value = serde_json::from_slice(&case_bytes)?; + ensure!( + cases["schema"] == "jedit.range-fragment-assembly-cases/v1" + && cases["operation"] == "jedit.text.replace_range@1.assembleRange", + "unexpected authored case identity" + ); + let cases = cases["cases"].as_array().context("cases")?; + ensure!(cases.len() == 12, "expected twelve literal cases"); + for case in cases { + let first = hex::decode(case["firstHex"].as_str().context("firstHex")?)?; + let second = hex::decode(case["secondHex"].as_str().context("secondHex")?)?; + let input = encode(&record([ + ("firstFragment", Value::Bytes(first.clone())), + ("secondFragment", Value::Bytes(second.clone())), + ]))?; + let actual = edict_pure::evaluate(&package, pin, &input, limits()); + if case["refusal"].as_str() == Some("input-type") { + ensure!( + actual == Err(EvaluationError::InvalidInput), + "expected input-type refusal" + ); + continue; + } + let expected = if reversed { + [second, first].concat() + } else { + hex::decode(case["bytesHex"].as_str().context("bytesHex")?)? + }; + ensure!( + decode( + &actual + .map_err(|error| anyhow!("pure runtime refused: {error:?}"))? + .output + )? == record([("bytes", Value::Bytes(expected))]), + "wrong literal assembly output" + ); + } + println!("PUBLIC_PURE_RUNTIME_OK {name} {}", cases.len()); + Ok(cases.len()) +} +fn atom_read(root: &Path, evidence: &serde_json::Value) -> Result<()> { + let (package_bytes, report_bytes) = emitted(&root.join("read"), evidence)?; + let (package, pin) = checked_pair(package_bytes, report_bytes)?; + let mut store = GraphStore::default(); + let node = make_node_id("public-source-function-read"); + let ty = make_type_id("document"); + store.insert_node( + node, + NodeRecord { + ty: make_type_id("node"), + }, + ); + store.set_node_attachment( + node, + Some(AttachmentValue::Atom(AtomPayload::new( + ty, + b"alpha".to_vec().into(), + ))), + ); + let key = NodeKey { + warp_id: store.warp_id(), + local_id: node, + }; + let frontier = WorldlineFrontier::new( + WorldlineId::from_bytes([7; 32]), + WorldlineState::from_root_store(store, node)?, + ); + let before = frontier.state().state_root(); + let basis = ReadBasis::at(&frontier); + let aperture = [key]; + let view = ReadView::new(&frontier, basis, &aperture) + .map_err(|error| anyhow!("view refused: {error:?}"))?; + let input = encode(&record([ + ( + "address", + record([ + ("warpId", Value::Bytes(key.warp_id.0.to_vec())), + ("nodeId", Value::Bytes(key.local_id.0.to_vec())), + ("typeId", Value::Bytes(ty.0.to_vec())), + ]), + ), + ("expected", Value::Bytes(b"alpha".to_vec())), + ]))?; + let result = warp_core::edict_read::evaluate( + &package, + pin, + &input, + &view, + warp_core::edict_read::ReadLimits { + evaluation: limits(), + max_reads: 1, + max_read_bytes: 5, + }, + ) + .map_err(|error| anyhow!("read runtime refused: {error:?}"))?; + ensure!( + decode(&result.output)? == Value::Bytes(b"alpha".to_vec()), + "wrong stored-atom result" + ); + ensure!( + result.basis == basis + && result.reads == 1 + && result.read_bytes == 5 + && frontier.state().state_root() == before, + "wrong read evidence or mutation" + ); + println!("PUBLIC_READ_RUNTIME_OK 1 5"); + Ok(()) +} +fn main() -> Result<()> { + ensure!( + Path::new("/.dockerenv").is_file(), + "run inside the guarded copied-source Docker worker" + ); + let root = std::env::args_os() + .nth(1) + .context("expected retained public compiler work root")?; + let selected = std::env::args() + .nth(2) + .context("expected independently selected compiler evidence SHA-256")?; + let root = Path::new(&root); + let evidence_bytes = read(&root.join("evidence.json"))?; + ensure!( + hex::encode(Sha256::digest(&evidence_bytes)) == selected, + "compiler evidence selection mismatch" + ); + let evidence: serde_json::Value = serde_json::from_slice(&evidence_bytes)?; + ensure!( + evidence["outcome"] == "public-compiler-and-provider-verifier-accepted", + "compiler witness incomplete" + ); + pure(root, "pure", false, &evidence)?; + pure(root, "renamed-pure", false, &evidence)?; + pure(root, "changed-body", true, &evidence)?; + atom_read(root, &evidence)?; + println!("PUBLIC_SOURCE_FUNCTION_RUNTIME_ACCEPTED"); + Ok(()) +} From f69f560c6caeececf12aeb7eb443432d77a35be7 Mon Sep 17 00:00:00 2001 From: James Ross Date: Thu, 8 Oct 2026 00:11:22 -0700 Subject: [PATCH 22/23] test: satisfy strict public-witness Clippy gate --- xtask/examples/source_functions_public_runtime.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xtask/examples/source_functions_public_runtime.rs b/xtask/examples/source_functions_public_runtime.rs index cc79debac..5a8a9b913 100644 --- a/xtask/examples/source_functions_public_runtime.rs +++ b/xtask/examples/source_functions_public_runtime.rs @@ -86,7 +86,7 @@ fn emitted(root: &Path, evidence: &serde_json::Value) -> Result<(Vec, Vec Date: Thu, 8 Oct 2026 00:23:40 -0700 Subject: [PATCH 23/23] fix: resolve named integer types in shared runtime parser --- CHANGELOG.md | 2 + crates/warp-core/src/edict_pure/syntax.rs | 1 + .../tests/edict_source_functions_tests.rs | 65 +++++++++++++++++++ .../application-contract-hosting.md | 5 +- 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c026c7cb8..aabe85c22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,8 @@ ### Fixed +- Private Edict runtime decoding resolves named integer types through their declared width, matching source-function provider acceptance. + - Filesystem writer takeover preserves unused LSNs after empty epochs and refuses unreconciled tails before changing the epoch ledger. - Incremental snapshot state roots now include the existing v1 domain separator and agree with canonical snapshot hashing. Previously emitted incorrect accumulator roots are not migrated. diff --git a/crates/warp-core/src/edict_pure/syntax.rs b/crates/warp-core/src/edict_pure/syntax.rs index 557dcd45c..02766c18b 100644 --- a/crates/warp-core/src/edict_pure/syntax.rs +++ b/crates/warp-core/src/edict_pure/syntax.rs @@ -46,6 +46,7 @@ impl Parser<'_> { .unwrap_or(name); let definition = field(self.types, name)?; match text_field(definition, "kind")? { + "Int" => self.ty(text_field(definition, "width")?, depth + 1), "Nominal" => self.ty(text_field(definition, "representation")?, depth + 1), "Bytes" => { let min = field(definition, "min").map_or(Ok(0), number)?; diff --git a/crates/warp-core/tests/edict_source_functions_tests.rs b/crates/warp-core/tests/edict_source_functions_tests.rs index c5828660c..d88c24d04 100644 --- a/crates/warp-core/tests/edict_source_functions_tests.rs +++ b/crates/warp-core/tests/edict_source_functions_tests.rs @@ -261,6 +261,71 @@ fn factored_concat() -> (Vec, [u8; 32]) { }) } +#[test] +fn source_functions_named_int_alias_executes_in_a_helper_signature() { + let (original, _) = factored_concat(); + let (package, pin) = rewrite(original, |_, core, _| { + let coordinate = match field(core, "coordinate") { + Value::Text(value) => value.clone(), + _ => panic!("coordinate"), + }; + insert( + field_mut(core, "types"), + "Count", + record([("kind", text("Int")), ("width", text("U64"))]), + ); + let parameter = local("arg.0", "Count"); + insert( + field_mut(core, "functions"), + "identityCount", + function( + vec![parameter.clone()], + "Count", + vec![], + vec![], + reference(¶meter), + ), + ); + let saved = local("local.count", "Count"); + let value = record([ + ("kind", text("const")), + ( + "value", + record([ + ("kind", text("int")), + ("width", text("U64")), + ("value", Value::Integer(7)), + ]), + ), + ]); + let body = field_mut(field_mut(field_mut(core, "functions"), "join"), "body"); + set_field(body, "locals", array(vec![saved.clone()])); + set_field( + body, + "bindings", + array(vec![record([ + ("kind", text("let")), + ("binding", saved), + ( + "value", + call(&format!("{coordinate}.identityCount"), vec![value]), + ), + ])]), + ); + }); + let result = evaluate( + &package, + pin, + &concat::input(b"ab", b"cd"), + concat::limits(), + ) + .expect("named Int parameter/result must decode and execute"); + assert_eq!( + decode(&result.output).unwrap(), + record([("bytes", Value::Bytes(b"abcd".to_vec()))]) + ); +} + #[test] fn source_functions_nested_forward_calls_and_bindings_use_fresh_parameter_frames() { let (package, pin) = factored_concat(); diff --git a/docs/architecture/application-contract-hosting.md b/docs/architecture/application-contract-hosting.md index 1a00667de..6df22056f 100644 --- a/docs/architecture/application-contract-hosting.md +++ b/docs/architecture/application-contract-hosting.md @@ -300,7 +300,10 @@ retains each nominal type's contract identity, which must match its resolved Core type-table key. Equal representations do not permit assignment, arguments, returns or comparisons across distinct nominal identities, or between a nominal type and its representation. Same-nominal byte and unsigned-word comparisons -use the ordinary representation costs. Runtime values carry no additional +use the ordinary representation costs. Named `Int` definitions resolve through +their declared unsigned width in both provider judgments and the shared +pure/read runtime type parser, under its existing depth and work limits. +Runtime values carry no additional nominal tag; materialization, validation and encoding bounds remain based on the representation. Both bounded-read provider judgments preserve nominal identity even when the optional source-function table is absent; basis and address roles inspect physical representation only at their explicit role checks. Boolean, string, list, variant and effectful helper forms receive provider refusal.