From 01923a9de8987fb2b120f36dff1ff0b3459d0a34 Mon Sep 17 00:00:00 2001 From: cedric Date: Wed, 12 Apr 2023 11:24:18 +0200 Subject: [PATCH 01/45] Override built_mir method to have mutable access to mir --- prusti/src/callbacks.rs | 11 +++++++++++ prusti/src/driver.rs | 1 + prusti/src/mir_modify.rs | 42 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 prusti/src/mir_modify.rs diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index f8018ade5ee..a8e07504e6f 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -1,4 +1,6 @@ use crate::verifier::verify; +use crate::mir_modify; + use prusti_common::config; use prusti_interface::{ environment::{mir_storage, Environment}, @@ -59,6 +61,7 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { config.override_queries = Some( |_session: &Session, providers: &mut Providers, _external: &mut ExternProviders| { providers.mir_borrowck = mir_borrowck; + providers.mir_built = mir_modify::mir_built; }, ); } @@ -109,6 +112,14 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { ); }); } + // can we modify ast? just stealing it does not work obviously.. + // queries.global_ctxt().unwrap().enter(|tcx: TyCtxt<'tcx>| { + // let (resolver, mut krate_rc) = tcx.resolver_for_lowering(()).steal(); + // let krate: &mut Crate = Rc::get_mut(&mut krate_rc).unwrap(); + // // let _visitor = MutVisitor; + // tcx.arena.alloc(Steal::new((resolver, Rc::new(krate.clone())))) + // }); + Compilation::Continue } diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index 8f11f730094..e02dda3db6a 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -13,6 +13,7 @@ mod arg_value; mod callbacks; mod verifier; +mod mir_modify; use arg_value::arg_value; use callbacks::PrustiCompilerCalls; diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs new file mode 100644 index 00000000000..3589117597b --- /dev/null +++ b/prusti/src/mir_modify.rs @@ -0,0 +1,42 @@ +use prusti_rustc_interface::{ + interface::DEFAULT_QUERY_PROVIDERS, + middle::{ + ty::{self, TyCtxt}, + mir::{ + Body, + visit::MutVisitor, + }, + }, + span::def_id::LocalDefId, + data_structures::steal::Steal, +}; + + +/// Compute the main MIR body and the list of MIR bodies of the promoteds. +pub(crate) fn mir_built( + tcx: TyCtxt<'_>, + def: ty::WithOptConstParam, +) -> &Steal> { + // is it our job to store it? + let steal = ((*DEFAULT_QUERY_PROVIDERS).mir_built)(tcx, def); + let mut stolen = steal.steal(); + + let mut visitor = InsertChecksVisitor { tcx }; + visitor.visit_body(&mut stolen); + + tcx.alloc_steal_mir(stolen) +} + + +struct InsertChecksVisitor<'tcx> { + tcx: TyCtxt<'tcx>, +} + +impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + fn visit_body(&mut self, body: &mut Body<'tcx>) { + self.super_body(body); + } +} From 613db7140412e824ae254300cbddc12b13b477eb Mon Sep 17 00:00:00 2001 From: cedric Date: Mon, 1 May 2023 08:27:41 +0200 Subject: [PATCH 02/45] Change a single assertion to test output --- prusti/src/callbacks.rs | 3 +-- prusti/src/driver.rs | 1 + prusti/src/mir_modify.rs | 37 ++++++++++++++++++++++++++++++------- 3 files changed, 32 insertions(+), 9 deletions(-) diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index a8e07504e6f..b6f6e6c6f48 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -1,5 +1,4 @@ -use crate::verifier::verify; -use crate::mir_modify; +use crate::{mir_modify, verifier::verify}; use prusti_common::config; use prusti_interface::{ diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index e02dda3db6a..fbab42123bc 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -8,6 +8,7 @@ #![feature(proc_macro_internals)] #![feature(decl_macro)] #![feature(box_syntax)] +#![feature(box_patterns)] #![deny(unused_must_use)] mod arg_value; diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index 3589117597b..598df0362c9 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -1,14 +1,14 @@ + use prusti_rustc_interface::{ + data_structures::steal::Steal, interface::DEFAULT_QUERY_PROVIDERS, middle::{ - ty::{self, TyCtxt}, - mir::{ - Body, - visit::MutVisitor, - }, + mir::{visit::MutVisitor, Body, Operand, Location, Constant, + ConstantKind, BasicBlock, BasicBlockData}, + mir::interpret::{Scalar, ConstValue}, + ty::{self, TyCtxt, ScalarInt}, }, span::def_id::LocalDefId, - data_structures::steal::Steal, }; @@ -18,6 +18,7 @@ pub(crate) fn mir_built( def: ty::WithOptConstParam, ) -> &Steal> { // is it our job to store it? + println!("mir built is called"); let steal = ((*DEFAULT_QUERY_PROVIDERS).mir_built)(tcx, def); let mut stolen = steal.steal(); @@ -27,7 +28,6 @@ pub(crate) fn mir_built( tcx.alloc_steal_mir(stolen) } - struct InsertChecksVisitor<'tcx> { tcx: TyCtxt<'tcx>, } @@ -36,7 +36,30 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { fn tcx(&self) -> TyCtxt<'tcx> { self.tcx } + fn visit_body(&mut self, body: &mut Body<'tcx>) { + println!("Mir body: {:#?}", body); self.super_body(body); } + + fn visit_basic_block_data(&mut self, block: BasicBlock, data: &mut BasicBlockData<'tcx>) { + self.super_basic_block_data(block, data); + } + + fn visit_operand(&mut self, operand: &mut Operand<'tcx>, location: Location) { + match operand { + Operand::Constant(box c) => { + if let Constant{ literal, .. } = c { + if let ConstantKind::Val(value, ty) = literal { + if ty.is_bool() { + println!("found a boolean constant!"); + *value = ConstValue::Scalar(Scalar::Int(ScalarInt::FALSE)) + } + } + } + }, + _ => {} + } + self.super_operand(operand, location); + } } From 531842a592965bc53c997b8b0e964c1b00a7833a Mon Sep 17 00:00:00 2001 From: cedric Date: Wed, 3 May 2023 14:27:26 +0200 Subject: [PATCH 03/45] Add runtime checks for preconditions and insert them in MIR --- prusti-contracts/prusti-specs/src/lib.rs | 16 +- prusti-contracts/prusti-specs/src/rewriter.rs | 75 +++++++ prusti-interface/src/specs/mod.rs | 29 +++ prusti-interface/src/specs/typed.rs | 5 + prusti/src/callbacks.rs | 19 +- prusti/src/driver.rs | 2 + prusti/src/mir_modify.rs | 192 +++++++++++++++--- 7 files changed, 300 insertions(+), 38 deletions(-) diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index 6f124f4cb01..2427b58a0bd 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -191,17 +191,25 @@ fn generate_spec_and_assertions( fn generate_for_requires(attr: TokenStream, item: &untyped::AnyFnItem) -> GeneratedResult { let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); + let check_id = rewriter.generate_spec_id(); let spec_id_str = spec_id.to_string(); + let check_id_str = check_id.to_string(); let spec_item = - rewriter.process_assertion(rewriter::SpecItemType::Precondition, spec_id, attr, item)?; - Ok(( - vec![spec_item], + rewriter.process_assertion(rewriter::SpecItemType::Precondition, spec_id, attr.clone(), item)?; + let check_item = + rewriter.create_check_requires(rewriter::SpecItemType::Precondition, check_id, attr, item)?; + let res = Ok(( + vec![spec_item, check_item], vec![parse_quote_spanned! {item.span()=> #[prusti::pre_spec_id_ref = #spec_id_str] + }, parse_quote_spanned! {item.span()=> + #[prusti::pre_check_id_ref = #check_id_str] }], - )) + )); + res } + /// Generate spec items and attributes to typecheck the and later retrieve "ensures" annotations. fn generate_for_ensures(attr: TokenStream, item: &untyped::AnyFnItem) -> GeneratedResult { let mut rewriter = rewriter::AstRewriter::new(); diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index 16128256439..a4f771c24fd 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -144,6 +144,71 @@ impl AstRewriter { Ok(syn::Item::Fn(spec_item)) } + pub fn generate_check_item_fn( + &mut self, + spec_type: SpecItemType, + check_id: SpecificationId, + expr: TokenStream, + item: &T, + ) -> syn::Result { + if let Some(span) = self.check_contains_keyword_in_params(item, "result") { + return Err(syn::Error::new( + span, + "it is not allowed to use the keyword `result` as a function argument".to_string(), + )); + } + let item_span = expr.span(); + let item_name = syn::Ident::new( + &format!("prusti_{}_check_item_{}_{}", spec_type, item.sig().ident, check_id), + item_span, + ); + let check_id_str = check_id.to_string(); + + // about the span and expression chosen here: + // - `item_span` is set to `expr.span()` so that any errors reported + // for the spec item will be reported on the span of the expression + // written by the user + // - `((#expr) : bool)` syntax is used to report type errors in the + // expression with the correct error message, i.e. that the expected + // type is `bool`, not that the expected *return* type is `bool` + // - `!!(...)` is used to fix an edge-case when the expression consists + // of a single identifier; without the double negation, the `Return` + // terminator in MIR has a span set to the one character just after + // the identifier + let (return_type, return_modifier) = match &spec_type { + SpecItemType::Termination => ( + quote_spanned! {item_span => Int}, + quote_spanned! {item_span => Int::new(0) + }, + ), + SpecItemType::Predicate(return_type) => (return_type.clone(), TokenStream::new()), + _ => ( + quote_spanned! {item_span => bool}, + quote_spanned! {item_span => !!}, + ), + }; + let mut spec_item: syn::ItemFn = parse_quote_spanned! {item_span=> + #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] + #[prusti::spec_only] + #[prusti::check_id = #check_id_str] + fn #item_name() -> #return_type { + assert!(#expr); + #return_modifier ((#expr) : #return_type) + } + }; + + spec_item.sig.generics = item.sig().generics.clone(); + spec_item.sig.inputs = item.sig().inputs.clone(); + match spec_type { + SpecItemType::Postcondition | SpecItemType::Pledge => { + let fn_arg = self.generate_result_arg(item); + spec_item.sig.inputs.push(fn_arg); + } + _ => (), + } + Ok(syn::Item::Fn(spec_item)) + } + + /// Parse an assertion into a Rust expression pub fn process_assertion( &mut self, @@ -155,6 +220,16 @@ impl AstRewriter { self.generate_spec_item_fn(spec_type, spec_id, parse_prusti(tokens)?, item) } + pub fn create_check_requires( + &mut self, + spec_type: SpecItemType, + check_id: SpecificationId, + tokens: TokenStream, + item: &T, + ) -> syn::Result { + self.generate_check_item_fn(spec_type, check_id, parse_prusti(tokens)?, item) + } + /// Parse a pledge with lhs into a Rust expression pub fn process_pledge( &mut self, diff --git a/prusti-interface/src/specs/mod.rs b/prusti-interface/src/specs/mod.rs index d7125c83353..75a75fb6daa 100644 --- a/prusti-interface/src/specs/mod.rs +++ b/prusti-interface/src/specs/mod.rs @@ -75,9 +75,11 @@ pub struct SpecCollector<'a, 'tcx> { /// Map from specification IDs to their typed expressions. spec_functions: FxHashMap, + check_functions: FxHashMap, /// Map from functions/loops/types to their specifications. procedure_specs: FxHashMap, + procedure_checks: FxHashMap, loop_specs: Vec, loop_variants: Vec, type_specs: FxHashMap, @@ -94,7 +96,9 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { extern_resolver: ExternSpecResolver::new(env), env, spec_functions: FxHashMap::default(), + check_functions: FxHashMap::default(), procedure_specs: FxHashMap::default(), + procedure_checks: FxHashMap::default(), loop_specs: vec![], loop_variants: vec![], type_specs: FxHashMap::default(), @@ -123,12 +127,23 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { self.determine_prusti_assumptions(&mut def_spec); self.determine_prusti_refutations(&mut def_spec); self.determine_ghost_begin_ends(&mut def_spec); + + self.determine_checks(&mut def_spec); + // TODO: remove spec functions (make sure none are duplicated or left over) // Load all local spec MIR bodies, for export and later use self.ensure_local_mirs_fetched(&def_spec); + def_spec } + fn determine_checks(&self, def_spec: &mut typed::DefSpecificationMap) { + for (local_id, check_id) in self.procedure_checks.iter() { + let fn_id = self.check_functions.get(check_id).unwrap(); + def_spec.checks.insert(local_id.to_def_id(), fn_id.to_def_id()); + } + } + fn determine_procedure_specs(&self, def_spec: &mut typed::DefSpecificationMap) { for (local_id, refs) in self.procedure_specs.iter() { let mut spec = SpecGraph::new(ProcedureSpecification::empty(local_id.to_def_id())); @@ -441,6 +456,11 @@ fn get_procedure_spec_ids(def_id: DefId, attrs: &[ast::Attribute]) -> Option Option { + read_prusti_attr("pre_check_id_ref", attrs) + .map(|x| parse_spec_id(x, def_id)) +} + impl<'a, 'tcx> intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { type Map = Map<'tcx>; type NestedFilter = prusti_rustc_interface::middle::hir::nested_filter::All; @@ -461,6 +481,9 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { if let Some(procedure_spec_ref) = get_procedure_spec_ids(def_id, attrs) { self.procedure_specs.insert(local_id, procedure_spec_ref); } + if let Some(check_id) = get_procedure_check_ids(def_id, attrs) { + self.procedure_checks.insert(local_id, check_id); + } } fn visit_fn( @@ -550,6 +573,9 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { if has_prusti_attr(attrs, "ghost_end") { self.ghost_end.push(local_id); } + } else if let Some(raw_check_id) = read_prusti_attr("check_id", attrs) { + let spec_id = parse_spec_id(raw_check_id, def_id); + self.check_functions.insert(spec_id, local_id); } else { // Don't collect specs "for" spec items @@ -565,6 +591,9 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { if let Some(procedure_spec_ref) = get_procedure_spec_ids(def_id, attrs) { self.procedure_specs.insert(local_id, procedure_spec_ref); } + if let Some(check_id) = get_procedure_check_ids(def_id, attrs) { + self.procedure_checks.insert(local_id, check_id); + } // Collect model type flag if has_to_model_fn_attr(attrs) { diff --git a/prusti-interface/src/specs/typed.rs b/prusti-interface/src/specs/typed.rs index 2041266c555..f9eef16e73a 100644 --- a/prusti-interface/src/specs/typed.rs +++ b/prusti-interface/src/specs/typed.rs @@ -20,6 +20,7 @@ pub struct DefSpecificationMap { pub prusti_refutations: FxHashMap, pub ghost_begin: FxHashMap, pub ghost_end: FxHashMap, + pub checks: FxHashMap, } impl DefSpecificationMap { @@ -59,6 +60,10 @@ impl DefSpecificationMap { self.ghost_end.get(def_id) } + pub fn get_checks(&self, def_id: &DefId) -> Option { + self.checks.get(def_id).copied() + } + pub(crate) fn defid_for_export( &self, ) -> ( diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index b6f6e6c6f48..e7e5fa401f7 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -10,15 +10,17 @@ use prusti_rustc_interface::{ hir::{def::DefKind, def_id::LocalDefId}, interface::{interface::Compiler, Config, Queries}, middle::ty::{ - self, - query::{query_values::mir_borrowck, ExternProviders, Providers}, - TyCtxt, + self, + query::{query_values::mir_borrowck, ExternProviders, Providers}, + TyCtxt, }, session::Session, }; #[derive(Default)] -pub struct PrustiCompilerCalls; +pub struct PrustiCompilerCalls { + check_ids: Vec, +} // Running `get_body_with_borrowck_facts` can be very slow, therefore we avoid it when not // necessary; for crates which won't be verified or spec_fns it suffices to load just the fn body @@ -60,7 +62,8 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { config.override_queries = Some( |_session: &Session, providers: &mut Providers, _external: &mut ExternProviders| { providers.mir_borrowck = mir_borrowck; - providers.mir_built = mir_modify::mir_built; + providers.mir_drops_elaborated_and_const_checked = mir_modify::mir_checked; + // providers.mir_built = mir_modify::mir_built; }, ); } @@ -148,7 +151,10 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { } CrossCrateSpecs::import_export_cross_crate(&mut env, &mut def_spec); if !config::no_verify() { - verify(env, def_spec); + verify(env, def_spec.clone()); + } + unsafe { + mir_modify::SPECS = Some(def_spec); } }); @@ -160,3 +166,4 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { } } } + diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index fbab42123bc..c2ad1cbc485 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -21,6 +21,7 @@ use callbacks::PrustiCompilerCalls; use lazy_static::lazy_static; use log::info; use prusti_common::{config, report::user, Stopwatch}; +use prusti_interface::specs; use prusti_rustc_interface::interface::interface::try_print_query_stack; use std::{borrow::Cow, env, panic}; use tracing_chrome::{ChromeLayerBuilder, FlushGuard}; @@ -37,6 +38,7 @@ lazy_static! { }; } + fn get_prusti_version_info() -> String { format!( "{}, commit {} {}, built on {}", diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index 598df0362c9..2bbe48f1731 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -1,35 +1,52 @@ - use prusti_rustc_interface::{ - data_structures::steal::Steal, + data_structures::{ + steal::Steal, + graph::WithStartNode, + }, interface::DEFAULT_QUERY_PROVIDERS, middle::{ mir::{visit::MutVisitor, Body, Operand, Location, Constant, - ConstantKind, BasicBlock, BasicBlockData}, + ConstantKind, BasicBlock, BasicBlocks, BasicBlockData, Statement, + StatementKind, Place, Terminator, TerminatorKind, + SourceScope, SourceInfo}, mir::interpret::{Scalar, ConstValue}, - ty::{self, TyCtxt, ScalarInt}, + mir::patch::MirPatch, + ty::{self, TyCtxt, ScalarInt, TyKind}, + }, + span::{ + def_id::LocalDefId, + DUMMY_SP, }, - span::def_id::LocalDefId, + index::vec::IndexVec, }; +use prusti_interface::specs::typed::DefSpecificationMap; +pub static mut SPECS: Option = None; -/// Compute the main MIR body and the list of MIR bodies of the promoteds. -pub(crate) fn mir_built( +pub(crate) fn mir_checked( tcx: TyCtxt<'_>, def: ty::WithOptConstParam, ) -> &Steal> { // is it our job to store it? - println!("mir built is called"); - let steal = ((*DEFAULT_QUERY_PROVIDERS).mir_built)(tcx, def); + println!("mir checked query is called"); + + // let's get the specifications collected by prusti :) + + // SAFETY: Is definitely not safe at the moment + let specs = unsafe { SPECS.clone().unwrap() }; + + let steal = ((*DEFAULT_QUERY_PROVIDERS).mir_drops_elaborated_and_const_checked)(tcx, def); let mut stolen = steal.steal(); - let mut visitor = InsertChecksVisitor { tcx }; + let mut visitor = InsertChecksVisitor { tcx, specs }; visitor.visit_body(&mut stolen); tcx.alloc_steal_mir(stolen) } -struct InsertChecksVisitor<'tcx> { +pub struct InsertChecksVisitor<'tcx> { tcx: TyCtxt<'tcx>, + specs: DefSpecificationMap, } impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { @@ -39,27 +56,146 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { fn visit_body(&mut self, body: &mut Body<'tcx>) { println!("Mir body: {:#?}", body); - self.super_body(body); - } + let def_id = body.source.def_id(); + // try to find specification function: + let check_id_opt = self.specs.get_checks(&def_id); + if let Some(check_id) = check_id_opt { + let body_to_insert: Body = self.tcx.mir_drops_elaborated_and_const_checked( + ty::WithOptConstParam::unknown(check_id.as_local().unwrap()) + ).borrow().clone(); + println!("Found body: {:#?}", body_to_insert); - fn visit_basic_block_data(&mut self, block: BasicBlock, data: &mut BasicBlockData<'tcx>) { - self.super_basic_block_data(block, data); - } + let ret_ty = body_to_insert.return_ty().clone(); + assert!(ret_ty.is_bool()); - fn visit_operand(&mut self, operand: &mut Operand<'tcx>, location: Location) { - match operand { - Operand::Constant(box c) => { - if let Constant{ literal, .. } = c { - if let ConstantKind::Val(value, ty) = literal { - if ty.is_bool() { - println!("found a boolean constant!"); - *value = ConstValue::Scalar(Scalar::Int(ScalarInt::FALSE)) - } + let mut patch = MirPatch::new(body); + let start_node = body.basic_blocks.start_node(); + println!("Start node is {:?}", start_node); + let target = BasicBlock::from_usize(1); + // let mut loc = Location { + // block: start_node, + // statement_index: 0, + // }; + // while let Some(stmt) = body.stmt_at(loc).left() { + // if let Statement { kind: StatementKind::StorageLive(_x), .. } = stmt { + // println!("good :)"); + // loc.statement_index += 1; + // } else { + // break; + // } + // } + let dest_place: Place = Place::from(patch.new_internal(ret_ty, DUMMY_SP)); + + let subst = ty::List::empty(); + let func_ty = self.tcx.mk_ty_from_kind(TyKind::FnDef(check_id, subst)); // do I need substs? + let func = Operand::Constant(Box::new(Constant { + span: DUMMY_SP, + user_ty: None, + literal: ConstantKind::zero_sized(func_ty), + })); + + // determine the arguments! + let caller_nr_args = body.arg_count; + let nr_args = body_to_insert.arg_count; + let mut arg_symbols = Vec::new(); + + for i in 1..nr_args + 1 { + 'inner: for el in body_to_insert.var_debug_info.clone() { + if format!("{:?}", el.value) == format!("_{}", i) { + arg_symbols.push(el.name.to_string()); + println!("found match for {}", el.name.to_string()); + break 'inner + } + } + } + + let mut args_symbols = Vec::new(); + // now for the caller, find ids of names: + for s in arg_symbols { + 'inner: for el in body.var_debug_info.clone() { + if el.name.to_string() == s { + args_symbols.push(format!("{:?}", el.value)); + break 'inner } } - }, - _ => {} + } + + let mut args = Vec::new(); + // now the final mapping to operands: + for s in args_symbols { + for (local, _decl) in body.local_decls.iter_enumerated() { + if format!("{:?}", local) == s { + args.push(Operand::Copy(Place { + local, + projection: ty::List::empty(), + })); + } + } + } + + + + + let terminator_kind = TerminatorKind::Call { + func, + args, + destination: dest_place, + target: Some(target), + cleanup: None, + from_hir_call: false, + fn_span: body_to_insert.span, + }; + let terminator = Terminator { + // todo: replace this with the span of the original contract? + source_info: SourceInfo { + span: DUMMY_SP, + scope: SourceScope::from_usize(0), + }, + kind: terminator_kind, + }; + let blockdata = BasicBlockData::new(Some(terminator)); + let new_block = patch.new_block(blockdata); + println!("block index: {:?}", new_block); + + patch.apply(body); + let mut reordered: IndexVec = IndexVec::new(); + println!("our block was indeed added"); + let new_block_data = body.basic_blocks.get(new_block).cloned().unwrap(); + reordered.push(new_block_data); + + for (block, data) in body.basic_blocks.iter_enumerated() { + if block != new_block { + reordered.push(data.clone()); + } + } + body.basic_blocks = BasicBlocks::new(reordered); + + + } - self.super_operand(operand, location); + + println!("Body afterwards: {:#?}", body); + self.super_body(body); } + + // This was just a test to see if changes influence the generted executable + // fn visit_operand(&mut self, operand: &mut Operand<'tcx>, location: Location) { + // match operand { + // Operand::Constant(box c) => { + // if let Constant{ literal, .. } = c { + // if let ConstantKind::Val(value, ty) = literal { + // if ty.is_bool() { + // println!("found a boolean constant!"); + // *value = ConstValue::Scalar(Scalar::Int(ScalarInt::FALSE)) + // } + // } + // } + // }, + // _ => {} + // } + // self.super_operand(operand, location); + // } } + +// create a new function call statement! + From 9dc10729de8036089394e576009fafa3d02343f5 Mon Sep 17 00:00:00 2001 From: cedric Date: Fri, 5 May 2023 16:29:16 +0200 Subject: [PATCH 04/45] Fix the problem of introducing loops in CFG when modifying it. --- prusti/src/mir_modify.rs | 72 ++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index 2bbe48f1731..146fa664722 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -8,7 +8,7 @@ use prusti_rustc_interface::{ mir::{visit::MutVisitor, Body, Operand, Location, Constant, ConstantKind, BasicBlock, BasicBlocks, BasicBlockData, Statement, StatementKind, Place, Terminator, TerminatorKind, - SourceScope, SourceInfo}, + SourceScope, SourceInfo, terminator}, mir::interpret::{Scalar, ConstValue}, mir::patch::MirPatch, ty::{self, TyCtxt, ScalarInt, TyKind}, @@ -71,7 +71,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { let mut patch = MirPatch::new(body); let start_node = body.basic_blocks.start_node(); println!("Start node is {:?}", start_node); - let target = BasicBlock::from_usize(1); + let target = start_node; // let mut loc = Location { // block: start_node, // statement_index: 0, @@ -158,19 +158,14 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { println!("block index: {:?}", new_block); patch.apply(body); - let mut reordered: IndexVec = IndexVec::new(); - println!("our block was indeed added"); - let new_block_data = body.basic_blocks.get(new_block).cloned().unwrap(); - reordered.push(new_block_data); - - for (block, data) in body.basic_blocks.iter_enumerated() { - if block != new_block { - reordered.push(data.clone()); - } - } - body.basic_blocks = BasicBlocks::new(reordered); + let old_start_data = body.basic_blocks_mut().swap(start_node, new_block); + for b in body.basic_blocks.as_mut().iter_mut() { + replace_outgoing_edges(b, start_node, BasicBlock::MAX); + replace_outgoing_edges(b, new_block, start_node); + replace_outgoing_edges(b, BasicBlock::MAX, new_block); + } } @@ -197,5 +192,54 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { // } } -// create a new function call statement! +// If we re-order the IndexVec containing the basic blocks, we will need to adjust +// some the basic blocks that terminators point to. This is what this function does +fn replace_outgoing_edges(data: &mut BasicBlockData, from: BasicBlock, to: BasicBlock) { + match &mut data.terminator_mut().kind { + TerminatorKind::Goto { target } + => update_if_equals(target, from, to), + TerminatorKind::SwitchInt { targets, .. } => { + for bb1 in &mut targets.all_targets_mut().iter_mut() { + update_if_equals(bb1, from, to); + } + }, + TerminatorKind::Call { target, cleanup, .. } => { + if let Some(target) = target { + update_if_equals(target, from, to); + } + if let Some(cleanup) = cleanup { + update_if_equals(cleanup, from, to); + } + }, + TerminatorKind::Assert { target: target_bb, cleanup: opt_bb, .. } | + TerminatorKind::DropAndReplace { target: target_bb, unwind: opt_bb, .. } | + TerminatorKind::Drop { target: target_bb, unwind: opt_bb, .. } | + TerminatorKind::Yield { resume: target_bb, drop: opt_bb, .. } | + TerminatorKind::FalseUnwind { real_target: target_bb, unwind: opt_bb }=> { + update_if_equals(target_bb, from, to); + if let Some(bb) = opt_bb { + update_if_equals(bb, from, to); + } + + }, + TerminatorKind::InlineAsm { destination, cleanup, .. } => { + // is this prettier? does this even modify the blockdata? + destination.map(|mut x| update_if_equals(&mut x, from, to)); + cleanup.map(|mut x| update_if_equals(&mut x, from, to)); + } + TerminatorKind::FalseEdge { real_target, imaginary_target } => { + update_if_equals(real_target, from, to); + update_if_equals(imaginary_target, from, to); + }, + TerminatorKind::Resume | TerminatorKind::Abort | + TerminatorKind::Return | TerminatorKind::Unreachable | + TerminatorKind::GeneratorDrop => {} + } +} + +fn update_if_equals(dest: &mut T, from: T, to: T) { + if *dest == from { + *dest = to; + } +} From d4cbd896e3b377905f53cf7d457fdf88621af935 Mon Sep 17 00:00:00 2001 From: cedric Date: Mon, 8 May 2023 15:40:05 +0200 Subject: [PATCH 05/45] Check postconditions too and handle result --- prusti-contracts/prusti-specs/src/lib.rs | 84 +++- prusti-contracts/prusti-specs/src/rewriter.rs | 47 +-- .../prusti-specs/src/runtime_checks.rs | 89 +++++ .../src/specifications/untyped.rs | 2 +- .../prusti-specs/src/type_cond_specs/mod.rs | 3 +- prusti-interface/src/specs/mod.rs | 48 ++- prusti-interface/src/specs/typed.rs | 40 +- prusti/src/mir_modify.rs | 377 +++++++++++------- 8 files changed, 495 insertions(+), 195 deletions(-) create mode 100644 prusti-contracts/prusti-specs/src/runtime_checks.rs diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index 2427b58a0bd..bfcdb8a1cfa 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -23,6 +23,7 @@ pub mod specifications; mod type_model; mod user_provided_type_params; mod print_counterexample; +mod runtime_checks; use proc_macro2::{Span, TokenStream, TokenTree}; use quote::{quote, quote_spanned, ToTokens}; @@ -159,11 +160,16 @@ fn generate_spec_and_assertions( ) -> GeneratedResult { let mut generated_items = vec![]; let mut generated_attributes = vec![]; + let is_trusted = !prusti_attributes + .iter() + .filter(|x| matches!(x.0, SpecAttributeKind::Trusted)) + .collect::>() + .is_empty(); for (attr_kind, attr_tokens) in prusti_attributes.drain(..) { let rewriting_result = match attr_kind { SpecAttributeKind::Requires => generate_for_requires(attr_tokens, item), - SpecAttributeKind::Ensures => generate_for_ensures(attr_tokens, item), + SpecAttributeKind::Ensures => generate_for_ensures(attr_tokens, item, is_trusted), SpecAttributeKind::AfterExpiry => generate_for_after_expiry(attr_tokens, item), SpecAttributeKind::AssertOnExpiry => generate_for_assert_on_expiry(attr_tokens, item), SpecAttributeKind::Pure => generate_for_pure(attr_tokens, item), @@ -194,35 +200,77 @@ fn generate_for_requires(attr: TokenStream, item: &untyped::AnyFnItem) -> Genera let check_id = rewriter.generate_spec_id(); let spec_id_str = spec_id.to_string(); let check_id_str = check_id.to_string(); - let spec_item = - rewriter.process_assertion(rewriter::SpecItemType::Precondition, spec_id, attr.clone(), item)?; - let check_item = - rewriter.create_check_requires(rewriter::SpecItemType::Precondition, check_id, attr, item)?; + let spec_item = rewriter.process_assertion( + rewriter::SpecItemType::Precondition, + spec_id, + attr.clone(), + item, + )?; + let check_item = rewriter.create_check( + rewriter::SpecItemType::Precondition, + check_id, + attr, + item, + )?; let res = Ok(( vec![spec_item, check_item], - vec![parse_quote_spanned! {item.span()=> - #[prusti::pre_spec_id_ref = #spec_id_str] - }, parse_quote_spanned! {item.span()=> - #[prusti::pre_check_id_ref = #check_id_str] - }], + vec![ + parse_quote_spanned! {item.span()=> + #[prusti::pre_spec_id_ref = #spec_id_str] + }, + parse_quote_spanned! {item.span()=> + #[prusti::pre_check_id_ref = #check_id_str] + }, + ], )); res } - /// Generate spec items and attributes to typecheck the and later retrieve "ensures" annotations. -fn generate_for_ensures(attr: TokenStream, item: &untyped::AnyFnItem) -> GeneratedResult { +fn generate_for_ensures( + attr: TokenStream, + item: &untyped::AnyFnItem, + is_trusted: bool, +) -> GeneratedResult { let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); let spec_id_str = spec_id.to_string(); - let spec_item = - rewriter.process_assertion(rewriter::SpecItemType::Postcondition, spec_id, attr, item)?; + let spec_item = rewriter.process_assertion( + rewriter::SpecItemType::Postcondition, + spec_id, + attr.clone(), + item, + )?; + // if is_trusted { + // For now we always check postconditions.. later we might exclude some + let check_id = rewriter.generate_spec_id(); + let check_id_str = check_id.to_string(); + // let store_old_item = rewriter.create_store_check_ensures(check_id, attr, item)?; + let check_item = rewriter.create_check( + rewriter::SpecItemType::Postcondition, + check_id, + attr, + item, + )?; Ok(( - vec![spec_item], - vec![parse_quote_spanned! {item.span()=> - #[prusti::post_spec_id_ref = #spec_id_str] - }], + vec![spec_item, check_item], + vec![ + parse_quote_spanned! {item.span()=> + #[prusti::post_spec_id_ref = #spec_id_str] + }, + parse_quote_spanned! {item.span()=> + #[prusti::post_check_id_ref = #check_id_str] + } + ], )) + // } else { + // Ok(( + // vec![spec_item], + // vec![parse_quote_spanned! {item.span()=> + // #[prusti::post_spec_id_ref = #spec_id_str] + // }], + // )) + // } } /// Generate spec items and attributes to typecheck and later retrieve "after_expiry" annotations. diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index a4f771c24fd..4ec3400cfcd 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -5,6 +5,7 @@ use crate::{ preparser::{parse_prusti, parse_prusti_assert_pledge, parse_prusti_pledge}, untyped, }, + runtime_checks::translate_check, }; use proc_macro2::{Span, TokenStream}; use quote::{format_ident, quote, quote_spanned}; @@ -144,12 +145,12 @@ impl AstRewriter { Ok(syn::Item::Fn(spec_item)) } - pub fn generate_check_item_fn( + pub fn generate_check_item_fn( &mut self, spec_type: SpecItemType, check_id: SpecificationId, expr: TokenStream, - item: &T, + item: &untyped::AnyFnItem, ) -> syn::Result { if let Some(span) = self.check_contains_keyword_in_params(item, "result") { return Err(syn::Error::new( @@ -175,37 +176,37 @@ impl AstRewriter { // of a single identifier; without the double negation, the `Return` // terminator in MIR has a span set to the one character just after // the identifier - let (return_type, return_modifier) = match &spec_type { - SpecItemType::Termination => ( - quote_spanned! {item_span => Int}, - quote_spanned! {item_span => Int::new(0) + }, - ), - SpecItemType::Predicate(return_type) => (return_type.clone(), TokenStream::new()), - _ => ( - quote_spanned! {item_span => bool}, - quote_spanned! {item_span => !!}, - ), - }; - let mut spec_item: syn::ItemFn = parse_quote_spanned! {item_span=> + // let (return_type, return_modifier) = match &spec_type { + // SpecItemType::Termination => ( + // quote_spanned! {item_span => Int}, + // quote_spanned! {item_span => Int::new(0) + }, + // ), + // SpecItemType::Predicate(return_type) => (return_type.clone(), TokenStream::new()), + // _ => ( + // quote_spanned! {item_span => bool}, + // quote_spanned! {item_span => !!}, + // ), + // }; + let body = translate_check(expr.clone()); + let mut check_item: syn::ItemFn = parse_quote_spanned! {item_span=> #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] #[prusti::spec_only] #[prusti::check_id = #check_id_str] - fn #item_name() -> #return_type { - assert!(#expr); - #return_modifier ((#expr) : #return_type) + fn #item_name() { + #body } }; - spec_item.sig.generics = item.sig().generics.clone(); - spec_item.sig.inputs = item.sig().inputs.clone(); + check_item.sig.generics = item.sig().generics.clone(); + check_item.sig.inputs = item.sig().inputs.clone(); match spec_type { SpecItemType::Postcondition | SpecItemType::Pledge => { let fn_arg = self.generate_result_arg(item); - spec_item.sig.inputs.push(fn_arg); + check_item.sig.inputs.push(fn_arg); } _ => (), } - Ok(syn::Item::Fn(spec_item)) + Ok(syn::Item::Fn(check_item)) } @@ -220,12 +221,12 @@ impl AstRewriter { self.generate_spec_item_fn(spec_type, spec_id, parse_prusti(tokens)?, item) } - pub fn create_check_requires( + pub fn create_check( &mut self, spec_type: SpecItemType, check_id: SpecificationId, tokens: TokenStream, - item: &T, + item: &untyped::AnyFnItem, ) -> syn::Result { self.generate_check_item_fn(spec_type, check_id, parse_prusti(tokens)?, item) } diff --git a/prusti-contracts/prusti-specs/src/runtime_checks.rs b/prusti-contracts/prusti-specs/src/runtime_checks.rs new file mode 100644 index 00000000000..5d890491b7c --- /dev/null +++ b/prusti-contracts/prusti-specs/src/runtime_checks.rs @@ -0,0 +1,89 @@ +use proc_macro2::{TokenStream}; +use quote::{quote, ToTokens}; +use std::str::FromStr; +use syn::{Expr, ExprIf, visit_mut::VisitMut, Path, + parse::Parse, ExprField}; + +struct CheckTranslator { + old_expressions: Vec, +} + +pub fn translate_check(tokens: TokenStream) -> TokenStream { + // this unwrap can not really failed since these tokens are parsed before + // and discarded in prusti_parse + println!("OUTPUT IS SHOWN\n\n\n\n"); + let mut expr = syn::parse2::(tokens).unwrap(); + // let mut visitor = CheckTranslator::new(); + // visitor.visit_expr_mut(&mut expr); + + // after translation: + // check if expr can be used without translating + if true { + quote! { + assert!(#expr); + } + } else { + expr.to_token_stream() + } +} + +impl CheckTranslator { + pub fn new() -> Self { + Self { + old_expressions: Vec::new(), + } + } +} + +impl VisitMut for CheckTranslator { + fn visit_expr_mut(&mut self, expr: &mut syn::Expr) { + syn::visit_mut::visit_expr_mut(self, expr); + + match expr { + x@Expr::Call(_) => { + // check if this expression is "old" + if let Some(old_arg) = old_contents(x) { + // get the one argument + // assert!(callexpr.args.len() == 1); + self.old_expressions.push(old_arg); + // replace old_expression with stored name: + let field_name = format!("old_arg.old_{}", self.old_expressions.len()); + *x = syn::parse2::( + TokenStream::from_str(&field_name).unwrap() + ).unwrap(); + println!("new x: {:?}", x); + + } + }, + _ => {} + } + } +} + +// in the future, this should probably be a bit more sophisticated.. +fn old_contents(expr: &mut syn::Expr) -> Option { + if let Expr::Call(call) = expr { + match *call.func.clone() { + Expr::Path(syn::ExprPath {path, ..}) => { + let name = format!("{}", path.segments[0].ident); + println!("Found function with name: {}", name); + if name == "old".to_string() { + assert!(call.args.len() == 1); + Some(call.args[0].clone()) + } else { + None + } + } + _ => None + } + } else { + None + } +} + + +// problems at the moment: +// - need to figure out all the types of old-expressions! This might be hard.. +// - need to create struct containing all the old values, return it from +// pre-check item, and then pass it to check-function. +// - also need to figure out the pre-condition of pure function calls... diff --git a/prusti-contracts/prusti-specs/src/specifications/untyped.rs b/prusti-contracts/prusti-specs/src/specifications/untyped.rs index 851ec94f050..c55fef4593b 100644 --- a/prusti-contracts/prusti-specs/src/specifications/untyped.rs +++ b/prusti-contracts/prusti-specs/src/specifications/untyped.rs @@ -9,7 +9,7 @@ pub use super::{ }; /// An abstraction over all kinds of function items. -#[derive(Debug, PartialEq, Eq)] +#[derive(Debug, PartialEq, Eq, Clone)] pub enum AnyFnItem { Fn(syn::ItemFn), TraitMethod(syn::TraitItemMethod), diff --git a/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs b/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs index bb6b8348d36..d02d673e140 100644 --- a/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs +++ b/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs @@ -16,7 +16,8 @@ pub fn generate(attr: TokenStream, item: &untyped::AnyFnItem) -> GeneratedResult for nested_spec in type_cond_spec.specs { let (mut generated_items, generated_attrs) = match nested_spec { - NestedSpec::Ensures(tokens) => generate_for_ensures(tokens, item)?, + NestedSpec::Ensures(tokens) => generate_for_ensures(tokens, item, true)?, + // is_trusted argument above is true because spec-refinements are always trusted NestedSpec::Requires(tokens) => generate_for_requires(tokens, item)?, NestedSpec::Pure => generate_for_pure_refinements(item)?, }; diff --git a/prusti-interface/src/specs/mod.rs b/prusti-interface/src/specs/mod.rs index 75a75fb6daa..4d102bc22dd 100644 --- a/prusti-interface/src/specs/mod.rs +++ b/prusti-interface/src/specs/mod.rs @@ -75,11 +75,13 @@ pub struct SpecCollector<'a, 'tcx> { /// Map from specification IDs to their typed expressions. spec_functions: FxHashMap, + /// the functions who's specifications have associated checks. check_functions: FxHashMap, /// Map from functions/loops/types to their specifications. procedure_specs: FxHashMap, - procedure_checks: FxHashMap, + /// The procedures that contain runtime checks. + procedure_checks: FxHashMap>, loop_specs: Vec, loop_variants: Vec, type_specs: FxHashMap, @@ -138,9 +140,24 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { } fn determine_checks(&self, def_spec: &mut typed::DefSpecificationMap) { - for (local_id, check_id) in self.procedure_checks.iter() { - let fn_id = self.check_functions.get(check_id).unwrap(); - def_spec.checks.insert(local_id.to_def_id(), fn_id.to_def_id()); + for (local_id, checks) in self.procedure_checks.iter() { + let mut function_checks = Vec::new(); + for check in checks { + let kind = match check { + SpecIdRef::Precondition(id) => { + let fn_id = self.check_functions.get(id).unwrap(); + typed::CheckType::Pre(fn_id.to_def_id()) + }, + SpecIdRef::Postcondition(id) => { + let fn_id = self.check_functions.get(id).unwrap(); + typed::CheckType::Post(fn_id.to_def_id()) + }, + // Todo: Pledges, Assume? + _ => unreachable!() + }; + function_checks.push(kind); + } + def_spec.checks.insert(local_id.to_def_id(), function_checks); } } @@ -456,9 +473,15 @@ fn get_procedure_spec_ids(def_id: DefId, attrs: &[ast::Attribute]) -> Option Option { - read_prusti_attr("pre_check_id_ref", attrs) - .map(|x| parse_spec_id(x, def_id)) +fn get_procedure_check_ids(def_id: DefId, attrs: &[ast::Attribute]) -> Vec { + let mut res = Vec::new(); + read_prusti_attrs("pre_check_id_ref", attrs) + .iter() + .for_each(|x| res.push(SpecIdRef::Precondition(parse_spec_id(x.to_string(), def_id)))); + read_prusti_attrs("post_check_id_ref", attrs) + .iter() + .for_each(|x| res.push(SpecIdRef::Postcondition(parse_spec_id(x.to_string(), def_id)))); + res } impl<'a, 'tcx> intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { @@ -481,9 +504,8 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { if let Some(procedure_spec_ref) = get_procedure_spec_ids(def_id, attrs) { self.procedure_specs.insert(local_id, procedure_spec_ref); } - if let Some(check_id) = get_procedure_check_ids(def_id, attrs) { - self.procedure_checks.insert(local_id, check_id); - } + let check_id = get_procedure_check_ids(def_id, attrs); + self.procedure_checks.insert(local_id, check_id); } fn visit_fn( @@ -574,6 +596,7 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { self.ghost_end.push(local_id); } } else if let Some(raw_check_id) = read_prusti_attr("check_id", attrs) { + // check_id work just like spec_ids let spec_id = parse_spec_id(raw_check_id, def_id); self.check_functions.insert(spec_id, local_id); } else { @@ -591,9 +614,8 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { if let Some(procedure_spec_ref) = get_procedure_spec_ids(def_id, attrs) { self.procedure_specs.insert(local_id, procedure_spec_ref); } - if let Some(check_id) = get_procedure_check_ids(def_id, attrs) { - self.procedure_checks.insert(local_id, check_id); - } + let check_id = get_procedure_check_ids(def_id, attrs); + self.procedure_checks.insert(local_id, check_id); // Collect model type flag if has_to_model_fn_attr(attrs) { diff --git a/prusti-interface/src/specs/typed.rs b/prusti-interface/src/specs/typed.rs index f9eef16e73a..252898aa3b6 100644 --- a/prusti-interface/src/specs/typed.rs +++ b/prusti-interface/src/specs/typed.rs @@ -20,7 +20,15 @@ pub struct DefSpecificationMap { pub prusti_refutations: FxHashMap, pub ghost_begin: FxHashMap, pub ghost_end: FxHashMap, - pub checks: FxHashMap, + pub checks: FxHashMap>, +} + +#[derive(Debug, Clone)] +pub enum CheckType { + Pre(DefId), + Post(DefId), + Assume(DefId), + Pledge{rhs: DefId, lhs: DefId}, } impl DefSpecificationMap { @@ -60,8 +68,34 @@ impl DefSpecificationMap { self.ghost_end.get(def_id) } - pub fn get_checks(&self, def_id: &DefId) -> Option { - self.checks.get(def_id).copied() + pub fn get_pre_checks(&self, def_id: &DefId) -> Vec { + let checks_opt = self.checks.get(def_id); + if let Some(checks) = checks_opt { + checks.iter().filter_map(|el| + if let CheckType::Pre(id) = el { + Some(id) + } else { + None + } + ).cloned().collect() + } else { + Vec::new() + } + } + + pub fn get_post_checks(&self, def_id: &DefId) -> Vec { + let checks_opt = self.checks.get(def_id); + if let Some(checks) = checks_opt { + checks.iter().filter_map(|el| + if let CheckType::Post(id) = el { + Some(id) + } else { + None + } + ).cloned().collect() + } else { + Vec::new() + } } pub(crate) fn defid_for_export( diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index 146fa664722..b41c6f96b60 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -1,25 +1,26 @@ +use prusti_interface::specs::typed::DefSpecificationMap; use prusti_rustc_interface::{ - data_structures::{ - steal::Steal, - graph::WithStartNode, - }, + data_structures::{graph::WithStartNode, steal::Steal}, + index::vec::IndexVec, interface::DEFAULT_QUERY_PROVIDERS, middle::{ - mir::{visit::MutVisitor, Body, Operand, Location, Constant, - ConstantKind, BasicBlock, BasicBlocks, BasicBlockData, Statement, - StatementKind, Place, Terminator, TerminatorKind, - SourceScope, SourceInfo, terminator}, - mir::interpret::{Scalar, ConstValue}, - mir::patch::MirPatch, - ty::{self, TyCtxt, ScalarInt, TyKind}, + mir::{ + interpret::{ConstValue, Scalar}, + patch::MirPatch, + terminator, + visit::MutVisitor, + BasicBlock, BasicBlockData, BasicBlocks, Body, Constant, ConstantKind, Location, + Operand, Place, SourceInfo, SourceScope, Statement, StatementKind, Terminator, + TerminatorKind, + }, + ty::{self, ScalarInt, Ty, TyCtxt, TyKind}, }, span::{ - def_id::LocalDefId, + def_id::{DefId, LocalDefId}, DUMMY_SP, }, - index::vec::IndexVec, }; -use prusti_interface::specs::typed::DefSpecificationMap; +use std::collections::HashMap; pub static mut SPECS: Option = None; @@ -38,8 +39,9 @@ pub(crate) fn mir_checked( let steal = ((*DEFAULT_QUERY_PROVIDERS).mir_drops_elaborated_and_const_checked)(tcx, def); let mut stolen = steal.steal(); - let mut visitor = InsertChecksVisitor { tcx, specs }; + let mut visitor = InsertChecksVisitor::new(tcx, specs); visitor.visit_body(&mut stolen); + println!("Custom modifications are done! Compiler back at work"); tcx.alloc_steal_mir(stolen) } @@ -47,6 +49,31 @@ pub(crate) fn mir_checked( pub struct InsertChecksVisitor<'tcx> { tcx: TyCtxt<'tcx>, specs: DefSpecificationMap, + post_check_types: HashMap, (DefId, Vec)>, + current_patcher: Option>, +} + +impl<'tcx> InsertChecksVisitor<'tcx> { + pub fn new(tcx: TyCtxt<'tcx>, specs: DefSpecificationMap) -> Self { + // when traversing the MIR and looking for function calls, + // it appears to be difficult to get the DefId of a Call. + // A `Ty` representing it does exist however. + // That's why we transform the specification map in the following way + let mut post_check_types = HashMap::new(); + for (id, _) in specs.checks.iter() { + let checks = specs.get_post_checks(id); + let subst = ty::List::empty(); + let func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(*id, subst)); // do I need substs? + post_check_types.insert(func_ty, (*id, checks.clone())); + } + + Self { + tcx, + specs, + post_check_types, + current_patcher: None, + } + } } impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { @@ -55,122 +82,88 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } fn visit_body(&mut self, body: &mut Body<'tcx>) { - println!("Mir body: {:#?}", body); let def_id = body.source.def_id(); // try to find specification function: - let check_id_opt = self.specs.get_checks(&def_id); - if let Some(check_id) = check_id_opt { - let body_to_insert: Body = self.tcx.mir_drops_elaborated_and_const_checked( - ty::WithOptConstParam::unknown(check_id.as_local().unwrap()) - ).borrow().clone(); - println!("Found body: {:#?}", body_to_insert); - - let ret_ty = body_to_insert.return_ty().clone(); - assert!(ret_ty.is_bool()); - + let pre_check_ids = self.specs.get_pre_checks(&def_id); + // todo: properly deal with multiple of them + // does this already work? We just prepend new checks, so it should.. + for check_id in pre_check_ids { let mut patch = MirPatch::new(body); - let start_node = body.basic_blocks.start_node(); - println!("Start node is {:?}", start_node); - let target = start_node; - // let mut loc = Location { - // block: start_node, - // statement_index: 0, - // }; - // while let Some(stmt) = body.stmt_at(loc).left() { - // if let Statement { kind: StatementKind::StorageLive(_x), .. } = stmt { - // println!("good :)"); - // loc.statement_index += 1; - // } else { - // break; - // } - // } - let dest_place: Place = Place::from(patch.new_internal(ret_ty, DUMMY_SP)); - - let subst = ty::List::empty(); - let func_ty = self.tcx.mk_ty_from_kind(TyKind::FnDef(check_id, subst)); // do I need substs? - let func = Operand::Constant(Box::new(Constant { - span: DUMMY_SP, - user_ty: None, - literal: ConstantKind::zero_sized(func_ty), - })); - - // determine the arguments! - let caller_nr_args = body.arg_count; - let nr_args = body_to_insert.arg_count; - let mut arg_symbols = Vec::new(); - - for i in 1..nr_args + 1 { - 'inner: for el in body_to_insert.var_debug_info.clone() { - if format!("{:?}", el.value) == format!("_{}", i) { - arg_symbols.push(el.name.to_string()); - println!("found match for {}", el.name.to_string()); - break 'inner - } - } - } - - let mut args_symbols = Vec::new(); - // now for the caller, find ids of names: - for s in arg_symbols { - 'inner: for el in body.var_debug_info.clone() { - if el.name.to_string() == s { - args_symbols.push(format!("{:?}", el.value)); - break 'inner - } - } - } - - let mut args = Vec::new(); - // now the final mapping to operands: - for s in args_symbols { - for (local, _decl) in body.local_decls.iter_enumerated() { - if format!("{:?}", local) == s { - args.push(Operand::Copy(Place { - local, - projection: ty::List::empty(), - })); - } - } - } - - - - - let terminator_kind = TerminatorKind::Call { - func, - args, - destination: dest_place, - target: Some(target), - cleanup: None, - from_hir_call: false, - fn_span: body_to_insert.span, - }; - let terminator = Terminator { - // todo: replace this with the span of the original contract? - source_info: SourceInfo { - span: DUMMY_SP, - scope: SourceScope::from_usize(0), - }, - kind: terminator_kind, - }; - let blockdata = BasicBlockData::new(Some(terminator)); - let new_block = patch.new_block(blockdata); - println!("block index: {:?}", new_block); - + let start_node = BasicBlock::from_usize(0); + let new_block = + new_call_block(self.tcx, &mut patch, check_id, body, Some(start_node), None); patch.apply(body); - let old_start_data = body.basic_blocks_mut().swap(start_node, new_block); - + // swap first and last node, so our new block is called on entry + body.basic_blocks_mut().swap(start_node, new_block); + // fix all terminators to point to correct block for b in body.basic_blocks.as_mut().iter_mut() { replace_outgoing_edges(b, start_node, BasicBlock::MAX); replace_outgoing_edges(b, new_block, start_node); replace_outgoing_edges(b, BasicBlock::MAX, new_block); } - } - println!("Body afterwards: {:#?}", body); + self.current_patcher = Some(MirPatch::new(body)); self.super_body(body); + let mir_patch = self.current_patcher.take(); + mir_patch.unwrap().apply(body); + } + + fn visit_terminator(&mut self, terminator: &mut Terminator<'tcx>, location: Location) { + // our goal here is to find calls to functions where we want to check + // their precondition afterwards + self.super_terminator(terminator, location); + if let TerminatorKind::Call { + func: Operand::Constant(box constant), + target, + destination, + .. + } = &mut terminator.kind + { + if let Constant { + literal: ConstantKind::Val(value, ty), + .. + } = constant + { + println!("Call terminator: {:?}", ty); + // lookup if there is a check function: + if let Some((call_id, id_vec)) = self.post_check_types.get(&ty) { + // since there might be multiple blocks to be inserted, + for check_id in id_vec { + println!("Now inserting a runtime check for a postcondition"); + let mut patch = self.current_patcher.take().unwrap(); + let called_body: Body = self + .tcx + .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( + call_id.as_local().unwrap(), + )) + .borrow() + .clone(); + // we store the target, create a new block per check function + // chain these with the final call having the original target, + // change the target of the call to the first block of our chain. + let block = new_call_block( + self.tcx, + &mut patch, + *check_id, + &called_body, + *target, + Some(*destination), + ); + // from here we can not really add this block to the cfg + // so we need to store it in our visitor.. + // It needs to be jumped to after this call and has our calls + // original target.. + *target = Some(block); + // If there are multiple checks, this also should behave + // correctly, since on the second iteration this target + // is already the new block + self.current_patcher = Some(patch); + } + } + } + } } // This was just a test to see if changes influence the generted executable @@ -192,49 +185,161 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { // } } +fn new_call_block<'tcx>( + tcx: TyCtxt<'tcx>, + patch: &mut MirPatch<'tcx>, + func: DefId, + caller: &Body, + target: Option, + result: Option>, +) -> BasicBlock { + let body_to_insert: Body = tcx + .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( + func.as_local().unwrap(), + )) + .borrow() + .clone(); + + let ret_ty = body_to_insert.return_ty().clone(); + assert!(ret_ty.is_bool() || ret_ty.is_unit()); + // should always be block 0 but let's be certain.. + println!("Target node is {:?}", target); + // let mut loc = Location { + // block: start_node, + // statement_index: 0, + // }; + // while let Some(stmt) = body.stmt_at(loc).left() { + // if let Statement { kind: StatementKind::StorageLive(_x), .. } = stmt { + // println!("good :)"); + // loc.statement_index += 1; + // } else { + // break; + // } + // } + + // variable to store result of function (altough we dont care about the result) + let dest_place: Place = Place::from(patch.new_internal(ret_ty, DUMMY_SP)); + + let subst = ty::List::empty(); // potentially bad? + let func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(func, subst)); // do I need substs? + println!("Function type: {:?}", func_ty); + let func = Operand::Constant(Box::new(Constant { + span: DUMMY_SP, + user_ty: None, + literal: ConstantKind::zero_sized(func_ty), + })); + + // determine the arguments! + // Todo: deal with result! + // and make it less ugly.. But not sure how this is supposed to be done + let caller_nr_args = caller.arg_count; + let mut args = Vec::new(); + // now the final mapping to operands: + for (local, decl) in caller.local_decls.iter_enumerated() { + let index = local.index(); + if index != 0 && index <= caller_nr_args { + args.push(Operand::Copy(Place { + local, + projection: ty::List::empty(), + })); + } + } + if let Some(result_operand) = result { + println!("Adding the result operand!"); + args.push(Operand::Copy(result_operand)); + } + + let terminator_kind = TerminatorKind::Call { + func, + args, + destination: dest_place, + target, + cleanup: None, + from_hir_call: false, + fn_span: body_to_insert.span, + }; + let terminator = Terminator { + // todo: replace this with the span of the original contract? + source_info: SourceInfo { + span: DUMMY_SP, + scope: SourceScope::from_usize(0), + }, + kind: terminator_kind, + }; + let blockdata = BasicBlockData::new(Some(terminator)); + patch.new_block(blockdata) +} // If we re-order the IndexVec containing the basic blocks, we will need to adjust // some the basic blocks that terminators point to. This is what this function does fn replace_outgoing_edges(data: &mut BasicBlockData, from: BasicBlock, to: BasicBlock) { match &mut data.terminator_mut().kind { - TerminatorKind::Goto { target } - => update_if_equals(target, from, to), + TerminatorKind::Goto { target } => update_if_equals(target, from, to), TerminatorKind::SwitchInt { targets, .. } => { for bb1 in &mut targets.all_targets_mut().iter_mut() { update_if_equals(bb1, from, to); } - }, - TerminatorKind::Call { target, cleanup, .. } => { + } + TerminatorKind::Call { + target, cleanup, .. + } => { if let Some(target) = target { update_if_equals(target, from, to); } if let Some(cleanup) = cleanup { update_if_equals(cleanup, from, to); } - }, - TerminatorKind::Assert { target: target_bb, cleanup: opt_bb, .. } | - TerminatorKind::DropAndReplace { target: target_bb, unwind: opt_bb, .. } | - TerminatorKind::Drop { target: target_bb, unwind: opt_bb, .. } | - TerminatorKind::Yield { resume: target_bb, drop: opt_bb, .. } | - TerminatorKind::FalseUnwind { real_target: target_bb, unwind: opt_bb }=> { + } + TerminatorKind::Assert { + target: target_bb, + cleanup: opt_bb, + .. + } + | TerminatorKind::DropAndReplace { + target: target_bb, + unwind: opt_bb, + .. + } + | TerminatorKind::Drop { + target: target_bb, + unwind: opt_bb, + .. + } + | TerminatorKind::Yield { + resume: target_bb, + drop: opt_bb, + .. + } + | TerminatorKind::FalseUnwind { + real_target: target_bb, + unwind: opt_bb, + } => { update_if_equals(target_bb, from, to); if let Some(bb) = opt_bb { update_if_equals(bb, from, to); } - - }, - TerminatorKind::InlineAsm { destination, cleanup, .. } => { + } + TerminatorKind::InlineAsm { + destination, + cleanup, + .. + } => { // is this prettier? does this even modify the blockdata? destination.map(|mut x| update_if_equals(&mut x, from, to)); cleanup.map(|mut x| update_if_equals(&mut x, from, to)); } - TerminatorKind::FalseEdge { real_target, imaginary_target } => { + TerminatorKind::FalseEdge { + real_target, + imaginary_target, + } => { update_if_equals(real_target, from, to); update_if_equals(imaginary_target, from, to); - }, - TerminatorKind::Resume | TerminatorKind::Abort | - TerminatorKind::Return | TerminatorKind::Unreachable | - TerminatorKind::GeneratorDrop => {} + } + TerminatorKind::Resume + | TerminatorKind::Abort + | TerminatorKind::Return + | TerminatorKind::Unreachable + | TerminatorKind::GeneratorDrop => {} } } From 2ecdda6377605e231f11ec5702c39b0ec9b11cad Mon Sep 17 00:00:00 2001 From: cedric Date: Thu, 11 May 2023 15:49:16 +0200 Subject: [PATCH 06/45] Handle old operator in runtime checks --- prusti-contracts/prusti-specs/src/lib.rs | 84 ++++-- prusti-contracts/prusti-specs/src/rewriter.rs | 53 +++- .../prusti-specs/src/runtime_checks.rs | 277 ++++++++++++++---- prusti/src/mir_modify.rs | 4 +- 4 files changed, 319 insertions(+), 99 deletions(-) diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index bfcdb8a1cfa..8f30af7f41a 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -206,23 +206,37 @@ fn generate_for_requires(attr: TokenStream, item: &untyped::AnyFnItem) -> Genera attr.clone(), item, )?; - let check_item = rewriter.create_check( + let (check_item, store_item_opt) = rewriter.create_check( rewriter::SpecItemType::Precondition, check_id, attr, item, )?; - let res = Ok(( - vec![spec_item, check_item], - vec![ - parse_quote_spanned! {item.span()=> - #[prusti::pre_spec_id_ref = #spec_id_str] - }, - parse_quote_spanned! {item.span()=> - #[prusti::pre_check_id_ref = #check_id_str] - }, - ], - )); + let res = if let Some(store_item) = store_item_opt { + Ok(( + vec![spec_item, check_item, store_item], + vec![ + parse_quote_spanned! {item.span()=> + #[prusti::pre_spec_id_ref = #spec_id_str] + }, + parse_quote_spanned! {item.span()=> + #[prusti::pre_check_id_ref = #check_id_str] + }, + ], + )) + } else { + Ok(( + vec![spec_item, check_item], + vec![ + parse_quote_spanned! {item.span()=> + #[prusti::pre_spec_id_ref = #spec_id_str] + }, + parse_quote_spanned! {item.span()=> + #[prusti::pre_check_id_ref = #check_id_str] + }, + ], + )) + }; res } @@ -246,31 +260,37 @@ fn generate_for_ensures( let check_id = rewriter.generate_spec_id(); let check_id_str = check_id.to_string(); // let store_old_item = rewriter.create_store_check_ensures(check_id, attr, item)?; - let check_item = rewriter.create_check( + let (check_item, store_item_opt) = rewriter.create_check( rewriter::SpecItemType::Postcondition, check_id, attr, item, )?; - Ok(( - vec![spec_item, check_item], - vec![ - parse_quote_spanned! {item.span()=> - #[prusti::post_spec_id_ref = #spec_id_str] - }, - parse_quote_spanned! {item.span()=> - #[prusti::post_check_id_ref = #check_id_str] - } - ], - )) - // } else { - // Ok(( - // vec![spec_item], - // vec![parse_quote_spanned! {item.span()=> - // #[prusti::post_spec_id_ref = #spec_id_str] - // }], - // )) - // } + if let Some(store_item) = store_item_opt { + Ok(( + vec![spec_item, check_item, store_item], + vec![ + parse_quote_spanned! {item.span()=> + #[prusti::post_spec_id_ref = #spec_id_str] + }, + parse_quote_spanned! {item.span()=> + #[prusti::post_check_id_ref = #check_id_str] + } + ], + )) + } else { + Ok(( + vec![spec_item, check_item], + vec![ + parse_quote_spanned! {item.span()=> + #[prusti::post_spec_id_ref = #spec_id_str] + }, + parse_quote_spanned! {item.span()=> + #[prusti::post_check_id_ref = #check_id_str] + } + ], + )) + } } /// Generate spec items and attributes to typecheck and later retrieve "after_expiry" annotations. diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index 4ec3400cfcd..0157c47ffd6 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -1,15 +1,18 @@ use crate::{ common::HasSignature, + runtime_checks::{translate_check, CheckTranslator}, specifications::{ common::{SpecificationId, SpecificationIdGenerator}, preparser::{parse_prusti, parse_prusti_assert_pledge, parse_prusti_pledge}, untyped, }, - runtime_checks::translate_check, }; use proc_macro2::{Span, TokenStream}; use quote::{format_ident, quote, quote_spanned}; -use syn::{parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, Pat, Token, Type}; +use syn::{ + parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, visit_mut::VisitMut, Pat, Token, + Type, +}; pub(crate) struct AstRewriter { spec_id_generator: SpecificationIdGenerator, @@ -151,7 +154,7 @@ impl AstRewriter { check_id: SpecificationId, expr: TokenStream, item: &untyped::AnyFnItem, - ) -> syn::Result { + ) -> syn::Result<(syn::Item, Option)> { if let Some(span) = self.check_contains_keyword_in_params(item, "result") { return Err(syn::Error::new( span, @@ -159,8 +162,23 @@ impl AstRewriter { )); } let item_span = expr.span(); - let item_name = syn::Ident::new( - &format!("prusti_{}_check_item_{}_{}", spec_type, item.sig().ident, check_id), + let check_item_name = syn::Ident::new( + &format!( + "prusti_{}_check_item_{}_{}", + spec_type, + item.sig().ident, + check_id + ), + item_span, + ); + + let store_old_item_name = syn::Ident::new( + &format!( + "prusti_{}_store_old_item_{}_{}", + spec_type, + item.sig().ident, + check_id + ), item_span, ); let check_id_str = check_id.to_string(); @@ -187,13 +205,19 @@ impl AstRewriter { // quote_spanned! {item_span => !!}, // ), // }; - let body = translate_check(expr.clone()); + let mut check_translator = CheckTranslator::new(item); + let mut expr_to_check = syn::parse2::(expr.clone()).unwrap(); + + // this call will modify the expression, but also collect the information + // about what expressions we need to store etc. + check_translator.visit_expr_mut(&mut expr_to_check); + let mut check_item: syn::ItemFn = parse_quote_spanned! {item_span=> #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] #[prusti::spec_only] #[prusti::check_id = #check_id_str] - fn #item_name() { - #body + fn #check_item_name() { + assert!(#expr_to_check); } }; @@ -201,15 +225,20 @@ impl AstRewriter { check_item.sig.inputs = item.sig().inputs.clone(); match spec_type { SpecItemType::Postcondition | SpecItemType::Pledge => { + let mut store_item = + check_translator.generate_store_function(item, store_old_item_name, check_id_str); + store_item.sig.generics = item.sig().generics.clone(); + store_item.sig.inputs = item.sig().inputs.clone(); let fn_arg = self.generate_result_arg(item); + let old_arg = check_translator.construct_old_type(item); check_item.sig.inputs.push(fn_arg); + check_item.sig.inputs.push(old_arg); + Ok((syn::Item::Fn(check_item), Some(syn::Item::Fn(store_item)))) } - _ => (), + _ => Ok((syn::Item::Fn(check_item), None)), } - Ok(syn::Item::Fn(check_item)) } - /// Parse an assertion into a Rust expression pub fn process_assertion( &mut self, @@ -227,7 +256,7 @@ impl AstRewriter { check_id: SpecificationId, tokens: TokenStream, item: &untyped::AnyFnItem, - ) -> syn::Result { + ) -> syn::Result<(syn::Item, Option)> { self.generate_check_item_fn(spec_type, check_id, parse_prusti(tokens)?, item) } diff --git a/prusti-contracts/prusti-specs/src/runtime_checks.rs b/prusti-contracts/prusti-specs/src/runtime_checks.rs index 5d890491b7c..28825696091 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks.rs @@ -1,89 +1,260 @@ -use proc_macro2::{TokenStream}; +use crate::{common::HasSignature, specifications::untyped}; +use proc_macro2::TokenStream; use quote::{quote, ToTokens}; -use std::str::FromStr; -use syn::{Expr, ExprIf, visit_mut::VisitMut, Path, - parse::Parse, ExprField}; +use std::collections::HashMap; +use syn::{ + parse_quote, parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, + visit_mut::VisitMut, Expr, ExprCall, FnArg, +}; -struct CheckTranslator { - old_expressions: Vec, +pub struct CheckTranslator { + rust_only: bool, // no translation needed if true + within_old: bool, + surrounding_quantifiers: Vec, // list of surrounding quantifiers + inputs: HashMap, + // each old argument that needs to be stored will be stored as a field + // of a tuple. Need to keep track of them + highest_old_index: usize, } -pub fn translate_check(tokens: TokenStream) -> TokenStream { +pub fn translate_check(tokens: TokenStream, item: &untyped::AnyFnItem) -> TokenStream { // this unwrap can not really failed since these tokens are parsed before // and discarded in prusti_parse - println!("OUTPUT IS SHOWN\n\n\n\n"); let mut expr = syn::parse2::(tokens).unwrap(); - // let mut visitor = CheckTranslator::new(); - // visitor.visit_expr_mut(&mut expr); + let mut visitor = CheckTranslator::new(item); + visitor.visit_expr_mut(&mut expr); // after translation: // check if expr can be used without translating - if true { + if visitor.rust_only { quote! { assert!(#expr); } } else { - expr.to_token_stream() + // to be done correctly.. + // or actually probably should not be done here.. + quote! { + assert!(#expr); + } } } -impl CheckTranslator { - pub fn new() -> Self { +impl<'a> CheckTranslator { + pub fn new(item: &untyped::AnyFnItem) -> Self { + // figure out keywords + let inputs = item + .sig() + .inputs + .iter() + .cloned() + .filter_map(|el| Argument::try_from(&el).ok()) + .map(|el| (el.name.clone(), el)) + .collect(); Self { - old_expressions: Vec::new(), + rust_only: true, + within_old: false, + surrounding_quantifiers: Vec::new(), + inputs, + highest_old_index: 0, + } + } + + pub fn old_values_type(&self, item: &T) -> syn::Type { + let mut old_values_type: syn::Type = parse_quote_spanned! {item.span() => ()}; + if let syn::Type::Tuple(syn::TypeTuple { elems, .. }) = &mut old_values_type { + // start adding the elements we want to store: + for i in 0..self.highest_old_index { + for (_, el) in &self.inputs { + if el.used_in_old && el.old_store_index == i { + elems.push(el.ty.clone()); + } + } + } + if !elems.empty_or_trailing() { + elems.push_punct(syn::token::Comma::default()); + } + } else { + unreachable!(); + } + old_values_type + } + + pub fn construct_old_type(&self, item: &T) -> syn::FnArg { + let old_values_type: syn::Type = self.old_values_type(item); + parse_quote_spanned! {item.span() => + old_values: #old_values_type + } + } + + pub fn generate_store_function( + &self, + item: &T, + item_name: syn::Ident, + check_id_str: String, + ) -> syn::ItemFn { + let mut exprs = self + .inputs + .iter() + .filter_map(|(_, x)| if x.used_in_old { Some(x) } else { None }) + .collect::>(); + exprs.sort_by(|a, b| a.old_store_index.partial_cmp(&b.old_store_index).unwrap()); + let mut tuple: Punctuated = Punctuated::new(); + + exprs.iter().for_each(|el| { + println!("field number: (control sorted!) {}", el.old_store_index); + let name_token: TokenStream = el.name.to_string().parse().unwrap(); + let tokens_stmt: syn::Expr = parse_quote_spanned! {item.span() => + #name_token.clone() + }; + tuple.push(tokens_stmt); + }); + if !tuple.empty_or_trailing() { + tuple.push_punct(syn::token::Comma::default()); + } + let old_values_type = self.old_values_type(item); + // println!("resulting tuple: {}", quote!{#tuple}); + + parse_quote_spanned! {item.span() => + #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] + #[prusti::spec_only] + #[prusti::check_id = #check_id_str] + fn #item_name() -> #old_values_type { + return (#tuple); + } } + // parse_quote_spanned!{item.span() => + // fn #item_name() -> () { + // () + // } + // } + // + // println!("store function: {:?}", res.to_token_stream().to_string()); + // res } } impl VisitMut for CheckTranslator { - fn visit_expr_mut(&mut self, expr: &mut syn::Expr) { - syn::visit_mut::visit_expr_mut(self, expr); - + fn visit_expr_mut(&mut self, expr: &mut Expr) { match expr { - x@Expr::Call(_) => { - // check if this expression is "old" - if let Some(old_arg) = old_contents(x) { - // get the one argument - // assert!(callexpr.args.len() == 1); - self.old_expressions.push(old_arg); - // replace old_expression with stored name: - let field_name = format!("old_arg.old_{}", self.old_expressions.len()); - *x = syn::parse2::( - TokenStream::from_str(&field_name).unwrap() - ).unwrap(); - println!("new x: {:?}", x); - + Expr::Path(expr_path) => { + // collect arguments that occurr within old expression + // these are the ones we wanna clone + if let Some(ident) = expr_path.path.get_ident() { + println!("Found identifier: {}", ident); + let name = ident.to_token_stream().to_string(); + if let Some(arg) = self.inputs.get_mut(&name) { + // argument used within an old expression? + // not already marked as used in old? + if self.within_old { + if !arg.used_in_old { + println!("Marking variable {} to be stored", arg.name); + arg.used_in_old = true; + arg.old_store_index = self.highest_old_index; + self.highest_old_index += 1; + } + // replace the identifier with the correct field access + let index_token: TokenStream = + arg.old_store_index.to_string().parse().unwrap(); + let tokens = if arg.is_ref { + // cloning will deref the value.. + quote! {&old_values.#index_token} + } else { + // unfortunately it could still be a reference.. + // no real solution at this level + quote! {old_values.#index_token} + }; + println!("tokens: {}", tokens); + let new_path = syn::parse2::(tokens).unwrap(); + *expr = new_path; + } + } + // duplicating identifiers by defining new variables within specs + // can break this! + } + syn::visit_mut::visit_expr_mut(self, expr); + } + Expr::Call(ExprCall { func, args, .. }) => { + match *func.clone() { + Expr::Path(syn::ExprPath { path, .. }) => { + let name = path.to_token_stream().to_string(); + println!("found function with name {}", name); + match name.as_str() { + ":: prusti_contracts :: old" | "prusti_contracts :: old" | "old" => { + let sub_expr = args.pop(); + // remove old-call and replace with content expression + *expr = sub_expr.unwrap().value().clone(); + println!("recognized old!"); + self.rust_only = false; // no translation is not enough.. + self.within_old = true; + syn::visit_mut::visit_expr_mut(self, expr); + // will cause all variables below to be replaced by old_value.some_field + self.within_old = false; + println!("done searching contents of old()"); + } + ":: prusti_contracts :: forall" => { + println!("recognized forall!"); + // extend surrounding_quantifiers correctly! + } + ":: prusti_contracts :: exists" => { + println!("recognized exists!"); + // extend self.surround_quantifiers correctly! + } + _ => syn::visit_mut::visit_expr_mut(self, expr), + } + } + _ => syn::visit_mut::visit_expr_mut(self, expr), } - }, - _ => {} + // check if your next successor is an ExprCall of old: + // the underlying expr_call must have set it! replace + // the old function call with whatever expression is it's + // argument! + } + _ => { + syn::visit_mut::visit_expr_mut(self, expr); + } } } } -// in the future, this should probably be a bit more sophisticated.. -fn old_contents(expr: &mut syn::Expr) -> Option { - if let Expr::Call(call) = expr { - match *call.func.clone() { - Expr::Path(syn::ExprPath {path, ..}) => { - let name = format!("{}", path.segments[0].ident); - println!("Found function with name: {}", name); - if name == "old".to_string() { - assert!(call.args.len() == 1); - Some(call.args[0].clone()) +/// Arguments to this function / i.e. specification. This struct is meant to +/// Keep track of them and collect information about how they are used +/// within specs to correctly store them. +struct Argument { + pub name: String, + pub ty: syn::Type, + pub used_in_old: bool, // set to true as soon as it occurrs within an old expr + pub old_store_index: usize, // field in old-tuple used by this argument + /// whether or not this field is a reference. On one hand this can be told + /// from the type.. + pub is_ref: bool, +} + +impl TryFrom<&FnArg> for Argument { + type Error = (); + fn try_from(arg: &FnArg) -> Result { + match arg { + FnArg::Typed(syn::PatType { pat, ty, .. }) => { + if let syn::Pat::Ident(pat_ident) = *pat.clone() { + let is_ref = matches!(**ty, syn::Type::Reference(_)); + let arg = Argument { + name: pat_ident.ident.to_string(), + ty: *ty.clone(), + used_in_old: false, + old_store_index: 0, // meaningless unless used_in_old is true + is_ref, + }; + Ok(arg) } else { - None + Err(()) } } - _ => None + FnArg::Receiver(_) => Err(()), } - } else { - None } } - -// problems at the moment: -// - need to figure out all the types of old-expressions! This might be hard.. -// - need to create struct containing all the old values, return it from -// pre-check item, and then pass it to check-function. -// - also need to figure out the pre-condition of pure function calls... +#[derive(Clone)] +enum Quantifier { + Exists(Vec<(String, String)>), + Forall(Vec<(String, String)>), +} diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index b41c6f96b60..d3393e26041 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -238,7 +238,7 @@ fn new_call_block<'tcx>( for (local, decl) in caller.local_decls.iter_enumerated() { let index = local.index(); if index != 0 && index <= caller_nr_args { - args.push(Operand::Copy(Place { + args.push(Operand::Move(Place { local, projection: ty::List::empty(), })); @@ -246,7 +246,7 @@ fn new_call_block<'tcx>( } if let Some(result_operand) = result { println!("Adding the result operand!"); - args.push(Operand::Copy(result_operand)); + args.push(Operand::Move(result_operand)); } let terminator_kind = TerminatorKind::Call { From 393748c19ac748015231d1731066e6bc94b9b8e3 Mon Sep 17 00:00:00 2001 From: cedric Date: Tue, 16 May 2023 17:00:05 +0200 Subject: [PATCH 07/45] Make postconditions with old expressions checkable at runtime --- prusti-contracts/prusti-specs/src/lib.rs | 58 ++---- prusti-contracts/prusti-specs/src/rewriter.rs | 16 +- .../prusti-specs/src/runtime_checks.rs | 65 +++--- prusti-interface/src/specs/mod.rs | 46 +++-- prusti-interface/src/specs/typed.rs | 10 +- prusti/src/callbacks.rs | 5 +- prusti/src/driver.rs | 1 - prusti/src/mir_modify.rs | 187 ++++++++++++------ 8 files changed, 229 insertions(+), 159 deletions(-) diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index 8f30af7f41a..877f3060f0a 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -206,49 +206,35 @@ fn generate_for_requires(attr: TokenStream, item: &untyped::AnyFnItem) -> Genera attr.clone(), item, )?; - let (check_item, store_item_opt) = rewriter.create_check( + let (check_item, _) = rewriter.create_pre_check( rewriter::SpecItemType::Precondition, check_id, attr, item, )?; - let res = if let Some(store_item) = store_item_opt { - Ok(( - vec![spec_item, check_item, store_item], - vec![ - parse_quote_spanned! {item.span()=> - #[prusti::pre_spec_id_ref = #spec_id_str] - }, - parse_quote_spanned! {item.span()=> - #[prusti::pre_check_id_ref = #check_id_str] - }, - ], - )) - } else { - Ok(( - vec![spec_item, check_item], - vec![ - parse_quote_spanned! {item.span()=> - #[prusti::pre_spec_id_ref = #spec_id_str] - }, - parse_quote_spanned! {item.span()=> - #[prusti::pre_check_id_ref = #check_id_str] - }, - ], - )) - }; - res + Ok(( + vec![spec_item, check_item], + vec![ + parse_quote_spanned! {item.span()=> + #[prusti::pre_spec_id_ref = #spec_id_str] + }, + parse_quote_spanned! {item.span()=> + #[prusti::pre_check_id_ref = #check_id_str] + }, + ], + )) } /// Generate spec items and attributes to typecheck the and later retrieve "ensures" annotations. fn generate_for_ensures( attr: TokenStream, item: &untyped::AnyFnItem, - is_trusted: bool, + _is_trusted: bool, // may be used in future ) -> GeneratedResult { let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); let spec_id_str = spec_id.to_string(); + let spec_item = rewriter.process_assertion( rewriter::SpecItemType::Postcondition, spec_id, @@ -260,7 +246,7 @@ fn generate_for_ensures( let check_id = rewriter.generate_spec_id(); let check_id_str = check_id.to_string(); // let store_old_item = rewriter.create_store_check_ensures(check_id, attr, item)?; - let (check_item, store_item_opt) = rewriter.create_check( + let (check_item, store_item_opt) = rewriter.create_post_check( rewriter::SpecItemType::Postcondition, check_id, attr, @@ -275,21 +261,11 @@ fn generate_for_ensures( }, parse_quote_spanned! {item.span()=> #[prusti::post_check_id_ref = #check_id_str] - } - ], - )) - } else { - Ok(( - vec![spec_item, check_item], - vec![ - parse_quote_spanned! {item.span()=> - #[prusti::post_spec_id_ref = #spec_id_str] }, - parse_quote_spanned! {item.span()=> - #[prusti::post_check_id_ref = #check_id_str] - } ], )) + } else { + unreachable!(); } } diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index 0157c47ffd6..faddc8d4aff 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -1,6 +1,6 @@ use crate::{ common::HasSignature, - runtime_checks::{translate_check, CheckTranslator}, + runtime_checks::CheckTranslator, specifications::{ common::{SpecificationId, SpecificationIdGenerator}, preparser::{parse_prusti, parse_prusti_assert_pledge, parse_prusti_pledge}, @@ -206,7 +206,7 @@ impl AstRewriter { // ), // }; let mut check_translator = CheckTranslator::new(item); - let mut expr_to_check = syn::parse2::(expr.clone()).unwrap(); + let mut expr_to_check = syn::parse2::(expr).unwrap(); // this call will modify the expression, but also collect the information // about what expressions we need to store etc. @@ -250,7 +250,17 @@ impl AstRewriter { self.generate_spec_item_fn(spec_type, spec_id, parse_prusti(tokens)?, item) } - pub fn create_check( + pub fn create_pre_check( + &mut self, + spec_type: SpecItemType, + check_id: SpecificationId, + tokens: TokenStream, + item: &untyped::AnyFnItem, + ) -> syn::Result<(syn::Item, Option)> { + self.generate_check_item_fn(spec_type, check_id, parse_prusti(tokens)?, item) + } + + pub fn create_post_check( &mut self, spec_type: SpecItemType, check_id: SpecificationId, diff --git a/prusti-contracts/prusti-specs/src/runtime_checks.rs b/prusti-contracts/prusti-specs/src/runtime_checks.rs index 28825696091..858f32185d4 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks.rs @@ -1,45 +1,23 @@ use crate::{common::HasSignature, specifications::untyped}; use proc_macro2::TokenStream; use quote::{quote, ToTokens}; -use std::collections::HashMap; +use rustc_hash::FxHashMap; use syn::{ - parse_quote, parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, + parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, visit_mut::VisitMut, Expr, ExprCall, FnArg, }; pub struct CheckTranslator { rust_only: bool, // no translation needed if true within_old: bool, - surrounding_quantifiers: Vec, // list of surrounding quantifiers - inputs: HashMap, + // surrounding_quantifiers: Vec, // list of surrounding quantifiers + inputs: FxHashMap, // each old argument that needs to be stored will be stored as a field // of a tuple. Need to keep track of them highest_old_index: usize, } -pub fn translate_check(tokens: TokenStream, item: &untyped::AnyFnItem) -> TokenStream { - // this unwrap can not really failed since these tokens are parsed before - // and discarded in prusti_parse - let mut expr = syn::parse2::(tokens).unwrap(); - let mut visitor = CheckTranslator::new(item); - visitor.visit_expr_mut(&mut expr); - - // after translation: - // check if expr can be used without translating - if visitor.rust_only { - quote! { - assert!(#expr); - } - } else { - // to be done correctly.. - // or actually probably should not be done here.. - quote! { - assert!(#expr); - } - } -} - -impl<'a> CheckTranslator { +impl CheckTranslator { pub fn new(item: &untyped::AnyFnItem) -> Self { // figure out keywords let inputs = item @@ -53,7 +31,7 @@ impl<'a> CheckTranslator { Self { rust_only: true, within_old: false, - surrounding_quantifiers: Vec::new(), + // surrounding_quantifiers: Vec::new(), inputs, highest_old_index: 0, } @@ -64,9 +42,14 @@ impl<'a> CheckTranslator { if let syn::Type::Tuple(syn::TypeTuple { elems, .. }) = &mut old_values_type { // start adding the elements we want to store: for i in 0..self.highest_old_index { - for (_, el) in &self.inputs { + for el in self.inputs.values() { if el.used_in_old && el.old_store_index == i { - elems.push(el.ty.clone()); + match &el.ty { + // if we have a reference, cloning will result in its inner type + // (usually...) + syn::Type::Reference(cloned_type) => elems.push(*cloned_type.elem.clone()), + _ => elems.push(el.ty.clone()), + } } } } @@ -117,7 +100,7 @@ impl<'a> CheckTranslator { parse_quote_spanned! {item.span() => #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] #[prusti::spec_only] - #[prusti::check_id = #check_id_str] + #[prusti::store_id = #check_id_str] fn #item_name() -> #old_values_type { return (#tuple); } @@ -135,6 +118,7 @@ impl<'a> CheckTranslator { impl VisitMut for CheckTranslator { fn visit_expr_mut(&mut self, expr: &mut Expr) { + println!("visiting expression: {}", quote!{#expr}); match expr { Expr::Path(expr_path) => { // collect arguments that occurr within old expression @@ -164,7 +148,7 @@ impl VisitMut for CheckTranslator { quote! {old_values.#index_token} }; println!("tokens: {}", tokens); - let new_path = syn::parse2::(tokens).unwrap(); + let new_path : syn::Expr = syn::parse2(tokens).unwrap(); *expr = new_path; } } @@ -174,6 +158,7 @@ impl VisitMut for CheckTranslator { syn::visit_mut::visit_expr_mut(self, expr); } Expr::Call(ExprCall { func, args, .. }) => { + assert!(args.len() == 1); match *func.clone() { Expr::Path(syn::ExprPath { path, .. }) => { let name = path.to_token_stream().to_string(); @@ -183,13 +168,13 @@ impl VisitMut for CheckTranslator { let sub_expr = args.pop(); // remove old-call and replace with content expression *expr = sub_expr.unwrap().value().clone(); - println!("recognized old!"); + println!("recognized old with sub_expr: {}!", quote!{#expr}); self.rust_only = false; // no translation is not enough.. self.within_old = true; syn::visit_mut::visit_expr_mut(self, expr); // will cause all variables below to be replaced by old_value.some_field self.within_old = false; - println!("done searching contents of old()"); + println!("done searching contents of old(), expression now: {}", quote!{#expr}); } ":: prusti_contracts :: forall" => { println!("recognized forall!"); @@ -235,7 +220,7 @@ impl TryFrom<&FnArg> for Argument { match arg { FnArg::Typed(syn::PatType { pat, ty, .. }) => { if let syn::Pat::Ident(pat_ident) = *pat.clone() { - let is_ref = matches!(**ty, syn::Type::Reference(_)); + let is_ref = matches!(**ty, syn::Type::Reference(_)); let arg = Argument { name: pat_ident.ident.to_string(), ty: *ty.clone(), @@ -253,8 +238,8 @@ impl TryFrom<&FnArg> for Argument { } } -#[derive(Clone)] -enum Quantifier { - Exists(Vec<(String, String)>), - Forall(Vec<(String, String)>), -} +// #[derive(Clone)] +// enum Quantifier { +// Exists(Vec<(String, String)>), +// Forall(Vec<(String, String)>), +// } diff --git a/prusti-interface/src/specs/mod.rs b/prusti-interface/src/specs/mod.rs index 4d102bc22dd..4822bacc7f5 100644 --- a/prusti-interface/src/specs/mod.rs +++ b/prusti-interface/src/specs/mod.rs @@ -77,6 +77,7 @@ pub struct SpecCollector<'a, 'tcx> { spec_functions: FxHashMap, /// the functions who's specifications have associated checks. check_functions: FxHashMap, + store_functions: FxHashMap, /// Map from functions/loops/types to their specifications. procedure_specs: FxHashMap, @@ -99,6 +100,7 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { env, spec_functions: FxHashMap::default(), check_functions: FxHashMap::default(), + store_functions: FxHashMap::default(), procedure_specs: FxHashMap::default(), procedure_checks: FxHashMap::default(), loop_specs: vec![], @@ -140,6 +142,8 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { } fn determine_checks(&self, def_spec: &mut typed::DefSpecificationMap) { + // local_id: defId of the annotated function + // checks: uuids + kind of the check for (local_id, checks) in self.procedure_checks.iter() { let mut function_checks = Vec::new(); for check in checks { @@ -147,17 +151,24 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { SpecIdRef::Precondition(id) => { let fn_id = self.check_functions.get(id).unwrap(); typed::CheckType::Pre(fn_id.to_def_id()) - }, + } SpecIdRef::Postcondition(id) => { let fn_id = self.check_functions.get(id).unwrap(); - typed::CheckType::Post(fn_id.to_def_id()) - }, + // postconditions always have a fn storing old values + let store_fn_id = self.store_functions.get(id).unwrap(); + typed::CheckType::Post { + check: fn_id.to_def_id(), + old_store: store_fn_id.to_def_id(), + } + } // Todo: Pledges, Assume? - _ => unreachable!() + _ => unreachable!(), }; function_checks.push(kind); } - def_spec.checks.insert(local_id.to_def_id(), function_checks); + def_spec + .checks + .insert(local_id.to_def_id(), function_checks); } } @@ -477,10 +488,20 @@ fn get_procedure_check_ids(def_id: DefId, attrs: &[ast::Attribute]) -> Vec intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { } } else if let Some(raw_check_id) = read_prusti_attr("check_id", attrs) { // check_id work just like spec_ids - let spec_id = parse_spec_id(raw_check_id, def_id); - self.check_functions.insert(spec_id, local_id); + let check_id = parse_spec_id(raw_check_id, def_id); + self.check_functions.insert(check_id, local_id); + } else if let Some(raw_store_id) = read_prusti_attr("store_id", attrs) { + let store_id = parse_spec_id(raw_store_id, def_id); + self.store_functions.insert(store_id, local_id); } else { // Don't collect specs "for" spec items @@ -614,8 +638,8 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { if let Some(procedure_spec_ref) = get_procedure_spec_ids(def_id, attrs) { self.procedure_specs.insert(local_id, procedure_spec_ref); } - let check_id = get_procedure_check_ids(def_id, attrs); - self.procedure_checks.insert(local_id, check_id); + let check_ids = get_procedure_check_ids(def_id, attrs); + self.procedure_checks.insert(local_id, check_ids); // Collect model type flag if has_to_model_fn_attr(attrs) { diff --git a/prusti-interface/src/specs/typed.rs b/prusti-interface/src/specs/typed.rs index 252898aa3b6..0353839e2bd 100644 --- a/prusti-interface/src/specs/typed.rs +++ b/prusti-interface/src/specs/typed.rs @@ -26,7 +26,7 @@ pub struct DefSpecificationMap { #[derive(Debug, Clone)] pub enum CheckType { Pre(DefId), - Post(DefId), + Post { check: DefId, old_store: DefId }, // actual check and old_store function Assume(DefId), Pledge{rhs: DefId, lhs: DefId}, } @@ -83,16 +83,16 @@ impl DefSpecificationMap { } } - pub fn get_post_checks(&self, def_id: &DefId) -> Vec { + pub fn get_post_checks(&self, def_id: &DefId) -> Vec<(DefId, DefId)> { let checks_opt = self.checks.get(def_id); if let Some(checks) = checks_opt { checks.iter().filter_map(|el| - if let CheckType::Post(id) = el { - Some(id) + if let CheckType::Post { check, old_store } = el { + Some((*check, *old_store)) } else { None } - ).cloned().collect() + ).collect() } else { Vec::new() } diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index e7e5fa401f7..973595d5df8 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -18,9 +18,8 @@ use prusti_rustc_interface::{ }; #[derive(Default)] -pub struct PrustiCompilerCalls { - check_ids: Vec, -} +pub struct PrustiCompilerCalls; + // Running `get_body_with_borrowck_facts` can be very slow, therefore we avoid it when not // necessary; for crates which won't be verified or spec_fns it suffices to load just the fn body diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index c2ad1cbc485..66669798326 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -21,7 +21,6 @@ use callbacks::PrustiCompilerCalls; use lazy_static::lazy_static; use log::info; use prusti_common::{config, report::user, Stopwatch}; -use prusti_interface::specs; use prusti_rustc_interface::interface::interface::try_print_query_stack; use std::{borrow::Cow, env, panic}; use tracing_chrome::{ChromeLayerBuilder, FlushGuard}; diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index d3393e26041..ab6d72c89cc 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -1,19 +1,16 @@ use prusti_interface::specs::typed::DefSpecificationMap; use prusti_rustc_interface::{ - data_structures::{graph::WithStartNode, steal::Steal}, - index::vec::IndexVec, + data_structures::steal::Steal, interface::DEFAULT_QUERY_PROVIDERS, middle::{ mir::{ - interpret::{ConstValue, Scalar}, patch::MirPatch, - terminator, visit::MutVisitor, - BasicBlock, BasicBlockData, BasicBlocks, Body, Constant, ConstantKind, Location, - Operand, Place, SourceInfo, SourceScope, Statement, StatementKind, Terminator, + BasicBlock, BasicBlockData, Body, Constant, ConstantKind, + Operand, Place, SourceInfo, SourceScope, Terminator, TerminatorKind, }, - ty::{self, ScalarInt, Ty, TyCtxt, TyKind}, + ty::{self, Ty, TyCtxt, TyKind}, }, span::{ def_id::{DefId, LocalDefId}, @@ -36,7 +33,7 @@ pub(crate) fn mir_checked( // SAFETY: Is definitely not safe at the moment let specs = unsafe { SPECS.clone().unwrap() }; - let steal = ((*DEFAULT_QUERY_PROVIDERS).mir_drops_elaborated_and_const_checked)(tcx, def); + let steal = (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def); let mut stolen = steal.steal(); let mut visitor = InsertChecksVisitor::new(tcx, specs); @@ -49,7 +46,7 @@ pub(crate) fn mir_checked( pub struct InsertChecksVisitor<'tcx> { tcx: TyCtxt<'tcx>, specs: DefSpecificationMap, - post_check_types: HashMap, (DefId, Vec)>, + post_check_types: HashMap, (DefId, Vec<(DefId, DefId)>)>, current_patcher: Option>, } @@ -60,6 +57,8 @@ impl<'tcx> InsertChecksVisitor<'tcx> { // A `Ty` representing it does exist however. // That's why we transform the specification map in the following way let mut post_check_types = HashMap::new(); + // specs.checks contains all the ids of functions that are annotated with + // some check_id for (id, _) in specs.checks.iter() { let checks = specs.get_post_checks(id); let subst = ty::List::empty(); @@ -90,8 +89,16 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { for check_id in pre_check_ids { let mut patch = MirPatch::new(body); let start_node = BasicBlock::from_usize(0); - let new_block = - new_call_block(self.tcx, &mut patch, check_id, body, Some(start_node), None); + let (new_block, _) = new_call_block( + self.tcx, + &mut patch, + check_id, + body, + Some(start_node), + None, + None, + None, + ); patch.apply(body); // swap first and last node, so our new block is called on entry body.basic_blocks_mut().swap(start_node, new_block); @@ -110,52 +117,101 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { mir_patch.unwrap().apply(body); } - fn visit_terminator(&mut self, terminator: &mut Terminator<'tcx>, location: Location) { + fn visit_basic_block_data(&mut self, block: BasicBlock, data: &mut BasicBlockData<'tcx>) { // our goal here is to find calls to functions where we want to check // their precondition afterwards - self.super_terminator(terminator, location); - if let TerminatorKind::Call { - func: Operand::Constant(box constant), - target, - destination, + self.super_basic_block_data(block, data); + // we will be adding blocks and new blocks will be representing the + // main block, this variable is used to update it. + + if let Some(Terminator { + kind: terminator_kind, .. - } = &mut terminator.kind + }) = &data.terminator { - if let Constant { - literal: ConstantKind::Val(value, ty), + let mut original_block = block; + let original_terminator = data.terminator.clone().unwrap().clone(); + if let TerminatorKind::Call { + func: + Operand::Constant(box Constant { + literal: ConstantKind::Val(_, ty), + .. + }), + target, + destination, + args, .. - } = constant + } = terminator_kind { println!("Call terminator: {:?}", ty); + let mut current_target = *target; // lookup if there is a check function: - if let Some((call_id, id_vec)) = self.post_check_types.get(&ty) { + if let Some((call_id, id_vec)) = self.post_check_types.get(ty) { + let called_body: Body = self + .tcx + .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( + call_id.as_local().unwrap(), + )) + .borrow() + .clone(); + println!("inserting checks for {} specification items", id_vec.len()); // since there might be multiple blocks to be inserted, - for check_id in id_vec { + for (check_id, old_store_id) in id_vec { println!("Now inserting a runtime check for a postcondition"); + println!("Old store defid: {:?}", old_store_id); let mut patch = self.current_patcher.take().unwrap(); - let called_body: Body = self + + let old_store_body = self .tcx .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( - call_id.as_local().unwrap(), + old_store_id.as_local().unwrap(), )) - .borrow() - .clone(); + .borrow(); + + // create a new internal to store result of old_store function + let old_ret_ty = old_store_body.return_ty(); + println!("expecting return type {:?} for old_store function", old_ret_ty); + let old_dest_place = Place::from(patch.new_internal(old_ret_ty, DUMMY_SP)); // we store the target, create a new block per check function // chain these with the final call having the original target, // change the target of the call to the first block of our chain. - let block = new_call_block( + let (block, _) = new_call_block( self.tcx, &mut patch, *check_id, &called_body, - *target, - Some(*destination), + current_target, + Some(*destination), // destination is now result arg + Some(old_dest_place), + Some(args.clone()), ); - // from here we can not really add this block to the cfg - // so we need to store it in our visitor.. - // It needs to be jumped to after this call and has our calls - // original target.. - *target = Some(block); + current_target = Some(block); + + let mut call_fn_terminator = original_terminator.clone(); + replace_target(&mut call_fn_terminator, block); + let new_block_data = BasicBlockData::new(Some(call_fn_terminator)); + let new_block = patch.new_block(new_block_data); + + let subst = ty::List::empty(); // potentially bad? + let store_func_ty = self.tcx.mk_ty_from_kind(TyKind::FnDef(*old_store_id, subst)); + let store_func = Operand::Constant(Box::new(Constant { + span: DUMMY_SP, + user_ty: None, + literal: ConstantKind::zero_sized(store_func_ty), + })); + + let store_terminator = TerminatorKind::Call { + func: store_func, + args: args.clone(), + destination: old_dest_place, + target: Some(new_block), + cleanup: None, + from_hir_call: false, + fn_span: old_store_body.span, + }; + patch.patch_terminator(original_block, store_terminator); + original_block = new_block; + // If there are multiple checks, this also should behave // correctly, since on the second iteration this target // is already the new block @@ -185,23 +241,36 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { // } } +fn replace_target(terminator: &mut Terminator, new_target: BasicBlock) { + if let TerminatorKind::Call { + target, + .. + } = &mut terminator.kind { + *target = Some(new_target); + } +} + + fn new_call_block<'tcx>( tcx: TyCtxt<'tcx>, patch: &mut MirPatch<'tcx>, - func: DefId, - caller: &Body, + terminator_call: DefId, + attached_to_body: &Body, target: Option, result: Option>, -) -> BasicBlock { + old_value: Option>, + args_opt: Option>>, +) -> (BasicBlock, Place<'tcx>) { let body_to_insert: Body = tcx .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( - func.as_local().unwrap(), + terminator_call.as_local().unwrap(), )) .borrow() .clone(); - let ret_ty = body_to_insert.return_ty().clone(); - assert!(ret_ty.is_bool() || ret_ty.is_unit()); + let ret_ty = body_to_insert.return_ty(); + // assert!(ret_ty.is_bool() || ret_ty.is_unit()); + // for store functions it can absolutely have a return type // should always be block 0 but let's be certain.. println!("Target node is {:?}", target); // let mut loc = Location { @@ -221,7 +290,7 @@ fn new_call_block<'tcx>( let dest_place: Place = Place::from(patch.new_internal(ret_ty, DUMMY_SP)); let subst = ty::List::empty(); // potentially bad? - let func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(func, subst)); // do I need substs? + let func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(terminator_call, subst)); // do I need substs? println!("Function type: {:?}", func_ty); let func = Operand::Constant(Box::new(Constant { span: DUMMY_SP, @@ -229,25 +298,33 @@ fn new_call_block<'tcx>( literal: ConstantKind::zero_sized(func_ty), })); - // determine the arguments! - // Todo: deal with result! - // and make it less ugly.. But not sure how this is supposed to be done - let caller_nr_args = caller.arg_count; let mut args = Vec::new(); - // now the final mapping to operands: - for (local, decl) in caller.local_decls.iter_enumerated() { - let index = local.index(); - if index != 0 && index <= caller_nr_args { - args.push(Operand::Move(Place { - local, - projection: ty::List::empty(), - })); + if let Some(arguments) = args_opt { + args = arguments; + } else { + // determine the arguments! + // Todo: deal with result! + // and make it less ugly.. But not sure how this is supposed to be done + let caller_nr_args = attached_to_body.arg_count; + // now the final mapping to operands: + for (local, _decl) in attached_to_body.local_decls.iter_enumerated() { + let index = local.index(); + if index != 0 && index <= caller_nr_args { + args.push(Operand::Copy(Place { + local, + projection: ty::List::empty(), + })); + } } } if let Some(result_operand) = result { println!("Adding the result operand!"); args.push(Operand::Move(result_operand)); } + if let Some(old_value_operand) = old_value { + println!("Adding the old_value operand"); + args.push(Operand::Move(old_value_operand)); + } let terminator_kind = TerminatorKind::Call { func, @@ -267,7 +344,7 @@ fn new_call_block<'tcx>( kind: terminator_kind, }; let blockdata = BasicBlockData::new(Some(terminator)); - patch.new_block(blockdata) + (patch.new_block(blockdata), dest_place) } // If we re-order the IndexVec containing the basic blocks, we will need to adjust From 00d47fc14d9712d3809fb39d427621de68c0c707 Mon Sep 17 00:00:00 2001 From: cedric Date: Mon, 29 May 2023 14:55:14 +0200 Subject: [PATCH 08/45] Runtime check support for quantifiers, old stores and postconditions --- prusti-contracts/prusti-contracts/src/lib.rs | 2 +- .../prusti-specs/src/boundary_extraction.rs | 263 ++++++++++ prusti-contracts/prusti-specs/src/lib.rs | 1 + prusti-contracts/prusti-specs/src/rewriter.rs | 58 +-- .../prusti-specs/src/runtime_checks.rs | 489 ++++++++++++++---- prusti-interface/src/specs/mod.rs | 4 +- prusti-interface/src/specs/typed.rs | 10 +- prusti/src/driver.rs | 2 + prusti/src/mir_helper.rs | 148 ++++++ prusti/src/mir_modify.rs | 267 ++++------ 10 files changed, 921 insertions(+), 323 deletions(-) create mode 100644 prusti-contracts/prusti-specs/src/boundary_extraction.rs create mode 100644 prusti/src/mir_helper.rs diff --git a/prusti-contracts/prusti-contracts/src/lib.rs b/prusti-contracts/prusti-contracts/src/lib.rs index 28ab1bce27d..b6106fb6aca 100644 --- a/prusti-contracts/prusti-contracts/src/lib.rs +++ b/prusti-contracts/prusti-contracts/src/lib.rs @@ -1,4 +1,4 @@ -#![no_std] +// #![no_std] /// A macro for writing a precondition on a function. pub use prusti_contracts_proc_macros::requires; diff --git a/prusti-contracts/prusti-specs/src/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/boundary_extraction.rs new file mode 100644 index 00000000000..8e9651f40cf --- /dev/null +++ b/prusti-contracts/prusti-specs/src/boundary_extraction.rs @@ -0,0 +1,263 @@ +use quote::ToTokens; +use rustc_hash::FxHashSet; +use syn::{self, visit::Visit, BinOp}; + +pub struct BoundExtractor { + // the set of bound variables within that expression + pub name_set: FxHashSet, +} + +impl BoundExtractor { + pub fn extract_bounds_top(expr: syn::Expr, name: &String, name_set: &FxHashSet) -> Vec { + // first make sure the expression has the form A ==> B (or equivalent) + // and then extract a bound from A + let mut extractor = BoundExtractor { + name_set: name_set.clone(), + }; + let simplified = simplify_expression(&expr); + match simplified { + syn::Expr::Binary(syn::ExprBinary { + left: box e1, + op: syn::BinOp::Or(_), + .. + }) => { + // there are only a few kind of ways to express boundaries on the + // input values: the ones we allow / recognize so far are: + // - !(bound_cond) || property + if let syn::Expr::Unary(syn::ExprUnary { + op: syn::UnOp::Not(_), + expr: box bound_expr, + .. + }) = e1 + { + // in this case, the contents of the quantifier have the form + // !(potential boundary condition) || (check) + extractor.extract_bounds_recursive(bound_expr, name) + } else { + vec![] + } + } + _ => vec![], + } + } + + + pub fn extract_bounds_recursive(&mut self, expr: syn::Expr, name: &String) -> Vec { + let simplified = simplify_expression(&expr); + match simplified { + syn::Expr::Binary(syn::ExprBinary { + box left, + box right, + op, + .. + }) => { + match op { + // combining results: + syn::BinOp::And(_) => { + let mut left_bound = self.extract_bounds_recursive(left, name); + let mut right_bound = self.extract_bounds_recursive(right, name); + left_bound.append(&mut right_bound); + left_bound + } + BinOp::Lt(_) | BinOp::Le(_) | BinOp::Gt(_) | BinOp::Ge(_) => { + // one of the two operators have to include "name" if this is + // is a boundary: + let variables = self.find_identifiers(&expr); + if variables.contains(name) { + // might be a bound for our current variable + // transform it such that left is exactly x, + // and right is the upper or lower boundary + let bound_opt = self.derive_boundary(name, &left, &right, &op); + if let Some(bound) = bound_opt { + vec![bound] + } else { + vec![] + } + } else { + // definitely not a boundary for our variable + vec![] + } + } + + _ => vec![], + } + } + syn::Expr::Unary(syn::ExprUnary { + op: syn::UnOp::Not(_), + expr: box sub_expr, + .. + }) => { + let sub_bounds = self.extract_bounds_recursive(sub_expr, name); + // invert all the boundaries of the sub_expression + sub_bounds + .iter() + .map(|bound| bound.clone().invert()) + .collect() + } + _ => vec![], + } + } + + pub fn derive_boundary( + &self, + name: &String, + left: &syn::Expr, + right: &syn::Expr, + op: &syn::BinOp, + ) -> Option { + let left_simp = simplify_expression(left); + let right_simp = simplify_expression(right); + let mut new_op = *op; + let mut bound_expr = None; + + // for now do it simple: One of the two expressions has to be + // exactly "name" + let left_name_opt = expression_name(&left_simp); + let right_name_opt = expression_name(&right_simp); + if let Some(left_name) = left_name_opt { + if &left_name == name { + bound_expr = Some(right.clone()); + } + } + if let Some(right_name) = right_name_opt { + if &right_name == name { + // in case they both are just "name", this is not a boundary + assert!(bound_expr.is_none()); + // turn the condition around! + new_op = match op { + BinOp::Lt(_) => BinOp::Gt(syn::token::Gt::default()), + BinOp::Gt(_) => BinOp::Lt(syn::token::Lt::default()), + BinOp::Le(_) => BinOp::Ge(syn::token::Ge::default()), + BinOp::Ge(_) => BinOp::Le(syn::token::Le::default()), + _ => panic!(), + }; + bound_expr = Some(left.clone()); + } + } + // now we can be sure (if bound_expr is some) that our comparison has the + // form `name op bound_expr` + + // now create boundary: + if let Some(bound) = bound_expr { + let (included, kind) = match new_op { + BinOp::Lt(_) => (false, BoundaryKind::Upper), + BinOp::Gt(_) => (false, BoundaryKind::Lower), + BinOp::Le(_) => (true, BoundaryKind::Upper), + BinOp::Ge(_) => (true, BoundaryKind::Lower), + // this is actually checked before calling this function + _ => unreachable!(), + }; + let dependent_vars = self.find_identifiers(&bound); + Some(Boundary { + bound, + included, + kind, + dependent_vars, + }) + } else { + None + } + } + + fn find_identifiers(&self, expr: &syn::Expr) -> FxHashSet { + let mut finder = IdentifierFinder { + bound_vars: FxHashSet::default(), + }; + finder.visit_expr(expr); + finder + .bound_vars + .into_iter() + .filter(|x| self.name_set.contains(x)) + .collect() + } +} + +// The following two functions should go into some syn-helper file or similar + +/// syn expressions can be part of a block, put into braces etc, all of which make +/// it harder to analyze them. +/// This function should help us simplify +pub fn simplify_expression(expr: &syn::Expr) -> syn::Expr { + match expr { + syn::Expr::Block(syn::ExprBlock { block, .. }) => { + if block.stmts.len() == 1 { + let res = block.stmts.get(0).unwrap().clone(); + if let syn::Stmt::Expr(sub_expr) = res { + let res = simplify_expression(&sub_expr); + return res; + } + } + } + syn::Expr::Paren(syn::ExprParen { + expr: box sub_expr, .. + }) => { + let res = simplify_expression(sub_expr); + return res; + } + syn::Expr::Type(syn::ExprType { expr: sub_expr, .. }) => { + let res = simplify_expression(sub_expr); + return res; + } + _ => {} + } + expr.clone() +} + +// if expression is a identifier, get the name: +pub fn expression_name(expr: &syn::Expr) -> Option { + if let syn::Expr::Path(syn::ExprPath { path, .. }) = expr { + return Some(path.to_token_stream().to_string()); + } + None +} + +#[derive(Clone)] +pub struct Boundary { + pub bound: syn::Expr, + /// Whether or not that value is still in the range + pub included: bool, + /// upper or lower bound? + pub kind: BoundaryKind, + /// other variables that are part of the current quantifier, that this + /// boundary relies on (i.e. must have been defined before) + pub dependent_vars: FxHashSet, +} + +#[derive(Clone, Debug, Copy, PartialEq)] +pub enum BoundaryKind { + Upper, + Lower, +} + +impl Boundary { + pub fn invert(self) -> Self { + let kind = match self.kind { + BoundaryKind::Upper => BoundaryKind::Lower, + BoundaryKind::Lower => BoundaryKind::Upper, + }; + Self { + bound: self.bound, + included: !self.included, + kind, + dependent_vars: self.dependent_vars, + } + } + +} + +// a Visitor to extract identifiers that occurr in an expression +pub struct IdentifierFinder { + pub bound_vars: FxHashSet, +} + +impl<'ast> syn::visit::Visit<'ast> for IdentifierFinder { + fn visit_expr_path(&mut self, expr_path: &'ast syn::ExprPath) { + if expr_path.path.segments.len() == 1 { + // it is an identifier + let name = expr_path.to_token_stream().to_string(); + self.bound_vars.insert(name); + } + // keep visiting :) + syn::visit::visit_expr_path(self, expr_path); + } +} diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index 877f3060f0a..e465d2bb215 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -24,6 +24,7 @@ mod type_model; mod user_provided_type_params; mod print_counterexample; mod runtime_checks; +mod boundary_extraction; use proc_macro2::{Span, TokenStream, TokenTree}; use quote::{quote, quote_spanned, ToTokens}; diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index faddc8d4aff..fca1a7a2a40 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -9,10 +9,7 @@ use crate::{ }; use proc_macro2::{Span, TokenStream}; use quote::{format_ident, quote, quote_spanned}; -use syn::{ - parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, visit_mut::VisitMut, Pat, Token, - Type, -}; +use syn::{parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, Pat, Token, Type}; pub(crate) struct AstRewriter { spec_id_generator: SpecificationIdGenerator, @@ -69,7 +66,7 @@ impl AstRewriter { None } - fn generate_result_arg(&self, item: &T) -> syn::FnArg { + pub(crate) fn generate_result_arg(item: &T) -> syn::FnArg { let item_span = item.span(); let output_ty = match &item.sig().output { syn::ReturnType::Default => parse_quote_spanned!(item_span=> ()), @@ -140,7 +137,7 @@ impl AstRewriter { spec_item.sig.inputs = item.sig().inputs.clone(); match spec_type { SpecItemType::Postcondition | SpecItemType::Pledge => { - let fn_arg = self.generate_result_arg(item); + let fn_arg = Self::generate_result_arg(item); spec_item.sig.inputs.push(fn_arg); } _ => (), @@ -205,37 +202,34 @@ impl AstRewriter { // quote_spanned! {item_span => !!}, // ), // }; - let mut check_translator = CheckTranslator::new(item); - let mut expr_to_check = syn::parse2::(expr).unwrap(); - - // this call will modify the expression, but also collect the information - // about what expressions we need to store etc. - check_translator.visit_expr_mut(&mut expr_to_check); + let check_translator = CheckTranslator::new(item, expr); - let mut check_item: syn::ItemFn = parse_quote_spanned! {item_span=> - #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] - #[prusti::spec_only] - #[prusti::check_id = #check_id_str] - fn #check_item_name() { - assert!(#expr_to_check); - } - }; - - check_item.sig.generics = item.sig().generics.clone(); - check_item.sig.inputs = item.sig().inputs.clone(); match spec_type { SpecItemType::Postcondition | SpecItemType::Pledge => { - let mut store_item = - check_translator.generate_store_function(item, store_old_item_name, check_id_str); - store_item.sig.generics = item.sig().generics.clone(); - store_item.sig.inputs = item.sig().inputs.clone(); - let fn_arg = self.generate_result_arg(item); - let old_arg = check_translator.construct_old_type(item); - check_item.sig.inputs.push(fn_arg); - check_item.sig.inputs.push(old_arg); + let check_item = check_translator.generate_check_function( + item, + check_item_name, + &check_id_str, + true, + true, + ); + let store_item = check_translator.generate_store_function( + item, + store_old_item_name, + check_id_str, + ); Ok((syn::Item::Fn(check_item), Some(syn::Item::Fn(store_item)))) } - _ => Ok((syn::Item::Fn(check_item), None)), + _ => { + let check_item = check_translator.generate_check_function( + item, + check_item_name, + &check_id_str, + false, + false, + ); + Ok((syn::Item::Fn(check_item), None)) + } } } diff --git a/prusti-contracts/prusti-specs/src/runtime_checks.rs b/prusti-contracts/prusti-specs/src/runtime_checks.rs index 858f32185d4..2302bee31fa 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks.rs @@ -1,81 +1,82 @@ -use crate::{common::HasSignature, specifications::untyped}; +use crate::{ + boundary_extraction::{BoundExtractor, Boundary, BoundaryKind, self}, + common::HasSignature, + rewriter::AstRewriter, + specifications::untyped, +}; use proc_macro2::TokenStream; use quote::{quote, ToTokens}; -use rustc_hash::FxHashMap; +use rustc_hash::{FxHashMap, FxHashSet}; use syn::{ - parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, - visit_mut::VisitMut, Expr, ExprCall, FnArg, + parse_quote, parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, + visit_mut::VisitMut, Expr, FnArg, }; pub struct CheckTranslator { - rust_only: bool, // no translation needed if true - within_old: bool, - // surrounding_quantifiers: Vec, // list of surrounding quantifiers - inputs: FxHashMap, - // each old argument that needs to be stored will be stored as a field - // of a tuple. Need to keep track of them - highest_old_index: usize, + /// The expression within the specification + expression: Expr, + visitor: CheckVisitor, } impl CheckTranslator { - pub fn new(item: &untyped::AnyFnItem) -> Self { + pub fn new(item: &untyped::AnyFnItem, tokens: TokenStream) -> Self { // figure out keywords - let inputs = item - .sig() - .inputs - .iter() - .cloned() - .filter_map(|el| Argument::try_from(&el).ok()) - .map(|el| (el.name.clone(), el)) - .collect(); + let mut expression: syn::Expr = syn::parse2::(tokens).unwrap(); + let mut visitor = CheckVisitor::new(item); + // Does it make sense to already run the visitor here? + visitor.visit_expr_mut(&mut expression); Self { - rust_only: true, - within_old: false, - // surrounding_quantifiers: Vec::new(), - inputs, - highest_old_index: 0, + expression, + visitor, } } - pub fn old_values_type(&self, item: &T) -> syn::Type { - let mut old_values_type: syn::Type = parse_quote_spanned! {item.span() => ()}; - if let syn::Type::Tuple(syn::TypeTuple { elems, .. }) = &mut old_values_type { - // start adding the elements we want to store: - for i in 0..self.highest_old_index { - for el in self.inputs.values() { - if el.used_in_old && el.old_store_index == i { - match &el.ty { - // if we have a reference, cloning will result in its inner type - // (usually...) - syn::Type::Reference(cloned_type) => elems.push(*cloned_type.elem.clone()), - _ => elems.push(el.ty.clone()), - } - } - } - } - if !elems.empty_or_trailing() { - elems.push_punct(syn::token::Comma::default()); + // generate a function that checks a pre or postcondition + pub fn generate_check_function( + &self, + item: &untyped::AnyFnItem, + item_name: syn::Ident, + check_id_str: &String, + has_old_arg: bool, + has_result: bool, + ) -> syn::ItemFn { + let expr_to_check = &self.expression; + let item_name_str = item_name.to_string(); + let mut check_item: syn::ItemFn = parse_quote_spanned! {item.span() => + #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] + #[prusti::spec_only] + #[prusti::check_id = #check_id_str] + fn #item_name() { + println!("check function {} is performed", #item_name_str); + assert!(#expr_to_check); } - } else { - unreachable!(); + }; + check_item.sig.generics = item.sig().generics.clone(); + // todo: make all types that are not already references, into references + check_item.sig.inputs = item.sig().inputs.clone(); + if has_result { + let result_arg = AstRewriter::generate_result_arg(item); + check_item.sig.inputs.push(result_arg); } - old_values_type - } - - pub fn construct_old_type(&self, item: &T) -> syn::FnArg { - let old_values_type: syn::Type = self.old_values_type(item); - parse_quote_spanned! {item.span() => - old_values: #old_values_type + if has_old_arg { + let old_arg = self.construct_old_fnarg(item, true); + // put it inside a reference: + let old_arg_ref: syn::FnArg = parse_quote_spanned! {item.span() => + #old_arg + }; + check_item.sig.inputs.push(old_arg_ref); } + check_item } - pub fn generate_store_function( + pub fn generate_store_function( &self, - item: &T, + item: &untyped::AnyFnItem, item_name: syn::Ident, check_id_str: String, ) -> syn::ItemFn { let mut exprs = self + .visitor .inputs .iter() .filter_map(|(_, x)| if x.used_in_old { Some(x) } else { None }) @@ -97,28 +98,105 @@ impl CheckTranslator { let old_values_type = self.old_values_type(item); // println!("resulting tuple: {}", quote!{#tuple}); - parse_quote_spanned! {item.span() => + let item_name_str = item_name.to_string(); + let mut res: syn::ItemFn = parse_quote_spanned! {item.span() => #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] #[prusti::spec_only] #[prusti::store_id = #check_id_str] fn #item_name() -> #old_values_type { + println!("store function {} is performed", #item_name_str); return (#tuple); } + }; + // store function has the same generics and arguments as the + // original annotated function + res.sig.generics = item.sig().generics.clone(); + res.sig.inputs = item.sig().inputs.clone(); + res + } + + /// After the visitor was run on an expression, this function + /// can be used to generate the type of the old_values tuple + /// important here is that it only contains the values that actually occurr + /// in old-expressions and not just all arguments + pub fn old_values_type(&self, item: &T) -> syn::Type { + let mut old_values_type: syn::Type = parse_quote_spanned! {item.span() => ()}; + if let syn::Type::Tuple(syn::TypeTuple { elems, .. }) = &mut old_values_type { + // start adding the elements we want to store: + for i in 0..self.visitor.highest_old_index { + for el in self.visitor.inputs.values() { + if el.used_in_old && el.old_store_index == i { + match &el.ty { + // if we have a reference, cloning will result in its inner type + // (usually...) + syn::Type::Reference(cloned_type) => { + elems.push(*cloned_type.elem.clone()) + } + _ => elems.push(el.ty.clone()), + } + } + } + } + // if brackets contain only one type, it's not a tuple. Therefore + // make a comma at the end, if there is at least one element + if !elems.empty_or_trailing() { + elems.push_punct(syn::token::Comma::default()); + } + } else { + unreachable!(); } - // parse_quote_spanned!{item.span() => - // fn #item_name() -> () { - // () - // } - // } - // - // println!("store function: {:?}", res.to_token_stream().to_string()); - // res + old_values_type } + + // at the moment deref is true in all use cases. Remove + pub fn construct_old_fnarg(&self, item: &T, deref: bool) -> syn::FnArg { + let old_values_type: syn::Type = self.old_values_type(item); + if deref { + parse_quote_spanned! {item.span() => + old_values: &#old_values_type + } + } else { + parse_quote_spanned! {item.span() => + old_values: #old_values_type + } + } + } + + // pub fn construct_function_args() + +} + +/// collects information about expression, but also transforms it +/// for check +pub struct CheckVisitor { + pub rust_only: bool, + pub within_old: bool, + pub inputs: FxHashMap, + pub highest_old_index: usize, } -impl VisitMut for CheckTranslator { +impl CheckVisitor { + pub fn new(item: &untyped::AnyFnItem) -> Self { + let inputs = item + .sig() + .inputs + .iter() + .cloned() + .filter_map(|el| Argument::try_from(&el).ok()) + .map(|el| (el.name.clone(), el)) + .collect(); + println!("collected inputs: {:?}", inputs); + Self { + rust_only: true, + within_old: false, + inputs, + highest_old_index: 0, + } + } +} + +impl VisitMut for CheckVisitor { fn visit_expr_mut(&mut self, expr: &mut Expr) { - println!("visiting expression: {}", quote!{#expr}); match expr { Expr::Path(expr_path) => { // collect arguments that occurr within old expression @@ -130,6 +208,8 @@ impl VisitMut for CheckTranslator { // argument used within an old expression? // not already marked as used in old? if self.within_old { + // if it was not already marked to be stored + // needs to be checked for indeces to be correct if !arg.used_in_old { println!("Marking variable {} to be stored", arg.name); arg.used_in_old = true; @@ -141,58 +221,82 @@ impl VisitMut for CheckTranslator { arg.old_store_index.to_string().parse().unwrap(); let tokens = if arg.is_ref { // cloning will deref the value.. - quote! {&old_values.#index_token} + quote! {(&(&old_values.#index_token).clone())} } else { // unfortunately it could still be a reference.. // no real solution at this level - quote! {old_values.#index_token} + quote! {((&old_values.#index_token).clone())} }; println!("tokens: {}", tokens); - let new_path : syn::Expr = syn::parse2(tokens).unwrap(); + let new_path: syn::Expr = syn::parse2(tokens).unwrap(); *expr = new_path; } + } else { + println!("identifier {} was not found in args\n\n", name); } // duplicating identifiers by defining new variables within specs // can break this! } syn::visit_mut::visit_expr_mut(self, expr); } - Expr::Call(ExprCall { func, args, .. }) => { - assert!(args.len() == 1); - match *func.clone() { - Expr::Path(syn::ExprPath { path, .. }) => { - let name = path.to_token_stream().to_string(); - println!("found function with name {}", name); - match name.as_str() { - ":: prusti_contracts :: old" | "prusti_contracts :: old" | "old" => { - let sub_expr = args.pop(); - // remove old-call and replace with content expression - *expr = sub_expr.unwrap().value().clone(); - println!("recognized old with sub_expr: {}!", quote!{#expr}); - self.rust_only = false; // no translation is not enough.. - self.within_old = true; - syn::visit_mut::visit_expr_mut(self, expr); - // will cause all variables below to be replaced by old_value.some_field - self.within_old = false; - println!("done searching contents of old(), expression now: {}", quote!{#expr}); - } - ":: prusti_contracts :: forall" => { - println!("recognized forall!"); - // extend surrounding_quantifiers correctly! - } - ":: prusti_contracts :: exists" => { - println!("recognized exists!"); - // extend self.surround_quantifiers correctly! - } - _ => syn::visit_mut::visit_expr_mut(self, expr), + Expr::Call(call) + // func: box Expr::Path(syn::ExprPath { path, .. }), + // .. + => { + // move this function, has nothing to do with boundary extraction + let path_expr = (*call.func).clone(); + let name = if let Some(name) = boundary_extraction::expression_name(&path_expr) { + name + } else { + // still visit recursively + syn::visit_mut::visit_expr_mut(self, expr); + println!("WARNING: Function call where name could not be extracted!\n\n"); + return; + }; + match name.as_str() { + ":: prusti_contracts :: old" | "prusti_contracts :: old" | "old" => { + let sub_expr = call.args.pop(); + // remove old-call and replace with content expression + *expr = sub_expr.unwrap().value().clone(); + println!("recognized old with sub_expr: {}!", quote! {#expr}); + self.rust_only = false; // no translation is not enough.. + self.within_old = true; + syn::visit_mut::visit_expr_mut(self, expr); + // will cause all variables below to be replaced by old_value.some_field + self.within_old = false; + println!( + "done searching contents of old(), expression now: {}", + quote! {#expr} + ); + } + ":: prusti_contracts :: forall" => { + syn::visit_mut::visit_expr_call_mut(self, call); + // arguments are triggers and then the closure: + let quant_closure_expr: syn::Expr = call.args.last().unwrap().clone(); + if let syn::Expr::Closure(expr_closure) = quant_closure_expr { + // we are throwing away any triggers + // extract all the relevant information, construct a + // new expression + let check_expr = translate_quantifier_expression( + &expr_closure, + QuantifierKind::Forall, + ); + *expr = check_expr; + } } + ":: prusti_contracts :: exists" => { + syn::visit_mut::visit_expr_call_mut(self, call); + // extend self.surround_quantifiers correctly! + let closure_expression: syn::Expr = call.args.last().unwrap().clone(); + if let syn::Expr::Closure(expr_closure) = closure_expression { + let check_expr = translate_quantifier_expression( + &expr_closure, + QuantifierKind::Exists, + ); + *expr = check_expr } } _ => syn::visit_mut::visit_expr_mut(self, expr), } - // check if your next successor is an ExprCall of old: - // the underlying expr_call must have set it! replace - // the old function call with whatever expression is it's - // argument! } _ => { syn::visit_mut::visit_expr_mut(self, expr); @@ -201,16 +305,24 @@ impl VisitMut for CheckTranslator { } } -/// Arguments to this function / i.e. specification. This struct is meant to +/// Arguments to a function / i.e. specification. This struct is meant to /// Keep track of them and collect information about how they are used -/// within specs to correctly store them. -struct Argument { +/// within specs to correctly store their old values for runtime checks. +#[derive(Debug)] +pub struct Argument { + /// name of the argument (stays the same from original function to specks to checks) pub name: String, + /// the type of this argument. If it's none, then only because this is a Self + /// type. pub ty: syn::Type, - pub used_in_old: bool, // set to true as soon as it occurrs within an old expr - pub old_store_index: usize, // field in old-tuple used by this argument - /// whether or not this field is a reference. On one hand this can be told - /// from the type.. + /// whether this value occurrs in an old expression. Don't want to clone + /// all args, since then they have to implement clone() and the type + /// resulting from cloning them must be known at ast level + pub used_in_old: bool, + /// field in old-tuple (old_values.X) where this argument will be stored + pub old_store_index: usize, + /// whether or not this field is a reference. We assume that all ref types + /// start with & (which obviously can be wrong) pub is_ref: bool, } @@ -233,13 +345,164 @@ impl TryFrom<&FnArg> for Argument { Err(()) } } - FnArg::Receiver(_) => Err(()), + FnArg::Receiver(syn::Receiver { reference, .. }) => { + let is_ref = reference.is_some(); + let ty: syn::Type = if is_ref { + parse_quote! {&Self} + } else { + parse_quote! {Self} + }; + let arg = Argument { + name: "self".to_string(), + ty, // newer versions have this field! could be useful.. + used_in_old: false, + old_store_index: 0, + is_ref, + }; + Ok(arg) + } } } } -// #[derive(Clone)] -// enum Quantifier { -// Exists(Vec<(String, String)>), -// Forall(Vec<(String, String)>), -// } +enum QuantifierKind { + Forall, + Exists, +} + +fn translate_quantifier_expression( + closure: &syn::ExprClosure, + kind: QuantifierKind, +) -> syn::Expr { + println!("translate is called"); + println!("quantifier nr args: {}", closure.inputs.len()); + let mut name_set: FxHashSet = FxHashSet::default(); + let bound_vars: Vec<(String, String)> = closure + .inputs + .iter() + .map(|pat: &syn::Pat| { + println!("Pattern: {:?}", pat); + if let syn::Pat::Type(syn::PatType { + pat: box syn::Pat::Ident(id), + ty: box ty, + .. + }) = pat + { + let name_str = id.to_token_stream().to_string(); + let type_str = ty.to_token_stream().to_string(); + println!("quantifier arg: {}: {}", name_str, type_str); + name_set.insert(name_str.clone()); + (name_str, type_str) + } else { + // maybe we can throw a more sensible error and make the + // check function a dummy check function + panic!("quantifiers without type annotations can not be checked at runtime"); + } + }) + .collect(); + + let expr = *closure.body.clone(); + + // initially wanted to handle multiple, but for now we dont.. + // for (name, ty) in bound_vars { + let (name, ty) = bound_vars.get(0).unwrap(); + match ty.as_str() { + // runtime checks for quantifiers only work for a limited set currently + "i8" | "i16" | "i32" | "i64" | "i128" | "isize" | "u8" | "u16" | "u32" | "u64" | "u128" + | "usize" => { + let bounds = BoundExtractor::extract_bounds_top(expr.clone(), name, &name_set); + println!("bounds extracted!"); + let mut upper_bound_opt = None; + let mut lower_bound_opt = None; + + // if there are multiple variables, potentially with dependencies + // the loops need to be in a specific order + assert!(bounds.len() <= 2); + let mut include_upper = true; // if we have the MAX upper limit, + for Boundary { + kind, + bound, + included, + .. + } in bounds.iter() + { + println!("Trying to define boundaries"); + // include it + match *kind { + BoundaryKind::Upper => { + // first idea was to add one here if inclusive, but + // this can lead to overflows! Need to use ..=x syntax + assert!(upper_bound_opt.is_none()); + println!("found upper bound, end included: {}", *included); + upper_bound_opt = Some(bound.clone()); + include_upper = *included; + } + BoundaryKind::Lower => { + lower_bound_opt = if *included { + // lower bound works the other way around + Some(bound.clone()) + } else { + Some(parse_quote! { + #bound + 1 + }) + } + } + } + } + let name_token: TokenStream = name.parse().unwrap(); + let ty_token: TokenStream = ty.parse().unwrap(); + let upper_bound = upper_bound_opt.unwrap_or(parse_quote_spanned!{closure.span() => + #ty_token::MAX + }); + let lower_bound = lower_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => + #ty_token::MIN + }); + + let range_expr: syn::Expr = if include_upper { + parse_quote_spanned! {closure.span() => + (#lower_bound)..=(#upper_bound) + } + } else { + parse_quote_spanned! {closure.span() => + (#lower_bound)..(#upper_bound) + } + }; + // maybe never turn them into strings in the first place.. + match kind { + QuantifierKind::Forall => { + let res = quote! { + { + let mut holds_forall = true; + for #name_token in #range_expr { + if !(#expr) { + holds_forall = false; + break; + } + } + holds_forall + } + }; + println!("res: {}", res); + syn::parse2(res).unwrap() + }, + QuantifierKind::Exists => { + println!("exists handled:"); + let res = quote! { + { + let mut exists = false; + for #name_token in #range_expr { + if #expr { + exists = true; + break; + } + } + exists + } + }; + syn::parse2(res).unwrap() + }, + } + } + _ => unimplemented!(), + } +} diff --git a/prusti-interface/src/specs/mod.rs b/prusti-interface/src/specs/mod.rs index 4822bacc7f5..8ca6be98fcc 100644 --- a/prusti-interface/src/specs/mod.rs +++ b/prusti-interface/src/specs/mod.rs @@ -150,13 +150,13 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { let kind = match check { SpecIdRef::Precondition(id) => { let fn_id = self.check_functions.get(id).unwrap(); - typed::CheckType::Pre(fn_id.to_def_id()) + typed::CheckKind::Pre(fn_id.to_def_id()) } SpecIdRef::Postcondition(id) => { let fn_id = self.check_functions.get(id).unwrap(); // postconditions always have a fn storing old values let store_fn_id = self.store_functions.get(id).unwrap(); - typed::CheckType::Post { + typed::CheckKind::Post { check: fn_id.to_def_id(), old_store: store_fn_id.to_def_id(), } diff --git a/prusti-interface/src/specs/typed.rs b/prusti-interface/src/specs/typed.rs index 0353839e2bd..6d9877e84ed 100644 --- a/prusti-interface/src/specs/typed.rs +++ b/prusti-interface/src/specs/typed.rs @@ -20,11 +20,13 @@ pub struct DefSpecificationMap { pub prusti_refutations: FxHashMap, pub ghost_begin: FxHashMap, pub ghost_end: FxHashMap, - pub checks: FxHashMap>, + /// for every annotated method, maps to a list of check functions to check + /// its contracts + pub checks: FxHashMap>, } #[derive(Debug, Clone)] -pub enum CheckType { +pub enum CheckKind { Pre(DefId), Post { check: DefId, old_store: DefId }, // actual check and old_store function Assume(DefId), @@ -72,7 +74,7 @@ impl DefSpecificationMap { let checks_opt = self.checks.get(def_id); if let Some(checks) = checks_opt { checks.iter().filter_map(|el| - if let CheckType::Pre(id) = el { + if let CheckKind::Pre(id) = el { Some(id) } else { None @@ -87,7 +89,7 @@ impl DefSpecificationMap { let checks_opt = self.checks.get(def_id); if let Some(checks) = checks_opt { checks.iter().filter_map(|el| - if let CheckType::Post { check, old_store } = el { + if let CheckKind::Post { check, old_store } = el { Some((*check, *old_store)) } else { None diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index 66669798326..7f9e9bd7813 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -14,7 +14,9 @@ mod arg_value; mod callbacks; mod verifier; +// move these 2 at some point mod mir_modify; +mod mir_helper; use arg_value::arg_value; use callbacks::PrustiCompilerCalls; diff --git a/prusti/src/mir_helper.rs b/prusti/src/mir_helper.rs new file mode 100644 index 00000000000..cff6d20bc45 --- /dev/null +++ b/prusti/src/mir_helper.rs @@ -0,0 +1,148 @@ +use prusti_rustc_interface::{ + middle::{ + mir::{self, Body, TerminatorKind}, + ty::{self, TyCtxt}, + }, + span::{self, def_id::DefId}, +}; + +// derive the function's type from a def_id, and an optional set of +// substitutions. If no substitutions are present, +// the identity will be used +pub fn function_operand<'tcx>( + def_id: DefId, + tcx: TyCtxt<'tcx>, + substs_opt: Option>, +) -> mir::Operand<'tcx> { + let substs = substs_opt.unwrap_or(ty::subst::InternalSubsts::identity_for_item(tcx, def_id)); + let func_ty = tcx.mk_ty_from_kind(ty::TyKind::FnDef(def_id, substs)); + mir::Operand::Constant(Box::new(mir::Constant { + span: span::DUMMY_SP, + user_ty: None, + literal: mir::ConstantKind::zero_sized(func_ty), + })) +} + +/// Given the name of a variable in the original program, find the +/// corresponding mir local +pub fn get_local_from_name(body: &Body<'_>, name: String) -> Option { + for debug_info in &body.var_debug_info { + // find the corresponding local in the var_debug_info + if debug_info.name.to_string() == name { + if let mir::VarDebugInfoContents::Place(place) = debug_info.value { + return Some(place.local); + } + } + } + None +} + +/// Just creates an erased region. Needed to create a borrow statement +/// in the MIR +pub fn dummy_region(tcx: TyCtxt<'_>) -> ty::Region<'_> { + let kind = ty::RegionKind::ReErased; + tcx.mk_region_from_kind(kind) +} + +pub fn rvalue_reference_to_place<'tcx>( + tcx: TyCtxt<'tcx>, + place: mir::Place<'tcx>, +) -> mir::Rvalue<'tcx> { + let dummy_region = dummy_region(tcx); + mir::Rvalue::Ref( + dummy_region, + mir::BorrowKind::Shared, + place, // the local to be dereferenced + ) +} + +// If we re-order the IndexVec containing the basic blocks, we will need to adjust +// some the basic blocks that terminators point to. This is what this function does +pub fn replace_outgoing_edges( + data: &mut mir::BasicBlockData, + from: mir::BasicBlock, + to: mir::BasicBlock, +) { + match &mut data.terminator_mut().kind { + TerminatorKind::Goto { target } => update_if_equals(target, from, to), + TerminatorKind::SwitchInt { targets, .. } => { + for bb1 in &mut targets.all_targets_mut().iter_mut() { + update_if_equals(bb1, from, to); + } + } + TerminatorKind::Call { + target, cleanup, .. + } => { + if let Some(target) = target { + update_if_equals(target, from, to); + } + if let Some(cleanup) = cleanup { + update_if_equals(cleanup, from, to); + } + } + TerminatorKind::Assert { + target: target_bb, + cleanup: opt_bb, + .. + } + | TerminatorKind::DropAndReplace { + target: target_bb, + unwind: opt_bb, + .. + } + | TerminatorKind::Drop { + target: target_bb, + unwind: opt_bb, + .. + } + | TerminatorKind::Yield { + resume: target_bb, + drop: opt_bb, + .. + } + | TerminatorKind::FalseUnwind { + real_target: target_bb, + unwind: opt_bb, + } => { + update_if_equals(target_bb, from, to); + if let Some(bb) = opt_bb { + update_if_equals(bb, from, to); + } + } + TerminatorKind::InlineAsm { + destination, + cleanup, + .. + } => { + // is this prettier? does this even modify the blockdata? + destination.map(|mut x| update_if_equals(&mut x, from, to)); + cleanup.map(|mut x| update_if_equals(&mut x, from, to)); + } + TerminatorKind::FalseEdge { + real_target, + imaginary_target, + } => { + update_if_equals(real_target, from, to); + update_if_equals(imaginary_target, from, to); + } + TerminatorKind::Resume + | TerminatorKind::Abort + | TerminatorKind::Return + | TerminatorKind::Unreachable + | TerminatorKind::GeneratorDrop => {} + } +} + +fn update_if_equals(dest: &mut T, from: T, to: T) { + if *dest == from { + *dest = to; + } +} + +/// Given a call terminator, change it's target (the target is the basic +/// block the execution will return to, once the function is finished) +pub fn replace_target(terminator: &mut mir::Terminator, new_target: mir::BasicBlock) { + if let mir::TerminatorKind::Call { target, .. } = &mut terminator.kind { + *target = Some(new_target); + } +} diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index ab6d72c89cc..819c61005b5 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -1,23 +1,20 @@ +use crate::mir_helper::*; use prusti_interface::specs::typed::DefSpecificationMap; use prusti_rustc_interface::{ data_structures::steal::Steal, interface::DEFAULT_QUERY_PROVIDERS, middle::{ mir::{ - patch::MirPatch, - visit::MutVisitor, - BasicBlock, BasicBlockData, Body, Constant, ConstantKind, - Operand, Place, SourceInfo, SourceScope, Terminator, - TerminatorKind, + self, patch::MirPatch, visit::MutVisitor, BasicBlock, BasicBlockData, Body, Constant, + ConstantKind, Operand, Place, SourceInfo, SourceScope, Terminator, TerminatorKind, }, - ty::{self, Ty, TyCtxt, TyKind}, + ty::{self, TyCtxt, TyKind}, }, span::{ def_id::{DefId, LocalDefId}, DUMMY_SP, }, }; -use std::collections::HashMap; pub static mut SPECS: Option = None; @@ -31,45 +28,34 @@ pub(crate) fn mir_checked( // let's get the specifications collected by prusti :) // SAFETY: Is definitely not safe at the moment - let specs = unsafe { SPECS.clone().unwrap() }; + let specs_opt = unsafe { SPECS.clone() }; - let steal = (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def); - let mut stolen = steal.steal(); + if let Some(specs) = specs_opt { + let steal = (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def); + let mut stolen = steal.steal(); - let mut visitor = InsertChecksVisitor::new(tcx, specs); - visitor.visit_body(&mut stolen); - println!("Custom modifications are done! Compiler back at work"); + let mut visitor = InsertChecksVisitor::new(tcx, specs); + visitor.visit_body(&mut stolen); + println!("Custom modifications are done! Compiler back at work"); - tcx.alloc_steal_mir(stolen) + tcx.alloc_steal_mir(stolen) + } else { + println!("the specs could not be collected"); + (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def) + } } pub struct InsertChecksVisitor<'tcx> { tcx: TyCtxt<'tcx>, specs: DefSpecificationMap, - post_check_types: HashMap, (DefId, Vec<(DefId, DefId)>)>, current_patcher: Option>, } impl<'tcx> InsertChecksVisitor<'tcx> { pub fn new(tcx: TyCtxt<'tcx>, specs: DefSpecificationMap) -> Self { - // when traversing the MIR and looking for function calls, - // it appears to be difficult to get the DefId of a Call. - // A `Ty` representing it does exist however. - // That's why we transform the specification map in the following way - let mut post_check_types = HashMap::new(); - // specs.checks contains all the ids of functions that are annotated with - // some check_id - for (id, _) in specs.checks.iter() { - let checks = specs.get_post_checks(id); - let subst = ty::List::empty(); - let func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(*id, subst)); // do I need substs? - post_check_types.insert(func_ty, (*id, checks.clone())); - } - Self { tcx, specs, - post_check_types, current_patcher: None, } } @@ -81,12 +67,11 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } fn visit_body(&mut self, body: &mut Body<'tcx>) { + // do we have to make sure this is the body the query was called on? let def_id = body.source.def_id(); // try to find specification function: - let pre_check_ids = self.specs.get_pre_checks(&def_id); - // todo: properly deal with multiple of them - // does this already work? We just prepend new checks, so it should.. - for check_id in pre_check_ids { + let substs = ty::subst::InternalSubsts::identity_for_item(self.tcx, def_id); + for check_id in self.specs.get_pre_checks(&def_id) { let mut patch = MirPatch::new(body); let start_node = BasicBlock::from_usize(0); let (new_block, _) = new_call_block( @@ -98,6 +83,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { None, None, None, + substs, ); patch.apply(body); // swap first and last node, so our new block is called on entry @@ -129,11 +115,15 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { .. }) = &data.terminator { - let mut original_block = block; + // the block that actually calls the annotated function. The terminator + // that calls this function is potentially moved several times, + // this variable keeps track of that. + let mut caller_block = block; let original_terminator = data.terminator.clone().unwrap().clone(); + if let TerminatorKind::Call { func: - Operand::Constant(box Constant { + func @ Operand::Constant(box Constant { literal: ConstantKind::Val(_, ty), .. }), @@ -144,47 +134,98 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } = terminator_kind { println!("Call terminator: {:?}", ty); - let mut current_target = *target; - // lookup if there is a check function: - if let Some((call_id, id_vec)) = self.post_check_types.get(ty) { + // if it's a static function call, we start looking if there are + // post-conditions we could check + if let Some((call_id, substs)) = func.const_fn_def() { + println!("we are dealing with call_id {:?}", call_id); + // make sure the call is local: + if !call_id.is_local() { + // not sure yet here, to get the body the method + // has to be local. The way we construct things + // we currently need it. For extern_specs this will + // be a problem. + return; + } + + // The block that is executed after the annotated function + // is called. Mutable because after appending the first + // check function call, this is the new target + let mut current_target = *target; + // lookup if there is a check function: let called_body: Body = self .tcx .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( - call_id.as_local().unwrap(), - )) + call_id.as_local().unwrap(), + )) .borrow() .clone(); - println!("inserting checks for {} specification items", id_vec.len()); // since there might be multiple blocks to be inserted, - for (check_id, old_store_id) in id_vec { + for (check_id, old_store_id) in self.specs.get_post_checks(&call_id) { println!("Now inserting a runtime check for a postcondition"); println!("Old store defid: {:?}", old_store_id); + // since here, we don't have mutable access to the body, + // we created a patcher beforehand which we can use here + // and apply later let mut patch = self.current_patcher.take().unwrap(); + // get the bodies of the store and check function let old_store_body = self .tcx .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( old_store_id.as_local().unwrap(), )) .borrow(); + let check_body = self + .tcx + .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( + check_id.as_local().unwrap(), + )) + .borrow(); + + // get the local index of the old_values argument to the + // check function (where it's already a reference to this + // tuple) + let old_values_check_arg = + get_local_from_name(&check_body, "old_values".to_string()).unwrap(); + // find the type of that local + let old_value_arg_ty = + check_body.local_decls.get(old_values_check_arg).unwrap().ty; + + println!("found old_values arg type: {:?}", old_value_arg_ty); // create a new internal to store result of old_store function let old_ret_ty = old_store_body.return_ty(); - println!("expecting return type {:?} for old_store function", old_ret_ty); + println!( + "expecting return type {:?} for old_store function", + old_ret_ty + ); let old_dest_place = Place::from(patch.new_internal(old_ret_ty, DUMMY_SP)); + let old_arg_deref_place = + Place::from(patch.new_internal(old_value_arg_ty, DUMMY_SP)); + + // dereference the old_values type + let rvalue = rvalue_reference_to_place(self.tcx, old_dest_place); + // we store the target, create a new block per check function // chain these with the final call having the original target, // change the target of the call to the first block of our chain. let (block, _) = new_call_block( self.tcx, &mut patch, - *check_id, + check_id, &called_body, current_target, Some(*destination), // destination is now result arg - Some(old_dest_place), + Some(old_arg_deref_place), Some(args.clone()), + substs, ); + // make deref the first statement in this block + let insert_deref_location = mir::Location { + block, + statement_index: 0, + }; + patch.add_assign(insert_deref_location, old_arg_deref_place, rvalue); current_target = Some(block); let mut call_fn_terminator = original_terminator.clone(); @@ -192,8 +233,10 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { let new_block_data = BasicBlockData::new(Some(call_fn_terminator)); let new_block = patch.new_block(new_block_data); - let subst = ty::List::empty(); // potentially bad? - let store_func_ty = self.tcx.mk_ty_from_kind(TyKind::FnDef(*old_store_id, subst)); + // let generics = self.tcx.generics_of(def_id); + let store_func_ty = self + .tcx + .mk_ty_from_kind(TyKind::FnDef(old_store_id, substs)); let store_func = Operand::Constant(Box::new(Constant { span: DUMMY_SP, user_ty: None, @@ -209,8 +252,8 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { from_hir_call: false, fn_span: old_store_body.span, }; - patch.patch_terminator(original_block, store_terminator); - original_block = new_block; + patch.patch_terminator(caller_block, store_terminator); + caller_block = new_block; // If there are multiple checks, this also should behave // correctly, since on the second iteration this target @@ -221,33 +264,6 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } } } - - // This was just a test to see if changes influence the generted executable - // fn visit_operand(&mut self, operand: &mut Operand<'tcx>, location: Location) { - // match operand { - // Operand::Constant(box c) => { - // if let Constant{ literal, .. } = c { - // if let ConstantKind::Val(value, ty) = literal { - // if ty.is_bool() { - // println!("found a boolean constant!"); - // *value = ConstValue::Scalar(Scalar::Int(ScalarInt::FALSE)) - // } - // } - // } - // }, - // _ => {} - // } - // self.super_operand(operand, location); - // } -} - -fn replace_target(terminator: &mut Terminator, new_target: BasicBlock) { - if let TerminatorKind::Call { - target, - .. - } = &mut terminator.kind { - *target = Some(new_target); - } } @@ -260,6 +276,7 @@ fn new_call_block<'tcx>( result: Option>, old_value: Option>, args_opt: Option>>, + substs: ty::subst::SubstsRef<'tcx>, ) -> (BasicBlock, Place<'tcx>) { let body_to_insert: Body = tcx .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( @@ -273,24 +290,12 @@ fn new_call_block<'tcx>( // for store functions it can absolutely have a return type // should always be block 0 but let's be certain.. println!("Target node is {:?}", target); - // let mut loc = Location { - // block: start_node, - // statement_index: 0, - // }; - // while let Some(stmt) = body.stmt_at(loc).left() { - // if let Statement { kind: StatementKind::StorageLive(_x), .. } = stmt { - // println!("good :)"); - // loc.statement_index += 1; - // } else { - // break; - // } - // } // variable to store result of function (altough we dont care about the result) let dest_place: Place = Place::from(patch.new_internal(ret_ty, DUMMY_SP)); - let subst = ty::List::empty(); // potentially bad? - let func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(terminator_call, subst)); // do I need substs? + // find the substs that were used for the original call + let func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(terminator_call, substs)); // do I need substs? println!("Function type: {:?}", func_ty); let func = Operand::Constant(Box::new(Constant { span: DUMMY_SP, @@ -303,7 +308,6 @@ fn new_call_block<'tcx>( args = arguments; } else { // determine the arguments! - // Todo: deal with result! // and make it less ugly.. But not sure how this is supposed to be done let caller_nr_args = attached_to_body.arg_count; // now the final mapping to operands: @@ -346,82 +350,3 @@ fn new_call_block<'tcx>( let blockdata = BasicBlockData::new(Some(terminator)); (patch.new_block(blockdata), dest_place) } - -// If we re-order the IndexVec containing the basic blocks, we will need to adjust -// some the basic blocks that terminators point to. This is what this function does -fn replace_outgoing_edges(data: &mut BasicBlockData, from: BasicBlock, to: BasicBlock) { - match &mut data.terminator_mut().kind { - TerminatorKind::Goto { target } => update_if_equals(target, from, to), - TerminatorKind::SwitchInt { targets, .. } => { - for bb1 in &mut targets.all_targets_mut().iter_mut() { - update_if_equals(bb1, from, to); - } - } - TerminatorKind::Call { - target, cleanup, .. - } => { - if let Some(target) = target { - update_if_equals(target, from, to); - } - if let Some(cleanup) = cleanup { - update_if_equals(cleanup, from, to); - } - } - TerminatorKind::Assert { - target: target_bb, - cleanup: opt_bb, - .. - } - | TerminatorKind::DropAndReplace { - target: target_bb, - unwind: opt_bb, - .. - } - | TerminatorKind::Drop { - target: target_bb, - unwind: opt_bb, - .. - } - | TerminatorKind::Yield { - resume: target_bb, - drop: opt_bb, - .. - } - | TerminatorKind::FalseUnwind { - real_target: target_bb, - unwind: opt_bb, - } => { - update_if_equals(target_bb, from, to); - if let Some(bb) = opt_bb { - update_if_equals(bb, from, to); - } - } - TerminatorKind::InlineAsm { - destination, - cleanup, - .. - } => { - // is this prettier? does this even modify the blockdata? - destination.map(|mut x| update_if_equals(&mut x, from, to)); - cleanup.map(|mut x| update_if_equals(&mut x, from, to)); - } - TerminatorKind::FalseEdge { - real_target, - imaginary_target, - } => { - update_if_equals(real_target, from, to); - update_if_equals(imaginary_target, from, to); - } - TerminatorKind::Resume - | TerminatorKind::Abort - | TerminatorKind::Return - | TerminatorKind::Unreachable - | TerminatorKind::GeneratorDrop => {} - } -} - -fn update_if_equals(dest: &mut T, from: T, to: T) { - if *dest == from { - *dest = to; - } -} From 61355c21a4e2dfe155fbd4c3255894dde3f1b589 Mon Sep 17 00:00:00 2001 From: cedric Date: Wed, 31 May 2023 14:22:18 +0200 Subject: [PATCH 09/45] Add option, to provide boundaries for quantifier runtime checks manually --- .../prusti-contracts-proc-macros/src/lib.rs | 12 ++ .../prusti-specs/src/boundary_extraction.rs | 132 +++++++++++- .../prusti-specs/src/runtime_checks.rs | 188 ++++++++---------- .../src/specifications/preparser.rs | 31 ++- prusti/src/mir_modify.rs | 14 +- 5 files changed, 260 insertions(+), 117 deletions(-) diff --git a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs index 9a50a2f3f8c..7161cad9daa 100644 --- a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs +++ b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs @@ -130,6 +130,12 @@ pub fn body_variant(_tokens: TokenStream) -> TokenStream { TokenStream::new() } +#[cfg(not(feature = "prusti"))] +#[proc_macro_attribute] +pub fn quantifier_runtime_bounds(_attr: TokenStream, tokens: TokenStream) -> TokenStream { + tokens +} + // ---------------------- // --- PRUSTI ENABLED --- @@ -273,5 +279,11 @@ pub fn body_variant(tokens: TokenStream) -> TokenStream { prusti_specs::body_variant(tokens.into()).into() } +#[cfg(feature = "prusti")] +#[proc_macro_attribute] +pub fn quantifier_runtime_bounds(_attr: TokenStream, tokens: TokenStream) -> TokenStream { + tokens +} + // Ensure that you've also crated a transparent `#[cfg(not(feature = "prusti"))]` // version of your new macro above! diff --git a/prusti-contracts/prusti-specs/src/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/boundary_extraction.rs index 8e9651f40cf..49fd03616bf 100644 --- a/prusti-contracts/prusti-specs/src/boundary_extraction.rs +++ b/prusti-contracts/prusti-specs/src/boundary_extraction.rs @@ -1,6 +1,7 @@ +use proc_macro2::TokenStream; use quote::ToTokens; -use rustc_hash::FxHashSet; -use syn::{self, visit::Visit, BinOp}; +use rustc_hash::{FxHashMap, FxHashSet}; +use syn::{self, parse_quote, parse_quote_spanned, spanned::Spanned, visit::Visit, BinOp}; pub struct BoundExtractor { // the set of bound variables within that expression @@ -8,7 +9,118 @@ pub struct BoundExtractor { } impl BoundExtractor { - pub fn extract_bounds_top(expr: syn::Expr, name: &String, name_set: &FxHashSet) -> Vec { + pub fn manual_bounds( + expr: syn::ExprClosure, + bound_vars: Vec<(String, syn::Type)>, + ) -> Option> { + let manual_bounds = get_attribute_contents( + "prusti :: runtime_quantifier_bounds".to_string(), + &expr.attrs, + )?; + let bounds_expr: syn::Expr = simplify_expression(&syn::parse2(manual_bounds).ok()?); + println!("bounds expression: {:?}", bounds_expr); + // there is either one or multiple + let bounds_vec = match bounds_expr { + syn::Expr::Tuple(expr_tuple) => expr_tuple + .elems + .iter() + .cloned() + .map(|range| { + // remove surrounding braces or things like that + let range = simplify_expression(&range); + if let syn::Expr::Range(expr_range) = range { + expr_range + } else { + panic!("Bounds should only contain ranges"); + } + }) + .collect(), + syn::Expr::Range(range_expr) => vec![range_expr], + _ => return None, + }; + assert!(bounds_vec.len() == bound_vars.len()); + Some(bound_vars.into_iter().zip(bounds_vec.into_iter()).collect()) + } + + // if this function is called, the ranges are mandatory! + pub fn derive_ranges( + closure: syn::Expr, + args: Vec<(String, syn::Type)>, + ) -> Vec<((String, syn::Type), syn::ExprRange)> { + if args.len() > 1 { + panic!("multiple args without manually defined boundaries are not allowed"); + } + let name_set: FxHashSet = args.iter().map(|el| el.0.clone()).collect(); + args.into_iter().map(|(name, ty)| { + let range_expr = match ty.to_token_stream().to_string().as_str() { + "i8" | "i16" | "i32" | "i64" | "i128" | "isize" | "u8" | "u16" | "u32" | "u64" + | "u128" | "usize" => { + let bounds = Self::extract_bounds(closure.clone(), &name, &name_set); + let mut upper_bound_opt = None; + let mut lower_bound_opt = None; + + // if there are multiple variables, potentially with dependencies + // the loops need to be in a specific order + assert!(bounds.len() <= 2); + let mut include_upper = true; // if we have the MAX upper limit, + for Boundary { + kind, + bound, + included, + .. + } in bounds.iter() + { + println!("Trying to define boundaries"); + // include it + match *kind { + BoundaryKind::Upper => { + // first idea was to add one here if inclusive, but + // this can lead to overflows! Need to use ..=x syntax + assert!(upper_bound_opt.is_none()); + println!("found upper bound, end included: {}", *included); + upper_bound_opt = Some(bound.clone()); + include_upper = *included; + } + BoundaryKind::Lower => { + lower_bound_opt = if *included { + // lower bound works the other way around + Some(bound.clone()) + } else { + Some(parse_quote! { + #bound + 1 + }) + } + } + } + } + let upper_bound = upper_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => + #ty::MAX + }); + let lower_bound = lower_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => + #ty::MIN + }); + + if include_upper { + parse_quote_spanned! {closure.span() => + (#lower_bound)..=(#upper_bound) + } + } else { + parse_quote_spanned! {closure.span() => + (#lower_bound)..(#upper_bound) + } + } + }, + _ => panic!("runtime checks only supported for primitive types"), + }; + ((name, ty), range_expr) + }).collect() + } + + pub fn extract_bounds( + expr: syn::Expr, + name: &String, + name_set: &FxHashSet, + ) -> Vec { // first make sure the expression has the form A ==> B (or equivalent) // and then extract a bound from A let mut extractor = BoundExtractor { @@ -41,8 +153,7 @@ impl BoundExtractor { } } - - pub fn extract_bounds_recursive(&mut self, expr: syn::Expr, name: &String) -> Vec { + fn extract_bounds_recursive(&mut self, expr: syn::Expr, name: &String) -> Vec { let simplified = simplify_expression(&expr); match simplified { syn::Expr::Binary(syn::ExprBinary { @@ -242,7 +353,6 @@ impl Boundary { dependent_vars: self.dependent_vars, } } - } // a Visitor to extract identifiers that occurr in an expression @@ -261,3 +371,13 @@ impl<'ast> syn::visit::Visit<'ast> for IdentifierFinder { syn::visit::visit_expr_path(self, expr_path); } } + +// potentially also create something like a syn helper: +pub fn get_attribute_contents(name: String, attrs: &Vec) -> Option { + for attr in attrs { + if attr.path.to_token_stream().to_string() == name { + return Some(attr.tokens.clone()); + } + } + None +} diff --git a/prusti-contracts/prusti-specs/src/runtime_checks.rs b/prusti-contracts/prusti-specs/src/runtime_checks.rs index 2302bee31fa..77001f392ac 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks.rs @@ -1,5 +1,5 @@ use crate::{ - boundary_extraction::{BoundExtractor, Boundary, BoundaryKind, self}, + boundary_extraction::{self, BoundExtractor, Boundary, BoundaryKind}, common::HasSignature, rewriter::AstRewriter, specifications::untyped, @@ -42,6 +42,13 @@ impl CheckTranslator { ) -> syn::ItemFn { let expr_to_check = &self.expression; let item_name_str = item_name.to_string(); + let result_arg_opt = if has_result { + Some(AstRewriter::generate_result_arg(item)) + } else { + None + }; + let forget_statements = self.generate_forget_statements(item, &result_arg_opt); + let mut check_item: syn::ItemFn = parse_quote_spanned! {item.span() => #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] #[prusti::spec_only] @@ -49,14 +56,14 @@ impl CheckTranslator { fn #item_name() { println!("check function {} is performed", #item_name_str); assert!(#expr_to_check); + #forget_statements + // now forget about all the values } }; check_item.sig.generics = item.sig().generics.clone(); - // todo: make all types that are not already references, into references check_item.sig.inputs = item.sig().inputs.clone(); if has_result { - let result_arg = AstRewriter::generate_result_arg(item); - check_item.sig.inputs.push(result_arg); + check_item.sig.inputs.push(result_arg_opt.unwrap()); } if has_old_arg { let old_arg = self.construct_old_fnarg(item, true); @@ -97,6 +104,7 @@ impl CheckTranslator { } let old_values_type = self.old_values_type(item); // println!("resulting tuple: {}", quote!{#tuple}); + let forget_statements = self.generate_forget_statements(item, &None); let item_name_str = item_name.to_string(); let mut res: syn::ItemFn = parse_quote_spanned! {item.span() => @@ -105,6 +113,7 @@ impl CheckTranslator { #[prusti::store_id = #check_id_str] fn #item_name() -> #old_values_type { println!("store function {} is performed", #item_name_str); + #forget_statements return (#tuple); } }; @@ -162,8 +171,36 @@ impl CheckTranslator { } } - // pub fn construct_function_args() + pub fn generate_forget_statements( + &self, + item: &untyped::AnyFnItem, + result_arg_opt: &Option, + ) -> syn::Block { + // go through all inputs, if they are not references add a forget + // statement + let mut stmts: Vec = Vec::new(); + for fn_arg in item.sig().inputs.clone() { + if let Ok(arg) = Argument::try_from(&fn_arg) { + let name: TokenStream = arg.name.parse().unwrap(); + stmts.push(parse_quote! { + std::mem::forget(#name); + }) + } + } + if let Some(result) = result_arg_opt { + if let Ok(result_arg) = Argument::try_from(result) { + let name: TokenStream = result_arg.name.parse().unwrap(); + stmts.push(parse_quote! { + std::mem::forget(#name); + }) + } + } + syn::Block { + brace_token: syn::token::Brace::default(), + stmts, + } + } } /// collects information about expression, but also transforms it @@ -370,14 +407,12 @@ enum QuantifierKind { Exists, } -fn translate_quantifier_expression( - closure: &syn::ExprClosure, - kind: QuantifierKind, -) -> syn::Expr { +fn translate_quantifier_expression(closure: &syn::ExprClosure, kind: QuantifierKind) -> syn::Expr { println!("translate is called"); println!("quantifier nr args: {}", closure.inputs.len()); let mut name_set: FxHashSet = FxHashSet::default(); - let bound_vars: Vec<(String, String)> = closure + // the variables that occurr as arguments + let bound_vars: Vec<(String, syn::Type)> = closure .inputs .iter() .map(|pat: &syn::Pat| { @@ -389,10 +424,8 @@ fn translate_quantifier_expression( }) = pat { let name_str = id.to_token_stream().to_string(); - let type_str = ty.to_token_stream().to_string(); - println!("quantifier arg: {}: {}", name_str, type_str); name_set.insert(name_str.clone()); - (name_str, type_str) + (name_str, ty.clone()) } else { // maybe we can throw a more sensible error and make the // check function a dummy check function @@ -401,108 +434,53 @@ fn translate_quantifier_expression( }) .collect(); - let expr = *closure.body.clone(); + // look for the runtime_quantifier_bounds attribute: + println!("closure arguments: {:?}", bound_vars); + let manual_bounds = BoundExtractor::manual_bounds(closure.clone(), bound_vars.clone()); + let bounds = manual_bounds.unwrap_or_else(|| BoundExtractor::derive_ranges(*closure.body.clone(), bound_vars)); - // initially wanted to handle multiple, but for now we dont.. - // for (name, ty) in bound_vars { - let (name, ty) = bound_vars.get(0).unwrap(); - match ty.as_str() { - // runtime checks for quantifiers only work for a limited set currently - "i8" | "i16" | "i32" | "i64" | "i128" | "isize" | "u8" | "u16" | "u32" | "u64" | "u128" - | "usize" => { - let bounds = BoundExtractor::extract_bounds_top(expr.clone(), name, &name_set); - println!("bounds extracted!"); - let mut upper_bound_opt = None; - let mut lower_bound_opt = None; + let mut expr = *closure.body.clone(); - // if there are multiple variables, potentially with dependencies - // the loops need to be in a specific order - assert!(bounds.len() <= 2); - let mut include_upper = true; // if we have the MAX upper limit, - for Boundary { - kind, - bound, - included, - .. - } in bounds.iter() - { - println!("Trying to define boundaries"); - // include it - match *kind { - BoundaryKind::Upper => { - // first idea was to add one here if inclusive, but - // this can lead to overflows! Need to use ..=x syntax - assert!(upper_bound_opt.is_none()); - println!("found upper bound, end included: {}", *included); - upper_bound_opt = Some(bound.clone()); - include_upper = *included; - } - BoundaryKind::Lower => { - lower_bound_opt = if *included { - // lower bound works the other way around - Some(bound.clone()) - } else { - Some(parse_quote! { - #bound + 1 - }) - } - } - } - } - let name_token: TokenStream = name.parse().unwrap(); - let ty_token: TokenStream = ty.parse().unwrap(); - let upper_bound = upper_bound_opt.unwrap_or(parse_quote_spanned!{closure.span() => - #ty_token::MAX - }); - let lower_bound = lower_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => - #ty_token::MIN - }); + for ((name, _), range_expr) in bounds.iter().rev() { + let name_token: TokenStream = name.parse().unwrap(); + println!("bounds extracted!"); - let range_expr: syn::Expr = if include_upper { - parse_quote_spanned! {closure.span() => - (#lower_bound)..=(#upper_bound) - } - } else { - parse_quote_spanned! {closure.span() => - (#lower_bound)..(#upper_bound) - } - }; - // maybe never turn them into strings in the first place.. - match kind { - QuantifierKind::Forall => { - let res = quote! { - { - let mut holds_forall = true; - for #name_token in #range_expr { - if !(#expr) { - holds_forall = false; - break; - } - } - holds_forall - } - }; - println!("res: {}", res); - syn::parse2(res).unwrap() - }, - QuantifierKind::Exists => { - println!("exists handled:"); - let res = quote! { + // maybe never turn them into strings in the first place.. + expr = match kind { + QuantifierKind::Forall => { + let res = quote! { { - let mut exists = false; + let mut holds_forall = true; for #name_token in #range_expr { - if #expr { - exists = true; + if !(#expr) { + holds_forall = false; break; } } - exists + holds_forall } - }; - syn::parse2(res).unwrap() - }, + }; + println!("res: {}", res); + syn::parse2(res).unwrap() + } + QuantifierKind::Exists => { + println!("exists handled:"); + let res = quote! { + { + let mut exists = false; + for #name_token in #range_expr { + if #expr { + exists = true; + break; + } + } + exists + } + }; + syn::parse2(res).unwrap() } } - _ => unimplemented!(), } + expr } + diff --git a/prusti-contracts/prusti-specs/src/specifications/preparser.rs b/prusti-contracts/prusti-specs/src/specifications/preparser.rs index 8617883a86c..6599d4a3926 100644 --- a/prusti-contracts/prusti-specs/src/specifications/preparser.rs +++ b/prusti-contracts/prusti-specs/src/specifications/preparser.rs @@ -281,6 +281,8 @@ impl PrustiTokenStream { let mut stream = self.pop_group(Delimiter::Parenthesis).ok_or_else(|| { error(span, "expected parenthesized expression after quantifier") })?; + // attrs_opt is potentially None even if everything is good + let attrs_opt = stream.pop_quantifier_bound_attr(); let args = stream .pop_closure_args() .ok_or_else(|| error(span, "expected quantifier body"))?; @@ -309,9 +311,14 @@ impl PrustiTokenStream { if args.is_empty() { return err(span, "a quantifier must have at least one argument"); } + let attr_parsed = if let Some(attr) = attrs_opt { + attr.parse().ok() + } else { + None + }; let args = args.parse()?; let body = stream.parse()?; - kind.translate(span, triggers, args, body) + kind.translate(span, triggers, attr_parsed, args, body) } Some(PrustiToken::SpecEnt(span, _)) | Some(PrustiToken::CallDesc(span, _)) => { @@ -434,6 +441,17 @@ impl PrustiTokenStream { }) } + fn pop_quantifier_bound_attr(&mut self) -> Option { + let start_token = self.tokens.pop_front()?; + if start_token.is_attribute_starter() { + self.pop_group(Delimiter::Bracket) + } else { + // put it back, no reason to fail, there might not be any + self.tokens.push_front(start_token); + None + } + } + fn pop_parenthesized_group(&mut self) -> syn::Result { match self.tokens.pop_front() { Some(PrustiToken::Group(_span, Delimiter::Parenthesis, box group)) => { @@ -739,6 +757,7 @@ impl Quantifier { &self, span: Span, triggers: Vec>, + attr: Option, args: TokenStream, body: TokenStream, ) -> TokenStream { @@ -754,14 +773,15 @@ impl Quantifier { }) .collect::>(); let body = quote_spanned! { body.span() => ((#body): bool) }; + let attr = attr.map(|attr| quote_spanned!{attr.span() => #[prusti::#attr]}); match self { Self::Forall => quote_spanned! { full_span => ::prusti_contracts::forall( ( #( #trigger_sets, )* ), - #[prusti::spec_only] | #args | -> bool { #body } + #[prusti::spec_only] #attr | #args | -> bool { #body } ) }, Self::Exists => quote_spanned! { full_span => ::prusti_contracts::exists( ( #( #trigger_sets, )* ), - #[prusti::spec_only] | #args | -> bool { #body } + #[prusti::spec_only] #attr | #args | -> bool { #body } ) }, } } @@ -814,6 +834,11 @@ impl PrustiToken { if p.as_char() == '|' && p.spacing() == proc_macro2::Spacing::Alone) } + fn is_attribute_starter(&self) -> bool { + matches!(self, Self::Token(TokenTree::Punct(p)) + if p.as_char() == '#') + } + fn parse_op2(p1: &Punct, p2: &Punct) -> Option { let span = join_spans(p1.span(), p2.span()); Some(Self::BinOp( diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index 819c61005b5..aeda7c54c71 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -5,8 +5,9 @@ use prusti_rustc_interface::{ interface::DEFAULT_QUERY_PROVIDERS, middle::{ mir::{ - self, patch::MirPatch, visit::MutVisitor, BasicBlock, BasicBlockData, Body, Constant, - ConstantKind, Operand, Place, SourceInfo, SourceScope, Terminator, TerminatorKind, + self, patch::MirPatch, pretty, visit::MutVisitor, BasicBlock, BasicBlockData, Body, + Constant, ConstantKind, Operand, Place, SourceInfo, SourceScope, Terminator, + TerminatorKind, }, ty::{self, TyCtxt, TyKind}, }, @@ -16,6 +17,10 @@ use prusti_rustc_interface::{ }, }; +// debugging dependencies? +use std::io::prelude::*; +use std::fs::File; + pub static mut SPECS: Option = None; pub(crate) fn mir_checked( @@ -38,6 +43,10 @@ pub(crate) fn mir_checked( visitor.visit_body(&mut stolen); println!("Custom modifications are done! Compiler back at work"); + // print mir of body: + let mut dump_file = File::create("dump_mir_adjusted.txt").unwrap(); + pretty::write_mir_fn(tcx, &stolen, &mut |_,_| Ok(()), &mut dump_file).unwrap(); + tcx.alloc_steal_mir(stolen) } else { println!("the specs could not be collected"); @@ -266,7 +275,6 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } } - fn new_call_block<'tcx>( tcx: TyCtxt<'tcx>, patch: &mut MirPatch<'tcx>, From a4ce18b7ae33f8548a3f797455323f4d254ca618 Mon Sep 17 00:00:00 2001 From: cedric Date: Sat, 3 Jun 2023 11:57:34 +0200 Subject: [PATCH 10/45] Fix bug with mem forget --- prusti-contracts/prusti-specs/src/runtime_checks.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/prusti-contracts/prusti-specs/src/runtime_checks.rs b/prusti-contracts/prusti-specs/src/runtime_checks.rs index 77001f392ac..439beb91536 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks.rs @@ -113,8 +113,9 @@ impl CheckTranslator { #[prusti::store_id = #check_id_str] fn #item_name() -> #old_values_type { println!("store function {} is performed", #item_name_str); + let old_values = (#tuple); #forget_statements - return (#tuple); + return old_values; } }; // store function has the same generics and arguments as the From 8001fe58d08e0252c690c5eb111eaf02fb9a3228 Mon Sep 17 00:00:00 2001 From: cedric Date: Mon, 5 Jun 2023 14:37:53 +0200 Subject: [PATCH 11/45] Interpret moved values in postconditions as old values too --- .../prusti-specs/src/boundary_extraction.rs | 2 +- prusti-contracts/prusti-specs/src/lib.rs | 76 ++-- prusti-contracts/prusti-specs/src/rewriter.rs | 129 ++----- .../prusti-specs/src/runtime_checks.rs | 283 ++++++++++++-- prusti-interface/src/specs/mod.rs | 44 +++ prusti-interface/src/specs/typed.rs | 50 ++- prusti/src/mir_helper.rs | 5 + prusti/src/mir_modify.rs | 360 ++++++++++++------ 8 files changed, 649 insertions(+), 300 deletions(-) diff --git a/prusti-contracts/prusti-specs/src/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/boundary_extraction.rs index 49fd03616bf..5bc29fc4345 100644 --- a/prusti-contracts/prusti-specs/src/boundary_extraction.rs +++ b/prusti-contracts/prusti-specs/src/boundary_extraction.rs @@ -1,6 +1,6 @@ use proc_macro2::TokenStream; use quote::ToTokens; -use rustc_hash::{FxHashMap, FxHashSet}; +use rustc_hash::FxHashSet; use syn::{self, parse_quote, parse_quote_spanned, spanned::Spanned, visit::Visit, BinOp}; pub struct BoundExtractor { diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index e465d2bb215..80f0e8b1c08 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -207,12 +207,8 @@ fn generate_for_requires(attr: TokenStream, item: &untyped::AnyFnItem) -> Genera attr.clone(), item, )?; - let (check_item, _) = rewriter.create_pre_check( - rewriter::SpecItemType::Precondition, - check_id, - attr, - item, - )?; + let check_item = + rewriter.create_pre_check(rewriter::SpecItemType::Precondition, check_id, attr, item)?; Ok(( vec![spec_item, check_item], vec![ @@ -247,12 +243,8 @@ fn generate_for_ensures( let check_id = rewriter.generate_spec_id(); let check_id_str = check_id.to_string(); // let store_old_item = rewriter.create_store_check_ensures(check_id, attr, item)?; - let (check_item, store_item_opt) = rewriter.create_post_check( - rewriter::SpecItemType::Postcondition, - check_id, - attr, - item, - )?; + let (check_item, store_item_opt) = + rewriter.create_post_check(rewriter::SpecItemType::Postcondition, check_id, attr, item)?; if let Some(store_item) = store_item_opt { Ok(( vec![spec_item, check_item, store_item], @@ -275,13 +267,21 @@ fn generate_for_after_expiry(attr: TokenStream, item: &untyped::AnyFnItem) -> Ge let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); let spec_id_str = spec_id.to_string(); - let spec_item = rewriter.process_pledge(spec_id, attr, item)?; - Ok(( - vec![spec_item], - vec![parse_quote_spanned! {item.span()=> - #[prusti::pledge_spec_id_ref = #spec_id_str] - }], - )) + let check_id = rewriter.generate_spec_id(); + let check_id_str = check_id.to_string(); + let (spec_item, check) = rewriter.process_pledge(spec_id, Some(check_id), attr, item)?; + let mut res_items = vec![spec_item]; + let mut res_attrs: Vec = vec![parse_quote_spanned! { item.span() => + #[prusti::pledge_spec_id_ref = #spec_id_str] + }]; + if let Some(check_items) = check { + let mut check_item_vec = check_items.to_item_vec(); + res_items.append(&mut check_item_vec); + res_attrs.push(parse_quote_spanned! {item.span() => + #[prusti::assert_pledge_check_ref = #check_id_str] + }) + } + Ok((res_items, res_attrs)) } /// Generate spec items and attributes to typecheck and later retrieve "after_expiry" annotations. @@ -291,19 +291,31 @@ fn generate_for_assert_on_expiry(attr: TokenStream, item: &untyped::AnyFnItem) - let spec_id_lhs_str = spec_id_lhs.to_string(); let spec_id_rhs = rewriter.generate_spec_id(); let spec_id_rhs_str = spec_id_rhs.to_string(); - let (spec_item_lhs, spec_item_rhs) = - rewriter.process_assert_pledge(spec_id_lhs, spec_id_rhs, attr, item)?; - Ok(( - vec![spec_item_lhs, spec_item_rhs], - vec![ - parse_quote_spanned! {item.span()=> - #[prusti::assert_pledge_spec_id_ref_lhs = #spec_id_lhs_str] - }, - parse_quote_spanned! {item.span()=> - #[prusti::assert_pledge_spec_id_ref_rhs = #spec_id_rhs_str] - }, - ], - )) + // TODO: conditional on runtime checks being enabled + // this is ugly though.. + let check_id = rewriter.generate_spec_id(); + let check_id_str = check_id.to_string(); + + let (spec_item_lhs, spec_item_rhs, check_items_opt) = + rewriter.process_assert_pledge(spec_id_lhs, spec_id_rhs, Some(check_id), attr, item)?; + + let mut res_items = vec![spec_item_lhs, spec_item_rhs]; + let mut res_attrs: Vec = vec![ + parse_quote_spanned! {item.span()=> + #[prusti::assert_pledge_spec_id_ref_lhs = #spec_id_lhs_str] + }, + parse_quote_spanned! {item.span()=> + #[prusti::assert_pledge_spec_id_ref_rhs = #spec_id_rhs_str] + }, + ]; + if let Some(check_items) = check_items_opt { + let mut check_item_vec = check_items.to_item_vec(); + res_items.append(&mut check_item_vec); + res_attrs.push(parse_quote_spanned! {item.span()=> + #[prusti::assert_pledge_check_ref = #check_id_str] + }); + } + Ok((res_items, res_attrs)) } /// Generate spec items and attributes to typecheck and later retrieve "terminates" annotations. diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index fca1a7a2a40..ca391c7f7ce 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -1,6 +1,6 @@ use crate::{ common::HasSignature, - runtime_checks::CheckTranslator, + runtime_checks::{RuntimeFunctions, translate_runtime_checks}, specifications::{ common::{SpecificationId, SpecificationIdGenerator}, preparser::{parse_prusti, parse_prusti_assert_pledge, parse_prusti_pledge}, @@ -145,94 +145,6 @@ impl AstRewriter { Ok(syn::Item::Fn(spec_item)) } - pub fn generate_check_item_fn( - &mut self, - spec_type: SpecItemType, - check_id: SpecificationId, - expr: TokenStream, - item: &untyped::AnyFnItem, - ) -> syn::Result<(syn::Item, Option)> { - if let Some(span) = self.check_contains_keyword_in_params(item, "result") { - return Err(syn::Error::new( - span, - "it is not allowed to use the keyword `result` as a function argument".to_string(), - )); - } - let item_span = expr.span(); - let check_item_name = syn::Ident::new( - &format!( - "prusti_{}_check_item_{}_{}", - spec_type, - item.sig().ident, - check_id - ), - item_span, - ); - - let store_old_item_name = syn::Ident::new( - &format!( - "prusti_{}_store_old_item_{}_{}", - spec_type, - item.sig().ident, - check_id - ), - item_span, - ); - let check_id_str = check_id.to_string(); - - // about the span and expression chosen here: - // - `item_span` is set to `expr.span()` so that any errors reported - // for the spec item will be reported on the span of the expression - // written by the user - // - `((#expr) : bool)` syntax is used to report type errors in the - // expression with the correct error message, i.e. that the expected - // type is `bool`, not that the expected *return* type is `bool` - // - `!!(...)` is used to fix an edge-case when the expression consists - // of a single identifier; without the double negation, the `Return` - // terminator in MIR has a span set to the one character just after - // the identifier - // let (return_type, return_modifier) = match &spec_type { - // SpecItemType::Termination => ( - // quote_spanned! {item_span => Int}, - // quote_spanned! {item_span => Int::new(0) + }, - // ), - // SpecItemType::Predicate(return_type) => (return_type.clone(), TokenStream::new()), - // _ => ( - // quote_spanned! {item_span => bool}, - // quote_spanned! {item_span => !!}, - // ), - // }; - let check_translator = CheckTranslator::new(item, expr); - - match spec_type { - SpecItemType::Postcondition | SpecItemType::Pledge => { - let check_item = check_translator.generate_check_function( - item, - check_item_name, - &check_id_str, - true, - true, - ); - let store_item = check_translator.generate_store_function( - item, - store_old_item_name, - check_id_str, - ); - Ok((syn::Item::Fn(check_item), Some(syn::Item::Fn(store_item)))) - } - _ => { - let check_item = check_translator.generate_check_function( - item, - check_item_name, - &check_id_str, - false, - false, - ); - Ok((syn::Item::Fn(check_item), None)) - } - } - } - /// Parse an assertion into a Rust expression pub fn process_assertion( &mut self, @@ -250,8 +162,10 @@ impl AstRewriter { check_id: SpecificationId, tokens: TokenStream, item: &untyped::AnyFnItem, - ) -> syn::Result<(syn::Item, Option)> { - self.generate_check_item_fn(spec_type, check_id, parse_prusti(tokens)?, item) + ) -> syn::Result { + let res = translate_runtime_checks(spec_type, check_id, parse_prusti(tokens)?, None, item)?; + // precondition will only have check_fn + syn::Result::Ok(res.check_fn) } pub fn create_post_check( @@ -261,22 +175,31 @@ impl AstRewriter { tokens: TokenStream, item: &untyped::AnyFnItem, ) -> syn::Result<(syn::Item, Option)> { - self.generate_check_item_fn(spec_type, check_id, parse_prusti(tokens)?, item) + let res = translate_runtime_checks(spec_type, check_id, parse_prusti(tokens)?, None, item)?; + syn::Result::Ok((res.check_fn, res.store_fn)) } /// Parse a pledge with lhs into a Rust expression pub fn process_pledge( &mut self, spec_id: SpecificationId, + check_id_opt: Option, tokens: TokenStream, item: &untyped::AnyFnItem, - ) -> syn::Result { - self.generate_spec_item_fn( + ) -> syn::Result<(syn::Item, Option)> { + let parsed = parse_prusti_pledge(tokens)?; + let spec_item = self.generate_spec_item_fn( SpecItemType::Pledge, spec_id, - parse_prusti_pledge(tokens)?, + parsed.clone(), item, - ) + )?; + let check = if let Some(check_id) = check_id_opt { + Some(translate_runtime_checks(SpecItemType::Pledge, check_id, parsed, None, item)?) + } else { + None + }; + syn::Result::Ok((spec_item, check)) } pub fn process_pure_refinement( @@ -308,13 +231,19 @@ impl AstRewriter { &mut self, spec_id_lhs: SpecificationId, spec_id_rhs: SpecificationId, + check_id: Option, tokens: TokenStream, item: &untyped::AnyFnItem, - ) -> syn::Result<(syn::Item, syn::Item)> { + ) -> syn::Result<(syn::Item, syn::Item, Option)> { let (lhs, rhs) = parse_prusti_assert_pledge(tokens)?; - let lhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_lhs, lhs, item)?; - let rhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_rhs, rhs, item)?; - Ok((lhs_item, rhs_item)) + let lhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_lhs, lhs.clone(), item)?; + let rhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_rhs, rhs.clone(), item)?; + if let Some(check_id) = check_id { + let checks = translate_runtime_checks(SpecItemType::Pledge, check_id, rhs, Some(lhs), item)?; + syn::Result::Ok((lhs_item, rhs_item, Some(checks))) + } else { + syn::Result::Ok((lhs_item, rhs_item, None)) + } } /// Parse a loop invariant into a Rust expression diff --git a/prusti-contracts/prusti-specs/src/runtime_checks.rs b/prusti-contracts/prusti-specs/src/runtime_checks.rs index 439beb91536..e71126a1661 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks.rs @@ -1,8 +1,8 @@ use crate::{ - boundary_extraction::{self, BoundExtractor, Boundary, BoundaryKind}, + boundary_extraction::{self, BoundExtractor}, common::HasSignature, - rewriter::AstRewriter, - specifications::untyped, + rewriter::{AstRewriter, SpecItemType}, + specifications::{common::SpecificationId, untyped}, }; use proc_macro2::TokenStream; use quote::{quote, ToTokens}; @@ -15,19 +15,116 @@ use syn::{ pub struct CheckTranslator { /// The expression within the specification expression: Expr, + lhs_expression: Option, visitor: CheckVisitor, + spec_type: SpecItemType, +} + +/// this struct contains all possible items needed to check certain +/// specifications at runtime +pub struct RuntimeFunctions { + /// the actual check function. For pledges, this is the check after + /// expiration + pub check_fn: syn::Item, + /// store old state function + pub store_fn: Option, + /// store expressions evaluated in before expiry expression + pub store_before_expiry: Option, + /// for assert_after_expiry(), this is the lhs of the magic wand + pub check_before_expiry: Option, +} + +impl RuntimeFunctions { + /// consumes self, and returns vector of items + pub fn to_item_vec(self) -> Vec { + let RuntimeFunctions { + check_fn, + store_fn, + store_before_expiry, + check_before_expiry, + } = self; + let mut res = vec![check_fn]; + if let Some(store_fn) = store_fn { + res.push(store_fn); + } + if let Some(store_before_expiry) = store_before_expiry { + res.push(store_before_expiry); + } + if let Some(check_before_expiry) = check_before_expiry { + res.push(check_before_expiry); + } + res + } +} + +/// Generates a bunch of functions that can be used to check specifications +/// at runtime. +pub fn translate_runtime_checks( + spec_type: SpecItemType, + check_id: SpecificationId, + expr: TokenStream, + lhs: Option, + item: &untyped::AnyFnItem, +) -> syn::Result { + let check_translator = CheckTranslator::new(item, expr, lhs, spec_type.clone()); + let check_fn = check_translator.generate_check_function(item, check_id, false); + let (store_fn, store_before_expiry, check_before_expiry) = match spec_type { + SpecItemType::Pledge => { + // most things to generate: + let store_item = check_translator.generate_store_function(item, check_id); + let check_before_expiry = + check_translator.generate_check_function(item, check_id, true); + let store_before_expiry = check_translator.generate_store_before_expiry(item, check_id); + + ( + Some(store_item), + Some(store_before_expiry), + Some(check_before_expiry), + ) + } + SpecItemType::Postcondition => { + let store_item = check_translator.generate_store_function(item, check_id); + (Some(store_item), None, None) + } + SpecItemType::Precondition => (None, None, None), + _ => unreachable!(), + }; + syn::Result::Ok(RuntimeFunctions { + check_fn, + store_fn, + store_before_expiry, + check_before_expiry, + }) } impl CheckTranslator { - pub fn new(item: &untyped::AnyFnItem, tokens: TokenStream) -> Self { + pub fn new( + item: &untyped::AnyFnItem, + tokens: TokenStream, + lhs_tokens_opt: Option, + spec_type: SpecItemType, + ) -> Self { // figure out keywords let mut expression: syn::Expr = syn::parse2::(tokens).unwrap(); - let mut visitor = CheckVisitor::new(item); + let executed_after = match spec_type { + SpecItemType::Pledge | SpecItemType::Postcondition => true, + _ => false, + }; + let mut visitor = CheckVisitor::new(item, executed_after); // Does it make sense to already run the visitor here? visitor.visit_expr_mut(&mut expression); + // transform the pledge lhs too. Not sure if this is needed + let lhs_expression = lhs_tokens_opt.map(|tokens| { + let mut expr = syn::parse2::(tokens).unwrap(); + visitor.visit_expr_mut(&mut expr); + expr + }); + Self { expression, + lhs_expression, visitor, + spec_type, } } @@ -35,53 +132,109 @@ impl CheckTranslator { pub fn generate_check_function( &self, item: &untyped::AnyFnItem, - item_name: syn::Ident, - check_id_str: &String, - has_old_arg: bool, - has_result: bool, - ) -> syn::ItemFn { - let expr_to_check = &self.expression; + check_id: SpecificationId, + is_before_expiry_check: bool, + ) -> syn::Item { + // lhs is true for assert_on_expire only! Re-use this method to create + // a check function for the pre-expiry check + let lhs_str = if is_before_expiry_check { "_lhs" } else { "" }; + let item_name = syn::Ident::new( + &format!( + "prusti_{}{}_check_item_{}_{}", + self.spec_type, + lhs_str, + item.sig().ident, + check_id + ), + item.span(), + ); + let check_id_str = check_id.to_string(); + // we differentiate items that are executed after a function + // -> have result + // -> have old values + // -> moved values need to be stored too + let executed_after = match self.spec_type { + SpecItemType::Postcondition | SpecItemType::Pledge => true, + _ => false, + }; + let expr_to_check: syn::Expr = if is_before_expiry_check { + // if lhs is true, there has to be a lhs expression + if let Some(expr) = self.lhs_expression.as_ref() { + expr.clone() + } else { + parse_quote_spanned! {item.span() => + true + } + } + } else { + self.expression.clone() + }; + let item_name_str = item_name.to_string(); - let result_arg_opt = if has_result { + let result_arg_opt = if executed_after { Some(AstRewriter::generate_result_arg(item)) } else { None }; - let forget_statements = self.generate_forget_statements(item, &result_arg_opt); + let forget_statements = + self.generate_forget_statements(item, &result_arg_opt, executed_after); + let contract_string = expr_to_check.to_token_stream().to_string(); + let failure_message = format!("Contract {} was violated at runtime", contract_string); + println!("Failure message: {}", failure_message); + let id_attr: syn::Attribute = if is_before_expiry_check { + parse_quote_spanned! {item.span() => + #[prusti::check_before_expiry_id = #check_id_str] + } + } else { + parse_quote_spanned! { item.span() => + #[prusti::check_id = #check_id_str] + + } + }; let mut check_item: syn::ItemFn = parse_quote_spanned! {item.span() => #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] #[prusti::spec_only] - #[prusti::check_id = #check_id_str] + #id_attr fn #item_name() { println!("check function {} is performed", #item_name_str); - assert!(#expr_to_check); + if !(#expr_to_check) { + #forget_statements + panic!(#failure_message) + }; + // now forget about all the values since they are still owned + // by the calling function #forget_statements - // now forget about all the values } }; check_item.sig.generics = item.sig().generics.clone(); check_item.sig.inputs = item.sig().inputs.clone(); - if has_result { + if executed_after { check_item.sig.inputs.push(result_arg_opt.unwrap()); - } - if has_old_arg { - let old_arg = self.construct_old_fnarg(item, true); + let old_arg = self.construct_old_fnarg(item, false); // put it inside a reference: - let old_arg_ref: syn::FnArg = parse_quote_spanned! {item.span() => - #old_arg - }; - check_item.sig.inputs.push(old_arg_ref); + check_item.sig.inputs.push(old_arg); } - check_item + println!("Check function: {}", check_item.to_token_stream()); + syn::Item::Fn(check_item) } + // generate the function that clones old values and returns them. pub fn generate_store_function( &self, item: &untyped::AnyFnItem, - item_name: syn::Ident, - check_id_str: String, - ) -> syn::ItemFn { + check_id: SpecificationId, + ) -> syn::Item { + let item_name = syn::Ident::new( + &format!( + "prusti_{}_store_old_item_{}_{}", + self.spec_type, + item.sig().ident, + check_id, + ), + item.span(), + ); + let check_id_str = check_id.to_string(); let mut exprs = self .visitor .inputs @@ -104,7 +257,7 @@ impl CheckTranslator { } let old_values_type = self.old_values_type(item); // println!("resulting tuple: {}", quote!{#tuple}); - let forget_statements = self.generate_forget_statements(item, &None); + let forget_statements = self.generate_forget_statements(item, &None, false); let item_name_str = item_name.to_string(); let mut res: syn::ItemFn = parse_quote_spanned! {item.span() => @@ -118,11 +271,50 @@ impl CheckTranslator { return old_values; } }; + println!("Store fn: {}", res.to_token_stream()); // store function has the same generics and arguments as the // original annotated function res.sig.generics = item.sig().generics.clone(); res.sig.inputs = item.sig().inputs.clone(); - res + syn::Item::Fn(res) + } + + pub fn generate_store_before_expiry( + &self, + item: &untyped::AnyFnItem, + check_id: SpecificationId, + ) -> syn::Item { + let item_name = syn::Ident::new( + &format!( + "prusti_{}_store_before_expiry_item_{}_{}", + self.spec_type, + item.sig().ident, + check_id, + ), + item.span(), + ); + let check_id_str = check_id.to_string(); + let item_name_str = item_name.to_string(); + + let result_arg = AstRewriter::generate_result_arg(item); + let arg = Argument::try_from(&result_arg).unwrap(); + let (result_type, arg_ty) = if let syn::Type::Reference(ty) = arg.ty { + let mut ty_ref = ty.clone(); + ty_ref.mutability = None; + ((*ty_ref.elem).clone(), syn::Type::Reference(ty_ref)) + } else { + panic!("result of pledge does not look like a pointer") + }; + let res: syn::ItemFn = parse_quote_spanned! { item.span() => + #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] + #[prusti::spec_only] + #[prusti::store_before_expiry_id = #check_id_str] + fn #item_name (res : #arg_ty) -> #result_type { + println!("store before expiry function {} is performed", #item_name_str); + res.clone() + } + }; + syn::Item::Fn(res) } /// After the visitor was run on an expression, this function @@ -158,7 +350,7 @@ impl CheckTranslator { old_values_type } - // at the moment deref is true in all use cases. Remove + // at the moment deref is false in all use cases. Remove pub fn construct_old_fnarg(&self, item: &T, deref: bool) -> syn::FnArg { let old_values_type: syn::Type = self.old_values_type(item); if deref { @@ -176,6 +368,7 @@ impl CheckTranslator { &self, item: &untyped::AnyFnItem, result_arg_opt: &Option, + has_old_arg: bool, ) -> syn::Block { // go through all inputs, if they are not references add a forget // statement @@ -183,12 +376,15 @@ impl CheckTranslator { for fn_arg in item.sig().inputs.clone() { if let Ok(arg) = Argument::try_from(&fn_arg) { let name: TokenStream = arg.name.parse().unwrap(); - stmts.push(parse_quote! { - std::mem::forget(#name); - }) + if !arg.is_ref { + stmts.push(parse_quote! { + std::mem::forget(#name); + }) + } } } + // result might be double freed too if moved into a check function if let Some(result) = result_arg_opt { if let Ok(result_arg) = Argument::try_from(result) { let name: TokenStream = result_arg.name.parse().unwrap(); @@ -197,6 +393,11 @@ impl CheckTranslator { }) } } + if has_old_arg { + stmts.push(parse_quote! { + std::mem::forget(old_values); + }) + } syn::Block { brace_token: syn::token::Brace::default(), stmts, @@ -211,10 +412,11 @@ pub struct CheckVisitor { pub within_old: bool, pub inputs: FxHashMap, pub highest_old_index: usize, + pub executed_after: bool, } impl CheckVisitor { - pub fn new(item: &untyped::AnyFnItem) -> Self { + pub fn new(item: &untyped::AnyFnItem, executed_after: bool) -> Self { let inputs = item .sig() .inputs @@ -229,6 +431,7 @@ impl CheckVisitor { within_old: false, inputs, highest_old_index: 0, + executed_after, } } } @@ -245,7 +448,7 @@ impl VisitMut for CheckVisitor { if let Some(arg) = self.inputs.get_mut(&name) { // argument used within an old expression? // not already marked as used in old? - if self.within_old { + if self.executed_after && (self.within_old || !arg.is_ref) { // if it was not already marked to be stored // needs to be checked for indeces to be correct if !arg.used_in_old { @@ -259,11 +462,11 @@ impl VisitMut for CheckVisitor { arg.old_store_index.to_string().parse().unwrap(); let tokens = if arg.is_ref { // cloning will deref the value.. - quote! {(&(&old_values.#index_token).clone())} + quote! {(&old_values.#index_token)} } else { // unfortunately it could still be a reference.. // no real solution at this level - quote! {((&old_values.#index_token).clone())} + quote! {(old_values.#index_token)} }; println!("tokens: {}", tokens); let new_path: syn::Expr = syn::parse2(tokens).unwrap(); @@ -438,7 +641,8 @@ fn translate_quantifier_expression(closure: &syn::ExprClosure, kind: QuantifierK // look for the runtime_quantifier_bounds attribute: println!("closure arguments: {:?}", bound_vars); let manual_bounds = BoundExtractor::manual_bounds(closure.clone(), bound_vars.clone()); - let bounds = manual_bounds.unwrap_or_else(|| BoundExtractor::derive_ranges(*closure.body.clone(), bound_vars)); + let bounds = manual_bounds + .unwrap_or_else(|| BoundExtractor::derive_ranges(*closure.body.clone(), bound_vars)); let mut expr = *closure.body.clone(); @@ -484,4 +688,3 @@ fn translate_quantifier_expression(closure: &syn::ExprClosure, kind: QuantifierK } expr } - diff --git a/prusti-interface/src/specs/mod.rs b/prusti-interface/src/specs/mod.rs index 8ca6be98fcc..828dbdb46db 100644 --- a/prusti-interface/src/specs/mod.rs +++ b/prusti-interface/src/specs/mod.rs @@ -78,6 +78,8 @@ pub struct SpecCollector<'a, 'tcx> { /// the functions who's specifications have associated checks. check_functions: FxHashMap, store_functions: FxHashMap, + store_before_expiry_functions: FxHashMap, + check_before_expiry_functions: FxHashMap, /// Map from functions/loops/types to their specifications. procedure_specs: FxHashMap, @@ -103,6 +105,8 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { store_functions: FxHashMap::default(), procedure_specs: FxHashMap::default(), procedure_checks: FxHashMap::default(), + store_before_expiry_functions: FxHashMap::default(), + check_before_expiry_functions: FxHashMap::default(), loop_specs: vec![], loop_variants: vec![], type_specs: FxHashMap::default(), @@ -161,6 +165,29 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { old_store: store_fn_id.to_def_id(), } } + SpecIdRef::Pledge { rhs, .. } => { + // can we treat both assert_on_expiry and after_expiry treat the same? + let check = self.check_functions.get(rhs).unwrap().to_def_id(); + let old_store = self.store_functions.get(rhs).unwrap().to_def_id(); + // this does not exist for after_expiry pledges + let check_before_expiry = self + .check_before_expiry_functions + .get(rhs) + .map(|id| id.to_def_id()); + let store_before_expiry = self + .store_before_expiry_functions + .get(rhs) + .unwrap() + .to_def_id(); + let res = typed::CheckKind::Pledge { + check, + old_store, + check_before_expiry, + store_before_expiry, + }; + println!("Found a pledge with following contents: {:#?}", res); + res + } // Todo: Pledges, Assume? _ => unreachable!(), }; @@ -502,6 +529,14 @@ fn get_procedure_check_ids(def_id: DefId, attrs: &[ast::Attribute]) -> Vec intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { } else if let Some(raw_store_id) = read_prusti_attr("store_id", attrs) { let store_id = parse_spec_id(raw_store_id, def_id); self.store_functions.insert(store_id, local_id); + } else if let Some(raw_store_expiry_id) = read_prusti_attr("store_before_expiry_id", attrs) + { + let id = parse_spec_id(raw_store_expiry_id, def_id); + self.store_before_expiry_functions.insert(id, local_id); + } else if let Some(raw_before_expiry_check_id) = + read_prusti_attr("check_before_expiry_id", attrs) + { + let id = parse_spec_id(raw_before_expiry_check_id, def_id); + self.check_before_expiry_functions.insert(id, local_id); } else { // Don't collect specs "for" spec items diff --git a/prusti-interface/src/specs/typed.rs b/prusti-interface/src/specs/typed.rs index 6d9877e84ed..4aaa946e5a4 100644 --- a/prusti-interface/src/specs/typed.rs +++ b/prusti-interface/src/specs/typed.rs @@ -28,9 +28,17 @@ pub struct DefSpecificationMap { #[derive(Debug, Clone)] pub enum CheckKind { Pre(DefId), - Post { check: DefId, old_store: DefId }, // actual check and old_store function + Post { + check: DefId, + old_store: DefId, + }, // actual check and old_store function Assume(DefId), - Pledge{rhs: DefId, lhs: DefId}, + Pledge { + check: DefId, + old_store: DefId, + check_before_expiry: Option, + store_before_expiry: DefId, + }, } impl DefSpecificationMap { @@ -70,16 +78,23 @@ impl DefSpecificationMap { self.ghost_end.get(def_id) } + pub fn get_runtime_checks(&self, def_id: &DefId) -> Vec { + self.checks.get(def_id).cloned().unwrap_or(Vec::new()) + } pub fn get_pre_checks(&self, def_id: &DefId) -> Vec { let checks_opt = self.checks.get(def_id); if let Some(checks) = checks_opt { - checks.iter().filter_map(|el| - if let CheckKind::Pre(id) = el { - Some(id) - } else { - None - } - ).cloned().collect() + checks + .iter() + .filter_map(|el| { + if let CheckKind::Pre(id) = el { + Some(id) + } else { + None + } + }) + .cloned() + .collect() } else { Vec::new() } @@ -88,13 +103,16 @@ impl DefSpecificationMap { pub fn get_post_checks(&self, def_id: &DefId) -> Vec<(DefId, DefId)> { let checks_opt = self.checks.get(def_id); if let Some(checks) = checks_opt { - checks.iter().filter_map(|el| - if let CheckKind::Post { check, old_store } = el { - Some((*check, *old_store)) - } else { - None - } - ).collect() + checks + .iter() + .filter_map(|el| { + if let CheckKind::Post { check, old_store } = el { + Some((*check, *old_store)) + } else { + None + } + }) + .collect() } else { Vec::new() } diff --git a/prusti/src/mir_helper.rs b/prusti/src/mir_helper.rs index cff6d20bc45..be4834977c8 100644 --- a/prusti/src/mir_helper.rs +++ b/prusti/src/mir_helper.rs @@ -37,6 +37,11 @@ pub fn get_local_from_name(body: &Body<'_>, name: String) -> Option None } +pub fn fn_return_ty<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> ty::Ty<'tcx> { + let fn_sig = tcx.fn_sig(def_id).subst_identity(); + fn_sig.output().skip_binder() +} + /// Just creates an erased region. Needed to create a borrow statement /// in the MIR pub fn dummy_region(tcx: TyCtxt<'_>) -> ty::Region<'_> { diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index aeda7c54c71..5d55e6ef6a0 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -1,5 +1,8 @@ use crate::mir_helper::*; -use prusti_interface::specs::typed::DefSpecificationMap; +use prusti_interface::{ + environment::{Environment, Procedure}, + specs::typed::{CheckKind, DefSpecificationMap}, +}; use prusti_rustc_interface::{ data_structures::steal::Steal, interface::DEFAULT_QUERY_PROVIDERS, @@ -16,10 +19,17 @@ use prusti_rustc_interface::{ DUMMY_SP, }, }; +use prusti_viper::encoder::Encoder; // debugging dependencies? -use std::io::prelude::*; -use std::fs::File; +use std::{env, fs, io}; + +fn folder_present(name: &str) -> io::Result { + let mut path = env::current_dir()?; + path.push(name); + let metadata = fs::metadata(path)?; + Ok(metadata.is_dir()) +} pub static mut SPECS: Option = None; @@ -36,6 +46,10 @@ pub(crate) fn mir_checked( let specs_opt = unsafe { SPECS.clone() }; if let Some(specs) = specs_opt { + // let def_id = def.def_id_for_type_of(); + // let env = Environment::new(tcx, env!("CARGO_PKG_VERSION")); + // let encoder = Encoder::new(&env, specs.clone()); + // let procedure = Procedure::new(&env, def_id); let steal = (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def); let mut stolen = steal.steal(); @@ -44,8 +58,12 @@ pub(crate) fn mir_checked( println!("Custom modifications are done! Compiler back at work"); // print mir of body: - let mut dump_file = File::create("dump_mir_adjusted.txt").unwrap(); - pretty::write_mir_fn(tcx, &stolen, &mut |_,_| Ok(()), &mut dump_file).unwrap(); + if let Ok(true) = folder_present("dump") { + let def_id = stolen.source.def_id(); + let mut dump_file = + fs::File::create(format!("dump/dump_mir_adjusted_{:?}.txt", def_id)).unwrap(); + pretty::write_mir_fn(tcx, &stolen, &mut |_, _| Ok(()), &mut dump_file).unwrap(); + } tcx.alloc_steal_mir(stolen) } else { @@ -54,10 +72,20 @@ pub(crate) fn mir_checked( } } +#[derive(Debug, Copy, Clone)] +pub struct PledgeToProcess<'tcx> { + check: DefId, + store_before_expiry: DefId, + check_before_expiry: Option, + old_values_place: Place<'tcx>, + before_expiry_place: Place<'tcx>, +} + pub struct InsertChecksVisitor<'tcx> { tcx: TyCtxt<'tcx>, specs: DefSpecificationMap, current_patcher: Option>, + pledges_to_process: Vec>, } impl<'tcx> InsertChecksVisitor<'tcx> { @@ -66,6 +94,7 @@ impl<'tcx> InsertChecksVisitor<'tcx> { tcx, specs, current_patcher: None, + pledges_to_process: Vec::new(), } } } @@ -76,6 +105,16 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } fn visit_body(&mut self, body: &mut Body<'tcx>) { + // visit body, apply patches, possibly find pledges that need to be processed here: + self.current_patcher = Some(MirPatch::new(body)); + self.super_body(body); + let mir_patch = self.current_patcher.take(); + mir_patch.unwrap().apply(body); + + for pledge_to_process in &self.pledges_to_process { + println!("found a pledge {:#?}, currently not processing it", pledge_to_process); + } + // do we have to make sure this is the body the query was called on? let def_id = body.source.def_id(); // try to find specification function: @@ -105,11 +144,6 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { replace_outgoing_edges(b, BasicBlock::MAX, new_block); } } - - self.current_patcher = Some(MirPatch::new(body)); - self.super_body(body); - let mir_patch = self.current_patcher.take(); - mir_patch.unwrap().apply(body); } fn visit_basic_block_data(&mut self, block: BasicBlock, data: &mut BasicBlockData<'tcx>) { @@ -136,8 +170,8 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { literal: ConstantKind::Val(_, ty), .. }), - target, - destination, + target, // the block called afterwards + destination, // local to receive result args, .. } = terminator_kind @@ -169,105 +203,87 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { .borrow() .clone(); // since there might be multiple blocks to be inserted, - for (check_id, old_store_id) in self.specs.get_post_checks(&call_id) { - println!("Now inserting a runtime check for a postcondition"); - println!("Old store defid: {:?}", old_store_id); - // since here, we don't have mutable access to the body, - // we created a patcher beforehand which we can use here - // and apply later - let mut patch = self.current_patcher.take().unwrap(); - - // get the bodies of the store and check function - let old_store_body = self - .tcx - .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( - old_store_id.as_local().unwrap(), - )) - .borrow(); - let check_body = self - .tcx - .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( - check_id.as_local().unwrap(), - )) - .borrow(); - - // get the local index of the old_values argument to the - // check function (where it's already a reference to this - // tuple) - let old_values_check_arg = - get_local_from_name(&check_body, "old_values".to_string()).unwrap(); - // find the type of that local - let old_value_arg_ty = - check_body.local_decls.get(old_values_check_arg).unwrap().ty; - - println!("found old_values arg type: {:?}", old_value_arg_ty); - - // create a new internal to store result of old_store function - let old_ret_ty = old_store_body.return_ty(); - println!( - "expecting return type {:?} for old_store function", - old_ret_ty - ); - let old_dest_place = Place::from(patch.new_internal(old_ret_ty, DUMMY_SP)); - let old_arg_deref_place = - Place::from(patch.new_internal(old_value_arg_ty, DUMMY_SP)); - - // dereference the old_values type - let rvalue = rvalue_reference_to_place(self.tcx, old_dest_place); - - // we store the target, create a new block per check function - // chain these with the final call having the original target, - // change the target of the call to the first block of our chain. - let (block, _) = new_call_block( - self.tcx, - &mut patch, - check_id, - &called_body, - current_target, - Some(*destination), // destination is now result arg - Some(old_arg_deref_place), - Some(args.clone()), - substs, - ); - // make deref the first statement in this block - let insert_deref_location = mir::Location { - block, - statement_index: 0, - }; - patch.add_assign(insert_deref_location, old_arg_deref_place, rvalue); - current_target = Some(block); - - let mut call_fn_terminator = original_terminator.clone(); - replace_target(&mut call_fn_terminator, block); - let new_block_data = BasicBlockData::new(Some(call_fn_terminator)); - let new_block = patch.new_block(new_block_data); - - // let generics = self.tcx.generics_of(def_id); - let store_func_ty = self - .tcx - .mk_ty_from_kind(TyKind::FnDef(old_store_id, substs)); - let store_func = Operand::Constant(Box::new(Constant { - span: DUMMY_SP, - user_ty: None, - literal: ConstantKind::zero_sized(store_func_ty), - })); - - let store_terminator = TerminatorKind::Call { - func: store_func, - args: args.clone(), - destination: old_dest_place, - target: Some(new_block), - cleanup: None, - from_hir_call: false, - fn_span: old_store_body.span, - }; - patch.patch_terminator(caller_block, store_terminator); - caller_block = new_block; - - // If there are multiple checks, this also should behave - // correctly, since on the second iteration this target - // is already the new block - self.current_patcher = Some(patch); + for check_kind in self.specs.get_runtime_checks(&call_id) { + match check_kind { + CheckKind::Post { + check: check_id, + old_store: old_store_id, + } => { + println!("Now inserting a runtime check for a postcondition"); + println!("Old store defid: {:?}", old_store_id); + // since here, we don't have mutable access to the body, + // we created a patcher beforehand which we can use here + // and apply later + let mut patch = self.current_patcher.take().unwrap(); + (caller_block, current_target) = surround_call_with_store_and_check( + self.tcx, + &mut patch, + check_id, + old_store_id, + caller_block, + current_target, + *destination, + args.clone(), + substs, + &called_body, + original_terminator.clone(), + ); + // If there are multiple checks, this also should behave + // correctly, since on the second iteration this target + // is already the new block + self.current_patcher = Some(patch); + } + CheckKind::Pledge { + check, + old_store, + check_before_expiry, + store_before_expiry, + } => { + // get patcher: + let mut patch = self.current_patcher.take().unwrap(); + // 1. store old values, create local: + let old_values_ty = fn_return_ty(self.tcx, old_store); + let old_values_place = + Place::from(patch.new_internal(old_values_ty, DUMMY_SP)); + // store_before_expiry has to always exist? + // if yes: + let before_expiry_ty = + fn_return_ty(self.tcx, store_before_expiry); + let before_expiry_place = + Place::from(patch.new_internal(before_expiry_ty, DUMMY_SP)); + + prepend_store( + self.tcx, + &mut patch, + old_store, + caller_block, + args.clone(), + substs, + original_terminator.clone(), + old_values_place, + ); + + // *destination is the loan! + // figure out where is expires! + let pledge_to_process = PledgeToProcess { + check, + check_before_expiry, + store_before_expiry, + old_values_place, + before_expiry_place, + }; + self.pledges_to_process.push(pledge_to_process); + + // Insert the 3 functions (all but old_store) + // where the reference goes out of scope + // this can probably not be done here! + // Goal: Given a location, split that block into + // two, insert before_expiry_store and before_expiry_check, + // and then the check function + self.current_patcher = Some(patch); + } + _ => {} + } } } } @@ -275,6 +291,128 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } } +/// Block current_caller is calling an annotated function. This function creates +/// a new block (new_block), moves this call into that block, adjusts the original +/// block to call a store function and sets its target to this new block +fn prepend_store<'tcx>( + tcx: TyCtxt<'tcx>, + patch: &mut MirPatch<'tcx>, + old_store_id: DefId, + caller_block: BasicBlock, + args: Vec>, + substs: ty::subst::SubstsRef<'tcx>, + terminator: Terminator<'tcx>, + old_dest_place: Place<'tcx>, +) -> BasicBlock { + // get the bodies of the store and check function + let old_store_body = tcx + .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( + old_store_id.as_local().unwrap(), + )) + .borrow(); + let new_block_data = BasicBlockData::new(Some(terminator)); + let new_block = patch.new_block(new_block_data); + + let store_func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(old_store_id, substs)); + let store_func = Operand::Constant(Box::new(Constant { + span: DUMMY_SP, + user_ty: None, + literal: ConstantKind::zero_sized(store_func_ty), + })); + + let store_terminator = TerminatorKind::Call { + func: store_func, + args: args.clone(), + destination: old_dest_place, + target: Some(new_block), + cleanup: None, + from_hir_call: false, + fn_span: old_store_body.span, + }; + patch.patch_terminator(caller_block, store_terminator); + new_block +} + +fn surround_call_with_store_and_check<'tcx>( + tcx: TyCtxt<'tcx>, + patch: &mut MirPatch<'tcx>, + check_id: DefId, + old_store_id: DefId, + caller_block: BasicBlock, + target: Option, + call_destination: Place<'tcx>, + args: Vec>, + substs: ty::subst::SubstsRef<'tcx>, + called_body: &Body, + original_terminator: Terminator<'tcx>, +) -> (BasicBlock, Option) { + println!("Now inserting a runtime check for a postcondition"); + println!("Old store defid: {:?}", old_store_id); + + let check_body = tcx + .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( + check_id.as_local().unwrap(), + )) + .borrow(); + + // get the local index of the old_values argument to the + // check function (where it's already a reference to this + // tuple) + let old_values_check_arg = get_local_from_name(&check_body, "old_values".to_string()).unwrap(); + // find the type of that local + let old_value_arg_ty = check_body.local_decls.get(old_values_check_arg).unwrap().ty; + let old_ret_ty = fn_return_ty(tcx, old_store_id); + let old_dest_place = Place::from(patch.new_internal(old_ret_ty, DUMMY_SP)); + + println!("found old_values arg type: {:?}", old_value_arg_ty); + + // we store the target, create a new block per check function + // chain these with the final call having the original target, + // change the target of the call to the first block of our chain. + let (block, _) = new_call_block( + tcx, + patch, + check_id, + called_body, + target, + Some(call_destination), // destination is now result arg + Some(old_dest_place), + Some(args.clone()), + substs, + ); + // make deref the first statement in this block + // let insert_deref_location = mir::Location { + // block, + // statement_index: 0, + // }; + // patch.add_assign(insert_deref_location, old_arg_deref_place, rvalue); + let next_target = Some(block); + + // the terminator that calls the original function, but in this case jumps to + // a check function after instead of original target + let mut call_fn_terminator = original_terminator; + replace_target(&mut call_fn_terminator, block); + + let new_caller_block = prepend_store( + tcx, + patch, + old_store_id, + caller_block, + args, + substs, + call_fn_terminator, + old_dest_place, + ); + + // let generics = self.tcx.generics_of(def_id); + + // If there are multiple checks, this also should behave + // correctly, since on the second iteration this target + // is already the new block + + (new_caller_block, next_target) +} + fn new_call_block<'tcx>( tcx: TyCtxt<'tcx>, patch: &mut MirPatch<'tcx>, From 4759f3ba355e934312ba24ae77f1385a6613b62d Mon Sep 17 00:00:00 2001 From: cedric Date: Tue, 13 Jun 2023 21:35:29 +0200 Subject: [PATCH 12/45] Now able to insert runtime checks for pledges. Where to insert them is still an issue --- .../prusti-specs/src/runtime_checks.rs | 58 ++++- prusti-interface/src/specs/mod.rs | 2 +- prusti/src/mir_helper.rs | 126 +++++++++- prusti/src/mir_modify.rs | 230 +++++++++--------- 4 files changed, 283 insertions(+), 133 deletions(-) diff --git a/prusti-contracts/prusti-specs/src/runtime_checks.rs b/prusti-contracts/prusti-specs/src/runtime_checks.rs index e71126a1661..73733ec729f 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks.rs @@ -67,26 +67,31 @@ pub fn translate_runtime_checks( item: &untyped::AnyFnItem, ) -> syn::Result { let check_translator = CheckTranslator::new(item, expr, lhs, spec_type.clone()); - let check_fn = check_translator.generate_check_function(item, check_id, false); - let (store_fn, store_before_expiry, check_before_expiry) = match spec_type { + let (check_fn, store_fn, store_before_expiry, check_before_expiry) = match spec_type { SpecItemType::Pledge => { // most things to generate: + let check_fn = check_translator.generate_check_function(item, check_id, false, true); let store_item = check_translator.generate_store_function(item, check_id); let check_before_expiry = - check_translator.generate_check_function(item, check_id, true); + check_translator.generate_check_function(item, check_id, true, false); let store_before_expiry = check_translator.generate_store_before_expiry(item, check_id); ( + check_fn, Some(store_item), Some(store_before_expiry), Some(check_before_expiry), ) } SpecItemType::Postcondition => { + let check_fn = check_translator.generate_check_function(item, check_id, false, false); let store_item = check_translator.generate_store_function(item, check_id); - (Some(store_item), None, None) + (check_fn, Some(store_item), None, None) } - SpecItemType::Precondition => (None, None, None), + SpecItemType::Precondition => { + let check_fn = check_translator.generate_check_function(item, check_id, false, false); + (check_fn, None, None, None) + }, _ => unreachable!(), }; syn::Result::Ok(RuntimeFunctions { @@ -134,6 +139,7 @@ impl CheckTranslator { item: &untyped::AnyFnItem, check_id: SpecificationId, is_before_expiry_check: bool, + before_expiry_argument: bool, ) -> syn::Item { // lhs is true for assert_on_expire only! Re-use this method to create // a check function for the pre-expiry check @@ -208,13 +214,25 @@ impl CheckTranslator { } }; check_item.sig.generics = item.sig().generics.clone(); - check_item.sig.inputs = item.sig().inputs.clone(); + if !is_before_expiry_check { + check_item.sig.inputs = item.sig().inputs.clone(); + } if executed_after { check_item.sig.inputs.push(result_arg_opt.unwrap()); let old_arg = self.construct_old_fnarg(item, false); // put it inside a reference: check_item.sig.inputs.push(old_arg); } + if before_expiry_argument { + let output_ty = match &item.sig().output { + syn::ReturnType::Type(_, box syn::Type::Reference(syn::TypeReference{ elem: box ty, ..})) => ty.clone(), + _ => panic!("a pledge that doesnt return a reference?"), + }; + let before_expiry_arg = parse_quote_spanned!{item.span() => + result_before_expiry: #output_ty + }; + check_item.sig.inputs.push(before_expiry_arg); + } println!("Check function: {}", check_item.to_token_stream()); syn::Item::Fn(check_item) } @@ -305,7 +323,7 @@ impl CheckTranslator { } else { panic!("result of pledge does not look like a pointer") }; - let res: syn::ItemFn = parse_quote_spanned! { item.span() => + let mut res: syn::ItemFn = parse_quote_spanned! { item.span() => #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] #[prusti::spec_only] #[prusti::store_before_expiry_id = #check_id_str] @@ -314,6 +332,7 @@ impl CheckTranslator { res.clone() } }; + res.sig.generics = item.sig().generics.clone(); syn::Item::Fn(res) } @@ -408,8 +427,8 @@ impl CheckTranslator { /// collects information about expression, but also transforms it /// for check pub struct CheckVisitor { - pub rust_only: bool, pub within_old: bool, + pub within_before_expiry: bool, pub inputs: FxHashMap, pub highest_old_index: usize, pub executed_after: bool, @@ -427,8 +446,8 @@ impl CheckVisitor { .collect(); println!("collected inputs: {:?}", inputs); Self { - rust_only: true, within_old: false, + within_before_expiry: false, inputs, highest_old_index: 0, executed_after, @@ -472,6 +491,11 @@ impl VisitMut for CheckVisitor { let new_path: syn::Expr = syn::parse2(tokens).unwrap(); *expr = new_path; } + } else if self.within_before_expiry && name == "result".to_string() { + let new_path: syn::Expr = parse_quote! { + (&result_before_expiry) + }; + *expr = new_path; } else { println!("identifier {} was not found in args\n\n", name); } @@ -500,7 +524,6 @@ impl VisitMut for CheckVisitor { // remove old-call and replace with content expression *expr = sub_expr.unwrap().value().clone(); println!("recognized old with sub_expr: {}!", quote! {#expr}); - self.rust_only = false; // no translation is not enough.. self.within_old = true; syn::visit_mut::visit_expr_mut(self, expr); // will cause all variables below to be replaced by old_value.some_field @@ -510,6 +533,19 @@ impl VisitMut for CheckVisitor { quote! {#expr} ); } + ":: prusti_contracts :: before_expiry" | "prusti_contracts :: before_expiry" | "before_expiry" => { + let sub_expr = call.args.pop(); + *expr = sub_expr.unwrap().value().clone(); + println!("recognized before_expiry with sub_expr: {}!", quote! {#expr}); + self.within_before_expiry = true; + syn::visit_mut::visit_expr_mut(self, expr); + // will cause all variables below to be replaced by old_value.some_field + self.within_before_expiry = false; + println!( + "done searching contents of before_expiry(), expression now: {}", + quote! {#expr} + ); + }, ":: prusti_contracts :: forall" => { syn::visit_mut::visit_expr_call_mut(self, call); // arguments are triggers and then the closure: @@ -535,7 +571,7 @@ impl VisitMut for CheckVisitor { ); *expr = check_expr } - } + }, _ => syn::visit_mut::visit_expr_mut(self, expr), } } diff --git a/prusti-interface/src/specs/mod.rs b/prusti-interface/src/specs/mod.rs index 828dbdb46db..1f3dcb04935 100644 --- a/prusti-interface/src/specs/mod.rs +++ b/prusti-interface/src/specs/mod.rs @@ -102,8 +102,8 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { env, spec_functions: FxHashMap::default(), check_functions: FxHashMap::default(), - store_functions: FxHashMap::default(), procedure_specs: FxHashMap::default(), + store_functions: FxHashMap::default(), procedure_checks: FxHashMap::default(), store_before_expiry_functions: FxHashMap::default(), check_before_expiry_functions: FxHashMap::default(), diff --git a/prusti/src/mir_helper.rs b/prusti/src/mir_helper.rs index be4834977c8..ef28ea03f4f 100644 --- a/prusti/src/mir_helper.rs +++ b/prusti/src/mir_helper.rs @@ -1,6 +1,6 @@ use prusti_rustc_interface::{ middle::{ - mir::{self, Body, TerminatorKind}, + mir::{self, patch::MirPatch, Body, TerminatorKind}, ty::{self, TyCtxt}, }, span::{self, def_id::DefId}, @@ -49,6 +49,13 @@ pub fn dummy_region(tcx: TyCtxt<'_>) -> ty::Region<'_> { tcx.mk_region_from_kind(kind) } +pub fn dummy_source_info() -> mir::SourceInfo { + mir::SourceInfo { + span: span::DUMMY_SP, + scope: mir::SourceScope::from_usize(0), + } +} + pub fn rvalue_reference_to_place<'tcx>( tcx: TyCtxt<'tcx>, place: mir::Place<'tcx>, @@ -61,6 +68,123 @@ pub fn rvalue_reference_to_place<'tcx>( ) } +pub fn args_from_body<'tcx>(body: &Body<'tcx>) -> Vec> { + + let mut args = Vec::new(); + let caller_nr_args = body.arg_count; + // now the final mapping to operands: + for (local, _decl) in body.local_decls.iter_enumerated() { + let index = local.index(); + if index != 0 && index <= caller_nr_args { + args.push(mir::Operand::Copy(mir::Place { + local, + projection: ty::List::empty(), + })); + } + } + args +} + +pub fn create_call_block<'tcx>( + tcx: TyCtxt<'tcx>, + patch: &mut MirPatch<'tcx>, + call_id: DefId, + args: Vec>, + substs: ty::subst::SubstsRef<'tcx>, + destination: Option>, + target: Option, +) -> Result<(mir::BasicBlock, mir::Place<'tcx>),()> { + let body_to_insert: Body<'tcx> = tcx + .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( + call_id.as_local().unwrap(), + )) + .borrow() + .clone(); + + let ret_ty = body_to_insert.return_ty(); + // construct the function call + let func_ty = tcx.mk_ty_from_kind(ty::TyKind::FnDef(call_id, substs)); + let func = mir::Operand::Constant(Box::new(mir::Constant { + span: span::DUMMY_SP, + user_ty: None, + literal: mir::ConstantKind::zero_sized(func_ty), + })); + // either use passed destination or create a new one + let destination = if let Some(dest) = destination { + dest + } else { + mir::Place::from(patch.new_internal(ret_ty, span::DUMMY_SP)) + }; + + // args have to be constructed beforehand, including result or old_values + let terminator_kind = mir::TerminatorKind::Call { + func, + args, + destination, + target, + cleanup: None, + from_hir_call: false, + fn_span: body_to_insert.span, + }; + let terminator = mir::Terminator { + source_info: dummy_source_info(), + kind: terminator_kind, + }; + let blockdata = mir::BasicBlockData::new(Some(terminator)); + let new_block_id = patch.new_block(blockdata); + + Ok((new_block_id, destination)) +} + +/// Creates one new block, moves all instructions following the passed location +/// and the terminator to the new block, and changes the current terminator +/// to point to this new block. If successful, returns index of the new block +pub fn split_block_at_location<'tcx>( + body: &mut mir::Body<'tcx>, + location: mir::Location, +) -> Result { + // check validity of the location: + let mut patch = MirPatch::new(body); + let block1: &mut mir::BasicBlockData = + body.basic_blocks_mut().get_mut(location.block).ok_or(())?; + + let nr_instructions = block1.statements.len(); + // check if the given location is valid + if nr_instructions <= location.statement_index { + return Err(()) + } + // the statements that stay in the first block + let stmts1: Vec = block1.statements[0..=location.statement_index].to_vec(); + + let stmts2: Vec = if location.statement_index + 1 < nr_instructions { + // location is not the last instruction of the block + block1.statements[location.statement_index + 1..].to_vec() + } else { + vec![] + }; + + let new_block_data = mir::BasicBlockData { + statements: stmts2, + terminator: block1.terminator.clone(), + is_cleanup: block1.is_cleanup, + }; + // add the new block: + let block2 = patch.new_block(new_block_data); + patch.apply(body); + + // reborrow, because of patcher + let block1: &mut mir::BasicBlockData = + body.basic_blocks_mut().get_mut(location.block).ok_or(())?; + let terminator_between = mir::Terminator { + kind: mir::TerminatorKind::Goto { target: block2 }, + source_info: dummy_source_info(), + }; + block1.terminator = Some(terminator_between); + block1.statements = stmts1; + + Ok(block2) +} + // If we re-order the IndexVec containing the basic blocks, we will need to adjust // some the basic blocks that terminators point to. This is what this function does pub fn replace_outgoing_edges( diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index 5d55e6ef6a0..31700f07b2f 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -72,13 +72,16 @@ pub(crate) fn mir_checked( } } -#[derive(Debug, Copy, Clone)] +#[derive(Debug, Clone)] pub struct PledgeToProcess<'tcx> { check: DefId, store_before_expiry: DefId, check_before_expiry: Option, old_values_place: Place<'tcx>, before_expiry_place: Place<'tcx>, + destination: Place<'tcx>, + args: Vec>, + substs: ty::subst::SubstsRef<'tcx>, } pub struct InsertChecksVisitor<'tcx> { @@ -112,27 +115,35 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { mir_patch.unwrap().apply(body); for pledge_to_process in &self.pledges_to_process { - println!("found a pledge {:#?}, currently not processing it", pledge_to_process); + println!( + "found a pledge {:#?}, currently not processing it", + pledge_to_process + ); + let location = mir::Location { + block: BasicBlock::from_usize(1), + statement_index: 1, + }; + insert_pledge_call_chain(self.tcx, pledge_to_process.clone(), location, body).unwrap(); } - // do we have to make sure this is the body the query was called on? let def_id = body.source.def_id(); // try to find specification function: let substs = ty::subst::InternalSubsts::identity_for_item(self.tcx, def_id); + let args = args_from_body(body); for check_id in self.specs.get_pre_checks(&def_id) { let mut patch = MirPatch::new(body); let start_node = BasicBlock::from_usize(0); - let (new_block, _) = new_call_block( + let (new_block, _) = create_call_block( self.tcx, &mut patch, check_id, - body, - Some(start_node), - None, - None, - None, + args.clone(), substs, - ); + None, // create new destination, does not matter here + // body, + Some(start_node), + ) + .unwrap(); patch.apply(body); // swap first and last node, so our new block is called on entry body.basic_blocks_mut().swap(start_node, new_block); @@ -247,8 +258,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { Place::from(patch.new_internal(old_values_ty, DUMMY_SP)); // store_before_expiry has to always exist? // if yes: - let before_expiry_ty = - fn_return_ty(self.tcx, store_before_expiry); + let before_expiry_ty = fn_return_ty(self.tcx, store_before_expiry); let before_expiry_place = Place::from(patch.new_internal(before_expiry_ty, DUMMY_SP)); @@ -264,13 +274,16 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { ); // *destination is the loan! - // figure out where is expires! + // figure out where it expires! let pledge_to_process = PledgeToProcess { check, check_before_expiry, store_before_expiry, old_values_place, before_expiry_place, + destination: *destination, + args: args.clone(), + substs, }; self.pledges_to_process.push(pledge_to_process); @@ -292,11 +305,12 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } /// Block current_caller is calling an annotated function. This function creates -/// a new block (new_block), moves this call into that block, adjusts the original -/// block to call a store function and sets its target to this new block +/// a new block (new_block), moves the call to the annotated function into +/// the new block, adjusts the original block to call a store function and sets +/// its target to this new block fn prepend_store<'tcx>( tcx: TyCtxt<'tcx>, - patch: &mut MirPatch<'tcx>, + patcher: &mut MirPatch<'tcx>, old_store_id: DefId, caller_block: BasicBlock, args: Vec>, @@ -311,7 +325,7 @@ fn prepend_store<'tcx>( )) .borrow(); let new_block_data = BasicBlockData::new(Some(terminator)); - let new_block = patch.new_block(new_block_data); + let new_block = patcher.new_block(new_block_data); let store_func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(old_store_id, substs)); let store_func = Operand::Constant(Box::new(Constant { @@ -329,10 +343,79 @@ fn prepend_store<'tcx>( from_hir_call: false, fn_span: old_store_body.span, }; - patch.patch_terminator(caller_block, store_terminator); + patcher.patch_terminator(caller_block, store_terminator); new_block } +fn insert_pledge_call_chain<'tcx>( + tcx: TyCtxt<'tcx>, + pledge: PledgeToProcess<'tcx>, + location: mir::Location, + body: &mut Body<'tcx>, +) -> Result<(), ()> { + let new_target: BasicBlock = split_block_at_location(body, location)?; + let mut patcher = MirPatch::new(body); + // given a location, insert the call chain to check a pledge: + // since we need to know the targets for each call, the blocks need to be created + // in reversed order. + + // Create call to check function: + let mut check_args = pledge.args.clone(); + check_args.push(Operand::Move(pledge.destination)); //result arg + check_args.push(Operand::Move(pledge.old_values_place)); + check_args.push(Operand::Move(pledge.before_expiry_place)); + let (check_after_block, _) = create_call_block( + tcx, + &mut patcher, + pledge.check, + check_args, + pledge.substs, + None, + Some(new_target), + )?; + + // If there is a check_before_expiry block, creat eit + let next_target = if let Some(check_before_expiry) = pledge.check_before_expiry { + let before_check_args = vec![ + Operand::Move(pledge.destination), + Operand::Move(pledge.old_values_place), + ]; + let (new_block, _) = create_call_block( + tcx, + &mut patcher, + check_before_expiry, + before_check_args, + pledge.substs, + None, + Some(check_after_block), + )?; + new_block + } else { + check_after_block + }; + + // 1. Call store_before_expiry, result of original call is pledge.destination + let args = vec![Operand::Move(pledge.destination)]; + let (store_block, _) = create_call_block( + tcx, + &mut patcher, + pledge.store_before_expiry, + args, + pledge.substs, + Some(pledge.before_expiry_place), + Some(next_target), + )?; + // finally, point the first block to the store block: + let terminator_kind = mir::TerminatorKind::Goto { + target: store_block, + }; + // point the split-off block to the first block of this chain + patcher.patch_terminator(location.block, terminator_kind); + patcher.apply(body); + + Ok(()) +} + fn surround_call_with_store_and_check<'tcx>( tcx: TyCtxt<'tcx>, patch: &mut MirPatch<'tcx>, @@ -340,7 +423,7 @@ fn surround_call_with_store_and_check<'tcx>( old_store_id: DefId, caller_block: BasicBlock, target: Option, - call_destination: Place<'tcx>, + result_operand: Place<'tcx>, args: Vec>, substs: ty::subst::SubstsRef<'tcx>, called_body: &Body, @@ -366,26 +449,17 @@ fn surround_call_with_store_and_check<'tcx>( println!("found old_values arg type: {:?}", old_value_arg_ty); + // construct arguments: first the arguments the function is called with, then the result of + // that call, then the old values: + let mut new_args = args.clone(); + new_args.push(Operand::Move(result_operand)); + new_args.push(Operand::Move(old_dest_place)); + // we store the target, create a new block per check function // chain these with the final call having the original target, // change the target of the call to the first block of our chain. - let (block, _) = new_call_block( - tcx, - patch, - check_id, - called_body, - target, - Some(call_destination), // destination is now result arg - Some(old_dest_place), - Some(args.clone()), - substs, - ); - // make deref the first statement in this block - // let insert_deref_location = mir::Location { - // block, - // statement_index: 0, - // }; - // patch.add_assign(insert_deref_location, old_arg_deref_place, rvalue); + let (block, _) = + create_call_block(tcx, patch, check_id, new_args, substs, None, target).unwrap(); let next_target = Some(block); // the terminator that calls the original function, but in this case jumps to @@ -412,87 +486,3 @@ fn surround_call_with_store_and_check<'tcx>( (new_caller_block, next_target) } - -fn new_call_block<'tcx>( - tcx: TyCtxt<'tcx>, - patch: &mut MirPatch<'tcx>, - terminator_call: DefId, - attached_to_body: &Body, - target: Option, - result: Option>, - old_value: Option>, - args_opt: Option>>, - substs: ty::subst::SubstsRef<'tcx>, -) -> (BasicBlock, Place<'tcx>) { - let body_to_insert: Body = tcx - .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( - terminator_call.as_local().unwrap(), - )) - .borrow() - .clone(); - - let ret_ty = body_to_insert.return_ty(); - // assert!(ret_ty.is_bool() || ret_ty.is_unit()); - // for store functions it can absolutely have a return type - // should always be block 0 but let's be certain.. - println!("Target node is {:?}", target); - - // variable to store result of function (altough we dont care about the result) - let dest_place: Place = Place::from(patch.new_internal(ret_ty, DUMMY_SP)); - - // find the substs that were used for the original call - let func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(terminator_call, substs)); // do I need substs? - println!("Function type: {:?}", func_ty); - let func = Operand::Constant(Box::new(Constant { - span: DUMMY_SP, - user_ty: None, - literal: ConstantKind::zero_sized(func_ty), - })); - - let mut args = Vec::new(); - if let Some(arguments) = args_opt { - args = arguments; - } else { - // determine the arguments! - // and make it less ugly.. But not sure how this is supposed to be done - let caller_nr_args = attached_to_body.arg_count; - // now the final mapping to operands: - for (local, _decl) in attached_to_body.local_decls.iter_enumerated() { - let index = local.index(); - if index != 0 && index <= caller_nr_args { - args.push(Operand::Copy(Place { - local, - projection: ty::List::empty(), - })); - } - } - } - if let Some(result_operand) = result { - println!("Adding the result operand!"); - args.push(Operand::Move(result_operand)); - } - if let Some(old_value_operand) = old_value { - println!("Adding the old_value operand"); - args.push(Operand::Move(old_value_operand)); - } - - let terminator_kind = TerminatorKind::Call { - func, - args, - destination: dest_place, - target, - cleanup: None, - from_hir_call: false, - fn_span: body_to_insert.span, - }; - let terminator = Terminator { - // todo: replace this with the span of the original contract? - source_info: SourceInfo { - span: DUMMY_SP, - scope: SourceScope::from_usize(0), - }, - kind: terminator_kind, - }; - let blockdata = BasicBlockData::new(Some(terminator)); - (patch.new_block(blockdata), dest_place) -} From 0351d453514adcc5912b2779bf75a3d0822aab06 Mon Sep 17 00:00:00 2001 From: cedric Date: Wed, 14 Jun 2023 13:37:31 +0200 Subject: [PATCH 13/45] Add runtime checks for pledges --- Cargo.lock | 1 + .../prusti-specs/src/runtime_checks.rs | 61 ++- prusti-viper/src/encoder/encoder.rs | 450 +++++++++++------- prusti-viper/src/encoder/procedure_encoder.rs | 37 +- prusti-viper/src/verifier.rs | 13 +- prusti/Cargo.toml | 1 + prusti/src/mir_modify.rs | 79 ++- prusti/src/verifier.rs | 5 + 8 files changed, 431 insertions(+), 216 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4dbff37574b..f11abe9a508 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2111,6 +2111,7 @@ dependencies = [ "prusti-interface", "prusti-rustc-interface", "prusti-viper", + "rustc-hash", "tracing 0.1.0", "tracing-chrome", "tracing-subscriber", diff --git a/prusti-contracts/prusti-specs/src/runtime_checks.rs b/prusti-contracts/prusti-specs/src/runtime_checks.rs index 73733ec729f..971ac50ba29 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks.rs @@ -91,7 +91,7 @@ pub fn translate_runtime_checks( SpecItemType::Precondition => { let check_fn = check_translator.generate_check_function(item, check_id, false, false); (check_fn, None, None, None) - }, + } _ => unreachable!(), }; syn::Result::Ok(RuntimeFunctions { @@ -155,6 +155,7 @@ impl CheckTranslator { item.span(), ); let check_id_str = check_id.to_string(); + let include_item_args = !is_before_expiry_check; // we differentiate items that are executed after a function // -> have result // -> have old values @@ -182,8 +183,13 @@ impl CheckTranslator { } else { None }; - let forget_statements = - self.generate_forget_statements(item, &result_arg_opt, executed_after); + let forget_statements = self.generate_forget_statements( + item, + include_item_args, + executed_after, + executed_after, + before_expiry_argument, + ); let contract_string = expr_to_check.to_token_stream().to_string(); let failure_message = format!("Contract {} was violated at runtime", contract_string); println!("Failure message: {}", failure_message); @@ -214,7 +220,7 @@ impl CheckTranslator { } }; check_item.sig.generics = item.sig().generics.clone(); - if !is_before_expiry_check { + if include_item_args { check_item.sig.inputs = item.sig().inputs.clone(); } if executed_after { @@ -225,10 +231,13 @@ impl CheckTranslator { } if before_expiry_argument { let output_ty = match &item.sig().output { - syn::ReturnType::Type(_, box syn::Type::Reference(syn::TypeReference{ elem: box ty, ..})) => ty.clone(), + syn::ReturnType::Type( + _, + box syn::Type::Reference(syn::TypeReference { elem: box ty, .. }), + ) => ty.clone(), _ => panic!("a pledge that doesnt return a reference?"), }; - let before_expiry_arg = parse_quote_spanned!{item.span() => + let before_expiry_arg = parse_quote_spanned! {item.span() => result_before_expiry: #output_ty }; check_item.sig.inputs.push(before_expiry_arg); @@ -275,7 +284,7 @@ impl CheckTranslator { } let old_values_type = self.old_values_type(item); // println!("resulting tuple: {}", quote!{#tuple}); - let forget_statements = self.generate_forget_statements(item, &None, false); + let forget_statements = self.generate_forget_statements(item, true, false, false, false); let item_name_str = item_name.to_string(); let mut res: syn::ItemFn = parse_quote_spanned! {item.span() => @@ -289,11 +298,11 @@ impl CheckTranslator { return old_values; } }; - println!("Store fn: {}", res.to_token_stream()); // store function has the same generics and arguments as the // original annotated function res.sig.generics = item.sig().generics.clone(); res.sig.inputs = item.sig().inputs.clone(); + println!("Store fn: {}", res.to_token_stream()); syn::Item::Fn(res) } @@ -386,37 +395,43 @@ impl CheckTranslator { pub fn generate_forget_statements( &self, item: &untyped::AnyFnItem, - result_arg_opt: &Option, + forget_item_args: bool, + has_result_arg: bool, has_old_arg: bool, + has_before_expiry_arg: bool, ) -> syn::Block { // go through all inputs, if they are not references add a forget // statement let mut stmts: Vec = Vec::new(); - for fn_arg in item.sig().inputs.clone() { - if let Ok(arg) = Argument::try_from(&fn_arg) { - let name: TokenStream = arg.name.parse().unwrap(); - if !arg.is_ref { - stmts.push(parse_quote! { - std::mem::forget(#name); - }) + if forget_item_args { + for fn_arg in item.sig().inputs.clone() { + if let Ok(arg) = Argument::try_from(&fn_arg) { + let name: TokenStream = arg.name.parse().unwrap(); + if !arg.is_ref { + stmts.push(parse_quote! { + std::mem::forget(#name); + }) + } } } } // result might be double freed too if moved into a check function - if let Some(result) = result_arg_opt { - if let Ok(result_arg) = Argument::try_from(result) { - let name: TokenStream = result_arg.name.parse().unwrap(); - stmts.push(parse_quote! { - std::mem::forget(#name); - }) - } + if has_result_arg { + stmts.push(parse_quote! { + std::mem::forget(result); + }) } if has_old_arg { stmts.push(parse_quote! { std::mem::forget(old_values); }) } + if has_before_expiry_arg { + stmts.push(parse_quote! { + std::mem::forget(result_before_expiry); + }) + } syn::Block { brace_token: syn::token::Brace::default(), stmts, diff --git a/prusti-viper/src/encoder/encoder.rs b/prusti-viper/src/encoder/encoder.rs index 08e5966d17f..1373a8fc451 100644 --- a/prusti-viper/src/encoder/encoder.rs +++ b/prusti-viper/src/encoder/encoder.rs @@ -1,69 +1,69 @@ -// © 2019, ETH Zurich -// // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -use ::log::{info, debug}; -use prusti_common::utils::identifiers::encode_identifier; -use vir_crate::common::check_mode::CheckMode; -use crate::encoder::builtin_encoder::BuiltinEncoder; -use crate::encoder::builtin_encoder::BuiltinMethodKind; -use crate::encoder::errors::{ErrorManager, SpannedEncodingError, EncodingError}; -use crate::encoder::foldunfold; -use crate::encoder::procedure_encoder::ProcedureEncoder; -use crate::error_unsupported; -use prusti_common::{vir_expr, vir_local}; -use prusti_common::config; -use prusti_common::report::log; -use prusti_interface::data::ProcedureDefId; -use prusti_interface::environment::Environment; -use prusti_interface::specs::typed; -use prusti_interface::PrustiError; -use vir_crate::polymorphic::{self as vir}; -use vir_crate::common::identifier::WithIdentifier; -use prusti_rustc_interface::hir::def_id::DefId; -use prusti_rustc_interface::middle::mir; -use prusti_rustc_interface::middle::ty; -use std::cell::{Cell, RefCell, RefMut, Ref}; -use std::fmt::Debug; -use rustc_hash::{FxHashSet, FxHashMap}; -use std::io::Write; -use std::rc::Rc; -use crate::encoder::stub_procedure_encoder::StubProcedureEncoder; -use std::ops::AddAssign; -use prusti_interface::specs::typed::ProcedureSpecificationKind; -use crate::encoder::name_interner::NameInterner; -use crate::encoder::errors::EncodingResult; -use crate::encoder::errors::SpannedEncodingResult; -use crate::encoder::mirror_function_encoder::MirrorEncoder; -use crate::encoder::snapshot::interface::{SnapshotEncoderInterface, SnapshotEncoderState}; -use crate::encoder::purifier; -use super::builtin_encoder::BuiltinDomainKind; -use super::high::builtin_functions::HighBuiltinFunctionEncoderState; -use super::middle::core_proof::{MidCoreProofEncoderState, MidCoreProofEncoderInterface}; -use super::mir::{ - sequences::{ - MirSequencesEncoderState, MirSequencesEncoderInterface, +use super::{ + builtin_encoder::BuiltinDomainKind, + counterexamples::{DiscriminantsState, MirProcedureMapping, MirProcedureMappingInterface}, + high::{ + builtin_functions::HighBuiltinFunctionEncoderState, + to_typed::types::HighToTypedTypeEncoderState, + types::{HighTypeEncoderInterface, HighTypeEncoderState}, }, - contracts::ContractsEncoderState, - procedures::MirProcedureEncoderState, - type_invariants::TypeInvariantEncoderState, - pure::{ - PureFunctionEncoderState, PureFunctionEncoderInterface, + middle::core_proof::{MidCoreProofEncoderInterface, MidCoreProofEncoderState}, + mir::{ + contracts::ContractsEncoderState, + procedures::MirProcedureEncoderState, + pure::{PureFunctionEncoderInterface, PureFunctionEncoderState}, + sequences::{MirSequencesEncoderInterface, MirSequencesEncoderState}, + specifications::{SpecificationsInterface, SpecificationsState}, + type_invariants::TypeInvariantEncoderState, + types::{compute_discriminant_bounds, MirTypeEncoderInterface, MirTypeEncoderState}, }, - types::{ - compute_discriminant_bounds, - MirTypeEncoderState, MirTypeEncoderInterface, +}; +use crate::{ + encoder::{ + builtin_encoder::{BuiltinEncoder, BuiltinMethodKind}, + errors::{ + EncodingError, EncodingResult, ErrorManager, SpannedEncodingError, + SpannedEncodingResult, + }, + foldunfold, + mirror_function_encoder::MirrorEncoder, + name_interner::NameInterner, + procedure_encoder::ProcedureEncoder, + purifier, + snapshot::interface::{SnapshotEncoderInterface, SnapshotEncoderState}, + stub_procedure_encoder::StubProcedureEncoder, }, - specifications::{ - SpecificationsState, SpecificationsInterface, - } + error_unsupported, +}; +use ::log::{debug, info}; +use prusti_common::{ + config, report::log, utils::identifiers::encode_identifier, vir_expr, vir_local, +}; +use prusti_interface::{ + data::ProcedureDefId, + environment::Environment, + specs::{typed, typed::ProcedureSpecificationKind}, + PrustiError, +}; +use prusti_rustc_interface::{ + hir::def_id::DefId, + middle::{mir, ty}, +}; +use rustc_hash::{FxHashMap, FxHashSet}; +use std::{ + cell::{Cell, Ref, RefCell, RefMut}, + fmt::Debug, + io::Write, + ops::AddAssign, + rc::Rc, +}; +use vir_crate::{ + common::{check_mode::CheckMode, identifier::WithIdentifier}, + polymorphic::{self as vir}, }; -use super::high::types::{HighTypeEncoderState, HighTypeEncoderInterface}; -use super::counterexamples::{MirProcedureMappingInterface, MirProcedureMapping}; -use super::counterexamples::DiscriminantsState; -use super::high::to_typed::types::HighToTypedTypeEncoderState; pub struct Encoder<'v, 'tcx: 'v> { env: &'v Environment<'tcx>, @@ -104,6 +104,7 @@ pub struct Encoder<'v, 'tcx: 'v> { /// this requires special care when encoding array/slice accesses which may come with /// bound checks included in the MIR. pub(super) is_encoding_trigger: Cell, + pub expiration_locations: RefCell>>, } pub enum EncodingTask<'tcx> { @@ -118,36 +119,31 @@ pub enum EncodingTask<'tcx> { // If the field name is an identifier, removing the leading prefix r# pub fn encode_field_name(field_name: &str) -> String { - format!("f${}", field_name.trim_start_matches("r#")) + format!("f${}", field_name.trim_start_matches("r#")) } impl<'v, 'tcx> Encoder<'v, 'tcx> { - pub fn new( - env: &'v Environment<'tcx>, - def_spec: typed::DefSpecificationMap, - ) -> Self { + pub fn new(env: &'v Environment<'tcx>, def_spec: typed::DefSpecificationMap) -> Self { let source_path = env.name.source_path(); let source_filename = source_path.file_name().unwrap().to_str().unwrap(); - let vir_program_before_foldunfold_writer = config::dump_debug_info().then_some(()).map(|_| - RefCell::new( - log::build_writer( - "vir_program_before_foldunfold", - format!("{source_filename}.vir"), + let vir_program_before_foldunfold_writer = + config::dump_debug_info().then_some(()).map(|_| { + RefCell::new( + log::build_writer( + "vir_program_before_foldunfold", + format!("{source_filename}.vir"), + ) + .ok() + .unwrap(), ) - .ok() - .unwrap(), - ) - ); - let vir_program_before_viper_writer = config::dump_debug_info().then_some(()).map(|_| + }); + let vir_program_before_viper_writer = config::dump_debug_info().then_some(()).map(|_| { RefCell::new( - log::build_writer( - "vir_program_before_viper", - format!("{source_filename}.vir"), - ) + log::build_writer("vir_program_before_viper", format!("{source_filename}.vir")) .ok() .unwrap(), ) - ); + }); Encoder { env, @@ -182,6 +178,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { specifications_state: SpecificationsState::new(def_spec), mir_procedure_mapping: Default::default(), discriminants_state: Default::default(), + expiration_locations: Default::default(), } } @@ -232,9 +229,18 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { self.error_manager.borrow_mut() } - pub fn finalize_viper_program(&self, name: String, proc_def_id: DefId) -> SpannedEncodingResult { + pub fn finalize_viper_program( + &self, + name: String, + proc_def_id: DefId, + ) -> SpannedEncodingResult { let error_span = self.env.query.get_def_span(proc_def_id); - super::definition_collector::collect_definitions(error_span, self, name, self.get_used_viper_methods()) + super::definition_collector::collect_definitions( + error_span, + self, + name, + self.get_used_viper_methods(), + ) } pub fn get_viper_programs(&mut self) -> Vec { @@ -242,14 +248,19 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } pub fn get_core_proof_programs(&mut self) -> Vec { - if config::counterexample() && config::unsafe_core_proof(){ - self.take_core_proof_programs().into_iter().map( - | program | { + if config::counterexample() && config::unsafe_core_proof() { + self.take_core_proof_programs() + .into_iter() + .map(|program| { self.add_mapping(&program); prusti_common::vir::program::Program::Low(program) - }).collect() + }) + .collect() } else { - self.take_core_proof_programs().into_iter().map(prusti_common::vir::program::Program::Low).collect() + self.take_core_proof_programs() + .into_iter() + .map(prusti_common::vir::program::Program::Low) + .collect() } } @@ -276,11 +287,20 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { pub(super) fn insert_function(&self, function: vir::Function) -> vir::FunctionIdentifier { let identifier: vir::FunctionIdentifier = function.get_identifier().into(); - assert!(self.functions.borrow_mut().insert(identifier.clone(), Rc::new(function)).is_none(), "{identifier:?} is not unique"); + assert!( + self.functions + .borrow_mut() + .insert(identifier.clone(), Rc::new(function)) + .is_none(), + "{identifier:?} is not unique" + ); identifier } - pub(super) fn get_function(&self, identifier: &vir::FunctionIdentifier) -> SpannedEncodingResult> { + pub(super) fn get_function( + &self, + identifier: &vir::FunctionIdentifier, + ) -> SpannedEncodingResult> { self.ensure_pure_function_encoded(identifier)?; if self.functions.borrow().contains_key(identifier) { let map = self.functions.borrow(); @@ -293,13 +313,17 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } pub(super) fn get_builtin_methods( - &self + &self, ) -> Ref<'_, FxHashMap> { self.builtin_methods.borrow() } fn get_used_viper_methods(&self) -> Vec { - self.procedures.borrow_mut().drain().map(|(_, value)| value).collect() + self.procedures + .borrow_mut() + .drain() + .map(|(_, value)| value) + .collect() } /// Invoke const evaluation to extract scalar value. @@ -321,25 +345,29 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { ) -> EncodingResult { let opt_scalar_value = match value { mir::ConstantKind::Ty(value) => match value.kind() { - ty::ConstKind::Value(ref const_value) => { - const_value.try_to_scalar() - } + ty::ConstKind::Value(ref const_value) => const_value.try_to_scalar(), ty::ConstKind::Unevaluated(ct) => { let mir_ct = mir::UnevaluatedConst::new(ct.def, ct.substs); self.uneval_eval_intlike(mir_ct) - }, + } _ => error_unsupported!("unsupported const kind: {:?}", value), - } + }, mir::ConstantKind::Val(val, _) => val.try_to_scalar(), mir::ConstantKind::Unevaluated(ct, _) => self.uneval_eval_intlike(ct), }; - opt_scalar_value.ok_or_else(|| EncodingError::unsupported(format!("unsupported constant value: {value:?}"))) + opt_scalar_value.ok_or_else(|| { + EncodingError::unsupported(format!("unsupported constant value: {value:?}")) + }) } /// Encodes a value in a field if the base expression is a reference or /// a primitive types. /// For composed data structures, the base expression is returned. - pub fn encode_value_expr(&self, base: vir::Expr, ty: ty::Ty<'tcx>) -> EncodingResult { + pub fn encode_value_expr( + &self, + base: vir::Expr, + ty: ty::Ty<'tcx>, + ) -> EncodingResult { match ty.kind() { ty::TyKind::Adt(_, _) | ty::TyKind::Closure(_, _) @@ -356,15 +384,15 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } } - pub fn encode_dereference_field(&self, ty: ty::Ty<'tcx>) - -> EncodingResult - { + pub fn encode_dereference_field(&self, ty: ty::Ty<'tcx>) -> EncodingResult { self.encode_raw_ref_field("val_ref".to_string(), ty) } - pub fn encode_struct_field(&self, field_name: &str, ty: ty::Ty<'tcx>) - -> EncodingResult - { + pub fn encode_struct_field( + &self, + field_name: &str, + ty: ty::Ty<'tcx>, + ) -> EncodingResult { self.encode_raw_ref_field(encode_field_name(field_name), ty) } @@ -376,16 +404,16 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { let typ = place.get_type().clone(); let mut name = typ.name(); name.push_str("$$discriminant$$"); - let self_local_var = vir_local!{ self: {typ.clone()} }; + let self_local_var = vir_local! { self: {typ.clone()} }; if !self.type_discriminant_funcs.borrow().contains_key(&name) { let precondition = vir::Expr::predicate_access_predicate( typ, self_local_var.clone().into(), - vir::PermAmount::Read + vir::PermAmount::Read, ); - let result = vir_local!{ __result: Int }; - let postcondition = compute_discriminant_bounds( - adt_def, self.env.tcx(), &result.clone().into()); + let result = vir_local! { __result: Int }; + let postcondition = + compute_discriminant_bounds(adt_def, self.env.tcx(), &result.clone().into()); let discr_field = self.encode_discriminant_field(); let self_local_var_expr: vir::Expr = self_local_var.clone().into(); @@ -400,7 +428,8 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { self.encode_discriminant_postcondition( self_local_var_expr.clone(), vir::Expr::local(result), - ).unwrap(), // TODO: no unwrap + ) + .unwrap(), // TODO: no unwrap ], body: Some(self_local_var_expr.field(discr_field)), }; @@ -412,9 +441,11 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { self.get_used_viper_predicates_map()?, ); let identifier = self.insert_function(final_function.unwrap()); - self.type_discriminant_funcs.borrow_mut().insert(name.clone(), identifier); + self.type_discriminant_funcs + .borrow_mut() + .insert(name.clone(), identifier); } - Ok(vir::Expr::FuncApp( vir::FuncApp { + Ok(vir::Expr::FuncApp(vir::FuncApp { function_name: name, type_arguments: Vec::new(), arguments: vec![place], @@ -425,7 +456,10 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_builtin_domain(&self, domain_kind: BuiltinDomainKind) -> EncodingResult { + pub fn encode_builtin_domain( + &self, + domain_kind: BuiltinDomainKind, + ) -> EncodingResult { if !self.builtin_domains.borrow().contains_key(&domain_kind) { let builtin_encoder = BuiltinEncoder::new(self); let domain = builtin_encoder.encode_builtin_domain(domain_kind)?; @@ -437,7 +471,10 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_builtin_domain_type(&self, domain_kind: BuiltinDomainKind) -> EncodingResult { + pub fn encode_builtin_domain_type( + &self, + domain_kind: BuiltinDomainKind, + ) -> EncodingResult { // Also encode the definition, if it's not already under construction. let mut domains_in_progress = self.builtin_domains_in_progress.borrow_mut(); if !domains_in_progress.contains(&domain_kind) { @@ -452,7 +489,10 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_builtin_method_def(&self, method_kind: BuiltinMethodKind) -> EncodingResult { + pub fn encode_builtin_method_def( + &self, + method_kind: BuiltinMethodKind, + ) -> EncodingResult { if !self.builtin_methods.borrow().contains_key(&method_kind) { let builtin_encoder = BuiltinEncoder::new(self); let method = builtin_encoder.encode_builtin_method_def(method_kind)?; @@ -465,7 +505,10 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_builtin_method_use(&self, method_kind: BuiltinMethodKind) -> EncodingResult { + pub fn encode_builtin_method_use( + &self, + method_kind: BuiltinMethodKind, + ) -> EncodingResult { // Trigger encoding of definition self.encode_builtin_method_def(method_kind)?; let builtin_encoder = BuiltinEncoder::new(self); @@ -473,13 +516,19 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_cast_function_use(&self, src_ty: ty::Ty<'tcx>, dst_ty: ty::Ty<'tcx>) - -> EncodingResult - { + pub fn encode_cast_function_use( + &self, + src_ty: ty::Ty<'tcx>, + dst_ty: ty::Ty<'tcx>, + ) -> EncodingResult { let function_name = format!("builtin$cast${src_ty}${dst_ty}"); - if !self.type_cast_functions.borrow().contains_key(&(src_ty, dst_ty)) { - let arg = vir_local!{ number: {self.encode_snapshot_type(src_ty)?} }; - let result = vir_local!{ __result: {self.encode_snapshot_type(dst_ty)?} }; + if !self + .type_cast_functions + .borrow() + .contains_key(&(src_ty, dst_ty)) + { + let arg = vir_local! { number: {self.encode_snapshot_type(src_ty)?} }; + let result = vir_local! { __result: {self.encode_snapshot_type(dst_ty)?} }; let mut precondition = self.encode_type_bounds(&arg.clone().into(), src_ty); precondition.extend(self.encode_type_bounds(&arg.clone().into(), dst_ty)); let postcondition = self.encode_type_bounds(&result.into(), dst_ty); @@ -493,18 +542,28 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { body: Some(arg.into()), }; let identifier = self.insert_function(function); - self.type_cast_functions.borrow_mut().insert((src_ty, dst_ty), identifier); + self.type_cast_functions + .borrow_mut() + .insert((src_ty, dst_ty), identifier); } Ok(function_name) } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_unsize_function_use(&self, src_ty: ty::Ty<'tcx>, dst_ty: ty::Ty<'tcx>) - -> EncodingResult - { + pub fn encode_unsize_function_use( + &self, + src_ty: ty::Ty<'tcx>, + dst_ty: ty::Ty<'tcx>, + ) -> EncodingResult { // at some point we may want to add support for other types of unsizing calls? - assert!(matches!(src_ty.kind(), ty::TyKind::Array(..) | ty::TyKind::Slice(..))); - assert!(matches!(dst_ty.kind(), ty::TyKind::Array(..) | ty::TyKind::Slice(..))); + assert!(matches!( + src_ty.kind(), + ty::TyKind::Array(..) | ty::TyKind::Slice(..) + )); + assert!(matches!( + dst_ty.kind(), + ty::TyKind::Array(..) | ty::TyKind::Slice(..) + )); let array_types = self.encode_sequence_types(src_ty)?; let slice_types = self.encode_sequence_types(dst_ty)?; @@ -514,10 +573,14 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { &slice_types.sequence_pred_type.name() ); - if !self.type_cast_functions.borrow().contains_key(&(src_ty, dst_ty)) { + if !self + .type_cast_functions + .borrow() + .contains_key(&(src_ty, dst_ty)) + { let src_snap_ty = self.encode_snapshot_type(src_ty)?; let dst_snap_ty = self.encode_snapshot_type(dst_ty)?; - let arg = vir_local!{ array: {src_snap_ty} }; + let arg = vir_local! { array: {src_snap_ty} }; let arg_expr = vir::Expr::from(arg.clone()); let array_uncons = self.encode_snapshot_destructor(src_ty, vec![arg_expr.clone()])?; let slice_cons = self.encode_snapshot(dst_ty, None, vec![array_uncons.clone()])?; @@ -527,10 +590,10 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { right: box true.into(), // unused position: vir::Position::default(), }); - let result = vir::Expr::from(vir_local!{ __result: {dst_snap_ty.clone()} }); + let result = vir::Expr::from(vir_local! { __result: {dst_snap_ty.clone()} }); let postcondition = vec![ - vir_expr!{ [data_len] == [array_types.len(self, arg_expr)] }, - vir_expr!{ [result] == [slice_cons]}, + vir_expr! { [data_len] == [array_types.len(self, arg_expr)] }, + vir_expr! { [result] == [slice_cons]}, ]; let function = vir::Function { name: function_name.clone(), @@ -542,7 +605,9 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { body: None, }; let identifier = self.insert_function(function); - self.type_cast_functions.borrow_mut().insert((src_ty, dst_ty), identifier); + self.type_cast_functions + .borrow_mut() + .insert((src_ty, dst_ty), identifier); } Ok(function_name) } @@ -559,14 +624,18 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { let procedure = self.env.get_procedure(def_id); let proc_encoder = ProcedureEncoder::new(self, &procedure)?; let mut method = match proc_encoder.encode() { - Ok(result) => result, + Ok((result, loan_expirations)) => { + self.expiration_locations.borrow_mut().insert(def_id, loan_expirations); + result + }, Err(error) => { self.register_encoding_error(error); StubProcedureEncoder::new(self, &procedure).encode() - }, + } }; self.log_vir_program_before_viper(method.to_string()); + if config::enable_purification_optimization() { purifier::purify_method(self, &mut method); } @@ -593,8 +662,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { | ty::TyKind::Array(..) | ty::TyKind::Slice(..) | ty::TyKind::Param(_) => true, // TODO(tymap): this is weird, use substs properly? - ty::TyKind::Adt(_, _) - | ty::TyKind::Closure(_, _) => { + ty::TyKind::Adt(_, _) | ty::TyKind::Closure(_, _) => { self.env.tcx().has_structural_eq_impls(ty) } _ => false, @@ -605,7 +673,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { pub fn encode_const_expr( &self, ty: ty::Ty<'tcx>, - value: mir::ConstantKind<'tcx> + value: mir::ConstantKind<'tcx>, ) -> EncodingResult { let scalar_value = self.const_eval_intlike(value)?; @@ -617,20 +685,26 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { ty::TyKind::Int(ty::IntTy::I32) => scalar_value.to_i32().unwrap().into(), ty::TyKind::Int(ty::IntTy::I64) => scalar_value.to_i64().unwrap().into(), ty::TyKind::Int(ty::IntTy::I128) => scalar_value.to_i128().unwrap().into(), - ty::TyKind::Int(ty::IntTy::Isize) => scalar_value.to_target_isize(&self.env.tcx()).unwrap().into(), + ty::TyKind::Int(ty::IntTy::Isize) => scalar_value + .to_target_isize(&self.env.tcx()) + .unwrap() + .into(), ty::TyKind::Uint(ty::UintTy::U8) => scalar_value.to_u8().unwrap().into(), ty::TyKind::Uint(ty::UintTy::U16) => scalar_value.to_u16().unwrap().into(), ty::TyKind::Uint(ty::UintTy::U32) => scalar_value.to_u32().unwrap().into(), ty::TyKind::Uint(ty::UintTy::U64) => scalar_value.to_u64().unwrap().into(), ty::TyKind::Uint(ty::UintTy::U128) => scalar_value.to_u128().unwrap().into(), - ty::TyKind::Uint(ty::UintTy::Usize) => scalar_value.to_target_usize(&self.env.tcx()).unwrap().into(), + ty::TyKind::Uint(ty::UintTy::Usize) => scalar_value + .to_target_usize(&self.env.tcx()) + .unwrap() + .into(), ty::TyKind::Float(ty::FloatTy::F32) => { let bits = scalar_value.to_u32().unwrap(); vir::Expr::Const(vir::ConstExpr { value: vir::Const::Float(vir::FloatConst::F32(bits)), position: vir::Position::default(), }) - }, + } ty::TyKind::Float(ty::FloatTy::F64) => { let bits = scalar_value.to_u64().unwrap(); vir::Expr::Const(vir::ConstExpr { @@ -638,12 +712,10 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { position: vir::Position::default(), }) } - ty::TyKind::FnDef(..) => { - vir::Expr::Const(vir::ConstExpr { - value: vir::Const::FnPtr, - position: vir::Position::default(), - }) - } + ty::TyKind::FnDef(..) => vir::Expr::Const(vir::ConstExpr { + value: vir::Const::FnPtr, + position: vir::Position::default(), + }), _ => { error_unsupported!("unsupported constant type {:?}", ty.kind()); } @@ -674,17 +746,24 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } pub fn encode_item_name(&self, def_id: DefId) -> String { - let full_name = format!("m_{}", encode_identifier(self.env.name.get_unique_item_name(def_id))); - let short_name = format!("m_{}", encode_identifier( - self.env.name.get_item_name(def_id) - )); + let full_name = format!( + "m_{}", + encode_identifier(self.env.name.get_unique_item_name(def_id)) + ); + let short_name = format!( + "m_{}", + encode_identifier(self.env.name.get_item_name(def_id)) + ); self.intern_viper_identifier(full_name, short_name) } pub fn queue_procedure_encoding(&self, def_id: ProcedureDefId) { self.encoding_queue .borrow_mut() - .push(EncodingTask::Procedure { def_id, substs: Vec::new() }); + .push(EncodingTask::Procedure { + def_id, + substs: Vec::new(), + }); } pub fn queue_type_encoding(&self, ty: ty::Ty<'tcx>) { @@ -707,7 +786,10 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { queue.pop() } { match task { - EncodingTask::Procedure { def_id: proc_def_id, substs } => { + EncodingTask::Procedure { + def_id: proc_def_id, + substs, + } => { let proc_name = self.env.name.get_unique_item_name(proc_def_id); let proc_def_path = self.env.name.get_item_def_path(proc_def_id); info!("Encoding: {} ({})", proc_name, proc_def_path); @@ -715,26 +797,44 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { if config::unsafe_core_proof() { if self.env.query.is_unsafe_function(proc_def_id) { - if let Err(error) = self.encode_lifetimes_core_proof(proc_def_id, CheckMode::Both) { + if let Err(error) = + self.encode_lifetimes_core_proof(proc_def_id, CheckMode::Both) + { self.register_encoding_error(error); - debug!("Error encoding function: {:?} {}", proc_def_id, CheckMode::Both); + debug!( + "Error encoding function: {:?} {}", + proc_def_id, + CheckMode::Both + ); } } else { if config::verify_core_proof() { - if let Err(error) = self.encode_lifetimes_core_proof(proc_def_id, CheckMode::CoreProof) { + if let Err(error) = self + .encode_lifetimes_core_proof(proc_def_id, CheckMode::CoreProof) + { self.register_encoding_error(error); - debug!("Error encoding function: {:?} {}", proc_def_id, CheckMode::CoreProof); + debug!( + "Error encoding function: {:?} {}", + proc_def_id, + CheckMode::CoreProof + ); } } if config::verify_specifications() { - let check_mode = if config::verify_specifications_with_core_proof() { + let check_mode = if config::verify_specifications_with_core_proof() + { CheckMode::Both } else { CheckMode::Specifications }; - if let Err(error) = self.encode_lifetimes_core_proof(proc_def_id, check_mode) { + if let Err(error) = + self.encode_lifetimes_core_proof(proc_def_id, check_mode) + { self.register_encoding_error(error); - debug!("Error encoding function: {:?} {}", proc_def_id, check_mode); + debug!( + "Error encoding function: {:?} {}", + proc_def_id, check_mode + ); } } } @@ -751,7 +851,9 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { // TODO: Make sure that this encoded function does not end up in // the Viper file because that would be unsound. let identity_substs = self.env.query.identity_substs(proc_def_id); - if let Err(error) = self.encode_pure_function_def(proc_def_id, proc_def_id, identity_substs) { + if let Err(error) = + self.encode_pure_function_def(proc_def_id, proc_def_id, identity_substs) + { self.register_encoding_error(error); debug!("Error encoding function: {:?}", proc_def_id); // Skip encoding the function as a method. @@ -761,19 +863,19 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { match proc_kind { _ if self.is_trusted(proc_def_id, None) => { + // let _ = self.encode_procedure(proc_def_id); debug!( "Trusted procedure will not be encoded or verified: {:?}", proc_def_id ); - }, + } ProcedureSpecificationKind::Predicate(_) => { debug!( "Predicates will not be encoded or verified: {:?}", proc_def_id ); - }, - ProcedureSpecificationKind::Pure | - ProcedureSpecificationKind::Impure => { + } + ProcedureSpecificationKind::Pure | ProcedureSpecificationKind::Impure => { if let Err(error) = self.encode_procedure(proc_def_id) { self.register_encoding_error(error); debug!("Error encoding function: {:?}", proc_def_id); @@ -788,11 +890,15 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } } } - } EncodingTask::Type { ty } => { - if config::unsafe_core_proof() && config::verify_core_proof() && config::verify_types() { - if let Err(error) = self.encode_core_proof_for_type(ty, CheckMode::CoreProof) { + if config::unsafe_core_proof() + && config::verify_core_proof() + && config::verify_types() + { + if let Err(error) = + self.encode_core_proof_for_type(ty, CheckMode::CoreProof) + { self.register_encoding_error(error); debug!("Error encoding type: {:?} {}", ty, CheckMode::CoreProof); } @@ -802,11 +908,17 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } } - pub fn intern_viper_identifier + Debug>(&self, full_name: S, short_name: S) -> String { + pub fn intern_viper_identifier + Debug>( + &self, + full_name: S, + short_name: S, + ) -> String { let result = if config::disable_name_mangling() { short_name.as_ref().to_string() } else if config::intern_names() { - self.name_interner.borrow_mut().intern(full_name, &[short_name]) + self.name_interner + .borrow_mut() + .intern(full_name, &[short_name]) } else { full_name.as_ref().to_string() }; diff --git a/prusti-viper/src/encoder/procedure_encoder.rs b/prusti-viper/src/encoder/procedure_encoder.rs index 6d823998555..054f0a419ee 100644 --- a/prusti-viper/src/encoder/procedure_encoder.rs +++ b/prusti-viper/src/encoder/procedure_encoder.rs @@ -133,6 +133,8 @@ pub struct ProcedureEncoder<'p, 'v: 'p, 'tcx: 'v> { /// Type substitutions inside this procedure. Most likely identity for the /// given proc_def_id. substs: SubstsRef<'tcx>, + place_to_loan: FxHashMap>, + loan_expiration_location: FxHashMap, } impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { @@ -192,6 +194,8 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { old_ghost_vars: FxHashMap::default(), cached_loop_invariant_block: FxHashMap::default(), substs, + loan_expiration_location: FxHashMap::default(), + place_to_loan: FxHashMap::default(), }) } @@ -399,7 +403,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { } #[tracing::instrument(level = "debug", skip(self), fields(name = self.cfg_method.name()))] - pub fn encode(mut self) -> SpannedEncodingResult { + pub fn encode(mut self) -> SpannedEncodingResult<(vir::CfgMethod, FxHashMap)> { let mir_span = self.mir.span; // Retrieve the contract @@ -559,6 +563,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { self.mir.span, ErrorCtxt::Unexpected ); + let loan_expirations = self.collect_loan_expirations(); let method_with_fold_unfold = foldunfold::add_fold_unfold( self.encoder, self.cfg_method, @@ -592,8 +597,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { |writer| method_with_fold_unfold.to_graphviz(writer), ); } - - Ok(method_with_fold_unfold) + Ok((method_with_fold_unfold, loan_expirations)) } /// Encodes a topologically ordered group of blocks. @@ -2141,6 +2145,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { (post_label, lhs, rhs) }) .unwrap(); + println!("Found magic wand with label: {}", post_label); // Obtain the LHS permission. for (path, _) in &borrow_info.blocking_paths { @@ -2221,6 +2226,9 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { is_in_package_stmt: bool, ) -> SpannedEncodingResult> { let mut stmts: Vec = vec![]; + for loan in &loans { + self.loan_expiration_location.insert(loan.clone(), location); + } if !loans.is_empty() { let vir_reborrowing_dag = self.construct_vir_reborrowing_dag(&loans, zombie_loans, location, end_location, is_in_package_stmt)?; @@ -3507,6 +3515,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { loan, false, substs, + Some(destination), )?; // We inhale the magic wand just before applying it because we need // a magic wand that depends on the current value of ghost variables. @@ -3555,6 +3564,8 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { self.procedure_contracts .insert(location, (procedure_contract, fake_exprs)); + println!("Encoding impure function result: {:?}", stmts); + Ok(stmts) } @@ -4363,6 +4374,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { loan: Option, function_end: bool, substs: SubstsRef<'tcx>, + destination: Option>, ) -> SpannedEncodingResult<( vir::Expr, // Returned permissions from types. Option, // Permission of the return value. @@ -4440,6 +4452,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { substs, ).with_span(span)? { if let Some((location, fake_exprs)) = magic_wand_store_info { + println!("found location {:?} for expression: {:?}", location, fake_exprs); let replace_fake_exprs = |mut expr: vir::Expr| -> vir::Expr { for (fake_arg, arg_expr) in fake_exprs.iter() { expr = expr.replace_place(fake_arg, arg_expr); @@ -4457,6 +4470,10 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { .insert(location, (post_label.to_string(), lhs.clone(), rhs.clone())); } magic_wands.push(vir::Expr::magic_wand(lhs, rhs, loan.map(|l| l.index().into()))); + // keep track of magic wands for runtime checks + if let Some(dest) = destination { + self.place_to_loan.insert(dest.local, loan); + } } // Encode permissions for return type @@ -4743,6 +4760,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { None, true, self.substs, + None, )?; let type_inv_pos = self.register_error( @@ -6969,6 +6987,19 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { }) } + pub fn collect_loan_expirations(&self) -> FxHashMap { + let mut res = FxHashMap::default(); + for (place, loan_opt) in &self.place_to_loan { + if let Some(loan) = loan_opt { + if let Some(expiration_location) = self.loan_expiration_location.get(loan) { + println!("place: {:?} expires at location {:?}", place, expiration_location); + res.insert(place.clone(), *expiration_location); + } + } + } + res + } + fn register_error + Debug>(&self, span: T, error_ctxt: ErrorCtxt) -> vir::Position { self.mir_encoder.register_error(span, error_ctxt) } diff --git a/prusti-viper/src/verifier.rs b/prusti-viper/src/verifier.rs index 019abb0ed40..ae72ac1b163 100644 --- a/prusti-viper/src/verifier.rs +++ b/prusti-viper/src/verifier.rs @@ -17,18 +17,22 @@ use prusti_common::{ Stopwatch, }; use prusti_interface::{ - data::{VerificationResult, VerificationTask}, + data::{VerificationResult, VerificationTask, ProcedureDefId}, environment::Environment, specs::typed, PrustiError, }; -use prusti_rustc_interface::span::DUMMY_SP; +use prusti_rustc_interface::{ + span::DUMMY_SP, + middle::mir, +}; use prusti_server::{ process_verification_request, spawn_server_thread, tokio::runtime::Builder, PrustiClient, VerificationRequest, ViperBackendConfig, }; use viper::{self, PersistentCache, Viper}; use vir_crate::common::check_mode::CheckMode; +use rustc_hash::FxHashMap; /// A verifier is an object for verifying a single crate, potentially /// many times. @@ -207,6 +211,10 @@ impl<'v, 'tcx> Verifier<'v, 'tcx> { result } + + pub fn get_expiration_locations(&self) -> FxHashMap> { + self.encoder.expiration_locations.borrow().clone() + } } /// Verify a list of programs. @@ -282,4 +290,5 @@ fn verify_programs( }) .collect() } + } diff --git a/prusti/Cargo.toml b/prusti/Cargo.toml index 81900537208..3b5aad18817 100644 --- a/prusti/Cargo.toml +++ b/prusti/Cargo.toml @@ -21,6 +21,7 @@ lazy_static = "1.4.0" tracing = { path = "../tracing" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } tracing-chrome = "0.7" +rustc-hash = "1.1.0" [build-dependencies] chrono = { version = "0.4.22", default-features = false, features = ["clock"] } diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index 31700f07b2f..6d1706d29ab 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -20,6 +20,7 @@ use prusti_rustc_interface::{ }, }; use prusti_viper::encoder::Encoder; +use rustc_hash::FxHashMap; // debugging dependencies? use std::{env, fs, io}; @@ -32,6 +33,9 @@ fn folder_present(name: &str) -> io::Result { } pub static mut SPECS: Option = None; +pub static mut EXPIRATION_LOCATIONS: Option< + FxHashMap>, +> = None; pub(crate) fn mir_checked( tcx: TyCtxt<'_>, @@ -46,20 +50,21 @@ pub(crate) fn mir_checked( let specs_opt = unsafe { SPECS.clone() }; if let Some(specs) = specs_opt { + let expiration_locations = unsafe { EXPIRATION_LOCATIONS.clone().unwrap() }; // let def_id = def.def_id_for_type_of(); // let env = Environment::new(tcx, env!("CARGO_PKG_VERSION")); // let encoder = Encoder::new(&env, specs.clone()); // let procedure = Procedure::new(&env, def_id); let steal = (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def); let mut stolen = steal.steal(); + let def_id = stolen.source.def_id(); + println!("Processing function {:?}", def_id); - let mut visitor = InsertChecksVisitor::new(tcx, specs); + let mut visitor = InsertChecksVisitor::new(tcx, specs, expiration_locations); visitor.visit_body(&mut stolen); - println!("Custom modifications are done! Compiler back at work"); // print mir of body: if let Ok(true) = folder_present("dump") { - let def_id = stolen.source.def_id(); let mut dump_file = fs::File::create(format!("dump/dump_mir_adjusted_{:?}.txt", def_id)).unwrap(); pretty::write_mir_fn(tcx, &stolen, &mut |_, _| Ok(()), &mut dump_file).unwrap(); @@ -72,8 +77,14 @@ pub(crate) fn mir_checked( } } +#[derive(Debug, Clone)] +pub enum ModificationToProcess<'tcx> { + Pledge(PledgeToProcess<'tcx>), +} + #[derive(Debug, Clone)] pub struct PledgeToProcess<'tcx> { + insert_location: mir::Location, check: DefId, store_before_expiry: DefId, check_before_expiry: Option, @@ -87,17 +98,25 @@ pub struct PledgeToProcess<'tcx> { pub struct InsertChecksVisitor<'tcx> { tcx: TyCtxt<'tcx>, specs: DefSpecificationMap, + expiration_locations: FxHashMap>, current_patcher: Option>, - pledges_to_process: Vec>, + modifications_to_process: Vec<(mir::Location, ModificationToProcess<'tcx>)>, + current_def_id: Option, } impl<'tcx> InsertChecksVisitor<'tcx> { - pub fn new(tcx: TyCtxt<'tcx>, specs: DefSpecificationMap) -> Self { + pub fn new( + tcx: TyCtxt<'tcx>, + specs: DefSpecificationMap, + expiration_locations: FxHashMap>, + ) -> Self { Self { tcx, specs, current_patcher: None, - pledges_to_process: Vec::new(), + modifications_to_process: Vec::new(), + expiration_locations, + current_def_id: None, } } } @@ -109,24 +128,35 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { fn visit_body(&mut self, body: &mut Body<'tcx>) { // visit body, apply patches, possibly find pledges that need to be processed here: + let def_id = body.source.def_id(); + self.current_def_id = Some(def_id); self.current_patcher = Some(MirPatch::new(body)); self.super_body(body); let mir_patch = self.current_patcher.take(); mir_patch.unwrap().apply(body); - for pledge_to_process in &self.pledges_to_process { - println!( - "found a pledge {:#?}, currently not processing it", - pledge_to_process - ); - let location = mir::Location { - block: BasicBlock::from_usize(1), - statement_index: 1, - }; - insert_pledge_call_chain(self.tcx, pledge_to_process.clone(), location, body).unwrap(); + // sort descending + self.modifications_to_process.sort_by(|a, b| { + a.0.partial_cmp(&b.0).unwrap().reverse() + }); + + for (location, modification) in &self.modifications_to_process { + match modification { + ModificationToProcess::Pledge(pledge_to_process) => { + println!( + "found a pledge {:#?}, currently not processing it", + pledge_to_process + ); + // let location = mir::Location { + // block: BasicBlock::from_usize(1), + // statement_index: 1, + // }; + insert_pledge_call_chain(self.tcx, pledge_to_process.clone(), *location, body) + .unwrap(); + } + } } - let def_id = body.source.def_id(); // try to find specification function: let substs = ty::subst::InternalSubsts::identity_for_item(self.tcx, def_id); let args = args_from_body(body); @@ -272,10 +302,18 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { original_terminator.clone(), old_values_place, ); - + println!("Trying to find expiration location for function: {:?}", ty); + + let expiration_location = self + .expiration_locations + .get(&self.current_def_id.unwrap()) + .unwrap() + .get(&destination.local) + .unwrap(); // *destination is the loan! // figure out where it expires! let pledge_to_process = PledgeToProcess { + insert_location: *expiration_location, check, check_before_expiry, store_before_expiry, @@ -285,7 +323,10 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { args: args.clone(), substs, }; - self.pledges_to_process.push(pledge_to_process); + self.modifications_to_process.push(( + *expiration_location, + ModificationToProcess::Pledge(pledge_to_process), + )); // Insert the 3 functions (all but old_store) // where the reference goes out of scope diff --git a/prusti/src/verifier.rs b/prusti/src/verifier.rs index 74775f0d628..4271f65bf67 100644 --- a/prusti/src/verifier.rs +++ b/prusti/src/verifier.rs @@ -9,6 +9,8 @@ use prusti_interface::{ }; use prusti_viper::verifier::Verifier; +use crate::mir_modify; + #[tracing::instrument(name = "prusti::verify", level = "debug", skip(env))] pub fn verify(env: Environment<'_>, def_spec: typed::DefSpecificationMap) { if env.diagnostic.has_errors() { @@ -52,6 +54,9 @@ pub fn verify(env: Environment<'_>, def_spec: typed::DefSpecificationMap) { let mut verifier = Verifier::new(&env, def_spec); let verification_result = verifier.verify(&verification_task); + unsafe { + mir_modify::EXPIRATION_LOCATIONS = Some(verifier.get_expiration_locations()); + } debug!("Verifier returned {:?}", verification_result); verification_result From fafabe0e383f034df2942bd4793d26f06315e078 Mon Sep 17 00:00:00 2001 From: cedric Date: Tue, 20 Jun 2023 18:56:31 +0200 Subject: [PATCH 14/45] Fix a bug for runtime checks - when there was a pledge and a postcondition, the runtime check for the postcondition would be skipped - also created template to find difference between mir_promoted and elaborated --- prusti-viper/src/encoder/procedure_encoder.rs | 4 -- prusti/src/driver.rs | 1 + prusti/src/mir_diff_map.rs | 26 +++++++++ prusti/src/mir_modify.rs | 56 ++++++++----------- 4 files changed, 51 insertions(+), 36 deletions(-) create mode 100644 prusti/src/mir_diff_map.rs diff --git a/prusti-viper/src/encoder/procedure_encoder.rs b/prusti-viper/src/encoder/procedure_encoder.rs index 054f0a419ee..c73966763c6 100644 --- a/prusti-viper/src/encoder/procedure_encoder.rs +++ b/prusti-viper/src/encoder/procedure_encoder.rs @@ -2145,7 +2145,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { (post_label, lhs, rhs) }) .unwrap(); - println!("Found magic wand with label: {}", post_label); // Obtain the LHS permission. for (path, _) in &borrow_info.blocking_paths { @@ -3564,8 +3563,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { self.procedure_contracts .insert(location, (procedure_contract, fake_exprs)); - println!("Encoding impure function result: {:?}", stmts); - Ok(stmts) } @@ -4452,7 +4449,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { substs, ).with_span(span)? { if let Some((location, fake_exprs)) = magic_wand_store_info { - println!("found location {:?} for expression: {:?}", location, fake_exprs); let replace_fake_exprs = |mut expr: vir::Expr| -> vir::Expr { for (fake_arg, arg_expr) in fake_exprs.iter() { expr = expr.replace_place(fake_arg, arg_expr); diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index 7f9e9bd7813..139ebda54a7 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -17,6 +17,7 @@ mod verifier; // move these 2 at some point mod mir_modify; mod mir_helper; +mod mir_diff_map; use arg_value::arg_value; use callbacks::PrustiCompilerCalls; diff --git a/prusti/src/mir_diff_map.rs b/prusti/src/mir_diff_map.rs new file mode 100644 index 00000000000..77511aee000 --- /dev/null +++ b/prusti/src/mir_diff_map.rs @@ -0,0 +1,26 @@ +use prusti_rustc_interface::{ + middle::{ + mir::{self, patch::MirPatch, Body, TerminatorKind}, + ty::{self, TyCtxt}, + }, + span::{self, def_id::DefId}, +}; +use rustc_hash::FxHashMap; + +// for each location of calls in a mir_promoted body, map it to its new +// location in the mir_drops_elaborated body +// certain statements are added / removed during this phase, +fn location_map<'tcx>(mut mir_promoted: Body<'tcx>, mut mir_elaborated: Body<'tcx>) -> Result,()> { + // we assume statements are not moved accross blocks (which seems to be accurate) + let bblocks1 = mir_promoted.basic_blocks.as_mut(); + let bblocks2 = mir_elaborated.basic_blocks.as_mut(); + assert!(bblocks1.len() == bblocks2.len()); + for (block, blockdata1) in bblocks1.clone().into_iter_enumerated() { + let blockdata2 = bblocks2.get(block); + + } + Err(()) +} + + + diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index 6d1706d29ab..11e4f74ec28 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -51,16 +51,14 @@ pub(crate) fn mir_checked( if let Some(specs) = specs_opt { let expiration_locations = unsafe { EXPIRATION_LOCATIONS.clone().unwrap() }; - // let def_id = def.def_id_for_type_of(); - // let env = Environment::new(tcx, env!("CARGO_PKG_VERSION")); - // let encoder = Encoder::new(&env, specs.clone()); - // let procedure = Procedure::new(&env, def_id); + // get mir body before invoking drops_elaborated query, otherwise it will + // be stolen + let mir_promoted = tcx.mir_promoted(def).0.borrow().clone(); let steal = (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def); let mut stolen = steal.steal(); let def_id = stolen.source.def_id(); - println!("Processing function {:?}", def_id); - let mut visitor = InsertChecksVisitor::new(tcx, specs, expiration_locations); + let mut visitor = InsertChecksVisitor::new(tcx, specs, expiration_locations, mir_promoted); visitor.visit_body(&mut stolen); // print mir of body: @@ -109,6 +107,7 @@ impl<'tcx> InsertChecksVisitor<'tcx> { tcx: TyCtxt<'tcx>, specs: DefSpecificationMap, expiration_locations: FxHashMap>, + mir_promoted: Body<'tcx>, ) -> Self { Self { tcx, @@ -136,17 +135,12 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { mir_patch.unwrap().apply(body); // sort descending - self.modifications_to_process.sort_by(|a, b| { - a.0.partial_cmp(&b.0).unwrap().reverse() - }); + self.modifications_to_process + .sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap().reverse()); for (location, modification) in &self.modifications_to_process { match modification { ModificationToProcess::Pledge(pledge_to_process) => { - println!( - "found a pledge {:#?}, currently not processing it", - pledge_to_process - ); // let location = mir::Location { // block: BasicBlock::from_usize(1), // statement_index: 1, @@ -203,7 +197,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { // that calls this function is potentially moved several times, // this variable keeps track of that. let mut caller_block = block; - let original_terminator = data.terminator.clone().unwrap().clone(); + let mut call_fn_terminator = data.terminator.clone().unwrap().clone(); if let TerminatorKind::Call { func: @@ -217,7 +211,6 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { .. } = terminator_kind { - println!("Call terminator: {:?}", ty); // if it's a static function call, we start looking if there are // post-conditions we could check if let Some((call_id, substs)) = func.const_fn_def() { @@ -267,8 +260,10 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { args.clone(), substs, &called_body, - original_terminator.clone(), + call_fn_terminator.clone(), ); + replace_target(&mut call_fn_terminator, current_target.unwrap()); + // If there are multiple checks, this also should behave // correctly, since on the second iteration this target // is already the new block @@ -292,17 +287,20 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { let before_expiry_place = Place::from(patch.new_internal(before_expiry_ty, DUMMY_SP)); - prepend_store( + caller_block = prepend_store( self.tcx, &mut patch, old_store, caller_block, args.clone(), substs, - original_terminator.clone(), + call_fn_terminator.clone(), old_values_place, ); - println!("Trying to find expiration location for function: {:?}", ty); + println!( + "Trying to find expiration location for function: {:?}", + ty + ); let expiration_location = self .expiration_locations @@ -328,12 +326,6 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { ModificationToProcess::Pledge(pledge_to_process), )); - // Insert the 3 functions (all but old_store) - // where the reference goes out of scope - // this can probably not be done here! - // Goal: Given a location, split that block into - // two, insert before_expiry_store and before_expiry_check, - // and then the check function self.current_patcher = Some(patch); } _ => {} @@ -345,7 +337,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } } -/// Block current_caller is calling an annotated function. This function creates +/// caller_block is calling an annotated function. This function creates /// a new block (new_block), moves the call to the annotated function into /// the new block, adjusts the original block to call a store function and sets /// its target to this new block @@ -384,6 +376,8 @@ fn prepend_store<'tcx>( from_hir_call: false, fn_span: old_store_body.span, }; + // the block that initially calls the check function, now calls the store + // function patcher.patch_terminator(caller_block, store_terminator); new_block } @@ -499,14 +493,14 @@ fn surround_call_with_store_and_check<'tcx>( // we store the target, create a new block per check function // chain these with the final call having the original target, // change the target of the call to the first block of our chain. - let (block, _) = + let (check_block, _) = create_call_block(tcx, patch, check_id, new_args, substs, None, target).unwrap(); - let next_target = Some(block); + let next_target = Some(check_block); // the terminator that calls the original function, but in this case jumps to // a check function after instead of original target let mut call_fn_terminator = original_terminator; - replace_target(&mut call_fn_terminator, block); + replace_target(&mut call_fn_terminator, check_block); let new_caller_block = prepend_store( tcx, @@ -515,12 +509,10 @@ fn surround_call_with_store_and_check<'tcx>( caller_block, args, substs, - call_fn_terminator, + call_fn_terminator.clone(), old_dest_place, ); - // let generics = self.tcx.generics_of(def_id); - // If there are multiple checks, this also should behave // correctly, since on the second iteration this target // is already the new block From 96807d69e288aea6e81f3da6bc6cb8487ade02e6 Mon Sep 17 00:00:00 2001 From: cedric Date: Sat, 24 Jun 2023 17:44:25 +0200 Subject: [PATCH 15/45] Runtime checks for prusti_assert and prusti_assume --- Cargo.lock | 1 + .../prusti-contracts-proc-macros/src/lib.rs | 12 + prusti-contracts/prusti-contracts/src/lib.rs | 2 + prusti-contracts/prusti-specs/src/lib.rs | 60 ++- prusti-contracts/prusti-specs/src/rewriter.rs | 77 ++- .../boundary_extraction.rs | 0 .../src/runtime_checks/check_type.rs | 34 ++ .../prusti-specs/src/runtime_checks/mod.rs | 3 + .../translation.rs} | 158 ++++--- prusti-interface/src/environment/mod.rs | 5 +- prusti-interface/src/environment/procedure.rs | 21 +- prusti-interface/src/specs/mod.rs | 9 +- prusti-interface/src/utils.rs | 6 + prusti-viper/src/encoder/encoder.rs | 5 +- .../mir/pure/interpreter/interpreter_poly.rs | 1 + prusti-viper/src/encoder/procedure_encoder.rs | 5 +- prusti/Cargo.toml | 1 + prusti/src/driver.rs | 2 +- prusti/src/mir_diff_map.rs | 26 - prusti/src/mir_helper.rs | 173 +++++-- prusti/src/mir_info_collector.rs | 259 ++++++++++ prusti/src/mir_modify.rs | 446 +++++++++++++----- prusti/src/verifier.rs | 1 + 23 files changed, 1005 insertions(+), 302 deletions(-) rename prusti-contracts/prusti-specs/src/{ => runtime_checks}/boundary_extraction.rs (100%) create mode 100644 prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs create mode 100644 prusti-contracts/prusti-specs/src/runtime_checks/mod.rs rename prusti-contracts/prusti-specs/src/{runtime_checks.rs => runtime_checks/translation.rs} (84%) delete mode 100644 prusti/src/mir_diff_map.rs create mode 100644 prusti/src/mir_info_collector.rs diff --git a/Cargo.lock b/Cargo.lock index f11abe9a508..74be8bd940b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2104,6 +2104,7 @@ name = "prusti" version = "0.2.2" dependencies = [ "chrono", + "either", "env_logger", "lazy_static", "log", diff --git a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs index 7161cad9daa..357bd449793 100644 --- a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs +++ b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs @@ -136,6 +136,12 @@ pub fn quantifier_runtime_bounds(_attr: TokenStream, tokens: TokenStream) -> Tok tokens } +#[cfg(not(feature = "prusti"))] +#[proc_macro] +pub fn prusti_pledge_expires(_attr: TokenStream, tokens: TokenStream) -> TokenStream { + tokens +} + // ---------------------- // --- PRUSTI ENABLED --- @@ -285,5 +291,11 @@ pub fn quantifier_runtime_bounds(_attr: TokenStream, tokens: TokenStream) -> Tok tokens } +#[cfg(feature = "prusti")] +#[proc_macro] +pub fn prusti_pledge_expires(tokens: TokenStream) -> TokenStream { + prusti_specs::pledge_expires(tokens.into()).into() +} + // Ensure that you've also crated a transparent `#[cfg(not(feature = "prusti"))]` // version of your new macro above! diff --git a/prusti-contracts/prusti-contracts/src/lib.rs b/prusti-contracts/prusti-contracts/src/lib.rs index b6106fb6aca..f1e7f588f91 100644 --- a/prusti-contracts/prusti-contracts/src/lib.rs +++ b/prusti-contracts/prusti-contracts/src/lib.rs @@ -66,6 +66,8 @@ pub use prusti_contracts_proc_macros::terminates; /// A macro to annotate body variant of a loop to prove termination pub use prusti_contracts_proc_macros::body_variant; +pub use prusti_contracts_proc_macros::prusti_pledge_expires; + #[cfg(not(feature = "prusti"))] mod private { use core::marker::PhantomData; diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index 80f0e8b1c08..eb8d72a0fe4 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -24,7 +24,6 @@ mod type_model; mod user_provided_type_params; mod print_counterexample; mod runtime_checks; -mod boundary_extraction; use proc_macro2::{Span, TokenStream, TokenTree}; use quote::{quote, quote_spanned, ToTokens}; @@ -485,15 +484,23 @@ pub fn body_variant(tokens: TokenStream) -> TokenStream { } pub fn body_invariant(tokens: TokenStream) -> TokenStream { - generate_expression_closure(&AstRewriter::process_loop_invariant, tokens) + let spec = generate_expression_closure(&AstRewriter::process_loop_invariant, tokens.clone()); + let check = generate_runtime_expression_closure(&AstRewriter::runtime_check_loop_invariant, tokens); + quote!{#spec #check} } pub fn prusti_assertion(tokens: TokenStream) -> TokenStream { - generate_expression_closure(&AstRewriter::process_prusti_assertion, tokens) + let spec = generate_expression_closure(&AstRewriter::process_prusti_assertion, tokens.clone()); + let check = generate_runtime_expression_closure(&AstRewriter::runtime_check_prusti_assertion, tokens); + let res = quote!{#spec #check}; + println!("result: {}", res); + res } pub fn prusti_assume(tokens: TokenStream) -> TokenStream { - generate_expression_closure(&AstRewriter::process_prusti_assumption, tokens) + let spec = generate_expression_closure(&AstRewriter::process_prusti_assumption, tokens.clone()); + let check = generate_runtime_expression_closure(&AstRewriter::runtime_check_prusti_assumption, tokens); + quote!{#spec #check} } pub fn prusti_refutation(tokens: TokenStream) -> TokenStream { @@ -519,6 +526,27 @@ fn generate_expression_closure( } } +/// Generates the TokenStream encoding an expression using prusti syntax +/// Used for body invariants, assertions, and assumptions +fn generate_runtime_expression_closure( + fun: &dyn Fn(&mut AstRewriter, SpecificationId, TokenStream) -> syn::Result, + tokens: TokenStream, +) -> TokenStream { + let mut rewriter = rewriter::AstRewriter::new(); + let spec_id = rewriter.generate_spec_id(); + + let closure = handle_result!(fun(&mut rewriter, spec_id, tokens)); + let callsite_span = Span::call_site(); + // always must follow a normal expression closure! + quote_spanned! {callsite_span=> + else if true { + #closure + } else { + || (); + } + } +} + pub fn closure(tokens: TokenStream) -> TokenStream { let cl_spec: ClosureWithSpec = handle_result!(syn::parse(tokens.into())); let callsite_span = Span::call_site(); @@ -1187,3 +1215,27 @@ pub fn ghost(tokens: TokenStream) -> TokenStream { syn_errors } } + +pub fn pledge_expires( + tokens: TokenStream, +) -> TokenStream { + // make sure only 1 identifier is passed to this macro + let expr = handle_result!(syn::parse2::(tokens.clone())); + // create spec blocks starting with a spec_only closure so + // they will not influence verification result + // marked with spec_only so they are ignored during encoding + // check_only so we can still distinguish them from specifications + parse_quote_spanned! {tokens.span() => + if true { + #[allow(unused_must_use, unused_variables)] + { + #[prusti::spec_only] + #[prusti::check_only] + #[prusti::expiration_location] + || -> () {}; + let expiring = #expr; + } + } + } + +} diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index ca391c7f7ce..f3fbb097a35 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -1,6 +1,6 @@ use crate::{ common::HasSignature, - runtime_checks::{RuntimeFunctions, translate_runtime_checks}, + runtime_checks::translation::{self, translate_runtime_checks, RuntimeFunctions}, specifications::{ common::{SpecificationId, SpecificationIdGenerator}, preparser::{parse_prusti, parse_prusti_assert_pledge, parse_prusti_pledge}, @@ -188,14 +188,16 @@ impl AstRewriter { item: &untyped::AnyFnItem, ) -> syn::Result<(syn::Item, Option)> { let parsed = parse_prusti_pledge(tokens)?; - let spec_item = self.generate_spec_item_fn( - SpecItemType::Pledge, - spec_id, - parsed.clone(), - item, - )?; + let spec_item = + self.generate_spec_item_fn(SpecItemType::Pledge, spec_id, parsed.clone(), item)?; let check = if let Some(check_id) = check_id_opt { - Some(translate_runtime_checks(SpecItemType::Pledge, check_id, parsed, None, item)?) + Some(translate_runtime_checks( + SpecItemType::Pledge, + check_id, + parsed, + None, + item, + )?) } else { None }; @@ -236,10 +238,13 @@ impl AstRewriter { item: &untyped::AnyFnItem, ) -> syn::Result<(syn::Item, syn::Item, Option)> { let (lhs, rhs) = parse_prusti_assert_pledge(tokens)?; - let lhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_lhs, lhs.clone(), item)?; - let rhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_rhs, rhs.clone(), item)?; + let lhs_item = + self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_lhs, lhs.clone(), item)?; + let rhs_item = + self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_rhs, rhs.clone(), item)?; if let Some(check_id) = check_id { - let checks = translate_runtime_checks(SpecItemType::Pledge, check_id, rhs, Some(lhs), item)?; + let checks = + translate_runtime_checks(SpecItemType::Pledge, check_id, rhs, Some(lhs), item)?; syn::Result::Ok((lhs_item, rhs_item, Some(checks))) } else { syn::Result::Ok((lhs_item, rhs_item, None)) @@ -275,6 +280,14 @@ impl AstRewriter { self.process_prusti_expression(quote! {loop_body_invariant_spec}, spec_id, tokens) } + pub fn runtime_check_loop_invariant( + &mut self, + spec_id: SpecificationId, + tokens: TokenStream, + ) -> syn::Result { + self.runtime_check_prusti_expression(spec_id, tokens) + } + /// Parse a prusti assertion into a Rust expression pub fn process_prusti_assertion( &mut self, @@ -284,6 +297,14 @@ impl AstRewriter { self.process_prusti_expression(quote! {prusti_assertion}, spec_id, tokens) } + pub fn runtime_check_prusti_assertion( + &mut self, + check_id: SpecificationId, + tokens: TokenStream, + ) -> syn::Result { + self.runtime_check_prusti_expression(check_id, tokens) + } + /// Parse a prusti assumption into a Rust expression pub fn process_prusti_assumption( &mut self, @@ -293,6 +314,14 @@ impl AstRewriter { self.process_prusti_expression(quote! {prusti_assumption}, spec_id, tokens) } + pub fn runtime_check_prusti_assumption( + &mut self, + check_id: SpecificationId, + tokens: TokenStream, + ) -> syn::Result { + self.runtime_check_prusti_expression(check_id, tokens) + } + /// Parse a prusti refute into a Rust expression pub fn process_prusti_refutation( &mut self, @@ -322,6 +351,32 @@ impl AstRewriter { }) } + fn runtime_check_prusti_expression( + &mut self, + spec_id: SpecificationId, + tokens: TokenStream, + ) -> syn::Result { + let prusti_tokens = parse_prusti(tokens)?; + let spec_id_str = spec_id.to_string(); + let expr_translated = translation::translate_expression_runtime(prusti_tokens.clone()); + // make an empty closure first, to mark the block as a spec block + // then assert the expression + Ok(quote_spanned! {prusti_tokens.span()=> + { + // an unused closure simply to mark this block(s) as specification + // so they are not encoded by prusti + #[prusti::check_only] + #[prusti::spec_only] + #[prusti::runtime_assertion] + #[prusti::check_id = #spec_id_str] + || -> bool { + true + }; + assert!(#expr_translated); + } + }) + } + /// Parse a closure with specifications into a Rust expression /// TODO: arguments, result (types are typically not known yet after parsing...) pub fn process_closure( diff --git a/prusti-contracts/prusti-specs/src/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs similarity index 100% rename from prusti-contracts/prusti-specs/src/boundary_extraction.rs rename to prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs b/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs new file mode 100644 index 00000000000..80e627caf6a --- /dev/null +++ b/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs @@ -0,0 +1,34 @@ +use crate::rewriter::SpecItemType; + +#[derive(Clone, Copy, Debug)] +pub enum CheckType { + Postcondition, + Precondition, + Pledge, + // Closure expressions contain loop_invariant, prusti_assume and prusti_assert + // there is no need to distinguis them further + ClosureExpression, +} + +impl CheckType { + // whether or not we can generate a function on the ast level that + // generates an old_values tuple for arguments used in old expressions. + // This is ufnortunately not possible for ClosureExpressions, therefore they + // will have to be encoded differently + pub fn has_old_tuple(&self) -> bool { + matches!(self, Self::Postcondition | Self::Pledge) + } + + pub fn is_closure(&self) -> bool { + matches!(self, Self::ClosureExpression) + } + + pub fn from_spectype(spec: &SpecItemType) -> Self { + match spec { + SpecItemType::Postcondition => Self::Postcondition, + SpecItemType::Precondition => Self::Precondition, + SpecItemType::Pledge => Self::Pledge, + _ => panic!("spec type {:?} are not supported to be translated to runtime-checks.", spec) + } + } +} diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs b/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs new file mode 100644 index 00000000000..3b7ecc0d5c2 --- /dev/null +++ b/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs @@ -0,0 +1,3 @@ +pub mod translation; +pub mod check_type; +mod boundary_extraction; diff --git a/prusti-contracts/prusti-specs/src/runtime_checks.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs similarity index 84% rename from prusti-contracts/prusti-specs/src/runtime_checks.rs rename to prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 971ac50ba29..a8445293c37 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -1,5 +1,8 @@ use crate::{ - boundary_extraction::{self, BoundExtractor}, + runtime_checks::{ + boundary_extraction::{self, BoundExtractor}, + check_type::CheckType, + }, common::HasSignature, rewriter::{AstRewriter, SpecItemType}, specifications::{common::SpecificationId, untyped}, @@ -34,24 +37,25 @@ pub struct RuntimeFunctions { pub check_before_expiry: Option, } + impl RuntimeFunctions { /// consumes self, and returns vector of items - pub fn to_item_vec(self) -> Vec { + pub fn to_item_vec(&self) -> Vec { let RuntimeFunctions { check_fn, store_fn, store_before_expiry, check_before_expiry, } = self; - let mut res = vec![check_fn]; + let mut res = vec![check_fn.clone()]; if let Some(store_fn) = store_fn { - res.push(store_fn); + res.push(store_fn.clone()); } if let Some(store_before_expiry) = store_before_expiry { - res.push(store_before_expiry); + res.push(store_before_expiry.clone()); } if let Some(check_before_expiry) = check_before_expiry { - res.push(check_before_expiry); + res.push(check_before_expiry.clone()); } res } @@ -102,6 +106,14 @@ pub fn translate_runtime_checks( }) } +pub fn translate_expression_runtime(tokens: TokenStream) -> syn::Expr { + // a bit different since we don't have any arguments here.. + let mut expr: syn::Expr = syn::parse2(tokens).unwrap(); + let mut check_visitor = CheckVisitor::new(&dummy_fn(), CheckType::ClosureExpression); + check_visitor.visit_expr_mut(&mut expr); + expr +} + impl CheckTranslator { pub fn new( item: &untyped::AnyFnItem, @@ -111,11 +123,8 @@ impl CheckTranslator { ) -> Self { // figure out keywords let mut expression: syn::Expr = syn::parse2::(tokens).unwrap(); - let executed_after = match spec_type { - SpecItemType::Pledge | SpecItemType::Postcondition => true, - _ => false, - }; - let mut visitor = CheckVisitor::new(item, executed_after); + let check_type = CheckType::from_spectype(&spec_type); + let mut visitor = CheckVisitor::new(item, check_type); // Does it make sense to already run the visitor here? visitor.visit_expr_mut(&mut expression); // transform the pledge lhs too. Not sure if this is needed @@ -160,10 +169,7 @@ impl CheckTranslator { // -> have result // -> have old values // -> moved values need to be stored too - let executed_after = match self.spec_type { - SpecItemType::Postcondition | SpecItemType::Pledge => true, - _ => false, - }; + let executed_after = matches!(self.spec_type, SpecItemType::Postcondition | SpecItemType::Pledge); let expr_to_check: syn::Expr = if is_before_expiry_check { // if lhs is true, there has to be a lhs expression if let Some(expr) = self.lhs_expression.as_ref() { @@ -262,16 +268,16 @@ impl CheckTranslator { item.span(), ); let check_id_str = check_id.to_string(); - let mut exprs = self + let mut old_exprs = self .visitor .inputs .iter() .filter_map(|(_, x)| if x.used_in_old { Some(x) } else { None }) .collect::>(); - exprs.sort_by(|a, b| a.old_store_index.partial_cmp(&b.old_store_index).unwrap()); + old_exprs.sort_by(|a, b| a.old_store_index.partial_cmp(&b.old_store_index).unwrap()); let mut tuple: Punctuated = Punctuated::new(); - exprs.iter().for_each(|el| { + old_exprs.iter().for_each(|el| { println!("field number: (control sorted!) {}", el.old_store_index); let name_token: TokenStream = el.name.to_string().parse().unwrap(); let tokens_stmt: syn::Expr = parse_quote_spanned! {item.span() => @@ -326,7 +332,7 @@ impl CheckTranslator { let result_arg = AstRewriter::generate_result_arg(item); let arg = Argument::try_from(&result_arg).unwrap(); let (result_type, arg_ty) = if let syn::Type::Reference(ty) = arg.ty { - let mut ty_ref = ty.clone(); + let mut ty_ref = ty; ty_ref.mutability = None; ((*ty_ref.elem).clone(), syn::Type::Reference(ty_ref)) } else { @@ -446,11 +452,11 @@ pub struct CheckVisitor { pub within_before_expiry: bool, pub inputs: FxHashMap, pub highest_old_index: usize, - pub executed_after: bool, + pub check_type: CheckType, } impl CheckVisitor { - pub fn new(item: &untyped::AnyFnItem, executed_after: bool) -> Self { + pub fn new(item: &untyped::AnyFnItem, check_type: CheckType) -> Self { let inputs = item .sig() .inputs @@ -465,7 +471,7 @@ impl CheckVisitor { within_before_expiry: false, inputs, highest_old_index: 0, - executed_after, + check_type, } } } @@ -479,52 +485,54 @@ impl VisitMut for CheckVisitor { if let Some(ident) = expr_path.path.get_ident() { println!("Found identifier: {}", ident); let name = ident.to_token_stream().to_string(); - if let Some(arg) = self.inputs.get_mut(&name) { - // argument used within an old expression? - // not already marked as used in old? - if self.executed_after && (self.within_old || !arg.is_ref) { - // if it was not already marked to be stored - // needs to be checked for indeces to be correct - if !arg.used_in_old { - println!("Marking variable {} to be stored", arg.name); - arg.used_in_old = true; - arg.old_store_index = self.highest_old_index; - self.highest_old_index += 1; + if self.check_type.is_closure() && self.within_old { + // let tokens = parse_quote! {old(#expr)}; + // *expr = tokens; + } else { + if let Some(arg) = self.inputs.get_mut(&name) { + // argument used within an old expression? + // not already marked as used in old? + if self.check_type.has_old_tuple() && (self.within_old || !arg.is_ref) { + // if it was not already marked to be stored + // needs to be checked for indeces to be correct + if !arg.used_in_old { + println!("Marking variable {} to be stored", arg.name); + arg.used_in_old = true; + arg.old_store_index = self.highest_old_index; + self.highest_old_index += 1; + } + // replace the identifier with the correct field access + let index_token: TokenStream = + arg.old_store_index.to_string().parse().unwrap(); + let tokens = if arg.is_ref { + // cloning will deref the value.. + quote! {(&old_values.#index_token)} + } else { + // unfortunately it could still be a reference.. + // no real solution at this level + quote! {(old_values.#index_token)} + }; + println!("tokens: {}", tokens); + let new_path: syn::Expr = syn::parse2(tokens).unwrap(); + *expr = new_path; } - // replace the identifier with the correct field access - let index_token: TokenStream = - arg.old_store_index.to_string().parse().unwrap(); - let tokens = if arg.is_ref { - // cloning will deref the value.. - quote! {(&old_values.#index_token)} - } else { - // unfortunately it could still be a reference.. - // no real solution at this level - quote! {(old_values.#index_token)} + } else if self.within_before_expiry && name == *"result" { + let new_path: syn::Expr = parse_quote! { + (&result_before_expiry) }; - println!("tokens: {}", tokens); - let new_path: syn::Expr = syn::parse2(tokens).unwrap(); *expr = new_path; + } else { + println!("identifier {} was not found in args\n\n", name); } - } else if self.within_before_expiry && name == "result".to_string() { - let new_path: syn::Expr = parse_quote! { - (&result_before_expiry) - }; - *expr = new_path; - } else { - println!("identifier {} was not found in args\n\n", name); } - // duplicating identifiers by defining new variables within specs - // can break this! } - syn::visit_mut::visit_expr_mut(self, expr); } Expr::Call(call) // func: box Expr::Path(syn::ExprPath { path, .. }), // .. => { - // move this function, has nothing to do with boundary extraction let path_expr = (*call.func).clone(); + // move this function, has nothing to do with boundary extraction let name = if let Some(name) = boundary_extraction::expression_name(&path_expr) { name } else { @@ -535,25 +543,31 @@ impl VisitMut for CheckVisitor { }; match name.as_str() { ":: prusti_contracts :: old" | "prusti_contracts :: old" | "old" => { - let sub_expr = call.args.pop(); - // remove old-call and replace with content expression - *expr = sub_expr.unwrap().value().clone(); - println!("recognized old with sub_expr: {}!", quote! {#expr}); - self.within_old = true; - syn::visit_mut::visit_expr_mut(self, expr); - // will cause all variables below to be replaced by old_value.some_field - self.within_old = false; - println!( - "done searching contents of old(), expression now: {}", - quote! {#expr} - ); + if self.check_type.is_closure() { + syn::visit_mut::visit_expr_call_mut(self, call); + // just leave it as it is.. resolve it on mir level + } else { + let sub_expr = call.args.pop(); + // remove old-call and replace with content expression + *expr = sub_expr.unwrap().value().clone(); + println!("recognized old with sub_expr: {}!", quote! {#expr}); + self.within_old = true; + self.visit_expr_mut(expr); + println!("sub expression of old after modification: {}", quote!{#expr}); + // will cause all variables below to be replaced by old_value.some_field + self.within_old = false; + println!( + "done searching contents of old(), expression now: {}", + quote! {#expr} + ); + } } ":: prusti_contracts :: before_expiry" | "prusti_contracts :: before_expiry" | "before_expiry" => { let sub_expr = call.args.pop(); *expr = sub_expr.unwrap().value().clone(); println!("recognized before_expiry with sub_expr: {}!", quote! {#expr}); self.within_before_expiry = true; - syn::visit_mut::visit_expr_mut(self, expr); + self.visit_expr_mut(expr); // will cause all variables below to be replaced by old_value.some_field self.within_before_expiry = false; println!( @@ -739,3 +753,9 @@ fn translate_quantifier_expression(closure: &syn::ExprClosure, kind: QuantifierK } expr } + +pub fn dummy_fn() -> untyped::AnyFnItem { + parse_quote! { + fn x(){} + } +} diff --git a/prusti-interface/src/environment/mod.rs b/prusti-interface/src/environment/mod.rs index 7f1acf512fe..18be6eba72c 100644 --- a/prusti-interface/src/environment/mod.rs +++ b/prusti-interface/src/environment/mod.rs @@ -35,8 +35,9 @@ pub use self::{ loops_utils::*, name::EnvName, procedure::{ - get_loop_invariant, is_ghost_begin_marker, is_ghost_end_marker, is_loop_invariant_block, - is_loop_variant_block, is_marked_specification_block, BasicBlockIndex, Procedure, + blocks_dominated_by, get_loop_invariant, is_check_closure, is_ghost_begin_marker, + is_ghost_end_marker, is_loop_invariant_block, is_loop_variant_block, is_marked_check_block, + is_marked_specification_block, BasicBlockIndex, Procedure, }, query::EnvQuery, }; diff --git a/prusti-interface/src/environment/procedure.rs b/prusti-interface/src/environment/procedure.rs index fbb3537a7fc..ab905c8e831 100644 --- a/prusti-interface/src/environment/procedure.rs +++ b/prusti-interface/src/environment/procedure.rs @@ -229,6 +229,10 @@ fn is_spec_closure(env_query: EnvQuery, def_id: def_id::DefId) -> bool { crate::utils::has_spec_only_attr(env_query.get_attributes(def_id)) } +pub fn is_check_closure(env_query: EnvQuery, def_id: def_id::DefId) -> bool { + crate::utils::has_check_only_attr(env_query.get_attributes(def_id)) +} + pub fn is_marked_specification_block(env_query: EnvQuery, bb_data: &BasicBlockData) -> bool { for stmt in &bb_data.statements { if let StatementKind::Assign(box ( @@ -244,6 +248,21 @@ pub fn is_marked_specification_block(env_query: EnvQuery, bb_data: &BasicBlockDa false } +pub fn is_marked_check_block(env_query: EnvQuery, bb_data: &BasicBlockData) -> bool { + for stmt in &bb_data.statements { + if let StatementKind::Assign(box ( + _, + Rvalue::Aggregate(box AggregateKind::Closure(def_id, _), _), + )) = &stmt.kind + { + if is_check_closure(env_query, *def_id) { + return true; + } + } + } + false +} + pub fn get_loop_invariant<'tcx>( env_query: EnvQuery, bb_data: &BasicBlockData<'tcx>, @@ -335,7 +354,7 @@ fn blocks_definitely_leading_to( blocks } -fn blocks_dominated_by(mir: &Body, dominator: BasicBlock) -> FxHashSet { +pub fn blocks_dominated_by(mir: &Body, dominator: BasicBlock) -> FxHashSet { let dominators = mir.basic_blocks.dominators(); let mut blocks = FxHashSet::default(); for bb in mir.basic_blocks.indices() { diff --git a/prusti-interface/src/specs/mod.rs b/prusti-interface/src/specs/mod.rs index 1f3dcb04935..f645f72e490 100644 --- a/prusti-interface/src/specs/mod.rs +++ b/prusti-interface/src/specs/mod.rs @@ -128,6 +128,8 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { pub fn build_def_specs(&mut self) -> typed::DefSpecificationMap { let mut def_spec = typed::DefSpecificationMap::new(); self.determine_procedure_specs(&mut def_spec); + + self.determine_checks(&mut def_spec); self.determine_extern_specs(&mut def_spec); self.determine_loop_specs(&mut def_spec); self.determine_type_specs(&mut def_spec); @@ -136,7 +138,6 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { self.determine_prusti_refutations(&mut def_spec); self.determine_ghost_begin_ends(&mut def_spec); - self.determine_checks(&mut def_spec); // TODO: remove spec functions (make sure none are duplicated or left over) // Load all local spec MIR bodies, for export and later use @@ -185,7 +186,6 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { check_before_expiry, store_before_expiry, }; - println!("Found a pledge with following contents: {:#?}", res); res } // Todo: Pledges, Assume? @@ -281,6 +281,11 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { let spec = def_spec.proc_specs.remove(spec_id).unwrap(); def_spec.proc_specs.insert(target_def_id, spec); + + // also deal with checks for extern specs: + if let Some(check) = def_spec.checks.remove(spec_id) { + def_spec.checks.insert(target_def_id, check); + } } } diff --git a/prusti-interface/src/utils.rs b/prusti-interface/src/utils.rs index 4dfed681a7e..4011a24fa91 100644 --- a/prusti-interface/src/utils.rs +++ b/prusti-interface/src/utils.rs @@ -213,6 +213,12 @@ pub fn has_spec_only_attr(attrs: &[ast::Attribute]) -> bool { has_prusti_attr(attrs, "spec_only") } +/// Check if `prusti::check_only` is among the attributes. +/// runtime check blocks +pub fn has_check_only_attr(attrs: &[ast::Attribute]) -> bool { + has_prusti_attr(attrs, "check_only") +} + /// Check if `prusti::extern_spec` is among the attributes. pub fn has_extern_spec_attr(attrs: &[ast::Attribute]) -> bool { has_prusti_attr(attrs, "extern_spec") diff --git a/prusti-viper/src/encoder/encoder.rs b/prusti-viper/src/encoder/encoder.rs index 1373a8fc451..360481c1777 100644 --- a/prusti-viper/src/encoder/encoder.rs +++ b/prusti-viper/src/encoder/encoder.rs @@ -625,7 +625,10 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { let proc_encoder = ProcedureEncoder::new(self, &procedure)?; let mut method = match proc_encoder.encode() { Ok((result, loan_expirations)) => { - self.expiration_locations.borrow_mut().insert(def_id, loan_expirations); + let mut expiration_locations = self.expiration_locations.borrow_mut(); + // detect multiple expiration locations + assert!(expiration_locations.get(&def_id).is_none()); + expiration_locations.insert(def_id, loan_expirations); result }, Err(error) => { diff --git a/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs b/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs index d5f2c6fa481..6223bb950e3 100644 --- a/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs +++ b/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs @@ -430,6 +430,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> BackwardMirInterpreter<'tcx> match full_func_proc_name { "prusti_contracts::old" => { assert_eq!(args.len(), 1); + println!("encoded arg of old: {:?}", encoded_args[0]); // Return an error for unsupported old(..) types diff --git a/prusti-viper/src/encoder/procedure_encoder.rs b/prusti-viper/src/encoder/procedure_encoder.rs index c73966763c6..5c8e6a5bb2b 100644 --- a/prusti-viper/src/encoder/procedure_encoder.rs +++ b/prusti-viper/src/encoder/procedure_encoder.rs @@ -2226,7 +2226,8 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { ) -> SpannedEncodingResult> { let mut stmts: Vec = vec![]; for loan in &loans { - self.loan_expiration_location.insert(loan.clone(), location); + // assert!(self.loan_expiration_location.get(loan).is_none()); + self.loan_expiration_location.insert(*loan, location); } if !loans.is_empty() { let vir_reborrowing_dag = @@ -6989,7 +6990,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { if let Some(loan) = loan_opt { if let Some(expiration_location) = self.loan_expiration_location.get(loan) { println!("place: {:?} expires at location {:?}", place, expiration_location); - res.insert(place.clone(), *expiration_location); + res.insert(*place, *expiration_location); } } } diff --git a/prusti/Cargo.toml b/prusti/Cargo.toml index 3b5aad18817..ebbfeddd6eb 100644 --- a/prusti/Cargo.toml +++ b/prusti/Cargo.toml @@ -21,6 +21,7 @@ lazy_static = "1.4.0" tracing = { path = "../tracing" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } tracing-chrome = "0.7" +either = "1.8.1" rustc-hash = "1.1.0" [build-dependencies] diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index 139ebda54a7..6ab1600a176 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -17,7 +17,7 @@ mod verifier; // move these 2 at some point mod mir_modify; mod mir_helper; -mod mir_diff_map; +mod mir_info_collector; use arg_value::arg_value; use callbacks::PrustiCompilerCalls; diff --git a/prusti/src/mir_diff_map.rs b/prusti/src/mir_diff_map.rs deleted file mode 100644 index 77511aee000..00000000000 --- a/prusti/src/mir_diff_map.rs +++ /dev/null @@ -1,26 +0,0 @@ -use prusti_rustc_interface::{ - middle::{ - mir::{self, patch::MirPatch, Body, TerminatorKind}, - ty::{self, TyCtxt}, - }, - span::{self, def_id::DefId}, -}; -use rustc_hash::FxHashMap; - -// for each location of calls in a mir_promoted body, map it to its new -// location in the mir_drops_elaborated body -// certain statements are added / removed during this phase, -fn location_map<'tcx>(mut mir_promoted: Body<'tcx>, mut mir_elaborated: Body<'tcx>) -> Result,()> { - // we assume statements are not moved accross blocks (which seems to be accurate) - let bblocks1 = mir_promoted.basic_blocks.as_mut(); - let bblocks2 = mir_elaborated.basic_blocks.as_mut(); - assert!(bblocks1.len() == bblocks2.len()); - for (block, blockdata1) in bblocks1.clone().into_iter_enumerated() { - let blockdata2 = bblocks2.get(block); - - } - Err(()) -} - - - diff --git a/prusti/src/mir_helper.rs b/prusti/src/mir_helper.rs index ef28ea03f4f..40fbd7f26fa 100644 --- a/prusti/src/mir_helper.rs +++ b/prusti/src/mir_helper.rs @@ -1,52 +1,61 @@ use prusti_rustc_interface::{ middle::{ - mir::{self, patch::MirPatch, Body, TerminatorKind}, + mir::{self, patch::MirPatch, Body, TerminatorKind, visit::Visitor}, ty::{self, TyCtxt}, }, - span::{self, def_id::DefId}, + span::{self, def_id::DefId, Span}, }; - -// derive the function's type from a def_id, and an optional set of -// substitutions. If no substitutions are present, -// the identity will be used -pub fn function_operand<'tcx>( - def_id: DefId, - tcx: TyCtxt<'tcx>, - substs_opt: Option>, -) -> mir::Operand<'tcx> { - let substs = substs_opt.unwrap_or(ty::subst::InternalSubsts::identity_for_item(tcx, def_id)); - let func_ty = tcx.mk_ty_from_kind(ty::TyKind::FnDef(def_id, substs)); - mir::Operand::Constant(Box::new(mir::Constant { - span: span::DUMMY_SP, - user_ty: None, - literal: mir::ConstantKind::zero_sized(func_ty), - })) -} +use either::Either; /// Given the name of a variable in the original program, find the /// corresponding mir local -pub fn get_local_from_name(body: &Body<'_>, name: String) -> Option { - for debug_info in &body.var_debug_info { - // find the corresponding local in the var_debug_info - if debug_info.name.to_string() == name { - if let mir::VarDebugInfoContents::Place(place) = debug_info.value { - return Some(place.local); - } +// pub fn get_local_from_name(body: &Body<'_>, name: String) -> Option { +// for debug_info in &body.var_debug_info { +// // find the corresponding local in the var_debug_info +// if debug_info.name.to_string() == name { +// if let mir::VarDebugInfoContents::Place(place) = debug_info.value { +// return Some(place.local); +// } +// } +// } +// None +// } + +/// Check whether this variable is mutable, or a mutable reference +pub fn is_mutable_arg<'tcx>(body: &Body<'tcx>, local: mir::Local) -> bool { + let args: Vec = body.args_iter().collect(); + if args.contains(&local) { + let local_decl = body.local_decls.get(local).unwrap(); + match local_decl.mutability { + mir::Mutability::Mut => return true, + _ => (), + } + match local_decl.ty.ref_mutability() { + Some(mir::Mutability::Mut) => true, + _ => false, } + } else { + false } - None } -pub fn fn_return_ty<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> ty::Ty<'tcx> { - let fn_sig = tcx.fn_sig(def_id).subst_identity(); - fn_sig.output().skip_binder() +pub fn get_locals_type<'tcx>(body: &Body<'tcx>, local: mir::Local) -> Result, ()> { + Ok(body.local_decls.get(local).ok_or(())?.ty) } -/// Just creates an erased region. Needed to create a borrow statement -/// in the MIR -pub fn dummy_region(tcx: TyCtxt<'_>) -> ty::Region<'_> { - let kind = ty::RegionKind::ReErased; - tcx.mk_region_from_kind(kind) +pub fn local_from_operand<'tcx>(operand: &mir::Operand<'tcx>) -> Result { + match operand { + mir::Operand::Copy(place) | mir::Operand::Move(place) => { + println!("Projections: {:#?}", place.projection); + Ok(place.local) + } + _ => return Err(()), + } +} + +pub fn fn_return_ty(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Ty<'_> { + let fn_sig = tcx.fn_sig(def_id).subst_identity(); + fn_sig.output().skip_binder() } pub fn dummy_source_info() -> mir::SourceInfo { @@ -56,20 +65,57 @@ pub fn dummy_source_info() -> mir::SourceInfo { } } -pub fn rvalue_reference_to_place<'tcx>( +pub fn dummy_region<'tcx>(tcx: TyCtxt<'tcx>) -> ty::Region<'tcx> { + let kind = ty::RegionKind::ReErased; + tcx.mk_region_from_kind(kind) +} + +pub fn rvalue_reference_to_local<'tcx>( tcx: TyCtxt<'tcx>, - place: mir::Place<'tcx>, + local: mir::Local, + mutable: bool, ) -> mir::Rvalue<'tcx> { + let place = mir::Place::from(local); let dummy_region = dummy_region(tcx); + let borrow_kind = if mutable { + mir::BorrowKind::Mut { + allow_two_phase_borrow: false, + } + } else { + mir::BorrowKind::Shared + }; mir::Rvalue::Ref( dummy_region, - mir::BorrowKind::Shared, + borrow_kind, place, // the local to be dereferenced ) } -pub fn args_from_body<'tcx>(body: &Body<'tcx>) -> Vec> { +pub fn create_reference_type<'tcx>(tcx: TyCtxt<'tcx>, ty: ty::Ty<'tcx>) -> ty::Ty<'tcx> { + let mutability = mir::Mutability::Not; + let region = dummy_region(tcx); + tcx.mk_ref( + region, + ty::TypeAndMut { + ty, + mutbl: mutability, + }, + ) +} + +pub fn get_clone_defid<'tcx>(tcx: TyCtxt<'tcx>) -> Option { + let trait_defid = tcx.lang_items().clone_trait()?; + tcx.associated_items(trait_defid) + .find_by_name_and_kind( + tcx, + span::symbol::Ident::from_str("clone"), + ty::AssocKind::Fn, + trait_defid, + ) + .map(|x| x.def_id) +} +pub fn args_from_body<'tcx>(body: &Body<'tcx>) -> Vec> { let mut args = Vec::new(); let caller_nr_args = body.arg_count; // now the final mapping to operands: @@ -85,6 +131,30 @@ pub fn args_from_body<'tcx>(body: &Body<'tcx>) -> Vec> { args } +pub fn prepend_dummy_block(body: &mut Body) -> mir::BasicBlock { + let mut patch = MirPatch::new(body); + let terminator_kind = mir::TerminatorKind::Goto { + target: mir::START_BLOCK, + }; + let terminator = mir::Terminator { + source_info: dummy_source_info(), + kind: terminator_kind, + }; + let blockdata = mir::BasicBlockData::new(Some(terminator)); + let new_block_id = patch.new_block(blockdata); + patch.apply(body); + + body.basic_blocks_mut().swap(mir::START_BLOCK, new_block_id); + + // fix all terminators to point to correct block + for b in body.basic_blocks.as_mut().iter_mut() { + replace_outgoing_edges(b, mir::START_BLOCK, mir::BasicBlock::MAX); + replace_outgoing_edges(b, new_block_id, mir::START_BLOCK); + replace_outgoing_edges(b, mir::BasicBlock::MAX, new_block_id); + } + new_block_id +} + pub fn create_call_block<'tcx>( tcx: TyCtxt<'tcx>, patch: &mut MirPatch<'tcx>, @@ -93,15 +163,7 @@ pub fn create_call_block<'tcx>( substs: ty::subst::SubstsRef<'tcx>, destination: Option>, target: Option, -) -> Result<(mir::BasicBlock, mir::Place<'tcx>),()> { - let body_to_insert: Body<'tcx> = tcx - .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( - call_id.as_local().unwrap(), - )) - .borrow() - .clone(); - - let ret_ty = body_to_insert.return_ty(); +) -> Result<(mir::BasicBlock, mir::Place<'tcx>), ()> { // construct the function call let func_ty = tcx.mk_ty_from_kind(ty::TyKind::FnDef(call_id, substs)); let func = mir::Operand::Constant(Box::new(mir::Constant { @@ -113,6 +175,12 @@ pub fn create_call_block<'tcx>( let destination = if let Some(dest) = destination { dest } else { + // find return type + let ret_ty = tcx + .fn_sig(call_id) + .subst(tcx, substs) + .output() + .skip_binder(); mir::Place::from(patch.new_internal(ret_ty, span::DUMMY_SP)) }; @@ -124,7 +192,7 @@ pub fn create_call_block<'tcx>( target, cleanup: None, from_hir_call: false, - fn_span: body_to_insert.span, + fn_span: tcx.def_span(call_id), }; let terminator = mir::Terminator { source_info: dummy_source_info(), @@ -139,8 +207,8 @@ pub fn create_call_block<'tcx>( /// Creates one new block, moves all instructions following the passed location /// and the terminator to the new block, and changes the current terminator /// to point to this new block. If successful, returns index of the new block -pub fn split_block_at_location<'tcx>( - body: &mut mir::Body<'tcx>, +pub fn split_block_at_location( + body: &mut mir::Body<'_>, location: mir::Location, ) -> Result { // check validity of the location: @@ -151,7 +219,7 @@ pub fn split_block_at_location<'tcx>( let nr_instructions = block1.statements.len(); // check if the given location is valid if nr_instructions <= location.statement_index { - return Err(()) + return Err(()); } // the statements that stay in the first block let stmts1: Vec = block1.statements[0..=location.statement_index].to_vec(); @@ -275,3 +343,4 @@ pub fn replace_target(terminator: &mut mir::Terminator, new_target: mir::BasicBl *target = Some(new_target); } } + diff --git a/prusti/src/mir_info_collector.rs b/prusti/src/mir_info_collector.rs new file mode 100644 index 00000000000..1e31f1c2084 --- /dev/null +++ b/prusti/src/mir_info_collector.rs @@ -0,0 +1,259 @@ +use crate::mir_helper::*; +use prusti_interface::{ + environment::{blocks_dominated_by, is_check_closure, is_marked_check_block, EnvQuery}, + utils::has_prusti_attr, +}; +use prusti_rustc_interface::{ + ast::ast, + middle::{ + mir::{self, visit::Visitor, Statement, StatementKind}, + ty::TyCtxt, + }, + span::Span, +}; +use rustc_hash::{FxHashMap, FxHashSet}; + +pub struct MirInfo { + pub moved_args: FxHashMap, + pub check_blocks: FxHashMap, +} + +pub fn collect_mir_info<'tcx>(tcx: TyCtxt<'tcx>, body: mir::Body<'tcx>) -> MirInfo { + let check_blocks = collect_check_blocks(tcx, &body); + let mut visitor = MirInfoCollector::new(body.clone()); + visitor.visit_body(&body); + println!("CHECK BLOCKS: {:#?}", &check_blocks); + // TODO: update after changes to resolving of old: + MirInfo { + moved_args: Default::default(), + check_blocks, + } +} + +// A MIR Visitor that collects information before we actually start modifying +// the MIR. It's responsibilities are: +// - finding variables that are just copies / moves of arguments +// - finding basic-blocks, that can contain old expressions that should be +// resolved (check_only blocks) +// - finding basic blocks, that contain an empty closure, referring to an +// expiration location (when a user manually inserts `prusti_pledge_expires!()`) +// or blocks that are dominated by this kind of block +struct MirInfoCollector<'tcx> { + /// locals that are passed to old as arguments + old_args: FxHashSet, + /// dependencies between locals. + locals_dependencies: FxHashMap>, + /// locations where we assign values to locals: + assignment_locations: FxHashMap>, + /// a body of the copy + body: mir::Body<'tcx>, +} + +#[derive(Clone, Debug)] +struct Dependency { + local: mir::Local, + is_user_declared: bool, + declared_within_old: bool, + is_mutable_arg: bool, +} + + +/// This function has the specific purpose of finding the local variable that +/// contains the result of a pledge when processing a pledge_expires annotation. +/// it's always assigned to a local variable directly after the empty closure +fn first_variable_assignment(bb_data: &mir::BasicBlockData) -> Option { + for stmt in &bb_data.statements { + if let mir::StatementKind::Assign(box (_, mir::Rvalue::Use(mir::Operand::Move(place)))) = + stmt.kind + { + return Some(place.local); + } + } + None +} + +impl<'tcx> Visitor<'tcx> for MirInfoCollector<'tcx> { + fn visit_statement(&mut self, statement: &Statement<'tcx>, location: mir::Location) { + self.super_statement(statement, location); + match &statement.kind { + StatementKind::Assign(box (recv, rvalue)) => { + } + _ => (), + } + } + + fn visit_terminator(&mut self, terminator: &mir::Terminator<'tcx>, location: mir::Location) { + self.super_terminator(terminator, location); + } +} + +impl<'tcx> MirInfoCollector<'tcx> { + pub(crate) fn new(body: mir::Body<'tcx>) -> Self { + Self { + old_args: Default::default(), + locals_dependencies: Default::default(), + assignment_locations: Default::default(), + body, + } + } +} + +pub fn collect_check_blocks<'tcx>( + tcx: TyCtxt<'tcx>, + body: &mir::Body<'tcx>, +) -> FxHashMap { + let env_query = EnvQuery::new(tcx); + let mut marked_check_blocks = FxHashMap::default(); + for (bb, bb_data) in body.basic_blocks.iter_enumerated() { + if let Some(kind) = CheckBlockKind::determine_kind(env_query, bb_data) { + marked_check_blocks.insert(bb, kind); + } + } + // all the blocks that are dominated by one of these check blocks, are check + // blocks of the same kind too. No two blocks should be dominated by + // more than one block containing such a closure. + let mut check_blocks = marked_check_blocks.clone(); + for (bb, bb_kind) in marked_check_blocks { + println!("Looking for dominated blocks of {:?}", bb); + let dominated_blocks = blocks_dominated_by(body, bb); + for bb_dominated in dominated_blocks { + if bb_dominated != bb { + println!("\tblock {:?}", bb_dominated); + assert!(check_blocks.get(&bb_dominated).is_none()); + check_blocks.insert(bb_dominated, bb_kind); + } + } + } + check_blocks +} + +#[derive(Clone, Copy, Debug)] +pub enum CheckBlockKind { + /// comes from either assume, assert or bodyinvariant + RuntimeAssertion, + /// a manually annotated location by the user, where a pledge expires + /// containing the local that stores this pledge + PledgeExpires(mir::Local), +} + +impl CheckBlockKind { + pub fn determine_kind<'tcx>( + env_query: EnvQuery<'tcx>, + bb_data: &mir::BasicBlockData, + ) -> Option { + for stmt in &bb_data.statements { + if let mir::StatementKind::Assign(box ( + _, + mir::Rvalue::Aggregate(box mir::AggregateKind::Closure(def_id, _), _), + )) = stmt.kind + { + if is_check_closure(env_query, def_id) { + let attrs = env_query.get_attributes(def_id); + if has_prusti_attr(attrs, "expiration_location") { + // there needs to be a single assignment + let pledge_target = first_variable_assignment(bb_data).unwrap(); + + return Some(Self::PledgeExpires(pledge_target)); + } else if has_prusti_attr(attrs, "runtime_assertion") { + return Some(Self::RuntimeAssertion); + } + } + } + } + None + } +} + +// Given a local variable, find all statements or terminators that assign to it. +pub fn find_local_dependencies<'tcx>( + local: mir::Local, + body: &mir::Body<'tcx>, +) -> Vec { + let mut locations = Vec::new(); + for (bb, bb_data) in body.basic_blocks.iter_enumerated() { + // check terminator: + if let mir::TerminatorKind::Call { destination, .. } = bb_data.terminator().kind { + if destination.local == local { + locations.push(mir::Location { + block: bb, + statement_index: bb_data.statements.len(), + }) + } + } + for (index, stmt) in bb_data.statements.iter().enumerate() { + if let mir::StatementKind::Assign(box (place, rvalue)) = &stmt.kind { + if place.local == local { + locations.push(mir::Location { + block: bb, + statement_index: index, + }); + } + } + } + } + locations +} + +struct RvalueVisitor { + pub dependencies: Vec, +} + +impl<'tcx> Visitor<'tcx> for RvalueVisitor { + fn visit_local( + &mut self, + local: mir::Local, + context: mir::visit::PlaceContext, + location: mir::Location, + ) { + self.dependencies.push(local); + } +} + +// find locals that are used to compute the rhs of an assignment +// pub fn find_stmt_dependencies<'tcx>(stmt: Either<&mir::Statement<'tcx>, &mir::Terminator<'tcx>>, location: mir::Location) -> Vec { +// let mut visitor = RvalueVisitor { +// dependencies: Vec::new(), +// }; +// match stmt { +// Either::Left(stmt) => { +// if let mir::StatementKind::Assign(box (_, rvalue)) = &stmt.kind { +// visitor.visit_rvalue(rvalue, location); +// } +// }, +// Either::Right(term) => { +// if let mir::TerminatorKind::Call { args, .. } = &term.kind { +// for arg in args { +// visitor.visit_operand(arg, location); +// } +// } +// } +// } +// visitor.dependencies +// } + +// Given the span of the old call, figure if a local is user declared, and also +// whether it was declared outside of the old call. +// Example: we want to differentiate old({let a = b, old(a)}) from +// {let a = b; old(a)}, since, if b is an argument, for the first one we actually +// want the old state of a (on function entry), but not for the second one. +pub fn local_user_declared_outside_old<'tcx>( + old_span: Span, + body: &mir::Body<'tcx>, + local: mir::Local, +) -> bool { + let local_decl = body.local_decls.get(local).unwrap(); + if local_decl.is_user_variable() { + old_span.contains(local_decl.source_info.span) + } else { + false + } +} + +// pub fn find_arg_dependencies<'tcx>(local: mir::Local, body: &mir::Body<'tcx>) -> Vec<(mir::Local, mir::Local)> { +// // find locations where we assign to this local +// let def_locations = find_assignments(local, body); +// for loc in def_locations{ +// let stmt = body.stmt_at(loc); +// find_stmt_dependencies(stmt, loc); +// } +// } diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index 11e4f74ec28..9a333e2e23a 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -1,6 +1,9 @@ -use crate::mir_helper::*; +use crate::{ + mir_helper::*, + mir_info_collector::{collect_mir_info, CheckBlockKind, MirInfo}, +}; use prusti_interface::{ - environment::{Environment, Procedure}, + environment::{is_marked_check_block, EnvQuery}, specs::typed::{CheckKind, DefSpecificationMap}, }; use prusti_rustc_interface::{ @@ -9,8 +12,7 @@ use prusti_rustc_interface::{ middle::{ mir::{ self, patch::MirPatch, pretty, visit::MutVisitor, BasicBlock, BasicBlockData, Body, - Constant, ConstantKind, Operand, Place, SourceInfo, SourceScope, Terminator, - TerminatorKind, + Constant, ConstantKind, Operand, Place, Terminator, TerminatorKind, }, ty::{self, TyCtxt, TyKind}, }, @@ -19,10 +21,8 @@ use prusti_rustc_interface::{ DUMMY_SP, }, }; -use prusti_viper::encoder::Encoder; -use rustc_hash::FxHashMap; +use rustc_hash::{FxHashMap, FxHashSet}; -// debugging dependencies? use std::{env, fs, io}; fn folder_present(name: &str) -> io::Result { @@ -41,11 +41,7 @@ pub(crate) fn mir_checked( tcx: TyCtxt<'_>, def: ty::WithOptConstParam, ) -> &Steal> { - // is it our job to store it? - println!("mir checked query is called"); - // let's get the specifications collected by prusti :) - // SAFETY: Is definitely not safe at the moment let specs_opt = unsafe { SPECS.clone() }; @@ -53,12 +49,15 @@ pub(crate) fn mir_checked( let expiration_locations = unsafe { EXPIRATION_LOCATIONS.clone().unwrap() }; // get mir body before invoking drops_elaborated query, otherwise it will // be stolen - let mir_promoted = tcx.mir_promoted(def).0.borrow().clone(); let steal = (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def); let mut stolen = steal.steal(); let def_id = stolen.source.def_id(); + if def_id.is_local() { + println!("modifying mir for defid: {:?}", def_id); + } - let mut visitor = InsertChecksVisitor::new(tcx, specs, expiration_locations, mir_promoted); + let mut visitor = + InsertChecksVisitor::new(tcx, specs, expiration_locations, stolen.clone()); visitor.visit_body(&mut stolen); // print mir of body: @@ -75,31 +74,47 @@ pub(crate) fn mir_checked( } } -#[derive(Debug, Clone)] -pub enum ModificationToProcess<'tcx> { - Pledge(PledgeToProcess<'tcx>), -} +// #[derive(Debug, Clone)] +// pub enum ModificationToProcess<'tcx> { +// Pledge(PledgeToProcess<'tcx>), +// OldCall(OldCallToProcess), +// } #[derive(Debug, Clone)] pub struct PledgeToProcess<'tcx> { - insert_location: mir::Location, check: DefId, store_before_expiry: DefId, check_before_expiry: Option, old_values_place: Place<'tcx>, before_expiry_place: Place<'tcx>, destination: Place<'tcx>, + // the args the function was called with args: Vec>, substs: ty::subst::SubstsRef<'tcx>, } +#[derive(Debug, Clone, Copy)] +pub struct OldCallToProcess<'tcx> { + /// the local where the result of cloning should be stored in + stored_local: mir::Local, + /// the argument that should be stored + arg_to_store: mir::Local, + /// the type of the argument (and result) of the old call: + ty: ty::Ty<'tcx>, +} + pub struct InsertChecksVisitor<'tcx> { tcx: TyCtxt<'tcx>, specs: DefSpecificationMap, expiration_locations: FxHashMap>, current_patcher: Option>, - modifications_to_process: Vec<(mir::Location, ModificationToProcess<'tcx>)>, + pledges_to_process: FxHashMap>, + old_calls_to_process: Vec>, current_def_id: Option, + body_copy: Body<'tcx>, + stored_arguments: FxHashSet, + mir_info: MirInfo, + env_query: EnvQuery<'tcx>, } impl<'tcx> InsertChecksVisitor<'tcx> { @@ -107,15 +122,22 @@ impl<'tcx> InsertChecksVisitor<'tcx> { tcx: TyCtxt<'tcx>, specs: DefSpecificationMap, expiration_locations: FxHashMap>, - mir_promoted: Body<'tcx>, + body_copy: Body<'tcx>, ) -> Self { + let mir_info = collect_mir_info(tcx, body_copy.clone()); + let env_query = EnvQuery::new(tcx); Self { tcx, specs, current_patcher: None, - modifications_to_process: Vec::new(), + pledges_to_process: Default::default(), + old_calls_to_process: Vec::new(), expiration_locations, current_def_id: None, + body_copy, + stored_arguments: FxHashSet::default(), + mir_info, + env_query, } } } @@ -135,49 +157,110 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { mir_patch.unwrap().apply(body); // sort descending - self.modifications_to_process - .sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap().reverse()); - - for (location, modification) in &self.modifications_to_process { - match modification { - ModificationToProcess::Pledge(pledge_to_process) => { - // let location = mir::Location { - // block: BasicBlock::from_usize(1), - // statement_index: 1, - // }; - insert_pledge_call_chain(self.tcx, pledge_to_process.clone(), *location, body) - .unwrap(); - } - } - } + // this would insert the pledges correctly, if locations + // were reported correctly. For now, we only insert + // checks for pledges if there are manual + // `prusti_pledge_expires` annotations + // self.pledges_to_process + // .sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap().reverse()); + // + // self.pledges_to_process + // .iter() + // .for_each(|(location, pledge)| { + // insert_pledge_call_chain(self.tcx, pledge.clone(), *location, body).unwrap(); + // }); + + // All the modifications that we do after this point, insert blocks + // that have to be executed before anything else in this function. + // Therefore we create one dummy block, make it goto the starting block + // and swap these blocks locations. + // While we will be prepending calls before the first block, + // `current_target` will keep track of which block this dummy block + // currently points to, so we can keep prepending new blocks + let mut current_target = prepend_dummy_block(body); + + self.old_calls_to_process.iter().for_each(|to_process| { + let mut patch = MirPatch::new(body); + current_target = self + .process_old_call(*to_process, current_target, &mut patch) + .unwrap(); + let terminator_kind = TerminatorKind::Goto { + target: current_target, + }; + patch.patch_terminator(mir::START_BLOCK, terminator_kind); + patch.apply(body); + }); - // try to find specification function: + // insert preconditions at the beginning of the body: let substs = ty::subst::InternalSubsts::identity_for_item(self.tcx, def_id); let args = args_from_body(body); for check_id in self.specs.get_pre_checks(&def_id) { let mut patch = MirPatch::new(body); - let start_node = BasicBlock::from_usize(0); - let (new_block, _) = create_call_block( + let (current_target, _) = create_call_block( self.tcx, &mut patch, check_id, args.clone(), substs, None, // create new destination, does not matter here - // body, - Some(start_node), + Some(current_target), ) .unwrap(); + // make dummy block at the very beginning go to this block now: + + let terminator_kind = TerminatorKind::Goto { + target: current_target, + }; + patch.patch_terminator(mir::START_BLOCK, terminator_kind); patch.apply(body); - // swap first and last node, so our new block is called on entry - body.basic_blocks_mut().swap(start_node, new_block); - - // fix all terminators to point to correct block - for b in body.basic_blocks.as_mut().iter_mut() { - replace_outgoing_edges(b, start_node, BasicBlock::MAX); - replace_outgoing_edges(b, new_block, start_node); - replace_outgoing_edges(b, BasicBlock::MAX, new_block); + } + } + + fn visit_terminator(&mut self, terminator: &mut Terminator<'tcx>, location: mir::Location) { + self.super_terminator(terminator, location); + match &mut terminator.kind { + // find switchInts with a check_only target. + TerminatorKind::SwitchInt { targets, .. } => { + let mut switch_iter = targets.iter(); + if switch_iter.len() == 1 { + let (value, target) = switch_iter.next().unwrap(); + let otherwise = targets.otherwise(); + // check if target is a check_block: + if let Some(kind) = self.mir_info.check_blocks.get(&otherwise) { + match kind { + CheckBlockKind::PledgeExpires(local) => { + // this check_block should terminate with a goto always! + if let TerminatorKind::Goto { target } = + self.body_copy[otherwise].terminator.clone().unwrap().kind + { + let pledge = self + .pledges_to_process + .get(&local) + .expect("pledge expiration without an actual pledge"); + let mut patcher = self.current_patcher.take().unwrap(); + let start_block = create_pledge_call_chain( + self.tcx, + pledge, + target, + &mut patcher, + ) + .unwrap(); + + let new_terminator = TerminatorKind::Goto { + target: start_block, + }; + // skip this check block and instead call checks-chain + patcher.patch_terminator(otherwise, new_terminator); + self.current_patcher = Some(patcher) + } + } + // nothing to do.. + CheckBlockKind::RuntimeAssertion => (), + } + } + } } + _ => (), } } @@ -200,11 +283,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { let mut call_fn_terminator = data.terminator.clone().unwrap().clone(); if let TerminatorKind::Call { - func: - func @ Operand::Constant(box Constant { - literal: ConstantKind::Val(_, ty), - .. - }), + func, target, // the block called afterwards destination, // local to receive result args, @@ -214,28 +293,39 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { // if it's a static function call, we start looking if there are // post-conditions we could check if let Some((call_id, substs)) = func.const_fn_def() { - println!("we are dealing with call_id {:?}", call_id); + let item_name = self.tcx.def_path_str(call_id); // make sure the call is local: if !call_id.is_local() { - // not sure yet here, to get the body the method - // has to be local. The way we construct things - // we currently need it. For extern_specs this will - // be a problem. - return; + // extern specs will need to be handled here. + + if item_name == "prusti_contracts::old".to_string() { + // old calls can still exist here. Find them, replace + // with new locals + println!("found old call!"); + let to_process_opt = self + .handle_old_call(destination.local, args.clone()) + .unwrap(); + if let Some(to_process) = to_process_opt { + self.old_calls_to_process.push(to_process); + // in this case we also need to replace the old call + let new_terminator_kind = mir::TerminatorKind::Goto { + // target can only be none if the call diverges + // TODO: discuss if this can ever happen here. + // I don't think it should.. + target: target.unwrap(), + }; + let mut patch = self.current_patcher.take().unwrap(); + patch.patch_terminator(block, new_terminator_kind); + self.current_patcher = Some(patch); + } + return; + } } // The block that is executed after the annotated function - // is called. Mutable because after appending the first + // is called. Mutable copy because after appending the first // check function call, this is the new target let mut current_target = *target; - // lookup if there is a check function: - let called_body: Body = self - .tcx - .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( - call_id.as_local().unwrap(), - )) - .borrow() - .clone(); // since there might be multiple blocks to be inserted, for check_kind in self.specs.get_runtime_checks(&call_id) { match check_kind { @@ -243,8 +333,6 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { check: check_id, old_store: old_store_id, } => { - println!("Now inserting a runtime check for a postcondition"); - println!("Old store defid: {:?}", old_store_id); // since here, we don't have mutable access to the body, // we created a patcher beforehand which we can use here // and apply later @@ -259,7 +347,6 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { *destination, args.clone(), substs, - &called_body, call_fn_terminator.clone(), ); replace_target(&mut call_fn_terminator, current_target.unwrap()); @@ -297,21 +384,10 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { call_fn_terminator.clone(), old_values_place, ); - println!( - "Trying to find expiration location for function: {:?}", - ty - ); - let expiration_location = self - .expiration_locations - .get(&self.current_def_id.unwrap()) - .unwrap() - .get(&destination.local) - .unwrap(); // *destination is the loan! // figure out where it expires! let pledge_to_process = PledgeToProcess { - insert_location: *expiration_location, check, check_before_expiry, store_before_expiry, @@ -321,10 +397,8 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { args: args.clone(), substs, }; - self.modifications_to_process.push(( - *expiration_location, - ModificationToProcess::Pledge(pledge_to_process), - )); + self.pledges_to_process + .insert(destination.local, pledge_to_process); self.current_patcher = Some(patch); } @@ -337,10 +411,150 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } } -/// caller_block is calling an annotated function. This function creates +impl<'tcx> InsertChecksVisitor<'tcx> { + /// If we encounter an old call with an argument that is also a mutable + /// argument of the original function, we need to replace it with a cloned + /// value! + /// If it's a reference, cloning it will dereference it, so we need an + /// additional local! + /// Returns Ok(None) if nothing went wrong, but there is no modification + /// to be processed + fn handle_old_call( + &mut self, + receiver: mir::Local, + args: Vec>, + ) -> Result>, ()> { + // check if the argument given to old is a mutable argument: + // (if interior mutability is supported in the future, this might have + // to be extended, since even immutable references would have to be + // "cloned", even though normal cloning is not enough anymore then.) + // the argument should always be a single local: + assert!(args.len() == 1, "old was given more than one argument??"); + let old_argument = local_from_operand(&args[0])?; + // argument locals are never passed directly to the function, + // so we have to look up if this argument to old is a copy / move + // of a function argument. + if let Some(original_argument) = self.mir_info.moved_args.get(&old_argument) { + println!("found a copy of a function argument!"); + // also check that we have not yet created a variable storing this local + if self.stored_arguments.get(original_argument).is_some() { + return Ok(None); + } else { + self.stored_arguments.insert(*original_argument); + } + + // this is already checked during creationg of moved_arguments + // if is_mutable_arg(&self.body_copy, original_argument) { + // println!("We have to store an old_arg!"); + // } + + let arg_ty = get_locals_type(&self.body_copy, *original_argument)?; + Ok(Some(OldCallToProcess { + stored_local: receiver, + arg_to_store: *original_argument, + ty: arg_ty, + })) + } else { + // this is not a local we need to store! + Ok(None) + } + } + + fn process_old_call( + &self, + to_process: OldCallToProcess<'tcx>, + target: BasicBlock, + patch: &mut MirPatch<'tcx>, + ) -> Result { + // if we deal with a reference, we can directly call clone on it + // otherwise we have to create a reference first, to pass to the clone + // function. + let clone_defid = get_clone_defid(self.tcx).ok_or(())?; + let clone_trait_defid = self.tcx.lang_items().clone_trait().unwrap(); + if !to_process.ty.is_ref() { + println!("handling a non-ref old arg"); + let ref_ty = create_reference_type(self.tcx, to_process.ty); + let ref_arg = patch.new_internal(ref_ty, DUMMY_SP); + // add a statement to deref the old_argument + let rvalue = rvalue_reference_to_local(self.tcx, to_process.arg_to_store, false); + // the statement to be added to the block that has the call clone + // terminator + let ref_stmt = mir::StatementKind::Assign(box (mir::Place::from(ref_arg), rvalue)); + + // create the substitution since clone is generic: + let generic_ty = ty::subst::GenericArg::from(to_process.ty); + let substs = self.tcx.mk_substs(&[generic_ty]); + // create the function operand: + let clone_args = vec![Operand::Move(mir::Place::from(ref_arg))]; + // create a new basicblock: + let (new_block, _) = create_call_block( + self.tcx, + patch, + clone_defid, + clone_args, + substs, + Some(to_process.stored_local.into()), + Some(target), + )?; + patch.add_statement( + mir::Location { + block: new_block, + statement_index: 0, + }, + ref_stmt, + ); + + Ok(new_block) + // let block_data = BasicBlockData::new() + } else { + // create a new local to store the result of clone: + let deref_ty = to_process.ty.builtin_deref(false).ok_or(())?.ty; + println!("dereferenced type: {:?}", deref_ty); + let destination = patch.new_internal(deref_ty, DUMMY_SP); + let generic_ty = ty::subst::GenericArg::from(deref_ty); + let substs = self.tcx.mk_substs(&[generic_ty]); + let clone_args = vec![Operand::Move(mir::Place::from(to_process.arg_to_store))]; + // add an additional simple block afterwards, that dereferences + // the the cloned value into the original receiver of old: + // create it beforehand, so we can set the precedors target correctly + let terminator = mir::Terminator { + source_info: dummy_source_info(), + kind: TerminatorKind::Goto { target }, + }; + let block_data = BasicBlockData::new(Some(terminator)); + let second_block = patch.new_block(block_data); + + // deref the clone result + let rvalue = rvalue_reference_to_local(self.tcx, destination, true); + let ref_stmt = mir::StatementKind::Assign(box (to_process.stored_local.into(), rvalue)); + patch.add_statement( + mir::Location { + block: second_block, + statement_index: 0, + }, + ref_stmt, + ); + + let (new_block, _) = create_call_block( + self.tcx, + patch, + clone_defid, + clone_args, + substs, + Some(destination.into()), + Some(second_block), + )?; + + Ok(new_block) + } + } +} + +/// caller_block is calling an annotated function. `prepend_store` creates /// a new block (new_block), moves the call to the annotated function into /// the new block, adjusts the original block to call a store function and sets /// its target to this new block +#[allow(clippy::too_many_arguments)] fn prepend_store<'tcx>( tcx: TyCtxt<'tcx>, patcher: &mut MirPatch<'tcx>, @@ -352,11 +566,6 @@ fn prepend_store<'tcx>( old_dest_place: Place<'tcx>, ) -> BasicBlock { // get the bodies of the store and check function - let old_store_body = tcx - .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( - old_store_id.as_local().unwrap(), - )) - .borrow(); let new_block_data = BasicBlockData::new(Some(terminator)); let new_block = patcher.new_block(new_block_data); @@ -374,7 +583,7 @@ fn prepend_store<'tcx>( target: Some(new_block), cleanup: None, from_hir_call: false, - fn_span: old_store_body.span, + fn_span: DUMMY_SP, }; // the block that initially calls the check function, now calls the store // function @@ -382,14 +591,12 @@ fn prepend_store<'tcx>( new_block } -fn insert_pledge_call_chain<'tcx>( +fn create_pledge_call_chain<'tcx>( tcx: TyCtxt<'tcx>, - pledge: PledgeToProcess<'tcx>, - location: mir::Location, - body: &mut Body<'tcx>, -) -> Result<(), ()> { - let new_target: BasicBlock = split_block_at_location(body, location)?; - let mut patcher = MirPatch::new(body); + pledge: &PledgeToProcess<'tcx>, + target: BasicBlock, + patcher: &mut MirPatch<'tcx>, +) -> Result { // given a location, insert the call chain to check a pledge: // since we need to know the targets for each call, the blocks need to be created // in reversed order. @@ -401,15 +608,15 @@ fn insert_pledge_call_chain<'tcx>( check_args.push(Operand::Move(pledge.before_expiry_place)); let (check_after_block, _) = create_call_block( tcx, - &mut patcher, + patcher, pledge.check, check_args, pledge.substs, None, - Some(new_target), + Some(target), )?; - // If there is a check_before_expiry block, creat eit + // If there is a check_before_expiry block, creat it let next_target = if let Some(check_before_expiry) = pledge.check_before_expiry { let before_check_args = vec![ Operand::Move(pledge.destination), @@ -417,7 +624,7 @@ fn insert_pledge_call_chain<'tcx>( ]; let (new_block, _) = create_call_block( tcx, - &mut patcher, + patcher, check_before_expiry, before_check_args, pledge.substs, @@ -433,24 +640,18 @@ fn insert_pledge_call_chain<'tcx>( let args = vec![Operand::Move(pledge.destination)]; let (store_block, _) = create_call_block( tcx, - &mut patcher, + patcher, pledge.store_before_expiry, args, pledge.substs, Some(pledge.before_expiry_place), Some(next_target), )?; - // finally, point the first block to the store block: - let terminator_kind = mir::TerminatorKind::Goto { - target: store_block, - }; - // point the split-off block to the first block of this chain - patcher.patch_terminator(location.block, terminator_kind); - patcher.apply(body); - Ok(()) + Ok(store_block) } +#[allow(clippy::too_many_arguments)] fn surround_call_with_store_and_check<'tcx>( tcx: TyCtxt<'tcx>, patch: &mut MirPatch<'tcx>, @@ -461,29 +662,12 @@ fn surround_call_with_store_and_check<'tcx>( result_operand: Place<'tcx>, args: Vec>, substs: ty::subst::SubstsRef<'tcx>, - called_body: &Body, original_terminator: Terminator<'tcx>, ) -> (BasicBlock, Option) { - println!("Now inserting a runtime check for a postcondition"); - println!("Old store defid: {:?}", old_store_id); - - let check_body = tcx - .mir_drops_elaborated_and_const_checked(ty::WithOptConstParam::unknown( - check_id.as_local().unwrap(), - )) - .borrow(); - - // get the local index of the old_values argument to the - // check function (where it's already a reference to this - // tuple) - let old_values_check_arg = get_local_from_name(&check_body, "old_values".to_string()).unwrap(); // find the type of that local - let old_value_arg_ty = check_body.local_decls.get(old_values_check_arg).unwrap().ty; let old_ret_ty = fn_return_ty(tcx, old_store_id); let old_dest_place = Place::from(patch.new_internal(old_ret_ty, DUMMY_SP)); - println!("found old_values arg type: {:?}", old_value_arg_ty); - // construct arguments: first the arguments the function is called with, then the result of // that call, then the old values: let mut new_args = args.clone(); diff --git a/prusti/src/verifier.rs b/prusti/src/verifier.rs index 4271f65bf67..e01efbd8cf0 100644 --- a/prusti/src/verifier.rs +++ b/prusti/src/verifier.rs @@ -25,6 +25,7 @@ pub fn verify(env: Environment<'_>, def_spec: typed::DefSpecificationMap) { types, }; debug!("Verification task: {:?}", &verification_task); + println!("Verification task: {:?}", &verification_task); user::message(format!( "Verification of {} items...", From 823e7660e7390aef13b28db0035975e7e97b9b3d Mon Sep 17 00:00:00 2001 From: cedric Date: Tue, 11 Jul 2023 09:49:00 +0200 Subject: [PATCH 16/45] Working old checks in prusti_assume, assert etc. --- prusti/src/mir_helper.rs | 43 ++++- prusti/src/mir_info_collector.rs | 289 ++++++++++++++++++++----------- prusti/src/mir_modify.rs | 167 +++++++----------- 3 files changed, 292 insertions(+), 207 deletions(-) diff --git a/prusti/src/mir_helper.rs b/prusti/src/mir_helper.rs index 40fbd7f26fa..cc713edb0cf 100644 --- a/prusti/src/mir_helper.rs +++ b/prusti/src/mir_helper.rs @@ -1,11 +1,17 @@ +use either::Either; use prusti_rustc_interface::{ middle::{ - mir::{self, patch::MirPatch, Body, TerminatorKind, visit::Visitor}, + mir::{ + self, + patch::MirPatch, + visit::{MutVisitor, Visitor}, + Body, TerminatorKind, + }, ty::{self, TyCtxt}, }, span::{self, def_id::DefId, Span}, }; -use either::Either; +use rustc_hash::FxHashMap; /// Given the name of a variable in the original program, find the /// corresponding mir local @@ -87,7 +93,7 @@ pub fn rvalue_reference_to_local<'tcx>( mir::Rvalue::Ref( dummy_region, borrow_kind, - place, // the local to be dereferenced + place, // the local to be borrowed ) } @@ -344,3 +350,34 @@ pub fn replace_target(terminator: &mut mir::Terminator, new_target: mir::BasicBl } } +pub struct ArgumentReplacer<'a, 'tcx> { + tcx: TyCtxt<'tcx>, + args_to_replace: &'a FxHashMap, +} + +impl<'a, 'tcx> ArgumentReplacer<'a, 'tcx> { + pub fn new(tcx: TyCtxt<'tcx>, args_to_replace: &'a FxHashMap) -> Self { + Self { + tcx, + args_to_replace, + } + } +} + +impl<'tcx, 'a> MutVisitor<'tcx> for ArgumentReplacer<'a, 'tcx> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + + fn visit_local( + &mut self, + local: &mut mir::Local, + context: mir::visit::PlaceContext, + _location: mir::Location, + ) { + if let Some(replace) = self.args_to_replace.get(local) { + assert!(!matches!(context, mir::visit::PlaceContext::NonUse(_))); + *local = *replace; + } + } +} diff --git a/prusti/src/mir_info_collector.rs b/prusti/src/mir_info_collector.rs index 1e31f1c2084..5a3200c3e21 100644 --- a/prusti/src/mir_info_collector.rs +++ b/prusti/src/mir_info_collector.rs @@ -12,44 +12,51 @@ use prusti_rustc_interface::{ span::Span, }; use rustc_hash::{FxHashMap, FxHashSet}; +use std::hash::{Hash, Hasher}; pub struct MirInfo { - pub moved_args: FxHashMap, pub check_blocks: FxHashMap, + pub args_to_be_cloned: FxHashSet, + pub stmts_to_substitute_rhs: FxHashSet, } pub fn collect_mir_info<'tcx>(tcx: TyCtxt<'tcx>, body: mir::Body<'tcx>) -> MirInfo { let check_blocks = collect_check_blocks(tcx, &body); - let mut visitor = MirInfoCollector::new(body.clone()); + let mut visitor = MirInfoCollector::new(body.clone(), tcx); visitor.visit_body(&body); - println!("CHECK BLOCKS: {:#?}", &check_blocks); - // TODO: update after changes to resolving of old: + let (args_to_be_cloned, stmts_to_substitute_rhs) = visitor.process_dependencies(); MirInfo { - moved_args: Default::default(), check_blocks, + args_to_be_cloned, + stmts_to_substitute_rhs, } } // A MIR Visitor that collects information before we actually start modifying // the MIR. It's responsibilities are: -// - finding variables that are just copies / moves of arguments +// - finding function arguments that need to be cloned // - finding basic-blocks, that can contain old expressions that should be // resolved (check_only blocks) // - finding basic blocks, that contain an empty closure, referring to an // expiration location (when a user manually inserts `prusti_pledge_expires!()`) // or blocks that are dominated by this kind of block struct MirInfoCollector<'tcx> { - /// locals that are passed to old as arguments - old_args: FxHashSet, - /// dependencies between locals. - locals_dependencies: FxHashMap>, + tcx: TyCtxt<'tcx>, + /// a MIR visitor collecting some information about old calls, run + /// beforehand + old_visitor: OldVisitor<'tcx>, + /// dependencies between locals, for each local get a list of other locals + /// that it depends on + locals_dependencies: FxHashMap>, /// locations where we assign values to locals: assignment_locations: FxHashMap>, /// a body of the copy body: mir::Body<'tcx>, + /// the rvalue visitor, so we don't construct it for each assignment + rvalue_visitor: RvalueVisitor, } -#[derive(Clone, Debug)] +#[derive(Hash, Clone, Debug, PartialEq, Eq)] struct Dependency { local: mir::Local, is_user_declared: bool, @@ -57,26 +64,30 @@ struct Dependency { is_mutable_arg: bool, } - -/// This function has the specific purpose of finding the local variable that -/// contains the result of a pledge when processing a pledge_expires annotation. -/// it's always assigned to a local variable directly after the empty closure -fn first_variable_assignment(bb_data: &mir::BasicBlockData) -> Option { - for stmt in &bb_data.statements { - if let mir::StatementKind::Assign(box (_, mir::Rvalue::Use(mir::Operand::Move(place)))) = - stmt.kind - { - return Some(place.local); - } - } - None -} - impl<'tcx> Visitor<'tcx> for MirInfoCollector<'tcx> { fn visit_statement(&mut self, statement: &Statement<'tcx>, location: mir::Location) { self.super_statement(statement, location); match &statement.kind { StatementKind::Assign(box (recv, rvalue)) => { + // collect all locals contained in rvalue. + self.rvalue_visitor.visit_rvalue(rvalue, location); + // take the collected locals and reset visitor + let dependencies = + std::mem::replace(&mut self.rvalue_visitor.dependencies, Default::default()); + dependencies.iter().for_each(|local| { + let dep = self.create_dependency(*local); + if let Some(dependencies) = self.locals_dependencies.get_mut(&recv.local) { + dependencies.insert(dep); + } else { + let dependencies = [dep].iter().cloned().collect(); + self.locals_dependencies.insert(recv.local, dependencies); + } + if let Some(location_vec) = self.assignment_locations.get_mut(&recv.local) { + location_vec.push(location); + } else { + self.assignment_locations.insert(recv.local, vec![location]); + } + }); } _ => (), } @@ -84,16 +95,109 @@ impl<'tcx> Visitor<'tcx> for MirInfoCollector<'tcx> { fn visit_terminator(&mut self, terminator: &mir::Terminator<'tcx>, location: mir::Location) { self.super_terminator(terminator, location); + // find calls and their dependencies: + if let mir::TerminatorKind::Call { + args, destination, .. + } = &terminator.kind + { + args.into_iter().for_each(|arg| { + if let mir::Operand::Move(place) | mir::Operand::Copy(place) = arg { + let dep = self.create_dependency(place.local); + if let Some(dependencies) = self.locals_dependencies.get_mut(&destination.local) + { + dependencies.insert(dep); + } else { + let mut dependencies = FxHashSet::default(); + dependencies.insert(dep); + self.locals_dependencies + .insert(destination.local, dependencies); + }; + if let Some(location_vec) = + self.assignment_locations.get_mut(&destination.local) + { + location_vec.push(location); + } else { + let location_vec = vec![location]; + self.assignment_locations + .insert(destination.local, location_vec); + }; + } + }); + } } } impl<'tcx> MirInfoCollector<'tcx> { - pub(crate) fn new(body: mir::Body<'tcx>) -> Self { + pub(crate) fn new(body: mir::Body<'tcx>, tcx: TyCtxt<'tcx>) -> Self { + let mut old_visitor = OldVisitor::new(tcx); + old_visitor.visit_body(&body); Self { - old_args: Default::default(), + tcx, + old_visitor, locals_dependencies: Default::default(), assignment_locations: Default::default(), body, + rvalue_visitor: RvalueVisitor { + dependencies: Default::default(), + }, + } + } + + // Given the dependencies, figure out which arguments we need to clone + // and which statements will need to be adjusted + pub fn process_dependencies(&self) -> (FxHashSet, FxHashSet){ + let mut args_to_clone = FxHashSet::::default(); + let mut stmts_to_adjust = FxHashSet::::default(); + let mut encountered = FxHashSet::::default(); + // travers the dependency graph starting at old arguments, stopping + // at user defined variables defined outside of old, looking for + // dependencies on mutable function arguments + for old_arg in self.old_visitor.old_args.iter() { + // we put locals in here that are dependencies of old arguments and + // that are not user defined + let mut to_process = vec![*old_arg]; + while !to_process.is_empty() { + let local = to_process.pop().unwrap(); + let deps = self.locals_dependencies.get(&local).unwrap(); + let assignment_locations = self.assignment_locations.get(&local).unwrap(); + let mut depends_on_argument = false; + deps.iter().for_each(|dep| { + if dep.is_mutable_arg { + args_to_clone.insert(dep.local); + depends_on_argument = true; + } else if !dep.is_user_declared || dep.declared_within_old { + if !encountered.contains(&dep.local) { + // process this variable too! + to_process.push(dep.local); + encountered.insert(dep.local); + } + } + }); + if depends_on_argument { + // we potentially have to replace function arguments with cloned + // values in the places these locals are assigned to + assignment_locations.iter().for_each(|location| {stmts_to_adjust.insert(*location);}); + } + } + } + (args_to_clone, stmts_to_adjust) + + } + // determine all the relevant facts about this local + fn create_dependency(&self, local: mir::Local) -> Dependency { + let local_decl = self.body.local_decls.get(local).unwrap(); + let is_user_declared = local_decl.is_user_variable(); + let declared_within_old = self + .old_visitor + .old_spans + .iter() + .any(|old_span| old_span.contains(local_decl.source_info.span)); + let is_mutable_arg = is_mutable_arg(&self.body, local); + Dependency { + local, + is_user_declared, + declared_within_old, + is_mutable_arg, } } } @@ -127,6 +231,20 @@ pub fn collect_check_blocks<'tcx>( check_blocks } +/// This function has the specific purpose of finding the local variable that +/// contains the result of a pledge when processing a pledge_expires annotation. +/// it's always assigned to a local variable directly after the empty closure +fn first_variable_assignment(bb_data: &mir::BasicBlockData) -> Option { + for stmt in &bb_data.statements { + if let mir::StatementKind::Assign(box (_, mir::Rvalue::Use(mir::Operand::Move(place)))) = + stmt.kind + { + return Some(place.local); + } + } + None +} + #[derive(Clone, Copy, Debug)] pub enum CheckBlockKind { /// comes from either assume, assert or bodyinvariant @@ -152,7 +270,6 @@ impl CheckBlockKind { if has_prusti_attr(attrs, "expiration_location") { // there needs to be a single assignment let pledge_target = first_variable_assignment(bb_data).unwrap(); - return Some(Self::PledgeExpires(pledge_target)); } else if has_prusti_attr(attrs, "runtime_assertion") { return Some(Self::RuntimeAssertion); @@ -164,36 +281,6 @@ impl CheckBlockKind { } } -// Given a local variable, find all statements or terminators that assign to it. -pub fn find_local_dependencies<'tcx>( - local: mir::Local, - body: &mir::Body<'tcx>, -) -> Vec { - let mut locations = Vec::new(); - for (bb, bb_data) in body.basic_blocks.iter_enumerated() { - // check terminator: - if let mir::TerminatorKind::Call { destination, .. } = bb_data.terminator().kind { - if destination.local == local { - locations.push(mir::Location { - block: bb, - statement_index: bb_data.statements.len(), - }) - } - } - for (index, stmt) in bb_data.statements.iter().enumerate() { - if let mir::StatementKind::Assign(box (place, rvalue)) = &stmt.kind { - if place.local == local { - locations.push(mir::Location { - block: bb, - statement_index: index, - }); - } - } - } - } - locations -} - struct RvalueVisitor { pub dependencies: Vec, } @@ -209,51 +296,47 @@ impl<'tcx> Visitor<'tcx> for RvalueVisitor { } } -// find locals that are used to compute the rhs of an assignment -// pub fn find_stmt_dependencies<'tcx>(stmt: Either<&mir::Statement<'tcx>, &mir::Terminator<'tcx>>, location: mir::Location) -> Vec { -// let mut visitor = RvalueVisitor { -// dependencies: Vec::new(), -// }; -// match stmt { -// Either::Left(stmt) => { -// if let mir::StatementKind::Assign(box (_, rvalue)) = &stmt.kind { -// visitor.visit_rvalue(rvalue, location); -// } -// }, -// Either::Right(term) => { -// if let mir::TerminatorKind::Call { args, .. } = &term.kind { -// for arg in args { -// visitor.visit_operand(arg, location); -// } -// } -// } -// } -// visitor.dependencies -// } +struct OldVisitor<'tcx> { + tcx: TyCtxt<'tcx>, + old_spans: Vec, + old_args: FxHashSet, +} -// Given the span of the old call, figure if a local is user declared, and also -// whether it was declared outside of the old call. -// Example: we want to differentiate old({let a = b, old(a)}) from -// {let a = b; old(a)}, since, if b is an argument, for the first one we actually -// want the old state of a (on function entry), but not for the second one. -pub fn local_user_declared_outside_old<'tcx>( - old_span: Span, - body: &mir::Body<'tcx>, - local: mir::Local, -) -> bool { - let local_decl = body.local_decls.get(local).unwrap(); - if local_decl.is_user_variable() { - old_span.contains(local_decl.source_info.span) - } else { - false +// spans of old calls need to be resolved first, so we can determine +// whether locals are defined inside them later. +impl<'tcx> Visitor<'tcx> for OldVisitor<'tcx> { + fn visit_terminator(&mut self, terminator: &mir::Terminator<'tcx>, location: mir::Location) { + self.super_terminator(terminator, location); + if let mir::TerminatorKind::Call { + func, + args, + fn_span, + .. + } = &terminator.kind + { + if let Some((call_id, substs)) = func.const_fn_def() { + let item_name = self.tcx.def_path_str(call_id); + if &item_name[..] == "prusti_contracts::old" { + println!("old visitor found old function call"); + self.old_spans.push(*fn_span); + assert!(args.len() == 1); + if let mir::Operand::Copy(place) | mir::Operand::Move(place) = + args.get(0).unwrap() + { + self.old_args.insert(place.local); + } + } + } + } } } -// pub fn find_arg_dependencies<'tcx>(local: mir::Local, body: &mir::Body<'tcx>) -> Vec<(mir::Local, mir::Local)> { -// // find locations where we assign to this local -// let def_locations = find_assignments(local, body); -// for loc in def_locations{ -// let stmt = body.stmt_at(loc); -// find_stmt_dependencies(stmt, loc); -// } -// } +impl<'tcx> OldVisitor<'tcx> { + pub fn new(tcx: TyCtxt<'tcx>) -> Self { + OldVisitor { + old_spans: Default::default(), + old_args: Default::default(), + tcx, + } + } +} diff --git a/prusti/src/mir_modify.rs b/prusti/src/mir_modify.rs index 9a333e2e23a..2db9d14f142 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/mir_modify.rs @@ -109,10 +109,10 @@ pub struct InsertChecksVisitor<'tcx> { expiration_locations: FxHashMap>, current_patcher: Option>, pledges_to_process: FxHashMap>, - old_calls_to_process: Vec>, current_def_id: Option, body_copy: Body<'tcx>, - stored_arguments: FxHashSet, + // maps from function arguments to their copies in old state + stored_arguments: FxHashMap, mir_info: MirInfo, env_query: EnvQuery<'tcx>, } @@ -131,11 +131,10 @@ impl<'tcx> InsertChecksVisitor<'tcx> { specs, current_patcher: None, pledges_to_process: Default::default(), - old_calls_to_process: Vec::new(), expiration_locations, current_def_id: None, body_copy, - stored_arguments: FxHashSet::default(), + stored_arguments: Default::default(), mir_info, env_query, } @@ -151,6 +150,10 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { // visit body, apply patches, possibly find pledges that need to be processed here: let def_id = body.source.def_id(); self.current_def_id = Some(def_id); + + // create locals for the clones of old, and replace them where needed + self.create_and_replace_arguments(body); + self.current_patcher = Some(MirPatch::new(body)); self.super_body(body); let mir_patch = self.current_patcher.take(); @@ -179,17 +182,24 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { // currently points to, so we can keep prepending new blocks let mut current_target = prepend_dummy_block(body); - self.old_calls_to_process.iter().for_each(|to_process| { - let mut patch = MirPatch::new(body); - current_target = self - .process_old_call(*to_process, current_target, &mut patch) - .unwrap(); - let terminator_kind = TerminatorKind::Goto { - target: current_target, - }; - patch.patch_terminator(mir::START_BLOCK, terminator_kind); - patch.apply(body); - }); + self.mir_info + .args_to_be_cloned + .clone() + .iter() + .for_each(|local| { + let mut patch = MirPatch::new(body); + current_target = self + .insert_clone_argument(*local, current_target, &mut patch) + .unwrap(); + let terminator_kind = TerminatorKind::Goto { + target: current_target, + }; + patch.patch_terminator(mir::START_BLOCK, terminator_kind); + patch.apply(body); + }); + + // replace function arguments with their copies in all the locations + // that we identified earlier: // insert preconditions at the beginning of the body: let substs = ty::subst::InternalSubsts::identity_for_item(self.tcx, def_id); @@ -296,30 +306,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { let item_name = self.tcx.def_path_str(call_id); // make sure the call is local: if !call_id.is_local() { - // extern specs will need to be handled here. - - if item_name == "prusti_contracts::old".to_string() { - // old calls can still exist here. Find them, replace - // with new locals - println!("found old call!"); - let to_process_opt = self - .handle_old_call(destination.local, args.clone()) - .unwrap(); - if let Some(to_process) = to_process_opt { - self.old_calls_to_process.push(to_process); - // in this case we also need to replace the old call - let new_terminator_kind = mir::TerminatorKind::Goto { - // target can only be none if the call diverges - // TODO: discuss if this can ever happen here. - // I don't think it should.. - target: target.unwrap(), - }; - let mut patch = self.current_patcher.take().unwrap(); - patch.patch_terminator(block, new_terminator_kind); - self.current_patcher = Some(patch); - } - return; - } + // extern specs preconditions will need to be handled here. } // The block that is executed after the annotated function @@ -412,57 +399,9 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } impl<'tcx> InsertChecksVisitor<'tcx> { - /// If we encounter an old call with an argument that is also a mutable - /// argument of the original function, we need to replace it with a cloned - /// value! - /// If it's a reference, cloning it will dereference it, so we need an - /// additional local! - /// Returns Ok(None) if nothing went wrong, but there is no modification - /// to be processed - fn handle_old_call( + fn insert_clone_argument( &mut self, - receiver: mir::Local, - args: Vec>, - ) -> Result>, ()> { - // check if the argument given to old is a mutable argument: - // (if interior mutability is supported in the future, this might have - // to be extended, since even immutable references would have to be - // "cloned", even though normal cloning is not enough anymore then.) - // the argument should always be a single local: - assert!(args.len() == 1, "old was given more than one argument??"); - let old_argument = local_from_operand(&args[0])?; - // argument locals are never passed directly to the function, - // so we have to look up if this argument to old is a copy / move - // of a function argument. - if let Some(original_argument) = self.mir_info.moved_args.get(&old_argument) { - println!("found a copy of a function argument!"); - // also check that we have not yet created a variable storing this local - if self.stored_arguments.get(original_argument).is_some() { - return Ok(None); - } else { - self.stored_arguments.insert(*original_argument); - } - - // this is already checked during creationg of moved_arguments - // if is_mutable_arg(&self.body_copy, original_argument) { - // println!("We have to store an old_arg!"); - // } - - let arg_ty = get_locals_type(&self.body_copy, *original_argument)?; - Ok(Some(OldCallToProcess { - stored_local: receiver, - arg_to_store: *original_argument, - ty: arg_ty, - })) - } else { - // this is not a local we need to store! - Ok(None) - } - } - - fn process_old_call( - &self, - to_process: OldCallToProcess<'tcx>, + arg: mir::Local, target: BasicBlock, patch: &mut MirPatch<'tcx>, ) -> Result { @@ -471,18 +410,22 @@ impl<'tcx> InsertChecksVisitor<'tcx> { // function. let clone_defid = get_clone_defid(self.tcx).ok_or(())?; let clone_trait_defid = self.tcx.lang_items().clone_trait().unwrap(); - if !to_process.ty.is_ref() { + let local_decl = self.body_copy.local_decls.get(arg).unwrap(); + let arg_ty = local_decl.ty; + let destination = *self.stored_arguments.get(&arg).unwrap(); + println!("trying to clone arg: {:?} into destination: {:?}", arg, destination); + if !arg_ty.is_ref() { println!("handling a non-ref old arg"); - let ref_ty = create_reference_type(self.tcx, to_process.ty); + let ref_ty = create_reference_type(self.tcx, arg_ty); let ref_arg = patch.new_internal(ref_ty, DUMMY_SP); // add a statement to deref the old_argument - let rvalue = rvalue_reference_to_local(self.tcx, to_process.arg_to_store, false); + let rvalue = rvalue_reference_to_local(self.tcx, arg, false); // the statement to be added to the block that has the call clone // terminator let ref_stmt = mir::StatementKind::Assign(box (mir::Place::from(ref_arg), rvalue)); // create the substitution since clone is generic: - let generic_ty = ty::subst::GenericArg::from(to_process.ty); + let generic_ty = ty::subst::GenericArg::from(arg_ty); let substs = self.tcx.mk_substs(&[generic_ty]); // create the function operand: let clone_args = vec![Operand::Move(mir::Place::from(ref_arg))]; @@ -493,7 +436,7 @@ impl<'tcx> InsertChecksVisitor<'tcx> { clone_defid, clone_args, substs, - Some(to_process.stored_local.into()), + Some(destination.into()), Some(target), )?; patch.add_statement( @@ -508,12 +451,12 @@ impl<'tcx> InsertChecksVisitor<'tcx> { // let block_data = BasicBlockData::new() } else { // create a new local to store the result of clone: - let deref_ty = to_process.ty.builtin_deref(false).ok_or(())?.ty; + let deref_ty = arg_ty.builtin_deref(false).ok_or(())?.ty; println!("dereferenced type: {:?}", deref_ty); - let destination = patch.new_internal(deref_ty, DUMMY_SP); + let clone_dest = patch.new_internal(deref_ty, DUMMY_SP); let generic_ty = ty::subst::GenericArg::from(deref_ty); let substs = self.tcx.mk_substs(&[generic_ty]); - let clone_args = vec![Operand::Move(mir::Place::from(to_process.arg_to_store))]; + let clone_args = vec![Operand::Move(mir::Place::from(arg))]; // add an additional simple block afterwards, that dereferences // the the cloned value into the original receiver of old: // create it beforehand, so we can set the precedors target correctly @@ -524,9 +467,9 @@ impl<'tcx> InsertChecksVisitor<'tcx> { let block_data = BasicBlockData::new(Some(terminator)); let second_block = patch.new_block(block_data); - // deref the clone result - let rvalue = rvalue_reference_to_local(self.tcx, destination, true); - let ref_stmt = mir::StatementKind::Assign(box (to_process.stored_local.into(), rvalue)); + // borrow the clone result + let rvalue = rvalue_reference_to_local(self.tcx, clone_dest, true); + let ref_stmt = mir::StatementKind::Assign(box (destination.into(), rvalue)); patch.add_statement( mir::Location { block: second_block, @@ -541,13 +484,35 @@ impl<'tcx> InsertChecksVisitor<'tcx> { clone_defid, clone_args, substs, - Some(destination.into()), + Some(clone_dest.into()), Some(second_block), )?; Ok(new_block) } } + + pub fn create_and_replace_arguments(&mut self, body: &mut Body<'tcx>) { + let mut patcher = MirPatch::new(body); + for arg in &self.mir_info.args_to_be_cloned { + let ty = body.local_decls.get(*arg).unwrap().ty; + let new_var = patcher.new_internal(ty, DUMMY_SP); + self.stored_arguments.insert(*arg, new_var); + } + let mut replacer = ArgumentReplacer::new(self.tcx, &self.stored_arguments); + for (block, bb_data) in body.basic_blocks_mut().iter_enumerated_mut() { + for (statement_index, stmt) in bb_data.statements.iter_mut().enumerate() { + let loc = mir::Location { + block, + statement_index, + }; + if self.mir_info.stmts_to_substitute_rhs.contains(&loc) { + replacer.visit_statement(stmt, loc); + } + } + } + patcher.apply(body); + } } /// caller_block is calling an annotated function. `prepend_store` creates From 107ef3b80e4150f86289ecc9d6f05be63a378675 Mon Sep 17 00:00:00 2001 From: cedric Date: Wed, 12 Jul 2023 12:47:10 +0200 Subject: [PATCH 17/45] Re-organized runtime check structure a bit, remove warnings --- Cargo.lock | 298 ++++++++++++++++-- .../src/runtime_checks/translation.rs | 62 ++-- prusti-interface/src/specs/mod.rs | 5 +- prusti-tests/Cargo.toml | 3 + prusti/Cargo.toml | 1 - prusti/src/callbacks.rs | 14 +- prusti/src/driver.rs | 6 +- prusti/src/{ => modify_mir}/mir_helper.rs | 90 +----- .../{ => modify_mir}/mir_info_collector.rs | 83 +++-- prusti/src/{ => modify_mir}/mir_modify.rs | 130 +++----- prusti/src/modify_mir/mod.rs | 7 + prusti/src/verifier.rs | 5 - 12 files changed, 424 insertions(+), 280 deletions(-) rename prusti/src/{ => modify_mir}/mir_helper.rs (75%) rename prusti/src/{ => modify_mir}/mir_info_collector.rs (84%) rename prusti/src/{ => modify_mir}/mir_modify.rs (85%) create mode 100644 prusti/src/modify_mir/mod.rs diff --git a/Cargo.lock b/Cargo.lock index 74be8bd940b..4ba728e5230 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -319,6 +319,17 @@ dependencies = [ "futures-lite", ] +[[package]] +name = "bstr" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +dependencies = [ + "memchr", + "regex-automata 0.3.2", + "serde", +] + [[package]] name = "buf_redux" version = "0.8.4" @@ -347,6 +358,24 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +[[package]] +name = "camino" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" +dependencies = [ + "serde", +] + [[package]] name = "cargo-test-macro" version = "0.1.0" @@ -396,6 +425,20 @@ dependencies = [ "winapi", ] +[[package]] +name = "cargo_metadata" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.0.79" @@ -487,6 +530,44 @@ dependencies = [ "termcolor", ] +[[package]] +name = "color-eyre" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + +[[package]] +name = "colored" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" +dependencies = [ + "is-terminal", + "lazy_static", + "windows-sys 0.48.0", +] + [[package]] name = "combine" version = "4.6.6" @@ -908,6 +989,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "errno-dragonfly" version = "0.1.2" @@ -934,6 +1026,16 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "eyre" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "failure" version = "0.1.8" @@ -973,7 +1075,7 @@ checksum = "8a3de6e8d11b22ff9edc6d916f890800597d60f8b2da1caf2955c274638d6412" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "windows-sys 0.45.0", ] @@ -1407,6 +1509,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "index_vec" version = "0.1.3" @@ -1437,12 +1545,13 @@ dependencies = [ [[package]] name = "io-lifetimes" -version = "1.0.6" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfa919a82ea574332e2de6e74b4c36e74d41982b335080fa59d4ef31be20fdf3" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ + "hermit-abi 0.3.1", "libc", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] @@ -1459,7 +1568,7 @@ checksum = "21b6b32576413a8e69b90e952e4a026476040d81017b80445deda5f2d3921857" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", - "rustix", + "rustix 0.36.9", "windows-sys 0.45.0", ] @@ -1565,9 +1674,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.140" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99227334921fae1a979cf0bfdfcc6b3e5ce376ef57e16fb6fb3ea2ed6095f80c" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libgit2-sys" @@ -1630,6 +1739,12 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + [[package]] name = "log" version = "0.4.17" @@ -1646,7 +1761,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "regex-automata", + "regex-automata 0.1.10", ] [[package]] @@ -1935,6 +2050,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + [[package]] name = "parking" version = "2.0.0" @@ -2104,7 +2225,6 @@ name = "prusti" version = "0.2.2" dependencies = [ "chrono", - "either", "env_logger", "lazy_static", "log", @@ -2231,6 +2351,9 @@ dependencies = [ "prusti", "prusti-launch", "prusti-server", + "prusti-utils", + "tempfile", + "ui_test", "ureq", ] @@ -2353,6 +2476,15 @@ dependencies = [ "bitflags", ] +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_users" version = "0.4.3" @@ -2360,7 +2492,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", - "redox_syscall", + "redox_syscall 0.2.16", "thiserror", ] @@ -2384,6 +2516,12 @@ dependencies = [ "regex-syntax", ] +[[package]] +name = "regex-automata" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d3daa6976cffb758ec878f108ba0e062a45b2d6ca3a2cca965338855476caf" + [[package]] name = "regex-syntax" version = "0.6.28" @@ -2527,13 +2665,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd5c6ff11fecd55b40746d1995a02f2eb375bf8c00d192d521ee09f42bef37bc" dependencies = [ "bitflags", - "errno", + "errno 0.2.8", "io-lifetimes", "libc", - "linux-raw-sys", + "linux-raw-sys 0.1.4", "windows-sys 0.45.0", ] +[[package]] +name = "rustix" +version = "0.37.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" +dependencies = [ + "bitflags", + "errno 0.3.1", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + [[package]] name = "rustls" version = "0.20.8" @@ -2689,6 +2841,9 @@ name = "semver" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" +dependencies = [ + "serde", +] [[package]] name = "serde" @@ -2939,15 +3094,16 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.4.0" +version = "3.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af18f7ae1acd354b992402e9ec5864359d693cd8a79dcbef59f76891701c1e95" +checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" dependencies = [ + "autocfg", "cfg-if", "fastrand", - "redox_syscall", - "rustix", - "windows-sys 0.42.0", + "redox_syscall 0.3.5", + "rustix 0.37.23", + "windows-sys 0.48.0", ] [[package]] @@ -3227,6 +3383,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing 0.1.37", + "tracing-subscriber", +] + [[package]] name = "tracing-log" version = "0.1.3" @@ -3302,6 +3468,28 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e79c4d996edb816c91e4308506774452e55e95c3c9de07b6729e17e15a5ef81" +[[package]] +name = "ui_test" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c21899b59f53717dfad29e4f46e5b21a200a1b6888ab86532a07cfc8b48dd78c" +dependencies = [ + "bstr", + "cargo-platform", + "cargo_metadata", + "color-eyre", + "colored", + "crossbeam-channel", + "diff", + "lazy_static", + "regex", + "rustc_version", + "rustfix", + "serde", + "serde_json", + "tempfile", +] + [[package]] name = "unicase" version = "2.6.0" @@ -3710,12 +3898,12 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.1", "windows_aarch64_msvc 0.42.1", "windows_i686_gnu 0.42.1", "windows_i686_msvc 0.42.1", "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.1", "windows_x86_64_msvc 0.42.1", ] @@ -3725,7 +3913,16 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.1", ] [[package]] @@ -3734,21 +3931,42 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e2522491fbfcd58cc84d47aeb2958948c4b8982e9a2d8a2a35bbaed431390e7" dependencies = [ - "windows_aarch64_gnullvm", + "windows_aarch64_gnullvm 0.42.1", "windows_aarch64_msvc 0.42.1", "windows_i686_gnu 0.42.1", "windows_i686_msvc 0.42.1", "windows_x86_64_gnu 0.42.1", - "windows_x86_64_gnullvm", + "windows_x86_64_gnullvm 0.42.1", "windows_x86_64_msvc 0.42.1", ] +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + [[package]] name = "windows_aarch64_msvc" version = "0.36.1" @@ -3761,6 +3979,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + [[package]] name = "windows_i686_gnu" version = "0.36.1" @@ -3773,6 +3997,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + [[package]] name = "windows_i686_msvc" version = "0.36.1" @@ -3785,6 +4015,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + [[package]] name = "windows_x86_64_gnu" version = "0.36.1" @@ -3797,12 +4033,24 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + [[package]] name = "windows_x86_64_msvc" version = "0.36.1" @@ -3815,6 +4063,12 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + [[package]] name = "winnow" version = "0.3.5" diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index a8445293c37..8a724322ac1 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -488,42 +488,40 @@ impl VisitMut for CheckVisitor { if self.check_type.is_closure() && self.within_old { // let tokens = parse_quote! {old(#expr)}; // *expr = tokens; - } else { - if let Some(arg) = self.inputs.get_mut(&name) { - // argument used within an old expression? - // not already marked as used in old? - if self.check_type.has_old_tuple() && (self.within_old || !arg.is_ref) { - // if it was not already marked to be stored - // needs to be checked for indeces to be correct - if !arg.used_in_old { - println!("Marking variable {} to be stored", arg.name); - arg.used_in_old = true; - arg.old_store_index = self.highest_old_index; - self.highest_old_index += 1; - } - // replace the identifier with the correct field access - let index_token: TokenStream = - arg.old_store_index.to_string().parse().unwrap(); - let tokens = if arg.is_ref { - // cloning will deref the value.. - quote! {(&old_values.#index_token)} - } else { - // unfortunately it could still be a reference.. - // no real solution at this level - quote! {(old_values.#index_token)} - }; - println!("tokens: {}", tokens); - let new_path: syn::Expr = syn::parse2(tokens).unwrap(); - *expr = new_path; + } else if let Some(arg) = self.inputs.get_mut(&name) { + // argument used within an old expression? + // not already marked as used in old? + if self.check_type.has_old_tuple() && (self.within_old || !arg.is_ref) { + // if it was not already marked to be stored + // needs to be checked for indeces to be correct + if !arg.used_in_old { + println!("Marking variable {} to be stored", arg.name); + arg.used_in_old = true; + arg.old_store_index = self.highest_old_index; + self.highest_old_index += 1; } - } else if self.within_before_expiry && name == *"result" { - let new_path: syn::Expr = parse_quote! { - (&result_before_expiry) + // replace the identifier with the correct field access + let index_token: TokenStream = + arg.old_store_index.to_string().parse().unwrap(); + let tokens = if arg.is_ref { + // cloning will deref the value.. + quote! {(&old_values.#index_token)} + } else { + // unfortunately it could still be a reference.. + // no real solution at this level + quote! {(old_values.#index_token)} }; + println!("tokens: {}", tokens); + let new_path: syn::Expr = syn::parse2(tokens).unwrap(); *expr = new_path; - } else { - println!("identifier {} was not found in args\n\n", name); } + } else if self.within_before_expiry && name == *"result" { + let new_path: syn::Expr = parse_quote! { + (&result_before_expiry) + }; + *expr = new_path; + } else { + println!("identifier {} was not found in args\n\n", name); } } } diff --git a/prusti-interface/src/specs/mod.rs b/prusti-interface/src/specs/mod.rs index f645f72e490..4cdf4a70aba 100644 --- a/prusti-interface/src/specs/mod.rs +++ b/prusti-interface/src/specs/mod.rs @@ -180,13 +180,12 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { .get(rhs) .unwrap() .to_def_id(); - let res = typed::CheckKind::Pledge { + typed::CheckKind::Pledge { check, old_store, check_before_expiry, store_before_expiry, - }; - res + } } // Todo: Pledges, Assume? _ => unreachable!(), diff --git a/prusti-tests/Cargo.toml b/prusti-tests/Cargo.toml index 568cca9184b..0ed1d53974d 100644 --- a/prusti-tests/Cargo.toml +++ b/prusti-tests/Cargo.toml @@ -9,10 +9,13 @@ compiletest_rs = "0.9" prusti-server = { path = "../prusti-server" } prusti-launch = { path = "../prusti-launch", artifact = "bin" } prusti = { path = "../prusti", artifact = "bin" } +prusti-utils = { path = "../prusti-utils"} cargo-test-support = { git = "https://github.com/rust-lang/cargo.git", rev = "17f8088" } ureq = "2.1" log = { version = "0.4", features = ["release_max_level_info"] } env_logger = "0.10" +ui_test = "0.11.7" +tempfile = "3.6.0" [package.metadata.rust-analyzer] # This crate uses #[feature(rustc_private)] diff --git a/prusti/Cargo.toml b/prusti/Cargo.toml index ebbfeddd6eb..3b5aad18817 100644 --- a/prusti/Cargo.toml +++ b/prusti/Cargo.toml @@ -21,7 +21,6 @@ lazy_static = "1.4.0" tracing = { path = "../tracing" } tracing-subscriber = { version = "0.3", features = ["env-filter"] } tracing-chrome = "0.7" -either = "1.8.1" rustc-hash = "1.1.0" [build-dependencies] diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index 973595d5df8..b518db43015 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -1,4 +1,4 @@ -use crate::{mir_modify, verifier::verify}; +use crate::{modify_mir, verifier::verify}; use prusti_common::config; use prusti_interface::{ @@ -10,9 +10,9 @@ use prusti_rustc_interface::{ hir::{def::DefKind, def_id::LocalDefId}, interface::{interface::Compiler, Config, Queries}, middle::ty::{ - self, - query::{query_values::mir_borrowck, ExternProviders, Providers}, - TyCtxt, + self, + query::{query_values::mir_borrowck, ExternProviders, Providers}, + TyCtxt, }, session::Session, }; @@ -20,7 +20,6 @@ use prusti_rustc_interface::{ #[derive(Default)] pub struct PrustiCompilerCalls; - // Running `get_body_with_borrowck_facts` can be very slow, therefore we avoid it when not // necessary; for crates which won't be verified or spec_fns it suffices to load just the fn body @@ -61,7 +60,7 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { config.override_queries = Some( |_session: &Session, providers: &mut Providers, _external: &mut ExternProviders| { providers.mir_borrowck = mir_borrowck; - providers.mir_drops_elaborated_and_const_checked = mir_modify::mir_checked; + providers.mir_drops_elaborated_and_const_checked = modify_mir::mir_modify::mir_checked; // providers.mir_built = mir_modify::mir_built; }, ); @@ -153,7 +152,7 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { verify(env, def_spec.clone()); } unsafe { - mir_modify::SPECS = Some(def_spec); + modify_mir::SPECS = Some(def_spec); } }); @@ -165,4 +164,3 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { } } } - diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index 6ab1600a176..b7da6f64226 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -14,10 +14,8 @@ mod arg_value; mod callbacks; mod verifier; -// move these 2 at some point -mod mir_modify; -mod mir_helper; -mod mir_info_collector; + +mod modify_mir; use arg_value::arg_value; use callbacks::PrustiCompilerCalls; diff --git a/prusti/src/mir_helper.rs b/prusti/src/modify_mir/mir_helper.rs similarity index 75% rename from prusti/src/mir_helper.rs rename to prusti/src/modify_mir/mir_helper.rs index cc713edb0cf..ad115c39aeb 100644 --- a/prusti/src/mir_helper.rs +++ b/prusti/src/modify_mir/mir_helper.rs @@ -1,15 +1,14 @@ -use either::Either; use prusti_rustc_interface::{ middle::{ mir::{ self, patch::MirPatch, - visit::{MutVisitor, Visitor}, + visit::{MutVisitor}, Body, TerminatorKind, }, ty::{self, TyCtxt}, }, - span::{self, def_id::DefId, Span}, + span::{self, def_id::DefId}, }; use rustc_hash::FxHashMap; @@ -28,37 +27,19 @@ use rustc_hash::FxHashMap; // } /// Check whether this variable is mutable, or a mutable reference -pub fn is_mutable_arg<'tcx>(body: &Body<'tcx>, local: mir::Local) -> bool { +pub fn is_mutable_arg(body: &Body<'_>, local: mir::Local) -> bool { let args: Vec = body.args_iter().collect(); if args.contains(&local) { let local_decl = body.local_decls.get(local).unwrap(); - match local_decl.mutability { - mir::Mutability::Mut => return true, - _ => (), - } - match local_decl.ty.ref_mutability() { - Some(mir::Mutability::Mut) => true, - _ => false, + if local_decl.mutability == mir::Mutability::Mut { + return true; } + matches!(local_decl.ty.ref_mutability(), Some(mir::Mutability::Mut)) } else { false } } -pub fn get_locals_type<'tcx>(body: &Body<'tcx>, local: mir::Local) -> Result, ()> { - Ok(body.local_decls.get(local).ok_or(())?.ty) -} - -pub fn local_from_operand<'tcx>(operand: &mir::Operand<'tcx>) -> Result { - match operand { - mir::Operand::Copy(place) | mir::Operand::Move(place) => { - println!("Projections: {:#?}", place.projection); - Ok(place.local) - } - _ => return Err(()), - } -} - pub fn fn_return_ty(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Ty<'_> { let fn_sig = tcx.fn_sig(def_id).subst_identity(); fn_sig.output().skip_binder() @@ -71,16 +52,16 @@ pub fn dummy_source_info() -> mir::SourceInfo { } } -pub fn dummy_region<'tcx>(tcx: TyCtxt<'tcx>) -> ty::Region<'tcx> { +pub fn dummy_region(tcx: TyCtxt<'_>) -> ty::Region<'_> { let kind = ty::RegionKind::ReErased; tcx.mk_region_from_kind(kind) } -pub fn rvalue_reference_to_local<'tcx>( - tcx: TyCtxt<'tcx>, +pub fn rvalue_reference_to_local( + tcx: TyCtxt<'_>, local: mir::Local, mutable: bool, -) -> mir::Rvalue<'tcx> { +) -> mir::Rvalue<'_> { let place = mir::Place::from(local); let dummy_region = dummy_region(tcx); let borrow_kind = if mutable { @@ -109,7 +90,7 @@ pub fn create_reference_type<'tcx>(tcx: TyCtxt<'tcx>, ty: ty::Ty<'tcx>) -> ty::T ) } -pub fn get_clone_defid<'tcx>(tcx: TyCtxt<'tcx>) -> Option { +pub fn get_clone_defid(tcx: TyCtxt<'_>) -> Option { let trait_defid = tcx.lang_items().clone_trait()?; tcx.associated_items(trait_defid) .find_by_name_and_kind( @@ -210,55 +191,6 @@ pub fn create_call_block<'tcx>( Ok((new_block_id, destination)) } -/// Creates one new block, moves all instructions following the passed location -/// and the terminator to the new block, and changes the current terminator -/// to point to this new block. If successful, returns index of the new block -pub fn split_block_at_location( - body: &mut mir::Body<'_>, - location: mir::Location, -) -> Result { - // check validity of the location: - let mut patch = MirPatch::new(body); - let block1: &mut mir::BasicBlockData = - body.basic_blocks_mut().get_mut(location.block).ok_or(())?; - - let nr_instructions = block1.statements.len(); - // check if the given location is valid - if nr_instructions <= location.statement_index { - return Err(()); - } - // the statements that stay in the first block - let stmts1: Vec = block1.statements[0..=location.statement_index].to_vec(); - - let stmts2: Vec = if location.statement_index + 1 < nr_instructions { - // location is not the last instruction of the block - block1.statements[location.statement_index + 1..].to_vec() - } else { - vec![] - }; - - let new_block_data = mir::BasicBlockData { - statements: stmts2, - terminator: block1.terminator.clone(), - is_cleanup: block1.is_cleanup, - }; - // add the new block: - let block2 = patch.new_block(new_block_data); - patch.apply(body); - - // reborrow, because of patcher - let block1: &mut mir::BasicBlockData = - body.basic_blocks_mut().get_mut(location.block).ok_or(())?; - let terminator_between = mir::Terminator { - kind: mir::TerminatorKind::Goto { target: block2 }, - source_info: dummy_source_info(), - }; - block1.terminator = Some(terminator_between); - block1.statements = stmts1; - - Ok(block2) -} - // If we re-order the IndexVec containing the basic blocks, we will need to adjust // some the basic blocks that terminators point to. This is what this function does pub fn replace_outgoing_edges( diff --git a/prusti/src/mir_info_collector.rs b/prusti/src/modify_mir/mir_info_collector.rs similarity index 84% rename from prusti/src/mir_info_collector.rs rename to prusti/src/modify_mir/mir_info_collector.rs index 5a3200c3e21..b172958e52b 100644 --- a/prusti/src/mir_info_collector.rs +++ b/prusti/src/modify_mir/mir_info_collector.rs @@ -1,10 +1,9 @@ -use crate::mir_helper::*; +use super::mir_helper::*; use prusti_interface::{ - environment::{blocks_dominated_by, is_check_closure, is_marked_check_block, EnvQuery}, + environment::{blocks_dominated_by, is_check_closure, EnvQuery}, utils::has_prusti_attr, }; use prusti_rustc_interface::{ - ast::ast, middle::{ mir::{self, visit::Visitor, Statement, StatementKind}, ty::TyCtxt, @@ -12,7 +11,7 @@ use prusti_rustc_interface::{ span::Span, }; use rustc_hash::{FxHashMap, FxHashSet}; -use std::hash::{Hash, Hasher}; +use std::hash::Hash; pub struct MirInfo { pub check_blocks: FxHashMap, @@ -41,7 +40,6 @@ pub fn collect_mir_info<'tcx>(tcx: TyCtxt<'tcx>, body: mir::Body<'tcx>) -> MirIn // expiration location (when a user manually inserts `prusti_pledge_expires!()`) // or blocks that are dominated by this kind of block struct MirInfoCollector<'tcx> { - tcx: TyCtxt<'tcx>, /// a MIR visitor collecting some information about old calls, run /// beforehand old_visitor: OldVisitor<'tcx>, @@ -67,29 +65,26 @@ struct Dependency { impl<'tcx> Visitor<'tcx> for MirInfoCollector<'tcx> { fn visit_statement(&mut self, statement: &Statement<'tcx>, location: mir::Location) { self.super_statement(statement, location); - match &statement.kind { - StatementKind::Assign(box (recv, rvalue)) => { - // collect all locals contained in rvalue. - self.rvalue_visitor.visit_rvalue(rvalue, location); - // take the collected locals and reset visitor - let dependencies = - std::mem::replace(&mut self.rvalue_visitor.dependencies, Default::default()); - dependencies.iter().for_each(|local| { - let dep = self.create_dependency(*local); - if let Some(dependencies) = self.locals_dependencies.get_mut(&recv.local) { - dependencies.insert(dep); - } else { - let dependencies = [dep].iter().cloned().collect(); - self.locals_dependencies.insert(recv.local, dependencies); - } - if let Some(location_vec) = self.assignment_locations.get_mut(&recv.local) { - location_vec.push(location); - } else { - self.assignment_locations.insert(recv.local, vec![location]); - } - }); - } - _ => (), + if let StatementKind::Assign(box (recv, rvalue)) = &statement.kind { + // collect all locals contained in rvalue. + self.rvalue_visitor.visit_rvalue(rvalue, location); + // take the collected locals and reset visitor + let dependencies = + std::mem::take(&mut self.rvalue_visitor.dependencies); + dependencies.iter().for_each(|local| { + let dep = self.create_dependency(*local); + if let Some(dependencies) = self.locals_dependencies.get_mut(&recv.local) { + dependencies.insert(dep); + } else { + let dependencies = [dep].iter().cloned().collect(); + self.locals_dependencies.insert(recv.local, dependencies); + } + if let Some(location_vec) = self.assignment_locations.get_mut(&recv.local) { + location_vec.push(location); + } else { + self.assignment_locations.insert(recv.local, vec![location]); + } + }); } } @@ -100,7 +95,7 @@ impl<'tcx> Visitor<'tcx> for MirInfoCollector<'tcx> { args, destination, .. } = &terminator.kind { - args.into_iter().for_each(|arg| { + args.iter().for_each(|arg| { if let mir::Operand::Move(place) | mir::Operand::Copy(place) = arg { let dep = self.create_dependency(place.local); if let Some(dependencies) = self.locals_dependencies.get_mut(&destination.local) @@ -132,7 +127,6 @@ impl<'tcx> MirInfoCollector<'tcx> { let mut old_visitor = OldVisitor::new(tcx); old_visitor.visit_body(&body); Self { - tcx, old_visitor, locals_dependencies: Default::default(), assignment_locations: Default::default(), @@ -145,7 +139,7 @@ impl<'tcx> MirInfoCollector<'tcx> { // Given the dependencies, figure out which arguments we need to clone // and which statements will need to be adjusted - pub fn process_dependencies(&self) -> (FxHashSet, FxHashSet){ + pub fn process_dependencies(&self) -> (FxHashSet, FxHashSet) { let mut args_to_clone = FxHashSet::::default(); let mut stmts_to_adjust = FxHashSet::::default(); let mut encountered = FxHashSet::::default(); @@ -165,23 +159,24 @@ impl<'tcx> MirInfoCollector<'tcx> { if dep.is_mutable_arg { args_to_clone.insert(dep.local); depends_on_argument = true; - } else if !dep.is_user_declared || dep.declared_within_old { - if !encountered.contains(&dep.local) { - // process this variable too! - to_process.push(dep.local); - encountered.insert(dep.local); - } + } else if (!dep.is_user_declared || dep.declared_within_old) + && !encountered.contains(&dep.local) + { + // process this variable too! + to_process.push(dep.local); + encountered.insert(dep.local); } }); if depends_on_argument { // we potentially have to replace function arguments with cloned // values in the places these locals are assigned to - assignment_locations.iter().for_each(|location| {stmts_to_adjust.insert(*location);}); + assignment_locations.iter().for_each(|location| { + stmts_to_adjust.insert(*location); + }); } } } (args_to_clone, stmts_to_adjust) - } // determine all the relevant facts about this local fn create_dependency(&self, local: mir::Local) -> Dependency { @@ -255,8 +250,8 @@ pub enum CheckBlockKind { } impl CheckBlockKind { - pub fn determine_kind<'tcx>( - env_query: EnvQuery<'tcx>, + pub fn determine_kind( + env_query: EnvQuery<'_>, bb_data: &mir::BasicBlockData, ) -> Option { for stmt in &bb_data.statements { @@ -289,8 +284,8 @@ impl<'tcx> Visitor<'tcx> for RvalueVisitor { fn visit_local( &mut self, local: mir::Local, - context: mir::visit::PlaceContext, - location: mir::Location, + _context: mir::visit::PlaceContext, + _location: mir::Location, ) { self.dependencies.push(local); } @@ -314,7 +309,7 @@ impl<'tcx> Visitor<'tcx> for OldVisitor<'tcx> { .. } = &terminator.kind { - if let Some((call_id, substs)) = func.const_fn_def() { + if let Some((call_id, _)) = func.const_fn_def() { let item_name = self.tcx.def_path_str(call_id); if &item_name[..] == "prusti_contracts::old" { println!("old visitor found old function call"); diff --git a/prusti/src/mir_modify.rs b/prusti/src/modify_mir/mir_modify.rs similarity index 85% rename from prusti/src/mir_modify.rs rename to prusti/src/modify_mir/mir_modify.rs index 2db9d14f142..cbd1e7731a7 100644 --- a/prusti/src/mir_modify.rs +++ b/prusti/src/modify_mir/mir_modify.rs @@ -1,11 +1,8 @@ -use crate::{ +use crate::modify_mir::{ mir_helper::*, mir_info_collector::{collect_mir_info, CheckBlockKind, MirInfo}, }; -use prusti_interface::{ - environment::{is_marked_check_block, EnvQuery}, - specs::typed::{CheckKind, DefSpecificationMap}, -}; +use prusti_interface::specs::typed::{CheckKind, DefSpecificationMap}; use prusti_rustc_interface::{ data_structures::steal::Steal, interface::DEFAULT_QUERY_PROVIDERS, @@ -21,7 +18,7 @@ use prusti_rustc_interface::{ DUMMY_SP, }, }; -use rustc_hash::{FxHashMap, FxHashSet}; +use rustc_hash::FxHashMap; use std::{env, fs, io}; @@ -32,21 +29,15 @@ fn folder_present(name: &str) -> io::Result { Ok(metadata.is_dir()) } -pub static mut SPECS: Option = None; -pub static mut EXPIRATION_LOCATIONS: Option< - FxHashMap>, -> = None; - pub(crate) fn mir_checked( tcx: TyCtxt<'_>, def: ty::WithOptConstParam, ) -> &Steal> { // let's get the specifications collected by prusti :) // SAFETY: Is definitely not safe at the moment - let specs_opt = unsafe { SPECS.clone() }; + let specs_opt = unsafe { super::SPECS.clone() }; if let Some(specs) = specs_opt { - let expiration_locations = unsafe { EXPIRATION_LOCATIONS.clone().unwrap() }; // get mir body before invoking drops_elaborated query, otherwise it will // be stolen let steal = (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def); @@ -56,8 +47,7 @@ pub(crate) fn mir_checked( println!("modifying mir for defid: {:?}", def_id); } - let mut visitor = - InsertChecksVisitor::new(tcx, specs, expiration_locations, stolen.clone()); + let mut visitor = InsertChecksVisitor::new(tcx, specs, stolen.clone()); visitor.visit_body(&mut stolen); // print mir of body: @@ -74,12 +64,6 @@ pub(crate) fn mir_checked( } } -// #[derive(Debug, Clone)] -// pub enum ModificationToProcess<'tcx> { -// Pledge(PledgeToProcess<'tcx>), -// OldCall(OldCallToProcess), -// } - #[derive(Debug, Clone)] pub struct PledgeToProcess<'tcx> { check: DefId, @@ -93,20 +77,11 @@ pub struct PledgeToProcess<'tcx> { substs: ty::subst::SubstsRef<'tcx>, } -#[derive(Debug, Clone, Copy)] -pub struct OldCallToProcess<'tcx> { - /// the local where the result of cloning should be stored in - stored_local: mir::Local, - /// the argument that should be stored - arg_to_store: mir::Local, - /// the type of the argument (and result) of the old call: - ty: ty::Ty<'tcx>, -} - pub struct InsertChecksVisitor<'tcx> { tcx: TyCtxt<'tcx>, specs: DefSpecificationMap, - expiration_locations: FxHashMap>, + // expiration locations are not computed correctly for this stage of the mir. + // expiration_locations: FxHashMap>, current_patcher: Option>, pledges_to_process: FxHashMap>, current_def_id: Option, @@ -114,29 +89,20 @@ pub struct InsertChecksVisitor<'tcx> { // maps from function arguments to their copies in old state stored_arguments: FxHashMap, mir_info: MirInfo, - env_query: EnvQuery<'tcx>, } impl<'tcx> InsertChecksVisitor<'tcx> { - pub fn new( - tcx: TyCtxt<'tcx>, - specs: DefSpecificationMap, - expiration_locations: FxHashMap>, - body_copy: Body<'tcx>, - ) -> Self { + pub fn new(tcx: TyCtxt<'tcx>, specs: DefSpecificationMap, body_copy: Body<'tcx>) -> Self { let mir_info = collect_mir_info(tcx, body_copy.clone()); - let env_query = EnvQuery::new(tcx); Self { tcx, specs, current_patcher: None, pledges_to_process: Default::default(), - expiration_locations, current_def_id: None, body_copy, stored_arguments: Default::default(), mir_info, - env_query, } } } @@ -228,49 +194,46 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { fn visit_terminator(&mut self, terminator: &mut Terminator<'tcx>, location: mir::Location) { self.super_terminator(terminator, location); - match &mut terminator.kind { + if let TerminatorKind::SwitchInt { targets, .. } = &mut terminator.kind { // find switchInts with a check_only target. - TerminatorKind::SwitchInt { targets, .. } => { - let mut switch_iter = targets.iter(); - if switch_iter.len() == 1 { - let (value, target) = switch_iter.next().unwrap(); - let otherwise = targets.otherwise(); - // check if target is a check_block: - if let Some(kind) = self.mir_info.check_blocks.get(&otherwise) { - match kind { - CheckBlockKind::PledgeExpires(local) => { - // this check_block should terminate with a goto always! - if let TerminatorKind::Goto { target } = - self.body_copy[otherwise].terminator.clone().unwrap().kind - { - let pledge = self - .pledges_to_process - .get(&local) - .expect("pledge expiration without an actual pledge"); - let mut patcher = self.current_patcher.take().unwrap(); - let start_block = create_pledge_call_chain( - self.tcx, - pledge, - target, - &mut patcher, - ) - .unwrap(); - - let new_terminator = TerminatorKind::Goto { - target: start_block, - }; - // skip this check block and instead call checks-chain - patcher.patch_terminator(otherwise, new_terminator); - self.current_patcher = Some(patcher) - } + let switch_iter = targets.iter(); + if switch_iter.len() == 1 { + // let (value, target) = switch_iter.next().unwrap(); + let otherwise = targets.otherwise(); + // check if target is a check_block: + if let Some(kind) = self.mir_info.check_blocks.get(&otherwise) { + match kind { + CheckBlockKind::PledgeExpires(local) => { + // this check_block should terminate with a goto always! + if let TerminatorKind::Goto { target } = + self.body_copy[otherwise].terminator.clone().unwrap().kind + { + let pledge = self + .pledges_to_process + .get(local) + .expect("pledge expiration without an actual pledge"); + let mut patcher = self.current_patcher.take().unwrap(); + let start_block = create_pledge_call_chain( + self.tcx, + pledge, + target, + &mut patcher, + ) + .unwrap(); + + let new_terminator = TerminatorKind::Goto { + target: start_block, + }; + // skip this check block and instead call checks-chain + patcher.patch_terminator(otherwise, new_terminator); + self.current_patcher = Some(patcher) } - // nothing to do.. - CheckBlockKind::RuntimeAssertion => (), } + // nothing to do.. + CheckBlockKind::RuntimeAssertion => (), } } } - _ => (), } } @@ -303,7 +266,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { // if it's a static function call, we start looking if there are // post-conditions we could check if let Some((call_id, substs)) = func.const_fn_def() { - let item_name = self.tcx.def_path_str(call_id); + // let item_name = self.tcx.def_path_str(call_id); // make sure the call is local: if !call_id.is_local() { // extern specs preconditions will need to be handled here. @@ -409,11 +372,14 @@ impl<'tcx> InsertChecksVisitor<'tcx> { // otherwise we have to create a reference first, to pass to the clone // function. let clone_defid = get_clone_defid(self.tcx).ok_or(())?; - let clone_trait_defid = self.tcx.lang_items().clone_trait().unwrap(); + // let clone_trait_defid = self.tcx.lang_items().clone_trait().unwrap(); let local_decl = self.body_copy.local_decls.get(arg).unwrap(); let arg_ty = local_decl.ty; let destination = *self.stored_arguments.get(&arg).unwrap(); - println!("trying to clone arg: {:?} into destination: {:?}", arg, destination); + println!( + "trying to clone arg: {:?} into destination: {:?}", + arg, destination + ); if !arg_ty.is_ref() { println!("handling a non-ref old arg"); let ref_ty = create_reference_type(self.tcx, arg_ty); diff --git a/prusti/src/modify_mir/mod.rs b/prusti/src/modify_mir/mod.rs new file mode 100644 index 00000000000..4fc27b100e1 --- /dev/null +++ b/prusti/src/modify_mir/mod.rs @@ -0,0 +1,7 @@ +use prusti_interface::specs::typed::DefSpecificationMap; + +pub static mut SPECS: Option = None; + +mod mir_info_collector; +pub mod mir_modify; +pub mod mir_helper; diff --git a/prusti/src/verifier.rs b/prusti/src/verifier.rs index e01efbd8cf0..d7cdf8fcb4c 100644 --- a/prusti/src/verifier.rs +++ b/prusti/src/verifier.rs @@ -9,8 +9,6 @@ use prusti_interface::{ }; use prusti_viper::verifier::Verifier; -use crate::mir_modify; - #[tracing::instrument(name = "prusti::verify", level = "debug", skip(env))] pub fn verify(env: Environment<'_>, def_spec: typed::DefSpecificationMap) { if env.diagnostic.has_errors() { @@ -55,9 +53,6 @@ pub fn verify(env: Environment<'_>, def_spec: typed::DefSpecificationMap) { let mut verifier = Verifier::new(&env, def_spec); let verification_result = verifier.verify(&verification_task); - unsafe { - mir_modify::EXPIRATION_LOCATIONS = Some(verifier.get_expiration_locations()); - } debug!("Verifier returned {:?}", verification_result); verification_result From 17b73d7dc58705488fac554dec4131f91ad0dee0 Mon Sep 17 00:00:00 2001 From: cedric Date: Wed, 19 Jul 2023 12:17:09 +0200 Subject: [PATCH 18/45] Only clone arguments for old if they are mutable --- .../src/runtime_checks/translation.rs | 51 +++++------------ prusti/src/modify_mir/mir_modify.rs | 56 ++++++++++++------- 2 files changed, 52 insertions(+), 55 deletions(-) diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 8a724322ac1..b20097fe9a8 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -1,10 +1,10 @@ use crate::{ + common::HasSignature, + rewriter::{AstRewriter, SpecItemType}, runtime_checks::{ boundary_extraction::{self, BoundExtractor}, check_type::CheckType, }, - common::HasSignature, - rewriter::{AstRewriter, SpecItemType}, specifications::{common::SpecificationId, untyped}, }; use proc_macro2::TokenStream; @@ -16,7 +16,8 @@ use syn::{ }; pub struct CheckTranslator { - /// The expression within the specification + /// The expression within the specification (the one that will + /// be modified by the Visitor) expression: Expr, lhs_expression: Option, visitor: CheckVisitor, @@ -37,7 +38,6 @@ pub struct RuntimeFunctions { pub check_before_expiry: Option, } - impl RuntimeFunctions { /// consumes self, and returns vector of items pub fn to_item_vec(&self) -> Vec { @@ -169,7 +169,10 @@ impl CheckTranslator { // -> have result // -> have old values // -> moved values need to be stored too - let executed_after = matches!(self.spec_type, SpecItemType::Postcondition | SpecItemType::Pledge); + let executed_after = matches!( + self.spec_type, + SpecItemType::Postcondition | SpecItemType::Pledge + ); let expr_to_check: syn::Expr = if is_before_expiry_check { // if lhs is true, there has to be a lhs expression if let Some(expr) = self.lhs_expression.as_ref() { @@ -198,7 +201,6 @@ impl CheckTranslator { ); let contract_string = expr_to_check.to_token_stream().to_string(); let failure_message = format!("Contract {} was violated at runtime", contract_string); - println!("Failure message: {}", failure_message); let id_attr: syn::Attribute = if is_before_expiry_check { parse_quote_spanned! {item.span() => #[prusti::check_before_expiry_id = #check_id_str] @@ -248,7 +250,6 @@ impl CheckTranslator { }; check_item.sig.inputs.push(before_expiry_arg); } - println!("Check function: {}", check_item.to_token_stream()); syn::Item::Fn(check_item) } @@ -278,7 +279,6 @@ impl CheckTranslator { let mut tuple: Punctuated = Punctuated::new(); old_exprs.iter().for_each(|el| { - println!("field number: (control sorted!) {}", el.old_store_index); let name_token: TokenStream = el.name.to_string().parse().unwrap(); let tokens_stmt: syn::Expr = parse_quote_spanned! {item.span() => #name_token.clone() @@ -308,7 +308,6 @@ impl CheckTranslator { // original annotated function res.sig.generics = item.sig().generics.clone(); res.sig.inputs = item.sig().inputs.clone(); - println!("Store fn: {}", res.to_token_stream()); syn::Item::Fn(res) } @@ -465,7 +464,6 @@ impl CheckVisitor { .filter_map(|el| Argument::try_from(&el).ok()) .map(|el| (el.name.clone(), el)) .collect(); - println!("collected inputs: {:?}", inputs); Self { within_old: false, within_before_expiry: false, @@ -483,7 +481,6 @@ impl VisitMut for CheckVisitor { // collect arguments that occurr within old expression // these are the ones we wanna clone if let Some(ident) = expr_path.path.get_ident() { - println!("Found identifier: {}", ident); let name = ident.to_token_stream().to_string(); if self.check_type.is_closure() && self.within_old { // let tokens = parse_quote! {old(#expr)}; @@ -491,11 +488,10 @@ impl VisitMut for CheckVisitor { } else if let Some(arg) = self.inputs.get_mut(&name) { // argument used within an old expression? // not already marked as used in old? - if self.check_type.has_old_tuple() && (self.within_old || !arg.is_ref) { + if self.check_type.has_old_tuple() && (self.within_old || (!arg.is_ref && arg.is_mutable)) { // if it was not already marked to be stored // needs to be checked for indeces to be correct if !arg.used_in_old { - println!("Marking variable {} to be stored", arg.name); arg.used_in_old = true; arg.old_store_index = self.highest_old_index; self.highest_old_index += 1; @@ -511,7 +507,6 @@ impl VisitMut for CheckVisitor { // no real solution at this level quote! {(old_values.#index_token)} }; - println!("tokens: {}", tokens); let new_path: syn::Expr = syn::parse2(tokens).unwrap(); *expr = new_path; } @@ -520,8 +515,6 @@ impl VisitMut for CheckVisitor { (&result_before_expiry) }; *expr = new_path; - } else { - println!("identifier {} was not found in args\n\n", name); } } } @@ -536,7 +529,6 @@ impl VisitMut for CheckVisitor { } else { // still visit recursively syn::visit_mut::visit_expr_mut(self, expr); - println!("WARNING: Function call where name could not be extracted!\n\n"); return; }; match name.as_str() { @@ -548,30 +540,19 @@ impl VisitMut for CheckVisitor { let sub_expr = call.args.pop(); // remove old-call and replace with content expression *expr = sub_expr.unwrap().value().clone(); - println!("recognized old with sub_expr: {}!", quote! {#expr}); self.within_old = true; self.visit_expr_mut(expr); - println!("sub expression of old after modification: {}", quote!{#expr}); // will cause all variables below to be replaced by old_value.some_field self.within_old = false; - println!( - "done searching contents of old(), expression now: {}", - quote! {#expr} - ); } } ":: prusti_contracts :: before_expiry" | "prusti_contracts :: before_expiry" | "before_expiry" => { let sub_expr = call.args.pop(); *expr = sub_expr.unwrap().value().clone(); - println!("recognized before_expiry with sub_expr: {}!", quote! {#expr}); self.within_before_expiry = true; self.visit_expr_mut(expr); // will cause all variables below to be replaced by old_value.some_field self.within_before_expiry = false; - println!( - "done searching contents of before_expiry(), expression now: {}", - quote! {#expr} - ); }, ":: prusti_contracts :: forall" => { syn::visit_mut::visit_expr_call_mut(self, call); @@ -628,6 +609,7 @@ pub struct Argument { /// whether or not this field is a reference. We assume that all ref types /// start with & (which obviously can be wrong) pub is_ref: bool, + pub is_mutable: bool, } impl TryFrom<&FnArg> for Argument { @@ -636,6 +618,7 @@ impl TryFrom<&FnArg> for Argument { match arg { FnArg::Typed(syn::PatType { pat, ty, .. }) => { if let syn::Pat::Ident(pat_ident) = *pat.clone() { + let is_mutable = pat_ident.mutability.is_some(); let is_ref = matches!(**ty, syn::Type::Reference(_)); let arg = Argument { name: pat_ident.ident.to_string(), @@ -643,14 +626,16 @@ impl TryFrom<&FnArg> for Argument { used_in_old: false, old_store_index: 0, // meaningless unless used_in_old is true is_ref, + is_mutable, }; Ok(arg) } else { Err(()) } } - FnArg::Receiver(syn::Receiver { reference, .. }) => { + FnArg::Receiver(syn::Receiver { reference, mutability, .. }) => { let is_ref = reference.is_some(); + let is_mutable = mutability.is_some(); let ty: syn::Type = if is_ref { parse_quote! {&Self} } else { @@ -662,6 +647,7 @@ impl TryFrom<&FnArg> for Argument { used_in_old: false, old_store_index: 0, is_ref, + is_mutable, }; Ok(arg) } @@ -675,15 +661,12 @@ enum QuantifierKind { } fn translate_quantifier_expression(closure: &syn::ExprClosure, kind: QuantifierKind) -> syn::Expr { - println!("translate is called"); - println!("quantifier nr args: {}", closure.inputs.len()); let mut name_set: FxHashSet = FxHashSet::default(); // the variables that occurr as arguments let bound_vars: Vec<(String, syn::Type)> = closure .inputs .iter() .map(|pat: &syn::Pat| { - println!("Pattern: {:?}", pat); if let syn::Pat::Type(syn::PatType { pat: box syn::Pat::Ident(id), ty: box ty, @@ -702,7 +685,6 @@ fn translate_quantifier_expression(closure: &syn::ExprClosure, kind: QuantifierK .collect(); // look for the runtime_quantifier_bounds attribute: - println!("closure arguments: {:?}", bound_vars); let manual_bounds = BoundExtractor::manual_bounds(closure.clone(), bound_vars.clone()); let bounds = manual_bounds .unwrap_or_else(|| BoundExtractor::derive_ranges(*closure.body.clone(), bound_vars)); @@ -711,7 +693,6 @@ fn translate_quantifier_expression(closure: &syn::ExprClosure, kind: QuantifierK for ((name, _), range_expr) in bounds.iter().rev() { let name_token: TokenStream = name.parse().unwrap(); - println!("bounds extracted!"); // maybe never turn them into strings in the first place.. expr = match kind { @@ -728,11 +709,9 @@ fn translate_quantifier_expression(closure: &syn::ExprClosure, kind: QuantifierK holds_forall } }; - println!("res: {}", res); syn::parse2(res).unwrap() } QuantifierKind::Exists => { - println!("exists handled:"); let res = quote! { { let mut exists = false; diff --git a/prusti/src/modify_mir/mir_modify.rs b/prusti/src/modify_mir/mir_modify.rs index cbd1e7731a7..a99f49d85ef 100644 --- a/prusti/src/modify_mir/mir_modify.rs +++ b/prusti/src/modify_mir/mir_modify.rs @@ -268,9 +268,6 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { if let Some((call_id, substs)) = func.const_fn_def() { // let item_name = self.tcx.def_path_str(call_id); // make sure the call is local: - if !call_id.is_local() { - // extern specs preconditions will need to be handled here. - } // The block that is executed after the annotated function // is called. Mutable copy because after appending the first @@ -279,6 +276,28 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { // since there might be multiple blocks to be inserted, for check_kind in self.specs.get_runtime_checks(&call_id) { match check_kind { + CheckKind::Pre(check_id) => { + // only insert check if called method is not local! + if call_id.is_local() { + continue; + } else { + let mut patch = self.current_patcher.take().unwrap(); + let return_ty = fn_return_ty(self.tcx, check_id); + assert!(return_ty.is_unit()); + let res = patch.new_internal(return_ty, DUMMY_SP); + caller_block = prepend_call( + self.tcx, + &mut patch, + check_id, + caller_block, + args.clone(), + substs, + call_fn_terminator.clone(), + res.into(), + ); + self.current_patcher = Some(patch); + } + } CheckKind::Post { check: check_id, old_store: old_store_id, @@ -324,7 +343,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { let before_expiry_place = Place::from(patch.new_internal(before_expiry_ty, DUMMY_SP)); - caller_block = prepend_store( + caller_block = prepend_call( self.tcx, &mut patch, old_store, @@ -481,36 +500,35 @@ impl<'tcx> InsertChecksVisitor<'tcx> { } } -/// caller_block is calling an annotated function. `prepend_store` creates -/// a new block (new_block), moves the call to the annotated function into -/// the new block, adjusts the original block to call a store function and sets -/// its target to this new block +/// Given a function call, prepend another function call directly before +/// it. Done by moving the existing call to a new block, replacing the +/// terminator of the existing block with a new call jumping to the new block #[allow(clippy::too_many_arguments)] -fn prepend_store<'tcx>( +fn prepend_call<'tcx>( tcx: TyCtxt<'tcx>, patcher: &mut MirPatch<'tcx>, - old_store_id: DefId, + fn_id: DefId, caller_block: BasicBlock, args: Vec>, substs: ty::subst::SubstsRef<'tcx>, terminator: Terminator<'tcx>, - old_dest_place: Place<'tcx>, + dest_place: Place<'tcx>, ) -> BasicBlock { // get the bodies of the store and check function let new_block_data = BasicBlockData::new(Some(terminator)); let new_block = patcher.new_block(new_block_data); - let store_func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(old_store_id, substs)); - let store_func = Operand::Constant(Box::new(Constant { + let func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(fn_id, substs)); + let func = Operand::Constant(Box::new(Constant { span: DUMMY_SP, user_ty: None, - literal: ConstantKind::zero_sized(store_func_ty), + literal: ConstantKind::zero_sized(func_ty), })); - let store_terminator = TerminatorKind::Call { - func: store_func, + let terminator = TerminatorKind::Call { + func, args: args.clone(), - destination: old_dest_place, + destination: dest_place, target: Some(new_block), cleanup: None, from_hir_call: false, @@ -518,7 +536,7 @@ fn prepend_store<'tcx>( }; // the block that initially calls the check function, now calls the store // function - patcher.patch_terminator(caller_block, store_terminator); + patcher.patch_terminator(caller_block, terminator); new_block } @@ -617,7 +635,7 @@ fn surround_call_with_store_and_check<'tcx>( let mut call_fn_terminator = original_terminator; replace_target(&mut call_fn_terminator, check_block); - let new_caller_block = prepend_store( + let new_caller_block = prepend_call( tcx, patch, old_store_id, From 3c82745061d850fc2829ef5e005e9e0c934d7b11 Mon Sep 17 00:00:00 2001 From: cedric Date: Wed, 26 Jul 2023 10:22:03 +0200 Subject: [PATCH 19/45] Runtime checks without store function for old values We now manually clone old values instead of running a store function. --- Cargo.lock | 4 +- prusti-contracts/prusti-specs/src/lib.rs | 48 +- prusti-contracts/prusti-specs/src/rewriter.rs | 4 +- .../src/runtime_checks/translation.rs | 270 +++------- prusti-interface/src/specs/mod.rs | 23 - prusti-interface/src/specs/typed.rs | 9 +- prusti/src/modify_mir/mir_helper.rs | 41 +- prusti/src/modify_mir/mir_modify.rs | 462 ++++++++++-------- 8 files changed, 397 insertions(+), 464 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4ba728e5230..a4a00442d67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2213,9 +2213,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.52" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d0e1ae9e836cc3beddd63db0df682593d7e2d3d891ae8c9083d2113e1744224" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index eb8d72a0fe4..58bda6a4035 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -242,23 +242,19 @@ fn generate_for_ensures( let check_id = rewriter.generate_spec_id(); let check_id_str = check_id.to_string(); // let store_old_item = rewriter.create_store_check_ensures(check_id, attr, item)?; - let (check_item, store_item_opt) = + let check_item = rewriter.create_post_check(rewriter::SpecItemType::Postcondition, check_id, attr, item)?; - if let Some(store_item) = store_item_opt { - Ok(( - vec![spec_item, check_item, store_item], - vec![ - parse_quote_spanned! {item.span()=> - #[prusti::post_spec_id_ref = #spec_id_str] - }, - parse_quote_spanned! {item.span()=> - #[prusti::post_check_id_ref = #check_id_str] - }, - ], - )) - } else { - unreachable!(); - } + Ok(( + vec![spec_item, check_item], + vec![ + parse_quote_spanned! {item.span()=> + #[prusti::post_spec_id_ref = #spec_id_str] + }, + parse_quote_spanned! {item.span()=> + #[prusti::post_check_id_ref = #check_id_str] + }, + ], + )) } /// Generate spec items and attributes to typecheck and later retrieve "after_expiry" annotations. @@ -485,22 +481,25 @@ pub fn body_variant(tokens: TokenStream) -> TokenStream { pub fn body_invariant(tokens: TokenStream) -> TokenStream { let spec = generate_expression_closure(&AstRewriter::process_loop_invariant, tokens.clone()); - let check = generate_runtime_expression_closure(&AstRewriter::runtime_check_loop_invariant, tokens); - quote!{#spec #check} + let check = + generate_runtime_expression_closure(&AstRewriter::runtime_check_loop_invariant, tokens); + quote! {#spec #check} } pub fn prusti_assertion(tokens: TokenStream) -> TokenStream { let spec = generate_expression_closure(&AstRewriter::process_prusti_assertion, tokens.clone()); - let check = generate_runtime_expression_closure(&AstRewriter::runtime_check_prusti_assertion, tokens); - let res = quote!{#spec #check}; + let check = + generate_runtime_expression_closure(&AstRewriter::runtime_check_prusti_assertion, tokens); + let res = quote! {#spec #check}; println!("result: {}", res); res } pub fn prusti_assume(tokens: TokenStream) -> TokenStream { let spec = generate_expression_closure(&AstRewriter::process_prusti_assumption, tokens.clone()); - let check = generate_runtime_expression_closure(&AstRewriter::runtime_check_prusti_assumption, tokens); - quote!{#spec #check} + let check = + generate_runtime_expression_closure(&AstRewriter::runtime_check_prusti_assumption, tokens); + quote! {#spec #check} } pub fn prusti_refutation(tokens: TokenStream) -> TokenStream { @@ -1216,9 +1215,7 @@ pub fn ghost(tokens: TokenStream) -> TokenStream { } } -pub fn pledge_expires( - tokens: TokenStream, -) -> TokenStream { +pub fn pledge_expires(tokens: TokenStream) -> TokenStream { // make sure only 1 identifier is passed to this macro let expr = handle_result!(syn::parse2::(tokens.clone())); // create spec blocks starting with a spec_only closure so @@ -1237,5 +1234,4 @@ pub fn pledge_expires( } } } - } diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index f3fbb097a35..c305b1db38a 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -174,9 +174,9 @@ impl AstRewriter { check_id: SpecificationId, tokens: TokenStream, item: &untyped::AnyFnItem, - ) -> syn::Result<(syn::Item, Option)> { + ) -> syn::Result { let res = translate_runtime_checks(spec_type, check_id, parse_prusti(tokens)?, None, item)?; - syn::Result::Ok((res.check_fn, res.store_fn)) + syn::Result::Ok(res.check_fn) } /// Parse a pledge with lhs into a Rust expression diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index b20097fe9a8..538b1ab63eb 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -7,11 +7,11 @@ use crate::{ }, specifications::{common::SpecificationId, untyped}, }; -use proc_macro2::TokenStream; +use proc_macro2::{Span, TokenStream}; use quote::{quote, ToTokens}; use rustc_hash::{FxHashMap, FxHashSet}; use syn::{ - parse_quote, parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, + parse_quote, parse_quote_spanned, spanned::Spanned, visit_mut::VisitMut, Expr, FnArg, }; @@ -30,10 +30,6 @@ pub struct RuntimeFunctions { /// the actual check function. For pledges, this is the check after /// expiration pub check_fn: syn::Item, - /// store old state function - pub store_fn: Option, - /// store expressions evaluated in before expiry expression - pub store_before_expiry: Option, /// for assert_after_expiry(), this is the lhs of the magic wand pub check_before_expiry: Option, } @@ -43,17 +39,9 @@ impl RuntimeFunctions { pub fn to_item_vec(&self) -> Vec { let RuntimeFunctions { check_fn, - store_fn, - store_before_expiry, check_before_expiry, } = self; let mut res = vec![check_fn.clone()]; - if let Some(store_fn) = store_fn { - res.push(store_fn.clone()); - } - if let Some(store_before_expiry) = store_before_expiry { - res.push(store_before_expiry.clone()); - } if let Some(check_before_expiry) = check_before_expiry { res.push(check_before_expiry.clone()); } @@ -71,43 +59,37 @@ pub fn translate_runtime_checks( item: &untyped::AnyFnItem, ) -> syn::Result { let check_translator = CheckTranslator::new(item, expr, lhs, spec_type.clone()); - let (check_fn, store_fn, store_before_expiry, check_before_expiry) = match spec_type { + let (check_fn, check_before_expiry) = match spec_type { SpecItemType::Pledge => { // most things to generate: let check_fn = check_translator.generate_check_function(item, check_id, false, true); - let store_item = check_translator.generate_store_function(item, check_id); let check_before_expiry = check_translator.generate_check_function(item, check_id, true, false); - let store_before_expiry = check_translator.generate_store_before_expiry(item, check_id); ( check_fn, - Some(store_item), - Some(store_before_expiry), Some(check_before_expiry), ) } SpecItemType::Postcondition => { let check_fn = check_translator.generate_check_function(item, check_id, false, false); - let store_item = check_translator.generate_store_function(item, check_id); - (check_fn, Some(store_item), None, None) + (check_fn, None) } SpecItemType::Precondition => { let check_fn = check_translator.generate_check_function(item, check_id, false, false); - (check_fn, None, None, None) + (check_fn, None) } _ => unreachable!(), }; syn::Result::Ok(RuntimeFunctions { check_fn, - store_fn, - store_before_expiry, check_before_expiry, }) } pub fn translate_expression_runtime(tokens: TokenStream) -> syn::Expr { - // a bit different since we don't have any arguments here.. + // a bit different since we don't generate a function, but just the + // code-fragment performing the check let mut expr: syn::Expr = syn::parse2(tokens).unwrap(); let mut check_visitor = CheckVisitor::new(&dummy_fn(), CheckType::ClosureExpression); check_visitor.visit_expr_mut(&mut expr); @@ -238,138 +220,43 @@ impl CheckTranslator { check_item.sig.inputs.push(old_arg); } if before_expiry_argument { - let output_ty = match &item.sig().output { - syn::ReturnType::Type( - _, - box syn::Type::Reference(syn::TypeReference { elem: box ty, .. }), - ) => ty.clone(), - _ => panic!("a pledge that doesnt return a reference?"), + let mut output_ty: syn::Type = if let syn::ReturnType::Type(_, box ty) = &item.sig().output { + ty.clone() + } else { + // probably not our job to throw an error here? But a pledge for + // a function with default return type does not make a lot of sense.. + parse_quote!{()} }; + if let syn::Type::Reference(ref mut ty_ref) = output_ty { + ty_ref.mutability = None; + } let before_expiry_arg = parse_quote_spanned! {item.span() => - result_before_expiry: #output_ty + result_before_expiry: (#output_ty,) }; check_item.sig.inputs.push(before_expiry_arg); } syn::Item::Fn(check_item) } - // generate the function that clones old values and returns them. - pub fn generate_store_function( - &self, - item: &untyped::AnyFnItem, - check_id: SpecificationId, - ) -> syn::Item { - let item_name = syn::Ident::new( - &format!( - "prusti_{}_store_old_item_{}_{}", - self.spec_type, - item.sig().ident, - check_id, - ), - item.span(), - ); - let check_id_str = check_id.to_string(); - let mut old_exprs = self - .visitor - .inputs - .iter() - .filter_map(|(_, x)| if x.used_in_old { Some(x) } else { None }) - .collect::>(); - old_exprs.sort_by(|a, b| a.old_store_index.partial_cmp(&b.old_store_index).unwrap()); - let mut tuple: Punctuated = Punctuated::new(); - - old_exprs.iter().for_each(|el| { - let name_token: TokenStream = el.name.to_string().parse().unwrap(); - let tokens_stmt: syn::Expr = parse_quote_spanned! {item.span() => - #name_token.clone() - }; - tuple.push(tokens_stmt); - }); - if !tuple.empty_or_trailing() { - tuple.push_punct(syn::token::Comma::default()); - } - let old_values_type = self.old_values_type(item); - // println!("resulting tuple: {}", quote!{#tuple}); - let forget_statements = self.generate_forget_statements(item, true, false, false, false); - - let item_name_str = item_name.to_string(); - let mut res: syn::ItemFn = parse_quote_spanned! {item.span() => - #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] - #[prusti::spec_only] - #[prusti::store_id = #check_id_str] - fn #item_name() -> #old_values_type { - println!("store function {} is performed", #item_name_str); - let old_values = (#tuple); - #forget_statements - return old_values; - } - }; - // store function has the same generics and arguments as the - // original annotated function - res.sig.generics = item.sig().generics.clone(); - res.sig.inputs = item.sig().inputs.clone(); - syn::Item::Fn(res) - } - - pub fn generate_store_before_expiry( - &self, - item: &untyped::AnyFnItem, - check_id: SpecificationId, - ) -> syn::Item { - let item_name = syn::Ident::new( - &format!( - "prusti_{}_store_before_expiry_item_{}_{}", - self.spec_type, - item.sig().ident, - check_id, - ), - item.span(), - ); - let check_id_str = check_id.to_string(); - let item_name_str = item_name.to_string(); - - let result_arg = AstRewriter::generate_result_arg(item); - let arg = Argument::try_from(&result_arg).unwrap(); - let (result_type, arg_ty) = if let syn::Type::Reference(ty) = arg.ty { - let mut ty_ref = ty; - ty_ref.mutability = None; - ((*ty_ref.elem).clone(), syn::Type::Reference(ty_ref)) - } else { - panic!("result of pledge does not look like a pointer") - }; - let mut res: syn::ItemFn = parse_quote_spanned! { item.span() => - #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] - #[prusti::spec_only] - #[prusti::store_before_expiry_id = #check_id_str] - fn #item_name (res : #arg_ty) -> #result_type { - println!("store before expiry function {} is performed", #item_name_str); - res.clone() - } - }; - res.sig.generics = item.sig().generics.clone(); - syn::Item::Fn(res) - } - /// After the visitor was run on an expression, this function /// can be used to generate the type of the old_values tuple /// important here is that it only contains the values that actually occurr /// in old-expressions and not just all arguments pub fn old_values_type(&self, item: &T) -> syn::Type { let mut old_values_type: syn::Type = parse_quote_spanned! {item.span() => ()}; + let mut arguments = self.visitor.inputs.values().collect::>(); + // order the elements of the map by index + arguments.sort_by(|a, b| a.index.partial_cmp(&b.index).unwrap()); if let syn::Type::Tuple(syn::TypeTuple { elems, .. }) = &mut old_values_type { // start adding the elements we want to store: - for i in 0..self.visitor.highest_old_index { - for el in self.visitor.inputs.values() { - if el.used_in_old && el.old_store_index == i { - match &el.ty { - // if we have a reference, cloning will result in its inner type - // (usually...) - syn::Type::Reference(cloned_type) => { - elems.push(*cloned_type.elem.clone()) - } - _ => elems.push(el.ty.clone()), - } - } + for arg in arguments { + if arg.used_in_old { + elems.push(arg.ty.clone()); + } else { + // if argument is never used in old, we use a unit type + // in the tuple + let unit_type: syn::Type = parse_quote_spanned! {arg.span => ()}; + elems.push(unit_type); } } // if brackets contain only one type, it's not a tuple. Therefore @@ -410,7 +297,7 @@ impl CheckTranslator { let mut stmts: Vec = Vec::new(); if forget_item_args { for fn_arg in item.sig().inputs.clone() { - if let Ok(arg) = Argument::try_from(&fn_arg) { + if let Ok(arg) = create_argument(&fn_arg, 0) { let name: TokenStream = arg.name.parse().unwrap(); if !arg.is_ref { stmts.push(parse_quote! { @@ -460,8 +347,8 @@ impl CheckVisitor { .sig() .inputs .iter() - .cloned() - .filter_map(|el| Argument::try_from(&el).ok()) + .enumerate() + .filter_map(|(id, el)| create_argument(el, id).ok()) .map(|el| (el.name.clone(), el)) .collect(); Self { @@ -491,28 +378,17 @@ impl VisitMut for CheckVisitor { if self.check_type.has_old_tuple() && (self.within_old || (!arg.is_ref && arg.is_mutable)) { // if it was not already marked to be stored // needs to be checked for indeces to be correct - if !arg.used_in_old { - arg.used_in_old = true; - arg.old_store_index = self.highest_old_index; - self.highest_old_index += 1; - } + arg.used_in_old = true; // replace the identifier with the correct field access let index_token: TokenStream = - arg.old_store_index.to_string().parse().unwrap(); - let tokens = if arg.is_ref { - // cloning will deref the value.. - quote! {(&old_values.#index_token)} - } else { - // unfortunately it could still be a reference.. - // no real solution at this level - quote! {(old_values.#index_token)} - }; + arg.index.to_string().parse().unwrap(); + let tokens = quote! {(old_values.#index_token)}; let new_path: syn::Expr = syn::parse2(tokens).unwrap(); *expr = new_path; } } else if self.within_before_expiry && name == *"result" { let new_path: syn::Expr = parse_quote! { - (&result_before_expiry) + result_before_expiry.0 }; *expr = new_path; } @@ -605,53 +481,65 @@ pub struct Argument { /// resulting from cloning them must be known at ast level pub used_in_old: bool, /// field in old-tuple (old_values.X) where this argument will be stored - pub old_store_index: usize, + pub index: usize, /// whether or not this field is a reference. We assume that all ref types /// start with & (which obviously can be wrong) pub is_ref: bool, pub is_mutable: bool, + pub span: Span, } -impl TryFrom<&FnArg> for Argument { - type Error = (); - fn try_from(arg: &FnArg) -> Result { - match arg { - FnArg::Typed(syn::PatType { pat, ty, .. }) => { - if let syn::Pat::Ident(pat_ident) = *pat.clone() { - let is_mutable = pat_ident.mutability.is_some(); - let is_ref = matches!(**ty, syn::Type::Reference(_)); - let arg = Argument { - name: pat_ident.ident.to_string(), - ty: *ty.clone(), - used_in_old: false, - old_store_index: 0, // meaningless unless used_in_old is true - is_ref, - is_mutable, - }; - Ok(arg) - } else { - Err(()) +fn create_argument(arg: &FnArg, index: usize) -> Result { + let span = arg.span(); + match arg { + FnArg::Typed(syn::PatType { pat, ty, .. }) => { + if let syn::Pat::Ident(pat_ident) = *pat.clone() { + let is_mutable = pat_ident.mutability.is_some(); + + let mut adjusted_ty = *ty.clone(); + if let syn::Type::Reference(ref mut ty_ref) = adjusted_ty { + ty_ref.mutability = None; } - } - FnArg::Receiver(syn::Receiver { reference, mutability, .. }) => { - let is_ref = reference.is_some(); - let is_mutable = mutability.is_some(); - let ty: syn::Type = if is_ref { - parse_quote! {&Self} - } else { - parse_quote! {Self} - }; + + let is_ref = matches!(**ty, syn::Type::Reference(_)); let arg = Argument { - name: "self".to_string(), - ty, // newer versions have this field! could be useful.. + name: pat_ident.ident.to_string(), + ty: adjusted_ty, used_in_old: false, - old_store_index: 0, + index, is_ref, is_mutable, + span, }; Ok(arg) + } else { + // TODO: proper error message + Err(()) } } + FnArg::Receiver(syn::Receiver { + reference, + mutability, + .. + }) => { + let is_ref = reference.is_some(); + let is_mutable = mutability.is_some(); + let ty: syn::Type = if is_ref { + parse_quote! {&Self} + } else { + parse_quote! {Self} + }; + let arg = Argument { + name: "self".to_string(), + ty, // newer versions have this field! could be useful.. + used_in_old: false, + index, + is_ref, + is_mutable, + span, + }; + Ok(arg) + } } } diff --git a/prusti-interface/src/specs/mod.rs b/prusti-interface/src/specs/mod.rs index 4cdf4a70aba..78a47c5315e 100644 --- a/prusti-interface/src/specs/mod.rs +++ b/prusti-interface/src/specs/mod.rs @@ -77,8 +77,6 @@ pub struct SpecCollector<'a, 'tcx> { spec_functions: FxHashMap, /// the functions who's specifications have associated checks. check_functions: FxHashMap, - store_functions: FxHashMap, - store_before_expiry_functions: FxHashMap, check_before_expiry_functions: FxHashMap, /// Map from functions/loops/types to their specifications. @@ -103,9 +101,7 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { spec_functions: FxHashMap::default(), check_functions: FxHashMap::default(), procedure_specs: FxHashMap::default(), - store_functions: FxHashMap::default(), procedure_checks: FxHashMap::default(), - store_before_expiry_functions: FxHashMap::default(), check_before_expiry_functions: FxHashMap::default(), loop_specs: vec![], loop_variants: vec![], @@ -159,32 +155,20 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { } SpecIdRef::Postcondition(id) => { let fn_id = self.check_functions.get(id).unwrap(); - // postconditions always have a fn storing old values - let store_fn_id = self.store_functions.get(id).unwrap(); typed::CheckKind::Post { check: fn_id.to_def_id(), - old_store: store_fn_id.to_def_id(), } } SpecIdRef::Pledge { rhs, .. } => { // can we treat both assert_on_expiry and after_expiry treat the same? let check = self.check_functions.get(rhs).unwrap().to_def_id(); - let old_store = self.store_functions.get(rhs).unwrap().to_def_id(); - // this does not exist for after_expiry pledges let check_before_expiry = self .check_before_expiry_functions .get(rhs) .map(|id| id.to_def_id()); - let store_before_expiry = self - .store_before_expiry_functions - .get(rhs) - .unwrap() - .to_def_id(); typed::CheckKind::Pledge { check, - old_store, check_before_expiry, - store_before_expiry, } } // Todo: Pledges, Assume? @@ -659,13 +643,6 @@ impl<'a, 'tcx> intravisit::Visitor<'tcx> for SpecCollector<'a, 'tcx> { // check_id work just like spec_ids let check_id = parse_spec_id(raw_check_id, def_id); self.check_functions.insert(check_id, local_id); - } else if let Some(raw_store_id) = read_prusti_attr("store_id", attrs) { - let store_id = parse_spec_id(raw_store_id, def_id); - self.store_functions.insert(store_id, local_id); - } else if let Some(raw_store_expiry_id) = read_prusti_attr("store_before_expiry_id", attrs) - { - let id = parse_spec_id(raw_store_expiry_id, def_id); - self.store_before_expiry_functions.insert(id, local_id); } else if let Some(raw_before_expiry_check_id) = read_prusti_attr("check_before_expiry_id", attrs) { diff --git a/prusti-interface/src/specs/typed.rs b/prusti-interface/src/specs/typed.rs index 4aaa946e5a4..5d9410f90cc 100644 --- a/prusti-interface/src/specs/typed.rs +++ b/prusti-interface/src/specs/typed.rs @@ -30,14 +30,11 @@ pub enum CheckKind { Pre(DefId), Post { check: DefId, - old_store: DefId, }, // actual check and old_store function Assume(DefId), Pledge { check: DefId, - old_store: DefId, check_before_expiry: Option, - store_before_expiry: DefId, }, } @@ -100,14 +97,14 @@ impl DefSpecificationMap { } } - pub fn get_post_checks(&self, def_id: &DefId) -> Vec<(DefId, DefId)> { + pub fn get_post_checks(&self, def_id: &DefId) -> Vec { let checks_opt = self.checks.get(def_id); if let Some(checks) = checks_opt { checks .iter() .filter_map(|el| { - if let CheckKind::Post { check, old_store } = el { - Some((*check, *old_store)) + if let CheckKind::Post { check } = el { + Some(*check) } else { None } diff --git a/prusti/src/modify_mir/mir_helper.rs b/prusti/src/modify_mir/mir_helper.rs index ad115c39aeb..a9b7e2e8a2f 100644 --- a/prusti/src/modify_mir/mir_helper.rs +++ b/prusti/src/modify_mir/mir_helper.rs @@ -1,14 +1,9 @@ use prusti_rustc_interface::{ middle::{ - mir::{ - self, - patch::MirPatch, - visit::{MutVisitor}, - Body, TerminatorKind, - }, + mir::{self, patch::MirPatch, visit::MutVisitor, Body, TerminatorKind}, ty::{self, TyCtxt}, }, - span::{self, def_id::DefId}, + span::{self, def_id::DefId, DUMMY_SP}, }; use rustc_hash::FxHashMap; @@ -40,6 +35,16 @@ pub fn is_mutable_arg(body: &Body<'_>, local: mir::Local) -> bool { } } +pub fn make_immutable<'tcx>(tcx: TyCtxt<'tcx>, ty: ty::Ty<'tcx>) -> ty::Ty<'tcx> { + match *ty.kind() { + ty::Ref(region, inner_ty, mir::Mutability::Mut) => { + let new_inner_ty = make_immutable(tcx, inner_ty); + tcx.mk_imm_ref(region, new_inner_ty) + } + _ => ty, + } +} + pub fn fn_return_ty(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Ty<'_> { let fn_sig = tcx.fn_sig(def_id).subst_identity(); fn_sig.output().skip_binder() @@ -57,12 +62,22 @@ pub fn dummy_region(tcx: TyCtxt<'_>) -> ty::Region<'_> { tcx.mk_region_from_kind(kind) } -pub fn rvalue_reference_to_local( - tcx: TyCtxt<'_>, - local: mir::Local, +pub fn unit_const(tcx: TyCtxt<'_>) -> mir::Operand<'_> { + let unit_ty = tcx.mk_unit(); + let constant_kind = mir::ConstantKind::zero_sized(unit_ty); + let constant = mir::Constant { + span: DUMMY_SP, + user_ty: None, + literal: constant_kind, + }; + mir::Operand::Constant(box constant) +} + +pub fn rvalue_reference_to_local<'tcx>( + tcx: TyCtxt<'tcx>, + place: mir::Place<'tcx>, mutable: bool, -) -> mir::Rvalue<'_> { - let place = mir::Place::from(local); +) -> mir::Rvalue<'tcx> { let dummy_region = dummy_region(tcx); let borrow_kind = if mutable { mir::BorrowKind::Mut { @@ -168,7 +183,7 @@ pub fn create_call_block<'tcx>( .subst(tcx, substs) .output() .skip_binder(); - mir::Place::from(patch.new_internal(ret_ty, span::DUMMY_SP)) + mir::Place::from(patch.new_temp(ret_ty, span::DUMMY_SP)) }; // args have to be constructed beforehand, including result or old_values diff --git a/prusti/src/modify_mir/mir_modify.rs b/prusti/src/modify_mir/mir_modify.rs index a99f49d85ef..0eadf075ed0 100644 --- a/prusti/src/modify_mir/mir_modify.rs +++ b/prusti/src/modify_mir/mir_modify.rs @@ -67,10 +67,10 @@ pub(crate) fn mir_checked( #[derive(Debug, Clone)] pub struct PledgeToProcess<'tcx> { check: DefId, - store_before_expiry: DefId, check_before_expiry: Option, old_values_place: Place<'tcx>, before_expiry_place: Place<'tcx>, + before_expiry_ty: ty::Ty<'tcx>, destination: Place<'tcx>, // the args the function was called with args: Vec>, @@ -152,10 +152,12 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { .args_to_be_cloned .clone() .iter() - .for_each(|local| { + .for_each(|&local| { let mut patch = MirPatch::new(body); - current_target = self - .insert_clone_argument(*local, current_target, &mut patch) + let place: mir::Place = local.into(); + let destination = *self.stored_arguments.get(&local).unwrap(); + (current_target, _) = self + .insert_clone_argument(place, current_target, Some(destination), &mut patch) .unwrap(); let terminator_kind = TerminatorKind::Goto { target: current_target, @@ -213,8 +215,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { .get(local) .expect("pledge expiration without an actual pledge"); let mut patcher = self.current_patcher.take().unwrap(); - let start_block = create_pledge_call_chain( - self.tcx, + let start_block = self.create_pledge_call_chain( pledge, target, &mut patcher, @@ -284,9 +285,8 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { let mut patch = self.current_patcher.take().unwrap(); let return_ty = fn_return_ty(self.tcx, check_id); assert!(return_ty.is_unit()); - let res = patch.new_internal(return_ty, DUMMY_SP); - caller_block = prepend_call( - self.tcx, + let res = patch.new_temp(return_ty, DUMMY_SP); + caller_block = self.prepend_call( &mut patch, check_id, caller_block, @@ -298,26 +298,22 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { self.current_patcher = Some(patch); } } - CheckKind::Post { - check: check_id, - old_store: old_store_id, - } => { + CheckKind::Post { check: check_id } => { // since here, we don't have mutable access to the body, // we created a patcher beforehand which we can use here // and apply later let mut patch = self.current_patcher.take().unwrap(); - (caller_block, current_target) = surround_call_with_store_and_check( - self.tcx, - &mut patch, - check_id, - old_store_id, - caller_block, - current_target, - *destination, - args.clone(), - substs, - call_fn_terminator.clone(), - ); + (caller_block, current_target) = self + .surround_call_with_store_and_check( + &mut patch, + check_id, + caller_block, + current_target, + *destination, + args.clone(), + substs, + call_fn_terminator.clone(), + ); replace_target(&mut call_fn_terminator, current_target.unwrap()); // If there are multiple checks, this also should behave @@ -327,41 +323,50 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } CheckKind::Pledge { check, - old_store, check_before_expiry, - store_before_expiry, } => { // get patcher: let mut patch = self.current_patcher.take().unwrap(); // 1. store old values, create local: - let old_values_ty = fn_return_ty(self.tcx, old_store); + let check_sig = self.tcx.fn_sig(check).subst(self.tcx, substs); + let check_sig = self.tcx.normalize_erasing_late_bound_regions( + ty::ParamEnv::reveal_all(), + check_sig, + ); + let inputs = check_sig.inputs(); + let old_values_ty = inputs[inputs.len() - 2]; + let before_expiry_ty = inputs[inputs.len() - 1]; + let old_values_place = - Place::from(patch.new_internal(old_values_ty, DUMMY_SP)); + Place::from(patch.new_temp(old_values_ty, DUMMY_SP)); // store_before_expiry has to always exist? // if yes: - let before_expiry_ty = fn_return_ty(self.tcx, store_before_expiry); let before_expiry_place = - Place::from(patch.new_internal(before_expiry_ty, DUMMY_SP)); + Place::from(patch.new_temp(before_expiry_ty, DUMMY_SP)); - caller_block = prepend_call( - self.tcx, + let (chain_start, new_caller) = self.prepend_old_cloning( &mut patch, - old_store, - caller_block, - args.clone(), - substs, call_fn_terminator.clone(), old_values_place, + old_values_ty, + args.clone(), + ); + patch.patch_terminator( + caller_block, + TerminatorKind::Goto { + target: chain_start, + }, ); + caller_block = new_caller; // *destination is the loan! // figure out where it expires! let pledge_to_process = PledgeToProcess { check, check_before_expiry, - store_before_expiry, old_values_place, before_expiry_place, + before_expiry_ty, destination: *destination, args: args.clone(), substs, @@ -382,27 +387,29 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { impl<'tcx> InsertChecksVisitor<'tcx> { fn insert_clone_argument( - &mut self, - arg: mir::Local, + &self, + arg: mir::Place<'tcx>, target: BasicBlock, + destination: Option, patch: &mut MirPatch<'tcx>, - ) -> Result { + ) -> Result<(BasicBlock, mir::Local), ()> { // if we deal with a reference, we can directly call clone on it // otherwise we have to create a reference first, to pass to the clone // function. let clone_defid = get_clone_defid(self.tcx).ok_or(())?; // let clone_trait_defid = self.tcx.lang_items().clone_trait().unwrap(); - let local_decl = self.body_copy.local_decls.get(arg).unwrap(); - let arg_ty = local_decl.ty; - let destination = *self.stored_arguments.get(&arg).unwrap(); + let arg_ty = make_immutable(self.tcx, arg.ty(&self.body_copy.local_decls, self.tcx).ty); + println!("arg type: {:?}", arg_ty); + + let dest = destination.unwrap_or_else(|| patch.new_temp(arg_ty, DUMMY_SP)); println!( "trying to clone arg: {:?} into destination: {:?}", - arg, destination + arg, dest ); if !arg_ty.is_ref() { println!("handling a non-ref old arg"); let ref_ty = create_reference_type(self.tcx, arg_ty); - let ref_arg = patch.new_internal(ref_ty, DUMMY_SP); + let ref_arg = patch.new_temp(ref_ty, DUMMY_SP); // add a statement to deref the old_argument let rvalue = rvalue_reference_to_local(self.tcx, arg, false); // the statement to be added to the block that has the call clone @@ -421,7 +428,7 @@ impl<'tcx> InsertChecksVisitor<'tcx> { clone_defid, clone_args, substs, - Some(destination.into()), + Some(dest.into()), Some(target), )?; patch.add_statement( @@ -432,16 +439,16 @@ impl<'tcx> InsertChecksVisitor<'tcx> { ref_stmt, ); - Ok(new_block) + Ok((new_block, dest)) // let block_data = BasicBlockData::new() } else { // create a new local to store the result of clone: let deref_ty = arg_ty.builtin_deref(false).ok_or(())?.ty; println!("dereferenced type: {:?}", deref_ty); - let clone_dest = patch.new_internal(deref_ty, DUMMY_SP); + let clone_dest = patch.new_temp(deref_ty, DUMMY_SP); let generic_ty = ty::subst::GenericArg::from(deref_ty); let substs = self.tcx.mk_substs(&[generic_ty]); - let clone_args = vec![Operand::Move(mir::Place::from(arg))]; + let clone_args = vec![Operand::Move(arg)]; // add an additional simple block afterwards, that dereferences // the the cloned value into the original receiver of old: // create it beforehand, so we can set the precedors target correctly @@ -453,8 +460,8 @@ impl<'tcx> InsertChecksVisitor<'tcx> { let second_block = patch.new_block(block_data); // borrow the clone result - let rvalue = rvalue_reference_to_local(self.tcx, clone_dest, true); - let ref_stmt = mir::StatementKind::Assign(box (destination.into(), rvalue)); + let rvalue = rvalue_reference_to_local(self.tcx, clone_dest.into(), false); + let ref_stmt = mir::StatementKind::Assign(box (dest.into(), rvalue)); patch.add_statement( mir::Location { block: second_block, @@ -473,15 +480,15 @@ impl<'tcx> InsertChecksVisitor<'tcx> { Some(second_block), )?; - Ok(new_block) + Ok((new_block, dest)) } } pub fn create_and_replace_arguments(&mut self, body: &mut Body<'tcx>) { let mut patcher = MirPatch::new(body); for arg in &self.mir_info.args_to_be_cloned { - let ty = body.local_decls.get(*arg).unwrap().ty; - let new_var = patcher.new_internal(ty, DUMMY_SP); + let ty = make_immutable(self.tcx, body.local_decls.get(*arg).unwrap().ty); + let new_var = patcher.new_temp(ty, DUMMY_SP); self.stored_arguments.insert(*arg, new_var); } let mut replacer = ArgumentReplacer::new(self.tcx, &self.stored_arguments); @@ -498,157 +505,210 @@ impl<'tcx> InsertChecksVisitor<'tcx> { } patcher.apply(body); } -} -/// Given a function call, prepend another function call directly before -/// it. Done by moving the existing call to a new block, replacing the -/// terminator of the existing block with a new call jumping to the new block -#[allow(clippy::too_many_arguments)] -fn prepend_call<'tcx>( - tcx: TyCtxt<'tcx>, - patcher: &mut MirPatch<'tcx>, - fn_id: DefId, - caller_block: BasicBlock, - args: Vec>, - substs: ty::subst::SubstsRef<'tcx>, - terminator: Terminator<'tcx>, - dest_place: Place<'tcx>, -) -> BasicBlock { - // get the bodies of the store and check function - let new_block_data = BasicBlockData::new(Some(terminator)); - let new_block = patcher.new_block(new_block_data); - - let func_ty = tcx.mk_ty_from_kind(TyKind::FnDef(fn_id, substs)); - let func = Operand::Constant(Box::new(Constant { - span: DUMMY_SP, - user_ty: None, - literal: ConstantKind::zero_sized(func_ty), - })); - - let terminator = TerminatorKind::Call { - func, - args: args.clone(), - destination: dest_place, - target: Some(new_block), - cleanup: None, - from_hir_call: false, - fn_span: DUMMY_SP, - }; - // the block that initially calls the check function, now calls the store - // function - patcher.patch_terminator(caller_block, terminator); - new_block -} + #[allow(clippy::too_many_arguments)] + fn surround_call_with_store_and_check( + &self, + patch: &mut MirPatch<'tcx>, + check_id: DefId, + caller_block: BasicBlock, + target: Option, + result_operand: Place<'tcx>, + args: Vec>, + substs: ty::subst::SubstsRef<'tcx>, + original_terminator: Terminator<'tcx>, + ) -> (BasicBlock, Option) { + // find the type of that local + let check_sig = self.tcx.fn_sig(check_id).subst(self.tcx, substs); + let check_sig = self + .tcx + .normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), check_sig); + + let old_ty = *check_sig.inputs().last().unwrap(); + assert!(matches!(old_ty.kind(), ty::Tuple(_))); + + let old_dest_place = Place::from(patch.new_temp(old_ty, DUMMY_SP)); + + // construct arguments: first the arguments the function is called with, then the result of + // that call, then the old values: + let mut new_args = args.clone(); + new_args.push(Operand::Move(result_operand)); + new_args.push(Operand::Move(old_dest_place)); + + // we store the target, create a new block per check function + // chain these with the final call having the original target, + // change the target of the call to the first block of our chain. + let (check_block, _) = + create_call_block(self.tcx, patch, check_id, new_args, substs, None, target).unwrap(); + + // the terminator that calls the original function, but in this case jumps to + // a check function after instead of original target + // for now we just construct it, this does not modify the terminator + // in the CFG yet + let mut call_terminator = original_terminator; + replace_target(&mut call_terminator, check_block); + + let (chain_start, new_caller) = + self.prepend_old_cloning(patch, call_terminator, old_dest_place, old_ty, args); + + println!("chain starting at: {:?}", chain_start); + // make the original caller_block point to the first clone block + // after separate_terminator_from_block this is a goto so we don't break + // anything + patch.patch_terminator( + caller_block, + TerminatorKind::Goto { + target: chain_start, + }, + ); + (new_caller, Some(check_block)) + } -fn create_pledge_call_chain<'tcx>( - tcx: TyCtxt<'tcx>, - pledge: &PledgeToProcess<'tcx>, - target: BasicBlock, - patcher: &mut MirPatch<'tcx>, -) -> Result { - // given a location, insert the call chain to check a pledge: - // since we need to know the targets for each call, the blocks need to be created - // in reversed order. - - // Create call to check function: - let mut check_args = pledge.args.clone(); - check_args.push(Operand::Move(pledge.destination)); //result arg - check_args.push(Operand::Move(pledge.old_values_place)); - check_args.push(Operand::Move(pledge.before_expiry_place)); - let (check_after_block, _) = create_call_block( - tcx, - patcher, - pledge.check, - check_args, - pledge.substs, - None, - Some(target), - )?; - - // If there is a check_before_expiry block, creat it - let next_target = if let Some(check_before_expiry) = pledge.check_before_expiry { - let before_check_args = vec![ - Operand::Move(pledge.destination), - Operand::Move(pledge.old_values_place), - ]; - let (new_block, _) = create_call_block( - tcx, + fn prepend_old_cloning( + &self, + patch: &mut MirPatch<'tcx>, + terminator: Terminator<'tcx>, + old_dest_place: mir::Place<'tcx>, + old_ty: ty::Ty<'tcx>, + args: Vec>, + ) -> (BasicBlock, BasicBlock) { + let new_block_data = BasicBlockData::new(Some(terminator)); + let current_caller = patch.new_block(new_block_data); + let mut current_target = current_caller; + + let mut old_tuple = Vec::new(); + let old_tuple_fields = old_ty.tuple_fields(); + for (id, operand) in args.iter().enumerate() { + let old_values_ty = old_tuple_fields.get(id).unwrap(); + if old_values_ty.is_unit() { + // we already know from ast, that this variable does not need + // to be cloned + let unit_const = unit_const(self.tcx); + old_tuple.push(unit_const); + } else { + match operand { + mir::Operand::Constant(_) => { + old_tuple.push(operand.clone()); + } + mir::Operand::Move(place) | mir::Operand::Copy(place) => { + // prepends clone blocks before the actual function is called + let (start_block, destination) = self + .insert_clone_argument(*place, current_target, None, patch) + .unwrap(); + current_target = start_block; + // add the result to our tuple: + old_tuple.push(mir::Operand::Move(destination.into())); + } + } + } + } + let old_rvalue = mir::Rvalue::Aggregate(box mir::AggregateKind::Tuple, old_tuple); + let stmt_kind = mir::StatementKind::Assign(box (old_dest_place, old_rvalue)); + let location = mir::Location { + block: current_caller, + statement_index: 0, + }; + patch.add_statement(location, stmt_kind); + + // (start of clone-chain, block calling annotated function) + (current_target, current_caller) + } + + /// Given a function call, prepend another function call directly before + /// it. Done by moving the existing call to a new block, replacing the + /// terminator of the existing block with a new call jumping to the new block + #[allow(clippy::too_many_arguments)] + fn prepend_call( + &self, + patcher: &mut MirPatch<'tcx>, + fn_id: DefId, + caller_block: BasicBlock, + args: Vec>, + substs: ty::subst::SubstsRef<'tcx>, + terminator: Terminator<'tcx>, + dest_place: Place<'tcx>, + ) -> BasicBlock { + // get the bodies of the store and check function + let new_block_data = BasicBlockData::new(Some(terminator)); + let new_block = patcher.new_block(new_block_data); + + let func_ty = self.tcx.mk_ty_from_kind(TyKind::FnDef(fn_id, substs)); + let func = Operand::Constant(Box::new(Constant { + span: DUMMY_SP, + user_ty: None, + literal: ConstantKind::zero_sized(func_ty), + })); + + let terminator = TerminatorKind::Call { + func, + args: args.clone(), + destination: dest_place, + target: Some(new_block), + cleanup: None, + from_hir_call: false, + fn_span: DUMMY_SP, + }; + // the block that initially calls the check function, now calls the store + // function + patcher.patch_terminator(caller_block, terminator); + new_block + } + + fn create_pledge_call_chain( + &self, + pledge: &PledgeToProcess<'tcx>, + target: BasicBlock, + patcher: &mut MirPatch<'tcx>, + ) -> Result { + // given a location, insert the call chain to check a pledge: + // since we need to know the targets for each call, the blocks need to be created + // in reversed order. + + // Create call to check function: + let mut check_args = pledge.args.clone(); + check_args.push(Operand::Move(pledge.destination)); //result arg + check_args.push(Operand::Move(pledge.old_values_place)); + check_args.push(Operand::Move(pledge.before_expiry_place)); + let (check_after_block, _) = create_call_block( + self.tcx, patcher, - check_before_expiry, - before_check_args, + pledge.check, + check_args, pledge.substs, None, - Some(check_after_block), + Some(target), )?; - new_block - } else { - check_after_block - }; - - // 1. Call store_before_expiry, result of original call is pledge.destination - let args = vec![Operand::Move(pledge.destination)]; - let (store_block, _) = create_call_block( - tcx, - patcher, - pledge.store_before_expiry, - args, - pledge.substs, - Some(pledge.before_expiry_place), - Some(next_target), - )?; - - Ok(store_block) -} -#[allow(clippy::too_many_arguments)] -fn surround_call_with_store_and_check<'tcx>( - tcx: TyCtxt<'tcx>, - patch: &mut MirPatch<'tcx>, - check_id: DefId, - old_store_id: DefId, - caller_block: BasicBlock, - target: Option, - result_operand: Place<'tcx>, - args: Vec>, - substs: ty::subst::SubstsRef<'tcx>, - original_terminator: Terminator<'tcx>, -) -> (BasicBlock, Option) { - // find the type of that local - let old_ret_ty = fn_return_ty(tcx, old_store_id); - let old_dest_place = Place::from(patch.new_internal(old_ret_ty, DUMMY_SP)); - - // construct arguments: first the arguments the function is called with, then the result of - // that call, then the old values: - let mut new_args = args.clone(); - new_args.push(Operand::Move(result_operand)); - new_args.push(Operand::Move(old_dest_place)); - - // we store the target, create a new block per check function - // chain these with the final call having the original target, - // change the target of the call to the first block of our chain. - let (check_block, _) = - create_call_block(tcx, patch, check_id, new_args, substs, None, target).unwrap(); - let next_target = Some(check_block); - - // the terminator that calls the original function, but in this case jumps to - // a check function after instead of original target - let mut call_fn_terminator = original_terminator; - replace_target(&mut call_fn_terminator, check_block); - - let new_caller_block = prepend_call( - tcx, - patch, - old_store_id, - caller_block, - args, - substs, - call_fn_terminator.clone(), - old_dest_place, - ); - - // If there are multiple checks, this also should behave - // correctly, since on the second iteration this target - // is already the new block - - (new_caller_block, next_target) + // If there is a check_before_expiry block, creat it + let next_target = if let Some(check_before_expiry) = pledge.check_before_expiry { + let before_check_args = vec![ + Operand::Move(pledge.destination), + Operand::Move(pledge.old_values_place), + ]; + let (new_block, _) = create_call_block( + self.tcx, + patcher, + check_before_expiry, + before_check_args, + pledge.substs, + None, + Some(check_after_block), + )?; + new_block + } else { + check_after_block + }; + + // 1. Call store_before_expiry, result of original call is pledge.destination + let args = vec![Operand::Move(pledge.destination)]; + let terminator = mir::Terminator { + source_info: dummy_source_info(), + kind: mir::TerminatorKind::Goto { + target: next_target, + }, + }; + let (clone_chain_start, _) = self.prepend_old_cloning(patcher, terminator, pledge.before_expiry_place, pledge.before_expiry_ty, args); + + Ok(clone_chain_start) + } } From ec781ae0ecff66ceeda72286f043cb0a4d5c4d41 Mon Sep 17 00:00:00 2001 From: cedric Date: Wed, 26 Jul 2023 15:49:07 +0200 Subject: [PATCH 20/45] Fix check signature mutability issues with runtime checks --- .../src/runtime_checks/translation.rs | 10 +--------- prusti/src/modify_mir/mir_helper.rs | 18 +++++++++--------- prusti/src/modify_mir/mir_modify.rs | 18 +++++++++++++----- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 538b1ab63eb..9a3a1f5bc64 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -227,9 +227,6 @@ impl CheckTranslator { // a function with default return type does not make a lot of sense.. parse_quote!{()} }; - if let syn::Type::Reference(ref mut ty_ref) = output_ty { - ty_ref.mutability = None; - } let before_expiry_arg = parse_quote_spanned! {item.span() => result_before_expiry: (#output_ty,) }; @@ -496,15 +493,10 @@ fn create_argument(arg: &FnArg, index: usize) -> Result { if let syn::Pat::Ident(pat_ident) = *pat.clone() { let is_mutable = pat_ident.mutability.is_some(); - let mut adjusted_ty = *ty.clone(); - if let syn::Type::Reference(ref mut ty_ref) = adjusted_ty { - ty_ref.mutability = None; - } - let is_ref = matches!(**ty, syn::Type::Reference(_)); let arg = Argument { name: pat_ident.ident.to_string(), - ty: adjusted_ty, + ty: *ty.clone(), used_in_old: false, index, is_ref, diff --git a/prusti/src/modify_mir/mir_helper.rs b/prusti/src/modify_mir/mir_helper.rs index a9b7e2e8a2f..676039bc923 100644 --- a/prusti/src/modify_mir/mir_helper.rs +++ b/prusti/src/modify_mir/mir_helper.rs @@ -35,15 +35,15 @@ pub fn is_mutable_arg(body: &Body<'_>, local: mir::Local) -> bool { } } -pub fn make_immutable<'tcx>(tcx: TyCtxt<'tcx>, ty: ty::Ty<'tcx>) -> ty::Ty<'tcx> { - match *ty.kind() { - ty::Ref(region, inner_ty, mir::Mutability::Mut) => { - let new_inner_ty = make_immutable(tcx, inner_ty); - tcx.mk_imm_ref(region, new_inner_ty) - } - _ => ty, - } -} +// pub fn make_immutable<'tcx>(tcx: TyCtxt<'tcx>, ty: ty::Ty<'tcx>) -> ty::Ty<'tcx> { +// match *ty.kind() { +// ty::Ref(region, inner_ty, mir::Mutability::Mut) => { +// let new_inner_ty = make_immutable(tcx, inner_ty); +// tcx.mk_imm_ref(region, new_inner_ty) +// } +// _ => ty, +// } +// } pub fn fn_return_ty(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Ty<'_> { let fn_sig = tcx.fn_sig(def_id).subst_identity(); diff --git a/prusti/src/modify_mir/mir_modify.rs b/prusti/src/modify_mir/mir_modify.rs index 0eadf075ed0..860e8c08c41 100644 --- a/prusti/src/modify_mir/mir_modify.rs +++ b/prusti/src/modify_mir/mir_modify.rs @@ -157,7 +157,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { let place: mir::Place = local.into(); let destination = *self.stored_arguments.get(&local).unwrap(); (current_target, _) = self - .insert_clone_argument(place, current_target, Some(destination), &mut patch) + .insert_clone_argument(place, current_target, Some(destination), &mut patch, None) .unwrap(); let terminator_kind = TerminatorKind::Goto { target: current_target, @@ -392,13 +392,20 @@ impl<'tcx> InsertChecksVisitor<'tcx> { target: BasicBlock, destination: Option, patch: &mut MirPatch<'tcx>, + target_type_opt: Option>, ) -> Result<(BasicBlock, mir::Local), ()> { // if we deal with a reference, we can directly call clone on it // otherwise we have to create a reference first, to pass to the clone // function. let clone_defid = get_clone_defid(self.tcx).ok_or(())?; // let clone_trait_defid = self.tcx.lang_items().clone_trait().unwrap(); - let arg_ty = make_immutable(self.tcx, arg.ty(&self.body_copy.local_decls, self.tcx).ty); + // + let arg_ty = if let Some(target_type) = target_type_opt { + target_type + } else { + arg.ty(&self.body_copy.local_decls, self.tcx).ty + }; + let mutable_ref = matches!(arg_ty.ref_mutability(), Some(mir::Mutability::Mut)); println!("arg type: {:?}", arg_ty); let dest = destination.unwrap_or_else(|| patch.new_temp(arg_ty, DUMMY_SP)); @@ -460,7 +467,7 @@ impl<'tcx> InsertChecksVisitor<'tcx> { let second_block = patch.new_block(block_data); // borrow the clone result - let rvalue = rvalue_reference_to_local(self.tcx, clone_dest.into(), false); + let rvalue = rvalue_reference_to_local(self.tcx, clone_dest.into(), mutable_ref); let ref_stmt = mir::StatementKind::Assign(box (dest.into(), rvalue)); patch.add_statement( mir::Location { @@ -487,7 +494,7 @@ impl<'tcx> InsertChecksVisitor<'tcx> { pub fn create_and_replace_arguments(&mut self, body: &mut Body<'tcx>) { let mut patcher = MirPatch::new(body); for arg in &self.mir_info.args_to_be_cloned { - let ty = make_immutable(self.tcx, body.local_decls.get(*arg).unwrap().ty); + let ty = body.local_decls.get(*arg).unwrap().ty; let new_var = patcher.new_temp(ty, DUMMY_SP); self.stored_arguments.insert(*arg, new_var); } @@ -591,9 +598,10 @@ impl<'tcx> InsertChecksVisitor<'tcx> { old_tuple.push(operand.clone()); } mir::Operand::Move(place) | mir::Operand::Copy(place) => { + let target_ty = Some(old_tuple_fields[id]); // prepends clone blocks before the actual function is called let (start_block, destination) = self - .insert_clone_argument(*place, current_target, None, patch) + .insert_clone_argument(*place, current_target, None, patch, target_ty) .unwrap(); current_target = start_block; // add the result to our tuple: From a6daab3560bb6a3e79d5d152e0104c39416bb355 Mon Sep 17 00:00:00 2001 From: cedric Date: Sun, 30 Jul 2023 23:18:57 +0200 Subject: [PATCH 21/45] Insert drops for manually cloned MIR locals --- .../src/runtime_checks/translation.rs | 16 +- prusti/src/modify_mir/mir_modify.rs | 163 ++++++++++++++---- 2 files changed, 135 insertions(+), 44 deletions(-) diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 9a3a1f5bc64..2b776051a23 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -178,8 +178,6 @@ impl CheckTranslator { item, include_item_args, executed_after, - executed_after, - before_expiry_argument, ); let contract_string = expr_to_check.to_token_stream().to_string(); let failure_message = format!("Contract {} was violated at runtime", contract_string); @@ -220,7 +218,7 @@ impl CheckTranslator { check_item.sig.inputs.push(old_arg); } if before_expiry_argument { - let mut output_ty: syn::Type = if let syn::ReturnType::Type(_, box ty) = &item.sig().output { + let output_ty: syn::Type = if let syn::ReturnType::Type(_, box ty) = &item.sig().output { ty.clone() } else { // probably not our job to throw an error here? But a pledge for @@ -286,8 +284,6 @@ impl CheckTranslator { item: &untyped::AnyFnItem, forget_item_args: bool, has_result_arg: bool, - has_old_arg: bool, - has_before_expiry_arg: bool, ) -> syn::Block { // go through all inputs, if they are not references add a forget // statement @@ -311,16 +307,6 @@ impl CheckTranslator { std::mem::forget(result); }) } - if has_old_arg { - stmts.push(parse_quote! { - std::mem::forget(old_values); - }) - } - if has_before_expiry_arg { - stmts.push(parse_quote! { - std::mem::forget(result_before_expiry); - }) - } syn::Block { brace_token: syn::token::Brace::default(), stmts, diff --git a/prusti/src/modify_mir/mir_modify.rs b/prusti/src/modify_mir/mir_modify.rs index 860e8c08c41..064a9d696a9 100644 --- a/prusti/src/modify_mir/mir_modify.rs +++ b/prusti/src/modify_mir/mir_modify.rs @@ -75,6 +75,7 @@ pub struct PledgeToProcess<'tcx> { // the args the function was called with args: Vec>, substs: ty::subst::SubstsRef<'tcx>, + locals_to_drop: Vec, } pub struct InsertChecksVisitor<'tcx> { @@ -156,8 +157,14 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { let mut patch = MirPatch::new(body); let place: mir::Place = local.into(); let destination = *self.stored_arguments.get(&local).unwrap(); - (current_target, _) = self - .insert_clone_argument(place, current_target, Some(destination), &mut patch, None) + (current_target, _, _) = self + .insert_clone_argument( + place, + current_target, + Some(destination), + &mut patch, + None, + ) .unwrap(); let terminator_kind = TerminatorKind::Goto { target: current_target, @@ -215,12 +222,9 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { .get(local) .expect("pledge expiration without an actual pledge"); let mut patcher = self.current_patcher.take().unwrap(); - let start_block = self.create_pledge_call_chain( - pledge, - target, - &mut patcher, - ) - .unwrap(); + let start_block = self + .create_pledge_call_chain(pledge, target, &mut patcher) + .unwrap(); let new_terminator = TerminatorKind::Goto { target: start_block, @@ -344,13 +348,14 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { let before_expiry_place = Place::from(patch.new_temp(before_expiry_ty, DUMMY_SP)); - let (chain_start, new_caller) = self.prepend_old_cloning( - &mut patch, - call_fn_terminator.clone(), - old_values_place, - old_values_ty, - args.clone(), - ); + let (chain_start, new_caller, locals_to_drop) = self + .prepend_old_cloning( + &mut patch, + call_fn_terminator.clone(), + old_values_place, + old_values_ty, + args.clone(), + ); patch.patch_terminator( caller_block, TerminatorKind::Goto { @@ -370,6 +375,7 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { destination: *destination, args: args.clone(), substs, + locals_to_drop, }; self.pledges_to_process .insert(destination.local, pledge_to_process); @@ -386,6 +392,9 @@ impl<'tcx> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { } impl<'tcx> InsertChecksVisitor<'tcx> { + // Clone an argument manually. Returns the basic_block that starts the cloning + // and the local variable the value is cloned into. Additionally, returns an + // optional other local, that has to be dropped! fn insert_clone_argument( &self, arg: mir::Place<'tcx>, @@ -393,11 +402,12 @@ impl<'tcx> InsertChecksVisitor<'tcx> { destination: Option, patch: &mut MirPatch<'tcx>, target_type_opt: Option>, - ) -> Result<(BasicBlock, mir::Local), ()> { + ) -> Result<(BasicBlock, mir::Local, Option), ()> { // if we deal with a reference, we can directly call clone on it // otherwise we have to create a reference first, to pass to the clone // function. let clone_defid = get_clone_defid(self.tcx).ok_or(())?; + let param_env = self.tcx.param_env(self.current_def_id.unwrap()); // let clone_trait_defid = self.tcx.lang_items().clone_trait().unwrap(); // let arg_ty = if let Some(target_type) = target_type_opt { @@ -414,7 +424,8 @@ impl<'tcx> InsertChecksVisitor<'tcx> { arg, dest ); if !arg_ty.is_ref() { - println!("handling a non-ref old arg"); + // non-ref arg means we first deref and then clone. No need to + // drop, since result is moved to check let ref_ty = create_reference_type(self.tcx, arg_ty); let ref_arg = patch.new_temp(ref_ty, DUMMY_SP); // add a statement to deref the old_argument @@ -446,13 +457,22 @@ impl<'tcx> InsertChecksVisitor<'tcx> { ref_stmt, ); - Ok((new_block, dest)) + Ok((new_block, dest, None)) // let block_data = BasicBlockData::new() } else { // create a new local to store the result of clone: let deref_ty = arg_ty.builtin_deref(false).ok_or(())?.ty; - println!("dereferenced type: {:?}", deref_ty); let clone_dest = patch.new_temp(deref_ty, DUMMY_SP); + let to_drop = if deref_ty.needs_drop(self.tcx, param_env) { + Some(clone_dest) + } else { + None + }; + + println!( + "dereferenced type: {:?}, needs drop? {:?}", + deref_ty, to_drop + ); let generic_ty = ty::subst::GenericArg::from(deref_ty); let substs = self.tcx.mk_substs(&[generic_ty]); let clone_args = vec![Operand::Move(arg)]; @@ -487,7 +507,7 @@ impl<'tcx> InsertChecksVisitor<'tcx> { Some(second_block), )?; - Ok((new_block, dest)) + Ok((new_block, dest, to_drop)) } } @@ -527,15 +547,23 @@ impl<'tcx> InsertChecksVisitor<'tcx> { ) -> (BasicBlock, Option) { // find the type of that local let check_sig = self.tcx.fn_sig(check_id).subst(self.tcx, substs); + let param_env = self.tcx.param_env(self.current_def_id.unwrap()); let check_sig = self .tcx - .normalize_erasing_late_bound_regions(ty::ParamEnv::reveal_all(), check_sig); + .normalize_erasing_late_bound_regions(param_env, check_sig); let old_ty = *check_sig.inputs().last().unwrap(); assert!(matches!(old_ty.kind(), ty::Tuple(_))); let old_dest_place = Place::from(patch.new_temp(old_ty, DUMMY_SP)); + let drop_block_data = BasicBlockData::new(Some(Terminator { + source_info: dummy_source_info(), + kind: TerminatorKind::Goto { + target: BasicBlock::MAX, + }, + })); + let drop_start = patch.new_block(drop_block_data); // construct arguments: first the arguments the function is called with, then the result of // that call, then the old values: let mut new_args = args.clone(); @@ -545,8 +573,16 @@ impl<'tcx> InsertChecksVisitor<'tcx> { // we store the target, create a new block per check function // chain these with the final call having the original target, // change the target of the call to the first block of our chain. - let (check_block, _) = - create_call_block(self.tcx, patch, check_id, new_args, substs, None, target).unwrap(); + let (check_block, _) = create_call_block( + self.tcx, + patch, + check_id, + new_args, + substs, + None, + Some(drop_start), + ) + .unwrap(); // the terminator that calls the original function, but in this case jumps to // a check function after instead of original target @@ -555,9 +591,21 @@ impl<'tcx> InsertChecksVisitor<'tcx> { let mut call_terminator = original_terminator; replace_target(&mut call_terminator, check_block); - let (chain_start, new_caller) = + let (chain_start, new_caller, locals_to_drop) = self.prepend_old_cloning(patch, call_terminator, old_dest_place, old_ty, args); + // TODO: create testcases for calls that have no target. + // Make sure they behave correctly in case of panic + let drop_chain_start = + self.create_drop_chain(patch, locals_to_drop, target.unwrap_or(BasicBlock::MAX)); + // make drop_start point to this chain: + patch.patch_terminator( + drop_start, + TerminatorKind::Goto { + target: drop_chain_start, + }, + ); + println!("chain starting at: {:?}", chain_start); // make the original caller_block point to the first clone block // after separate_terminator_from_block this is a goto so we don't break @@ -571,6 +619,9 @@ impl<'tcx> InsertChecksVisitor<'tcx> { (new_caller, Some(check_block)) } + // given a set of arguments, and the type that the old tuple should have + // create a chain of basic blocks that clones each of the arguments + // and puts them into a tuple fn prepend_old_cloning( &self, patch: &mut MirPatch<'tcx>, @@ -578,13 +629,15 @@ impl<'tcx> InsertChecksVisitor<'tcx> { old_dest_place: mir::Place<'tcx>, old_ty: ty::Ty<'tcx>, args: Vec>, - ) -> (BasicBlock, BasicBlock) { + ) -> (BasicBlock, BasicBlock, Vec) { let new_block_data = BasicBlockData::new(Some(terminator)); let current_caller = patch.new_block(new_block_data); let mut current_target = current_caller; let mut old_tuple = Vec::new(); let old_tuple_fields = old_ty.tuple_fields(); + + let mut locals_to_drop = Vec::new(); for (id, operand) in args.iter().enumerate() { let old_values_ty = old_tuple_fields.get(id).unwrap(); if old_values_ty.is_unit() { @@ -600,9 +653,12 @@ impl<'tcx> InsertChecksVisitor<'tcx> { mir::Operand::Move(place) | mir::Operand::Copy(place) => { let target_ty = Some(old_tuple_fields[id]); // prepends clone blocks before the actual function is called - let (start_block, destination) = self + let (start_block, destination, to_drop) = self .insert_clone_argument(*place, current_target, None, patch, target_ty) .unwrap(); + if let Some(to_drop) = to_drop { + locals_to_drop.push(to_drop); + } current_target = start_block; // add the result to our tuple: old_tuple.push(mir::Operand::Move(destination.into())); @@ -619,7 +675,7 @@ impl<'tcx> InsertChecksVisitor<'tcx> { patch.add_statement(location, stmt_kind); // (start of clone-chain, block calling annotated function) - (current_target, current_caller) + (current_target, current_caller, locals_to_drop) } /// Given a function call, prepend another function call directly before @@ -672,6 +728,15 @@ impl<'tcx> InsertChecksVisitor<'tcx> { // since we need to know the targets for each call, the blocks need to be created // in reversed order. + // annoying, but we have to create a block to start off the dropping chain + // early.. + let drop_start_term = Terminator { + source_info: dummy_source_info(), + kind: TerminatorKind::Goto { target }, + }; + let drop_block_data = BasicBlockData::new(Some(drop_start_term)); + let drop_block = patcher.new_block(drop_block_data); + // Create call to check function: let mut check_args = pledge.args.clone(); check_args.push(Operand::Move(pledge.destination)); //result arg @@ -684,7 +749,7 @@ impl<'tcx> InsertChecksVisitor<'tcx> { check_args, pledge.substs, None, - Some(target), + Some(drop_block), )?; // If there is a check_before_expiry block, creat it @@ -715,8 +780,48 @@ impl<'tcx> InsertChecksVisitor<'tcx> { target: next_target, }, }; - let (clone_chain_start, _) = self.prepend_old_cloning(patcher, terminator, pledge.before_expiry_place, pledge.before_expiry_ty, args); + let (clone_chain_start, _, locals_to_drop_after) = self.prepend_old_cloning( + patcher, + terminator, + pledge.before_expiry_place, + pledge.before_expiry_ty, + args, + ); + let mut locals_to_drop = pledge.locals_to_drop.clone(); + locals_to_drop.extend(locals_to_drop_after); + let drop_chain_start = self.create_drop_chain(patcher, locals_to_drop, target); + // adjust the check block's terminator + patcher.patch_terminator( + drop_block, + TerminatorKind::Goto { + target: drop_chain_start, + }, + ); Ok(clone_chain_start) } + + /// Create a chain of drop calls to drop the provided list of locals. + /// If there are no locals to drop, this function simply returns `target` + fn create_drop_chain( + &self, + patcher: &mut MirPatch, + locals_to_drop: Vec, + target: BasicBlock, + ) -> BasicBlock { + let mut current_target = target; + for local in locals_to_drop.iter() { + let terminator = Terminator { + source_info: dummy_source_info(), + kind: TerminatorKind::Drop { + place: (*local).into(), + target: current_target, + unwind: None, + }, + }; + let block_data = BasicBlockData::new(Some(terminator)); + current_target = patcher.new_block(block_data); + } + current_target + } } From a3b88e0d8bfc04367636ae9b093cdce7ca69412d Mon Sep 17 00:00:00 2001 From: cedihegi Date: Sat, 5 Aug 2023 15:08:51 +0200 Subject: [PATCH 22/45] Refactor runtime checks --- prusti-rustc-interface/src/lib.rs | 1 + prusti/src/callbacks.rs | 65 +- prusti/src/driver.rs | 5 +- prusti/src/modify_mir/mir_helper.rs | 95 +- prusti/src/modify_mir/mir_info_collector.rs | 88 +- prusti/src/modify_mir/mir_modifications.rs | 402 ++++++++ prusti/src/modify_mir/mir_modify.rs | 907 +----------------- prusti/src/modify_mir/mod.rs | 10 +- .../modify_mir/passes/insert_pledge_checks.rs | 220 +++++ .../passes/insert_postconditions.rs | 178 ++++ .../passes/insert_precondition_checks.rs | 134 +++ prusti/src/modify_mir/passes/mod.rs | 9 + .../src/modify_mir/passes/replace_old_args.rs | 171 ++++ 13 files changed, 1303 insertions(+), 982 deletions(-) create mode 100644 prusti/src/modify_mir/mir_modifications.rs create mode 100644 prusti/src/modify_mir/passes/insert_pledge_checks.rs create mode 100644 prusti/src/modify_mir/passes/insert_postconditions.rs create mode 100644 prusti/src/modify_mir/passes/insert_precondition_checks.rs create mode 100644 prusti/src/modify_mir/passes/mod.rs create mode 100644 prusti/src/modify_mir/passes/replace_old_args.rs diff --git a/prusti-rustc-interface/src/lib.rs b/prusti-rustc-interface/src/lib.rs index d8a1415b539..72636ffe206 100644 --- a/prusti-rustc-interface/src/lib.rs +++ b/prusti-rustc-interface/src/lib.rs @@ -23,6 +23,7 @@ pub extern crate rustc_serialize as serialize; pub extern crate rustc_session as session; pub extern crate rustc_span as span; pub extern crate rustc_target as target; +pub extern crate rustc_mir_transform as mir_transform; // TODO: switch over to `rustc_smir` once RA knows about the crate // pub use rustc_smir::very_unstable::{borrowck, dataflow, hir, middle, trait_selection}; diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index 59b5b44d8e2..61b4d3728ee 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -3,7 +3,7 @@ use crate::{modify_mir, verifier::verify}; use prusti_common::config; use prusti_interface::{ environment::{mir_storage, Environment}, - specs::{self, cross_crate::CrossCrateSpecs, is_spec_fn}, + specs::{self, cross_crate::CrossCrateSpecs, is_spec_fn, typed::DefSpecificationMap}, }; use prusti_rustc_interface::{ borrowck::consumers, @@ -80,7 +80,8 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { |_session: &Session, providers: &mut Providers, _external: &mut ExternProviders| { providers.mir_borrowck = mir_borrowck; providers.mir_promoted = mir_promoted; - providers.mir_drops_elaborated_and_const_checked = modify_mir::mir_modify::mir_drops_elaborated; + providers.mir_drops_elaborated_and_const_checked = + modify_mir::mir_modify::mir_drops_elaborated; }, ); } @@ -149,25 +150,9 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { ) -> Compilation { compiler.session().abort_if_errors(); queries.global_ctxt().unwrap().enter(|tcx| { - let mut env = Environment::new(tcx, env!("CARGO_PKG_VERSION")); - let spec_checker = specs::checker::SpecChecker::new(); - spec_checker.check(&env); - compiler.session().abort_if_errors(); - - let hir = env.query.hir(); - let mut spec_collector = specs::SpecCollector::new(&mut env); - spec_collector.collect_specs(hir); - - let mut def_spec = spec_collector.build_def_specs(); - // Do print_typeckd_specs prior to importing cross crate - if config::print_typeckd_specs() { - for value in def_spec.all_values_debug(config::hide_uuids()) { - println!("{value}"); - } - } - CrossCrateSpecs::import_export_cross_crate(&mut env, &mut def_spec); + let (def_spec, env) = get_specs(tcx, Some(compiler)); if !config::no_verify() { - verify(env, def_spec.clone()); + verify(env, def_spec); } }); @@ -179,3 +164,43 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { } } } + +pub fn get_specs<'tcx>( + tcx: TyCtxt<'tcx>, + compiler_opt: Option<&Compiler>, +) -> (DefSpecificationMap, Environment<'tcx>) { + let specs_env_opt = unsafe { crate::SPEC_ENV.take() }; + if let Some((specs, env)) = specs_env_opt { + let env_tcx: Environment<'tcx> = unsafe { std::mem::transmute(env) }; + (specs, env_tcx) + } else { + let mut env = Environment::new(tcx, env!("CARGO_PKG_VERSION")); + + // when get_specs is first called from an overriden query + // (as is the case for runtime checks), we don't have + // access to the compiler, so for now we just skip the + // checking then + if let Some(compiler) = compiler_opt { + let spec_checker = specs::checker::SpecChecker::new(); + spec_checker.check(&env); + compiler.session().abort_if_errors(); + } else if env.diagnostic.has_errors() { + // TODO: still give some sensible error? + // Does it make a difference if we show the errors + // once get_specs returns in callbacks? + panic!("Spec checking caused errors. No good error message because runtime checks are enabled. This is a TODO"); + } + let hir = env.query.hir(); + let mut spec_collector = specs::SpecCollector::new(&mut env); + spec_collector.collect_specs(hir); + + let mut def_spec = spec_collector.build_def_specs(); + if config::print_typeckd_specs() { + for value in def_spec.all_values_debug(config::hide_uuids()) { + println!("{value}"); + } + } + CrossCrateSpecs::import_export_cross_crate(&mut env, &mut def_spec); + (def_spec, env) + } +} diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index 674c8614749..42e96f50d69 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -9,6 +9,7 @@ #![feature(decl_macro)] #![feature(box_patterns)] #![deny(unused_must_use)] +#![feature(let_chains)] mod arg_value; mod callbacks; @@ -21,11 +22,14 @@ use callbacks::PrustiCompilerCalls; use lazy_static::lazy_static; use log::info; use prusti_common::{config, report::user, Stopwatch}; +use prusti_interface::{environment::Environment, specs::typed::DefSpecificationMap}; use prusti_rustc_interface::interface::interface::try_print_query_stack; use std::{env, panic}; use tracing_chrome::{ChromeLayerBuilder, FlushGuard}; use tracing_subscriber::{filter::EnvFilter, prelude::*}; +pub static mut SPEC_ENV: Option<(DefSpecificationMap, Environment<'static>)> = None; + /// Link to report Prusti bugs const BUG_REPORT_URL: &str = "https://github.com/viperproject/prusti-dev/issues/new"; @@ -37,7 +41,6 @@ lazy_static! { }; } - fn get_prusti_version_info() -> String { format!( "{}, commit {} {}, built on {}", diff --git a/prusti/src/modify_mir/mir_helper.rs b/prusti/src/modify_mir/mir_helper.rs index 167997676c4..42a95f90f28 100644 --- a/prusti/src/modify_mir/mir_helper.rs +++ b/prusti/src/modify_mir/mir_helper.rs @@ -1,32 +1,21 @@ use prusti_rustc_interface::{ + index::IndexVec, middle::{ mir::{self, patch::MirPatch, visit::MutVisitor, Body, TerminatorKind}, ty::{self, TyCtxt}, }, span::{self, def_id::DefId, DUMMY_SP}, - index::IndexVec, }; use rustc_hash::FxHashMap; -/// Given the name of a variable in the original program, find the -/// corresponding mir local -// pub fn get_local_from_name(body: &Body<'_>, name: String) -> Option { -// for debug_info in &body.var_debug_info { -// // find the corresponding local in the var_debug_info -// if debug_info.name.to_string() == name { -// if let mir::VarDebugInfoContents::Place(place) = debug_info.value { -// return Some(place.local); -// } -// } -// } -// None -// } +// A set of functions that are often used during mir modifications + /// Check whether this variable is mutable, or a mutable reference -pub fn is_mutable_arg<'tcx>( +pub fn is_mutable_arg( body: &Body<'_>, local: mir::Local, - local_decls: &IndexVec>, + local_decls: &IndexVec>, ) -> bool { let args: Vec = body.args_iter().collect(); if args.contains(&local) { @@ -162,55 +151,6 @@ pub fn prepend_dummy_block(body: &mut Body) -> mir::BasicBlock { new_block_id } -pub fn create_call_block<'tcx>( - tcx: TyCtxt<'tcx>, - patch: &mut MirPatch<'tcx>, - call_id: DefId, - args: Vec>, - substs: ty::subst::SubstsRef<'tcx>, - destination: Option>, - target: Option, -) -> Result<(mir::BasicBlock, mir::Place<'tcx>), ()> { - // construct the function call - let func_ty = tcx.mk_ty_from_kind(ty::TyKind::FnDef(call_id, substs)); - let func = mir::Operand::Constant(Box::new(mir::Constant { - span: span::DUMMY_SP, - user_ty: None, - literal: mir::ConstantKind::zero_sized(func_ty), - })); - // either use passed destination or create a new one - let destination = if let Some(dest) = destination { - dest - } else { - // find return type - let ret_ty = tcx - .fn_sig(call_id) - .subst(tcx, substs) - .output() - .skip_binder(); - mir::Place::from(patch.new_temp(ret_ty, span::DUMMY_SP)) - }; - - // args have to be constructed beforehand, including result or old_values - let terminator_kind = mir::TerminatorKind::Call { - func, - args, - destination, - target, - unwind: mir::UnwindAction::Continue, - from_hir_call: false, - fn_span: tcx.def_span(call_id), - }; - let terminator = mir::Terminator { - source_info: dummy_source_info(), - kind: terminator_kind, - }; - let blockdata = mir::BasicBlockData::new(Some(terminator)); - let new_block_id = patch.new_block(blockdata); - - Ok((new_block_id, destination)) -} - // If we re-order the IndexVec containing the basic blocks, we will need to adjust // some the basic blocks that terminators point to. This is what this function does pub fn replace_outgoing_edges( @@ -323,3 +263,28 @@ impl<'tcx, 'a> MutVisitor<'tcx> for ArgumentReplacer<'a, 'tcx> { } } } + +// If this block is a goto block, and if it is returns its current target +pub fn get_block_target(body: &Body<'_>, block: mir::BasicBlock) -> Option { + let terminator: &Option = &body.basic_blocks.get(block)?.terminator; + if let Some(mir::Terminator { + kind: mir::TerminatorKind::Goto { target }, + .. + }) = terminator + { + Some(*target) + } else { + None + } +} + +// are these the same types that we would get using local_decls and the locals +// for each argument / the return local? +pub fn fn_def_signature(tcx: TyCtxt<'_>, def_id: DefId) -> ty::FnSig { + // use identity substs for a function definitions, but never for calls! + let ident_substs = ty::subst::InternalSubsts::identity_for_item(tcx, def_id); + let binder_fn_sig = tcx.fn_sig(def_id); + let poly_fn_sig = binder_fn_sig.subst(tcx, ident_substs); + let param_env = tcx.param_env(def_id); + tcx.normalize_erasing_late_bound_regions(param_env, poly_fn_sig) +} diff --git a/prusti/src/modify_mir/mir_info_collector.rs b/prusti/src/modify_mir/mir_info_collector.rs index 77442613f50..f6d23e43c30 100644 --- a/prusti/src/modify_mir/mir_info_collector.rs +++ b/prusti/src/modify_mir/mir_info_collector.rs @@ -1,6 +1,8 @@ use super::mir_helper::*; + use prusti_interface::{ - environment::{blocks_dominated_by, is_check_closure, EnvQuery}, + environment::{blocks_dominated_by, is_check_closure, EnvQuery, Environment}, + specs::typed::DefSpecificationMap, utils::has_prusti_attr, }; use prusti_rustc_interface::{ @@ -9,31 +11,63 @@ use prusti_rustc_interface::{ mir::{self, visit::Visitor, Statement, StatementKind}, ty::TyCtxt, }, - span::Span, + span::{def_id::DefId, Span}, }; use rustc_hash::{FxHashMap, FxHashSet}; use std::hash::Hash; -pub struct MirInfo { +// Info about a specific MIR Body that can be collected before we +// actuallye start modifying it. +// Note that depending on the modifications we perform, some of the +// information (e.g. about blocks might no longer be accurate) +pub struct MirInfo<'tcx> { + pub def_id: DefId, + pub specs: DefSpecificationMap, + pub env: Environment<'tcx>, + /// blocks that the translation specifically added to either mark + /// a location (manual pledge expiry) or that we identified to + /// be the check blocks for a `prusti_assert!`, `prusti_assume!` or + /// `body_invariant`. pub check_blocks: FxHashMap, + /// function arguments that have to be cloned on entry of the function pub args_to_be_cloned: FxHashSet, + /// statements in which we should replace the occurrence of a function + /// argument with their clone pub stmts_to_substitute_rhs: FxHashSet, } -pub fn collect_mir_info<'tcx, 'a>( - tcx: TyCtxt<'tcx>, - body: mir::Body<'tcx>, - promoted: &'a mir::Body<'tcx>, -) -> MirInfo { - println!("Collecting mir info for {:?}", body.source.def_id()); - let check_blocks = collect_check_blocks(tcx, &body); - let mut visitor = MirInfoCollector::new(body.clone(), tcx, promoted); - visitor.visit_body(&body); - let (args_to_be_cloned, stmts_to_substitute_rhs) = visitor.process_dependencies(); - MirInfo { - check_blocks, - args_to_be_cloned, - stmts_to_substitute_rhs, +impl<'tcx> MirInfo<'tcx> { + // Collect this info given a body. + // mir_promoted is also passed in here, because some information + // is removed in mir_drops_elaborated + pub fn collect_mir_info<'a>( + tcx: TyCtxt<'tcx>, + body: mir::Body<'tcx>, + def_id: DefId, + local_decls: &'a IndexVec>, + ) -> MirInfo<'tcx> { + println!("Collecting mir info for {:?}", body.source.def_id()); + let (specs, env) = crate::callbacks::get_specs(tcx, None); + let check_blocks = collect_check_blocks(tcx, &body); + let mut visitor = MirInfoCollector::new(body.clone(), tcx, local_decls); + visitor.visit_body(&body); + let (args_to_be_cloned, stmts_to_substitute_rhs) = visitor.process_dependencies(); + MirInfo { + def_id, + specs, + env, + check_blocks, + args_to_be_cloned, + stmts_to_substitute_rhs, + } + } + // when MirInfo is no longer required, put specs and env back into + // global statics (because we only want to compute them once) + // consider putting this inside of drop for MirInfo + pub fn store_specs_env(self) { + let MirInfo { env, specs, .. } = self; + let static_env = unsafe { std::mem::transmute(env) }; + unsafe { crate::SPEC_ENV = Some((specs, static_env)) }; } } @@ -48,7 +82,7 @@ pub fn collect_mir_info<'tcx, 'a>( struct MirInfoCollector<'tcx, 'a> { /// a MIR visitor collecting some information about old calls, run /// beforehand - old_visitor: OldVisitor<'tcx>, + old_visitor: OldSpanFinder<'tcx>, /// dependencies between locals, for each local get a list of other locals /// that it depends on locals_dependencies: FxHashMap>, @@ -101,6 +135,7 @@ impl<'tcx, 'a> Visitor<'tcx> for MirInfoCollector<'tcx, 'a> { args, destination, .. } = &terminator.kind { + // collect dependencies args.iter().for_each(|arg| { if let mir::Operand::Move(place) | mir::Operand::Copy(place) = arg { let dep = self.create_dependency(place.local); @@ -132,10 +167,10 @@ impl<'tcx, 'a> MirInfoCollector<'tcx, 'a> { pub(crate) fn new( body: mir::Body<'tcx>, tcx: TyCtxt<'tcx>, - promoted: &'a mir::Body<'tcx>, + local_decls: &'a IndexVec>, ) -> Self { // old visitor identifies spans of old within code - let mut old_visitor = OldVisitor::new(tcx); + let mut old_visitor = OldSpanFinder::new(tcx); old_visitor.visit_body(&body); Self { old_visitor, @@ -145,7 +180,7 @@ impl<'tcx, 'a> MirInfoCollector<'tcx, 'a> { rvalue_visitor: RvalueVisitor { dependencies: Default::default(), }, - local_decls: &promoted.local_decls, + local_decls, } } @@ -162,8 +197,7 @@ impl<'tcx, 'a> MirInfoCollector<'tcx, 'a> { // we put locals in here that are dependencies of old arguments and // that are not user defined let mut to_process = vec![*old_arg]; - while !to_process.is_empty() { - let local = to_process.pop().unwrap(); + while let Some(local) = to_process.pop() { let deps = self.locals_dependencies.get(&local).unwrap(); let assignment_locations = self.assignment_locations.get(&local).unwrap(); let mut depends_on_argument = false; @@ -310,7 +344,7 @@ impl<'tcx> Visitor<'tcx> for RvalueVisitor { } } -struct OldVisitor<'tcx> { +struct OldSpanFinder<'tcx> { tcx: TyCtxt<'tcx>, old_spans: Vec, old_args: FxHashSet, @@ -318,7 +352,7 @@ struct OldVisitor<'tcx> { // spans of old calls need to be resolved first, so we can determine // whether locals are defined inside them later. -impl<'tcx> Visitor<'tcx> for OldVisitor<'tcx> { +impl<'tcx> Visitor<'tcx> for OldSpanFinder<'tcx> { fn visit_terminator(&mut self, terminator: &mir::Terminator<'tcx>, location: mir::Location) { self.super_terminator(terminator, location); if let mir::TerminatorKind::Call { @@ -345,9 +379,9 @@ impl<'tcx> Visitor<'tcx> for OldVisitor<'tcx> { } } -impl<'tcx> OldVisitor<'tcx> { +impl<'tcx> OldSpanFinder<'tcx> { pub fn new(tcx: TyCtxt<'tcx>) -> Self { - OldVisitor { + OldSpanFinder { old_spans: Default::default(), old_args: Default::default(), tcx, diff --git a/prusti/src/modify_mir/mir_modifications.rs b/prusti/src/modify_mir/mir_modifications.rs new file mode 100644 index 00000000000..e1d0e2954f8 --- /dev/null +++ b/prusti/src/modify_mir/mir_modifications.rs @@ -0,0 +1,402 @@ +use super::{mir_helper::*, passes::PledgeToProcess}; + +use prusti_rustc_interface::{ + index::IndexVec, + middle::{ + mir::{ + self, patch::MirPatch, BasicBlock, BasicBlockData, Constant, + Operand, Place, Terminator, TerminatorKind, + }, + ty::{self, TyCtxt, TyKind}, + }, + span::{def_id::DefId, DUMMY_SP}, +}; + +use std::cell::RefMut; + + +/// A general set of operations that are used to modify the MIR +pub trait MirModifier<'tcx> { + // to be implemented! + fn tcx(&self) -> TyCtxt<'tcx>; + fn patcher(&self) -> RefMut>; + fn def_id(&self) -> DefId; + fn local_decls(&self) -> &IndexVec>; + + fn prepend_call( + &self, + fn_id: DefId, + caller_block: BasicBlock, + args: Vec>, + substs: ty::subst::SubstsRef<'tcx>, + terminator: Terminator<'tcx>, + dest_place: Place<'tcx>, + ) -> BasicBlock { + // get the bodies of the store and check function + let new_block_data = BasicBlockData::new(Some(terminator)); + let new_block = self.patcher().new_block(new_block_data); + + let func_ty = self.tcx().mk_ty_from_kind(TyKind::FnDef(fn_id, substs)); + let func = Operand::Constant(Box::new(Constant { + span: DUMMY_SP, + user_ty: None, + literal: mir::ConstantKind::zero_sized(func_ty), + })); + + let call_terminator = TerminatorKind::Call { + func, + args: args.clone(), + destination: dest_place, + target: Some(new_block), + from_hir_call: false, + // is terminating on unwind sometimes not actually what we want? + unwind: mir::UnwindAction::Continue, + fn_span: DUMMY_SP, + }; + self.patcher() + .patch_terminator(caller_block, call_terminator); + new_block + } + + // given a set of arguments, and the type that the old tuple should have + // create a chain of basic blocks that clones each of the arguments + // and puts them into a tuple + fn prepend_old_cloning( + &self, + terminator: Terminator<'tcx>, + old_dest_place: mir::Place<'tcx>, + old_ty: ty::Ty<'tcx>, + args: Vec>, + clones_passed_into_function: bool, + ) -> (BasicBlock, BasicBlock, Vec) { + let new_block_data = BasicBlockData::new(Some(terminator)); + let current_caller = self.patcher().new_block(new_block_data); + let mut current_target = current_caller; + + let mut old_tuple = Vec::new(); + let old_tuple_fields = old_ty.tuple_fields(); + + let mut locals_to_drop = Vec::new(); + for (id, operand) in args.iter().enumerate() { + let old_values_ty = old_tuple_fields.get(id).unwrap(); + if old_values_ty.is_unit() { + // we already know from ast, that this variable does not need + // to be cloned + let unit_const = unit_const(self.tcx()); + old_tuple.push(unit_const); + } else { + match operand { + mir::Operand::Constant(_) => { + old_tuple.push(operand.clone()); + } + mir::Operand::Move(place) | mir::Operand::Copy(place) => { + let target_ty = Some(old_tuple_fields[id]); + // prepends clone blocks before the actual function is called + let (start_block, destination, to_drop) = self + .insert_clone_argument( + *place, + current_target, + None, + target_ty, + clones_passed_into_function, + ) + .unwrap(); + if let Some(to_drop) = to_drop { + locals_to_drop.push(to_drop); + } + current_target = start_block; + // add the result to our tuple: + old_tuple.push(mir::Operand::Move(destination.into())); + } + } + } + } + let old_rvalue = mir::Rvalue::Aggregate( + Box::new(mir::AggregateKind::Tuple), + IndexVec::from_raw(old_tuple), + ); + let stmt_kind = mir::StatementKind::Assign(Box::new((old_dest_place, old_rvalue))); + let location = mir::Location { + block: current_caller, + statement_index: 0, + }; + self.patcher().add_statement(location, stmt_kind); + + // (start of clone-chain, block calling annotated function) + (current_target, current_caller, locals_to_drop) + } + + fn insert_clone_argument( + &self, + arg: mir::Place<'tcx>, + target: BasicBlock, + destination: Option, + target_type_opt: Option>, + results_dropped_by_function: bool, + ) -> Result<(BasicBlock, mir::Local, Option), ()> { + // if we deal with a reference, we can directly call clone on it + // otherwise we have to create a reference first, to pass to the clone + // function. + let clone_defid = get_clone_defid(self.tcx()).ok_or(())?; + let param_env = self.tcx().param_env(self.def_id()); + // let clone_trait_defid = self.tcx.lang_items().clone_trait().unwrap(); + // + let arg_ty = if let Some(target_type) = target_type_opt { + target_type + } else { + arg.ty(self.local_decls(), self.tcx()).ty + }; + let mutable_ref = matches!(arg_ty.ref_mutability(), Some(mir::Mutability::Mut)); + println!("arg type: {:?}", arg_ty); + + let dest = destination.unwrap_or_else(|| self.patcher().new_temp(arg_ty, DUMMY_SP)); + println!( + "trying to clone arg: {:?} into destination: {:?}", + arg, dest + ); + if !arg_ty.is_ref() { + // non-ref arg means we first deref and then clone. + // destination only needs to be dropped if it's not later passed into + // a function that drops it + let to_drop = (!results_dropped_by_function + && arg_ty.needs_drop(self.tcx(), param_env)) + .then_some(dest); + let ref_ty = create_reference_type(self.tcx(), arg_ty); + let ref_arg = self.patcher().new_temp(ref_ty, DUMMY_SP); + // add a statement to deref the old_argument + let rvalue = rvalue_reference_to_local(self.tcx(), arg, false); + // the statement to be added to the block that has the call clone + // terminator + let ref_stmt = + mir::StatementKind::Assign(Box::new((mir::Place::from(ref_arg), rvalue))); + + // create the substitution since clone is generic: + let generic_ty = ty::subst::GenericArg::from(arg_ty); + let substs = self.tcx().mk_substs(&[generic_ty]); + // create the function operand: + let clone_args = vec![Operand::Move(mir::Place::from(ref_arg))]; + // create a new basicblock: + // TODO: make part of new mir helper too + let (new_block, _) = self.create_call_block( + clone_defid, + clone_args, + substs, + Some(dest.into()), + Some(target), + )?; + self.patcher().add_statement( + mir::Location { + block: new_block, + statement_index: 0, + }, + ref_stmt, + ); + + Ok((new_block, dest, to_drop)) + // let block_data = BasicBlockData::new() + } else { + // create a new local to store the result of clone: + let deref_ty = arg_ty.builtin_deref(false).ok_or(())?.ty; + let clone_dest = self.patcher().new_temp(deref_ty, DUMMY_SP); + let to_drop = deref_ty + .needs_drop(self.tcx(), param_env) + .then_some(clone_dest); + + println!( + "dereferenced type: {:?}, needs drop? {:?}", + deref_ty, to_drop + ); + let generic_ty = ty::subst::GenericArg::from(deref_ty); + let substs = self.tcx().mk_substs(&[generic_ty]); + let clone_args = vec![Operand::Move(arg)]; + // add an additional simple block afterwards, that dereferences + // the the cloned value into the original receiver of old: + // create it beforehand, so we can set the precedors target correctly + let terminator = mir::Terminator { + source_info: dummy_source_info(), + kind: TerminatorKind::Goto { target }, + }; + let block_data = BasicBlockData::new(Some(terminator)); + let second_block = self.patcher().new_block(block_data); + + // borrow the clone result + let rvalue = rvalue_reference_to_local(self.tcx(), clone_dest.into(), mutable_ref); + let ref_stmt = mir::StatementKind::Assign(Box::new((dest.into(), rvalue))); + self.patcher().add_statement( + mir::Location { + block: second_block, + statement_index: 0, + }, + ref_stmt, + ); + + let (new_block, _) = self.create_call_block( + clone_defid, + clone_args, + substs, + Some(clone_dest.into()), + Some(second_block), + )?; + + Ok((new_block, dest, to_drop)) + } + } + + fn create_pledge_call_chain( + &self, + pledge: &PledgeToProcess<'tcx>, + target: BasicBlock, + ) -> Result { + // given a location, insert the call chain to check a pledge: + // since we need to know the targets for each call, the blocks need to be created + // in reversed order. + + // annoying, but we have to create a block to start off the dropping chain + // early.. + let drop_start_term = Terminator { + source_info: dummy_source_info(), + kind: TerminatorKind::Goto { target }, + }; + let drop_block_data = BasicBlockData::new(Some(drop_start_term)); + let drop_block = self.patcher().new_block(drop_block_data); + + // Create call to check function: + let mut check_args = pledge.args.clone(); + check_args.push(mir::Operand::Move(pledge.destination)); //result arg + check_args.push(mir::Operand::Move(pledge.old_values_place)); + check_args.push(mir::Operand::Move(pledge.before_expiry_place)); + let (check_after_block, _) = self.create_call_block( + pledge.check, + check_args, + pledge.substs, + None, + Some(drop_block), + )?; + + // If there is a check_before_expiry block, creat it + let next_target = if let Some(check_before_expiry) = pledge.check_before_expiry { + let before_check_args = vec![ + mir::Operand::Move(pledge.destination), + mir::Operand::Move(pledge.old_values_place), + ]; + let (new_block, _) = self.create_call_block( + check_before_expiry, + before_check_args, + pledge.substs, + None, + Some(check_after_block), + )?; + new_block + } else { + check_after_block + }; + + // clone the result of the pledge, so it can be referred to with before_expiry + let terminator = mir::Terminator { + source_info: dummy_source_info(), + kind: mir::TerminatorKind::Goto { + target: next_target, + }, + }; + let (clone_chain_start, _, locals_to_drop_after) = self.prepend_old_cloning( + terminator, + pledge.before_expiry_place, + pledge.before_expiry_ty, + vec![mir::Operand::Move(pledge.destination)], + true, // this clone will be passed to a check function + ); + let mut locals_to_drop = pledge.locals_to_drop.clone(); + locals_to_drop.extend(locals_to_drop_after); + let (drop_chain_start, _) = self.create_drop_chain(locals_to_drop, Some(target)); + // adjust the check block's terminator + self.patcher().patch_terminator( + drop_block, + mir::TerminatorKind::Goto { + target: drop_chain_start, + }, + ); + + Ok(clone_chain_start) + } + + /// Create a chain of drop calls to drop the provided list of locals. + /// If there are no locals to drop, this function simply returns `target` + /// If there is no target, we return after dropping all values + fn create_drop_chain( + &self, + locals_to_drop: Vec, + target_opt: Option, + ) -> (BasicBlock, BasicBlock) { + let target = if let Some(target) = target_opt { + target + } else { + // create a return block: + let terminator = mir::Terminator { + source_info: dummy_source_info(), + kind: mir::TerminatorKind::Return, + }; + let block_data = mir::BasicBlockData::new(Some(terminator)); + self.patcher().new_block(block_data) + }; + let last_block = target; + let mut current_target = target; + for local in locals_to_drop.iter() { + let terminator = mir::Terminator { + source_info: dummy_source_info(), + kind: mir::TerminatorKind::Drop { + place: (*local).into(), + target: current_target, + unwind: mir::UnwindAction::Continue, + replace: false, + }, + }; + let block_data = mir::BasicBlockData::new(Some(terminator)); + current_target = self.patcher().new_block(block_data); + } + (current_target, last_block) + } + + fn create_call_block( + &self, + call_id: DefId, + args: Vec>, + substs: ty::subst::SubstsRef<'tcx>, + destination: Option>, + target: Option, + ) -> Result<(mir::BasicBlock, mir::Place<'tcx>), ()> { + // construct the function call + let func_ty = self + .tcx() + .mk_ty_from_kind(ty::TyKind::FnDef(call_id, substs)); + let func = mir::Operand::Constant(Box::new(mir::Constant { + span: DUMMY_SP, + user_ty: None, + literal: mir::ConstantKind::zero_sized(func_ty), + })); + // either use passed destination or create a new one + let destination = destination.unwrap_or_else(|| { + // find return type + let ret_ty = fn_return_ty(self.tcx(), call_id); + mir::Place::from(self.patcher().new_temp(ret_ty, DUMMY_SP)) + }); + + // args have to be constructed beforehand, including result or old_values + let terminator_kind = mir::TerminatorKind::Call { + func, + args, + destination, + target, + unwind: mir::UnwindAction::Continue, + from_hir_call: false, + fn_span: self.tcx().def_span(call_id), + }; + let terminator = mir::Terminator { + source_info: dummy_source_info(), + kind: terminator_kind, + }; + let blockdata = mir::BasicBlockData::new(Some(terminator)); + let new_block_id = self.patcher().new_block(blockdata); + + Ok((new_block_id, destination)) + } +} diff --git a/prusti/src/modify_mir/mir_modify.rs b/prusti/src/modify_mir/mir_modify.rs index bec34fa5105..1052640a6d9 100644 --- a/prusti/src/modify_mir/mir_modify.rs +++ b/prusti/src/modify_mir/mir_modify.rs @@ -1,869 +1,54 @@ -use crate::modify_mir::{ - mir_helper::*, - mir_info_collector::{collect_mir_info, CheckBlockKind, MirInfo}, - SPECS, -}; +use crate::modify_mir::{mir_helper::*, mir_info_collector::MirInfo, passes}; use prusti_common::config; -use prusti_interface::{ - environment::Environment, - specs::{ - self, - cross_crate::CrossCrateSpecs, - typed::{CheckKind, DefSpecificationMap}, - }, -}; use prusti_rustc_interface::{ data_structures::steal::Steal, - index::IndexVec, interface::DEFAULT_QUERY_PROVIDERS, - middle::{ - mir::{ - self, patch::MirPatch, pretty, visit::MutVisitor, BasicBlock, BasicBlockData, Body, - Constant, ConstantKind, Operand, Place, Terminator, TerminatorKind, - }, - ty::{self, TyCtxt, TyKind}, - }, - span::{ - def_id::{DefId, LocalDefId}, - DUMMY_SP, - }, + middle::{mir, ty::TyCtxt}, + span::def_id::LocalDefId, }; -use rustc_hash::FxHashMap; - -use std::{env, fs, io}; -fn folder_present(name: &str) -> io::Result { - let mut path = env::current_dir()?; - path.push(name); - let metadata = fs::metadata(path)?; - Ok(metadata.is_dir()) -} - -pub(crate) fn mir_drops_elaborated(tcx: TyCtxt<'_>, def_id: LocalDefId) -> &Steal> { - println!("mir checked called for def_id: {:?}", def_id); - // SAFETY: Is definitely not safe at the moment +pub(crate) fn mir_drops_elaborated( + tcx: TyCtxt<'_>, + local_def_id: LocalDefId, +) -> &Steal> { if !config::insert_runtime_checks() { - return (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def_id); - } - // let's get the specifications collected by prusti :) - let specs_opt = unsafe { SPECS.take() }; - let specs = specs_opt.unwrap_or_else(|| { - let mut env = Environment::new(tcx, env!("CARGO_PKG_VERSION")); - let spec_checker = specs::checker::SpecChecker::new(); - spec_checker.check(&env); - - let hir = env.query.hir(); - let mut spec_collector = specs::SpecCollector::new(&mut env); - spec_collector.collect_specs(hir); - - let mut def_spec = spec_collector.build_def_specs(); - // Do print_typeckd_specs prior to importing cross crate - if config::print_typeckd_specs() { - for value in def_spec.all_values_debug(config::hide_uuids()) { - println!("{value}"); - } - } - CrossCrateSpecs::import_export_cross_crate(&mut env, &mut def_spec); - def_spec - }); - - // get mir promoted: at this point should definitely not be stolen yet. - let (mir_promoted_steal, _) = tcx.mir_promoted(def_id); - let mir_promoted_body: mir::Body = mir_promoted_steal.borrow().clone(); - - // get mir body before invoking drops_elaborated query, otherwise it will - // be stolen - let steal = (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def_id); - let mut stolen = steal.steal(); - let def_id = stolen.source.def_id(); - if def_id.is_local() { - println!("modifying mir for defid: {:?}", def_id); - } - // print mir of body: - if let Ok(true) = folder_present("dump") { - let mut dump_file = - fs::File::create(format!("dump/dump_mir_adjusted_{:?}.txt", def_id)).unwrap(); - pretty::write_mir_fn(tcx, &stolen, &mut |_, _| Ok(()), &mut dump_file).unwrap(); - } - - { - let mut visitor = - InsertChecksVisitor::new(tcx, specs.clone(), stolen.clone(), &mir_promoted_body); - visitor.visit_body(&mut stolen); - } - - unsafe { SPECS = Some(specs)}; - - tcx.alloc_steal_mir(stolen) -} - -#[derive(Debug, Clone)] -pub struct PledgeToProcess<'tcx> { - check: DefId, - check_before_expiry: Option, - old_values_place: Place<'tcx>, - before_expiry_place: Place<'tcx>, - before_expiry_ty: ty::Ty<'tcx>, - destination: Place<'tcx>, - // the args the function was called with - args: Vec>, - substs: ty::subst::SubstsRef<'tcx>, - locals_to_drop: Vec, -} - -pub struct InsertChecksVisitor<'tcx> { - tcx: TyCtxt<'tcx>, - specs: DefSpecificationMap, - // expiration locations are not computed correctly for this stage of the mir. - // expiration_locations: FxHashMap>, - current_patcher: Option>, - pledges_to_process: FxHashMap>, - current_def_id: Option, - body_copy: Body<'tcx>, - // maps from function arguments to their copies in old state - stored_arguments: FxHashMap, - mir_info: MirInfo, -} - -impl<'tcx, 'a> InsertChecksVisitor<'tcx> { - pub fn new( - tcx: TyCtxt<'tcx>, - specs: DefSpecificationMap, - body_copy: Body<'tcx>, - mir_promoted: &'a Body<'tcx>, - ) -> Self { - let mir_info = collect_mir_info(tcx, body_copy.clone(), mir_promoted); - Self { - tcx, - specs, - current_patcher: None, - pledges_to_process: Default::default(), - current_def_id: None, - body_copy, - stored_arguments: Default::default(), - mir_info, - } - } -} - -impl<'tcx, 'a> MutVisitor<'tcx> for InsertChecksVisitor<'tcx> { - fn tcx(&self) -> TyCtxt<'tcx> { - self.tcx - } - - fn visit_body(&mut self, body: &mut Body<'tcx>) { - // visit body, apply patches, possibly find pledges that need to be processed here: - let def_id = body.source.def_id(); - self.current_def_id = Some(def_id); - - // create locals for the clones of old, and replace them where needed - self.create_and_replace_arguments(body); - - self.current_patcher = Some(MirPatch::new(body)); - self.super_body(body); - let mir_patch = self.current_patcher.take(); - mir_patch.unwrap().apply(body); - - // sort descending - // this would insert the pledges correctly, if locations - // were reported correctly. For now, we only insert - // checks for pledges if there are manual - // `prusti_pledge_expires` annotations - // self.pledges_to_process - // .sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap().reverse()); - // - // self.pledges_to_process - // .iter() - // .for_each(|(location, pledge)| { - // insert_pledge_call_chain(self.tcx, pledge.clone(), *location, body).unwrap(); - // }); - - // All the modifications that we do after this point, insert blocks - // that have to be executed before anything else in this function. - // Therefore we create one dummy block, make it goto the starting block - // and swap these blocks locations. - // While we will be prepending calls before the first block, - // `current_target` will keep track of which block this dummy block - // currently points to, so we can keep prepending new blocks - let mut current_target = prepend_dummy_block(body); - - self.mir_info - .args_to_be_cloned - .clone() - .iter() - .for_each(|&local| { - let mut patch = MirPatch::new(body); - let place: mir::Place = local.into(); - let destination = *self.stored_arguments.get(&local).unwrap(); - (current_target, _, _) = self - .insert_clone_argument( - place, - current_target, - Some(destination), - &mut patch, - None, - ) - .unwrap(); - let terminator_kind = TerminatorKind::Goto { - target: current_target, - }; - patch.patch_terminator(mir::START_BLOCK, terminator_kind); - patch.apply(body); - }); - - // replace function arguments with their copies in all the locations - // that we identified earlier: - - // insert preconditions at the beginning of the body: - let substs = ty::subst::InternalSubsts::identity_for_item(self.tcx, def_id); - let args = args_from_body(body); - for check_id in self.specs.get_pre_checks(&def_id) { - let mut patch = MirPatch::new(body); - let (current_target, _) = create_call_block( - self.tcx, - &mut patch, - check_id, - args.clone(), - substs, - None, // create new destination, does not matter here - Some(current_target), - ) - .unwrap(); - // make dummy block at the very beginning go to this block now: - - let terminator_kind = TerminatorKind::Goto { - target: current_target, - }; - patch.patch_terminator(mir::START_BLOCK, terminator_kind); - patch.apply(body); - } - } - - fn visit_terminator(&mut self, terminator: &mut Terminator<'tcx>, location: mir::Location) { - self.super_terminator(terminator, location); - if let TerminatorKind::SwitchInt { targets, .. } = &mut terminator.kind { - // find switchInts with a check_only target. - let switch_iter = targets.iter(); - if switch_iter.len() == 1 { - // let (value, target) = switch_iter.next().unwrap(); - let otherwise = targets.otherwise(); - // check if target is a check_block: - if let Some(kind) = self.mir_info.check_blocks.get(&otherwise) { - match kind { - CheckBlockKind::PledgeExpires(local) => { - // this check_block should terminate with a goto always! - if let TerminatorKind::Goto { target } = - self.body_copy[otherwise].terminator.clone().unwrap().kind - { - let pledge = self - .pledges_to_process - .get(local) - .expect("pledge expiration without an actual pledge"); - let mut patcher = self.current_patcher.take().unwrap(); - let start_block = self - .create_pledge_call_chain(pledge, target, &mut patcher) - .unwrap(); - - let new_terminator = TerminatorKind::Goto { - target: start_block, - }; - // skip this check block and instead call checks-chain - patcher.patch_terminator(otherwise, new_terminator); - self.current_patcher = Some(patcher) - } - } - // nothing to do.. - CheckBlockKind::RuntimeAssertion => (), - } - } - } - } - } - - fn visit_basic_block_data(&mut self, block: BasicBlock, data: &mut BasicBlockData<'tcx>) { - // our goal here is to find calls to functions where we want to check - // their precondition afterwards - self.super_basic_block_data(block, data); - // we will be adding blocks and new blocks will be representing the - // main block, this variable is used to update it. - - if let Some(Terminator { - kind: terminator_kind, - .. - }) = &data.terminator - { - // the block that actually calls the annotated function. The terminator - // that calls this function is potentially moved several times, - // this variable keeps track of that. - let mut caller_block = block; - let mut call_fn_terminator = data.terminator.clone().unwrap().clone(); - - if let TerminatorKind::Call { - func, - target, // the block called afterwards - destination, // local to receive result - args, - .. - } = terminator_kind - { - // if it's a static function call, we start looking if there are - // post-conditions we could check - if let Some((call_id, substs)) = func.const_fn_def() { - // let item_name = self.tcx.def_path_str(call_id); - // make sure the call is local: - - // The block that is executed after the annotated function - // is called. Mutable copy because after appending the first - // check function call, this is the new target - let mut current_target = *target; - // since there might be multiple blocks to be inserted, - for check_kind in self.specs.get_runtime_checks(&call_id) { - match check_kind { - CheckKind::Pre(check_id) => { - // only insert check if called method is not local! - if call_id.is_local() { - continue; - } else { - let mut patch = self.current_patcher.take().unwrap(); - let return_ty = fn_return_ty(self.tcx, check_id); - assert!(return_ty.is_unit()); - let res = patch.new_temp(return_ty, DUMMY_SP); - caller_block = self.prepend_call( - &mut patch, - check_id, - caller_block, - args.clone(), - substs, - call_fn_terminator.clone(), - res.into(), - ); - self.current_patcher = Some(patch); - } - } - CheckKind::Post { check: check_id } => { - // since here, we don't have mutable access to the body, - // we created a patcher beforehand which we can use here - // and apply later - let mut patch = self.current_patcher.take().unwrap(); - (caller_block, current_target) = self - .surround_call_with_store_and_check( - &mut patch, - check_id, - caller_block, - current_target, - *destination, - args.clone(), - substs, - call_fn_terminator.clone(), - ); - replace_target(&mut call_fn_terminator, current_target.unwrap()); - - // If there are multiple checks, this also should behave - // correctly, since on the second iteration this target - // is already the new block - self.current_patcher = Some(patch); - } - CheckKind::Pledge { - check, - check_before_expiry, - } => { - // get patcher: - let mut patch = self.current_patcher.take().unwrap(); - // 1. store old values, create local: - let check_sig = self.tcx.fn_sig(check).subst(self.tcx, substs); - let check_sig = self.tcx.normalize_erasing_late_bound_regions( - ty::ParamEnv::reveal_all(), - check_sig, - ); - let inputs = check_sig.inputs(); - let old_values_ty = inputs[inputs.len() - 2]; - let before_expiry_ty = inputs[inputs.len() - 1]; - - let old_values_place = - Place::from(patch.new_temp(old_values_ty, DUMMY_SP)); - // store_before_expiry has to always exist? - // if yes: - let before_expiry_place = - Place::from(patch.new_temp(before_expiry_ty, DUMMY_SP)); - - let (chain_start, new_caller, locals_to_drop) = self - .prepend_old_cloning( - &mut patch, - call_fn_terminator.clone(), - old_values_place, - old_values_ty, - args.clone(), - ); - patch.patch_terminator( - caller_block, - TerminatorKind::Goto { - target: chain_start, - }, - ); - caller_block = new_caller; - - // *destination is the loan! - // figure out where it expires! - let pledge_to_process = PledgeToProcess { - check, - check_before_expiry, - old_values_place, - before_expiry_place, - before_expiry_ty, - destination: *destination, - args: args.clone(), - substs, - locals_to_drop, - }; - self.pledges_to_process - .insert(destination.local, pledge_to_process); - - self.current_patcher = Some(patch); - } - _ => {} - } - } - } - } - } - } -} - -impl<'tcx, 'a> InsertChecksVisitor<'tcx> { - // Clone an argument manually. Returns the basic_block that starts the cloning - // and the local variable the value is cloned into. Additionally, returns an - // optional other local, that has to be dropped! - fn insert_clone_argument( - &self, - arg: mir::Place<'tcx>, - target: BasicBlock, - destination: Option, - patch: &mut MirPatch<'tcx>, - target_type_opt: Option>, - ) -> Result<(BasicBlock, mir::Local, Option), ()> { - // if we deal with a reference, we can directly call clone on it - // otherwise we have to create a reference first, to pass to the clone - // function. - let clone_defid = get_clone_defid(self.tcx).ok_or(())?; - let param_env = self.tcx.param_env(self.current_def_id.unwrap()); - // let clone_trait_defid = self.tcx.lang_items().clone_trait().unwrap(); - // - let arg_ty = if let Some(target_type) = target_type_opt { - target_type - } else { - arg.ty(&self.body_copy.local_decls, self.tcx).ty - }; - let mutable_ref = matches!(arg_ty.ref_mutability(), Some(mir::Mutability::Mut)); - println!("arg type: {:?}", arg_ty); - - let dest = destination.unwrap_or_else(|| patch.new_temp(arg_ty, DUMMY_SP)); - println!( - "trying to clone arg: {:?} into destination: {:?}", - arg, dest - ); - if !arg_ty.is_ref() { - // non-ref arg means we first deref and then clone. No need to - // drop, since result is moved to check - let ref_ty = create_reference_type(self.tcx, arg_ty); - let ref_arg = patch.new_temp(ref_ty, DUMMY_SP); - // add a statement to deref the old_argument - let rvalue = rvalue_reference_to_local(self.tcx, arg, false); - // the statement to be added to the block that has the call clone - // terminator - let ref_stmt = - mir::StatementKind::Assign(Box::new((mir::Place::from(ref_arg), rvalue))); - - // create the substitution since clone is generic: - let generic_ty = ty::subst::GenericArg::from(arg_ty); - let substs = self.tcx.mk_substs(&[generic_ty]); - // create the function operand: - let clone_args = vec![Operand::Move(mir::Place::from(ref_arg))]; - // create a new basicblock: - let (new_block, _) = create_call_block( - self.tcx, - patch, - clone_defid, - clone_args, - substs, - Some(dest.into()), - Some(target), - )?; - patch.add_statement( - mir::Location { - block: new_block, - statement_index: 0, - }, - ref_stmt, - ); - - Ok((new_block, dest, None)) - // let block_data = BasicBlockData::new() - } else { - // create a new local to store the result of clone: - let deref_ty = arg_ty.builtin_deref(false).ok_or(())?.ty; - let clone_dest = patch.new_temp(deref_ty, DUMMY_SP); - let to_drop = if deref_ty.needs_drop(self.tcx, param_env) { - Some(clone_dest) - } else { - None - }; - - println!( - "dereferenced type: {:?}, needs drop? {:?}", - deref_ty, to_drop - ); - let generic_ty = ty::subst::GenericArg::from(deref_ty); - let substs = self.tcx.mk_substs(&[generic_ty]); - let clone_args = vec![Operand::Move(arg)]; - // add an additional simple block afterwards, that dereferences - // the the cloned value into the original receiver of old: - // create it beforehand, so we can set the precedors target correctly - let terminator = mir::Terminator { - source_info: dummy_source_info(), - kind: TerminatorKind::Goto { target }, - }; - let block_data = BasicBlockData::new(Some(terminator)); - let second_block = patch.new_block(block_data); - - // borrow the clone result - let rvalue = rvalue_reference_to_local(self.tcx, clone_dest.into(), mutable_ref); - let ref_stmt = mir::StatementKind::Assign(Box::new((dest.into(), rvalue))); - patch.add_statement( - mir::Location { - block: second_block, - statement_index: 0, - }, - ref_stmt, - ); - - let (new_block, _) = create_call_block( - self.tcx, - patch, - clone_defid, - clone_args, - substs, - Some(clone_dest.into()), - Some(second_block), - )?; - - Ok((new_block, dest, to_drop)) - } - } - - pub fn create_and_replace_arguments(&mut self, body: &mut Body<'tcx>) { - let mut patcher = MirPatch::new(body); - for arg in &self.mir_info.args_to_be_cloned { - let ty = body.local_decls.get(*arg).unwrap().ty; - let new_var = patcher.new_temp(ty, DUMMY_SP); - self.stored_arguments.insert(*arg, new_var); - } - let mut replacer = ArgumentReplacer::new(self.tcx, &self.stored_arguments); - for (block, bb_data) in body.basic_blocks_mut().iter_enumerated_mut() { - for (statement_index, stmt) in bb_data.statements.iter_mut().enumerate() { - let loc = mir::Location { - block, - statement_index, - }; - if self.mir_info.stmts_to_substitute_rhs.contains(&loc) { - replacer.visit_statement(stmt, loc); - } - } - } - patcher.apply(body); - } - - #[allow(clippy::too_many_arguments)] - fn surround_call_with_store_and_check( - &self, - patch: &mut MirPatch<'tcx>, - check_id: DefId, - caller_block: BasicBlock, - target: Option, - result_operand: Place<'tcx>, - args: Vec>, - substs: ty::subst::SubstsRef<'tcx>, - original_terminator: Terminator<'tcx>, - ) -> (BasicBlock, Option) { - // find the type of that local - let check_sig = self.tcx.fn_sig(check_id).subst(self.tcx, substs); - let param_env = self.tcx.param_env(self.current_def_id.unwrap()); - let check_sig = self - .tcx - .normalize_erasing_late_bound_regions(param_env, check_sig); - - let old_ty = *check_sig.inputs().last().unwrap(); - assert!(matches!(old_ty.kind(), ty::Tuple(_))); - - let old_dest_place = Place::from(patch.new_temp(old_ty, DUMMY_SP)); - - let drop_block_data = BasicBlockData::new(Some(Terminator { - source_info: dummy_source_info(), - kind: TerminatorKind::Goto { - target: BasicBlock::MAX, - }, - })); - let drop_start = patch.new_block(drop_block_data); - // construct arguments: first the arguments the function is called with, then the result of - // that call, then the old values: - let mut new_args = args.clone(); - new_args.push(Operand::Move(result_operand)); - new_args.push(Operand::Move(old_dest_place)); - - // we store the target, create a new block per check function - // chain these with the final call having the original target, - // change the target of the call to the first block of our chain. - let (check_block, _) = create_call_block( - self.tcx, - patch, - check_id, - new_args, - substs, - None, - Some(drop_start), - ) - .unwrap(); - - // the terminator that calls the original function, but in this case jumps to - // a check function after instead of original target - // for now we just construct it, this does not modify the terminator - // in the CFG yet - let mut call_terminator = original_terminator; - replace_target(&mut call_terminator, check_block); - - let (chain_start, new_caller, locals_to_drop) = - self.prepend_old_cloning(patch, call_terminator, old_dest_place, old_ty, args); - - // TODO: create testcases for calls that have no target. - // Make sure they behave correctly in case of panic - let drop_chain_start = - self.create_drop_chain(patch, locals_to_drop, target.unwrap_or(BasicBlock::MAX)); - // make drop_start point to this chain: - patch.patch_terminator( - drop_start, - TerminatorKind::Goto { - target: drop_chain_start, - }, - ); - - println!("chain starting at: {:?}", chain_start); - // make the original caller_block point to the first clone block - // after separate_terminator_from_block this is a goto so we don't break - // anything - patch.patch_terminator( - caller_block, - TerminatorKind::Goto { - target: chain_start, - }, - ); - (new_caller, Some(check_block)) - } - - // given a set of arguments, and the type that the old tuple should have - // create a chain of basic blocks that clones each of the arguments - // and puts them into a tuple - fn prepend_old_cloning( - &self, - patch: &mut MirPatch<'tcx>, - terminator: Terminator<'tcx>, - old_dest_place: mir::Place<'tcx>, - old_ty: ty::Ty<'tcx>, - args: Vec>, - ) -> (BasicBlock, BasicBlock, Vec) { - let new_block_data = BasicBlockData::new(Some(terminator)); - let current_caller = patch.new_block(new_block_data); - let mut current_target = current_caller; - - let mut old_tuple = Vec::new(); - let old_tuple_fields = old_ty.tuple_fields(); - - let mut locals_to_drop = Vec::new(); - for (id, operand) in args.iter().enumerate() { - let old_values_ty = old_tuple_fields.get(id).unwrap(); - if old_values_ty.is_unit() { - // we already know from ast, that this variable does not need - // to be cloned - let unit_const = unit_const(self.tcx); - old_tuple.push(unit_const); - } else { - match operand { - mir::Operand::Constant(_) => { - old_tuple.push(operand.clone()); - } - mir::Operand::Move(place) | mir::Operand::Copy(place) => { - let target_ty = Some(old_tuple_fields[id]); - // prepends clone blocks before the actual function is called - let (start_block, destination, to_drop) = self - .insert_clone_argument(*place, current_target, None, patch, target_ty) - .unwrap(); - if let Some(to_drop) = to_drop { - locals_to_drop.push(to_drop); - } - current_target = start_block; - // add the result to our tuple: - old_tuple.push(mir::Operand::Move(destination.into())); - } - } - } - } - let old_rvalue = mir::Rvalue::Aggregate( - Box::new(mir::AggregateKind::Tuple), - IndexVec::from_raw(old_tuple), - ); - let stmt_kind = mir::StatementKind::Assign(Box::new((old_dest_place, old_rvalue))); - let location = mir::Location { - block: current_caller, - statement_index: 0, - }; - patch.add_statement(location, stmt_kind); - - // (start of clone-chain, block calling annotated function) - (current_target, current_caller, locals_to_drop) - } - - /// Given a function call, prepend another function call directly before - /// it. Done by moving the existing call to a new block, replacing the - /// terminator of the existing block with a new call jumping to the new block - #[allow(clippy::too_many_arguments)] - fn prepend_call( - &self, - patcher: &mut MirPatch<'tcx>, - fn_id: DefId, - caller_block: BasicBlock, - args: Vec>, - substs: ty::subst::SubstsRef<'tcx>, - terminator: Terminator<'tcx>, - dest_place: Place<'tcx>, - ) -> BasicBlock { - // get the bodies of the store and check function - let new_block_data = BasicBlockData::new(Some(terminator)); - let new_block = patcher.new_block(new_block_data); - - let func_ty = self.tcx.mk_ty_from_kind(TyKind::FnDef(fn_id, substs)); - let func = Operand::Constant(Box::new(Constant { - span: DUMMY_SP, - user_ty: None, - literal: ConstantKind::zero_sized(func_ty), - })); - - let call_terminator = TerminatorKind::Call { - func, - args: args.clone(), - destination: dest_place, - target: Some(new_block), - from_hir_call: false, - // is terminating on unwind sometimes not actually what we want? - unwind: mir::UnwindAction::Continue, - fn_span: DUMMY_SP, - }; - patcher.patch_terminator(caller_block, call_terminator); - new_block - } - - fn create_pledge_call_chain( - &self, - pledge: &PledgeToProcess<'tcx>, - target: BasicBlock, - patcher: &mut MirPatch<'tcx>, - ) -> Result { - // given a location, insert the call chain to check a pledge: - // since we need to know the targets for each call, the blocks need to be created - // in reversed order. - - // annoying, but we have to create a block to start off the dropping chain - // early.. - let drop_start_term = Terminator { - source_info: dummy_source_info(), - kind: TerminatorKind::Goto { target }, - }; - let drop_block_data = BasicBlockData::new(Some(drop_start_term)); - let drop_block = patcher.new_block(drop_block_data); - - // Create call to check function: - let mut check_args = pledge.args.clone(); - check_args.push(Operand::Move(pledge.destination)); //result arg - check_args.push(Operand::Move(pledge.old_values_place)); - check_args.push(Operand::Move(pledge.before_expiry_place)); - let (check_after_block, _) = create_call_block( - self.tcx, - patcher, - pledge.check, - check_args, - pledge.substs, - None, - Some(drop_block), - )?; - - // If there is a check_before_expiry block, creat it - let next_target = if let Some(check_before_expiry) = pledge.check_before_expiry { - let before_check_args = vec![ - Operand::Move(pledge.destination), - Operand::Move(pledge.old_values_place), - ]; - let (new_block, _) = create_call_block( - self.tcx, - patcher, - check_before_expiry, - before_check_args, - pledge.substs, - None, - Some(check_after_block), - )?; - new_block - } else { - check_after_block - }; - - // 1. Call store_before_expiry, result of original call is pledge.destination - let args = vec![Operand::Move(pledge.destination)]; - let terminator = mir::Terminator { - source_info: dummy_source_info(), - kind: mir::TerminatorKind::Goto { - target: next_target, - }, - }; - let (clone_chain_start, _, locals_to_drop_after) = self.prepend_old_cloning( - patcher, - terminator, - pledge.before_expiry_place, - pledge.before_expiry_ty, - args, - ); - let mut locals_to_drop = pledge.locals_to_drop.clone(); - locals_to_drop.extend(locals_to_drop_after); - let drop_chain_start = self.create_drop_chain(patcher, locals_to_drop, target); - // adjust the check block's terminator - patcher.patch_terminator( - drop_block, - TerminatorKind::Goto { - target: drop_chain_start, - }, - ); - - Ok(clone_chain_start) - } - - /// Create a chain of drop calls to drop the provided list of locals. - /// If there are no locals to drop, this function simply returns `target` - fn create_drop_chain( - &self, - patcher: &mut MirPatch, - locals_to_drop: Vec, - target: BasicBlock, - ) -> BasicBlock { - let mut current_target = target; - for local in locals_to_drop.iter() { - let terminator = Terminator { - source_info: dummy_source_info(), - kind: TerminatorKind::Drop { - place: (*local).into(), - target: current_target, - unwind: mir::UnwindAction::Continue, - replace: false, - }, - }; - let block_data = BasicBlockData::new(Some(terminator)); - current_target = patcher.new_block(block_data); - } - current_target - } + return (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, local_def_id); + } + // must be called before the drops_elaborated base query, + // otherwise it will be stolen + let (mir_promoted_steal, _) = tcx.mir_promoted(local_def_id); + let mir_promoted_body = mir_promoted_steal.borrow().clone(); + let local_decls = mir_promoted_body.local_decls; + + let steal = (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, local_def_id); + let mut body = steal.steal(); + let def_id = local_def_id.to_def_id(); + + let mir_info = MirInfo::collect_mir_info(tcx, body.clone(), def_id, &local_decls); + + // MAKE MODIFICATIONS: + // replace old arguments + let mut old_arg_replacer = passes::CloneOldArgs::new(tcx, &mir_info, def_id, &local_decls); + // first we just create locals for old clones and replace them where arguments + // should be evaluated in an old state + old_arg_replacer.create_variables(&mut body); + + // insert pledge checks: + let mut pledge_inserter = passes::PledgeInserter::new(tcx, &mir_info, def_id, &local_decls); + pledge_inserter.run(&mut body); + // insert a dummy goto block at the beginning of the body + prepend_dummy_block(&mut body); + // insert preconditions + let mut precondition_inserter = + passes::PreconditionInserter::new(tcx, &mir_info, def_id, &local_decls); + precondition_inserter.run(&mut body); + // insert postconditions + let mut postcondition_inserter = + passes::PostconditionInserter::new(tcx, &mir_info, def_id, &local_decls); + postcondition_inserter.run(&mut body); + old_arg_replacer.clone_and_drop_variables(&mut body); + + mir_info.store_specs_env(); + + tcx.alloc_steal_mir(body) } diff --git a/prusti/src/modify_mir/mod.rs b/prusti/src/modify_mir/mod.rs index 1f4de684075..e1e4d982885 100644 --- a/prusti/src/modify_mir/mod.rs +++ b/prusti/src/modify_mir/mod.rs @@ -1,11 +1,5 @@ -use prusti_interface::{ - specs::typed::DefSpecificationMap, -}; - -// store the specs between multiple calls to mir_drops_elaborated. -// TODO: Can we store env too somehow? -pub static mut SPECS: Option = None; - mod mir_info_collector; pub mod mir_modify; pub mod mir_helper; +pub mod mir_modifications; +mod passes; diff --git a/prusti/src/modify_mir/passes/insert_pledge_checks.rs b/prusti/src/modify_mir/passes/insert_pledge_checks.rs new file mode 100644 index 00000000000..f2b482a6d41 --- /dev/null +++ b/prusti/src/modify_mir/passes/insert_pledge_checks.rs @@ -0,0 +1,220 @@ +use super::super::{ + mir_modifications::MirModifier, + mir_info_collector::{CheckBlockKind, MirInfo}, +}; +use prusti_interface::specs::typed::CheckKind; +use prusti_rustc_interface::{ + index::IndexVec, + middle::{ + mir::{self, patch::MirPatch, visit::MutVisitor}, + ty::{self, TyCtxt}, + }, + span::{def_id::DefId, DUMMY_SP}, +}; +use rustc_hash::FxHashMap; +use std::cell::{RefCell, RefMut}; + +pub struct PledgeInserter<'tcx, 'a> { + tcx: TyCtxt<'tcx>, + body_info: &'a MirInfo<'tcx>, + patch_opt: Option>>, + pledges_to_process: FxHashMap>, + body_copy: Option>, + def_id: DefId, + local_decls: &'a IndexVec>, +} + +#[derive(Debug, Clone)] +pub struct PledgeToProcess<'tcx> { + pub check: DefId, + pub check_before_expiry: Option, + pub old_values_place: mir::Place<'tcx>, + pub before_expiry_place: mir::Place<'tcx>, + pub before_expiry_ty: ty::Ty<'tcx>, + pub destination: mir::Place<'tcx>, + // the args the function was called with + pub args: Vec>, + pub substs: ty::subst::SubstsRef<'tcx>, + pub locals_to_drop: Vec, + // a local that is set when a function with a pledge is called + // and then checked before a runtime check at an expiration location + // is performed. + // pub local_guard: mir::Local, +} + +impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { + pub fn new( + tcx: TyCtxt<'tcx>, + body_info: &'a MirInfo<'tcx>, + def_id: DefId, + local_decls: &'a IndexVec>, + ) -> Self { + Self { + tcx, + body_info, + patch_opt: None, + pledges_to_process: Default::default(), + body_copy: None, + def_id, + local_decls, + } + } + + pub fn run(&mut self, body: &mut mir::Body<'tcx>) { + self.body_copy = Some(body.clone()); + self.patch_opt = Some(MirPatch::new(body).into()); + // find all calls to functions with pledges, and create local variables + // to store: old_values, before_expiry_place, + self.visit_body(body); + // apply the patch generated during visitation + let patcher_ref = self.patch_opt.take().unwrap(); + patcher_ref.into_inner().apply(body); + } +} + +impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + + fn visit_terminator( + &mut self, + terminator: &mut mir::Terminator<'tcx>, + location: mir::Location, + ) { + match &terminator.kind { + mir::TerminatorKind::Call { + func, + + destination, + args, + .. + } => { + // is a visit of the underlying things even necesary? + if let Some((call_id, substs)) = func.const_fn_def() { + // a.t.m there can only be one pledge, we ignore that + let mut caller_block = location.block; + for check_kind in self.body_info.specs.get_runtime_checks(&call_id) { + if let CheckKind::Pledge { + check, + check_before_expiry, + } = check_kind + { + // TODO: pack that into a function, use correct param_env + let check_sig = self.tcx.fn_sig(check).subst(self.tcx, substs); + let check_sig = self.tcx.normalize_erasing_late_bound_regions( + ty::ParamEnv::reveal_all(), + check_sig, + ); + let inputs = check_sig.inputs(); + let old_values_ty = inputs[inputs.len() - 2]; + let before_expiry_ty = inputs[inputs.len() - 1]; + let old_values_place = + mir::Place::from(self.patcher().new_temp(old_values_ty, DUMMY_SP)); + let before_expiry_place = mir::Place::from( + self.patcher().new_temp(before_expiry_ty, DUMMY_SP), + ); + // create the clones of old that will be passed to + // the check function. Make the chain end with the + // original function call + let (chain_start, new_caller, locals_to_drop) = self + .prepend_old_cloning( + terminator.clone(), + old_values_place, + old_values_ty, + args.clone(), + true, + ); + // replace the old caller with a goto, to the start + // of our function + self.patcher().patch_terminator( + caller_block, + mir::TerminatorKind::Goto { + target: chain_start, + }, + ); + // update the call_location (just in case there are + // ever multiple pleges in the future) + caller_block = new_caller; + let pledge_to_process = PledgeToProcess { + check, + check_before_expiry, + old_values_place, + before_expiry_place, + before_expiry_ty, + destination: *destination, + args: args.clone(), + substs, + locals_to_drop, + }; + // TODO: create a test where the result is assigned + // to the field of a tuple + self.pledges_to_process + .insert(destination.local, pledge_to_process); + } + } + } + } + mir::TerminatorKind::SwitchInt { targets, .. } => { + // find switchInts with a check_only target. + let switch_iter = targets.iter(); + if switch_iter.len() == 1 { + // let (value, target) = switch_iter.next().unwrap(); + let otherwise = targets.otherwise(); + // check if target is a check_block: + if let Some(kind) = self.body_info.check_blocks.get(&otherwise) { + match kind { + CheckBlockKind::PledgeExpires(local) => { + // this check_block should terminate with a goto always! + if let mir::TerminatorKind::Goto { ref target } = + self.body_copy.as_ref().unwrap()[otherwise] + .terminator + .clone() + .unwrap() + .kind + { + let pledge = self + .pledges_to_process + .get(local) + .expect("pledge expiration without an actual pledge"); + let start_block = + self.create_pledge_call_chain(pledge, *target).unwrap(); + + let new_terminator = mir::TerminatorKind::Goto { + target: start_block, + }; + // skip this check block and instead call checks-chain + self.patcher().patch_terminator(otherwise, new_terminator); + } + } + // nothing to do.. + CheckBlockKind::RuntimeAssertion => (), + } + } + } + } + _ => {} + } + } +} + +impl<'tcx, 'a> MirModifier<'tcx> for PledgeInserter<'tcx, 'a> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + + fn patcher(&self) -> RefMut> { + self.patch_opt + .as_ref() + .expect("Bug: MirPatch was not initialized for MirModifier") + .borrow_mut() + } + + fn def_id(&self) -> DefId { + self.def_id + } + + fn local_decls(&self) -> &'a IndexVec> { + self.local_decls + } +} diff --git a/prusti/src/modify_mir/passes/insert_postconditions.rs b/prusti/src/modify_mir/passes/insert_postconditions.rs new file mode 100644 index 00000000000..8ff6351edf8 --- /dev/null +++ b/prusti/src/modify_mir/passes/insert_postconditions.rs @@ -0,0 +1,178 @@ +use super::super::{mir_helper::*, mir_modifications::MirModifier, mir_info_collector::MirInfo}; +use prusti_rustc_interface::{ + index::IndexVec, + middle::{ + mir::{self, patch::MirPatch, visit::MutVisitor}, + ty::{self, TyCtxt}, + }, + span::{def_id::DefId, DUMMY_SP}, +}; +use std::cell::{RefCell, RefMut}; + +pub struct PostconditionInserter<'tcx, 'a> { + tcx: TyCtxt<'tcx>, + body_info: &'a MirInfo<'tcx>, + patch_opt: Option>>, + def_id: DefId, + local_decls: &'a IndexVec>, +} + +impl<'tcx, 'a> PostconditionInserter<'tcx, 'a> { + pub fn new( + tcx: TyCtxt<'tcx>, + body_info: &'a MirInfo<'tcx>, + def_id: DefId, + local_decls: &'a IndexVec>, + ) -> Self { + Self { + tcx, + body_info, + patch_opt: None, + def_id, + local_decls, + } + } + + pub fn run(&mut self, body: &mut mir::Body<'tcx>) { + let patch = MirPatch::new(body); + self.patch_opt = Some(patch.into()); + self.visit_body(body); + let patch_ref = self.patch_opt.take().unwrap(); + patch_ref.into_inner().apply(body); + } + + fn surround_call_with_store_and_check( + &self, + check_id: DefId, + caller_block: mir::BasicBlock, + target: Option, + result_operand: mir::Place<'tcx>, + args: Vec>, + substs: ty::subst::SubstsRef<'tcx>, + original_terminator: mir::Terminator<'tcx>, + ) -> (mir::BasicBlock, Option) { + // find the type of that local + let check_sig = self.tcx.fn_sig(check_id).subst(self.tcx, substs); + let param_env = self.tcx.param_env(self.def_id); + let check_sig = self + .tcx + .normalize_erasing_late_bound_regions(param_env, check_sig); + + let old_ty = *check_sig.inputs().last().unwrap(); + assert!(matches!(old_ty.kind(), ty::Tuple(_))); + + let old_dest_place = mir::Place::from(self.patcher().new_temp(old_ty, DUMMY_SP)); + + let drop_block_data = mir::BasicBlockData::new(Some(mir::Terminator { + source_info: dummy_source_info(), + kind: mir::TerminatorKind::Goto { + target: mir::BasicBlock::MAX, + }, + })); + let drop_start = self.patcher().new_block(drop_block_data); + // construct arguments: first the arguments the function is called with, then the result of + // that call, then the old values: + let mut new_args = args.clone(); + new_args.push(mir::Operand::Move(result_operand)); + new_args.push(mir::Operand::Move(old_dest_place)); + + // we store the target, create a new block per check function + // chain these with the final call having the original target, + // change the target of the call to the first block of our chain. + let (check_block, _) = self + .create_call_block(check_id, new_args, substs, None, Some(drop_start)) + .unwrap(); + + // the terminator that calls the original function, but in this case jumps to + // a check function after instead of original target + // for now we just construct it, this does not modify the terminator + // in the CFG yet + let mut call_terminator = original_terminator; + replace_target(&mut call_terminator, check_block); + + let (chain_start, new_caller, locals_to_drop) = + self.prepend_old_cloning(call_terminator, old_dest_place, old_ty, args, true); + + // TODO: create testcases for calls that have no target. + // Make sure they behave correctly in case of panic + let (drop_chain_start, _) = self.create_drop_chain(locals_to_drop, target); + // make drop_start point to this chain: + self.patcher().patch_terminator( + drop_start, + mir::TerminatorKind::Goto { + target: drop_chain_start, + }, + ); + + println!("chain starting at: {:?}", chain_start); + // make the original caller_block point to the first clone block + // after separate_terminator_from_block this is a goto so we don't break + // anything + self.patcher().patch_terminator( + caller_block, + mir::TerminatorKind::Goto { + target: chain_start, + }, + ); + (new_caller, Some(check_block)) + } +} + +impl<'tcx, 'a> MutVisitor<'tcx> for PostconditionInserter<'tcx, 'a> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + + fn visit_terminator( + &mut self, + terminator: &mut mir::Terminator<'tcx>, + location: mir::Location, + ) { + if let mir::TerminatorKind::Call { + func, + target, + destination, + args, + .. + } = &terminator.kind + { + if let Some((call_id, substs)) = func.const_fn_def() { + let mut caller_block = location.block; + let mut current_target = *target; + let mut call_fn_terminator = terminator.clone(); + for check_id in self.body_info.specs.get_post_checks(&call_id) { + (caller_block, current_target) = self.surround_call_with_store_and_check( + check_id, + caller_block, + current_target, + *destination, + args.clone(), + substs, + terminator.clone(), + ); + replace_target(&mut call_fn_terminator, current_target.unwrap()); + } + } + } + } +} + +impl<'tcx, 'a> MirModifier<'tcx> for PostconditionInserter<'tcx, 'a> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + fn patcher(&self) -> RefMut> { + self.patch_opt + .as_ref() + .expect("Bug: MirPatch for inserting preconditions was not initialized") + .borrow_mut() + } + + fn def_id(&self) -> DefId { + self.def_id + } + + fn local_decls(&self) -> &'a IndexVec> { + self.local_decls + } +} diff --git a/prusti/src/modify_mir/passes/insert_precondition_checks.rs b/prusti/src/modify_mir/passes/insert_precondition_checks.rs new file mode 100644 index 00000000000..e94b36275fa --- /dev/null +++ b/prusti/src/modify_mir/passes/insert_precondition_checks.rs @@ -0,0 +1,134 @@ +use super::super::{mir_helper::*, mir_modifications::MirModifier, mir_info_collector::MirInfo}; +use prusti_rustc_interface::{ + index::IndexVec, + middle::{ + mir::{self, patch::MirPatch, visit::MutVisitor}, + ty::{self, TyCtxt}, + }, + span::{def_id::DefId, DUMMY_SP}, +}; +use std::cell::{RefCell, RefMut}; + +/// This pass inserts precondition checks at the beginning of the +/// body, and also in front of each function that is called +/// (in case they have them) +pub struct PreconditionInserter<'tcx, 'a> { + tcx: TyCtxt<'tcx>, + body_info: &'a MirInfo<'tcx>, + /// making modifications from a Visitor often requires access + /// to a patcher! But from the visiting methods we don't have + /// direct access to a mutable body + patch_opt: Option>>, + def_id: DefId, + local_decls: &'a IndexVec>, +} + +impl<'tcx, 'a> PreconditionInserter<'tcx, 'a> { + pub fn new( + tcx: TyCtxt<'tcx>, + body_info: &'a MirInfo<'tcx>, + def_id: DefId, + local_decls: &'a IndexVec>, + ) -> Self { + Self { + tcx, + body_info, + patch_opt: None, + def_id, + local_decls, + } + } + pub fn run(&mut self, body: &mut mir::Body<'tcx>) { + let mut current_target = get_block_target(body, mir::START_BLOCK) + .expect("Bug: Body must start with a Goto block at this stage"); + let patch = MirPatch::new(body); + self.patch_opt = Some(patch.into()); + let substs = ty::subst::InternalSubsts::identity_for_item(self.tcx, self.body_info.def_id); + let args = args_from_body(body); + for check_id in self.body_info.specs.get_pre_checks(&self.body_info.def_id) { + (current_target, _) = self.create_call_block( + check_id, + args.clone(), + substs, + None, + Some(current_target), + ) + .unwrap(); + } + // make the starting block (which should already be a dummy) + // point to the first precondition check + self.patcher().patch_terminator( + mir::START_BLOCK, + mir::TerminatorKind::Goto { + target: current_target, + }, + ); + // apply patch first + let patch_ref = self.patch_opt.take().unwrap(); + patch_ref.into_inner().apply(body); + // new patch for other modifications: + self.patch_opt = Some(RefCell::new(MirPatch::new(body))); + self.visit_body(body); + let patch_ref = self.patch_opt.take().unwrap(); + patch_ref.into_inner().apply(body); + } +} + +impl<'tcx, 'a> MutVisitor<'tcx> for PreconditionInserter<'tcx, 'a> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + + fn visit_terminator( + &mut self, + terminator: &mut mir::Terminator<'tcx>, + location: mir::Location, + ) { + if let mir::TerminatorKind::Call { + func, target, args, .. + } = &terminator.kind + { + if let Some((call_id, substs)) = func.const_fn_def() { + let mut caller_block = location.block; + let _current_target = target; + if call_id.is_local() { + // If the call is local, we modify its body anyways + return; + } + for check_id in self.body_info.specs.get_pre_checks(&call_id) { + let return_ty = fn_return_ty(self.tcx, check_id); + assert!(return_ty.is_unit()); + let res = self.patcher().new_temp(return_ty, DUMMY_SP); + caller_block = self.prepend_call( + check_id, + caller_block, + args.clone(), + substs, + terminator.clone(), + res.into(), + ); + } + } + } + } +} + +impl<'tcx, 'a> MirModifier<'tcx> for PreconditionInserter<'tcx, 'a> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + fn patcher(&self) -> RefMut> { + self.patch_opt + .as_ref() + .expect("Bug: MirPatch for inserting preconditions was not initialized") + .borrow_mut() + } + + fn def_id(&self) -> DefId { + self.def_id + } + + fn local_decls(&self) -> &'a IndexVec> { + self.local_decls + } +} diff --git a/prusti/src/modify_mir/passes/mod.rs b/prusti/src/modify_mir/passes/mod.rs new file mode 100644 index 00000000000..e0260617086 --- /dev/null +++ b/prusti/src/modify_mir/passes/mod.rs @@ -0,0 +1,9 @@ +mod insert_precondition_checks; +mod insert_pledge_checks; +mod insert_postconditions; +mod replace_old_args; + +pub use insert_precondition_checks::PreconditionInserter; +pub use insert_pledge_checks::{PledgeToProcess, PledgeInserter}; +pub use replace_old_args::CloneOldArgs; +pub use insert_postconditions::PostconditionInserter; diff --git a/prusti/src/modify_mir/passes/replace_old_args.rs b/prusti/src/modify_mir/passes/replace_old_args.rs new file mode 100644 index 00000000000..e65d6c94a73 --- /dev/null +++ b/prusti/src/modify_mir/passes/replace_old_args.rs @@ -0,0 +1,171 @@ +use super::super::{ + mir_info_collector::{MirInfo}, + mir_helper::*, + mir_modifications::MirModifier, +}; + +use prusti_rustc_interface::{ + index::IndexVec, + middle::{ + mir::{self, patch::MirPatch, visit::MutVisitor}, + ty::{self, TyCtxt}, + }, + span::{def_id::DefId, DUMMY_SP}, +}; +use rustc_hash::FxHashMap; +use std::cell::{RefCell, RefMut}; + +pub struct CloneOldArgs<'tcx, 'a> { + tcx: TyCtxt<'tcx>, + body_info: &'a MirInfo<'tcx>, + patch_opt: Option>>, + def_id: DefId, + local_decls: &'a IndexVec>, + stored_arguments: FxHashMap, +} + +impl<'tcx, 'a> CloneOldArgs<'tcx, 'a> { + pub fn new( + tcx: TyCtxt<'tcx>, + body_info: &'a MirInfo<'tcx>, + def_id: DefId, + local_decls: &'a IndexVec>, + ) -> Self { + Self { + tcx, + body_info, + patch_opt: None, + def_id, + local_decls, + stored_arguments: Default::default(), + } + } + + // Creates locals for the clones of arguments, and replaces them in + // the correct places such that old behaves correctly + pub fn create_variables(&mut self, body: &mut mir::Body<'tcx>) { + let mut patcher = MirPatch::new(body); + for arg in &self.body_info.args_to_be_cloned { + let ty = self.local_decls.get(*arg).unwrap().ty; + let new_var = patcher.new_temp(ty, DUMMY_SP); + self.stored_arguments.insert(*arg, new_var); + } + let mut replacer = ArgumentReplacer::new(self.tcx, &self.stored_arguments); + for (block, bb_data) in body.basic_blocks_mut().iter_enumerated_mut() { + for (statement_index, stmt) in bb_data.statements.iter_mut().enumerate() { + let loc = mir::Location { + block, + statement_index, + }; + if self.body_info.stmts_to_substitute_rhs.contains(&loc) { + replacer.visit_statement(stmt, loc); + } + } + } + patcher.apply(body); + } + + pub fn clone_and_drop_variables(&mut self, body: &mut mir::Body<'tcx>) { + let patch = MirPatch::new(body); + self.patch_opt = Some(patch.into()); + let mut drop_on_return = Vec::new(); + // clone the arguments: + let mut current_target = get_block_target(body, mir::START_BLOCK).expect("Bug: Body must start with a Goto block at this stage"); + for local in self.body_info.args_to_be_cloned.iter() { + let place: mir::Place = (*local).into(); + let destination = *self.stored_arguments.get(local).unwrap(); + let (new_target, _, to_drop) = self + .insert_clone_argument(place, current_target, Some(destination), None, false) + .unwrap(); + current_target = new_target; + if let Some(to_drop) = to_drop { + drop_on_return.push(to_drop); + } + } + let terminator_kind = mir::TerminatorKind::Goto { + target: current_target, + }; + self.patcher() + .patch_terminator(mir::START_BLOCK, terminator_kind); + + let (drop_chain_start, drop_chain_end) = self.create_drop_chain(drop_on_return, None); + + let patch_ref = self.patch_opt.take().unwrap(); + patch_ref.into_inner().apply(body); + + // create drop chain: + let mut visitor = DropBeforeReturnVisitor { + drop_chain_start, + drop_chain_end, + tcx: self.tcx, + }; + visitor.visit_body(body); + } +} + +impl<'tcx, 'a> MutVisitor<'tcx> for CloneOldArgs<'tcx, 'a> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + + fn visit_local( + &mut self, + local: &mut mir::Local, + context: mir::visit::PlaceContext, + _location: mir::Location, + ) { + if let Some(replace) = self.stored_arguments.get(local) { + assert!(!matches!(context, mir::visit::PlaceContext::NonUse(_))); + *local = *replace; + } + } +} + +struct DropBeforeReturnVisitor<'tcx> { + drop_chain_start: mir::BasicBlock, + drop_chain_end: mir::BasicBlock, + tcx: ty::TyCtxt<'tcx>, +} + +impl<'tcx> MutVisitor<'tcx> for DropBeforeReturnVisitor<'tcx> { + fn tcx(&self) -> ty::TyCtxt<'tcx> { + self.tcx + } + fn visit_terminator( + &mut self, + terminator: &mut mir::Terminator<'tcx>, + location: mir::Location, + ) { + MutVisitor::super_terminator(self, terminator, location); + if location.block == self.drop_chain_end { + // The end of the drop chain should not be modified, + // otherwise we introduce a cycle + return; + } + if matches!(terminator.kind, mir::TerminatorKind::Return) { + terminator.kind = mir::TerminatorKind::Goto { + target: self.drop_chain_start, + }; + } + } +} + +impl<'tcx, 'a> MirModifier<'tcx> for CloneOldArgs<'tcx, 'a> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + fn patcher(&self) -> RefMut> { + self.patch_opt + .as_ref() + .expect("Bug: MirPatch for inserting preconditions was not initialized") + .borrow_mut() + } + + fn def_id(&self) -> DefId { + self.def_id + } + + fn local_decls(&self) -> &'a IndexVec> { + self.local_decls + } +} From b27686231a87cfedccf6093f7b263a56a5e30fda Mon Sep 17 00:00:00 2001 From: cedric Date: Mon, 7 Aug 2023 01:55:21 +0200 Subject: [PATCH 23/45] Add boolean guards for pledge checks --- prusti/src/modify_mir/mir_modifications.rs | 46 +++++++++++++++++-- .../modify_mir/passes/insert_pledge_checks.rs | 45 ++++++++++++++---- 2 files changed, 77 insertions(+), 14 deletions(-) diff --git a/prusti/src/modify_mir/mir_modifications.rs b/prusti/src/modify_mir/mir_modifications.rs index e1d0e2954f8..f61e54513d9 100644 --- a/prusti/src/modify_mir/mir_modifications.rs +++ b/prusti/src/modify_mir/mir_modifications.rs @@ -4,16 +4,15 @@ use prusti_rustc_interface::{ index::IndexVec, middle::{ mir::{ - self, patch::MirPatch, BasicBlock, BasicBlockData, Constant, - Operand, Place, Terminator, TerminatorKind, + self, patch::MirPatch, BasicBlock, BasicBlockData, Constant, Operand, Place, + Terminator, TerminatorKind, }, ty::{self, TyCtxt, TyKind}, }, span::{def_id::DefId, DUMMY_SP}, }; -use std::cell::RefMut; - +use std::{cell::RefMut, u128}; /// A general set of operations that are used to modify the MIR pub trait MirModifier<'tcx> { @@ -316,7 +315,29 @@ pub trait MirModifier<'tcx> { }, ); - Ok(clone_chain_start) + // wrap an `if pledge_guard around the whole thing` + let term_switchint = mir::TerminatorKind::SwitchInt { + discr: mir::Operand::Copy(pledge.guard_place), + targets: mir::terminator::SwitchTargets::new( + [(u128::MIN, target)].into_iter(), + clone_chain_start, + ), + }; + let terminator = mir::Terminator { + source_info: dummy_source_info(), + kind: term_switchint, + }; + let check_guard_block = mir::BasicBlockData::new(Some(terminator)); + let start_block = self.patcher().new_block(check_guard_block); + let unset_guard_stmt = self.set_bool_stmt(pledge.guard_place, false); + self.patcher().add_statement( + mir::Location { + block: clone_chain_start, + statement_index: 0, + }, + unset_guard_stmt, + ); + Ok(start_block) } /// Create a chain of drop calls to drop the provided list of locals. @@ -399,4 +420,19 @@ pub trait MirModifier<'tcx> { Ok((new_block_id, destination)) } + + fn set_bool_stmt( + &self, + destination: mir::Place<'tcx>, + value: bool, + ) -> mir::StatementKind<'tcx> { + let const_kind = mir::ConstantKind::from_bool(self.tcx(), value); + let const_true = mir::Constant { + span: DUMMY_SP, + user_ty: None, + literal: const_kind, + }; + let rhs = mir::Rvalue::Use(mir::Operand::Constant(Box::new(const_true))); + mir::StatementKind::Assign(Box::new((destination, rhs))) + } } diff --git a/prusti/src/modify_mir/passes/insert_pledge_checks.rs b/prusti/src/modify_mir/passes/insert_pledge_checks.rs index f2b482a6d41..62be0768fbb 100644 --- a/prusti/src/modify_mir/passes/insert_pledge_checks.rs +++ b/prusti/src/modify_mir/passes/insert_pledge_checks.rs @@ -1,6 +1,8 @@ +use crate::modify_mir::mir_helper::dummy_source_info; + use super::super::{ - mir_modifications::MirModifier, mir_info_collector::{CheckBlockKind, MirInfo}, + mir_modifications::MirModifier, }; use prusti_interface::specs::typed::CheckKind; use prusti_rustc_interface::{ @@ -39,7 +41,7 @@ pub struct PledgeToProcess<'tcx> { // a local that is set when a function with a pledge is called // and then checked before a runtime check at an expiration location // is performed. - // pub local_guard: mir::Local, + pub guard_place: mir::Place<'tcx>, } impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { @@ -70,6 +72,25 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { let patcher_ref = self.patch_opt.take().unwrap(); patcher_ref.into_inner().apply(body); } + + pub fn set_guard_true_block( + &self, + destination: mir::Place<'tcx>, + target: mir::BasicBlock, + ) -> mir::BasicBlock { + let stmt_kind = self.set_bool_stmt(destination, true); + let stmt = mir::Statement { + source_info: dummy_source_info(), + kind: stmt_kind, + }; + let terminator = mir::Terminator { + source_info: dummy_source_info(), + kind: mir::TerminatorKind::Goto { target }, + }; + let mut new_block = mir::BasicBlockData::new(Some(terminator)); + new_block.statements.push(stmt); + self.patcher().new_block(new_block) + } } impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { @@ -85,7 +106,6 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { match &terminator.kind { mir::TerminatorKind::Call { func, - destination, args, .. @@ -114,6 +134,10 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { let before_expiry_place = mir::Place::from( self.patcher().new_temp(before_expiry_ty, DUMMY_SP), ); + + let bool_ty = self.tcx.mk_ty_from_kind(ty::TyKind::Bool); + let local_guard = self.patcher().new_temp(bool_ty, DUMMY_SP).into(); + // create the clones of old that will be passed to // the check function. Make the chain end with the // original function call @@ -125,12 +149,13 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { args.clone(), true, ); - // replace the old caller with a goto, to the start + let set_guard_block = + self.set_guard_true_block(local_guard, chain_start); // of our function self.patcher().patch_terminator( caller_block, mir::TerminatorKind::Goto { - target: chain_start, + target: set_guard_block, }, ); // update the call_location (just in case there are @@ -146,6 +171,7 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { args: args.clone(), substs, locals_to_drop, + guard_place: local_guard, }; // TODO: create a test where the result is assigned // to the field of a tuple @@ -173,10 +199,11 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { .unwrap() .kind { - let pledge = self - .pledges_to_process - .get(local) - .expect("pledge expiration without an actual pledge"); + let pledge = self.pledges_to_process.get(local).expect( + "pledge expiration without an actual pledge,\ + seems like our assumption that calls of pledges are\ + always encountered before the expiration is wrong", + ); let start_block = self.create_pledge_call_chain(pledge, *target).unwrap(); From 6f089cdf1b3f03b70c657c779caccddb64512e7b Mon Sep 17 00:00:00 2001 From: cedihegi Date: Wed, 9 Aug 2023 13:36:21 +0200 Subject: [PATCH 24/45] Optmization based on verification and reachability --- prusti-contracts/prusti-contracts/src/lib.rs | 6 + .../src/runtime_checks/boundary_extraction.rs | 34 +-- .../src/runtime_checks/check_type.rs | 5 +- .../src/runtime_checks/translation.rs | 22 +- .../src/specifications/preparser.rs | 2 +- .../environment/inserted_locations_store.rs | 45 ++++ .../src/environment/mir_storage.rs | 7 +- prusti-interface/src/environment/mod.rs | 1 + prusti-interface/src/prusti_error.rs | 27 +++ prusti-interface/src/specs/mod.rs | 1 - prusti-rustc-interface/src/lib.rs | 2 +- prusti-utils/src/config.rs | 6 + .../src/encoder/errors/error_manager.rs | 13 +- .../src/encoder/mir/procedures/encoder/mod.rs | 11 + prusti-viper/src/encoder/procedure_encoder.rs | 4 + prusti-viper/src/verifier.rs | 3 + prusti/src/callbacks.rs | 194 +++++++++++++----- prusti/src/driver.rs | 3 - prusti/src/modify_mir/mir_helper.rs | 19 +- prusti/src/modify_mir/mir_info_collector.rs | 21 +- prusti/src/modify_mir/mir_modify.rs | 72 ++++--- prusti/src/modify_mir/mod.rs | 2 +- .../modify_mir/passes/insert_pledge_checks.rs | 4 +- .../passes/insert_postconditions.rs | 6 +- .../passes/insert_precondition_checks.rs | 17 +- .../passes/insert_remove_assertions.rs | 188 +++++++++++++++++ prusti/src/modify_mir/passes/mod.rs | 8 +- .../src/modify_mir/passes/remove_dead_code.rs | 89 ++++++++ .../src/modify_mir/passes/replace_old_args.rs | 13 +- 29 files changed, 664 insertions(+), 161 deletions(-) create mode 100644 prusti-interface/src/environment/inserted_locations_store.rs create mode 100644 prusti/src/modify_mir/passes/insert_remove_assertions.rs create mode 100644 prusti/src/modify_mir/passes/remove_dead_code.rs diff --git a/prusti-contracts/prusti-contracts/src/lib.rs b/prusti-contracts/prusti-contracts/src/lib.rs index f1e7f588f91..20efa1b838b 100644 --- a/prusti-contracts/prusti-contracts/src/lib.rs +++ b/prusti-contracts/prusti-contracts/src/lib.rs @@ -370,4 +370,10 @@ pub fn snapshot_equality(_l: T, _r: T) -> bool { true } +/// A function used to generate booleans that are unknown to +/// prusti +pub fn random_bool() -> bool { + true +} + pub use private::*; diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs index 5bc29fc4345..7ad4be92e27 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs @@ -51,10 +51,11 @@ impl BoundExtractor { panic!("multiple args without manually defined boundaries are not allowed"); } let name_set: FxHashSet = args.iter().map(|el| el.0.clone()).collect(); - args.into_iter().map(|(name, ty)| { - let range_expr = match ty.to_token_stream().to_string().as_str() { - "i8" | "i16" | "i32" | "i64" | "i128" | "isize" | "u8" | "u16" | "u32" | "u64" - | "u128" | "usize" => { + args.into_iter() + .map(|(name, ty)| { + let range_expr = match ty.to_token_stream().to_string().as_str() { + "i8" | "i16" | "i32" | "i64" | "i128" | "isize" | "u8" | "u16" | "u32" + | "u64" | "u128" | "usize" => { let bounds = Self::extract_bounds(closure.clone(), &name, &name_set); let mut upper_bound_opt = None; let mut lower_bound_opt = None; @@ -93,12 +94,14 @@ impl BoundExtractor { } } } - let upper_bound = upper_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => - #ty::MAX - }); - let lower_bound = lower_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => - #ty::MIN - }); + let upper_bound = + upper_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => + #ty::MAX + }); + let lower_bound = + lower_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => + #ty::MIN + }); if include_upper { parse_quote_spanned! {closure.span() => @@ -109,11 +112,12 @@ impl BoundExtractor { (#lower_bound)..(#upper_bound) } } - }, - _ => panic!("runtime checks only supported for primitive types"), - }; - ((name, ty), range_expr) - }).collect() + } + _ => panic!("runtime checks only supported for primitive types"), + }; + ((name, ty), range_expr) + }) + .collect() } pub fn extract_bounds( diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs b/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs index 80e627caf6a..e7b3e38dc66 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs @@ -28,7 +28,10 @@ impl CheckType { SpecItemType::Postcondition => Self::Postcondition, SpecItemType::Precondition => Self::Precondition, SpecItemType::Pledge => Self::Pledge, - _ => panic!("spec type {:?} are not supported to be translated to runtime-checks.", spec) + _ => panic!( + "spec type {:?} are not supported to be translated to runtime-checks.", + spec + ), } } } diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 2b776051a23..59a247f8a5b 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -10,10 +10,7 @@ use crate::{ use proc_macro2::{Span, TokenStream}; use quote::{quote, ToTokens}; use rustc_hash::{FxHashMap, FxHashSet}; -use syn::{ - parse_quote, parse_quote_spanned, spanned::Spanned, - visit_mut::VisitMut, Expr, FnArg, -}; +use syn::{parse_quote, parse_quote_spanned, spanned::Spanned, visit_mut::VisitMut, Expr, FnArg}; pub struct CheckTranslator { /// The expression within the specification (the one that will @@ -66,10 +63,7 @@ pub fn translate_runtime_checks( let check_before_expiry = check_translator.generate_check_function(item, check_id, true, false); - ( - check_fn, - Some(check_before_expiry), - ) + (check_fn, Some(check_before_expiry)) } SpecItemType::Postcondition => { let check_fn = check_translator.generate_check_function(item, check_id, false, false); @@ -174,11 +168,8 @@ impl CheckTranslator { } else { None }; - let forget_statements = self.generate_forget_statements( - item, - include_item_args, - executed_after, - ); + let forget_statements = + self.generate_forget_statements(item, include_item_args, executed_after); let contract_string = expr_to_check.to_token_stream().to_string(); let failure_message = format!("Contract {} was violated at runtime", contract_string); let id_attr: syn::Attribute = if is_before_expiry_check { @@ -218,12 +209,13 @@ impl CheckTranslator { check_item.sig.inputs.push(old_arg); } if before_expiry_argument { - let output_ty: syn::Type = if let syn::ReturnType::Type(_, box ty) = &item.sig().output { + let output_ty: syn::Type = if let syn::ReturnType::Type(_, box ty) = &item.sig().output + { ty.clone() } else { // probably not our job to throw an error here? But a pledge for // a function with default return type does not make a lot of sense.. - parse_quote!{()} + parse_quote! {()} }; let before_expiry_arg = parse_quote_spanned! {item.span() => result_before_expiry: (#output_ty,) diff --git a/prusti-contracts/prusti-specs/src/specifications/preparser.rs b/prusti-contracts/prusti-specs/src/specifications/preparser.rs index 6b86ac9a232..f95b013978c 100644 --- a/prusti-contracts/prusti-specs/src/specifications/preparser.rs +++ b/prusti-contracts/prusti-specs/src/specifications/preparser.rs @@ -773,7 +773,7 @@ impl Quantifier { }) .collect::>(); let body = quote_spanned! { body.span() => #body }; - let attr = attr.map(|attr| quote_spanned!{attr.span() => #[prusti::#attr]}); + let attr = attr.map(|attr| quote_spanned! {attr.span() => #[prusti::#attr]}); match self { Self::Forall => quote_spanned! { full_span => ::prusti_contracts::forall( ( #( #trigger_sets, )* ), diff --git a/prusti-interface/src/environment/inserted_locations_store.rs b/prusti-interface/src/environment/inserted_locations_store.rs new file mode 100644 index 00000000000..454739d68df --- /dev/null +++ b/prusti-interface/src/environment/inserted_locations_store.rs @@ -0,0 +1,45 @@ +use lazy_static::lazy_static; +use prusti_rustc_interface::{middle::mir, span::def_id::DefId}; +use rustc_hash::FxHashMap; +use std::sync::Mutex; + +// locations contained in this map are inserted to check for reachability +// If the contained boolean is set to true, this means it generated an error. +// Generating an error in this context means this location is reachable +// +// At some point it might be smarter to pack this into an argument to verify, +// so we don't access the static global from encoding, but at least for +// passing it between queries and after_analysis (and back) it has to be +// a static global +lazy_static! { + pub static ref INSERTED_LOCATIONS: Mutex>> = + Default::default(); +} + +pub fn add_location(def_id: DefId, loc: mir::Location) { + let mut map = INSERTED_LOCATIONS.lock().unwrap(); + let entry = map.entry(def_id); + entry.or_default().insert(loc, false); +} + +pub fn contains(def_id: DefId, loc: mir::Location) -> bool { + let map = INSERTED_LOCATIONS.lock().unwrap(); + if let Some(function_map) = map.get(&def_id) { + function_map.contains_key(&loc) + } else { + false + } +} + +pub fn set_reachable(def_id: DefId, loc: mir::Location) { + let mut map = INSERTED_LOCATIONS.lock().unwrap(); + let fn_map = map.get_mut(&def_id).unwrap(); + // make sure this location is actually in here + assert!(fn_map.get(&loc).is_some()); + fn_map.insert(loc, true); +} + +pub fn get_function_map(def_id: DefId) -> Option> { + let map = INSERTED_LOCATIONS.lock().unwrap(); + map.get(&def_id).cloned() +} diff --git a/prusti-interface/src/environment/mir_storage.rs b/prusti-interface/src/environment/mir_storage.rs index f04523115d1..1dd393bd421 100644 --- a/prusti-interface/src/environment/mir_storage.rs +++ b/prusti-interface/src/environment/mir_storage.rs @@ -81,11 +81,8 @@ pub(super) unsafe fn retrieve_promoted_mir_body<'tcx>( def_id: LocalDefId, ) -> mir::Body<'tcx> { let body_without_facts: mir::Body<'static> = SHARED_STATE_WITHOUT_FACTS.with(|state| { - let map = state.borrow(); - // get instead of remove, because we might call it more than once with - // runtime checks. TODO: see if there is a better solution, at the moment - // the problem is that Environment can not really be stored after construction - map.get(&def_id).unwrap().clone() + let mut map = state.borrow_mut(); + map.remove(&def_id).unwrap() }); // SAFETY: See the module level comment. unsafe { std::mem::transmute(body_without_facts) } diff --git a/prusti-interface/src/environment/mod.rs b/prusti-interface/src/environment/mod.rs index b4aa4b63bc0..493c7beb747 100644 --- a/prusti-interface/src/environment/mod.rs +++ b/prusti-interface/src/environment/mod.rs @@ -27,6 +27,7 @@ mod name; pub mod polonius_info; mod procedure; mod query; +pub mod inserted_locations_store; pub use self::{ body::EnvBody, diff --git a/prusti-interface/src/prusti_error.rs b/prusti-interface/src/prusti_error.rs index bb0cc96f96c..75605e9fa66 100644 --- a/prusti-interface/src/prusti_error.rs +++ b/prusti-interface/src/prusti_error.rs @@ -28,6 +28,12 @@ pub struct PrustiError { /// currently verify functions multiple times. Once this is fixed, this /// field should be removed. is_disabled: bool, + /// ignore these errors because we introduced them ourselves by + /// modifying mir (inserting assertions for reachability) + /// Different to `is_disabled` because errors with is_disabled still cause + /// a verification failure. Also separated because apparently is_disabled + /// is temporary + ignore: bool, message: String, span: Box, help: Option, @@ -62,6 +68,7 @@ impl PrustiError { PrustiError { kind: PrustiErrorKind::Error, is_disabled: false, + ignore: false, message, span: Box::new(span), help: None, @@ -88,6 +95,19 @@ impl PrustiError { error } + pub fn ignore_verification(message: S, span: MultiSpan) -> Self { + check_message(message.to_string()); + let mut error = PrustiError::new( + format!( + "[Prusti: expected error. Bug if a user sees this!] {}", + message.to_string() + ), + span, + ); + error.ignore = true; + error + } + /// Report an unsupported feature of the verified Rust code (e.g. dereferencing raw pointers) pub fn unsupported(message: S, span: MultiSpan) -> Self { check_message(message.to_string()); @@ -162,6 +182,13 @@ impl PrustiError { self.is_disabled } + // Errors that should be ignored and not reported to the user. + // Used for errors that originate from assertions that we + // automatically insert into MIR to analyse reachability + pub fn is_ignored(&self) -> bool { + self.ignore + } + #[must_use] pub fn set_help(mut self, message: S) -> Self { self.help = Some(message.to_string()); diff --git a/prusti-interface/src/specs/mod.rs b/prusti-interface/src/specs/mod.rs index 78a47c5315e..c5feb147f70 100644 --- a/prusti-interface/src/specs/mod.rs +++ b/prusti-interface/src/specs/mod.rs @@ -134,7 +134,6 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { self.determine_prusti_refutations(&mut def_spec); self.determine_ghost_begin_ends(&mut def_spec); - // TODO: remove spec functions (make sure none are duplicated or left over) // Load all local spec MIR bodies, for export and later use self.ensure_local_mirs_fetched(&def_spec); diff --git a/prusti-rustc-interface/src/lib.rs b/prusti-rustc-interface/src/lib.rs index 72636ffe206..9480a050035 100644 --- a/prusti-rustc-interface/src/lib.rs +++ b/prusti-rustc-interface/src/lib.rs @@ -19,11 +19,11 @@ pub extern crate rustc_infer as infer; pub extern crate rustc_interface as interface; pub extern crate rustc_macros as macros; pub extern crate rustc_metadata as metadata; +pub extern crate rustc_mir_transform as mir_transform; pub extern crate rustc_serialize as serialize; pub extern crate rustc_session as session; pub extern crate rustc_span as span; pub extern crate rustc_target as target; -pub extern crate rustc_mir_transform as mir_transform; // TODO: switch over to `rustc_smir` once RA knows about the crate // pub use rustc_smir::very_unstable::{borrowck, dataflow, hir, middle, trait_selection}; diff --git a/prusti-utils/src/config.rs b/prusti-utils/src/config.rs index 75740be176d..ea96333c280 100644 --- a/prusti-utils/src/config.rs +++ b/prusti-utils/src/config.rs @@ -147,6 +147,7 @@ lazy_static::lazy_static! { settings.set_default("cargo_command", "check").unwrap(); settings.set_default("insert_runtime_checks", "false").unwrap(); + settings.set_default("remove_dead_blocks", "false").unwrap(); // Flags for testing. settings.set_default::>("verification_deadline", None).unwrap(); @@ -1037,3 +1038,8 @@ pub fn num_errors_per_function() -> u32 { pub fn insert_runtime_checks() -> bool { read_setting("insert_runtime_checks") } + +/// Try to use verification to identify unused blocks and eliminate them +pub fn remove_dead_blocks() -> bool { + read_setting("remove_dead_blocks") +} diff --git a/prusti-viper/src/encoder/errors/error_manager.rs b/prusti-viper/src/encoder/errors/error_manager.rs index 53d5e0e6c3d..91d2daa9710 100644 --- a/prusti-viper/src/encoder/errors/error_manager.rs +++ b/prusti-viper/src/encoder/errors/error_manager.rs @@ -8,10 +8,11 @@ use std::fmt::Debug; use vir_crate::polymorphic::Position; use rustc_hash::FxHashMap; -use prusti_rustc_interface::span::source_map::SourceMap; +use prusti_rustc_interface::span::{source_map::SourceMap, def_id::DefId}; +use prusti_rustc_interface::middle::mir::Location; use prusti_rustc_interface::errors::MultiSpan; use viper::VerificationError; -use prusti_interface::PrustiError; +use prusti_interface::{PrustiError, environment::inserted_locations_store}; use log::debug; use super::PositionManager; use prusti_interface::data::ProcedureDefId; @@ -188,6 +189,7 @@ pub enum ErrorCtxt { /// The state that fold-unfold algorithm deduced as unreachable, is actually /// reachable. UnreachableFoldingState, + InsertedReachabilityAssertion(DefId, Location) } /// The error manager @@ -704,6 +706,13 @@ impl<'tcx> ErrorManager<'tcx> { error_span, ) } + (_err_id, ErrorCtxt::InsertedReachabilityAssertion(def_id, location)) => { + // this location is reachable. Mark it: + inserted_locations_store::set_reachable(*def_id, *location); + // return a cancelled error, because these should not cause + // a failure + PrustiError::ignore_verification("Inserted assertion is reachable", error_span) + } (full_err_id, ErrorCtxt::Unexpected) => { PrustiError::internal( diff --git a/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs b/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs index 7e0dced682b..84cf3876944 100644 --- a/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs +++ b/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs @@ -26,6 +26,7 @@ use log::debug; use prusti_common::config; use prusti_interface::environment::{ debug_utils::to_text::ToText, + inserted_locations_store, mir_analyses::{ allocation::{compute_definitely_allocated, DefinitelyAllocatedAnalysisResult}, initialization::{compute_definitely_initialized, DefinitelyInitializedAnalysisResult}, @@ -1257,6 +1258,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { } => self.encode_terminator_assert( block_builder, span, + location, cond, *expected, msg, @@ -1813,6 +1815,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { &mut self, block_builder: &mut BasicBlockBuilder, span: Span, + location: mir::Location, cond: &mir::Operand<'tcx>, expected: bool, msg: &mir::AssertMessage<'tcx>, @@ -1834,6 +1837,14 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { let mut s = String::new(); msg.fmt_assert_args(&mut s).unwrap(); (s, ErrorCtxt::BoundsCheckAssert) + } else if inserted_locations_store::contains(self.def_id, location) { + // an assertion that was inserted for reachability check + let assert_msg = + "Assertion inserted by Prusti, if you see this as a user this is a bug".to_string(); + ( + assert_msg, + ErrorCtxt::InsertedReachabilityAssertion(self.def_id, location), + ) } else { let assert_msg = msg.description().to_string(); (assert_msg.clone(), ErrorCtxt::AssertTerminator(assert_msg)) diff --git a/prusti-viper/src/encoder/procedure_encoder.rs b/prusti-viper/src/encoder/procedure_encoder.rs index ba5f4a5e2e1..5b829b89e29 100644 --- a/prusti-viper/src/encoder/procedure_encoder.rs +++ b/prusti-viper/src/encoder/procedure_encoder.rs @@ -29,6 +29,7 @@ use prusti_common::{ vir::{ToGraphViz, fixes::fix_ghost_vars}, vir_local, vir_expr, vir_stmt }; +use prusti_interface::environment::inserted_locations_store; use vir_crate::{ polymorphic::{ self as vir, @@ -2767,6 +2768,9 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { let mut s = String::new(); msg.fmt_assert_args(&mut s).unwrap(); (s, ErrorCtxt::BoundsCheckAssert) + } else if inserted_locations_store::contains(self.proc_def_id, location) { + let assert_msg = "Assertion inserted by Prusti, if you see this as a user this is a bug".to_string(); + (assert_msg, ErrorCtxt::InsertedReachabilityAssertion(self.proc_def_id, location)) } else { let assert_msg = msg.description().to_string(); (assert_msg.clone(), ErrorCtxt::AssertTerminator(assert_msg)) diff --git a/prusti-viper/src/verifier.rs b/prusti-viper/src/verifier.rs index ae72ac1b163..632708bd276 100644 --- a/prusti-viper/src/verifier.rs +++ b/prusti-viper/src/verifier.rs @@ -150,6 +150,9 @@ impl<'v, 'tcx> Verifier<'v, 'tcx> { debug!("Verification error in {}: {:?}", method, verification_error); let mut prusti_error = error_manager.translate_verification_error(&verification_error); + if prusti_error.is_ignored() { + continue + } // annotate with counterexample, if requested if config::counterexample() { if config::unsafe_core_proof() { diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index 61b4d3728ee..b5132a3be95 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -1,5 +1,6 @@ -use crate::{modify_mir, verifier::verify}; +use crate::{modify_mir::mir_modify, verifier::verify}; +use lazy_static::lazy_static; use prusti_common::config; use prusti_interface::{ environment::{mir_storage, Environment}, @@ -9,20 +10,30 @@ use prusti_rustc_interface::{ borrowck::consumers, data_structures::steal::Steal, driver::Compilation, - hir::{def::DefKind, def_id::LocalDefId}, + hir::def::DefKind, index::IndexVec, interface::{interface::Compiler, Config, Queries}, middle::{ - mir::{self, BorrowCheckResult}, + mir::{self, BorrowCheckResult, MirPass, START_BLOCK}, query::{ExternProviders, Providers}, - ty::TyCtxt, + ty::{self, TyCtxt, TypeVisitableExt}, }, + mir_transform::{self, inline}, session::Session, + span::def_id::LocalDefId, + trait_selection::traits, }; +use std::sync::Mutex; #[derive(Default)] pub struct PrustiCompilerCalls; +// globals used to pass information between overriden queries and after_analysis +static mut SPECS: Option = None; +lazy_static! { + static ref VERIFIED: Mutex = Mutex::new(false); +} + // Running `get_body_with_borrowck_facts` can be very slow, therefore we avoid it when not // necessary; for crates which won't be verified or spec_fns it suffices to load just the fn body @@ -64,13 +75,103 @@ fn mir_promoted<'tcx>( ) { let original_mir_promoted = prusti_rustc_interface::interface::DEFAULT_QUERY_PROVIDERS.mir_promoted; - let result = original_mir_promoted(tcx, def_id); + let (body_steal, promoted_steal) = original_mir_promoted(tcx, def_id); + let mut body = body_steal.steal(); + + // clone the body and potentially make some modifications that should + // not end up in the actual body + if config::remove_dead_blocks() { + println!("removing dead code is enabled"); + mir_modify::insert_asserts_for_reachability(&mut body, def_id.to_def_id(), tcx); + } // SAFETY: This is safe because we are feeding in the same `tcx` that is // going to be used as a witness when pulling out the data. unsafe { - mir_storage::store_promoted_mir_body(tcx, def_id, result.0.borrow().clone()); + mir_storage::store_promoted_mir_body(tcx, def_id, body.clone()); } - result + (tcx.alloc_steal_mir(body), promoted_steal) +} + +// a copy of the rust compilers implementation of this query + +// + verification on its first call +// + dead code elimination if enabled +// + insertion of runtime checks if enabled +pub(crate) fn mir_drops_elaborated(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal> { + // run verification here, otherwise we can't rely on results in + // drops elaborated + if !config::no_verify() { + let mut already_verified = VERIFIED.lock().unwrap(); + if !*already_verified { + println!("Starting Verification"); + let (def_spec, env) = get_specs(tcx, None); + verify(env, def_spec.clone()); + *already_verified = true; + store_defspec(def_spec); + } + } + + // original compiler code + if tcx.sess.opts.unstable_opts.drop_tracking_mir + && let DefKind::Generator = tcx.def_kind(def) + { + tcx.ensure_with_value().mir_generator_witnesses(def); + } + let mir_borrowck = tcx.mir_borrowck(def); + + let is_fn_like = tcx.def_kind(def).is_fn_like(); + if is_fn_like { + // Do not compute the mir call graph without said call graph actually being used. + if inline::Inline.is_enabled(&tcx.sess) { + tcx.ensure_with_value() + .mir_inliner_callees(ty::InstanceDef::Item(def.to_def_id())); + } + } + + let (body, _) = tcx.mir_promoted(def); + let mut body = body.steal(); + + // ################################################ + // Inserted Modifications + // ################################################ + let local_decls = body.local_decls.clone(); + let def_id = def.to_def_id(); + if config::remove_dead_blocks() { + mir_modify::dead_code_elimination(tcx, &mut body, def_id); + } + if config::insert_runtime_checks() { + mir_modify::insert_runtime_checks(&mut body, def_id, tcx, &local_decls); + } + // ################################################ + // End of Modifications, back to original compiler + // code! + // ################################################ + + if let Some(error_reported) = mir_borrowck.tainted_by_errors { + body.tainted_by_errors = Some(error_reported); + } + let predicates = tcx + .predicates_of(body.source.def_id()) + .predicates + .iter() + .filter_map(|(p, _)| if p.is_global() { Some(*p) } else { None }); + if traits::impossible_predicates(tcx, traits::elaborate(tcx, predicates).collect()) { + // Clear the body to only contain a single `unreachable` statement. + let bbs = body.basic_blocks.as_mut(); + bbs.raw.truncate(1); + bbs[START_BLOCK].statements.clear(); + bbs[START_BLOCK].terminator_mut().kind = mir::TerminatorKind::Unreachable; + body.var_debug_info.clear(); + body.local_decls.raw.truncate(body.arg_count + 1); + } + + mir_transform::run_analysis_to_runtime_passes(tcx, &mut body); + + // Only available once rust is updated! + // Now that drop elaboration has been performed, we can check for + // unconditional drop recursion. + // mir_build::lints::check_drop_recursion(tcx, &body); + + tcx.alloc_steal_mir(body) } impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { @@ -80,8 +181,7 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { |_session: &Session, providers: &mut Providers, _external: &mut ExternProviders| { providers.mir_borrowck = mir_borrowck; providers.mir_promoted = mir_promoted; - providers.mir_drops_elaborated_and_const_checked = - modify_mir::mir_modify::mir_drops_elaborated; + providers.mir_drops_elaborated_and_const_checked = mir_drops_elaborated; }, ); } @@ -146,16 +246,8 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { fn after_analysis<'tcx>( &mut self, compiler: &Compiler, - queries: &'tcx Queries<'tcx>, + _queries: &'tcx Queries<'tcx>, ) -> Compilation { - compiler.session().abort_if_errors(); - queries.global_ctxt().unwrap().enter(|tcx| { - let (def_spec, env) = get_specs(tcx, Some(compiler)); - if !config::no_verify() { - verify(env, def_spec); - } - }); - compiler.session().abort_if_errors(); if config::full_compilation() { Compilation::Continue @@ -169,38 +261,40 @@ pub fn get_specs<'tcx>( tcx: TyCtxt<'tcx>, compiler_opt: Option<&Compiler>, ) -> (DefSpecificationMap, Environment<'tcx>) { - let specs_env_opt = unsafe { crate::SPEC_ENV.take() }; - if let Some((specs, env)) = specs_env_opt { - let env_tcx: Environment<'tcx> = unsafe { std::mem::transmute(env) }; - (specs, env_tcx) - } else { - let mut env = Environment::new(tcx, env!("CARGO_PKG_VERSION")); - - // when get_specs is first called from an overriden query - // (as is the case for runtime checks), we don't have - // access to the compiler, so for now we just skip the - // checking then - if let Some(compiler) = compiler_opt { - let spec_checker = specs::checker::SpecChecker::new(); - spec_checker.check(&env); - compiler.session().abort_if_errors(); - } else if env.diagnostic.has_errors() { - // TODO: still give some sensible error? - // Does it make a difference if we show the errors - // once get_specs returns in callbacks? - panic!("Spec checking caused errors. No good error message because runtime checks are enabled. This is a TODO"); - } - let hir = env.query.hir(); - let mut spec_collector = specs::SpecCollector::new(&mut env); - spec_collector.collect_specs(hir); - - let mut def_spec = spec_collector.build_def_specs(); - if config::print_typeckd_specs() { - for value in def_spec.all_values_debug(config::hide_uuids()) { - println!("{value}"); - } + let mut env = Environment::new(tcx, env!("CARGO_PKG_VERSION")); + + // when get_specs is first called from an overriden query + // (as is the case for runtime checks), we don't have + // access to the compiler, so for now we just skip the + // checking then + if let Some(compiler) = compiler_opt { + let spec_checker = specs::checker::SpecChecker::new(); + spec_checker.check(&env); + compiler.session().abort_if_errors(); + } else if env.diagnostic.has_errors() { + // TODO: still give some sensible error? + // Does it make a difference if we show the errors + // once get_specs returns in callbacks? + panic!("Spec checking caused errors. No good error message because runtime checks are enabled. This is a TODO"); + } + let hir = env.query.hir(); + let mut spec_collector = specs::SpecCollector::new(&mut env); + spec_collector.collect_specs(hir); + + let mut def_spec = spec_collector.build_def_specs(); + if config::print_typeckd_specs() { + for value in def_spec.all_values_debug(config::hide_uuids()) { + println!("{value}"); } - CrossCrateSpecs::import_export_cross_crate(&mut env, &mut def_spec); - (def_spec, env) } + CrossCrateSpecs::import_export_cross_crate(&mut env, &mut def_spec); + (def_spec, env) +} + +pub fn store_defspec(def_spec: DefSpecificationMap) { + unsafe { SPECS = Some(def_spec) }; +} + +pub fn get_defspec() -> DefSpecificationMap { + unsafe { SPECS.take().unwrap() } } diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index 42e96f50d69..c1e5165d141 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -22,14 +22,11 @@ use callbacks::PrustiCompilerCalls; use lazy_static::lazy_static; use log::info; use prusti_common::{config, report::user, Stopwatch}; -use prusti_interface::{environment::Environment, specs::typed::DefSpecificationMap}; use prusti_rustc_interface::interface::interface::try_print_query_stack; use std::{env, panic}; use tracing_chrome::{ChromeLayerBuilder, FlushGuard}; use tracing_subscriber::{filter::EnvFilter, prelude::*}; -pub static mut SPEC_ENV: Option<(DefSpecificationMap, Environment<'static>)> = None; - /// Link to report Prusti bugs const BUG_REPORT_URL: &str = "https://github.com/viperproject/prusti-dev/issues/new"; diff --git a/prusti/src/modify_mir/mir_helper.rs b/prusti/src/modify_mir/mir_helper.rs index 42a95f90f28..4d94d19fabd 100644 --- a/prusti/src/modify_mir/mir_helper.rs +++ b/prusti/src/modify_mir/mir_helper.rs @@ -1,6 +1,7 @@ use prusti_rustc_interface::{ index::IndexVec, middle::{ + middle::exported_symbols, mir::{self, patch::MirPatch, visit::MutVisitor, Body, TerminatorKind}, ty::{self, TyCtxt}, }, @@ -10,7 +11,6 @@ use rustc_hash::FxHashMap; // A set of functions that are often used during mir modifications - /// Check whether this variable is mutable, or a mutable reference pub fn is_mutable_arg( body: &Body<'_>, @@ -288,3 +288,20 @@ pub fn fn_def_signature(tcx: TyCtxt<'_>, def_id: DefId) -> ty::FnSig { let param_env = tcx.param_env(def_id); tcx.normalize_erasing_late_bound_regions(param_env, poly_fn_sig) } + +pub fn find_random_bool_defid<'tcx>(tcx: TyCtxt<'tcx>) -> Option { + for &cnum in tcx.crates(()).iter() { + let crate_name = tcx.crate_name(cnum); + if crate_name.as_str() == "prusti_contracts" { + for (def_id_symbol, _) in tcx.exported_symbols(cnum).iter() { + if let exported_symbols::ExportedSymbol::NonGeneric(def_id) = def_id_symbol { + let item_name = tcx.item_name(*def_id); + if item_name.as_str() == "random_bool" { + return Some(*def_id); + } + } + } + } + } + None +} diff --git a/prusti/src/modify_mir/mir_info_collector.rs b/prusti/src/modify_mir/mir_info_collector.rs index f6d23e43c30..39c33028446 100644 --- a/prusti/src/modify_mir/mir_info_collector.rs +++ b/prusti/src/modify_mir/mir_info_collector.rs @@ -1,7 +1,9 @@ +use crate::callbacks; + use super::mir_helper::*; use prusti_interface::{ - environment::{blocks_dominated_by, is_check_closure, EnvQuery, Environment}, + environment::{blocks_dominated_by, is_check_closure, EnvQuery}, specs::typed::DefSpecificationMap, utils::has_prusti_attr, }; @@ -20,10 +22,9 @@ use std::hash::Hash; // actuallye start modifying it. // Note that depending on the modifications we perform, some of the // information (e.g. about blocks might no longer be accurate) -pub struct MirInfo<'tcx> { +pub struct MirInfo { pub def_id: DefId, pub specs: DefSpecificationMap, - pub env: Environment<'tcx>, /// blocks that the translation specifically added to either mark /// a location (manual pledge expiry) or that we identified to /// be the check blocks for a `prusti_assert!`, `prusti_assume!` or @@ -36,18 +37,18 @@ pub struct MirInfo<'tcx> { pub stmts_to_substitute_rhs: FxHashSet, } -impl<'tcx> MirInfo<'tcx> { +impl MirInfo { // Collect this info given a body. // mir_promoted is also passed in here, because some information // is removed in mir_drops_elaborated - pub fn collect_mir_info<'a>( + pub fn collect_mir_info<'a, 'tcx>( tcx: TyCtxt<'tcx>, body: mir::Body<'tcx>, def_id: DefId, local_decls: &'a IndexVec>, - ) -> MirInfo<'tcx> { + ) -> MirInfo { println!("Collecting mir info for {:?}", body.source.def_id()); - let (specs, env) = crate::callbacks::get_specs(tcx, None); + let specs = crate::callbacks::get_defspec(); let check_blocks = collect_check_blocks(tcx, &body); let mut visitor = MirInfoCollector::new(body.clone(), tcx, local_decls); visitor.visit_body(&body); @@ -55,7 +56,6 @@ impl<'tcx> MirInfo<'tcx> { MirInfo { def_id, specs, - env, check_blocks, args_to_be_cloned, stmts_to_substitute_rhs, @@ -65,9 +65,8 @@ impl<'tcx> MirInfo<'tcx> { // global statics (because we only want to compute them once) // consider putting this inside of drop for MirInfo pub fn store_specs_env(self) { - let MirInfo { env, specs, .. } = self; - let static_env = unsafe { std::mem::transmute(env) }; - unsafe { crate::SPEC_ENV = Some((specs, static_env)) }; + let MirInfo { specs, .. } = self; + callbacks::store_defspec(specs); } } diff --git a/prusti/src/modify_mir/mir_modify.rs b/prusti/src/modify_mir/mir_modify.rs index 1052640a6d9..f42e90d68b1 100644 --- a/prusti/src/modify_mir/mir_modify.rs +++ b/prusti/src/modify_mir/mir_modify.rs @@ -1,29 +1,17 @@ use crate::modify_mir::{mir_helper::*, mir_info_collector::MirInfo, passes}; -use prusti_common::config; +use prusti_interface::utils; use prusti_rustc_interface::{ - data_structures::steal::Steal, - interface::DEFAULT_QUERY_PROVIDERS, + index::IndexVec, middle::{mir, ty::TyCtxt}, - span::def_id::LocalDefId, + span::def_id::DefId, }; -pub(crate) fn mir_drops_elaborated( - tcx: TyCtxt<'_>, - local_def_id: LocalDefId, -) -> &Steal> { - if !config::insert_runtime_checks() { - return (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, local_def_id); - } - // must be called before the drops_elaborated base query, - // otherwise it will be stolen - let (mir_promoted_steal, _) = tcx.mir_promoted(local_def_id); - let mir_promoted_body = mir_promoted_steal.borrow().clone(); - let local_decls = mir_promoted_body.local_decls; - - let steal = (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, local_def_id); - let mut body = steal.steal(); - let def_id = local_def_id.to_def_id(); - +pub(crate) fn insert_runtime_checks<'tcx>( + body: &mut mir::Body<'tcx>, + def_id: DefId, + tcx: TyCtxt<'tcx>, + local_decls: &IndexVec>, +) { let mir_info = MirInfo::collect_mir_info(tcx, body.clone(), def_id, &local_decls); // MAKE MODIFICATIONS: @@ -31,24 +19,52 @@ pub(crate) fn mir_drops_elaborated( let mut old_arg_replacer = passes::CloneOldArgs::new(tcx, &mir_info, def_id, &local_decls); // first we just create locals for old clones and replace them where arguments // should be evaluated in an old state - old_arg_replacer.create_variables(&mut body); + old_arg_replacer.create_variables(body); // insert pledge checks: let mut pledge_inserter = passes::PledgeInserter::new(tcx, &mir_info, def_id, &local_decls); - pledge_inserter.run(&mut body); + pledge_inserter.run(body); // insert a dummy goto block at the beginning of the body - prepend_dummy_block(&mut body); + prepend_dummy_block(body); // insert preconditions let mut precondition_inserter = passes::PreconditionInserter::new(tcx, &mir_info, def_id, &local_decls); - precondition_inserter.run(&mut body); + precondition_inserter.run(body); // insert postconditions let mut postcondition_inserter = passes::PostconditionInserter::new(tcx, &mir_info, def_id, &local_decls); - postcondition_inserter.run(&mut body); - old_arg_replacer.clone_and_drop_variables(&mut body); + postcondition_inserter.run(body); + old_arg_replacer.clone_and_drop_variables(body); + // put specs and env back into globals mir_info.store_specs_env(); +} - tcx.alloc_steal_mir(body) +pub fn insert_asserts_for_reachability<'tcx>( + body: &mut mir::Body<'tcx>, + def_id: DefId, + tcx: TyCtxt<'tcx>, +) { + // this might be over the line, but for now, for every block we insert + // an assert!(false) + let attrs = tcx.get_attrs_unchecked(def_id); + if utils::has_spec_only_attr(attrs) { + return; + } + let local_decls = body.local_decls.clone(); + let mut assertion_inserter = passes::AssertionInserter::new(tcx, def_id, &local_decls); + assertion_inserter.run(body); +} + +pub fn dead_code_elimination<'tcx>(tcx: TyCtxt<'tcx>, body: &mut mir::Body<'tcx>, def_id: DefId) { + // no modifications to spec functions! + let attrs = tcx.get_attrs_unchecked(def_id); + if utils::has_spec_only_attr(attrs) { + return; + } + let local_decls = body.local_decls.clone(); + let mut insert_remove_assertions = passes::AssertionInserter::new(tcx, def_id, &local_decls); + insert_remove_assertions.undo_insertions(body); + let mut remove_dead_blocks = passes::DeadCodeElimination::new(tcx, def_id); + remove_dead_blocks.run(body); } diff --git a/prusti/src/modify_mir/mod.rs b/prusti/src/modify_mir/mod.rs index e1e4d982885..0d7b5226d54 100644 --- a/prusti/src/modify_mir/mod.rs +++ b/prusti/src/modify_mir/mod.rs @@ -1,5 +1,5 @@ -mod mir_info_collector; pub mod mir_modify; pub mod mir_helper; pub mod mir_modifications; mod passes; +mod mir_info_collector; diff --git a/prusti/src/modify_mir/passes/insert_pledge_checks.rs b/prusti/src/modify_mir/passes/insert_pledge_checks.rs index 62be0768fbb..ce9e5e2500b 100644 --- a/prusti/src/modify_mir/passes/insert_pledge_checks.rs +++ b/prusti/src/modify_mir/passes/insert_pledge_checks.rs @@ -18,7 +18,7 @@ use std::cell::{RefCell, RefMut}; pub struct PledgeInserter<'tcx, 'a> { tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo<'tcx>, + body_info: &'a MirInfo, patch_opt: Option>>, pledges_to_process: FxHashMap>, body_copy: Option>, @@ -47,7 +47,7 @@ pub struct PledgeToProcess<'tcx> { impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { pub fn new( tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo<'tcx>, + body_info: &'a MirInfo, def_id: DefId, local_decls: &'a IndexVec>, ) -> Self { diff --git a/prusti/src/modify_mir/passes/insert_postconditions.rs b/prusti/src/modify_mir/passes/insert_postconditions.rs index 8ff6351edf8..d8478777c23 100644 --- a/prusti/src/modify_mir/passes/insert_postconditions.rs +++ b/prusti/src/modify_mir/passes/insert_postconditions.rs @@ -1,4 +1,4 @@ -use super::super::{mir_helper::*, mir_modifications::MirModifier, mir_info_collector::MirInfo}; +use super::super::{mir_helper::*, mir_info_collector::MirInfo, mir_modifications::MirModifier}; use prusti_rustc_interface::{ index::IndexVec, middle::{ @@ -11,7 +11,7 @@ use std::cell::{RefCell, RefMut}; pub struct PostconditionInserter<'tcx, 'a> { tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo<'tcx>, + body_info: &'a MirInfo, patch_opt: Option>>, def_id: DefId, local_decls: &'a IndexVec>, @@ -20,7 +20,7 @@ pub struct PostconditionInserter<'tcx, 'a> { impl<'tcx, 'a> PostconditionInserter<'tcx, 'a> { pub fn new( tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo<'tcx>, + body_info: &'a MirInfo, def_id: DefId, local_decls: &'a IndexVec>, ) -> Self { diff --git a/prusti/src/modify_mir/passes/insert_precondition_checks.rs b/prusti/src/modify_mir/passes/insert_precondition_checks.rs index e94b36275fa..b89e566353c 100644 --- a/prusti/src/modify_mir/passes/insert_precondition_checks.rs +++ b/prusti/src/modify_mir/passes/insert_precondition_checks.rs @@ -1,4 +1,4 @@ -use super::super::{mir_helper::*, mir_modifications::MirModifier, mir_info_collector::MirInfo}; +use super::super::{mir_helper::*, mir_info_collector::MirInfo, mir_modifications::MirModifier}; use prusti_rustc_interface::{ index::IndexVec, middle::{ @@ -14,7 +14,7 @@ use std::cell::{RefCell, RefMut}; /// (in case they have them) pub struct PreconditionInserter<'tcx, 'a> { tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo<'tcx>, + body_info: &'a MirInfo, /// making modifications from a Visitor often requires access /// to a patcher! But from the visiting methods we don't have /// direct access to a mutable body @@ -26,7 +26,7 @@ pub struct PreconditionInserter<'tcx, 'a> { impl<'tcx, 'a> PreconditionInserter<'tcx, 'a> { pub fn new( tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo<'tcx>, + body_info: &'a MirInfo, def_id: DefId, local_decls: &'a IndexVec>, ) -> Self { @@ -46,14 +46,9 @@ impl<'tcx, 'a> PreconditionInserter<'tcx, 'a> { let substs = ty::subst::InternalSubsts::identity_for_item(self.tcx, self.body_info.def_id); let args = args_from_body(body); for check_id in self.body_info.specs.get_pre_checks(&self.body_info.def_id) { - (current_target, _) = self.create_call_block( - check_id, - args.clone(), - substs, - None, - Some(current_target), - ) - .unwrap(); + (current_target, _) = self + .create_call_block(check_id, args.clone(), substs, None, Some(current_target)) + .unwrap(); } // make the starting block (which should already be a dummy) // point to the first precondition check diff --git a/prusti/src/modify_mir/passes/insert_remove_assertions.rs b/prusti/src/modify_mir/passes/insert_remove_assertions.rs new file mode 100644 index 00000000000..bbcba6ba37e --- /dev/null +++ b/prusti/src/modify_mir/passes/insert_remove_assertions.rs @@ -0,0 +1,188 @@ +// Insert assert!(false) for reachability analysis: + +use super::super::{mir_helper::*, mir_modifications::MirModifier}; +use lazy_static::lazy_static; +use prusti_interface::environment::inserted_locations_store; +use prusti_rustc_interface::{ + index::IndexVec, + middle::{ + mir::{self, patch::MirPatch, visit::Visitor}, + ty::{self, TyCtxt}, + }, + span::{def_id::DefId, DUMMY_SP}, +}; +use rustc_hash::{FxHashMap, FxHashSet}; +use std::{ + cell::{RefCell, RefMut}, + sync::Mutex, +}; + +lazy_static! { + static ref MOVED_START_BLOCK: Mutex> = Default::default(); +} + +/// This pass inserts precondition checks at the beginning of the +/// body, and also in front of each function that is called +/// (in case they have them) +pub struct AssertionInserter<'tcx, 'a> { + tcx: TyCtxt<'tcx>, + /// making modifications from a Visitor often requires access + /// to a patcher! But from the visiting methods we don't have + /// direct access to a mutable body + patch_opt: Option>>, + def_id: DefId, + local_decls: &'a IndexVec>, + random_bool_locals: FxHashMap, + added_assertion_blocks: FxHashSet<(mir::Local, mir::BasicBlock, mir::BasicBlock)>, +} + +impl<'tcx, 'a> AssertionInserter<'tcx, 'a> { + pub fn new( + tcx: TyCtxt<'tcx>, + def_id: DefId, + local_decls: &'a IndexVec>, + ) -> Self { + Self { + tcx, + patch_opt: None, + def_id, + local_decls, + random_bool_locals: Default::default(), + added_assertion_blocks: Default::default(), + } + } + pub fn run(&mut self, body: &mut mir::Body<'tcx>) { + let new_start_block = prepend_dummy_block(body); + MOVED_START_BLOCK + .lock() + .unwrap() + .insert(self.def_id, new_start_block); + self.patch_opt = Some(MirPatch::new(body).into()); + // create a boolean with value false at the very beginning of the body + let random_bool_defid = find_random_bool_defid(self.tcx).unwrap(); + let bool_ty = self.tcx.mk_ty_from_kind(ty::TyKind::Bool); + + let mut current_target = new_start_block; + for (bb, bb_data) in body.basic_blocks.iter_enumerated() { + if bb == mir::START_BLOCK || bb_data.is_cleanup { + // skip the dummy block we inserted and cleanup blocks + continue; + } + let bool_temp = self.patcher().new_temp(bool_ty, DUMMY_SP); + let assert_message = mir::AssertKind::OverflowNeg(mir::Operand::Copy(bool_temp.into())); + (current_target, _) = self + .create_call_block( + random_bool_defid, + vec![], + &ty::List::empty(), + Some(bool_temp.into()), + Some(current_target), + ) + .unwrap(); + // move the terminator to a new block + let new_block_data = mir::BasicBlockData::new(bb_data.terminator.clone()); + let new_block = self.patcher().new_block(new_block_data); + let assert_term = mir::TerminatorKind::Assert { + cond: mir::Operand::Copy(bool_temp.into()), + expected: true, + msg: Box::new(assert_message), + target: new_block, + unwind: mir::UnwindAction::Continue, + }; + let terminator_location = mir::Location { + block: bb, + statement_index: bb_data.statements.len(), + }; + inserted_locations_store::add_location(self.def_id, terminator_location); + + self.patcher().patch_terminator(bb, assert_term); + } + // finally point the first block to our random_bool_chain: + self.patcher().patch_terminator( + mir::START_BLOCK, + mir::TerminatorKind::Goto { + target: current_target, + }, + ); + let patch_ref = self.patch_opt.take().unwrap(); + patch_ref.into_inner().apply(body); + } + + pub fn undo_insertions(&mut self, body: &mut mir::Body<'tcx>) { + let moved_start_block = *MOVED_START_BLOCK.lock().unwrap().get(&self.def_id).unwrap(); + self.visit_body(body); + // only remove the blocks with assertions who's operands are + // generated by a random_bool call, because those are definitely + // not user generated + for (local, bb, target) in self.added_assertion_blocks.iter() { + if self.random_bool_locals.get(local).is_none() { + // skip it if the local was not generated by random_bool call + continue; + } + let terminator = body.basic_blocks[*target].terminator.clone(); + body.basic_blocks_mut()[*bb].terminator = terminator; + } + // we don't actually remove the inserted blocks, but just make them + // unreachable. + // Make first block point to moved start block + if let Some(mir::Terminator { + kind: mir::TerminatorKind::Goto { target, .. }, + .. + }) = &mut body.basic_blocks_mut()[mir::START_BLOCK].terminator + { + *target = moved_start_block; + } + } +} + +impl<'tcx, 'a> Visitor<'tcx> for AssertionInserter<'tcx, 'a> { + fn visit_terminator(&mut self, terminator: &mir::Terminator<'tcx>, location: mir::Location) { + match &terminator.kind { + mir::TerminatorKind::Call { + func, destination, .. + } => { + if let Some((call_id, _)) = func.const_fn_def() { + let item_name = self.tcx.def_path_str(call_id); + if &item_name[..] == "prusti_contracts::random_bool" { + self.random_bool_locals + .insert(destination.local, location.block); + } + } + } + // this sort of assertion with a boolean condition can not + // be crated by a User (would make zero sense at least) + // so we should not eliminate blocks generated by original code + mir::TerminatorKind::Assert { + cond: mir::Operand::Copy(place), + msg: box mir::AssertKind::OverflowNeg(_), + target, + .. + } => { + self.added_assertion_blocks + .insert((place.local, location.block, *target)); + } + _ => {} + } + self.super_terminator(terminator, location); + } +} + +impl<'tcx, 'a> MirModifier<'tcx> for AssertionInserter<'tcx, 'a> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + fn patcher(&self) -> RefMut> { + self.patch_opt + .as_ref() + .expect("Bug: MirPatch for inserting assertions was not initialized") + .borrow_mut() + } + + fn def_id(&self) -> DefId { + self.def_id + } + + fn local_decls(&self) -> &'a IndexVec> { + self.local_decls + } +} diff --git a/prusti/src/modify_mir/passes/mod.rs b/prusti/src/modify_mir/passes/mod.rs index e0260617086..d4460524b47 100644 --- a/prusti/src/modify_mir/passes/mod.rs +++ b/prusti/src/modify_mir/passes/mod.rs @@ -1,9 +1,13 @@ mod insert_precondition_checks; mod insert_pledge_checks; mod insert_postconditions; +mod insert_remove_assertions; mod replace_old_args; +mod remove_dead_code; +pub use insert_pledge_checks::{PledgeInserter, PledgeToProcess}; +pub use insert_postconditions::PostconditionInserter; pub use insert_precondition_checks::PreconditionInserter; -pub use insert_pledge_checks::{PledgeToProcess, PledgeInserter}; +pub use insert_remove_assertions::AssertionInserter; +pub use remove_dead_code::DeadCodeElimination; pub use replace_old_args::CloneOldArgs; -pub use insert_postconditions::PostconditionInserter; diff --git a/prusti/src/modify_mir/passes/remove_dead_code.rs b/prusti/src/modify_mir/passes/remove_dead_code.rs new file mode 100644 index 00000000000..f4056488405 --- /dev/null +++ b/prusti/src/modify_mir/passes/remove_dead_code.rs @@ -0,0 +1,89 @@ +use prusti_interface::environment::inserted_locations_store; +use prusti_rustc_interface::{ + middle::{ + mir::{self, visit::MutVisitor}, + ty::TyCtxt, + }, + span::def_id::DefId, +}; +use rustc_hash::FxHashSet; + +pub struct DeadCodeElimination<'tcx> { + tcx: TyCtxt<'tcx>, + unreachable_blocks: FxHashSet, +} + +impl<'tcx, 'a> DeadCodeElimination<'tcx> { + pub fn new(tcx: TyCtxt<'tcx>, def_id: DefId) -> Self { + // collect all the blocks that were inserted but didnt generate + // a verification error: + let reachability_map = inserted_locations_store::get_function_map(def_id).unwrap(); + let unreachable_blocks: FxHashSet = reachability_map + .iter() + .filter_map(|(loc, reachable)| (!reachable).then_some(loc.block)) + .collect(); + Self { + tcx, + unreachable_blocks, + } + } + + pub fn run(&mut self, body: &mut mir::Body<'tcx>) { + self.visit_body(body); + } +} + +impl<'tcx, 'a> MutVisitor<'tcx> for DeadCodeElimination<'tcx> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + + fn visit_terminator( + &mut self, + terminator: &mut mir::Terminator<'tcx>, + location: mir::Location, + ) { + let new_term_opt = match &mut terminator.kind { + mir::TerminatorKind::SwitchInt { discr, targets } => { + // filter out unreachable blocks + let mut targets_vec: Vec<(u128, mir::BasicBlock)> = targets + .iter() + .filter_map(|(value, bb)| { + (!self.unreachable_blocks.contains(&bb)).then_some((value, bb)) + }) + .collect(); + let otherwise_opt = if !self.unreachable_blocks.contains(&targets.otherwise()) { + Some(targets.otherwise()) + } else { + // unreachable otherwise block, take one of the + // targets + targets_vec.pop().map(|tup| tup.1) + }; + if let Some(otherwise) = otherwise_opt { + if targets_vec.len() == 0 { + Some(mir::TerminatorKind::Goto { target: otherwise }) + } else { + let switch_targets = + mir::terminator::SwitchTargets::new(targets_vec.into_iter(), otherwise); + Some(mir::TerminatorKind::SwitchInt { + discr: discr.clone(), + targets: switch_targets, + }) + } + } else { + // if none of the targets is reachable, then this block + // must be unreachable itself!! + assert!(self.unreachable_blocks.contains(&location.block)); + None + } + } + // potentially perform some checks on sanity of our results. + // E.g. a goto to a unreachable block can only come from + // another unreachable block. + _ => None, + }; + if let Some(new_term) = new_term_opt { + terminator.kind = new_term; + } + } +} diff --git a/prusti/src/modify_mir/passes/replace_old_args.rs b/prusti/src/modify_mir/passes/replace_old_args.rs index e65d6c94a73..c98fb404c21 100644 --- a/prusti/src/modify_mir/passes/replace_old_args.rs +++ b/prusti/src/modify_mir/passes/replace_old_args.rs @@ -1,8 +1,4 @@ -use super::super::{ - mir_info_collector::{MirInfo}, - mir_helper::*, - mir_modifications::MirModifier, -}; +use super::super::{mir_helper::*, mir_info_collector::MirInfo, mir_modifications::MirModifier}; use prusti_rustc_interface::{ index::IndexVec, @@ -17,7 +13,7 @@ use std::cell::{RefCell, RefMut}; pub struct CloneOldArgs<'tcx, 'a> { tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo<'tcx>, + body_info: &'a MirInfo, patch_opt: Option>>, def_id: DefId, local_decls: &'a IndexVec>, @@ -27,7 +23,7 @@ pub struct CloneOldArgs<'tcx, 'a> { impl<'tcx, 'a> CloneOldArgs<'tcx, 'a> { pub fn new( tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo<'tcx>, + body_info: &'a MirInfo, def_id: DefId, local_decls: &'a IndexVec>, ) -> Self { @@ -70,7 +66,8 @@ impl<'tcx, 'a> CloneOldArgs<'tcx, 'a> { self.patch_opt = Some(patch.into()); let mut drop_on_return = Vec::new(); // clone the arguments: - let mut current_target = get_block_target(body, mir::START_BLOCK).expect("Bug: Body must start with a Goto block at this stage"); + let mut current_target = get_block_target(body, mir::START_BLOCK) + .expect("Bug: Body must start with a Goto block at this stage"); for local in self.body_info.args_to_be_cloned.iter() { let place: mir::Place = (*local).into(); let destination = *self.stored_arguments.get(local).unwrap(); From 4bff3d6f873321b8325bf3ff3acd3313c76d3a96 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Wed, 16 Aug 2023 10:55:23 +0200 Subject: [PATCH 25/45] Pledges without annotations and Dead Code Eliminiation expiration locations of pledges are now figured out automatically and inserted, without using user annotations. Dead code elimination now works using only the encoder, and no longer modifying the MIR before verification. --- prusti-contracts/prusti-contracts/src/lib.rs | 6 - prusti-contracts/prusti-specs/src/lib.rs | 2 - .../environment/inserted_locations_store.rs | 42 +- prusti-interface/src/environment/procedure.rs | 22 + prusti-interface/src/globals.rs | 57 +++ prusti-interface/src/lib.rs | 1 + prusti-server/src/verification_request.rs | 9 +- prusti-utils/src/config.rs | 6 +- .../src/encoder/errors/error_manager.rs | 8 +- .../src/encoder/mir/procedures/encoder/mod.rs | 11 - prusti-viper/src/encoder/procedure_encoder.rs | 33 +- prusti/src/callbacks.rs | 37 +- prusti/src/modify_mir/mir_helper.rs | 39 +- prusti/src/modify_mir/mir_info_collector.rs | 27 +- prusti/src/modify_mir/mir_modifications.rs | 15 +- prusti/src/modify_mir/mir_modify.rs | 34 +- .../modify_mir/passes/insert_pledge_checks.rs | 438 ++++++++++++++---- .../passes/insert_postconditions.rs | 4 +- .../passes/insert_precondition_checks.rs | 4 +- .../passes/insert_remove_assertions.rs | 188 -------- prusti/src/modify_mir/passes/mod.rs | 2 - .../src/modify_mir/passes/remove_dead_code.rs | 19 +- .../src/modify_mir/passes/replace_old_args.rs | 4 +- prusti/src/verifier.rs | 4 +- rust-toolchain | 5 +- 25 files changed, 567 insertions(+), 450 deletions(-) create mode 100644 prusti-interface/src/globals.rs delete mode 100644 prusti/src/modify_mir/passes/insert_remove_assertions.rs diff --git a/prusti-contracts/prusti-contracts/src/lib.rs b/prusti-contracts/prusti-contracts/src/lib.rs index 20efa1b838b..f1e7f588f91 100644 --- a/prusti-contracts/prusti-contracts/src/lib.rs +++ b/prusti-contracts/prusti-contracts/src/lib.rs @@ -370,10 +370,4 @@ pub fn snapshot_equality(_l: T, _r: T) -> bool { true } -/// A function used to generate booleans that are unknown to -/// prusti -pub fn random_bool() -> bool { - true -} - pub use private::*; diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index 7a7d5b413f4..ad2a4eb991b 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -539,8 +539,6 @@ fn generate_runtime_expression_closure( quote_spanned! {callsite_span=> else if true { #closure - } else { - || (); } } } diff --git a/prusti-interface/src/environment/inserted_locations_store.rs b/prusti-interface/src/environment/inserted_locations_store.rs index 454739d68df..d41519f4a96 100644 --- a/prusti-interface/src/environment/inserted_locations_store.rs +++ b/prusti-interface/src/environment/inserted_locations_store.rs @@ -3,43 +3,31 @@ use prusti_rustc_interface::{middle::mir, span::def_id::DefId}; use rustc_hash::FxHashMap; use std::sync::Mutex; -// locations contained in this map are inserted to check for reachability -// If the contained boolean is set to true, this means it generated an error. -// Generating an error in this context means this location is reachable -// -// At some point it might be smarter to pack this into an argument to verify, -// so we don't access the static global from encoding, but at least for -// passing it between queries and after_analysis (and back) it has to be -// a static global +// Store a set of blocks which we check for reachability. Each of them is +// set to false if an error is generated for them, which means they are unreachable lazy_static! { - pub static ref INSERTED_LOCATIONS: Mutex>> = + pub static ref REACHABILITY_CHECKS: Mutex>> = Default::default(); } -pub fn add_location(def_id: DefId, loc: mir::Location) { - let mut map = INSERTED_LOCATIONS.lock().unwrap(); +// add the location when inserting refute(false) into encoding. +// Assume it's reachable, if we catch an error for it later we know it's not! +pub fn add_reachability_check(def_id: DefId, bb: mir::BasicBlock) { + let mut map = REACHABILITY_CHECKS.lock().unwrap(); let entry = map.entry(def_id); - entry.or_default().insert(loc, false); + entry.or_default().insert(bb, true); } -pub fn contains(def_id: DefId, loc: mir::Location) -> bool { - let map = INSERTED_LOCATIONS.lock().unwrap(); - if let Some(function_map) = map.get(&def_id) { - function_map.contains_key(&loc) - } else { - false - } -} - -pub fn set_reachable(def_id: DefId, loc: mir::Location) { - let mut map = INSERTED_LOCATIONS.lock().unwrap(); +pub fn set_block_unreachable(def_id: DefId, bb: mir::BasicBlock) { + println!("Marking block {:?} as unreachable", bb); + let mut map = REACHABILITY_CHECKS.lock().unwrap(); let fn_map = map.get_mut(&def_id).unwrap(); // make sure this location is actually in here - assert!(fn_map.get(&loc).is_some()); - fn_map.insert(loc, true); + assert!(fn_map.get(&bb).is_some()); + fn_map.insert(bb, false); } -pub fn get_function_map(def_id: DefId) -> Option> { - let map = INSERTED_LOCATIONS.lock().unwrap(); +pub fn get_reachability_map(def_id: DefId) -> Option> { + let map = REACHABILITY_CHECKS.lock().unwrap(); map.get(&def_id).cloned() } diff --git a/prusti-interface/src/environment/procedure.rs b/prusti-interface/src/environment/procedure.rs index 1aac8e7454f..0f49b3720cc 100644 --- a/prusti-interface/src/environment/procedure.rs +++ b/prusti-interface/src/environment/procedure.rs @@ -33,6 +33,7 @@ pub struct Procedure<'tcx> { loop_info: loops::ProcedureLoops, reachable_basic_blocks: FxHashSet, nonspec_basic_blocks: FxHashSet, + switch_int_targets: FxHashSet, } impl<'tcx> Procedure<'tcx> { @@ -47,6 +48,7 @@ impl<'tcx> Procedure<'tcx> { let reachable_basic_blocks = build_reachable_basic_blocks(&mir, &real_edges); let nonspec_basic_blocks = build_nonspec_basic_blocks(env.query, &mir, &real_edges); let loop_info = loops::ProcedureLoops::new(&mir, &real_edges); + let switch_int_targets = build_switch_int_targets(&mir); Self { tcx: env.tcx(), @@ -57,6 +59,7 @@ impl<'tcx> Procedure<'tcx> { loop_info, reachable_basic_blocks, nonspec_basic_blocks, + switch_int_targets, } } @@ -197,6 +200,10 @@ impl<'tcx> Procedure<'tcx> { pub fn successors(&self, bbi: BasicBlockIndex) -> &[BasicBlockIndex] { self.real_edges.successors(bbi) } + + pub fn is_non_spec_switch_int_target(&self, bbi: BasicBlockIndex) -> bool { + !self.is_spec_block(bbi) && self.switch_int_targets.contains(&bbi) + } } /// Returns the set of basic blocks that are not used as part of the typechecking of Prusti specifications @@ -444,3 +451,18 @@ fn build_nonspec_basic_blocks( get_nonspec_basic_blocks(env_query, bb_graph, mir) } + +/// Returns the set of basic blocks that are a target of a switchInt terminator +fn build_switch_int_targets(body: &Body) -> FxHashSet { + let mut switch_targets: FxHashSet = Default::default(); + for (_bb, bb_data) in body.basic_blocks.iter_enumerated() { + if let Some(mir::Terminator { + kind: mir::TerminatorKind::SwitchInt { targets, .. }, + .. + }) = &bb_data.terminator + { + switch_targets.extend(targets.all_targets()); + } + } + switch_targets +} diff --git a/prusti-interface/src/globals.rs b/prusti-interface/src/globals.rs new file mode 100644 index 00000000000..26388c7d24b --- /dev/null +++ b/prusti-interface/src/globals.rs @@ -0,0 +1,57 @@ +use prusti_rustc_interface::span::def_id::DefId; +use rustc_hash::FxHashMap; +use std::cell::RefCell; + +use crate::{ + environment::{polonius_info::PoloniusInfo, Environment}, + specs::typed::DefSpecificationMap, +}; + +// data that is persistent across queries will be stored here. +thread_local! { + pub static SPECS: RefCell> = RefCell::new(None); + pub static ENV: RefCell>> = RefCell::new(None); + pub static VERIFIED: RefCell = RefCell::new(false); + pub static POLONIUS: RefCell>> = RefCell::default(); +} + +pub fn store_spec_env<'tcx>(def_spec: DefSpecificationMap, env: Environment<'tcx>) { + let static_env: Environment<'static> = unsafe { std::mem::transmute(env) }; + SPECS.with(|specs| { + *specs.borrow_mut() = Some(def_spec); + }); + ENV.with(|env| { + *env.borrow_mut() = Some(static_env); + }) +} + +pub fn get_defspec() -> DefSpecificationMap { + SPECS.with(|specs| specs.take().unwrap()) +} + +pub fn get_env<'tcx>() -> Environment<'tcx> { + let env_static = ENV.with(|env| env.take().unwrap()); + let env: Environment<'tcx> = unsafe { std::mem::transmute(env_static) }; + env +} + +pub fn verified() -> bool { + VERIFIED.with(|verified| *verified.borrow()) +} + +pub fn set_verified() { + VERIFIED.with(|verified| *verified.borrow_mut() = true); +} + +pub fn store_polonius_info(def_id: DefId, polonius_info: PoloniusInfo<'_, '_>) { + // very unsafe, why do I have to do this.. + // have to make sure addresses in env stay accurate + let static_info: PoloniusInfo<'static, 'static> = unsafe { std::mem::transmute(polonius_info) }; + POLONIUS.with(|info| info.borrow_mut().insert(def_id, static_info)); +} + +// first lifetime corresponds to lifetime of env +pub fn get_polonius_info<'a, 'tcx>(def_id: DefId) -> Option> { + let static_polonius = POLONIUS.with(|info| info.borrow_mut().remove(&def_id)); + unsafe { std::mem::transmute(static_polonius) } +} diff --git a/prusti-interface/src/lib.rs b/prusti-interface/src/lib.rs index d1b7bdaf632..607fed6081e 100644 --- a/prusti-interface/src/lib.rs +++ b/prusti-interface/src/lib.rs @@ -25,6 +25,7 @@ pub mod data; pub mod environment; pub mod specs; pub mod utils; +pub mod globals; pub use prusti_error::*; diff --git a/prusti-server/src/verification_request.rs b/prusti-server/src/verification_request.rs index 273f44ea5d9..7c515d9fa01 100644 --- a/prusti-server/src/verification_request.rs +++ b/prusti-server/src/verification_request.rs @@ -37,9 +37,16 @@ impl ViperBackendConfig { let mut verifier_args = config::extra_verifier_args(); match backend { VerificationBackend::Silicon => { + // If we want to remove dead code, numberOfErrorsToReport has to + // be set to 0 (so all reachable errors are reported!) + let num_errors_per_function = if config::remove_dead_code() { + 0 + } else { + config::num_errors_per_function() + }; verifier_args.push(format!( "--numberOfErrorsToReport={}", - config::num_errors_per_function() + num_errors_per_function )); if config::use_more_complete_exhale() { verifier_args.push("--enableMoreCompleteExhale".to_string()); diff --git a/prusti-utils/src/config.rs b/prusti-utils/src/config.rs index ea96333c280..43fc5e1328e 100644 --- a/prusti-utils/src/config.rs +++ b/prusti-utils/src/config.rs @@ -147,7 +147,7 @@ lazy_static::lazy_static! { settings.set_default("cargo_command", "check").unwrap(); settings.set_default("insert_runtime_checks", "false").unwrap(); - settings.set_default("remove_dead_blocks", "false").unwrap(); + settings.set_default("remove_dead_code", "false").unwrap(); // Flags for testing. settings.set_default::>("verification_deadline", None).unwrap(); @@ -1040,6 +1040,6 @@ pub fn insert_runtime_checks() -> bool { } /// Try to use verification to identify unused blocks and eliminate them -pub fn remove_dead_blocks() -> bool { - read_setting("remove_dead_blocks") +pub fn remove_dead_code() -> bool { + read_setting("remove_dead_code") } diff --git a/prusti-viper/src/encoder/errors/error_manager.rs b/prusti-viper/src/encoder/errors/error_manager.rs index 91d2daa9710..4f8bbd439f6 100644 --- a/prusti-viper/src/encoder/errors/error_manager.rs +++ b/prusti-viper/src/encoder/errors/error_manager.rs @@ -9,7 +9,7 @@ use std::fmt::Debug; use vir_crate::polymorphic::Position; use rustc_hash::FxHashMap; use prusti_rustc_interface::span::{source_map::SourceMap, def_id::DefId}; -use prusti_rustc_interface::middle::mir::Location; +use prusti_rustc_interface::middle::mir::BasicBlock; use prusti_rustc_interface::errors::MultiSpan; use viper::VerificationError; use prusti_interface::{PrustiError, environment::inserted_locations_store}; @@ -189,7 +189,7 @@ pub enum ErrorCtxt { /// The state that fold-unfold algorithm deduced as unreachable, is actually /// reachable. UnreachableFoldingState, - InsertedReachabilityAssertion(DefId, Location) + InsertedReachabilityRefutation(DefId, BasicBlock) } /// The error manager @@ -706,9 +706,9 @@ impl<'tcx> ErrorManager<'tcx> { error_span, ) } - (_err_id, ErrorCtxt::InsertedReachabilityAssertion(def_id, location)) => { + (_err_id, ErrorCtxt::InsertedReachabilityRefutation(def_id, bb)) => { // this location is reachable. Mark it: - inserted_locations_store::set_reachable(*def_id, *location); + inserted_locations_store::set_block_unreachable(*def_id, *bb); // return a cancelled error, because these should not cause // a failure PrustiError::ignore_verification("Inserted assertion is reachable", error_span) diff --git a/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs b/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs index 84cf3876944..7e0dced682b 100644 --- a/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs +++ b/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs @@ -26,7 +26,6 @@ use log::debug; use prusti_common::config; use prusti_interface::environment::{ debug_utils::to_text::ToText, - inserted_locations_store, mir_analyses::{ allocation::{compute_definitely_allocated, DefinitelyAllocatedAnalysisResult}, initialization::{compute_definitely_initialized, DefinitelyInitializedAnalysisResult}, @@ -1258,7 +1257,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { } => self.encode_terminator_assert( block_builder, span, - location, cond, *expected, msg, @@ -1815,7 +1813,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { &mut self, block_builder: &mut BasicBlockBuilder, span: Span, - location: mir::Location, cond: &mir::Operand<'tcx>, expected: bool, msg: &mir::AssertMessage<'tcx>, @@ -1837,14 +1834,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { let mut s = String::new(); msg.fmt_assert_args(&mut s).unwrap(); (s, ErrorCtxt::BoundsCheckAssert) - } else if inserted_locations_store::contains(self.def_id, location) { - // an assertion that was inserted for reachability check - let assert_msg = - "Assertion inserted by Prusti, if you see this as a user this is a bug".to_string(); - ( - assert_msg, - ErrorCtxt::InsertedReachabilityAssertion(self.def_id, location), - ) } else { let assert_msg = msg.description().to_string(); (assert_msg.clone(), ErrorCtxt::AssertTerminator(assert_msg)) diff --git a/prusti-viper/src/encoder/procedure_encoder.rs b/prusti-viper/src/encoder/procedure_encoder.rs index 5b829b89e29..0741a498f7a 100644 --- a/prusti-viper/src/encoder/procedure_encoder.rs +++ b/prusti-viper/src/encoder/procedure_encoder.rs @@ -29,7 +29,7 @@ use prusti_common::{ vir::{ToGraphViz, fixes::fix_ghost_vars}, vir_local, vir_expr, vir_stmt }; -use prusti_interface::environment::inserted_locations_store; +use prusti_interface::{globals, environment::inserted_locations_store}; use vir_crate::{ polymorphic::{ self as vir, @@ -599,6 +599,9 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { |writer| method_with_fold_unfold.to_graphviz(writer), ); } + // store polonius info for runtime checks: + globals::store_polonius_info(self.proc_def_id, self.polonius_info.take().unwrap()); + Ok((method_with_fold_unfold, loan_expirations)) } @@ -1263,6 +1266,9 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { ); } + if config::remove_dead_code() && self.procedure.is_non_spec_switch_int_target(bbi) { + self.encode_reachability_refute(bbi, curr_block)?; + } self.encode_execution_flag(bbi, curr_block)?; let opt_successor = self.encode_block_statements(bbi, curr_block)?; let mir_successor: MirSuccessor = if let Some(successor) = opt_successor { @@ -1332,6 +1338,24 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { Ok(()) } + /// Insert a refute fals to deterimine rechability + fn encode_reachability_refute(&mut self, bbi: BasicBlockIndex, cfg_block: CfgBlockIndex) -> SpannedEncodingResult<()> { + let pos = self.register_error(self.mir_encoder.get_span_of_basic_block(bbi), ErrorCtxt::InsertedReachabilityRefutation(self.proc_def_id, bbi)); + inserted_locations_store::add_reachability_check(self.proc_def_id, bbi); + let false_const = vir::Expr::Const(vir::ConstExpr { + value: vir::Const::Bool(false), + position: pos + }); + self.cfg_method.add_stmt( + cfg_block, + vir::Stmt::Refute(vir::Refute { + expr: false_const, + position: pos + }) + ); + Ok(()) + } + /// Encode the statements of the block. /// In case of unsupported statements, this function will return `MirSuccessor::Kill`. #[tracing::instrument(level = "debug", skip(self))] @@ -2228,10 +2252,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { is_in_package_stmt: bool, ) -> SpannedEncodingResult> { let mut stmts: Vec = vec![]; - for loan in &loans { - // assert!(self.loan_expiration_location.get(loan).is_none()); - self.loan_expiration_location.insert(*loan, location); - } if !loans.is_empty() { let vir_reborrowing_dag = self.construct_vir_reborrowing_dag(&loans, zombie_loans, location, end_location, is_in_package_stmt)?; @@ -2768,9 +2788,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { let mut s = String::new(); msg.fmt_assert_args(&mut s).unwrap(); (s, ErrorCtxt::BoundsCheckAssert) - } else if inserted_locations_store::contains(self.proc_def_id, location) { - let assert_msg = "Assertion inserted by Prusti, if you see this as a user this is a bug".to_string(); - (assert_msg, ErrorCtxt::InsertedReachabilityAssertion(self.proc_def_id, location)) } else { let assert_msg = msg.description().to_string(); (assert_msg.clone(), ErrorCtxt::AssertTerminator(assert_msg)) diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index b5132a3be95..cfb17685830 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -1,9 +1,9 @@ use crate::{modify_mir::mir_modify, verifier::verify}; -use lazy_static::lazy_static; use prusti_common::config; use prusti_interface::{ environment::{mir_storage, Environment}, + globals, specs::{self, cross_crate::CrossCrateSpecs, is_spec_fn, typed::DefSpecificationMap}, }; use prusti_rustc_interface::{ @@ -23,17 +23,10 @@ use prusti_rustc_interface::{ span::def_id::LocalDefId, trait_selection::traits, }; -use std::sync::Mutex; #[derive(Default)] pub struct PrustiCompilerCalls; -// globals used to pass information between overriden queries and after_analysis -static mut SPECS: Option = None; -lazy_static! { - static ref VERIFIED: Mutex = Mutex::new(false); -} - // Running `get_body_with_borrowck_facts` can be very slow, therefore we avoid it when not // necessary; for crates which won't be verified or spec_fns it suffices to load just the fn body @@ -76,14 +69,9 @@ fn mir_promoted<'tcx>( let original_mir_promoted = prusti_rustc_interface::interface::DEFAULT_QUERY_PROVIDERS.mir_promoted; let (body_steal, promoted_steal) = original_mir_promoted(tcx, def_id); - let mut body = body_steal.steal(); + // is there still a reason to steal it if we don't modify it? + let body = body_steal.steal(); - // clone the body and potentially make some modifications that should - // not end up in the actual body - if config::remove_dead_blocks() { - println!("removing dead code is enabled"); - mir_modify::insert_asserts_for_reachability(&mut body, def_id.to_def_id(), tcx); - } // SAFETY: This is safe because we are feeding in the same `tcx` that is // going to be used as a witness when pulling out the data. unsafe { @@ -100,13 +88,12 @@ pub(crate) fn mir_drops_elaborated(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal, def: LocalDefId) -> &Steal( CrossCrateSpecs::import_export_cross_crate(&mut env, &mut def_spec); (def_spec, env) } - -pub fn store_defspec(def_spec: DefSpecificationMap) { - unsafe { SPECS = Some(def_spec) }; -} - -pub fn get_defspec() -> DefSpecificationMap { - unsafe { SPECS.take().unwrap() } -} diff --git a/prusti/src/modify_mir/mir_helper.rs b/prusti/src/modify_mir/mir_helper.rs index 4d94d19fabd..b3fcc61c761 100644 --- a/prusti/src/modify_mir/mir_helper.rs +++ b/prusti/src/modify_mir/mir_helper.rs @@ -1,7 +1,6 @@ use prusti_rustc_interface::{ index::IndexVec, middle::{ - middle::exported_symbols, mir::{self, patch::MirPatch, visit::MutVisitor, Body, TerminatorKind}, ty::{self, TyCtxt}, }, @@ -278,6 +277,27 @@ pub fn get_block_target(body: &Body<'_>, block: mir::BasicBlock) -> Option, location: mir::Location) -> Vec { + let statements_len = body[location.block].statements.len(); + if location.statement_index < statements_len { + vec![mir::Location { + statement_index: location.statement_index + 1, + ..location + }] + } else { + body[location.block] + .terminator + .as_ref() + .unwrap() + .successors() + .map(|block| mir::Location { + block, + statement_index: 0, + }) + .collect() + } +} + // are these the same types that we would get using local_decls and the locals // for each argument / the return local? pub fn fn_def_signature(tcx: TyCtxt<'_>, def_id: DefId) -> ty::FnSig { @@ -288,20 +308,3 @@ pub fn fn_def_signature(tcx: TyCtxt<'_>, def_id: DefId) -> ty::FnSig { let param_env = tcx.param_env(def_id); tcx.normalize_erasing_late_bound_regions(param_env, poly_fn_sig) } - -pub fn find_random_bool_defid<'tcx>(tcx: TyCtxt<'tcx>) -> Option { - for &cnum in tcx.crates(()).iter() { - let crate_name = tcx.crate_name(cnum); - if crate_name.as_str() == "prusti_contracts" { - for (def_id_symbol, _) in tcx.exported_symbols(cnum).iter() { - if let exported_symbols::ExportedSymbol::NonGeneric(def_id) = def_id_symbol { - let item_name = tcx.item_name(*def_id); - if item_name.as_str() == "random_bool" { - return Some(*def_id); - } - } - } - } - } - None -} diff --git a/prusti/src/modify_mir/mir_info_collector.rs b/prusti/src/modify_mir/mir_info_collector.rs index 39c33028446..916bf2a335c 100644 --- a/prusti/src/modify_mir/mir_info_collector.rs +++ b/prusti/src/modify_mir/mir_info_collector.rs @@ -1,9 +1,8 @@ -use crate::callbacks; - use super::mir_helper::*; use prusti_interface::{ - environment::{blocks_dominated_by, is_check_closure, EnvQuery}, + environment::{blocks_dominated_by, is_check_closure, EnvQuery, Environment}, + globals, specs::typed::DefSpecificationMap, utils::has_prusti_attr, }; @@ -22,9 +21,10 @@ use std::hash::Hash; // actuallye start modifying it. // Note that depending on the modifications we perform, some of the // information (e.g. about blocks might no longer be accurate) -pub struct MirInfo { +pub struct MirInfo<'tcx> { pub def_id: DefId, pub specs: DefSpecificationMap, + pub env: Environment<'tcx>, /// blocks that the translation specifically added to either mark /// a location (manual pledge expiry) or that we identified to /// be the check blocks for a `prusti_assert!`, `prusti_assume!` or @@ -37,18 +37,18 @@ pub struct MirInfo { pub stmts_to_substitute_rhs: FxHashSet, } -impl MirInfo { +impl<'tcx> MirInfo<'tcx> { // Collect this info given a body. // mir_promoted is also passed in here, because some information // is removed in mir_drops_elaborated - pub fn collect_mir_info<'a, 'tcx>( + pub fn collect_mir_info<'a>( tcx: TyCtxt<'tcx>, body: mir::Body<'tcx>, def_id: DefId, local_decls: &'a IndexVec>, - ) -> MirInfo { - println!("Collecting mir info for {:?}", body.source.def_id()); - let specs = crate::callbacks::get_defspec(); + ) -> MirInfo<'tcx> { + let specs = globals::get_defspec(); + let env = globals::get_env(); let check_blocks = collect_check_blocks(tcx, &body); let mut visitor = MirInfoCollector::new(body.clone(), tcx, local_decls); visitor.visit_body(&body); @@ -56,6 +56,7 @@ impl MirInfo { MirInfo { def_id, specs, + env, check_blocks, args_to_be_cloned, stmts_to_substitute_rhs, @@ -65,8 +66,8 @@ impl MirInfo { // global statics (because we only want to compute them once) // consider putting this inside of drop for MirInfo pub fn store_specs_env(self) { - let MirInfo { specs, .. } = self; - callbacks::store_defspec(specs); + let MirInfo { specs, env, .. } = self; + globals::store_spec_env(specs, env); } } @@ -225,7 +226,6 @@ impl<'tcx, 'a> MirInfoCollector<'tcx, 'a> { } // determine all the relevant facts about this local fn create_dependency(&self, local: mir::Local) -> Dependency { - println!("Creating dependency for local: {:?}", local); let local_decl = self.local_decls.get(local); // is_user_variable leads to panics for certain variables.. @@ -268,11 +268,9 @@ pub fn collect_check_blocks<'tcx>( // more than one block containing such a closure. let mut check_blocks = marked_check_blocks.clone(); for (bb, bb_kind) in marked_check_blocks { - println!("Looking for dominated blocks of {:?}", bb); let dominated_blocks = blocks_dominated_by(body, bb); for bb_dominated in dominated_blocks { if bb_dominated != bb { - println!("\tblock {:?}", bb_dominated); assert!(check_blocks.get(&bb_dominated).is_none()); check_blocks.insert(bb_dominated, bb_kind); } @@ -364,7 +362,6 @@ impl<'tcx> Visitor<'tcx> for OldSpanFinder<'tcx> { if let Some((call_id, _)) = func.const_fn_def() { let item_name = self.tcx.def_path_str(call_id); if &item_name[..] == "prusti_contracts::old" { - println!("old visitor found old function call"); self.old_spans.push(*fn_span); assert!(args.len() == 1); if let mir::Operand::Copy(place) | mir::Operand::Move(place) = diff --git a/prusti/src/modify_mir/mir_modifications.rs b/prusti/src/modify_mir/mir_modifications.rs index f61e54513d9..d3f311aecdb 100644 --- a/prusti/src/modify_mir/mir_modifications.rs +++ b/prusti/src/modify_mir/mir_modifications.rs @@ -245,13 +245,14 @@ pub trait MirModifier<'tcx> { &self, pledge: &PledgeToProcess<'tcx>, target: BasicBlock, - ) -> Result { + ) -> Result<(BasicBlock, BasicBlock), ()> { // given a location, insert the call chain to check a pledge: // since we need to know the targets for each call, the blocks need to be created // in reversed order. // annoying, but we have to create a block to start off the dropping chain - // early.. + // early.. Even though at this point we don't know which locals we will + // have to drop let drop_start_term = Terminator { source_info: dummy_source_info(), kind: TerminatorKind::Goto { target }, @@ -297,16 +298,16 @@ pub trait MirModifier<'tcx> { target: next_target, }, }; - let (clone_chain_start, _, locals_to_drop_after) = self.prepend_old_cloning( + let (clone_chain_start, _, locals_to_drop_before_expiry) = self.prepend_old_cloning( terminator, pledge.before_expiry_place, pledge.before_expiry_ty, vec![mir::Operand::Move(pledge.destination)], true, // this clone will be passed to a check function ); - let mut locals_to_drop = pledge.locals_to_drop.clone(); - locals_to_drop.extend(locals_to_drop_after); - let (drop_chain_start, _) = self.create_drop_chain(locals_to_drop, Some(target)); + // so far we can only drop the values created for before_expiry + let (drop_chain_start, _) = + self.create_drop_chain(locals_to_drop_before_expiry, Some(target)); // adjust the check block's terminator self.patcher().patch_terminator( drop_block, @@ -337,7 +338,7 @@ pub trait MirModifier<'tcx> { }, unset_guard_stmt, ); - Ok(start_block) + Ok((start_block, drop_block)) } /// Create a chain of drop calls to drop the provided list of locals. diff --git a/prusti/src/modify_mir/mir_modify.rs b/prusti/src/modify_mir/mir_modify.rs index f42e90d68b1..a73c74ed889 100644 --- a/prusti/src/modify_mir/mir_modify.rs +++ b/prusti/src/modify_mir/mir_modify.rs @@ -1,6 +1,7 @@ use crate::modify_mir::{mir_helper::*, mir_info_collector::MirInfo, passes}; use prusti_interface::utils; use prusti_rustc_interface::{ + hir::def::DefKind, index::IndexVec, middle::{mir, ty::TyCtxt}, span::def_id::DefId, @@ -13,6 +14,10 @@ pub(crate) fn insert_runtime_checks<'tcx>( local_decls: &IndexVec>, ) { let mir_info = MirInfo::collect_mir_info(tcx, body.clone(), def_id, &local_decls); + let attrs = tcx.get_attrs_unchecked(def_id); + let is_spec_fn = utils::has_spec_only_attr(attrs); + let def_kind = tcx.def_kind(def_id); + let is_anon_const = matches!(def_kind, DefKind::AnonConst); // MAKE MODIFICATIONS: // replace old arguments @@ -21,9 +26,13 @@ pub(crate) fn insert_runtime_checks<'tcx>( // should be evaluated in an old state old_arg_replacer.create_variables(body); - // insert pledge checks: - let mut pledge_inserter = passes::PledgeInserter::new(tcx, &mir_info, def_id, &local_decls); - pledge_inserter.run(body); + // we dont insert pledge checks for specification functions + if !is_spec_fn && !is_anon_const { + // insert pledge checks: + let mut pledge_inserter = passes::PledgeInserter::new(tcx, &mir_info, def_id, &local_decls); + pledge_inserter.run(body); + } + // insert a dummy goto block at the beginning of the body prepend_dummy_block(body); // insert preconditions @@ -40,31 +49,12 @@ pub(crate) fn insert_runtime_checks<'tcx>( mir_info.store_specs_env(); } -pub fn insert_asserts_for_reachability<'tcx>( - body: &mut mir::Body<'tcx>, - def_id: DefId, - tcx: TyCtxt<'tcx>, -) { - // this might be over the line, but for now, for every block we insert - // an assert!(false) - let attrs = tcx.get_attrs_unchecked(def_id); - if utils::has_spec_only_attr(attrs) { - return; - } - let local_decls = body.local_decls.clone(); - let mut assertion_inserter = passes::AssertionInserter::new(tcx, def_id, &local_decls); - assertion_inserter.run(body); -} - pub fn dead_code_elimination<'tcx>(tcx: TyCtxt<'tcx>, body: &mut mir::Body<'tcx>, def_id: DefId) { // no modifications to spec functions! let attrs = tcx.get_attrs_unchecked(def_id); if utils::has_spec_only_attr(attrs) { return; } - let local_decls = body.local_decls.clone(); - let mut insert_remove_assertions = passes::AssertionInserter::new(tcx, def_id, &local_decls); - insert_remove_assertions.undo_insertions(body); let mut remove_dead_blocks = passes::DeadCodeElimination::new(tcx, def_id); remove_dead_blocks.run(body); } diff --git a/prusti/src/modify_mir/passes/insert_pledge_checks.rs b/prusti/src/modify_mir/passes/insert_pledge_checks.rs index ce9e5e2500b..ea7a4aa189f 100644 --- a/prusti/src/modify_mir/passes/insert_pledge_checks.rs +++ b/prusti/src/modify_mir/passes/insert_pledge_checks.rs @@ -1,10 +1,13 @@ -use crate::modify_mir::mir_helper::dummy_source_info; +use crate::modify_mir::mir_helper::{ + dummy_source_info, get_block_target, get_successors, replace_target, +}; -use super::super::{ - mir_info_collector::{CheckBlockKind, MirInfo}, - mir_modifications::MirModifier, +use super::super::{mir_info_collector::MirInfo, mir_modifications::MirModifier}; +use prusti_interface::{ + environment::{borrowck::facts::Loan, polonius_info::PoloniusInfo, Procedure}, + globals, + specs::typed::CheckKind, }; -use prusti_interface::specs::typed::CheckKind; use prusti_rustc_interface::{ index::IndexVec, middle::{ @@ -14,16 +17,57 @@ use prusti_rustc_interface::{ span::{def_id::DefId, DUMMY_SP}, }; use rustc_hash::FxHashMap; -use std::cell::{RefCell, RefMut}; +use std::{ + cell::{RefCell, RefMut}, + cmp::Ordering, +}; pub struct PledgeInserter<'tcx, 'a> { tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo, + body_info: &'a MirInfo<'tcx>, patch_opt: Option>>, - pledges_to_process: FxHashMap>, + pledges_to_process: FxHashMap, PledgeToProcess<'tcx>>, body_copy: Option>, def_id: DefId, local_decls: &'a IndexVec>, + /// For simplicity we use the same visitor twice, once to find all the + /// calls with pledges, create locals and extract information, but without + /// shifting any locations in the MIR, on the second one we prepend the + /// old and before_expiry storing, and setting the guard booleans + /// before each call. + first_pass: bool, +} + +#[derive(PartialEq, Eq, PartialOrd, Clone, Copy)] +enum ExpirationLocation { + Location(mir::Location), + Edge(mir::BasicBlock, mir::BasicBlock), +} + +impl ExpirationLocation { + fn block(&self) -> mir::BasicBlock { + match self { + ExpirationLocation::Location(loc) => loc.block, + // for edges we only modify the second block + ExpirationLocation::Edge(_, bb) => *bb, + } + } + fn statement_index(&self) -> usize { + match self { + Self::Location(loc) => loc.statement_index + 1, + Self::Edge(_, _) => 0, + } + } +} +// we need to order them such that inserting checks will not offset other +// modifications +impl Ord for ExpirationLocation { + fn cmp(&self, other: &Self) -> Ordering { + match self.block().cmp(&other.block()) { + Ordering::Equal => self.statement_index().cmp(&other.statement_index()), + other => other, + } + } } #[derive(Debug, Clone)] @@ -31,23 +75,26 @@ pub struct PledgeToProcess<'tcx> { pub check: DefId, pub check_before_expiry: Option, pub old_values_place: mir::Place<'tcx>, + pub old_values_ty: ty::Ty<'tcx>, pub before_expiry_place: mir::Place<'tcx>, pub before_expiry_ty: ty::Ty<'tcx>, pub destination: mir::Place<'tcx>, // the args the function was called with pub args: Vec>, pub substs: ty::subst::SubstsRef<'tcx>, - pub locals_to_drop: Vec, // a local that is set when a function with a pledge is called // and then checked before a runtime check at an expiration location // is performed. pub guard_place: mir::Place<'tcx>, + pub location: mir::Location, + pub drop_blocks: Vec, + pub locals_to_drop: Option>, } impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { pub fn new( tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo, + body_info: &'a MirInfo<'tcx>, def_id: DefId, local_decls: &'a IndexVec>, ) -> Self { @@ -59,16 +106,214 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { body_copy: None, def_id, local_decls, + first_pass: true, } } pub fn run(&mut self, body: &mut mir::Body<'tcx>) { + println!("Inserting pledges into function {:?}", self.def_id); + let procedure = Procedure::new(&self.body_info.env, self.def_id); + let polonius_info = if let Some(info) = globals::get_polonius_info(self.def_id) { + info + } else { + // for trusted methods this might not have been constructed before + if let Ok(info) = + PoloniusInfo::new(&self.body_info.env, &procedure, &FxHashMap::default()) + { + info + } else { + // sometimes it seems to not be available for trusted methods. + // Example: runtime_checks tests, shape.rs + // I guess we don't just want to fail there, instead just don't + // insert pledges. + return; + } + }; self.body_copy = Some(body.clone()); self.patch_opt = Some(MirPatch::new(body).into()); // find all calls to functions with pledges, and create local variables // to store: old_values, before_expiry_place, self.visit_body(body); + // If there are no pledges, we can stop here. + if self.pledges_to_process.len() == 0 { + return; + } // apply the patch generated during visitation + // this should only create new locals! + let patcher_ref = self.patch_opt.take().unwrap(); + patcher_ref.into_inner().apply(body); + + // assumption: only one pledge associated with a loan. + let pledge_loans: FxHashMap> = self + .pledges_to_process + .iter() + .map(|(place, PledgeToProcess { location, .. })| { + ( + polonius_info.get_call_loan_at_location(*location).unwrap(), + *place, + ) + }) + .collect(); + // Now, use polonius to find all expiration locations: + // note: each pledge can potentially expire in multiple locations: + let mut modification_list: Vec<(ExpirationLocation, mir::Place<'tcx>)> = Vec::new(); + for (bb, bb_data) in body.basic_blocks.iter_enumerated() { + let nr_statements = bb_data.statements.len(); + for statement_index in 0..nr_statements + 1 { + let location = mir::Location { + block: bb, + statement_index, + }; + // do we need to worry about zombie loans? Not sure what that is.. + let loans_dying = polonius_info.get_loans_dying_at(location, false); + for loan in loans_dying.iter() { + // check if any of the loans are associated with one of + // our pledges: + if let Some(place) = pledge_loans.get(&loan) { + // a pledge is associated with this loan and dies here!! + modification_list.push((ExpirationLocation::Location(location), *place)); + } + } + if statement_index == nr_statements + && matches!( + body[bb].terminator.as_ref().unwrap().kind, + mir::TerminatorKind::SwitchInt { .. } + ) + { + let successors = get_successors(body, location); + for successor in successors.iter() { + let loans_dying = + polonius_info.get_loans_dying_between(location, *successor, false); + for loan in loans_dying { + if let Some(place) = pledge_loans.get(&loan) { + modification_list + .push((ExpirationLocation::Edge(bb, successor.block), *place)); + } + } + } + } + } + } + // sort the modification list according to location, so they + // don't offset each other: + modification_list.sort_by_key(|el| el.0); + modification_list.reverse(); + // insert the checks: + // store the places where we still need to insert drops + // once we know which locals need to be dropped + for (modification_location, place) in modification_list.iter() { + // remove pledge temporarily so we can modify it + let mut pledge = self.pledges_to_process.remove(&place).unwrap(); + let (location, is_edge) = match modification_location { + ExpirationLocation::Location(loc) => (*loc, false), + ExpirationLocation::Edge(_, bb2) => { + // in this case we need to insert before the location + ( + mir::Location { + block: *bb2, + statement_index: 0, + }, + true, + ) + } + }; + let either = body.stmt_at(location); + if either.is_left() || is_edge { + println!( + "Inserting a pledge check at arbitrary position. Pledge: {:?}, location: {:?}", + pledge, location + ); + // it's just a statement: split the block + // these modifications are not possible with MirPatch! + let bb_data = &mut body.basic_blocks_mut()[location.block]; + let nr_stmts = bb_data.statements.len(); + let start_index = if !is_edge { + location.statement_index + 1 + } else { + 0 + }; + // in the case of edges this will drain all statements + let after = bb_data.statements.drain(start_index..nr_stmts); + // create a new block: + let term = bb_data.terminator.clone(); + let mut new_bb_data = mir::BasicBlockData::new(term); + new_bb_data.statements = after.collect(); + self.patch_opt = Some(MirPatch::new(body).into()); + let new_block = self.patcher().new_block(new_bb_data); + + // create the checks: + let (start_block, drop_insertion_block) = + self.create_pledge_call_chain(&pledge, new_block).unwrap(); + pledge.drop_blocks.push(drop_insertion_block); + + let new_terminator = mir::TerminatorKind::Goto { + target: start_block, + }; + // skip this check block and instead call checks-chain + self.patcher() + .patch_terminator(location.block, new_terminator); + let patcher_ref = self.patch_opt.take().unwrap(); + patcher_ref.into_inner().apply(body); + } else { + let term = either.right().unwrap(); + self.patch_opt = Some(MirPatch::new(body).into()); + println!("inserting pledge expiration for terminator: {:?}", term); + match term.kind { + mir::TerminatorKind::Call { + target: Some(target), + .. + } => { + // create the call chain with the calls target: + let (start_block, drop_insertion_block) = + self.create_pledge_call_chain(&pledge, target).unwrap(); + // we need to store the block where we can later insert + // the drops for values we cloned for old + pledge.drop_blocks.push(drop_insertion_block); + + let mut new_call_term = term.clone(); + replace_target(&mut new_call_term, start_block); + self.patcher() + .patch_terminator(location.block, new_call_term.kind); + } + _ => { + println!("Encountered a pledge expiring at terminator: {:#?}, expiring at location: {:?}", term, location); + todo!() + } + } + let patcher_ref = self.patch_opt.take().unwrap(); + patcher_ref.into_inner().apply(body); + } + // insert pledge again. + self.pledges_to_process.insert(*place, pledge); + } + + // run the visitor again, now for phase 2: inserting the cloning + self.patch_opt = Some(MirPatch::new(body).into()); + self.first_pass = false; + self.visit_body(body); + let patcher_ref = self.patch_opt.take().unwrap(); + patcher_ref.into_inner().apply(body); + // finally, drop the old values at each expiration check: + self.patch_opt = Some(MirPatch::new(body).into()); + for pledge in self.pledges_to_process.values() { + for drop_block in pledge.drop_blocks.iter() { + // get the target of the current drop block (always a goto, + // exactly because we need to be able to append to it) + if let Some(target) = get_block_target(body, *drop_block) { + let (chain_start, _) = self.create_drop_chain( + pledge.locals_to_drop.as_ref().unwrap().clone(), + Some(target), + ); + let new_terminator = mir::TerminatorKind::Goto { + target: chain_start, + }; + self.patcher().patch_terminator(*drop_block, new_terminator); + } else { + unreachable!(); + } + } + } + // apply patcher for a final time let patcher_ref = self.patch_opt.take().unwrap(); patcher_ref.into_inner().apply(body); } @@ -103,23 +348,22 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { terminator: &mut mir::Terminator<'tcx>, location: mir::Location, ) { - match &terminator.kind { - mir::TerminatorKind::Call { - func, - destination, - args, - .. - } => { - // is a visit of the underlying things even necesary? - if let Some((call_id, substs)) = func.const_fn_def() { - // a.t.m there can only be one pledge, we ignore that - let mut caller_block = location.block; - for check_kind in self.body_info.specs.get_runtime_checks(&call_id) { - if let CheckKind::Pledge { - check, - check_before_expiry, - } = check_kind - { + if let mir::TerminatorKind::Call { + func, + destination, + args, + .. + } = &terminator.kind + { + // is a visit of the underlying things even necesary? + if let Some((call_id, substs)) = func.const_fn_def() { + for check_kind in self.body_info.specs.get_runtime_checks(&call_id) { + if let CheckKind::Pledge { + check, + check_before_expiry, + } = check_kind + { + if self.first_pass { // TODO: pack that into a function, use correct param_env let check_sig = self.tcx.fn_sig(check).subst(self.tcx, substs); let check_sig = self.tcx.normalize_erasing_late_bound_regions( @@ -127,101 +371,111 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { check_sig, ); let inputs = check_sig.inputs(); + // look at the check function signature to determine + // which values need cloning. let old_values_ty = inputs[inputs.len() - 2]; let before_expiry_ty = inputs[inputs.len() - 1]; + // create temporary locals for them let old_values_place = mir::Place::from(self.patcher().new_temp(old_values_ty, DUMMY_SP)); let before_expiry_place = mir::Place::from( self.patcher().new_temp(before_expiry_ty, DUMMY_SP), ); + // create a guard local let bool_ty = self.tcx.mk_ty_from_kind(ty::TyKind::Bool); let local_guard = self.patcher().new_temp(bool_ty, DUMMY_SP).into(); - + let pledge_to_process = PledgeToProcess { + check, + check_before_expiry, + old_values_place, + old_values_ty, + before_expiry_place, + before_expiry_ty, + destination: *destination, + args: args.clone(), + substs, + guard_place: local_guard, + location, + drop_blocks: Vec::new(), + locals_to_drop: None, + }; + // TODO: create a test where the result is assigned + // to the field of a tuple + // Make sure this location is actually unique: + assert!(self.pledges_to_process.get(destination).is_none()); + self.pledges_to_process + .insert(*destination, pledge_to_process); + } else { + println!("found pledge call, now prepending cloning"); + let mut pledge = self.pledges_to_process.remove(destination).unwrap(); // create the clones of old that will be passed to // the check function. Make the chain end with the // original function call - let (chain_start, new_caller, locals_to_drop) = self + let (chain_start, _new_caller, locals_to_drop) = self .prepend_old_cloning( terminator.clone(), - old_values_place, - old_values_ty, + pledge.old_values_place, + pledge.old_values_ty, args.clone(), true, ); + // those have yet to be dropped + pledge.locals_to_drop = Some(locals_to_drop); let set_guard_block = - self.set_guard_true_block(local_guard, chain_start); + self.set_guard_true_block(pledge.guard_place, chain_start); // of our function self.patcher().patch_terminator( - caller_block, + location.block, mir::TerminatorKind::Goto { target: set_guard_block, }, ); - // update the call_location (just in case there are - // ever multiple pleges in the future) - caller_block = new_caller; - let pledge_to_process = PledgeToProcess { - check, - check_before_expiry, - old_values_place, - before_expiry_place, - before_expiry_ty, - destination: *destination, - args: args.clone(), - substs, - locals_to_drop, - guard_place: local_guard, - }; - // TODO: create a test where the result is assigned - // to the field of a tuple - self.pledges_to_process - .insert(destination.local, pledge_to_process); - } - } - } - } - mir::TerminatorKind::SwitchInt { targets, .. } => { - // find switchInts with a check_only target. - let switch_iter = targets.iter(); - if switch_iter.len() == 1 { - // let (value, target) = switch_iter.next().unwrap(); - let otherwise = targets.otherwise(); - // check if target is a check_block: - if let Some(kind) = self.body_info.check_blocks.get(&otherwise) { - match kind { - CheckBlockKind::PledgeExpires(local) => { - // this check_block should terminate with a goto always! - if let mir::TerminatorKind::Goto { ref target } = - self.body_copy.as_ref().unwrap()[otherwise] - .terminator - .clone() - .unwrap() - .kind - { - let pledge = self.pledges_to_process.get(local).expect( - "pledge expiration without an actual pledge,\ - seems like our assumption that calls of pledges are\ - always encountered before the expiration is wrong", - ); - let start_block = - self.create_pledge_call_chain(pledge, *target).unwrap(); - - let new_terminator = mir::TerminatorKind::Goto { - target: start_block, - }; - // skip this check block and instead call checks-chain - self.patcher().patch_terminator(otherwise, new_terminator); - } - } - // nothing to do.. - CheckBlockKind::RuntimeAssertion => (), + self.pledges_to_process.insert(*destination, pledge); } } } } - _ => {} } + // mir::TerminatorKind::SwitchInt { targets, .. } => { + // // find switchInts with a check_only target. + // let switch_iter = targets.iter(); + // if switch_iter.len() == 1 { + // // let (value, target) = switch_iter.next().unwrap(); + // let otherwise = targets.otherwise(); + // // check if target is a check_block: + // if let Some(kind) = self.body_info.check_blocks.get(&otherwise) { + // match kind { + // CheckBlockKind::PledgeExpires(local) => { + // // this check_block should terminate with a goto always! + // if let mir::TerminatorKind::Goto { ref target } = + // self.body_copy.as_ref().unwrap()[otherwise] + // .terminator + // .clone() + // .unwrap() + // .kind + // { + // let pledge = self.pledges_to_process.get(local).expect( + // "pledge expiration without an actual pledge,\ + // seems like our assumption that calls of pledges are\ + // always encountered before the expiration is wrong", + // ); + // let start_block = + // self.create_pledge_call_chain(pledge, *target).unwrap(); + // + // let new_terminator = mir::TerminatorKind::Goto { + // target: start_block, + // }; + // // skip this check block and instead call checks-chain + // self.patcher().patch_terminator(otherwise, new_terminator); + // } + // } + // // nothing to do.. + // CheckBlockKind::RuntimeAssertion => (), + // } + // } + // } + // } } } diff --git a/prusti/src/modify_mir/passes/insert_postconditions.rs b/prusti/src/modify_mir/passes/insert_postconditions.rs index d8478777c23..574437ed84d 100644 --- a/prusti/src/modify_mir/passes/insert_postconditions.rs +++ b/prusti/src/modify_mir/passes/insert_postconditions.rs @@ -11,7 +11,7 @@ use std::cell::{RefCell, RefMut}; pub struct PostconditionInserter<'tcx, 'a> { tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo, + body_info: &'a MirInfo<'tcx>, patch_opt: Option>>, def_id: DefId, local_decls: &'a IndexVec>, @@ -20,7 +20,7 @@ pub struct PostconditionInserter<'tcx, 'a> { impl<'tcx, 'a> PostconditionInserter<'tcx, 'a> { pub fn new( tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo, + body_info: &'a MirInfo<'tcx>, def_id: DefId, local_decls: &'a IndexVec>, ) -> Self { diff --git a/prusti/src/modify_mir/passes/insert_precondition_checks.rs b/prusti/src/modify_mir/passes/insert_precondition_checks.rs index b89e566353c..c135a630a9e 100644 --- a/prusti/src/modify_mir/passes/insert_precondition_checks.rs +++ b/prusti/src/modify_mir/passes/insert_precondition_checks.rs @@ -14,7 +14,7 @@ use std::cell::{RefCell, RefMut}; /// (in case they have them) pub struct PreconditionInserter<'tcx, 'a> { tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo, + body_info: &'a MirInfo<'tcx>, /// making modifications from a Visitor often requires access /// to a patcher! But from the visiting methods we don't have /// direct access to a mutable body @@ -26,7 +26,7 @@ pub struct PreconditionInserter<'tcx, 'a> { impl<'tcx, 'a> PreconditionInserter<'tcx, 'a> { pub fn new( tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo, + body_info: &'a MirInfo<'tcx>, def_id: DefId, local_decls: &'a IndexVec>, ) -> Self { diff --git a/prusti/src/modify_mir/passes/insert_remove_assertions.rs b/prusti/src/modify_mir/passes/insert_remove_assertions.rs deleted file mode 100644 index bbcba6ba37e..00000000000 --- a/prusti/src/modify_mir/passes/insert_remove_assertions.rs +++ /dev/null @@ -1,188 +0,0 @@ -// Insert assert!(false) for reachability analysis: - -use super::super::{mir_helper::*, mir_modifications::MirModifier}; -use lazy_static::lazy_static; -use prusti_interface::environment::inserted_locations_store; -use prusti_rustc_interface::{ - index::IndexVec, - middle::{ - mir::{self, patch::MirPatch, visit::Visitor}, - ty::{self, TyCtxt}, - }, - span::{def_id::DefId, DUMMY_SP}, -}; -use rustc_hash::{FxHashMap, FxHashSet}; -use std::{ - cell::{RefCell, RefMut}, - sync::Mutex, -}; - -lazy_static! { - static ref MOVED_START_BLOCK: Mutex> = Default::default(); -} - -/// This pass inserts precondition checks at the beginning of the -/// body, and also in front of each function that is called -/// (in case they have them) -pub struct AssertionInserter<'tcx, 'a> { - tcx: TyCtxt<'tcx>, - /// making modifications from a Visitor often requires access - /// to a patcher! But from the visiting methods we don't have - /// direct access to a mutable body - patch_opt: Option>>, - def_id: DefId, - local_decls: &'a IndexVec>, - random_bool_locals: FxHashMap, - added_assertion_blocks: FxHashSet<(mir::Local, mir::BasicBlock, mir::BasicBlock)>, -} - -impl<'tcx, 'a> AssertionInserter<'tcx, 'a> { - pub fn new( - tcx: TyCtxt<'tcx>, - def_id: DefId, - local_decls: &'a IndexVec>, - ) -> Self { - Self { - tcx, - patch_opt: None, - def_id, - local_decls, - random_bool_locals: Default::default(), - added_assertion_blocks: Default::default(), - } - } - pub fn run(&mut self, body: &mut mir::Body<'tcx>) { - let new_start_block = prepend_dummy_block(body); - MOVED_START_BLOCK - .lock() - .unwrap() - .insert(self.def_id, new_start_block); - self.patch_opt = Some(MirPatch::new(body).into()); - // create a boolean with value false at the very beginning of the body - let random_bool_defid = find_random_bool_defid(self.tcx).unwrap(); - let bool_ty = self.tcx.mk_ty_from_kind(ty::TyKind::Bool); - - let mut current_target = new_start_block; - for (bb, bb_data) in body.basic_blocks.iter_enumerated() { - if bb == mir::START_BLOCK || bb_data.is_cleanup { - // skip the dummy block we inserted and cleanup blocks - continue; - } - let bool_temp = self.patcher().new_temp(bool_ty, DUMMY_SP); - let assert_message = mir::AssertKind::OverflowNeg(mir::Operand::Copy(bool_temp.into())); - (current_target, _) = self - .create_call_block( - random_bool_defid, - vec![], - &ty::List::empty(), - Some(bool_temp.into()), - Some(current_target), - ) - .unwrap(); - // move the terminator to a new block - let new_block_data = mir::BasicBlockData::new(bb_data.terminator.clone()); - let new_block = self.patcher().new_block(new_block_data); - let assert_term = mir::TerminatorKind::Assert { - cond: mir::Operand::Copy(bool_temp.into()), - expected: true, - msg: Box::new(assert_message), - target: new_block, - unwind: mir::UnwindAction::Continue, - }; - let terminator_location = mir::Location { - block: bb, - statement_index: bb_data.statements.len(), - }; - inserted_locations_store::add_location(self.def_id, terminator_location); - - self.patcher().patch_terminator(bb, assert_term); - } - // finally point the first block to our random_bool_chain: - self.patcher().patch_terminator( - mir::START_BLOCK, - mir::TerminatorKind::Goto { - target: current_target, - }, - ); - let patch_ref = self.patch_opt.take().unwrap(); - patch_ref.into_inner().apply(body); - } - - pub fn undo_insertions(&mut self, body: &mut mir::Body<'tcx>) { - let moved_start_block = *MOVED_START_BLOCK.lock().unwrap().get(&self.def_id).unwrap(); - self.visit_body(body); - // only remove the blocks with assertions who's operands are - // generated by a random_bool call, because those are definitely - // not user generated - for (local, bb, target) in self.added_assertion_blocks.iter() { - if self.random_bool_locals.get(local).is_none() { - // skip it if the local was not generated by random_bool call - continue; - } - let terminator = body.basic_blocks[*target].terminator.clone(); - body.basic_blocks_mut()[*bb].terminator = terminator; - } - // we don't actually remove the inserted blocks, but just make them - // unreachable. - // Make first block point to moved start block - if let Some(mir::Terminator { - kind: mir::TerminatorKind::Goto { target, .. }, - .. - }) = &mut body.basic_blocks_mut()[mir::START_BLOCK].terminator - { - *target = moved_start_block; - } - } -} - -impl<'tcx, 'a> Visitor<'tcx> for AssertionInserter<'tcx, 'a> { - fn visit_terminator(&mut self, terminator: &mir::Terminator<'tcx>, location: mir::Location) { - match &terminator.kind { - mir::TerminatorKind::Call { - func, destination, .. - } => { - if let Some((call_id, _)) = func.const_fn_def() { - let item_name = self.tcx.def_path_str(call_id); - if &item_name[..] == "prusti_contracts::random_bool" { - self.random_bool_locals - .insert(destination.local, location.block); - } - } - } - // this sort of assertion with a boolean condition can not - // be crated by a User (would make zero sense at least) - // so we should not eliminate blocks generated by original code - mir::TerminatorKind::Assert { - cond: mir::Operand::Copy(place), - msg: box mir::AssertKind::OverflowNeg(_), - target, - .. - } => { - self.added_assertion_blocks - .insert((place.local, location.block, *target)); - } - _ => {} - } - self.super_terminator(terminator, location); - } -} - -impl<'tcx, 'a> MirModifier<'tcx> for AssertionInserter<'tcx, 'a> { - fn tcx(&self) -> TyCtxt<'tcx> { - self.tcx - } - fn patcher(&self) -> RefMut> { - self.patch_opt - .as_ref() - .expect("Bug: MirPatch for inserting assertions was not initialized") - .borrow_mut() - } - - fn def_id(&self) -> DefId { - self.def_id - } - - fn local_decls(&self) -> &'a IndexVec> { - self.local_decls - } -} diff --git a/prusti/src/modify_mir/passes/mod.rs b/prusti/src/modify_mir/passes/mod.rs index d4460524b47..6fa85aee259 100644 --- a/prusti/src/modify_mir/passes/mod.rs +++ b/prusti/src/modify_mir/passes/mod.rs @@ -1,13 +1,11 @@ mod insert_precondition_checks; mod insert_pledge_checks; mod insert_postconditions; -mod insert_remove_assertions; mod replace_old_args; mod remove_dead_code; pub use insert_pledge_checks::{PledgeInserter, PledgeToProcess}; pub use insert_postconditions::PostconditionInserter; pub use insert_precondition_checks::PreconditionInserter; -pub use insert_remove_assertions::AssertionInserter; pub use remove_dead_code::DeadCodeElimination; pub use replace_old_args::CloneOldArgs; diff --git a/prusti/src/modify_mir/passes/remove_dead_code.rs b/prusti/src/modify_mir/passes/remove_dead_code.rs index f4056488405..40b885ab9cc 100644 --- a/prusti/src/modify_mir/passes/remove_dead_code.rs +++ b/prusti/src/modify_mir/passes/remove_dead_code.rs @@ -17,11 +17,16 @@ impl<'tcx, 'a> DeadCodeElimination<'tcx> { pub fn new(tcx: TyCtxt<'tcx>, def_id: DefId) -> Self { // collect all the blocks that were inserted but didnt generate // a verification error: - let reachability_map = inserted_locations_store::get_function_map(def_id).unwrap(); + let reachability_map = + inserted_locations_store::get_reachability_map(def_id).unwrap_or_default(); let unreachable_blocks: FxHashSet = reachability_map .iter() - .filter_map(|(loc, reachable)| (!reachable).then_some(loc.block)) + .filter_map(|(bb, reachable)| (!reachable).then_some(*bb)) .collect(); + println!( + "unreachable blocks for method: {:?}, {:#?}", + def_id, unreachable_blocks + ); Self { tcx, unreachable_blocks, @@ -29,6 +34,9 @@ impl<'tcx, 'a> DeadCodeElimination<'tcx> { } pub fn run(&mut self, body: &mut mir::Body<'tcx>) { + if self.unreachable_blocks.is_empty() { + return; + } self.visit_body(body); } } @@ -65,6 +73,9 @@ impl<'tcx, 'a> MutVisitor<'tcx> for DeadCodeElimination<'tcx> { } else { let switch_targets = mir::terminator::SwitchTargets::new(targets_vec.into_iter(), otherwise); + if switch_targets.all_targets().len() != targets.all_targets().len() { + println!("SwitchInt in block {:?} was changed", location.block); + } Some(mir::TerminatorKind::SwitchInt { discr: discr.clone(), targets: switch_targets, @@ -73,8 +84,8 @@ impl<'tcx, 'a> MutVisitor<'tcx> for DeadCodeElimination<'tcx> { } else { // if none of the targets is reachable, then this block // must be unreachable itself!! - assert!(self.unreachable_blocks.contains(&location.block)); - None + // make it actually unreachable? + Some(mir::TerminatorKind::Unreachable) } } // potentially perform some checks on sanity of our results. diff --git a/prusti/src/modify_mir/passes/replace_old_args.rs b/prusti/src/modify_mir/passes/replace_old_args.rs index c98fb404c21..3cc67ffc9b6 100644 --- a/prusti/src/modify_mir/passes/replace_old_args.rs +++ b/prusti/src/modify_mir/passes/replace_old_args.rs @@ -13,7 +13,7 @@ use std::cell::{RefCell, RefMut}; pub struct CloneOldArgs<'tcx, 'a> { tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo, + body_info: &'a MirInfo<'tcx>, patch_opt: Option>>, def_id: DefId, local_decls: &'a IndexVec>, @@ -23,7 +23,7 @@ pub struct CloneOldArgs<'tcx, 'a> { impl<'tcx, 'a> CloneOldArgs<'tcx, 'a> { pub fn new( tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo, + body_info: &'a MirInfo<'tcx>, def_id: DefId, local_decls: &'a IndexVec>, ) -> Self { diff --git a/prusti/src/verifier.rs b/prusti/src/verifier.rs index d7cdf8fcb4c..c51d30f1fc3 100644 --- a/prusti/src/verifier.rs +++ b/prusti/src/verifier.rs @@ -10,9 +10,10 @@ use prusti_interface::{ use prusti_viper::verifier::Verifier; #[tracing::instrument(name = "prusti::verify", level = "debug", skip(env))] -pub fn verify(env: Environment<'_>, def_spec: typed::DefSpecificationMap) { +pub fn verify(env: Environment<'_>, def_spec: typed::DefSpecificationMap) -> Environment<'_> { if env.diagnostic.has_errors() { warn!("The compiler reported an error, so the program will not be verified."); + env } else { debug!("Prepare verification task..."); // TODO: can we replace `get_annotated_procedures` with information @@ -82,5 +83,6 @@ pub fn verify(env: Environment<'_>, def_spec: typed::DefSpecificationMap) { ); } }; + env } } diff --git a/rust-toolchain b/rust-toolchain index 4d24b8445a3..f4a399d2e54 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1,4 +1 @@ -[toolchain] -channel = "nightly-2023-06-15" -components = [ "rustc-dev", "llvm-tools-preview", "rust-std", "rustfmt", "clippy" ] -profile = "minimal" +custom-rust From f3ec99be05f55ea89c928251d72a2bb65e5ee9c5 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Fri, 18 Aug 2023 00:38:34 +0200 Subject: [PATCH 26/45] Fix pledge checks in case of zombie loans --- .../src/runtime_checks/translation.rs | 18 ++++++++++----- prusti/src/modify_mir/mir_modifications.rs | 6 ++--- .../modify_mir/passes/insert_pledge_checks.rs | 22 ++++++++++++++++++- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 59a247f8a5b..d5bdbd987ba 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -19,6 +19,8 @@ pub struct CheckTranslator { lhs_expression: Option, visitor: CheckVisitor, spec_type: SpecItemType, + expr_span: Span, + lhs_expr_span: Option, } /// this struct contains all possible items needed to check certain @@ -98,6 +100,8 @@ impl CheckTranslator { spec_type: SpecItemType, ) -> Self { // figure out keywords + let expr_span = tokens.span(); + let lhs_expr_span = lhs_tokens_opt.as_ref().map(|tokens| tokens.span()); let mut expression: syn::Expr = syn::parse2::(tokens).unwrap(); let check_type = CheckType::from_spectype(&spec_type); let mut visitor = CheckVisitor::new(item, check_type); @@ -115,6 +119,8 @@ impl CheckTranslator { lhs_expression, visitor, spec_type, + expr_span, + lhs_expr_span, } } @@ -149,17 +155,17 @@ impl CheckTranslator { self.spec_type, SpecItemType::Postcondition | SpecItemType::Pledge ); - let expr_to_check: syn::Expr = if is_before_expiry_check { + let (expr_to_check, expr_span): (syn::Expr, Span) = if is_before_expiry_check { // if lhs is true, there has to be a lhs expression if let Some(expr) = self.lhs_expression.as_ref() { - expr.clone() + (expr.clone(), self.lhs_expr_span.unwrap()) } else { - parse_quote_spanned! {item.span() => + (parse_quote_spanned! {item.span() => true - } + }, item.span()) } } else { - self.expression.clone() + (self.expression.clone(), self.expr_span) }; let item_name_str = item_name.to_string(); @@ -170,7 +176,7 @@ impl CheckTranslator { }; let forget_statements = self.generate_forget_statements(item, include_item_args, executed_after); - let contract_string = expr_to_check.to_token_stream().to_string(); + let contract_string = expr_span.source_text().unwrap_or("unresolved contract".to_string()); let failure_message = format!("Contract {} was violated at runtime", contract_string); let id_attr: syn::Attribute = if is_before_expiry_check { parse_quote_spanned! {item.span() => diff --git a/prusti/src/modify_mir/mir_modifications.rs b/prusti/src/modify_mir/mir_modifications.rs index d3f311aecdb..99f41533d28 100644 --- a/prusti/src/modify_mir/mir_modifications.rs +++ b/prusti/src/modify_mir/mir_modifications.rs @@ -262,7 +262,7 @@ pub trait MirModifier<'tcx> { // Create call to check function: let mut check_args = pledge.args.clone(); - check_args.push(mir::Operand::Move(pledge.destination)); //result arg + check_args.push(mir::Operand::Move(pledge.result_copy_place)); //result arg check_args.push(mir::Operand::Move(pledge.old_values_place)); check_args.push(mir::Operand::Move(pledge.before_expiry_place)); let (check_after_block, _) = self.create_call_block( @@ -276,7 +276,7 @@ pub trait MirModifier<'tcx> { // If there is a check_before_expiry block, creat it let next_target = if let Some(check_before_expiry) = pledge.check_before_expiry { let before_check_args = vec![ - mir::Operand::Move(pledge.destination), + mir::Operand::Move(pledge.result_copy_place), mir::Operand::Move(pledge.old_values_place), ]; let (new_block, _) = self.create_call_block( @@ -302,7 +302,7 @@ pub trait MirModifier<'tcx> { terminator, pledge.before_expiry_place, pledge.before_expiry_ty, - vec![mir::Operand::Move(pledge.destination)], + vec![mir::Operand::Move(pledge.result_copy_place)], true, // this clone will be passed to a check function ); // so far we can only drop the values created for before_expiry diff --git a/prusti/src/modify_mir/passes/insert_pledge_checks.rs b/prusti/src/modify_mir/passes/insert_pledge_checks.rs index ea7a4aa189f..8e9b800244a 100644 --- a/prusti/src/modify_mir/passes/insert_pledge_checks.rs +++ b/prusti/src/modify_mir/passes/insert_pledge_checks.rs @@ -72,8 +72,10 @@ impl Ord for ExpirationLocation { #[derive(Debug, Clone)] pub struct PledgeToProcess<'tcx> { + pub name: String, pub check: DefId, pub check_before_expiry: Option, + pub result_copy_place: mir::Place<'tcx>, pub old_values_place: mir::Place<'tcx>, pub old_values_ty: ty::Ty<'tcx>, pub before_expiry_place: mir::Place<'tcx>, @@ -164,7 +166,6 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { block: bb, statement_index, }; - // do we need to worry about zombie loans? Not sure what that is.. let loans_dying = polonius_info.get_loans_dying_at(location, false); for loan in loans_dying.iter() { // check if any of the loans are associated with one of @@ -172,6 +173,8 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { if let Some(place) = pledge_loans.get(&loan) { // a pledge is associated with this loan and dies here!! modification_list.push((ExpirationLocation::Location(location), *place)); + let pledge = self.pledges_to_process.get(place).unwrap(); + println!("Pledge for function {} is associated with loan {:?} and dies at {:?}", pledge.name, loan, location); } } if statement_index == nr_statements @@ -352,6 +355,7 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { func, destination, args, + target, .. } = &terminator.kind { @@ -365,6 +369,7 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { { if self.first_pass { // TODO: pack that into a function, use correct param_env + let name = self.tcx.def_path_debug_str(call_id); let check_sig = self.tcx.fn_sig(check).subst(self.tcx, substs); let check_sig = self.tcx.normalize_erasing_late_bound_regions( ty::ParamEnv::reveal_all(), @@ -382,12 +387,19 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { self.patcher().new_temp(before_expiry_ty, DUMMY_SP), ); + // create a copy of the result in case it becomes a zombie later + let result_ty = destination.ty(self.local_decls(), self.tcx).ty; + let result_copy_place = mir::Place::from(self.patcher().new_temp(result_ty, DUMMY_SP)); + println!("Pledge result type: {:?}", result_ty); + // create a guard local let bool_ty = self.tcx.mk_ty_from_kind(ty::TyKind::Bool); let local_guard = self.patcher().new_temp(bool_ty, DUMMY_SP).into(); let pledge_to_process = PledgeToProcess { + name, check, check_before_expiry, + result_copy_place, old_values_place, old_values_ty, before_expiry_place, @@ -431,6 +443,14 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { target: set_guard_block, }, ); + // Copy the result after the function has been called: + // If it has a target, otherwise it doesn't matter at all.. + if let Some(target) = target { + let location = mir::Location{ block: *target, statement_index: 0}; + let result_operand = mir::Operand::Copy(pledge.destination); + let stmt = mir::StatementKind::Assign(Box::new((pledge.result_copy_place, mir::Rvalue::Use(result_operand)))); + self.patcher().add_statement(location, stmt); + } self.pledges_to_process.insert(*destination, pledge); } } From 98c03171c399133bec8508ca18600b6d213682f4 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Sun, 20 Aug 2023 16:17:40 +0200 Subject: [PATCH 27/45] Remove unneeded assertions and checked operations --- .../src/runtime_checks/translation.rs | 13 +- .../environment/inserted_locations_store.rs | 33 ---- prusti-interface/src/environment/mod.rs | 1 - prusti-interface/src/globals.rs | 61 +++++++- .../src/encoder/errors/error_manager.rs | 48 ++++-- .../src/encoder/mir/places/interface.rs | 2 +- .../src/encoder/mir/procedures/encoder/mod.rs | 20 ++- .../mir/pure/interpreter/interpreter_high.rs | 2 +- .../mir/pure/interpreter/interpreter_poly.rs | 2 +- prusti-viper/src/encoder/mir_encoder/mod.rs | 3 +- prusti-viper/src/encoder/procedure_encoder.rs | 17 ++- .../modify_mir/passes/insert_pledge_checks.rs | 18 ++- .../src/modify_mir/passes/remove_dead_code.rs | 142 ++++++++++++++++-- prusti/src/verifier.rs | 1 - 14 files changed, 281 insertions(+), 82 deletions(-) delete mode 100644 prusti-interface/src/environment/inserted_locations_store.rs diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index d5bdbd987ba..6125468c437 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -160,9 +160,12 @@ impl CheckTranslator { if let Some(expr) = self.lhs_expression.as_ref() { (expr.clone(), self.lhs_expr_span.unwrap()) } else { - (parse_quote_spanned! {item.span() => - true - }, item.span()) + ( + parse_quote_spanned! {item.span() => + true + }, + item.span(), + ) } } else { (self.expression.clone(), self.expr_span) @@ -176,7 +179,9 @@ impl CheckTranslator { }; let forget_statements = self.generate_forget_statements(item, include_item_args, executed_after); - let contract_string = expr_span.source_text().unwrap_or("unresolved contract".to_string()); + let contract_string = expr_span + .source_text() + .unwrap_or("unresolved contract".to_string()); let failure_message = format!("Contract {} was violated at runtime", contract_string); let id_attr: syn::Attribute = if is_before_expiry_check { parse_quote_spanned! {item.span() => diff --git a/prusti-interface/src/environment/inserted_locations_store.rs b/prusti-interface/src/environment/inserted_locations_store.rs deleted file mode 100644 index d41519f4a96..00000000000 --- a/prusti-interface/src/environment/inserted_locations_store.rs +++ /dev/null @@ -1,33 +0,0 @@ -use lazy_static::lazy_static; -use prusti_rustc_interface::{middle::mir, span::def_id::DefId}; -use rustc_hash::FxHashMap; -use std::sync::Mutex; - -// Store a set of blocks which we check for reachability. Each of them is -// set to false if an error is generated for them, which means they are unreachable -lazy_static! { - pub static ref REACHABILITY_CHECKS: Mutex>> = - Default::default(); -} - -// add the location when inserting refute(false) into encoding. -// Assume it's reachable, if we catch an error for it later we know it's not! -pub fn add_reachability_check(def_id: DefId, bb: mir::BasicBlock) { - let mut map = REACHABILITY_CHECKS.lock().unwrap(); - let entry = map.entry(def_id); - entry.or_default().insert(bb, true); -} - -pub fn set_block_unreachable(def_id: DefId, bb: mir::BasicBlock) { - println!("Marking block {:?} as unreachable", bb); - let mut map = REACHABILITY_CHECKS.lock().unwrap(); - let fn_map = map.get_mut(&def_id).unwrap(); - // make sure this location is actually in here - assert!(fn_map.get(&bb).is_some()); - fn_map.insert(bb, false); -} - -pub fn get_reachability_map(def_id: DefId) -> Option> { - let map = REACHABILITY_CHECKS.lock().unwrap(); - map.get(&def_id).cloned() -} diff --git a/prusti-interface/src/environment/mod.rs b/prusti-interface/src/environment/mod.rs index 493c7beb747..b4aa4b63bc0 100644 --- a/prusti-interface/src/environment/mod.rs +++ b/prusti-interface/src/environment/mod.rs @@ -27,7 +27,6 @@ mod name; pub mod polonius_info; mod procedure; mod query; -pub mod inserted_locations_store; pub use self::{ body::EnvBody, diff --git a/prusti-interface/src/globals.rs b/prusti-interface/src/globals.rs index 26388c7d24b..e162960ba42 100644 --- a/prusti-interface/src/globals.rs +++ b/prusti-interface/src/globals.rs @@ -1,4 +1,4 @@ -use prusti_rustc_interface::span::def_id::DefId; +use prusti_rustc_interface::{middle::mir, span::def_id::DefId}; use rustc_hash::FxHashMap; use std::cell::RefCell; @@ -13,6 +13,65 @@ thread_local! { pub static ENV: RefCell>> = RefCell::new(None); pub static VERIFIED: RefCell = RefCell::new(false); pub static POLONIUS: RefCell>> = RefCell::default(); + pub static REACHABILITY_CHECKS: RefCell>> = + Default::default(); + // for each encoded assertion, after verification stores true if this assertion + // will never panic, or false if it possibly panics (after verification) + pub static VERIFIED_ASSERTIONS: RefCell>> = Default::default(); +} + +pub fn add_encoded_assertion(def_id: DefId, bb: mir::BasicBlock) { + VERIFIED_ASSERTIONS.with(|cell| { + let mut map = cell.borrow_mut(); + let entry = map.entry(def_id); + // insert true first, if it generates an error set if to false + // (if it doesnt generate an error it's either unreachable, or + // actually verifiably true and can be removed later) + entry.or_default().insert(bb, true); + }) +} + +pub fn set_assertion_violated(def_id: DefId, bb: mir::BasicBlock) { + VERIFIED_ASSERTIONS.with(|cell| { + let mut map = cell.borrow_mut(); + let fn_map = map.get_mut(&def_id).unwrap(); + assert!(fn_map.get(&bb).is_some()); + fn_map.insert(bb, false); + }) +} + +pub fn get_assertion_map(def_id: DefId) -> Option> { + VERIFIED_ASSERTIONS.with(|cell| { + let map = cell.borrow(); + map.get(&def_id).cloned() + }) +} + +// add the location when inserting refute(false) into encoding. +// Assume it's reachable, if we catch an error for it later we know it's not! +pub fn add_reachability_check(def_id: DefId, bb: mir::BasicBlock) { + REACHABILITY_CHECKS.with(|cell| { + let mut map = cell.borrow_mut(); + let entry = map.entry(def_id); + entry.or_default().insert(bb, true); + }) +} + +pub fn set_block_unreachable(def_id: DefId, bb: mir::BasicBlock) { + REACHABILITY_CHECKS.with(|cell| { + let mut map = cell.borrow_mut(); + let fn_map = map.get_mut(&def_id).unwrap(); + // make sure this location is actually in here + assert!(fn_map.get(&bb).is_some()); + fn_map.insert(bb, false); + }) +} + +pub fn get_reachability_map(def_id: DefId) -> Option> { + REACHABILITY_CHECKS.with(|cell| { + let map = cell.borrow(); + map.get(&def_id).cloned() + }) } pub fn store_spec_env<'tcx>(def_spec: DefSpecificationMap, env: Environment<'tcx>) { diff --git a/prusti-viper/src/encoder/errors/error_manager.rs b/prusti-viper/src/encoder/errors/error_manager.rs index 4f8bbd439f6..eb80eb58134 100644 --- a/prusti-viper/src/encoder/errors/error_manager.rs +++ b/prusti-viper/src/encoder/errors/error_manager.rs @@ -12,7 +12,7 @@ use prusti_rustc_interface::span::{source_map::SourceMap, def_id::DefId}; use prusti_rustc_interface::middle::mir::BasicBlock; use prusti_rustc_interface::errors::MultiSpan; use viper::VerificationError; -use prusti_interface::{PrustiError, environment::inserted_locations_store}; +use prusti_interface::{PrustiError, globals}; use log::debug; use super::PositionManager; use prusti_interface::data::ProcedureDefId; @@ -100,10 +100,19 @@ pub enum ErrorCtxt { /// Finding the value of the termination measure at the begin of a method unexpectedly caused an error UnexpectedAssignMethodTerminationMeasure, /// A Viper `assert false` that encodes the failure (panic) of an `assert` Rust terminator - /// Arguments: the message of the Rust assertion - AssertTerminator(String), + /// Arguments: + /// * the message of the Rust assertion + /// * 2 fields to identify this assertion in the MIR for optimizations + /// * bool whether to ignore this error (meaning not report it to user, + /// because it's only required for optimizations) + AssertTerminator(String, DefId, BasicBlock, bool), + /// A Viper `assert false` in the context of a bounds check in specifications + BoundsCheckAssertSpec, /// A Viper `assert false` in the context of a bounds check - BoundsCheckAssert, + /// Arguments: + /// * 2 fields to identify this assertion in the MIR for optimizations + /// * bool whether to ignore this error (meaning not report it to user, + BoundsCheckAssert(DefId, BasicBlock, bool), /// A Viper `assert false` in the context of a hardcoded bounds check (e.g. when we hardcode a `index`) /// TODO: remove this in favor of extern_spec for e.g. the stdlib `fn index(...)` SliceRangeBoundsCheckAssert(String), @@ -387,9 +396,14 @@ impl<'tcx> ErrorManager<'tcx> { .set_failing_assertion(opt_cause_span) } - ("assert.failed:assertion.false", ErrorCtxt::AssertTerminator(ref message)) => { - PrustiError::verification(format!("assertion might fail with \"{message}\""), error_span) - .set_failing_assertion(opt_cause_span) + ("assert.failed:assertion.false", ErrorCtxt::AssertTerminator(ref message, def_id, bb, ignore)) => { + if *ignore { + globals::set_assertion_violated(*def_id, *bb); + PrustiError::ignore_verification(format!("failing assertion used for mir optimization, bug if seen by a user"), error_span) + } else { + PrustiError::verification(format!("assertion might fail with \"{message}\""), error_span) + .set_failing_assertion(opt_cause_span) + } } ("assert.failed:assertion.false", ErrorCtxt::AbortTerminator) => { @@ -542,6 +556,7 @@ impl<'tcx> ErrorManager<'tcx> { "application.precondition:assertion.false", ErrorCtxt::PureFunctionAssertTerminator(ref message), ) => { + PrustiError::disabled_verification( format!("assertion might fail with \"{message}\""), error_span @@ -609,8 +624,21 @@ impl<'tcx> ErrorManager<'tcx> { .set_help("The implemented method's postcondition should imply the trait's postcondition.") } - ("assert.failed:assertion.false", ErrorCtxt::BoundsCheckAssert) | - ("application.precondition:assertion.false", ErrorCtxt::BoundsCheckAssert) => { + ("assert.failed:assertion.false", ErrorCtxt::BoundsCheckAssert(def_id, bb, ignore)) => { + if *ignore { + globals::set_assertion_violated(*def_id, *bb); + PrustiError::ignore_verification( + "an assertion failed but is only relevant for optimizations. Bug if seen by a user".to_string(), + error_span + ) + } else { + PrustiError::verification( + "the array or slice index may be out of bounds".to_string(), + error_span, + ).set_failing_assertion(opt_cause_span) + } + } + ("application.precondition:assertion.false", ErrorCtxt::BoundsCheckAssertSpec) => { PrustiError::verification( "the array or slice index may be out of bounds".to_string(), error_span, @@ -708,7 +736,7 @@ impl<'tcx> ErrorManager<'tcx> { } (_err_id, ErrorCtxt::InsertedReachabilityRefutation(def_id, bb)) => { // this location is reachable. Mark it: - inserted_locations_store::set_block_unreachable(*def_id, *bb); + globals::set_block_unreachable(*def_id, *bb); // return a cancelled error, because these should not cause // a failure PrustiError::ignore_verification("Inserted assertion is reachable", error_span) diff --git a/prusti-viper/src/encoder/mir/places/interface.rs b/prusti-viper/src/encoder/mir/places/interface.rs index 80e2e901785..2cef1342bad 100644 --- a/prusti-viper/src/encoder/mir/places/interface.rs +++ b/prusti-viper/src/encoder/mir/places/interface.rs @@ -327,7 +327,7 @@ impl<'v, 'tcx: 'v> PlacesEncoderInterface<'tcx> for super::super::super::Encoder if !matches!( op, mir::BinOp::Add | mir::BinOp::Sub | mir::BinOp::Mul | mir::BinOp::Shl | mir::BinOp::Shr - ) || !prusti_common::config::check_overflows() + ) || (!prusti_common::config::check_overflows() && !prusti_common::config::remove_dead_code()) { Ok(false.into()) } else { diff --git a/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs b/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs index 7e0dced682b..a5c2481436d 100644 --- a/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs +++ b/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs @@ -24,7 +24,7 @@ use crate::encoder::{ }; use log::debug; use prusti_common::config; -use prusti_interface::environment::{ +use prusti_interface::{environment::{ debug_utils::to_text::ToText, mir_analyses::{ allocation::{compute_definitely_allocated, DefinitelyAllocatedAnalysisResult}, @@ -32,7 +32,7 @@ use prusti_interface::environment::{ }, mir_body::borrowck::{facts::RichLocation, lifetimes::Lifetimes}, Procedure, -}; +}, globals}; use prusti_rustc_interface::{ abi::FieldIdx, data_structures::graph::WithStartNode, @@ -1262,6 +1262,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { msg, *target, *unwind, + location, )?, // TerminatorKind::Yield { .. } => { // graph.add_exit_edge(bb, "yield"); @@ -1818,6 +1819,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { msg: &mir::AssertMessage<'tcx>, target: mir::BasicBlock, unwind: mir::UnwindAction, + location: mir::Location, ) -> SpannedEncodingResult { let condition = self .encoder @@ -1830,18 +1832,26 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { vir_high::Expression::not(condition) }; + if config::remove_dead_code() { + globals::add_encoded_assertion(self.def_id, location.block); + } + let ignore = config::remove_dead_code() + && (!self.check_panics + || (!config::check_overflows() + && matches!(msg, mir::AssertKind::Overflow(..) | mir::AssertKind::OverflowNeg(..)))); + let (assert_msg, error_ctxt) = if let mir::AssertKind::BoundsCheck { .. } = msg { let mut s = String::new(); msg.fmt_assert_args(&mut s).unwrap(); - (s, ErrorCtxt::BoundsCheckAssert) + (s, ErrorCtxt::BoundsCheckAssert(self.def_id, location.block, ignore)) } else { let assert_msg = msg.description().to_string(); - (assert_msg.clone(), ErrorCtxt::AssertTerminator(assert_msg)) + (assert_msg.clone(), ErrorCtxt::AssertTerminator(assert_msg, self.def_id, location.block, ignore)) }; let target_label = self.encode_basic_block_label(target); block_builder.add_comment(format!("Rust assertion: {assert_msg}")); - if self.check_panics { + if self.check_panics || config::remove_dead_code() { block_builder.add_statement(self.encoder.set_statement_error_ctxt( vir_high::Statement::assert_no_pos(guard.clone()), span, diff --git a/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_high.rs b/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_high.rs index afa6f24bbd9..bcbcb0ddc21 100644 --- a/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_high.rs +++ b/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_high.rs @@ -982,7 +982,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> BackwardMirInterpreter<'tcx> }; let error_ctxt = if let box mir::AssertKind::BoundsCheck { .. } = msg { - ErrorCtxt::BoundsCheckAssert + ErrorCtxt::BoundsCheckAssertSpec } else { let assert_msg = msg.description().to_string(); ErrorCtxt::PureFunctionAssertTerminator(assert_msg) diff --git a/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs b/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs index b013aa6f277..0f3b2fe4816 100644 --- a/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs +++ b/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs @@ -736,7 +736,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> BackwardMirInterpreter<'tcx> }; let error_ctxt = if let box mir::AssertKind::BoundsCheck { .. } = msg { - ErrorCtxt::BoundsCheckAssert + ErrorCtxt::BoundsCheckAssertSpec } else { let assert_msg = msg.description().to_string(); ErrorCtxt::PureFunctionAssertTerminator(assert_msg) diff --git a/prusti-viper/src/encoder/mir_encoder/mod.rs b/prusti-viper/src/encoder/mir_encoder/mod.rs index a8bdfbc6c52..2fab4635fd0 100644 --- a/prusti-viper/src/encoder/mir_encoder/mod.rs +++ b/prusti-viper/src/encoder/mir_encoder/mod.rs @@ -552,7 +552,8 @@ impl<'p, 'v: 'p, 'tcx: 'v> MirEncoder<'p, 'v, 'tcx> { right: vir::Expr, ty: ty::Ty<'tcx>, ) -> EncodingResult { - if !matches!(op, mir::BinOp::Add | mir::BinOp::Sub | mir::BinOp::Mul | mir::BinOp::Shl | mir::BinOp::Shr) || !config::check_overflows() { + if !matches!(op, mir::BinOp::Add | mir::BinOp::Sub | mir::BinOp::Mul | mir::BinOp::Shl | mir::BinOp::Shr) + || (!config::check_overflows() && !config::remove_dead_code()) { Ok(false.into()) } else { let result = self.encode_bin_op_expr(op, left, right.clone(), ty)?; diff --git a/prusti-viper/src/encoder/procedure_encoder.rs b/prusti-viper/src/encoder/procedure_encoder.rs index 0741a498f7a..7cb8a9a4296 100644 --- a/prusti-viper/src/encoder/procedure_encoder.rs +++ b/prusti-viper/src/encoder/procedure_encoder.rs @@ -29,7 +29,7 @@ use prusti_common::{ vir::{ToGraphViz, fixes::fix_ghost_vars}, vir_local, vir_expr, vir_stmt }; -use prusti_interface::{globals, environment::inserted_locations_store}; +use prusti_interface::globals; use vir_crate::{ polymorphic::{ self as vir, @@ -1341,7 +1341,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { /// Insert a refute fals to deterimine rechability fn encode_reachability_refute(&mut self, bbi: BasicBlockIndex, cfg_block: CfgBlockIndex) -> SpannedEncodingResult<()> { let pos = self.register_error(self.mir_encoder.get_span_of_basic_block(bbi), ErrorCtxt::InsertedReachabilityRefutation(self.proc_def_id, bbi)); - inserted_locations_store::add_reachability_check(self.proc_def_id, bbi); + globals::add_reachability_check(self.proc_def_id, bbi); let false_const = vir::Expr::Const(vir::ConstExpr { value: vir::Const::Bool(false), position: pos @@ -2783,18 +2783,25 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { vir::Expr::not(cond_var.into()) }; + if config::remove_dead_code() { + globals::add_encoded_assertion(self.proc_def_id, location.block); + } + let ignore = config::remove_dead_code() + && (!self.check_panics + || (!config::check_overflows() + && matches!(msg, box mir::AssertKind::Overflow(..) | box mir::AssertKind::OverflowNeg(..)))); // Check or assume the assertion let (assert_msg, error_ctxt) = if let box mir::AssertKind::BoundsCheck { .. } = msg { let mut s = String::new(); msg.fmt_assert_args(&mut s).unwrap(); - (s, ErrorCtxt::BoundsCheckAssert) + (s, ErrorCtxt::BoundsCheckAssert(self.proc_def_id, location.block, ignore)) } else { let assert_msg = msg.description().to_string(); - (assert_msg.clone(), ErrorCtxt::AssertTerminator(assert_msg)) + (assert_msg.clone(), ErrorCtxt::AssertTerminator(assert_msg, self.proc_def_id, location.block, ignore)) }; stmts.push(vir::Stmt::comment(format!("Rust assertion: {assert_msg}"))); - if self.check_panics { + if self.check_panics || config::remove_dead_code() { stmts.push(vir::Stmt::Assert( vir::Assert { expr: viper_guard, position: self.register_error( diff --git a/prusti/src/modify_mir/passes/insert_pledge_checks.rs b/prusti/src/modify_mir/passes/insert_pledge_checks.rs index 8e9b800244a..5e7a8075cf1 100644 --- a/prusti/src/modify_mir/passes/insert_pledge_checks.rs +++ b/prusti/src/modify_mir/passes/insert_pledge_checks.rs @@ -174,7 +174,10 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { // a pledge is associated with this loan and dies here!! modification_list.push((ExpirationLocation::Location(location), *place)); let pledge = self.pledges_to_process.get(place).unwrap(); - println!("Pledge for function {} is associated with loan {:?} and dies at {:?}", pledge.name, loan, location); + println!( + "Pledge for function {} is associated with loan {:?} and dies at {:?}", + pledge.name, loan, location + ); } } if statement_index == nr_statements @@ -389,7 +392,8 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { // create a copy of the result in case it becomes a zombie later let result_ty = destination.ty(self.local_decls(), self.tcx).ty; - let result_copy_place = mir::Place::from(self.patcher().new_temp(result_ty, DUMMY_SP)); + let result_copy_place = + mir::Place::from(self.patcher().new_temp(result_ty, DUMMY_SP)); println!("Pledge result type: {:?}", result_ty); // create a guard local @@ -446,9 +450,15 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { // Copy the result after the function has been called: // If it has a target, otherwise it doesn't matter at all.. if let Some(target) = target { - let location = mir::Location{ block: *target, statement_index: 0}; + let location = mir::Location { + block: *target, + statement_index: 0, + }; let result_operand = mir::Operand::Copy(pledge.destination); - let stmt = mir::StatementKind::Assign(Box::new((pledge.result_copy_place, mir::Rvalue::Use(result_operand)))); + let stmt = mir::StatementKind::Assign(Box::new(( + pledge.result_copy_place, + mir::Rvalue::Use(result_operand), + ))); self.patcher().add_statement(location, stmt); } self.pledges_to_process.insert(*destination, pledge); diff --git a/prusti/src/modify_mir/passes/remove_dead_code.rs b/prusti/src/modify_mir/passes/remove_dead_code.rs index 40b885ab9cc..dea482aef4c 100644 --- a/prusti/src/modify_mir/passes/remove_dead_code.rs +++ b/prusti/src/modify_mir/passes/remove_dead_code.rs @@ -1,44 +1,114 @@ -use prusti_interface::environment::inserted_locations_store; +use prusti_interface::globals; use prusti_rustc_interface::{ middle::{ - mir::{self, visit::MutVisitor}, - ty::TyCtxt, + mir::{ + self, + patch::MirPatch, + visit::{self, MutVisitor}, + AssertKind, + }, + ty::{self, TyCtxt}, }, - span::def_id::DefId, + span::{def_id::DefId, DUMMY_SP}, }; -use rustc_hash::FxHashSet; +use rustc_hash::{FxHashMap, FxHashSet}; + +use crate::modify_mir::mir_helper::dummy_source_info; pub struct DeadCodeElimination<'tcx> { tcx: TyCtxt<'tcx>, unreachable_blocks: FxHashSet, + removable_assertions: FxHashSet, } impl<'tcx, 'a> DeadCodeElimination<'tcx> { pub fn new(tcx: TyCtxt<'tcx>, def_id: DefId) -> Self { // collect all the blocks that were inserted but didnt generate // a verification error: - let reachability_map = - inserted_locations_store::get_reachability_map(def_id).unwrap_or_default(); + let reachability_map = globals::get_reachability_map(def_id).unwrap_or_default(); let unreachable_blocks: FxHashSet = reachability_map .iter() .filter_map(|(bb, reachable)| (!reachable).then_some(*bb)) .collect(); - println!( - "unreachable blocks for method: {:?}, {:#?}", - def_id, unreachable_blocks - ); + + let assertion_map = globals::get_assertion_map(def_id).unwrap_or_default(); + let removable_assertions: FxHashSet = assertion_map + .iter() + .filter_map(|(bb, verified)| verified.then_some(*bb)) + .collect(); Self { tcx, unreachable_blocks, + removable_assertions, } } pub fn run(&mut self, body: &mut mir::Body<'tcx>) { + self.remove_assertions(body); if self.unreachable_blocks.is_empty() { return; } self.visit_body(body); } + + fn remove_assertions(&self, body: &mut mir::Body<'tcx>) { + let mut locals_to_replace: Vec<(mir::Local, ty::Ty<'tcx>)> = Default::default(); + for block in self.removable_assertions.iter() { + let terminator = body.basic_blocks_mut()[*block].terminator.take().unwrap(); + if let mir::TerminatorKind::Assert { + cond, + msg: box kind, + target, + .. + } = terminator.kind + { + // Assertions associated with checked operations + if matches!( + kind, + AssertKind::Overflow(..) + | AssertKind::OverflowNeg(_) + ) { + // this place should be of the form `_x.1` (the check field + // of the result of a checked operation) + let place = cond.place().unwrap(); + // If generated by a checkedAdd or similar, this will be + // a tuple with 1 projection. + if place.projection.len() == 1 { + // figure out the type of the first field: + let base_place: mir::Place<'tcx> = place.local.into(); + let ty = base_place.ty(&body.local_decls, self.tcx).ty; + let res_type = if let ty::TyKind::Tuple(typelist) = ty.kind() { + *typelist.get(0).unwrap() + } else { + unreachable!(); + }; + locals_to_replace.push((place.local, res_type)); + } + } + + // make the terminator a goto + let new_term = mir::Terminator { + source_info: dummy_source_info(), + kind: mir::TerminatorKind::Goto { target }, + }; + body.basic_blocks_mut()[*block].terminator = Some(new_term); + } else { + unreachable!("Somehow mir must have been modified in a bad way between verification and here"); + } + } + let mut patcher = MirPatch::new(body); + let replacements: FxHashMap = locals_to_replace + .into_iter() + .map(|(local, ty)| (local, patcher.new_temp(ty, DUMMY_SP))) + .collect(); + patcher.apply(body); + + let mut op_replacer = OperationReplacer { + tcx: self.tcx, + replacements, + }; + op_replacer.visit_body(body); + } } impl<'tcx, 'a> MutVisitor<'tcx> for DeadCodeElimination<'tcx> { @@ -73,9 +143,6 @@ impl<'tcx, 'a> MutVisitor<'tcx> for DeadCodeElimination<'tcx> { } else { let switch_targets = mir::terminator::SwitchTargets::new(targets_vec.into_iter(), otherwise); - if switch_targets.all_targets().len() != targets.all_targets().len() { - println!("SwitchInt in block {:?} was changed", location.block); - } Some(mir::TerminatorKind::SwitchInt { discr: discr.clone(), targets: switch_targets, @@ -98,3 +165,50 @@ impl<'tcx, 'a> MutVisitor<'tcx> for DeadCodeElimination<'tcx> { } } } + +struct OperationReplacer<'tcx> { + tcx: TyCtxt<'tcx>, + replacements: FxHashMap, +} + +impl<'tcx> MutVisitor<'tcx> for OperationReplacer<'tcx> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + + fn visit_assign( + &mut self, + place: &mut mir::Place<'tcx>, + rvalue: &mut mir::Rvalue<'tcx>, + location: mir::Location, + ) { + // is rhs a checked operation? + if let Some(replacing_local) = self.replacements.get(&place.local) { + if let mir::Rvalue::CheckedBinaryOp(bin_op, box (op1, op2)) = rvalue { + // replace the statement with an unchecked operation + *place = (*replacing_local).into(); + *rvalue = mir::Rvalue::BinaryOp(*bin_op, Box::new((op1.clone(), op2.clone()))); + } + } + self.super_assign(place, rvalue, location); + } + + fn visit_place( + &mut self, + place: &mut mir::Place<'tcx>, + _context: visit::PlaceContext, + _location: mir::Location, + ) { + if let Some(replacing_local) = self.replacements.get(&place.local) { + // make sure this is an access to _x.0, all others should not + // exist anymore at this point + assert!(place.projection.len() == 1); + if let mir::ProjectionElem::Field(id, _) = place.projection.first().unwrap() { + if id.index() == 0 { + // replace the local + *place = mir::Place::from(*replacing_local); + } + } + } + } +} diff --git a/prusti/src/verifier.rs b/prusti/src/verifier.rs index c51d30f1fc3..fa1dcd113ee 100644 --- a/prusti/src/verifier.rs +++ b/prusti/src/verifier.rs @@ -24,7 +24,6 @@ pub fn verify(env: Environment<'_>, def_spec: typed::DefSpecificationMap) -> Env types, }; debug!("Verification task: {:?}", &verification_task); - println!("Verification task: {:?}", &verification_task); user::message(format!( "Verification of {} items...", From 066ecc558423766f5556dd5111dbd411ddcd9e45 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Sun, 20 Aug 2023 23:36:38 +0200 Subject: [PATCH 28/45] cleanup changes that are no longer required --- .../prusti-contracts-proc-macros/src/lib.rs | 13 --------- prusti-contracts/prusti-contracts/src/lib.rs | 4 ++- prusti-contracts/prusti-specs/src/lib.rs | 8 +---- .../prusti-specs/src/type_cond_specs/mod.rs | 2 +- prusti-viper/src/encoder/encoder.rs | 11 +------ prusti-viper/src/encoder/procedure_encoder.rs | 29 ++----------------- prusti-viper/src/verifier.rs | 5 ---- prusti/src/callbacks.rs | 9 +----- 8 files changed, 9 insertions(+), 72 deletions(-) diff --git a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs index 357bd449793..cd6dadd08b5 100644 --- a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs +++ b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs @@ -136,12 +136,6 @@ pub fn quantifier_runtime_bounds(_attr: TokenStream, tokens: TokenStream) -> Tok tokens } -#[cfg(not(feature = "prusti"))] -#[proc_macro] -pub fn prusti_pledge_expires(_attr: TokenStream, tokens: TokenStream) -> TokenStream { - tokens -} - // ---------------------- // --- PRUSTI ENABLED --- @@ -290,12 +284,5 @@ pub fn body_variant(tokens: TokenStream) -> TokenStream { pub fn quantifier_runtime_bounds(_attr: TokenStream, tokens: TokenStream) -> TokenStream { tokens } - -#[cfg(feature = "prusti")] -#[proc_macro] -pub fn prusti_pledge_expires(tokens: TokenStream) -> TokenStream { - prusti_specs::pledge_expires(tokens.into()).into() -} - // Ensure that you've also crated a transparent `#[cfg(not(feature = "prusti"))]` // version of your new macro above! diff --git a/prusti-contracts/prusti-contracts/src/lib.rs b/prusti-contracts/prusti-contracts/src/lib.rs index f1e7f588f91..c78d259bf07 100644 --- a/prusti-contracts/prusti-contracts/src/lib.rs +++ b/prusti-contracts/prusti-contracts/src/lib.rs @@ -66,7 +66,9 @@ pub use prusti_contracts_proc_macros::terminates; /// A macro to annotate body variant of a loop to prove termination pub use prusti_contracts_proc_macros::body_variant; -pub use prusti_contracts_proc_macros::prusti_pledge_expires; +/// A macro to explicitly annotate a quantifier with ranges for their +/// runtime checks +pub use prusti_contracts_proc_macros::quantifier_runtime_bounds; #[cfg(not(feature = "prusti"))] mod private { diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index ad2a4eb991b..f92fd229848 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -159,16 +159,11 @@ fn generate_spec_and_assertions( ) -> GeneratedResult { let mut generated_items = vec![]; let mut generated_attributes = vec![]; - let is_trusted = !prusti_attributes - .iter() - .filter(|x| matches!(x.0, SpecAttributeKind::Trusted)) - .collect::>() - .is_empty(); for (attr_kind, attr_tokens) in prusti_attributes.drain(..) { let rewriting_result = match attr_kind { SpecAttributeKind::Requires => generate_for_requires(attr_tokens, item), - SpecAttributeKind::Ensures => generate_for_ensures(attr_tokens, item, is_trusted), + SpecAttributeKind::Ensures => generate_for_ensures(attr_tokens, item), SpecAttributeKind::AfterExpiry => generate_for_after_expiry(attr_tokens, item), SpecAttributeKind::AssertOnExpiry => generate_for_assert_on_expiry(attr_tokens, item), SpecAttributeKind::Pure => generate_for_pure(attr_tokens, item), @@ -224,7 +219,6 @@ fn generate_for_requires(attr: TokenStream, item: &untyped::AnyFnItem) -> Genera fn generate_for_ensures( attr: TokenStream, item: &untyped::AnyFnItem, - _is_trusted: bool, // may be used in future ) -> GeneratedResult { let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); diff --git a/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs b/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs index d02d673e140..b11d9e26aed 100644 --- a/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs +++ b/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs @@ -16,7 +16,7 @@ pub fn generate(attr: TokenStream, item: &untyped::AnyFnItem) -> GeneratedResult for nested_spec in type_cond_spec.specs { let (mut generated_items, generated_attrs) = match nested_spec { - NestedSpec::Ensures(tokens) => generate_for_ensures(tokens, item, true)?, + NestedSpec::Ensures(tokens) => generate_for_ensures(tokens, item)?, // is_trusted argument above is true because spec-refinements are always trusted NestedSpec::Requires(tokens) => generate_for_requires(tokens, item)?, NestedSpec::Pure => generate_for_pure_refinements(item)?, diff --git a/prusti-viper/src/encoder/encoder.rs b/prusti-viper/src/encoder/encoder.rs index 823e132eb43..c460b625528 100644 --- a/prusti-viper/src/encoder/encoder.rs +++ b/prusti-viper/src/encoder/encoder.rs @@ -104,7 +104,6 @@ pub struct Encoder<'v, 'tcx: 'v> { /// this requires special care when encoding array/slice accesses which may come with /// bound checks included in the MIR. pub(super) is_encoding_trigger: Cell, - pub expiration_locations: RefCell>>, } pub enum EncodingTask<'tcx> { @@ -178,7 +177,6 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { specifications_state: SpecificationsState::new(def_spec), mir_procedure_mapping: Default::default(), discriminants_state: Default::default(), - expiration_locations: Default::default(), } } @@ -624,13 +622,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { let procedure = self.env.get_procedure(def_id); let proc_encoder = ProcedureEncoder::new(self, &procedure)?; let mut method = match proc_encoder.encode() { - Ok((result, loan_expirations)) => { - let mut expiration_locations = self.expiration_locations.borrow_mut(); - // detect multiple expiration locations - assert!(expiration_locations.get(&def_id).is_none()); - expiration_locations.insert(def_id, loan_expirations); - result - }, + Ok(result) => result, Err(error) => { self.register_encoding_error(error); StubProcedureEncoder::new(self, &procedure).encode() @@ -866,7 +858,6 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { match proc_kind { _ if self.is_trusted(proc_def_id, None) => { - // let _ = self.encode_procedure(proc_def_id); debug!( "Trusted procedure will not be encoded or verified: {:?}", proc_def_id diff --git a/prusti-viper/src/encoder/procedure_encoder.rs b/prusti-viper/src/encoder/procedure_encoder.rs index 7cb8a9a4296..d7b6052df70 100644 --- a/prusti-viper/src/encoder/procedure_encoder.rs +++ b/prusti-viper/src/encoder/procedure_encoder.rs @@ -135,8 +135,6 @@ pub struct ProcedureEncoder<'p, 'v: 'p, 'tcx: 'v> { /// Type substitutions inside this procedure. Most likely identity for the /// given proc_def_id. substs: SubstsRef<'tcx>, - place_to_loan: FxHashMap>, - loan_expiration_location: FxHashMap, } impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { @@ -196,8 +194,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { old_ghost_vars: FxHashMap::default(), cached_loop_invariant_block: FxHashMap::default(), substs, - loan_expiration_location: FxHashMap::default(), - place_to_loan: FxHashMap::default(), }) } @@ -405,7 +401,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { } #[tracing::instrument(level = "debug", skip(self), fields(name = self.cfg_method.name()))] - pub fn encode(mut self) -> SpannedEncodingResult<(vir::CfgMethod, FxHashMap)> { + pub fn encode(mut self) -> SpannedEncodingResult { let mir_span = self.mir.span; // Retrieve the contract @@ -565,7 +561,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { self.mir.span, ErrorCtxt::Unexpected ); - let loan_expirations = self.collect_loan_expirations(); let method_with_fold_unfold = foldunfold::add_fold_unfold( self.encoder, self.cfg_method, @@ -602,7 +597,7 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { // store polonius info for runtime checks: globals::store_polonius_info(self.proc_def_id, self.polonius_info.take().unwrap()); - Ok((method_with_fold_unfold, loan_expirations)) + Ok(method_with_fold_unfold) } /// Encodes a topologically ordered group of blocks. @@ -3531,7 +3526,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { loan, false, substs, - Some(destination), )?; // We inhale the magic wand just before applying it because we need // a magic wand that depends on the current value of ghost variables. @@ -4388,7 +4382,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { loan: Option, function_end: bool, substs: SubstsRef<'tcx>, - destination: Option>, ) -> SpannedEncodingResult<( vir::Expr, // Returned permissions from types. Option, // Permission of the return value. @@ -4483,10 +4476,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { .insert(location, (post_label.to_string(), lhs.clone(), rhs.clone())); } magic_wands.push(vir::Expr::magic_wand(lhs, rhs, loan.map(|l| l.index().into()))); - // keep track of magic wands for runtime checks - if let Some(dest) = destination { - self.place_to_loan.insert(dest.local, loan); - } } // Encode permissions for return type @@ -4773,7 +4762,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { None, true, self.substs, - None, )?; let type_inv_pos = self.register_error( @@ -7004,19 +6992,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { }) } - pub fn collect_loan_expirations(&self) -> FxHashMap { - let mut res = FxHashMap::default(); - for (place, loan_opt) in &self.place_to_loan { - if let Some(loan) = loan_opt { - if let Some(expiration_location) = self.loan_expiration_location.get(loan) { - println!("place: {:?} expires at location {:?}", place, expiration_location); - res.insert(*place, *expiration_location); - } - } - } - res - } - fn register_error + Debug>(&self, span: T, error_ctxt: ErrorCtxt) -> vir::Position { self.mir_encoder.register_error(span, error_ctxt) } diff --git a/prusti-viper/src/verifier.rs b/prusti-viper/src/verifier.rs index 632708bd276..e38311fedfd 100644 --- a/prusti-viper/src/verifier.rs +++ b/prusti-viper/src/verifier.rs @@ -214,10 +214,6 @@ impl<'v, 'tcx> Verifier<'v, 'tcx> { result } - - pub fn get_expiration_locations(&self) -> FxHashMap> { - self.encoder.expiration_locations.borrow().clone() - } } /// Verify a list of programs. @@ -293,5 +289,4 @@ fn verify_programs( }) .collect() } - } diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index cfb17685830..e93eb0ea978 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -218,14 +218,6 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { ); }); } - // can we modify ast? just stealing it does not work obviously.. - // queries.global_ctxt().unwrap().enter(|tcx: TyCtxt<'tcx>| { - // let (resolver, mut krate_rc) = tcx.resolver_for_lowering(()).steal(); - // let krate: &mut Crate = Rc::get_mut(&mut krate_rc).unwrap(); - // // let _visitor = MutVisitor; - // tcx.arena.alloc(Steal::new((resolver, Rc::new(krate.clone())))) - // }); - Compilation::Continue } @@ -237,6 +229,7 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { ) -> Compilation { compiler.session().abort_if_errors(); if config::full_compilation() { + // verification moved into mir_drops_elaborated query! Compilation::Continue } else { Compilation::Stop From bcbb303d04277695bad7784b103ddd260a054738 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Mon, 21 Aug 2023 15:27:55 +0200 Subject: [PATCH 29/45] Undo accidental formatting --- prusti-viper/src/encoder/encoder.rs | 442 +++++++++++----------------- 1 file changed, 168 insertions(+), 274 deletions(-) diff --git a/prusti-viper/src/encoder/encoder.rs b/prusti-viper/src/encoder/encoder.rs index c460b625528..b63a3f95700 100644 --- a/prusti-viper/src/encoder/encoder.rs +++ b/prusti-viper/src/encoder/encoder.rs @@ -1,69 +1,69 @@ +// © 2019, ETH Zurich +// // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -use super::{ - builtin_encoder::BuiltinDomainKind, - counterexamples::{DiscriminantsState, MirProcedureMapping, MirProcedureMappingInterface}, - high::{ - builtin_functions::HighBuiltinFunctionEncoderState, - to_typed::types::HighToTypedTypeEncoderState, - types::{HighTypeEncoderInterface, HighTypeEncoderState}, +use ::log::{info, debug}; +use prusti_common::utils::identifiers::encode_identifier; +use vir_crate::common::check_mode::CheckMode; +use crate::encoder::builtin_encoder::BuiltinEncoder; +use crate::encoder::builtin_encoder::BuiltinMethodKind; +use crate::encoder::errors::{ErrorManager, SpannedEncodingError, EncodingError}; +use crate::encoder::foldunfold; +use crate::encoder::procedure_encoder::ProcedureEncoder; +use crate::error_unsupported; +use prusti_common::{vir_expr, vir_local}; +use prusti_common::config; +use prusti_common::report::log; +use prusti_interface::data::ProcedureDefId; +use prusti_interface::environment::Environment; +use prusti_interface::specs::typed; +use prusti_interface::PrustiError; +use vir_crate::polymorphic::{self as vir}; +use vir_crate::common::identifier::WithIdentifier; +use prusti_rustc_interface::hir::def_id::DefId; +use prusti_rustc_interface::middle::mir; +use prusti_rustc_interface::middle::ty; +use std::cell::{Cell, RefCell, RefMut, Ref}; +use std::fmt::Debug; +use rustc_hash::{FxHashSet, FxHashMap}; +use std::io::Write; +use std::rc::Rc; +use crate::encoder::stub_procedure_encoder::StubProcedureEncoder; +use std::ops::AddAssign; +use prusti_interface::specs::typed::ProcedureSpecificationKind; +use crate::encoder::name_interner::NameInterner; +use crate::encoder::errors::EncodingResult; +use crate::encoder::errors::SpannedEncodingResult; +use crate::encoder::mirror_function_encoder::MirrorEncoder; +use crate::encoder::snapshot::interface::{SnapshotEncoderInterface, SnapshotEncoderState}; +use crate::encoder::purifier; +use super::builtin_encoder::BuiltinDomainKind; +use super::high::builtin_functions::HighBuiltinFunctionEncoderState; +use super::middle::core_proof::{MidCoreProofEncoderState, MidCoreProofEncoderInterface}; +use super::mir::{ + sequences::{ + MirSequencesEncoderState, MirSequencesEncoderInterface, }, - middle::core_proof::{MidCoreProofEncoderInterface, MidCoreProofEncoderState}, - mir::{ - contracts::ContractsEncoderState, - procedures::MirProcedureEncoderState, - pure::{PureFunctionEncoderInterface, PureFunctionEncoderState}, - sequences::{MirSequencesEncoderInterface, MirSequencesEncoderState}, - specifications::{SpecificationsInterface, SpecificationsState}, - type_invariants::TypeInvariantEncoderState, - types::{compute_discriminant_bounds, MirTypeEncoderInterface, MirTypeEncoderState}, + contracts::ContractsEncoderState, + procedures::MirProcedureEncoderState, + type_invariants::TypeInvariantEncoderState, + pure::{ + PureFunctionEncoderState, PureFunctionEncoderInterface, }, -}; -use crate::{ - encoder::{ - builtin_encoder::{BuiltinEncoder, BuiltinMethodKind}, - errors::{ - EncodingError, EncodingResult, ErrorManager, SpannedEncodingError, - SpannedEncodingResult, - }, - foldunfold, - mirror_function_encoder::MirrorEncoder, - name_interner::NameInterner, - procedure_encoder::ProcedureEncoder, - purifier, - snapshot::interface::{SnapshotEncoderInterface, SnapshotEncoderState}, - stub_procedure_encoder::StubProcedureEncoder, + types::{ + compute_discriminant_bounds, + MirTypeEncoderState, MirTypeEncoderInterface, }, - error_unsupported, -}; -use ::log::{debug, info}; -use prusti_common::{ - config, report::log, utils::identifiers::encode_identifier, vir_expr, vir_local, -}; -use prusti_interface::{ - data::ProcedureDefId, - environment::Environment, - specs::{typed, typed::ProcedureSpecificationKind}, - PrustiError, -}; -use prusti_rustc_interface::{ - hir::def_id::DefId, - middle::{mir, ty}, -}; -use rustc_hash::{FxHashMap, FxHashSet}; -use std::{ - cell::{Cell, Ref, RefCell, RefMut}, - fmt::Debug, - io::Write, - ops::AddAssign, - rc::Rc, -}; -use vir_crate::{ - common::{check_mode::CheckMode, identifier::WithIdentifier}, - polymorphic::{self as vir}, + specifications::{ + SpecificationsState, SpecificationsInterface, + } }; +use super::high::types::{HighTypeEncoderState, HighTypeEncoderInterface}; +use super::counterexamples::{MirProcedureMappingInterface, MirProcedureMapping}; +use super::counterexamples::DiscriminantsState; +use super::high::to_typed::types::HighToTypedTypeEncoderState; pub struct Encoder<'v, 'tcx: 'v> { env: &'v Environment<'tcx>, @@ -118,31 +118,36 @@ pub enum EncodingTask<'tcx> { // If the field name is an identifier, removing the leading prefix r# pub fn encode_field_name(field_name: &str) -> String { - format!("f${}", field_name.trim_start_matches("r#")) + format!("f${}", field_name.trim_start_matches("r#")) } impl<'v, 'tcx> Encoder<'v, 'tcx> { - pub fn new(env: &'v Environment<'tcx>, def_spec: typed::DefSpecificationMap) -> Self { + pub fn new( + env: &'v Environment<'tcx>, + def_spec: typed::DefSpecificationMap, + ) -> Self { let source_path = env.name.source_path(); let source_filename = source_path.file_name().unwrap().to_str().unwrap(); - let vir_program_before_foldunfold_writer = - config::dump_debug_info().then_some(()).map(|_| { - RefCell::new( - log::build_writer( - "vir_program_before_foldunfold", - format!("{source_filename}.vir"), - ) - .ok() - .unwrap(), + let vir_program_before_foldunfold_writer = config::dump_debug_info().then_some(()).map(|_| + RefCell::new( + log::build_writer( + "vir_program_before_foldunfold", + format!("{source_filename}.vir"), ) - }); - let vir_program_before_viper_writer = config::dump_debug_info().then_some(()).map(|_| { + .ok() + .unwrap(), + ) + ); + let vir_program_before_viper_writer = config::dump_debug_info().then_some(()).map(|_| RefCell::new( - log::build_writer("vir_program_before_viper", format!("{source_filename}.vir")) + log::build_writer( + "vir_program_before_viper", + format!("{source_filename}.vir"), + ) .ok() .unwrap(), ) - }); + ); Encoder { env, @@ -227,18 +232,9 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { self.error_manager.borrow_mut() } - pub fn finalize_viper_program( - &self, - name: String, - proc_def_id: DefId, - ) -> SpannedEncodingResult { + pub fn finalize_viper_program(&self, name: String, proc_def_id: DefId) -> SpannedEncodingResult { let error_span = self.env.query.get_def_span(proc_def_id); - super::definition_collector::collect_definitions( - error_span, - self, - name, - self.get_used_viper_methods(), - ) + super::definition_collector::collect_definitions(error_span, self, name, self.get_used_viper_methods()) } pub fn get_viper_programs(&mut self) -> Vec { @@ -246,19 +242,14 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } pub fn get_core_proof_programs(&mut self) -> Vec { - if config::counterexample() && config::unsafe_core_proof() { - self.take_core_proof_programs() - .into_iter() - .map(|program| { + if config::counterexample() && config::unsafe_core_proof(){ + self.take_core_proof_programs().into_iter().map( + | program | { self.add_mapping(&program); prusti_common::vir::program::Program::Low(program) - }) - .collect() + }).collect() } else { - self.take_core_proof_programs() - .into_iter() - .map(prusti_common::vir::program::Program::Low) - .collect() + self.take_core_proof_programs().into_iter().map(prusti_common::vir::program::Program::Low).collect() } } @@ -285,20 +276,11 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { pub(super) fn insert_function(&self, function: vir::Function) -> vir::FunctionIdentifier { let identifier: vir::FunctionIdentifier = function.get_identifier().into(); - assert!( - self.functions - .borrow_mut() - .insert(identifier.clone(), Rc::new(function)) - .is_none(), - "{identifier:?} is not unique" - ); + assert!(self.functions.borrow_mut().insert(identifier.clone(), Rc::new(function)).is_none(), "{identifier:?} is not unique"); identifier } - pub(super) fn get_function( - &self, - identifier: &vir::FunctionIdentifier, - ) -> SpannedEncodingResult> { + pub(super) fn get_function(&self, identifier: &vir::FunctionIdentifier) -> SpannedEncodingResult> { self.ensure_pure_function_encoded(identifier)?; if self.functions.borrow().contains_key(identifier) { let map = self.functions.borrow(); @@ -311,17 +293,13 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } pub(super) fn get_builtin_methods( - &self, + &self ) -> Ref<'_, FxHashMap> { self.builtin_methods.borrow() } fn get_used_viper_methods(&self) -> Vec { - self.procedures - .borrow_mut() - .drain() - .map(|(_, value)| value) - .collect() + self.procedures.borrow_mut().drain().map(|(_, value)| value).collect() } /// Invoke const evaluation to extract scalar value. @@ -343,29 +321,25 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { ) -> EncodingResult { let opt_scalar_value = match value { mir::ConstantKind::Ty(value) => match value.kind() { - ty::ConstKind::Value(ref const_value) => const_value.try_to_scalar(), + ty::ConstKind::Value(ref const_value) => { + const_value.try_to_scalar() + } ty::ConstKind::Unevaluated(ct) => { let mir_ct = mir::UnevaluatedConst::new(ct.def, ct.substs); self.uneval_eval_intlike(mir_ct) - } + }, _ => error_unsupported!("unsupported const kind: {:?}", value), - }, + } mir::ConstantKind::Val(val, _) => val.try_to_scalar(), mir::ConstantKind::Unevaluated(ct, _) => self.uneval_eval_intlike(ct), }; - opt_scalar_value.ok_or_else(|| { - EncodingError::unsupported(format!("unsupported constant value: {value:?}")) - }) + opt_scalar_value.ok_or_else(|| EncodingError::unsupported(format!("unsupported constant value: {value:?}"))) } /// Encodes a value in a field if the base expression is a reference or /// a primitive types. /// For composed data structures, the base expression is returned. - pub fn encode_value_expr( - &self, - base: vir::Expr, - ty: ty::Ty<'tcx>, - ) -> EncodingResult { + pub fn encode_value_expr(&self, base: vir::Expr, ty: ty::Ty<'tcx>) -> EncodingResult { match ty.kind() { ty::TyKind::Adt(_, _) | ty::TyKind::Closure(_, _) @@ -382,15 +356,15 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } } - pub fn encode_dereference_field(&self, ty: ty::Ty<'tcx>) -> EncodingResult { + pub fn encode_dereference_field(&self, ty: ty::Ty<'tcx>) + -> EncodingResult + { self.encode_raw_ref_field("val_ref".to_string(), ty) } - pub fn encode_struct_field( - &self, - field_name: &str, - ty: ty::Ty<'tcx>, - ) -> EncodingResult { + pub fn encode_struct_field(&self, field_name: &str, ty: ty::Ty<'tcx>) + -> EncodingResult + { self.encode_raw_ref_field(encode_field_name(field_name), ty) } @@ -402,16 +376,16 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { let typ = place.get_type().clone(); let mut name = typ.name(); name.push_str("$$discriminant$$"); - let self_local_var = vir_local! { self: {typ.clone()} }; + let self_local_var = vir_local!{ self: {typ.clone()} }; if !self.type_discriminant_funcs.borrow().contains_key(&name) { let precondition = vir::Expr::predicate_access_predicate( typ, self_local_var.clone().into(), - vir::PermAmount::Read, + vir::PermAmount::Read ); - let result = vir_local! { __result: Int }; - let postcondition = - compute_discriminant_bounds(adt_def, self.env.tcx(), &result.clone().into()); + let result = vir_local!{ __result: Int }; + let postcondition = compute_discriminant_bounds( + adt_def, self.env.tcx(), &result.clone().into()); let discr_field = self.encode_discriminant_field(); let self_local_var_expr: vir::Expr = self_local_var.clone().into(); @@ -426,8 +400,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { self.encode_discriminant_postcondition( self_local_var_expr.clone(), vir::Expr::local(result), - ) - .unwrap(), // TODO: no unwrap + ).unwrap(), // TODO: no unwrap ], body: Some(self_local_var_expr.field(discr_field)), }; @@ -439,11 +412,9 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { self.get_used_viper_predicates_map()?, ); let identifier = self.insert_function(final_function.unwrap()); - self.type_discriminant_funcs - .borrow_mut() - .insert(name.clone(), identifier); + self.type_discriminant_funcs.borrow_mut().insert(name.clone(), identifier); } - Ok(vir::Expr::FuncApp(vir::FuncApp { + Ok(vir::Expr::FuncApp( vir::FuncApp { function_name: name, type_arguments: Vec::new(), arguments: vec![place], @@ -454,10 +425,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_builtin_domain( - &self, - domain_kind: BuiltinDomainKind, - ) -> EncodingResult { + pub fn encode_builtin_domain(&self, domain_kind: BuiltinDomainKind) -> EncodingResult { if !self.builtin_domains.borrow().contains_key(&domain_kind) { let builtin_encoder = BuiltinEncoder::new(self); let domain = builtin_encoder.encode_builtin_domain(domain_kind)?; @@ -469,10 +437,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_builtin_domain_type( - &self, - domain_kind: BuiltinDomainKind, - ) -> EncodingResult { + pub fn encode_builtin_domain_type(&self, domain_kind: BuiltinDomainKind) -> EncodingResult { // Also encode the definition, if it's not already under construction. let mut domains_in_progress = self.builtin_domains_in_progress.borrow_mut(); if !domains_in_progress.contains(&domain_kind) { @@ -487,10 +452,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_builtin_method_def( - &self, - method_kind: BuiltinMethodKind, - ) -> EncodingResult { + pub fn encode_builtin_method_def(&self, method_kind: BuiltinMethodKind) -> EncodingResult { if !self.builtin_methods.borrow().contains_key(&method_kind) { let builtin_encoder = BuiltinEncoder::new(self); let method = builtin_encoder.encode_builtin_method_def(method_kind)?; @@ -503,10 +465,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_builtin_method_use( - &self, - method_kind: BuiltinMethodKind, - ) -> EncodingResult { + pub fn encode_builtin_method_use(&self, method_kind: BuiltinMethodKind) -> EncodingResult { // Trigger encoding of definition self.encode_builtin_method_def(method_kind)?; let builtin_encoder = BuiltinEncoder::new(self); @@ -514,19 +473,13 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_cast_function_use( - &self, - src_ty: ty::Ty<'tcx>, - dst_ty: ty::Ty<'tcx>, - ) -> EncodingResult { + pub fn encode_cast_function_use(&self, src_ty: ty::Ty<'tcx>, dst_ty: ty::Ty<'tcx>) + -> EncodingResult + { let function_name = format!("builtin$cast${src_ty}${dst_ty}"); - if !self - .type_cast_functions - .borrow() - .contains_key(&(src_ty, dst_ty)) - { - let arg = vir_local! { number: {self.encode_snapshot_type(src_ty)?} }; - let result = vir_local! { __result: {self.encode_snapshot_type(dst_ty)?} }; + if !self.type_cast_functions.borrow().contains_key(&(src_ty, dst_ty)) { + let arg = vir_local!{ number: {self.encode_snapshot_type(src_ty)?} }; + let result = vir_local!{ __result: {self.encode_snapshot_type(dst_ty)?} }; let mut precondition = self.encode_type_bounds(&arg.clone().into(), src_ty); precondition.extend(self.encode_type_bounds(&arg.clone().into(), dst_ty)); let postcondition = self.encode_type_bounds(&result.into(), dst_ty); @@ -540,28 +493,18 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { body: Some(arg.into()), }; let identifier = self.insert_function(function); - self.type_cast_functions - .borrow_mut() - .insert((src_ty, dst_ty), identifier); + self.type_cast_functions.borrow_mut().insert((src_ty, dst_ty), identifier); } Ok(function_name) } #[tracing::instrument(level = "trace", skip(self))] - pub fn encode_unsize_function_use( - &self, - src_ty: ty::Ty<'tcx>, - dst_ty: ty::Ty<'tcx>, - ) -> EncodingResult { + pub fn encode_unsize_function_use(&self, src_ty: ty::Ty<'tcx>, dst_ty: ty::Ty<'tcx>) + -> EncodingResult + { // at some point we may want to add support for other types of unsizing calls? - assert!(matches!( - src_ty.kind(), - ty::TyKind::Array(..) | ty::TyKind::Slice(..) - )); - assert!(matches!( - dst_ty.kind(), - ty::TyKind::Array(..) | ty::TyKind::Slice(..) - )); + assert!(matches!(src_ty.kind(), ty::TyKind::Array(..) | ty::TyKind::Slice(..))); + assert!(matches!(dst_ty.kind(), ty::TyKind::Array(..) | ty::TyKind::Slice(..))); let array_types = self.encode_sequence_types(src_ty)?; let slice_types = self.encode_sequence_types(dst_ty)?; @@ -571,14 +514,10 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { &slice_types.sequence_pred_type.name() ); - if !self - .type_cast_functions - .borrow() - .contains_key(&(src_ty, dst_ty)) - { + if !self.type_cast_functions.borrow().contains_key(&(src_ty, dst_ty)) { let src_snap_ty = self.encode_snapshot_type(src_ty)?; let dst_snap_ty = self.encode_snapshot_type(dst_ty)?; - let arg = vir_local! { array: {src_snap_ty} }; + let arg = vir_local!{ array: {src_snap_ty} }; let arg_expr = vir::Expr::from(arg.clone()); let array_uncons = self.encode_snapshot_destructor(src_ty, vec![arg_expr.clone()])?; let slice_cons = self.encode_snapshot(dst_ty, None, vec![array_uncons.clone()])?; @@ -588,10 +527,10 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { right: Box::new(true.into()), // unused position: vir::Position::default(), }); - let result = vir::Expr::from(vir_local! { __result: {dst_snap_ty.clone()} }); + let result = vir::Expr::from(vir_local!{ __result: {dst_snap_ty.clone()} }); let postcondition = vec![ - vir_expr! { [data_len] == [array_types.len(self, arg_expr)] }, - vir_expr! { [result] == [slice_cons]}, + vir_expr!{ [data_len] == [array_types.len(self, arg_expr)] }, + vir_expr!{ [result] == [slice_cons]}, ]; let function = vir::Function { name: function_name.clone(), @@ -603,9 +542,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { body: None, }; let identifier = self.insert_function(function); - self.type_cast_functions - .borrow_mut() - .insert((src_ty, dst_ty), identifier); + self.type_cast_functions.borrow_mut().insert((src_ty, dst_ty), identifier); } Ok(function_name) } @@ -626,11 +563,10 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { Err(error) => { self.register_encoding_error(error); StubProcedureEncoder::new(self, &procedure).encode() - } + }, }; self.log_vir_program_before_viper(method.to_string()); - if config::enable_purification_optimization() { purifier::purify_method(self, &mut method); } @@ -657,7 +593,8 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { | ty::TyKind::Array(..) | ty::TyKind::Slice(..) | ty::TyKind::Param(_) => true, // TODO(tymap): this is weird, use substs properly? - ty::TyKind::Adt(_, _) | ty::TyKind::Closure(_, _) => { + ty::TyKind::Adt(_, _) + | ty::TyKind::Closure(_, _) => { self.env.tcx().has_structural_eq_impls(ty) } _ => false, @@ -668,7 +605,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { pub fn encode_const_expr( &self, ty: ty::Ty<'tcx>, - value: mir::ConstantKind<'tcx>, + value: mir::ConstantKind<'tcx> ) -> EncodingResult { let scalar_value = self.const_eval_intlike(value)?; @@ -680,26 +617,20 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { ty::TyKind::Int(ty::IntTy::I32) => scalar_value.to_i32().unwrap().into(), ty::TyKind::Int(ty::IntTy::I64) => scalar_value.to_i64().unwrap().into(), ty::TyKind::Int(ty::IntTy::I128) => scalar_value.to_i128().unwrap().into(), - ty::TyKind::Int(ty::IntTy::Isize) => scalar_value - .to_target_isize(&self.env.tcx()) - .unwrap() - .into(), + ty::TyKind::Int(ty::IntTy::Isize) => scalar_value.to_target_isize(&self.env.tcx()).unwrap().into(), ty::TyKind::Uint(ty::UintTy::U8) => scalar_value.to_u8().unwrap().into(), ty::TyKind::Uint(ty::UintTy::U16) => scalar_value.to_u16().unwrap().into(), ty::TyKind::Uint(ty::UintTy::U32) => scalar_value.to_u32().unwrap().into(), ty::TyKind::Uint(ty::UintTy::U64) => scalar_value.to_u64().unwrap().into(), ty::TyKind::Uint(ty::UintTy::U128) => scalar_value.to_u128().unwrap().into(), - ty::TyKind::Uint(ty::UintTy::Usize) => scalar_value - .to_target_usize(&self.env.tcx()) - .unwrap() - .into(), + ty::TyKind::Uint(ty::UintTy::Usize) => scalar_value.to_target_usize(&self.env.tcx()).unwrap().into(), ty::TyKind::Float(ty::FloatTy::F32) => { let bits = scalar_value.to_u32().unwrap(); vir::Expr::Const(vir::ConstExpr { value: vir::Const::Float(vir::FloatConst::F32(bits)), position: vir::Position::default(), }) - } + }, ty::TyKind::Float(ty::FloatTy::F64) => { let bits = scalar_value.to_u64().unwrap(); vir::Expr::Const(vir::ConstExpr { @@ -707,10 +638,12 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { position: vir::Position::default(), }) } - ty::TyKind::FnDef(..) => vir::Expr::Const(vir::ConstExpr { - value: vir::Const::FnPtr, - position: vir::Position::default(), - }), + ty::TyKind::FnDef(..) => { + vir::Expr::Const(vir::ConstExpr { + value: vir::Const::FnPtr, + position: vir::Position::default(), + }) + } _ => { error_unsupported!("unsupported constant type {:?}", ty.kind()); } @@ -741,24 +674,17 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } pub fn encode_item_name(&self, def_id: DefId) -> String { - let full_name = format!( - "m_{}", - encode_identifier(self.env.name.get_unique_item_name(def_id)) - ); - let short_name = format!( - "m_{}", - encode_identifier(self.env.name.get_item_name(def_id)) - ); + let full_name = format!("m_{}", encode_identifier(self.env.name.get_unique_item_name(def_id))); + let short_name = format!("m_{}", encode_identifier( + self.env.name.get_item_name(def_id) + )); self.intern_viper_identifier(full_name, short_name) } pub fn queue_procedure_encoding(&self, def_id: ProcedureDefId) { self.encoding_queue .borrow_mut() - .push(EncodingTask::Procedure { - def_id, - substs: Vec::new(), - }); + .push(EncodingTask::Procedure { def_id, substs: Vec::new() }); } pub fn queue_type_encoding(&self, ty: ty::Ty<'tcx>) { @@ -781,10 +707,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { queue.pop() } { match task { - EncodingTask::Procedure { - def_id: proc_def_id, - substs, - } => { + EncodingTask::Procedure { def_id: proc_def_id, substs } => { let proc_name = self.env.name.get_unique_item_name(proc_def_id); let proc_def_path = self.env.name.get_item_def_path(proc_def_id); info!("Encoding: {} ({})", proc_name, proc_def_path); @@ -792,44 +715,26 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { if config::unsafe_core_proof() { if self.env.query.is_unsafe_function(proc_def_id) { - if let Err(error) = - self.encode_lifetimes_core_proof(proc_def_id, CheckMode::Both) - { + if let Err(error) = self.encode_lifetimes_core_proof(proc_def_id, CheckMode::Both) { self.register_encoding_error(error); - debug!( - "Error encoding function: {:?} {}", - proc_def_id, - CheckMode::Both - ); + debug!("Error encoding function: {:?} {}", proc_def_id, CheckMode::Both); } } else { if config::verify_core_proof() { - if let Err(error) = self - .encode_lifetimes_core_proof(proc_def_id, CheckMode::CoreProof) - { + if let Err(error) = self.encode_lifetimes_core_proof(proc_def_id, CheckMode::CoreProof) { self.register_encoding_error(error); - debug!( - "Error encoding function: {:?} {}", - proc_def_id, - CheckMode::CoreProof - ); + debug!("Error encoding function: {:?} {}", proc_def_id, CheckMode::CoreProof); } } if config::verify_specifications() { - let check_mode = if config::verify_specifications_with_core_proof() - { + let check_mode = if config::verify_specifications_with_core_proof() { CheckMode::Both } else { CheckMode::Specifications }; - if let Err(error) = - self.encode_lifetimes_core_proof(proc_def_id, check_mode) - { + if let Err(error) = self.encode_lifetimes_core_proof(proc_def_id, check_mode) { self.register_encoding_error(error); - debug!( - "Error encoding function: {:?} {}", - proc_def_id, check_mode - ); + debug!("Error encoding function: {:?} {}", proc_def_id, check_mode); } } } @@ -846,9 +751,7 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { // TODO: Make sure that this encoded function does not end up in // the Viper file because that would be unsound. let identity_substs = self.env.query.identity_substs(proc_def_id); - if let Err(error) = - self.encode_pure_function_def(proc_def_id, proc_def_id, identity_substs) - { + if let Err(error) = self.encode_pure_function_def(proc_def_id, proc_def_id, identity_substs) { self.register_encoding_error(error); debug!("Error encoding function: {:?}", proc_def_id); // Skip encoding the function as a method. @@ -862,14 +765,15 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { "Trusted procedure will not be encoded or verified: {:?}", proc_def_id ); - } + }, ProcedureSpecificationKind::Predicate(_) => { debug!( "Predicates will not be encoded or verified: {:?}", proc_def_id ); - } - ProcedureSpecificationKind::Pure | ProcedureSpecificationKind::Impure => { + }, + ProcedureSpecificationKind::Pure | + ProcedureSpecificationKind::Impure => { if let Err(error) = self.encode_procedure(proc_def_id) { self.register_encoding_error(error); debug!("Error encoding function: {:?}", proc_def_id); @@ -884,15 +788,11 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } } } + } EncodingTask::Type { ty } => { - if config::unsafe_core_proof() - && config::verify_core_proof() - && config::verify_types() - { - if let Err(error) = - self.encode_core_proof_for_type(ty, CheckMode::CoreProof) - { + if config::unsafe_core_proof() && config::verify_core_proof() && config::verify_types() { + if let Err(error) = self.encode_core_proof_for_type(ty, CheckMode::CoreProof) { self.register_encoding_error(error); debug!("Error encoding type: {:?} {}", ty, CheckMode::CoreProof); } @@ -902,17 +802,11 @@ impl<'v, 'tcx> Encoder<'v, 'tcx> { } } - pub fn intern_viper_identifier + Debug>( - &self, - full_name: S, - short_name: S, - ) -> String { + pub fn intern_viper_identifier + Debug>(&self, full_name: S, short_name: S) -> String { let result = if config::disable_name_mangling() { short_name.as_ref().to_string() } else if config::intern_names() { - self.name_interner - .borrow_mut() - .intern(full_name, &[short_name]) + self.name_interner.borrow_mut().intern(full_name, &[short_name]) } else { full_name.as_ref().to_string() }; From a4891c9fe8916b4ae8d338d4153b4242826067fa Mon Sep 17 00:00:00 2001 From: cedihegi Date: Tue, 22 Aug 2023 10:59:42 +0200 Subject: [PATCH 30/45] syncing! override by amending! --- Cargo.lock | 140 ----------- .../prusti-contracts-proc-macros/src/lib.rs | 13 + prusti-contracts/prusti-contracts/src/lib.rs | 4 + .../src/expression_with_attributes.rs | 52 ++++ prusti-contracts/prusti-specs/src/lib.rs | 224 +++++++++++------- prusti-contracts/prusti-specs/src/rewriter.rs | 108 ++++----- .../src/runtime_checks/translation.rs | 15 -- .../prusti-specs/src/spec_attribute_kind.rs | 2 + .../prusti-specs/src/type_cond_specs/mod.rs | 10 +- prusti-tests/Cargo.toml | 2 - .../mir/pure/interpreter/interpreter_poly.rs | 1 - prusti/src/callbacks.rs | 27 +-- .../passes/insert_postconditions.rs | 1 - 13 files changed, 274 insertions(+), 325 deletions(-) create mode 100644 prusti-contracts/prusti-specs/src/expression_with_attributes.rs diff --git a/Cargo.lock b/Cargo.lock index 7cd4944cc09..3b37f9e2bbd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -393,17 +393,6 @@ dependencies = [ "log", ] -[[package]] -name = "bstr" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" -dependencies = [ - "memchr", - "regex-automata 0.3.4", - "serde", -] - [[package]] name = "bumpalo" version = "3.13.0" @@ -422,24 +411,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" -dependencies = [ - "serde", -] - [[package]] name = "cargo-test-macro" version = "0.1.0" @@ -493,20 +464,6 @@ dependencies = [ "windows-sys 0.45.0", ] -[[package]] -name = "cargo_metadata" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "cc" version = "1.0.79" @@ -592,50 +549,12 @@ dependencies = [ "termcolor", ] -[[package]] -name = "color-eyre" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" -dependencies = [ - "backtrace", - "color-spantrace", - "eyre", - "indenter", - "once_cell", - "owo-colors", - "tracing-error", -] - -[[package]] -name = "color-spantrace" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" -dependencies = [ - "once_cell", - "owo-colors", - "tracing-core", - "tracing-error", -] - [[package]] name = "colorchoice" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" -[[package]] -name = "colored" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" -dependencies = [ - "is-terminal", - "lazy_static", - "windows-sys 0.48.0", -] - [[package]] name = "combine" version = "4.6.6" @@ -1118,16 +1037,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "eyre" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" -dependencies = [ - "indenter", - "once_cell", -] - [[package]] name = "failure" version = "0.1.8" @@ -1646,12 +1555,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - [[package]] name = "index_vec" version = "0.1.3" @@ -2188,12 +2091,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" -[[package]] -name = "owo-colors" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" - [[package]] name = "p384" version = "0.13.0" @@ -2526,8 +2423,6 @@ dependencies = [ "prusti", "prusti-launch", "prusti-server", - "tempfile", - "ui_test", "ureq", ] @@ -3034,9 +2929,6 @@ name = "semver" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" -dependencies = [ - "serde", -] [[package]] name = "serde" @@ -3624,16 +3516,6 @@ dependencies = [ "valuable", ] -[[package]] -name = "tracing-error" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" -dependencies = [ - "tracing 0.1.37", - "tracing-subscriber", -] - [[package]] name = "tracing-log" version = "0.1.3" @@ -3700,28 +3582,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" -[[package]] -name = "ui_test" -version = "0.11.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c21899b59f53717dfad29e4f46e5b21a200a1b6888ab86532a07cfc8b48dd78c" -dependencies = [ - "bstr", - "cargo-platform", - "cargo_metadata", - "color-eyre", - "colored", - "crossbeam-channel", - "diff", - "lazy_static", - "regex", - "rustc_version", - "rustfix", - "serde", - "serde_json", - "tempfile", -] - [[package]] name = "unicase" version = "2.6.0" diff --git a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs index cd6dadd08b5..40b4e4d72ff 100644 --- a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs +++ b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs @@ -136,6 +136,13 @@ pub fn quantifier_runtime_bounds(_attr: TokenStream, tokens: TokenStream) -> Tok tokens } + +#[cfg(not(feature = "prusti"))] +#[proc_macro_attribute] +pub fn insert_runtime_check(attr: TokenStream, tokens: TokenStream) -> TokenStream { + TokenStream::new() +} + // ---------------------- // --- PRUSTI ENABLED --- @@ -284,5 +291,11 @@ pub fn body_variant(tokens: TokenStream) -> TokenStream { pub fn quantifier_runtime_bounds(_attr: TokenStream, tokens: TokenStream) -> TokenStream { tokens } + +#[cfg(feature = "prusti")] +#[proc_macro_attribute] +pub fn insert_runtime_check(attr: TokenStream, tokens: TokenStream) -> TokenStream { + rewrite_prusti_attributes(SpecAttributeKind::InsertRuntimeCheck, attr.into(), tokens.into()).into() +} // Ensure that you've also crated a transparent `#[cfg(not(feature = "prusti"))]` // version of your new macro above! diff --git a/prusti-contracts/prusti-contracts/src/lib.rs b/prusti-contracts/prusti-contracts/src/lib.rs index c78d259bf07..07526db2a67 100644 --- a/prusti-contracts/prusti-contracts/src/lib.rs +++ b/prusti-contracts/prusti-contracts/src/lib.rs @@ -70,6 +70,10 @@ pub use prusti_contracts_proc_macros::body_variant; /// runtime checks pub use prusti_contracts_proc_macros::quantifier_runtime_bounds; +/// A macro to annotate contracts that should be checked +/// at runtime +pub use prusti_contracts_proc_macros::insert_runtime_check; + #[cfg(not(feature = "prusti"))] mod private { use core::marker::PhantomData; diff --git a/prusti-contracts/prusti-specs/src/expression_with_attributes.rs b/prusti-contracts/prusti-specs/src/expression_with_attributes.rs new file mode 100644 index 00000000000..d2c9e2a631c --- /dev/null +++ b/prusti-contracts/prusti-specs/src/expression_with_attributes.rs @@ -0,0 +1,52 @@ +use syn::parse::{Parse, ParseStream}; +use proc_macro2::TokenStream; +use quote::quote; + +// By default, attributes can only be attached to +// items like functions or closures. The point of this is +// to allow attaching attributes to the contents of a +// prusti_assert!() or similar. +// In particular, we want to allow: +// `prusti_assert!(#[insert_runtime_check] expr); +pub(crate) struct ExpressionWithAttributes { + pub attributes: Vec, + pub rest: TokenStream, +} + +impl Parse for ExpressionWithAttributes { + fn parse(input: ParseStream) -> syn::Result { + let attributes = input.call(syn::Attribute::parse_outer)?; + let rest: TokenStream = input.parse().unwrap(); + Ok(Self { + attributes, + rest, + }) + } +} + +// maybe we can make this more generic so it can be used in other places.. +impl ExpressionWithAttributes { + pub fn remove_runtime_checks_attr(&mut self) -> Option { + if let Some(pos) = self.attributes.iter().position(|attr|{ + if let Some(ident) = attr.path.get_ident() { + if &ident.to_string() == "insert_runtime_check" { + return true; + } + } + false + }) { + Some(self.attributes.remove(pos)) + } else { + None + } + } + + pub fn tokens(self) -> TokenStream { + let Self { attributes, rest } = self; + let mut attrs: TokenStream = attributes.into_iter().map(|attr| attr.tokens).collect(); + attrs.extend(quote!(#rest)); + attrs + } +} + + diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index f92fd229848..f4c877e6c49 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -23,7 +23,9 @@ mod type_model; mod user_provided_type_params; mod print_counterexample; mod runtime_checks; +mod expression_with_attributes; +use expression_with_attributes::ExpressionWithAttributes; use proc_macro2::{Span, TokenStream, TokenTree}; use quote::{quote, quote_spanned, ToTokens}; use rewriter::AstRewriter; @@ -88,7 +90,8 @@ fn extract_prusti_attributes( | SpecAttributeKind::Terminates | SpecAttributeKind::Trusted | SpecAttributeKind::Predicate - | SpecAttributeKind::Verified => { + | SpecAttributeKind::Verified + | SpecAttributeKind::InsertRuntimeCheck => { assert!(attr.tokens.is_empty(), "Unexpected shape of an attribute."); attr.tokens } @@ -160,12 +163,24 @@ fn generate_spec_and_assertions( let mut generated_items = vec![]; let mut generated_attributes = vec![]; + // are we sure that these are in the same order as they are defined + // in the file? Otherwise our logic for the runtime checks does not work + let mut runtime_check_next = false; + for (attr_kind, attr_tokens) in prusti_attributes.drain(..) { let rewriting_result = match attr_kind { - SpecAttributeKind::Requires => generate_for_requires(attr_tokens, item), - SpecAttributeKind::Ensures => generate_for_ensures(attr_tokens, item), - SpecAttributeKind::AfterExpiry => generate_for_after_expiry(attr_tokens, item), - SpecAttributeKind::AssertOnExpiry => generate_for_assert_on_expiry(attr_tokens, item), + SpecAttributeKind::Requires => { + generate_for_requires(attr_tokens, item, runtime_check_next) + } + SpecAttributeKind::Ensures => { + generate_for_ensures(attr_tokens, item, runtime_check_next) + } + SpecAttributeKind::AfterExpiry => { + generate_for_after_expiry(attr_tokens, item, runtime_check_next) + } + SpecAttributeKind::AssertOnExpiry => { + generate_for_assert_on_expiry(attr_tokens, item, runtime_check_next) + } SpecAttributeKind::Pure => generate_for_pure(attr_tokens, item), SpecAttributeKind::Verified => generate_for_verified(attr_tokens, item), SpecAttributeKind::Terminates => generate_for_terminates(attr_tokens, item), @@ -175,10 +190,18 @@ fn generate_spec_and_assertions( // `check_incompatible_attrs`; so we'll never reach here. SpecAttributeKind::Predicate => unreachable!(), SpecAttributeKind::Invariant => unreachable!(), - SpecAttributeKind::RefineSpec => type_cond_specs::generate(attr_tokens, item), + SpecAttributeKind::RefineSpec => { + type_cond_specs::generate(attr_tokens, item, runtime_check_next) + } SpecAttributeKind::Model => unreachable!(), SpecAttributeKind::PrintCounterexample => unreachable!(), + SpecAttributeKind::InsertRuntimeCheck => { + // generate runtime check functions for the one following this one + runtime_check_next = true; + continue; + } }; + runtime_check_next = false; let (new_items, new_attributes) = rewriting_result?; generated_items.extend(new_items); generated_attributes.extend(new_attributes); @@ -188,37 +211,47 @@ fn generate_spec_and_assertions( } /// Generate spec items and attributes to typecheck the and later retrieve "requires" annotations. -fn generate_for_requires(attr: TokenStream, item: &untyped::AnyFnItem) -> GeneratedResult { +fn generate_for_requires( + attr: TokenStream, + item: &untyped::AnyFnItem, + runtime_check: bool, +) -> GeneratedResult { let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); - let check_id = rewriter.generate_spec_id(); let spec_id_str = spec_id.to_string(); - let check_id_str = check_id.to_string(); let spec_item = rewriter.process_assertion( rewriter::SpecItemType::Precondition, spec_id, attr.clone(), item, )?; - let check_item = - rewriter.create_pre_check(rewriter::SpecItemType::Precondition, check_id, attr, item)?; - Ok(( - vec![spec_item, check_item], - vec![ - parse_quote_spanned! {item.span()=> - #[prusti::pre_spec_id_ref = #spec_id_str] - }, - parse_quote_spanned! {item.span()=> - #[prusti::pre_check_id_ref = #check_id_str] - }, - ], - )) + let mut items = vec![spec_item]; + let mut attrs = vec![parse_quote_spanned! {item.span() => + #[prusti::pre_spec_id_ref = #spec_id_str] + }]; + + if runtime_check { + let check_id = rewriter.generate_spec_id(); + let check_id_str = check_id.to_string(); + let check_item = rewriter.create_pre_check( + rewriter::SpecItemType::Precondition, + check_id, + attr, + item, + )?; + items.push(check_item); + attrs.push(parse_quote_spanned! {item.span() => + #[prusti::pre_check_id_ref = #check_id_str] + }); + } + Ok((items, attrs)) } /// Generate spec items and attributes to typecheck the and later retrieve "ensures" annotations. fn generate_for_ensures( attr: TokenStream, item: &untyped::AnyFnItem, + runtime_check: bool, ) -> GeneratedResult { let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); @@ -230,62 +263,69 @@ fn generate_for_ensures( attr.clone(), item, )?; - // if is_trusted { - // For now we always check postconditions.. later we might exclude some - let check_id = rewriter.generate_spec_id(); - let check_id_str = check_id.to_string(); - // let store_old_item = rewriter.create_store_check_ensures(check_id, attr, item)?; - let check_item = - rewriter.create_post_check(rewriter::SpecItemType::Postcondition, check_id, attr, item)?; - Ok(( - vec![spec_item, check_item], - vec![ - parse_quote_spanned! {item.span()=> - #[prusti::post_spec_id_ref = #spec_id_str] - }, - parse_quote_spanned! {item.span()=> - #[prusti::post_check_id_ref = #check_id_str] - }, - ], - )) + let mut items = vec![spec_item]; + let mut attrs = vec![parse_quote_spanned! {item.span()=> + #[prusti::post_spec_id_ref = #spec_id_str] + }]; + if runtime_check { + // For now we always check postconditions.. later we might exclude some + let check_id = rewriter.generate_spec_id(); + let check_id_str = check_id.to_string(); + // let store_old_item = rewriter.create_store_check_ensures(check_id, attr, item)?; + let check_item = rewriter.create_post_check( + rewriter::SpecItemType::Postcondition, + check_id, + attr, + item, + )?; + items.push(check_item); + attrs.push(parse_quote_spanned! {item.span()=> + #[prusti::post_check_id_ref = #check_id_str] + }); + } + Ok((items, attrs)) } /// Generate spec items and attributes to typecheck and later retrieve "after_expiry" annotations. -fn generate_for_after_expiry(attr: TokenStream, item: &untyped::AnyFnItem) -> GeneratedResult { +fn generate_for_after_expiry( + attr: TokenStream, + item: &untyped::AnyFnItem, + runtime_check: bool, +) -> GeneratedResult { let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); let spec_id_str = spec_id.to_string(); - let check_id = rewriter.generate_spec_id(); - let check_id_str = check_id.to_string(); - let (spec_item, check) = rewriter.process_pledge(spec_id, Some(check_id), attr, item)?; + let spec_item = rewriter.process_pledge(spec_id, attr.clone(), item)?; let mut res_items = vec![spec_item]; let mut res_attrs: Vec = vec![parse_quote_spanned! { item.span() => #[prusti::pledge_spec_id_ref = #spec_id_str] }]; - if let Some(check_items) = check { - let mut check_item_vec = check_items.to_item_vec(); - res_items.append(&mut check_item_vec); + if runtime_check { + let check_id = rewriter.generate_spec_id(); + let check_id_str = check_id.to_string(); + let check_item = rewriter.create_pledge_check(check_id, attr, item)?; + res_items.push(check_item); res_attrs.push(parse_quote_spanned! {item.span() => #[prusti::assert_pledge_check_ref = #check_id_str] - }) + }); } Ok((res_items, res_attrs)) } /// Generate spec items and attributes to typecheck and later retrieve "after_expiry" annotations. -fn generate_for_assert_on_expiry(attr: TokenStream, item: &untyped::AnyFnItem) -> GeneratedResult { +fn generate_for_assert_on_expiry( + attr: TokenStream, + item: &untyped::AnyFnItem, + runtime_check: bool, +) -> GeneratedResult { let mut rewriter = rewriter::AstRewriter::new(); let spec_id_lhs = rewriter.generate_spec_id(); let spec_id_lhs_str = spec_id_lhs.to_string(); let spec_id_rhs = rewriter.generate_spec_id(); let spec_id_rhs_str = spec_id_rhs.to_string(); - // TODO: conditional on runtime checks being enabled - // this is ugly though.. - let check_id = rewriter.generate_spec_id(); - let check_id_str = check_id.to_string(); - let (spec_item_lhs, spec_item_rhs, check_items_opt) = - rewriter.process_assert_pledge(spec_id_lhs, spec_id_rhs, Some(check_id), attr, item)?; + let (spec_item_lhs, spec_item_rhs) = + rewriter.process_assert_pledge(spec_id_lhs, spec_id_rhs, attr.clone(), item)?; let mut res_items = vec![spec_item_lhs, spec_item_rhs]; let mut res_attrs: Vec = vec![ @@ -296,9 +336,14 @@ fn generate_for_assert_on_expiry(attr: TokenStream, item: &untyped::AnyFnItem) - #[prusti::assert_pledge_spec_id_ref_rhs = #spec_id_rhs_str] }, ]; - if let Some(check_items) = check_items_opt { - let mut check_item_vec = check_items.to_item_vec(); - res_items.append(&mut check_item_vec); + + if runtime_check { + // same check_id for both lhs and rhs + let check_id = rewriter.generate_spec_id(); + let check_id_str = check_id.to_string(); + let (lhs_check, rhs_check) = rewriter.create_assert_pledge_check(check_id, attr, item)?; + res_items.push(lhs_check); + res_items.push(rhs_check); res_attrs.push(parse_quote_spanned! {item.span()=> #[prusti::assert_pledge_check_ref = #check_id_str] }); @@ -474,25 +519,18 @@ pub fn body_variant(tokens: TokenStream) -> TokenStream { pub fn body_invariant(tokens: TokenStream) -> TokenStream { let spec = generate_expression_closure(&AstRewriter::process_loop_invariant, tokens.clone()); - let check = - generate_runtime_expression_closure(&AstRewriter::runtime_check_loop_invariant, tokens); - quote! {#spec #check} + quote! {#spec} } pub fn prusti_assertion(tokens: TokenStream) -> TokenStream { let spec = generate_expression_closure(&AstRewriter::process_prusti_assertion, tokens.clone()); - let check = - generate_runtime_expression_closure(&AstRewriter::runtime_check_prusti_assertion, tokens); - let res = quote! {#spec #check}; - println!("result: {}", res); + let res = quote! {#spec}; res } pub fn prusti_assume(tokens: TokenStream) -> TokenStream { let spec = generate_expression_closure(&AstRewriter::process_prusti_assumption, tokens.clone()); - let check = - generate_runtime_expression_closure(&AstRewriter::runtime_check_prusti_assumption, tokens); - quote! {#spec #check} + quote! {#spec} } pub fn prusti_refutation(tokens: TokenStream) -> TokenStream { @@ -505,34 +543,34 @@ fn generate_expression_closure( fun: &dyn Fn(&mut AstRewriter, SpecificationId, TokenStream) -> syn::Result, tokens: TokenStream, ) -> TokenStream { + let mut expr_with_attrs: ExpressionWithAttributes = handle_result!(syn::parse(tokens.into())); + let runtime_attr = expr_with_attrs.remove_runtime_checks_attr(); + let tokens = expr_with_attrs.tokens(); + let prusti_tokens = handle_result!(parse_prusti(tokens)); let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); - let closure = handle_result!(fun(&mut rewriter, spec_id, tokens)); + let closure = handle_result!(fun(&mut rewriter, spec_id, prusti_tokens.clone())); let callsite_span = Span::call_site(); - quote_spanned! {callsite_span=> - #[allow(unused_must_use, unused_variables, unused_braces, unused_parens)] - #[prusti::specs_version = #SPECS_VERSION] - if false { - #closure + let check_id = rewriter.generate_spec_id(); + if runtime_attr.is_some() { + let check_closure = + handle_result!(rewriter.runtime_check_prusti_expression(check_id, prusti_tokens)); + quote_spanned! {callsite_span=> + #[allow(unused_must_use, unused_variables, unused_braces, unused_parens)] + #[prusti::specs_version = #SPECS_VERSION] + if false { + #closure + } else if true { + #check_closure + } } - } -} - -/// Generates the TokenStream encoding an expression using prusti syntax -/// Used for body invariants, assertions, and assumptions -fn generate_runtime_expression_closure( - fun: &dyn Fn(&mut AstRewriter, SpecificationId, TokenStream) -> syn::Result, - tokens: TokenStream, -) -> TokenStream { - let mut rewriter = rewriter::AstRewriter::new(); - let spec_id = rewriter.generate_spec_id(); - - let closure = handle_result!(fun(&mut rewriter, spec_id, tokens)); - let callsite_span = Span::call_site(); - // always must follow a normal expression closure! - quote_spanned! {callsite_span=> - else if true { - #closure + } else { + quote_spanned! {callsite_span=> + #[allow(unused_must_use, unused_variables, unused_braces, unused_parens)] + #[prusti::specs_version = #SPECS_VERSION] + if false { + #closure + } } } } @@ -958,6 +996,7 @@ fn extract_prusti_attributes_for_types( SpecAttributeKind::Invariant => unreachable!("invariant on type"), SpecAttributeKind::Predicate => unreachable!("predicate on type"), SpecAttributeKind::Terminates => unreachable!("terminates on type"), + SpecAttributeKind::InsertRuntimeCheck => unreachable!("runtimecheck on type"), SpecAttributeKind::Trusted | SpecAttributeKind::Model => { assert!(attr.tokens.is_empty(), "Unexpected shape of an attribute."); attr.tokens @@ -1003,6 +1042,7 @@ fn generate_spec_and_assertions_for_types( SpecAttributeKind::Invariant => unreachable!(), SpecAttributeKind::RefineSpec => unreachable!(), SpecAttributeKind::Terminates => unreachable!(), + SpecAttributeKind::InsertRuntimeCheck => unreachable!(), SpecAttributeKind::Trusted => generate_for_trusted_for_types(attr_tokens, item), SpecAttributeKind::Model => generate_for_model(attr_tokens, item), SpecAttributeKind::PrintCounterexample => { diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index f63b741f846..0fa598379d3 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -1,6 +1,6 @@ use crate::{ common::HasSignature, - runtime_checks::translation::{self, translate_runtime_checks, RuntimeFunctions}, + runtime_checks::translation::{self, translate_runtime_checks}, specifications::{ common::{SpecificationId, SpecificationIdGenerator}, preparser::{parse_prusti, parse_prusti_assert_pledge, parse_prusti_pledge}, @@ -9,7 +9,9 @@ use crate::{ }; use proc_macro2::{Span, TokenStream}; use quote::{format_ident, quote, quote_spanned}; -use syn::{parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, Pat, Token, Type}; +use syn::{ + parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, Pat, Token, Type, +}; pub(crate) struct AstRewriter { spec_id_generator: SpecificationIdGenerator, @@ -174,25 +176,29 @@ impl AstRewriter { pub fn process_pledge( &mut self, spec_id: SpecificationId, - check_id_opt: Option, tokens: TokenStream, item: &untyped::AnyFnItem, - ) -> syn::Result<(syn::Item, Option)> { + ) -> syn::Result { let parsed = parse_prusti_pledge(tokens)?; let spec_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id, parsed.clone(), item)?; - let check = if let Some(check_id) = check_id_opt { - Some(translate_runtime_checks( - SpecItemType::Pledge, - check_id, - parsed, - None, - item, - )?) - } else { - None - }; - syn::Result::Ok((spec_item, check)) + syn::Result::Ok(spec_item) + } + + pub fn create_pledge_check( + &mut self, + check_id: SpecificationId, + tokens: TokenStream, + item: &untyped::AnyFnItem, + ) -> syn::Result { + let check = translate_runtime_checks( + SpecItemType::Pledge, + check_id, + parse_prusti(tokens)?, + None, + item, + )?; + syn::Result::Ok(check.check_fn) } pub fn process_pure_refinement( @@ -224,22 +230,30 @@ impl AstRewriter { &mut self, spec_id_lhs: SpecificationId, spec_id_rhs: SpecificationId, - check_id: Option, tokens: TokenStream, item: &untyped::AnyFnItem, - ) -> syn::Result<(syn::Item, syn::Item, Option)> { + ) -> syn::Result<(syn::Item, syn::Item)> { let (lhs, rhs) = parse_prusti_assert_pledge(tokens)?; let lhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_lhs, lhs.clone(), item)?; let rhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_rhs, rhs.clone(), item)?; - if let Some(check_id) = check_id { - let checks = - translate_runtime_checks(SpecItemType::Pledge, check_id, rhs, Some(lhs), item)?; - syn::Result::Ok((lhs_item, rhs_item, Some(checks))) - } else { - syn::Result::Ok((lhs_item, rhs_item, None)) - } + syn::Result::Ok((lhs_item, rhs_item)) + } + + pub fn create_assert_pledge_check( + &mut self, + check_id: SpecificationId, + tokens: TokenStream, + item: &untyped::AnyFnItem, + ) -> syn::Result<(syn::Item, syn::Item)> { + // todo: move parsing out of this function.. + let (lhs, rhs) = parse_prusti_assert_pledge(tokens)?; + let checks = + translate_runtime_checks(SpecItemType::Pledge, check_id, rhs, Some(lhs), item)?; + // make sure that translating ensures check_before_expiry is Some() + // or already throws an error otherwise + syn::Result::Ok((checks.check_before_expiry.unwrap(), checks.check_fn)) } /// Parse a loop invariant into a Rust expression @@ -271,14 +285,6 @@ impl AstRewriter { self.process_prusti_expression(quote! {loop_body_invariant_spec}, spec_id, tokens) } - pub fn runtime_check_loop_invariant( - &mut self, - spec_id: SpecificationId, - tokens: TokenStream, - ) -> syn::Result { - self.runtime_check_prusti_expression(spec_id, tokens) - } - /// Parse a prusti assertion into a Rust expression pub fn process_prusti_assertion( &mut self, @@ -288,14 +294,6 @@ impl AstRewriter { self.process_prusti_expression(quote! {prusti_assertion}, spec_id, tokens) } - pub fn runtime_check_prusti_assertion( - &mut self, - check_id: SpecificationId, - tokens: TokenStream, - ) -> syn::Result { - self.runtime_check_prusti_expression(check_id, tokens) - } - /// Parse a prusti assumption into a Rust expression pub fn process_prusti_assumption( &mut self, @@ -305,14 +303,6 @@ impl AstRewriter { self.process_prusti_expression(quote! {prusti_assumption}, spec_id, tokens) } - pub fn runtime_check_prusti_assumption( - &mut self, - check_id: SpecificationId, - tokens: TokenStream, - ) -> syn::Result { - self.runtime_check_prusti_expression(check_id, tokens) - } - /// Parse a prusti refute into a Rust expression pub fn process_prusti_refutation( &mut self, @@ -326,9 +316,8 @@ impl AstRewriter { &mut self, kind: TokenStream, spec_id: SpecificationId, - tokens: TokenStream, + expr: TokenStream, ) -> syn::Result { - let expr = parse_prusti(tokens)?; let spec_id_str = spec_id.to_string(); Ok(quote_spanned! {expr.span()=> { @@ -342,17 +331,22 @@ impl AstRewriter { }) } - fn runtime_check_prusti_expression( + pub fn runtime_check_prusti_expression( &mut self, spec_id: SpecificationId, tokens: TokenStream, ) -> syn::Result { - let prusti_tokens = parse_prusti(tokens)?; + // this unwrap cannot fail because it's the second time we parse it. + // TODO: Move this parse_prusti outside of this function! let spec_id_str = spec_id.to_string(); - let expr_translated = translation::translate_expression_runtime(prusti_tokens.clone()); + let span = tokens.span(); + // try to get source text. If that fails just take the original tokens + let expr_str = span.source_text().unwrap_or_else(|| tokens.to_string()); + let failure_message = format!("Assertion {expr_str} failed"); + let expr_translated = translation::translate_expression_runtime(tokens); // make an empty closure first, to mark the block as a spec block // then assert the expression - Ok(quote_spanned! {prusti_tokens.span()=> + Ok(quote_spanned! {span => { // an unused closure simply to mark this block(s) as specification // so they are not encoded by prusti @@ -363,7 +357,9 @@ impl AstRewriter { || -> bool { true }; - assert!(#expr_translated); + if !(#expr_translated) { + panic!(#failure_message); + } } }) } diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 6125468c437..1855ed27432 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -33,21 +33,6 @@ pub struct RuntimeFunctions { pub check_before_expiry: Option, } -impl RuntimeFunctions { - /// consumes self, and returns vector of items - pub fn to_item_vec(&self) -> Vec { - let RuntimeFunctions { - check_fn, - check_before_expiry, - } = self; - let mut res = vec![check_fn.clone()]; - if let Some(check_before_expiry) = check_before_expiry { - res.push(check_before_expiry.clone()); - } - res - } -} - /// Generates a bunch of functions that can be used to check specifications /// at runtime. pub fn translate_runtime_checks( diff --git a/prusti-contracts/prusti-specs/src/spec_attribute_kind.rs b/prusti-contracts/prusti-specs/src/spec_attribute_kind.rs index f286cbd317b..4e1206f3ad0 100644 --- a/prusti-contracts/prusti-specs/src/spec_attribute_kind.rs +++ b/prusti-contracts/prusti-specs/src/spec_attribute_kind.rs @@ -18,6 +18,7 @@ pub enum SpecAttributeKind { Terminates = 10, PrintCounterexample = 11, Verified = 12, + InsertRuntimeCheck = 13, } impl TryFrom for SpecAttributeKind { @@ -37,6 +38,7 @@ impl TryFrom for SpecAttributeKind { "model" => Ok(SpecAttributeKind::Model), "print_counterexample" => Ok(SpecAttributeKind::PrintCounterexample), "verified" => Ok(SpecAttributeKind::Verified), + "insert_runtime_check" => Ok(SpecAttributeKind::InsertRuntimeCheck), _ => Err(name), } } diff --git a/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs b/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs index b11d9e26aed..be6ead305ce 100644 --- a/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs +++ b/prusti-contracts/prusti-specs/src/type_cond_specs/mod.rs @@ -5,7 +5,11 @@ use crate::{ use proc_macro2::TokenStream; use syn::{parse_quote_spanned, spanned::Spanned}; -pub fn generate(attr: TokenStream, item: &untyped::AnyFnItem) -> GeneratedResult { +pub fn generate( + attr: TokenStream, + item: &untyped::AnyFnItem, + runtime_check: bool, +) -> GeneratedResult { let tokens_span = attr.span(); // Parse type-conditional spec refinements information @@ -16,9 +20,9 @@ pub fn generate(attr: TokenStream, item: &untyped::AnyFnItem) -> GeneratedResult for nested_spec in type_cond_spec.specs { let (mut generated_items, generated_attrs) = match nested_spec { - NestedSpec::Ensures(tokens) => generate_for_ensures(tokens, item)?, + NestedSpec::Ensures(tokens) => generate_for_ensures(tokens, item, runtime_check)?, // is_trusted argument above is true because spec-refinements are always trusted - NestedSpec::Requires(tokens) => generate_for_requires(tokens, item)?, + NestedSpec::Requires(tokens) => generate_for_requires(tokens, item, runtime_check)?, NestedSpec::Pure => generate_for_pure_refinements(item)?, }; diff --git a/prusti-tests/Cargo.toml b/prusti-tests/Cargo.toml index 469ffdea1bc..3c5ae2a7673 100644 --- a/prusti-tests/Cargo.toml +++ b/prusti-tests/Cargo.toml @@ -13,8 +13,6 @@ cargo-test-support = { git = "https://github.com/rust-lang/cargo.git", rev = "ec ureq = "2.1" log = { version = "0.4", features = ["release_max_level_info"] } env_logger = "0.10" -ui_test = "0.11.7" -tempfile = "3.6.0" [package.metadata.rust-analyzer] # This crate uses #[feature(rustc_private)] diff --git a/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs b/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs index 0f3b2fe4816..652f9def4d3 100644 --- a/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs +++ b/prusti-viper/src/encoder/mir/pure/interpreter/interpreter_poly.rs @@ -430,7 +430,6 @@ impl<'p, 'v: 'p, 'tcx: 'v> BackwardMirInterpreter<'tcx> match full_func_proc_name { "prusti_contracts::old" => { assert_eq!(args.len(), 1); - println!("encoded arg of old: {:?}", encoded_args[0]); // Return an error for unsupported old(..) types diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index e93eb0ea978..b8d0dc9b8ce 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -12,7 +12,7 @@ use prusti_rustc_interface::{ driver::Compilation, hir::def::DefKind, index::IndexVec, - interface::{interface::Compiler, Config, Queries}, + interface::{interface::Compiler, Config, Queries, DEFAULT_QUERY_PROVIDERS}, middle::{ mir::{self, BorrowCheckResult, MirPass, START_BLOCK}, query::{ExternProviders, Providers}, @@ -68,16 +68,13 @@ fn mir_promoted<'tcx>( ) { let original_mir_promoted = prusti_rustc_interface::interface::DEFAULT_QUERY_PROVIDERS.mir_promoted; - let (body_steal, promoted_steal) = original_mir_promoted(tcx, def_id); - // is there still a reason to steal it if we don't modify it? - let body = body_steal.steal(); - + let result = original_mir_promoted(tcx, def_id); // SAFETY: This is safe because we are feeding in the same `tcx` that is // going to be used as a witness when pulling out the data. unsafe { - mir_storage::store_promoted_mir_body(tcx, def_id, body.clone()); + mir_storage::store_promoted_mir_body(tcx, def_id, result.0.borrow().clone()); } - (tcx.alloc_steal_mir(body), promoted_steal) + result } // a copy of the rust compilers implementation of this query + @@ -87,14 +84,14 @@ fn mir_promoted<'tcx>( pub(crate) fn mir_drops_elaborated(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal> { // run verification here, otherwise we can't rely on results in // drops elaborated - if !config::no_verify() { - if !globals::verified() { - println!("Starting Verification"); - let (def_spec, env) = get_specs(tcx, None); - let env = verify(env, def_spec.clone()); - globals::set_verified(); - globals::store_spec_env(def_spec, env); - } + if config::no_verify() { + return (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def); + } + if !globals::verified() { + let (def_spec, env) = get_specs(tcx, None); + let env = verify(env, def_spec.clone()); + globals::set_verified(); + globals::store_spec_env(def_spec, env); } // original compiler code diff --git a/prusti/src/modify_mir/passes/insert_postconditions.rs b/prusti/src/modify_mir/passes/insert_postconditions.rs index 574437ed84d..a84418799ac 100644 --- a/prusti/src/modify_mir/passes/insert_postconditions.rs +++ b/prusti/src/modify_mir/passes/insert_postconditions.rs @@ -104,7 +104,6 @@ impl<'tcx, 'a> PostconditionInserter<'tcx, 'a> { }, ); - println!("chain starting at: {:?}", chain_start); // make the original caller_block point to the first clone block // after separate_terminator_from_block this is a goto so we don't break // anything From 351e9fac057c1be6bd88d0cc56ce6fb6d437680d Mon Sep 17 00:00:00 2001 From: cedihegi Date: Sat, 26 Aug 2023 18:20:00 +0200 Subject: [PATCH 31/45] Fix tests, add option to always insert runtime checks --- prusti-contracts/prusti-contracts/src/lib.rs | 2 +- prusti-contracts/prusti-specs/src/lib.rs | 15 +++--- prusti-contracts/prusti-specs/src/rewriter.rs | 2 +- .../src/runtime_checks/translation.rs | 4 +- prusti-utils/src/config.rs | 19 ++++++- prusti/src/callbacks.rs | 53 +++++++++++-------- 6 files changed, 59 insertions(+), 36 deletions(-) diff --git a/prusti-contracts/prusti-contracts/src/lib.rs b/prusti-contracts/prusti-contracts/src/lib.rs index 07526db2a67..e57af536fcf 100644 --- a/prusti-contracts/prusti-contracts/src/lib.rs +++ b/prusti-contracts/prusti-contracts/src/lib.rs @@ -1,4 +1,4 @@ -// #![no_std] +//#![no_std] /// A macro for writing a precondition on a function. pub use prusti_contracts_proc_macros::requires; diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index 20a044f4525..7b45eccb160 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -168,20 +168,19 @@ fn generate_spec_and_assertions( // are we sure that these are in the same order as they are defined // in the file? Otherwise our logic for the runtime checks does not work let mut runtime_check_next = false; + let runtime_check_always = + std::env::var("PRUSTI_RUNTIME_CHECK_ALL_CONTRACTS").map_or(false, |s| s == "true"); for (attr_kind, attr_tokens) in prusti_attributes.drain(..) { + let runtime_check = runtime_check_next || runtime_check_always; let rewriting_result = match attr_kind { - SpecAttributeKind::Requires => { - generate_for_requires(attr_tokens, item, runtime_check_next) - } - SpecAttributeKind::Ensures => { - generate_for_ensures(attr_tokens, item, runtime_check_next) - } + SpecAttributeKind::Requires => generate_for_requires(attr_tokens, item, runtime_check), + SpecAttributeKind::Ensures => generate_for_ensures(attr_tokens, item, runtime_check), SpecAttributeKind::AfterExpiry => { - generate_for_after_expiry(attr_tokens, item, runtime_check_next) + generate_for_after_expiry(attr_tokens, item, runtime_check) } SpecAttributeKind::AssertOnExpiry => { - generate_for_assert_on_expiry(attr_tokens, item, runtime_check_next) + generate_for_assert_on_expiry(attr_tokens, item, runtime_check) } SpecAttributeKind::Pure => generate_for_pure(attr_tokens, item), SpecAttributeKind::Verified => generate_for_verified(attr_tokens, item), diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index 0fa598379d3..04e3b74f669 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -358,7 +358,7 @@ impl AstRewriter { true }; if !(#expr_translated) { - panic!(#failure_message); + ::core::panic!(#failure_message); } } }) diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 1855ed27432..43aace8f86c 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -187,7 +187,7 @@ impl CheckTranslator { println!("check function {} is performed", #item_name_str); if !(#expr_to_check) { #forget_statements - panic!(#failure_message) + ::core::panic!(#failure_message) }; // now forget about all the values since they are still owned // by the calling function @@ -282,7 +282,7 @@ impl CheckTranslator { let name: TokenStream = arg.name.parse().unwrap(); if !arg.is_ref { stmts.push(parse_quote! { - std::mem::forget(#name); + ::core::mem::forget(#name); }) } } diff --git a/prusti-utils/src/config.rs b/prusti-utils/src/config.rs index 90b0c03c24f..f4e134e8da6 100644 --- a/prusti-utils/src/config.rs +++ b/prusti-utils/src/config.rs @@ -147,6 +147,8 @@ lazy_static::lazy_static! { settings.set_default("cargo_command", "check").unwrap(); settings.set_default("insert_runtime_checks", "false").unwrap(); + settings.set_default("debug_runtime_checks", "false").unwrap(); + settings.set_default("runtime_check_all_contracts", "false").unwrap(); settings.set_default("remove_dead_code", "false").unwrap(); // Flags for testing. @@ -1034,11 +1036,26 @@ pub fn num_errors_per_function() -> u32 { read_setting("num_errors_per_function") } -/// When enabled, insert runtime checks into generated executables. +/// When enabled, insert runtime checks into generated executables +/// for methods marked with #[insert_runtime_check] pub fn insert_runtime_checks() -> bool { read_setting("insert_runtime_checks") } +/// When enabled, runtime check will print messages to stdout +/// when they are executed. Used to check that they are +/// properly inserted / performed +pub fn debug_runtime_checks() -> bool { + read_setting("debug_runtime_checks") +} + +/// When enabled, instead of having to mark every method with +/// #[insert_runtime_check] for it to be checked at runtime, +/// simply try to check all contracts at runtime +pub fn runtime_check_all_contracts() -> bool { + read_setting("runtime_check_all_contracts") +} + /// Try to use verification to identify unused blocks and eliminate them pub fn remove_dead_code() -> bool { read_setting("remove_dead_code") diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index 16fc7ba8988..23cfd731a79 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -10,7 +10,7 @@ use prusti_rustc_interface::{ borrowck::consumers, data_structures::steal::Steal, driver::Compilation, - hir::def::DefKind, + hir::{self, def::DefKind}, index::IndexVec, interface::{interface::Compiler, Config, Queries, DEFAULT_QUERY_PROVIDERS}, middle::{ @@ -19,10 +19,11 @@ use prusti_rustc_interface::{ ty::{self, TyCtxt, TypeVisitableExt}, }, mir_transform::{self, inline}, - span::def_id::{LocalDefId, LOCAL_CRATE}, - trait_selection::traits, session::{EarlyErrorHandler, Session}, + span::def_id::{DefId, LocalDefId, LOCAL_CRATE}, + trait_selection::traits, }; +use rustc_hash::FxHashSet; #[derive(Default)] pub struct PrustiCompilerCalls; @@ -84,16 +85,23 @@ fn mir_promoted<'tcx>( pub(crate) fn mir_drops_elaborated(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal> { // run verification here, otherwise we can't rely on results in // drops elaborated - if config::no_verify() { - return (DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked)(tcx, def); - } + // make sure mir was constructed let def_id = def.to_def_id(); + let default_query = DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked; + if config::no_verify() || !is_non_const_function(tcx, def_id) { + return default_query(tcx, def); + } if !globals::verified(def_id.krate) { - let (def_spec, env) = get_specs(tcx, None); - println!("Starting Verification"); - let env = verify(env, def_spec.clone()); globals::set_verified(def_id.krate); - globals::store_spec_env(def_spec, env); + // make sure mir_promoted was created. Usually this is the case + // but in some testcases it wasn't + if let Ok((def_spec, env)) = get_specs(tcx, None) { + let env = verify(env, def_spec.clone()); + globals::store_spec_env(def_spec, env); + } else { + // dont continue verification + return default_query(tcx, def); + } } // original compiler code @@ -229,7 +237,8 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { compiler.session().abort_if_errors(); queries.global_ctxt().unwrap().enter(|tcx| { if !globals::verified(LOCAL_CRATE) { - let (def_spec, env) = get_specs(tcx, Some(compiler)); + // already stops if we had an error + let (def_spec, env) = get_specs(tcx, Some(compiler)).unwrap(); if !config::no_verify() { let env = verify(env, def_spec.clone()); @@ -248,25 +257,23 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { } } +fn is_non_const_function(tcx: TyCtxt<'_>, def_id: DefId) -> bool { + matches!(tcx.def_kind(def_id), DefKind::Fn | DefKind::AssocFn) + && !tcx.is_const_fn(def_id) +} + pub fn get_specs<'tcx>( tcx: TyCtxt<'tcx>, compiler_opt: Option<&Compiler>, -) -> (DefSpecificationMap, Environment<'tcx>) { +) -> Result<(DefSpecificationMap, Environment<'tcx>), ()> { let mut env = Environment::new(tcx, env!("CARGO_PKG_VERSION")); - // when get_specs is first called from an overriden query - // (as is the case for runtime checks), we don't have - // access to the compiler, so for now we just skip the - // checking then + let spec_checker = specs::checker::SpecChecker::new(); + spec_checker.check(&env); if let Some(compiler) = compiler_opt { - let spec_checker = specs::checker::SpecChecker::new(); - spec_checker.check(&env); compiler.session().abort_if_errors(); } else if env.diagnostic.has_errors() { - // TODO: still give some sensible error? - // Does it make a difference if we show the errors - // once get_specs returns in callbacks? - panic!("Spec checking caused errors. No good error message because runtime checks are enabled. This is a TODO"); + return Err(()); } let hir = env.query.hir(); let mut spec_collector = specs::SpecCollector::new(&mut env); @@ -279,5 +286,5 @@ pub fn get_specs<'tcx>( } } CrossCrateSpecs::import_export_cross_crate(&mut env, &mut def_spec); - (def_spec, env) + Ok((def_spec, env)) } From be5482caaeec28aed3ff6ab9fa858cd0b4b22658 Mon Sep 17 00:00:00 2001 From: cedric Date: Mon, 28 Aug 2023 19:38:50 +0200 Subject: [PATCH 32/45] Add flags for runtime checks debugging --- prusti-contracts/prusti-contracts/src/lib.rs | 12 ++++++++++++ .../src/runtime_checks/translation.rs | 16 ++++++++++++++-- prusti-launch/src/bin/cargo-prusti.rs | 3 +++ prusti/src/driver.rs | 9 +++++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/prusti-contracts/prusti-contracts/src/lib.rs b/prusti-contracts/prusti-contracts/src/lib.rs index e57af536fcf..9cd624e0d8e 100644 --- a/prusti-contracts/prusti-contracts/src/lib.rs +++ b/prusti-contracts/prusti-contracts/src/lib.rs @@ -333,6 +333,18 @@ mod private { panic!() } } + + // A function used for getting more precise error + // messages for failing runtime checks + fn check_expr(x: bool, message: &mut &str) -> bool { + if !x { + // extend the error message with more precise + // information about the violation + false + } else { + true + } + } } /// This function is used to evaluate an expression in the context just diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 43aace8f86c..b102f4f2103 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -8,7 +8,7 @@ use crate::{ specifications::{common::SpecificationId, untyped}, }; use proc_macro2::{Span, TokenStream}; -use quote::{quote, ToTokens}; +use quote::{quote, quote_spanned, ToTokens}; use rustc_hash::{FxHashMap, FxHashSet}; use syn::{parse_quote, parse_quote_spanned, spanned::Spanned, visit_mut::VisitMut, Expr, FnArg}; @@ -179,12 +179,24 @@ impl CheckTranslator { } }; + let debug_print_stmt: TokenStream = if let Ok(value) = std::env::var("PRUSTI_DEBUG_RUNTIME_CHECKS") { + if value == "true" { + quote_spanned! {item.span() => + println!("check function {} is performed", #item_name_str); + } + } else { + TokenStream::new() + } + } else { + TokenStream::new() + }; + let mut check_item: syn::ItemFn = parse_quote_spanned! {item.span() => #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] #[prusti::spec_only] #id_attr fn #item_name() { - println!("check function {} is performed", #item_name_str); + #debug_print_stmt if !(#expr_to_check) { #forget_statements ::core::panic!(#failure_message) diff --git a/prusti-launch/src/bin/cargo-prusti.rs b/prusti-launch/src/bin/cargo-prusti.rs index d3ebce4ea57..aa643249d86 100644 --- a/prusti-launch/src/bin/cargo-prusti.rs +++ b/prusti-launch/src/bin/cargo-prusti.rs @@ -58,6 +58,9 @@ where "PRUSTI_NO_VERIFY_DEPS", config::no_verify_deps().to_string(), ) + // flags that influence ast rewriting + .env("PRUSTI_DEBUG_RUNTIME_CHECKS", config::debug_runtime_checks().to_string()) + .env("PRUSTI_RUNTIME_CHECK_ALL_CONTRACTS", config::debug_runtime_checks().to_string()) // Category A* flags: .env("DEFAULT_PRUSTI_QUIET", "true") .env("DEFAULT_PRUSTI_FULL_COMPILATION", "true") diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index dca82f7e584..983cf2d9d6c 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -189,6 +189,15 @@ fn main() { )); } + // these flags influence the behavior of the ast rewriter, where we can't use config + // (or can we?) + if config::debug_runtime_checks() { + std::env::set_var("PRUSTI_DEBUG_RUNTIME_CHECKS", "true"); + } + if config::runtime_check_all_contracts() { + std::env::set_var("PRUSTI_RUNTIME_CHECK_ALL_CONTRACTS", "true"); + } + let mut callbacks = PrustiCompilerCalls; driver::RunCompiler::new(&rustc_args, &mut callbacks).run() From 294884bbb0c58536770950c07e0378f10596f1c1 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Wed, 30 Aug 2023 15:16:58 +0200 Subject: [PATCH 33/45] Extend error reporting of runtime checks --- prusti-contracts/prusti-contracts/src/lib.rs | 21 +- .../src/runtime_check_internals.rs | 73 ++ prusti-contracts/prusti-specs/src/lib.rs | 34 +- prusti-contracts/prusti-specs/src/rewriter.rs | 88 +- .../associated_function_info.rs | 111 +++ .../src/runtime_checks/boundary_extraction.rs | 123 +-- .../src/runtime_checks/check_type.rs | 93 ++- .../prusti-specs/src/runtime_checks/mod.rs | 3 + .../src/runtime_checks/quantifiers.rs | 117 +++ .../src/runtime_checks/translation.rs | 762 +++++------------- .../src/runtime_checks/visitor.rs | 189 +++++ .../src/specifications/preparser.rs | 25 +- .../tests/verify/ui/forall_verify.stderr | 2 +- prusti-viper/src/verifier.rs | 8 +- prusti/src/callbacks.rs | 3 +- .../src/modify_mir/passes/remove_dead_code.rs | 2 +- 16 files changed, 916 insertions(+), 738 deletions(-) create mode 100644 prusti-contracts/prusti-contracts/src/runtime_check_internals.rs create mode 100644 prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs create mode 100644 prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs create mode 100644 prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs diff --git a/prusti-contracts/prusti-contracts/src/lib.rs b/prusti-contracts/prusti-contracts/src/lib.rs index 9cd624e0d8e..812142ef212 100644 --- a/prusti-contracts/prusti-contracts/src/lib.rs +++ b/prusti-contracts/prusti-contracts/src/lib.rs @@ -1,4 +1,4 @@ -//#![no_std] +#![no_std] /// A macro for writing a precondition on a function. pub use prusti_contracts_proc_macros::requires; @@ -127,11 +127,18 @@ mod private { pub struct Ghost { _phantom: PhantomData, } + + pub fn check_expr(expr: bool, added_info: &str, buffer: &mut [u8], buffer_len: &mut usize) -> bool { + true + } } #[cfg(feature = "prusti")] pub mod core_spec; +#[cfg(feature = "prusti")] +pub mod runtime_check_internals; + #[cfg(feature = "prusti")] mod private { use core::{marker::PhantomData, ops::*}; @@ -333,18 +340,6 @@ mod private { panic!() } } - - // A function used for getting more precise error - // messages for failing runtime checks - fn check_expr(x: bool, message: &mut &str) -> bool { - if !x { - // extend the error message with more precise - // information about the violation - false - } else { - true - } - } } /// This function is used to evaluate an expression in the context just diff --git a/prusti-contracts/prusti-contracts/src/runtime_check_internals.rs b/prusti-contracts/prusti-contracts/src/runtime_check_internals.rs new file mode 100644 index 00000000000..5db0888c401 --- /dev/null +++ b/prusti-contracts/prusti-contracts/src/runtime_check_internals.rs @@ -0,0 +1,73 @@ +use core::fmt::Write; + +struct SimpleFormatter<'a>(&'a mut [u8], usize); + +impl<'a> core::fmt::Write for SimpleFormatter<'a> { + fn write_str(&mut self, s: &str) -> core::fmt::Result { + let dest_len = self.0.len(); + let copy_len = core::cmp::min(s.len(), dest_len); + + self.0[..copy_len].copy_from_slice(&s.as_bytes()[..copy_len]); + self.1 = copy_len; + + if s.len() > dest_len { + Err(core::fmt::Error) + } else { + Ok(()) + } + } +} + +pub fn num_to_str(n: T, buffer: &mut [u8]) -> &str { + let mut formatter = SimpleFormatter(buffer, 0); + write!(&mut formatter, "{}", n).expect("Failed to write number to buffer"); + let bytes_written = formatter.1; + core::str::from_utf8(&buffer[..bytes_written]).unwrap() +} +// pub fn num_to_str(mut n: T, buffer: &mut [u8;64]) -> &str +// where +// T: PartialEq +// + PartialOrd +// + core::ops::Rem +// + core::ops::Div +// + core::ops::Sub +// + Copy, +// { +// let length = 0; +// if n == 0 { +// return "0" +// } +// let mut is_negative = false; +// if n < T::from(0) { +// is_negative = true; +// n = T::from(0)-n; +// } +// let mut index = 63; +// while n > T::from(0) { +// let remainder: T = n % T::from(10); +// buffer[index] = b'0' + (remainder as u8); +// n = n / T::from(10); +// index -= 1; +// } +// if is_negative { +// buffer[index] = b'-'; +// } else { +// index += 1; +// } +// core::str::from_utf8(&buffer[index..]).unwrap() +// } +// An internal function used for getting more precise error messages for runtime +// checks. +// Buffer manipulations because we cannot use std and don't wanna introduce +// new dependencies. +pub fn check_expr(expr: bool, added_info: &str, buffer: &mut [u8], buffer_len: &mut usize) -> bool { + if !expr { + // buffer already has contents up until buffer_len + let after_len = *buffer_len + added_info.len(); + buffer[*buffer_len..after_len].copy_from_slice(added_info.as_bytes()); + *buffer_len = after_len; + false + } else { + true + } +} diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index 7b45eccb160..d3c4091cef2 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -29,13 +29,14 @@ use expression_with_attributes::ExpressionWithAttributes; use proc_macro2::{Span, TokenStream, TokenTree}; use quote::{quote, quote_spanned, ToTokens}; use rewriter::AstRewriter; +use runtime_checks::check_type::CheckItemType; use std::convert::TryInto; use syn::{spanned::Spanned, visit::Visit}; use crate::{ common::{merge_generics, RewritableReceiver, SelfTypeRewriter}, predicate::{is_predicate_macro, ParsedPredicate}, - specifications::preparser::{parse_prusti, parse_type_cond_spec, NestedSpec}, + specifications::preparser::{parse_prusti, parse_type_cond_spec, NestedSpec}, runtime_checks::translation, }; pub use extern_spec_rewriter::ExternSpecKind; use parse_closure_macro::ClosureWithSpec; @@ -235,7 +236,6 @@ fn generate_for_requires( let check_id = rewriter.generate_spec_id(); let check_id_str = check_id.to_string(); let check_item = rewriter.create_pre_check( - rewriter::SpecItemType::Precondition, check_id, attr, item, @@ -274,7 +274,6 @@ fn generate_for_ensures( let check_id_str = check_id.to_string(); // let store_old_item = rewriter.create_store_check_ensures(check_id, attr, item)?; let check_item = rewriter.create_post_check( - rewriter::SpecItemType::Postcondition, check_id, attr, item, @@ -515,27 +514,35 @@ fn generate_for_trusted_for_types(attr: TokenStream, item: &syn::DeriveInput) -> } pub fn body_variant(tokens: TokenStream) -> TokenStream { - generate_expression_closure(&AstRewriter::process_loop_variant, tokens) + generate_expression_closure( + &AstRewriter::process_loop_variant, + tokens, + CheckItemType::Unchecked, + ) } pub fn body_invariant(tokens: TokenStream) -> TokenStream { - let spec = generate_expression_closure(&AstRewriter::process_loop_invariant, tokens.clone()); - quote! {#spec} + generate_expression_closure( + &AstRewriter::process_loop_invariant, + tokens.clone(), + CheckItemType::BodyInvariant, + ) } pub fn prusti_assertion(tokens: TokenStream) -> TokenStream { - let spec = generate_expression_closure(&AstRewriter::process_prusti_assertion, tokens.clone()); - let res = quote! {#spec}; - res + generate_expression_closure( + &AstRewriter::process_prusti_assertion, + tokens.clone(), + CheckItemType::Assert, + ) } pub fn prusti_assume(tokens: TokenStream) -> TokenStream { - let spec = generate_expression_closure(&AstRewriter::process_prusti_assumption, tokens.clone()); - quote! {#spec} + generate_expression_closure(&AstRewriter::process_prusti_assumption, tokens.clone(), CheckItemType::Assume) } pub fn prusti_refutation(tokens: TokenStream) -> TokenStream { - generate_expression_closure(&AstRewriter::process_prusti_refutation, tokens) + generate_expression_closure(&AstRewriter::process_prusti_refutation, tokens, CheckItemType::Unchecked) } /// Generates the TokenStream encoding an expression using prusti syntax @@ -543,6 +550,7 @@ pub fn prusti_refutation(tokens: TokenStream) -> TokenStream { fn generate_expression_closure( fun: &dyn Fn(&mut AstRewriter, SpecificationId, TokenStream) -> syn::Result, tokens: TokenStream, + check_type: CheckItemType, ) -> TokenStream { let mut expr_with_attrs: ExpressionWithAttributes = handle_result!(syn::parse(tokens.into())); let runtime_attr = expr_with_attrs.remove_runtime_checks_attr(); @@ -555,7 +563,7 @@ fn generate_expression_closure( let check_id = rewriter.generate_spec_id(); if runtime_attr.is_some() { let check_closure = - handle_result!(rewriter.runtime_check_prusti_expression(check_id, prusti_tokens)); + handle_result!(translation::translate_expression_runtime(prusti_tokens, check_id, check_type)); quote_spanned! {callsite_span=> #[allow(unused_must_use, unused_variables, unused_braces, unused_parens)] #[prusti::specs_version = #SPECS_VERSION] diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index 04e3b74f669..7a6dfedb00b 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -1,6 +1,9 @@ use crate::{ common::HasSignature, - runtime_checks::translation::{self, translate_runtime_checks}, + runtime_checks::{ + check_type::CheckItemType, + translation::{translate_runtime_checks}, + }, specifications::{ common::{SpecificationId, SpecificationIdGenerator}, preparser::{parse_prusti, parse_prusti_assert_pledge, parse_prusti_pledge}, @@ -9,9 +12,7 @@ use crate::{ }; use proc_macro2::{Span, TokenStream}; use quote::{format_ident, quote, quote_spanned}; -use syn::{ - parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, Pat, Token, Type, -}; +use syn::{parse_quote_spanned, punctuated::Punctuated, spanned::Spanned, Pat, Token, Type}; pub(crate) struct AstRewriter { spec_id_generator: SpecificationIdGenerator, @@ -151,25 +152,30 @@ impl AstRewriter { pub fn create_pre_check( &mut self, - spec_type: SpecItemType, check_id: SpecificationId, tokens: TokenStream, item: &untyped::AnyFnItem, ) -> syn::Result { - let res = translate_runtime_checks(spec_type, check_id, parse_prusti(tokens)?, None, item)?; - // precondition will only have check_fn - syn::Result::Ok(res.check_fn) + translate_runtime_checks( + CheckItemType::Requires, + check_id, + parse_prusti(tokens)?, + item, + ) } pub fn create_post_check( &mut self, - spec_type: SpecItemType, check_id: SpecificationId, tokens: TokenStream, item: &untyped::AnyFnItem, ) -> syn::Result { - let res = translate_runtime_checks(spec_type, check_id, parse_prusti(tokens)?, None, item)?; - syn::Result::Ok(res.check_fn) + translate_runtime_checks( + CheckItemType::Ensures, + check_id, + parse_prusti(tokens)?, + item, + ) } /// Parse a pledge with lhs into a Rust expression @@ -191,14 +197,12 @@ impl AstRewriter { tokens: TokenStream, item: &untyped::AnyFnItem, ) -> syn::Result { - let check = translate_runtime_checks( - SpecItemType::Pledge, + translate_runtime_checks( + CheckItemType::PledgeRhs { has_lhs: false }, check_id, parse_prusti(tokens)?, - None, item, - )?; - syn::Result::Ok(check.check_fn) + ) } pub fn process_pure_refinement( @@ -234,10 +238,8 @@ impl AstRewriter { item: &untyped::AnyFnItem, ) -> syn::Result<(syn::Item, syn::Item)> { let (lhs, rhs) = parse_prusti_assert_pledge(tokens)?; - let lhs_item = - self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_lhs, lhs.clone(), item)?; - let rhs_item = - self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_rhs, rhs.clone(), item)?; + let lhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_lhs, lhs, item)?; + let rhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_rhs, rhs, item)?; syn::Result::Ok((lhs_item, rhs_item)) } @@ -249,11 +251,14 @@ impl AstRewriter { ) -> syn::Result<(syn::Item, syn::Item)> { // todo: move parsing out of this function.. let (lhs, rhs) = parse_prusti_assert_pledge(tokens)?; - let checks = - translate_runtime_checks(SpecItemType::Pledge, check_id, rhs, Some(lhs), item)?; - // make sure that translating ensures check_before_expiry is Some() - // or already throws an error otherwise - syn::Result::Ok((checks.check_before_expiry.unwrap(), checks.check_fn)) + let lhs_check = translate_runtime_checks(CheckItemType::PledgeLhs, check_id, lhs, item)?; + let rhs_check = translate_runtime_checks( + CheckItemType::PledgeRhs { has_lhs: true }, + check_id, + rhs, + item, + )?; + syn::Result::Ok((lhs_check, rhs_check)) } /// Parse a loop invariant into a Rust expression @@ -331,39 +336,6 @@ impl AstRewriter { }) } - pub fn runtime_check_prusti_expression( - &mut self, - spec_id: SpecificationId, - tokens: TokenStream, - ) -> syn::Result { - // this unwrap cannot fail because it's the second time we parse it. - // TODO: Move this parse_prusti outside of this function! - let spec_id_str = spec_id.to_string(); - let span = tokens.span(); - // try to get source text. If that fails just take the original tokens - let expr_str = span.source_text().unwrap_or_else(|| tokens.to_string()); - let failure_message = format!("Assertion {expr_str} failed"); - let expr_translated = translation::translate_expression_runtime(tokens); - // make an empty closure first, to mark the block as a spec block - // then assert the expression - Ok(quote_spanned! {span => - { - // an unused closure simply to mark this block(s) as specification - // so they are not encoded by prusti - #[prusti::check_only] - #[prusti::spec_only] - #[prusti::runtime_assertion] - #[prusti::check_id = #spec_id_str] - || -> bool { - true - }; - if !(#expr_translated) { - ::core::panic!(#failure_message); - } - } - }) - } - /// Parse a closure with specifications into a Rust expression /// TODO: arguments, result (types are typically not known yet after parsing...) pub fn process_closure( diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs b/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs new file mode 100644 index 00000000000..f57bbc627c8 --- /dev/null +++ b/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs @@ -0,0 +1,111 @@ +use crate::{common::HasSignature, specifications::untyped}; +use proc_macro2::Span; +use rustc_hash::FxHashMap; +use syn::{parse_quote, spanned::Spanned}; +/// Information about the function that a specification is attached to +pub(crate) struct AssociatedFunctionInfo { + /// the arguments of the associated function + pub inputs: FxHashMap, +} + +impl AssociatedFunctionInfo { + /// used for assertions etc., where there is no associated + /// function + pub(crate) fn empty() -> Self { + Self { + inputs: Default::default(), + } + } + + pub(crate) fn new(item: &untyped::AnyFnItem) -> syn::Result { + let inputs: FxHashMap = item + .sig() + .inputs + .iter() + .enumerate() + .map(|(id, el)| -> syn::Result<(String, Argument)> { + let arg = create_argument(el, id)?; + Ok((arg.name.clone(), arg)) + }) + .collect::>>()?; + Ok(Self { inputs }) + } + + pub(crate) fn get_mut_arg(&mut self, name: &String) -> Option<&mut Argument> { + self.inputs.get_mut(name) + } +} + +/// Arguments to a function / i.e. specification. This struct is meant to +/// Keep track of them and collect information about how they are used +/// within specs to correctly store their old values for runtime checks. +#[derive(Debug)] +pub struct Argument { + /// name of the argument (stays the same from original function to checks) + pub name: String, + /// the type of this argument. If it's none, then only because this is a Self + /// type. + pub ty: syn::Type, + /// whether this value occurrs in an old expression. Don't want to clone + /// all args, since then they have to implement clone() and the type + /// resulting from cloning them must be known at ast level + pub used_in_old: bool, + /// field in old-tuple (old_values.X) where this argument will be stored + pub index: usize, + /// whether or not this field is a reference. We assume that all ref types + /// start with & (which obviously can be wrong) + pub is_ref: bool, + pub is_mutable: bool, + pub span: Span, +} + +pub(crate) fn create_argument(arg: &syn::FnArg, index: usize) -> syn::Result { + let span = arg.span(); + match arg { + syn::FnArg::Typed(syn::PatType { pat, ty, .. }) => { + if let syn::Pat::Ident(pat_ident) = *pat.clone() { + let is_mutable = pat_ident.mutability.is_some(); + + let is_ref = matches!(**ty, syn::Type::Reference(_)); + let arg = Argument { + name: pat_ident.ident.to_string(), + ty: *ty.clone(), + used_in_old: false, + index, + is_ref, + is_mutable, + span, + }; + Ok(arg) + } else { + syn::Result::Err(syn::Error::new( + span, + "For runtime checks, arguments have to be resolved to identifiers.", + )) + } + } + syn::FnArg::Receiver(syn::Receiver { + reference, + mutability, + .. + }) => { + let is_ref = reference.is_some(); + let is_mutable = mutability.is_some(); + let ty: syn::Type = if is_ref { + parse_quote! {&Self} + } else { + parse_quote! {Self} + }; + let arg = Argument { + name: "self".to_string(), + ty, // newer versions have this field! could be useful.. + used_in_old: false, + index, + is_ref, + is_mutable, + span, + }; + Ok(arg) + } + } +} diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs index 7ad4be92e27..268d41692b5 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs @@ -53,67 +53,65 @@ impl BoundExtractor { let name_set: FxHashSet = args.iter().map(|el| el.0.clone()).collect(); args.into_iter() .map(|(name, ty)| { - let range_expr = match ty.to_token_stream().to_string().as_str() { - "i8" | "i16" | "i32" | "i64" | "i128" | "isize" | "u8" | "u16" | "u32" - | "u64" | "u128" | "usize" => { - let bounds = Self::extract_bounds(closure.clone(), &name, &name_set); - let mut upper_bound_opt = None; - let mut lower_bound_opt = None; + let range_expr = if is_primitive_number(&ty) { + let bounds = Self::extract_bounds(closure.clone(), &name, &name_set); + let mut upper_bound_opt = None; + let mut lower_bound_opt = None; - // if there are multiple variables, potentially with dependencies - // the loops need to be in a specific order - assert!(bounds.len() <= 2); - let mut include_upper = true; // if we have the MAX upper limit, - for Boundary { - kind, - bound, - included, - .. - } in bounds.iter() - { - println!("Trying to define boundaries"); - // include it - match *kind { - BoundaryKind::Upper => { - // first idea was to add one here if inclusive, but - // this can lead to overflows! Need to use ..=x syntax - assert!(upper_bound_opt.is_none()); - println!("found upper bound, end included: {}", *included); - upper_bound_opt = Some(bound.clone()); - include_upper = *included; - } - BoundaryKind::Lower => { - lower_bound_opt = if *included { - // lower bound works the other way around - Some(bound.clone()) - } else { - Some(parse_quote! { - #bound + 1 - }) - } + // if there are multiple variables, potentially with dependencies + // the loops need to be in a specific order + assert!(bounds.len() <= 2); + let mut include_upper = true; // if we have the MAX upper limit, + for Boundary { + kind, + bound, + included, + .. + } in bounds.iter() + { + println!("Trying to define boundaries"); + // include it + match *kind { + BoundaryKind::Upper => { + // first idea was to add one here if inclusive, but + // this can lead to overflows! Need to use ..=x syntax + assert!(upper_bound_opt.is_none()); + println!("found upper bound, end included: {}", *included); + upper_bound_opt = Some(bound.clone()); + include_upper = *included; + } + BoundaryKind::Lower => { + lower_bound_opt = if *included { + // lower bound works the other way around + Some(bound.clone()) + } else { + Some(parse_quote! { + #bound + 1 + }) } } } - let upper_bound = - upper_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => - #ty::MAX - }); - let lower_bound = - lower_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => - #ty::MIN - }); + } + let upper_bound = + upper_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => + #ty::MAX + }); + let lower_bound = + lower_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => + #ty::MIN + }); - if include_upper { - parse_quote_spanned! {closure.span() => - (#lower_bound)..=(#upper_bound) - } - } else { - parse_quote_spanned! {closure.span() => - (#lower_bound)..(#upper_bound) - } + if include_upper { + parse_quote_spanned! {closure.span() => + (#lower_bound)..=(#upper_bound) + } + } else { + parse_quote_spanned! {closure.span() => + (#lower_bound)..(#upper_bound) } } - _ => panic!("runtime checks only supported for primitive types"), + } else { + todo!() }; ((name, ty), range_expr) }) @@ -385,3 +383,20 @@ pub fn get_attribute_contents(name: String, attrs: &Vec) -> Opti } None } + +pub fn is_primitive_number(ty: &syn::Type) -> bool { + matches!( + ty.to_token_stream().to_string().as_str(), + "i8" | "i16" + | "i32" + | "i64" + | "i128" + | "isize" + | "u8" + | "u16" + | "u32" + | "u64" + | "u128" + | "usize" + ) +} diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs b/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs index e7b3e38dc66..15d715e19ff 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs @@ -1,37 +1,74 @@ -use crate::rewriter::SpecItemType; - -#[derive(Clone, Copy, Debug)] -pub enum CheckType { - Postcondition, - Precondition, - Pledge, - // Closure expressions contain loop_invariant, prusti_assume and prusti_assert - // there is no need to distinguis them further - ClosureExpression, +#[derive(Clone, Copy, PartialEq)] +pub enum CheckItemType { + PledgeLhs, + PledgeRhs { has_lhs: bool }, + Requires, + Ensures, + Assert, + Assume, + BodyInvariant, + Unchecked, } -impl CheckType { - // whether or not we can generate a function on the ast level that - // generates an old_values tuple for arguments used in old expressions. - // This is ufnortunately not possible for ClosureExpressions, therefore they - // will have to be encoded differently - pub fn has_old_tuple(&self) -> bool { - matches!(self, Self::Postcondition | Self::Pledge) +impl CheckItemType { + pub(crate) fn gets_old_args(&self) -> bool { + matches!( + self, + Self::PledgeLhs | Self::PledgeRhs { .. } | Self::Ensures + ) + } + + // probably pledge_rhs shouldn't actually need it.. + pub(crate) fn needs_result(&self) -> bool { + matches!( + self, + Self::PledgeLhs | Self::PledgeRhs { .. } | Self::Ensures + ) + } + + pub(crate) fn gets_item_args(&self) -> bool { + // maybe pledge_rhs should not get items either + matches!( + self, + Self::PledgeRhs { .. } | Self::Requires | Self::Ensures + ) } - pub fn is_closure(&self) -> bool { - matches!(self, Self::ClosureExpression) + pub(crate) fn is_inlined(&self) -> bool { + matches!(self, Self::Assert | Self::Assume | Self::BodyInvariant) } - pub fn from_spectype(spec: &SpecItemType) -> Self { - match spec { - SpecItemType::Postcondition => Self::Postcondition, - SpecItemType::Precondition => Self::Precondition, - SpecItemType::Pledge => Self::Pledge, - _ => panic!( - "spec type {:?} are not supported to be translated to runtime-checks.", - spec - ), + pub(crate) fn wrap_contract(&self, s: &String) -> String { + match self { + Self::PledgeLhs => format!("#[assert_on_expiry({}, ..)]", s), + Self::PledgeRhs { has_lhs } => { + if *has_lhs { + format!("#[assert_on_expiry(.., {})]", s) + } else { + format!("#[after_expiry({})]", s) + } + } + Self::Requires => format!("#[requires({})]", s), + Self::Ensures => format!("#[ensures({})]", s), + Self::Assert => format!("prusti_assert!({})", s), + Self::Assume => format!("prusti_assume!({})", s), + Self::BodyInvariant => format!("body_invariant!({})", s), + Self::Unchecked => unreachable!(), + } + } +} + +impl std::fmt::Display for CheckItemType { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::PledgeLhs => write!(f, "pledge_lhs"), + Self::PledgeRhs { .. } => write!(f, "pledge"), + Self::Requires => write!(f, "pre"), + Self::Ensures => write!(f, "post"), + Self::Assert => write!(f, "assert"), + Self::Assume => write!(f, "assume"), + Self::BodyInvariant => write!(f, "body_invariant"), + Self::Unchecked => unreachable!(), } } } diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs b/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs index 3b7ecc0d5c2..2ff026246b1 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs @@ -1,3 +1,6 @@ pub mod translation; pub mod check_type; mod boundary_extraction; +mod associated_function_info; +mod visitor; +mod quantifiers; diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs b/prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs new file mode 100644 index 00000000000..5a5b1c542f2 --- /dev/null +++ b/prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs @@ -0,0 +1,117 @@ +use crate::runtime_checks::boundary_extraction::{is_primitive_number, BoundExtractor}; +use proc_macro2::TokenStream; +use quote::{quote, ToTokens}; +use rustc_hash::FxHashSet; +use syn::{parse_quote, parse_quote_spanned, spanned::Spanned}; + +pub(crate) enum QuantifierKind { + Forall, + Exists, +} + +pub(crate) fn translate_quantifier_expression( + closure: &syn::ExprClosure, + kind: QuantifierKind, + is_outer: bool, +) -> syn::Expr { + let mut name_set: FxHashSet = FxHashSet::default(); + // the variables that occurr as arguments + let bound_vars: Vec<(String, syn::Type)> = closure + .inputs + .iter() + .map(|pat: &syn::Pat| { + if let syn::Pat::Type(syn::PatType { + pat: box syn::Pat::Ident(id), + ty: box ty, + .. + }) = pat + { + let name_str = id.to_token_stream().to_string(); + name_set.insert(name_str.clone()); + (name_str, ty.clone()) + } else { + // maybe we can throw a more sensible error and make the + // check function a dummy check function + panic!("quantifiers without type annotations can not be checked at runtime"); + } + }) + .collect(); + + // look for the runtime_quantifier_bounds attribute: + let manual_bounds = BoundExtractor::manual_bounds(closure.clone(), bound_vars.clone()); + let bounds = manual_bounds + .unwrap_or_else(|| BoundExtractor::derive_ranges(*closure.body.clone(), bound_vars)); + + let mut expr = *closure.body.clone(); + + for ((name, ty), range_expr) in bounds.iter().rev() { + let name_token: TokenStream = name.parse().unwrap(); + let expr_string = expr + .span() + .source_text() + .unwrap_or_else(|| quote!(expr).to_string()); + let error_string = format!( + "\n\t> expression {} was violated for index {}=", + expr_string, name_token + ); + let error_len = error_string.len(); + // extend the error message if it's a type we know we can + // present to the user + let info_statements: syn::Block = if is_primitive_number(ty) && is_outer { + parse_quote_spanned! {expr.span() => { + prusti_rtc_info_buffer[prusti_rtc_info_len..prusti_rtc_info_len+#error_len].copy_from_slice(#error_string.as_bytes()); + let num_str = ::prusti_contracts::runtime_check_internals::num_to_str( + #name_token, + &mut num_buffer + ); + prusti_rtc_info_buffer[ + prusti_rtc_info_len+#error_len..prusti_rtc_info_len+#error_len+num_str.len() + ].copy_from_slice(num_str.as_bytes()); + prusti_rtc_info_len = prusti_rtc_info_len + + #error_len + + num_str.len(); + }} + } else { + parse_quote! {{}} + }; + + // maybe never turn them into strings in the first place.. + expr = match kind { + QuantifierKind::Forall => { + let res = quote! { + { + let mut holds_forall = true; + let mut num_buffer = [0u8; 64]; + for #name_token in #range_expr { + if !(#expr) { + // extend the error message + #info_statements; + + holds_forall = false; + break; + } + } + holds_forall + } + }; + syn::parse2(res).unwrap() + } + QuantifierKind::Exists => { + let res = quote! { + { + let mut exists = false; + for #name_token in #range_expr { + if #expr { + exists = true; + break; + } + } + exists + } + }; + syn::parse2(res).unwrap() + } + } + } + expr +} diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index b102f4f2103..7574f5cf191 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -1,604 +1,260 @@ use crate::{ common::HasSignature, - rewriter::{AstRewriter, SpecItemType}, + rewriter::AstRewriter, runtime_checks::{ - boundary_extraction::{self, BoundExtractor}, - check_type::CheckType, + associated_function_info::{create_argument, Argument, AssociatedFunctionInfo}, + check_type::CheckItemType, + visitor::CheckVisitor, }, specifications::{common::SpecificationId, untyped}, }; -use proc_macro2::{Span, TokenStream}; -use quote::{quote, quote_spanned, ToTokens}; -use rustc_hash::{FxHashMap, FxHashSet}; -use syn::{parse_quote, parse_quote_spanned, spanned::Spanned, visit_mut::VisitMut, Expr, FnArg}; +use proc_macro2::TokenStream; +use quote::quote_spanned; +use syn::{parse_quote, parse_quote_spanned, spanned::Spanned, visit_mut::VisitMut}; -pub struct CheckTranslator { - /// The expression within the specification (the one that will - /// be modified by the Visitor) - expression: Expr, - lhs_expression: Option, - visitor: CheckVisitor, - spec_type: SpecItemType, - expr_span: Span, - lhs_expr_span: Option, -} - -/// this struct contains all possible items needed to check certain -/// specifications at runtime -pub struct RuntimeFunctions { - /// the actual check function. For pledges, this is the check after - /// expiration - pub check_fn: syn::Item, - /// for assert_after_expiry(), this is the lhs of the magic wand - pub check_before_expiry: Option, -} - -/// Generates a bunch of functions that can be used to check specifications -/// at runtime. +// generates the check function that can be performed to check whether +// a contract was valid at runtime. +// Note: various modifications on the mir level are needed such that these +// checks are executed correctly. pub fn translate_runtime_checks( - spec_type: SpecItemType, + check_type: CheckItemType, check_id: SpecificationId, - expr: TokenStream, - lhs: Option, + // the expression of the actual contract + tokens: TokenStream, + // the function this contract is attached to item: &untyped::AnyFnItem, -) -> syn::Result { - let check_translator = CheckTranslator::new(item, expr, lhs, spec_type.clone()); - let (check_fn, check_before_expiry) = match spec_type { - SpecItemType::Pledge => { - // most things to generate: - let check_fn = check_translator.generate_check_function(item, check_id, false, true); - let check_before_expiry = - check_translator.generate_check_function(item, check_id, true, false); +) -> syn::Result { + // get signature information about the associated function + let function_info = AssociatedFunctionInfo::new(item)?; + let mut visitor = CheckVisitor::new(function_info, check_type); + // let check_translator = CheckTranslator::new(item, expr, lhs, check_type.clone()); - (check_fn, Some(check_before_expiry)) - } - SpecItemType::Postcondition => { - let check_fn = check_translator.generate_check_function(item, check_id, false, false); - (check_fn, None) - } - SpecItemType::Precondition => { - let check_fn = check_translator.generate_check_function(item, check_id, false, false); - (check_fn, None) - } - _ => unreachable!(), - }; - syn::Result::Ok(RuntimeFunctions { - check_fn, - check_before_expiry, - }) -} + // make the expression checkable at runtime: + let mut expr: syn::Expr = syn::parse2(tokens.clone())?; + visitor.visit_expr_mut(&mut expr); + let function_info = visitor.function_info; -pub fn translate_expression_runtime(tokens: TokenStream) -> syn::Expr { - // a bit different since we don't generate a function, but just the - // code-fragment performing the check - let mut expr: syn::Expr = syn::parse2(tokens).unwrap(); - let mut check_visitor = CheckVisitor::new(&dummy_fn(), CheckType::ClosureExpression); - check_visitor.visit_expr_mut(&mut expr); - expr -} + let item_name = syn::Ident::new( + &format!( + "prusti_{}_check_item_{}_{}", + check_type, + item.sig().ident, + check_id + ), + item.span(), + ); + let check_id_str = check_id.to_string(); + let item_name_str = item_name.to_string(); -impl CheckTranslator { - pub fn new( - item: &untyped::AnyFnItem, - tokens: TokenStream, - lhs_tokens_opt: Option, - spec_type: SpecItemType, - ) -> Self { - // figure out keywords - let expr_span = tokens.span(); - let lhs_expr_span = lhs_tokens_opt.as_ref().map(|tokens| tokens.span()); - let mut expression: syn::Expr = syn::parse2::(tokens).unwrap(); - let check_type = CheckType::from_spectype(&spec_type); - let mut visitor = CheckVisitor::new(item, check_type); - // Does it make sense to already run the visitor here? - visitor.visit_expr_mut(&mut expression); - // transform the pledge lhs too. Not sure if this is needed - let lhs_expression = lhs_tokens_opt.map(|tokens| { - let mut expr = syn::parse2::(tokens).unwrap(); - visitor.visit_expr_mut(&mut expr); - expr - }); + // Does pledge rhs need result? Probably not, at that point + // it should have expired + let result_arg_opt = if check_type.needs_result() { + Some(AstRewriter::generate_result_arg(item)) + } else { + None + }; + let forget_statements = generate_forget_statements(item, check_type); + let contract_string = tokens + .span() + .source_text() + .unwrap_or_else(|| tokens.to_string()); + let failure_message = format!( + "Prusti Runtime Checks: Contract {} was violated at runtime", + check_type.wrap_contract(&contract_string) + ); + let failure_message_len = failure_message.len(); - Self { - expression, - lhs_expression, - visitor, - spec_type, - expr_span, - lhs_expr_span, + let id_attr: syn::Attribute = if check_type == CheckItemType::PledgeLhs { + parse_quote_spanned! {item.span() => + #[prusti::check_before_expiry_id = #check_id_str] } - } - - // generate a function that checks a pre or postcondition - pub fn generate_check_function( - &self, - item: &untyped::AnyFnItem, - check_id: SpecificationId, - is_before_expiry_check: bool, - before_expiry_argument: bool, - ) -> syn::Item { - // lhs is true for assert_on_expire only! Re-use this method to create - // a check function for the pre-expiry check - let lhs_str = if is_before_expiry_check { "_lhs" } else { "" }; - let item_name = syn::Ident::new( - &format!( - "prusti_{}{}_check_item_{}_{}", - self.spec_type, - lhs_str, - item.sig().ident, - check_id - ), - item.span(), - ); - let check_id_str = check_id.to_string(); - let include_item_args = !is_before_expiry_check; - // we differentiate items that are executed after a function - // -> have result - // -> have old values - // -> moved values need to be stored too - let executed_after = matches!( - self.spec_type, - SpecItemType::Postcondition | SpecItemType::Pledge - ); - let (expr_to_check, expr_span): (syn::Expr, Span) = if is_before_expiry_check { - // if lhs is true, there has to be a lhs expression - if let Some(expr) = self.lhs_expression.as_ref() { - (expr.clone(), self.lhs_expr_span.unwrap()) - } else { - ( - parse_quote_spanned! {item.span() => - true - }, - item.span(), - ) - } - } else { - (self.expression.clone(), self.expr_span) - }; - - let item_name_str = item_name.to_string(); - let result_arg_opt = if executed_after { - Some(AstRewriter::generate_result_arg(item)) - } else { - None - }; - let forget_statements = - self.generate_forget_statements(item, include_item_args, executed_after); - let contract_string = expr_span - .source_text() - .unwrap_or("unresolved contract".to_string()); - let failure_message = format!("Contract {} was violated at runtime", contract_string); - let id_attr: syn::Attribute = if is_before_expiry_check { - parse_quote_spanned! {item.span() => - #[prusti::check_before_expiry_id = #check_id_str] - } - } else { - parse_quote_spanned! { item.span() => - #[prusti::check_id = #check_id_str] + } else { + parse_quote_spanned! { item.span() => + #[prusti::check_id = #check_id_str] + } + }; - } - }; + // we create a buffer for the final panic message, that can be extended + // with more precise error information such as which part of the expression + // failed, or which indeces of a quantifier caused a failure + let buffer_length = failure_message.len() * 5; - let debug_print_stmt: TokenStream = if let Ok(value) = std::env::var("PRUSTI_DEBUG_RUNTIME_CHECKS") { - if value == "true" { + let debug_print_stmt: Option = std::env::var("PRUSTI_DEBUG_RUNTIME_CHECKS") + .map_or(None, |value| { + (value == "true").then(|| { quote_spanned! {item.span() => println!("check function {} is performed", #item_name_str); } - } else { - TokenStream::new() - } - } else { - TokenStream::new() - }; + }) + }); + let mut check_item: syn::ItemFn = parse_quote_spanned! {item.span() => + #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] + #[prusti::spec_only] + #id_attr + fn #item_name() { + #debug_print_stmt + let mut prusti_rtc_info_buffer = [0u8; #buffer_length]; + let mut prusti_rtc_info_len = #failure_message_len; + prusti_rtc_info_buffer[..prusti_rtc_info_len].copy_from_slice(#failure_message.as_bytes()); - let mut check_item: syn::ItemFn = parse_quote_spanned! {item.span() => - #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] - #[prusti::spec_only] - #id_attr - fn #item_name() { - #debug_print_stmt - if !(#expr_to_check) { - #forget_statements - ::core::panic!(#failure_message) - }; - // now forget about all the values since they are still owned - // by the calling function + if !(#expr) { + let prusti_failure_message: &str = ::core::str::from_utf8(&prusti_rtc_info_buffer[..prusti_rtc_info_len]).unwrap(); #forget_statements - } - }; - check_item.sig.generics = item.sig().generics.clone(); - if include_item_args { - check_item.sig.inputs = item.sig().inputs.clone(); - } - if executed_after { - check_item.sig.inputs.push(result_arg_opt.unwrap()); - let old_arg = self.construct_old_fnarg(item, false); - // put it inside a reference: - check_item.sig.inputs.push(old_arg); - } - if before_expiry_argument { - let output_ty: syn::Type = if let syn::ReturnType::Type(_, box ty) = &item.sig().output - { - ty.clone() - } else { - // probably not our job to throw an error here? But a pledge for - // a function with default return type does not make a lot of sense.. - parse_quote! {()} - }; - let before_expiry_arg = parse_quote_spanned! {item.span() => - result_before_expiry: (#output_ty,) + ::core::panic!("{}", prusti_failure_message) }; - check_item.sig.inputs.push(before_expiry_arg); + // now forget about all the values since they are still owned + // by the calling function + #forget_statements } - syn::Item::Fn(check_item) + }; + check_item.sig.generics = item.sig().generics.clone(); + if check_type.gets_item_args() { + check_item.sig.inputs = item.sig().inputs.clone(); } - - /// After the visitor was run on an expression, this function - /// can be used to generate the type of the old_values tuple - /// important here is that it only contains the values that actually occurr - /// in old-expressions and not just all arguments - pub fn old_values_type(&self, item: &T) -> syn::Type { - let mut old_values_type: syn::Type = parse_quote_spanned! {item.span() => ()}; - let mut arguments = self.visitor.inputs.values().collect::>(); - // order the elements of the map by index - arguments.sort_by(|a, b| a.index.partial_cmp(&b.index).unwrap()); - if let syn::Type::Tuple(syn::TypeTuple { elems, .. }) = &mut old_values_type { - // start adding the elements we want to store: - for arg in arguments { - if arg.used_in_old { - elems.push(arg.ty.clone()); - } else { - // if argument is never used in old, we use a unit type - // in the tuple - let unit_type: syn::Type = parse_quote_spanned! {arg.span => ()}; - elems.push(unit_type); - } - } - // if brackets contain only one type, it's not a tuple. Therefore - // make a comma at the end, if there is at least one element - if !elems.empty_or_trailing() { - elems.push_punct(syn::token::Comma::default()); - } - } else { - unreachable!(); - } - old_values_type + if check_type.needs_result() { + check_item.sig.inputs.push(result_arg_opt.unwrap()); } - - // at the moment deref is false in all use cases. Remove - pub fn construct_old_fnarg(&self, item: &T, deref: bool) -> syn::FnArg { - let old_values_type: syn::Type = self.old_values_type(item); - if deref { - parse_quote_spanned! {item.span() => - old_values: &#old_values_type - } - } else { - parse_quote_spanned! {item.span() => - old_values: #old_values_type - } - } + if check_type.gets_old_args() { + let old_arg = construct_old_fnarg(&function_info, item, false); + // put it inside a reference: + check_item.sig.inputs.push(old_arg); } - - pub fn generate_forget_statements( - &self, - item: &untyped::AnyFnItem, - forget_item_args: bool, - has_result_arg: bool, - ) -> syn::Block { - // go through all inputs, if they are not references add a forget - // statement - let mut stmts: Vec = Vec::new(); - if forget_item_args { - for fn_arg in item.sig().inputs.clone() { - if let Ok(arg) = create_argument(&fn_arg, 0) { - let name: TokenStream = arg.name.parse().unwrap(); - if !arg.is_ref { - stmts.push(parse_quote! { - ::core::mem::forget(#name); - }) - } - } - } - } - - // result might be double freed too if moved into a check function - if has_result_arg { - stmts.push(parse_quote! { - std::mem::forget(result); - }) - } - syn::Block { - brace_token: syn::token::Brace::default(), - stmts, - } + if let CheckItemType::PledgeRhs { .. } = check_type { + let output_ty: syn::Type = if let syn::ReturnType::Type(_, box ty) = &item.sig().output { + ty.clone() + } else { + // probably not our job to throw an error here? But a pledge for + // a function with default return type does not make a lot of sense.. + parse_quote! {()} + }; + let before_expiry_arg = parse_quote_spanned! {item.span() => + result_before_expiry: (#output_ty,) + }; + check_item.sig.inputs.push(before_expiry_arg); } + Ok(syn::Item::Fn(check_item)) } -/// collects information about expression, but also transforms it -/// for check -pub struct CheckVisitor { - pub within_old: bool, - pub within_before_expiry: bool, - pub inputs: FxHashMap, - pub highest_old_index: usize, - pub check_type: CheckType, -} +pub fn translate_expression_runtime( + tokens: TokenStream, + check_id: SpecificationId, + check_type: CheckItemType, +) -> syn::Result { + // a bit different since we don't generate a function, but just the + // code-fragment performing the check + let function_info = AssociatedFunctionInfo::empty(); + let span = tokens.span(); + let expr_str = span.source_text().unwrap_or_else(|| tokens.to_string()); + let spec_id_str = check_id.to_string(); + let failure_message = format!( + "Prusti Runtime Checks: Contract {} was violated at runtime", + check_type.wrap_contract(&expr_str) + ); + let mut expr: syn::Expr = syn::parse2(tokens).unwrap(); + // TODO: properly pass check types + let mut check_visitor = CheckVisitor::new(function_info, CheckItemType::Assert); + check_visitor.visit_expr_mut(&mut expr); -impl CheckVisitor { - pub fn new(item: &untyped::AnyFnItem, check_type: CheckType) -> Self { - let inputs = item - .sig() - .inputs - .iter() - .enumerate() - .filter_map(|(id, el)| create_argument(el, id).ok()) - .map(|el| (el.name.clone(), el)) - .collect(); - Self { - within_old: false, - within_before_expiry: false, - inputs, - highest_old_index: 0, - check_type, + let failure_message_len = failure_message.len(); + let buffer_length = failure_message_len * 5; + Ok(quote_spanned! {span => + { + #[prusti::check_only] + #[prusti::spec_only] + #[prusti::runtime_assertion] + #[prusti::check_id = #spec_id_str] + || -> bool { + true + }; + let mut prusti_rtc_info_buffer = [0u8; #buffer_length]; + let mut prusti_rtc_info_len = #failure_message_len; + prusti_rtc_info_buffer[..prusti_rtc_info_len].copy_from_slice(#failure_message.as_bytes()); + if !(#expr) { + let prusti_failure_message: &str = ::core::str::from_utf8(&prusti_rtc_info_buffer[..prusti_rtc_info_len]).unwrap(); + ::core::panic!("{}", prusti_failure_message); + } } - } + }) } -impl VisitMut for CheckVisitor { - fn visit_expr_mut(&mut self, expr: &mut Expr) { - match expr { - Expr::Path(expr_path) => { - // collect arguments that occurr within old expression - // these are the ones we wanna clone - if let Some(ident) = expr_path.path.get_ident() { - let name = ident.to_token_stream().to_string(); - if self.check_type.is_closure() && self.within_old { - // let tokens = parse_quote! {old(#expr)}; - // *expr = tokens; - } else if let Some(arg) = self.inputs.get_mut(&name) { - // argument used within an old expression? - // not already marked as used in old? - if self.check_type.has_old_tuple() && (self.within_old || (!arg.is_ref && arg.is_mutable)) { - // if it was not already marked to be stored - // needs to be checked for indeces to be correct - arg.used_in_old = true; - // replace the identifier with the correct field access - let index_token: TokenStream = - arg.index.to_string().parse().unwrap(); - let tokens = quote! {(old_values.#index_token)}; - let new_path: syn::Expr = syn::parse2(tokens).unwrap(); - *expr = new_path; - } - } else if self.within_before_expiry && name == *"result" { - let new_path: syn::Expr = parse_quote! { - result_before_expiry.0 - }; - *expr = new_path; - } - } - } - Expr::Call(call) - // func: box Expr::Path(syn::ExprPath { path, .. }), - // .. - => { - let path_expr = (*call.func).clone(); - // move this function, has nothing to do with boundary extraction - let name = if let Some(name) = boundary_extraction::expression_name(&path_expr) { - name - } else { - // still visit recursively - syn::visit_mut::visit_expr_mut(self, expr); - return; - }; - match name.as_str() { - ":: prusti_contracts :: old" | "prusti_contracts :: old" | "old" => { - if self.check_type.is_closure() { - syn::visit_mut::visit_expr_call_mut(self, call); - // just leave it as it is.. resolve it on mir level - } else { - let sub_expr = call.args.pop(); - // remove old-call and replace with content expression - *expr = sub_expr.unwrap().value().clone(); - self.within_old = true; - self.visit_expr_mut(expr); - // will cause all variables below to be replaced by old_value.some_field - self.within_old = false; - } - } - ":: prusti_contracts :: before_expiry" | "prusti_contracts :: before_expiry" | "before_expiry" => { - let sub_expr = call.args.pop(); - *expr = sub_expr.unwrap().value().clone(); - self.within_before_expiry = true; - self.visit_expr_mut(expr); - // will cause all variables below to be replaced by old_value.some_field - self.within_before_expiry = false; - }, - ":: prusti_contracts :: forall" => { - syn::visit_mut::visit_expr_call_mut(self, call); - // arguments are triggers and then the closure: - let quant_closure_expr: syn::Expr = call.args.last().unwrap().clone(); - if let syn::Expr::Closure(expr_closure) = quant_closure_expr { - // we are throwing away any triggers - // extract all the relevant information, construct a - // new expression - let check_expr = translate_quantifier_expression( - &expr_closure, - QuantifierKind::Forall, - ); - *expr = check_expr; - } } - ":: prusti_contracts :: exists" => { - syn::visit_mut::visit_expr_call_mut(self, call); - // extend self.surround_quantifiers correctly! - let closure_expression: syn::Expr = call.args.last().unwrap().clone(); - if let syn::Expr::Closure(expr_closure) = closure_expression { - let check_expr = translate_quantifier_expression( - &expr_closure, - QuantifierKind::Exists, - ); - *expr = check_expr - } - }, - _ => syn::visit_mut::visit_expr_mut(self, expr), +pub fn generate_forget_statements( + item: &untyped::AnyFnItem, + check_type: CheckItemType, +) -> syn::Block { + // go through all inputs, if they are not references add a forget + // statement + let mut stmts: Vec = Vec::new(); + if check_type.gets_item_args() { + for fn_arg in item.sig().inputs.clone() { + if let Ok(arg) = create_argument(&fn_arg, 0) { + let name: TokenStream = arg.name.parse().unwrap(); + if !arg.is_ref { + stmts.push(parse_quote! { + ::core::mem::forget(#name); + }) } } - _ => { - syn::visit_mut::visit_expr_mut(self, expr); - } } } -} -/// Arguments to a function / i.e. specification. This struct is meant to -/// Keep track of them and collect information about how they are used -/// within specs to correctly store their old values for runtime checks. -#[derive(Debug)] -pub struct Argument { - /// name of the argument (stays the same from original function to specks to checks) - pub name: String, - /// the type of this argument. If it's none, then only because this is a Self - /// type. - pub ty: syn::Type, - /// whether this value occurrs in an old expression. Don't want to clone - /// all args, since then they have to implement clone() and the type - /// resulting from cloning them must be known at ast level - pub used_in_old: bool, - /// field in old-tuple (old_values.X) where this argument will be stored - pub index: usize, - /// whether or not this field is a reference. We assume that all ref types - /// start with & (which obviously can be wrong) - pub is_ref: bool, - pub is_mutable: bool, - pub span: Span, + // result might be double freed too if moved into a check function + if check_type.needs_result() { + stmts.push(parse_quote! { + std::mem::forget(result); + }) + } + syn::Block { + brace_token: syn::token::Brace::default(), + stmts, + } } -fn create_argument(arg: &FnArg, index: usize) -> Result { - let span = arg.span(); - match arg { - FnArg::Typed(syn::PatType { pat, ty, .. }) => { - if let syn::Pat::Ident(pat_ident) = *pat.clone() { - let is_mutable = pat_ident.mutability.is_some(); - - let is_ref = matches!(**ty, syn::Type::Reference(_)); - let arg = Argument { - name: pat_ident.ident.to_string(), - ty: *ty.clone(), - used_in_old: false, - index, - is_ref, - is_mutable, - span, - }; - Ok(arg) - } else { - // TODO: proper error message - Err(()) - } +// at the moment deref is false in all use cases. Remove +fn construct_old_fnarg( + function_info: &AssociatedFunctionInfo, + item: &T, + deref: bool, +) -> syn::FnArg { + let old_values_type: syn::Type = old_values_type(item, function_info); + if deref { + parse_quote_spanned! {item.span() => + old_values: &#old_values_type } - FnArg::Receiver(syn::Receiver { - reference, - mutability, - .. - }) => { - let is_ref = reference.is_some(); - let is_mutable = mutability.is_some(); - let ty: syn::Type = if is_ref { - parse_quote! {&Self} - } else { - parse_quote! {Self} - }; - let arg = Argument { - name: "self".to_string(), - ty, // newer versions have this field! could be useful.. - used_in_old: false, - index, - is_ref, - is_mutable, - span, - }; - Ok(arg) + } else { + parse_quote_spanned! {item.span() => + old_values: #old_values_type } } } -enum QuantifierKind { - Forall, - Exists, -} - -fn translate_quantifier_expression(closure: &syn::ExprClosure, kind: QuantifierKind) -> syn::Expr { - let mut name_set: FxHashSet = FxHashSet::default(); - // the variables that occurr as arguments - let bound_vars: Vec<(String, syn::Type)> = closure - .inputs - .iter() - .map(|pat: &syn::Pat| { - if let syn::Pat::Type(syn::PatType { - pat: box syn::Pat::Ident(id), - ty: box ty, - .. - }) = pat - { - let name_str = id.to_token_stream().to_string(); - name_set.insert(name_str.clone()); - (name_str, ty.clone()) +/// After the visitor was run on an expression, this function +/// can be used to generate the type of the old_values tuple +/// important here is that it only contains the values that actually occurr +/// in old-expressions and not just all arguments +fn old_values_type(item: &T, function_info: &AssociatedFunctionInfo) -> syn::Type { + let mut old_values_type: syn::Type = parse_quote_spanned! {item.span() => ()}; + let mut arguments = function_info.inputs.values().collect::>(); + // order the elements of the map by index + arguments.sort_by(|a, b| a.index.partial_cmp(&b.index).unwrap()); + if let syn::Type::Tuple(syn::TypeTuple { elems, .. }) = &mut old_values_type { + // start adding the elements we want to store: + for arg in arguments { + if arg.used_in_old { + elems.push(arg.ty.clone()); } else { - // maybe we can throw a more sensible error and make the - // check function a dummy check function - panic!("quantifiers without type annotations can not be checked at runtime"); - } - }) - .collect(); - - // look for the runtime_quantifier_bounds attribute: - let manual_bounds = BoundExtractor::manual_bounds(closure.clone(), bound_vars.clone()); - let bounds = manual_bounds - .unwrap_or_else(|| BoundExtractor::derive_ranges(*closure.body.clone(), bound_vars)); - - let mut expr = *closure.body.clone(); - - for ((name, _), range_expr) in bounds.iter().rev() { - let name_token: TokenStream = name.parse().unwrap(); - - // maybe never turn them into strings in the first place.. - expr = match kind { - QuantifierKind::Forall => { - let res = quote! { - { - let mut holds_forall = true; - for #name_token in #range_expr { - if !(#expr) { - holds_forall = false; - break; - } - } - holds_forall - } - }; - syn::parse2(res).unwrap() - } - QuantifierKind::Exists => { - let res = quote! { - { - let mut exists = false; - for #name_token in #range_expr { - if #expr { - exists = true; - break; - } - } - exists - } - }; - syn::parse2(res).unwrap() + // if argument is never used in old, we use a unit type + // in the tuple + let unit_type: syn::Type = parse_quote_spanned! {arg.span => ()}; + elems.push(unit_type); } } + // if brackets contain only one type, it's not a tuple. Therefore + // make a comma at the end, if there is at least one element + if !elems.empty_or_trailing() { + elems.push_punct(syn::token::Comma::default()); + } + } else { + unreachable!(); } - expr -} - -pub fn dummy_fn() -> untyped::AnyFnItem { - parse_quote! { - fn x(){} - } + old_values_type } diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs b/prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs new file mode 100644 index 00000000000..069927fbef3 --- /dev/null +++ b/prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs @@ -0,0 +1,189 @@ +use crate::runtime_checks::{ + associated_function_info::AssociatedFunctionInfo, + boundary_extraction, + check_type::CheckItemType, + quantifiers::{translate_quantifier_expression, QuantifierKind}, +}; +use proc_macro2::TokenStream; +use quote::{quote, ToTokens}; +use syn::{parse_quote_spanned, spanned::Spanned, visit_mut::VisitMut, Expr}; + +pub(crate) struct CheckVisitor { + pub function_info: AssociatedFunctionInfo, + pub within_old: bool, + pub within_before_expiry: bool, + pub check_type: CheckItemType, + /// Whether the current expression is part of the outermost + /// expression. If yes, and we encounter a conjunction or + /// forall quantifier, we can extend the reported error with + /// more precise information + is_outer: bool, + contains_conjunction: bool, +} + +impl CheckVisitor { + pub(crate) fn new(function_info: AssociatedFunctionInfo, check_type: CheckItemType) -> Self { + Self { + function_info, + within_old: false, + within_before_expiry: false, + check_type, + is_outer: true, + contains_conjunction: false, + } + } +} + +impl VisitMut for CheckVisitor { + fn visit_expr_mut(&mut self, expr: &mut Expr) { + let was_outer = self.is_outer; + match expr { + Expr::Path(expr_path) => { + // collect arguments that occurr within old expression + // these are the ones we wanna clone + if let Some(ident) = expr_path.path.get_ident() { + let name = ident.to_token_stream().to_string(); + if let Some(arg) = self.function_info.get_mut_arg(&name) { + // argument used within an old expression? + // not already marked as used in old? + if self.check_type.gets_old_args() && (self.within_old || (!arg.is_ref && arg.is_mutable)) { + // if it was not already marked to be stored + // needs to be checked for indeces to be correct + arg.used_in_old = true; + // replace the identifier with the correct field access + let index_token: TokenStream = + arg.index.to_string().parse().unwrap(); + let new_path: syn::Expr = parse_quote_spanned! { expr.span() => (old_values.#index_token)}; + *expr = new_path; + } + } else if self.within_before_expiry && name == *"result" { + let new_path: syn::Expr = parse_quote_spanned! { expr.span() => + result_before_expiry.0 + }; + *expr = new_path; + } + } + } + Expr::Call(call) + // func: box Expr::Path(syn::ExprPath { path, .. }), + // .. + => { + self.is_outer = false; + let path_expr = (*call.func).clone(); + // move this function, has nothing to do with boundary extraction + let name = if let Some(name) = boundary_extraction::expression_name(&path_expr) { + name + } else { + // still visit recursively + syn::visit_mut::visit_expr_mut(self, expr); + return; + }; + match name.as_str() { + ":: prusti_contracts :: old" | "prusti_contracts :: old" | "old" => { + // for this function we can savely try to get + // more precise errors about the contents + self.is_outer = true; + // for prusti_assert etc we can not resolve old here + if self.check_type.is_inlined() { + syn::visit_mut::visit_expr_call_mut(self, call); + // just leave it as it is.. resolve it on mir level + } else { + let sub_expr = call.args.pop(); + // remove old-call and replace with content expression + *expr = sub_expr.unwrap().value().clone(); + self.within_old = true; + self.visit_expr_mut(expr); + // will cause all variables below to be replaced by old_value.some_field + self.within_old = false; + } + } + ":: prusti_contracts :: before_expiry" | "prusti_contracts :: before_expiry" | "before_expiry" => { + let sub_expr = call.args.pop(); + *expr = sub_expr.unwrap().value().clone(); + self.within_before_expiry = true; + self.visit_expr_mut(expr); + // will cause all variables below to be replaced by old_value.some_field + self.within_before_expiry = false; + }, + ":: prusti_contracts :: forall" => { + // arguments are triggers and then the closure: + let quant_closure_expr: syn::Expr = call.args.last().unwrap().clone(); + if let syn::Expr::Closure(mut expr_closure) = quant_closure_expr { + // since this is a conjunction, we can get + // more information about subexpressions failing + self.is_outer = was_outer; + self.visit_expr_mut(&mut expr_closure.body); + // we are throwing away any triggers + // extract all the relevant information, construct a + // new expression + let check_expr = translate_quantifier_expression( + &expr_closure, + QuantifierKind::Forall, + was_outer, + ); + *expr = check_expr; + } } + ":: prusti_contracts :: exists" => { + // here we don't want every failing iteration + // to give us additional info + syn::visit_mut::visit_expr_call_mut(self, call); + // extend self.surround_quantifiers correctly! + let closure_expression: syn::Expr = call.args.last().unwrap().clone(); + if let syn::Expr::Closure(expr_closure) = closure_expression { + let check_expr = translate_quantifier_expression( + &expr_closure, + QuantifierKind::Exists, + false, + ); + *expr = check_expr + } + }, + _ => syn::visit_mut::visit_expr_mut(self, expr), + } + }, + Expr::Binary(syn::ExprBinary { + left: box left, + op: syn::BinOp::And(_), + right: box right, .. + }) => { + if was_outer { + syn::visit_mut::visit_expr_mut(self, left); + let left_contains_conjunction = self.contains_conjunction; + self.contains_conjunction = false; + syn::visit_mut::visit_expr_mut(self, right); + let right_contains_conjunction = self.contains_conjunction; + // call check function on both sides: + let left_str = left.span().source_text().unwrap_or_else(|| quote!(left).to_string()); + let left_error_str = format!("\n\t> expression {} was violated.", left_str); + let right_str = right.span().source_text().unwrap_or_else(|| quote!(right).to_string()); + let right_error_str = format!("\n\t> expression {} was violated.", right_str); + + // the expression will be split up even further + if !left_contains_conjunction { + let new_left = parse_quote_spanned!{left.span() => + ::prusti_contracts::runtime_check_internals::check_expr(#left, #left_error_str, &mut prusti_rtc_info_buffer, &mut prusti_rtc_info_len) + }; + *left = new_left; + } + if !right_contains_conjunction { + let new_right = parse_quote_spanned! {right.span() => + ::prusti_contracts::runtime_check_internals::check_expr(#right, #right_error_str, &mut prusti_rtc_info_buffer, &mut prusti_rtc_info_len) + }; + *right = new_right; + } + // signal to parent that it doesnt need to wrap this expression + // into a separate check function, since it will be further split up + self.contains_conjunction = true; + } + }, + Expr::Block(_) | Expr::Paren(_) => { + syn::visit_mut::visit_expr_mut(self, expr); + } + _ => { + self.is_outer = false; + syn::visit_mut::visit_expr_mut(self, expr); + } + } + self.is_outer = was_outer; + } +} diff --git a/prusti-contracts/prusti-specs/src/specifications/preparser.rs b/prusti-contracts/prusti-specs/src/specifications/preparser.rs index 4b0da7922e4..388f1e96050 100644 --- a/prusti-contracts/prusti-specs/src/specifications/preparser.rs +++ b/prusti-contracts/prusti-specs/src/specifications/preparser.rs @@ -277,9 +277,10 @@ impl PrustiTokenStream { todo!() } Some(PrustiToken::Quantifier(span, kind)) => { - let mut stream = self.pop_group(Delimiter::Parenthesis).ok_or_else(|| { + let (mut stream, content_span) = self.pop_group_spanned(Delimiter::Parenthesis).ok_or_else(|| { error(span, "expected parenthesized expression after quantifier") })?; + let full_span = join_spans(span, content_span); // attrs_opt is potentially None even if everything is good let attrs_opt = stream.pop_quantifier_bound_attr(); let args = stream @@ -317,7 +318,7 @@ impl PrustiTokenStream { }; let args = args.parse()?; let body = stream.parse()?; - kind.translate(span, triggers, attr_parsed, args, body) + kind.translate(full_span, triggers, attr_parsed, args, body) } Some(PrustiToken::SpecEnt(span, _)) | Some(PrustiToken::CallDesc(span, _)) => { @@ -409,6 +410,13 @@ impl PrustiTokenStream { } } + fn pop_group_spanned(&mut self, delimiter: Delimiter) -> Option<(Self, Span)> { + match self.tokens.pop_front() { + Some(PrustiToken::Group(span, del, box stream)) if del == delimiter => Some((stream, span)), + _ => None, + } + } + fn pop_closure_args(&mut self) -> Option { let mut tokens = VecDeque::new(); @@ -760,7 +768,6 @@ impl Quantifier { args: TokenStream, body: TokenStream, ) -> TokenStream { - let full_span = join_spans(span, body.span()); let trigger_sets = triggers .into_iter() .map(|set| { @@ -768,19 +775,19 @@ impl Quantifier { quote_spanned! { trigger.span() => #[prusti::spec_only] | #args | ( #trigger ), } })); - quote_spanned! { full_span => ( #triggers ) } + quote_spanned! { span => ( #triggers ) } }) .collect::>(); - let body = quote_spanned! { body.span() => #body }; + let body = quote_spanned! { body.span() => { #body } }; let attr = attr.map(|attr| quote_spanned! {attr.span() => #[prusti::#attr]}); match self { - Self::Forall => quote_spanned! { full_span => ::prusti_contracts::forall( + Self::Forall => quote_spanned! { span => ::prusti_contracts::forall( ( #( #trigger_sets, )* ), - #[prusti::spec_only] #attr | #args | -> bool { #body } + #[prusti::spec_only] #attr | #args | -> bool #body ) }, - Self::Exists => quote_spanned! { full_span => ::prusti_contracts::exists( + Self::Exists => quote_spanned! { span => ::prusti_contracts::exists( ( #( #trigger_sets, )* ), - #[prusti::spec_only] #attr | #args | -> bool { #body } + #[prusti::spec_only] #attr | #args | -> bool #body ) }, } } diff --git a/prusti-tests/tests/verify/ui/forall_verify.stderr b/prusti-tests/tests/verify/ui/forall_verify.stderr index 63d52476fb4..c65a4cf40e7 100644 --- a/prusti-tests/tests/verify/ui/forall_verify.stderr +++ b/prusti-tests/tests/verify/ui/forall_verify.stderr @@ -2,7 +2,7 @@ error: [Prusti: verification error] postcondition might not hold. --> $DIR/forall_verify.rs:18:11 | 18 | #[ensures(forall(|x: i32| identity(x) == x + 1))] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | note: the error originates here --> $DIR/forall_verify.rs:19:1 diff --git a/prusti-viper/src/verifier.rs b/prusti-viper/src/verifier.rs index e38311fedfd..0247de65bd5 100644 --- a/prusti-viper/src/verifier.rs +++ b/prusti-viper/src/verifier.rs @@ -17,22 +17,18 @@ use prusti_common::{ Stopwatch, }; use prusti_interface::{ - data::{VerificationResult, VerificationTask, ProcedureDefId}, + data::{VerificationResult, VerificationTask}, environment::Environment, specs::typed, PrustiError, }; -use prusti_rustc_interface::{ - span::DUMMY_SP, - middle::mir, -}; +use prusti_rustc_interface::span::DUMMY_SP; use prusti_server::{ process_verification_request, spawn_server_thread, tokio::runtime::Builder, PrustiClient, VerificationRequest, ViperBackendConfig, }; use viper::{self, PersistentCache, Viper}; use vir_crate::common::check_mode::CheckMode; -use rustc_hash::FxHashMap; /// A verifier is an object for verifying a single crate, potentially /// many times. diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index 23cfd731a79..ae178b9cd24 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -10,7 +10,7 @@ use prusti_rustc_interface::{ borrowck::consumers, data_structures::steal::Steal, driver::Compilation, - hir::{self, def::DefKind}, + hir::def::DefKind, index::IndexVec, interface::{interface::Compiler, Config, Queries, DEFAULT_QUERY_PROVIDERS}, middle::{ @@ -23,7 +23,6 @@ use prusti_rustc_interface::{ span::def_id::{DefId, LocalDefId, LOCAL_CRATE}, trait_selection::traits, }; -use rustc_hash::FxHashSet; #[derive(Default)] pub struct PrustiCompilerCalls; diff --git a/prusti/src/modify_mir/passes/remove_dead_code.rs b/prusti/src/modify_mir/passes/remove_dead_code.rs index dea482aef4c..9639923efe6 100644 --- a/prusti/src/modify_mir/passes/remove_dead_code.rs +++ b/prusti/src/modify_mir/passes/remove_dead_code.rs @@ -119,7 +119,7 @@ impl<'tcx, 'a> MutVisitor<'tcx> for DeadCodeElimination<'tcx> { fn visit_terminator( &mut self, terminator: &mut mir::Terminator<'tcx>, - location: mir::Location, + _location: mir::Location, ) { let new_term_opt = match &mut terminator.kind { mir::TerminatorKind::SwitchInt { discr, targets } => { From d3cacc790c7696bf34f07a47286dfee320be79e2 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Fri, 1 Sep 2023 15:09:17 +0200 Subject: [PATCH 34/45] Add tests for runtime checks and optimizations --- prusti-tests/Cargo.toml | 1 + .../tests/mir_optimizations/checked_add.rs | 17 +++ .../mir_optimizations/checked_add.stdout | 2 + .../checked_multiplication.rs | 17 +++ .../checked_multiplication.stdout | 2 + prusti-tests/tests/mir_optimizations/enum.rs | 46 +++++++ .../tests/mir_optimizations/enum.stdout | 3 + .../mir_optimizations/multiple-asserts.rs | 36 +++++ .../mir_optimizations/multiple-asserts.stdout | 3 + .../tests/mir_optimizations/no_contract.rs | 41 ++++++ .../mir_optimizations/no_contract.stdout | 1 + .../assert-assume-invariant/assert-old.rs | 15 ++ .../assert-assume-invariant/assert-old.stderr | 3 + .../fail/assert-assume-invariant/forall.rs | 7 + .../assert-assume-invariant/forall.stderr | 4 + .../assert-assume-invariant/invariant-old.rs | 16 +++ .../invariant-old.stderr | 3 + .../fail/assert-assume-invariant/invariant.rs | 13 ++ .../assert-assume-invariant/invariant.stderr | 3 + .../assert-assume-invariant/old-locals.rs | 31 +++++ .../assert-assume-invariant/old-locals.stderr | 3 + .../old-move-struct.rs | 17 +++ .../old-move-struct.stderr | 3 + .../fail/assert-assume-invariant/old-move.rs | 14 ++ .../assert-assume-invariant/old-move.stderr | 3 + .../assert-assume-invariant/precise-error.rs | 10 ++ .../precise-error.stderr | 4 + .../fail/assert-assume-invariant/sanity.rs | 8 ++ .../assert-assume-invariant/sanity.stderr | 3 + .../fail/assert-assume-invariant/tuple.rs | 13 ++ .../fail/assert-assume-invariant/tuple.stderr | 3 + .../fail/extern_specs/option.rs | 28 ++++ .../fail/extern_specs/option.stderr | 3 + .../fail/extern_specs/option.stdout | 2 + .../fail/pledges/call_expiration.rs | 38 +++++ .../fail/pledges/call_expiration.stderr | 3 + .../fail/pledges/call_expiration.stdout | 3 + .../fail/pledges/conditional.rs | 44 ++++++ .../fail/pledges/conditional.stderr | 3 + .../fail/pledges/conditional.stdout | 3 + .../fail/pledges/conditional2.rs | 60 ++++++++ .../fail/pledges/conditional2.stderr | 3 + .../fail/pledges/conditional2.stdout | 11 ++ .../runtime_checks/fail/pledges/percentage.rs | 36 +++++ .../fail/pledges/percentage.stderr | 3 + .../fail/pledges/percentage.stdout | 7 + .../runtime_checks/fail/pledges/vecwrapper.rs | 66 +++++++++ .../fail/pledges/vecwrapper.stderr | 14 ++ .../fail/pledges/vecwrapper.stdout | 14 ++ .../runtime_checks/fail/pledges/zombie.rs | 45 ++++++ .../runtime_checks/fail/pledges/zombie.stderr | 3 + .../runtime_checks/fail/pledges/zombie.stdout | 7 + .../fail/postconditions/generic-old.rs | 28 ++++ .../fail/postconditions/generic-old.stderr | 3 + .../fail/postconditions/generic-old.stdout | 2 + .../fail/postconditions/generic.rs | 25 ++++ .../fail/postconditions/generic.stderr | 3 + .../fail/postconditions/generic.stdout | 1 + .../fail/postconditions/old-non-ref.rs | 24 ++++ .../fail/postconditions/old-non-ref.stderr | 3 + .../fail/postconditions/old-non-ref.stdout | 1 + .../fail/postconditions/old-pointers.rs | 22 +++ .../fail/postconditions/old-pointers.stderr | 4 + .../fail/postconditions/old-pointers.stdout | 1 + .../fail/postconditions/post-simple.rs | 14 ++ .../fail/postconditions/post-simple.stderr | 3 + .../fail/postconditions/post-simple.stdout | 2 + .../fail/postconditions/self-impl.rs | 30 ++++ .../fail/postconditions/self-impl.stderr | 3 + .../fail/postconditions/self-impl.stdout | 1 + .../fail/postconditions/type-alias.rs | 21 +++ .../fail/postconditions/type-alias.stderr | 3 + .../fail/postconditions/type-alias.stdout | 1 + .../fail/preconditions/multiple.rs | 20 +++ .../fail/preconditions/multiple.stderr | 3 + .../fail/preconditions/multiple.stdout | 2 + .../fail/preconditions/pre-simple.rs | 12 ++ .../fail/preconditions/pre-simple.stderr | 3 + .../fail/preconditions/pre-simple.stdout | 2 + .../fail/quantifiers/exists-old.rs | 53 +++++++ .../fail/quantifiers/exists-old.stderr | 4 + .../fail/quantifiers/exists-old.stdout | 13 ++ .../fail/quantifiers/manual_bounds.rs | 19 +++ .../fail/quantifiers/manual_bounds.stderr | 8 ++ .../fail/quantifiers/manual_bounds.stdout | 1 + .../runtime_checks/fail/quantifiers/nested.rs | 15 ++ .../fail/quantifiers/nested.stderr | 7 + .../fail/quantifiers/nested.stdout | 1 + .../fail/quantifiers/precise-info.rs | 11 ++ .../fail/quantifiers/precise-info.stderr | 5 + .../fail/quantifiers/precise-info.stdout | 1 + .../runtime_checks/fail/refined/shape.rs | 39 ++++++ .../runtime_checks/fail/refined/shape.stderr | 3 + .../runtime_checks/fail/refined/shape.stdout | 1 + .../pass/assert-assume-invariant/assert-old | Bin 0 -> 4672504 bytes .../assert-assume-invariant/assert-old.rs | 13 ++ .../pass/assert-assume-invariant/forall.rs | 8 ++ .../assert-assume-invariant/invariant-old.rs | 16 +++ .../pass/assert-assume-invariant/invariant.rs | 13 ++ .../assert-assume-invariant/old-locals.rs | 27 ++++ .../old-move-struct.rs | 17 +++ .../pass/assert-assume-invariant/old-move.rs | 14 ++ .../pass/assert-assume-invariant/sanity.rs | 7 + .../pass/assert-assume-invariant/tuple.rs | 13 ++ .../pass/extern_specs/option.rs | 26 ++++ .../pass/extern_specs/option.stdout | 2 + .../pass/pledges/conditional.rs | 44 ++++++ .../pass/pledges/conditional.stdout | 4 + .../runtime_checks/pass/pledges/percentage.rs | 34 +++++ .../pass/pledges/percentage.stdout | 8 ++ .../runtime_checks/pass/pledges/vecwrapper.rs | 66 +++++++++ .../pass/pledges/vecwrapper.stdout | 14 ++ .../pass/postconditions/custom-clone.rs | 53 +++++++ .../pass/postconditions/custom-clone.stdout | 4 + .../pass/postconditions/generic-old.rs | 26 ++++ .../pass/postconditions/generic-old.stdout | 2 + .../pass/postconditions/generic.rs | 25 ++++ .../pass/postconditions/generic.stdout | 1 + .../pass/postconditions/old-non-ref.rs | 24 ++++ .../pass/postconditions/old-non-ref.stdout | 1 + .../pass/postconditions/self-impl.rs | 29 ++++ .../pass/postconditions/self-impl.stdout | 2 + .../pass/postconditions/type-alias.rs | 21 +++ .../pass/postconditions/type-alias.stdout | 1 + .../pass/preconditions/multiple.rs | 18 +++ .../pass/preconditions/multiple.stdout | 2 + .../pass/quantifiers/exists-minimal-2.rs | 11 ++ .../pass/quantifiers/exists-minimal-2.stdout | 1 + .../pass/quantifiers/exists-old.rs | 56 ++++++++ .../pass/quantifiers/exists-old.stdout | 25 ++++ .../pass/quantifiers/forall-minimal.rs | 10 ++ .../pass/quantifiers/forall-minimal.stdout | 1 + .../pass/quantifiers/manual_bounds.rs | 26 ++++ .../pass/quantifiers/manual_bounds.stdout | 3 + .../runtime_checks/pass/refined/shape.rs | 40 ++++++ .../runtime_checks/pass/refined/shape.stdout | 1 + prusti-tests/tests/runtimetest.rs | 130 ++++++++++++++++++ 137 files changed, 1998 insertions(+) create mode 100644 prusti-tests/tests/mir_optimizations/checked_add.rs create mode 100644 prusti-tests/tests/mir_optimizations/checked_add.stdout create mode 100644 prusti-tests/tests/mir_optimizations/checked_multiplication.rs create mode 100644 prusti-tests/tests/mir_optimizations/checked_multiplication.stdout create mode 100644 prusti-tests/tests/mir_optimizations/enum.rs create mode 100644 prusti-tests/tests/mir_optimizations/enum.stdout create mode 100644 prusti-tests/tests/mir_optimizations/multiple-asserts.rs create mode 100644 prusti-tests/tests/mir_optimizations/multiple-asserts.stdout create mode 100644 prusti-tests/tests/mir_optimizations/no_contract.rs create mode 100644 prusti-tests/tests/mir_optimizations/no_contract.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/assert-old.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/assert-old.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/forall.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/forall.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant-old.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant-old.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-locals.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-locals.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move-struct.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move-struct.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/precise-error.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/precise-error.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/sanity.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/sanity.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/tuple.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/tuple.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/extern_specs/option.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/extern_specs/option.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/extern_specs/option.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/conditional.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/conditional.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/conditional.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/conditional2.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/conditional2.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/conditional2.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/percentage.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/percentage.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/percentage.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/zombie.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/zombie.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/pledges/zombie.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/generic.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/generic.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/generic.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/preconditions/multiple.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/preconditions/multiple.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/preconditions/multiple.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/nested.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/nested.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/nested.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.stdout create mode 100644 prusti-tests/tests/runtime_checks/fail/refined/shape.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/refined/shape.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/refined/shape.stdout create mode 100755 prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/assert-old create mode 100644 prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/assert-old.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/forall.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/invariant-old.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/invariant.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-locals.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-move-struct.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-move.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/sanity.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/tuple.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/extern_specs/option.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/extern_specs/option.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/pledges/conditional.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/pledges/conditional.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/pledges/percentage.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/pledges/percentage.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/pledges/vecwrapper.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/pledges/vecwrapper.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/custom-clone.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/custom-clone.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/generic-old.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/generic-old.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/generic.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/generic.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/old-non-ref.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/old-non-ref.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/self-impl.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/self-impl.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/type-alias.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/postconditions/type-alias.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/preconditions/multiple.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/preconditions/multiple.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/quantifiers/exists-old.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/quantifiers/exists-old.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/quantifiers/forall-minimal.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/quantifiers/forall-minimal.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/quantifiers/manual_bounds.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/quantifiers/manual_bounds.stdout create mode 100644 prusti-tests/tests/runtime_checks/pass/refined/shape.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/refined/shape.stdout create mode 100644 prusti-tests/tests/runtimetest.rs diff --git a/prusti-tests/Cargo.toml b/prusti-tests/Cargo.toml index 3c5ae2a7673..aef2c5f7cf3 100644 --- a/prusti-tests/Cargo.toml +++ b/prusti-tests/Cargo.toml @@ -13,6 +13,7 @@ cargo-test-support = { git = "https://github.com/rust-lang/cargo.git", rev = "ec ureq = "2.1" log = { version = "0.4", features = ["release_max_level_info"] } env_logger = "0.10" +ui_test = "0.17.0" [package.metadata.rust-analyzer] # This crate uses #[feature(rustc_private)] diff --git a/prusti-tests/tests/mir_optimizations/checked_add.rs b/prusti-tests/tests/mir_optimizations/checked_add.rs new file mode 100644 index 00000000000..ad81e8fcea0 --- /dev/null +++ b/prusti-tests/tests/mir_optimizations/checked_add.rs @@ -0,0 +1,17 @@ +//@run +//@compile-flags: -Pcheck_overflows=false +use prusti_contracts::*; + +#[trusted] +fn main() { + println!("3 + 5 = {}", add(3, 5)); + // this one will overflow, but given the contract of + // add, the overflow check can "safely" be eliminated, + // meaning this should not panic! + println!("usize::MAX + 1 = {}", add(usize::MAX, 1)); +} + +#[requires(x < 1000 && y < 1000)] +fn add(x: usize, y: usize) -> usize { + x + y +} diff --git a/prusti-tests/tests/mir_optimizations/checked_add.stdout b/prusti-tests/tests/mir_optimizations/checked_add.stdout new file mode 100644 index 00000000000..b05c744263d --- /dev/null +++ b/prusti-tests/tests/mir_optimizations/checked_add.stdout @@ -0,0 +1,2 @@ +3 + 5 = 8 +usize::MAX + 1 = 0 diff --git a/prusti-tests/tests/mir_optimizations/checked_multiplication.rs b/prusti-tests/tests/mir_optimizations/checked_multiplication.rs new file mode 100644 index 00000000000..053e3c9a364 --- /dev/null +++ b/prusti-tests/tests/mir_optimizations/checked_multiplication.rs @@ -0,0 +1,17 @@ +//@run +//@compile-flags: -Pcheck_overflows=false +use prusti_contracts::*; + +#[trusted] +fn main() { + println!("3 * 5 = {}", mul(3, 5)); + // this one will overflow, but given the contract of + // add, the overflow check can "safely" be eliminated, + // meaning this should not panic! + println!("(usize::MAX - 1) * 2 = {}", mul(usize::MAX - 1, 1)); +} + +#[requires(x < 1000 && y < 1000)] +fn mul(x: usize, y: usize) -> usize { + x * y +} diff --git a/prusti-tests/tests/mir_optimizations/checked_multiplication.stdout b/prusti-tests/tests/mir_optimizations/checked_multiplication.stdout new file mode 100644 index 00000000000..4a83bfd92c3 --- /dev/null +++ b/prusti-tests/tests/mir_optimizations/checked_multiplication.stdout @@ -0,0 +1,2 @@ +3 * 5 = 15 +(usize::MAX - 1) * 2 = 18446744073709551614 diff --git a/prusti-tests/tests/mir_optimizations/enum.rs b/prusti-tests/tests/mir_optimizations/enum.rs new file mode 100644 index 00000000000..a4b3aaf8caa --- /dev/null +++ b/prusti-tests/tests/mir_optimizations/enum.rs @@ -0,0 +1,46 @@ +//@run +//@compile-flags: -Pcheck_overflows=false +use prusti_contracts::*; + +// for variants we can not really test the behavior if we call an +// optimized version with arguments violating the precondition, because +// matching leads to a switchInt where otherwise points to an unreachable +// block. Altough we might be able to eliminate that one too? + +// Test with 3 enums that have the same memory layout: +// (so "bad" casting should not lead to errors) +enum Variants { + Case1(i32), + Case2(i32), + Case3(i32), +} + +#[trusted] +fn main() { + let x = Variants::Case2(5); + let y = Variants::Case3(42); + let z = Variants::Case1(72); + // valid call: expected result 10 + println!("{}", foo(x)); + // valid call: expected result 236 + println!("{}", foo(y)); + // invalid call, without optimizations result would be 72, + // but because of Case3 to be made into otherwise target, + // leading to result 216 + println!("{}", foo(z)); +} + +#[requires(!matches!(x, Variants::Case1(_)))] +fn foo(x: Variants) -> i32 { + match x { + Variants::Case1(x) => { + x + }, + Variants::Case2(x) => { + 2 * x + }, + Variants::Case3(x) => { + 3 * x + } + } +} diff --git a/prusti-tests/tests/mir_optimizations/enum.stdout b/prusti-tests/tests/mir_optimizations/enum.stdout new file mode 100644 index 00000000000..5851ef9a4a7 --- /dev/null +++ b/prusti-tests/tests/mir_optimizations/enum.stdout @@ -0,0 +1,3 @@ +10 +126 +216 diff --git a/prusti-tests/tests/mir_optimizations/multiple-asserts.rs b/prusti-tests/tests/mir_optimizations/multiple-asserts.rs new file mode 100644 index 00000000000..a5bdba559a7 --- /dev/null +++ b/prusti-tests/tests/mir_optimizations/multiple-asserts.rs @@ -0,0 +1,36 @@ +//@run +//@compile-flags: -Pcheck_overflows=false +use prusti_contracts::*; + +#[trusted] +fn main() { + println!("{}", foo(&mut 31)); // expected result: 60 + println!("{}", foo(&mut 1)); // expected result: 0 + println!("{}", foo(&mut 2)); + // should print 3 in theory, but with optimizations enabled + // we always take the second branch, leading to result: 2 +} + +// optimally this could be simplified to just: +// ``` +// let y = x * 2; +// y +// ``` +// However, if precondition is violated (as in main:11), the result +// will be "wrong" +#[requires(*x % 15 == 1)] +fn foo(x: &mut i32) -> i32 { + *x = *x - 1; + // prusti thinks: *x % 15 == 0 + let y = *x * 2; + if *x % 3 != 0 { + y + 1 + } else if *x % 5 == 0 { + // if precondition holds we always reach this branch + y + } else { + y - 1 + } +} + + diff --git a/prusti-tests/tests/mir_optimizations/multiple-asserts.stdout b/prusti-tests/tests/mir_optimizations/multiple-asserts.stdout new file mode 100644 index 00000000000..0dff4cef9cd --- /dev/null +++ b/prusti-tests/tests/mir_optimizations/multiple-asserts.stdout @@ -0,0 +1,3 @@ +60 +0 +2 diff --git a/prusti-tests/tests/mir_optimizations/no_contract.rs b/prusti-tests/tests/mir_optimizations/no_contract.rs new file mode 100644 index 00000000000..dec2d9773e6 --- /dev/null +++ b/prusti-tests/tests/mir_optimizations/no_contract.rs @@ -0,0 +1,41 @@ +//@run +//@compile-flags: -Pcheck_overflows=false +use prusti_contracts::*; + +// takeaway: we need a better example! +#[trusted] +fn main() { + let mut x = 0; + for i in 0..i32::MAX/5 { + x += foo(i); + } + println!("x: {x}"); +} + +// Example of a function where a traditional compiler might struggle, +// but with prusti we can simplify this to just: +// ``` +// fn foo(x: i32) -> i32 { +// 30 +// } +// ``` +// Note: actually it seems like llvm performs this optimization too.. +// This test doesn't really check that the optimization is actually +// performed, but rather that it doesn't break the program. +// To make sure it is performed we need to inspect the MIR. +fn foo(x: i32) -> i32 { + let mut y = 0; + // a set of operations that in the end, will not modify y + y = y + x; + let z = 4 * x; + y = y - z; + y = y + (3 * x); + + if y != 0 { + // unreachable! + return 42 + } else { + return 1 + } +} + diff --git a/prusti-tests/tests/mir_optimizations/no_contract.stdout b/prusti-tests/tests/mir_optimizations/no_contract.stdout new file mode 100644 index 00000000000..3e902a403a7 --- /dev/null +++ b/prusti-tests/tests/mir_optimizations/no_contract.stdout @@ -0,0 +1 @@ +x: 429496729 diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/assert-old.rs b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/assert-old.rs new file mode 100644 index 00000000000..884704b1e78 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/assert-old.rs @@ -0,0 +1,15 @@ +//@run: 101 +use prusti_contracts::*; + +#[trusted] +fn main() { + let mut a = 42; + foo(&mut a); +} + +#[trusted] +fn foo(x: &mut i32) { + *x = 1; + // fails: *x needs to be evaluated in old state + prusti_assert!(#[insert_runtime_check] old(*x) == 1); +} diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/assert-old.stderr b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/assert-old.stderr new file mode 100644 index 00000000000..e3f8798493e --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/assert-old.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/assert-old.rs:14:44: +Prusti Runtime Checks: Contract prusti_assert!(old(*x) == 1) was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/forall.rs b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/forall.rs new file mode 100644 index 00000000000..0f1d4baa95a --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/forall.rs @@ -0,0 +1,7 @@ +//@run: 101 +use prusti_contracts::*; +#[trusted] +fn main() { + let v = vec![1,2,3,4,5,6]; + prusti_assume!(#[insert_runtime_check]forall(|x: usize| x < 6 ==> v[x] < 6)); +} diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/forall.stderr b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/forall.stderr new file mode 100644 index 00000000000..82df2915187 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/forall.stderr @@ -0,0 +1,4 @@ +thread 'main' panicked at $DIR/forall.rs:6:43: +Prusti Runtime Checks: Contract prusti_assume!(forall(|x: usize| x < 6 ==> v[x] < 6)) was violated at runtime + > expression x < 6 ==> v[x] < 6 was violated for index x=5 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant-old.rs b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant-old.rs new file mode 100644 index 00000000000..ef5381d4ddb --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant-old.rs @@ -0,0 +1,16 @@ +//@run: 101 +use prusti_contracts::*; + +fn main() { + mul(&mut 50); +} + +#[trusted] +fn mul(x: &mut i32) { + let mut res = 1; + while *x > 0 { + body_invariant!(#[insert_runtime_check]old(*x) * 5 == res + *x * 5); + res = res + 5; + *x = *x-1; + } +} diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant-old.stderr b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant-old.stderr new file mode 100644 index 00000000000..afbeb18d37a --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant-old.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/invariant-old.rs:12:48: +Prusti Runtime Checks: Contract body_invariant!(old(*x) * 5 == res + *x * 5) was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant.rs b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant.rs new file mode 100644 index 00000000000..bc2ea95b13d --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant.rs @@ -0,0 +1,13 @@ +//@run: 101 +use prusti_contracts::*; + +#[trusted] +fn main() { + let mut x = 10; + let mut y = 0; + while x >= 0 { + body_invariant!(#[insert_runtime_check] x + y == 11); + x = x - 1; + y = y + 1; + } +} diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant.stderr b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant.stderr new file mode 100644 index 00000000000..38ae490736c --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/invariant.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/invariant.rs:9:49: +Prusti Runtime Checks: Contract body_invariant!(x + y == 11) was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-locals.rs b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-locals.rs new file mode 100644 index 00000000000..dfc64e3f300 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-locals.rs @@ -0,0 +1,31 @@ +//@run: 101 +use prusti_contracts::*; + +fn main() { + // passes + test1(&mut 1); + // passes + test2(&mut 10); + // fails: + test3(&mut 2); +} + +#[trusted] +fn test1(x: &mut i32) { + *x = 2; + let a = x; + prusti_assert!(#[insert_runtime_check] old(*a) == 2); +} + +#[trusted] +fn test2(x: &mut i32) { + *x = 1; + prusti_assert!(#[insert_runtime_check] {let a = x; old(*a) == 1}); +} + +#[trusted] +fn test3(x: &mut i32) { + *x = 1; + // fails: *a is assigned x in old state. + prusti_assert!(#[insert_runtime_check] old({let a = x; *a == 1})); +} diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-locals.stderr b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-locals.stderr new file mode 100644 index 00000000000..a699c309a4f --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-locals.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/old-locals.rs:30:44: +Prusti Runtime Checks: Contract prusti_assert!(old({let a = x; *a == 1})) was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move-struct.rs b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move-struct.rs new file mode 100644 index 00000000000..02f5982cf25 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move-struct.rs @@ -0,0 +1,17 @@ +//@run: 101 +use prusti_contracts::*; + +#[derive(Clone)] +struct SomeStruct(i32); + +fn main() { + let s = SomeStruct(42); + foo(s); +} + +#[trusted] +fn foo(mut s: SomeStruct) { + s.0 = 52; + // fails because evaluated in old state + prusti_assert!(#[insert_runtime_check] { old(s.0) == 52}); +} diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move-struct.stderr b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move-struct.stderr new file mode 100644 index 00000000000..8e05d6702f0 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move-struct.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/old-move-struct.rs:16:44: +Prusti Runtime Checks: Contract prusti_assert!({ old(s.0) == 52}) was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move.rs b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move.rs new file mode 100644 index 00000000000..e4e4a4da09d --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move.rs @@ -0,0 +1,14 @@ +//@run: 101 +use prusti_contracts::*; + +fn main() { + foo(43); +} + +#[trusted] +fn foo(mut x: i32) { + x = 50; + prusti_assert!(#[insert_runtime_check] x == 50); + // this one fails because evaluated in old state! + prusti_assert!(#[insert_runtime_check] old(x == 50)); +} diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move.stderr b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move.stderr new file mode 100644 index 00000000000..9407eb84d71 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/old-move.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/old-move.rs:13:44: +Prusti Runtime Checks: Contract prusti_assert!(old(x == 50)) was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/precise-error.rs b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/precise-error.rs new file mode 100644 index 00000000000..dc7b6fd0b7b --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/precise-error.rs @@ -0,0 +1,10 @@ +//@run: 101 +use prusti_contracts::*; + +#[trusted] +fn main() { + let (x, y, z) = (5, 7, 6); + // should fail with an additional message stating which + // part of the conjunction failed first + prusti_assert!(#[insert_runtime_check]x == 5 && y == 6 && z == 7); +} diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/precise-error.stderr b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/precise-error.stderr new file mode 100644 index 00000000000..48000e537f6 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/precise-error.stderr @@ -0,0 +1,4 @@ +thread 'main' panicked at $DIR/precise-error.rs:9:43: +Prusti Runtime Checks: Contract prusti_assert!(x == 5 && y == 6 && z == 7) was violated at runtime + > expression y == 6 was violated. +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/sanity.rs b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/sanity.rs new file mode 100644 index 00000000000..fce0fa5fdf6 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/sanity.rs @@ -0,0 +1,8 @@ +//@run: 101 +use prusti_contracts::*; + +fn main() { + // fails + prusti_assume!(#[insert_runtime_check] false); + prusti_assert!(#[insert_runtime_check] false); +} diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/sanity.stderr b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/sanity.stderr new file mode 100644 index 00000000000..24178fca14c --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/sanity.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/sanity.rs:6:44: +Prusti Runtime Checks: Contract prusti_assume!(false) was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/tuple.rs b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/tuple.rs new file mode 100644 index 00000000000..a4aa5010bef --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/tuple.rs @@ -0,0 +1,13 @@ +//@run: 101 +use prusti_contracts::*; + +fn main() { + bar((7,4)); +} + +#[trusted] +fn bar(mut x: (i32, i32)) { + x.0 = 10; + x.1 = 20; + prusti_assert!(#[insert_runtime_check] old(x.0 + x.1) == 10) +} diff --git a/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/tuple.stderr b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/tuple.stderr new file mode 100644 index 00000000000..aaba0a3dfee --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/assert-assume-invariant/tuple.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/tuple.rs:12:44: +Prusti Runtime Checks: Contract prusti_assert!(old(x.0 + x.1) == 10) was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/extern_specs/option.rs b/prusti-tests/tests/runtime_checks/fail/extern_specs/option.rs new file mode 100644 index 00000000000..3b876d4bc08 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/extern_specs/option.rs @@ -0,0 +1,28 @@ +//@run: 101 +use prusti_contracts::*; + +#[extern_spec] +impl std::option::Option { + #[pure] + #[insert_runtime_check] + #[ensures(matches!(*self, Some(_)) == result)] + pub fn is_some(&self) -> bool; + + #[pure] + #[insert_runtime_check] + #[ensures(self.is_some() == !result)] + pub fn is_none(&self) -> bool; + + #[trusted] + #[insert_runtime_check] + #[requires(self.is_some())] + pub fn unwrap(self) -> T; +} + +#[trusted] +fn main() { + let x: Option<()> = None; + // obviously panics! but with RT checks it should panic + // because precondition check fails! + x.unwrap(); +} diff --git a/prusti-tests/tests/runtime_checks/fail/extern_specs/option.stderr b/prusti-tests/tests/runtime_checks/fail/extern_specs/option.stderr new file mode 100644 index 00000000000..42bd3a49371 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/extern_specs/option.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/option.rs:16:5: +Prusti Runtime Checks: Contract #[requires(self.is_some())] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/extern_specs/option.stdout b/prusti-tests/tests/runtime_checks/fail/extern_specs/option.stdout new file mode 100644 index 00000000000..5fbe6ad6ebf --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/extern_specs/option.stdout @@ -0,0 +1,2 @@ +check function prusti_pre_check_item_unwrap is performed +check function prusti_post_check_item_is_some is performed diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.rs b/prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.rs new file mode 100644 index 00000000000..5e33533ebd4 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.rs @@ -0,0 +1,38 @@ +//@run: 101 +//@compile-flags: -Pcheck_overflows=false +use prusti_contracts::*; +#[derive(Clone)] +struct Percentage(usize); + +#[trusted] +#[insert_runtime_check] +#[requires(p.0 <= 100)] +#[insert_runtime_check] +#[assert_on_expiry(*result <= 100, p.0 <= 100)] +#[insert_runtime_check] +#[ensures(old(p.0) == p.0)] +fn index_mut(p: &mut Percentage) -> &mut usize { + &mut p.0 +} + +fn increment(x: &mut usize) { + *x = *x + 1; +} + +fn main() { + // this one fails because index_mut_other is called + foo(); +} + +// This testcase exists, because here the expiration location is a call +// terminator. Right after calling increment(r), r expires. +// This is handled differently than an expiration at an arbitrary statement. +#[trusted] +fn foo() { + let mut p = Percentage(100); + let r = index_mut(&mut p); + increment(r); + // r expires here, and is too high, so the check fails + println!("p now has value: {}", p.0); +} + diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.stderr b/prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.stderr new file mode 100644 index 00000000000..8c02526d3ed --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/call_expiration.rs:14:1: +Prusti Runtime Checks: Contract #[assert_on_expiry(*result <= 100, ..)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.stdout b/prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.stdout new file mode 100644 index 00000000000..b7019a341c3 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/call_expiration.stdout @@ -0,0 +1,3 @@ +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pledge_lhs_check_item_index_mut is performed diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/conditional.rs b/prusti-tests/tests/runtime_checks/fail/pledges/conditional.rs new file mode 100644 index 00000000000..94e9376ecdf --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/conditional.rs @@ -0,0 +1,44 @@ +//@run: 101 +use prusti_contracts::*; +#[derive(Clone)] +struct Percentage(usize); + +#[trusted] +#[insert_runtime_check] +#[requires(p.0 <= 100)] +#[insert_runtime_check] +#[assert_on_expiry(*result <= 100, p.0 <= 100)] +#[insert_runtime_check] +#[ensures(old(p.0) == p.0)] +fn index_mut(p: &mut Percentage) -> &mut usize { + &mut p.0 +} + +#[trusted] +#[insert_runtime_check] +#[requires(p.0 >= 100)] +#[insert_runtime_check] +#[assert_on_expiry(*result >= 100, p.0 >= 100)] +#[insert_runtime_check] +#[ensures(old(p.0) == p.0)] +fn index_mut_other(p: &mut Percentage) -> &mut usize { + &mut p.0 +} + +fn main() { + // this one fails because index_mut_other is called + foo(false); +} + +#[trusted] +fn foo(b: bool) { + let mut p = Percentage(100); + let r = if b { + index_mut(&mut p) + } else { + index_mut_other(&mut p) + }; + // this is only a "valid" assignment if foo is called with + // b = true + *r = 72; +} diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/conditional.stderr b/prusti-tests/tests/runtime_checks/fail/pledges/conditional.stderr new file mode 100644 index 00000000000..9ca1b0d44c5 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/conditional.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/conditional.rs:24:1: +Prusti Runtime Checks: Contract #[assert_on_expiry(*result >= 100, ..)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/conditional.stdout b/prusti-tests/tests/runtime_checks/fail/pledges/conditional.stdout new file mode 100644 index 00000000000..4a5d257c382 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/conditional.stdout @@ -0,0 +1,3 @@ +check function prusti_pre_check_item_index_mut_other is performed +check function prusti_post_check_item_index_mut_other is performed +check function prusti_pledge_lhs_check_item_index_mut_other is performed diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/conditional2.rs b/prusti-tests/tests/runtime_checks/fail/pledges/conditional2.rs new file mode 100644 index 00000000000..1a616df46c2 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/conditional2.rs @@ -0,0 +1,60 @@ +//@run: 101 +use prusti_contracts::*; +#[derive(Clone)] +struct Percentage(usize); + +// if these are not trusted, prusti fails.. is it a bug? +#[trusted] +#[insert_runtime_check] +#[requires(p.0 <= 100)] +#[insert_runtime_check] +#[assert_on_expiry(*result <= 100, p.0 <= 100)] +#[insert_runtime_check] +#[ensures(old(p.0) == p.0)] +fn index_mut(p: &mut Percentage) -> &mut usize { + &mut p.0 +} + +#[trusted] +#[insert_runtime_check] +#[requires(p.0 >= 100)] +#[insert_runtime_check] +#[assert_on_expiry(*result >= 100, p.0 >= 100)] +#[insert_runtime_check] +#[ensures(old(p.0) == p.0)] +fn index_mut_other(p: &mut Percentage) -> &mut usize { + &mut p.0 +} + +fn main() { + // this once succeeds because index_mut is called + // and *r = 72 right before expiration + foo(true, true); + + // this one succeeds because index_mut_other is + // called and *r is assigned 101 before expiry + foo(false, false); + + // this one fails! + foo(true, false); +} + +#[trusted] +fn foo(b1: bool, b2: bool) { + let mut p = Percentage(100); + let r = if b1 { + index_mut(&mut p) + } else { + index_mut_other(&mut p) + }; + *r = 101; + if b2 { + *r = 72; + // pledge expires here, if !b1 this causes + // an error + } else { + // pledge expires here, before assignment + // if b1, this should cause an error! + p.0 = 101; + } +} diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/conditional2.stderr b/prusti-tests/tests/runtime_checks/fail/pledges/conditional2.stderr new file mode 100644 index 00000000000..b1068a2df4e --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/conditional2.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/conditional2.rs:14:1: +Prusti Runtime Checks: Contract #[assert_on_expiry(*result <= 100, ..)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/conditional2.stdout b/prusti-tests/tests/runtime_checks/fail/pledges/conditional2.stdout new file mode 100644 index 00000000000..bc5af2410d7 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/conditional2.stdout @@ -0,0 +1,11 @@ +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pledge_lhs_check_item_index_mut is performed +check function prusti_pledge_check_item_index_mut is performed +check function prusti_pre_check_item_index_mut_other is performed +check function prusti_post_check_item_index_mut_other is performed +check function prusti_pledge_lhs_check_item_index_mut_other is performed +check function prusti_pledge_check_item_index_mut_other is performed +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pledge_lhs_check_item_index_mut is performed diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/percentage.rs b/prusti-tests/tests/runtime_checks/fail/pledges/percentage.rs new file mode 100644 index 00000000000..590250e7e5d --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/percentage.rs @@ -0,0 +1,36 @@ +//@run: 101 +use prusti_contracts::*; +#[derive(Clone)] +struct Percentage(usize); + +#[trusted] +#[insert_runtime_check] +#[requires(p.0 <= 100)] +#[insert_runtime_check] +#[assert_on_expiry(*result <= 100, p.0 <= 100)] +#[insert_runtime_check] +#[ensures(old(p.0) == p.0)] +fn index_mut(p: &mut Percentage) -> &mut usize { + &mut p.0 +} + +fn main() { + // this one passes because *r will be set to 72 + foo(true); + // this one fails because *r is set to 101 + foo(false); +} + +#[trusted] +fn foo(b: bool) { + let mut p = Percentage(50); + let r = index_mut(&mut p); + if b { + *r = 72; + } else { + // this assignment violates the pledge + *r = 101; + p.0 = 43 + } + p.0 = 32; +} diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/percentage.stderr b/prusti-tests/tests/runtime_checks/fail/pledges/percentage.stderr new file mode 100644 index 00000000000..f85f8618db4 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/percentage.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/percentage.rs:13:1: +Prusti Runtime Checks: Contract #[assert_on_expiry(*result <= 100, ..)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/percentage.stdout b/prusti-tests/tests/runtime_checks/fail/pledges/percentage.stdout new file mode 100644 index 00000000000..35151282828 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/percentage.stdout @@ -0,0 +1,7 @@ +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pledge_lhs_check_item_index_mut is performed +check function prusti_pledge_check_item_index_mut is performed +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pledge_lhs_check_item_index_mut is performed diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.rs b/prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.rs new file mode 100644 index 00000000000..f717570fc1c --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.rs @@ -0,0 +1,66 @@ +//@run: 101 +use prusti_contracts::*; + +#[derive(Clone)] +pub struct VecWrapperI32 { + pub v: Vec +} + +impl VecWrapperI32 { + #[trusted] + #[insert_runtime_check] + #[ensures(result.len() == 5)] + pub fn new() -> Self { + Self { + v: vec![1,2,3,4,5], + } + } + + #[trusted] + #[pure] + pub fn len(&self) -> usize { + self.v.len() + } + + /// A ghost function for specifying values stored in the vector. + #[trusted] + #[pure] + #[insert_runtime_check] + #[requires(index < self.len())] + pub fn lookup(&self, index: usize) -> i32 { + self.v[index] + } + + #[trusted] + pub fn insert(&mut self, value: i32) { + self.v.push(value); + } + + #[trusted] + #[insert_runtime_check] + #[requires(index < self.len())] + #[insert_runtime_check] + #[ensures(*result == old(self.lookup(index)))] + // failing pledge: the quantifier iterates over all elements + // including the one that can be changed. + #[insert_runtime_check] + #[after_expiry( + self.len() == old(self.len()) && + self.lookup(index) == before_expiry(*result) && + forall( + |i: usize| (i < self.len()) ==> + self.lookup(i) == old(self.lookup(i)) + ) + )] + pub fn index_mut(&mut self, index: usize) -> &mut i32 { + self.v.get_mut(index).unwrap() + } +} + +fn main() { + let mut vw = VecWrapperI32::new(); + let x = vw.index_mut(3); + *x = 42; + vw.insert(50) +} + diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.stderr b/prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.stderr new file mode 100644 index 00000000000..86a346a3eec --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.stderr @@ -0,0 +1,14 @@ +thread 'main' panicked at $DIR/vecwrapper.rs:55:5: +Prusti Runtime Checks: Contract #[after_expiry(self.len() == old(self.len()) && + self.lookup(index) == before_expiry(*result) && + forall( + |i: usize| (i < self.len()) ==> + self.lookup(i) == old(self.lookup(i)) + ))] was violated at runtime + > expression (i < self.len()) ==> + self.lookup(i) == old(self.lookup(i)) was violated for index i=3 + > expression forall( + |i: usize| (i < self.len()) ==> + self.lookup(i) == old(self.lookup(i)) + ) was violated. +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.stdout b/prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.stdout new file mode 100644 index 00000000000..593cbcc951e --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/vecwrapper.stdout @@ -0,0 +1,14 @@ +check function prusti_post_check_item_new is performed +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pledge_check_item_index_mut is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/zombie.rs b/prusti-tests/tests/runtime_checks/fail/pledges/zombie.rs new file mode 100644 index 00000000000..8ce1537b084 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/zombie.rs @@ -0,0 +1,45 @@ +//@run: 101 +use prusti_contracts::*; +#[derive(Clone)] +struct Percentage(usize); + +#[trusted] +#[insert_runtime_check] +#[requires(p.0 <= 100)] +#[insert_runtime_check] +#[assert_on_expiry(*result <= 100, p.0 <= 100)] +#[insert_runtime_check] +#[ensures(old(p.0) == p.0)] +fn index_mut(p: &mut Percentage) -> &mut usize { + &mut p.0 +} + +fn main() { + // runs through correctly, because at expiration p.0 is 72 + foo(true); + // fails because p.0 = 102 + foo(false); +} + +#[trusted] +fn foo(b: bool) { + let mut p = Percentage(50); + let mut r = index_mut(&mut p); + let mut z = 1; + if !b { + let s = r; + *s = 102; + } else { + // this branch doesn't cause a failure! + *r = 105; + let t = r; + r = &mut z; + *t = 78; // temporary violate pledge + // expiration + p.0 = 105; + // violating the condition right after pledge should be checked, + // increases chances of us catching an error if it's inserted in the + // wrong place + } + p.0 = 32; +} diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/zombie.stderr b/prusti-tests/tests/runtime_checks/fail/pledges/zombie.stderr new file mode 100644 index 00000000000..9c80b7d4837 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/zombie.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/zombie.rs:13:1: +Prusti Runtime Checks: Contract #[assert_on_expiry(*result <= 100, ..)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/pledges/zombie.stdout b/prusti-tests/tests/runtime_checks/fail/pledges/zombie.stdout new file mode 100644 index 00000000000..35151282828 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/pledges/zombie.stdout @@ -0,0 +1,7 @@ +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pledge_lhs_check_item_index_mut is performed +check function prusti_pledge_check_item_index_mut is performed +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pledge_lhs_check_item_index_mut is performed diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.rs b/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.rs new file mode 100644 index 00000000000..3df1da3a36c --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.rs @@ -0,0 +1,28 @@ +//@run: 101 +use prusti_contracts::*; + +fn main() { + let mut x = GenericStruct { x: 40}; + let mut y = GenericStruct { x: 32}; + let c = x.stuff(&mut y); +} + +#[derive(Clone)] +struct GenericStruct { + pub x: T, +} + +impl> GenericStruct { + #[trusted] + // fails because of the +1 + #[insert_runtime_check] + #[ensures(self.x == old(other.x))] + #[insert_runtime_check] + #[ensures(other.x == old(self.x))] + pub fn stuff(&mut self, other: &mut Self) { + std::mem::swap(&mut self.x, &mut other.x); + // make check fail: + self.x = self.x + other.x; + } +} + diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stderr b/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stderr new file mode 100644 index 00000000000..1fc5bb29f90 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/generic-old.rs:22:5: +Prusti Runtime Checks: Contract #[ensures(self.x == old(other.x))] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stdout b/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stdout new file mode 100644 index 00000000000..ac1c314e027 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stdout @@ -0,0 +1,2 @@ +check function prusti_post_check_item_stuff is performed +check function prusti_post_check_item_stuff is performed diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/generic.rs b/prusti-tests/tests/runtime_checks/fail/postconditions/generic.rs new file mode 100644 index 00000000000..c8ca7c330fe --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/generic.rs @@ -0,0 +1,25 @@ +//@run: 101 +use prusti_contracts::*; + +fn main() { + let a: i32 = 50; + let x = GenericStruct { x: a}; + let y = GenericStruct { x: a}; + let c = x.stuff(&y); +} + +#[derive(Clone)] +struct GenericStruct { + pub x: T, +} + +impl GenericStruct { + #[trusted] + // fails because of the +1 + #[insert_runtime_check] + #[ensures(result == self.x + other.x + 1)] + pub fn stuff(&self, other: &Self) -> i32 { + self.x + other.x + } +} + diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/generic.stderr b/prusti-tests/tests/runtime_checks/fail/postconditions/generic.stderr new file mode 100644 index 00000000000..c5a49db89ce --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/generic.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/generic.rs:21:5: +Prusti Runtime Checks: Contract #[ensures(result == self.x + other.x + 1)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/generic.stdout b/prusti-tests/tests/runtime_checks/fail/postconditions/generic.stdout new file mode 100644 index 00000000000..a8f6389766e --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/generic.stdout @@ -0,0 +1 @@ +check function prusti_post_check_item_stuff is performed diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.rs b/prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.rs new file mode 100644 index 00000000000..beb5d318558 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.rs @@ -0,0 +1,24 @@ +//@run: 101 +//@compile-flags: -Pcheck_overflows=false +use prusti_contracts::*; + +#[derive(Clone)] +struct Something { + pub field: i32, +} + +// has to fail, since x.field in specification refers +// to old state too +#[trusted] +#[insert_runtime_check] +#[ensures(old(x.field) + 4 == x.field)] +fn nonsense(mut x: Something) { + x.field = x.field + 4; +} + +fn main() { + let s = Something { + field: 1, + }; + nonsense(s); +} diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.stderr b/prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.stderr new file mode 100644 index 00000000000..a35fb3be2ea --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/old-non-ref.rs:15:1: +Prusti Runtime Checks: Contract #[ensures(old(x.field) + 4 == x.field)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.stdout b/prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.stdout new file mode 100644 index 00000000000..ff9419f1223 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/old-non-ref.stdout @@ -0,0 +1 @@ +check function prusti_post_check_item_nonsense is performed diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.rs b/prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.rs new file mode 100644 index 00000000000..facee4a940a --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.rs @@ -0,0 +1,22 @@ +//@run: 101 +use prusti_contracts::*; + +#[trusted] +fn main() { + let mut x = 5; + let mut y = 6; + swap(&mut x, &mut y); + println!("function executed to the end"); +} + +// specifications are checked in reverse order (apparently) +// to check that both specifications are checked at runtime, +#[trusted] +#[insert_runtime_check] +#[ensures(old(*x) == *y && old(*y) == *x)] +fn swap(x: &mut i32, y: &mut i32) { + let z = *x; + // this causes postcondition to fail + *x = *y + 1; + *y = z; +} diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.stderr b/prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.stderr new file mode 100644 index 00000000000..288e61ad862 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.stderr @@ -0,0 +1,4 @@ +thread 'main' panicked at $DIR/old-pointers.rs:17:1: +Prusti Runtime Checks: Contract #[ensures(old(*x) == *y && old(*y) == *x)] was violated at runtime + > expression old(*y) == *x was violated. +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.stdout b/prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.stdout new file mode 100644 index 00000000000..67c5b52ad28 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/old-pointers.stdout @@ -0,0 +1 @@ +check function prusti_post_check_item_swap is performed diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.rs b/prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.rs new file mode 100644 index 00000000000..9dcef87ff07 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.rs @@ -0,0 +1,14 @@ +//@run: 101 +use prusti_contracts::*; + +fn main() { + foo(3); + foo(2); +} + +#[trusted] +#[insert_runtime_check] +#[ensures(result % 2 == 0)] +fn foo(x: i32) -> i32 { + x + 1 +} diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.stderr b/prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.stderr new file mode 100644 index 00000000000..0144c57ea5e --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/post-simple.rs:12:1: +Prusti Runtime Checks: Contract #[ensures(result % 2 == 0)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.stdout b/prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.stdout new file mode 100644 index 00000000000..04b932cc1e9 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/post-simple.stdout @@ -0,0 +1,2 @@ +check function prusti_post_check_item_foo is performed +check function prusti_post_check_item_foo is performed diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.rs b/prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.rs new file mode 100644 index 00000000000..59bba99aad8 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.rs @@ -0,0 +1,30 @@ +//@run: 101 +use prusti_contracts::*; + +#[trusted] +fn main() { + let mut yxe = Something::new(); + yxe.increment(); + println!("getting to the end"); +} + +#[derive(Clone)] +struct Something { + x: i32, +} + +impl Something { + pub fn new() -> Self { + Self { + x: 5, + } + } + + #[trusted] + // failing postcondition + #[insert_runtime_check] + #[ensures(old(self.x) == self.x)] + pub fn increment(&mut self) { + self.x += 1; + } +} diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.stderr b/prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.stderr new file mode 100644 index 00000000000..0a65b2d97ac --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/self-impl.rs:27:5: +Prusti Runtime Checks: Contract #[ensures(old(self.x) == self.x)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.stdout b/prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.stdout new file mode 100644 index 00000000000..c9214128642 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/self-impl.stdout @@ -0,0 +1 @@ +check function prusti_post_check_item_increment is performed diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.rs b/prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.rs new file mode 100644 index 00000000000..4aeb0f67119 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.rs @@ -0,0 +1,21 @@ +//@run: 101 +use prusti_contracts::*; +#[derive(Clone)] +struct SomeStruct { + pub x: T +} + +type TypeAlias<'a, T> = &'a mut SomeStruct; + +fn main() { + let mut s1 = SomeStruct { x: 2}; + let mut s2 = SomeStruct { x: 3}; + foo(&mut s1, &mut s2); +} + +#[trusted] +#[insert_runtime_check] +#[ensures(old(x.x) == y.x)] +fn foo>(x: TypeAlias, y: TypeAlias) { + y.x = x.x + y.x; +} diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.stderr b/prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.stderr new file mode 100644 index 00000000000..858c0467626 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/type-alias.rs:19:1: +Prusti Runtime Checks: Contract #[ensures(old(x.x) == y.x)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.stdout b/prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.stdout new file mode 100644 index 00000000000..58140c90ea5 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/type-alias.stdout @@ -0,0 +1 @@ +check function prusti_post_check_item_foo is performed diff --git a/prusti-tests/tests/runtime_checks/fail/preconditions/multiple.rs b/prusti-tests/tests/runtime_checks/fail/preconditions/multiple.rs new file mode 100644 index 00000000000..dd214848638 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/preconditions/multiple.rs @@ -0,0 +1,20 @@ +//@run: 101 +use prusti_contracts::*; + +#[trusted] +fn main() { + foo(41, 42); // first contract fails, which should be checked second +} + +// This test is about checking if multiple precondition checks are +// properly chained. +// They are currently executed bottom up. If this ever breaks, maybe +// reorder the contracts, and make sure both checks are executed +// (meaning stdout file contains to check messages) +#[insert_runtime_check] +#[requires(x == 42)] +#[insert_runtime_check] +#[requires(y == 42)] +fn foo(x: i32, y: i32) { + +} diff --git a/prusti-tests/tests/runtime_checks/fail/preconditions/multiple.stderr b/prusti-tests/tests/runtime_checks/fail/preconditions/multiple.stderr new file mode 100644 index 00000000000..b66a37d3391 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/preconditions/multiple.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/multiple.rs:18:1: +Prusti Runtime Checks: Contract #[requires(x == 42)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/preconditions/multiple.stdout b/prusti-tests/tests/runtime_checks/fail/preconditions/multiple.stdout new file mode 100644 index 00000000000..304645d659a --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/preconditions/multiple.stdout @@ -0,0 +1,2 @@ +check function prusti_pre_check_item_foo is performed +check function prusti_pre_check_item_foo is performed diff --git a/prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.rs b/prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.rs new file mode 100644 index 00000000000..b614f4bb08d --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.rs @@ -0,0 +1,12 @@ +//@run: 101 +use prusti_contracts::*; + +#[trusted] +fn main() { + foo(2); + foo(3); +} + +#[insert_runtime_check] +#[requires(_x % 2 == 0)] +fn foo(_x: i32) {} diff --git a/prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.stderr b/prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.stderr new file mode 100644 index 00000000000..975efb1ff26 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/pre-simple.rs:12:1: +Prusti Runtime Checks: Contract #[requires(_x % 2 == 0)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.stdout b/prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.stdout new file mode 100644 index 00000000000..304645d659a --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/preconditions/pre-simple.stdout @@ -0,0 +1,2 @@ +check function prusti_pre_check_item_foo is performed +check function prusti_pre_check_item_foo is performed diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.rs b/prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.rs new file mode 100644 index 00000000000..2cbff3ba201 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.rs @@ -0,0 +1,53 @@ +//@run: 101 +use prusti_contracts::*; + +#[derive(Clone)] +struct VecWrapper { + content: Vec, +} + +impl VecWrapper { + #[trusted] + #[insert_runtime_check] + #[ensures(result.len() == 8)] + pub fn new() -> Self { + Self { + content: vec![1,2,3,4,5,6,7,8], + } + } + + #[pure] + #[trusted] + #[insert_runtime_check] + #[requires(i < self.len())] + pub fn lookup(&self, i: usize) -> i32 { + *self.content.get(i).unwrap() + } + + #[pure] + #[trusted] + pub fn len(&self) -> usize { + self.content.len() + } + + #[trusted] + #[insert_runtime_check] + #[requires(i < self.len())] + #[insert_runtime_check] + #[ensures(old(self.len()) == self.len())] + // failing quantifier: all elements stay untouched + #[insert_runtime_check] + #[ensures(forall(|j: usize| (j < self.len()) ==> self.lookup(j) == old(self.lookup(j))))] + pub fn set(&mut self, i: usize, x: i32) { + self.content[i] = x; + } +} + +#[trusted] +fn main() { + let mut vec = VecWrapper::new(); + vec.set(4, 55); + println!("executed"); + +} + diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.stderr b/prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.stderr new file mode 100644 index 00000000000..13c16c59f15 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.stderr @@ -0,0 +1,4 @@ +thread 'main' panicked at $DIR/exists-old.rs:41:5: +Prusti Runtime Checks: Contract #[ensures(forall(|j: usize| (j < self.len()) ==> self.lookup(j) == old(self.lookup(j))))] was violated at runtime + > expression (j < self.len()) ==> self.lookup(j) == old(self.lookup(j)) was violated for index j=4 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.stdout b/prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.stdout new file mode 100644 index 00000000000..d87aca787bb --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/exists-old.stdout @@ -0,0 +1,13 @@ +check function prusti_post_check_item_new is performed +check function prusti_pre_check_item_set is performed +check function prusti_post_check_item_set is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.rs b/prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.rs new file mode 100644 index 00000000000..5211c325dbc --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.rs @@ -0,0 +1,19 @@ +//@run: 101 +use prusti_contracts::*; + +// here the sum can reach 42 and violate this precondition +#[trusted] +#[insert_runtime_check] +#[requires( + forall( + #[runtime_quantifier_bounds(0..=20, 12..=22)] + |x: usize, y: usize| (x <= 20) && (y <= 22) && y >= 12 ==> x + y <= 41 + ) +)] +fn bar() {} + +#[trusted] +fn main() { + bar(); + println!("program intact"); +} diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.stderr b/prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.stderr new file mode 100644 index 00000000000..d3aff2d57bb --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.stderr @@ -0,0 +1,8 @@ +thread 'main' panicked at $DIR/manual_bounds.rs:13:1: +Prusti Runtime Checks: Contract #[requires(forall( + #[runtime_quantifier_bounds(0..=20, 12..=22)] + |x: usize, y: usize| (x <= 20) && (y <= 22) && y >= 12 ==> x + y <= 41 + ))] was violated at runtime + > expression (x <= 20) && (y <= 22) && y >= 12 ==> x + y <= 41 was violated for index y=22 + > expression #[trusted] was violated for index x=20 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.stdout b/prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.stdout new file mode 100644 index 00000000000..6f489c7402e --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/manual_bounds.stdout @@ -0,0 +1 @@ +check function prusti_pre_check_item_bar is performed diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/nested.rs b/prusti-tests/tests/runtime_checks/fail/quantifiers/nested.rs new file mode 100644 index 00000000000..dbfb565a8e3 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/nested.rs @@ -0,0 +1,15 @@ +//@run: 101 +use prusti_contracts::*; + +#[trusted] +fn main() { + foo(400); +} + +// failing quantifier, because z + x is never 0, comparison +// would have to be z >= -x +#[insert_runtime_check] +#[requires(forall(|y: i32| (y >= 0 && y <= x) ==> exists( + |z: i32| z > -x && z <= 0 ==> z + y == 0) +))] +fn foo(x: i32) {} diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/nested.stderr b/prusti-tests/tests/runtime_checks/fail/quantifiers/nested.stderr new file mode 100644 index 00000000000..4673b6d5601 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/nested.stderr @@ -0,0 +1,7 @@ +thread 'main' panicked at $DIR/nested.rs:15:1: +Prusti Runtime Checks: Contract #[requires(forall(|y: i32| (y >= 0 && y <= x) ==> exists( + |z: i32| z > -x && z <= 0 ==> z + y == 0) +))] was violated at runtime + > expression (y >= 0 && y <= x) ==> exists( + |z: i32| z > -x && z <= 0 ==> z + y == 0) was violated for index y=400 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/nested.stdout b/prusti-tests/tests/runtime_checks/fail/quantifiers/nested.stdout new file mode 100644 index 00000000000..408e13fdcbc --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/nested.stdout @@ -0,0 +1 @@ +check function prusti_pre_check_item_foo is performed diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.rs b/prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.rs new file mode 100644 index 00000000000..e93e039d6fd --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.rs @@ -0,0 +1,11 @@ +//@run:101 +use prusti_contracts::*; + +#[trusted] +fn main() { + foo(30, 25); +} + +#[insert_runtime_check] +#[requires(a % 2 == 0 && forall(|x: u8| a + b + x <= 100 && a + b - x > 50))] +fn foo(a: u8, b: u8) {} diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.stderr b/prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.stderr new file mode 100644 index 00000000000..618c1a571ed --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.stderr @@ -0,0 +1,5 @@ +thread 'main' panicked at $DIR/precise-info.rs:11:1: +Prusti Runtime Checks: Contract #[requires(a % 2 == 0 && forall(|x: u8| a + b + x <= 100 && a + b - x > 50))] was violated at runtime + > expression a + b - x > 50 was violated. + > expression a + b + x <= 100 && a + b - x > 50 was violated for index x=5 +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.stdout b/prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.stdout new file mode 100644 index 00000000000..408e13fdcbc --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/quantifiers/precise-info.stdout @@ -0,0 +1 @@ +check function prusti_pre_check_item_foo is performed diff --git a/prusti-tests/tests/runtime_checks/fail/refined/shape.rs b/prusti-tests/tests/runtime_checks/fail/refined/shape.rs new file mode 100644 index 00000000000..4d7d8cba0b0 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/refined/shape.rs @@ -0,0 +1,39 @@ +//@run: 101 +use prusti_contracts::*; + +trait Shape { + type T; + fn area(&self) -> Self::T; +} + +struct Rectangle { + height: T, + width: T, +} + +impl Shape for Rectangle +where + T: std::ops::Mul + Copy, +{ + type T = T; + fn area(&self) -> T { + self.height * self.width + } +} + +#[trusted] +#[insert_runtime_check] +#[refine_spec(where S: PartialOrd, [ + ensures(result.1 >= result.0) +])] +fn area_pair(a: &dyn Shape, b: &dyn Shape) -> (S, S) { + (a.area(), b.area()) +} + + +#[trusted] +fn main() { + let r1 = Rectangle { height: 6, width: 10}; + let r2 = Rectangle { height: 5, width: 10}; + area_pair(&r1, &r2); +} diff --git a/prusti-tests/tests/runtime_checks/fail/refined/shape.stderr b/prusti-tests/tests/runtime_checks/fail/refined/shape.stderr new file mode 100644 index 00000000000..2acf3a92b20 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/refined/shape.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/shape.rs:29:1: +Prusti Runtime Checks: Contract #[ensures(result.1 >= result.0)] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/refined/shape.stdout b/prusti-tests/tests/runtime_checks/fail/refined/shape.stdout new file mode 100644 index 00000000000..791e6c72f09 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/refined/shape.stdout @@ -0,0 +1 @@ +check function prusti_post_check_item_area_pair is performed diff --git a/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/assert-old b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/assert-old new file mode 100755 index 0000000000000000000000000000000000000000..56de82ee6f1d9498b7bd051d4eb1cae81b31f7fd GIT binary patch literal 4672504 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 z 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

5CLS71-37@_vbKTp*`Ka~*>E(EfN*4h1QlLjBDW zfmaforoiun%a~&uWCj$i0OCo1se`(YNH+tiXegbCujBFvI%%!qhSPSW*B1)yddV)z zoYx`;qqBE6_Xf1(`3do*?FL-(3dqi_46)qKN<&=hV(cteSs}gAMcUyWh4d`^u?xF% zgVKY40N~{mLr)#@bQT?ml-H3S2RbW0E(T77Y}MAl#-jlwij#WP7%Mz+v_%_21IPP- zPs>WDBe#H6rAobgz|zB~=p{&HZU08AIg2i3%*ub?AK!hvYP~82J!v~F9`kihA1qir zMc+b-pZmE-{;_8xMYeRK&s=?FpjL~k?}AiNhnh3 zq3?AP4#(8C*+rU%FCHda+6xz)Y-;h5C?r->TiQ#Fg^t#R<`pNab7i;MjYh38FtCdM z%zc5%)O!a*xUMpsIaw{ZTlj$)a=78?ujxF6y% zHsko|#(Z_uHa4ghRc)i)*0)>rcI&8l2fKc#0O#JU!Kr++mytKp zc)KZf(3&OANWr;@DZtcYH>&w^FR1virot-g>dfxW?jHqSRUn6v9gMw-0LWnUKyh&u|)`RzO=@c#Kfeow)W(4Q8Gim`&)vfq`X>g1`HV z6Zyu-z`#oWz^F4G=l234CpLTuf}CWX8$2rsrh;i9EkM zZYGk+E-cPV)AOuXq+HblvJ$HIZ&MlH0t-%~KXic?>jYgkEnI9f**tp(% znfP16TQs$56G6g1Qy`)jhZfx*i$c_rXe;#!CXIr;Sz};8kO2694b=C|y%s(B6zPiB zQ?oYYWD68{tl*%nw_zQJFY(JpnD;A74Zz>m4c<5o9$rTC~s)SWzy0aZC7J z$B{-2arbiemZmkm*k32E!+T-;g5Sp|3LcH7w?!wT_3ZfZ7^TXYB04D2Fb!wM8OwFX zfR0x;X~F8VXeyAm)S|Oh)}SbGk(0ttpFl!N(V`=!=+j6QFuIaj{+^bFTqj9kxSo}8 z+f%O|zUnk*@xm#(*-6b`G)1=|WuFQ+oY}$lYt{Z-P5XV6s>xbYn9R8cLj+`E;?gtn zJ~L6c(RdL;&&3a_|CdhD!ANociw!w;d&PAyZl3YF#-t$@a4ay4;AEi|{u%W4;STYK zA2vlrCk2H_7b4|sPM9YhQ%78e>TnUzm+`kGCP?q>)y9QTSkUnwJ)JtLp4UH0YSf>X zmTSZLvSsw!UGLyXw00DPw8o^Sp+qI5g@0GR3@gZkoq?q<2BF1t%q z@Ari$ygn177c-8j8UF$~ZZl?#3>uB%N++|$)Tk!`n%k&uq5Nblh9>rtVM(8*tltNG zA*y?Tr~N7~o~*~!*mxAze1a8eLYw-s4R|hBx`%UbMHe9Pl+8DDIDehM_BRo} zQ&nvZHu4kG0J8_c2s=ioT6VK^Zh?uUeKjn!Y3hg<)1<@{s~^Yyd`f}BaE#Q>vLqjrO~gMa+1(cSW$c)GFo693Px-;I2nr2zQJ1 z5U-E3cP+aaWc!Co_XJ0pDRigCpaxLZ@bCA)@0!~d?OKZ*B0|he!{QWw9rh5cE|qOl z@$D!MDU#x2wjnJ##}BtTX>>xEP<_ac%2?l`D^y9JhU|qkWzjWGvwX->O>K8a!{`OU zCf=T0$Lwl1aI2=zbWW^HC!*`eO4|4RbvjAf-~GkA5TM;o)s5`FuMUld(a*km36sF5 z3Y03fjS3w1-$Xa#njna2iM|2Jw;d$i3%>#M4;;|GZZHU+ z0myv-;tqeG>1br!UvwQG-rfv51KB$_yky6Y00V?42O#vK^Pi=0WZw4&YskJXNZ0j) zfPrYtsuR&C9b5(=(PL;$G>qQJLNp1-IV41>u;@Akf1OzQiH5Kh5Zv_+orYv6wADA7 zEP4mZ2w?stBApYc+r6+TQg@Ig<44eLUg*P-OCQJg#{2|=TIg^1EVLU997(|4sg)WI z@Thi0gw2>N&^gTzkmqCbv)P(kGI@(>&u|^1Ynh%EE<8`jU+NddP0=|tFN`93w70Np zI}ESkP~9$+MoI;-du-y&qA=8XB6dyf8w}%lQ-0&r&NVQlHYY2?HD0a{3@F?uC^)S9(nY&ul4P^(mGRm2zC!|hQH zoC`#3s`mJbEo*S}bkkST*wR;oaUbLfAamn7dlUp~;z=<~mxn9_pdutLvtVx%5%pLi zGLB9*5%KC+B4(_E-V`RwH?UxBT7Y4zYmG|2WoqZ;VPINiNCSw6hff0l(vB0|ZEE%x!p-*UWdwL?)xWxt zuNZxF-v|RT&#B)F7mk}HqiwC9hJm!_FEKUrzHn({Lx;rlW`gwRFeKkNjk1(Yu&5O> zNIXKtA}0>+n5yp{QN3KQVY?7P#GY_zQ~kZe_5DmS%=T+b!;O4na>yR7z#cO}e{Pr1 z?K0y3H}J$?L{FHY9~Or0VVyTl+XP`S0)pgT=O6+T%%j6F6LFL+8yGhD-voJ67_wXv zRBb5WX00%e1Ki93Y)gs6GJKnWl>y9IbYPp$Y|);LlB12vblV1bb4#IAwdN zA?Xdj3V;OLk{-%-KneABdN8-17Tu!WI5vI`Y>`dx4Z7a~T{Mq+gYW365HmdjHe)OE z%^)kt_1QqzFz5<(&uk#<%dZLbquIi|9)*M4HJ82(r9*8t7vJ~v5GB6FTEIupC#T9h zP!(+QEFfz!$O`dx7SQ#M*M&OKBjp?WML8$#@j8;0?o&9eb4*!u3FT?A;MHg^y1 zuV;o@>XGI?Z3xVHW0*tzr(!Qq5#ntB$rwK?)Fa*dnYIB~Q1-fqc4nBgOgAat6+vyL z2tE*QKq7UK%p-bv1o;_)|02M9eTLl+`kMhMblxFgiN))*JE9=W;8xUuZ;Ii~4AON} z99;p9_sRCngCy?!M}rr+g0=?i8IMAD*R!kDMOe$=vd7I+Ci7@gv2Hpr&IAm+(^{&I zKPr0QT~2dzxXOJ55e|i8?gI>_7Q4j9e6=}6xH09um45QvNEK;z90jnPdF zK+8zU8P5>k>5vo4vOZIFze80bCUs!>-yCRZ+Smc;u5Xsp!mRMO@1=Ez@XmpGLodZ7ct_0jFq7n_+HxkXirv-~m|V4cE}Ms*9)ggZ1H zmg(5hWMLAgJM|n^r$PHRr@D9aaTj%B`1_oi4q`XtC<%a%0stFZ9~}uhDWrSOT=o)0Pu7vbR|2kg!Df!fx;{`+ z@YN8qtTv+6A9be&{am#nea&D0m!Hb+-2*$lRZ2zo5EcM}mt(l6$D|7_6rCuw#yB!0 zU%-9Gd@?6M)?cE1-P{R{Nb(P0u5qsk~$De})O|lS}<^?}%#d#{O*8J>5Yb!L&Znu)jlt z*ZAra_g~~7k6=KbXczXYbP;iVc@qF(KeDOYJ6eKP=V)EGUJai8XuA4j0> zlSaQc0`-h}6aK7;@d;@eP8E5VP(RPe?etDHDt)xf;I`i$kpu;p6Tic{uLhw9)g$>7 z+&tY_zm`hsP+F|3n>{S+b&;4OYA5M3Mk?YRQzc#BCx(vR_S_+En&Y-=2p+xGaglL` zQz?y8^lV+r-`HuHa2KV5naqf}OvCiBB#GzsYNwv$O83j#Z)iw~IMvyRyjjER-cNR? z2H|0fI};?_&AvYtNWeM0EPiMFZxOJ#mtuBop7Jj5T``^F**gR-&IPa$yeQKglTJKk zo~b|DNqR9#jo~y|88;fpGgkCPrlO{k;;5M{p>E{s=5XIr&oRNwbZt|8j|q+0M84`= zQ=LS@oovYN`QDug!;PMfzsKS4GW=Eij#-8ri&D760;kn;cG>20t<9LyTTq&x)j?_R z#qUOE*E>+Y*vQ8mwR9f`#|;D!O$BH_0OH#oeWdikn6l^vkzD8lY7Z0jh-e+;d{@RXxY^XyD;sRKusk$u$7T`X~}cU~!g_io|{KQ;D0=BN9x* z^1N;dTNb}?{fJ_7U&9_Px)NxGUhXSi6LY@`YCJk`R?zfA)iECVUn?C77Tu${7yi-I z#6S9*n7rcd7er{Zv>cI(^+tDfVa3Sh>x+H+GQ|)!KHd~{su>$Cp+9B2v3;fxV;9f*k* z?inNLrZoIn7C)!_G=1|rK)n1yjy%L6CEQUQ;}p9E#n@)>`|^UjC>Gs?azYs53z~H4 z1E}ulzV3kh13-9ibXWU7E)pb!V+(?fHMQYs01%5leyis>s9tL3>`J{gX>LM1j29+o zLp+2d0U^F0p; zCQ28ZUBr((Mms{e69o%pJKu;= z$bUl_A-dB&-?8h5ed0M?aR2ECr@CoJ7r{ehtJpN|*n6j-EO)bNdiOCh6#x=lJZ(tZ zBRi#g%Fgn`Gpptg=_Y7*wVq3R_EN<)e$x7e_Xofma4m1l_F#xbcWZ8XoFAJzU8nxf zh)Nk#7Hwcz^o)=AR7)DF4@1=eJ2MUlw&-QR5we-n5P3WR$N}m)qcWz_#M+{fwS6Ms zH657OClPyZ2QvD^jY~jA$VACBFzquz41-;Px9DpC6!vGuhp1Zg9n^vm8}<#wSM2bZ z!mj|efp@RA+TFFrG&<-K9@)6?9XI1-`QX!&09UV(G6lR30DIO5nZkY^VCzLxrhpd# zFdI6V0$m26bv)6UDbOtplrQ}kEA~!dv7Muh#{kdMT^T`bOQ?y*SZ6vv4~QYPl!)47 zL8)I4!cWFvKX62V0!+xSlNp&E9X-<95%dF%l*+<0gtw{iS264C1svFsW!G@! z+VHFF0v znz92ne=0-D7O)fS4s^ZNsL7kWq0>7${|B&X2dG~vO;gKX0az5W z926*-WJ@dB5bV>2plReU2s9*7mj-*FL(8Ine#`>KYmI@qHERpl)axs|>2)>bI!>49 zZgu2Y{yYn<7ZX!{1*V9LLc|ylvuCZDL+s(e!20HpcpTJJb)U;r)l3!b8V70|Mdsg( z?`=0U;8_tie7>e;x|@TS15gvsZRW<{cOT3;a_9>_=w_~)WaJyDU&Ta|Ibq+^fYa0T zQ(bkstp6PD@iPLZ32^aTzMZc+DeKIXttjfh;j#WweI4u~GCSz<9?*GtUZ z^YkW%EPwyUuc*`=+NKV_8$d@Ytu9vBU%y<|G>iUapX9KdTGjT8e&GB^{4wIIqhZY8 z+2LIuhR57i3ec8iCqNzI%CIKr(YuDN0E=c+dE9ncM- zU+7_EIpq=sSWChf?2H7K@BS$-!TvF4m|P$87uA|=oQ6=r`LlV)^qJ{<_mSckvgi;r zUb=#fOB8M9hy7aEBDH9B5(o!vX)it5q7zV7taXH?;R*bWHMd86wYpv}G^4;I3E7P$ z?sOm2E}dbq7~T#Hu5RU9$LPJt5*n0K+B8>;(W}9a`pWQb_Ggi!VjGT_qAwyPdp@W3 zdFiWM00udaTpX!+Y~PmyDsBW*RD43NR?V@yl)jI=A-lEKuCA}Hvy87UR3LGQ*lZ!fd=l^*gI%i%=rn2i~@Nb^2} zpoRwK!CYZ1-=J4~PIu@Li>ByRNL6k6gp;{w{uF&0DO_|SDH$v+Twu`;kX5vWv|#6( z9zc@c|DfGI4~oT`fApXD)CF?#l?FNqc~Z70uYb;QqzqM%6fcN~)Ekkqw}C!fN|&n$ zD0INp3Z4d*(-}05FGUT#2j43cr=I#n8G50ly7M@-Xs)WFl+BSyN^xHV?wo{_7)6NZ z5M=9NlLT_v0kv@H6rIkXI3$VA z664PePv*w$$-oW^267KfceQKYsbwDPUDCQhhgCtWOD#B{G{2OokkPu>!pJ?(+Z*$z zyer#qkbgRcdYa_{)n2j)2C^Hvo}|T#r!s8uN6amD?<_E_<-6uU4Co+7+@h}Jir9~U z9H6&+VHsWfM_3N7^l}BG!P7%7J&!uBeAUa91&?tBL86eA|MhYO8vHR?VXpkp%N5fI z>fqTksh7aWPYvBwx9(t;%EcVPo1t>K$IBYiFnV;d=8s<1n8wnhlQj=}S>rcNTq%BZ zvS#-$d2DFEHi&fkoAgSwCG64XerQ2UMXHd6+FA{0sZ8yYXL?)gS0R2H)mmuBZ}CCi z7W*~BBecZ}y)E_+_(y1qU*c^s#&HkUpk0lJ9?-D^tcBNkdjmSA2V8ipH-^|Lq-{&N zWW|%e!J}xfr%&|u2DHIrz2TXclXy*_PqOn5jCy;+Z*h2>J6(ylr&%6Q(Y8jsXDm}c zQOnz6zs2Dp^O4lz*Lhp)w>Tc5Ej|Y=_Be&g#G|fVK{qbLXVmjV zKL_pD*~9kL^xk3ltr<=mJ2V3W%k)#O$K}gy$GnjbJ$CJvS5c=puB&Dl^+)esKV+t= zjL^USzuvk3HICS@XCa|uI5^f_sp_Ble346eG}W_Izz1ErgB+hN3U!ySc*meQkaAC_ z9HMM2dNz`tsks;C|LoVp&kr!cqkCu3tiBXfj^SVm9r9J()&7-7KpVvet1mSGnL$On z(m+z6UH(S*OzkiFn!{!DXsV!)I5vQZuZ3q1F`}-J^=cDUTvx#vUq*%}G9y~?g{ zv5;)-!(zaq$6Xs3MkZVA87Sx-OFdXNbj8#j&@t<$O^Xf)^hWf&*%d>hK}CybAH7xc z(c(sdmf#OwvnV345R=oWj^AreR&h1ZvPNM|wTeR@B09e{CYL873;xy>iK_ZMip7b1 zV`N}pCI882^5aN~4T&fbjlfO$`pTmbe2KPfwDZN4r3L_zg>qsd3TUV{tih#&5gT+MEc)IwkcMOM)+)QbFMcfFz6>p5#CdbCu-jdhJi4X0RE;AX8_#h`K3 zX$enpKR!&g;)*(+CO95BH1%3^Cn(woQs}AIi8$I^K_H|RD%oTJHht&oAUxm7(+}~% zk+HQV-NSjF#vEj#J(wR&Br6I=5kcf1fN31(0p#P@^+u^erEly^tC&S}F~0amx(y#V zO*BEjzz5&Prj9AKA!&-6n;Mg=advr4wI%A}Si`r_M>v^}+bl#8It3Z!e6!`|RFETL z=zZn3BbRZY(GZ|RZb0O=;M6+1+02jHbPRF?j$@d#gT9L?G~aI8v;|+yTDyUu;JfiD zgR}udi$a2tM!)k_6x{Xb0Hj$UhFZm1yJgWQZ}wslg;`7Baz)#sH{BZgk?Xo3z?8K( z)MZim_E5=4oTvbc;U}TOez2fSf<5P_x+EqdIqF^NJ{0~j5~pbA72d+^?P}HdkrL5h zbFFKfT2dJl(Rf##x_l5QzU>rth>a{Pc<=+Kumjn^gS(xQ02`p3s|>eCMsRrF@6u%qzn}1X zVWY_5?+9x&tQCKN0xI(*y3xO%jNcOhdNm5Ny_17P1;^SS@S7GidQc{$s1f~9;pci( z_|wj`ygl;LcD_-hF(isOmrpHx;805*lXrELHvAdcm~Ubvl3s~2fFs413P_1Iy0k?K zGJWZ4{dgdTlsBF3ZIL@z8k4!S(lcJQGhKP!C5!^is*WN$x*DI z_pqnE<{ny%VyYWr2woln<`T6&2*Len7(a1$#X!DlmtCYD#88KaGN$CUx+FR&rr3?T zn4`(fjsLMO3*@l-c!6pz{107NzUXBxxci)4+yiBBshLYY3nl$_1Rd_JjF^Xr%CLXL z;9B7=x+u2jdT&u|pvOQx2}J`lSWM|ZJ!u#6TRt>rk6qOCQ5xY_j~fw6*iKRUJW3AP_BdUG4~#`SU&&$SD78wpDlhCX8@Pq9&xF_j zRJfDP)CS7ZF9emCV`%X+cfn>;wTR=S_He#9qVD3NWx@P;c#ibQ7oe3qC(&sylw#bZ zvn*EwN+m=uS*@~!s-c5VP_=lSMlVE4T|>>{vmHr29aC$|E?S$@o+l|F?P{x3rg5F* z!9!nrr2q+Wr&VW&Pngqm?**Q5Lc4yzlX6B4edl7G4XdAyymS{@zj@P!&6{#7mTlOy zdE+Yj?8kN?_yusLTAFWc7O^V8+md{{1XkWfI`;}R0&q?=H2O-%$2)2&RY)U`Qr z#-mAp7I2|&`N9m^`Kq|4=ov50)^(J$LErkP7;W!98F+oI^DvrgL}JGL!(tV^NYap> z1<0x(y%66*{`}K>_rPBQfckW~bDhQX=v_A*kd91Rw59vDdZ3g5#Vp#2uLA=PQ)4>4 zYc4|*fQlwhx99VRoNoCBjN3npWT`q%hkY&}K9E9a09uUvQ2!W5%JQhv4l`(d;OF2h zdvY`p9fs$pzZglnUjtio)K{a61&Jtq-8+v;DANDuc+v1k%t`Y7ivW_TTddQ+i3B*dD&j1*S5Rd}Iu zty0Bin`iA0Sp0G63zmFX;V-;R7-Rf-;_dR6D)xoS`APbJKZG%_zQ25j;tU2Jt-DK^ zK{V&*+91*^3$pG8z#3jA$?^6qy#mQrV=^ZKV5oVIM1iM{X#Zc~7yNzUy)v&>El=jQ zE}=V+*5AkdTKD~YTx4?Q158BdZEafeXF$R-R$Tig&^GBZOE36$Sb^hPv?-eW)O8k4ST&vY{TNlyMf8T||xtsnGERPm(@m(JB z7FU^1{%5eXguaBnieG}zm(UIW+J#YH|R2^55ayB{c70u-(q%)p1|p+oQ6V z(93t8L(p8*z~4;}48CcGEk0Q;N>Cm-Yx;^av@}^zpKr$w1c#iu6Rgq8^ z|8O7Vifz19gCz`Y_x!+MoFCpF_yI5Wwem1he~f%N;&BnqACTaEFM9s2a|m~Dv`P@I zLZwb$`;R%W8(X=2flabp1(HhNQF*x8NZ^*aKSnN_U-TP%V8LMLV1GAgx5pvH+wt^N zeDR*2NL-IZ4XeRifzE!s{G^ZZM>8i&e_JM;3co-aS5j3Ad_B?nC(NNrzRA0+C*iZy zq>tbaW9PVJ`W_Nu7Y{9MEm=f&svkus(7#n`gWafOGsgjH-fi5_Hpu;Owluua`r#*>jw8%NJ-sI z9X>_dkz&!P=UZcRmP!Z#dCPO=h}FYNwCEyy>(ba{lV;6y0FGC8p7rhpL<&9qAuBhj&R{T~A^FO^*^oua`>G?;` zA-M>stpR4f6Ilc|(#DseZ?UqS%psV7_BsY5fCCvy9P2_`kW_QL%K7|S6yJuO!y?^` z&kfQ5pu5)1p;gEp0`cwUDzU%5`>|+DX|#&buPFM_dVnhxM~d{Jjc8te9M58jiH%YEz!tP=qDbpcVmNSa zY=d^Z5eZ&JRcZ6d;)^HKJLD%;fn>iDO{s1b3!m5GTd(<%M=RR`O}n0h*W@P?fC~4{ zwj8!w(4+Tpx=|Z#!0m&0AtAGWL0++zLnOyI?X*n_v(Ra}iF+VZRv&tc{8==pNv9x* znu6rH?_{))E5)UEu>=>ks^s9gqC;`V8odmk;60Nd;sj1YT3u|mtkHleP(=pI2E7^| z>@$bHgH3_9)#-D{sx=oB=u788DA-j&U&9xAy}*lP^cH7bdm%uoMKhBBgCsicVf+E} zsx^AzMZkcF1?h9x8z~H6?u6&!lldy_G8h))^kSJqPkKM31l)ZJ{(_)f(H?G((xFJ9 zDzkkZ{~$ka`4I3yE%7DuwC}|NYptOr>3PUNojUkLi_|whhw#bLAt`JiRTyJcaKeX? zUoXS6$eq=s38c|;O&ilw9{c@N{V0z?h5Csf2Q~;Z9f%M4a2Nu@h6`{jL3v_+T!4Ik z&cT<r$u=xPb6K?rnoE8%5+Y{WSa= z{Tg|g7NAU9biq$yUWnK>D*sGUEmZ7Dcg+!o4PA{7F#2ZxBlJX({*LboY#xP=mFAv5 zhd2o^5)!_aT4Yr3Vt353AHgHGJc5+>10=+ zevb?xuqyqyUrEr|BZWgUw1{IMa4LCWV(lwpro>%&AWF!8XhCejidK*r9lZ!Cf!C$H ze&4iFi>5{3ev1Yz3eb5-N-ntA_rG5%ZhOYqpUFktygcq+;(&rzJ$U9+SM~K>asi0`nJOa>1QUTIRCIASJfYFty0CBIgL8&ae0KCHh z@0SwZU}?!Bi$45#a2T|)Rq?Hb{WN?F3qfr7jg<4FO?u&zca=s&r8!DRA|VQJVzc>hYedYX`x+-SZ;&%`(Gs8wtFMs6fuDr297o~OzfWJcWh z?y5�M>EvQ~T!FEP?;jqD25B#@P}0SOzP60}r|nAi+vz0exw2un5^Oh>-s+q#(p5 zK~;vUV!J#kZO~^dCY<&z z1}HU80vWU#4t~-F$eghApGmpxiYF8?Dqy!$>K!30*=0|SQTbp-Th0{S?(ZgZR%R(<;+ zy}Gy#3wt^MpE68+q%=~aDJ1JP*e1do!ZyC}38;wP2k@)hePdroL)>hPRcNsUy=c?W zzW<-SGXayUs22ZW4Lisx2ogXbK#=+`sTlWEe^J#rDaw7l(mwcI8r{g zNjBq7`;C+oIol?kNK#iu`&!u_h|$ONIhaEO@`L^B@dPSR$xN!NyA*s}DZ8?g&oIxx zm$Gbsu$|c~>yYQM8Au({w1IV^um=?FG3~dI%y1js1OcW6S0|^zlK>!}YQ%M6Gg8y?kJLG#o z0^Ppe9YE^!{+B*+*(LtF|D4mr8y)U&8yETedq}SmPXlmTubBkP>eD{m%~nK>{3NAG zD+ObBYPZfz@m04C{9Ib!rE6q$UD#sU|Mji})s2i}F(=hkB=SB-ZJmlpQB1@LhA{+p z)nS^%yR302tVSmWMPbY+;w8DWTE^$qOff`VP>00SN!z8fb20y;^{ua`HnR3w)gZ?p zeXm0r*ShP5`6G4Y#x+Bv4|Xtln3IhdGOvy&a~&{#t&Tk3L#n69MaAN(%D}P3@?gl@ z>J(P8nE~~xQPTZUOa*SKElza}2=%JrsM8;<>yVu?vu09=7S@Po_P8V@J-#PD**Qwo zI#io<>V>mLiLb>Dvvq0=c+KHU$bn!ZcE?d;Kvq5A;<>9+g8nsR<*lu&!YR2-q zp!{hqfvxnUYFYy>9zD0FvQb=q@cHei9|C&H8VKiEGIzm}_+F?>D`!YC1ecaHDWGBPtIzXw=?)I~RqnH=@G+(R zYUvnCL!}-s6?|-Y6KsY#Ii6pR>nPFF@fb3n3G>;lFC|H*EVBC)#g1ge^9Hi&%e9OXf)JrA)2E9ZX(->Z+-AE9k62 zNlY7E+tUPF>?x1-CUbTkgY8wlHP~h)F`FLfu+}t75~!!v5!`4vHk>byil=VWcow!y zO6{Z*bd43GBc&mp?v_buvd9)kM@$n;XSYmFBLU*V(b3Wf%_S`p(s=lObabRNM)bLs ziD|IVUq3oZ8eqA#j*K|bV7@b&j29dl$dEsdConPm4<o9m z)Z`K(^wiwClT0F#e4WscNcVjTyj92aRZYDl z+uL{;d)Xz>LHc1+=;bo&GGiFKfUpk2=O{)`6~=KO-r8r2Xk44dRWT|I-KZ*0@qszM zGt!S8r4eRqSkuOpXQ-tIx}hRB=k&D$xtbVn2Zy?*s*|lR&2oJ$)$1jdAI*Dv84Lu~ zt_IufAq)Y0mn}CKj>j&UH+wGDvhz=fO!%&mVzeJO_UpW0#s%h&?t;QyME0{_%Dn`P zF*VnuZYip{QXZoV*>1qwN3~%e^;#gauu2CZvyjSZgz8pVIfK{=2Iyt(d~GI2W6)ph z?UjoOXUsK^>j~wtB$8hdzybox3i%zu`B;L=(*#x;cWbFLHxn$0aN8n_2?ieU?65YL z_RevuanI&CrenT~f^sSX9Bl(jISI%zZ><84HPNpS3Z1rDl<~RbEmcX^?PBu99+&zm z`H%qg`49@i+yy3gl{ zEM^VZ`CF2j8d#@#PXku@@)`4;d)c8BLDjTLuOub60jvWF+i}*7XE#+L90lWkL`HTO zrbU0QNYs&FbouaWc1**f_HYg|qs}qI>X1ciwbb}VHI6Z{|8A*_Fej#cCZ{|}#wA%y zL9rDav_0@?qD&7QM|w9dtGLglw0?><_hOh3x!y9KJlc*jN3K^4kMqZ~61#&?g6l4CtjOvqe0d*bt!8SZx3XVEFr(0p7tRwn4aqL9~R_Tp;&B|*)EHg z-%YrvUc&kaoS=bz0_<<{SVQtErXj1uDYbKp6ti>>*JrSEo9^Ash#*sNiHp0O-SsDP zwj8~c$ne$gbF8Z!a?tm6uyh?_{nQ zQblCCX}&U_H$IIvK8s%yF|SowX?zH)W_RON`Q30kkeuaGAU*mrJBRB4A`)#xDjuV_ zEWZGw-CvnyApwkk_B6^lvEi;;x;wdl z7mW5+yUTqI*`Dyam)sB>AHu2`)<~F>)X>Y_6t%W;D?BwD!>Q0H_nGo(`0k|rmzR|1 zoB7v;%wHeZl!mG``EE7gayxL{2F6bF>%&alxFYwi--I{PHps6V)BQqC}tVNk`FBsN8fWz7@ z<(xV9o{ERCw}epJTDc{J@b&#j2;swf<6)m~Iw|)JAzc3-9Y8a91fm49A`aufIxhDPuw>&qXPyIH1`#hbe@eQmOqAF#% z1K7OmjblUOz5nMfLT>zTtz>_{dMLY@Fy3%@mLZEj)T`csX3@L|C7-z%D?^LvuJ>AD z5>Hm@8CrI|#KO49F3Xo30Ftt7^FI5Te(JGt>Xn;C+=NR9pgLMk z7gxy=!sUv289@F<*m89m{c-0{2M|4QcOd1SyqSQy9G|1l2)q?Qy_Vw|`#l5=Qs>W0 zcD%~jg~}TVS-jKfy%`{06vx4u+!%Z~oUZ$e0P3Jy|Kc-RU=L=3@4FgA<_UMXjo=C8 zrPf2!-vHFtwtLe%^|_#ZjRU9Gd)U0zuJ40m|0`!+qotR#C7k=)m($K6#-m{?(%YNE z6`@JY{Sa4HN-iQ*)$4xp6JpGF`70sQvurl?9<|N2hB29PcP@t-dMI1sk&LX|^Z7`0 zMP0(0XndracR8SMk01yda+b@(a;l9Bv0rcgt?>6Zbl|8=?Z7A2Ab%JR^6-HC-W%aMh*Z6=FxtR$xqzz5d=1GF%R zgK$75p1||&_ki_b5C6JfUE8E&r`t{MsC3w;wd7D><4V=I(l=h_pSoi+F>bvEcnvPw zn_DBZ?=&&E=*Al|Z#K&CkBGoKqyu-l3nc0j5@&(^a`Qb7a=8b8s$Cr?S;i~*RzEW= zHuvb*!^&>JX(d`d`v4*9(N%F7kKRu`=;J~RsfSFhwLrPzS0=0z!_$wLpu40hOMVBa z^H)$(o*0@u=c_gA0Q^6nP+sIaw;f2ImiNDHrj@ky^*2l<=y+losY zAa0WOEkTjaE>~M!O$V2nUreLwkTs|zxiGaRb=tgAa2Fx<8a~iBT-KL2(&lB1UlMEQ z>lrG00O5_F@hRs$YsZ#d;^SEO!KxHd-h7`gb_PSPD9AqnS!3S!6nKcA(-f*}rgpbQr0nPyIJzwv_9K zl-@x(4#>VYpwF!6bp=P(DZvNcJ6p*R4nM8r6PVInSapOfUc2-eKE5Y&a*x)kde}=hd05CAMPg?Bt!E z0Rs5MC}nX-xFowe9ybPpW6GA2zfyR~K2c!?EzkS(@HWhjJ8$kDu879&Pplgkyt8wE z0Cm8bj$Qn>nXv8T5JHq$8$fMS=+IveLHv5k{SlC?&xWA-4c>iMk9QiSyc)<%81C4* zhMNs}d`OT_rYJ(BfHMBW14ENm@hl0bIUEjT186!OXBdcQ+|Sn^BW~P8$iGZHzenx@ zR9&lm1Sb$m-o4xA?v9M{vi>c=6Er(H_S%ES!Snht{NhzrGW@FVUFjvj>?5oAb#umf z8ih!tZ_vsW0BS&ub6&ahRW9ru!fWIQ_T1cwOaSlS%LCCQpLjK0fVtefhV&RfH;z=* zIk9#2zW3&sMXZ)@^K0J_I({PMXw*3b%zLn(C!hm8D-Zclnzv56WxIVg$B0@#qz>!Al|o4VKQ)$5HmtaF~LuM+4+3PWJC zJJvlORb+Wm}uzzf+eqpFMwRWqJl2qxMZDPH#yxXspG#+H-lKJ-)NGrdA~1?Kf}w!4|q zu$+Ie??`h>^p=kU8lN@1dGigzdQ_ut4*kT%R|r4u;x)Y4AvXO=!g~|e^cp^jur74= z!HtC;iaManMa$@0K8UF*cW+vjufpgeMJ_}vJtZMNaQ8n zqqS(aJ}Od(o0Tt|x4F5NsY6KK37{k{a$`z9OhlJ@s5WSOj)AS_K@9oFLY)OEPo)mI zU=iinXF)F_s3;J#8Aik~zu74P?q?Q{)aSloAK*d9wZ5 zpW#)sI{?g+Z^p&F{O%2W>#K0lf)~{;JjHTU7M|L?Y2=%4RFsW7h#Z-<6_NH{I)b6; za6&qN>kF!tH8OoA9~hI}{OZ_zkN)c8a%FiG}6F>Hf&bzKiII9 z3H}}d>>|JMpefr*2HQsf`*}|rW95T`B7pro!^U_iVU7olps*OoRabSEa&86I(C-HQ zGkNzCVP`^SOL+ijuzNs$%dd9iGb`Lx(@n{HR&UNDX%4t@NM)ej3>xEfA9vW~OGKCp zX7+-kd=1!Kb=2qjjEeOxlSNBL8TK0h#h%FzWrlURP?g|ch}7BJ#1o8e_(=4jsfmZUlsXD^MPG_9 zhal1rszQ(6luzp`Bf7omU2fo|fH+oHEOJGpd^4f9Mt(cw=d{zM{d7jb7F)Z`W^2u;GM#-Ct)p*@?C7!@w@=S&*GkFWzHA*5 zZkOEZKuXEvNTqeCq+}*B>9l!T!@NOfI*8nTP7td~Ayy%d81%_4eY`SvuAS}7Oxb(> z=AzerWfcJ#YXHnrZPFZcL1d$j7NPh~KfCH@t5-&?%f^otP(Jj2gd1MB(fyg3 z13A3PBhCDt_{AEtI5V8*EpOTSGPBjo%WaplV(a4|HiHrPOu=`3tnLE>jGa|~^KnO_ z(wq8(nXBa#enU($0LaX1`pC=Urz?}k-;lZ-ItRWmKd9o2=|O(-X_a+od^zy5^cxdQ z<03?^`CQPARN^Z4>03m>wFs{P3$BmHw0hl)Vh-vb0IxkhGzx07D?9A-(ByYzUgG{D zkr5Slf z@kvgr#$wjU9C6FK2LeIA0Nhj2cd8I@^49a-mC<{VKz5g-eP1$ z7478_!b+twD45k=9nTZ@R=RDYvIx)z9G)Dz(HO6;|=#q9ya z`NMC2XkY{dv)9=PVL0w^?5ZKV12p=Oq8ATEHzG;Jk zLh@dADiHWx8GnZe5mTIo&1`N;r)229m)qJonv1;`?aZXr#Ib1~f5EI9BW;aH$_iIU zrgb2Zl26?~il(l^;@1MbDHzH_P3qxCb|lI?jV-$oT5R+I@;ZVXfN&Kxjb#Q0 zH*1J+uT0B_341%LPY~u9RjtwH6;{ia0gayWCQY9i?!rg~EtXM?%>BJ8;q+Y-ne-R! zDg%R@@}+aVX^w*sv3g`0(dJafN1RTCQ{u>tgmr_I?o+AsUqE_Re(;kfOSXRiUG^|Q zZ&}XaN5u;azRDc9{MS>y&N4(Wc$Hor_`Cl=J$a7xVc=z<<3ITeu=8Xq6P{K|(7YCh zrSyNK3;cD;5TNc)>=Mqd)GcLM9fo3l7Eln$poRaWuD5y#dA)eW@#2K1U!TagR$qudgY?*X;SL?r)*M zTRz%0l6(GPBxJe$-~5KWl3xQaMN^sURu8)S{)eupzM^yylGg(9&a1rgIo)Q+BhR~rULqgi(-0j?9wo2>Wj;E6dhJOY5k1)3A*T{pK|rmL@`Tki26-Qw67#qv zr&Zm3S;W^K$!$D=KC0)V_Y=}Q@(=-IOTmFU_Mf`rc-*8i2*St}n^Bs&*iuWhbhgak z1mO?1nIPuX@w9z`Rv-43S8Y2%y|>{)cp@S0t!MJeh5Z3^(3z27TdzBGY(2@m7d?4m zSFxBs$oEULwYOfz>@MG^RaO6FwWoD`(rS6yDQWymNj0rcZ1?o$PtS*2TsO3%6F(am zw}Ez3YYhKhaJpq-!`6GjX?xM~bj6FUuUd5y8XZhhdogcN8Ni7Hm2$RzG4d8vHJ`}V7vdq!unf7bp?-$@g~w>C;+baLcWrLjNf=8JbIfu#I|+Hj!{cL6$a z*3Ap!v7)=dR4oprg5kxW2zOqq?lpVNcK36Gl$uF*2~OtdotV@H~Q{Pj)yU4)G_ST!=*=( zVM^--{yDi?x`Y1kus)`aDxq>)AemaWUf_i78i>#9$qErWl6>TNY(E<;`6CpWl4UTm z+|8r*J@N*EOEqZB<4y-ML(zD;E>!wCAuSZpfVlT-%JMZ*n7v2C6tj1jfE}4?PGsgz z6QtXmQa!Wt1Ub5r%j<2#hj*cLvr{xSHLu!rf(+-f`JQwEFZ&CD%K2<|Ku-3dbbndO zyRoTLl&9}*1Kui2KmNa(IC*G~30NcbWtgX^;`Xna;8hVlvNHg7G?f|CWH~|m*3c=0 z6g$K{v?t$Jvxn2$Q0QbzY*?}wb@t1=#hS<++Q||iciw?r{`-Lf{b0IOmhTgBw0Ctp zpCiGaS4HThDvkXmu~yDg6<65o<}3XL z`Qj4TH{9P<%%cU8uL7;i_2+Z)TSCY6X9nbt1oZdHrKS7AX1ZoM{O(9}#qYK<`XL=`$22KKUQU=}}i^cR9I zv${W{R-0vhU+*!NGjira@wR6vXI~u`Nm4YcrAb`bxzD3q#;CGt{^T6D3di1cof(xZF=I0DPVOAeAdj!Dpxm5`{k5QlXK8j6&Fv z8Dggkgg{W#zd_EdOMB?>Vv(?S5*99IjQMp|76Z}gtWBo$0+k2kKm6Dm(VLv;Lg`*E z5CYiS({l+qoQ{ifVvsV9Z$W|3X=d7KYOi37abqYiHpLZHM?~<(wSnP3y%er+N1tF{}`81kM^ORcF9WoLd85hn~}3-*|=EEV81 z8<~P!lZKbpHeSWlHUC9Ut`%^v2qh+rgz{vWpZ=oYd#QqZ=*TAN}aKP*QAC`*Ef2Z@-QE7^to zT_3k=Yg%VaxywUlA^poIR5IW`Lf@5&52?J2#4c|E(tAL<4Z7mfo^ZXIZkp}JYpA7T zK^?Qvi1C@_#7J^Yk}bK`Pu=l;gBGY0L)NYS0)3X$IOXAO@@@@0~&&Xip1 z-lQ2g(bW4gdaM4vFPg7qdBO#7s3MPj-9!>}_~KjwJVPQLUF2fbH*7$2&bf)OvRywc z{|xw!o6m$ZJROSXT={QBtq z9**Lk$2oIJCK2ZgkYg3#Oc`GwN|Jm8*j!Sy1N7^FcA=k&1?a;-%6hX|cjwN=@O%GX zQDwXa)qh#V7k|~KF59$6Xg=g;dlLu=%I44T6r{{F-%4z7O*Z*)0QcCp9Oa)u3_~W* z9zyo}t>O#vn43eeY~$b2$yHb^a;flGfV3Q^|EEhUP1G3x$eycp++9uBytP%e?a6d? z89xHE&2P@MUO6S#lUP0I^USK;NSFoI?}KzwzzsoMzR44-aGOS{iSzj^>!%~;fx1q{ zt1ip#yvDLMOUX|l-rlZfBbgo;ELEfSV!{O^L?di$l}1dwoW%AXySY(1V)_i}Tf^K> zN>%(A?=04d(}>v5(md{B@Q8^o2uaV4%)SqkIuPl(UgSD%!xp@T^xE@T+P_3_i4A_u z#int!WL`n_c{=Wh8abb2l%>KWihy>~0^ielg3>8a3$6Ut_l9E?=tai92#^qOgyyMfQJK*vm zK@l^iB}R8gfOK4X$291k7ZfqIJu$kMc%UV2pf~w$4JbtJ5N{k^N^N15B_*#!Qm)t7w z4UcntrjWK7jKw8?_5zq{U!Cur#JK&Fzq-AGo@zcE03GsJ5XQadR!`Y&yxA7dH>y-Q zZ`UnluAaaw(qqL7fSd=^#Av$&oQiz0^{jfVl|-&1)@!U)U6xRBfo|@z}7SXz_o}N%CI7tM(YFe!3;&Gs`7^Lj%nuJOU`1EYFh@_EkzMC?OvuV|} zB#nG$gIrzjX*(y`2s6QK_Fzeq+_k423QLMZWmyS;ax$?psk}Ko)l)))bt#WD1`(|D| z*h|+zbAXyKKlT8#nHkNxAqN8LtRP1d&<>{h&{D-IP>&(f+sXzGoCKA&zNfcn&>LEo;+6*Bd>V%md4d@H!k-%>@Ub6 zL|6)O;g%SI9RXJLE9?tP4E?+SeZYaFX3>;f0&;jE*YF#nmu~=8G1nTT-9&Vqs(8#D z5T66!Gt#szOa7=-L^aikG4Z6fE!B@IKIsV9J(eo3Y!^;>woRu(kc@I)X9yHllvnR;z?${JA$!!|&k0{Lve$jDpAp{SHhEGEvJ zlpF)nap*EB$$)q~`bvsNbhhN=9q}Qd?u|TqCL&pK`{tB91;XUVc}g}aZOK_9GFG;{ z1RM6XgUD4i=XdL@4t@tnjeMH$>A_{-RpRhmsprb}JUOu@{JE#P2M2P=+3!9V5bXzd zVia#%aRLlp=vFSk`GVS8A}w2e)Q)^L&jT3QHK|1@n6D-)da9H-;+Y^G2T?X4e7++* zp=Jp1esQ&B$oQ;l-v+ySQE(dBTLGOQi7^b%ap*ONGFH|}*Xk|`vWE0#Q@dOa+>LSYsBzJm`f2Nz07Rgg`COB0}NK}h-Wk_hE)9rNz zZ=$j{XU-tSwZ$+uQ|!%VeNN7u1}4|b?xYkWP%L)0$L}Fx{aQNol4I2=tGVltl82$x zIB@8$BsNAKSEg4`9oVzw#PB`~-o%k^dy5kdXRBZNIUZWdJ?`ZZ-~=NWmE{!T^z0Tn zENNkBr7uno=e7KNSXN>@90sQoF}Owa9w42~7MM4>fA<617ZNM%KOi(R`J9R^VTapX z#4;DL3lT}0wWVZVFxm?84(AMjrM4T&5rpfqaD;5V z)2@r$*l6(I8Ost~fgMklu|H01ntZWvC4GBbM`8KUhaHjGO>bFL?0%{BmM3HRQsPbJ z2w#>IFeHXeFE!?z|39sDnwKPVcDW;tIaO1yTVG#l-R7zhIO9Zt4V5iZ+yi|Z|1hqD zymY2q&xh?>)AkXLubO`cqUkttmi|r3flE;BjX3gX|b$`Z0Gc7Y(wu4XT&l=FFyF4 z8^H~o2}7|=s1mq0bQZjIWEO1Tdk#M>yeF0uk!fLr*7A5Rd?c0&FP$xhKLh<-i+tFi zw-}xoH^egICAG!ytoU9_tk}S}7@isT#4_V0w8ij@csQOBFO4mRXTsz0On516F+3}t zjb%kdme`QD7@i56-x;f|d}(YkJQH?`WkR^c*uXW{o(&U6V8aG{s_a>C=*TSCz;{}n z6P>Y~h|G=~^iIoj;h0!17%LB_f^p^`8>$MTk-5dP5gFsmVqR*D$;2||B_wV)>M?~_ z#zZER4O!f3#FVpRner0R@HS$~+hI!2&;S;>`mlMGrRR%a9Hr#a#`Le}-JOdfjcH%c zdnMNco6x@ATfA`*aWv$wmnuzOi)dVja6835Vm%e2Q*vM93e>7n*HisrN`BM04w3n1 zy_DZm@)wA&H*Maq&NfDOJ?Y;qa%8=n5=LY8Jvz2*^`p3sQaear^d?oKW6EwVF=aiS zxyG-rye5_{F9Kn5{8-W!&yo%2G-PxGCl$|*4eeZHbWB+o%an)=@nYYykB%KD$FgHR z-xiJE43dpyM=0iR0H-FS>mQ{N81f=NKN%e}-aIlh*3(Vk_>Gu%#_}XGpRSjCvhm}` z74Rctmst5M;g~nU*3sKc;4JBS(9bqSIS+9+5@B34RVx_R;eM-qLO?3_`AgWYW@iy$ zUBo4Jw?i%na3(}P&Za>b<&bghb!8A~oF-{vhroW@C3gehICF{JVwm*5t%@>u zSZmlF7U)-+IY&jzY$W8_Er4a_;L5yXc}Y!pjNAxte>TwKnwS+ z_CL81(^f^TyakXBIH+$oboUR;a)b9;qTORc*Ac9KsLHywzlnH%$=B~l!a^60ts3X;wg+cz@Qsl0Xxg0;EK%*#d4hH_;BrcHZU`J1ZN%bQzegWl;*sOtVihqdNd-tccp7*P zP=w)&!;ie}o&n09=^LX6WPPd2FhSm~=SkXZQa-Fw@-{`9;9G<50bjx-{zzF+97=cL zNC>v3yM}p8_CX@e8xOnyT$Wz}**2QmPS4rl&mQamngOKKUAyj5smu^PnkwD*G6b`YgDxz+8F0B>^6>hJ;@Wo>fA{>!87 zEzzNq!@K3yk)BYFGaneUbf1zvL9UN-&&lTVvJXI4k!R0`W_1@!+{Qz$tK{)Cv&8(m z$f9}sytDHJ^E=BtCf?cERa}$h4ez6iYi3PyQRU%6cV{QheOLE0)AcYjOR@(}p6JSS zKgZ;YU738UMgVsuFHden`Hk2?4G5^Ez`FEG$)N$K(?dDj&cDoV^9H)_D7Hh_KYBhk zcGEUqR=`!Fz9+TcOq_R`-e3e)owU?TVx1#JPtUrppedR8a)TG_^TVTjwA^kKMmN63 z+TiWMo9*k~;PYB(@JPS(Vrpln7g!QoL270}I|nu3kzK_-F>HTymJSBVI1Z2#*O^~Q z4c5`H%j`5fx6*8cvFI?5afF=OZwhmbR{H;h)Ab3)tHuGYurpV)Z=XIavmA%jawllcecU`Tfobb*q}bc+>^@`5VW4B zm14hX<2jyxMeA43xhj~*Uy1gE4+4^!KjgV6-l@sq-DaCAdSxPT^QA?mlBD5uDhs0s zlbb+gaJDDROmXsd;H4@eW)~HUt11KXE+QDx=|VQ!Q)YU{*?jEio)j70MvtmbgmcDJ zW#{cSAaj%5`oxwoKAW7X+IT^tDss$w(FOuZ{a_f!`TGjj*#1fGmzx?DK!$DohS$`e zp{Y@8=rECM3D@_t#3tFUxqgoEl47k~omf%DpeQq)C5HD+;5C!8mv0lp{Chn(Kq3N=GR!i2it4w!aqFS}8nao#8zmI>l zp6@=n={ybwoHE1AoVrpP!8UUP2G8ftTxG2Vzy@mayAkDnSogmu{bJMzbsj8 zsFKy>iShfRSe3;Ak?s+$l=IyoeNxLm%7NI@BZd2}okjI*gG=Ej>`-TWP2>R@$^lKZJ-xr_jq}l zJ1g687*&m}7qhOQN|bs*XM`9^^ld^rHyKleah#2o9c$;F<{FciXP?eSN7|``7pIqJ zpOSGT@Pf`hE17*FCwp=MaIkAm?lfOM4_4Ab->E&tlx}T{YIE~ zUf!%V7;`Tl?4lAJ?(AHY8;n|J#15+Z1GgF>B{?&P^=Mp6Td=@S=N`*Q11-Y2myHU> zWIr0=U^t;apM6i}1})ykMX^&A;tpK7Qp)bvmYl`SD)8oWUENYKfkI_XI-gsWl{W*< zS-dznaC+0}BR|2BKkf@6-CO;@|5 zOBc_cGf(#P;G%iQ%OnrXoxNUk>S8XI$S=T%1=IR<1i;cZPH& z!?XuLm{Tosz~eD;>`xKOT#Jef1uY_*5e`NSN1^Ll-p=52UCLdW-<=q}8CH$DDox9M z=|FJx(gmGGK^3v1!kCijpz6sCW|AOlj>DDaN^7Q6$_%d)(&}0b_qWWQ6CoqEM~{j% zNMCl~rpKpNZn9WDwf$%=rbfnI(^;e+VhY8o^g1HOR* zK(RE)t>LPs2osLfA}RT##nhEsiBY_Wt}P9MX{OH zRrVmb)CBEfzBjPZ->q{YonW%^T^skqkJ2Is)2lQ2N@P-x8@+OzOi!oV1NdP?495a29h%oslC zXp)a9s=8IM_3o3BFM^>mn9Ivo2`n{&i*4s`0OM0*mYcS32Q)LQ{D_chZLDZtT?snM z$g|jk9)Y?LD9axl7-Dh_(r_+6I=6D3Ns~&+-|KSgTrnqX^Va0blx#d~s}+)=h_vM` zhNWaeT^BwpZ=}SVC`ILilI? zgW;|3*}rwM7M?uOV;<$sBqdLJ^t8VjHS2)uKOR>(pX<)Xq8nXH$kt~?hpqO}I2uQZ z^py^261evF1SUh;G|<`ArG2f;^tj!CIkl>hTbQ-jan7&BVfLZRf?{wQ^M;xv)umWT zsnz+Y4_pJq9_i=Tbb_>T0%5yuHR4t#-LpUwhhQ{w?S&0+jB&<&UlVkrnHfF-9tNvi z#jj~fxrPw3#NhD2NTS4zn%D3^ZYF4#75P3vv&2=Vwi`z`5mD4JEL?-+r=<34mD~@Y z%Vy9*_34GbOE(eOSRNzs6`P72OpMOGau|Vu!IDhlx2IGbz#~q2AfI6dh;iA_GhA>s za+v}O+}VZUiHEp|{!D3AmiNk+Qn!Zpu;tFWQU)@GTsOAULwMscXEXUU2bji70S)x|vbbMx6*6=Lrrwm;i1 z5As{iot0HrM97S6-G^pPYLz1?`7_z`nc-q(P@W>V$OfMwsMiaO5IS0v+iom);=rSZ z>`2H?Jsb${2B1yZI&}@0Bd_t8#>!s#c|aHf_b&ldjvWyjp76EgtZ6IxSAe5!t!zX$ zb{{gx%G&~(R0{0j0Xcw>_3j~u_(<(ndFcSmuIcVmPjBgdTfi~IMQM^nM9>jTSCkV0 zy7SpgfqQ;ApHd2hz+?Mp+JFCVV$Y?y=Fhtu|@9QSqJ9Z-i#XO zyvV?u$tTyOhp&}|AvA5R41^HM;!8tl=34n?08M9o_zqBS|KP03jA<~{0rckXKE^7) z{Ojx-94ZcF7|%n`W| z8Pm9w<0fNIO3rVPn!QqQF3)DCvvaWzrsT^FQhORw^7{rU)^yD1>@1h@OcNBnD_tnA zLcZof!ubsn`ch%hLT0Lz6kI~9VmjMFZtK!UYin__(yhILoD%ITQJT7oL!F%q`Ug_- z^_nlfol2RmTwztF#PoPP7fsP%XUcskdE6zRbP%3;nA@XBeO6!5rG2^H!IaE($#i}j zY>>sUF|&G2XJ?^U9*j2Rr+n_I?J4M4NbN|!07hcL%eCR`?5y+~{7ch$!#&a3L9b@@uk4qJg; zg?!nAkmX!k2XpJ*fX1h$Vm(9woDONYgRnA2jwCQZZ$L`uMv=rsX1*^l8HY@Gxh5%P zaf#TiDnk?3MVv1O*?6TUAMC@yX7?)d9pffba2RtwG3KQ~`Eih!sqV0?#kk$X^uI6L z%?XsrK8skB*g)k7sU+nBB(cL zOb2uB4JJ>lowy^2n3TDIqY?d;yyT)03_V#*M9|C9<-WX}UzLQ2cM~yKf(XTW zR<=|u%U6g(ROks~ZXqV8a}EwXyUTLY_Bv4va3onQ6j^QamMGIba(wGY{O%g|t=U_c zbbxDE`+LyDLsL%R#*Zl8)k;ir6qb_JWCoJ*4%#2qj19@VG;^-tIe!(P_Lj0-L&)`b zrr0k57I14W&HA*jQjQyCBhd~jLEWZVE zllxlvqhb$S)iucf_ZCP<$)>weL+i?#kS&45V>^KI0E>&Zid!)3M6nNF>LL#((h5N` zi=dT*q?e$@h{SwR0JO1tx*y01!txm5lD*NMDY0K*Fvv4OTv@jdCT_=9ip(AuC>7V_ z`e{Yg3NFnK%0i-%3I;O_et83c6EkHs;Tp96&qsw=KSmbX0c3#4 zk2G2(I{68qUMpzJuL#pMRFs!L6LyV5O<%FQhuYy}TL`g^oftxJp%g+ayA$>>^Fq2W zGt8pjy(*p07F_=fMto7edEcO<%+1_4N$gR%GOd{gfVVTD#7%8vUBsAb7`-A%WX zt@ou1XyBCu0y^dw!yLeoIB_@w@6Y zI=B5*qi8(i{ZdXkzz;@shACYhl>UPauZ@heMphqUpt2n}|2x@0y&1&+rwQAN(7|^- z)B{tIe2)SuWlCA2>y)`bOMq<6bTpS`0dZJGXd zaQs^<9|l-WFW^+~69j2#ZRBeRA}Mn8aswf=^vQP#vEs>H{Q7lH9tJRHXMfRHw((2? zTfUY_z-`QB5`bZZ?x$5kr!U?<)vwN#Eqzo1-cFS$2jT&Klj6nZLdems9#-Qo#qRH*@(o*%11`(O+>i1dD zP(S@DNA!#yWn2xP&W;{WToq63)m~s1ZX?+nmAp*tGjnpgbP%X+;Wn8UiDQc_rB$_Q z+U3oWIMTGsJBhH3+%69nYBNlg$0KoMm@3Z_VKYpX1?Ae>w#iA6IHiIuhiVdJ>!I4T z?efYH*qt|!9fm?}%pW3FY)=-;!mRjK($*;)?&YDB4d z7@zF$SwzUF6zJP=Duo=;YGdlo{B?tOWqnHYxTTcb%LhL$%}(mqM5v-!bN!jH9j8Xe zvCT#y$olvSz=+I9`n`#nqw+_2-kJ=yrSpKRcJY@Gq31230;#dk{V~m~YLc?`;H(7w z)a6&&y+1~-NW;{VCr;u3Gs-Ph@(jW( z?G|c~WwpdMWDY{j$gJyHW&qSOG@o6W>E^5@?6b8iqc7XAKvyBe<8&_%p{S9Of#w6u zQX*kxN;X3QzkbwBM_+RF+RfFg)LNrCJz1;mR$~3i4Pv3!**S{V3+EU0@0#o3G@-89 z832}u5gO1DY-jJ3yoTx;&7f~fIfxkFIn*7rQFQ9wVk`ytJa%ep)}zOfGgzy~)F~Wp zBXG=h`PQqF{NPNY<88oC3AXBRcyCqt@MXsX4{jJJn0tuOlutm zzZTY|eurW;YcRXBivi5K-U#^ik%HK4FKC#nVkpB>l@Tk$Ex$Z&%i!)D5_zENarU2|qYqiT%IMKBxNGa;$z-A{F zSwhgSma+msmt$kg{6>?gdL<6K&>WS~M!5jzvBPXIgC~w^FmQ^sN!dkh{PeEccFO zmMwmRM*WSft+J=e+@7y$KHygg9osrTH{Fjlk(cC`Q8MIFplDB5v8Q(MgwszaQv9D|SJybKMv^Hl?)xBCvqG~Y7ZNeElLRD2)8DC~LZuyog zDLX)QO+SbTInT?Q(|Gn9Z4;=$$7tq)#w8mIk6OOO4ea^_xqf=6+Pc(D&Svitj*Hgj zJJjDSl|;-n5nS=e_Nb6#Hb7T9X11c%iYj~TELcCKv@r2jsm4a&P?c87 zb9LkyIFKS6N;7fua7$ubs{^Hq@|1i7KC3bAP5h!oRf~L}%eST7oi*)e2nU9}*8*5^ zxs8qSO+c9W>Lx2CKeT`<6CNPwZGImo%+Z>nHQI@1ffcpQw8eI{rn(38R|e|@*`=uS z7UlY3aL@ey!P(ZXY?euCB{Q?-nqMqo&_WMF-MeocVzv98RTpcsV@-y~6TP#EalIae zEGP_GXVr2NS@gDx6Xt5332R0|H#vt&&^-FA->xpSM%NK1>=~*#C~Nr5RwpHQ)KHZq z?)$;bz>$ae^&ZIOPXKCylP(sxE;Y&6{-czSBh>b+)+AQ7z5PcuYJVt}0CqhXny`Hp z;kKvLu*>Qf^sHud=Q+EAdw$^rI3lmADuzQL?zTk?SZg|*88%3onkXd)*5-{JJvx6Z z#{QL&5kXv2lThq5W65?G3K|h(N~W30$cc`aS!$0PH;Tubj?)bt$8mM6+w%o7l$;UT z&X^0^9peZoQIvw(+FPnEv9Xe0Q0UGxt#Z11Hc{}oXpiHq+ZwruNN3OfZi3Dt{ZfKz zk?t=0`o4?bh(@d%?dbS~DTV&q&rvfey1p?e9cT$O+u4Y=hXejP+!i0Vz(9!UfI9xgE>#WbBachh3`*8K&x2a| z!=EBhj#2hcr#2cFQ?AitM0VWvSRp001cvpl&Kbs@sEggEd*+L!505HFNw_2w{u( zW1!%&i`stuf{2<6G5;beIGDmuRF~|xV^t!JlAS0RGjg>(&W?G24fVhwsfzD0lOj`+zYyrp z4)zs$%JL7wEKfbTl|0oqfy*b9xRP14FWb+KY|WtElZ;(>3QN^_8d>Nr z_GAr>vIH0dcMA+#RL%}VE~!BvAG64VN}L5Iyo^e91OkO)=+x z3QPvDbDXphTw<(dWClTceL7ph-wNZvPsC;-B~nHD@i6t-K}mKf}3=B??=aJZK330A7wq_+R++-&v|YNJ&%mtgbIc;e#rG4!~3 zqG~a0vgbLCEJf}dnmNfVOHC4=LE`Khu9^%QW1Gk<>*o6*5*SIRkznKZE~XZ>^*2JJ zZpmB&b`^{Hk>=fOrhZXK$vx0Pcc)?v%NThBB@bIH^sIG4^EhZQ##H%qU8s3BQQqnv zAdZ^a6;1tj)O12U+1{KBOA(<=2U|*ZBGRnnt&fB_GAs!?KI=sk-3m^mm`E?ItwsHS zOUY}=;zk#jccubGZ&X_9-?m#28@oZ0_l5~<&#dqN*Mv!G$qG7m3mxy9pkeUKJ^a#* z&14xY5f2eLprgcJGn~wgCX)mimqW<1%+#w-0CnBXudS99@#oh%ug&)e6fHLx0J*Q( zZ|^tbBSLQyabX-1Q}RAO8f#!Doqrx!h3R003REK43!2@OyKo%b!_%u=hFpvAUw~ca zhRJ?hxr*8f+wW6|g(=zofx%&!Rg=ULynt8@m1PAXJc;DEf`nyTS>6b&f+Ug}i`zgE zq0P}3YyFs#J~Ehfx;IxsW2S`3JAGWHyIVy*7kxR=x+jny5a?z_ACx=xP}6B8IfxG*%gcxmJy~u8v z{a?gb+GlVTr37S6cTCqg4{*RJ>I!lJVe8f)xSaEWAa%GSa>>=an0|IbA&(b?Tle%> zW6~|js>|cqg&vb3C3lh7bRfvo)-jh2A0pCHsdu)117x}}Qk*;)exd?T18D{1p}k#K zF$v|Ci5@{am!xX8nun;Vp4c)BZui7RpUxQZ>!=w;qUx#!lWFYJkj!blS6#dPDgCp zHGpPtAayve8}gv|V6R9u!D=FBlh z8k#&2liZsW6aLk{%Wo-beb4!9)KS8!6q}Z%ufq_b4*hqu;=Rqi} z>;K9ZH@`I4l6XBt4TEEM5h>Y)(pxW6pQLO^Yt6 zF!JG}SdTEES3kH{6CS9P`_Qxva9{s=z@A(=(~mFtim`JVSC}?dcbHtV+_fqdja)S*F9-Fx8m7CH;+!Pu;)#IajBlM zO95=09e&$`n2Yyj2Xm-_%^YcE-_4e5=T75K4_62+@jpg2r0SV>y@90x#|>BUyUqx; zK_C7vU#+<5#7yb9{PT&pfj>Y6%k_d$IFW}PG_KjFQ|6t$zCqR*-89hc-j^6UY?S3| zXLxivz~qx>deC`)!Qs?OnOX6%+EB9gY!ABWsHHYm{Ok>fyYTTbz@qBi%hZe%ZTEKs z1q3V`kD>B`pqNIq$rL(+dHaYyI4H)P9HhqFbvJk(0E3# zLf4E^D}}sp*NM3e`z~K8Q*(3k8;uUecX?U)Znp{=jl1LlS#JDN~l0~8exnq-_xQmfaJxdc)8>EJgvlVtdl5j0S9 zB`^shcVXmu8QYbO5mE?($Wi44HKg0QP61f0fPE`NKr+<2+d zE_i%w<;EV59%fz{LZI#75}+kzI#pi{WHQRxgyt__Ht*#035(?z%Cm{4p%Ul~ArQPR zfOLodsSu*5M*?UD$TyncvCJUl#1JCoQ6WSLr-u+FtPP;U!SbOH0?Ri;2rLhT5LliK zA+Wr13tzf=;ygTrz;aRufu#~cV0m8v%_QHKLx_C$gb*p844}3tB;8?4Utrr5upSlx zA?NrIYy(q&1SIi0BOsVR7XiupKOxvoL4S;Zj+3*T#@)8J&nA3hoJT>y$R_Cy!MmRA|N!sDFTxBgCVFL=Nl1_ zy!VHoc8F&pAYXUe28C6jB75@NHDj9W!!KT-(gY76SVkbn9a0*nVFpt7l_gOZndO{y z5-w>A4CH!b*aj;EFR?-O_*5y&weEw8J@NzpNr8#m`ifGoqXK|hogM%>=dBGPsQyq0 z!OCw2khZVd#9G#=&Qh&l9Yg`I#E#KHkb|R+l1)>z}&Yi0N8-2 zn@w9#8=u}ALVQ#AnC_eE!UITs?mZDeQ`vT?C68kP-wq8Sa4rfVaIOj=aK0mert$5w zA;h=a0!Tf}J{m%lusKE^wmjAH9S}lPe0~VQ){B6QAJ2CaaAJ^rElASV0pIS8fbjQk z5fFSkG4*>cfUrFTXOj2C2uR+62uR+G0o5`)YmErh0P$-?*{5i}8K%X*Ie;r8|wzS$F>RbQR6_>#(wJ0{Q$PUamQgX3NWGop_ zig^&bxF=j#wa-&o9Rr1L2SBLsJrbyOh3|>MGOHS=)geU3_z+O2pH^4=s-IrnCjWLp zD^zZ^iE71|VsJ92UI|eQ@UE}yMRY_T>exiJ*+%m|g!xU$!XQCUWH}d}#VXTnM zk-(n_Gab*WXd?A!&WFJIe^+2DaViCe8VEPPm?Y7WYd!sT^4Y%jQR^Ul8DAof!0!O8 zcKGesiDgmRbk-%Ap%MD)&l}-rrL+I8QRdoK_-mtt=79>YQ=HMEN<~g{d`EDWG;c)` ztFEUT2Op{X5Yex@%r_!PRcCfgaz!6qT;ufYF5dkFBl`A62=KkieHLq(G-s*nxxYh> z!n(y=C)pL*#&ij~(Efz$Uk_;~wgGXNa2cOIL$hEe6U!opz<2ak$$ta+%zzth#@?C& zYui-a%~v6=O;GQ7-m%tntsb_bYz61)PqPX23W|wkQ51_E!iUp+G^t`O4jfa#Pe(J% z*MZruK}ZMJ0~$TOj`&*vjAtR83j!lG+q>+pwr10-ws@MMP8l%kfGQMKwrEUlzVE9_ zx_-K>!{#;AmIm*r2ipt1$zv-sO-E7L!0v3pnU7bg&T7a%E-;|2xBW2Fp)Yv!B&Yb3 z9|z3U>G2mp3sjr>YXZ1hs(mrwS&goFCEyhZ?8a-KBG?O{HlM~HM0}O6zv)EOI0`(P zDBtYN`Nsfivpe@Kw7tGj;1eJuodT#HjkR0w3Yv3q=lt5eEr^g05#+Ghr29e;c6}!$ zw-cqUX1?F2fV0~%5sw64wHi+XVQGgO*ry3ueZ)Trbz?N?&EDykagxH$Y$$Lwy&8>s z&49O6YBa|lN zM(pa?7-<#T3fa#_tBhuM7E_6^r<&3cY%AN@VZ9#6nNUXP)g6jH3Zrj!nrC3Fy+rVs zRyE2+sz*a{+gd*{)>1t5JW?FbXFD;f zEKu%aM-+2iN^b=@x@*aQYlM9Fty&}ta{B1`$lAd!Gx!>nYZqXrx73KX)r}EN<7RV+ zW=7)NV?7A~mKgorGF4N!Gp*Sk)a%uBhqoall4sYSnc3zw0xkottpi2K90$0#`~t zPDZl`Q$g6~%!{w}u@Ot;yM0`>CGtZ=tK21ma!qNLDK20nJ~oe|=G<%!$B^W7%Kh&C$-mgmfn>hv_FefZ4{* z0$^NQJM;w>u!EfUd&=cu879sQeS<~Kh(AM&T5Vm+ueaJ7W#|5e7NplDN15*j^+oy_ ziJCziKDKL6*M9#s-|aas2T}zNOn*8n^STaJW>DGGqpD{2l=^D1#_zc zFjJRb32l_`iwF@IDy4_|cnHla2UN7sNwA?K7F{I*Nq~XjGwKCyCV^nT0|ItWY4!$1 z9(=*CjouJO&0EgKs6gzzSxX%it9l))rcy?4a10d>Yau5BD*28Nqs6%1R7_Sb0ab8acU+ zkX^Y^%E|RW=;a#pT^5a~=}h7)1@*br5+JuJSxz^oGj06vd>#n;8H8xt8-veZ04(sp zuPv!B6lsCh?$6MnR+ zJJWGmnUa6P+!y_-7Q+eIf^%oBSm+QzcGPp}=$JF>?2ELiWj|_D<Ca5HHQ`yQL^c(r}kW2_}6l)$_= z_+pbI=lhz=VnQ#@fmqurEp!p-rnWlcN*@7xsYgl#n+VZX;=!f2^>pNVO02-c9DXjy zyqA?v5so-Gk?X2q*~iBmaWyo4owVK- zrwPjMkxb7*%8F4bZIbpe(!$RsDYnK-Lm%vBm+06jdlBWs`x5Rc`cI}^Z0aT`bJkCS zKa}uFqMF)1Mk-(1v_DjoSM6?I*_4U=VjUyx{5o2ilz0@Wc#fMBBb<-nHi*l)O;Rr+ zwLM?5_ezX7-z5FtLmGl7-Wqj^jd7$fLRZ|LB-YJ}GeK&E>mU*u)t%8f2hZs>NTNEt7Hgh$r`qK37p*3-rbark7y_EG z{ZJAc@x+euCMi3sQ;yh3XOq60$KIQbi?@@8R%$+YE+vsQKWNk_Um%6CrfEpNU)Sq2 z*MWlnMsVoF*u112@CU(-DDI>+o(1)tFbjSk?d|DfNoy9ihDove@M+ADZIZB?gofdA4k1er^qg;^n~si4g7nxvd;p+4 z#K~@nH4Y=z8-T6PMfo{F7yFE+Qnw@c(ddJlR#Az)Hy?9~8v<&zr-+BH_b z<Up`{XRzQSfNq&FX!OLKgZz#5p}II}F~Af6cxQoy0BKJ5S+Z>mS88;XD#>E= zrPPD>-eSM31hS-;31!zHP!)LZT_1QacFVcMVcBQG?<8#d0}Q_%K#zM^V^%P$9bd_t zLrHm*csu7B&pw;)Yi2<6X19C4YRFW`ow(?G*;Vl}cYjI=_mZ*{*cl+o$%M`Pi+Nn+ zJgG#qU5TpWjV}j1=wY^$Zy)FgV_%@BIO@eFxena|wqI5fH4BT$3=qoxKB=+YsC zk;pkf_PVNE9(+(6{2M}uWIqca_3Q9#2%$gR3rlsgOv{0U)X=e+;i^n0k*geb?VUiT zNxUS&<=`NJUgDX_g>GGlO-JtRbZ5{OK_jEFc`grg>=6^&PD{xWB3u>@PJcJkLx)qD zTaL68n2EJ5C3gcmHr_|jWn<*z{ILb;}T zF8axxQcjs$BVEXm#2B7{plyacJKuGUKyr|Mj;WFldJHm=-fUk0)PT83joH$hX8uGie1VLn9GCL z2OsISHv*XDRerhHh0FvYx1Q*c>pOV20hyC@xi5%sBmO}X&)6<|4^rJre7@=Qh%bZ? zJh^MB|2Bi7H(!S4NsWkQYeH)L2@^Y(`y_hF>PR3RE^_2aK{Rze8i@4jjo_j116BPE zkh<+l_t7@8Y=zI%L2*L?q&Mo`1cb07AK=#vEcq~@K71U=4+;2*rim=^Tar<6W}_yF z4nEne%iJV4>-tX8tr07ZG7v4Kx^`sK{_RQMUKN=o@OkHLyi0WOu9>3fBWY) z;vU!jM{gskjW>~liBTPu97cexl(4F)Jl2z5UCeXOIUo3joXrQF2B0u)9SJ!D)mp`x z^*Y|tqjo7dwGL~%Qok3|Z64AN4Y;il4`)M+y#<_mxlW+ky3S7PM95s7GIqYtQgR^)BI)%h_Aq@b zB>vFl(3$Ni7d};qJ7VHgq?L`ivgOTDEJq`K7UI@>rJ|s%V65<5CCVoEJqU7i*Bu>T0stNtOoVc zcX$2GIem3klSV6fk&6o}^8puQ8t6Kk-KkEv5a~W@+v4#Uh{kZ#4ra>O(GFosW}iq$ zWsov&@cL_7dvl9S%QuJj=W^RCFnO1^0R>j?@(%r0)+>8wWlKeQKVZJNvRxKzVaux& z%9-A*K5&1q8Cy64j+nSd=|IuF0)n8moogLBTR8`!M*&*PGFz2J!Dr*_Gw5OgQ7L&t zn5AKw-kLOi?y=T`j!{}-&CFviyx@uK9P%$;y5N*~>EmWESvYTryqgH$hviZL_+omb zd^7T;EYr6(y9&J?dOblWp53^OkJa^n8=_nhmD^pUVV(RNXuf~gNH)e?-);%ufNT$x z$*XOoY6=bl>M`!xS-&dXgEAwCP}esy2awA|-MO;*yjTpR*Fw@=m0nkG!&HB5)*o=G zuQ5#r>~`A0BOGr6g|2@rB3!2bZx3a77do5Po`Kr2N8Yc+(yeqO{Ye{EF)NGP`Mm6n zxuzz%cxUq)a=~gW<-uKo`g;DjFGuc1U(07!;?7q?xqM#EBw)I%TtsLn*Ml3JI|vyX zap4D%)Ay+65vK&%e9u&V)UIFlRt;i=h4%9_|9MNJ_EU%Wmc#b*bpQFO*w1DEc?L=% zi+r#$z!88cy4`=BG%@CDK-eDp#C#3t+6K)@9p-?n^Iqe>vf#)M0tg9Iw%tGYX8KGG zQR+9eo*($!wCp-C_#CNG@O4`7)rf6r+?L7gAkIi`Chqtk&R~&Kt6@u0z{MP2jRFq$ zYjjvAWt~mzFCP@P_XW*i9 zT9bsHo0{%*P0~fk)TE1=B#n@%Nl$K)G$6CBo$k@oB&Da*BphgxFhZzF`=%yoBb1u7 z_mGwoDa>Z^L8psBan{tC82L^@HPe$@oo>sv&6HURkz5~8>C4FiK<%m;C7Yo)b-Q!) z7rOzW2baV6HA(Oib3~8=)nesfpB!b*{jWtBT*Ky@R14bt2UVVaG=xaEe7cAcZwdsg zcC14#B+Q<%(joV_5LmXFVIxtUo#lc!PdV^#7Yn`bCv4w7Ij_@~I1R#91^PbqQ1XV? z1>aCQbj}VSG((#l>mk*LZi&{)*8gy@%nmeAs^l3)@#Mada@Rm(bU2*)a-cCfoD#NN z5u~Jq|Iglaz{gb_{W-OhTx3&BH6TjBfB{J^xN*n@gTP>eZ3F=#%aUwgtcFgqF<>wx zeAEOJAjBAm=_QaD2#`=sZvjjTofrs^KmZeZ&G(<#@^W})3d^05HI(0dgiP7YbmZ?39Y5PUD;N2j>ONR}c- zQ5bjfZIpO{p6St`BMncQY$8k*YEgD3XxjQzmw}cV)WE1wvOx?(QD``C6~kMMrg;&w z$f?+-G<-_fc$}%k5D{uYQ%-Zab;~P1lVdJS#m*cQnje&NP} z!c35tI(&!W7cM!&$Yfdl3Yjsn&5L&S5-K@jQiD(YVg`!aBX31eE$HW7+|W!6G7}M8 z@=KRzQDxgYrUsu9sl@IH46Hhcycd5_=m6{h6l!U39J+H(9CE_kOGf=?ryHuJeEGQV(lx$_)CwTiK9<_!Ei=w7FjA zDFSgGcW$Qvl_r_jE-iW#{YKNpuxeZVuE-{dJ3Oy7l?$BPz+S~@>=IWzCg;xE3GHyc zN~rdR4GkbQ!@gjtOE|qEe|oPZpyGy;!CUlU*y5TvOfX zxVq3C#OTcnTrps2E&MW=7%jfgjTl;n6d^%5ukn((H%hPrF^)G!x%;M+!Msl=n#E)P zJugxj^WYfY;kejk!)X)B-P1PP!NU_QA8Omma4&hX&`|)st_B3Au zot(EvxNDwDmnwX}OSCv4%zFKvK~cNPk&LfQS*2Y-s@h2nY+uc#U9U~Y@}1=+4>O(a zh1=|?99+X=U+EfS6uHdJ-Ss8R(#^rs_}DYPx2$7opQod!RXS>%b@xaO1bvX__R?{N zZn_A+*AY|=sRlM4yC_f{{Bep(3^U+#d67ie)*;wG%JI=^SqSO`psHtaHWyT z+buKOXI^2$g6kEo2$OX>sS8LB#=-{pM}I5-b%XQ9`7(aQI3Ral}9EqanL zgjXdIZW*2W36S;GZk{ez#x13HFBH075Zc@=yd*ICWctfGy`CjeE)3M>%k5WdufPy+5F@3be92|PWy^)IG`x(V#n(zJ5p^1r0eAFJ}z)&tX zx;dk$Om*BX9Y+ng<=6-QDbv`jL`(k6tDL-4j?<*<-(tU{+DHVd?G1HUe&$bk+mg@~ zNFdcAXP9`A48^PC2~s7j&2DwVO(o$QMA#a%K*gBt#&AgMs#K9aaU;oH*g-a2$|G;< zC>xG(ryCr0iROHU#(eMDdUPYODjcuf6da0 z794*scH*=*(HZ!UOS#lXiqpGH*C{y)imQ$ATfkzSfSD3{^=UKrF=te-h(SokliXUH>HCXO^Iw@qZS7 zoQ8Ml+y-D`6MxT(R^YW3hZ3s!8(*&0@@$&BCn;s84ld@{Uf;gu`uaS_Z+8~K)yRFy z&454C6u2p_OYUstGM=Dz>e3{DdzqFNKIWU8t>fw>nrr7`4Mz!nssJpSC$hW!BGVq(+&?QOKR;fFT{vlKK1zDOEVU*WT)IA4e8C3-oj^DUW23@*V`l$2tS ztkWo%1=WMu#b}qcQnvoU{<={0MtBrXDfrX;?K*;So-Zs!SrT z?m_%{PA8dir8~ODM%{_iT3ugLi*+?_pDE4H8JppBHO88J*%$vG6Z$bwJC0L}vzldP zH26dC(o-ex#lxnKlyYz%ZUvB?k}yfbUzf@fj5bt3%3y@k7UjrvMRBax_o+O`r7MqW z>g!xlyz2@+U?&8frEQ?eerkFo^kUpxH6fJJ{a_Sc3ud96J6P>m^{v%R?3_ za=YZHbL(kf{*emm@h06KVO5R^hV0jrRZEV3Z4jmJK!?6Kq8bF-2rkMencNd-F zfXHvD17b(fGJx2!MSsA5Injm#w2&nI`8jOU!HuDJ;=gM0L->1H`OgO+h>Zf6nA1R& z_>Y+Ynu`C}`GIeH@pYs1wABj`9QJ$-Dd({($7luy=awDJ)h|jM1ace%(AbwGj)OS~ z7)+GY1^CZbA;;R~1_UW*RWHnhktp6<@ip0R~LSdlTMe-2Hs{B$6LUDR<+uuwkt3)xj>`whNZum*lycAONA!vRE|Tl9`Q`Cv@NPO0a)$v z(^Cp`${Q%H%>B@>@Tvp()5@lm`AdvCou2SAd8Tx)SU&+ZH3H#1eK%)~Hh*XKo~%(T z2elV7p(cV+ANY1<6jJcFxf zk;SmdZ%fuVdv_S#3{4$@XV9koLu((^n>RUBz*a%2Ivr^POo0~y!)?T^5?X4b1%jpP zyqIMpwZ#5xieWQ&4qV^Z|D(Slq$4DO$u_^E|Vnw(LWPW2SU15Mhxy?8;9> zaN=ESo7eAC2gUt=YjXn~;UaN^uwG7~`3f&5$=NFoK8x~mgqUx%#N}Aj{fxmEITm0w zNpzZfxVBzVgFMI~^ zY5G3{Wv+!{CYh(FlW?4Lm6Md=^}pn90w2@FDOPkZ^Z?+xIBp4*+5blYO>Ci}ub{bn zdZz&g^=N<#p$2Kl*J#~pTumeJuB=Hb)!-e6cKF5$oHT1~)Zg_y#zs-KezF5|#eVe- zwvnpO?cvUoLEl=azB+;78JBJr79J2b3}KkM0rRsL&?o@7%4Rm^T=v8(1b~cTzGyf_ z*umkuY0&wjHn7Wk9B}Hq7CKb5?m%B|uHu!eWCa6l6uH}sW)6wqc9(dfoqmD0S_~JV z!-xwrwFC(MhK;h9O*oQ_4Li6;8V<%a2$FtSZUdW-eMq<`!%{Yx<1^fC^x9C1mmCFo z@URGfA1V=_*`QYoXsg`~N%%6Gj$p323+BcI(aWs?H+Wdg#0$1bBZP^2+-lKE*2AI*pLN4dxlmSmR3PbCc{!`H zXF5iDw7rKgGHz4^-8jAm-AH@mbzFS*kn*F3meQw_VeqtDDBWtmDH@^eHT6Fb77HdJ zK?CrHgd>g`LYv`LywC*STSY?*$WHE60JOU{ZEA!ML(`CH^1oWees(%cwdxzn>30V! zKn2~RAz1NYboC)BNE2&6Omz<2iKy76hez0PlLJO$@D6vFZPjeJ$@>80FVg@;)9{Yt z;WPvPO{wmjp=iqm5j3n87TyeLaR};)dRW0D=|lWe7tw4t8zk_#YjkwR|ELEFSMtf1 zzLZtjr9I*+0p9ClBv8PZrebQ0D%$1v+n^6$lPYO>5z2*9V zWP7*VZ-IR>>b@!58(O1pGoT7YVOdYY|AzVmIv#X%)x+pez_obek53z4WQ=TeKN}&c z#&BC{Ds*)X=d=QLz{sKKIq2|)v+Fib?drCVOgpB4Bj{)61Z)w0^hg@rnlXRZVnu! z9vG*p8TBGiMw(pxjC&h6M5y@ejdW0?AqGv)UXiVUEAlh6l${T_V{0f zq);0c|BWD@0s899u-K^E?S2*EyDFsN?1=XRnwx$M6`sygqg^==A7QqFr%}N0{Jl7S zO4la>#UC4*>ZFD~)&XRH9a?;x6N34q#SS=vF4pnN={CIS>1&NXo95SaK z>w9%F+;~5Pg0#!8QUmzTm%^)47#GDH5P}yv``l;>&R5jUxG6|ZNBjwS zo1q7ns4dZZ{F!ydY@^^MK-CkC8fCg6vm7FRZ*m|$gPxXvbWB1Ay;3L@FGh?W0V!2; z!!YssE}%93@a5-7%pbnI^;Tu}G4sJ--`iLYy0qSxC=GueGDbf`0v@By#KqLy0F^(j zU)7qkbm(fKBPsD>mDo&wzsg|EQ3iY$AooaMZLcHgYd}q2J?Oa!thvdQA`6nI1tzu_ zR;5DH#){E>x5HTS?W;1cI}=xxiRM4)q6PD+i_u@lRW`cu4u^zc{1YJMR&kuLpr7Aq z0F~k<4F@0D&BZtD9S&5qjeum1aFYgR-2T1xHAb`3aq&=pN0Y8uZ7W`co8<- zMJ5vsAIyb#_M>4*XyWU~zcsE0qmsR1K z7_F6sCO!GY(N7*KRB6C7W-l*^UTLj zT_S;8lWwQ$j@Zp2TZk>`tO%^c{AnGq-^kuu2gQ)8aOy*GoGKNMWXfE+uBYVUW>*?L zFLD0zn2~KpI+sx-PX`To52+M0Mz{EFKUthzX|(w0lTR$%U~&7VjaPW4GbN_njTWQP zokSB0$lFf$_9KdrWR(;fL3puL_Z%^r>PKAD@`|;t2CXa^J<#g`n`aL!WTZ41Me>xW z1I;o)O2Da&oAKYZ$>U1oy-0@F(6Xf~KxG#U9&!kB$%x=uHg`%AJ!HnGuBqUwATBFG&9a!1EoXjukic>=`om*HkLb4pQ0YrjF#mS?`3dwzVCw$HIFGR8*%yFXNTXqxU_olMw`jt<~uio|IjU6jgXZoOSKcWVd9idW(h{HE@4DY z_hi)YRrDX+9t`=`>PSy@_JKpvV{QHiw?|FueAjMIU$jT*ldH{Wh1LhkC>`$=O6q?z z^1CvM6slYvQaNXt_cf{vog4=UdbEtV%qWt_wc*!8W>ysLPQUA+&ksGna%w737iz8n zb=RZgACb6p{j_Cr8GHQEvJe?7f8AbA#?nX)0 zg{JpI_p829uKGq(nW{NveO8-=ts31JG&*OoCdA)0?(4pYsqO@!Y5Z!>)p}{NaVH3k zz1O239N}8C3nOSM=*eMXJwf4dtZW^ZQoH<|oy5jJ-d`*4)#hFS{z^`YXBwkwlLgh` z4Vx8ZDU#vTQ`-&aUM(EJ!;)xK5eWo<}|wNSAv(F zWjE-nyK+FYGwxU)jI_Q3#*C6Oo2s*~v~OMO_PZh!zgl(6fFQz8;9Ap_Nfx-{F;)NA z&Y7E4Q|~KNRWu%P(%*yR+zZ&Vx);LgI-q!2=Bm3|$LtvUk%>~6xY!bI?jhF3p@Y-X zT~xa(J5#&VOX)IEJe?}g0hK7|Ap%>*XZ5#T19RtBZc2t-5pZYBb;;Ugov(FB?b4qF z@1ok>*segMXkVpmq& zY3&h*IL40c(swW_V_XgoU@f@nuA^592rgW5j zV1T+}4}AYJxRl2D0iAVIKMWbPFD^$?tZ7hUGi`>Ub#};r&p0Hhn(H(Ao&|h+*Qf82 zqOn6c9^R;PK`Y-+%ilZbIc3Wl`<=CeZn$gR5NdYR%&qS(SE*tlgE0c`alX&*{M>x~ zit3hUEkl>_j;49TiOwpr>jo{0tarv-H?*ue?=d~g3SZsrHeI{YJ$u&CC;(q5gPu8yAHj@?EKb;~w>tWq7VVsl z1{<*SlWfwOW3;=MI;B?EfqUC&FJ=+fLDQvpNp_@@Iqu3Femc(;^XfMtE7{MHg{6WH zvbj4c8*>wB1|L0nEGcPcf(Udg6TQG^{Cb4GZrzaZyP$7|Dm^J=*V{~%QTM0weptPb z14-Z0)r;KwyR3tmHX~;Z14Fu?kIlXc`p#pwhXU#Sjc&M(-R5fD>Cm&ch|#a-v`=;J zYg6yCFgWND&C3E`>yYksFlaF|Aep$UG1|PRbkB6~YftyGGGOQd-OCDJ>yGYqG?3|< z?(G8I3kE&O9b&QrpIL`%)DHLmKahRuvW>w^HNtm2>!GzY5HW%cb2DRfDcEqAg2JZ_ zk_Fn)uBNm@m5v!%?lMxAjqO!y$jE&m6{AThJ*&h#I`4|?s5~YtEf4f0vZ-mR!<|p{ zP1ViV)rV`S%vWl{sw(wtYI=J!5({&7kej-D?z^hv7`^%(75Y2Wrx>k9p?iEDz$jdp z>focV4|k1)%nYV)(hLVFV+mX%&_mf97gZ^=pRo#~?Rq3@(^Z6(*@V&VNm=)R5gDJH zMVgB9MI$3AC9|a2W4}ge@*0uX?sA$8biEw52BfVw6iV94y%D67W`(jY`c&7nyIxjs z&@U73+bEvjzjU%O(PhP28^RGBjy2li^8gD#Hxg&^j%@ zw1dp9$?vQ+lV3)LVqKPB`hil{w9+ITv_TcrzBPU z>HXO*%^G%=Stc#lNLe}j-viTb2P2u3E=J4KXhFtnM@B#)jz#A4)Lp994s*(+)cV78 zN+YvVv1_Bl>0-^^k)~!EZfU?t6I6Yo}$c7=V<# zGBW||XzizUm%7;cpX<@uHzTaD+P5y(TB!YyyuQ!1pWfN)V(q_!+D{tzc4qdoK9QU1 z)_o7WC!^4rXir@#3J6#+d2w`-w*XrTHN_Ts#wJ|L0T9@^co|Ew!3<%aC`KEQeyC&bcJtf~Ya=F(X z`KEVmyC&b`AYXQ6?W`sJ3>dxjmQKNY>K=yd`(VNBN%E%OF3n_RpRw*%_*z(d!j6}7 zL#rtZ-l6LaWvPy`z}5DR?QPy&b=|F{wb8AhnlAa@swP)?z9%*GhYV^c3%+!ZG^H%? zwGP!%TK56%==M%)DJxEX57bgt_*!>rDZLYdTKWsulAMJs$H(TL1eEPEwZ9mCN10Lc1 zYg#nnOxjT9sve`4xSafLxilM3JT}_uo4#-5dk^JHY7iYt`g>Qz?62^!IqpikF>xK$ z?DXajlP0rv8Tku7GTq!hvw?4WtwZZ90Ahk5_F}kFU!_C6f#=%Jm#M=_;-s|N18l?|0YhC^&_$<0nqk`$co~yQ=$pfDv_%55t7&Hb* z7vD!*>&>8Nw1<&VqL|7`zCZzszKy=$gzo7&7oPr6uJAeLIf^yYxcv z(DWZfv@=_osr&A!>Ylzvv%XCx=rA(j)-+^a$(7~~O(zkPD3c6gG{K6)vq#B_nWYKO z)E+6-pWv*&>uGAmXHZ$8BTyxy)B;rM1p%4-L%+f6>f&OhP6ToeK`t2)OeGR-=z6Ti z0$ZBJEWYCj>I2aVluMk(g~?)3P5V@}-6PWUv*<)a|63J`exfS%zoJHCG&kH(JAS6~ z*)5|0PH1PlxJ;7Fx{aeOH`Zy)c$Z{H8!Ni+p7GR9(&vo>zcrJ>89^ks&t%rRxOl!;NW%p~%wREapPdc4|tA82^8)@Cp=bM+vN zu$7CE3B#sv!XtC%SS52qw~3R?YjO+g`q(UM?03f6+HU-=kJnLu?oKVh@2qKP2V^Ufi{1w6^1t`bK1RWRjDUc{0d69P|%h7kI|nk zKeo4bc;Qx#@0j(F4eHjR#uO{$$*Z$Q-d+3CE!I0@t{WC83w*6ZHYlBncijd(kgDds z4RQpxE?c3r66sp2f7*(pV=EMP%FnYxX;%)r#?LCt&)T*^wuFI=>vG4*R#I7QOU>=n zgL#1LdOLg^*awO0QX#KBreO)!~ zk7Jdfx|Q$>aO=QPf>ADj-VP%Fs+H?KmbYT@2rfp)A%#b4Oncez82u&{4f2;8@{-xg zCv|4pKsDAkjvCcivtVXDIEy#M+eVGrpCP#T07PZ!6{PXAQ%q)(cEVF8KgaKo9rvv@ zO|!8>_aOc^t$B>v?iQngPn!gtOTxG;DfBG03QG+VN*jG*YjdMbGAW}Z4##yiL8f9! z%ZNjDnWY+R&PXX|Wm9bf1UIkVa{s4HlG)fRGl}gm^>QZhJ!$^s8NWI^*O|1!@#s!{ zHc2O)#?yHoG1};_K3^R-xNQ+TtOazOswz2^YVzDvkJLeI12WZ`7?nI{m_}p5O^yZ( z=>EZ=ltp;MfL)Z%cF*gK6lKn=-bcZ(+~i?0Ek)YuwMzM+N4Ep*_Y~qAFI6{ehex&O z1y2wi*bt|c49GZ>*CajI%s;g0>TJel+ zo!#D8-_#bPvsKhF+hc7cMz?5)`@)aRJFDD(QYaqAUE%1GAxFfh&x^WetxmMnw6;~N z9<%`;+nrStZ>Vl#T<6`9gvIVdDgx`7t(niPf^Lxmr5Wz^9;6FM#egp!gsvHl6jdz2I#`*+RMmU~5Zr zBHk8nZbFA|8fa5HJcC&cZRK_KwWz@6c1Wo`^&oMK{s014$LJY9xML&yFF&%?#wiUowe@qF z8&GdC`aDgfKxOk@!KH18Edml>#gsL9dfM)G;OHqu9V2_tHGvN4d`XRac?X*gv>!Ze2fj!Lv2}QP-l3+t)2<(i57ZH*yaiTvUXIwHUoc z8tzB!9PIzX|5kZ10~>vxLyUIp4uP_TF&b_-JWNz*bjeUy!~=i~RCM@IQ=75?jc-F@ zN~+0J*Rp@8s&#)NTWOAvHMA^*0g7Wfjl;!_=69 zAFxVCLS|dzy|HF)eYKbsk=HIj)g&CmNFb7>APTl00{D*6pgR{UP?;FZvj|mlV5So- z=m0VM@EWF_EoqtYjo2wua;=k&j0Jlr~X4KaK-(O!Ew2;IKL}N^x(ke||*> z*~}Z!V=AXE4Z@7|PS4YenyQ^q((TB)IL3RiX9?fdC1$_dB8%UEtkI;@P!Dq19Eh3* zIB(T$n3jR{8|1nxFx$frK~+W#OD{&_oD|i~vu2@FNra}HjEG6H4L*uBNR9e%su5i_SNt106GL$l#K)p~Hu<2Q)Q=P0l&X8PSY1`A|Iq zj0a)wyvbStskH~l4;ePNWW??eA06KV)XOop8dAp8&*%Z_Ls0j-m+ubhOL~I($iXG$ zBAGveda_2ZBkFIfFGhEVaG5pjxB1XZA=#`W!m!#Fqkn{OnKfb9d?@FwbyhRV2A7CY z>=(jf)+C`ap@AWJtRp&MZ3M=zAzWrn5;h+iACk?wA`D~FVl*X$%j^lmaw8}Vag zZ;kS8ej1YXm_a8Xq!^JAkXUG4Ghbv>yh>m`ub3BwsOU`dvF+F+aQ6w70Z` zX7h7ZLdPSs)4kSN{T1TK2#+qnTYaLorlr1GA@+NlZ?%XwDo~9wsme!U06?`Kiv9_Z zCwpY9O#R+9S7TtRFW9ci{&C0mx@B_cB^Zo#Y3Ht*GSlN)0Y0)&hJa5MfD7Ddbcjd`#77EBhwYi+BiKLO_J+VN2fHLUChC0fYT8^1O+A(b#Tf0MRf1(;@yAIN zJ0G2=Wz;D=98Q|uBb0}Xj8U7VoZ;d;9PAjKkWnh95W8a=hE0>{P%RVbl$XV5X^&7I zhH_qIDF=2VMX8)(LZJ6_G0Bh^J@A=nN8Of;-`dJigcl5PJ-3ins9w_Dha+j<&oy7p zq=`0x@-KN)OlG9HrEKO=?nv_-;X;RY$T*#C=_togKb4(J?x-fw=*IfVGB;K2e!`6M zgBo0kWIW|Z5AX{n4l^-yEX_~82qqd~*am%xF2VWwPsde;1jD+NfO8!E6>A21`ldv@ zHbMIXlqsdA<|bYwZK!E!i8sy8pa3wMY0}Ds;mZh|--@1JdNrQUiqSvQB*?Vw#OT1U z!`Wr()d*8J7*HKvC%5p5EX6qmixg{*yehsJa1GXC+vecoNzUYTeQRqooRq!z-{6w8 z0kfJ0r3u@yWS3ZpDv7yAL9vi77fcsi2xhS0sa7?W7a}oP>=8>Ih)iF~M56@V{&w@jE4)v|Z#gWyrneB1j2!v^nDK&Lt>uOps-jC7O z99J85vj)ap2$sN#zLg+pBS}FUAt*5RYKz;pz_IG7L9mgtn!a%NB=AH;N)IyzUQdil zRgS8cQPV$rI85lJtty>Sr#D?Xr#AJPlXlhA`Cz`j5^KX5|I40d}MD20B5hjd3Y7v7nQA!ud--@GW#Oms2w$BbJ&qp9#e^d*OnCQ-~E#8P# z!U^s8dJufg7}0;UqOykRSvRAuDz4tP!rS?z>EI7<2#Gh=q+aua!4~M*8qwn-+5t%8 z(ee<<#t|QTEI_Y6=FMhkXlm!+0nJT6#umcqc3>l$1GVofy>Vqzo9>Vg$cR#~QK|z{ zhh;>ntUMF8=43*vG80Pe8BxlpfG1`|DzgHf30iH~xuSI}MR&1Kj~Jd64vBMh$8qEy zj2PYAQ7jx{;brg`-HTXaf3;c%#u$N9DcD2)8X_m9zjoko-)VvG(6BFeZ@#-pReMNmp~DOSY< zNCJ*(iiqyg+zbacT9epFp@Ur*9Y)c{>BbHsS=;n9B8e-)1xPC#dJWN3-#ZLDJQqd{ zGPJJW3r!2=-p;Y@7LCu=j{#LiQ%^E?ifO(&n0LOEnTD=or zg_F^Z0aCYVdJHI@m#oIb3cUaTS&8>ZA9Lh@JY2Z>v|}%DD~pY?jAtI6$${yEUp{gB-k($-rTX!t@JVgX!zLVH;Vz##zCvLl^}S8a6SnYbC3 z2JwTXhz^{kJA(MZT$?zH+A(_+5e}+Pv^TWTO1#?H%&^$*rEW=MHPsx%6UAZG#GGn) ziBP0DHSLKu%-)6gzpr#Vx82$AmE1zezte5d%^oT%-&03fq<%qXk)^J+G#rJ*+kVUskB670fb_cLxn> z?2sk*Q#RMI$9Wxc2}Z~cb?pz{npG~6oKnlhLjf0jh!NfQ+rUWAi%uh6$2&N*I~qD1 z&tQxhW|EQy>>qb2&rAlR8DtvSstX0J%uYdzyOd{^3c3X{#kLUI2LExkuPK2Extf`A z9I9AAI{-H}fpdNJG#Ib2^RyTK&uni)r`kp*;@!O@f=&j)xhH~F09K2oGNC3DIZu{o zoItApVe=55y43Sr@3|N`_#}Oq92Mr{2kNZwmnpH#fI=@$rt@86^sBAmr8TzDb@-2t zkRHK**{8(|-G$pIfL(9B^N3g72Be}fMYSWa2Vox*&XCb<+ln_gkNv`Dwqsc>pjYv~ zZ2`8T#m%XxmKykTyaI}UIQ2A(553w|P~?fTcr^{UPp%0=k@i}Ax_i{91DdDQENE!1 zsf*FFAF-#a&qv=0pssm-Q*8|nP_@?2(&#(3*LgP8VBt~bbGKKrm^CYotJr4>~#e-`m#S?9njV%o^`nwl1jB5E% zL$zoJ2#Jp!$!aR?v7>SQX`Fr4oA$Ue=m21qOU>?XWm6M;-l@Q03R%dE!5USyf+0MH z<^mF1C40j#Uyj{gF`DnD;hh6#0>MYH_pQyqSrvus>)R5*1gowh$u@cnO-avN&fkw^m)evwa zj-#}};7{KL1CO>=9-`p}qUHd?zPr-^iGbzEs2rh^gQ^8m6 zu3pOarZybTXD%YUc>#PXOYr{z9)nBCi29TYzy(}11g)U8xrH7b%C(4*1ODr25h@#& zLuO5!h68A>ZNnKPdT_YlWyXa50w7U8o6SmsUI2h>;#f$pMkn6_0ZiE)9AP#)(LPg* z80|coQ}Z$+^&5lS<2W=_v!Hrr`>a_|$qj*;pitu!W>a89zp#PlM|kI>daOwR%XAQL zd)p%jVz5#N@ouu|K@fvAI*7M}H3mTp9uH6(Tx7wR(>)AldY*@2f|q(2&i#5|)Y38C zj92N9Tj@5&nyni2ARt-%!`JE?<9wmJcV@|3bPbH0q=4C->2CH7+d(0R`C|09uw0yx zO!$V9&|LJ+Wli{ySStIGlORWg-M z^;m;*YbF@Zb&yq}9<`2CsRaOG>os*iAVdOTl?%pCF-+P#vz!H;V{&lC5X|v+UqM;^ z%R({?-CTdIAsfV^KN*}AGTmR1u@a}>8>Q z9iPgAJJryEve=qWX)fMmMF$it8@P&uw|mXTg(NL}o*&&N=IJo+*fbAQ?5L+vhE1Dk zw)3EgCJRU3x@%D^w@GD!)6iYg8Og4cWp|J%nB``zWllded4~%%%?^=+gQ>0#w8u$Y zJ#To5gkv->By&tTXJQBw*nP^5e+boIt~u4rI!^31jM4eo%f)t_Lih?p*z`EOx$y>r zbgC&sE6{=?93fJ=(@^Aadc;5`Qy!K5)gb+fq=A*%dr_zQ!y5`aa2-@6uLFt)q(&DZ z3=Ya9mri{Lp4#m=pP?D$)0uhasl<-+sX#u-{+uH^N5&W*+Pzo@+Y4nn>g$}u)$@ji z2y>Fj+>c3zq%FJ?F=Kvsn!aNp)O9((jx5c{PV-yX)%-eA+0J$LOe1F1jOcQ}rmy6I zsH_BEpNzyX;;+d#ZuD;$YO)r%>AqTjY%f7u0_Bm zdlALYv`3`jNf~Eo=`y0vv%kMKqE!A29k9O2#ruSXtDc6 zYOa;-dGsLwDPq#xA)WXWBRHOFq>}+o;Yz4v=nM&znMJxB?~V0|M9u7ax)bjWhV*j) zAR!~3aWkMU3z}+aZ@j3Uo+jaStjqw6Yi@3!1vUf+himv^yciu`V`3{@9Jn}eDp}~WL@%aHYy04&Fbh3NogN}jJ)3`Wyj{O+H(X3>~lv`Z(hSs;o9CBd?C zcB&w;RDY%`^kY=(lpcb7?<6ama%|Da|G)2tFtYS*uMJRKBVTMyD*S~7aXTUP1^7MC zjBI^kXmh9ZP=!s-VS_GLHqtP>^DzWWGRKd?^;)zK5Ml+S523@)&7o=Yo2zOTOqDC8 zU^!}lYOFbmH)ZQ|bP7=TkPHqv)MLWi3%UwHGT(0Rf~4Dln%dTC36B4bshr_x@o@_c zL&cp3h^@)?vUq(2j{Vx;p)el*USg6CgE<&*zJ<{I=Pu<@2qqdPbdE(`9`1m_8QR!7DHA0ubiqbuj-KJ4V8|43YYYXa|Bf`ic(Z)%q= zUfrP3`?u%`+8fm(2;@*LdjV);pzE47O_kAom*x<*N5pZz7hmH+4+G{6cGWB}&{g!F z1y&SBcH@bgWNd%feXKEh&5)4`&lHjT%QR`+2kX#Y59ro*wXLr@V1>2-o;i@qAy7=U zYj3zABDFa`Ue`8f=7KY`e!vM&Fne29az=il643%BsggeEJ0bkE2 zcI?!iTR%6xNGs;Y2)CdOZZm>xBJpNR7;wZ~yy` zh9WG)sGAH>2HUnLAYMeGNdX!L|3Hlv`7|*g3!)HrjE=G3VS4B%ms6W7p<#1QM+`oo zLW}WY&a==%oKAmkqb@#=9=sV|UR@n#dJ@=RKhF(BJW{hB>d_E2b~lJo+^dW`UXS^rOgqC_-?pUvM^o`uZWXK48lyW&rGc zf3&3=;+}7yo!k(lF$WZAxEp{ZHej3^fE4EF0Uh85AcYP1u^Yg7=)34>mK(r%n1EI{ zfK%w>0(6`kz$r|?=?GBUe)avqbY6hLEw9|M!r;=Sz}7Uh%&D1K-xjZ>k_UX@+ENZi z02}jaXi;;kZ0o)HK|ii7-%SYMxOG(iupdS4{Gu4JwY79!QlKsEr3gscT}|6OiXJ=O z#+Ns%Yb3{%l|wqbT3U|H55sU3AusptifD4FlXN^s0&-QwN@pPgn&|7lq|yW(rdhT- zZmj|Rax5wrJ_Zfs8=Qn@UqHD1d2V|P?T1%o|Kvs~Y5|NDcFCVEdfZb!`U_wL3L*OZ z2>>;Tx%3TQ=HuWH<*dYho0|DmcyB#;n#eZ_6c*QM+*76z@yKMKr@6u~ilzPWhSm9I z7}qnNu~E>n20zPuVTFjV+oUo;M~xUx!|@-3_;MPJm+D5o>$V|Yorq(vmD<5@n8COD z_+uquqJ9XSpkv7N0}k1?#7EG@z}3tGFw?tQhzDW&2N1;496*r3tmjO+a*V)Eu@Jl2$3Jhv zhG0N4?*$9NY&X7WprNp9buU>6yd3tjg}}=}uRz8v?eRLQ!kgk4#E$`xh&R^JB8vrc zzqJ6kxzhq=$bXfEcs%r<0OF1AuNuljK%^poKxOy8nXsXta;Sxdfyz+<1S-v|Ow8e+ zGV3)9v1BZ?JE&Y~A^u9jMX#HfBS7U23ylPoKfYnYMuN)k{%)YMQjodiO$&18cb@}- z&>I0*4oWY+Wg~M{J^8i;xpqDZK(3JW|6xOig4ECe90pQT9T2421CURQH2l-1-5sQA z-w8mFIw=50fYfCU2vSSmwUI}H)UWTihX9m-9c*D=K%;( zgTJug2$0(LOAC$!sm;C$K#uB^hCMp+p5};t#CEXsp z+y8@D?QK}nrax1zvRu-J?gW&WA3yqNoFTav@2Zu7zlQ*TF7aG0b zZGmMngYZ9rBgJvp!J~0%hFzsrY%|>j_;xm@25}%Gh7ZMPqMH91^bsar621X=w%c?h zUa*Qm^YC948p1pV01n{PVU}6GDUzU*IllJwIRA5P^fK7T^8xV%EPRRv9wrkv(&|64 zpNOFIVv4l5T)wp4KDrm>3Bf`LooFD96$r)E|M_3ZB?XjoIbL$k{SI{^^0wE2m*!T~dY=h81Z z`7{sLZVG|(EAnYI9?>^1WUKl4^l#iJC(%6M<74t^;;~4>?dS1}^68nVuAlK&<AVs zi|}u}Oc(`#ErOROJ#gEpQR;h|HeEx`j?yW3gxbY;`G^6g=0!_S?c4r^v|y&D<^f)s z^dVlfGfpj}=T0b8()L0;pykm*+WP@SW2@)^UbOE7@ND@F^NXnPDA;mVOb^JAH?M2S zFwL4o^OVmsQ0a}$@uj`#mzVYGtg^m(vp4m^9VXI(?s=~_ZSsC^B@i#f1Fj#}hYtHl zrPhxes7@CZBW#rsk%o>aiAAFtax=aIhj z79L6CMuW%kbS}{sc=C@y2b<6yhX5OGOf&|M0H5zbv=!XD`~&kNIZeC5GR?=I+~e_w z{gwU?p`Ziccd+jvz&`sDosOq}J3sRm{1i4Hj}XW%;8jb}IjRGYYN@zX^%KI*U>GqrWc^=9 zg?WHSzyr?xc`xbEgus*9STK;c-;2HJnR|LC*NZ1|SAu!17~9{mE3MB8k)JUR)F z0K<>Xql@tfaKmf)w8iVtNzU}*TMMYqZBQfzCO=g`x8f0Cz+Ve!5gq}&OrL^Bu*d08 zF;3HM;EnYQ>3|Ii6*Uj=WUz8!FB*MZFBPp|m)>+Fo>Z=T?a+tX@koeQ(#?L}hfcyH zA#*P6Lr>!o;I=FK(DqkpAbw*XdIpb#?Dk$CIvfCr{EEw<>|ik5*`L%IJd6F z9~tfKh&Q&LyL}1!za{L}0zA77hNOOhmp2*s6ju3Dyi8pTpf?68Z5X}YgGbUF@r)W2 zGN2sC#c&$gaoi1#i=)Z!&MGB+VIxD^2R=&9me69Qg7 z9s!Th&8x9Q^b-hvIU1a&NFFezIY(w;L@CmTc+ou4pPY-6k-tVh-2OelOS9p1IkfO> z&CXaXOD)67Un*~2$PSpNZO0>|J-}nsBkhHx2Rv#X;HB}3;DvZ4^#CuLM<9JPFHL%O z(ns^sc$s>D$AJrYX6N(vJeoK!Psx2KrVDt=Kq|qrLC*tnZ)ilX&w?m1%Xdd8YpCRzgzWH>(e#nOn z-7$E1m;p9)=|eIjo%hu_`LsVgO?edj=32ETMj9pW;~(}XX51* z23Q@^hh#|lvr3FnF!&W|y!Dd;8d|LZPqr7w3+PZhyWI=L@7q{FD;hNLyI&Si0*^F_ z$!8T%IUWJN#>)c+*yN%Ddi_G3W}62JsCa@lrDbob2|3|l>rd2>iGjRt0Pr*$>LYjb zw*@lxkXRnz5z7$x?KV+rz$3-+(k$FHDpSjnj|aRuK1xgQNE**)JP4lTHSA4Zg&Nrz zb7wq%CImdvUjLjS;N_FvH~q)gYG@~!W=PtL_J0Y?)8W}|E)348n6TqXJE7(QUU@#c zw2UL514;XA?=ArLO#7;&H9O2d+c~=G6X!*8K!Zg<$ZZs5lybpqPy@&Hl8{2fLn`tQ(>>(Dq8>I-tN$T{Z`v1+gm`M$ zI-)migC{lQ^pkqi5qKoTlavRXx}-NfhesH72S#}pz0jLh<5|Pb3RAW`ZQDs_<>r{1 zA@J0fy=mL8K$`1gAzmJ3fa@cDNQR`nG2_fZeP}rz7ERtKBm2UgtSQGUA*vwv`8a;NQR_G&gnxZ;}PAsJV>$H67Di zJXt2uuK7z}nQa%~+b803ra=h$}rF#LEG!lJ? zM}V>>tZm~F;5NJzH)~)dUQRc_O?df_2J-0)EWG2#Yxa?<#l4DYlitNlp`gDG=_euA zV$nWYfg>{pT?{m56urGBKw>(bHl9$lUg2&Ua zVWQwe)A6^ z8+m*&Qt?GazbheHX^M9d09+|8+!eKgi&6vRC30v60Lk@?&T`!lWKwcvq|TM7pu|(z z0S`hJdGBD;iGvoEJ?+mq9&*nO^7}?lyE0;tTfBghZ+ixf{&nZc8*;qnUGI=ESW+knKS3sbfNrD&`>& zUNW+yGX-9?-m_X*_xwafr|Qw6^iZ;lVd`y$$1zi#~{VJu*n$%1@@3)a@t{C5}LX- zImcb-BaO-V=_y3-;^BJ9{oquhS*K~>zSC8~IfQFmewd6#%`O0^g?$ybb&ffhj!>!K zd$&{3`7a~I9IOO#v1tewpte^S;7kCk4ZzA#y1pV*#7fa(09JnQ8YnsMS5GD8aqUgnl>*B_~l)FjvDf{mhYzf2Zc0A#_bc^gOjJ?M8{kv}kh23zIuRNuo!hJNTJK z$AFf4d|@Z@kkTEz1>|xgMz+YS4ZxPT6eSdCvn6gZ09)ea24G9PS_9G@ltNgxJGezN z;fdTux+0H$1ZM8nDM}36S0IBFWCa9nklcDj;42{TM|5(p;vd&Yuo(#4MQSc`Z-Y#C zyjqpn_O{B8nvb5gcd_bi-JXkSiilWVGf;Lbuf+ynd95&j$V&sA_gtQeASd}T(#ox9 zzrkn~o2q=hK9vWJD{Ma9fR2=}h<`(>(=t?|X%!2-!7Hk{BD|y6l)vidV(dhY9-Q5V`rywUm`wh}+ z|6|bp0Xn&-{hMl}r%Nu{Zwa|as^VyQh5c0P zy9AjWphMxVO4{g;;jX73{|a~AAg#Mz35j_~ao10TyMCZ1%F>e=g45xyyGZS>7ySVo zOwmoQXeJznMW+36vuM#|Sl-rAaFHzU=%sL98k`KpeThTMTqL_M=oTMFe#>;mHe@qYT1s)yQI(2^T3$`~ghdsAF;$B}~i%6E0FQLAkTAkMVgtQdi}7 z68#O200-ZN$sjxmSONLot%1CIP}%ot;2(H-^F9qMyB`NRp!SmHb@Z%vJ)(gh{{@F$ z9#=r`8E1km{6G+D&;3BmSP?TH2sX8|LOyNUXMKV%aMKTgC=xPx7Z8CuiLXd@L zh9IF9D}i2N3Vknt)f(t?Gk_9|s982(t)O%<{^Bx6hASMlsiw#P}R3ni5;s}+3J)|2_#2(!Y z05Sq$e`zrQX%g%wtuO%lN2?9Meo@JmDq82BTp@T!agrDrI7vn8gQY2;D1#zqX%PU+ z(sG?w5wo<)0L)T+S?U$W5+eha0N_`k{t;b=mq-;?T-2?o(}3>TifTcj zY(*^tV5PFslwBO!5-kXpN~r-@Dl;_Dxl}T(sKuaYD{2J*%hGC-F|$;%wZqaB129XA zG|)LqnN?Ko7SF>7;o+*VRR%plmECa%_$wL-dulikB{G00(KebL9!*z(JzvER+`nnykE_t^UemyY*NG;+p@Gf*4hH~_6l{_1 zT6RDlk*Y8Ehb~@>f*CXnvBWES9mp0_re^^xGr&UtRvMu7njE5Sb(-4{QVL-FrIGxi zF$kGqLVk~s#T@dR$WMw^p!QankVD{%uLdAP&==u^pXc;_cFez2BRz4sNGmSz4-41( zEu0<2!$r16_#lKts{Q~2e9#7}i+pwzG;BM~efyF5G{pe#wB*ww0DJe(>D%`oeWJ7+ zz=WMjikglopjCL^rzAJO=;ry@LjEJ7;k)G&L@$8dB%hv*$VqV-$82geVO0RP6zf#^ROC|IEhwh8lt z_Cce)Yz#ab)DVXkaY@eXT%=(qdMAj!sbfQRg?RM(Fyu9F7N*23 zzT=XJMY1zkxxt{q-zDKj?~=bh6(5Ug_?OOz1zNe`=Dm(b9k{sNh9crOko<=_B3t0f zjkb!ePQq<`X#V=q6$msDSp_!EE7&TE@ui2%>7BP-;T6fqPjaC>(T!*3&?l~>3JUrb z_DV)>6Imb0ix@2%TuC6E#C=4{mMMQWMa z-mgC*MyjF%is^1VC|~qcr)hAgl-Zq`WMqoMGg8scJ?~qhJMhT3=fOyXewGsvDmGKp z8Ztd>qhi{4W0mRcVdI|B<1k7HSNx8TcivF zG%<^0{>{%Kxg6$ak*@YIGKFO25HbXcW#&lX>;cWIz24+!^3iSkt%oFR8;%C5zXYt zO;l6)bvN5*L5pUA6**GH-jDcg2F+cUh?V^|gS2*z{WcG2{kDWA%ZDrGAX&{Hb7(rub)IB2_$Jt9quLG=n@(d#8>A)1bI!U3)|$xo5GK z%0;q}qdZT0ua3zYV&`dHq?)JgU2zT~;HUbQew!B4lX$?UbSKL-M@8J7@NzEmFWpIn z0k}I^WB~3?mTMr&-N`AMycIKdCmzyvC#UPER?OVxyU3tBDY_H_T4nNK!Teq)-VkhB z!MI2f%!3fjl{%&s%q=jwE>a05_uZlhoz+X*_mXo#7r!<ky`%Xc!_nnLs@7o}`%*Ok6 zae?-bgu43en#DxK*7ghZ;Y zM?+pXQ1w7OZDT@hF?sqX1ZU374x5A#dMLTn4<E=NpfuVlO5`kfCdtTiz@R}|McEwnkgsEUiqcmjy?Stwn!$n+9dVe*ZbugV^R4-0 z&_jXdDk{Djt!a>s%ktUpvaJheU+UvzZm4(wrfbS{Og3-(UA}ekldy#b$CijEd)koN z#RZc+d+5~cxR}Wv52q%3a<|(AT8M`k>^(y#f=z}JY`sM>eS`-=QJy25twXm%C`Xq$ z!(^n)8Ll)Ip63kt9zBj;#B+wF2H-iv83y1v!^HsXoZ$)+!pgUrL(H6E$*!6jE87$R zcFyov&7Rkm7HOnchb~grA=s2(!D5|YQ-G1G#}7hXE=Rv=&{n^=f4$HlZu?gk$;6{i zqklbD$7KBy$KyUUTNkPO*RwZ|(4>K?Hgcc9%Nbi};GnIrF$WJzGIytv2rb1Uz{hyG zdut8M*#;{z+bW=7xz2U5lx6y@D9gEMFn4J52|!Cdo)UsA`U8-QjIb{Ou-pK}Xj-cb zung7Ee>YtXgV2;7(bTLN|9+=;9( zw7D}`Z2;~>O5j3@6u9%40zh)*PGi@wT+21G57@E2nv2xABDkPJ$7O3Csbc?3=6CmT z7#F=@|11T`v!n*e<+jehi!?4l?o-gkh1+T6{0J|bZ?Azb@G@$U2FC6fp%FW2;61$L z4A#ICczJXe4V<)Vgf87p1IL#}=*MLm_yRANmTO>>Arbl)9xg=ggkjK0JOb=HIzkWQ zVW9U6UEaTo7*5@?nCiDu*6vU=`=fOzToH*LO#peEMxJVrvm9hXBa5yCa*?UN^8qY3 zz%Kx-GQc7L{mV7=KLWU3Q?D@8?*{TVjT~-}Y?D@KB=^=*RcxbDkZhwK(=o;JnDZzu zlJ!Dt)ctNu-U!S#%0((0RrC__uPE2bc?a@s(SU54d0SKAF}}5lE>iOQ8*JhmIwmWT z*u*E1pNmxaA(Vg7N08HpI>|;rNU`4q9fP#C^;OVukxWN;`$8u#MsmxWi&Sl-=pQKI zGE>6mknc*jgad!W{19;uVX3%CDdA_}Y(pK>a`rAbbCITmxrKXR0s)WcrBKHo?rS1d z`6b2lDINqx7fm-|Xm@xO8Mw1G1}Vo4Xo#*Po~0?(Kvopx3m-_x45~QDo-a$a&B>L8VT1!A-TmJrIDK$B)7N}B)7PebW9eR z)ejdb`oUhoLLJlU2e&vE>9n{RrZTz3E!Kc&^~IVBTYj6Lia#UYpVqQ zF{dr!TAHGPDA&%1ntFwy&b9NEMtb&;mLLj#o;^%Ka_#ihF+F?eB5m#DyD^PDbdgT& zEHY)_+F5SO!1?W$;e$3?oe1Nm=w2+=T|W;>K!D5r>a_&H7^*_K#O!bLL2_!YG1h$jPxRQ>68@Wk$An?`%?WinFS%T-2d z>~i(T=t6tDUsaY2Ha+#sc?&V4Y$aoPtB`mOe zSqeaMW%u$zodIi&&GquITwSEemEFr3hBlXVu>rWOD-6J8U2Sq@_wwGbvOXA=tBW+b zvU^#wyDkyCms1SD?&Tr_uzR^2fORk549oSO8tJ*0E>h>pdLdVpa4**@GZ4)))RG++7p$%nw#jzdua}2 zWpgAvssbZ%x%0|lQxzcdWMstOx53gQ{nT_Vd8VS3rkldv`rjY{-lDo7N zBpb08bxhA_x=5~laU!2`V;ZCBA|0biBNa16Y&1(XAYIzOH5Jcjx=6{7yR`RpOwVY# zNY7}B6Zy4H!s}V0hwMZer0t5?iFA=nM|jIyigfsGjK_AjE>g9G{8AlHIXREOjp?Qc$4@FiVlD8Oxw3Csz}V(`Yky7d<)**%*Q> zykVn)l;j`|e@@e6|0`1U(w)fa)(tUz=taEj zxVHwD>=&V5PtpbAtoU~go=DXT_aT@4W-vni&c;8fkJt>2!9R;Up7)sPpFtMgyB!QG z6leUhNZ%qpmAlNS6z}|8X#iQ|9Ho_w-Q@}c@S^4-1F)OCLIZLPi$*K6DD`eK=jyQC zqKmW^&|7JRe56!zDz_8_xrnm;bcO+#iNyvGCN$8wug(o5g&9U#W+3GE9nrB#g|teF z*PG6YseXd2ttftJnva`wK~eFwNr@-5Z`tcHlMw$U?b9d$GCE`i|5Lx6@Qd2FiSV3{ET$UPq{nnAE6}&Xq9|_T0Or(t?+}HDDKT z_CygPRd1|-h(^`pUH`ZcOgp+u7;2)F|xkYj(VtxiGok%iL;OI1mFi)`v3r!Bv z(1_NAA-NwjKO3`)EF9wywk(|DAT8k@W8qvUw|+(nmpDjna3UI)1&eg0V3DpA4AQFz zgH-a%tv&+Ef=3jr_fN1V3l9SYrCQIKvq;tZr$BRFo{jl#jkYp-A`ICE8i&729@vs>H%<-_LIx&~u-e%zQCHVcEa)y212xJX-Fx9a4qMz*?Kq!yLj zW^u2Myd@%wYH*k4A}s|MX@m_AyZ?nqiJxkB&p(Jd-|rptQVv?^o`>6wT;!f-=k<;D zgB}_r7c5qtTPn93xkz=p(Fojbw4o--N`R<5z41*lC)g0T~J{ z24JlW=^s~WN|6|8isWBVWE!drg;toXn2FT}U?xh&xlCx_zk4XO2&J?`q2;FhJQP|5 zK=dmsLm}IICZLkA85B+DL)Cl=zr^t-^W#u%ZIrv9F+xw`VW^-&x8?OD@%eW`KR0QC z`POJ&4B~jvVQ4hT$in+j7=!e>ti5z{=FKXTi`2?gFhfUF-6pGzta9}q@2E?K21H%z zbOJBChOq2hq|Pq)!KMh!ZT^4qz63m~qG`9zoS8YZh6F)YA?!N@Wfuv%2r6OGxD!xN zP!vSL-3TadXaq$O#DIc=8?N9U1s4=BxNj&bpaMz|#a-`Pb-GWw6Y|UdecylYeeONa z^UictS65e8ucxQa8CCQ`m1>w2z5a{H`=H5KKIpus^hYPFL#2+#!RO5*w~v&nnw-&*qF&vkBv3LL87~qXk&=VV`HD;_DwTG zVDd?#o3IQsdF3aG?p4WoS)@-ASv>vN7~TMw(Jgt52BBV1RY6o#ar{$*P(9R^ewM1f2Y7Xr|sXQ#2D# zq$4P9*^1L?`qIpdHCUbNi>EbxI?d$yr_NaKZRGV_Up6}2~fX#NZrZ_Ya5TgGyhw5LXh*=jq^fSOQ!60`VG&=dUo8#wY z08!rj3v?#_uM;fp-Dqr3U4eLJ#+N}d5A`I|DOYfjsx*J{(gcq}G*G4CiteomuINHV z$P8KnqS6e?eLWcTv~A1`Dww?A4ExxNvVC{Rezxzv-p}^k>I#W@`|e|%5xzyC+P-_- z@J?&ah_~;KHxw{ayi)?nGL%Q=tiBlTvyW6UrM!IyLguWY#+pdh3i|C`+5lb=R4P6* z%ZrbnlhoyRHn#~HwYXiet=pwSZ3nx5r6T@$?O^pYogXu`9qtd8I5g%`zkvl7`HT58 z*21Dj({wUC@raYTFvvyk+I&>W%#K~9T)CeHNM+gj>u88Xp*rJJQ zGaR}M5V7?$aZh-)BE})GS`)jk!5-=?KPDL0Ulv!~iZOkM8rO3!(Z0i*JP~BA-ebnS z-({M4gdxdHIiGR{m|OJ7kq;tskgp>?7({PP+yG*dCawTctcjr*0!uaVDc>F*rG~&$ zj3JOacBR`wkD2-@1cc>crgFA5*3|%?%O(ro9ONMcS7?DE{&}qXrwp-{nT)a(DTP-4 zF_pi^4NG4ElkLz~z%*MsGb@#qnL)!s>%Ie->#HdOQkSQ|!TJiA->{?A6&!0BZ#Z1? zt2pOyKdfW~Gqn-X0@b%L)1b@oyENq;nkCxb{0_}BP4GK3vj?l1Xvwo52$}u(9hy^= zDjukVs-I@`-M|u)8CZf;a*e~Mlh4gm>ZVZTXVndN5Al^*Hv!YEn}BK74Ko8{BvX7a zQyUZKj5&zsl{wYIb;l6}1spGYJU_)S+CSJN8Cz)^XW1>Z>re`CKlb^m9 z%{%8xqJ@fmj_p%O{NT0{F+zZ-jYIc)6CHXzvi_-6Wm0LG{H@@ zL=)UZ%RmH8^mCQ3)kMEi%mi`^oNqF9t3bRr7>4dq34&Q}JZiiW^G9T^nQ>OludJVn z9=mUUM*OCjymShTFqztj;AVycSn;>WpbG%_D4KmYSh$)2PCmc0L!J`U>};^vl^#DO zSdl4D32G(}-ufv)lUM$fU=x*qn7rUA!B$Ez#wyi2I!s>hl%QsE)dcV8Fqy$q zf)=yLCxeUkaa5mMr<y7^qi?xj?C-63EyrJM5-FZ&qP&3S2;r-=(e6l#J8wh~47CsvO2JC*#V{hG?k z>cl2f_aB%x5LUdWm??N%Gt-ciK3oKkf2@*ovkpA|rD9sMuE|t3xDDnw zbU(mub?eN<&)@(P(ad5f#KqH$li&PxSj#u$HHw*u#s;vQf4~Oi7lM6Opb7R_ktW1v zijc{mb}_3#I)Do!zRNCVmOldqEyZL8zKh>H6UzaueL9Hjp~{FNZn2uE4ZjtF5P#hT ze|0OC9EclJ;IE#FnPR417Me_*uN%45q49t?EIQA@BWj9pZpRP4fW&-_hZ0Jwe*j>JbpE1dTsZ|Ahu{?1BlE#RlE`qy)|(c$~s9CO;Ofj z5K`6^DC<;}m(@0|P)w^gnoM0*^1en^w<~dd&lp=f+^fXo8_C5e5U!ShlmGK8XfNH? zBavda0GrF7@e2m1sABR$a_Hf;Vo%;<^JK>=kto9-ODjokZbN&b;k%dL>CpRtxcLqY zfnNhcxX?TaU?Q5M63!BHKId`ZBa8$66nmgD$Lj|29{uy~@AQWe!u$=ilb? z6d^74N~Mr{dvHr>GTEE*o7^-d$(0fOCTB9$Z*s8oSmZxjiDzp|SD>mZF>_Gmni&kl zt5EfGRC24C&r?imSTLEY>bb7v%D^YyZ2A~%GEYcw5!lPtPJ?DzI}MtN1nw)So6JS3 zeoB-nJkQ`ylwL*-d@SO1#pcE-Iq)%wN=!Z`QHjaNBq}la?1N^qD`bx3vkxY-e2$E6 zQTek6oP2Ko(%wxrn^nGV!Xt*0&&PoN_a6HRst9v749Lrd0p>p|^#NNPH~}&GVx~0k znb{bcb(`irloCzw-btC+z;#-yftyUf%^c7_DCcHNlQ7Q-n0L zoRLN|>#DR{&CFy5j`J=>z5|qaJ#F?XG_p#}o|tqrGYv^uZ>+_nGgu|(Q9oE)4OdK_ zOM<#Hnc4*JHds)gq)*fqT)RIe;pdUFlw>q>}Sw6S!cBVp{#oWNH`S_#E2Tz~!oqm8x`&pv=jC z5bdjGYrl9-=MfF8Qfq2EC74P9-LH$t_A!_dbtXQbne8NzIIKneax*3B;|ibUBUj;dHb_YGp(heW+FlPa>`$Da@qd_3(ky(9V!GY z7v~^5ENM%S!>GBOw|{Xn7T=i1g9BIp+Yb9bm>I87E0s(;-|}+6G+UNtR#|ryE052k zd;eR{p9kG%5sK>MpPCH=^6;Ur(-9C4{Pz~f#j1VBd4XK23HfpHc%{(X%KuL+ka>a- zOU(sx!2H)1$kx28UBXN?`pI99=BN_I7on^Ln&7`4Ez$)4^=JtQneG4mzaEX|sG+e5 zOmXs`ej1g=wm~o$wHOr zb}?lorj3Se{f(l`J1{lqYT+~F+4;U(#*LcoN_2_k|ucFRjdhFZz)1n?%7!M2J5S_Dl=>4ZZZSYyxLeQou|Z+f!{;= zV5y{;ydIaOQbR12OlIK9X)1XwmelX7F`0gD?m>^?J(vJjF83z6{LWH<*15@Vq26P6 z>NxBeBPe}#lX1fuFh^n`t*>Aq{TUY0`U)cuETlD)vkvYhOr~;5v{;o#^>zu76F?;)9Ax{lm@d8n>;ayp9jf2Nm<8zxVIwY zd62)A3abxmW*9}4hR1!_WCjf{wbZXZs}Gw@+B`o=n=a6XaGNgD1h?rDMM#@2 z1EJgWLxv}VHf=J4Hf=GDHqC!G%9q)uOPhTT0YW^8z#c_J#VPn`2B7J` zf;t*ejG;z*VIYW=nrMb8Ws7!+xyrScP|ze7Gj*8?ihUk`^4uleiQk~0FMUJtpSbmK zGoEs293aJ=hrl*Put{>|;nT^#9la>k!S6|Z7h^m-)we7*6okImMPe>L{j9H`UU&~! zUz#aX^n9>MYrqm70)EGfl8DnFYRO z|7?u)yE1Z;i<#v$>ZVqqDFf`1WN+nWY)Ha&BhYf+@LR9P$C-{+u~#8h8Y~}g(#&%- zlaDuzRFX$&CLeDynXY^&gTCdK!jjt0DAT$jaK9#gL14nOsu`83ynjXB_}wNagKh+1MZ5=M z3RLxZd@GZ2A7pT0ed(LYw>FyDPch}zrbyR1_l^=xaPKJ71ow^{Ou$@TxwV-DA{gh6 zR9RW=z+?thAh$Ndlz1>3^R10$#$Z`+YhyBl+4w}2oGUz-OHHPqTbz4Ev9dYN#{#x! zf{z1ap6-_>&c^}rG{MIKiWDKo0UlDBanXXzOeSY0#{rfq$)EuIh_1=x0`TP>in;hz zCEWxJX++1s2b#(4MSRc}DokeJgEv%i)KR%vCR2MnS*9c(fTWZEK3dDrj^#HgrMlqq z(E1t5CA^@^QG_h$3P9)uUFZ9u2^Sj~Ea*&Tu%NS;#)7W9(tzp+HX2MG`@?@|T^l41 ztt&znbVn)`K@;MQ2F+y4f(4z)4BR(TCASuICR4djZcYGGBoAhlm^`ReVsfEPX0UEEndOxWhad714ln`SHrzX3cIZcd ziD-!`1x^s4q}5(TNfSTdocmb6A*FBT_ke*IzPV;>I>PIfJbSDD>t5|t{Zia!L7@IR zuW4){BtBFUF_zfiRri*I`K4mI%-rbph!tQD#$tXLu1;RYX8hBhDf+h8#Cu|^%}nfY z^c66&QiI$Z%<_bNHI+ zpAb;xiF4jt6!FhXRqjHS3}I$qNHTl5Zy=lo2hPX*Q0q{cBRuYlhpE`0nA{gDG1;G8 zl_XD=L0Kv>*`Jk|T&9XlDVt_Spfgx-^i&xMQ{Pyb%%E)kzD4GlzCp5|-dhtq%}r8- zOmoE`^fWhBWx)+JnC47oFwI#^W171}X&Av8b`A2rYEESG*h4bSm1=`{nxnIn?|47` zTBX98<}{Nn3#K`f8BBAxspN5%)SJL2Q@Kf|xkXBtchaQtxHX&1K!eFFcXavBhIc}P zlmF8T=!g7cMvf|xIKMy>?EE4{i1SN8Xy-$LT$b}qX5f5_X*gf=%{7L}3!Go34PxhK zk2jpJ#VzM+rsaH-88}}vE$5p|)A^cjtuahy;Cz#5INv=7qv6{XM?^N=$zQ(~(>|a1 z)K?S%sp5bCXK;74@R%|R`jOtYOFtAzE$ zAonOHGtgi%jdtQc^!?>>WQHpnke)F4=;QDS;f@<6+amO5_8iZ4t4)i z#k}N%=xab??uv$}l?Q??h{r?J0gxCg)2fMq2Zd-N5E&M6TuaONL=8T6zbORt3tX>tOTURTwi`U=>M4+;5 zmZ1kIW~KS8EJV?hmFmCthNvk9M=7>tTl%jMbpphK6^=`#fQVU!jyTw*ivfvwtDZ~y z07;YE)TOb2#LQ^s(h5LgE^h16-GId0*}k4xVG67$(W1dar_?aUkM(sO{s zypiY99zbHO!dZk>(yC*unma%-tAeXmU}>|&<~`w3_(>Fjdscr0Zqh`ZRW98QNX)Kh zU3&F7Mf56h=}kal@?Li7ML>wmH7*qbLcIBkOOswzM8P_jl5Z%Y`v#X@2ShCSr%Q(d z;>49b!}I|lMCKV``W6te=cb0~D?noQUKOUg(-kpxZkT=oL~PCnVfq>nVsMQJO$H>* zkF_IIuZ|)PtrwvO0TIinAEB!NAwESQtAQe{zHJe!b0hRQAgXuviO`h3DvdQjT7+fJ zS$PrKG(x4BaD0R=K0y)A>r&5E$hu?TB`w20wLkPjeMTSd5S zd4!s-P^xD>8KJ$a74iKG5%OMA#IPSDbP*s5T6<9%1_-e&7Nuky1P@%z6Hz(_keGED zQ7Qw3une^b%bXrrSX8ISvD$48vxN}dNefU+$e=F!^bngyh0~@M-z|U z2RLl<&G41iBhLj2;0h$MifhM)v^{vlW3ZgA{S` zh#1`sh!Zb6E=KnNqOHyGFAWQM_iaUV-yNgJ0g3sdEJkPVQAF<_ zV)OtYG0B2Bbp*r*HBXOIPe9D+eny-M03imAkJEX85Y5hx(-1(?ScE0kb8?(!0g_L< z>2VqXNSeMg;xrx*ZB@rKy*f^V0ZG&InmCOCgcvz1PL~3rz#0P1To$Jv0m;;IV%5a5 zm*ImoDvi~Ytrl-B1FUs~wK}!(vD#?=opJgE5Zj*F9jBZ!MXcBpr&2%)H+XNHegQ4{x;jB0U87caXR12Jx=XRdETY~Vd{Vm;80-{r_1*++1texx zG)cb$LRce3mqe0I1*8bk>?BPFMC{4NNxHO&B0fi8QBy_KJ2Xk(0wPwuQ~ z%>%@oreCILFd%7Kf0d$PfTXE9=B%$%bQ2(Hrv8?qy8ub^o|C3aLup_2mrc|3Rx?Fd z`%M;c`Xg!D2Z%Wrtx40}fN1+=eVQ6>P{arXK4OBK^2X9M{RD`ZHNM@qHBC*nDY3~2 zq_!*Kd;}6-D`Fx78x%pIyhhb1bVwvhp=#Lwb8F+{LBN@6Jipgjb}T=90~_eitwUH{ z{7b8|$f*h1aKC*lOoKncR^}LFy5;dOJ<|iKZ)XcSMW{jNh%Z*JdxTa1VraX;5qbp> zL*H2tp)(gMvFy7e^avng4?Y^9{*UcX?6>SFZJVajyw)^I$2Y_M6}#%>L!-185Y?8| z7V*P7QM%?`h@ld#8a+_rzA+x!T%C=c)ETUtp7_9>; zr?JZ8jE&KafH>Y#V2N3TrFzf07@gM=3fPI3*#FH$)g`^@%Oo}aD(TlkgKv`b5Fmwn z@7E+v{0#*65=-p&+!Wp1JLRY8);~qB0g~qVVJSLpI0#Nt@==OD?gN4w`Gq@DL^~Bx zrK>1Z(ikV9*5TubCg`Bsop1qu9(otxaJ2;_{}1KtbHWe2OMWM=5dPw0oMhmB_OTQ0 zlZn9r;IwAglri;mzf+9`6?B?1M%Z27EKFUSql3GS6Q28anEn7bV>7(uEY-bX#ANhE z>5mB4x+Fq{0Lz>F(=Ln9+W;FqZI9~n2yg2jrDF%6D?;83j~)`G_W+i!qF`?01qr$Z zaN?+n?-wTM)VqA5DmS{NA0+7T4hvjO1b;R_n3{1&s_aSI!#XvJ1Uu+*(9 zQuH?<#2!qI1)D%{lE*(#4F)Ej-X=}!0WQYkwrQ%_4q@?JfCldt$MpVO@oU? zhTKF6e%1k;RUs$z#$lKxR(|04GtO7ArZFZ3nHYWnu^Q8bOc~#Tu*BM66qb>A_rDl( zE(UlRtFGDyR*a>@Nsvx2utj7%#t!wa+)ES3uQk1 zuZNmXMq`lU3G5@Jsk(5M*uOwf=+oYqYJbEqITZ_Pr@j-eT`xp;0vw(^K16$gis1#< zgy@i2mHDRp?VCeX=QCgCW2|LQ>4DJ=I;#qA$3ph3Vqd1J@WoiT{?3b6=&33^3?s-p zJc>ZZ43}Um==+DyzZ`3~zj^&uLB^CXd?QAoH+>m1ybLpFOH7`eb_OQU$Ra;%>I^MN z(oBG565l52M&Q2+e~qQn_yL$FAzxK^G3L=GZ;K3tp1_?^cr9kF+{5AFET_tF0Tw2o z@ZtnAuVYT?H`EWG{Y03y1I#zWOEEiTcSS9L{|DxyX^Sd{-^H9Wv-pzs&G|0O}-g6^_YHm4z~wg$D#INn<@X_w)d>}HWd{yD9^qBku30I}RD!!@nKxC@&znQiw-&V!1N~g&`6|3M6c_qy4 z!KhO+Uw2!Qt^inOC)UK{nxMBLZ1VSE_@CU@=O6Y!iXH}7=EILuG~yFK{1EPtTJG}0 zrhX$#p)?-KcDLvajg6QkEFyssTJ|t1#aLod4AQc@!D5ZjA7vH14#Ww~WBvs6c*Ph? z?Ef`l2{TifAxg>XX1xSaaf;_L!rYCz+-caES`SnvE?(nM36S^}r{^qU(1-XZX+X3M z$Kv4*AaNqJ%~dDv66d&1=)LVY3$Ozp1z#h2WfIgcxII29E99rNh`Hcy=9ov2vMvto zxsCC00g!kV`R^SPp#euneBwpS-dT$k@!MfhI=T}M9I#m9Kaz9-AjF6fDOw6J0Yhqp zsDDkUd(U&+A_TTDF&>0f0?QviVC(M4b0Ef^x)IxUUjUUoRkhfoxW$hy_{TJsf~qa} zx5X^gHP3Wu0wCqFR99V6OTnMmlN^4zQt-k)m$H5a5zlbK?{p4RgDzo8+*P6FoR6Kz z)qpgX10~);8o*Cu5*Z(cX$+9ql)yQYkHXaFV-T&APUz52!sH%_kLQ6zha^sgeStkt zK!|vw6kQ1janFbNc>$Y8LTp-;rXz9R&jh*IpM~iHKr;CK^DvFr;%DGaL0f#D+asE* zyL()O`ke`a?KpTm?zREx9POs!P!=FDsf!|XDj+d;VK3$@KuYCZ8ljT`5&IFlF#|4F zVgu34i@2$CKF5_sXgMHaJF!{Q^9Ln%LIf|(0}{E||2P|`nH~ocD{+()J!2L34o?5# z032Hx2!gw+Mf7+fN>>4iHb`&Q-Zkr@^fr)4B-Gv87iK+14l;Y zgBXOqRi)xFKY8>dP_ey)r(@~70YKZaEU_}|)gVT<0*OV);{gQrF~J#HVqalyX@y&D zF0iT0%EZjDim=<~`WRgcNCC%|#Aqducq?9E@K}NE+QmTP{Iug*ggJg%mKe@9`R>y5 ze#4gxk8D^z12`d}RT~_+HFpSpu6GJJtoEG&{bSWS$uX=+N zO#ry3x!+)au6s5Jo@Ulyv`vo$!D;f}OVI;>qR<1PXu&3Y_G4*C=X zPc!f0N2z+hgFriUzs9~@JM7u{9Ur4cFmjxTox8gMi8*UbnjQv(uwoJu(liVZ)l+Ut z)0;rz0a$G|4A)X%5tA0CX)Pc{c>k_6wa4%vMX=_s8Q3IT2UIr4(q<86EmG*)skjH+ z`bCPuFSf_~TRISBjdjAu^~b-Y0305Orx0fY94^D#WxC=eEgbHG8G16%;zT?A=z9+R z1Y}Kf!u`L(TcQA#?{`dyt_Lcn-S%aKT789i74j=SjM5%}WtyN{p9Zl0qi*$RHo!84 z_jvRgz%rj*7o$4p9TjaDjP`pqP?7)M%mmfPnFdb#!QvD(Sdx1EI!2J2+)ATODIyYRFrW%*~e8UeEssjgxo8sdO2e~YC!W;YI|3>@4V+fy) zSCDK5ID8o%uYc=?u!M`@p}Je)CGeXL!3lT(VYiPLrWb*%As8E3)DxbK(pG@8*!*^s^6`5YhwptqN)0}cuzOo= zj}EE>$8vVr7)S2}vfg#V(~CX&1K{vC@cfv25k}&R@%=N0f59HWa*t*LEc4V(k8*bT z;fMZ44N^?_;|_|^763BtvRIs&#^b)Jza`>yaT3I6*zLBB({wf!cWb_(SWNZ?4FFOewVAe7D|`AH$_(i zEL3nm*24h8?!n7bbSoe^9P~trW&<42<&_jY0Z7EE?^4w9dq1MMYnmE#Lrai4Iy+5W z&jEoHwTjYo8<5o<`IWB1Ue{_6@J^F=({vZWLSN&1^m_=m#H-|Gb3e>~Sg{Idfj=?{ z%`3%PU@<;!dbc`d@sCYi&|6*sgcyEc7v3AC zAAuHY9js5*L*ot0qSO*iqXn<}?|LvwJswiTTGapOx~MY5kbCL{pLO z>7@hLA3*d0G_DNa-aQK7slR?Y= zVN{CFE09W}&`-Uf?N5B@0WPa!l1>J=W9N@f(P98$3f;s%!!JOK>u@Zr-v*E6ybVum z&5P5#Vc_h5aTNOP7)VWo#CI(9oQs4JNVu8!V3uFThcAv(_-TCfx&*A*PWUu@f5YK9 ztYqm`__&)t$K2N|N;$bu!^D#whP)WmfS^!es|dN* z;o~bH_X@;^=3sLZ5aQ(8_)P{7V*Yzc+6xFVwrh%B1eoBV5NfjVaV3y@Kh!*k{n6Cn zAf5yf?T^h+Aa?_Zr*4l>%{!D>;@${N07Puf0}*QWpb|Ub5UeQy(blVZlokOZc5u5W zT?B}>+MAO!4G^*TjwFo-L@fJ2LU|qpb3bU9 z+Vh%2*_S}~%4Bm&bGBuma=(sCt_7DGxt4$ka?QTX$hD9OKiBXNa6*f3;F%^)R^B7N z1<(o$ih5+wJ3#KOX?L_kTaYMsQARvk0JASAI_33HMyfN+>CME%5H?HFqrSsykwE6& zlg`)-FBB?;h@;$LanFU%OdcOWN(_S^OlEHVG)i$AxX-ENnVh_TI(`1h4i&TdBM(kD z7z0-#d}`x^;=hhUMP30bdcdtMVNwngcd|*8G5;CtDkw!!R&-R&7<E#&D>5YNp14{)H_h#$CV`4XKuIliQB3X-Jy8=)M{>rL$C&F^qoV; z1MKpgm0;uA3^@6F56_@3J;mjjaCrfW!7e`tE-&IDvCI3y_7Wz1m%sfzngGke=|4*hQwab^l~IWK()*7(0`GeQ(8>?tR?cOG%d@$a7b=$zs#^K0cq;dI zfL)&b7}&Tz2b}zCdu7m@09@XhTRDosE^o)JoQuS*{1k5GO!zKey$7wF<>2x*FyUCG zFcS*d<@MlllP4~J8YMNEzRO<)_ePbR-$BMMpU177*B5a40B+?7YnK-yT;9r=P%eKQ zPFtxINlQ~MH+jC(-a(enD9P%aC0x#_rz)Q5a+Bw$?uPOfDoN?paQSm^`2@u)cXf!R?+{zKwE~lA>%X64eE-!)8 z3Y8)?uy_sM#PnhC*lFJMU2%(fa@%nAjHxJ~DLHCti&&f2ZQjXwk%sKH#BZ?qdedgq z8E1d2;;A~5>`h*fy~zx+H<>znlNV$^93CHSW`#;$hf43Kc;%JeJ{+Rc0j~5C6`SF3 zr7!7|LE8ZIv;N%A;7G3YBe|ckQ@Nkb;C{x0U+LLDp`WqbJ?Zp2C~fxD2zN@Q27e!? zJcN5CF;QlWf^mCQR4T4>*lZp;h+a*UK2EjL?bAgq!j6X#a7>@czW((>rI|tiZYm9M@dSn?9?pwRRvy$ zlfw0=+Bqn1Z{*8U`umWmu2Pj(!f3oSU>=Zrf>XUz#omjeIr)ix8FVa=`;eQlbRW^j zDi*6Y%6&d9v)yLJ3p204UtpL#f3~|AR(!1_#oi0rC)&dUyA_Y$C6s$rIz0?^J&CQI zad3Pj>Ut%6jO)4xbzR1UU)Ma(X3v7$%$l;S%tP4E>2PSx!dil_20-qtELmF|rFi`Q zhuj{1?)4$&<@?)M<( zWrS!4kh?F0#ryquyTTVh?wN=hStmr-0J%9Je#J?ZF7-jQ$IWPd1L!;(9}fe$$Kkg5 zTLjuR^a(nsP+5N^mX}WcnEn|w2gp6db>px9j3Jg?(a&w}eGH-we9afu>XaLH)A1j{ zT*(sTW_e$OXrv^>>pzFm9=o%(V!E7ccPLYqiY8P1OQL`q6<@W1++Uzz3>0Xlw1nNE zx?b)^o0*s&s+%Z6_ckS+J@xTkAU0qNn~031LNl*b73ya=Q)P(aQ|_<0PvHc;ArmB+ z6ePgee0IYvD#;j55>aj_<|Nt;^OXb)pj_>SC5mae!DJe4*q~(Vm~PNa%MB(oaD&M# zcSEUJD!R^c!*-RS<%S%{1a2q@5-2z9RY^``8>7k%MVv&t;ddorxgop?^0+KFm`uYB zZI!Im8Z^^#gUJlsU^2_yP-2#(syWh%osXNZ0%BZp>M7Mn~}6W(Pg-U~{@ z*{q>DD&i(E*DB^%FcWLQ98m)cJ;m(F%(pRg4XnWIvo{opU4z!EC2K*lPs+`T%?0yk zm7E8;K4~zE!Hld1g-ax>$=(GT2)q3f6(e370dc<1HkncgFZ2u1wMw)u>M(btThHUI z49)Bd?YZZKA|CIgm`vVLiSdq#W^$$R9!HFKR+cE8S4Z*5C8+b|9-a z6g$FMO$;6EZLYvfO!R8S{={T&N+!Pa`r+SBAA%R&QVOKUPYHDp2hh_{hf8Yls?Z_g z0F&uEfPK|giFy#vy(Uy&L`|lM#u8W{bylL{);Xbi-ZRL*yJGg|^m9V#*dR>Wni;s| zI50;jNnRm|TgHGnRxxWcledCA-aMGAxF|N|E(|#`!<)=thBul13?Co!9$FE%`+T=v z`tVY$?QXzCdq~_Hgz&>kGcO&SKb=Fonr~EK?sVG5YN522UL_FPN&JF85To zzHGJ?G0`OymnM?^3=0vlFM=kbnNmXCM7k--z!%&^1}mm`O}53PiJYO>F=);0in*AZ zh{+6^h-PvHsV4Fos^}c0K$=Le&|%UFc`t%bp>M~?MSurL1x1Fr`X;>a- z-w0*zI(6ftu|CcNA?xG2`2LUySs%xiLFF=)TI_t!X%TxI%;iSzxt!10?>h95$$Z+W z=aoS6QN@%_&TiTO<`agbZ~S$zbG71%o$os}V;@8GZN-%AKX6)jUxWFcVg?@h5zJ32 zDV+zU{FmN*iP8_D^n8f+F+|1uchOb{C}s^v=WcT9#STY%sI8dN03UH02(y9B?Cec@ z%b})%bo4Clr?cF2`mTO%l~4 zl>wrNiJP28@r#f_2@~^S&!w;@`(|a&D%jITWzE9^+Y@Jd3RwbnRAW0crv4#=RjK<=+@{2A=V^k$dTbu!ZDU^`|K2)!LsjBv0WQ_2K(=e)ns z3rUOn(LCs{=fu5P^Ra8GQu2VFn{?{RRB19hH+Ryq zL^7Gukx3N1U@EBQWQhWk87MHBN&&Au*DD1%Y(WhtEei{i87wR`GZT_QOZZeJuf|Nh z_S~tMXu-NA#9xJLbGYaY;o6Jg+5!;TwM7WCYh(N)R-N%khKqd?xVVR6S}wMjhKox$ zpGL~XPa5h17n{t$LnhO3@n@z2?P8M|C@`6Zi}@wAd|56wnSqNn({eFQ@RM6EuBMo# zi@7@Kb`(7uMdw?H!7AfJ!4LA#Oe>F*l%z0qHBL}W9$Zw1cGoqG(4RoAi{G#N9fnue z0lB?#JmFG>SN(Nqr*fm#8_DfM8K+=pElA)-g` zqaWd94i20HV~+yo3DiJ%I;g*yQ_cDRA?!a|5PlNJ1CMVQr?F4M4<(J^huE=r@hmX5 z0XXmCJ}JEK#TXrrGq7WEl&Xp_j#oVYWEfA6;e!L$wQ|Bg;k(^a2zSCU3WI+DVG14I zI!o2d4LFgs16YYefWPE=l;0cSL1?(4COCcTKWf+>p@qPv>fqx!iW0mo1gGIB^eaBx zNDLz#5Pt%DyUDw800fA?3u68USZ@ITKomqAS_O!hrR~|1{8z%pzrnt6jnV$QYlS!$ zZ^C^AkWA0UD{)^2gg8L4L-DR#e&4NV`|);6u6OK@sM-Q6O~=)EMLi%EShgJ?VVU#W z&JYdQrOdGi%N&ca#4K|T!b@x?0F`aC6j+4iQ7guB?*WQgKCrY|!~u#~X)FsY+bprF z2`kMnfY{giG`}TIcDesPiUpTAvT8+XYtjcQmO@ht_#5?PE zB&fko5bSHK8ZF|?j3hk{NE*wwJ)M(uL>Cofd1qa>B-QM`znG3EC+RXkYTF`uUxg_b zkeDy8PEvckqpWfTn-0OSx&XIa8-PB1NcM~QxMjK%#3xupl&&E973gy_i1AMmEdWI9 zLhL==2MF=ZJJ{I+B+c?4u=xoHk-ZmxG60BJL(JR*0ExLf=FlcUVwzx^_c%a^oGuQH z0fcDK6*qo>5G{K;bP^!Mb-3|<77(KNOuQ!^5MuNShvou8OnU@>>mAvysNAKX%gSAhURbgbplNq`VVeO-DQ zs4Qlsu?S1`S9sxdd^HrX<3~U5(kwuTW-qxk1Q22uUTaE)52R z_ziEeZgK=3uHu@rs$?e~fU1Mzu~O0@2n+&4O8UxTyn7jtn6_9U)?k8tFeDzOivfu# zL0~%*9P?qPC`ECkR$|&9Fcb`lnT64fN4P%ML+lqd!U@p~?-M>25ZiXC;Z9;EVW{Kb zPKcM(a3_S-5-pgzv}4@4&hfobU{cmG1)_ zZiHd-0)WHg(aE0!IJ|HY-pmKAJC|47=VF+h2Z)K|G0ffq2oYHrqjrE0uc@K7GOWlMO59}8gIj!cL7mg zwWmj_;aP4#VkY9{uX6!0bP-e#L8H8{=)TB36hu!7c|X6CFDy=p;a5-ondYe*yl1 zu+lu*7Zw1LspVd)T_1-@l_yqdu$JR3!WtGHRCB4M>414O9}vPCFh+fkH=zPzffch& zO{|i}vTa@MB<%(yP5nAa>I+mRuEpHT^RFndx=aD)UY>s|$4tT7Nf!d*#2W`B=}AC{ z8plE#AjH?FCMokYMdY88q(VSq7G0R6*8m~%F-7w9S?1m>UXDx zC_N1^tomupu0H`DKd}9FG5)M%F$m7b+lcoR0HXRW1Y&QgG?6`+gaJvj^M??%*sIdi ztnJcJz$?a|qF4%!%*J0t0Fvpt=J?--79cpEL9JYx2?%jUKbIB(qM-Q@m&O2M!Dk56 zIvNC9O~YO42}qhzBVAemRJQt>JMbqJfTXc}F#Z9TmH-m-a*Hti1xP+q4hz%6fVUd? zSj5fa@WdJ*9^HXJi!(t?hu>bm40r99gW&Qsz9LN6E%sGgG51~_rY(S9p4-Aye;$ad zuw4_qJxl`t?^!6Yh_a<&YQId0HN8JfqX4n3^SfcX5b(y}A>JL^!qj{_2yQz)zYS9% z;Ppo>?D{@TEqAM!{$+>(#L$lIA~X>YV$Gp=a0jSNv^pJPfM|PSN`!s^gjk1XuG3d2 z;z0zyWrEvV_bVeb6%g-K9rN;S5&8?LoT+6_;d<<#0V1{m&uK^TrxQ|hi|a*cGw=@z zI^)%RlL7ILWsXH0pw(72K3o{39e{TwYHs_CC^el4g6s4n1ZrNbGL6i`k_!+E&Ol%Z z6FbqwUPFLx2f^+7uEkOM6p(gM^bj6Q1H_}HFW|29MJ3jLO_a_7B%fMqqm&1Tf>s-% zGzJi&(MM4_6_8ACM&NZOIGp7yioPI~7xXca(+zB6j!>QMv#SVyWZNXMhl$VjfKdgs6pQJM#b` ziW_>g8Su8ky+1bfs9iG^V-cIcJ-9hyHlRxGKMarJ0ixiH9v3}$K`tTS%4@f_?h+|KR(JVmnsdajc zjsv6?3eSwu3xE)j@iFQL2=V02G5Qnmc-wjV{1`R469ije#k`7tMhN|Y7#;$i{{v6> z1Cr0n_^IwMKw^@SIQ0i4=59Q|`Y9mVj!NMHRzPB2$v_&QvY3^|Qr)cMio4Ek5Zo+>AaE@cT=k3boB3uy77Jg7uw~;a zVo)?eR{@gG^N9rQ1BAG+MuHv%WLUqnR)SUmQn+^z$f^y3N7$VRw5|h!XH6?jr|bkx z0z?6R>!cxo7>Gu<;sdqc;P-!nRwznJf;murkkeY-4QcD@Hkq8 zz7;7mNdOATz0a7I`U&3EZ03vqqx&#dc zgrL#{^#r5{RTCG!m!QW0sgm~*IOu&v3_;-9eC=*=u*7T9v5F2NJm}8Aq3mYZr3qZzeE2d4eBuxM$)56yH&j3J*y%&Lw zZ9wo8n%5KW@dG60aRh#3ViRIM#+^cqz96`Q7b38k36AO1KS`4Sskwc)hsYVI#GJe& z9S%sEoyXxX431Y~?~F=Px2g3~23(e; zs{o0~yDmv{0B;`5vDSPye2iNZK*X$-kVP!*fw%7i{~%^9SC&mr(QZKMbnKmYfE_t}u5O8{wa@8d2e^D7YSM2mQMUy61B;&_X=9f#W914Nruxc9TtRINH< zxc|gjr>PGhL=U`acnTmy_4a8R0tm68Lz(@$a^Ma&Vu!o*53S+g?et-mFPf8CesNPIf^zqZ03gDMXBY9>SY>b?6@vk5T| z?B1W6S4=g&ogJ^m^SqQ{S>wmtf|z$& zgQ?E~-otp&(2I3lYJK!_)Pi&OURXe=!D!CwjL_cvMr6PB1oSmtbeC`COUM#tqe5%l`W-1C{Z_f2&6 z^@fkO^eMAh0XF-yVf!_(B1J1#P%P~#rh|9I#ZyomHy6meP% z|Nc}Z@jhN>(VCZn2QEgTi*W43jYGL)a5^%mn&<@OlEHzCQRt;VW8~h4g+&Y7rGCUpD`Gd8op-P*|4&B3 zA7d4FaLoiIUvR<=@jZ^ipW%%s_&(@hpWhDO7jXD9J|2h(cE%4$jT^2snfKfHNE)`&YC_6rFJ_gwDms{)GS3(l*=#CRq#KLQK?U3F)5vj#aPa~UgS1yhx6C~C?`mKC!(GF zbx53rVGL1T?l8{6zoy}f6MIidzU9nnhvOVq>%J8vx5pfBhQS=m$xGt#_{MFhxG>)Q za8c;s^vta|FbX2;m=@{pakQj}!xKBF&WCgl z*o&yx**WE=q&ZhEaZt#($WMaoY9+tmB^yJEhz`fu=zI5|Murvb=WS>KYqDJ*(>seB16{4o-MsR`14t zBFTX7{Tf(^148<`UL}crJ~1$tt^u>wP1wjNulK=VIr(#-;bUJ*iWdZ#NMmO>P~?7v zOdl*G*ucJ#as#`n+{*Q$_d)OJkmY3u%O8DJxgpK9e8BR3{sv^Lmx+Af8o%#$1^4eh zzH2t{fTFIWw5CA*TyUKHDChCjJhOse&$3}e#Z(`>dkCFOfo-tMiZN#s(>ah4E-|E!cX!R?R6I)x} zibo^8lYc2>*7$Pq3(t$t7A04WXEvNgrG|&VLvE}u25rDNx|9rfSr~rBLpjB-g{8J2q{ZnN4hij1i^Sj|6;lV#wB2Hh- z+n;~@-g^Wr=GzHa9Xo%2y*Kcu-+S+Y>`o=miw=FkKq+OpU%50+{!frS;zwWq*dc6- ze@R=g>fu8~IQbVs_IV|LmNELQL9AbIrPufx{8ieQkj=%Pm$ChKVhngk#d7NxdAAsb zd;@?g@6+%pGHd-)n$8ChpCIl|@o0_{1 zH}?Q?h&!j_{UT96x5Vx-nA1nK2?WlSkwh#)!<-FC+3Z#)vFTJt9NETWOSm$6u5oUTLIm_ENIykveD!rz1I5 z2?dQy;Pu!qeoy;7THXwgg8;XR^48ZQ)j}0EI%3 z$G4hBGY}rew;RjFM6P^%%hWOcx{Vjafvb4Egb@j4;C&eQBz5fZVah|^`}5Ca$UN=K z#pI?$X|C)aKdYA^%ljtK<(;##ypij5xVPt#awhwyWpS*o_qfrXggGqU#_MD>C~o=E zpk6f^lrVLJ3d)B;4&_VymZsqV?1(kRdua8g*Cgfs@Z~Rs>>4G1!~RBS_Xsqhs{v>% zA0!4zX7qcS1_4~?Z*V?RUpli&jT(Zzs#<;oU6^a!$sY&35Bs_+#JmD-`VYyqLg8D0 zd!8Q?n}W*KS1{dRto5%W@#W<6z$OD)VWn0uQUsPk+4oA}?1O{Ugf##c+UQk5N38Z| zn(_fe$3kBRrc=-n1D0RTX^?% zPJzt5zMMN8E2cXEIJLYD`m^|}5Xr#yDf|1J-10Wa&a|t@ANX=1yQ#Ot#bnd?6oUa-9X1Vf#vV0iuOF01+KjvE< zi$7T2bDAKPc(Fp|ybIYaU!eDV8Vjn|*HquhpfdpW*Lp0a^%ZDx55~sMX#gagWZ5;o z07?gE--v|os>I#m@&)O+ZrvQYJ5csRzm)Rh#mPH7Iv3yqxml;h=|q4D3ay1x+>Q9C&vWgI z*cyGb5BaybOyuBZRrafxm;;^SQzmXfsib5~JTfrh-!4VaLt)ML80V&{HsO{d<+FL&c*qA3hl=IvimDOj>3vC zH9zhI^*K)J|I$Ht10#T_AjZGjZ+KJ&od;Boxf0yB{1^%i8Hfyy!w2sire2GeZ+X^~ z4EQF2Lg!!yCQ_hUgx``9ZU&76P;HS(D#oALF9ug_zEP+E?-1 zjP2Jsv{*&nhx}6a*7e@4z-xPPsCDW!F!9=HYWq|ads*o(al#M>A|M}+U;Q0kn2B(^ z`=YhtCu1p42IA1gPCQ;?d5E$TXi6jE@$|8X$pg``Ypr-6gi!}n|28ik--(67N+xEz z)#IOmC<9TiDc*1KHi#kD`VE_Vc)f{uox=IJ1sS23uFq_auUOj*bW+8~5JdHF_wr)j z;uUJ+6cbi4vwG|-{7{26$tfD3J>b|eu&@ssEP-H*?j}wxUTU>1RiOf{5F^tMccJ;uhC!( zghp)Yx_CU+2TWHndGt)36GuvSzRvhsRy^WpW6$O;QTzqw&W?jIe{G3*3o>{P@UI#8 z0&sbjWmz=#V{lFW?TmTG7hWBs`nkn zz+c3KKk!opbt8vl_(SI#X`Z-BA<61^{>sLhT&tUea4?UQFrn3DE3ecwp) zTt;{L>Uc`a7~w!&853HaDl2^~g$*B#r4A3;Z=`vO%30v6MM{gQzrVl zbB@jMXR(b5o^F3vk%4sPE4~6>`Wi^fJhw5yvwA%h8A#_?(w{GFO_nSldGa&V9%}Gkqk7${Pqdfp3R08rN-UPGJu>C}w z4dzP{kyWTvjgmYvhU4}RNWJQ>YVShryrx#Q2$!#FL6om*7h%~LtZG37t6Gi-R<%q7 zt6C7js`gf8LKr3ltJ;N%$s-z=7_#y%uf(SgZ z1%&oQW-%hPCweoXJy8fE@PzX!^2TL(BCePfJyFBp2cD>)Q`_N#Pq4U`A+!Ui*25{^(%A(WC;zt28RT}!;3%)G zPkDD-huBJIE|{6Bc;;diGxZEpbb&v^$eD}G3uRx~KXbuhb><>->i)M!Fm%JB3|MoS zvgl94A}H`J8rHYmOlFEjYYpb<+M>U<;jjlX<2f(=;Z~gX0Kum~uE%VhInB3d2DIfN zY;4%5KZY7TAw=H*)y83cW)abALo^$x9Ak;?`Yc3KKKI4c;j>Jsx>Fi43c z!aeFGsV(qPh46hyEgCYk3C)quY|d-06MlL~g0eX;giGq;Tr_K_5PtmD|Ha;Wz(-Yd zZ@}l4-Me>_O+p~_5~_5N&=I8A0F|JSNDm#Q1?-}Ny@8;jNYh|P5Ce)Rwuq<*7DN#c zQA9u#UjzktE$H{0v-fUhHd*CG-|~Im|Neewcb+pdXXc)nIaBW3xe=<&c>uo&{%5lr zXNW~lnEB98w-Pw~MIt+|s+SX3ZZd~-0;}haFl`5=ZZtIa1J&@ZX7wcIBdC1;Z#ovW z&3pLgSyU}+K3u{+IfLqh?CI?8sD~rQa^GR$*LmbF??=0kO z8-DEl_-WJKptCPA?CqD}J3N<0-H)_(=m_ZS*@oTWbC;%r;Py1W6fq>$e8avLF(lS} zmb|uwN#+OmvG?GoLzYRS_83;9mN=gVG-@~wNpI2$L5AE{j;t)W7K27z#JRFJZVgbq zZ2^v9AH#Rk&Y$jxyKz~(2m@k%5r(7HU`0mV2DRb8fZaG@fy^^nL+q!VyzBs!1bTtD z0yMe_zU|oTnIPQ_5|9>1qKiQcpwpiasAC%hycYxXifv8G1&ywUSd%seXeDU$&G>w5 z`qwy1OC(o;>ju#183^;zy$;p6&xwMa3zO-r2a*Lqa?6MD1{i4cS@;I*x+jB_x&$B> zMK=|WR~Yd5ERB{0X)H*BwR;+8A%I5LgU?Z9xx=#noV6A!@roZvviAF34t2X5$s%jk zGYcL19yGd1ieX)|%%PV+0`6Gh(EA_}ki5~Mo*?mg?jQ;oB%r+=qANiH)>XtyRh2w& z^zsn3zXHI(qUV)qF0BTQuAYjQ|H`;j0d;J&4N$+bOOrsOH@b$|r6$_(1}tn?=fbrb zGzod0yH`do^@t@mu?1) zo{AOFWpI4YfR$3dp-cTiqtlZO^V^Zw4Jk!*ej}G&1dXnm%tc(biA%X4iE>JFe1Q_g zd9{Ae!b|!s0j`JYcEM4z6~KrTL(TxR@>;v}GHCQgY%h+&70vQ*aE)pM{tWQRI(Qns zN_RToY52x#w_C$>188&xw$Pt*H&#wTQnq963DZ*0=w3J^;`Er7((Vh><)G0yc=2T5 z8+cL&VgSik9|_ZoAi4A2*aLk(NUG3laPS08s?d9QAtl`cV4eH~M_U_!>+tZKlId}f z_#C<|nOfZrz_sSRXOk&?rROtwbuz60jUI)n-Za)qJHMPvkAOyxM}(~xMCg=$$Qpwk zJFtW7vnW75_hw^n=@ zzI@D~n?TRCGVCc&JMx*5dog@^FH$nT@>FwPsg7R3CKl|!@*1UK0epTg%I zL6B^3d)J|6??v6Oe&FB&`3U(Nq}e9g zs)#Lb*li$4q?Si+%pu?4{IyRzLthVnj`MnV8Z@Y;@o#rG+!3IsL4&dkJ9U;rvq9{> zr@TuQE4bo*wz^BLQ0APUrMr`<$)03(V<2-lmF(GQ?wdh_%7G(2dJi=I=Rt$m+?cQS zutDl&&JoSni{s#+@^a$?B0D#GF^6SGUazS%uCn8YH<|%2Xq}zJqT`Jbgi%8 z@Wof7?v(x!S_c9jGJjr`Ow*s2xOTWtgcg7x$3Aa#gm!`;-y23Xxf9kOl>ewc+y=?ixM4Eg*^t%o@+Lolb#M*%FhDaq8g|7y@F{2z zyDz#cLdQUGBm5z}5fIH#|IOH>2bwhs9~xd4r1wGWE-dd*>k7CHxOd}QrxUBeJ=U<3 z=R0&aXx0@_#}bFOg4mt@szVDvvnCq$#(y}Jb0Er}YlNtV8ImxIGeXp?eAIo_C7AVH z3OD3;4TNbOh}|bo#fzFCb`QNROkaW6J@=9b)wmSK2=0b2MyL>kbjhsnIKFP0iJ!|r zv-%kJ(}nmD`tqoIHQIXG4^ekoFhrw39Om9CA=(dOcbB&!GzSDXw!(h`X>Z}D)^^0g zNv>peU4tf6R11Y+zksR?dj3ws?maO=Ux3*C`{W4SaWUNO4ZFhj2t5q?i*7RS{}4HO z0zd9YNU<5d^?GfDZU(_k=9n!J7%Kd%20dSq^SR&{I{HWO^9|_GTGNPrW_G}D_*5|H z&~`Q~GG3nfJ33(s(;?n}Yd&s;$t*k#rgkY@ZEU=zIt13~?%Tsu?T#q$?*A3|iGM@G zeiB~dt-Hybcnc=6m*8g==zGo?8pU|LRn983F30Bc!=QoVFw7W=cQtl{2F?Z0eE!G4 z$@tv#GLYn21Lxdf(|VBjXt}<)nL`Ib;xohu)2AQ?(L%5SI}G}XHSrd1{(l*~j2q|g zZA(TqunjlPpYbkv3r2Gcefj43=Dxv=^M{NXVBx$ETGAohd@nBfmkqlBozm~1fv>}t zho{!h@cEj3+hI8J-vH6mR;`QgFr$_A2MiRWi!Ii4Gg@lr@%x+~UWFrDcHqam7cx)l z$#>`CMeFF@aqX8kh`zlBgPrkb!uJaNR8KEUwFW}Ma^}2*AAZbUs|+|nJioBZ;KvJN zAG+41;cL>VRxkMWfJbbBHo82v{I(P?cDU?tZf?W(rArxPCHy#>*vTnsJ zumFxb89V_n7L)Fkpsce{SPM2;^c5&;CthMc3dbIn_70@|pHE!L{r45}c^#V?*0m|C z8{TVv|J73flcSb@Izm|bigQy#aAt>f<<9eVNsNH}JpdMfcJ+ekS_y|WAK(Y5L<{yaxSaQ0YvGf;5C;#S zuh}&kary#04%+o1KoJ}%4*;}571n|U9(1K|+7-eG9j~pQg`d3r0kWpU^$w`clZf&g z9PPUUTn>=XC*X}gsTCYX?uIi`DCx`;s?*H27UFE<&p>tBV_cuN(V|5l0WVuN{SK;A z4|mP)J8b~f*@tu@$u{)>3DANi2J_CaX$wf=r1Y?S0Bba7aDe83MDa<(0(3S=z@ZTVYBACSL-8{7B9IjQ^Vom>6G(z}y(B=_ zgT&`)I1V!4GS&2U;Tr*Z5+pt!;>EIZZ+qaMaI{(vz}eZ5jBS3AU^H0zxj{M~BypzZ z2B`>CQgrZ=Aaw`TxfXYN*_0ry0!gqJuMX0$AOSOO3)07+I(H-3yahqp0+K|}To|Mq zKvLTOSQMns(O3o4#lb0KKy~;Wn+b2=Sbvacv?h)^ystYRMRD~X@oA6>KmwK@4bt}@ zN%Xw1L-&9L+?wRj+aLi0k{y~4LQ^oTLn#imNcDWKOoN36iL|TBV)+>)xvram9q}Lm z*Prgtt01`rE!P_8gG}DT8LfT0+{0J}+c{{&94(tX=C3gq7bOuO*X+B55Z85MkpYelSdJ-gY29LxsgdhPo zk9FxykkrI|aMT~?fd?kIv=bz%>Y9%O3PBQQ$rP+Cf}~cxJk6zJAQ4dY4wnXk1Z*k5 z68|Cqwg(?S=TiDA0B$l``_X{A)1}iv5^Ta3$Tdhn$8TM_5+q;+9N#nGlAC-GBWI9+ z%X;HzJdl9nO!VPdVcH84^S=So+Iy_;wgP!5iK<7vjO#?};4`F*m zQ|xlc0; znM`f)&b`!w)bYub4H9rTA5Tapc|g-aN1Q2lB}mda_F6J^TH^)VzBZXEyy5w11>7SG zyFo#cgT%pBcZ<+3Ajv`HGa{4&l5~u7BGeTmJ{9sJbOA`fC&O@J%Ww~9qQ72*N3joi zK2JT0R~tbRr{@z9nhp{$XIX@{f&}CjM(8P!ltT0Oa3~U}P9Ny)H8{-oym$zwh1y8_1IG(Bar{Fl_q+=Ga86bPuF;x9LNW_#Df&si?OH+7Gbl7)X4M6MS)zO^=NI(>PkN z;{?-gLp`|N6MZ7!is?3WnBfV~fToa>AI3R`Ai3?o7nECyp*=`McXeTAainaU4zbiGURwLv-l}UUm|LZXbpy_>mVZXG@4GZS_FMZ6Tsh zN&|JbV33&sFXf0UQ7?*woiO&%nnf?5Y9?*PldlFkJmv}xJIM^pl&-BHBitlI4fG{;0 zSQ^l(vIgc|fg@9|^x`}R$CX!k;1C?oPAN^=gb%`WG6t5CXkxIbd=lMT0Rt+|TVk-b zeG=W$!3*~J?f9_B9e)bu-kC%LXL`XjuwYga4Y|wnNer~|S@l_juKFC~6wc@g05Z?w zh21V6TeKWhX92|ge*hRknMn^SYJ0E4#V@?M-@uzopqlm}kR z575bzJaFZu__hp4M8Ape%CyFDc>)qAnsru?9tKG;4QO#r84#qUAPJ@cEu9m&A1xgX zR2~te+d-0OR}AS^fJ%Z3uXbn~NPJRnbZ9C_faY@|K$E6{6One;%^@-{#*@5hK$F%S zD{ciK3D)bi5WNZ#aOI{DeGL*Y2_v2_c+|rcN%PTqnU14fdI}`LZXEB@VUU2l+g#cR zib^{TTbMw90?x+B;w6v->pLt=Z-4|W9vP-eqdd@MEWS(u5}yv^!?Xk>K)bn;>CXE{XbPpp!455KX;}F_>5Yl3>RPwmp$V z-4}atE>BCQuRtOoFC&>Yf&`pM^-pb_OjALBCP3|6-yE7ut%rGWwCvIq(ZPBanGjbPpM}>A~j-aFg#4A2RQrh2zQFyq-)CfDo3S6+YA{ z9WNse!cgv7{457Go{MLVtKm4pU}eyVzE>3(Ow|f1x0vV4iX*IddsFfkbp}&2Iv`(0IkV%Em2&A#?O&m<~x#eMefe$1((7^q#gy=m` z$-HSk?wSyt3i^{^TAai{la@GGVxL_HLX`O(vhy$KKr00eXsXgcMhd=_29n!8&N!NY z|1qEyy_UB&bHX$pBzLMcnX|tN)Abzo3ZJ?5>D%UEBdVs`7D|#&l-?mAj zT5bO{*hx1f(IAjW)9yzDnnBUJYR#Z%KF0|((b||o6Rr6iC%FEtWGV!SiB8 z>PNC~Tt$KwYy_`?vh+bGO2Ma@Fb2%c$#o2=JX#vD}tYn3FFa1UH$hAlH5cKR~RqeUj}iS z*`Cg>m6**Pd)4+ZH8FJQH3`l;7dF=!|J+qBK1lrgxsd%Xaaq5<3i z;HBX}qQD`;a25j;cmZ%&VU)R`H0I3GnAexaytFjt1+&bO32k1fGpl@Oln<|sW48T` zzvkj!cFlaEfgrVDlHhCP-T@^=eNt|pQ>gRBiHC%zC7v5Rq92HxEXy}t&oYDqD==PQ$`$Oz(Ot~~D?iu*@^EwdoXWA~U2eJF{RP5sgvHQs$ z*!~M*_tkyz1watHkMb1sSkztf6uf^2Vt%*f$#g9UZZdnW!>gIH^Z24#c-sxssxBtM zdvV}){yyY~LAlvU^Z-b}8w--D*FwZ*pL6bs&=!z@U7tp19L_9Y;JwNB)ohzCz8AOH z9D&{)S93=z3j*-UBh9=xe9rCI;yss8to7je9So-g*zt7Mz2hU7(3o zv0N}1@2Nfunz%+L?enW)L+v8`SWEH4+s&^z#IGTpbEwkuwH0~)N(u)2SQ(l2XE$H{8acJKWFX4aXH4ba$}cfBh^cBaFTU3ewKqe zJb+_6UT4nx_({bXNgW~>0v{)+{uR-anPKYi19r9Vt6)(08wg0ju69j8VjnHoUk2Y_ zU{i~J*o5*Oa-ab%2U@PRM721Yj}}J*iA5i$&ketXXbq@CJ`|rgPU1whTqg#J1!z8v z@Cm`qH{jTtd3ftUt0#W|Ht)qrD5wk_#w8n8`aYtwKpn0|-RcL2H5@6aiKnFWPyz|AEVkl05{M*~`- zn$N81u-<-E*L<{ebOCA{Em&fp-JGU34QRnMX}bI>0a~0B38ux-q$Spy7EBYM z0WG5%_{##cbTpu)qX8|L2DD%r(1K||3#I}Xg0Jx&IH&_oSTWbaVZDzZvG?WCHy$Ur zWSZA>e@0JyoIn$uIL^o_;i!#ijqD^2cAP$1q8dmj0A~R2Cwd>mR?xI@$fA{kpKMTv zM%bOLfolfa^bV-Q+wdt^jyJME66}JpL7ETha29+zH*)BDkoa7mglC2z@u{4QF&n7E zg$Sm_sc}}AhJhs5%lpIhJ4gg*Kuwgah3LIM0&)3j7F@Ubs%<~sV23eIX#fMxV+~!J zItn=no4bQwTjsPhh1DVIgzX?#$Zce(h-j1Z5l_@L+xO;eoR z5AoumhQhImWR&G}s&SzUo{P(O=4_&&ppI`C_Uq5VcU9D#@gh-Q5cBW;foKzm-KSzSITgh2&6N$x zz+wrz7qvF%3lO`Tx5bAlKR3Hb3Vi<<27 zz%O50)Z!ZtwEfnii69B~%Rk_Az>o7C;vDqA>_Zl907CTZ30c=w1*@LnA5T^Qq2$-lB&^N^bu|oPb3)Af&Np$YXI3W=vdD{es z(*l6?me@zVA2M%7v01b5Q)fNi`+6ma1(qFLzWeY~8y#!c%2?<~O$kvC(7ys69~h!t zAc>=aMdk2f9Y}l@caG3*5CbxQZ-X5*$!$Y&z*E<^uyH0KAhR>VS!dyAI;d*~-W>Y^ zj#&);iH$EO0=k_ZqFX>BZ8;owFkopX0s?zo>JAcV_rq}x1D2K;sJTX48#bXFnN!}x zDV(?9=WS4*GDaeIa3dNdU&}#8Ze?@{W{ty=ulH%>Pd$GJ z{{E+teI76U;wW?ZG_uO`4iFdlhrRf`sNd)03Ss`>hR@^CrJoMl3%+ZjxL)O1vy zmrl6+GJF#a)s(LYs85S@NxQnoleF7bk+glDns#k3oSL@JQ`1&?e%iH=b_Xv$o_0{5 zc4Z~)UTWH%Ye?EYPffc|DQWvWHEosWrJdRoX&0fa`gEy_RnH9u-3#hd$FR@bh#>-~ zPZEX^A7FzMs827$uD;ozA)r1Lb+;P+IO-Bk6Gdfk zydEE6)CJ11ECeXC#h@ObobHZceu#5rlk)OVu(;}?>oan9Ac^f*tIs(YbcZj;hgR^^ zCg=BHIj0xA59dipe5er2%bW(zb1QYGxyw!urQLy(9hH!QpYW)HLIWYd85$M9WuG&} z$p~EtW|GRh+R1P(1GAjRQkh;-T_NBfUJkfv=Un2{aw`tN z15`X3%IV`&N&T!phMxfa`ygvh{T=vlf)`#A{4H3=X}VEohUc1LJkV;adf}d zbNDenMKN6&Fp>(FLK?0DlS?QIpK_Q4%DExnwnD~tate0_8YgGHhXsg>u~0L}OeOcn zJTxDmoW}y?-EW6r{~^G@b!JL(6;$ZVO8~~3$<7Z$F=1a8mCv_6FyE{l-ajIa`D#^o zIisM#&R$p;I?7oQD4$Yhn9dwjtE}@Al2Zc?Y;U=t`bgGiN=oyP{O?GDx+}zY8 zuIV{zu>-YrJ3Q*?j2~&%OD!WQ`%M-OyNsG*%&~*<2~r0}oo0GLC08j9(blh?08Lx8fpdySe4rd(TeiydwWTtn z+A6!%ppY80tWznx4~kWp<62cjE9N@T&kI_YlWOCng>Xh`j2U8Pl9MI68tR1Feq;mFeqBWftq|DmAFDE0r15)pvaj zs`eK2folK==DMY`D~>t3MUv~j0A|`lM57nF8SXbwaW;ddN#)$hup+Yn5cd?f8dhO8 z0t{Fjh@}3Wgg6fqjZ8x)1pC%wA3m<=rPct9(FS!oI}g zm0@1HvNH0W#X>RiCFk7RvDoE>sDltWo$QlC3*(rLTbf*lLi4K_^qg0>rHfo|bs%f! z+d(>&N3J_C13TLv#(oJfYG#Dq0OhQ};Lt4K&hbh7WVXj>WGLp96Hdj(ag11Vn%MAv z7D*)06xa$}87B9aou;QmL(ezdVV`4+asYuJFj^#UfQdT@0EN2bu0IdG=6CRV-e}|Y zL64UYkUG$CQ@0{q0f2$en~*aRBGz6VO@MDGXO+<{#G+KDh;*i+g1zenP2!->8&#bK zs9`FTtD@8}l_@pM&558Xa+V%4YNZYX$UKNqL*q1vlJ5zyOu61hc8uJWxY4#VFfjPc zaIZ!#vk^LHmr+Y@v=AVAqg!yJX@}r-7&n@S8|@4byU~1r=#Ab65&k8O`Uh;C;~Vua zW=3yxI&Rdzq)ZRvMqA-V{fn8g8&#QJQzBEoY$P8~*o0Bo6%d$Pgw@i&-|fvzZbk}{ zN&yyRW^^{?2y1+b+^`yVF{xT0NV!V^v|y@__eF=>PewIFCze~yu>XQPI)k#`Mbf9@ zouJ%P@IAF+H;S9}_KwVjc# z>LGJ(F?%}~#4-D3Sy@gM7-atvnLnE+IYqmD7VHC@;cqNAY!r(W=1GHkMMJsnaV*B_cJPzZ9kN)TNS*oKfyD z$gK($@Mhked1jh>ITYQTL7wTlT~J-~08r8=CI5=WjadMVn^>7qsZL*x>0M3W?0XP{ z_O5Zv9NQ}AG>d0;Fv_|YLXkzB))Htn7l87i$)#l@Eui|&?Cz5usfJO`G`RcpDVI7U znWzYE(P}59@`z^gLg60qyphQ%EWp1c+?X29JMkL4%c!1m4VQy=iCS-{r`C;l|b1Q`rU8V2~AO|7&H5#Paflemwz3pcbtF^^;Ge?8Gr;Rs;A+;B^=^ z93LRF^*QL(-+~~C*(rcql>u&fjD|%){ZT?HAah%MG`2H;B*#k}iNbwVZ4_U2oHo;)f zfO~Aie3!+{0V-k+ACjPf9UoZ~+-%W+^6>dT@IR-6#D#StK7+0g(#;^L2U=-s(*9oX zm(%$-3ivlF09hs#uJu#{*!#uX}I^BiCx1LM=gqhs0t;J;s1JS3EG?k~5m*1B^T`wEqd4 z#|JeHZHe6f%$x^*v3yPAnuFl6-Ti4>p*N(RpDicSB zPXgVr0kh(Fzj3JgekTfkJJqFLo!uz7vI|~K21&4%lfrcNWPG8Wb19tV{G-q*l>$NlD>hkSgG1PmM-*bgMYx(#**Bw))~7?@*bB;YOFZjEUk zIEWmc#W`dF`*(z?8$R7o5_GDbME8NjM@`3jcF^`!mu7)(xCdfhf}>oK2R`hLQ-#li zO!nFNZkXD>7X{HTsaZE613N%BApaj?renx>t3^r6Z(teV|Eax!K;pZ6W zq8WzjMi_n?6Fuo{Ha09(>}b*$JeyJ62vY}KvmyV;$F*9*^(^SZ%3QtLc7ptl_?Zv7 z5IfbpDf;VPsIh}M)Qj+pF0Z@^*N{_98i#g@%Pfy`$)n36EZlDYoK4KSeFtL6($@4< z3Ws;x*_W-4aa6ZguWt;vv>$Z4i>0N6fXrrfkn#GC>nE4U&6(U(fKR-ha~-w9v*x zZ~1Hh(8BqsqADQsld_n@HoP}TGe8SpLtqtn5|#C)cPBj7S2Wf$^4)re)4$t zZtporDhEG5XOy7__+7mLKjNF>pa*Oy`$WLMQQGl|=Hk5>yZg-ABXQi}8{@GN`#t

U>ZHvHIM;U@=AC+*J+`*ZwXhJlB@$go%cZc+n0>0tf>{C76sUSrsYDq3`7CAgnA z?6>frR~hb)4SR7ziz+sXhM$7}8jYjjo1bRU>mUyQBmQTeF5#nfpC2BQbr-jSvPc#S z#>kc!ol{_W4zu-{?i;2LvG6XO2{_oJ*d5)aYo@cHruez*d)S!^&{iI9Yf-KCNDP2= z^En<@nfP7>S>NL4rT`urzldNip787e*?gL&i|1)L$drQTpJ3yR>U1^X>8$rRXhLx5FNuc2LxKP&JBTT9_5X7U}Mv;&z@;g8JwsS{01+%+-=fFpkOP6($f6&eh8cE#sA`Q zla@UJa4zE4TWnH!j=#&WCgTaZsDq8{HBX!L)G$x~kwTO11Bw2Vmz%U4#QLAI0$U}X ziRynh{#QR6)&E&5P5J^P`fu?fVuM8gW7j~luLD5;nQxf%0Z8<(hO&07gPgbF!}@Qy z9)dvv?%sg-?*Op=wKzY6JM>-nu>K$4WKz%nr!t%AAsZ9Z64_ViAmpp zB%KPoO!^8W`XBwJNgZ|ru>S9ZW56B&=)cidCVdYQ{cCBy^Q}n>{^7;X`w40O48Z!I z2}d5shyDXF2cizve}QRHI}7^f8vHmMH`r)r+<@M7;1hxmH=ylsoazGbeLh{)qVm-M zSOc%XF{3&FZ)q9Q#G-$KL|RT$yusJZllDNCMd6n4VQCBCpjH4ZZP}R?Wt;`T(w>6j z>h1t6t+1~})p7tD1FVCiajqBVeK>|(0Knz8xF0gwAApOh+5n550*TMefiPZ!JRf5) zEDA_`s-Vg(;cCZwZyF4@Xdfte44~T>i_8l>Q0pRCIgsQad#pvzf+W}D$60g?B+`zK zx9FA$0Gxxe`4&A45})~#ENV2_^J#anMQ?+|=ibZlQY9N6&cO?CTyZ4;=b+2A(9Tp3 zB+h{*AhD{nJ53xcv5%(s#Mw#gqv=hPrU5OO1|GfBqV$(v>p@;tdd#1fv<$foZ>YzgNy zwy9kcxYro=cKk1I3O9P98YkQIJV;ue)~Q|lu1o#ibIHCDjaoC;yTLv8eV2kcNKv~< zXQNA#K;on2a@ZD^nr?;9P)K_ej{I!^od7gTzF=jTE`JVVDNaqC&uV! zW3N%ARDgZ}+u-0M{_JaTziY5CA_Jrh$lO((XhjVUhW!Y`GjVKBO$1v9pH_8nmLIkf z1v^0W+yz8476RM|aMH&_Rj{j3z*bCI-@)pSfQPb8n%o=4mZjA`58d_o0Gzk!eN9T? zA;LY#&I1^$y_gH|D?rbFCJpNkFa==FP?H`T2Cy7)(uSK9z&Igz7r@plJpmshSm0_e z*az@=>RKFfJk<+!3%c4RcLA(Iu9PF#|0E;Eblc2?1{ba7HJ=F$x{3Wc02NJOP~1C(uJm zFwSU`kI}QDKa^lEqEGsKF92t>{XS1LXSD1AlYRq9Mt?!4bTEL{#CgjL;$?7jPEx?T z(J3tt18@NkNU~@}GJ2eMP{3QuSR^CeJ}Aa^Wi4{caWLHJBXE40fnZ#~hpJoAfo}ld z+vXO1ak7_AmlhVKWO?b_i|%SzYcHK&;W)pom(J*p-Uyk~S=Y&;`%m@Ksofcm3%Ype zY(%dn17=R=f*}@l%R?|Og_UqTIuu|Wz+;!7m%7yRse}sZqMs0-BR5;L<`w|1*Og~j z^c6_JGq8=X&jNS}0=nIUH}_`)^hPi(PVajys(v4QpenS2=rtMxXd`#ykQAyu6pJer zQX22$A$Igyi@!-#Yr2)bG$^w&YWJ&l%}_FcfAPv@u%eNPNnagIIJ^s+G${C*oe{bN zGXekN6obD8Yd9^_isP4yG8;IkHnEGD?h9s>(1S0;c*IQe1v?!ZyYE+|qOGIT3|0$O zy)#bgu^?VOQgel=6b0AB<%&1^l*kotcmq?<6*EiZikYS4N~Ff;3bPc>DojDDRInJc6XOUH1aQIMsJux=PNaZw{!;6 z1C6w_ct2>cJTjoBCCvD=m{}q%X8LI@IkPyoX)Ly4pa!K}R=YUATq!2itr*Hus;As+ z%RnUx-=Ku#Iy0$3{qPw|{#l=sTGi7ea*dtTv|^~UB2jYRGSHgBv*IPTXpnM_60$tU z?ou;!ch%yY$BObng^5lnT9jWYMadmnv?wE^Ahd`pOV^A@f4C3AJ-I{K@Ioa6oY>@y zR$BI1?&NX_6e3lyGb+^N^s-tNtjxJNt|};P_fM+eG^FsKs)DHY|FJ444ZK7Z7g#Z_ifw+ym=#b`7cV^1;i?>%bKyvIBv zuk{6?CoI|wD#gf`AC^KRhKrFebD+3V`bK^_@>0m<#YTRrlCl4FBY&&X^~8+)t4b#k zGxB4Ut|w;XHy10LVn%+c()B1t{+)QKY~))jU5{eq=R$=$p-(pQl|L)icP2_yTG$it z^sks@Sg9~$M*gs385AR59i^BFOCl}o?LEcPVn)7QX+|Ee*2k`xk#Cm3$hTE$O3cWs zX^BN-Bd?|7A`Nx#%S#0FjDj|I%-$=>7Z{$^pzL9@M zktn$rBmY6XL>T!ZC8TfUmn!x=R+KL&%$SikjudNOG4k6WG#laB$iEBsG`QKwf2L%> zH}Y!seIsA0LLyuRH?kxcd9@10jQpQg!I+W%gDRL-?LSuqV@CczPz8&PysB~E$d_JW z_ABM(8~Hs-g()`jbxSkyjVC4!z!!0=^Qlmjt<@Xs#5 ztPykM;9i_ukUJ0$2J-N;92D$r*kgy7^fD-ThVEYX8n!lIC78q9wbrCBK^#VLlhtkl z)?-1zDtPH(@x>+`010^b60FC9B+;IjVA~hqM-rW6*jv$ai110+qjS}5CcO%hc#(Te z>J5^3ywTp=i}i2oXZ#E+0Q)>l0ek&o$^#AtxW67dO_~Xk_^d| z2HDfVPb0AKIWp>FmccS5*Dkr9f)O%um*(L3|J)P`76qI#UliLNX+&=Z8i#C!$@@fP zDi^A*aJjb$eiW$UgnulKkEhMdEE9SW(=q?T>Iva&l=`7*ID^2yB&BkAQXFce2o?Lf z8A2;4LZ!3Y458~3p)%BGp)(YrY&MY+UZrgdp$GQ>Z3|?$t3Sgl%zFX$8tvSi^>{56 zApDA1G4xq%wu^I95ZSof=!8FaENt;KjYs2=cFds;ZT~AEiTh8 zv#s)>YVpi_u?^i>q{MF%jh`86s08I&D)HMWOztDQaC{0qswj)c6~V6pEki35ru3)# zz^tcC=4B|jKTs|-L@7a0!2Up&WDZ%xb#H&5b!eOtLVBG8ff`O7rE%2bR1X9)Lc0_d zN!8=VF;A(wJV=nn;anLn^m|mC14>~?O19a_xm~Hc%#^D8ostqW{i=IVsk$;CJcMkG zQgR?nuDWikooJqXk3XV$-Za#p%&!3Ind$DWd1!e6IE2S_`PuwV1~_jgb^i#wG`&jB{rFJl&Z^2sk+UTl$hyP-9n}6 z#!TkfN)C!m=1MFS6z#|D_$Kop1K(uwnd&idwEvaW+EMOEgX%ic8~C8z!$Z+*ww9m!U_n#|`h7BIjukg$ksK{s+h--6Qj0KNsyW8hoRA^@HyC9?(1{6V*%(|}_ZbSHzT z1$8-loeu-I_Og}Fz|Yo30M3>i6Y1Xt7awO&M$65Q0Qjaqk3q5Np9L7p_(leP#+&~L z;AeamKrG`20aVkUeH0;iw9KZzkU_lZzeY^|ZkYX^{i3G-6s4}o7?w?cGliMKXcUL5=s;ScL{&B2tt*WB9InZ5hms&g(-tF?h<(A zChecdIClxWa?_cC-zDS&{Arg^z%dec3F^v?*iP;e)Rh}y#;@EkvqZ|w^t%Lg<)$KQ zp1TBf?MRqn#LiTVSW6DdUBU>(h{d{uBZ?7|W+Fzcj}kxDB}`J{%N?*0H18}ncjY)G z=@LpTMsSzVU1^cAE`dYtWOZ_vpe{zlx`Yyo3EU<8y^9HA{kcm}7ZZdj+8nBABi1Ec zt7s$EC8R3aDC29x;l&95f~_v@64HL+qVX0bvH@aU!Yl^SE`iq}ia4OZ4snoyzYdZ8 zGt2YVAqoM+vhq4a+AqbHmDeHifn)0s8yR?A0%x!JufTqnkjKE!RuRA-cL|xt5W?>g zvKbUFpiBddWxR-ipYhD!0Q`(k1BhjOCxG82aK=0Tj*$KWN&y3}OR(O)-lCIkz$$cm z?7`f3BX&mJ1aK=3YxdQhEuF<|bQE@fbQZG%&Typ`W^!T7#nK9n5cFfnyOYvcxT})c zgyRX*gMrHKlK{;bOb@uB+m-OrWAqHv(RTdgvgGpv)&G1Sk~F&b9Y4%ueQ5iTm>JcJ zwht-9NyYE@k@hY7kV=@_K7q(zH@96B%PO<2K7kh6>b)%c|5SEMW|pS(-5v3)MFe(Tt%mrTMBmu}*=AVE?#sk>(q}KTNU}UoOlnQ7+6Z zrCicDsrYgUMwu8jpQ~svleq(+LG@9E)T=>ImfD?&(7|A;-H9;cyAx)X&>%BQ)1WMg z42;vDFhzq?6a#n?=XEH8J{oTTp~29KcqS{LLA+Izim6(~=UC{lKtu-0dECl;^HTs2 zvx++z6kEkK0|9-j*qMQETnZTY#)V9y*tp~YsK%uTIA&ZjEr6(TDY=F{4r_^jx!cjY zI4R+=5L;ql`y#BYs(n#xl}77JUSO?F43rVAP2;@#S}Ou5VYIo=R)OAV75&zAC|y~a zl#2XFAlKtQQk71iw4GWm@6_7J zWenr*Zst1ccrAc;W;F-!jJ>)eE2e*SN0!uFwsoOP6-`y=)Y;gp4_RWyUR_R-=D^1O z?|p<3Gxq9oQn9hWw=`qFE#9uPvELidWMkj0RAaBMiWIQ|V#Xf&jG3(hfMR3Mpm&ivIVy<{`Au|l%8T%5;PHgP|^0Je* z#1%94C6?sb*sE(%#l~LMnr`el?=fQ!@JGg;*OUmyyT`QGoPn>sSqyyb9Rv_#&)UmQ z*0om%9MfJ}1fUdS&s8GM*fYyB_BBc~_OB>*G-m9VE6ieJ&)#yqjm`{@Ob6gx6A(;) zXsZ%IT4VP>z0e+oDWc=Y=@&rS@tNp<&p5prr(a^6E>p+&ak?<$SEiWBqde`Q1T&)# zB|_ILhNskVx;*!aAE!&m_;I>0<4rU(ON=s^S=uP`|CQtPnTiH8abqRM>Acr2_#Yal zOC63Mrwg;hIK44vD}J0VrscTC>C%o%jMHCXp}y(PXA|HXp+bO|=|0Gyc$}UIYa1J< zXEX4}>4gmZk!Bj6>cmEx`2fD@=0$*wz_F2LbCij1x=Sn%{qK#_m$26Sar!LIyRWs4 z0Dok~y3?js4IShR56)^C%N9l_8@&Hur6#>Vzmsu8|6w@u0Lm#IzOH4P{F}dCm z!+Xh~6xsx0!~4BrV`GN*cZFH%*f)(mVKp0>wKMK(apz|LY&JT@-kfd1I{AOnANmz@FNkM0TqVxzmX@_u2F%VXnw z;MnMHBZL3k*jTzyUI;nCv9V@gn^!>IeFK{h@J9xg$Hs*m!PnkS2EO(>R|N32R{#*x z9#zt{mj@ivUJ-+T(ZE`TcyTrrugM0pu$EnfcV#Q^Uce;)HF11EHb3fI1u$ZPMH@lE zYvMug$1N%ZiGUf4EqcQjZ~)+T-X_BW9()>`wQ(qb2v7m(JG|#iv}g-R_I|It%AzA6 z0Uf4UGzAn4VpsSgIKJ>fwd*Vz1QH)DmCdKdSJ_O6bRme>(7 zP24S$PlCIU-B+1q-6q&QwUfcsW>a@R##3x1r7rdaw=;m$#g`#7AHeJEoi32!U%b|A zPca*X+C!Fq$pZBG20z@23M8nUHSZVl)Vyqr6fkj|}-`;{FO#hMD{(=QD@( zJVxI@C1;9~_XRArqM71MP?#*%e%nk9vHJW=(i##>#pV_zDC^&T*DT|(KK)CEENJ5n z>(#%Q$@&eke*KG`zMi?<{A(s0ELI9I6G_JkFq?s2fM_Je1&9V%T!1?PJi%COx>dSi>3YWY=+yzN<6&+o)ll(fSvMG!9jT&`*^3a>u74zV)6T5Je5A z#2;DA6Q;zc&}gO5c(D%Ep&5m@DC*%JJygRDuUB~N3{}N^FnmdT{DoZt&c@@x zO(3`_`W4c#2<6-l&InkM>K_oT1_|hZrwLm?49M)oVfx`m#9oEK>6<*c3{FRGL@)rE z6;H!EH8t^b4_=hAezJ=nI2NU`J$MA)F6F~Etj(5Nzkx}GPeS-MD>XDmsW-ejY6SyL zop}lq>n_Y}kaDNOoC@anc9m1EkLSHrF?^}Q<28!$+smbN8dzLAIhFA{s-}eZ!r@)a z%WqaDJdZ1gccBi-hq8C?_Bl{9^UgUbWe!L1F5%&W-201@kZ|5tkSJyKlf0%7y&Bjb0lh1MLulKyP#eg`5N!h!tAqblRSwuttzL+UyfS1GkiN)CD7M`kA`3|2LQlGQL z=5G?!9fAX4c5+qx)GFhC3EgEbA(}AO$Z$UfC;|vtc7xC}N|lny&jNh&@gN6ZiVzQ2 zwcRvqE6!$cqZLU$1C#h^3=UvT_@5lXySS`^-v(QSTFfXeK-nbnZ7@RaO%TE#RSw={ zMM44Yk-Uqo2IAEWr7O&suu~ObTrUwa61oa`@UL3TL|#yK$B^lroW#Rcb+;DM%X|u8 zgGF|XN5QIH$n3te-zpS9CN+mv#W z?K1aZul`p;>vhz?w`OX*EwcV>WW9uS)7_RNhXMxeQsYmYUps zJ=U$+{XV|MfgJq+ZA=3W&bQ0BWuS#Z2Dp29O>ZYaiPg&_#Pe1!W&dy5(}*$8PPDs# zl>MG;LxT_6Wt{4YzJ>Xh_Wwp$>;uSwIw=(mEZThUz@1)Quujot|mTYSh|5!*+=)8}l!*z|cC z1AqFwlYu{d?)*&DK*)CG0syZMmBk0bpe{Cj&SMarK9gGqDHJhdk5xU?QYlioh0S(N zcMf!vhO7s-*qM>(Fy);YTwK+e`kyoF?UfoKmiW?0N{w`=)4PNRvp!t0ZOrq{`pLM< ze9rb(yL_mNa+gw**sPzcFk@!Dkz!^}$gJO@)CqY6&t|=bVwIUGW<6iYIWs-8K3fqW z{Q{fy#)^QLS-(aRP~0!LH^8hH@}09;zj-qj5dp-kp9Hg>hJMsH>z&!{ne_qCMn15Z z^|sJL0R!KxZv-e|*11iqW}T3q5@wwPMPKU}qv%_z8k_ag6@3dc-mEiIQdVCjWTyW( zOnt4R3?~+E)`cl%-JJ#1bmm-sYS(e^hHAJBL^Um;ngRe;O+I?OjqLVRBTHz{Bi1MA zFx1D&VhH3h(M;vuYI7!b+LcnSk7pjL;#?ZfYl^+9ONSv_oB$h#xd8b91JAd;cNrKQ zwW@}$nOAHixvCF5Y~kJg~OwY17ysYV8 zJPKnA6XHkz{w2-Qvox5fo}`2qy?kz!*ZP()Dt2%u3?z?#H?j`Ujc7w&sX*~V-b_v# zCRj$wywyHx+_@X+%;>nfj|x#CdiNoEVaYuH&5uduZli!ve7E6sH+r{`=1W$)4bj)} zbsKMUe81b+$jSQMM%rqWyZ@F;HiP0d>uG?oZljQa-)*G52;g@c`2bwV(rs)6P`i!h zFCnD=vdAn3eqp-bW2$qIIT<*1Z;i6}z-2xm-)NHjKA6p47SP&VgQCx4Fv+Oy7GW){ z008G>xRGZ8b^?Tw1K~%|&ispeU@UD!K7fDbD{xn<8udQ_ zRmkAWy3$4MWcPosi;@!mSGuT_^Oeqwhn&H)8;6!F+F+j7nT21BZ(+Nuq^KrG`m{ai zn#B=boW&6yERJR~gvmBTZQR0)Z`@LY{rZ6HgvlcTS0dtqal*aw2*+9F0DZ0nv z?q8Vk_b*EE@82!LL@1l@a=4Kh;hFF>fZ(=jG7&Ch_kV99EM_=vA}qYPi7@lLN=D8* z$~>2i^@I^djnMgu`YN+d?=kD3)0qxq;9s5Kus*RGI8zm-7=<*migST7lMv?ThU=X7 znI9Rl;0%t!fNbJ>IuqqzJ$#1JOgLn;{K?6~!vp_n1IL6kykmE}QXezHl$WmND9j4X zlygAHItho>x57zE+G1l(^r%MeFIa5k19N$?@m_quWhY8g78~~|{TWwvS!}GVoD%}8 z8(nNnQJB|*$%~Cjp{+9 z(lmKEqaJ$7Oc~Cohn_Oi>+wiiY~(p&iN(g6V3t^Hj4{>4#u!swZ1kDhVq*$qmRM}$ zxonBWMrKC$`N2W%IJB>{BIJ@68>d5e*#NTGI2B+gfGjpcm_;tX9m33_!wrQ`3zuV=lcV*%~$g@)A&^uzLw6*UQ0nCgFa2I0gwUh6hXQdBd>Xr7o zH}&eW9Zz2Y{8?!}yS=H`#n46pu*^!wK?@rh__I=48@+4oOfass>a4Um0+pDRRz#ra ztaO^9Z;QD+E4@sbtBv9SoZT*QbM8xM0c_by&4k;TUPJByi;L4UEa`I`vgFE-}= zKkU5;cofCilP`dRNR7!*A0maC<^-i&grV2stLK5``3H#|NGvzpXVfXeqDX4 z>eQ+2baf3e@p?GqlCc5R0{R+ZvmRt}eF&x1qTYcWQXhv@u2hoQf$=nnT!GF(XuOni zNUO%FT0aqRGt(?Ivo?54X!N0+jXkv%$UQ8jV0^p;b!w|dO4eI7zND`jiHU6`Edk4` zMjB$viJ?^^jjbtLz|g9Z#?)dkylSMevbV zC}kOCo1Bg7v{G^_r*3_l272B46s?>2A9d>uG@IaIlbnr3s4aC7$h~qBTr27#PqLUbkMR>HE)j>)fG`vr+HX8FZbE&p|cC zluL3pu7GOFz_7FNLa3$+45?-UlqX(`sip>|m=VLQTcigUFFL7-dH!XBZy6}tjww_+>J@|pr< zx8l(nNS(WKD^}(NM1B17n|}q)1z)i>AU+h>5ZTwkk8NG*;AaZ4yKxHcOx@s!T_Aru z9Oyo3qa$7h`RjrC?#Zy|^%VS)qY>?@MPczWh@<5_6BZAED4Oui#`4=Y4}biN@rU+C zUVRbHYM%hVCHXFi!LP&5#{J*%=aNSNeT@6BA;6K7A%5&0pLid{cRFJ0F+WLn@;5nR zIq2%PV47o3=3Stx7eYX2aafE1@tsWwbbu3;?zq2;?fYmBlKdQh=yY^=r||1vKe(r( z6N3?een-}qR)*h&&B7o0UD&JJBawUXJ9_*G80gd2|kc(3@}At0xzY9hiMfEt5Jd8~O4)-E3v?=@;L@J{j=VMIG0aH!PTi6tS57Nqh58`N3xHAy9^1%h(wsM^Q zU`mL=Zf!1CImP2$+FUT1Me2!omo^npUEDp+EfwJHZDYBYUq}|!1 z$&~lOC{5-Oqcm9z#?xdO7*CT`V5C5xPmwNn;KA)y3wt&(@@k0x!Rb~#s3!*Uyq)&E zx79#u%;Z-HRcd?Qsad;w-W}T2nTsTXGp$H6?dB{3BR`<-rpcj|5h@^8grC&PPu(+Z z!+u!9NGI+#?33c3f2p-_ia*4B1Znsm3`QbDz*JEI-#sFdg4ijT{s&eycE+Qx$wSzl z7j!}sHQ{8n+{aAQKIEHAtX^`# zc=b{Q#;cd;6)-M!4X0Gzi`ZOO5@aldPZ+4qN=Yc{Dv9cU`%s;7{?2iyf z)lEJa<@8RZNikh+`?v8M2!lb?{%?a;OAwXY|BYa(z)<^N4yEmskE!;*fh-k+1GWDZ z2y)YTTgqUkWCl7;66?k$SrSX`@aZg^sWTG_J0+?9TN1~ z|7&RfUrI2p{g)vL&&I02$o4-DaxQ+86Xaiva@+qtl>ch1Na#udQTzW2*jy<**8V5s z`SJSm)c(spw1oIfw*Q%6^1x90KMS!-D2(<$745$qVQ&AgL->!fzP$GTAwa)OQEUHQ z(fLrgDRWHS0ym~1E<5_qW7_VNUZ@_{wW#Yw90kwas zD+8nUPjx1CxpkF9b(KpDwSTIkB4VihQ{9{>zhj{j%xpvU{w1TzR5jAY!-k! zm<9Bn78R>N{(uwOk6&h0SA7Kh2~JbH<%!6UydH2tCp7Ks7$B!C$<*mH_Ct zu81{hOIW;!-!1i5;Kyw`zlzCUIeuS% zBF3Ff`JWmG1H2y4R%EJTrVx$qlg#x9R4XQRxe(((9PPg6g*X6WCgmp~t^+Z%^q>%p zewWOz$nqt~5#MVV62F3&`P;FUSPo*Q>^Mupyh2`+s`h5)@4lUJGfY5@jbZ?Qn5s^%1GximClEUN=FAdotKc#JMrl}hjet% zO{YdibCq(AN=Jvi^5`II!#`rbBi;tFNi?nri-{m&gzv*Vw7Z-OePSdiomM$%5PmH& z&x2_=0qY+S-wEPJpN0}ccb={EiC;i`=azLoaex@Qv+8Yp=K7AjGXsGTF}Nc?mpi&J zAg%zVziS1C46wyRAPN`GaKzmp3jcUySZp~l$l*54!{X9w-0)-PhQ<3JinIMI{4&?q zZuswZqG%FIWPDLxqWBapsFpnciMNj{}b+y?(K-ZAYz1X&I*XUq9r;%Q2OU2 z@&$UN^Fv`V7nJ@hLE~uRwd8%UJ3u%qRQP&*kIwQ`{Migj-%dYo^+Q;!0}&&9l}F+c z-~O=32c?h4f=_3J@8RCKe_qE#@ir*^BYI@s%gD>bo{6H-s8pnaC3KyP@SPe;5dJTE z%gFmeR^1Hx-fQ!1;mhrgB#*#3)8R~uP^JE@r=d}t4(MfkrkFTJh*Ln!95Gdh z^FhpHEft~=#LOwHg_sCpW_}I&aZtt|&~JzDg}5A)aUPia5O|-MEZA7HAA}eT%4i1W z;(?ZU2*d)69HcGtiwi&*mSZJWzKOPst1rkZylqHSyadX4I~eMP-xybSsUORDH`vnI zjA032l^#wUx%1)%b3)3`SBiTV6{M6 zXT2|D8oiSaa%+YdVQ)bv`?-wX3_!+5LC1aznbg4(KJYiRzZ~f^K+eKU4deo^NbDHu ziUzD6XRt|PlCVE|*b-mMloBYVm5CXl*B>*%9?9Xx*x9zw65q?H^(pGA#8mFIb#Tli zD~(4O9rOz3->?!V0z5BkjJ(fuJqp6sGSt>_L){vy8SE1o@-AtcYb@tfyeU#O_W1Ew zgvc6m=5<7zBi!n9E?Gq6701Q+FizO4uF-piOI|&10^BjiC&?B-&??I&~kZq1C1?ry>E6}0Oh)Y!qqR)pb6+=7uY7|2|__CY24b9lON2;o|bB{W@ zT08d$^vaK_{S;NJuGR=})$T^ss*6CbTHmOc5(wlXE=JX=%d6UaRIR#VRr@olR$X4z zeub)47lE;=RcK=bysFhfuWEJBE1G}yI=}cF#8pc#%;@S3vI=`$78MgfG&p^5IX>B! zcR8;#IN2}Y(^BY}2d7`5j1sAIhw7$WF;q9zilMqm$=2#-rDn!n-K>+KQ8zm16~Nwu znt4@5Z-#tx&D2NEbdYN%88xGWTr;asGYa%-W)Nz|0J+fxX5+vEEw?-f?L*DzV60}| zmr;#DNC&-|(Lt|Zi8WfGtiqkBi0olp8TJ7b`A2!Ti7Ik46j=wk$XO_|4swyVpvVgJ zihL!CY=B(kR1|rCe3AW+n_#TS;%(#x7tJza#;Ac_k@c8fk^M;h#>!hHU~z<}sJ2+S*(_Fs>{bHptD zhiibk*A2$W;SVrl2?g;)TZ*Q-k7JP=>$)?&;ft;!99Q3RY|P-x(Ai zf-;a(6r(}BjCmaaXBwFF_%)5Oz&UWGExKK0yNUj_jInk)INcGQ zu^i_rG42>l5?13UfH+zJOYLJp%+#$!L!&w)d?%fbh2`Jy=Q&VD0Bg}^y94455Hm~n z2heyA#Td~H#(2iK)BWb4mt>8x8|A5!5$=gY zJpaEq-wZh?#U8+<6v=7~z}p zG^%_O9|peKP_h9hK&aRo{a^dZy^2z2IEgPDDz{h&TylPg%||N{KE2=;QuQW9*!pe z0|M9eO%<69EGw{ZyucxMJRStr-6%xT1UH;KMTiSP7_0(|?+{`?h{E^J!K*tEg`b%x z#4jKU-;CAVDi9!&C*OXc!bgvtJVkX|@fe4Rc+&Ujb;W=~R zr2tX*phW4>Tp-35(XB~G~*`aoE z;L)$qmYzpnx5S+?stu``)2w=S$yO7*a6=#zx;HN7g^lS4yX~g|)3^F`(F8s79tgM_ z0(8(5V1TZGp>Xh5NC7mn%)HlX92yHX>R`_$R*G;I(R_;vInz2Sd<>>KTjg^hdJglg z(1DxLTCkaeu0#-G)(brX-L#M(m+?NFm6J4YIyM@(8pAuIDew8k8z9#CRqy-7b0F4v zzI>A2SzCoOuZW7BAkukYtWT6GoezL|Ra8&sr^JD-&R0TZSLyj7oj(MX>7b`F19Vlk z2?9n*0dSkRI$r<*I_L>7Kv%#h==^RefYqdQu7j@5f59ZLQtA9=%yG-)b83zoa!M@m zhAxbBo(kRUm7uBf8c*l@q2iNvNS)vM0nYgZvCgyKMX7MnTU4vC#g$Pp5=1&5cb!jU zH{5;rsJ{6Med zXex;9{G^Zkq7=kBuaQr>c5Yu46=#D;=iiQlcR=ZUD%7i@dO9B;2f8}{7Ai}8kLnTq z1c>{VZBUsGdMYzOS7rMlAWaJJbp8PZ=%6RS09^rhLFetI0K?98(A9Y^I*Dqf^XJgF zJM5T8h$SIQ^d{(L6%y;JJE z2>ZVBTnP>Bxlpf)>gjxD9O&viSY?S1^!!lY@+DNJgPzI^&{bJI2>4VA@cQ$;5TJve z00VRd%!1DS?{lTIr@*sw9dvbG1v@XMLXw^Lht4zQb6$U*3!Udn(6jRq(9IYLnmRA@ zblwLlzMIrcW9aqOez6I}c20ZU=z0T$zGXQ277*F_+c#imy3+Y7s8>bxbiOzabakE$ zm95hALpt}pYJ#51^q6uCZ4UwKr2tRo$q=A}o&W=Mbv_?D|4a&C-KqXu2VI@#LFb~S z)OjWPmLKJFo}KrE&RbyGMwh4aozTsx5;S$5OTs!}MD^$H#5u_z*7@_F`bENLQs*V| z$qymYD*OogZac!&`Kfr(01Wlb+x*CJdXFo~v&znOkaeC!=Z9vua&;amgnHkU&v_>OGSsk7FOD}Y%%|trq&GsF$-AU_ zPyfO%9ss#h6tZPp?r_-+s=ZaJH?str2we#cZRavfQDjt4y$7IP9dy-uHMG-1M&;@z z_2xr6I_PP~0A20e00DiZfJ|hKr{aSkKnFbm2IvZS4eA{v1sKDn4!S0N8`N7a)fJTqUNK9a?j(HME;U=d`btE>GtT;y_pDw?SozH2UK5bbcjNrh}f!4A52CeGrf) z1$f=abr7I~o&W=M1?+&%kCp-qo$H{h^C8fA9u<0u0a< z@OS9H9ySuwWelA<=;}WOg{)HgKMmz+E}!#k{wC=EYzcb(Ocov+CqdKZMULuc9*2te zkeaC*pY^R@>;kdQ%jJ`9KXV84{jSvcEw^Gd>`G{84?%WRR8QxHaiFX7)lk`1JwK%L zN1-wu^i*bmuF779fH$Q8ub+7u0(8(5V1TZGpP=*IQh;IeI_T=W3^rdxg(RELK|e$L zyy^0EekXL^NrIlvOQD-{Bxvfq)YEy#-F`71#5$k(onKUgSm(3_oG!PYIdWuFTmzzh z=I6;+4J)1B1of(@p3X-N;cC`VY>F6|;u9StXzDz>jk5Dg z_xQy#Al7+d4VYanuwelaE>hF=ShKEka_0%FxE!CJ1nbxX+=m(;- zKEnUDs}V+8{nrP?10cd%Z3u|bAi{60mmtFR6IkYD4HCq+AddYH|GI z1}2CXK$*{=luryw5T{=NW(b($FG&zLf%wik1THRe?*v|$m>}{dfq~reI}^ljAnLRW zHYSLfAbz6hrUbETz59g!;7bXj_ZE5Qb_CJ@P%42wKPHGRAd;0642s1d3g3|!6z_mY zZZs)~A4x=*@;DKJH^N}(>6B%-Y{WEcN_pKhjc~?*z@uiy|J>28# zpjZi_eClB>5B|W-dWQ7y-fu#p=eMq)A^5+9!VvTk{x`?& z-OLNkiqxOgGGxA+>E6>3Q$U$#p>-`q;0|KW0Mi?Lgr|TqXIti5gQo$Geh`)um!4j+ zdfIh`wLAs>_}&qx{eZ;KLFw`JIC{9QwDdT-oWlwKI42CxdLkRF-Z}4?7Z%q(7H0hH z4Ph}GM3uP%|66ZF7e5uW}MwsnID*VEPWtm{z6_4qZ|_C3~d^P}fY&ySAl za`dpCmM;H<`xC`|pv>E?z}g2B#YwZ=wDdS%Z%P!!n_XNF7dB23AAzWG*Ae!28=54p z2XS|^2!ZiKz)*M7b6Aqt03y>54^I+jfH>AB1lC>Y#`5pECP{QEmUk8+F#l@zPN4d( zB$0DB7-)MU{%@l&wEZ@IYUQkl5k{`GQuvczP7?h=+`Ot0xa^f$kpf5VPZIb1=Hhx- zSEVLYPayF1EfLZA)(B_lcKqK?;fa=i$sG~#6NnSOBG}-wn6K1tTPrc|9iPqa>4et0fkJINB{!@E&xcWX{10*IV)8mG3mU%M!PP zn3-`8oMO`?b1B}rZlm|El+J1QSz-l-b0|X-ytL4Tc z)Dhec2eC~pm)^QoS)s3>fN!)NOquUn4V>NBW?$3{sefukoDul3lu|I=!`PBO9!yZa zvZPl)-QQ`7x9|!)X(fcRud~F-`ddv%6n+aYfV+V*f3__CoW|D+98Kf-a@U4G zV2yIdC}b?la<0Nxo%uBDZf0fK4`NB8E^nQ3XB_CRQ);lxP#4ePX`S-st0w3zGxV6! zm3>eX;H?cm(F71!O8|rJIwgvAin@$-iVnK#l(X^5ri2PfYr~IeZ745qZTJM%De7Wj zwPSGqCW72s@Wb)TzQzcU$+S1Z*ng%(v@Pqk0Pfv#%9Z@`qU za>aV8{T7_W{|_~z5NiNgPs5bbOmHWwMR<{COA0VHg6N=Yo-NSwbE%Nj@)x4zeX4hIQ2NjTcQ2viY6Ut~t%F8K_OMSf-qn9U%5X6)#ISP05` z9MQ7jO*tRL(OSZ-G8DwoCQJy3B_NLW-OT|}s&a4{ye{)W9L*@g1o&K5f@-VR$mj;R zTFBkPxwbdDJ{D#^_Q8YUPjD067)TJmfH(&W(h@{9h%>qYz8F7zF`R?;aKt=~@tf~F z0cID7?- zLCow&;8=KSTphq0Lmn9xaNULku?EBfUf=9`WcbctxMrRL@tytOC5ZNWz)&qX@Y77d zh8QlwL@?_>Ec&*e6U1r|M|&TE$S;zqObCkoAbw^ToI49Z{LC~sambOwi8^rg^apXG z??!^62pbaknf`F^+ymlg3}z-iqNNXMInfEH!21E>I(_HVpoqfd!vbzb;6-A{67%8j zA)gN?x($K)Z~}3n&%xhAJ|Di*4W6J0Aind-KyB3Uos(7v#Z92BFXP)>-Otp0$HaQ@Ch+g!F3nT=(uLV??t{Zu5IIv(Q&=CKgb(e zv#v!CJO4mX>;Q4$Uiv*K#2+#T73jHt1aS`LNY5De6uZE*I1+cLv)d+pV|=H62U`pP z@tv&*>{b^44%}wxaGSZ(de~wYh%M2`PTeJ~`;O7!8#QO#G14&@BbuQ%Bbvd~{fu$P zc*e+^ai?y^kY?n~xZ^YniIE#H&QX_Uq+>*@JDs{k8_(1o?XDpq@ir)HMf`wVw}8XE zQv}x{xfj{Q<|D9+7&5-gZwiUUpsdfsc)bd*<4GVku|E*#0oNl>34FJ>en_5E7}_~Z z=797dW-UaMF`lX0ERAReW3)y?qlQ9^XN)^Woz^X&?z|b#7}+t>F>-L2jM0zoel#pv z!vDxU--QUwB!;F^FCefRdw-efTox9iKwNX%5oj=1GG8Om9F9tk)&btit3e#?O1LP= zP02=4j=&yb$S7t?MA6%@GCJi8w|j$dINkiEc!+;t3jOTP4KIdZuJGHqW^ z5|@IqhNG1jiRS$R$1{j^a0%SHb3rWaEckct0&zwU(~u0&ohQ4_T~^3AFwcQlA-^J! zHw6s!uzlg`CBHA1XFV7n{Jxxn^AMOx4C$cm94uWF5nq5s9MCPy$Qx(k686=0|Z zPpyoIt)Q$wkmzIZ5ucz|Q<<+u#DySE)F{GzRS_`(n;}^{ufTsChX0tN$^;Y(9k_gR~%$)f+{bYe;>MrRHw39vu{%N$j1w8j~L^PcZ+p1+0`ZK~;4Znpi z8NRH*w+KB5=S8PuV2sNIka0J|xq=s^ol>kox7#A(MG(U7@lJtH)}#R z?%M@o@Ko<=`P4mls_)72DPry%DW4){$v*iM7~zZHY?Hv3eJwHOR23dPC`B@yfI>n zlqjA$*$Pa@Czv0DD6HW)j_+vXes(u}9o!u;+aQmVK7+nKPhtk@xug>5T-*yGPe*}a z!00{LfMqCKpxt`OJqym)uN?#?who9JL0O~FvE1}VQ0xIQvumg=&bP&6YbaL z$6f|B#@(#<5*yps&x(QgB2#2_4z~|kx5a_)1=6r-^rAi}hP+OrxbG!8_CgIj7GP4P z<2YaJLi^cmiRd_AgXGakc(n&6wO#$_?9Y_|s0YE+Gh0W~oj7d7F`>I+5XVcYvO2qv zSHO|rt->)V+*`7MI}TOADTgXxfrtsi_vW~@*Q{jo*N8UJMl9S=N0Wq`rs6=s0J4`O=PR^)A@c@XK zJ7y<}{UByO!u<1$mn74uLz1`+#CLQ?_>MddnO?j%LA2Y4)aF6vcL7@rM_Xm40M3Of zaxl=HURdz01`#8Cw_O{O{qCa(bsifMo9pAP`q+rL{JIE*WxqQN^N-&^o4ZhJ`ULUZ z-ugR)=&6^otw5ja-KQx0(=s#BtyW-1>}6x~Uibmyu!lf-8r zVubG{?1SL<=Na1(I`)A?5wbcXv;OlDoD9nP!m)fE@xu_l9UCIT{}uk6z7d&7LLV)B zji_sGgFhKv@n;ICp_PUk!q@wupzxIrfTV};XB+ycoP2oY|3i%Xaku|BBz@Hb^+nE{ zkOjw;d)31~t8jQZj=TIGKYOVzdPR{_7HVu)XlX(Fc*eR}UV0-^+z(+klI z=CT*ywtXJYe1m8PvmZ{$ojJ)Orv#_+;h;EiJSgXAypAxUT{OfN^zJ(6D~KL9%oej} zAkl7k#$b$$8h4D08jO(xBT?gyQ67WQr3v3d(3Agh{PE%4N{*F?udiQoRoepQWECEZ zUm=|Z%CQrjpHX#{3s74jbp99KVTl`MRO;k%p2n{UE{p@)b@4gEu0kE&Dxq!@a6d+$(2>sx@raB{BS%&n8^54-Inr7#(HSK5nLw`nHfBjW z*zS5?+oYEO)*#>QRs``0lXD?b&VG^~NOS7r9G!eHSpys=@;BTm0n@2lhI0bK<#gjd z+i|{u!BrD;w?EDK7)SK zy-?yI09g;%`Jt~+j=>V7;SgY2=yIe!O@h>bvhKGV;vbHLjB@Eph?(klxOC-UywX*JQKd^+h#RVOdBmvFm4NX|rxG+ur@;8q>9|)q1!Am> zl}>?1>D&X26NNmZ)$K7RVf`a27d*zebMY@ zFJ6rrpx1E>I0HTAkfwSE3jvU#V}CL0}l20{fd%BVAOCS&OxC2 z7C|l>F8-1;qge0GSz*c<$E0Az|;8iDX4onrq)RRB~bUZkk$nm8B8&!VrFn| zKs3ksrrl3P`kDwMtQAv#*odP)tH;;FdK^8h$I-(xpo5W=(WeeCZ@Nr9tjQF=Rf02c&P3rL#5J8!d)M4-4+&IA?)}> zTKKy2uRs?ZOMEU)NTvsXt_5(FA<{GaLf)a##pf!)awE;O>VTra1b+1 za}vbWpk4!TXJz{YVRryC7|a(v6T~sSz>t91r3vC25J$_uKS9g^akP)-V@ke2M!SC% zUdMx2^br|2kO#!iWM&1$l^}lR#T>lLZUcryU)eJ#o(J(Wm2V}ADVABZU*t4x&{2d zJC^@2bznp@7^6!5Q+Gaj1Eb%YuxG0JuE!*aDIj8muc`wk$JE}vsn?BY&Q@X5wLTHq zK(oX$H061XoN;uv2Etj7`szo9gGrf-Y1AYqx)WPv)y2C-SGJE{f=#mOBCPxOPBcFr zTi!4H+X@xS{mQp{k>di{arDTFkcu)Ad5iFa{+NOT1T(BR=`;k z5Ep?cd?t1o%>z-m9-73IhN%=5fhma04_uAegL(krc4$QW0K%862mbE}OApIM=qz5N z4x=mjy1JPU?g@)COYs|Oz5ijfx&`QWgnxTW^!}~T8Jz}kSKOWe|EpwD(u3jz5Zz%b z^%op(i-n+GlQ4nk+uIg%K)puLY~y!q^7EgJtgQg`IttyezeQD|I0wX%GrA;+Q$fTC z-!pU!efe^~_!u;L6Q;!X<2dn+AZDJ%S<3H&n0a#p=GZu)j+x0X`9%eYnX;{Zu?<9w z@cmI9aGhKU%5<|3unND2AMcBfLflr0NFTh0gg?QbBd}b*tq(Oq^49z3Zx4vbyMWFj zhEl9PPGF1`Xj-nt-v-e+O#sYmDP}RpE=8za|X%v_SFsZch}A9sHSj88$>( zmqF)^{dd6811Q0|2(0j}+Jb37?tS<(cUY=B3})^@$w@$3Kb-$1FY0Zq!iU$PoA6cL zg+}}d{xrK=h`fCkJB|X+f}xpY-j~ouepyfi&cUDiL3z(wM);_Wpuo|pk*P9&2AVP5r=hL6u^=>e4_R^t()`i$Pod(P=6*|S7HAhxSr2HBfkzg zB5+F^TWkWsNc<0>);|H|HM3$)I83cjUAs2G3AZOs*?IM>*7m1yV8^6{%+NdW;IC9I zq3~= ztiVs6TnfWWYXQ+;(C?p|ZHqMDKTJo@jyI@Zj{;bQ+c(0W@(F&3*7(W{l(v#*O5R{ezL*j&B@DHsfDt9r#(4pKVM$pxzn(u-LlZ z%qr0pV%{;HF&N{S|J0p-V@Zwj)SZqGKkh` zpChP}%s>CB2wE55tLFy%(=kdgf!-P7!Z!|s{1N&+tFUdQJHn?;#5u#b?Jvcj&7ibt zYJ%ovv?U(33NOVIJgeDih4NpC4HXS=H||R>CehM?nyXVA@=NBf~-n^eiM7X?hk?BpJg(Xff&iV1*LR zpC!dx2!Wb~&{CplrQ_CWHHwFy+E^#+`&qy9A!?(PN?h)5luWfz1qQX@>LR5D?kx2m z!MYe4c7^D=m?|+{7iUD>cuE(cr?E-o1sM^WMnqbLKa~}3i?gTFcjn@x>+z3q=QO9p+QAH(MZP5ro1ipcj62mh`1uU61c*j1LLNjqV|k? z5Gvg&d=RP}@kCUlz36wogeuEOVU=!u80<7QgcoRVgL#vdl-Nn}C*i_n|>};I1i{#=U`~ zlTr0G^w68~q3l*}=233i>)>@VMM#eud~igv+Z&8WH-v3RUJR%TIl4^UeijmnF2bM7 z=nwBwDn{sYQ2Y5oi&h?dUCIjG_(@cBua43!XYPk^&8+i__6vd;N!Ra0k3dYzV0~wq zlORfnX%(y&>98mu%E2r@*-=6AxhH$Y=&Iz~1kf@l0xKkw=`&9f)oVq9@lyCci z1*XRNrz!j3EOvE~F1%mdR3KG~_w$fCC|kZwKPag#dVR@h(NEH;i@;hE2vmIsMNF(Y z!hK>0@?#ZV0?U0zTJKC)FL_$ndb4+8`w=l@z4_R-SWFD8*Et5?UX+2E(;KgW_uBzc zMNAY7*|pf@7mXeZIBeLtV3c9!Hg(gba(afXgPLLgO~%y?TgN=ZHb80E(zK7&(qq%U z8>Zbyf|M0D?F0Bgy$HEv)86(5em@Hgnf3<=kCCy1h;5N+FNbLxAer_jD6|0@rd>(G zm1&F3nrY`MhD^IiGHlw*WV*U(Z;_Z`+B)c&wgGCUU5X@>X;-SW$+T+}L#CY#?;2Yc znf3=-Mm*D2AXScM+B)c&_Sf=p!?bl!H|-x~WW%&|&@*ivG)x;A;wytq`#YHRr90h@ z`S{5=g%Kqq(+)j2I@TFs!Y3*=!FHd0248xUcX5-yzI_82by0r$?Dso%Bpz%KNVdB? z9g9i5bDwR&hIZ?C@L~L>z>n#1F<-Ns(4ZGpGO$_%Pq@$RoJGEhVu)l8~dze73p;3!s$#~#W&7)6XpLM}>`-ymvayd}zrZ^_$^7FWayj;reyM{EY zY&;u3_(3^wsQb=W4B2>zWd4oacR7+!HeRjLCL2$|Pmpk~$j0*|V|3rNcJORmDVAEB zXX85P*|-7?8`nYI#uaYZxDI+Yu7ie+7iGKMs5|+%4fcIN+V~c9-^C~yci;E!#E?Y{ zb>Gh>Vva$KntY_Zg2_i;ck+>ku2`)D2W`e*~xCm&Br38ZB1 zp?9N)UL--Uht7TvBQf&GJ#;=M9A#jrhaQCRr!uzJL;GKi1F45T4tX?U8a;Fs30Kye zg7*oY_2wytthZP)Y`sS|b8A8Gp}R`V=%IDc>!A%$>!Im|hO*u&l{Q(gz;EVw)|)FC zw%&ePMm+0PpwUC?pl7}3$;S=r)j{2QFOiWA>(xQedUa5@-e8p!F%V_43P0Tjm+0i( z82wNrGF#qaRtl!`T+7{JRtd)2Vpao2Z86J!4L8&lvwULI7PC??-WIc+GC`^oZv)*| z5~L1J-$3`1hI?DgewH9D7`+X2t&Vi-pX|=tK<6zCmIJj4TYifDjUZYW&?L7K`SR?n z28?HC+1n&Tc9t)he`7CMf+Uokm8-PL&Z-qdy<`eDS+Pm!lidGr^pbd^=ReaHok8te zU~6pXSA1{*VrD)9pAa(?clQ2{&)WY0^9YzR*&Q-*ysk2zDO`UUzQB&t4Fy7R;6pZSY z%ViqI)L93$Zh4!Gt9Q#f=5@;kXilA<*V6N*&g&)Ub<8w%u0$@qsdEh&HFd6$vAvF& zrp^Yarp^YaI_6+reOIk+Q=*|QiH5Z7XQf(cNGl>n4QZud)R0z*u+m+z6l4r(I;iRH zHW^pfosN0BGeCVv8z&_gL)wiJ^fX69S`B5M*3&ekWtYc>w8b*Er#TwZ3{VYe2BOhFFk^ucWWwopJ65t9byDsq>AX|y2VIOH!86{ueu$19P; z-lK~d{;5ts)ha~cm1f*eW?U``2%#u%% zcdl)sm1@_()1rf(Wf-8@s;-wpXdr1n3ci-}xA??l39@Yf zl<*~RAg^!W+F2V2CkL_!pAB?!9GXo=S4Gdch9$7!gYufph6M(Bg@DBD3|CqvTkXfN z*o=>3R$D|*c~(n|XSHBFMbyw8rHE|&P@z)9SSkGoT@ePT6k&j#)%rfgQU>zaYFDA_ zDI*3}8zI}Q0kiCk2%Bc!bDC++l*y(eSVVVXQGtE*Y5i`wA@=3!q zbyr%B zOOz^I2UY#FlMxL=H9%EA2B;fq9_25++CJs-HZiAL|tn@}Fa^XdmD1-RaFEf*`f}kpdOV3Uh;SIwq@rO)` zCIYG7w!mM(-~EVHSlrCO;)cHa$pzyrTZ+MW%a)#v-5N2LEhkG*Tek3msf=XahqF@Y zi=%3islGVMUd;<8{yJ#1_O!RS87sk5@`9UW|6kdPwSYNyGlG=6lR zX}JTW0_k~bR)X90ozgV4c5OhaUF)E1*V$QaP3(q1tFRJndJnbhN8B}CDOA;dO)!C9 zTvUSb)^s(Bp*3Ch8ut#b>4r;*w0lRrxR@j{(w+C>LI*wHfdOj1gM1{R)^sH@Ieu|b zt{7U=RZE6_2lvTD$%*0l4isqk4s_7-9Xu`{C;fXXe;w3)2hYgJhVMWJJqbFf`wkLQ zn&>qV!fUr~AXO77*e~kUL>?HgCW;k9HBlxRu8DzCqFxiDBxclv4th0VfLcvdAqiCz z0y_#gBec5CRSeZckz}|gCd)*Pnoyuo6FTVC#7z0PQ4>0-*Tf?-vQZN{=+%S{8Z{y0 zDr7AOdgKHGSZK6_Z6K6L}YXgJ`rbw{J zqGHkb?$Eeig8a~U?$CH%35Le;2#w<+$4`f!M`--cLm1|UF{NNU#XO@u?ztY9OHfk`uktEMrW(Y4myy&U#+4@8 zB8D2}bHR9(Rs=>>S}EO7V|O&g)uAzVE6^Cb6=+mqntWW#D_7!YS{b}b{6d0iCc)ns zx0e#MO5{=Ambfv>>mZNvBB5BzfmL`WO!y5l3qw7@|8GakxG3pZHA-WD1lcd+T!R*@NYK4xitsEqT|6Zh25_(0*~Kni}OHzM(%K=7HU-LYaRcMDhwgi0unM7tdLR;UDl#(>)MZp6(X~AEk#T z#fi?^VmD06s=_FN2w5-NEkd)k7_>Icdd*I=pVB}w%&cwpaiO9yv1~F(A79&1?D0_- zqi@>H?PZ@U2z@4k;jjHp`0p`{!PbNN1Bv(+!8O-_vfI_U`f0f45vI{RviE6pAz%jV zNpOmAqg>ty`|pHmSb*geZ8&${aAo7Rh)uT(H&395vMzXX9Q$l|>#7zR0?)!nLd1t(66viRY^={^Eq2 zA5k3-BM;eB9j`WVLhr%FL7E>Ob|OBkaZA8hX^x$Yu)0WLybI}8JjAj;zmb=sVYC0AXRR`p2lI?SoXcd$m|MgnucG-tKFZqhk-?tv8f?J?(-x& zFW8%4Q#YYw)GVUZZKTPFaL{u1K|O_zQICOJEVQ?b%Zismb<7ibl8i{b3-w9Vlj6JdxZW{Bzg$1N6;~f$sNjhG9tOr zxI@8zx1hu29jZ}iFGSkYF-}bQpFj)x4OFlSpR%>Q9basL3h-T9B1xhP2e6@8Wv<5F zP*A~8%P#xbZE$p#q7_^QXa7TJVCv#DS6gYJCU=@()>uCpUufLqSXW5OC>Ul%LSNhv z1IgkDv=_un9c~>NYI7*5_A^?pNN)uU>);XumQ$eu!5;;GcvX>c1lp4FbsE0;lk3NR}OI_4rDpqGi zSG9|2l(1z36G9inVfK&^jfEH~{<$HJLo};!28{44GQ>M9yUnjL^I}6Rg&}T>uQM{l zV-969A~ZSP5buS}eGo6;e%RazhZ10S)iTfw*(;b2oBL9G-m|&IhqAd|hqAf7+T+~$ zkj>#Ju19Urbq?C*acHP@D$BSN81+6rmH-v}YPM~E|Gbc}sG(o*4}~3Gnt|!V62(ua zC5i&1g4(=rUBv!-)}eKcTk?V34b2wm?i=V6KoN9J6SC4ZUy=wTnbuxG`^Kb zj7LCAPsA@%-fRncVrgp&M~K;?A86?i97&1k9Zm6;_A}$?&mN9^UCzH6U(cJ>G9>zg zmgbvz)8!A{ALg^pmNv5j%Md;YqO$06>WB~JErJ#TEAS@?Dp|4qfr9~TQpA+ziH7M0yjhEc&BJ6NS zENXIX&v)mX>iI*CSk&_!-iSrT!Z7B(vR5)0R3lb|Myzr!nK@F?I2J!r5f(pE5vE2e z`-0zNilkgFiQw1gdTZKc@KbzrREe0?q}^02+bKkh>@+YpSWe`0FhyXNj!TWU+X*4^ zq9J){+g_m$w<^T_P9i+Z2lr>B80+p*dTdlAvLAx05boUAi8MydrPM>s4Q&v)7&VuV z@UjMJ(WB#QZf2^z{qSp!_vx2HR@>4;*O)__EUFNpR!zxiguA&ym4y^jtEL!qYbx42 zIX1JPZoKV7^`kgFKs_%A8+@>l{h3wB~jquaFjd79{`!}@3*>Y3xhwtZ-mr3|`&cyJ?ULqP+12tf2BwfD33cUIz+!=2n{FxQ_ z4l|e;I}rZd3XJ^377eNq-i6a|A%m|QG55q_5No46PA^{&J$9$M<$fl%ydrAX-(_O# z+}TfkkGyDl!OorN1MnNGt0Mx-S48cPFEp`XGZLfG)dNj%(6LT*^f@M0ywZtw`%;O+ z)=2~}`?g6qnVN{a$lnT=vz@Kwk#d%LuXRMUzSqOM-(scS(!#D6n{D&=St%b`okQpZ zyo;Xp?e)_cKO*ubvRMr`)MdNVBiSfhN(MIXRHQmb1@I08;bC_tW=GEcG$@L}EMIYC z@+J%0SP*{x2v1~qdR${!zR^iOWhcIOqGz@=iCjdDtRcd$XG9)HB1H&Slyr8w!tY*= zF#Fw~A-_8!lHYy$7w{?}On&z)D5DHv^1GjS5#EJ7xPJGi@a|k)tR45= zd886+k6c8mnAm{#+!P_aEH}ctvs8Rq0C~H!bg#QfMSMQ>ycM zsIwRhsdGKlS&lGmKj;q?)*wtO9DoP1v!n`F)S<$yNFg7QmVXg-X5)bpgt@|UkU}{a zq~K&BT#fJx8_ZE%G%Bp@*eL2>8pFsImw%QO`V_DI)kPtGArLOwsW8{= zxcswh5xo~VQ`eaYtnAn>dZL!hallG1%!*F0*mE&ROP)r%0$xRmXcYCPE;9Af3)92>HI0zEr}eKN-Sto`9u;a@{!yWeVHxTo zY}H(=wc_zV{G&FUP@3opqJe0v0?A#md`)WPmk6*UU~TQ|NBW_dxfE`d?hIUjSrNho zJuJu0(h5NO<0F{Q*Hq1*JV`Y?U?-x;i|wR+QxTpM-(?}~^#?G8qV(1_bRI>MsiyQg z`clJfwEmc~OkL62h@8@t+fmXzXgYZaBXTzpo_&ahWS^^58A&VXQ&*$|E6d214XzS^JU|*eabUYd7GmG?~iU7p=f^GL^OXO^y>z z42g}PwQnKCd*OTv%*G$`LaiNc8R5UfJJscK;DywC`9w<`tVpj)GeZcG+i7sy*bB)= za0BO`q0+s_3J{td?){$#t7*IE825$-%3cykLA;@AWJv-a8IUeI97$@M1!xp<{} z4QTKyCayhfq&D?3{D=W)Fb<`wEBr4$8|SLKoAr4Y-dDG%mna5zv78=QG z$#>Kid^E-mZh;eGc4~^J7D*?(Ij16Kb~`+lW93GU+m5LtF}oW_zI+4kBN3+ErF#)p z7j;{_9d^C8mS&K4mrm9CCI;1ZSo`Oc*dRx9Gb9+Xhik(Nflljy6B?>@WdzCv+}T>0 z=oQ=G_EwrbCT^`ZxDj3)w$LU6yja_SGa2rEJ(fO$Y8mUgBfXcngCUxau2?V6rWjlX z^W07Au)wK!%MWV57R$8hu&lp>n0e$ETl@ebM)=1d&Jz@`KjQt2K!<){@b1Ug=|YI< zia%F@+K;gj*+0}4T|gXpDgtYXp~!F0v4Y&9euCGMwii?sS(zgy+PuA>Vo0oY4MCo* zLUKAq$=ReXv@3EtMak);F2drSPc-Lf8|Qo?tXBWaVC~l>{}tzx@wx;(9ZG6;zhr*# z-7jJB-7jIP`wb$@*L3{Fo)Bo1oj~Pi2+9dmgD{*xkqp>lZhNd^W;Bd+K*K3QST&qd zgyS0y&0K0V90ubX4uh)U{3Xt&O3G&)&L(4kG(MYfRpENdYAw2GMqO*s#o!^FPSh*J zJDsQz#yg$`ztur4VQp=3tc^ZKXA&4wTLn4Wa|IhD6x1#%a-3 zS`Wml;VV+@mo*m_uY2PUg<-IchBWlhYht6CXxyx|HYVe(RZX=1s#Q%4sxBURT=Dbo{Y!H~!J&2z|nTGyFU8IrrXIse*?GP#_ zVdtO+p)EqyV7whODIH@wX4Io(4YjriF{pOT7%|n38GAqdZkxQwc#vXF=-W83#VNjI z5eklqMWq3z{kiz|;RC!d%tLqPja zb}quJGa^*6xd@{|9jeeGgsCF=n6XkYwJVS`6<>jbsS3=@hi`S=;E<>oX=Pp^ci>fA zj)SmA-Hd@5RPllpI2W7wZU-UEzS7JF*wICksfrt{%v&C{1^G@ZZjKGI*B}Y2koG9> zt|D-JwZ-4~Jqd*U)q4_P#)r2j;osIb(9|J*Pr{$-ZEGOVDx?)^lsud2nnLN6bhgRE zsV>53r5a^Vr$hA2PG|D>k9uCyA8vI+-mii&Ugpd>})Fn`gZZN|ihe5n=F%%QRi zVR1uc4zT#4lCWAsC4sejT3UU@_q2qmp4O}1wixoP!V1)H5e{moxHqyG^;?3%S4?lf z-#%87R@BFsHN>c|iL;MJgH+$Z=Y#P+#w-CtlW6(|UR~s|^*+WlK=o~-0jf!K(&U}+ z;*)Ut7?Ye-)x@Z;iL<-#n+<+3QG_tPnBaF1WngN}vy^f12kt64a`x4lXEEr`vy8VU zG%@*CJzjXNsGlClgD`#3z7xAV)kUG$hr`Ib_u;TO28{Y}SVgBnlT^R^0TP~mD-1%vTb!Jz(`X)fiaul&Njh#2*msYo;#;NguQRLYQWG;icj>)?j{*Nt41>a&a-Neg!+c7T&2xt)hLF(;Y#W5=8C`J zQc9+U9_9Og_koN?Uy4Bjbzt_T)Un0)rGIkS@z45F*Iye{igah2m*8`nD4n~aE}m`9 zcK5LB7>;2vMmkz!s6Ff|9$~dyItufJO)NJ!3?XBJvWQb;)JHAi~5rQz9ZRQ_hwmFR6ouG}-Z1Xw@ zFGiSWn^lK+#|1f2I^;rKoe`**YrZ=n3};^a>5;^Ecfu9@zhJgG_s`d~=fWj3u?i=k ztL=n09u-e{)0Aqy@jhFi)S>!^$}ug*HE0;7)aQ?aRCu+xCfI#L&d>Z~IJR89k<>*Q(ZVzcJ{ z3)4`_HDBaGvI?)KCa${)TLP|FYG(7l(8GIX=w|cSm*iAndF{-u_^)R+v-*^f>kfI? z%6#e6kn0YaV`YxU1fM7QORU)W;-q1#a28557`uEc`dChL(4kZY7}V+CKt?_ zg~`!IbVFV=8C&!25z(Z0tbeLKc}!fq##X)PvRA#j=1q&!|EM2b{AkQgKzIB1uOIsO zaTDuNPSY><@?9JW2~W(K0IkAK@aa3NN8)@l%JNVv%Q@?_fG7piH`QtwT@{za$(b3U zQ=af7vNSgdXCH)A(sS6}=hhLo3qLp*?4MCBQ@TuAU1ZTx{ zK~VyxYe!$up8ar4EX~im&cS))Pds9RJ^Cdv5b+_ka+29HHL_zawh>XdQ+iT6WG>}+ zzvyw0zHy+d$xxK~!(W4<;!?}}jMFOf8MjN}`rV2vi!0l19`;A!sH_ zno$>Hozg?3A$1WJ)0C6-B2H#Q>J^i%1gG9ed>sphC*zYKJiC`%i$uOm zvPB7)liFr;<(4Dt6{Q+Xt)kFus#Z}5^olY|%Qorrq@x;zrp94C8v8Kyu$#eJ)kX8! zzNx+@(T_E&p&{|)0U4obkHv~jSdVs2V-a<<$7zLq@_CW)?|Wh*8M}yDD=yD?+@`Z1 z#?v3CJ6AmD8c#}ZXl|A?o;+fd@f3rpWjxdn;T13AQ@QDjVl_rJ(%1I2)+%8o z?plREy%Kd_3cqTFdTLU5!i?jjol3u7l$?XgptGf?YP+7vnXx1b-!aV4KuQN-Yx|O9 zlHgwSmKWf0;oZ>~NHJ+2fqj#ey>!h(Sq|%^EA3{e zQhbWAF+mVZ~`nID8VP$!x2>(^zc2q)ET{X{sMRDFC{EB3&wQ8I? zty(qC;2~<9swTe135$QtPT0TjZ3mg6`nKcw$+7N;nkeci!+8kr{&G>IB`qu`dVO5A zcK*G2c>f`~4BoL+gr_>g&BgnWO2K&hkSd9h`;cl7Cimn2x_wAAx%!LtAw?%@8wsd_ zJO5tK?xgKxBCMAChCz1U2>b6^7tEb?E4+<wC6DZsb_0^(nRF{0(O|$TN-~eoAViB zmgh0VEL)}$%o<`2WG8YTX2@l~6JUr*?dKR`rXcZZgry;Et-Z)GB^?p#V)_wv|WC+DDdpNZ~{3)wj zJewPlmCr_SIA-7Fs-#%|VALoM$2=xi7-6nv{7OTe^H4>bJq%)ciPjG!l4AOLO-yt7 zfMR--CZ>tY5g-!jifJo$dUmwtG#Nb#sdGG+&pY@vGWQJ*3o8>8+HYY{Zi3LRMZ+}# zFptpsFa6hM?`9<9$7|)5$eA7EH)?G}3Za9ViRWa7@`pItQFqBwQtq~MJF0W6SOfB% zy*moQ6INRQcxSJPgR;kpr4jay6{{hjjumSF;2kTbGN%Cd&V^G*HnM)Kn2z_36;nu( z7s!tCtTlxscd8RrCuwA2(#!7F*3 z*YN5T`$BM~pE$MBZ;2o$q0pKZ@VwLl?uQm2edXRZtiyr~^IuSWY4XEXU>yvK(P{;kH zYBZLsCIFVRcto#yBtvarpibuK8?tC}J6LB2>x&Bl$nSA2~=8vEJQBRSwWoGX2<#!Zqan?@_G z3xeCZLHRm6W=2c6TD*%({LQ*Jh9d2@{mm)Y6Z}KvBl$^)k7IaVYKQDCBL*oO*pgS5D?`s zql^71x?wc{>5JI~r%vbfvRsdd~O#EH;NgrM5F6FC3~#MrS=g+{FxoBaF$^HD<$r((NQ2l-1ipecQv+aj+9-;B1fU+koU#343!(WnGmI%&IW)dDgypb1fyHzm zZP<-3)>K8}=ZxLhJZXuF>FlMA9vCXNo_)rTH16Z})_9S&!R@&IY zcPI#v&Ym)17enZ!4ntLjpkBNQw;Dj@QY`%N@a%d3a^Z)LS1m3e@2pK6o^_F`Mp!nM zep@VUx)Q0k3z6Od(+JClNZBs(nCyBtF`F({%_?R6IwM!G(%X7*= zq{kaR&oYz(zF_{VeyQ$yC*~t8A0oZe!CjnOqaEy=4i1#{U#+=0Bvig+By4&$wxObx zZ^Ha5@4Y?(UU%x=>skO1RljxbwLRuFICdgVkw5r60M_bDOgamKui6ayyucYpB%( z)G}BdfShG8QX{wwMx3?`*2wSFGFU4CwG5UTo?Qm3M%Y^hs{@d;3`Rkev+ziyT6lC; zm6@hmRc2VND(|2#gV|iSssc(@mFriv1h8&Z#C59%0M2@qTvTo0yF1)PRk5Snx45X9 zRsa`OYXEqQs`UWWqG~h3UftRNux>V2%u_o7z)E=$SIVmasJg`UMO3nAa1oWbb-9Sz ziu{et8{i(E8QpZJ!##DVLeor_dm0HS?r8;(!##yaB*;C)Y21_88Q&@HsUo1brxt)( zfp0+Aqi_p=9PXi{$l)F$J&Nlq@DxkI6?lmYtiThOU0jvSB6dNoXSvLh1|S77nWaVn zWR`jW9y)2{9PE{A!lQQ4-uUFNAHpqQr-Ko0Y)g6L`GcZzuuy8=+mQw2aVPc6b8 z#Tx+RFwY-~o;BsZ(SqEY?opCvq{cjH1xQH)z+;|z0E&5<5%#Lm1|X*@r?`#P ztN=1k8vt*>N{z`fPc_0G^V9*zsmlNT1J-iMJfq?2CQTI&In2|D%3=?@rUc0FQa<6+q@`2H-JI8vrGFQgFcYs!|Q$PcqMXq$-QhY#avQS-a%)K64LPXgU6x z<{M^OvvyHpHa(7&scCtAE}gr6ytHmZY$J0zEN5@yujymMI#WxF+F8?buw@*}y@?~y zK+BC%>CjdMz;kA(1@IdVZDzj1ihtL+p@E61Ba9JNZf@cz_6p|+<21r+%DJHiY5lHq zLjxk@I5yG_nd9chhFRCn4V;ZhH@9eaZLyQZ1yS+qwLDF>MrIjWoyWsBeQH?$3by=b zFzA+P3;kRhZ~DwAHGkDsg5`oa7y9pb3A(uZNR<%_{rhSQ{lw)g^h>1j$MVYNxD)UE zd|b@LUsIc5UZa&wa`>0v@VoMHxYfIfZ0kH!`@S8NsAi zBI$?nC2envq+7^`E71*(WAc_9sT61;f>hP@^@^j zX+t5Jjt<3R`v6EC#>31?i;e*f{Z!purl9P7~-U@CKkd5ggSgS>hO~IKab0PMG}vy zk6Wh%aGO1kJutek*qPLh^t8kb_7 zxn1Wt)MZBR_+o9755)+rL?_;YR&XEU{)~ySS~h5CvCCdhI1QRc?oCg+4O&Z}{SDg4 z8nnB=w(=|0po#Ih4Z7y~t3CU8EN&nRS<|iWhR+Cr)=;Tk37{Fk@b7W@mjKX4pi89K z>^>_?d-Bon7Ye(Xu^{q#qno*`b0FsP7(92-*oB`DyAt;e^06jp;|ygyvliBXcy`35 zk1$Ht+pN|SVf#0|3r7615+U~?QZnMCz*sGjb7p1>#+bwB7j`yh1d*)50i6OdS%nV* z8F^KJ|A5{_ps&pBPB z8o4(;?{<-T0`2c2Ev!MiyNCeWdR-(A7|$=Bdd)^rziga!g1xm~0cfY(J5 zwd(E+UoMk3zkpU;LESzKDEmp)GRz&ByC)zj@&=>^D_tsNm4@SM-~R>^D!M z-$*UwMW^4?BKM{ix8F1nSdD(e8nnOPOw{`gfz|Ifl*K_+kT_Qr%oT)-|H1~XVO;{c z!e7^*{a=bZ%HvB;gVrPWrkC9YZ6?tE25n;v+TEb3Nm_$e6IhE4`pRF}pmnUvT4+#b zbMa+pPfeB(4cEho3~%((J;tD)--Vq z9E$*W=W``abgis(6RT1H-Nb5Lz~@CpH|d}k6;-PoFDfE)yr?A7@uHH>XAQ_gozK;x z^5*$m;v~0JbRJ8)!2gBkbNR&MCa71_>w(@xWR9MwknPkHYe1;g?@crY2G2{7ICWlv z2%YjaP6FtSix}jQvhRe9@>jO89A$A?D0>)(vxnj<^foznUK+Btgjqv9^x18C8@+BU zw5)m*8GthpX#wDAS>oiisb!JpT`_e;jkfwO2c!Z_Wi=#6LK zamw&B^bL*iq~6qIM62l<<2B&b2;-pM7_a}XLwF4w&?_(UYeZVVby=|7?A?k8IaY9* zQ*x}}G#2Gp!6nk!;s=80mjsiryb(Npm3Bc6g~i-cwlr_jEU3hd8Han0uGIEJ5b4~H z6WHXvCd6#eX3d*9?OfV#(GE zUWnzjp7qBUV#!1U7h(~Ydm$Emkyq_PtRlwbRo?oAShA$@LM-3?RI&j^IQLW4lGg71 zR1FNf_fxeXyr%A_Y7GjF5hd}Tv~RN)wNJk(hrL$|Rcp zi?L6)-Vm8%z44H`^@hkC>y1PPtv3=GwB8V@S#Q|6)apQ4Sg6{zRj?}~lnD{(=+ zj5w*66>)EV3sRbE82!wIW?|zHFgJ{y;g4$KQ6eikTPJH9H|1D?3kl&pXLC*bbR>rR zw9RLzO$37kFh(STqxu zSlHd>HKC%;DUk1?Px`a3o74AM8t?Rd0>RVwS-0HN_vx-gtlY6z&+l;mfZVay48Ys5 zC(ed-DzIaZ3T{=%;4H{0Sd?9QVMwOJt(R5!u=1orTW-Cq1wg&arcJHE1$;I&Cbs5m zYAr1Frz7n5ImVsi=1rSgS^>1F)wqDqrbfC*6>;@8WESG{oDG>os@=l+wo+DF=A~~d zB{C-kBE2o0;!oa~;1_Njm6|>e2sa{g6lD*o&q|2QnUzRna8@Fb!C48B+N?x``fRN^ z%5YMR`^H{zJ)^z~WqoL99LDL;c-8eSxWKx$r`YLn_vzshds?m&c#d zJbWnDf7=VGJ3ed1XI!b67VtQt7t&<`oa2S`KD?0H_!SM?N5i!vH3a|++wZNq7t$+Q z89BTMm!61IUPv8LY3YSDDGcwOi{XFL8*k;~5O0Pe9){G=^bIr$GNO_B1@EPWa!T0y z(s`44)pZj&FZ;&v8~P94$kp+G2j6sh&DE>xgKui_MvhaLhna|coYX@9gcnkMjq8PU z73=X#1~%3&Q8ihz2f{{qjXJdYKL9Fm?U2lWK7b1W$R)>x09FE!xjYrl-u3kmGBYxr zk&ShtHbTsNYQC<4yi_Yn6)r@YlM2L5nz%3|1A=VB0}nBxG3r2LD_aAE_nVCaq9dd z^B9fxlt4`nh5c3;BG-ld<47T&?NA#d(}z4;7v$N8!LwI_BkRbs4+nUb<5v#PO5|V8 zvyC3l@?H-0(9syBw0-wyVDF16w z9!LJ?$f^bF8-2%1`ff}5UZc^M_MWCEK;L^o-v-k6iS>uREqUoHS>nk6eTmE&3p}K* z3lo{63rl2B7naDNE=;7R3wvY1mB1UBT}j_tgY;bl`aVMKi>()Qhvf@#_MaG{G&DPWPCo?cHFL4*cFZ};pz^ei_ruS1`f+VPEHo70?X%rly9 z0yoI%4uSShcUm}CY4>zTAa`%NlP0kG)15!?w6m$i*B}d7Q|j#v1cG||I@Ez$P#($m zw$$5E+#G#f@_XRcH{$-Exb;o$?@zPZYv8swn`2)M6N7$kbJesS0A;aFU-xDOPzJXF zpzO8j+nzcP0A#LBpZ013khMkhWv>IE$yj?ba%cpuX&Q3)&k1l010Zww0NXkeQyn0_ zU{$ws#4EX-!+rYTKYfut(YAF^ve0M!dTm<=aero8M>kmBjLeYN-T8WhBN3`l_@3$nAJYJ^w$*1|MP6}YvKxc^6PEtHa~4g^^f zvmhy{8krboKT=Y)0`MeN;zAdoq^bhoNvc``N>VitP?D+zKu}VNe<6qIuB1u>@FZ1@ z3#{jo3f56bs_P-Cr2X!8M^e?ZT6egTs+B&OlALA%ZX z@LlktUOMdrFT0@6-JdwMwlf*wbw&$FYUTe6BGRadH6DU1NyMNrA|$YYh6mJ~(cImrZj5y^6@3!BHVs zeQ=D?)YAq+{dIabP73-@StRJv(eF*yALa$Pbd0UGMC4HXG~jREUPg%jBf~e1iYtx~ zV%|6mrlF2|TO!;KKSVXX3l9r#ZQ&8n!pO{=jSFjk=H$$Mr2TtoIA*m4kmi(7u`s{B zIUAKN*t9e}*mnst*M8)=cBU~s8&!H-w1)i`9}_9h?6yb6Oi{yijCaGOv7rF!0bKKq zZC2gJ@;DE=jJPIdq~c4C%xX47&KuV`ez}I@-lKW5Iz^+svjrfodE zGY``;B8jev8wqom=F&kViZ{>{U9zbX$!WWFuBMhT&0$xByI7Y7kgxU0r&dTe^x#PC-+|V-8ob5k9j7%fy*Qf+;M=oD06F}~ zP~41ZZO)jo&1Y%N=(YKS8j@YXodw#PpfqV@j6Ay7Gf;{e0On?qa{FlqWN=Ur9I`)dtZj1;{B@&Zev<__! zpr7objR44g(gnO#0qmlQ8&*-zB>`8ji&h~E)kSOF?4+LCpa6E!78me!QSO`l6J3-7 zIj4gWnXikkzMdQY3@)=}IJ~dvOE|u6i@;F?j?m5^_!gNOnVx90OYgTu)6Nll^F}n> zjcB7?A_X>&l}r=(A>3IWFIhuC9WPlA;L(}I@pXQ@q{U+j)g!qL<+Wz*lI_w`%m0yQ ztA(Ef4SsNm(o22xp`^n|&|xwecyz=b35Bs%E13?C)-)*uH)b|Sc(0>e)X_v8dS(X^J{mt#x7x`-CFI$W;o6r> z@dECKs~lZm_y7?aJ+)YbmR1STQ&oslRU`BDV{viFytsJeL=o26+7VXk=;;+euGdf<6Bc?mc~WpYat_i^mnG%7JronYSsCCTYNs% zcHXQQ5f$_BC!JB_MO}m7KeV;J@)Zp*a8sdPNkIytA`9O@3eaSS%q@$ zOEb7rX)0&l?jvKWol4Qc%M~7cgy8)7ouiSGY|o(Bng4jl_@yY1df0{LKV1@^`%*R@ zmDEFjPMU`Y&naFIv8+p9^hX@m-95%I^vkvy@u-~}nJYnrW3Mh1^FI~6RgV1J$b5!3 zUBGek>!ILo*+;GJ!tRc{>s$HVRHHa{FfXs4mU})pS$W_UCFX0-XUj=k&XLp-DUYO< zC!^FLt=~N#ydDv9PDY`m$~hT@^VOV_Q6w_Y<>w^#!0SrmRe9L;eXS0RH|}@Y)#BxJ z>S4huFEF}VCBYqRK-xE=zciyhm6sVkV<*0Wqi6se`qJ>&=;wq;HSkms+d2qg^+<_) zlfkyK3LCQ7P_?bR+94hdGyFgCaAP^lIG#RnL6>`or0GF_gPA`jk4 zGb|6@ajx&K0gSJb^7`(20N(vI%>aV;*RUmde~tBtc8#(`;vO5}yP=hhwrbbWa9xpC zb>m-dJKkaRwaSC-2&C^iS(c!3vJuN)EVEOv)lN3bttW#0>}1p+D^kvrBIRs|lew-) z8I@0@49_Q0w$ysRCsH;FAlIl!X=5w4Q>2_V$r7ns@Et^oy==TCY5+_d3Jz zN^CNwuxSO5ygp*bH`975n=L49h|7^S5}B1YsayX*+EgRLdM$18@hRoahCx21ytxzd zrVcfd^5!CR%|-x9-n1h8d-5g~X6hRn$31K8|NBJm>u0f5{0HiRwAHt{x z01j@F!l<5MO&B#hUpd044S*+%Qn0A4AHrz!U?aCv7*z(Fl)`9neqq#>aE2S+LyyZR zA&83JcJ!NlA&g2&oVRI8Kk7GoLKr1oq^IAEf!t9@PZ;eKKxTzeANPBoezUoY^yxP~ zq^{poqpdt)bc*{aH7`%UdCNs|;Oimv8_J(Len(+M`O^%*lRx54P5xZ(eynRdI?j_n zK4ez@R3R~??aa~&;&q2wMDXO#Y&V8a+xfDiLwSxnp0?vdYTC|nHw6-3X*)WO$~mSiKOwhHy1KJ9 zcs1tYJ#~i?CyfuK_@Tt91K>%V766{aNzKYioLYoE5;r)2BXJtEoIQzC)+rB(eMq(U zP1wIc;Itq`DR3H5M{$=ca27z|qyZ>_Q^T+(aOwej+D|h8PvEoxPy**Dt+_qz$A|Q^ zpVQr_KJ90UiONQUd@-YsAm}z)6$8BvQ%l z{o|jL0PZ7k<2Sb^DFpr#muN9Iby2h(%jZ7S(a6kuFYZ_st}yLS=Lu2uA{zPzGcK){ zbpSl;WwQe0Dt(LdMjqc<1wh#u>)aQne#k=#8Ri(_iOjJP5-Dwj(oWgzCMNF=Z&NAj zcZXLZ{-3Z@a@w6!1|q$M0N)BqKfGBZCv+ekVGsBh7z=OLA^2m6j@mm9%E^e8|O~D5*mPPg={@_@OhFCrT8O4CP5{ zA5xRn3eTZVNoyUaq_vLoq_q#Jq;+&ylDz6X?7;Hws`x1Ff+^Z^g13uF+`yrhe!CcP zypoh@$$msc>|}ru=7^Ar@KrHsxeIET%0vlj}I$vG&>bP zVc?Vu01x#n5cVUGs%?BT&D=b8*HZN3SEN+6uSK|;;Rzwzy70QJC}1NQJB8v>(W_&O zokA?XJ?nX=89asvTX z_ErFYuIyx|oU)T)f3NIG(p^2QQ>8FV@ARYC3ei0R@lYewd~@{b#OtW}9jH@>U(h%J zX7f_C$F(^jhrKzt6m3$_*mx$4jboq9at9;IV@+A2@Eq8rm(ebL6l}LIpQ^dVoQu~+ z<|WrcSa~|E&r@Ktet>psL=Gomv)+w%YuJ;+Gk=JRSMgVQg=vIm!A`uCwqn?WMd&>E zF@`SW4-Zl)zXm@X)Jg|M3=W_2;fj=zx$0?! z&n*>IREubha*yP>4DYanF<*B_j6G6X^S`sKtN$CIYXBUn7Eg+@aUDx-AGG zWf7ygrB?Qbhr7jJT%45*{Akg`-J)j%2B>lG;}qyaz*SW&$->@t<$nrAEyEuh-Q%Zg zE9o01Oqmzig2Vv{&ImAyzKjzr3-Y<%jmS(=BFZOqlkYe%!c&A|2!17G;tA`1(wNbrjP9@^+ zX?!-8iQZ9W>byrTedaWHQs~Slkz_vekyo;8I@pbB{-mWTk+==k{6a(aWz0>0yh-C| zi5!KTuAG!DDo+CGGSS!wM!mx|3onOLB(O35#a@FuLF!#_+TsG~@KBAgoIh~NQ0D?Z zjhYRzMl@*fGXnh>KCMr2!ZL&W4cl-97*vq)w_%HUssy0?S6I~Iew=NtA2P`3fOmtNpfw~aKg zT2S_3*cO?`JKh$9ugrMN;QIYY&ZID8riSj3$H zj7H%b0W7-2=pDaGlO-e^h0aEr&>>DLL;D0GYC@-#DX(RrV^wOp2KC5Amm0mSaT+&B z>47TZoyQH^0WdP>flLE$0-4@7?9)M}#77|02cXP7AX629ks|>dNSzVDqAT4tZs41B z*v3c7!p}$HH)i3#G0Y24c=b?SD*YB(%)_XJdWamk2P#7axP_Iub`2@O;^TGD=0|DG z%bK$`tg3X2^BQ?FFh=HE(1~tXr7$*K1v;fs;L_u<*13p%fu%16T`0s_04yp&BhSbB zM`}5M?>onic}<8Kgq6Ei1Hx;_T}ukfR_3#Ig=PGC)K5Kf8t`jLe5p3IprM5}%Zs$B zg*3kWu0M^|z4nomAG%&yfnAhCgmuhrovI^(pgwn9mX{AJOkKcUBv4p|-m zS$J7k>DeK>5oBp0SFf`mZ<9Ll`6rN%IhzR_bvTQUm-%RregK$&JzCgFC~ zHd3b0)i+X~uJtY?tdlem#1?01@Xu@OQvu*WYSc&ypDP{VQ;njQUgZj(1^}M$X=5dn z@TvL?fGd3J5LUvc8R0c4e8lH#opOJ@@YzpN{w+{m3ZH8o;gd#HORsZ1)hHp)&i(jzH#P6 z4GfR(xK?cuq)^elu-mjCbJi-`5h`F)H8M+4`@u6nmu?89Cp;S`<_f^^jXePUsbX{OGJ|!^9SLuCnF^aGO=L&&H{FsR!$SV&sXv;!6Wj z7naAY7Xvuwb75_)ne?d7vrMLL(<>oz0X9bKMm-{PjCu;`GwLZMJ`hEZfH~?=aW;CE zIUGf#^s~4aatD~>im-h?n4^*LupLj%1zSli_yfuLe&TBYYke;0_2e4V#K`Q9;%>>} z-WE2mBrm(q9{691L)GN0uZksoAu#KsRv%pUATDRwgGgltv=f)99n> zp)sShAc9rX(5{2DuQrfh9rL;S6}F?k7W^t9zv68t-Y%jY4}SG{?|!0e z^6{3asI|o7DZC6leIk;-5AVG1xfo|;D3aSDgUe>0ip@?a&caf7FtE5@dVOVjl+mj$ zl%p?dC8u?5VVNz;PCCuaqdW58j=4Y{ZOr4FfRJA}ps%$&fZObH1GOyM&%kUix>PHP9EUb5k0*}F($&FjV1)xXnMa(>pdN-64(XP+RiewaY-GgE zdq=+s;{MiKlwEL{Tj(?jO--BnmV7wg8<}TN=(2@q-;on7vG5T@ify9R%xT>SW_?k{ zR1d#h_ylOYKfaP*F2tAIA?eWs%#Y-U2EXKhyYP8@Sv$%75}inH$t!zLrPZ3f1;@#s z^U*j9p`Ie9@}BK0lfxn^MUY_-BYnc?}l=WaQ%^X@pe!k8xbCP{RT1WVXX|`*fpxFVXOqy zu&AzEkx8Ii;Wz&MJXuKjL+6VpD+|o~NBMD7j;x``S3QhKB$lZUX@KM9nZX5 z3EBui5mYS6610lpRUl|zWatpoJPrA%heK?SucEyzPLvWvDK+r zeJw)2T22xv-LdsnW;6EqA?j~tB6FHqA@NQ= z@$<-&?!y8v{MNEE!Ai`GLXyaV+3T50!711W4fdB3>F1(2gi<|dyU@U9*7LN6CLwY0 zR#)?f0GDhz5?+6Ql1;2KWUC%2lnU}?Z~jHu+e2T&A@i(t)EH=2p}&fyVKL>akR7{! z3ry|+jC|UTUZhO`=_k@qVaE^Ch|E@L=-P;g@7Gx>U7w{$!e*?zIe5abW#4x)x2AHIy(ZQUeUG7WH88F)3 z$egY*FvV1lO{0}oca4E1@(pwqK7OrjDKKEE4_%h(Zde1f#wCpw_ApX5E6_|@l>bGI zYUU6aIsFESN1^@IBiS!y^eHMuYqhb2DXb9>2{rkJ)8Kh3d+U~l*)Q0nTcJto z^EK(c`I@xix0+Oh4!a9yCUnP-Co4FF8ku*XjwgVA_RRQ^kFhnKhXVE4vuvvr#t`+$ zc}zLoyuCCW-K6UmaWS1~TpvGCOQQqRxWTr1YiSTSvbQgdEu_ra6KT*b=h?SnXCsYz z%zd6+0;}QU7;HHY>KwA;jhexSu3IAyO`AJu_8#J-z2{7=7ZWM%J-2Dyok-W-6a5ZZ zsE47EhsUJBApH%pJ$w}$1lVhS+c`q_vL!F(IOa&Ck>(4fz*j!+*Vo7%otr-u~S|+x(=j(TBf=qHRYNIvXZju&1 zffiqo7PAfe4$z_jC4F{|+jK1~_87P6#CPko=?;^{9o7~XU$M9g40Ep5bfejH3*Dwm zv!vrf6>G#fxQ2dqomKi={8+6i(TV3T^oUQ z*XwFz(>;me-o)arFw7UVrrU!}_letdsqazJqXSLHQF3(*oYhQhZ8zNlt?4*1Vr{gh za|CALmvDJ(1TB6t?4_VZ9ZLG_&u-H-veYEjZ>w+9Wn zFM#x9u}^cGu7$w5YdRVbjLh>W?yT7;?ud{bo`+ifh~i>2wkuHFG=Py)+~U>{Sa-#B zs2l$u&Oe)j;#P<31d3bF;*NHy+sqRFOUbl#TU>{_)hO;`EbhJ`yBx(${ey`JLE=7)Yxi_jK zA4(U@*ikQTMtpV%CfU+H?5$lmHuL|wYZu=S#`}d^;AatkUTUx%lYQCq0GUFU?O`T9 ze1a*;CgA7L$2*EHyBU#g*W2O{{B=3Oi1fY57RTYQOPvuJHz_Kv$6uF!8(xN-%Nd!S zZYUOwA7Nk22+wr-U-{w;ym$c4Cd9PcY*btmJ)I9#vu{o9)ucv+2xqTYHmRw{kR1od#=;1z!;flQHNd6E@ai^ zI(7{8hQpAGt#J9 zw7(JVkCvCkpK2J9O8~rpzb+dYk@$4CsRtX8{SlT;y&0II>6%gz`s^Z0gjeE6e#`B% zzx>-0qb{~Yms$WPD?T|9z}bpXPJwM%EDI4`X(Hu@Ej8W_%er*m-CTK?2>)>P3EJzpo2z z^Se6($nVXr=1+I{kv;D!u+3x;xdTotAGZ@1$()B7_1py7@@=%$cX!C5uFy^z+|kR*A|NKK>SdoC0lTk>2m<+ zUYdLdz^qZGyf8QU9)NDUnc|j2Cz1RFz*GQF;4k?xfNzd9#iqvr_z=KW2%Jjba{#y9 zZ;9j{QIT8;pcO#h2Y~n=fC;-t#eMioeh*+F0!54#iGbTLXQ8gSzEJ#(zhuvd5negm z6oYm^nu7t%+ubeHbO7J&i8EC3mmCgY=x9?+tOl?@fMdqEC7c4_5V&w<@RwW!;FbMM z@sC51+j9Uq;?UAv@t0f-;0^?MifQr@0MiaM9ZFmP;B2^P(^E3}ZvbQADNl#hOWc9K@30Kk zYal=u))kAMBt@S{xM&_4sdhy~BsYi@7d;1{kwCvlvHfcjyTA!-6zN#BaWo=QpG30W zQ8fZHrnxce<}j<{W!iSgM}N= zjsqs*lk@O?+p+HZfAT#WF>IhUlN zlE;Oz0+iyx$n1$G5up`$8U6}ClTJXa=OF!mKHe1l2z&%!i&|6E;t!{Y8R6|`+TslS zB{>L$UY~?7-^EXFM$X{<#t2LxFfN4mry&&n7k;{(2-FUE|2%+F0wehTfRpk5aQqzB zR3wsp(Z{X_@CN>pvjDu0K*eML&j2_Zftf7E!2m}6!xRVf#n{q6Y;-_XG*+sI%$Q7v^E*EZb3zi?yU*r~ zIyAhY*}0=1DUHuBaIMvS7*iUb|9h!FrfYmQ^%Afw$?e1WEzZJfVQab%P0q=xa8XkK zo^B0E@fYbcV5BCrN_g3+rbwNJb{d4!p~pOi1D)}gO!IVTy6uGcE?j{h$>^29;~ebU zp~?~t?~9Op@daLlXEnOe=luNcb8!y$0u^C96Q~4whx1|a9d6VO3i09eJ6)(RpwMT4 z!e1%Wenf2uc6UC!ZI&Cg2R}T0jtiAB)`D)xvEyAXYG#iw?d_q23{C$UXRQNBo5M$B&HK(E|R;qY?FP{7BSHR5U#On5ZB+ zd8cWFzXq@cl1tvFwqT%PcL#$TnUa4Ni^K4jTw;dJ5%DZTVD2E2Z=2oBqV8FimdKen z@Mdc*W-(%V9<0rnTLCD}s~OuoN~Dc3hG3(fevmDNF=e!=FK$rg07KAaWjzJ3vB-99jrzCseo0Y%t*qjD)MF(p4YllCROBcg^tvl+8*hA5~ffQ4qe zxCRT90J{FuNXEEY*#@BVoAzI_0FJ_$^-pGN#)($)0kd0vD&DBYq@a>iJWe}cLn0*= zO?^MSB+PuXz~?$kq~kJTeR*D1=y1_7*#-(xVx$rv%C}}`A4Mray&)Q5`LN)t*8E<< zf8+2HGqcc56aO%y6-k^=YWAL-MKUjz+&p`tpK=n}qTPl>7ME8f-JxB^PNaK9l6h_l zfcsS7zx246`am{WR#qlEIps#fKTc{Ta+?FPF+HSyp&3PO&Jk=xsw3EZwcVI$ucg{z z6?+wH%i`wL)c6Ejoi4a&qE-XKz4pXHM+Od}bweq+ov*V8KahJCK%2Znv3R;|}^WjIG@ zOQd^LMEH~AqJo21GHN-e+~W%|6oSRboPm+(NsdNcE&Kh_h^VGm=>}r{q6r=;`r=lp zIYrZ7q_S0P6`2PFk>hdDoYY&H4IZ{!av~iD?91UEP{%A1R?I$rILs>mrj0fW?Cp<0 zJC@+hih_dJW&o-HG;}G5ey6Ej9Qf$s^RcF%vH9uZ^Y8)$+=n>n;uCwjOGMN$rHwjD zvDxTk(d&=JCcDw9H2|IKavDG)-3DN(?1OPXUMq9&XvJcC0Z4RoDtN_ZSrM-)crFho zb01Z~iCSOuDj4mr=>=>OR8)Q!T12hoMWwZ@pf=M3rmOIV_>o%6aa5MRgZ>u&RVi`1 zQe%4t3RZZr(y~Sq<=Z|=)-p1ComDLMc^xMgA7}U)n;kwmo(|`JPn=66yUoQ{^fyml z5h~hiI?PQUVd~isDltC|&I4`^ZDdZ(HxC#=spUQ#0-Sk(Js&wHK1OO!h6WVf2cQbT z;BSl#MA5eJD6ZwJ#i1Vdl&5hJKY^D+rS{o-;g(+j@0Ou_x=U4#=WypIlr38xBR@?%(-w!Jai$ZWi>%gjO6 z?A!dvZN9WoaG!!9CGnk5(*|e?1~szetWbYzTTQ{x)U?nkZ)>*shY;Jy48){sgJ)vs z++lO`U|MD2uD)DdJ+P1exPK~qNk)A;u)B#!bGVi$Y9W&4xWY28#<`~!vlKC9-x;A* zCEIs$t{O_pLpwviU^}+wgSCOI;CHCtGy7mxQ(a*HG#`=$=8EL#0$g<76+15h3=D-5 z*11X6!gVOQ5*i56}Fkp<#foB(s`Fld6KeWIuejI`l@so!Y z#EZh+u`CQ=VCN9^w$MVDF~i$eM}_?=W>pzXv2;L$_FRmcLupJ4--$@E(MYluk!Fm+ z7kdGC06o>K8g@h?@8^)WG`}5PVD8R^s*E|%4nd~b zry_wy7XFoja{I{dA(RMAEJ)hR8X=TEi->-=7WT0RkBEpW06k9%m&J-635i+&tT{3Ab-y1XrRHr~ewRB)+dc+1 z_0$)j{jZVD?fFQn8USynw1$13ZClDa#DF8eIaxDVQzG^&Dkw6K2_nz8I+_Otkq<&? zZ_$cN5!Y{GG-a9ZBIG_YtF4U=*6v#VEJ?qu}hs8>yb66}o!$+t?Eeh0c7z73D&;Y=zLkj>^2l1s=hcp0nj%*EI zsB>iN38-^qn*rpUBg_1M?+jeC9hDtKf#W`GnpHb;)<*$wQr+Gv4I#QA2+rNWJjWA3 z4pQp)CuvCPrxLkueYPDG(n_3=Mamj~ZdCX#q-M#>zA(B(7izxiM5_6Sy&crbHc&8m z0@&*^_3}ql{^uvJ2wQ7veuVqNHt&c5zRyDMDvh3(G>EJiN<>65RFJhGz5KhNCA<2 zEl>v{SqGbSXhYQ{zy?o!qf9g)m=xM1Bmt+Q{@jr&!QPm;7&m-5*ngMwBY~PC;?33_u$Ia>OTj<_k-x zkhl-Wf6f=~S)ef5mVjt+JS%NkYN<{aJ%h_|UN?=D{2TwA_`vs-; z3=E`=0QwzkIRj}M0B;~ougnglwFr9yX(ItOkhT#}1L-%~K#Fj7AO#Q{NI7!|ZWAId zxJ^jnes7zQZy;sg3J#>iX#=S+56~1lPM?zRVhqfy0v@f!^rlZ^^QwT-9@vbECO<4F zlJ-FHEdXT?tODTK1M2|%h4#Sgw!qs_J0rshtem(uvP5d)D!y|VQJ=VyPuf3mt!7H@ z#I+7#WU4J;$bwS)d z9}x*C9jv*vKQtkPlV23rv7h$C>D7FJUj9IyUVfsM1!pkq<&)+k;6B7TR)I9KXmPWU z%P&75i#9OpA9|Opxs3vDp*;G24g^lg1AVz#kz83|9}kkISu&jM7&{a|4FFcYV;=g3 zG>d@}aj)j1Z~P}zUOl@Z06Lokunepo;*e#pqR$br9$99W8XUk`4sIi$mV?!|Byo<> z#G6g}r<2T4E(bppm`=LO!P*qe>242zHeB3EeqUfu1vyebf;K;ZHm3oo1wh*L%0ruC zjW*1cjPagE8{!%GpKq+W!g85!zAQU^-?geof?s2TvPtm{Ck zyXiWRVh3FZB2MW*A+BI|YI7Il@0LUDhoH5z68%yTwy(Vz8US-P3cK1D0cZpuH?9u- zH#B_$+_=iAUE=5Lh!kz{La1)_b+v9D8BpqSD z=wtE#)qC8S92lihg9oVkknS?tZ75rFT|4BPi_p(bj#)&CDsE0UM& z#iiQ3$VCnyvTI?1NflH_dUK5+QmUj1N!7kg%{3OgX;Q>`Dyfe2)MifzJA>SiDaC@z z&&lqE_B6zFwO`0h|&^%lN@r7`* zN1+|N7eJ$%#lk#;+}U{sxwG;Pa?_DTo12APG5i%-l!K?%;UHHbh09@}FZ}|NeG2Ud zK+(09W;^!+I>eJ7*xjZ6vjT{H}{17@)S==%tOv~Vo%^?B&K zdmj28o{zrqqmhMrIE&#ps{3-Vhb6ZwT!j_dHLp}OxLuD&fEbxeL2o)rBzGz_Uj&Kg zxNmpC+vLuL1@Q#|BL=(QH?5p1N~oiacX95FZAQ&s1jcQ;`DIWfM0TnQ{2rE zTe&!xutai9;fCgqC4Qvzzc~_(pvRQ{H#5;%I#M0>MVi;5MU#6KI%|M+ZXRLe;b|yu zx=5cCS4dBa(;4C&H>M}WxfB6pJpXhfOH=IFLJ}%FYdua<|1nUX{w>LU3(b!} zX!VRF_4fnymjsZc{$6>we+P~G74^G-`syLhq5g#$YrYCBSu+Ict4C7*a8UnqP+vVn zO6u>gbpawJ^>5Vr3XwYX8%X^lTVBqpy&BXW>f)3v?+a?{I7#hj zTbGFVhZ{3%Gk6^~gKDJD%&ZGB?p@$Ukz+fNyJB7HJ}uYe35A{P6Jctv=VvDrrtKpE zv;dGMf>xN<6CnV~L{Lq@H4)S^?AqF!5%v_aHUP>*@T{8|`A8{bI!-BMKAfwNDI90( zo z?@`f{ez^ZAG{OTA7*F8R!t7f259oD;HyZVc*e3yKCU9`Xw%Jp>|c_fEM^80Z3+##uVdRjQb^6~ga zcV=T(lv?<2cryuW!-?6l%T_`yh5gvoXeE~CtU}xFcLiFB1b7$?b23fR1V-Zx-5yef zh;~c}HxdD;CLrA$V1=z|a7xBsvQlzNpO9S?Bg!Z{k1){^s`FG4P@Sg^fY*7N0R%e_DL`}F z8tFX3a&P8GmpLt&ZhJ9T{b7x$e;X1Gdyhy8oi`VI&0oW3KGj?DG<9WoJXDNObq z^-yjnZz;4)_968U$-ZQ=FR4c&(WiW_MDla=EuVLZWKy?}+4GOIL@O(QJG$f67OaLg zsEvK6_H1<0DgepnBX*I6oN57hW~>GWaLiaO1cGL)yo4eWG{L%%&ka__<*tTDpUSRz zG31)De4>DnlQRRNfXEzC;30KUppZUMppZxfEO^KqG*c8+f3h$g8w(%};E{a`V#5)x zVfbm=JPU`)sfTmlM}`>1CU5vw50TRbHtiG3%~t6#84xFIDm~&f&77cNMoyl^2eH7YkQ>}CBszR~@NzBZEP+-DWaQ6P*DjX~Bs z*+!QOA;uJg2U^L;x>Z{glZG9RMEW2|ud(E_0nR5fhx0w8&iM-I<9vl=5v&iOZ>xtT zTVjTd8m@_Vp&ok3JP@8FzDQGZHFLaXTFLBOHbF?ie;dcLrwy-r= zEU!#X>olP}biYiFFzvx;kQ$b0SF}!F0QGL`oSLU~j>*$H+vRPYaMx^~{ms@Hxei;$ zS=f0Gl%UsXvf8wFLFJoC2{;AEwgHg9?iK29Q}a+_vPKDxKIGGp8YPI6d>ZQlO4KkV zcVVXgQ~uHTsGw_ZayfPk#)>^jdw6!H$Qs!(l zy^fPjKORl5BW2Uum-}P7O)o-2zl@6BNKQUG;Md4}3D%T8sgqH=&@;2*B6QP_wuoG^ z9oB8|S3V5~A86sR4;6~b@mD^{h}`r@p?G&du_&Kxlx_8Bp*RVD<#UXP9!LLH3zzL| zn_>$7%I`5EiEXjx8h_;v`18`@`^uo>S0OL`TN;7nLz{__xv0KaJdMBd@oath(8_IO z?u8FwY|LypziwP0%I~$!;o8ZMwAl<866$GwjrBkEkR{}n|MRdmsUC@Rw*1FlfPtpg zNzLj3uUz#o=MAN2eW}+xjvXJ2zx%5VsL@yznDhY^IxnXp!^pb z0Oa^DGXLN6U$k_mL|Kii&1y?`%On-xspxmhWEFb2Zkdt4KOYs7CzOctf2~@(wzDnu zc6E+{FWY8&=YWIq6m~oCpzIKNEK=FQ*#ujDFPZ!tTxd{sRD~&4-~@p34~+1m;JumT zzc@Bw&)MF@ya7Nb!zlavFjHKQzw)I<SIb}ikl zTR?o}ZVeM$)=Ml+K$(DR2q+UU!^#AVaMlD2K$(D%iF`P4Dig4a62vJJun)Hey~MoJ zM;umt6@94FrRYZ=$HvdYtZWlhdU>gBHREt>goom~5X+dJ?H8P(4jmLu*ktcI#;C;P z43`s$MgSgvw*pZ9xrt3R{;nbb{nxR=w$O@m{+^9fQ2>>I9jBt!`V)-v#izOqfiyu=gJqrmqEs|BEeYylCkc?7oqnHUFwy8 zfe`n!q=sncCUD?1G7o$4%R|tKWUPTXvEF4Y5fc47h_Hnpdc35zKxa-5=pYY^NNo*Z z-wiv6C0D@OyPaXkTO-Q%+^mC> ziTVI2;J(6vKbPZY`<0eRO~APc?*Z82YXFk~yo10Nd~-5@OAvUMz^MR^Kiw9O;V-p6 zfF}_6t~w!7$App3?#E&O*53Ge<=jG%+L+0lZHoctATrNym^Q^0pW-jI6@XK^caYw; zsgB|7aXWKlMP5Ti%%{3hg?64@@GmtaY!@xw9ki&|3~JR5;26~E2>cm?8ixYu7j|X9 z#v=`C)@EmcaPGsQghc`+*_}eHarh=wU6ObRs3AfJeFGAIeTGY+cmx#U&0ZlAEWCT2 z8@CvE5&m|Y4r2JW9Z7ic*^Qi;@x zaJhXykcmr?*0E@oeUV)ifpN&j+DW^qS0-|7xU29bP2)}KlW@$uK}(tvzm@jA zL{1K4I~Xgio`H<|b-1@LQ3{^aN+f!xmMD2B^-Z{wwVOr}i9C%(eSX($i*AglcNB)Y zmCmAbg8Rsvg!Psd5AsCDLqqbKjL=;6w@tQpJ6CtKrq^^skq~Slw-gITN_B}?=T&6W zrkbBhM&kD6K-Q9c-2ptiXGAmrFkg=(?VVv=YjNK6u-|?a-(FTAIu?df_O^$FL=}K3 z&%x-N#!iMh0G+q7OYK4PF(d&PFeKU`HWfo#D}aj@549i1l5XO13|w1;jUe}isP$bP=dJGoX&()W)SyTp zf^BbB109q=410fgUPCK^zKq3S8T1Z?#6(KizrA79y!G9xxgWJ(MSX4b2 zS_FZ9p#d`cdH{b}_GYKYv*RzjJF@K>KUG@^C9>*2dD z?J!)r1{&UtRGUGmRB!f*F<9~hAUncd=m@E+IiKF+>VgC24S}&R3q$Z zxpe^6qmFPgDAI@`c^#pRfa(b8YyUz{L{rL+P=idoj?h3rb%fTxGJ9V~AhYFk1R{eS zfjF%rpesDH2Y&i&4ejwwgs2x*;7l!Q2lAPOUn6tN-VtGS_}Ina9~rsgq|iWf=J0Gk z*xW(d_OcI!Xg#Pv#7_xzDLw(}L+aoHQ8K7Be!~aZBq&r$cJCkW%yH9wByRlX)CN;SqU>g8Dtb}HT)nLYMFe0kMN`SiWrNV{knsiO^_AY+aD#1fH1 z@zeTILR9={MD9ZP=@2yWUvO&N=fLmNQB)W>TheT^#O{|Di`4f<_#%Yg#9u`>D6OCW z&k|chm#l~Yc}M zz*ht|0`L<8V@?Dx*f6|F$C@ZMa{n;<@;qSCJylGaCOYUg!~TdQV}TBR(r` zFEVd@I@>b*BKoD>!@Rr5kL2$9=&w-S)x(&FC)gzMW-ZZefT*~$(%d4JjY?efW!sLQ z8bBWYsvZ5ihT}B+f{tTNAh^}EC6d8nWIt1Wp_ayd>V~UN8fWF_KS+PUb61hD0@YlQ};TA zy}CE5O2x|XX)B|BX`7n|lIbzP>|tG|SqGT5+)ZK4Sg7)Ym4w(0&6tP{Kmw_uNNgnx zo%s^GDQ{vAvirCX_+Rn8 zZ3bJ64Y5|6EIaEs1w}G4Kcc+5LOfTDHS9e>pc)cuZv&n#8ns*!^sr`X)RIWKrTvL~ z)S8!>lWTvXKLDaRpyVL5s$A{QWFWH!H|Se%2uio>!; zV@|_ZWMnP`cIgvQQE`-E4`?eC4dj=jjb!l<0Ez7j#FDLxVpRxN$?)dU$}w3<&=H9* z>DN8__}J`F$f@&^{$;VrI3>1`-ynR22T<@i#U8uE(n-{bS~+8WkDRA3<5Jq4|(!alO@jyqF6%P$(geLU4x$BWAY%*#KfN zEt^LJv?xGQVVL`dwXaeDYh9-R*0$LNisU&7!!fq1JxeM_%GjJL6X{ji*A!jwMwW<$ zNFzZBun;v0U?J)iAPeCFf4rxk)5x5{5a|^LdiTCHK)BBU{NLdgTphlvMpq(bvEBv= z+mQJV*BA%cXMr549oz!7QQnis9fa~OKM!dkRHwxe`{Q} zX{l;0*{Iz5ezYGKegVf~$IiYFyN{6jlFHt88kXT^gnJ$ks)#MV8_{>f(!_3E?2Bo# zLAb|`QQQ6w%2XWyPnl{a;3`vMr>rtng|Meg)d5(OGga9VHST1ky~qY`@ty>v(Rmj9HTCJ-9tUtAuG7TkKQaQxektkKj zq~>}c(_*_oxHqtngG=nK5pF{`+znpx!}?{r2DQZSrjb6@oDZ@{jx#_Gvb(=yh^i6z zY_mvlJPtrT=OHkDtM2ho5cgEK=*s_Q<8cHSzoaxi^nfgmtTz7b9`Wchl^QG#2-XfR ziC#yWy!&uY&&l-%A1I77Y3AhmYL{R6Cc=1_Tz`_y!Z*2&|7RvElJvAiBHLcx@VH^9x|N+2qYn40wh4VA_z#l zq8#EKyaq)jh;Q1NypUaxp=@LchVBI3Cl*W>lX|My$n z)l)qa1bn^r_xac7(=%1yuCC*$r>dU1p6X`(+f4;eEPH5lS8GJ7os(j_bH7<)KXWf$ z`-VQv`{k{n@s(hp#IA^8ziv6qaUJZ@Ic7)aHN2Qj$3^DwoM-84w=9vJG`b3hDQSia zuLk0p7hDIjJ6<7bM@GFzmSB`QjIs$1KPu~UjaS)xMK3h_+3%-;G6oUbD~;KY-+#D! zwnnyX@%`}!RX8UAtKAbxIo~L@#kv$VC`xA^6e$gdSk-eMY+H15}DeqE07yjHoYxpz($4@Au3*O`~k`UJ@yB%IkA7aL>?Xbs48A|!lc8Nf7Lp^+{FW;dAekisa|TqT1z6Tl}8D1Wq&3F|Jc*QYNQRYpS(p96l4 zhJMo$)#iyV?4*?G1Iz1!%0qcjQeP+!0jLY$0jLY$0jLY$0jLw7V1}ecP!XT0bhbtT zG@$@0ry3od%P|?4*b55>AiQ%r9F1_`O{p`9(}a7&vD7GZPQp02nvScDPR`LBA;Te6 zOFW9fa3dX5EpZPV&2UhF$kP=3kyT2TCG3;1b50pz+uwod*PnHJI@e~lNt>+-30Tku zie$Di&DS8G=faVw^V7Tr$*iM;X?`A#*>Et;rCOTV4mnZC4@u}!Dh z;F81qvQhwQ+SKf}Z71L2_%aNPPyD!~|);6H zPi89zd(P#`!5*{KcgTv8Hy&J=K8eFs{fustU=X?WsV1kKjW=v-t)tM9Dsvnxk-Kr2 z>POAzAb?V$xki&b3Bu<9Yt6grV^5&WJ{3~t^!B98x7(94tz9)?E*C-J`|T}UbQBnZ zQkd)gM1To`o-k(}pasC;Y4&LdV5k-VK^ef-S^xz7@d0dB-BA4c=3@MVGFg`0H^s*U zB@ZppWXD|rM&@Q0T3@{3e~UkIZ1#oGE>_9&VNiI!5vhOk!6p!1VSkBj-f0@@zy|d8U!bIR}nrI?ghB z*n{V!n4AJu<=I9bdtKUjJqhlZ?(-a@%Kne$lY^d0f_tRP$* zV1Ktfun)?}1G}4yJSZ@f2Lno<4w$gJ;+XCHBtAJp%kzcR`j&98ea2eHL^u&_2GK^#Sb445HtsFwbxX z)V(M}(W~+VqtFs-6(j^ldjQL=k=le6LAjUVG7Y3unZB2SgLF!ov9iikJWR%vm&tQ> zKMkfxn|Q|PVRd*T<(Iu;;$@>#kCUEEf#kQSv0rDq->NX^-2rR=pl$Qyj7p-yEVKI! zri|ekNviG5cqTX!;1k!T2*v&(F~;nk>2nt|Khx))?fKlRJ)irv=W~Df%t+_KX&|$a zn1t&ow$XCLs+~B-%y$R2r<(Fhkq^K%NT4Bm+IkjOUDIiOd1VoN8`m z72H5dd4^1!xWFv82mUz>cH@ztP+*e0f5Hq5wO}bDW0;1#w0F8yWO|*xF|V0X9cSi; zZmwb5nFwE4M<_TCr;avN@$*ZdQsAMPspJ!swY_;=iaQ97+t)00v#v`~ zov-T-PS}s$5XORgg7mnm+KY=|MqC89Jg#e>z-PW;6UThn-U$N_4ca|R_sSZU;WcRH zt-rPxsyyAGMa3LInTqC><8~RU?v6v}sk7%v9MV0Oqxs|P2Qar6mbH}` zN$l9J)*BjI5i9R!y6&?YTWtq$+zWAczQ$EdXWiZj`>nsE5<_g;<=BoETlGmQ8j7rS zb#eE4?Q6EJb^8|BD{f4EO-z0*+)gKC!QmM;5aV8qTgAtxVcBLM*G&UQmF2tZuTO=^ zk4J6Qc_S?jBZz;AZm60K%(QNCwh#5RzwCtcDUqTXwUxPLZQZhC_pu_aRAfm_>*jXR zwj;|LIM)fa0K|5BJ<>JQ0&IS*eM$Zwx-I4qx3y^AQm0?8(=-5ovbXhQ6|e%7sNSZoigi#;jD#nNMJsf9HLcc=YQOv{RJ%h1m5pfv2Yv5tE$ zu1`{i{$A@=82ct2llL*XS7|da^qTlfjdg5Vkmr7m9WC`IhQrKVjgC5Z8qj8tEpcO| z+Z}t_m61W+l(3sMMfAi9NT1kU+VK;%Ik>hy_f&+`#*l8UjOiyjN zf0Me&tR+s!i|wOzK~m_NwWHf#V+bkHo?L1_o6ZpP%_0$-sC_Nvu#@|{|8s0Ar?O_B z(%rgW!{~3wCw76oG#$L$C=~XK8XEJw7K_|D;Fvmc%$)uqF58~jm=kw(DMxZ1xI-7H zh)G7!1uB9WLJkR&-kcIs&8e%moKg@*R62VR%V;ojnR z0+TqZuFMV!oSIM&PPfC_?THR?=RAP*K2JEa;Am71?ksOs+@dejvc<@_^X6|1--{=Mlxzp(~pe7~&BHB6ty* z+7B~Icq+#lsSUm}F~-3W|LZXl#!2(UAR{!TA%(4BMu{~_n`s!0z;GNro?~N{WjQh) zs4#5x9NvlRym{@MxMqMEay>zB6duy5mqou+VYt;(sWPX{J8`W~(#UjD(J$ zaZ)~>(;4ZkWoov^$~Z?H4W7eGXH$FWlyRqDPEN3$bdtz2o!f6-I=4eQ57pAS2h+Jd z(%A#)Y|+yx{v;FarL&rj^b_nqE1kQxmriHji=m4OaU^y&x;v*ph-iePa#zF2ITns) zIIMq1(U65EYFOJ6qp|L{={X(gb?oMQ-Op%WM}0d9;L`J^6F^!e4l=?w4fq7K!=XyA zhi=qs=DeG+CG&1phrgv5T28c_4(*2BwW&6aqPx|^wz6xqsWu66!-8n6H!`{Z78K{Q&2M6uGlTs;Un29q$jM>_hhXNgn zGl@SVDOX~hlJZPF92xQq3txhIx2C{Qlchj>AcJdaFF4h%ZBYxD!_>9-!9jH}60Qs* zWd=fPA}S@Jwl@H`BqPG=uNAIrtQHt!?J-*65|s0()(B0~m+86!q}Q)2BPg38>mDr& zQmkhd9@9YfvLw6h>HmNWMu8x(q`@V6;lYtnct4BUvhW()3yzX|1}`Wu#0v_<2eR;* z{ouUWLFPqVh=GlfY)1b@-6o04O=|~j^p+1FiCZvZ^su(}OHgVXJCze3z9A^JjTJ)M zm@))?ZDZE%TCm(+nOJJ}wVu&}B`AZPqXkP)2HR5$mY^T3U9I7gF&@CY{xMqbfRn}| z@tE1so`Bv#85Xwe%{T|s2CBf38&dk3MIW2lfl0sYX!mcgV+bkI;Ockc3A0d6&&t$% zgkK}M2UL(ylT6|n(;BZ)N*2ItD1d)zlnM%9zDB8_0JhgCq8GpvEm(e+coPM%P79Wx zEP(5^U}=>Fu$vYvK~=6NYqTz7ullHLpC(G)!J_9y$Ib zPqR$rWYZ9(WwRWyd)yM0Q?wK8B!ZC~4b4K<`|Du$4QEdAl@sInbY<9kq@Pol*p{7B zw?6KXs&u3`A}Y3$NP;q?47ZlpEA9<5vJn~)H*?# z(h+6$l;CSbf^YIZ@a|}k7nYZHKE)B&UXG*W$CyTG{4_^gJ{%OAu2GBx!6CT?i1YOi zQ*kn=%3~2H)b|8N#W|z>I0KZQ7|AOc=6WqmNu1-%j2fM0VL=v0c-;b#$^ z%5f-U^PgA6MD#uU$n)?w0V%>!zDOm0sQIvRAy%OWuZoH9q3*D<2`e^{*?9FFkNe#Q z%~J1zye1F-MLxg}^?zWyEK19~^+jOI@FTIgz=CXkDic2hn=R<6@?yhIU|XUx%wy$T zNDGZ8U~4oN*5?`t=Vt8WY=WcLf~+p~0L?o`d6j>H7`h1FTj(8*(6%j3dshA#U7x;f zi=gaf^u5IasP8RS;HLMUaP22!>_#vcyMZpBBs!!h@s{kKP6Q=ZaqG!S!+D@9YU#nq z#fwHCso4{sOT%t`P1!~S**GtEuf}I`|j_A633RM@3eyUrEI(l-Q++{tXyLx?DYFaDqn}7 zo_;$+L%66|j{G5ts& z!PgH3ah;Elg*wK7?{Z)6iM>p4ygsv7SjBgcP@W+}RSq$?wyDrj8G>bpQNNX*vaLO@ zo$ZSrP#!U-%O2 zADIoOiw#mnx&ly7R{-ki3P3$w1T)e_Fi4kk%WaqmWAO|#`#R^X!B7p3ZZo0q;naVi zgNC9Psqx=hzdFTq?6=@Q&plpi`Up-~o9n&;wHe9~+YT3i-=BlocLddW+bk!S8cAlu z;b|fXm#yTw;oxz-z$G}sj7!xs%kgF9wr1B**G`sUrxNU6pM;u)uke&#Y4p7I+idY7p7JUaN(0}4?LBl+ z<<$^&Xo)=ZW474UG(~wW5LzPp85^9rO9!SqX0)k<#W9J#70bXdI*-^s)3LB;MbLz;z;( zlklFF$e@n?dkTZ}$c{^zEYQM87XR71TeW<$8F38k2WYNDJ`XpGo$s+TA+L9q7*}O< zb#GjpVp<9wbysx>Z7LwuDL$t zSz>8B6Nq_xp~@+ zQ)L)k{ys)m`?>k4I0zyPG!1t2L*>&Gq$Hl;AcH$U;*%2CAC06p9$9ReSEmw5Uvm8LnwD~cL$@-dBppz)AHz$Q zkdoJHlw`|S{&L6I9U3`^H6F`qB=vljJX2=L_OJXiRKO#;TjEMQ<+D+Sv_z^CmY5w! z19hEgM5e+aYwOvptyfl9Vilh9li-<_$bP;3_p|tZFI-Dn@VB@qKL)!*FaF39&3MXB zF(Ow(h1Sz}%2y&x`(j57$5Z|wLMgioYR`M&N5*oWA)@c>8WSDarjAdwx$L-%Bxjd` zG4p*Ax^G^tU=Zc^#%CRgIfewd^S*-kF|b#IPk8mg-!4nhmqQ?4U3Hzdb)S+5uRfRy z?pB7FcRk^lC8`^e_wXMiTnCjZ#xO2c6qxZqE@;;fQfQU186`PgLd7TN7= zZ_HEv9eTAu(Ci3e7|BEN1wEC2Z8%vYkr(h{`L{S<6hG7uO>j`fTYSg$sBMxh%?ArjlJgRuj4HzB4L3Xv0e}5WPa}Y6s=h=2aM$p! zIhv!^!R{NDCYJ;bV{UyTF)Rr{#0U(rlrF)bjXVgjk>t)shg%sNC=g)_W1L$Uo8b8Q zTNgRl-?FWXac*5~VWcm{9l2!@V#_#eRg811Vl^Dtq8R5E#d_Me>YT&tNg81fI(}iY zvkkMs7b$3~;GM*vpWvoR0!s1XfBc5&|(q1ZBwpB**C6voMgV846Yew=eiith( zl)q@ERl2vB8Q}I_YcRxh(H1>H99-pd!dm@_hm&{%4 z7bk|nBa1BD!+AH*YJT^!*)@Iz91U>%r=Q~#p@m;gdp-6>7X1$<1mJ+c<$Ur4zUZGN z4txri)!+13Dp1y^11Foktjqr%2KWC0H`vP|g`am)Jh>WOwDS!DYhYkUnw_n?w7^)? z4;*LiXf4(PBPavY?!%JnKQb`9bc@+^`G&n81*g942u{|zb_A!`(T}ITX7LQY$>$R1 z5m2TH=>(bjOER^=0W#(EMufEkB$+x&nl*S1k7mo^P&8|U{gSf&car7aUI4~bC#v3I=CR$=9o~px*lKgs%A@EdPVwB!;q$OTh?ux2xd@$}V zTU?B%>P(|#$_iWDf~V?cqx5V15561r62mCXgW9(J@KkMWq=q2lWukULqTHt+V#nbb z%3f6y3T;sobRX#dfjK60Ar!rkDjL$Z>X3Zvq36O_#@&PTI6>Y$DEA=OzZn%(2X@@_ zQVeI0Ha=q0_aw9Ir4*^}NtU1|MaCAMmP#WTAMvNwAPxXvB=;pHUezc;VXErLLOVyJ zgv2BzDm6+lp;brcTTf|}AeKQ138pB~NJ>okZ7FeMIwhubOpPU;M*fUs{h7Jqk;!0} zQ{q?Sy3b~&^0bc5K2JqN8|(vKMGHJ$lh{bm0n?2lyHb-5d;fd0A)^996A`;||eiPl>2%e!lgJ zMtfozw3lFt_H7KT(c1}MjY}!nLCT%*^`4`94#zG{aL6%>&TVX^Gq_EH9=EwYaf7Hb zvX)%k$*tAWOlVU`PJs4@2_y*L3!GURroPRzI0h;!w4bsWtoj%G8fCXO{S-jgv8G=-! z;O>>?GhLkmQ$uwMwysV=f>5Ur)`q}>;>A;&fAtSO2<@KZ)YgDojGp#t7OZb*BWUfU zC6(R&fLYjNq9=r}6ZeVD$Z-Ndr@rvjyc@b$>_g4&Omb3 z%6L;DKRz(#t%lR_2@IO z`9^{tV@hle7iM(uGGhnnbU)K5P3f%avO>F;MrnyjO6$!a88E#Wl&!}mDBZ>!HU6eu zP^ft%8LEDX<}qN}0}-N;JdaGfK_exrQq`@6=zs#BLSmAXUujIs8eX*&qQAzp#4>sm z38t7f@g7Kd%Wq1`*hiJTeC;!iQJC*kqVX}1HKb7f>z{h`p_PNPJs`s%k!OQuS@ zU3znvs*aTS?zg4Ho#}GTcN!%;3GWzC!s@C~!YhBH&>pLiB47$@&vd5ffB|8f)@N^m zD;(}XnoU|*P;<1&oktAqml1dEmFdJl0#bb8HS3L}MukQV$pbw>jr}xg1dL%tUQDr? zWQ+<><1Vd^Y=Sc+HI|baJmHddJae+S6&MlBW@O0bwFCs5wTe8_A#gqeHCTbZN( z7v$ko)9!V2AD~&6vx#dBhf`g7>ygp-z~8^^lvgdI{R2#S`73_GSfH2W^6wu3moMv* zEgG0i)6BEa(^`B=0e$n0fjN!v(F7lGV11%=-Ci;AG$w$nxYI{o3tGC@-ZAkAo~llO zu)F&sN0^Iez;-i!BFpi^W&WDI(METeiR-+Nhoeqg6geCdG)D5Wt8?X*u{DRA&Ry%F z{qmSBQ8UHt?A!!L8ypqiLXG>Po0%}rP|C0PG1@KX+g2#SIu<^Dj1F|BcE@U(=NM`| z@-@3?&&UZAZqwfBo7DJ#AU?xz)S9&_<(D%I6**Zs*3@+HLc72^BptlZcB~dHDlXSm z93M;MSnqHb22xgIbg=i-;$>6-IVa^Q`)sDK9kSw5D`p!UfmY1Kw3JrNI@klPn6u$f z%08F#g;Ms}N(bggHgaWiNQcg~(Etax&MdnmHTL0%h+AiFkPl3!%#erG5)^%ECli(NGj#U6YQ$~W{ zSY50_ZLbEwvZYy$HRP7CPq|m)hS8}+N}t@T;c86_LGIO9d~K>^Wu+J#8(??8I1N;L zHSm#jo0i-o0mwY)4aT+vU$=`w4F*}74TjAILm5Vx(Qx=6*u|QKmQI;+`hC-O?e$tS z#Is!11zDJOvd`1}%E%7PDz%qtxg$X;CS>Icd$qQWgu6s*rs5<|_H=T)XE==ou(R_P ze72!b;n>z$4t7XjS3|GU%`E4YN^F&YgBzTkr{I{a9IGF}{SLmvZH7Y`hFbecXKP<> z?e+~5Rol_%ZH-9-2jygy*dx-xZ{?-1@ixTQiYRJ78SAWtJ#U7ekXUa7ryM`vO@r^S z#zH@UGE9ivn0@8VDf*I$Ik3qD|X1<85#u$`g^dg{k6E*QOLOT zUEBmSLLeCI;)dO-Z^Ex{SWQs~wbq=83PPE~D#O-~=LevEL{xzrJKq?NjO>#US$2Do z1)v_80z;80kg2zJT%IZnR>YcPuxE9Iwv&orpK(q<>t3zl4XWq++VsB!z3OS7r0oZg zc{m0aXq>BoEF{D=*#20n0W4#HBO%G0zc5>@#8dMDjvmnxd1FboC(d9Gd1S~<*`A;S zhe;tP(tD|oe1+E)clv(6SFf)DA|)drh$YhZfowsMsRnnPM!tF^TMT&=k#)g-Nm?S$ z{EzQ_FeR@=QS4#A9X~RJg@Cx`CrvNdjO3?~r|79>j_E8!SJVVvuelJ%5`UGhNcK7{ zh$8591U6r>*Rj~^D03Jr>;f$IKFSbeFXXZpQifo9Z^Ugp>Aevpwe;SI*d}|UYNpTY zjqIEJC4Oj#ow=_z9ql%6u# zET!G8AhEQRu_9`>j$7|&aujn?GuMQ;s#Rx#o*XsdE-cFazjxTX1Iv2#6;V8NWESi4KcC&`h0`7!eBf}sJMR=3RA-0l+_i87!-xhr z)G(rnFVujjg^u)L1l!AuVFXL%r-l)su@gPx7KHHFNrH0hw8ML}j)oQmw; zV0qcCh9k&sJsj!F_+Y2ZTM;Cfo_$WuW@MlJ;_sV%_U-<7vPj?Ez{TVNBDA-G5Q!1f z_cjm&Q6NU_jW$3T`SmThEMi-&LJ+*;ETh0ZMqB3~1@7FflhsGtnL;dMK~#crL6nhL z1yDGr47-p4`$IQ-RvOrA3@#+MyK5*}V88*`H~;#>>T8TV2-f39y$9G>`Gz3HIr~Iy zdxZ3f1swWu`Xk&%@B|vl{!$!ofg=#d#c7&2UacGy$LoDZNE|26{Bq)WBcf2^c(aO| z;&_{KP#jO3?ko7v#qnN#zAarGX9JNTjuXrf$I0dy!ZgA5#BmP7GsJO%86gnV#c}(* zeyQ^3@hKESp0$T2$&z1c8qKcO7)_ETC?(mCwXTn#JQPr<>0ptdFUdA)LMxja1Y2rf zrR}%fo#3TrsdE+f4%dOIHJ6*+ta;i-;+x>($ay%c&dtEeNbo=-&*rXRWe9SoD|lS@ zyD#7)ao9cNm!R*rRtt9t;F|e3My!WR@W9tiBed(7Bf5-T#{@UN>o~N77Giql4qBFW z#tvG789Qi6Otpj7zCg=?EW8C~FZ)uhm?_iLEHKNgEB8;4i#4+53bU^}R|DD79I-Md zc6nNmN6gK0^D9#yGsGk2mfO)Z%sLnChKMz#fBvW|?Ca7~bcNZ|y7#G6pqy^1SqN_Y zJncyDgxj;?ZtcTipFGlgYueYzGRJztJIRQ!FtLJX!e6uEF&^zzhM<4MSA>}HFuXwg z)z)1a|GnjbW2~Ffz#|8Dz;<>pG+%W4kq_f(&LMn87R@ z6DVeJUPNiPGR2FW&dx>8V9DVOI0km;YP15?FKkVz4+sJ(*y^|>#PQO zTl^RD#I!gwI5CZQgnjusGN)&{;jd;94)Bjai?592#zp4Nc9Z5)P7Ex@`Rd!#!5hs= zdyMuuvsiPZIo3*Ob22>%-fV8=p1RUh@yL0Fd8>D@Zh0t-?JzvzTGyn5O}GRyn)Wqs z!9{Sfe`$k&5&-j7W7>4~{+P^1=4)=lJQC0B*Tca^+2NV^M&;mH_!i&cT_<#wr{yqo z1tN3xlLz9hqn-#dCWgSuXsvylQeZG0G^RbU;*b;(0-swlnG>4F;aNl3|LF5L0jSU8 z1fV{(qQKD9iUR!{nY*vW>GL)mS+5+A$$@@2oZkD`Y%v2*O&2&4)3e27JT*qdQ#8Zx zt^u1F$-&p;inq_ftBWI6n|3RvY+&X^23l7Zq}Y+5RCqLo-0B;GQsL3RFAMur3Xe|I zN<$9Bn<5E&(BIYf_!`!%1diUs&e}BrL`HUqe`^;<+%|1I@jKotj!-!su{}*Y0 z+XxZ@)O?~3?ZWVe}#sgFB5fj`<{r}lYg zFE|od7?d^UbZu6Z;;;lC)RGy9jEl4x+;&Aqk~%}+Bj^cy);<$c48XY#8P%55c{fW_ zqbH}9Cgt0=XlH_nNe$|$(+cAN8Ofnn<%;9+)Lh^;W81JY+{#lkx2xTt9VV0gK_8== zb(Yq{QV^->gZt9i6b29K;#h}jB}$J6+0Zstq7^B@jKPrv)!@jg z)*{RDQxMBa0}tAdBo2-&Uk8VgJQaB@?uqD%?EhX6SJo^`8eJF1m=0|tI&Q7#2oJ9pFj}&G$v{uix_5e z541PbTLsbBGcU=2*P>nN!!kM|HZX0)w`OW0{vq0$I<9RWo9}!D`)t@dzlx!$&cWL-ad%MjvA6_(tt>-_90qKo!jB;;?@m-yFM^hUmup>wYfJ?I2#kGkQm(Tf+>G z3jZs!y3cjFq6yFFa`z7Gjz80X*$Xd6_biIvxftWebF#$fQN40_x65qUr2-YV>+6_o z@O`s69KA<8_G%ioei`biyAomC=KIX1&pu`Lm>a{G7v{6@xz6{=US;&)zV-+-;X1Z$ zf2UZug>6{L_I`q76%!^Td#br2Wg8QqzDd=i+} zJQqLFi}CX+p1KJ}G!N{^?SXZB8PN%DOrF%NTWCaI%*XlUf|#gV45c2Lf6Y(isJsqh z1)jRzXd7b)WIqN}lji8w;O8odR2a!+;I<#})E(`1#{RRj{FfC-bluc4%TC95SMY0K zjJ$KRL|v8P@nJ0-vfOgs`XnkE_^O|gXZ0cjYBa1HXvAahrGXw1-S-jZW4>R~uI{)V zQdf|U$tZHgr#KtOD5mGda$tYY|BB39cWR#dIYRnT59#cLWN;nx7@TaIbpk$v8H=ax zB9Cnqrn9Z<`(xV1_-w0VDYh;2ed=sG(#LeR9qnT}+v=Flwmnb+d-`6hnaFv?vQ$Et zDwP(!RK$6DsZ_%iluErHAUQiI6&>_SB{mOI{l&iDzVJ(_K2lxKL7a|9^4W{9bjNYx zI-Ku~=#HRcI8gGLyEs=Y>xd&UQ;%2C4v+*W2aq+`RtXQByv$CzxzXN^IQJ_DaM zs~lB>rIZPB^jR9{^I05WDkJ&qPLI!Y%qz>T;4NijsE_2k#pz!^=JA&D$1gnI>aF=? z3D>n$g|6cw=K0)O^U02}?xpa>UBo<}acX{;3B`;y|i+W^ciN9 z3u_C?Ttvop>L3>2sq1DK-CBHpei4Z?lE;B3pCn(tAFD=0>LvTTy7l?)PAHs@{0~Up zx-Y!mQpdc)>G5$?eChjSPf+(&XKOEftuUGNQd}i823@EECBJ;;6x*$6)4%b*_QC$b zW;gPKj}|b@GR)Li6A)_u6XArBY08H_W_IB^C=+GJz%j#puQGrF92q$Z-zW9&BmVa~ zD8ILusl$A)JrG@;g=U?(QecoPW{s2L zj%{A^p?7!cYrVVEF|YZEUxn;6lZ0F6x;-@_kldq7x=21(pAnM@!GF-*90!Myd<#{2 zAaqQ=-Afiq8$+xJ7YY-XUMR$5h`&{#$owWQ*z)`$q2^~FU^?}G@iXv4l+wXQbO;vh zr{fs|wH;T2WuM10rjudvKRTts(?vE0Rp90sF}YJ}Oqr3AUt?e|BgsxC{(djak{4u& zF{Lr5H-Oo&bL(RKToc73UvzPMPfPJ5XBY}k=w%hBVeftcJ&bV;WSPA?F1rf+xRVC6 z0Vq7J$lf{)d-n-Ud*;qUtfFI*CJP zHs`YT6gE~^pQmBGanEXbIh8GXJlBlm*cYXP&&nMTcr6Dt_?L#+NUtu$Hm|y{(@F1b z$&u;3EitdUaM?_np7=GAa@b*VCOJCgh-`5ap84a9=o`?G+WBbM(MCrf0!Sb8hZ^Rx zsoBCj?yFo8eHb>P3#J>T2i+jtf%HS!y<`H1E+{29q1SLTY-@hlh@|N9R(hcG!y zEI6QZ{M`S|7Ok*pdu6y}%D(2L!S(ZX{yo+-3wImu*)LE{%PD zWR|$m_t=Tpup;+b_`Bc7IQO`+rn_}X8n*K_MptWC*RaQ(pTjcfnny(F>zx*Onk<~h zk=A;oZ=q}C#oKPjk`EKxd5HBC?2r5LaoTI=Zz7IWoDLR7bM3z(70M@Dvz?#KF0>v4 z__F^wnRMspv%6aNq=QWFNTfI9lj&WL^y;8Wudw@IGu(y~y;7*~({VcmHv+8iI`+U(AcWOuf1Ob40ygE8A1^2yA+W}ZGxvw=D6YM%BC)f+n3Fx4lU|)p^b{$j`>>ojKYCUqb;Lv<$ z1oYiD!alY;&PfbI>(Wd|&n(C83&(mbyWYJ<&Pc#*-Uo%&Z6%iIdy-c|Eq&f|jS+xsAG?fl6870xPEhd>RQDtbnW~%p6!c~a>f^Z|A@zwPSnI1r^ra7C zqUb}k6XzMxUid$f_Ju}%-Ykz6|3W)zBq^yA8vlR zr1R&PL&Mzhf-Xq)mu=9L_XB>oOt2sh_B0Q_D@R1ftjrc?;8|iB8?&R7J+lslY$OlA zG*>*-j4z5}`c43{>XJlp>?CaiGZ|`0Vk=iabi(q3zyI@@lQ<8_H4M%YOL~?%JR8>p zdj-zKIgG7^4xEK^b1 z%;{#`o)ZQ$Hlom{w-F_F$=8%zJVSO}G9VtSn3MXRe72<8am%zDCKloKlEK)!r7fEg zt9Tpdj&@7~k30~&g(m~7M+T4FJJ#8$Mo>+391tnBMrq;pLR<)AnB7s%4tt4`;C7Jg zoV}3LR#NHh?Edn|W8T(q;K-vq-B?S9I^EdlIkxC@qr-x0<%c-cC`&GHC>*NfYUxlV z*Fc9Vxh6W&OO8}kB`44Pwa}M3^CyOBXa1_;P-p(?VGnk%Ho~Dc>o)U++N|3~2X?DE zZ{g<5#Bl8Dz*)bX7vQL)V;bfTW=u|%A=^NJmG}#7&LwwcY|fQn#^zkMTJTzD>!%&r zH~iG*TtxT9tts|mhsE=o)>+!wGJ-t)=;}LJ34$V_t*pdInUI<;g6aEvJJTa5Wwoad zD|Fsd(gl>;GP39t@X1nOAGOfyS`fEjj)U`_1Yq2b?|2sel5R_CZ0oL7sWRe6vD{ck zYfr8663nQ)1ii`|=ON(PDDfrRIgewG7F9jq0xGzEfxUXJ# z7#wC69>I*lBbZ)z#4-wxV0z(kVJ4&SBnWm76&}ezw*UEs#}GEbzC5g}3~j8yA@(Jh zK>>p46d;zd6PuviiH&~|`{$V{c2Lc(-sa2Zxo^Kvn@_Qp*QBB8jPW&-chI-nU6gekj@Y4u;aBQX-j`U+Q2_z!@*bK4seM1sUJ2pc> zJUBMvVtf-AW^#v{yV;-3OM%49nB0j&fA&P}kS&+Uk$rZK=HKs*;zD3tKtjvXDDLRk z0Snuw;-?wUQfzxDSq%%(rMW51uI2dFNIrq19jr#u48pIGTni}n3VxJf%eAyO+~&lY znC+AU{>%DVq7bTImz{4!{|9!yS$4J&J#UwoSczxZ1jC#;HYU0?O!HbBP9Gb|>@%S& z8PBp4-961LG1GrZX@1#h`R=Efg;tnF>`>Rf64RDCCU4lEs{gh0InlNM0-rjz z?e1CRO$eXgs1z1>I|NFe9_(Fmv8=)UidTD7Flz=Y5D#W#5+unqNjrg#Elm5=ws~hZ^EWxb!j(ho;jV&rIC zsnO3!RW`Dyk(3ISB6WCq3Ox+LlIQMFr+fk)>6p8>CGNp9e>mPekBe)*!6O}C>|=@U z`}&SU4z$FDc=$$ccqyGbp`AE6hhrok%R$T1YN%^g$rR>l+-m0C zEOO-;o*L&BSQW}S+f&`VqO(zQ^;e!s=M_aMP8ly_aI?WF)U&!A{~ zkfl<|Qjw~GjzXyv7r4KKitAd0^~ccn6CHY%C630k0=+7CxRu;RXPiT)*yiJy`^fAoufj8W2P*;1eWirvsCpW+ExUePb>;1_*0GO%J7ujpOh3wxs~ zUpcCd1si`uU`kDFJ&EBLeWf23J3;EumRCa8_#g${;E1#WS!d<6B^8p_`aWYG=-5<$ z9|C>#_f(F$o9~(ZG2(}KRqrES(Lcz{vgjL`**(0XKU_;ol~RAIgF$XXpvW08v?!TO7*9=_?~5Uss2=SZuTKg1K{F9%!mI2*C?zQ z*SRJ1Vh?Oq-fBBrtU$A9RAqukMZ! z#Etk_kLTXqATO8~48u?9Qs8%7Y|9zYRk+7{3^X{NiD%UqBXR-$snK!O(}od!6_#Oi z{K<%Xbh#}m=fl1pVolbSw)n`!CAAIkmAJ|llklwi(uf?7|C?x!!Pib#+u{s7tImgG z@wK)%n~p!j@#!Kch`bJt`EZ;9%RoAKv+x&-ZK)@5RURD2HrY~V+^SA+w86n^CsvJu z3oehm%^Y(w6#<$lXmwQ$V)z!p#8S+y^}`Op@3;aT-pIGSO(myW-| z@eM44KZ4^;IJSl51UgQGfyLGMUv(=Bb^3%Vf%Xi|ZNhX$g66 zaU<-h8;zUg8}CNrHuWa&ALu z$w?W4a>?mZ4uyO}P%b%Lk0mE%2>MG-vK>k!kn##BNZX|1VNNFo?T`vC)D9_-qcXW# zq~AIsL9ZQh2K@~isTlDfqsZOvBepx9;fQ*->D}E&k4~kSjpE~-Ywf$!upxD9yxb=3 zbIy9EepUl57R!##L=0#h~XZ_!cpg{mtw+P z$zAEI@WUHd*6d_NZCoD9-REnnjc6_G)LOe{Ya@C(>{Q^nW*e-c@t{p~pA%wI)$f|Q zK+af*b+vQx!wjrB%7_ld74kBiQ;gJc94tYiNUy}o8U3$0(50?pWqQK0=FqH=I%i3z zjp;Q8Tk79e@cW5d_WgxgmB-YsSTkvmHAt)R#AJ=XO{?()WsQGOtMLT=8t?AV4^6pm z`r?1hQI35NS(-KvuPHrhm_X^3H@^U=xMaZN)EsY+0| zmuab@9JXd^Pxo<_l5d#OHD?rB=V^z!h!xB?i(>22z}lBMK^O`%$?vECpTmr^oZB#y zyXLsK)OVezLH*qrUxe=6<#gUgi50qcmvb$$J=OJeOVF#p?Qq*M@lX+x*c(li5S`A| z)`ZzItPw>z14{-B>nJD05JOoaxOrJ3Pi16Df+|b;31+Snt(jw3`T=HQ+&L0Dz^p(N zw*Eb{pZ-0ujPDhQchO7G3O$Brjf?gvYnmgf@yPaR*LujlE9mE>zc_-f_iQ7&#al0ex@W=@E_!@2BGW?VkbQGU< zHll;Sal}JQJBd$ojm^SGpVL9ykcV%Pu5)336wjwPNT%6^nSCiXUhXqGCeFe0!}*4J zA^ur}((Hm?XofpIR}9B2>JO*pHWg)w1g1TIIHO~{0u$tQw4c>6=VPArg58@Ck9NVi z#{=>Fz#}}7Sx^DI1P`+nDV-V1`bxOSQ|yo}G-#S@+gJ3KK=g%MFl0$lj!L1wuWAAs_2jV8EaZXT3Mf z=wzLw1ww4`I4t7p(Ge_~$~z=ApIUUOoD7CfBY8RETF>}SOFWEmNqxsGu|YVDx)IjJ z4??jj<7}n_aXE~u4UV6T1B+(}T$)MvHIfGCI2zA}OGEU6Xe2gVpC8Hqv7e%s?Agm@ z*!bBKkC8k8K|jXe$D%K#BK_dhtv5gWyn4TvVf8Lfl^5xJ4k07A-r74Tl*6d;AB4R7Un1 zMoyJAQ;V12Di@lpZ_(lp!K%yJlXV-Mq1A zBfFm%6BpsxU_y=L)94@rnm>W6Y$P94X}H^PZYxD&fG9WIV|21sLS>{f-@vjV%k1EM z0#%N6@UgfC+m>JBsY2fj#edQE(Z1G4d0|kBGxc4SKWrn0Rf;oR8pA%-0ESY^Y{XHt z1Jr$Q@`8z9uy?Zi9-m54Pb8DM6waBCLrEQ};+TfiYugG3I~l3hHm|eqpdzhW-w{%z zl|V@8inPea8G3CAX6Ut*pr+Th0Z}MLT1_f$D$;6E4l2?Tg}zn`6=^a2 z3`JT5xAaW8_=WV^qJKH{q?ou5kL1}0N}?&Ar2-=(x%I_>a3t%r|an`avl#~+Djn@JVLvu$t$Je%mE@ob&%_!W6}Hlk2GyIjRho^4eQ@@!t$ z|7M2%jelSXqAF?*5lb_if11&oQ^#~59D^kqdJe;@6^K291_#^Rb3#p=b zRzNllc(z(Oq{2eq@hkFdBcf0|+pOXy&$cNCc{Wk}U(By z)}F`G=;LSV(c~=7PbftScmF+9Trb~Exz#fSGeRJ!>(MknKqDIc4nO;xjPWK8{ss+c z2Lxp#&jE|l&xSsx^_X@()j~iUc7W2X{@4+w48d)W>Hy6i!!?A;jDfw9EiwUL{+h8|5WVQO4^c6ud!x@J?Huq5mNMeGu`WM8}phf zppLSDR-u48V2xu#qiOBDBo#IpXv1HjazCShe!#^-wys!Pj&tubdxk(+YWJA=MHxOt zs0g?wv3W(n6lD~F1id0~MuBM>NcB6-V#k2at0p+eBsufYtGCc0nZw#UJ)bw3gWAt0 z#M{-FjQ*Z;*PIsrVGX9mxj(Xt`Fc!@!DARxj4l&ksgsV2408c2(Z%?og;k=lL}8JC=J5!>BwAQ^R!=v8Bk!%BtKSj@i<2X-E9kE69fIKyZdLwkh+At=vR$?x*&nUZ0NKGc_^3}*!l zV|ZzgleECR6m8QtlR1m20WTB)2P=j#qol{V83CNuZzBOz@JZCl)+H!wF5ZT9+%pveUc(ATk+y=tW|?5l`gbwVM&bv&VB|SBy#jbL9IqPP z<5ORN)>1gQd2bf%%CJe67h_jFs~~T$ufdD4ouV{QU5qVy-;3G%dIo4*<@Bg;O8N6D z+SOU1yIvTL?A-Mk@&MGQ*cBL>Vpkwz>GQa@ZZHynVJz$_dYq-5Tqpe?NR(OoX*-Gu z@;H0!R_%L&xvSBp_L!IPyft=LsP$@j-Tn-TGRjp(tzd!3*Fpl3Ojx6-VQl|9Ri~(>zksw~;&z;Bvk= z)`+Y~bP%n0=8wkSnH|bIh}n4Nzh^}L*1Lmv4Ub$zc%@GVVf6JK8(`^M{^z zdk6%!))4d^PDhI91tVi(HJ%ZVW1AEH8S02GhEdh#dp;ROW+Y!jv?C&hvmL^zUjy}W zF{86P7LLSJFPgLPH{$u8*15y7!~;II4(;BE3M0#n56=>h`5@D?uC_e39+mt_A0t=1 z-=kExMez8!4{}m^-PrQj7w~8wO2?8VE;H2XW4-w8_?|MxHZ8`F{r8Fr!o37v4LsJP4GLeZo7~-f z6WDMc+mqNOCGLm7Cis~Adb^_7RUlCaBZ)j?PWm86m<@Mfg>WW*?!>e1S|dNPy%!TU zG=e4S_Rkg9;#t=eJ9sE`k@zpk+UsuX=U$H}_wq4WLQ9KdXCcaQKBh`V=Df)V%lPpf zr7nx|Z$2i|>lbMVV|rsxz~{rhPf7DTd&X7+d&b9Pa_;IWsnY6WJ1~~JOXH-nAgxjm8t@G zkmefv8p&-(=ZblFng&N=&m$Si=;T%y*K8EIbu1uv21s%%6C!syD9NqB5V;i?BDW5z zjN!OfJSv*b!!x` zfGVFXRh3UNy);+g7snk@cw3K=)#dg7?(&mW!_S-0tA@ftRYQTHs*wTeQ+}bUp?tPW z*{kr@NX`aTS9_HG;J=%)@h+$t&5|d*n$ZS((SWR;n_ki;c{4`GY#cBU?h)EU#<7JQ z9qW6@B3dHZ;;6_ir#SstVq10&q)e-yRfpi#jal_?U zV+xqy9?1x?+)eNS<&AU^g;<7&5`emh!l{1glMva>Hewmv7Jxdp^-w-_Zd2f1Jm1Mysj^rs(gj3Cb=TL zYPKtpGYFY1QdF4$)FtvwQZ|qXyus=zpz70-vXR)ZO_27FK3H9Xy4e7BQ-jqe*o#WD ze}}hu7G%Be2vrT%v5cxgP_a-@HQ4$X$sW7sikWyIl8@X(`TfCr z^7ua2;anbQ!t$GrNx^2=%O_*SX)RAz`bPEA1=^lt)l1LRw9Ev(G!}?Bf6yia_KGAi zS1Xb_4$AKCR&;kdsCRd5h@xm;zq`BMkAp%AWFlLhR_fp2r8zYCQXnZC44w!3 zK0|}&5atHYXHmmz@KTR@Q zrotCjU=PZ#RXJFGd4KlaY+(c7F(>YhljRrNGgnN&gEo2UCd%)R-X?z^kBVB*gl%#k zEKoPVUi4K~_nd#>MH3u2WZKc28ulEyIXu&mcM0C8x~qu8Mkr&DLy&bhZJ!3Kv^;5g z|EiS4Lz_Hl>ea|vM51bB1MESGHYo>7w8eM)%o4p2aT>{+QJPTZjZ1 z$^G}r6*u8Q{W)(F)c%9Ff3e;gwb>)3Q~P(Fl=pg@yuEY9Bs`$@rT^X3j=xz5-fm3w zHr22fee`?uHuW+UUT@O~d(bvDD+k-AHs7&@ZBv6USIn2S!tb`D+`5r0SN|02}06AcO%lF9&7>u`cP^BtA?|68D87zhSado+3 z2_Dpz+d%Ce{!2ye!5G7g_puZ35e4U7i&7Z3N|Ya97Fuu2%nCe8u%GF=&#p`P91fr3 zUWmK%uQLLVjHPaG?>09T3o-9Dm{p%d#i4%O)T&Zf7k976*C+cJw{Fz!TOe;i)G_bI zBe&BDS>h7ks|By)UW{AC$ERW0W*^s014otRyX&#bT>p5~R-NTeVI7k@g%L1zst?9U z?Pfo&3IOHfaVz^nAc+pj0&E6Jba33hCN7CZt`sP9b#TId6vx|jEVy?<_HNJmk?9~CqH&p~p3#aBMgRS8uCbxcOZ{S_G?Yv6b3@l!fT z2W1UZV5kO)8Hg2zDNRWS8mM?3``6A`=7`7eaQz^6xg!q3qpu(AE^EQ(r~#wK$y#vV zCi;v&x`ev}1lh!;UY}tf1PK@RqJL*O@$V1B6a-&jo#0+=t~M7`ZX9A#IY2AyMZ5hTEAe^rQ&poD_MmDsCcx{M4^A5aF8kUpSP;HC$ZWc5^+;m1TU z=rTezg8?f6&G#%q-KzqF#S2nYnE>3P6^-Z~cR1oQJnXXG#(&kF?R8mag4+M^DE`SN zDE>$9vX-OEYLUEJ;5=B5joS-QW4dKK@nvu{z`-u-@pihbv)k#i&T6;I;#x{GL-M<< zHb${oYbn1%mzB68RWBQ059(#Ja*&JiuJqpg%zEh!hKu)u_IW&LSHIZ=m;Awdtau^X z)q2oGwX2P=7mc%ihaGCoG8NunxDEE8{1VtKE*&htI^Xd#%kLtzB1ZCVlwCG9(WCsb z?@zTXQaCf8IeJegOWjr5*Sh z{8voy@Y4>CiAV4dHx7x3J@7D`OY#3I?Z7)78WR)o5WgP(>uCqR!$jyv!b5x={`=K? z___Fho_653;(9#9-^PE{ksdw`|98<2{6F~L{wNPW8~;zz z4m|tlm>7qL;nz=(iJR~c&pHl=fAJ76JspbX@DN{u|4(U$%1En@W)S|NP41Lju?J#U`9Q?I?MRL*JyV6h zl@FJ=do`pm3I@%%YIS8V#OfPXy_JXTZDni9F^O4Au-^Ceqskl3UctK4{79jl^;jC{ zUA5|V)Iy-B(7bz*U7-0T=HK)gePU2d^sdIuGfx`%%}03+!83SoByU4rVxZE>2i(V? z7yeoQ<*saIfvZdVWmxjrkV-rZB?or+x+Z{>N zL3J6adoQTj*$?(G1`BGAyD1W2iki=Yn#I09&LNYU0}zvrNow{-ObU#^qon2tfTjM| zoYwK9cWV&BRzA+nYoz8F_*EE11sTA;0C)F2k~d@k@p_{|bOdKeq_ z0ko>#hnl8)9F}ADu@1i~41S*rRl>JU#j$5CNZhFGK87+@7-uwBe%ix*4dtn0&4*W6 zyP!05OqS;ykWzuN=vX`E1H8tMMK8~Nz>rIPoHShduM%r?8YY=^KSZT_luUX(Le)W^ zOX8E@Iq$WoSov?qVUgFuzSHZGuCmM<;E>%n%e+ZBSmrIt!7>*(awom9%&UEeEb|An z^af?FgW)nqP%zPN*2cxC_u`^?8rn%}@?>)&O(TAd-2kvme@W2u6$uN64tDQiEEYCXj()#EBM}|KK7+h7NHEW3B~d@ z==e^kHMNX&Xnt-kCW;zhAGCFWaH}-^BrLVH!#Y{(wSb9boMV@uJjWh8H%*#fJKTwV zge)qG&^!_M1(`2z1KS$@$g4s=hV7UuJBhBHQr8h(56{tS z^J{y&4dMy2cxoi2v+@JHGm`gglPi_{cO4Z!qKhS3PKk=HyB6h`xVTuH8Wm%oG&n|Y z#&BNOivhpHng_Cff{CAc9GDIX>^i2C^YKK?Y{A~;e4|Jn2XBN!9S8UPqXmT}I1U~H z{o~*vEbT%!w$JJ~IIQvpB@Wi58Hryb89mv%;HoRy19SO$-&4uDTCY^PcS~KTbg2B` z#N)C=?q>th;Ul%(OR-`u71;*CMx?JkBXY&DuN8>y=myPOC*Vh34sr)5E?@`7DCdP;PxKo6 zG}S@E*w--mADsyig{P=jPGAv5AHK{H^xXLcD*AuVSI^Tkb>6D3<*F(URV^M#tejvA`*4pq@KQ%yg@-OEHM|g-g`eeob1U9_4R5uN!ZV3o@z$Aq zlfRQp_kXchPJ>)VHsD3g1MzQ zBIaaa6aoTu6i(rTzDpO^;2BqEgl>;TL<632-EeusHC<3mGeN*%(%&QEE^%5pP_stLnh@gK*F3iyoE3y zKNd_29hWY4#WUwJBmC;Bbdj;zwI5*HV(TQ>e>B3nea5wpsKGPmc_TdOdPm%jhxW`H z@p%C}u)A8VlUwP8aI4*Q(2vwvb28!nDpXErAVTTMkOncA)Rvt1ljcbLV(6n@8D&`S zV|7#+_6_EYHg>mv-0XKfWQSqSV1u1@sjSSKk;U*``1u;ooa>D6#wjgC$y8|<=6mDd zx)ncV2LP$V@$jQti0orrd&8M6#Ne}}oxxoXmYCJ}3EzXCFYw%bi?KbsoB8k_YtqG| zcF@%3F4DN& z_A!HTu?U`}1%`7gd45hrL!-Fo%!TE^moS_b=c+WqwS&IUnxT`uj!F{m`Af_wR%ITO+jhdHw=7S;Jkv z{}|loRN2Y+-7Z7%&Y2=-TDExedAQ#_Lwnz?|M$b4_5aN^aNqw%&Ap2Zztt{Y_;0}d zzL&7|9I!NQ{@R}Iy}uAFJ_>yr-`$-jnXcUb3HRIf)xvkHXH0RMXaHlAUUHY2o)?AF;m0<>6U5I+;$aZ3-{m>d@M5!|nT?k-YfA$rX`EWAb(Gs(FhY@Ypsj zqGy0^yf{1h1+Y>iZqwIoqDLXp3fh-OqX)uX4f|W2oajv`kUH9T%8V6hX&{qQ%Y&G= zH)lRxQ>GA>w|ZyBcGq5~>xcu}*`2j45F649S%^8>+swj^POm55W?MRP z-*&MMHzhGhw3xeF`-pyzATdm+;5Sy1lJU2C6bB-g8Lz>upb)KMh?Y152!+ z(c1QQvT!+^9hHquQ_HmKM{ZJH9!$ZcyueLnvj*whcx9T*W&`YgHnTAH_p@0FLS?f8 zc0ZfdAev;8>1vWqSzy00o1A0#)!EEpX(~fTZ4?#@RT)Ceb@L3>s}+5wRx63ITH#|o zx+rlHbt4`*Ibc$2hkIUyugDxn2}2p1=Yh(*8b7b%*?4bq;7&#viN8};gP+bmLOP5^ zBOn`(Ya-GQKpLqWuN?-Px$bf_I~(wmzuOg#=!a)hp=pHsUg?NQcs4y@gfGYc3fez2 z{O&N-rjd9E!S}_Q!KQBv>m*I7GM}5iMHg+1RxugrTkTrgeKn0lY=~5^5Wu9J$*ZFn0!-fik?rVJk#nvvKKGZLI$+0+;A z7(ygl=I+vc;2AFOH(}OKn5F%2t6b;7n0fDoAC^gOmG<#(H_Cm^XF1jkhp#8_BYll& z;%l1p#ZPGOL)EHq_D_cgm2osyD!=<63g&0ooDx<(7A@3D9j8y)}yK5N%)}8A-E!6 z8R>HZ=R}=vI-@~HXn3)QvkgHvg0KdJ^Q}qRm623P@Ue?^`YYhAX9)7jNxS33Ab9jQ zywD)yA?WAAlV#8te#7_@Gzf%|V6J3t%HZku%T1*lrJI{t5Win;8nxW`({-)@J}FB$ zFb&pT=JJ*}K3Qa1B6p)JxPH%Ylyp9;I8zi?KpZ}Zjh_U>GhB?w{V2_vs$pcGRCh-= z2mbb}N3lAo1AmS;r#j*R+rJS&vmu*e8CP8~xyAbP-|aUBO?$u8bT9 zZ!_|(XI@eedRnl`yMixaZT5@=)m_1{0c(>p1vVhG^(gvyFX6t%BSI zRq559u6d-L`onAPBj{TAa_~9C3>vgMCfQCz zPv_;3^TomFW+1(}YeU^KXQEGCavXXIi}R!VHl~Ym+8@VqJvt`JFvS~YwY4g>q!E+L z@DJ1~Z(1%y>tij@vPMh>x zQ^?798NJRbc<|3E*SdszR=JTx>RDxm-=w7>*vwgFGDDtKzOLD`%1ya)rN@=yk>;y{ zTw%d%s0wn0SQD-&Fu)ZB;)U4YN%-{)>->gW4ZC*=#!!PkW&F1qmhMx9YK_uf_d&h< zd{8ex1#T~;NGlIMDMKsL>Tt7V892l=I^4Wo=@EfV>ul1S+#1H3*JRT=L3JWakB_5D z6<>`WUqf^8u{Qns`1G=1ic`yim@Eq@n7)5YswK8S)M55)&I@>^y9Xu};Gu9d68k^_ zp78<3b038=s4%lmfCBuOpL76GO5(Fn%(?3JG*JnnOSiPP&XjBM=?~YXqxG;>>B+3z z7cIxqhYY?#+o59yVX=NIb3POH5)!6Y^br94ir#?y_!T|tL`k?6y_Cdnspu^HpQ-2> zH-XU=h=d6g&X!tiiX!z{sMw(d)Pa!FEGrjA!6g2$N@b;vwPbAiU`tiZKm+B2zeByY zQU_Zy3HoTuk44~g8#)Tgu(O)`BPKEyXjhvO zEY3H&X`yrmWF!_NlnK)jN~^FHNhCwzp3&Ua;R5UOw_)=P>vwUn(b+0{S3$UH9oEQ4 zAt!Q3vP&kxu1D;TCigwfD+h7KSOkqsXBIre)+oCd*PDIqxi<(5_K>vyFloDlt#(?{ zM!+?9Af|5~(mH_zi+dsHZ^tD&foRvoh9d((bJ7yGP4&nW2h2dwW5ZS#EojWfh}?bf zLD!eH-UPet#U%z-1~gEzq6A-y$2fS&DHwk~gCEX;=B}`kGgQ0E*gnN9TDJ=j+x3>S z1xlcB3To30mLrdem4hhk5&8wUdodqP+H&%|$stNkiZnSyDM59)Vkh{Jh9zz!I`q#J zbFi5y_dd%n#Al=nRjZYz?Mh?Dp;B|Kr!_rGPV(EooZ z>M2NX6Gc4?ps%Q_P=LOou5}5oM@Ax5QBx~4DMf3qn?;E?Q1lM`cACs)1CSUPbDqF->a!T)V{jO3O1r8EQW* z0L3&+K+CZYlTmDEJ6GVFT7{>8=wx?v;`pXkIf&k`;!E1YZcM6H>e1e37*YGJIx$r+_B6Qg{LCRvyFBcw_~(c<`LHG+FTXe*xqxDf>_2I zuz7~y#I<|I#;sHc${$vvrDGqdVU!NzHiI0u`=yjy?;DJ4htsK*jP?$rot##!0pU-p zHh{pis+@4jng+HV>awjAcBv9qAPdS+l$$6Vf-W0jv6*9K=+b+kQDonrGEOCEwK&jF z9%V12_k3e#tG&hn>Zi=ZvCMbCo4!Zs(`cD#zxHAZ_9Et%QF$h4qTdeyLd~&S-;+!f z!43yHPHevvpZx~53sfBTfjV4=W8r$mk)W(N}+>!%LIdXSsH`!D?wAucb)_dcDPoOlzoCuw+Z`(~W%FydoJH!49XRLPJP60aAhD z%k6AuTbzhjM(Xu^JFoePdHG%q-z&g-dcR$2;*NGS&~GOwyVrWB*$4IUxB>&?aRoAM zmfl0>d}D4=N@N6^MCOBfWC{#Kra(q!U#|^q$(!6BP;Pr`%^#CS&`KS(=k~I(IRVXg z1GvQG$Z3MC=`InNCSbt7df2}G2ur;KjF7lF1QQ9+QRa_Wx9G&;qG7B?;wTKuy_v3GIw z0BuCb{ewp0F}U|%iMjOi!q$jusqUUJ$k>Y2nDMU5Km=c%N^%hU41e zc;iuX|Cd9_Xl0|HxC7D7y{4teogKC=y)Ma7sjTo#RBOYBeqfSO#U~@$AqG=nh8Bgbmlq_PGO{A~zHkpKqBVLfr4Icgz3oj}FI0lBh0*9)o3sGr+`xkfpq&-~ z`yw)ckF)?JC3&8Zk6}2DX3qLglMTtM;GTv( zHn}22VjDPPWu9Nf(>3v7lf8h{~nu z;t@OrArQ~iri;E$dW8N?_$tQ|7vd@SxAAN3zIHfGR@9lORZrn5$TppSjli1p3nosP znmwcO+e}dlB7bowYv!%Vws$|g)?vSJ)anlp%21scy-eRL|WEt*M zRfeEkYPIi}lSHY45kFNZN=j#O==N0+amLhaQ7{iBF=KT^+=E9Ji|$RBPvTfgXgu~h zQe_uB11bGwgfQAt^p(P0Yjko z?uNKyVQ0u_Y&&=fC72oR?tJhRK0XN|KhtRIlrBMWf*5+Cndb}u(MY1&h&juj#01nz z5RYSnQb!PFBu;Un&tj&blJ+}toHJ+ObA7OPxXo-GJsCs;h`bA&*k+B#oQKF;+&gx( zR&K<0O*y14v7bAn9=kVL#DWtRLl<p>(vZLT)KOjZ&Pq2THL^*cpvdEL@FJ zjH494LMfJk$Zw5OJPZX_31a9}l;XZ1YDlmY>rrqGBvdJ8tpVYcVkzxjDOSMlmtr-D zze*`Sl3I$Vc%@i}MAq#6$CToYD6GOdgg>UGa~Vq%_CBYf6z8)@N%Sx&t|-OlQcE$8 zQVdktATbrkEbhcpa2j;NjkS)rWf+RLS4uSxz7x;}fp-E#z}uWxBjN%)1xNq#paTKu zgu4+qy&~-D$eGBvk+}Fl?pa6n3o%Js(A8}1^o4|$kvJ`s7tNqhg2;cjlk?NRz)RSr zOx92)N%%6kLX%0_l}y5(lt~auCTDr+;L@zpEIOt%O91mUi^5pX{p&BJW_i*Jm6}y) z79I073*19xPvhf-cnXTq6Z>HIs2GFqUz2dBLwsd?I6UJHO?FayfiWvg=gWK3L>)3y z@S^EB=b>#CFMC!Pa@aZH9OZ;_6$nf;J6xfur2{6I9ZoPelEB2W zvk62A)OTJNG?HtzH5;n0yeUSWJ#AuABT{1lEXJSRi-R}M5XX%2FPLWLNTGu}&CGYr z1IKIQDz|wu?~jSC{t0w8Eay=YI4;J_F^nT|$`4dZAFCD|O_-+=B68l;gl>P?3k>=c5F2a04RK z3HLZmXu+b0XiN7A2!Fc-*^@sSKk`FyJ2SMZnwwW#GGe1Z=QxtRyUiX=t84Q^g$2}AntzIiJmnBR}|d>`&=isP&;+b zSUYReM$+qCqodU))hp+n_P;dQv82xq za@xo_3#lkU#6@^9@)c9z8D@)J31|LdoWZ9LtkF5Uj>BasBj!p>hpD_}s-_p!J@amU~7SeVxS! zxC~+4Ga8F-Z)>lOfe-8AwD$JH+G`l3(Pt_Ckf>HjM#=xf**vny8HL!~I-=hXbSp#bs%i_4KfC7UbzXFzmNUeaJ zqi#|GC741O*VD_|ueDSFbae>Jen&NEB4feue)NrBJ026iRz zr66PhMql0&%an9_HY%%8HSDo7&9<4WMvWj4Sj>J`@z|Z#XXk#7*14xVar%EJT0BFm zH~kNrJoM_9)P+Ed#9gYSR?1WqUW-($c4R8bVE0o|4dQo7MQvwK$%k)$1DF0C2ie+S zB(FSc3EgTW(&l**RBxw`PBtH$jwH(?x1lO4BgJz=kJus&n+M0D4FjxCpGelNIlx#s zW4gv5ShQhCKw)t3;wy|gpvp$4+5%DgWHpSkH+P#|z5bV8TBThEofS)yZihfM)?i(WO=VWmA9Xv&G!`WvE zICLF~z1WCa*T_3)5Fdw${c>O*)GuB4LH%}ff=#xn6ZG#_2M>3nSNhOpBkOjDIIBeu9jDl@>oS#y?4mU;0appP(Oq}^=|80ohs6q7)?yRGg&ac zNNcn6?!7bfP(?Pen(S(HQUOyp7>Q4S#;f5{n!H5mN(5;n`T)H%tCc7kX*e&<$B`#i ztx-ms=mWUipbEsm>@;W4793@SUEU3Iw$|6AK2N=igqU|X%!df0k?*OyVG6GYq3(t$ z1EKDQsf69X4x$D`lj|TDY?JFCWL)Yx2;L2&44H&GVq&}_Mj45D9~;s!|IQd;uR}LZ z8CiWsLwv_+U7I4f7L7Hck@K{!4d=TS?1^KuYcAnOK?SUeq_a}eBv64~?EWb&zM^S&z)fk{;sZxf|J&{GP|7f@yu2u{X& z6*yF_BH}G1bs+rfIRr+w>Uxe6*!}V-2hpTF(CjrW4}$8ho?mkd$p{FTGTmX3*K=H= z30gWp-a@iqev%=?n%-JN7N=gXAu;!Q4bchi(lACN@dV_bTPKQ6N;W$CN|!I-a^h=g zqUcP+sY6e&kOQ-`jGdx)gDBGmW|g%69^FE#n>MK7PL5&2} zS~w4ko2<|j0%^tqF%pxI8`*ami?gpB%b-k)_B94Xt2mYcv0!XOj%ylWpFci3^Eluo zH^F{Tc5Ip^?Bw74gYyG@dn*6=quHNu8c>7E@mkS7P+N=LnO2z$naXZfck5HFj!|AZ zbhA3x1GW4}klXJveuVH=A+QeJt*CH@BiXeKy3A-DWs({}ESTyvpA_p8tuiulyf)f? zD+RPJG&6<$ot7l&b(~RxH_T5z$1*6nCVxWTfs{Oa8sqx=zwie6&tOpDGuuR2VP+0v zdg<{g!|9E&R|CghPaD0RPnTgFf14@0bxy^Ac|^@Hr8lOd-%0&LUXmv zey*9?YPWw<#f zkersgIpXl5Oc5_g2|D17`cWE|nUQGMDN~HW6W?g1xEu`ha=QGGJP>rAd?)fMCidso z;4TSF*~U+@JIjgvY7qX!ejNxku`l)xCnxqxNT?c6PQp_gRkV9GpcZz&1~h`$F*Sfa z-&D0hOj8^7i1(A7IBHd7-w|x-rJ-*lamI2Sm^u+Z%4EP2pJlhSjz|R;;}lBWH%XuD zFvd@f6x!Bi^)jT6;9#SLz3;cIUas*#c^<-#e>&XoT?odnN5v6ud;^Zr{MM+PGtfR2 zjzOt!v}5-BTEaQFn2yeG&$r#Jb5c`F7I$>IVhVep+aH0t1ut%a z1i!i$>ge8%%M#C()jdAOY3;Ja138(K8;qbYi(}FfOJf_d8=^{M7E4K_zjRnPxY@rPA}>6^XFcStt>^ z+X_RB-__*@$BXeU*nwv448COya?xs{W1X1&9SZYq52QTFY1ia}z#OE(NYsIw;m*(r zCwbh2M;gh^lNC2zOin>1x#@ucZhDv!aL95%Y&p#nKiP4)sr&}GslWg?Q$U7FZYuL5 zEC|)*W{u9x2A!MAdkQxdEbBhGY452?A$2Ok9-QRc)sk=7;Mrc}+a=BLZPxG2H&@*_ zy?=9cx8jE+YuFg(ZI)ANw>~@wP9BXW$$Cv=@iy11;}pYd)>v0yqm&t|B6i{9MMhS0U}t-0$hk7flG#7CWM(;|M8{fB$lt&VxC{@a^2q_v z4+|WNs%n|%Ds#IKT8es9fqj_>rMeUt5J&|E1o9;>%%swgs_T0X=E?&??JAtZk>F}_ zWucSnl;RrE1`w=>(Rab!EF9s)y`k2g$ZVUzZuRBDYjz<{)-fKZ=- zhBhg!7b3~!U~c?HNb5e3);bVUTGLvmi<14Mv^s}_k5#ZkmDmoYv=)SvPRg7zoJ~+N zr!Y<*a^Jh{F9LbK{J7=An?6G7^vzyB*?HhO(V~fYDw!Z$cs};U#{o z(LTECoA`1Q2uMT*Px>{`E>HM5AHZK$8T?H$+GTEoyq11u!6^b}OQz#ijTph?d;wzLa4-6<21(Kt_LMiloGIhQ}(Lqh2 zlrUZ>lqeNSIS3TC)eZtMzzc-3%JomX^{NyQ>z{C=k;-RR?*-1u`pQQKedQAXmGaR+ zU-{@@Qu$=uio&l#S|M%yMgEvW9C2zF$l-~0awc&)Y9MaefQaT$M89(!j_qps()Ug~ zImQzQf>2|;QV{+auM&hBL(yB;cAeg~{U@eK%0U+xiKL(^we@wP~ypc7M}Y z4T#j!$yCKnPA5yS$?0S!0eiuMr;{ZpPbcdKky+n=?jSPq@ILa;fCR;drMVm5vJTPm zPzpljp#pY457i*l#t)tC6;NyNFvO>qw{?DGt+WWC;jWBgQJnG7?XPbDghw z)B!|6CnGPq4U@TbAo8cTbsAyMIs*KA%W#~vmt#VhgkokDh(C;($hfe2J>a&5BnIJ$ zkBD>(Tuwl+!}TqKmlF_7t^RD7ScNS8asmmWD%spastkJ_tWt>n_pC20$tLxM18Z+D zseM{%v5!R2`W?Sw_%ssKr@wjl+p*GXtZQYM_d|^SIR(?OC%3Sc+=tHx=}q~R7LMKh zR71@3K;~lJ85Sl=+o6%Ig8;;*wCLx&h!rD&qs?6|OiOdtBdsMMG_ zoh`68s< zl&x#LNCUE^z<_M&pf6k1-s=I`(m`Fe?(sYaWJ?Eq+0wy)Yz+nTpYwu|vW0T820*rS zP|DUnAzM0#;_70xhivKKyxSmKCqQBXV2LMNI+!!rlPv|N%9bl)sNYhyZ1nnzr$V+C zw6In{Zz&^XYoRAw3Y2>5ChD!R$X*GGC%&-7Zc?_&LHM#&iU7BO#Ggj}P18=!5G<%jqnw&E z4#wf=^Y9}>yu(O-eWx7G_&RQRXA|RF_he4!^~LG(a7+9jV9xJK2=hZ8U;e^7z8rrN zhj=15t<2-g@ecU3%SsU6J z1oFDEw>9Rn?=D9P?|C2x5B}6a0Q9F0KGYb%0Ri3s+c`_{mFF@LKpe9Lk^?&Eb3g|b z2XxHmfDS4SD2$Dl&w&644p z6Oen5Q$e{0S%DN-|Aw-iy@=Qr`Wr!YP;2&lh4&CV8wt+6$yy3Znm{eh+8uR8)zVUz z_*JuUmYj|Af|kqDsI7r*8xl<2wjsgPZ5y&HrD|~n6QgRe7ru~b*Jtah=}XPl)q(J5 z>%`FHOjil){!CXn2sP7HMF%z0RZBwEMm@%6hUbBbr~FFLuXqY&K{gqQvyl8#opR2u z5wWuty7P{EXgMhZq2}x=VfS-V148AbfetDsS*31HWUW%^2-GSC25OZ8nGaQ~{_Dh? zsz8Ce5d+y1zC>P*fQ`iakVvZ=+F@llEfGI7Ez`PSO?tlW*Ur<%SJyd_r2b2z`vr zZ8^K6bBX32TFEu1%PGEV(Ymi<3;%blji(mQ#i-M7HCH&jnk$@=<_c%u<_c$BbA@wn zGljDRGlR;=YQ{642V;g%842oz!&Sm+at>*i3j=i|ux@%O%YFrBFL;C#p!WSH}*VGUP0qh`_>)+#d2P7jFKrrlPjF z@@vvmG}4!9Dhl`16)Xr}!NQ(YupoQ|O9x-U?&T`jz)Y^xrE(@WaCxlMh3I$%rgx>d zrmp!&P_`fXJ+lE_Dw~Q@#O^m06(IaZuNs8PNgdOu?llm@lQ}7Y-Ooum3Dp5pMg9jh z6>1IVci{xm+Ofjx7R{C#>`iE|High&&!t)WLxWx7xk`b5KCPqmEh=XKWb-lz8Y}>^ zdD$HrOb2E2au_sN0A%y>7BpA@Wb^VEG?)&ud07DsrZ8F1)L_Rzg9SiMgIUX77vgR& z53&-jOe>CU!P2=7atVEXD#kPX)~XbbJVHDc!W4MhJ3?%~aJ(Vz(c@Z^)>*b8_jw?j z`S_YN$F6)^h{d|kb!pkodStE&k`%AU!s)fhR2{`?5w6R)1Vk2il(#P~nmQZA8t+}M zh2|ZM<0Dfw(C?1aBR%UppR53~JL239ucZv^V57hF8N9r$B_!`ooC@8X0uES(cFy|v z9z%TWd6lw#myv6qjwyE?-2I;z*~>2YSDx1*M!dl2X`g~CiF@qgHa66J09)BB{$`2? zJy2$5A+NH^;0;$5ZiYcRbr_XYgN(m|A?8L9M|rPE8Q`Iqi)N&NQUi2;3=loU4@LArPJyNUWB_Nc#DyM@|S5+ibB|p;(l_lzrvJ~hS0M~M7YDv}mgO_MH zdbaL>>QXIOzq|Xo2kJU3bT0N#@R~I_HL(c97CiCuaq~xDYT~6saWM$4UWh*pm%|Q- zh*@~#JAb=6B0qW`pO3kX05PgGD$c{hcZ4~7EM{dmBNCeZlzXNJ?HE)=Xg$bCEmE+n zVVH|cu#bU920|72VNVLLN*Yl6hbi}QA;&Bs^4Ct=~a+vgWIRcO~W~ZC-@)Vg6zt8!T^z)AL zbG8}iBuQm+j@j)uuRU6u_5`av^AG&T&oQ&@TgE5B9sqftfb?VH5TFQMfS1TD>P7g9!{tn)b4DCQ35W@0 zX=J4n`yM?wI^JXsu?-L%y`ULE{ADx4&I7oc2g>eXz1h_Xqh+b)YxQQQ%um*0H3O$cJuq%l?S>T3^gxPg{8h8JedxF0AUNL~hK~uLEt;Su5c%2N8vbq&l%G^ukKVNI zQ+`rOI6EV*3Z~{}Gv@3GqK?EIvxj|mCqpdqf|h){#BAd{1h5eI;KVO63!HA)t62_$ zQ<#|**p*!k0viF5WK`_W@x`xV9BPS&aWPmxE~Yw;D51+I5R!j_*or5<2}Bet@MH1B zZvZg?mTO65g^Z5nU0jLT9ibbE=^Zk~ZrCjzf6R0)K*SA9(qgl~p79!zAg1bvIN*RFbGSU^o z8ak=1sSP9`8zSQ{c+Bd7ApT=wr*{_QxRg{R)HV7oYDOJa##$2Dp-!?=7WM*xN@=lDK3VJ*1IKHuoE9sm z4ziNktfV>^sH_Z5Ro3U@Zg7(2s=dKnj>t+x1YH+6rE3FRtmA9G^sLK1X z_nKaLzw|J@@&+)k^6HpgdF$K=+{*jC9+;}U*&de|t6zBopkH|#z4s*tROQt{zw+v! zTX`*3-cm2FV;L7JvBgS!um|o(5S7_ty$yh2CUCJT*WsY09Qy`~r1!&>-C;|4IV&~z+NXl?{?xqGS}c+Ph@z2ICjg?olT}9tSqe0M zFNa&>j09WLpyIC0aKw*z;+L65i)t?cA4$&(p^;bMU`PBL)9Hq6R3WwT@6BG(R!~HB zOge^Xg|I*4z1EViahP@=lv4oYFs%_vDgb)Q%K8Z!wB8G%7(pP8B6$KtflRx90z`q# zpDgGe(7B&`uTzJ~4cp(EK@ee6?o$F(9r3Pqc9IgCn-D;KkTx`pGF64 z25vSCeT}tPUH}+B0B`&<0(bBa#`^tt6@4eYSWUbYv9%Z!{5bE2sSAA8a-EZzy3+H2Wt1BoR z147yM!e+YD&V}jd5Wxrg*3KJ{g9dt^9LlqHg5FhzGA#8j#}vvCRC*Uy^GXhs4v#tV zizV^n$VA@l-Lc9Ow~5e{M&c!~f}b>rpB=KxpvCX>TxHX8PAE(El?(eJ5!Z$~TC3j` z;@qCD3`;gE?W;gf`?{TxGQReTnJ>@DRD$r;=51aWG8WZQ4S-ae!k+Oq^nmAAwu?81 zdRpupHF)4e}V@c z~ zB6JQx*cA->N`yTX;Z=KKp9A{~sbQ}}*a47Xw?o)3HW&7>2)mA9SBAPrzeal{2FP^F z_Ns(-cO!HK{FQ@@pAUx4LcCS3KkGW!$MsHOXamv^0GWm^NJ9Wry;osAkw<;f#|`BK zlnb^K6=aH%wWtdBhn$&+yq1wah{(g(tu1y+CbE=vnaGSUQ8JYv;}4-k*qGLkc-E^b zkMwoJr$G4~6$L7Rl4H9DzNV^5*3Md0S?h%ns44+aRuyL!Qe27`T#F7Tm-Yb7B3;aWKeSIs!rBFZXyT#6_Q5M?b0 z6=fssGD_&8A6MZTn2LUGMCp>-OTlg4svB99G=CY&%QzncxH1wL@L35A`11O@N$kcz zIPhBz@5LS{SBvDp?|!_umxs!vVc;jMycL*y^->`l_|HOF)@&TwTih1U?$+pP>FpdqEa9wMke)GBz2nSv#UyKJzk&LB&m<%{hOL3H79}HqaMl& z0TGpBWu$e5fHNdLXBy0A^ancwK>S6C9k?!uklO zr~}{ze4_BYgM#1@gPhpzc)QvQayH&R?$b7wc~}se{F;+1k6(~)`gwAXOzxk6k%1iGIZ;JU9+I`EbTQW!qdW2@exz*5sjN?X z01`dD9!fh*p4RqqLwtRP|b5G_^sz?~iW5smm2KzPqoXud+$8Gytt2&4sm_@#~b zSAhK9%u}*Hw8t_GV~V#3TX_(DWq5mCyiK^Z9ZLb-+nFAZGX1WR6{1aei1l~mTp2lx zY8NiH_S6ov6P%1M4#YkNiLA$UTcvz^g8Wt~EY>_N1+p%* z3y-qqq=1tb0mfc_aUhb)HSz9;$^cK^68V;D0s4?iNmS-U3kvV)BVG z$0=ZO4FYjZEYn#Fml6`F|ITwD%1NN!J7Yjpkw5`DnRus`1S+-D_7H4#B!PPC{0MKQ zgF##o>*!?1(nS@C6JtfrkKl3xi1<&&VCNGMCEOrckFT!pfypCfB&)B$UR1k(D*BcD zdYH`t=1j{L@e|UWXJ0`QMZVVAzn1yKW{%~#kc@Wkb~fs4e3v{uo7fXG4^d51gl z%Os_=r+k@&^Ni~I0V>7BQjefY?B|Z4+Nbj#5YMo0+-74MSKg$NA0+d6FdCSVcm_O> z1FMhHt;19Iw0xYNYo)JXZE%fLI$RMR+1#F%G0p91nT!=-W%#<>aP;vAc0gPsL9Pfd zTi~`lgb8v*cuRE>qkPH@N6&+y%1BUO5$5J)Wd^_!{}{>DH#18xbu%+TZ!@z9?YyTW zj=>Y}fPw8RBOGCl^oV1|IN}C8@u650qa}28nb%Z|f|d`BKFAR_(*0n#(-I0LJoj=o z4B@_3vMF%+e=hd4Oa3>su-akBs0_yCBEA`W@l!LD@t$q`x(o^PW{hCc#qKWKS|MbN z1#yFc{UEN^ig>WBNgrTrp8qX&)XOBj&&9DtxGu7jN|k%P>ROfN_i$U;Bf2|9%}Df* zXNoEFanb5$a6hmYSgYRO1sOCFH%;^Me1$Nl^@=2eXIBiT#Fg`zi2iuEhiBqPw$W^G zYdfRCU8j&|$=3n+fLn{&$!`8u$v{e{dtJ`24CjDfqyX8PeTo)0q;)%bN4xY$+<3e@t!EcGhhnR?X(S4X0c?3TaItYDB_ghX^^^dyD zILqRj58Z_?daODaF@1{3AGyq!*A`t$W}y2s$({J)Wzw!_3ym*7;TB#DY3uT0RCK== zA!i_fa69}Y@O0nX$h#4NHQ?!fWb$|b){0R)bqFG|HYeF~ur7C>QWC95!{SiqFzhYu z{b5&zbyR+b`+;RHm*~K$#3tY2W|;gAx3xs`$<78q$F`nHzAnKE`2nLyo4_beAD8sh6 z$ER!(>kA)7)>|6R9mskWJg#hotY3tz*D~w#koB!v)|s*%_hnmm zYgs4OBG^<(8h2c01FC#0t?!L z1yx`{8Hk)3oZky+gF;#QaeSBLA&m$BrT85deP@?Hx}OlR5J9|x-9sti;#}KSMAQ7s0|7Xxa-j|1v$BbpLMnW514xhWE3?$_CSZSo1H#-`v#y{qVoS%oHoPnD*1D z{@>C4yXndNCMNnkf%Lp*+N(AHGCl7%^*;^%&+KK1l^>e+hE)F_HTC}r{73(V@INu_ z4^sVq+SLD`Z)4&j`v2Utze@Gr*wp`>@c$kC|J$_987bwZR-D2_i-q^KXNJje{b5|Q~m#-`*-=j$M-SuD*gXx z+Pi4}CI5eF>VH1`A6tM^kw(bgE7iY=4RCJL@8_Bd#YjYch>5fCtUNp9i zkm~L=maW%`8@8vmpVWPKDc=1a&uR=oJ<}I48wsadx`-`pn@mL<&Z`SbtOK%x*sv>2 z$GR*>y^WzFtj<+N2m7I_pwGU`<=1CpUEfZ6hUOKki(*#KXwomS$U02aPfYZ3tN$}NR<|LD zZGZYVT94Q37}OWtGI=wjFgPX4lJlcKhG=2}qQ0Hczb&ILfxp#T`a~Ih1?~SC9A&iV z?)xiYb+pS_W*H5peEeuiV0WVlZ(C`L!K-Ys`bZ=16a4pE4f}~kxX&6}oP-B>cpC;I zgV($E7vHpnwb8ZPZ`)!79{TwL|9!SdyO52zpMl9T1NS5Gd*B1jtABFHzjCHV7;X-# zNq9M^lSy-z4@D@DgA$NnRFsS=rxQMixMT%F_l(ro_%5J5R3Z3hwNTU4DEL5=KLWCc z{nJPlXDC(|8Zv2BjHZ*3DVbYG!b_S6Gfp>YCA24*TMkkstx9?eCQVL8r6!HVtdeHy zAM27;t_$YG&l#Pp9X;V&e*a7NSp;x(kPnF(h^BfDZE#; zP&x0oW^~*-Sqqhz40XO1DnS|Q8(OFYRj7S3(?GeVKmOJn|tbzH6Nuoi~@KC9lr1# zWNl7d2XF%&zD{x20CC6+0w6EU>Vt7X4Rh8%trgg(EgaKFfCJVrd)Hr>1TD24DD}lc@fW=OHAh*6h&4#QZ>u$ z7Tt)3zZ8UOn<{9RZBsI-Zs64>Ir`Ku@E~bEfkamU*ig_zPI6KN&~# zl;NOf&C#9hqf)Q|!w_8LAgo6!BYhs%DN?Voly!GaMPck>?QLp+HPc4eXQg2BAYgPD zI&=+8$jrF23T;Ie#`KZXqfV^dhbkgh++S|hCSv+)i|z!1Jb@r$r>{?Xm9fptjLp$x zQR<+4$NGCJb`L&9`IIIn(&HRsD1wVLq-N`)_Ay=h4q&!swf+^t7x^SL$Q$FaZ&INEBzc zR1C$bt!PUf?G>l5NZeJ-dK4uuj#`r&65%(Xf{KfLv-H|azdTN~~RxHFHDbTPCVl#7N z<7;8@44bR97dlq&T7|eOP+n+s_EF7%QPgwwNg9u(keA|% z$k%I3mLQqDOk*-Zm&q=d%aHKZlXfVVGdW9C$#{>83j2Um!2%bxrr51P%fS16u*$ji z9K-n>>aK?Do(bNc1EK-M@^r(ItCU%o!&|;}hpy8I`?QpW8m30e!>$l_BVjw4vT0d+ zH{^%i38ZxGBBNWZMZ0974?*#)Deh}kYa&BTip+mBks&BWCQlO?f=XoCYoW4_y{2p2 zx?c;Gm<(0OxlvFs1ZAk*v``6pp+<*b++2x-uj$`Lj+bl5?p=56cv(mRYG5jM#kX6I z(ga8VU7(b_&)^T8e{!DMG|8xSLLB1-24JZoR`N{26ROevkd@S0jW z#F~^2!6v0cu({HKxHl;sVogeiV3X1zsFzL!60S<88unjSIxP{(_P6ioYxYzia{G?H zW-mc^`;LgPdMlF&i!7zHv@+npX6+_@>G41yM&cdtzh4Ap(B8Dp)U=yyE%MB^)}5Mm z^P7-5O}i0vwVRaAIu>HCnX^M@b1v3$D%)5jASrE!$ea#EE;FdlaMi+SPDRC#&>`5I z+ULHoC;_p280I}Pw5ml?AaTTNfml+`3SXzb ze*NZj7F>2CMt>Ojh-TBPT_M2CCmd@k=By=GbEO>r%Z9b=mI1CB> zfbocgb|%FBQ0N2vNC;bHF_3u};rojdebBKp68Y#jatUDVkZ3tNyp0%`t{s}^^k(k} zn==r+6MLtb-qBfFqg0GwrP^DmHFX4~+WS(Q^CRe~y~sz}ws*DwC`Q?XEJL)vs1P`- zy?yPc7Xn8ZKeu_&?b|S3Fki$*)xy7LID%MP>R9WUbk7izgAQJXu8a@zQgme$7`Pn0 z5U%Q@4$31t+5SfzbnxdcM~^jX@$Vr+9c^t%!DK>tS-LVEVUeJ`kl#ankRN?eroHmX zk3J~FNf`g54?6hUE>HL4;zu8pA=u>dbb{I~ve79J+Zu}Musml3#I}Lrk*o1-fkE}yRz0UblA ziH`9>UB@UepbZG(a~uI}pgdZ-HsGuP5KF{8c&m28WwpQze^#|>~zeel6vUdSi#!~0W*3ERR-#$&|_a6>Gn_wi) zM=|!Dj{?3S)?XXDQe&>WaiH}=bNV({8@tk@>?Z8lyuOXu+M4gl4E5&Lv97IILargU zd`p4zTq|4)3&FW|ccWG8H4w^>9m}^2wraFth{R%Mmi?wS3?b4PIrOE!xx?9r%rAbUG41Lm5fq_X+1>%Ls{aQ>i)SEFfm5af$n;9;{eiwEi*DXV7 z2m6l+BpxT2Fd$(6ab54|)foIWq6fXMBrkddbCU`CGA9;Kkqb_)J<*(8M4OX~otu}7 z$hf`9QPJ0~kk|1Oh9{4w1_`OU8i zMB#szNyW_upiU7|@k6?$@aWyYw&1D+_3j@#s!h6o1plP&AEc6}LOLM@(l9AT;st1> zsT(1-<1iB9osaC_O2ck47Opeg1^;#Dq2a@Bb!B8_t2AQC@HhrG60gDk*r+AeVNyA` zWVDxbZ+)s)3udsIJg^zf-=p}+dm2A%{_2+-c{8v@jN`O=d^=mkcbRQvV-PWElAnC6j%EN54`Jez!5g5KP+uYBjhr;)f8Ioph15J8ozn^A8=qY*lH_~64 zi9GD*=AjIUs^9k?7kp6dB4#ybIRIJD~G7l56JU8eGtaG(P za!)ln$7XA@C{(s%#uZrwTFoSe$-j>Fm=urBbnZ)%MOJ~p#vHg~i_G~5(p1e{oME(y z{o|yhXi->hS>DmUJq43nbs|$oCw+E@&z*KJ7WOc0sgROQ&S)~>^79t(b2w$<440pE zh`b&bHA{XLw*MXZS%$#=6n<7R7k@lIM}oyh;$86ah0CA;XB*CFE*~TE`b)u2YJmo( zWF;!x4pjrb7T8^;uwPcDc<4i<@KM7#2AV7@2Pu3EDLjHT2*mPxJ*8Cv;!jjslVx(x zMsgoxa+e#{DcZ1lJY4HnAlbc<>}n?a0V5upnNpuw@w1z&_(M}XY8AhZ+1|kw-~L`} zUD;qUH(F(Ni|$GAqCd8Y)o(VOndC(-itcT%=t@8=f5$7jau9!F(H$*|&dkO~UGbIA z`fm*9Xw-!&Cih#f$ZDC~4~*PEky&^zwaAD`U9A@xL9NIdncZJfWW0r>$>fLMLC}|9 zxSZT%`9*?W2f@lq=}s*F(CBBEG~b=@>tHtoYb5ptXJ)VSJk4)heNa5W#A%)#d=Mt1%B~#b~DdaYo8m2JA+XmA>Vn=U-*-vZRICsU= zXw~IynTJ)#12gj#O8nI~T9hK;YNJI3?7wWI#m{#o^^F#O zXIS58p?8LbZKvFnLOv$@mrEtTi*aP>JUsR1nHJ9~DRVb0^}I$-KVZYnB&i2%h{-is z{eTTYIoYZoupy{6xNPr$O*J|7*EnDkn4Y{GNAEa2iPp+(=?a_w}0J@+{=?zTdCj8+kDjbJ6>dxx3VKn4LQI_%1_ExRYDx z*(%YqRsI*smV4H-lPVg{`{3kvD{NQY4W;@RCo9dz-^W_bQ~1ey5kH)8eWic0G-u0K zIRE z>!N!V>}Xt}B1z1S7b*Y>CDvg0hTjH9ip>cOXX8X{lK~ywHB; z&SX3?tC(^7c^RiJDJ>9iD3u zbuI!}0pVa+&KV%86)^-mM(aGn(xsM4po!EHba!vsmq-l^8iu-=LF3Q5x)8sfVfoAC zPpV3$)Ca$rmISGw@;)<)Bj-&_@`{3#_g#qyq>Gv>?{lMVWSOQ82zt9pokfKp3cbAE z2BJg}(~ydCMTDp0Te2Wzte5|{SXo`0#H#8r+>mj-F#isqNnxG=ut{MaszALkcU7QX zm<0X8tX0`yVKyp)g<06i+YIu*rZCIA962n^N=2|RYZSr4Yyk1Q73Mj$;I?Oa<6jo$ zQP(I)2$sDp%%dkIL25<`>KpZZP~Y06z`)in1u{VEe{E#QoZpJM-H`Tea9;|Z_3uYs z)mknpoAn<+GsqonWR5h{)J7urRNSt1!9K~hhC!__!DR7H+G%xyg{SaFG5>Y;2#iEm zzJ8VVI$Q4bJK^C*U!SYJPH|YjD_$S;dQyK8EIcFBS&N-{G7`i1 z`aRm~vVXQ4Uf)NHonYZPj6HwJR$J`xl`Yoy#mV))U)y5fmmmg!SV)2{13`58#ul4N z41q2V4huNDYb0&~m)o=jr$-tYk?A!3VZ#& z=n0Yi%1F)={1wHKoH2FF<9b9W^Hdg$kS)vlaR{3Qri?5rg1@2wlM%Wl*t#7eB&)^; zBa}Hj2w}5`m64@O@K+RhGD5e^uS0~gYz{FjmcKHx=nqBMzd|0g34R7-B(mCPijjEM zzh>B7??_e(x~_lSNE7n9^3XFg+?$iv&ysDmxs1an|CZzY65JnpJ)TwjL6&ZXC4>t+ zSB(P^f#p;Z<3XGS%VrV@5Ff!(_Be>cKqO#UO5z9*%V6n=8#h;#gBSqI%_Js*xC535 z?y_8U9Eeu1oKIpZh^t`vn#8Ff#1dOf#k1-x5Hn$Uhr~<}pTaT$mr1U=2*e4n)RVXb z#9Oe8#+9tAE;Wo!ip7*)T$cv^EWxvCZ1O^P*M;|`a*g2svG*q6RTNqKcy;IAboV9q zCSivp5O$C)fCLN(L0Li+i3&tSC9b&P1Q*m9m$=}*#BBrwiKrmr62%QS;ttL@M#oV{ zT;eXsNE~(CX2$>fR#)|{?weVhapwEJ-}A5M>3i$EeX8ozerj!Le27<~Mj+l|8bC~9 ztC|;;Mj+lr8bH2ZylylC@rKX{#7jUU5bya6AS#YlHLvoFK)kIp0`Wr50P=<4otqKJ zzgE*9N^+NF&?>XITh*J9R-3xD6R+Kz_`qnDsYAbZ3relrN!bIGG<)LLs@|%`sIQFx z>0iYC=kHL)E-6*5co4?!lK)2B|Gg6ouTM<=lFPV#V&e63e*wM(_RXvGDlUls{wi)D z>;frlQTJT&1%=%+b#r9>{q@QI@_Rjnz9q7j%bbg@%sg&K|*A`iXX|$ z4@oh2X{O=Vsvh+Vbeh9grn^^eoGU%a8t$ICCJc`I-0Lp9E!go}@^Va+o@Ny!9|chZ zVky3YZJ&nCowTQ{yqvezTcU|vr&~juuR&&gAO$S&?&$9|rzl(r~gYz!p zpbZ%r7bpLYv{2IZ5{Ms*fKvQt4Drb+#lPJUpP(Ur5ZFNAR`pZJQ)m8)bZBfbN-x0` zs^1uM0tCl#sOyY0V!+abvQUuf7XcZq-@#*T$jE59AK~K~+Q>Y=%qn(-kt^)cOL5_z z^M%1lP{#G%PHE>7WLC|7O#6rvqp-FWS3h4`8P`TbR++L(t%AhO5fBkTC3(CjGP)T* zGNbQ9M)#~b(GQFt?G(<{Tam4sYsEm`%!0Eqf3X` zmi^rdTV&NP$QG;dlxAbf{P@~zaU&i{Y&tPpe2zyFy-&#&v+$58`Vf}aHsy*^Ty&S! zWpTEs#8X-X4-STO<%j7Ji~p&`u0BZ;Gs?)A(Bunj5Rhia=3kKnPY z&#FOoj8E`pRsCW#UX<=0Pv$Mf$A@%DU4YaoP9RI;Ouh<{4U1oCJ(pdJ)SD66I% zX!CH324et&wO$hp)_Sj1&elsMZb{wGR4oAW<<1fik~lHlaVhanqa=vC_?5-&zXL{oB1+IVWE66!608k zpph^22tpq^YSLjdUs^T6d?{{H^GwW_X)4fAzGyI%FD4k|%Pi$QlrJV|=F7o~Ig~FZ z803oyn)wpwb+4iww5r!3UtVY4EJ=>7azqs(R(gT!oq(pO4)%)Ttho08nxsa)7;a}f zD{e^lD6;2UW%YD#H8d01^G(l@T**%`cicj!mv;1C$CPp26EU&xE>_pnS*z0Ca7bIV ztV?KCoR~i=?(K?M@p8HwY$d%v)y73FiS~A3vMVHR05Q35e<^V@?19AMNnc`*5|@yG zq&bwd2E;fmp^d5ZdH|FAb#YVddfUm1-+s8Dfn|)Zq6Q17ph>N zbZu7WoS7i%NKoZT9t^fdvRxkc4#JxjzS)}9)tiNQxp8Vp74uzepZSo$46~S|9h0L8MDymyv$uXk7aZLN+3wqqb<% z7ZwR-wY3KHO^3Afj8;%vv~wy9L0LCJUDgwKx3L@Ej(5P<;1c+mKHd?fGp+QvZwUg# zS4~hA@}Z-Y-jkey!d1^G-RoC}CfI{aY2}M(b>M7HMy3$dnIfx0@w0IHfL|S|V9%%y ztlQD*K+LEPb#$kzLn8@Y9a=!>>X7%GA#phfN-V2GEeTy68bAaRvN|*a(A7a~PFIH# z*wfYFd}MhIkkSV`dZ)r(5BsDUS@E33$p0o1tQ+TnXeA+s1IeqvSiA*}9`Y+k73@Lf zr~|p(;DZV3CI^n38&SY7Q@(IfxwHdTP?-lN$PzEF z%(zZ*QWcWnF;6l;=1mlod8EPKaIW*{9wWX%9+_Z}MKp$DH8&Xl!^1=02ni6Oe{#5q+$%EOcaz};l~-c8s8pQE+|}SH>=pKMPF-zBL!r$9ExGCWqs43G&E1^ot7IXA~6Jrx#87!wQr@Z3M7t_Ksb#^o0S=9T?H1#c+`XdUJ6MZzjsRMz+)G(v zR)1$o1eES~i-OX9JzDQN<=$aj;#PMzep?tEnD7P*_Xxng!7@^ZXGZ@p|;W!pY%rk6U`+0#65Qq2<-<2b9Tls z;PLhZEPf>&bavJkIN})<4inEA6)SRI!3wJh!s|Wo4rTo;$oebA&aM&?jB)N;;ELRR z{S4r0Md@&>hcoYxFu3YD%n4RHv4E3zimkdj3o&+9fOn|!fJzNLa2J8s1Xrc-DGcYd z8dr>rvR(>S6I}HnhDhELu$Ca6^vyd3LDYa)H9zKg?|{Fa#Ni++$KWO#5Z!vlyyOHB ztsojY#}jv7X^DeXP@HRS=~4Cw8?hKWuS8-72&X_dIn!>20u_Y;M2 zY8cG2m2*@rRMTJkK_f42zb6Zqv_r;St?u5J7&tY6*zji7a5*w;1|d~p$3o-%kqVc^ zVM9xnKhQEkIneTW4TpFEzPy{&F*yN5IS9`DmaoYY-zq_PATZ(PQ@tP#MBrl>qLxF=&rq*5)i)u@wMeo36y})W1t$? zgHc;Oh+woZO9jO=3r1}wsK-Ppj)_iC+^mTh8>Ki^5W>`MI};1WO3o(8d$RIDR-@6l zCHS{koG`&@jy*tl&mcLQDCcPC>njj)D+o5|a#U3OBI226C*_nu6$m{ls)Id@;2dP!9m?b0V4aqaDT6;F12xDZH)a1W?)S(* z6B{=K%Tp;2&hJys*+YGL?61hL+}GH|45Z!=O|a?q~}vUu1`zOU|P)ai;xb>FF}rD|Y8Zz+jjw zWQAX)WS|lyE4&nD8K^Ky!I-Kh7-X#m1D~0-Ca8TL+^BTR zli{aTZ5@^?t|*4GINEkEh1Sue-ZCFc7vMULr2u!B;L&yuVbh7d8b4WgtoW~U4{w}zlC3F4WWQUZa1LUa3Q@W4seEQ35FOIRoZCh=QRx>4U7fPXoL`IZrQ;dtcADMe%PT-hk_vle(t5JqL|w9ulZOH#@5Kj6y106fqojE2-K=x zhV<*vzJn;8gHH}24eKaLwVjk{*GK|s=P~VCK?G?wN_ir)T&LMy3N+FT8Q0Vsfi|dD z`^iA_4_6s?i0x(7Ao{N$ocTKXAawNCD`%nThd>qm5T>H9u~77TiFtnX*`8a~S3wdP z{ljcAG*7*HTfWLUBG;dDJH~cj#W=F3dOH$tOOLgS-EWXw*C-IP=%Vxl4A8~kRt1ef z>ugmY314o)Q@X)+@ei?(qm=dap+v6I$=}C{tcxpq1Y1VS>S4j}WN$dYGVA`QVd###T%0rM&J>uV1h` zI$vQKXpsV0`AUCdcaldfG*|{uAGOdJlS3c1FfpkE%A*!%C@(pws*hUyQekZ9^-&8G z^EJp+FD%BaSFCXcj-wV6plyXP9<>-50eRG7^lB@_sE=BhjsxY-y$C7tvf!XpC76XWG2JByhg)_|QxeFHDIY=tZs7@m zdJB&UvWRjEPYBancucTVZ{ab)U<*$OWU1s99uqW5Wug@|_?JrBQAn?A`i*n1MQXRG zEEvo*eAezI=h6z*p(Z(P_MGj{-yWpE@#G}TdXiw4>5>vY+sybPs_2?psB0*!RpseE7^ z)ahbkLArdc7&)2^(j^Mw9Zj)ZUtzl{{M8j$>Bhe?^>^m#iX!~GO+i2gk5}F|XfC-9 zq6xVU@~W{8@>eAlb!aIn*FiMMCM;M7F~MLRB&kY2GdoztFhO%2q_bjX|1QJgI*17d zKA51f4kBk(;aG?>@mSRlpbz|E5LCV|{eDos!jGJ;{t7LJxwlcSk?DR=a}rGVgBq2c zm+l8mQ1^o&j2r5>=TRHkoa+8igHmyh?tLT}^oJ&A#@GO)Fz! z%ycigbbm**!oKd_xOWcl;u~XP$+=cua_qj?UJqj3;*#70t6WhB``QCN(Q!Gr?pHo? zthEl0NRj;qg)$e$)D20{nTgSP;w`M~_uSKu6;p0ZU58Y=$Azd+7zadS>ZZH5g3rWQ z6Ock&Znc>@vF1lSKbiKmM1H+;y&WFMSLD~9)%$UzflS5eiPcDhM#Ui0peir<^FG)p zf+&sIccgdU&G`BQ?3_$aHtvmm!mIdVqI)5j@+SMTvXZYm$Vxfa0_>zfDi7-pwo>j_ za8;qBZ^eMiK)b7R{*(w^I z_bI{|2F60g$YyoMoyo+RU^KCH?|bl)#bY1EDT~L?#>wJgVt(qaW&s`N-`Ph;ciT?PBJx`XjiGx3VV2dU8lB1nxbDkwP!)2U&C!89qSgWp%&Y?t+Pa0pY=!6ueY zrPOn4vc+f0i#hOOOm9!tB5$IfV(b>j43CTC=UBnWTY=QUs?n7Qw;XnsGdUSt3nG{d zZUCVtgPUOwVkywH2C>qCcRBCh$Sb3H!E(`fM7D%#MET)6cpk^73(0d%E{mh zQJ6Kz=7^KQYcUyYV(H1?Aa+q>Mp`z@nSW1Kt8!k5=XDVzMFs=|MeucK{Dg}-u zWi6wgsNs7I;cq z-~sh^WX>giO$k5F`}C>r_wRYg=QhbHxRC#;i%S!;ta<^^!$k%$;#41_~&X&EOm0EII(( z_oq(X92Z;E%K~!0Fwi+Rg7v$|ZSNc$1s`%fr}>+-YgW*HixS1I^R5WIWRdJwW-(Dk z>UeA%`9Ot5t$xgleVk{p1z2Nj$oft73f+wn@Vskn_?|i)?z5)(#ab#?&4ZmyjbW_c z?rukSc10{;q*y(MW_j+HsCqfdHMJOkSb336-dqK92tDSd!ql%iW{c$t<4A4Ht8w>U z1Y~0UK50j<{WEsCNY;WA+FPRU^GQ*8d-{AMS*+>_ccS%?ho}q0$ylNOHMSHiP4~+Q znJI^ZDR*~h-c7f}Mdb~Blf&=Aj3@0YyQIc%XG;2piCK9<&(xF0z@0K|OP}sk?%p54 zMpaoz=~RQ^oRz=w; zL)>!t9Er(b7!zq8LE>1|J?`>V-O4Rlsiy8}fmy68pC9FP>k!6p{Lgdl3ihHyelW`W z9gnys%&G5pJpEZeJpN*yRaE}Ez#WI)Q5$0MVjF#CvLljd4Wjy+{8TsEl^KEm%>(03 zyEoGzuqbcd)z0a?__;L5OpaNzI=O>4hrxMOakgQpn&G2R?6E3B5y5-1}o(a1XnqUjW|i#^Ko0$lK7dId}=8+chSDOn|IpDxB~_D z!W-?5$>TwY+v1|&TrYIv5OXJb;}EgvjYAUqdp8cHj6-UI)qBF)Lih8_(lIAyC$LRJ zn#A{5pwWg$0xo+A8#s8lN1Ji5Y~C%AIu)s-4a+aElJNu5e8l3`QFh!tI>PC!jA5rs zY9)FCZCGYD@3yD2Keh^KLyTL6oc(VOgM}j#L*2z!M8MZ$j6(9~C;%l$(9L5!@9W=T zYZUD5v+ZJU&Y`ww0&(82aW7dV!p>V47oEm=9la{ZR}Ny}u8DTZyO4#oAehm4k0IA! zml>S}qL~CUdRK6X+d=4zE+L^Zx`uX@(eiX|JqU{wskzxp&%7l9ymunlQG>J*87_COhY z@g14Lb4OT4@Dhv!FR@7QEKcd*Q+2bothmk_*3IKAhpLS>#H8L&)usxECAhP&g^_>1V`4n-FI0vK+vYvJ5XQH_AEXN1f%-8SrKg1H5Q`fv>GD<>HZVA|5HT$e|lgacUuJW-9tHDeT^&Lz*9NXirx83 zw0?MKe;zHGeFN;fTd@kXaCLZy-@4KjZ{Y!M_g;;=ZH~rIbv2r@XV75nyv3Ct!mNA@ z#20H_vFmMM-2!4fEMrN$0OHJbu6PPh<;x&mgylIBuUb~n8Bi~?s&7MK{s>RyC6>E9 z+R9yujgJeW)eNA=c23-la&V>f;~KgWIMNMW4ekH!hR)$9Q?%*D@~{jwm+h`L9Etv| z8(gsSn1!mIQD0#dIHo)LP`MII+iiU*Mr5+y@wZsrlcPzFRCb0oX#ufsgF)Se&2r}L zZMwyB{++h%Qxt_QC$|@sP)^_9oGqFd(}$5lZ?w_2jcTiH+uT;$cGll$+rC8*+L&!y z9_A4KC)&1hhWo#wZR>sqDt=%5l@+eO})Y^gUOr3Tm?+&>x3Hp_%mLAPLRs10Xq z{2-ex3<>>?mQTKe}9kX79olFJdpgSLC0QHUk~L)ax?Mrn6AsRZb}Ju=<- z96)fR?d7z?=Lky>&p_X<@d;nwt|#%6=-a2arEf!N*@2d(7aEz$LoEBWx1enCld@U& z;D?Lkm7TE9*Jf0+9=)oa4{Zb_Vt+;ZP|9WjO3h>V|4P}5wz*<99x63SOzs7}M3Joi zH{F@*Pl(=|T8Tw#ZDevhHpsoIF^zGJdG<-!h3{GJKoYu$E zoD%%f>g+ri0jqDe`X*-bwK6PG)h|gw6Av2Raui1uT!r}HTZHP%hxlKzOwlxxz+qD!L zfIPmgO)z(2ev+ECG}yMKISB^awlv849&EZYK{ZVxZ|%`IC!C~IT;9@#V1^HJY6>^8 zE0dXBKmY%;D_tf3w`Es1vvy%YO;n0d-6E7xw*t_tTN;!X0O-;{Fj@;VqhrFddYizx0TOO9XtKR4kOZS2PfN}(SaM_-GYI%%t zJyq&fd_nM4RL>?53|nrvY}EwgR(y~D=0DS3$Zece2m&c2w{g~~;5?>GqbArcv?xN} z;-!=0|3rI$Jh~V;9%xj4e$0YSBJ<;ETjoa-m8UJ3HfMgcf(Y`X_&!B2KdKb*AIy(B z1flbzQHRa^Xwd}oBkz7+s{f1mA?#I?+X?&gPmnclmSgJtv1R_s_e^Zn)MaZRELQc{ zU*p>^-{5?SHtY*#j_cyye{&d<+i((zR`#2|;cmZ~&K%sezJbxMOJo>FgzQ;@^@%Fk_>nB4f4Iv1RORGb~jdC5S@ zX<|O-mEi2Y*bkBV(ahuf%In5V%;#JI&Y_Bv%MCNnE0vrk=5uyNf|V=IgUEStr$lZ~ zC~FF1mp!#dA~h8|p{6U0qe%YgZ)0`1!ps_ zzHYE{HYQ|D%vqi7x!a!+A<*A&oGd;Nvy0NNLCFVkRK5}RYfko@drysvCzZccE;gKK zcT25_fREjto2p!#W@Jh|_F9kB?on)JzH`;d5x(wLhg1`awho1kul}K9YBQ2qW2^}? zXLgjyY+^E*@eao6e^Ok$rzGXyhBI)4c{-|#2C292RaYRdSTixXMJ{E-dF)jBgmqy& zd!3V?T5>$T0i!VH%U<;<_p}J+f2#Y{Vr+;}oWrfm` zY)a>j@=&~q`LRmPf$Wo%bC%q_&M$NqpsJggzrD{rHkBm~P^_K7y5UT_xA&JjaUKTQ z2%>{C6vPRNgIh!P_%_RPL=@~C%XPYAL;V?wlYRakzsc_EB%>hj4gRQ8gp;Rs_S_^w z&V#-4?g_X*pzw6~2-6P_MG#IE_}8o8m_v|uZ|C!&VNfbPC*FZmS_Y>C@5KfL6Wrs8 z>`uOzma0WrJdsT2yZp4POu*K!|6XPL}GNjhsV2OtnCmV#l zZs{d6%EbIa)(JZ+pHrNJ$a!n8)Jw=_jj^0_W97-nW)n+qtbAFyHaAv=FtxEV^$eyA zS{3ub@b;R;Uh1fCVj=9>Pvfb*5tQa*`d@cWUw6pbFg9)|HgKe>{umQqD<9`bPA|0s zJ47_bX6L#)+b0H~K{m1ByJC+=JM0haa~e2c*kE7xFg`DYf%8a(NyiU&bH9OyCN})Q zSb^_)wBlr=dELXM^hl(>Mr$@(y+BrqnP=xa>?ci3<`MhN`HIo(H%%;n%|SdXoB*#h1_@9ks^Srn@6O+K;O1SvGkGw40N^_7-fBIpw%I< z1-+zZl;G_nh5JYBTl}?h%_{oXE*568WHJ3(!2O>Qe$S33}LEBnwa!a7DW)?{kQ$_L=6v0uPtzHq7AZ|w;&zqk%IIHeG3 z%%VAo`J7`7P8LJmerrx*KIasJlRK~Um_>6E^Eu7R!d_mt-DvZk%dGWJ>RlmAIRSy`qSpix;m z!P8a*fPql*3j|htBkhAyC*aa6ZP*&GS=A%4pWy|uEsNTVg-M1hFKLwNKk|FZ0F(Msd^Bs{qn?A6Nuo%R4WL5Vybwxk&;y)etb%XZro1{TsJ=VoIAqummTjG{{zfiak$EX+tcn*lW~O>_eDR?3Fg5Uoq{qHeq5J4Wy~` zYDQvzr-4j-38hyXMoTKa8t5W5jE?Jb#lCphXzph;TYq1}m~U|YeGTJygY)le7^fSY z{|{&w=b#;{L&0UE**n^3Lc`e5R--xJXxst~<9Gu!8qMMGv=IS7=}jh~VYEp5K<`~> z7d_O8QzZ|@G?vD`S1gEpOh zVYg2n0-^*2Ka{Vyt z>Tfy6dlzi6`|)F)g>zAJtk}or;=59`53yqJFTpoZa2@ILNmgv{tFv)wC+t$Yv>&@a zCSvQabp$ONi>z3DqAO0E;EIhS{wW z)`P9sn@@OR;FF%%TAkkW%pF=*^|ZP8^xPdC#nuVQ)3G0=?xvX7Ikc6rR95l2{>Na$k@;${%)m_s@3>X<_< z?15(503uq5x+15enkliUW-772rmUKJGMr!K;J)Ch^q0oldymj%Ub4-M>$7z^TO0~uLE|y)iq4OT-{+yd~!r}Dz zHddVYpElZV3R5=3C@q+Pt6drpUEQ?&^|^8iNxnnx!B&^$U3fac;o!HiQ91cOr&u(KDF=2#Rt ztNKDzyrP-;V(VmC@yZc_tyBDpR|k7g@tR2Jj1_Cs8Cwo}kg;_nbjCK3P#G(3OJ{63 z>_NuXf%xB(u}N0MCWy3kYPbSIb`4QuW2{KRtVwaQS3z!)I) z!3P?_>LIZi15(%PW(Ksx7LIm5O$Q;dyk=`8U8Ww!K`?Cw!Lsn}4$j&L*5eVZQ*=wF zy&z+cG4bM*69JFx=_R^8pJt@QM?S%6Wth~XAEw_h0t?3ta@QCMLM(fJcCJWlF*uoX z3wIwZye8yR0~35)ti87ZL<@)$)?<<+?@LP*-wtA^olIqc(1t!P%FS&%lw=_|tKe)= ze$SK{BAfL^vkINvQfZ%vWsi|ujyrMgH$cvlWLM%YoiB}0*?r5q zbWl|GF!1AnFPhicIpCwTuPoQu3uE1#W$(eJj0BI2^>W6)s3E@wBp$bWB(9)Bs|-1< zzZT=yDKu_`;@Bwrgjm8|_5^IoaJ^g3ajY>w`X!g7oI!^BGN5o@>~4s%^8W5711#3= z@$W1(QkKgnCyc_ygRU_LCzJa)d$fbwOaent7QPn@e+l{}!oAh-ReG?{PKAysa?qb$ zYbO&=8=Kb%>aNb)jB?U~{71`J?5t7uZGu65K!;i7n0+*zf^%r7k0vNPZnKXLK(mhy zK(mk5;6Faz$i_OO<0hzM18Z36m;_*J4Wf{Li9V|!b+?wBE_7a;y4z=$-u3!PZj}#|>mWeZ$6e z>*5Zgpy}0wyoO^d*7t4R-Vx}n?DMVaeGbeOE3ScbXC$68DmNR)t!H*fb5ozNs$U29 zHDeIk*@+)!!82vpF>b9xnDTavAcA`WwyHnBLq+gdyyqw20||D6yjJy4B)}1PJ{g*N z6r0wy;i<<@hP87CElP(&Rbtht4z8V8jY9&pxM}T^k}lr&Phh4L_V)Ez-I52!oM6VrW`gNj zgKU0dJ1&b#zKbc0F8I0jC?U3CARJ`;N8q=r7tG5QEGJ()SD-A4|Lw%2QjdJoQT%RdZ+=fMydJ zfM!b+fM!b+fM)U$%xH87n#q@Z5B0qPa&Buk+&lJ*Y|#umFDp!qY)qGEDtO!4jdwp? z8^#9ii%;w%Wqx$U59zn_%lanm5&B3WBa&D6gb)vCVp;aowUO#@S_j>jiN)XNeuY#NlG z`tGaj5Y|*1PtC`!C(Xxn*tE-FXEbzN6O)&g9=An=Kz}P!>T19js&IG9JDH8*AZ1V4#TuL*t%p-B_`1VXDKoW6(Ifk$ll@$HFx_i!)m zy98g%E)WjCl5mv@Q?VAi{7Qle1{YVuFW=Y?;%3L#llXBz@Wl39D>n7Lgt!b3?CMJd z7j4TGvDZKH#Q2ZF($Vs-{e1Eh1$4Gzr+%0a_rDJ}SUQaD3yUN=qEy>2qs586iyt;N z+j}8%o2U8p;(JJ7RX3oqAWT2zY@)E8Mmbwx@1$H%>yujsyGKE68Fbe{3eCylzQ?b# zJ3CJS?5&)$2FiVe4@5!k%-a+4hB&!1?_+$z{B*2d!AoD(ro4Pxao zE6?eT*5OFyk1UZNIYZp>Yr>$s%ou@))Rz$bIK|G4+Fp>9I~q+)RypoyjDl`6l1PIx zF*jxRcDT*)1mz{$qF|e22-MpgL!jQ~Xo5jv!mC69((@GMHyhRMg~%?OQ~a?dpQ+N0 zrmV18@oYq8u&O^qX(!M2fywJp!W)^0gYuJ?z}^Zw?`vjh|57=c1doH#u0d+An^bA< zGTkrPW@#U+FtfCqSWwzSAS2AuZh|_(-ZQwzwftUH+TTZEt^=_hZ7NIqek#0BX%B(A zv}-U_+UG0hq0$}#b!iWQy0n|1me()scPfwjA-&|T*;HqY3KlAq^Rf< zr|>_V(@uQWy)zjulWesvpurY=u|Oa!W=3HKP>E~_MBF)aA5 zM98U_Z3+x2=_Z)gQ&S)P1*dcrKWAw^9oj8XhUEQTVKQ@0!L`?a1Y`DIHdy?<)t?UQ zkeCX_b_!$jx#KJ_PQf*3ofOEy@2A5(DV2!@BQFzFQpK)y+6m_3r&wjTk71skfS=fD z_*sLixjw_51bK=n7=}?}wW^mOhj~%wXCo6k1e+`0Fatj;?V31sFe;TY8e1EgM*VEe zG;rA0eUC7g<0rNnKbvzwVUt9Iz4; zry&nu2_QKSS0~nj+WC#=bzFy;f7lE6$0c?9;6*ct5o5Y|lVBHEcQ3ro@w`u=8I+K? zJgdF;Hi%jf1%0i2_hk^;$Xs7&6}TrJo)&?TD_Ce@>J?t^RJq$ONi(xB z0c`Ic&Cr#}CiqK-Lnow0Q*UFcgPvH`KOm`pGXXKZK2>9-lbW`jOH-+D)~5ZE*k6V^ zd)<`AD51Onu{(;jHWKtNKt!M|NcgM|@iXAhp4j=2ZHcT>*iIpJT$W{z!irC@dO8Tc zSk=EpZg2u>XTI&dZ9Ad?DYmoFF7DGK85K*DGvy?@#s?Dc&ELoN8VbEDlmIpP%zwLnG@yV3|=ya-L`ThbO!ec-}&6?+HZ0ADkS zXYeV{-?0)u6cgC}>P*|3PRKs+uXP`5OseJ3G{~I(;;@d+`!!+gpv`v5efjw`$VU92 zg?5hf(qU=vaMmHYwCRe*@ADR`D0OiJ{NrHHEiqD?ZNMLE ztPYNKNZNG*t^s9(@KW84+fInh9nwB!Hbv~+XZ26D)sUskww0aCk8E2L z{f)5W3};wgC~W#UYebiSJDkpUrQ^+}an{Ii9A!9T3;ykJdK=-e+|SyrLuP!+d;YuO zC5{kOZVU9pe);caZbSg@>J}5{R@8fz^4P3x|S8Y z4VI}S{%B?0hS~H#;E^vT?dOWmN#Mnc)voAxfd3-vldC*2^lH!NIun)=B*1k%Cg$(K zL+4q?{J|4<;gNn##*EgzB)~PHLqeQ~N51$2EEkf%i;}{GI0cV<(WxjQPA7pE&9Has zp+lndulAKpdn`+d>+mcanmT@k?>TV6#(7yuKR14B7?U%V ziFXVgkJ-%4{ei!Jc5Q&4*$`k^Y4UXV+kCVwmX-C(X;1%-v4xyRNj2S+_MJ6<+1S4B zg%M1CSSC3s&k-eXw`^R}E5z=-8rUmZV*OJ+anxTMsx-?F?&9_|geK;nQ{YF%wc&ci z@^qg-a4x z88ecVD~0f&(p`e-TWy%uhPGgZdNLtm;cvrsOx4EAEVW40P?OyUL#3rb>-C)u6Q6ez`YounV|e8hBvIh5mks# z#e*?iqk(MNWJp=De{7(;FanNyr5&<)+Hsb6RcWkE{}lHSK*uw$=_GJj61~Y=l&9so1m23DM!8f*cA4mSTc1L+?(L?0eSAtaBgDi zV<16Kz@)dT-|FZH=a*O*(S~)R;>(!lERKLHpUmp)92==;D_7e6oo|pI+Q=%!dUjfy z^$cu9FJ6}|e!x@FJ8lKi_>JLqNaO9+!4Y-Lo1WMae{)2N3Vc_~IWGcA(N1kkwD`~3 z5N*ld5X~#?iG7L;8G*QiKxo6V>+FnSMC0uVxW$*Qv$Gz>NE^nS`kebpL^{M{54;Pa zD#z&6jOBkdb`E2w4KqI@mMnRGEQ?;hK3iOk&bQ)=m{k;Cnk^3PlPfBE#4-Ih=bK#7 zOZ($b|4q9=HCMgUSGpbt7OQ$O-bkktEvG}hc7;L!YehM(sx!Z%zyYJ2#x*xf1faQz zfK^X&nwtnT_>VUcaAGxM69K{WL=yvJ$cG?;?@Ctjt77>WpUV)^hc z?rvz4wISwfJ-Zp4lyZ4#fxO2@a}vuuqFqhSU6b-!Db2~oUth7IF{%jBBih9Nxg*-l zmFN*|Hb44`4Opci<{!}(4)=6u!^RfLF~Z@Zn>GYxo#Nt~HUY>*IBf!udp@+GOu?Ry z5E$(F&?plbtp1)46HKq$1*%?OyvH^#Wc3ZK1+7``+o%QFa2>be^Q`viDtE2qUk_fM zv#ThG$)Zuh{O=j_i$)CzSu}P<(WqCiQu`YjE{n$GF7Ezq7L6K%lL@eVuP$zl!AVSN zvu&h$&)E3?y{RtO8|=fMY%hk^E<_|?CgHKF-$Z(LhE7^BJ(k#kVa3VntsYiDLEjU} z-Ag*b57W=8E{2Q!>FSJF*7;Xv`x@=E82S)yQnmMni>&?e!^z)@D}W2T`7$FfS){D$ z1K|T%D=v>Y#~58J!+@*y?o^`_Cb%+@#d0Bcs@m*)vMxn$CIjh-4h)+LM;HqjD`X%K zArQ`oR1AtcREe~qtzvMz;J>RPIn;x+p=w((Bwi%-qP&GH$Z=1qD&-{pfvQsLI|!>P zOxO%ng`iSZjO6)CcjiIr#*}cEArEfJ_I9+yL<4=jH9PKo{d`O`gDBhGD)Rnx14=%0 z!LrY-0&g3L5)ktCkxdulY%mFZ`$#>A=utC-lyQcTm>#UaDviYc-WfvSEv>=Vswv4A zm`a;>2(=yGaG12}ILw+=IxH%_;pk`8)mfc{bF{(A^pLF82CD>bMmOo53)WTyK^E^6 z5XDe6SIvjw{EoqY06jSzVC5J(^$o#pXpK@6B49)3c;fCWQACxYf`N;n6W4iZVd+i7 zU>1s;qcAF~VyFlJw0jb0ZODe$4|Tp>n2vp=4X5#$l>!al^>RJS$cTqR!u(^x6SrgnvEztMLp7DR`dT46d zQUG%sFu`CgA9iU7rj=OK@|p(!1%Fv+kO})Z7tT+ERC}f0<~{xaXnsdTgQ0u;HAoLb zfl-^u2n?E7W?%tm2ByJKU>cNxeYqxG-Z-2n`^w69vR0%)7IC@M{VTLS+DK3?b$jEX z%aCp3j6%(}}7R*d^^5)=86W@Ge4RWS~&}Jem3ogU3<%3T&B!mR#Vi)1l5itJ^ ztI)YV0uIS+W(ZmqvwJzUMyWUf;gq>pcRoA-&FI*urw1)d@##i$ zUqyn={m%?Pm^rdV>1-5vf~vV+VRUS4&13^P(&)rw6NiqiUld~lx!_lDqD;_0e#D|> zf+UU>5))M*di1gil0{Hc>Od5o)Y;2}y%BafP zGbi#HTZu&mN{n&nnnrK%JN?D~{=#7CewIBxWu)27=fM@_AC3_!|HIvYii8KDA zk~xPOMTyHyWz}})#8!4C%CHK{Qnbv-7Upf)fp&Z64de0&g8hoJJ31#J6SN`NV^@5; za5AE)4Z)(*IOpu`Y(mF_IF`+`i*lX>Q48Xtdn}CoHXy)8|5egk1EK{)zwct6_c21v zI}^ktjM2|VXyqV!#PB(9xepaY(FU~-754N#R1nyQ8X9dCLkR9i4UM)W7#(d`&#$F4&)nRBB?{V>@`+LAIY1B_Nm- z?sqL|h^lde|GX*o49>DzQx5d`N1ygGGrnwR7DemU_R z=h!HCk=x!mI0`=GdQP(uR2Mp5lqk+|-h~QFvCFJ>?hGSbN&t}I2${9@Oe%d7PGYLt;ObsVKz?8kbgDn z8OMyR$*g7Env6fB`Ikmj8U&!<1l)AR!mSNKrbLQ`TpNN&5r>5&>+%zs0ls1LP&VK0<~AElbn-YDC2-eZK_ zKV=y^>j@U!+}pW2+T4yz40StPk}lh_80nq$aO7TPh|6}RjB&WmSe;`7TXwQt<<9z5 zTG=HiSLd9MjlS+yvYrMtbzmf6`pu2!IyV|21qsu>t%T{^R>F*GD`9SKD`8S?B+RO| z5~k9nA@13Tn2dwjhL0h*)$JB)!)3(KhP!OTwUNC|v@KU4(%d=K=!8n>>sxNh z{n+Rk1_I<+dF0pm1}~dKh*jj?VZ=^KFfX1joQogU0$`X1E6!(y*SGZob?A_M0GgV5 z0GgV50GbttV1}knFsL{oxj4AZkc-C_WQ{aO5CLe)6@aE(0cgraFheeaX}Qd$e~uN( z&cWA2O%VvnMvNjf>qblleXifU{RB(>&N_Imja2F>hIzvbK`90=b|_IHdla-r6BMvs z6BMwiEdkkJXIyB&@{^HJ1cQWv?r{Xh7_IQKEDvLh7tjP$od=>j#u(Q6xTpgm#~7EQ zdNzWPV~pcaNLxT~jByC;dFMml;8pP7Lmez9p*8th5Ybr>_Hof!5Mt5A7>Py380;g$ zV~nvFV>BR?vI2}TmOz+h5OR!h8mrP0C7FW;qJ)H&tOmq?P%?*#yf*A@%8F5CsnBaf zklL(6#a%Ac9dHh**XWL=ZYq=zN%D)Jhl%!5fgP9tl#`3tw)dkWC<@ zaHdksy>}T(u>_+^u>_+^F?($)#XqJ&ji`vSMU1M51T&I{U^ID%Wh4*5X!1x#ojg)I zZ)JLD?Y#H`Lp!emp|$fm*n@#rBZ#Q($@!NI-BW_lJsoqIi_=xqJ^$7jz<*UIXG4*p zlPfTMT#$v*9FDO-w;)bseN-7KzR)it|9Ch?oj+qZ#u#P{#|Wz7m^m~UOgNhF1T*rT zU^L%}W#l`-X!cNR%E%rGMu!GWod5LDAk;9-L4YiPp@xBAMhXy&rU0>w6d)K)fnqZL zt(k#P0cD=b0&1RImB|tvUdmyVI=N~NFLeR?F-6%NTy>_bx|T-9Q7qAA{q0V2994sY z3L+=;J=B@tkeZ44t>FOVxJnxhhQ?Q{w9)YuJEx5C6~T=0l?2=P)-V-OEE+rSV>G1= zF)1j=TiS5CR)TU7S)l=FE+#XTB1?N&IV&X{va>**f#^i~G(@95{UL!*8k z8hS~66X%^m8o*7Er)(I;Q>F$$@SmH{k|9Osv;IK?>ahVWz6fzd!zm{Wt3a^1kQ0V= zAauXg2z$_PwSb5=3;*K{BS)!0XXHooC*K@v28HUs_ptt)PX1uf^CJz;a_9tWqrv{HO1Xrb=JKoe?o9 zsM#6qqCvAW3P7_n>Z>{bwa$o>4;fvFF(VP`j5vJE=!^(v_#g+G>CVV$*O;zqvUH5H z`#A+`!yxZ5be=UTrBr7)NjDhvQ5y;RlXPyAv6@^1hO$xiFy|<&Xlrx150*L?9~=hf z&clwr{S8iT3&BxtCp&`8od^x_1tT1m{kf-NDSW-LYE4kCT6d=&q6|C7%%$-0KVL@Gfl1NbqfZ>~;gUC@8};OXMaxI5V(UK^ubH zvk>~C2EkzOf^a@Iq-8@mJ0H@nH>8zdR9b==(y~-$NGrjpv@C!b(h|&&mS9?15HO+b zATz3!@6e+^x3dn!70af}Oi4n5jnI-ArFf?I8{wYD177 zgtl?CBN*MrLGYj4#zAc{V;cusi;Qg?1pn?f4);qV?_`%e#_sJ}Pp4zRl2$gx9_Or% zPPp%eOYYm8aFIIyT1Er))}O?wBAu7LQZ2c~_{_Fiy>uD4?_Hi~_s*j3@+}f*A!W&}EaXe%{$2>OkDIEZ57KbsUBd zB(BNr=nnq~%*wD?xasO#ICm~GIqM$H9*F(Y&tG;`(Xw30pDcf zuYHx>+xdmT$vg+>x$hg3PZF%P<#;K4U&hlza4pqoxHGtOwIeF7#u=y3`w(IGE)(e^ zR5b`Fwj#f#chS-QRV@|SI5_oJ#IG0LNW(0*s!!JM_kig3;>*Ex^#iy>uc3xWfMPC-_{Qx6MDCH3K_L?RB34c?3W1&TKK`K`VCWOQ*$?XYE{ozkSo^WnelA$D+E*ZT1?D% zCF%a9!V>Q&#=#KcwrpI*mfF`6gAVmwGa+aEFvv|zx5P4qjZlnk7l54)^BE^=*WKZI zu>x6sW_&lu?F+__6*f$}9szLc;lAqwG&lj^)FXUQ3*=b)I^uZ+?uvIaa;>D>AK|>N zKq+MptDn0UoL3y_JKtUVc>uuc6{!7`_pS9h%I6$KG5g^R5-(x9UV#G$4njaj!g;d- zshu&6{QKGtS>U_hjjXOU6o2+#q5H?mAN0hW*DNukyY;v1V7+cBGWYZyuoZoq;}?&D zRlrz0_8FWm9jpsh_0#*YbhMt6BVu3S=W{&!;7c;{0+@m;|C}T5Al#>4+L>RdzNa&v zOP(W)oq8=kIe}-%C6>+q*!jPV$+LJ%P%>k$-lT}dR&4(}+lhgTuo!q2S`+&se6u3! zO8mTyXUW^R<)s}ivELuhl0Sl20n7U&z6H@`mxMfIzT^eV5=DJBdg6~Lx=YTnEW2oB zJ7M?1&j@bKq4^MxRsGI}ToGT02E*z$u;yl4T&do&_B&QlxBhGI2K$3?+*mujueTIL zIf%lKy?Fm~(U{kPaIIZ?%8y<)f+)DeOZ9xf7B?z?WS6(Gzucl}Vq^d0CHg!V<{NuI ziwR8sg^;8LzByJ8&-pos50rP*4+{r6h3*vyJOs+Ee80n_^2bIDz&gmi=2_hTsX+GC zg}8e|^gjtvDSn7S^y=i@`zqG3K@^^y@NzGF5fe8caF7odbN9OoTXfIylZ<@@_&w)B zh@?TLRAE_Sgu5Ifg+Pjg1HLETl_O7lI#!<5<(Y4CL>Cl0$Li1A?S5<)Zq8TUFRWmW z47)E^vM;Gku3qMe7D%#Wabe2-wI^09#=YR}S+lx1pI|&{V&|WOapGiruh;}R9!<~Kq^Bkpcxr-yrybArlg9A05T1@z@II7uPNDSF!~#!E zFz|G~ay=j|=^%J|f$3?rFR6(Io|<6b>7ALLmcr9l6pXYNXU#2;lA2iHsR;(2exqC) z(ccrE7M|y)ij4k&eny#C;He1)p6;n!8_}4kBJXX~@5P{>JSh%NQyWu+)$%oMhG=gc#naSi`u;)Dt zpHAwXyb-?E(LSr2SBmTO8ex~dR>9X65YpG_11xd7n&RW&XUW;vJS>vy;W+ORIG)`@ zImDbGZeSkbe#8? z5n>ex72?Z`BS=(CKaQ{mA+{(-35vN9t0gq-w3Xv`7{|xq_&`5_%3%*2*MbPdy+t{e zdFCh34mfV0<9U8un@z`Jli~Pc<(NClRLI}LaS3?NI>-;X2KFH2deiYD<=DuY>=!)I zM8^mFj$2K~#Z5-Yvy|habjTgxxC%U|ATq(~U=KoWG#&4jDRwa&x6twYuF`Sd6Nck* z5J7_V$aFjuj%&e#8Y3Myn2wuG$L*A3_Qfi}%HUW$3CE}*EF2}U2V&QN2txiG>wPqw zPw*X!I5+VR**tG(1p zLZCW062jD`E{##?4K{TpZ-L%fhak>6$@5kZ$B}N><#fw|I5yj&26y&E-3(oVr7ho@kU3%ICqE-_tud+phCi>#cU^55~WfQj_VTngo za8yTwOWB`RU^{|(6mNoh6rbFjKs=v;2L>8CW&(rI2|OO_STxL? zAb~@mO5hNt5?EuQ1onOhLFy31r9*IC?zJ~VX?qSt1-=pb^H*`(p$ZUspSX0oUEnPR zSVfLXTq8aGBUjXcxZt>)-0ANib6{WmTt|`Ej50P4bBi=gpbJjyoqIE|7BZihFT9%& zP#zZcFWt*dy6?gFEXD1BTWXaJ&?*xOq{P%Jox9*{jp46URo6f-41rQFbVfq4d_?iG zy}y)`{Exr`6O@YOz3?CeN)NoE$81qf8R5|D+=RnZASRSzW8>L4ideh_#Hm?vZ{v0> zUVxa`FP7_+KWvL1RG@#D(JFyIA@@c4OFZ|5mfioP9&uX=Dm}j7=@__6XT~4M9v&E>P-~;!dSWR z_W2YuC8P$%Iyy5Di4n?YHX;-6L?p&RG83GzAS;=87?No)E!jnoY_ciYosjH%NM?eR zY$7BxF<-L7AzAVBkmb(UKEk^UX6vlx$F2s$%_N|ZwT>}N_Ot^L5ht{ zEqf&l@?iI6QHtL`$!C*qlRi>f~*vKp;DNbUny!?DSi#H zABoLzFTKVR4=cZ9PB+CmIhSli4`qT+#q!-D=%Gz;LTy%3xE&DeM~am(oVYnQz$pg! z2L;MZ*c=<}K8Ff!g8to(IV+KfRg|VYR^+WgS*Rm14Hr(l0tekOcS^&V^od_)SN#b?|uX)qZF)(SD!R z!@Vd14nGi=4>)%NooKSYkyY%jj)0QY-Gn$)nXGSR<-5NIxI}>{4QL4wu}9(lS_R68 z-IX<3Hd3$sf24hPd{ssI{+XL{?zt_Aln@ATxj+blc!{85BdFL*REnLr7VO4`WffyV z)L3HIuPtj?7i$D{U2E)Z)!4g6&}D6FY^&?)`g@)^?@VSA{`=j}Cve{9yfg1R@4VCJ z%m~P)W#+>rwYrjWL0d_=psl1_&{R?`W(<&g7g~Mgs`@BYeI8nUFCcqfGaoCdO}+*2 zCztbam})VFf4);X zI(Z9pnk$@aGYJ^P6dB@Ja!3|LmqsrgLN|4tkPP|ajtN13_^|? zM*Nt7;{nbLG@pUkxr<{$GI|)(w9;G!lTrCfJZlzaSK+ht%VNQ=FotQR+3<-EeK7T8 zNfiAsTm_8?mU^wEDq0Pq6~wIX6J?oCP*S@{WJ;4XqgI2(Ft-vUBX!-x!}w}_?+{+TTw4daOU`C$H0r&8FE2g zyXwlTR#;i=b>)Q_!U8l{M{r%oP=nK;feUI4_C)>ef-^6LBW;aJ+XXjUfI3nCGS8uV z*oDNl?VK2$d=td(j+nNl1a_lfhTu2>>k+7Jmqa1ejsr|j6mT5C#rH))=H;bm#u?YH z*c>qRYasF|Dl5CTIf;DoHNfNWjc_D!rE-tu@9JSrfYq_%?+lfv?&6BcCIU;IVM znDC*ad{Cb{-GQQIf|D~obvilwgeZ8y5rqh_a(3l$7)QSf6%S5~i@MR7ZvpYg#nIsC zBP& zN{E1TpHm(mm3+4!w%%Ha(LwI?+Y`aA!bvfwJXsfR@^;{1wa2ES)D18Dpjr!6L+-0x z62Srq{znFXHcCEIt1L!6OCCy$O@6mZ1&2Et0bC~>_o)h61Z*bf!-+rQB6C*2bg_cDS)GqoRUf9exM@o8tcKPDQZwVsHAZV-#JDoSk%zpRnXc&z46 z9~)yc1Y;-l^l?%4($#S0H_C$3CqyBg{BU{Cy8Pr9)LJ3E-2>tEA-&!M;r&T^zX2)I zmV%QdPG*KJ1ukexLG%;iZH6`{zX-`+fH?bx*bZFoJ-JCFd!UhQKzfFie7OYoB)gzU zPR=<&1qXG+vN-mktRS2O3wiRsBH06tWCMDVKat?{Nh{d}jX{otL6(R?(C%wlLGo`$Vp&p9 z79y&J|B^q#IqwpjwuV1$5Um5}?1JuXXC%f%8-WPkgmWIKW=0`KbVU*yU?zc{+6-c8 z0*4wDQ9BL3uFv-u{W3mxMYoS}{B~}CjN`X^Ug*cj@!L0u%#G1r$B|t1h6;WY*JMsC zEmegiwJ8+^=)_A)pkftsfhv}RC^C91Gd1%ma;N19~1&E+yBK?1HA`vML+0#;RkTj27H2hoyy;EO!? zb~MV+H^SOT)>)|d2K57%zLw3hE^30*rC-MtWBs27R*WuYDn<`86{825iqQk@fn2E2 z6X&R)L&WKR`M=7>hd;s!PY8Gn6aGzERd~`iso?Jd9!&6`09Rt%;DPrhYQk>-elMK# zVm)*HD5lmtP;atWg(l~}!pb^APlwNY7P}d4j7`8{f!<_+ii&DgA#VQW;jisGjIpRz zt$^DTG-`REQELm~^wjb|tJe0y%1pLu%@>fSa@9It@NKEV52Dt^0&eN5<$*@62ZYm8 z%LA=iUBc?A^>+d3$D&pZt;Jy-e{9&>0&Ob~GPd$SD3xRu7?5)<5@`_Khml4r3&@|a z1O8sj!ghk-(4wLPgYzB`dPot@Mdkmg@;2)P-fUda8CF;k#D%oJ!3GzHoNO$vi#EsFC8B8=07)GE3Sss``E!nYijmb2(h-C9$;{s++jR_u?i__n_y=CqV^>&`lh>@XsxavxnUZ+wOTF zs`-e6hZe-e{zrBkdVw7z_8*@;1wFlPJi`{zQFspC$1`jY-TVRuP$Zc4m5}kS2x7L` zUY;I?za?+HM#=?EBc+Ex%l{H9%=s2O1oA-BZ}32qie~6!Q_)UBQqe_aB^AAVHmS&e z;H2U~kLww16@1c{S4BRXsu zM4i2rs@849EmFJc5x1Ep^FZU29*BhMX)*)S(V1Xf<=!oEdaaZTT8E;EpA>HPglX!C zZEZJnWE-oCeX!Cg_C*lZw9O>MwC#8{#h{DN#Po{jN4_-u^dO~QEOYa-37m?2qvNmG|2APkZ#o{_x z&)!63LiQQ1kv=+Br-HLL$CW*7V;>NZ^L*BMJkU6g2O8~LA;4I^Wgjt3g;I}prj-%Uca4?geH zzQ|`|`(_eG`wv9Wz*^wlHEHjHrWRnUvzb(Q{_4XQ5`~^4Gu;LcG>+_nCTZ(Bo=+2$ z24mqu*MU=E9Z;)n8CF3!1=b6KQ(qZQedWIb!AYD9r@Wd-;d`PC=UG}w@H?Vp1!DfM zOxdu0<}75g8KRnGCWQs3?HVl2PgoTMy9>C$fW!NNsddv)I1S)=!pStGR;4C{mtn5P z1FudDPo0U^E~vgmmm~Zf^~c2$o)tdASBG0*qQnE&O^;2@eolEHHrRkaNIsrU1;cNS z`}Ul*YI_6|OwS#!g7XDrzO_A-7#?lE8uLl8M%y!qi50iQs68O`x+#rY`8D1=i^S8o zf0wY{jF|`88M8MW*>)nYM?m&fweh205o;qwyn$`Hy~w0hxAcuibh!PW4TA3kNu)N>jUYM?SQiXJ9-#`iil22y>1759cKsysqKci3{ty{)De*Ssl>%Bwo<=x z1X!sqXrwZ&y(Vs^HUEvMz_d0Qf@y69q4&Botr=&NfR$S5tngc@E@-4a4?&$K?jhU5 zgAMTmc5YSniVEjIY9k0OH3zBF)+BX90V`b#yP(-&kN4UQkGwN>4bKe?$UcsB!vWx` z{StuzX>fh(=sZ+!9;j~}rN=H3N%RQou`cL(?76~xyU~Cid!>M$$My$fk2O})9%~5g zv4+qd`>m6UcR2dlT)&xu`uB(e-((A+*ODLVK){N{{Up0iMUcvnHu7XryY7 zHF0Z?{m%7RLuii$VLkTeHKp~}HA!_rBUO8>iCcTDA+*PS?|Li<>#_N}Vqf#>gmD6T z9_xaR$0k{EzVJ*O3#(yWan3{x!$fz+()KZG(+HKd0dIfxWx!B={x6Ghd)a_!0XJ`6a``2NS{OqWVM#)n77fd7H8z$6EGF z2E$1(-Wt6dcG)#acosALB|{5Z3j?xS8-K}w@3Di!gq5iNlHoVBHZI7m(eo>OEZ!P@ z>IC%isrJ&+#vnTWOY|N{@k@r|kci_XX0|T+ONIr|%mwwP?Ngzd0sA!j8#G($YQ`@a zA`Gltkecle&0H+j>^x}JNnP}p3|+8w4=H@f5d9gNHT@d|cKm0)#W}XyWVlMRVSW{LYX8aPpgrs&db^JWwlGjx*L%7(Q>(2vr#`b&{w4VofVElQ& z%C~}GwnV_rrT#qNCMe{B`tyJrAZjP!WTDWX2kZ?|E@(dw@Id)I;0(A=4>jlK0d$|o zBsxwt>CXdpK^ZV0(%<)afD6WDfS&e@gy#y7^)v&rLmQWYr(wVMg;i(zL-;&k2t3UN z>1jv7(_Ad}v@79h`JbRRKM(i^Hbt+NxY#F~$8{5;?=DCmOm=K*6N zc4%jutxTc*JYWjIkpfa}fYX!bq13pb`*{Gh;pYMG@$&!@{5;@F1lUbtVb58A9`N6k z@<81pZwz^cQyYYz2iyjATrmDT;CrNZoUK9SmHXVB0dk$g|QbzT*7Vw|03bnw&1S+EBb-)uK!1Xp6ar`hh6`j{lIwF|8S^w zp|EO=x$A!dz^4U7Cda$}UqJXb1l0O+*FW_wmtxNvm%ILTv3EhOe{vck9U-i2P-b$| z{@aLj9Rb-^=}r5e0-P$KPANC-9|iCOu^~&i-n4%Tz|{ik;Cj>kMJPFENiK{fD>vMY(A|x19>6JP~^UONZWS&tSa_#!dU=7%Cig(>^(N5KuPllg~h$ zqtG$^f@I|XgP6E!pUG$fp)03ZtAb$iy|Lg^X&`Lck6!r@%@sJfSwGB;P(ibBYyu8$ z+7DGfkem0DH=`UGPR?6#6Mym^fG0?Bx&=4$Cm#j4L_p1H_VK@n7jMf8T|BspenWHt zTu>K9Rvj*=_wnz0o3bFC!0zKWoCM>2{H$f(cT_O@_}_sB-wCdLlNxLf4O~!baOK|; z9;o;6Z-{T3T+Y6I{NWC0=SuI3O|5%OpW>pnq3AIg(Ds<#y09M@_n3D39BzbcX+yw@ z2eN1rKw#9JI~6ZxO3WcrSheGX+^gw+*b&o{f5l6eud-V;fIU0}jnOnGeA{P<>f{}0 zwp=hi*J@pur}7u*@I|65T8tU-Mi4Yd=HYeWG$3l9PG^I#dnPO;TUNO?P<{DB5KdJ?adUBvCY4bTMXm{wv+( z;5c-7KxnCFVrVetia3YpDOT!u0b$cVsV-=wZVRcch)$d5FH?|TM$ihRy~hwcAkCG( ziqw~o*4h1}LQcfE8o^}aY5_qzMvSY&5R9wajq8H@){ugW1@uzjf~LctY{J~uwZgp~ z^x!wx;h>`v!7BpNP21K{lf&nZ@}Ck8; zh-MHY4phTJI%|k}i$Cq3ovN6k(|X`9#UMH45ETp-&Jf%q9#hl8a_BHZKsGWX9>?V! zf9(fuSX85fkPgy$Fs>NA>X zF%sI2~W38}AKzi~BV+9xNv%-GD%C5Gt!d1-f-(iLIk*V0b z7Vx7q{&vTow!*qd@I?adMvzu00Bl4s?F%iig5j`M_yJb%Kw4p4Sm7Fp%d^6b0_s#4 zUvR`V7_uq3N0@cZ1cgI3DK4lRI5sT}%LeT?}xn+__cJ)-U1E7d$Usny8N6$I(U|AoRg4 zbvT5m8w3w-$!X!s8Sw z%7x0i!VqFOI{Cf7$+9-)8K{pzV&v1d%EC7;Cuk! zwJzA67@2$;;72ZaF~HXV);{jUc}Ze;kZMAaSx->T3!s?j^L%=lmdoSweDaC%xcAnz z1miD5@I0SZL-0JGP7u0=;CVjVOPnk-wllh$fL>S51*P5!v+hHcF3$+cL~S>YzGG}Xw=dwbRj;YLa!0T%*mIDK2)K}5LBTRgjL~V zk>+L2Y5_gVxS&xX_Z}quF5GMup-T8tKTKEjRLN!3AXOUxQbhx5t<1Sl9%$OX@X9z_ zJXKxLsH&~iiKH8A^%$E_waRkGT8)OFDlH(awFXJ$?OAJtfSw92XjBMF4|yXK9QY2- zrn+7QRXxwgsvnR4a0W0A&*Z7DOYX@o$7M4e5W8e~rM_$CM`2{ca>HTR>$e>)gfSpz z9Q*E?8T3LNXPIH04^|Jfcg=J|0%MDg-xtXVL72N{iX_ZkGc6$OT{E2^%w02Uizv3P z=B}Cb1uG{ecg?t1-(53jIf^=W&Gd?Bgirm7F59gR+mhvDQv0AJ-r)#_iL#HuT*V~J zwW1>W3dwE8^9>uJy?l3w3Vs#ltr26*rlk|ZFK~>t3-UPYuo;t4F34l8lhy4$r#arb zr3`myK}OAHxFUUL5Zk{P8=aNrWz$qLy!)v{aEpK(V*nhj&!sjX?W517ei)p$3nyy< zeJ*u~$uJL;bE%UPk4CjG+&YJm${_VQ4(vTz&}oQc$-TL3v`7VA+9so;#ZO`00MFx2 z!EDD{Xm9e7IQ#P;nhe3)Z(4=Wx8B?*adM*0+kZy&V?f%$UUBV$_KNE-B{*A8dnb(xO8L~c z+Wa8Qtjx45ju&0f#^8dsgd_*&jhdI zZ^;b2|M!LQslQ9cfY=iU3fzvrC3`8AZk7}b+mkic3e;G^eHFoyi7L7WGb1g?vnA`R zbac`;VbBF4JfnPgH1y6e=#AeLqvaST=F?ysi@m0|fM^1tZ?xS8!@^b)yf=0e5S<{* zy|FinT=rhgjkYdkZnX6O702b zeu9vXZ+R3jRD{^gJ_vIBDxEsyB@x{Af1oSM;WbL3nTG5 z>?b|~8xwaBku>9yZSj2rx8NC&derh>usNtbJW$^Y7VeM4>@5-KW|9%K0BjbJ3uaZd zYJBQ7q||_H)44j)iWDC#j7XGD@y|%HhattU;-!n36km_DG$JikBh|3vCYa1RN+Q!E zt?d=sJo}5rBHLQPyyQ|fCV4Uvew`zE$=+&EbPn_m27!abDIkg6+MVQND3&U>h6KK~Y-g7hnKiD81$YUrT4@4?Xx zjx?I2RDNz4GziDWO!A&XvWrGytML#-vDdKrrxC;P^8R!k!?59n7f}!gb;r?ihBU24 z%t*Gtlk);50qWVJx)%^v9%fCe!jy(bKy+xLOjXyNzbF-SYwDw@ZZ%3_P+cBm)V8_k z5|oxAh=s?Xe7?tm3xehIa%6lvU$A_Bg^ce8p?9#Jh#-~2q=5YoK^j4@fPDukEqrlg zdT`y2QW09DRk<3x z-ULw1TBoxT6N*Pe%tyEC@M#@)CWEEI6YF}as$8##6f_N|DNa=rii_~c#{I%W z=Sr)^ILPM>6ipW$|3i5c9)Y6ifh?MBD4H&)i{@WYG(C_-^RFnH9*Clux(h|q1yMAi z1bz*?maJ8)NriZ)@S~#Uws>u?S2G|ha(h+10ck{gr|{Dfoc0EY(XPH;trIfr^=dDS zh^@a4cyuufru_%y^jCr7Oo2WPZFk^mb*`NU&piIJ!UGAWX+}cx^11tNf;8>SCs2>S59`HJINq#a@TQ@pa37 z5;6BirPXPws$nPWp$KZ}086ma!0U~Rpm?pZzNWXC1nw=@7ZA6Du-Ei6S-{Ofv|bk4Z`GIW!}lVCJ^R|<#xU> zS1fmtFjp-1g0NRC=f{9BcgAl#GIm`43y{4JZSma%*V%YQI80x)yqAEi&28R#pv~KZ zgjF}rCT|ZFkfvwe;y)BrUYq@!m}Ck7UY{MFHoMdVX^GrkS79%m!wHLogRyJF#pu$MFd$8^@aJxPF}X#o5h zet#9UI`Sp0ma1g-P_+K7p!Qmo(tg#6=kX`w?ri#14+;2Hl76*V;?o{({Ht9+>K^-- zu7JA)))nx{;i!L_eD|w8$sF1sD*@a=nfEl4h_OM zbTHO&=pqP{T^o#|20_62PMcjGXtK+IbXTV`nkx}_m5~QphdoqSy~^lB0lms-9|8MU zMk`PiH$(fhY8P8{fU=d*=@LvE)l^333rGb~#Y_($N1j|LAT!lgMlKjvM!Mi!A-o$f z0#k5Y&=wpQGzG`SY{79slM@C*zpgJQJkaEX0sG~|eNIAc)!~7*;5;p?bTr!nJmQ8o z1xHt!Jv6fMvC46dk2QiYKGuR~+u(J8Fe!UaB4*8Jear)qvhbs05`h8PU!#vDUvog6 zTvMs8lsK8yQmMvQ)sK$-*>lIh1+5V(1?8-EzA!CeHwk27#7qn(I4xn3 zgvqp9MHeU2bW8YzlWz7sbWXnDf~FntKwGiA=A;oh8TWGD5^!Kkc%Z!DRz_Q(UCRh#cY9gLF4uY);m&t10EsgTIDJ z7y~sUU()Idl`K|af`3##E;S)ur`5))n4Elzk8XT$8Uy1|;GHSF^s=<_}qT>$h;-9K?bn=3A8a>d1LuDGDd6@z)X z;(;bt49Jq>G(fi?rK5mruY+ZyI90sFOW(=Nq`@l;+ zyaJ^=<6S~UdSKEE%C>)BNN{E*Ya`tm|5`vyS@gAk-w5c{N-pTsO1}y(D`i_Nd7!D4 zJkZoi2GsIRr^bfOVXLYR5T^a(>_Ap zOr`Bj-@^rMp>RP{C|t}I3Kukm!eCyZ@IX^249Glk3dQs_S-=Brp_nbKGHi)E?VGyc z`!&1ywOLhNhbeZ}9nGMu!(T1Ibc<&k{#F6K(dRM&S?X*v?1GNNKj0{19o_?t!+W4{ zcmsOP@PiWPfM&RZ=`qc4Hwf$7!K6OlF5=nxb~6am47c-zX@{QJjW-q0w79wvo8m@la#r`NyTv5lfYb%8Z@ZxJZ5Ok? z?SjU)4dx90+uvq6# zPv;)dIik*$>&UVmb!{>Pb!;~Tb?X*FucB5?fomFFrpY`a+a;@u3-;+!r2Wno-6w)y z+cBgaU6l6Jx-~+MCa7DBA*fr2A+&BnXnS2K(X+O;I^H0l-qCJWTwSnF$6(r5m>iuc ziDE36uf}m?_3vOAW7#M1j5^~I9ASk*p<#Y0hbaqD!ZUnx#D9e+=~dY0+U+}v7des$A{UIV97ycN#1nr zV$=_@W?nFI%1&re-e zqvw|b8aK*qpnWhG1At%6T!Y>JTC1mIbKZ+%ij(>kausV9(=_I`C%fuibww? z44P=otJIk6ulQ7`vH`>`L!xi++>Gb8r_|Ue!l5-CBxa*WvDYeWOdv5A$Ii5zgj_;j6re;foqN_bj>r|TqngNX;?bRBB`DHets zA-U}U+(&x&2dJMw;4AjbBQK$P;`0mq940&-N^SpBoJFiQ+748?@chqwFoj!jQa?i} zmvh2CJA*%nPQ}KAZc2Jujm+){BA8Ylv@eXZzs|+@4$l{D7DZoSMY9>tdXvIydtn3u z;=+Bh*@a;0!t*{eqU_rL#QHU!5Bh3k>SZ+fdx>62h`|zG`0JW$+CW6;>Qv$`~=wqbk0wQ*sq7A_MDvx4tGRcxbxubpn1?8?=Nhc z6kUdO;dVT8heKu|n7cr5hXZ5Mzvv2_rQHj(?HM&W^GC4c*9Y-&DZV0`gL9;x{5du@ z{ju#61kApOg~=xHEV*NR!^il@A=rQwb~o0zK6@57z<^r(e~B7>dCOD3#evy^pYc{U z$1{CD5R4W%U(&XUFe`oTl8L$3?v;K<#+0 z*c&%JorD6^1%d_W1r(rOKI;O60`MQCH$OusF^VSOyNp&6?vK8Q0$t6>%Y zfsa&fBrE(hToZ^h#^A_op3U11!kz-yO~M>_R=IJxKJZMRp!~@1aRxB6aqyWwLD|J< z37(+rVX#D!Cn$R$EP*)qi_c1ilrsuyuvVrOgjJ@Kgi)r)RpxO~h9e-OjEfm%Jj^KL zfqlvZ;W_wzWA}jGgsao=w>W{1_`m!vX+gd^t35GDU(2$WaME=EMw;^g0X65v_>lNy z9A~)D<-8c{`Qhb|bc&#C{uh_vLQ6_AAZ=|WEq22jNlVux={%QHOS%z~ZV;4U z55js6L(+GGj-#YNG?KDD2uaUFQbAB{y{Kf2mSjLr z(j?&&lg1uV^dpTuVus79t@jorZRbkLNSX}jN!rZ~Z_>2;nk4P#a%xGdAn6!E$I^Ng zB_nj24CqPvqZ{5xY88-!XSu)(*)FoY*5MM zTCCY!F2)*4$U(Hyz@IY?(T8s@}E~qzrUGtZI zAUAy7j$Kh6C--7rh7DgX$i0|5VH9RC_OJEc+a(y6dZ4oxvtb=4)9OR)ciao% zyFrC&N;W(g#DbF8dGz3sCmCFf$UIOF9@A))4)R$iCO>};S1$_4ic6nlP=CfM%wGx0 zna@zIJE-s{q~$^ZDG*>bJRb60P$%X($oD{w&7w&79*%X4!(SMAx;46NPxqG zhLJeJA=sQL{#Xsp_M*ma1hsfhO|%6rH*3K&KO>F4LhaB2f}f8z)F7sA9cHB(n*1HF zR*Eoo`1Ss_X?5V)x-^!?_AISdDUM`wzd^+Q@?v`ci|39CDayt4m#Y-%f>v~}1=Tg8 z7fD>c=u6flI`wiC+$AsSDSBS57VTnIvVlM5juS?W<|T872WQMo+@$qrrmK(qNhUiA@V|- zcF!6u+QqDB7qp_gJkh807fsV{1|b*A3vJrH;{05!dF}QP z{eisLg{Iv*PM?ce(Jp93=eKmd_M0_|PM62IT7U#wV0MS-b>xK>y-zIK#jI!-w4$3l z(Tx(9pR0SXN%VmbjV>>=34(3$w|L)?I#*rHigrOOy44eX@ftPk=>3Lk(Jp31yPy?aIoox!gV!kfoHd9J8rDON-KayaM*l5`-43mwxawD& zh(_XG3B(a~TKyBdjK-mVZO|m`G&`|Qay#^|9~M?l;4R)Zu}Rp5{`Ct2vJqIkU1GHE zU%w@w*S~f_+rM@})4$fe>n^SG=c-Egu7jPt*Hz0?oo0iwD{RUM7hsJ^I@+$|rfiiwl|qUbJyXSRQ5m!cqca)@3C_GxvdLCUJQQhECC+W?&8-WZRhXs%RyME)Y6r-UQKWi044$ zcak^9;9K4%Lp+2xtsu6zNtH#L;7zA_a~Iz9@Xb|f->3^^zj9|2^?jH`0m0&3!K2|? zK=c)BCha?~8k zMA76VQikU()>CU|aExov3qmh1Wj;U@`Cag8xUt1h~kt!pvT#BtB?#5+ateTe+88$2z

k^LA%F9`L)`W0yPg8Upj^Y)G)vm<&rO&}3yR%SW+ zC9NcOEguu@i8q}wF)_0jDx)3{?EVCqTfkR27kpF8r$vq6YmA9aGCQ#b1EKk}FLdzL z2I31nAgnLs=LtbyXf_0Wp~DdLg&q*r7xMEZ41J*)g!P3Ed6U^4UvKw-VErHQEQtK> zj$<@|@Ejw^e2(w0TLCY*0iC8_cEsVCByPdFE`7NNgf8dw<=boGBFYIJ4brCvfK1N- zkm(u#GJP({bcXbK7u157UKeD#LzV#-j8#ICUC=gpF6f&e`EQuub4lB#NZXS8`5{e^ z=)%Y=vC&1Dpkyoja}WOTk-7>JJb9vIk83mW5fz&%mALF6Ec*}nvmo1oDM;`XijwiS z3AVS!{?MKYs!zZ_@8U0ok14B{-I)zCcV$5gRtY{-r{0RszDTKII1aLX%h=}IqXAI! zGY?b*2jVZK#?@c>o(lddZ&CFC+h9oDk@w=muhZf9YQsXb7ba?(K#aPoET<=G+ew&- z+HMeb_VEmN_K}30eI#LKANee^kHMMF>|+sxnSFdyR2l=7%qNB}W@aBfOd30b(ZTGz zwVtSbZgy-2E?Sw{M;CKvAM0MnSLDr5DWw{+b(0(Mv8pD946h%B%YW-6DrRwwno(7E z70%;nISc3GsEs3ie$fWPF##O*{2~LQ2j-k#w6Cyo+@@K1evt>-^NTtm!k%B$OTwOC zw8S~Ts2PMkzo;FAIlrhyM6nxT&M!JoFm_eU`9&_)cYe{g!pXj&bAC~mhz45sF1AVc zQabDqZ3eUD&&DAs2C=LqDAv_}m zV^_c)!sCMW5FQV74&mv62y+NeGpyU3lJOCO+zZ=}A;2Bu+?-i*A1e-L&({gSkK8`|(6$osO@FDa{LCo6` zDom-E0%dNF_D zYG`q&M8bAzZdGb@cssQ5Kxh?GD;K18A+<9g$NkhYq?R6Nv^`1$m4nl2>w;EW7wpp( z!SE}z&c&5HQZ(2`)u`Dje`627{U2cHE|ZBD1@HHXpuOWk#-j2WC6Wd3>P$| zRIAY>Wx`X#1+5y*t{UyG8grd;Wz|?9pr?ilS~Z$G(2w*g3Rq+5f*?3oKw6t>ggilQ z0C>b2Kz)K*e@?^_6e#RaQ7x{OMA(r6dcp>P6xJWq!uo?0R<|~4qAplU=kNDxW9z)M ze(am+6#W@lIsk0Mz{G&`bJ{f3wZ95Zl;EuD>_p}%0(w(^E*KjcXZ9q5%fzCrIJEqC zp_B{iqs#sQu-D`^r`?JdhzD{mv&9f}*iJ*xQF{%c9reOEjNWwL0>XO6(@tL7F^3Bp z&w!Hn6@FfgJ=>ByR6M1I4vW45*nwE9*1^F@gOK)a5;)2w`V3v#;35!HaO~T@X!M_! zuq-7QDO498!;1OqKG+a`fE9BW9K{v$@3CU;fjlDRSF~X+XpTs!yAK20A|z`Cufg!5 z8AP}+92sr1eQD4EV$|M=y6mfWV%!O0QE8M{52LD&&R2MHNb z^zd0m6#0vt5k)fyGotvXq>5ciGoo-YGotV?8BrLFrNSRkRP7kIg%x;XMiegQjwmMl z16|_|sFYHp%j&)d(Je%@3ra(92|8eVm&S)x7D4Fh<#}{&7Fv z=_em07)yffC%d5SfO(+P0qcSY(*f%>ve^O4Un*L$1J)#j?kAt_bUJnEVL#b`)Wr6a zUC?&GE|lOb(zg5Lg5vkOpM0e-=fSLHu>{$4|{^cOD^>#+2<7=oq0(-18Ey+Y{HU%cEY{hNytbTeD}UC>QK$V&4r z3E@?m13*@q2J|Y;6%yR5H2*4~S82MSXi;DlK3|x(fy&mH2At{|(*>S6&sqq^V#qn;xnJfjW(X;cGxM!i6S zdq%xjK+mWyXtbz1cn@?ik*bv1A{W)%je#+Ug=IKr=c~I=IfAG?ClzHM22pusdGPF* zD7zs#@QrwWX8keIBs{m^S)bxmfQ33p@D!(^Ai6=YLOc=M);^HN5luoc;_iHM5lXC! z>ARM4pP+255>D>$F;%CFnX1#nr0O)7HyIP;wnUjrZ5`L0ZHV@n&7$0FsP1A@hezS@ zu!f7(X3|yR)O~$$;T|PXt_Q82%h`TPlsyfM!BuGQ{y8Gs!sFoZ+&*VW^eD{Qisyy% zN=9ZjfE#y#sLiH_B;UrHeMK*3U~N@;baFhr?i?4)rpMu3ZYzv{PImCBe{PYy3}Xxz zlamm^&R^ZGNMmp{b9dviZ~=&KB|J@mAzE#63bM%q_4cm@sPKa$N{{BYgyugBxE{mv zf@{nfZh0r>2Y0|f`#-T3R^f)I(ueQL1nIjm^EgkHPM?+y&cYv`$4$=$hv09?c540B zx;Q&7M@dohx5p8;593W*ty@w!6Z`P4lhdPl%qEphq z@`^MJs!Nw9gUUU)R5>-u{*EINn?WquDLxVLU&2k(@H?2G^wE!^0*^p+K^}z| z@+d?XQHZ9O6t!mV;1|DV8p{aYZ<(g;Mbc3=-xCQ%wFh{r* zNth$tnn{?`Aa)YvnIv$N(3~A2O481zIdieT=Ij{Z zK*4yKR044UCXA0~6j z)%fP%?6u<(#2IWk?(!@gIlr;Mu@Rxqv^=Wgn*?PLZMKGM;GjjsmsSs{A<-;&XbWRE z9@+t-Z%qq?@z7vD$3u%GjE6Rp5D#tVvy4Ey@N7M_7lavsJ}OGNe&=Gw?>tQW&R_%m zZl%P^ohZidT+H#i%t<)4BmW1T>`2a&1eI0~%ZVPXe8*FOcy?BDQfzQm**KCTK10g| zIR&bZj&woi@Q$JzfjL9V1I^(b9%v5lFd!Ri?LIt1Yki4R+@}Wbf{14-c2ad5%c4&L z?EzsA@2K1#xw#^Wcy?kVp6%fsEg;O%6x&F=>_71kkK~v5QpW@J*WNr8ajvk^S?wVd z9;kb4JQZ=FuCJAed)O+#=%UmA*dwrOYvVGkhT3wr;}z_ElMJ&#Mxg;R$=DLFR$Fyn)E zjmG7aHJSob~~jD|S; z)mHjNz{%iBt8L@@)&;GV{wJLE;M5?kGytTP27t6ue^6V=fNURZ9T!S>5Ha;-vkUfF zsg4<)U&s=_tyH%lsGZ*b+-eA_+GPl;7#!@(A~p)4tJ_u(R+U2?lUt8-!9G=jsrjjK z{_vw)HUD+Ypp4&?GblUMrQSvl1@WfUj@Do!Ys%a2XuN1;f`%h7_tW zGvR`1HMcH2dwH1$a-t&q3^yaVoTDZr28a9>-2<`JF~@JxT@bDp^4oM5qYH-oM%@EZ zVsrdf-2;z`a{Ol9U~Em{njybkcQLwXj<+wkpefM?%OkLv#&9v?fF33eXfSV9UT=}C z67#dsG{Z?3a~u#HL17t&=I2QmR;y_>FVYR|rA|cSpDZg2+5L4v+k^}NSw9Z|*@W~5 zbrWJhuc5t4qh zgzgMQj`(eE$aWBlD;4)10fgmqChy|n?o4>iVQvD46iJ_^0 z*jK3D5dXwbld67sGYm0~W)K|q6(lZMj%A&z@z1~T$I}Fc|AvQoD@c?oHGIkj+2B0< zrPUy%rZ!HCv!@d|q2?cWe?_ou0$o+LsIU~%<$KE8S-QxcFsS$~E*3H%%YLQ$LJci^ z+7GQzbECrB1HkQu)R$uq;1Loj1y`tzxShDT7|bn#v!1V1U#VRE0hs7?Q9TP^yc~+1 zD7UU)*KdMYuj;eAl~qexwy7*Z_5ol)0M zk8REA&q}p@Vq$Up$*JHjLAj1xsp=C^VOT%Zn$u;iP-4y}B)n_RHkk8i!C84%sY< zcPkQG7grvpf=eAOD%E|7wUTf4L*pf}pzvp`{nf4?d(9Tw%}yRxn1;n}18xQtGV0h| zcsx^VlE9$ToAXdCCiZcF2oGz!a}5=9x3olz%6g)P8tz=Nq5 zwxsKoJ_B;!K}KDX7^YYH49d=P-%8){PGb93`dl>5=!Tb}LO0BmQCB8%bw{9t1V@)+ z0rP~4LJNw)7uq+7AC__&ydt{gooP!bA|3zI0V%JtJEn&!<*6Oxu8Cgw;2|3!T3bpy1mep1;??l zUzdwA*a+4LLhrom!DhQw5PIj`Z6LZpVCP+KJT{nJDl#{OBF_xZ=N@;kwSnQYmfTK= z+VBy30N)7S*N;!v9JBf}UKWMVqJA`i*^kjRNI7a^12W^-z;`0CH;6W-2AP2p<6)>l zjzIcd%-q&HVF3(qJkrcPLf2w1OA*8a>(d>13vE)v}5_!5X-5N4j_MTv@4wwWh!F*8r%VKPr*FzRNvdjzS<=Y!yT ziI&yCGh>J38nC=PTzvREVw0j=He30LF)0 z%=(ZES|2hXr%kO7?JQBU{xd!leuymDS6h@@5B2b*7`_spyj$kde$htz-iJo7yXkk0X-uYpdFqomS|?!2gwdI7RT6 zI&MSEFJc9^EUzzKZq|fcyxal8UcB4`g3hHcUe2G;ckyyFp6%|!P7v&wMZ9=9I8ka2 z?k+5XFc&X3^M$#1xgCVvUD%}w*Fh@^hASR%X1*b}yH{npss zH%q`BH26@q{uT@iz82kB8$tc83s2!g&GJp+;BZcWPp%angD?7AaPHL7Y`9`2oW|1MP#UVv{E4akY3`4^~6?xzo76yYobIQN~=$@wq)nC>X0#vY3O0FJ(M zKV{58-GTeyD;urEYq{*}Xh?%U#s}+j&{4#5)n?el$Gx+ zLGY;hx|c8-2u@*&UR+yW99{&GQR2VNnlS$RxG3ZMuZueV`>`B29EE01-EIwBi>-49%E zizu7y=?^w34vf&4bxA$|x7e;*=1W!qjBM~I6 zKC2F^`hogBkx2mmC!7qf?-MEM?g#Qdk)?17movUkq@)Lv@iXJ9m94M6Ps9V``$P&? zps8*U=GYfj*CfyF2d=jk=3VPHgkHVct3Mx^senHDQ)L`j_aO4Q2^0rUc6C)Y>dd$>fgh3 z{n!fetRD+Upq2bkIA&{(pVrosFrNv?9l9A+RT6K^Hz;QS``Xgqg_l#$kVPQrME*TOOE&yB*croC#`gwAp0<&+k z1*8#&stt!068*reIwDuN3>vtcx;V{7Ub&zyPSa7GT+kLL7c|8wDBJ>R+d4@bsy52i zKZcaKpf*FH7OcAoE4^r_nmM>Wf3EVttZKq^;Bv6;DXi=b3{|so^?ygKE~sOz-x93N zUaYf+YEcWl@LLZqOa!M3LR7A>D{SC{lZS?z!v-#BZQz2&26c}i-cC5yP<-VwflBs( zh?Uy~uTB#^SlJC#I}R-pi96p0){`LrE)>rQn{eCREZB7QB!b%ZuszL%<5l={a6Vu(+yv` zp;_x2N{q{M)eoO)ur^iwZfiDp|FTkOb1B}l7hk>d67wF)1;Z2n%mj1rm&T3i`k%NDi;w?L5!;# zvcZPyk(v(b!5O%9XCqR}LG6A`HnEIJ1cz^ZslTDar0HAufly@nB!{GT!rhReOKXbwRtQ) z?*DEsSK+#7d=+j(6~4J^)M9WyO;if16_lPu_#bBxNN^T`yDoY`m|2AHMHzSVzKfYz z1P_y01cT9y`(_auX55YMj!$EX_faXmJ-r!J?G+ex?Zj)HL71)GJ$zxdc2~B7zz8+T zE1v5l;dFd%@y0Q!2P5z)0<+g_?{Ple;k8?HJkV~|vMH-VqdyB8 z_j(uLk_770s`XibZQ>MNyG85;G=|>NK+zs(Mdw{s?p`P|y2*m#pg4$bmS|_Yye35+ zXrtZMWo5Kl%TBH3{y4{%S|022nCLvvMt6eC%IK#3j=8mVL7BN}^#@h04RpDnv4Q@8 z3pbde9xeJ0BKlD`J|o%#t>`CQR&Ahh*WepDL22i-+Fws zvJ>)?4i7{b(s$h(kdrhlL;9|J1JcO$Gl^fFOmrs^Q`H3?5onlq(R%YNI5 zbI#OiEyu;UHcvSQbLF_0ku&rz6?`Oda<*trL!8DhT{#<$&~jYN$T65J$Hk1C0_1!r zacaBG7^KrvK0nR^+GtMWXf4OZj2wfxa$HR0R7`=K9^}=WS>uCX!UtGnsQi=8#);TC z+_O_G>_tdZ^N+-Eh8|XKUxI6UEn8;cn@v;Q(v43J* zcqyj5Tu`4k7QhGwq#k{Tm|Y^_8yJ3}9AfscfGpSc5HlCFhnPJkoOC#Ih*>lY$!Mp> zSlo%8yBfV%5}20FEW&r~y&&v$jD>e$n;wbeG(=LP_8Fa9h6r5H*v7@IZSw!;*ro}D zwaqsYuV)(A^x5V!*k*x5 za=y0BzWLn!u#F2E+qjsuP31L?Z5lyX+Z-kFvKg>`CCe_|01a zvbb8maY1XFcZHKZ2+wa?sIjq42MJ@FZV-L8`4+ax?h@w@N7^-N!N}Z`u#F2E+qjsu zO>nJan<5Bno6!=l=Ql2BZDT;+Z{|pN&upMb zo8MrYzeyyqZJI~tx?vj^G`4XuYnxt1j?G=VzR6$b*ycHj*RzcaTH6@Vw@t9?8p_n# z0(!P_L2H|JgmZvxnxLe$O)Cjwn@$kcHgyqd=pG<7YQIAEL)fJ9dMrFk-Fu+KehM7Q z+M*E*))p-wte+ew?4B)L(AvU)zAZW>{MsxorVPC%pl1sgw6=ItI0x9GgBlw@=_X-p z5!_&Hk=z8m>CwBzxxs&t;B~MX_yiijg1~F(g0Z2-HAs~%3x4C?y@Od;)9*9#m!~Oe#^KVk)Qa>Pw;k1^+ zO3RsOMVhrX2j(VZak^}~Cibrm>e}(DD}FUXzv?xw3SS}(W9G!^%_HU-b?Aif@J|B^ z^3~j55);CQKl4GoljBdw5EGo7@lKBVjW9E|mBh*{t5Js!uiqNrAwHO|p9An>AFQk2 z58wknIJqzZjr^Aa(v~&qh@q)hkT1OgvP-katDh8prEs2))AVuTfj+{^(nCaSJ0wHPaL9I%cZ9_-mun> zdJ7ke2pU`Fr1ABipQeJ}#BaIbw?;MB)PDf*6AxTaUH=NeZ9Q<`;q^}dyiRH$_W#gZ zsHwjX;E&RtaL%Mg?Tyu*#0%?T3IwG7-GhJC{0GoqKkUlE;Nbj7V%PV|gOYvl4|mNk z+e)dDb03O=XFd;uWqT^cc{u%J7ND=cup(G>bQCQ61I8LF5wYHDUy}HsT#q%DZNrH* zhAjyniDGCU#P~A^ZmeInFWv`rm)`$ZUOjwRh{OtJ!>U$!*I zp{Y8++M1hoNCvM8=MsWJ^41m=d?*l`;bmK^b;AcndondhnL+8CW7EN(@dptl<1SAJ zhvRSALd=I|Q3gkMoEB%x$6!_S!xbXqLKXdn;c~})_>kukH6-~Vdi<5GF{_UIcr_xr z_B|}wkYkZ5W{-ITOE&kH1zadS4bLMTZpDStxi9qtxlp<{%;|BOTeV>=mKJM+Sij?p ze#>M1njmo5{i2^|5TjoQIgEbYj(#q;)z1TsejeDTUyvBN4Yb_hP2Ae?A^s_yhkt&b z5Cyl?snW_%vD%NnTc)VeJ@Nlte4dUB|MHXa;NlNK?5%W>9Wiwk769gl!7aNg>u`%8 zQq6D2Bt`{iG8$pyTjo?%9E9fwhzw65Nc#>UB# zS@*8hb-n>Y{hAwZD)GL@@9O=FuDsOuPS$~}<*Se2wy~JI%QbgP_w-Z0e=Fu_=?rkR zCpfwazolEoYMZ)7bF_2^gjPV?r{l*^xcfnMST9Nj?Xev5xTCTCLg~0VU zL${MSeN{Ss(AekSs0X+Bb6mh7K4%b#6H|S2?R~t8@xv~#CNqAEx0(;cJ9@_zWEMSY zD$-*Myr^klrq30*Oc}b>f1t%4H)wo}9K_+T!zzKr5-{2h_1a=Gf z?jTW|7?ZvVMCrkNVr+W+C-|H(?+=L5{c+!f`}rFe6#cL$<&FM4&XNPf`Ns?_A=b|D z=1skH1tNQgfS6K{x#mi!;umpbj``+4GA=wj51TwVfscMH+t&B~@O2z>UB-O8H%?eY zQdjH8F?90gZ(WdC*xxtU_P{PaW^{0Csf%rS0bY#V7ru9Sm=U83{h{H-7rHUmeMo)Q zIDIn;Rf$4hJZpF{3s{SLRj|y*i+%6(FXMu-*SL7j!0;UH(4iH7Hqu;Z)aGEZ89#|H$3br7o0o|>vPc)NUI%bZL&#nXs`>O zTVy{sC^<5``f?YHpL+?N7G);)Bx?7}wbg^#lL$^#3s3F?Pe^oQFL-ceu066Cu2yu&A{>i(6k?#&gp zCjJKRKsASGt*7atiiWr3gKH$XtdiaV`dtZ5=gsez9uEDk#Xa@=57ckmEB$VVO1G1s zes6&%y3`Yu={|TOdzgA6I3G_urc20Sg39(FtWr22Qt*Pu5q0NpVrFP$7&TxC9S|i9 z?!(5yS{;)XY6HCT7wnIU6p*g^4bFp7ehGE5LG?YbU}8G(j?&LlY#aQ}ACeiJ2QK_P z3Z6wqcEp7lzqI(RR=m>$_BQyvpN+g_a3Pa8-!F+iMMxWntuFHiMK?h~I!Qd{N5#9N z21^f5=x<&j%lJx9#E7g4_`Lbs2L~d~xw=#w$BjB2uSLJpgshG!fOfJBi ziV=`%YbwSDa~1QHRWegCHYgS2V5pdYbzy_7lYn(%gRGl?b>o1jqmXrEgYoytP~iAV z*FeSVSXY-8q}PFpx8NR)B3KIXyrNZn1mY_3lwzddfKc%adqNwW^mRdo9ixp&2Pv4{ zK?-JfkTxbAB%1p@DAY79N!k(B?%0?dFmCQeTR;mtbz~Z1H2Z!#0-L7og~HIevtLY| zxlOOQ7d;M5HE~`opv`ey$NI3H)p;?=MB@#Fox;|sm}@Z=Lwy7)~|UEtn-Nlqx|3- zf4#230P_uhHO+Ofkyf@QC|DZx5X+4fuj}{XWs96~31pg&39CKd>!0 zs|KMq%CCM1r?2bi96KzSfYwuiWA|;4TUUa&^I{G=0p0)Vn|p})w>)qd&NmB=MR#kb zIqa)cR(+Dh2F=FJAoH;A-L1>T(d2^l{DHxEl*kDGMSqh zvVeZg-mo0u_5pov@x?~bd=a+$nFb%*p2HcDpHq{Icg_5qT3*Bp8S&u!h_`o-ctR~A z{w_b_o82Q`#}rS_kN8#hh>IBU*!+kYe4G+`6<;wkhyE$!%{~eO8J`Ll=Eq+b@eNOp z;4#0Z9tlUUB4XXQ39tE}R1|H$Ar7JfVZII51wy_JCz;Vy%D3SJW6JVvI2+4-8%|Ib z)%rGE<#%z`Uir~wMczb~{*9!cyb{Dy_)!JC#60Ltav}cQgJ1KJaM7*(02Y7oQ^eve zgIHe>Qog~Iz&jp?F*I+S@RNr@c`m}Q`D~b7DZz=j@oUO&$avf1*ZjI46oxqk*a@M{ ztI)pBD^O!>^%TLfDG<<~qLi0?6*I8S{JzE4f~W?8kRe`Fhxmr;N5(H_?O4guHfcWa^xq1zWE#_ zV7C|KbA-=pMbCnXPT}Yw5T%{qXm8=D3KW=)IjSS^vv73vKjG*Lu;> zS#Z>X{F`x7Mlb<>YPr}^l%1LC6K?jb3!eUIBJ!doV7ikmot27;-ywgm#nq=OtSTmA z_8Lj#v&ZpQw+bWpQx$e&PwYjrj>YrbbM3P;V8axOplH*#hO_e79T0_Kv}x zTVimh)ehO|qPC+ju%x5FIyGJPiq}HTRw8F|mur^O@f_HP0{4OcviXoiG!9B!%Xo(- z21lD*4~=GVA4W60cVMB{31aMXe(&^R5ZO2I&FkGW#rF?@dx`hG{XSm015~35iPAJU zZM>h+=bv-SR?C}xm~9}+h8GM|L}yHF8khMkgk%eP|7R& zrJ_vPQ@M)f2yyJby@NX+bFsZoPKDuakK}>lF_Q7pC!wlakl5Hg`-Y!e)y~dO)#tk)R zi+2`n>=C_#hb`WTb>m%uIo>Og*w{nGs-y-h~;Jp?lZ2kgK=_7|r)k_IZQS36?lonrC1_!)mPW%Ej2tUUG1>CAKwp zfo~8|#I4KO_pz59Tb9*{?zJGyR%LmXP0nmp7LZ)%t;*i;s=~M}!fA-i?^>SmKHC;1 zupk-Unf1Lxbf_vrfHE9)BixY4sX0idRe{<;jCofVsLL);;0x|AxKNFq`;uQS|d-8F+!T);MGQ6U}7`sC~!qphZiHomKKy4k6i<|GGgbpZ+o52<6@c*dOV4WeyG2z@iaMU(9 z2dsD*&}w8oZVx{lym&Vb57*C;{c*Ketp4-I2?wMnA*@FQJ25x(;S~!`gv^scTus!O zal85>!sD-S!7&>Z(yil_k3AxY=h*Kj{PH;{Gf(NS~5L75{8~N;MMu@90x<_UbGpkW;7{>{%L7 z#O8G&3HC7UB&3Ha{lw~FYC%X3(}H{HVLEaD-_*loKmC8Ehsjl0+{JvwaRB?7YVg>+ zK{ERB{-%*Jq`zqcVfvdc5dVIE<8iE{t_uA1YxpJl@}W5YBaR_Hbm%11Z`TYQpV zx8qdwd*IrsEb^26*9yGN@oSzQ`U%D{8yYg`Lj0O}f6RC{FYMNIw z0X>6q(O1|!9V=lgzYir&Wi{3-fW zMD8|4C)jO@PO#e)ouEBM??fK|+7z9o{Fx@LA*bkasfy!NJ-s7(&eEsB^ABaw7Pzm) zy?Wd8tMl+_O%mp9PZ099r=&v#k~5=hOy2f%uspX5c@wt_Ce%~U%oUFVie?Xbd9YPu z^fwSxUptqCsq@VVth8{6q4JqTe3~(r7HT!2mJ}p9`8G=m0&+ZVmK1DIFDaxqfaIEx zT=VyvM{QUmZO8qnIf?j7#9flB9?SHRF*Fh3zj0**IzT( z#(0phDGQ+a60sd~UF%E4jmSd2MBFBM7p;jybcFa0r7C?cE|vNcu_VQUs1+N2iC8Ym z$9##{2FgBO1~wNV9n~*3f@BOIpV)#FDm< z5KG!YLM&-1UK2N#v>L=OYDt@r0kejr!egy=sVphv5z&-(Fwz=+Y)ea5g7}4PX%+JL zFR`W3{x`x^O`g~E2SO4?Q?ZP81l(xf6@gz|N$`sEA%@ofD z$EhhE^lN9UGhhi>^6+F!=~QO`FlgLe67W2lwC1s}4?MtLE@S7|L&#+e5_<}{1pMbc z2F-N09)qBmu4oDblYK$8g}BeC24VV)Mi3N0#6F`<2=*DBn)n6#jM5i#eMS}TRYBNi z)Cs{pqeT<{PxKkoiL-m?34))c&)_cf@=t!HSLxH1yC8NjPdXVBjIXf#(+DR>a|Uz5 z@pLqTD7y+y*5W*;+1MX?2g~!FX8**&+=;}-e)Au702bY3HAi*|$RB@cFw_-0m^W(# z@8@6&T>24s?*rbagZC;BWlQlL&0kr(vmY7T3vUQ_Sm%7 z{s-Ob;a~H)M*&dQ^6^Io-c#_3H221YEwSE2K->IUtH$O~jau!x`VAucHPsXk^&`6) z;@JY?p`KKe5It!GVf3Up)w79tjCkRmn{4*^-X zT=WgN5OKMV=`2JzV7ywU^kk`yoYNDpuw7%ZC+XVLAPH(qCz;<0l2BUnnXNS-jMhA8 z71U^r4H{86prtiP&1lVQIyFZYpIKQLSqSLJ;u{^)k%a@svQS!65XN1Ol0~dFUO`ra z?CkuSHrq7F0SRuK}H~Db}&3CClGCB8*jSOR5^T2$>%4J`Cyononfpx}6_A z%E1|Idh;}Nn%zdO=lrM-fZKlLVrSmWsP;A>1#%luz->BmnW*-*9R+gRPQa}{a+#?1 zRv-m(E0FRmcrT&g$XIz6DoMzAxR!*Bhg(3H@o*=IUvxa2eL2n=d_?n+SuJTuw>bM6 zj_3t3ZggS4h%LN>#2STtRZI6?K{RRUl_aF4*MeY6S4)OXAkb0+dv%Z+V-!)uM=;)r z;q)XFpjZfrO3XA12UN|1h_n5MNsk*}I6OT6Z@Ezt?+8ZU{v9)6lycm-!cpnRu@cq= zg70>{XswE|nW%TC{$#C+DUizxud==AOMzy2p|(YEJ?-267wy7J&|WGeM^%!VAz1w3 z%XH1C+Qj}?tSf&NtKlzjMZCi5;yL{EYX+SK>$MxYxfXVFBVfJWK*!Xh_iCMenb>HyOypD+lKtjE`QgI@Dx5=-W4(^uV z*Zg`y&D*NpLb+EZN|g_+j)ctHvIX&T++;nQT+pSLZ?N zr)0woV@oyY$VNaT8*WqiqmF50!)+=Ks5fpXAJ`E(HmgK!SBd_DSx^Ugek0K@VpV!? zL#^wBNL6Vi2veoCAWW5>t5Y()2CKALgEVlavD#qVSP>f5PRGmDIyz?$&2J}4qBAga zXkwPD5)-0#uv*p*!pt1HK$w|B_8mzy^bXq{8(?3Uh_Y%**W|;xOKFGwcIR&h!)r38g!5MWqqoStRHOXE;n#c) ziK->#J(I!Qe2MM_i4N~cqIdKxQLdnNQHXm%qFh1EegQ&OP^&@wY%8dZNbJ941=Z;2 zc}k+QZpy^VU;8B0LTVdjurCC{g;eiL5VDY34Z>{IX#pV%shzl&h1Bd<|6L2IwJ6X3 zBU^QH*5y!DbDyB*)E>KolED@EZQ)?Fg>`yr3lH|(7PuhW1X(p7{8J0E?TjG{vRxp| zf^6m2|Dy$2ql{w|OUK@YL z8wjxu5~W9?nuPeV8bKJ3gh+u58;^tyb`vRM#v)aItTv=(JQDKYFD%m^^J76-U+A04 zi8gl9d<4;|8PG||;HiAko($2}_9WV`dloGR+MSf<$q+5aQl;O5kg-%12s6;`CXD~= z+{sIviPv(2K${XkVCPuW3fnYc~#>?M>ElxR#cVf&OIf1Xjd@6|1BsK?852B6<><8i>`$Td3eTFaFEgqG~8NQXM6~E>O zNLe|94k-wipwx1)%9;-=7!gpz<)Y3vA6_ur(Rc;sYrF#UHJ)HMjb{TFjSr~faL}sq1r6Eri|n?iOK;%iSG9P~2WBX89KscO|kAao6hXB8t072#UL16aSZry9>oP;?5S>+AW0A zZcY4x;%-A0BJNJfTWNQpt=*dVzfas47_X?Y77O~p=J_?d-kO2W7`@5t0xxmaGU)XQ z$KiyX=h0*1G||N0L715(Urg|8UcnRUB!Dvt!mY2!*>mLwJ`;w|#2=;N_qr|PRj~6q zuOM8-K3HF>v;LhOf3%9f72+Sw_;U-wE-Sw31ujB-FL5?{n!M4(iFhiy9m@g>!N)0h z+?0aP;ao(74f-uoeWD;t_R1?ohg}M8yYXvwK>U7;-={Dvwc=9-&3y}5im5x`&%{Tu zyZM>=Kphy;d{H3|c|{C$&BR~7=1e5SNX>H#qlfV-P8}2o@dgGbH0NZ;JbAoF_<%K< zA&8hGnOI_Sbhi}u=wQwfkLpnAhD1ABUGXWONWLZ|2_v2OBAV->Ed|hXPp>$2je45&3{6>OT4*CX~nO(D~evgF;z{J%g0f1bi-E#UONaL6cz0Y``ZO# zbQeC$(eY)0m+b}O*rIH4@S5jUli0-X75?h09Mil5NWTD|mWy5hq%sUsMOH&29&P?C zDpA$Y3BpuERdM%fpxNO|J^ykwq*)CuOlj>t>STcq-2ZE0=M35`y-VpiP*S@o{;h*8 z@KB^qq)CI>FQOsQH<-0lg6PwfEK9$6A2xi0sCuSP_%ZI~Vn0`v@TqapbC_MU@#(K4 zyuk~i6NGAv9FdpeT`dyMh@3CA$f~_0$!ajG_BLo%?H$lswXZ@JG9s_j*{KOoix8Xu zb!fsFkqPY}iAooO z#>?nRz?60+2qj=jyH*HFyGav{w3%GKv{eP>zmY?*o3s^ZNxL0ch_t&TZ_aKjg#c%#5!m9%L=HbP#ETEB* zi&me;=11&HGz+ixw;{FBFNc}%ZR^2uJjf&4VT1O|e;MH0Xi%U!0-ej%K03fuQAxlK zK`w%{NEvnvauLk$ApUL3Ot^OY3$8|gY`85YD&UkzL zHu73GN)N)R$+e3UUhBpM=>so^HNbtv!oJb&xNpb3dhPKry!O~dLSD|vUX^<}=K!5_ z7Rk$K-Nt0J?qGVfE*MvE%xK+9KQ$2609jNlTCXGtRcyrly6gAxie7u(_ioks(a2O> zKBVXvl=NPWQK>7g=%1bgtc?jY_l_D-_)gpp?VB199S@>(2?~D*-c>8SHQ_z4pG1z{ zkbC^z;ca=~MwK`tF1!clo_1LoGpgE3^@kr~!LoZDa=SmE=zi?4vO#4g!o?RQysz~0 zWET0O{ONPBH?9iBsaRZI%%k5Laj*L0ixF^yPMYRIY57O6)()t&JbmAjFc(bZs($Gk z*1?&rxZitKN%606UwU=I3l0vESJAnUNu^Fw$!S^d49^Rhq%jt&;`(&RV?%6=y9d0? zRd{-u{q&+W!%HDd8yh;4F)u;Pt#wTHfEAYw3C~AN8ym`x7-l%|o}**Z&Q~n=1CGCK zOxa_O!}CEk9v6`Om{(X&)k)HhnDMv`8p~~({#ZoyYc4>uxEa6Jv&~!Mb1-Sg*G2$# zGT^H8M6{PG2(@)d|7aBM>u_H&F)<)|>G%S#g~Zy4O#0C`F%1W?^Hb@}{3~J&K^AJQ zr+TMs&u7>dJ@h{16<-j8S6!XXTxmT`MX27jPk0M0w!VnP2mEIG;mlyU=$YF2>2xso z*gUKd2M%ZQz^TJ}XWqUtmnI*cI-!5Kj+GCw$=~6yF?EG)sARd=bSl)HVur^2xFWCh|B?uLA7ZR>z$VQ3&;VVp9Ut|=YXI(2CjfD%j zMi9hzMuQbrdC0N)kn7dZI=K``t@FYUVMOFA#7)J9iOOgy>avCTZkQMwJoKknfZ(b)$GcA#h z_CV3H@LSP~7p+9mYC%-&kXR>u_>1t^gFsP=SFV7=p7$$gS)wIy$#li>CPoYBpSd;> z`)3;IpCMuVGbF@6!+Y`1;NDpL((7^-U)cLUk< zWN$!PRVaDIj*!+LP+5&2SaD0OileHk?f92j6{kQ}+!GS~HOSj34~;F_!ZIS9&`nuEQ5&_wmNX=LI+D%ILb7s=!AKoYvM1nURZLmDXiZhP=t8 zu)CvxJjzAvU*eS-9P^sqjWz~#)4FU(H1#%|RC0Z6V$zvq1zt6X)@5s_mv4=Y2)G~i zX_VdtZ*q6wzI=HUZUxgK7YE#9)=v!c(vM@5RQks_#!xtm<)U19qA5lpFCvOu^wA<= zujCzoRd}v-*;?tr$h}eBZ>@4~$2}sIFn14CiriH`Rq=iJ@8(lS6^fgF;k~T*NAp ziIJHXcgsnT;FN79W^9EdwqyM;M;}$ZSRbL0{N|Y%`s{}2eobbHF38`!ye&zx7AZKZ@SFBPS!)Z|l3g(rcjZN|!^v?+s9OSB-nAyC&RA-F3wG zKT>xkN=Mq%qh85p(2YtEt?%{ohL?J=K*r#oUvm~pa|3>@z5FN(@zpX~G0r{N1GC#E z5EZ*8(nSwn=zAOJ=fv;%CG6N%8e`$<_uLUC!N!!|Gd&UMb|NV{+&JDVg&J1up~rhw zBxJl-2SUbsbF8#wyk}!-#HPl3r|FpXcyEcuC}0`y*_bunyGcj2$9oPY<2@Uc@t%X} z@t%$4#(T=dw~*W4XcON7!kBpPCdS4zY3%&E~_FxE(4pCaS+;|aalQ_<+7?q7UHsM z)Y&NqVVe+iS#@ecxvYljOdSWIfGmk|S=pd*S*@iX=YZ2VoNQ1}Tht*k6Ln;EG-`@O z2cZp`6l~B;eDGBG4Tiz^QWkDKkL{vj-^93RCB`wOx1dJ$P3#yw0-_p(TGm^LK}{10 z8Ps%;(1V&%&ObaB1cm>gcFkW3C zDh^B(6g>yyC6^d4`v2sjve0-PYK>=z#l~wFq+11l294LzNVXC86$fFgvdT(UTz!44 zWI2>(vd3G=5>v_IzZaFD>9!*|6geAB`YVPHx1s4?Trkj)Vilsc?!yTQ#&hU5l8@q# zlE_)MM9P&!7DFP8)OrTKQrL`=BgNJ;A(7cEI*5wtkVuzRbdkvL9*W-BbJ3%rEI3m> z%P$JHZO?ULXQPna7??l?&hqJabw8}Q7>Hl<1d6PNZGZBEl9pTtehMGE)sHe4@0+VX zf)!6i=_T*r=61BE!=m8Kw{WkoHSvGVhjC!(<8NX@j0nAV_D7fO2_|bvtkcg6&gG-} zD#ZWZyZD2`$L8nqAc!>J&j?fhkeC?F6JCK2)^uS)Bo}LC&By$T%stj*h#)6Ox8!4- z*Yc);`G{6uPs;bj@LT)`891wUk$_l zik8b$PmPg4<3)I|REG~p1h-t7%`$WoE1NgzDzNikvz6FBi;fA!R37qiqQ_)w(guLP#^kH`QQ&{ zXcea>ild_;{Vv1+v1ZhX=-E3kz<;-(fAlnnY7hvS9K8Y0Nh67?5(A^ZgJ=VxyuNpx zhe;F(dVOyMQTpecF_-LYV{T(&%pL5f_Goy)qt^NVYFfV}F(!DqG$&btTk=bT>salb zpn9?TJIgQ-lyB#qZy5r%_KK?$gTsM1u}&_61^jki7+Sk^SXmXz6Xnq-=mo35IfzZ8 zH$l{aP+j5@bcrn_OqWPPcZnWiN|#uPd($P>f{-pzitw{Z@!#9&68yoEjdDKSk|+oU z)k(2DkDwY~Oqv^y6c{96c>nP^kaxxf%UHa6<7Zs33ejM0BvRZ!D*>568>d+l92juA|ZYr-ix0H z_on`{(3<@E=f)ISI}rwm<+mb*{ZuP*>Ytr~42dLFV%Cr-+~{rg>+waAfqiN|DxxY8 zSMF&1^J|7)i|w6WaigS!u^ky^zJ zoFm8G2TdT%?t@Mcvio4GWXuJ*)VmMRuE`)T_6vT^H1M|n@mLP~JYg(uk>dJjgj|AO zYgsZ{1q)Hx4z33$`=_@AQ43;u--7fc+&A(5v;mp#7w0sPm9_lB^6(zZjZSRxIBYb_ zbXq98=jBbChL7iA>Kj|>?=Od=k?GGJ8hwoWF5D{v{VZ&97R)QvdKg4C2&&eT*X2q< zkI#_h*>I+Hq9w7-Zp5c~Gp}KwDc5MmynUSWxfo*kN=Re1(N8I%m+o~1Iu#UV`BlBc zZ7gHWu2VVjZ?OyyRX{oM2jMBXbj+dQYv4;R1u7?gdJVMBc9p}HQ5o*LaIYHWozS@K zy;h^FCZQW;Bky&iY{R{2l${{*8|D8YqntU_a&NOKEWc_<(K5@sO^n{{qW*c^)$+wd zGfy9ot9mx%g(=5{8puTl8Fe66VH1p)Bi_R{h#NfRv8hpl{|dXTl9=6S zF*>l)`yjG4@lB|Ak!v*wwHP!J{~#8q2(ogSdCl?+%Pa;d5q3%UGn>&Hv1I|}SnZV;$f{#y5fstw*S z@aEyyy04{boTHrquj}dwF?vsJJt3yO`RqQ`#kPXu z#F@{hR+7B{x9*qhS7c{Sb>8t}wnq2;;kc~FLw0%ms_j6=eH&BP8^f^Shhm1z8} zhrkk4!qZ(#OE4)49>})@>-l5D+w;K0XIM@MAGZty&Ek|vKCQNwIN@ddVeZL-$+|gD zwwv=QsyXk|nu&|JNitxWXy&zuVw!mq&GY0W+pd=wv57TY ziq{HOLTYNZyk*i${CP+!H=K&Y*IK5-rz6~XpJpmj#PKjk#G9a6`(n1e!NwTHF(+PA z@WcBtN9u5F-^D&C{<&>3JpUh`TI?n6`m8V)KQ=y}Um54O>;i-zzD`jtd@YsUxjMgP zJ5krY#8WMim-yiK_^QB!^FwdisfFH(zW6}a10X)fZ^dj7`(F@xE%>e29>i_9xt0Vz z+G`9zkxKj7r|>DBxp;+GF2XDN`Mq;%i5shk-y&l05&p=uCkmA?2-D zh%+6RK`GivoDSmj1il*sVnDq=JhSGEoC;8%2mE$aFgOo;eKkHMnzlgJ@#{Mmj>Y(H zOADrP8_-Y|uAhg!{s3H0>Q(dX9AtYE$6nz!BXb$k$fBGTUil@9BJTsregVbZKEfIr z9EV7L%|Es%@q%ICq@!Lp3_-!L0{B|@!s=r+f3D-}cQ>+%}f7 z{z_2AW@vY`;%!D%iT5#nD{kzuFqHAg)U+rPUN zo$!h-zh5pQ&xgcP4Hh;i!EaD|)W>QPqK}Or^7ZkT?<3ln zYurc7$gjQMu=YMc?Wyro4QtOiLNo3o(p%|1V!uR0Hap4G{-{00?&%i0wIqby77+RD z{_&x zD(BaHh^Kh)!U}AiOYDkCnF(J@g*Tn3Q%(A0wzedfEqeyPW|#d-yz}r|y_p~Mx(bo> zMW$A7?iYpAu5rQ1I~0H+Q+PT|{F-K@u#%~4>j#7KQ`ye%AMTN#%5=Vg-K%gpV-q8=ggkO8Q4&}UH^&b9qYQMo*8k`)1k$V5F<1Z=3h}7GL-kqu3W}-?V zxS6O{6KXTjBRU~YT4XcPs~V$l&1NDSG@FSW(ArGYge+t;QM=^L_usmN;AW!iU2zfB zW};7Zrp{&}0jYjwGm#CN%|zagu?(S?xy?j2Xm2KpbYymOW;2lun$1Kum|McbUIV;f zKSrmbDrPr-3%meTT;z>y(eSoN+^?C!nw;eauM8^iuF@e;dvEm|Kb;v;R^Z*P!O;NU z7?95Fa1ZuMXpGAF#(qP>k$1V6TD;A?@HjSh=$PD_{Kf(J_UaQZwzvMI?$|CJF>WwB zu~et};pZro9kTiiyze{K`&BHm}3cU3+NN30! z6Vn;8Di}IGZ`JyJ6{mth4GgD(*__%~j?>9H7n@TX)0}3;K8;WG>bPvat2XEtybVd& zm^p*d0oAdVMW@g8y`%K=9HFk-Fe-W%95rZ+-P5X#sAgkZG*k})hpAIe3;ZAhIW5&8 zhazP4BFKp{`I`ngMt&nZP{~9vOjM0b1hZvgV>y{Tp;NSFVq;n+MNfjKZ*^P_Yu^~b zziRS23^(fPkH6R*c4KTQSD)ssojoO1gRBbabyJDA0e-9Z^MgHM+$wY^WxRTS7`F|V zxS(3~^AdgL_wvS9>Bz8l$YhH+8I<74!+Lv(HBQE#TM&|0mTR`OLNFLC1g_``Fn z6Q}U*n9ob%r&4Et{0zToeb8B7Ta)rqZTRyEe$$2mq5B~*tWRGr)wyTNo3Iz);mVjN zj#&+V-5mT$or6D}_|4qUPmRGLlqcdhb8|nn&&Db5Px#H;8VPY8ob2_Pj+yoSc-|Q_xob^@GdjP-L%^;HBB)x6$o4pJ~+xPeu7=G%R zoxsw$_|4u4A!mZOcKl{P2cnOU!5e^2am;pQ$9zXP#kXv%vXzuA8P@l93A+j2_~ zw}Y5dm-7CC-|UA#?0sCyyA;3KuY&jhH)|XZVmlD$V!ZP(ek?(ucVOIczXCb=HND@) zkTiuqU61(Q?6=TWt_`9J?;*^79^3kcfv6*K6n2gcd@J+{^waFOU#w}*YlC}oW10@(+KrKi4aV~D z!lNOOn|0)VnlG=o^l0Df(5#0^5R2?6&-;~_*>q}%+upDW2KfZ{K|j9Ma0L@v;r9t{ z%?G#Al5=8;jHV>kcNY zJD{*$r&H`++YLIzX(u))th1ebsw3yx$sJIECe6CCo9!eXgFeu1@_TK@Zno%$9lI%@ zV<-NoW7_=NnDFml!oLFw|2OIsyYqji4so>I24nt}-5hps+zMU0xuHfmA|bP3`w70c zy#_h7R>m}Z5R!UHXGT{v+lkk!PRDx?DdQ^~voqd(_|1ObSEl4V9a_QoA8J$LfMQA< zP?SqR$CUg*r)irK8x!F=mpD*9OIuM4gaM_Hk&-YQHFYe<73# z#HcX^14^F$1fR(QG3jeKjFpus#e8P=N7~BVqO)+Uj01`^1k6I1#;`u1AGcM_#zYzp zCem;~k;cP6Dvf7)l7lE^bpajLBb|fIx{V3z z4koNSps=3SDRx(cK{~{-GBzlz)5=_CvyM@QS4=BYr&(84riH}E+RAj0kkQ$%^uvyo z5zw(Rd+C@q|28K4JDBkAfWrTNI>qk%AE85>hG2u1m3dOfb*;?18kNzRvNAttkZn0< zWzN+oCsu4HA^YjVLoM3{Q-T=+*C|tvV~oB|5(DF_{nQ5KDQ_Nrv*-G$mMJOkxoM@| z>=r+@`1O=pO`d%R(nw5Az@gTHxk0bmPUL{=Zm@-IVZY6I&zzs~>Mt);#_QNl73ht@ zzxpc*hpKUq4bB$h<$$8I0@C)G=6Z%s(>7ikBwGo7P5~Z7v)fy$hlPgxZ|?z}a|VU>y*Ad*BWbRUo*<&I+)&^Di}RdxzlB$4vf(1P?-9~h1uxD4z=MQ&qsY*yr~eb&Is zcW(miK!Wwx7M4aYBP(w_i0cc-MrR_V8pQ1D@sbNm*Qg)HW8SPI`zgh;F{4-xD2io+ zMzPMgi{9-P90DRLiLR6U{Usqxe7+wvSt3eK4%zHdG zs22gkaVW|v&C5s@1-%}YaPl_+M2L!CKi-a<#^ z(`L@>fTHmNW)ah9e6@bu9@5yDXuN}o#yg;B{BAnM6tZz0PW$VSBnu!KZ-ZLnLyl%& zeiyNDnbB-83fvy3li*0FJ_^c|C(Q zB^nK=U;$@pcj!!t@i1p>MVztO zU_5i9GqH}(t<=uM8CoZt>5Bu390klG2P4Om_2af2ZA|3oU?N8c6gi%zQ%oTnSB~fF z5NG;ggQDx4zAV=w%Q;EtOl;At!>V%V)d8}8hoDRiy>MnhZs=7BLWW+A43ME$2MLHo z4ZX7KSwpXXST$gpq76#tqlRALo8S+Z8G0!{Z!Hq6Ps0q+f3<~C{?qYPO*E{?5{)8EPydX7HC&Z>3fKU%dMIwVVy3_GxVdA z5UqYlFi4qY0UfjKfFch8vv}Od<6@nrEe{(Lc{rHJ!vRGem+BO|%VUWSahkjhiY};H zZzt>c9FeN^JM^PYgLFXQQb32x6+LiiW5T6_36~BiT=ED2UfsETUWYgh(gy8XKTy{? z#ZPVaiXX*tN0(+@`4h71Lk=T@LCR}c4Z;}qzHg}_c#dHgFpDr#%cFEmyOwQC_;)bj z-vNdHF*?QW{I91&oLaWQn15y17ijif!``M*4w;neAld~Dzmam791IR7peY=pGa11s z^ZdSXtG6N9F!M2Fh(G6`#$sFC#NdiYVgqI`PI*ThF-GJ1C&44fZ5O=uv z?*8nHG1aTY5}JS<8qWNBbmkH)m)RJFdTu^Oq29P6FCvBdQ6dk_b^J8SrIWyYpJ1Re z%GDsue7FgO809Voh*7TIz%t5hAgB&%MzC13Nw=^uOg1PDQ5ofjbnHUJR`cO_DM_Q8 z*3>6qoYhj21)4$q*ET54R6xi7Tl6*(!$tEiLn#{*HFYpiQwJ0^P3si9tLY#e;;5+& ziVVs)92}x!(>m9CYA|R+W-vI)%1=13G2y_$gaZc@4jjacg73t%C`-4k+ASqEmDf4yi}`!-RPoq7knPQ$81-hDs2# zZ}g+0$3b*h1)25xHI&=o6OC~`I_vD%?O4p4^2HBw2 zAhmbl+>cbb^2W67nsq(h=mJ^4HW~#zz1fW+7V-2}gOHxBg#psDb&-Hb)O4e26RT&N zrE9=3DK;nyu6nkGIyRfX>e;gFY8#PYy{C%PhFepdP7qR@(#ckFsz^w2>OfG#73ZoE zwE(H#P&cA3#+61?wJ8W`M0F&j5xuNS<}@M!vq;-Cq7QYX^2w+nBK8V8V(63Ms_uZI>H<1)e5?nRurZONgNYm+P~`YzPb#70 z_>vBB`U@MhRef3)1cA%-fplrsF)!c(#gSTQ)R+35;F;y9*9OhF$N@zn0`dg{qggX` zn(PR~h}xJ)#KA-&4k!{iQK#5lv(C^V5%UtSkPT{y#2ZSo*fCqbE4ZW!evy7uH5J*m z=77SbfLWW%KkCQr_G4qhrGp8V4k%pSs8j6D<()djX+Jh7^-dT34_Zl7y>r`Ia1=(% zf7eN@10L#YAObG(+TiT-^$u479d6(0fm<6BZXHaxbwJ_v{U7D_3msBSaZ8=rpypON zwyIgBdxIakGy7`yt<#hpP^wfwhsja;al1-wOqg^qVbTGG$uT;`?p3;;4sn{Y4N8^L z)4X+$p5{i)dRPv(^T#?pj@7uz6dpiTu(DTR1Hg&zAqp;*iH_j#9Dq|a$gL#whK3gd zJi!LxJPhB0JMAG2vdPnv7A{B3*ELuoAdA#jm%5Z7T3vW2Vvf`x$1K#t@KdDuf(FwB zu^>=2BrAU_Wi?6o|25I2hn>H5l=6^rGQ&Nb?m9 z(lpTlq*kZ)`xq219#B)?7plZ=-v&+hf0&L*=Z#o48xsX_Fi{W(6a{fWl3DyPlDQs#Dpmj)hw#MpkEF28@g$$3^s>+{zvkZa@x@|B z2vgxZ??>KT9ZLDtXHo^>*8mr2P}NBZz^N;J?`j(ym@0@`|A-apkI~k%AYQ}ClN}(2 zPA!U}b#Mfl_lX~$OZW}W9;_sRBhcny9lMtII0CKg9IOW8-t5n52O;}&Ue}q?yvqI@ z8_Vs_`BcZGs>uEv8~rCQ?33_zxpC&xmg!Q%;r`(A*9!Y$04 zU>My7DRiOa^C%)ai@?h(;2SLJOqO#(PL%0;JH%C%8*#G>FpG zu@tt#E~Nu?jl|SoD`@FRVaD= zIIRnHAdD`wfKXDPE_9I4y5M~lOM$vjiF>09wID(e2q}C6U1%pyY!OpY{aqlG6#9b5ejZEVkI;o`-a{9r zK?;qyS5nvvL>mZ7VJGOq?z$9glhPt=EGLB{bWC;!(jsh3q%d8_vvol*R|=Jo!aNyv`ap8TtRIAnqjVO z!b^<)vcOA?$Dc<0>L2z~3$g9_BmC;oJ`+3Qtk&d#_;Wjc^|urNDn?kcAO395NEavl zWcxSxLi=Q=7kGQ&SN{x%TXFLli6=np@I!$&AHVuPf%x&% zoM)DxCs}#~o@qlqFM$|TfUe~}5F>HJU842Rg0Q1`iPb1vvfx{k1Hbyi6X4)x+$HbB zAJz4=_<(p|QR=#6p|>M@t4pBziS7HOyu{AYP^)aux~v<~)tOl1B_lc}ww|^M&sxP92T@^+NpNyMc55 z>ZdNohE{HBor8D768$G5`w{qaD1LK#A*mO)Kv!1|eDfBkO4GM-w@2cP67S~^)wth_|UP(9^&(4{Y=0aUdyYJ1}BwnAJsUxbfv0k6E zF%EsWKIdQ@`fz>D0Xg*H`kVvG(5I;NMBm#-=fxQe@=t$K4xc{DGC4{Q8-|kJgZsxv zsQneSykF1nr#y^JAdH8x9fWuoy?YTL4$mqQm)3 z&7Nx3?7nJ?=utKn?>n_2BXS26k=r0ej&xO`>vT`lhD@RkD2dvjP88`z8==KiL85au z_J>AvNY#-Tf)+zZR0{}G3mqh+7Q6?nT6j(uOs!MsTCg#x1qTzwcR*46=XHvld%DZ4 zf3bvMoD()Eb%VDB!CNKDIcF2>slNj@tdYc8em3B)_cwGxXCaF@uloH0ng|;-rb0k2 zK8mTZF(Y^fgrw9&)&`BK_&{fFdpc}PB<5fuF$WZheQe3aNDKv5rs6XzP)x;F8dEJ$ zn~I{nVhg4gY4t968#A0bpm1t~hSNbhNt;s}6HXmWICVhbbf`{|?akqowkE3sW4jXX zf*-9h4yI>mThj(r5L?rUd!yy0ctOx;c@+r5$<94+Vq?OIg9#@ND4YoBaH2ZGsaBDV zmfN7waxZugnmtFyUkDcGya#2bh6{KS!DsxwO2ci?Xt;oEz@p(cX6oGmrQU7ONb9s7 zq-A3wEe8{6IiN`EES;hwEfiR3_<2^KX!r#hV}C52;iVc=ZCPu$jTufIP&lq|K>~38xMwoI0RzI#{RZC@~l-Vuv%#3Y?_}w<9!W zH^)jeG--~txHrwQi3B)OgWGnyIac?;iH!*-4kny9pl~9f!--PnEp=W_bF{&nGJD10 z>DbkalB%)P4P$UH&;D_Ba|k_WJiej!EWk<}sLk`eqK81#3i10Uc+G?ugV%!EL8#Y) zt~to}2J3`aK=WGAFbz^k%xgh5XwC);`=ey{XjXp3!eHp8=kph21|QwST>g$U;0ZMCy>AIC|&go%M)b2MJ6GQMk%{h0a_JHYIZ#l+2YA^lcqmNuTfcs{&Oa z!G;5Lf$Bh*0=0mU0(CJ!rUg}7Sp{kWLCLEEjsFz&fQzbZ2D&!r6lhx=J69m?z3xDQ z4ZDWJ)T^G^DacCp($$fWy>u-kWG~%pof6;4r>K-WML_PvG`ewyj%n+LjfrkJnCONB zif){vQ|zuA^K=M@wniE@7)wL#y&n8MBH?nkjjpFrciU)3EQfe6-6c8`I>OCfIvdRG zrSqmjWGms+;s%^0->Lk(QTS)}UOS-3Q9wtIH|WQ0Iog=W(ZNKH4k&WGNvGIdj(6!0 zy7-J7ZBT2K+IzjGANShsUb;%nI+R}R?+4kit=6$NhKY`OTU$C-NkVjNnHIF8V*)y| z`IC-m%f`k;HV!7TaX^vH9XiGCvbkS}I67v7mX5ueh(+V-*q0i0b*wg)L#$(e)0sFr zW`j8$YvOaFW4mefb#%-DMaKkmcYNar6=RXU-mQKoOvTjsQpM$87=Hm&=9e0gej*JLY+hJ`_aa;VrKcXxSe4_&iPpf}|RX@#qhYMTbxpAhtd z!y(<7I@N86J{yz=eCu7ni3Arx+BAs*I_m0xB5eU3X*cSOY-!t=NZY|g+72kvK0~M2 zUD_Aw5Jz2YP)pkj`J(%^IyT1%id$}-zsUwK*V48@C2cR@8`yX1xZ{|>Yr#;ZoB}F? zD7$hUP{bvmBd!N^nzp!XOvL42A}$9MajnoPb{E&PI>fP(HfY2(AKTpip<~nBHM|}4 z3)e?;9{w39T;#Ul-C#u6f|%QDP{mvw^i!QnHCyl(0nYw~PBnrsol6^u=l%Eq+fEYF zxg4z%;#|`VURie+%JDgw#Xt2@bLqB_(GKA-^-}X9oy|IoBri4FpuE)VVEU!zDx_pyYOW(8FEzL6 zWNB;dmztY(hv&T1ETA%9deelBQLNlF;b0UiH%&Mo#mY?+4ro^7qk5R67IObQ48A&c zg2a_UiJB33+d(PhJ+Mj;G5~L6fDFJpNT6}W$4*SM2H-DQJe#4C4T_?x8Nq5D+YG>! z89t{lu1T7~hQ&dF8cf?D4TD-!pQ~f4;l5tYwK35}2NPX%K+#19G(z*D(;&54Fxv1K z3^*5`2Y-&z;mYFIa1jhR7olyC!csfu9Z)QifYbrgv_|SQDGu=k*qE^6V8V_A3Oj4) z6uURA2|C2-E^SaMN>#}wR_um(+E&|O+%pb50TR;MJwOX4etBdkod9NiUc<{U;1rh) z8gV(Gh)Y06T))w2+TyY?5toCBxExT#wYN^OySNV3AsjFmy|zIkE-FX8j?LmWl!U_- zw>D_FbwJ_P290u@+yl2ZCfquhaO;4=?WsL+ixR6>rkkkjK{!;sGTjcstXZ{L1(8># zpVHU>JT9+H+nC|k0l}{tVhPB>6!}$C`BgeeT2CW!8x)D_DODE>ypx_%Rc(&~%ap2# zg!FptB&631zd+)+oGF!n&S0UBj%oLLHYU<{Fp<6kiu4EQ6uawMg${8B3pN;Yu6n(- z^-O?;rA3a9ZJ(;q{zTd9sS}#IVmZW9s!=)zD}{b9KX;Z&KT7OwFaqa`^E)5O{uCi>(DXvhBC;8 zBpL-@nQmj4bd{YTq^qpl5dqRwHj;oyR9D#n!YKH!ECnzMZiAxWs;fL$$If+?G&FzI zs4}ZV!wO|+Y|u132b3xja3Ctv7@AwHoTL}BF{vU4lPYpRsiHe{iruT|ejVbNRT~r; zs9C_%I<^`DXTdGs&9gx>MRh>oRzOD~U)E{b3Tb1)t%C`-4k+Bd_M_asuS1-MZG(ne zP7(btQ7gD6;MXt;+;WO2pws*uP`DM);kK7f)8^L3gj)v_ZXHm#Ezv1o#A$vu zDBP+k;zTPQa;uJDD*YAO+ZYf$IKB#mvE0=OFN{NXkjv#c!l$v?1i^Bt}WG&%?&vE`=SsiPd$fgIGKyp)63oemIU zce1~>>`omCu{-S`jNQ4wD!#EhHYoL??9SCXwy`^Eis|iy0u9ogZ8Zqf*|v~)-jAo4 z9VDc)U8z%YI$HsqDtleWw5!a}hU%HFbgcB|}T9pbb}8?>tIkRChRlY8uJ z@d+HtA?|Ef>r9-^)&_H(Z6%*useR-tv^F@c-2tVw3+Tx48U45|M;jA4I+)1O0Y#20 zb&B0v`zjscw00ZRTBSPMOMC2WYc=cWY&l770@=_D3qx!H?IdK9+Qo>{0;WZ_mygS?rA(W=(K=!bZpZC)QqSmh{p@Vk(8OF+Mt=F*6Nt{B-O^G z7931!!2zWf956RY%~ERBV6;JxR(LBiYXf0q)(JwaMk(G)GBT?oAu_82L8}o9OSvtl zYgwp1X$!bd*e40-XsH8=mI~--X}wO<)>0c2`8b%!#{oq?C+ZZtYv~y}#L-e4l$uw4 z(jqIJ25_rR{Ahtx8h(K9gs=W~P(B7w;PI4 zBNiA$&H|HoUMw&PvA{2AejE!dU>T~}i~--!F>O|COjvO+VZ{N3m3MTC4lAnD{8WcH z7T5+Y3*6kJ1-`v!3%t9MLu`RR*O@pL*aj^N%;&@cPt`Tx=(YojZVOmu%kkGesDzD) z934#L=zt=}U3yXpCC7brh@;y!Xj|Z~dbYrtby#42@2m-A!(=`DYG;^eQsV2_C^(uV zpd*1|9n;n%8xsjQm`K0@MFOQd#qOFkM29$N!2p>UW@|tgQwzcj z(CRG)%>c~?#Ym|E+V6F2(>mTh##}N99SfLDO|9 zU9JK{4O3t*)wlaV7+u~{m&}<;2|mnH4k)_3lTNX_F7IXMB~u9- zv~>B|9(DP{d|g(4>jQPV%42XySgr(YgGRs(C{|9ufv85)TTIt!QU%3hU}GW|2NStC zpvdLuAC=3AI>hl9*r4d5@)(?>V=Irr5#W{{0~<6R0|yjt1$4CFBAuqK1vVz!I+$?l zfWqx1Kg#WuI>fPPHfXrz!9BO?*rVCTW`J8B++&00;2r@T#@c&e%*KQ<2NT8|P#C-a zM;UuUhp<03HqHh$V`|j-sgA5hoyUSNjyeT&dS(ZdS`^S>_PZXKwJ~AV!Gu`{6lVQz z!3(bLZMj&7I6bosN-e5U=O`tMpI0}8jt|0uU7>ky~e+MsY-#?1{6>e&6rt*5??VMA(vN%NF->f}2plE=Ajs~o+)3lkjF=5uhgjoj^W;fC)c4u~q4sn{i z4T=V+Ccn3pP6N0tqyP6r4QjRE;a)aG0eJnmyXJfyF;0x{MPzr*8?YLJV=9OH%?;_*U1p5Ahtgpt&`;of+B7Y(Ys zv1v9e!V>T$8l++28e(`jV$Rj;!d%beDti1SVUEf^2;v=~Wyv^$H4(#9uLDZ;3OE!o zO#@#;KW~HVB_}cq_nBdgqARkp?$PI03cLp*?l9P<#<2ybm!agt1m~X`8#M z@QFi>{0*w?*DS^BC09lT*w+?DBj3X7W308sVegWqNTvyd+7EO+rjc#>IVw%VRbhGY zGXUEe{pv6qzKSp8c>cj10%!Q?v{Y-lJ}gyVOZZ%a z?ByG72z#rqCH$a4)fefFMK(qa;Km{cqXuwekpof#xUt9q#r>#eogQAaY`8ZZq1Gv? zK$ux)BM6ywb}~Sw!Buz#&dfSnK(IY4f5z5PEDYK(GeopOF`;T2e7KHHn-hO5;Y75W zHjQQ}k&du`a5)!lEpYZ_dfq7@dyHAr;(4cynemkaO53wRW03x=^I>gD+p{rgdk!XT z&jF?FIiN@$sl#8x7n!;szJ^=EG3p4J%6%bNd>v7pS5gN8FD%6;Wia6XBket)<0z8< z@t)n4cV@M_mYg$k!q^5Zz<^1%OgJ!6m|(J(BOSpYf=mzy*?fd#9pcDYqyr8P{+~}z)u>ze{_p$VPw&lY>NC~d)z#Ihx~E6g-$??wu-;5_ zK&<`(KU7~$;-K*bexSaDdq^Ac!}P7Zhm;Y|CFvjm>GJ=AU38Ohr0UDpYpd`^BwjS? z%dZ*M+WT?w2`ap=lM_^MpGee2LM5swITF>75Q*w=uM)NKUM1=zp%R$`dr8C>gQ@}I z_1C`q>R`#<$7i~<@?Oq#>A-y=Q8x*dsOtBQM71PDq9)v{MD4s+iTFwQM52m=9EqaM z-^ROxKxp3i+6(YOTM%m2C{&IP`8Di@W#Je*20o)at`oN5*DbFes1~W9H{3g4g1cR$ zi>XC=m|COxb&cWYJZq_mO zu_Ij%)T}G$W&N(zWZlIy>mH_A_dw11eg8A-kF752E~r`Om~N$;b^9eEj_J(7an|i- z)oKz?VGztO@O&hZPo}DLv#JZ~W>pW9&8qygc(Pfwjf8GiHTj;d$K9;Dk>KN)+@Z?O~eD$MAncPe_J~y$rG=3xS+NI;SSKjaqbWR z{cCs#z-t7wLjYKZeJ|k&0oiG?)d-IRXHbmG)(&CNKiCn(FyZ95pyBl}jJALVJ85Ze zhVeOWH4cZCvWsacdzhB82WlyMU{cD{A>w37%g#6;fJyaT0|)Dk!q0qM4ZGky-v*o% z`!cSEi6Fcu|Ifr8V>0G;Tnz_ggNpXSvAXtzW`a3K%!^EU#gG`<*FulYFPZ@-;;rI= z**qV2%!AejWk=ymTjAT=@*M@94)U#$4auiZx24Lfz;9A7Gna4SXH918ZJeaL&S+#A zSHnsW-jfwThw(k*B3(>#hi_$OPiO2T82`?Rw?SDV<*#5U{9-BvaVg5JaNl-pE zWA?<=@Nu7@yjn~dhbN+Jx-j-WkMD$^l!>-F8n$x?3gXht+WGyV?P?NTeFm7Q7LQ7# zmS!f~0&6AlN}tF?`{Pjusi7gM3|te6=U}>T^tF4(i1p_6K-YZ?FpBjlIBV9e`boY$P;% zHDazfOf(j4ibpl1K0%^O@u)6&v@IUBky?dE58zR!J_>ioqqX}v@{cc@oIMcWP6FCV z^aIH0QwZmQpPcub;Z<->C+);UkSN_Ie$6WVVYC)RG9h|T(y-g4bxFttwa>5?v4QE7yiXWhy<_ib=tWzHw6~5jJ+n`@+4O3jO6h{I( zDV+Mmn%T`UYjCj<$LFHlH81*L&<{mW{A|~hSt`L#WkSzH;nO361f$UDhf`z2uip*K z1H#C;I>2?Z(O*#PHlGOU>IjXg6Y_bX!5z^vBu-W*We9uuc7 zCzW~s7*U*pxx9_zrP90-~n+NP?z&I zn;2F@9vAB~w-48`Ot=zxpCHV(LtYdW^PLL<(;-C@o`=HQQ8=sv0p(@VhxaKnci?I` zI117xixYowH5>)vYTSH5;xrI#(@A_Y;q;ZJ$2oV_XgO|K~6! z^%vBIbO(OMY>4`GA`T9IYoqx5_=d$G9@;cx*5Z@hK&)GnF&E)#2+}yVV{ELcW?O#_ zKdES*z}2vSI=gm#WGVh2CT-O`pxaLueUOh&RYktP)RY7;07wv)i z-$rSIXpO#Q99)5z|7OuduipZ(7TPC+qUS+WgV^$lU`RA*U|>olUciKKyN58_1~K!} zG>1hdUkRcEm(Ab6FK`~do4-=JB76Z>@`al}XaZ*|e}&_TaWxzZwY!8#y@M|Vq(8&Y ztZ8_D0Zt#j9XG)yAnpPYZJsfE;c8e6;<(uv^8&7h>v}&qsD$H}aW!0pCz%5?W;U*d zZ$We&ma*R&Xt)W))b}%{1y{p;z1bcvD>Fsf@o1b5?Ir3FV~@rG(YP8`A_DKp|0`iq z$MPWO2K+3;)j(HT>T_6Uc}XhWwlJb#&KL~+j>gsSSQPbxWp=ZEJ`oKIm!lZZajJX6 zN$K_Mkh=N^aGa7ZSZ7>nP>(_CklMv`NbO-dr1n4^QhT5dscog14qM{i1Y8ZLrAOLI z^E(0kN>ieYjp_cj(p)DjNu{A7zbBxrG%)BK4cY~1*jXC(r^3mZ4NQMfmIm&EH1sSD z-2-9pAr0OI)$mQY1a^I)=+24&l}EE6LOUgYI?DH*1y@QJi22W8z_$iUrs7CEc|PhJ zb)q4tBXL=JQ1k?dHWGKEg58BTXuC*U7)%K7gRAvvDL|XVg*=}<%gjISmg{Bd$u{#Y z$js*%LB&y$4mM^z&~D_@c;TH!{29XhQpW z7t?-TF~6VBNocy*d;0l}1$Fy*7fbs2F7)%;3bU|YqrjNiI=d6>kxXwUyATPnRH&Xw;R61P(~Aw$8Oq3HH)3;a}(_4^fhXqEMJ zKF4bAVyy0k6{n&hrfsk2A1#8bun7*dhMB3+)`?hs464sEoDxkZVu=KtY!R2qTS=f| z#m53B%Qds67-hBC$pmb>2&6nZUD9E1$wf?^jG}L#aFUSs$RlxRxN;2VJ zfbJlAoDS5MKaZKHh3Xo%ObxK5+yo-ouYH+QCR)larrPl^)s6?Mc05o!m)II z;K$af{??tZ;3Q^4-T5A<#jD_Ga3*HDOyYEl*Tpmg9;O-aK+QmhqmpDP#}@CC@`R0Z zQoJsxlh5ci)W&uyeTUT00uMVf$Ab90%pONki~F9P>LgwdRUY_DT@)$2qkk<&o|v!f)2wI zYr3}S=|=L&PV!B~WUI)c>lYrVWvw7v{iLk7mf&t#yO@@>hiO@Rpz32giSf5pc}ID| zwe>_FE+}PfcQ;%qS+`3!$@)dr@p0C}G^+4H!eT2n-ib1%@2-Gr!2`Q6*>_!Np-B%MFQb%V^MK} z(BB$u{U)sc`|)rNbmRh_)oT4m~;TD4G8XW!-5s?+3&mkSrvTtr`@{HqaZ!=9<3 zMYb4YMFFofOP`lzd612ZB`rt^p^_G)m4vn+<0T3@x{?y@00%9>=CzxI!THHV?IvAJE#Je`@;y-XxUaKgXQ<(jhr{cso>(a>7fMg>R{RAVcBXMwQj2&RLk@%*(%nqm^G8xK_7Y%MYVRyW%@PZAq*LC41KUt@K>RHvZYONAX6G<_mq zDFw9Q`%YKJROl8M68&@_X;;gHlC@i9{*et`a1JKI1cwX&Op_UlzAJDM#?9=Me& zsg}Nr3E0Wa8 z8YG|8$_7bljXJasb0g+VC??mHkQ*+vl)qx{1qBas@M4h--BQmEtMpR8gGhYyUr_{a? zMe>AdNsPz^9U~fDwK^l(R8Tv;qY;JQFMu0B&>2(#@)@h31fd#^6&19RP!)87NK~+< z2<553oaU&YnuMsJgnLy%EAO=)b&yaMO#h!M*mQL&a6v}}i&m?GYgVg*TYsa1F|dMe z2-Q$8jdWEb2yLWmK_n`eD?)jVw1QqEeYkMCRmH`$s(6@I6%SNZ&2tpuTg$P|lf+tF z&{5T=t5sD-Dx23xj}p*tq{j-{(@0N&{+g(=`O-*tlF&xF>U8K&PerODp^bDK3GM#Q zkvw>fbSF5H`emAWjH?>=YFs7Wt8ulGP>r=ooWE^cu5_Lx8goHMV_NPD0*(h7Qw^im1#TAquk<$0J|o(HNP?~oXO ztH-8vcU9m^Jqjdb`47;38GHqQFU(O8F>h4==u z3!?clIl3?ZFf3+eZEWZqnEUJHX!(c7n04qqzh;g*oLdB=ni`&m!#Z`%eOP&^LPNm6 z9dQM7wv!J;H{6yE*I$Ki5X(~=(aUMLhfTG=izGPw>Nh=Dq}k8K;(lUbKD|))cT;jX}me8?3xv)zYUzS!JOSr zE}A8{8ow!S_jqIq+s6+#g>a4ko?7JYDaGhvIDMmd6V)K$qnNtl<6<-cZk6*engF-T zc_2-ITje}ZolM2q7=#U#wAN+%8%K7#po=Bj1zk|L3woHIZMoFhE?7rGw+mKFQnW+a zE{HYn7cYv;w(^AT>Bb+%<<=dEzRtyN>1V74=L$HDj6V*v8dS{H;2(s~)u4;120ctQ z=z*$15A-y6q@=}uRW;~hi3VLzHRxfY!8TWeovsF(Bq>jW(LOLOb8BE4O)$!8NL4JWMs>fvOP?RE^~Beg&H^oU~3qV~mxFXXx?I%7o8ASHEV=vksry zxr?bx9;PyRpvvTdDwB06)<8k0pB34OM=S1=KCO#{_GuNjfzUqfB@vI?EjVVh4k86< zs_fgWqw`JS^xPIM==4XI?GP)%?~m>jlq+u(0H1e6<*cDN+OMqdvgqL7164)^JsCHb z;Pi<`H6L>%j&ds?*;p1-T1!yS zt*?g*qg!8HOfA8~)Dk>UEx`lT5^Rfil%z#JvDQ}?OX{l&YJK%Esjr>LaT+`huEt%0%)jm^ zH&yNN{eAfV1MiOsGN1L0M-7el1eq}d^XA0>X*}c)4t%k^B>qS6%!9w?&G)#Fbb49; zg82nkY| z_y*(o^qR4*n88_-hUZ#P4P9)?R4}eY^r0}a(VVsRxZ>u=rF?Ak$n4}Rg9Kw^IQWC? z+TqCSeQ>j{BIZ5!cc}U#iIlU@S=B?WdRvhX+*|c_;yzJt#iAbd*5W=f^?I17SFv8|?K>IGR0k4)SjFJzlsRHTtTbB9to25Q-=gqcZ1CM>{Y~*TDE(;R zv|3w#R5%IBaIwu^VnI;94KC-*(N@16Ci+#3X(#%1LD6qVaKLCkl#kjUU)@M zXq$npqpI+-t9)>?zB!g&td{Ftwakju;$fl|#XPffK~c+4>iXWzobod{nz9Ft9?A5> zQ7HE9#Gd$CFj|d~;T!PI9xNco1Qz@rP04+Zq>TrrhlEdJf7D9?+HSv;UL*WFz@G$U zN7i^~dPJDP&dcmtu}mzg#$(cB@|6I)VRVfR=}FNYaKBeIgE%!^$WMb@B@hk!<|<6M z4X86F#({@0Fj&G5A>|bU+87DW2Ipy$VorL~8c)Ob^SD9u3<1w3*eHA5u5dUTk`1D* z6yo&sIJ?(v-^p=gY&;rtgJ_e0c804PL|u@5GB=2N82e;y5cNRz$=o2SAWcRcMs{o2 zORfOAug(RNeRZ!0Cv~3et8>9*U!4c)zB(7weRcV{&}XOUBm18bf%$fwSRZVd8?R5V z6@K0e%$||zYr=0)IOk4@S*;CFp8-7dKMBY!>MWf6S?F#m&W6VCNl(jQkRI37-~5iJ^o-isU$q{kFErLI0FF!ejdL#1_v+Z|ZCm=2XZOovJys6!@8a979lt^B$;fA{R`2`P)mJ)Vi*) zxfnCXS8qLx8RILs9>|RGRotB=Mm8pDZ@7)O8$Gl^Tyl1_uiK59kjZ4bQ9B8pIz2Kq zX0Jl{#NFNnj>H{U(bD4%tie6xwR-4UW_&pDqp9>NoQ3epPha^Cr>C`GPQ9* zXZrQ~4P(jt=~siGHhY|Y*=BxQNq;~vd|BtlL;$; zE)vOP{Cvlvw%a%^H#YXPD0_T`g6xx-fc?P7&cewaKx>AJY0dC3tr;GumN#2sbX#I$ zEpK0W;#r;xI+nLoczw%zQc&wS@0s{B>pJl-3Cjd#U0VtdRDCGu9p`a`1b6k}VyX`h zQ+;@#>f>mM@wfUoRi3cMBsI|mT_?kTg}IlLL9%Y03~xKK(=m_Mh%NjT0<#X*Pb!OS z9oS)7Y#|(0*RNAH$r`H*CdTT4syhX}WuV<9PUci?$;DK69tPcoY-K$Vx{S0AHi`k&6kI1zC6&)*9#J> zwKUC_3wrtbSh%V1`c2B>51zPSk}nU`e7Rtfudi2=FBj8%d6?R|2db@mpmz6=IJynZ zRU2%ze$%p{c2ig<4R@C86E+usfT(d707Bb89?Vt(UB6k`u=r>VawdDpB$(YxR&`+< z%(iM9ZW3F!Yl$wVIrA{hnFnglJWz9HTeazumK|GYIl7=%j=KxDEyr!khFkk|!K55L z5X!L*RRuXVr;@A$`$(J|C?@TQ3#tV62%Iy8n~vK09Wm(Q9^S-AmxG75ErC8 zFwsz!+xL$W2{>f0-=l1R-M{aG+`pfl3|-a>=XT`WtE@6R4d8hKvNT7mg=5VA(cBCC zG1Je4zhcaArLeM2fpuc|`-hBa6OiUSVq&&n@@<@XLQVDim91&t&}}8LKdL=Xr0oQe zyrElhanB1mCEOUNbTi7iWs{=KV52pcfOxb||J-A!x-++kW1-p5KJ&Lh zlXc`+-e+L=6_htvI5=LY@92}yXR-3vMvkZY^ot95Utu|pEOVuhPZY2MU{c5)m=y97 zVP#X26!HxMax@ti@-{G?P9}VK*{J+OkkecW;xsAoY7&i7;&mXB5^o2guVCR2yPguS zC7~tW1|n(P&YK>q#Wv;Iyt<%Q;@1gxPl@k>!u?WETey%i9552^GR)|SxcmLEj|+qTS?w#5bQtAKCAs=FY2{mD=p z-^#040%B&LHR3bMKqSRq2SSU#oe#7p?QHpe_)JJzl*!fn3lN=zig*r^~iLR-kG)!Rxo` z6Ti1u0+9&R3PJ_ySSgMA+FQl3usyYdj%UzV?kgbIRO?^q zGce-OHSG+xs?VC?jjsge9^qil8zy6gc#`f)K|FesC|rjg74O z8btOliEKkRoM!m=Ug2yCkGh=9aDMbi^plM2n?9prYx+reUZjGX#F~a}6RXd&CJ#)k zX-i?{urslyy#<_2kk%CLcQW>6{VtBxj!@ZgJd4p`8>P9ltSlP10|t{IxUvy_+lrxF zn-FIopEA`ThJO*PnJXR~m^URN_H)DkQ*E-ZVkPix0omgZ|1ubqd$Jce?HBfGCVK}` z{jV_7L%`It*Y*PK`bzPll*ehoHb|qvtpJp2ElA~oDpeq@1vQyS<$@wrvI8*5dWDP+mZF_!#5wU1>-8; zFb3@+62U=m=}(^#gY@h+E=vy&FFraj|C|zo^zAjar>8}Gp#5t?0*&{lqwJ+9hfAts zj!VE{Gk^AKz=(F#j$q`7Xg^&_&~7TOl_%6u4G3$!w3C}9cF%fm6VNL$7j*5UPUEJX zv?)P5=~RMtVy=@^X(um80-l|`y1GYlo)FyneU3y#Bbl zR9#S0W&6;rakG7>x?V(J`%tR{+lM9)N&7H#y}0~54UZJi)36Ilswng59&BuAM~sb+ zrAJ4PfvCCx#K>T?s2_IIw2~;`FjIOA&0hkuU~If5R3V1RBy_~-VmjjVFdcDvppG~_ zP)D3Orn`ou#oltkxTvrgU0F3{nGnUV72^Js6*%~SXA!oO(BV-R2_0wDNVTyOaCMS2 zZxrj#f;y0NK^-QAx1v7Hk|?bEnJIFES;dV=Xq-*^92Q2UZI1hB7Tjodgk1kMrc=E3l3DDyU9Wp_$F;$Qw6;N~V< zNj5U!Q40fek{Bpw!mLN(aJ14F3us$ufZ2L%c36s*ntzXw^XYV%-2tH>moID^%pDNF z0pC5a2V~v{Zyi;Jd%|v&(}I8NGu+tC5_d~VEG@9cnl%84wri+?Hj?JDP6;-bZA!4Y>;#c?4Iex5C7t=_0(uRX3u<%8A%wYEQf1drtpvM< zk`nA1T0z)U*)izt2pMbarMAsL2Z0!Q^WD13unz>~^lWN7g1ewe6^DeFh zBM{??4e&*nT5S9K_76bH0{0%Fet+};lZwtlsDAj_9oOlouc zD*BL~lZD5`hpM<39VbP0DH}>G>yvRo-u5htjRBUdV0xgo-U_niNqUx95+xh|q}g;q z?dWpvphY`OxLHpiK#m7uHwf03*qMV16twkr%r(y)Y0r4+z&!=CXS{TiP=PL$koFZB z?Rmd+qDusFK^3Tq302*JgyMH-cHb#hF=eyeo|U9ThL&Mgl2+U&l5~(zNs1EI`i)eQ zbp-TOis0ro1KpC_PH-|k)u)qbGCZw_O zq9Jx^s~z{r`pb91Y&&OJjC3(wfAKI~fAK(FfAK&akD1)z=-S?w#Mm!Gnj$4LJIAHM z{&V5QL#=1W#q9Qt+Jk;SnDcvh10=INsOiS0pv~)dCOVC4C^FihUbOLPm7k-FF_^cD~%Gt&ES%quiIzaY65y%nvvB(@C8=(12*P^%J zxmF8D1t_Lev;^C{YYvS|Y#-=8m@~4WXm-MN=4q+yn@a+-vpnS+1ZOTtMcFlX%X;93 z>jj0vW^gZ=&cK{?{-|(cFdQhM=>5npDjQ;Q+kxYFL0R%=U4Q{+`1#QYBPd%^reMn3 z1c@cu?^GPGj7ufDU7mUpxnLquwIk7E63UlorJy|${Ra}gFKCZM<}g=BSD#iiFXB>( zit^Nx$ORLLN{&RMC6q7G27>lTlsyJ+O+kAkDhU$n=wFRR)9>^iiH?@1o&$b@ZY<^(1n^M4}EyqIV>eFVQ!G_DD1u z5|#ZSE~6fassxE8I$=T4T#rj7T34QW61iX^QMV(}ObO*nw40zk60Hk~4iU6Rq9#G; zFc0QDw6JJC!9|HaLR~voo~|o3A-grIk_%Fz+#aY&e{s`0aTD;TCtg)<_Qr+Cg7kXV zl$!%_S>lMca&tK@OZ@rI<>n<^mU!dZa+AAGh`!gCn;E$5lbRdKO&u;vocNb=b0aQG z+;n5PS%u3I%Wf_=pW(8^r?-@w;Y)=WeQUYd6_@tx)7aa@*o?yhq4 z6D~`n?kP9xWuMfQ6-*m0OWfV3VBW=L ziLc?D9}^0(PE;`ateLy~oYtenEt*O&);?av@%ul2D$1LHDqS+Wn0WZ3$ zz*7{fUJA^jtE=p;XJxd5e%sU#4JtL3Y_-h?O?IhF@w4<E!l@^e*0q%b{xtDJI7HSwtrZnMIhD zJ+p{v-a|)rt9^-t>Lz_eZ1=x4re7sBTMp{vbwS6NY9$umm<|`zdYO@l_|UReB+m`L z+0U@=A}cKHiId}zT(IZljShxe6~rHd93umxhQrQG)x z^VPU-!u>)kBr4kUCH z?$Uq34}&-Fk1^LfAV%H-VrLNJaB~ESIUI@nk>O7P`7EJd@#^--rLm8+`R)HRQQju% z+5u>Y!dLtq#PvaZEPM?JyBF+Zu+{O&O+nu* zYr#JyMy_}?pAc*j?-+8xq#C%KY?)lrPq-46N5>1=UXd?WM5YY2;J9Ju?i1#;j%;m*|l5W+d;6l z+mT51QL&xU#*?I7P?NS>UAGhNo{eTdqb#}+Ve=n?k>Qjx0&}^rz`RZK0jYuE<^Y!q zNXu`Yo9b`E=rwH96_j8?=>4IKX8-$xJYtNp#c0}0RC<1jcDQsG^=l)l`*&|Rb?h}Dp zNvQ5SK_miotWF>o^aOfywE|VV1%Va@BjRn4AQFMoQ0w;3ChaUyeJqR?g_Bf192d_B1(9f*4^-O~?>GY0fk*`6VetI3iwA0tF6argiE#S@bt1y%(?vrS z|8fNap#rt>feO@3LW{rVT}Pm{)d}Q+oG7kOO)GZ6Xg64cSenjq~F;IB;!_H=Vi=#k1ox7lhty7vf?R*A8Ai z5Mo>BwF|OjX=-Ia5#V2nctTP~)9Ef3SdmIvx!%L9|a)^ZH+ZjiLtJ1!VM z#_rU)&6P=Z>U2YB?9{RS{+sfgy5)`?TWB7rh30`;XbRd{xORx|Nt|9U;eu*&c0)|f zhp=7U5OavAobe@dPY=|T6|_}fQ$Eruv7~`=K}k8}hM2pAnYO~T;=`%xD30zOIz?El zc69HM2dX#Up4AoPu7}+f?H8O4kLws#gnXlByS-5R1bt0ZG;KKuuXe&#wAQaI0u zt6-M<Ns%%ZE{v@s`wnG>x?5@;oNkLDhzpPFs7mQ`H9l`_B%KIHc zr=VVk@ScEnkpWT}Ys6C|Pin-rL*OO_{@KGKq(itKmfe92!H9=PwXkUO8HhpB_Scfo zw*PFW9o4q~kAk^vzl&+x?_t{Zd!V-c9_Y3GOC&9K*!5?@+*;NKp|zI%&5=17c6p%I zG7r>(RM4wst0YdZ?RP=1mUTm#q?Y}`ZQb{Tu{xLwd_u@H@}uu zeeTq<1rncE%RErUQP2~oMS^?HjSH$ctYxpd;v}`KR>fi4e}}6bZTme?Yn=zGj0$=( zKDauSxu6!7tu{}JkXmg}S;9Y|hWuA>+x8DijSPRp(5a8qF*|e`oEmK>Mk8g=H4H(U zr(mr%yc6M<32J9{m>`9}!*uI8XMDz4Q@A!kiIjDmzD0OmF>f~Mpb z58@2V%#--3#3_}{{|Pc1;DE{|T+R4i-b(!EftAhAf|EOeQVR-YCVd`$?!>BWa~L4P zcrWMj0r6hW=0cEh?(z7c;YhD=FwV}LlQm~n+8{6Qj0b0JhRsQv{Ti6Nam|HZQg7gM z=$ZHMv*&9-aMGl6Z&Ek^k~W$1u*UlWuDJ#92Xnzc5I@)8I{khiPZIgNAWfLnq;~in zQn?vNax?k4lYwOK2Tvt_PRBJDEm>;DKY;9lpT}`EkY@n%xdwi$B&R^=)KvqpH|h@j z^uZCEbH4zx+uDfw&sBNzux8-i10qB{9{Xx>AxrK(a(wr_kxA`c2?uxT$F$iH*NL-( z%&Y%No85lG{oz68kqBQLCf*ce)*6v9b8wxwEj&fTz_cr_6Q>6MmwRl^1#{{s{A5nV z53_Mn4P5O#_a=4B3}pLc{K!+2I(ZXHn_f`#l>;nBR zz-SXC3}aG_UqgGB;>RMhY>~g0MnqrWhd%exra{L1q0H=ri>H;P?tziU5smII!Hxuc z?coS?2YzfsEwr|l{rZ^9-|!t>8_z94y6wv{^KV=wo~k+%PpPxg+Cfm+^ezJ6?T|Ab9pxJtj~SK%|~ZF@oBe6VJ?2&ZALf=7mbtg)r>!L;oA;P_ZTwrc=K zhl@{)%;y5Kt7`aTG}YwqJrnP{GP3c((EQ^d%-$d>g0bOZ#C!sr8T{i+t5g|`ieAF^ zEvw1VA9eL_V1Gn7*h`nD24hXMRVrsnWEljOYY<5pTmbyzA|}2ZH6j}O0bb@JM}07` z?~UlTIzjM7*zDI3e7Uf5FkYGuk7OGJe?mYjcq;@CUq3c79|_7{sB~hmcJ{?l*cOF} zEB`nlbeLR)l}E7Z`^h4}aPeObhwPo)^bk z>=ZRDLF>2=a@HVkP}P9o8&uY3bE&XX5juFdS}<;}QlE{B>EOY`bnxJTI(YEFWbiOds3|Mx^?KJya62s1NumpC&&+|sEcC(rv%|{7KhsTdbdq?N#ODnZJW$0^&=Y5w z1os9CE~w&gpm4M+PBKua+E>KkK;dnP&w62Wpx}WzQ1C#NQ9)0}k0nm8uv}0J%MKLw z7a`q&!pEppiv_10pdzdvosC*i3)xExgU#dj3PB{bVtur`{Bvu?W`eo3!o{>!c$n4- z57b)WfnKfHMbdJI&z%rZYsJa(+^ZEHsI|faRnZE1wPK;f=_%R;RnfLqRP5)}im#-M zyjtObnzDjk5&tB?y;|XdYKE*8ce`eo)QTF4qqQO@EMBefKov(pPn-b~+^ZEXsN%3z zta8OkYDJxj!&|&)WWj0;u+y~YsJ4&EB-6EtrZJ{ z4We~WE7~A?>1^!TIS|AnVifD4GBh59&T|xw_jyi0j+z@M1$h%~3f69fYdj>F5oK{K zaP|HmHpb#O+xQRQ(BL1fxjBW7hhK^KQb1eia`=>sX?5~2txg`O)yV_3I#~gJlC`eK8>ZKQnZ(IF%`hWQ~(cD0X$Fzuph{)gF2e=*=>6?W(SC52Ux`cAYKpR58u|1 zP-7S_@>#P{V^GjDhVjDb8G{SP#$Y`dUwqZmvh}#MvtP&PXz0RvukCBZbrffn?80i7 zM6BxrhHe+KJWyp+(39~I3GP)Y7j!GtRw9n=`D~@)3UZr>V~>zrOISF`;|?=pqTgeJ z(g_|aI=c~!@Eu8$CdQN3!}~4|JP=c^33z70uMl*J#7Hf|jyE;Y2N=#(;Qag2ZFmib zN1xPyXn3VhWTJ2IsE&_r2`1S`ZTcu2+ki>6XxR?JFo+AQ0sdJMV1crNg*RP+!_F}E z;U7~i-HTdxFTm3TJc;0a$j##bFA z+Yq#e%-pwi&U7*pkHRu9MHQ|nrA*7`Ws{>dpuHLpjWe+|p+AT^5X~|Uxi-hUp~ z;&;D{#dmA5i)khDFs(!$sFlbAwGu((=p#x?0lzG(jP}KV-r)7)mXARE4ce&&QCc1p zvTuRdp}R+^R#kUHRUT+nRSQ+^Caj!ISXKQ9RqZ1n9dcGxD4+CMfjLKTHhe8#;6y^o zbf&0aH-cZ66|$7=PXg8ugp66r=z@u?%N-3SvU*@5>*K=e$@;8--18{1TCs{^f>wfW zMXcchZs3aLf{9og2`39S5z7M;u{LpxJyGE{0KkVI<2L8w|2Lv@Pk^ZSJ&3!p2kI`?4-yx$0m-vnsUrzS#8h63Js$jQ81|r!B(gi}drc}?t1B`d=TfR*s&=c8hYMmgGy)r+EY_?m{xt9y- zkjZXS8-NWs{9|2<_ilYK64Jpd(QrmIsQAI5fw@Ll*dU+!*r@RJUf2fxu;sP5U}?(S z=0tYt6KiHS$N0y^MjW4ua@V}*gE*4{+sQxM6)hLG+wgAz6M7~JpB{lj0R?0INl*j z_rrExiI9q%_m2_9DR7;*SlyJ$+&wS}#Tb^J6q7q{1>Ucc&~$&#`zL;j|3)QzKv3#( z-ewcSYRKbaedhLIqie#I$ouoc%(kgvQB({&7X;>S0&*uXiwOGz(J*W$nzybXm{oW( zoIg(sNHvx6`1m`WKQ-2Sm8!JPpE?ls6tw5j&o{o)Qw2)J)LPl+V5d6>$jVkKU>D6I zRLk82w1QcW&^_?e7;&5tEsaSP!k^(!t`-^CY@-1fY*J^!*_OTpKh_m@PymNr2VSzV ze!TSPgZji?yGMbW@@{Fj9tRQ3c^5voA(x?Xc_j$>Mcj?PjRm$1-)F%_*@tsE^E&}o zGC`c0m3;)~$8Im+aR6KTrUz%+dx5zrQd{etgeo!O#GTEC2-G~u4sFE6NVDQ)W) zt~w(y{RC!{!Q7j0dsyJ9g4&@V^d4@^PDnrw(6FgvOt=L&j}y=q8$gtE>w;LSA7ItN zoUs=c&1_sPN2SAgm{+Zkr|ffDj!#F?9UVA*UzHPKH7MSh%@CVkhAB1wTY4XJ)50ftzDaQOKAA~C2 zf(Vb4SlI+jzi~wP)p>!3rE>W4kp0V5-ih|#VL$IBJjs7H2t7H(Y&khy$o>dov9NGn z+j2^JLiUDUVEs{jqU;}G_&g?BzlTQZZvThUItU~YeY2j$d}c+uQvt;}AB@He^O zZJ9O02N2!`d&1u;tZc&SZ_5-0Fw*4$avixISNI%EjTisyK=ib9WmrO!@=kA%Hu8&r z)<(b?{R=iy@gr2xlpd6S97GL>v+qRDo;~Lw3|Y>MV`jV7vLIc|Htk`|CIWKHpgj&~ z;To#}>sJTvg#%%J6Pzaox?pl1oeL(%zJz@SM`op{fo*on+4vmIqsZ9L0jb%s|JEp!`7}E07kDO=XF%Wx#^-+Lz|}t?kDCS`;C^CbRVmR69wd0DpA94K&s(4 zAl2|2kZN$jL=7(3qlOGjJCq#T;;ctLSUjD~#|7|fuvpB0Kr5yAx%AyUJRNSi*bVh_uqq+kwv7u%cMBrwf1=}lZP=}q1jPOmrd zK&Ln9f~agy`?5Ew`U!_uNH6jVT2lVGy@-oxFXCcOFEU_J9DE$2&|X9_zU!IvA|r&6 zeRa}{DCmu$CkUtCi%b&K??u)Zw5J!zvlppF2ASJ%-YJ3kL2}5D1hb>M@R>3J>j;*i z)2{3VS~b7*HaczL^wjKuv6@Z#T#PUNimT-pys=Ywyxi=Bt7Q__04L+sqN8xNY>g*3 z;(N&N<7)W~#LSg>vjA7i)?j-DHv?Y*u^hw$xcP;|&KRwvPX7#}nDaiw>gc8T`8%%j zv8?_1CmA#KQ`}buna1xk<|$mf|NK|rrp(@dh)*4^dsKXX&#`6ZCtTpEG>^t5w-6c# z=A3$I(L90c{L11{+vUs{d5HegoIj#}xcdlv8c{H-$0t(TnA}%rTDKN-Epm?RXENul znKvtNou3UdOGg*X*SL@##J9`!&EH_{{c`-6Z!@N4?@W;XcvQhm{k{y1DTvR;7EF2= za(#FvNX;Gx;sE?`t(A`%Nd^nKv+-lGYk;NtA5&&hmmG?b`8v3>_(#CYyUvMoShlX6 zL3W-pW>#x4e*ShQ|10dI>1WtU7y6@9U?&yl#_TqK0Hfbys@+bGcQPZRZOXCw`CkxM zXQIORe9lz;f(@o4`bTwGIqk%K%QcyixrdgZ=ahKh7%`>kBXiFHyGSrve`&_ZVk4%n z*9b<#D%DhFCt~iW7>7T0?squmelBR|e$QbT=z(_b7jpW0i$uyyaQbTsr(vMo^ecu- zGl$rBxjJy)a7YyOodx5DLhZX;rpQVAqb;!pI3z4>IoeK$6|-|+OwH|tSV21+)d{f& z+Bv123?F*cu)*#{1R%7i9wGQ_^GgJ_qq1p-L5R6gyClg5ff=?$HbkyF)OLxGBT1d1x|q&T6=T?*8R|n4nl7rI8R{2~i*NIzKLa+YjgrwM;33@tI6v)1!IpkE+D=ca(56t{!u2r6S`eje zCxmlRg+6lAhrZLH*Jy@8>D7kxw%~i>Uw}rUH1N3gCe% zfL*z%g*uXzn>G;1%1t+k*MoTFrYZwMS8g5=`Pgi*R@;{m6r@ciKB;GflLnYnbr*D2 zZYJIpmm#+vGe;z*!8uP z#RfK-))g<+?XhKD$|cYe|dsPj|<(LqOdJP$$nh-A=aAdZ6wD@IWnZ1=$xSHrXg~(r1#C zw+pJDG~Nf$2bQL9FP(HztS;8pYod$R=6GEbXP0Mc7#q5$8H9gCoHyg(sz<}l6=^D8*f4HyCx@TS=NlL z3cI70RP%n99c(RW!hKRpUKWcPjSOlnc~dY>ptY8`nAQ>x(^}$zT1!08t0mt{T5c`r zgn(L0#!9XCYKaGGE%87t6$QOovYy208Ho#ewWKO^Y6(Bo#Xql>c%Y`Npl1(#CAe2h zTu|+SwWM2^ZMi13q?Y1nEoma5wPc*|d$mMCPmB$O(^G&8I<@2(X`pQZAaigN^AN^% zrmVH3M&k2oi3h4y6!gT|MS^>^#06C=tR;h1TT8k`99v5=tE(mdl6=q)#^x6P`VK`c zsfbuJw#@w%Q?bK^hxxz&t8g=BVl{kz`6 z1%xZgE_N4R!L-o@OGgdOz5{HPFtY2ni^_YP-3zpf%0pqT9}6ohon2J^Bb<|83rLZ4 zT^?sUnDLjyn&HUWuFF%@IRfrTkn8dk_4fkKB#5oY~g zKdY;E1mA*baRr_Nd?MgfR{$4O0e%ujT6v-?4@?B8yfn@}tD*=nlo}W-IIA7j+L^ou zY5rXh$%j<6VjSh@QhTljW-(dhvXhA;hZMd*xmM(0-^UKk{)GGak|>)eEBApYV-K`) zuZc2l6jn}8DR+1s5?&}^jV7F%iy6_uGO?j+ymZ3U;+>fI94?rh@}Dp=oQ(<4vF-$j zo5}m;A#)AoJ7Hk)z1vb|^q+c^Ray{b!^?ea#HP9R!jmDh%Q%8Eo5C0@meet>1yQsN zD=OW%pS}?`&-^im4FKgJPE40Y7k`4;8i*O=GkvpnKA18GNRpEw{EX(z+S&bX4ib=^ z*7P~)HNyEf`rsCK1{El@`%>lz2@i)ZS^MQ)gPs&*c)MDXU4^=GjqhD=-o$y{*y zVd+BdJxHb?t4=K0dywod2~WE~_+iBvkjw=s*>#Z2#bU`;K(Z#va$9C+6I};gx06~A zey$}CrA$=;#4h;0-&fd~PzwS@GR9>2sN>4Gu&p|FFRKd4;(|S_p9?Fcp0N);wn$bN zw5%q3)N95Jyey8E{Q$(6R$S5PgKUZ)>5Z`|et$(TMmEJ;K)m4+CF`3WSQxbIpHpF*)*FjP)xbG84>Y~5(0*5gvY@LJov{UlUGm$l)l@c8X7Be2s zte-s`bwEK*$6!9gY#ngHxDL?L-jMJ#zr@lM%mIuotsAL-DXg~8AI?-2cYvk2AT8|< zSelE)mi8Jft&3tmoY^xx6O;3wB(5r?FryQiGXijbxTPTX8M+A$K_ zW-7D4Ai#Wyh274KZ_`2c8CZ)8+9j%Ek)DE9Az!A)h1=uK1*bfg9&f^nkl&LfQiL)y zy3_EShD!l&ctxD!D#FjE3*mAw>>;3yc13zaTN&#p;;QrrTN&Fy#5L@7@ZT-`)}mfd zj|!jf1y0!~gHMHg1N32GwHkUOT@`-N3$(1^0}$;wVMTeG8UMgi=u-f{6mUGj+aRxj z-3)LWgWJ;^+7@DK0d4SQX{;@y+Pk2YKYSUH?k%jWqB9;vN(DrExPa`#W-LeeVF2d| zXmk1)a(V;AFSyxXoL)1$3*bNjZG~Q(ULV;<&3QmdVKgJ%K2r!A!K$Fu$*Rm6;nk4o z8R6tmbjGSorHNjA6}=A&VXMse0&915-;_bE&i;z~|6U%Kqitnw#&KJhAz}}_IGB#8 zqB~%EbqF|P%go5I1x%MqNSn{EGaKd}*cSUC?~bG6cx>txYsSIa8Ej@|gyrZI4z`r! z7|Mvh5YU#6v3v>*)0o~sHo6$o)J(B2vr$oDvw^S2b{VtgRdK>~UF)%PY3CHH($i1Ad%vSdTXMU3^3(Fri2`B5(%sh&92*86SIL%^a0pNIm#|daT z``U)iWY@=o`{jY{4+fP5*-8|m3)-s4ro#ni^v9TRKAJ%VsoUwtAu$dGT+lXywv~BU zQet`ARtD|*3`p>T;9QWIK?(MP1TJVLxE>O?;Ectvt*y~`x#0AM(qHFg4o;!VMA-R%nJlhJ%jo?*&e)#(|LGF~KfP92;VbOg8A$KVLvm( z{7wC1T%KCUwmdc$u$=Mhw<29ob{iB|AfauA`Hx^m;@Qh?PMJA^9R$qU^`Wzk2ab5E zyb#?8uv;a&97I(=k@V>h%5+9QZfekV>E85@?*v!`O-+##_YjTl@0 zl^Ii<)`bsmIbiABD7y`?F9f4Lu}^YB_Q@A}flE@ua&s_dayf&qFfI;nKtf+jc zEK$^_Vk%!pVZO|ah@x%q76ggMGNYqo@T7VGh}mTWqy4eU-%8@*OjJC1X3k8wHrBvc zM8%B|+hQYxVjKXpEY3`iH$rSLoLiC;+6>#Fz{LWxEo`|YQ;Z$~*dYl-)MhsbYOyc1 zST!(ZM0|2P{1-ad>_z}SKg_G$AZ*7!27Abic%LJ$WA<`wn zx*sDw6!I?u_^5zMNq>t-J&^J@B32i)@@LnD{EticA|karYENGgcpy^R7FO|RIJo8u zFCw#A1$;Z;lLcn=vevOHY@msn|1dMOumyH{R1ZRngqP8gGk;p__8h5F^)U60dZ2no zJ+Q|+n%$@_W%hBzwVPe$AMJy7v&+xOxXU>>e$m11BB>sN0=Ron{GJ2ulU*dOAd+1q zk4QQ+QoM#>cad~}L3fdup*%vfM>- z{S9#$T|y1(`wj}y;B_~Ni}ma#xm|*@66$Ue7fW`NxM0t2l7}RCBZJFs62)@BlHDXL zgpu}@>?T<$;JyU)eFp`12B^D9JWO_zC`L2X-6Wq$giKm@len1fCQ*!Gdv=rjTSBuL z?b%H-?k}-|sY~5W;$q%zl4-(h?Ok`1Y$l+sMs_#JQSg)QD=24VrTa(Nog?ii-qQW? zsTN(hr)x7LO>vAIWR{*;tN17!x~oK z&^mq}#0b^{W5@3lIDTsw*T+%xEF8ZbxSw7Q$M0ZzWrmC6_ZrN(IzU**@2Uq=W+f(f z{2PbMI)2Zf(@Q{B>BRBtg0a)<2~2X{5LUj^U>(25W2&bh%`tX*MY#Q5Sg9xL_?-aF zx*(li52LSfvDoP~0|nPjv906RV1iyX0u&v;?;{iGTjEU6fUV>AZ;;Fdtvjv>k|{_T zV#x+VvOyA_!+q=c-2jrgASHVSlDSwc*^ZE`maOkXi4+{a*_98a%zY9wEszf2 zaC`J}E{Gx;V(fh%xn0HVPdOL<9Xgdh&ie21g%zjJb5;%-f(A#kn zyd7QOu-=Y2aBQ3+9ErDM`(B{+cASqgQqIKNaXG+?Bshm6*4uF-z-t6_y&chd<)~Dn zASgZ3d%;cop>VMcu^#D7;U;#$#3Sv2u}AuAWcwS5fNi+-NHhB`Xw`5ClKNRV*$B;` zM|xW%<${Sv+5^QSUHB9pB1%q=H0^q=TVt(qlxIEC{4B46wsNXR+6Cjv$to~K!o!+l zk2I@*f<2XUG;X&RR$Dpgk)DA-F32jd654mMxC-ozDo{tU>5+aL9=}?NYb?d4NBV2z z<#+){6QoD_O$g|Mu}69bBzuXlGKbb9y%)eM1hj=fkMupriwim)={8D3k2LCu=_Emq z^kWF{w8TP-u^#DHa)Afh$>JeMPdTkZ=#jn*cPmVg`|TaWa&2)~zrR$h3dt-MW?7oKPwyk1Fn(S@4kfGyx(INUfL2_3pqC)IKS*}V$w?3NUjQC2pbc(4(8Ewu z%x!UY*CZ=F(8qyQL2D)SK>v6_UUPu2`CA#0!lGxk$I&zM)~!0~6Cbn|%^K)&(y@CLS`!5+a^l!^!Pv3O z%DRoD#1V};cHe{qdkSvVI|z>5Lm+_*S_yuI1TJVDyB{K27jzuEr(F)8CbU%gPgPWh z`-;&i>&uM(iSbVj3HmT!0#OITI&x1vK4nf7Vag$-b>s#I;{`_-qz`lEVfb2u3#udc z3ISP_6Cb7v#y-r~jtR^i!s_`j$J`m02D_=mhv|aWM`Rtj_egjSTGWyICuFn@*(v>0 zl|2{t+evf>g2y^?e?WeB5|C4UtAtMhcB&GdayVGEtP-XozZ%SfRKm^x_m;RUs7fda zNQ+IB;DWIdcwGE^VfB=7wScw^)RF6gJxXX2R#ypo!=}s_DB-_l(T=#U#yw3a`V>Aq zyqz2q%x5bI>$7A2_Lbo!EjjVo%@xp!qCPtp6rWw;P$bkLiJq`M+_IX^hpj17HC7U( zh1G(viPEx8lla*@CW)T4xYeT~fBrsLMuGkSd$WSkbH*Y`Idy|4udPJ2zfur5eZt=G3qIGNML z>+6EC7dA_;?{MMe0KleC@9%FwroWbO($tdlUC^daFYq|wWbr0mU>EH10*8NuWiAzO z4@0IZi} zEeO{vUIChQJl?6=13&iNsl^$TY-;20@SfJz__-8U%kp%PzWhHK^D(ZLhtqiJs`F=j zak+L;Yy@Xx9a)y15N(@GvJ>^!i~S;oxo+MMrLAjoJIE6jcF|8UWZJ$V8cVv zNRw{|+Rbq3%!KedoEfsKgk!tYSeEG@wgbHO>^L$DW;6Xwv>nR4>SvqL&9m=AX~TqN z2ZZAX{=%;z(eDK06sl$4%yk0fa`b61CB8^`s15j5 z4Y&?jh0w?1$JXYj1BBk;T|oQc$MPPAw@cUku*_VHtL1n+H>rI-#i_Q3;pci>Em%HD zJ^b%79FcKywsVmkEmfw_Gk;1$Bb>UO~{ z0}B23gq&+4)!NC?C0KhY;r_7m%d7H-fw>jLhHD0F7URF@9IOm=0Bw0an4E6_OE-zP zGjQcSiD^*P1W+r2^}_2h4%+|WSZM1^n;DFc+PctNf}=DG$GqJJ;(g&@b8nYw%-?!} zT%3XFVv;w~huWd$N2qt9DKr7&awiQ?hO`iwGD+MM!@E>_| z2(Fe2bZzm0Fwerg)34&kzIprv-o(CsC_doGH;?ZIF$CX!wAJJK6jYk}*EIa_Q0erN zFg`=3WqovlCbiYxeQ?0Yqp{i_s$wl!gcGWG`b^7O>HKpjlunw-I_Z(&DiAA$)wV|K zrbkC-VLh>GEpSXpkIWwiq83E`y=Abm<3Tm?QFVG;;W7|46Y=P~e&G$cAJ-A5$-z$j z67*b!ZL#D~M~)x+XJ_HGhO32xI;%e_mCx~gUl+9BaNGx>Iwv7iT`K;Di@a6zt=*mDa#kSivizaJU}p$fYkV!z>dha;?hn%c!^RmZ@pJd9R#{fb^7t?FMG zDc&tH(tOncXzY^BGxCIEf@I0Y1?3%v_#2KjYa{D#1XcEMtU3_M;aF`Tbb+Xw50V9< zb>ao0_}yU;$xB}&AL}WTBxx7ar0u)S(}bIX_I%i|6A{*b6Rcqcs#w<%s1}3@)XoPg zP{kBSpgItVKn;=vhXjd0F6aq#*=hyqK!o*g2V<;2-AoEEXWJ#Ts_Gtr>TsV3)IkCU zVKr2-o+Hqks}sltJ%N7cEl|iW({A{9tYsE`{g1&!yPCO)fb^gO9B5BR-BLi-0A0;= zF9NDZ8L* z%dUUcLecfV1QTpQHGxP9svU${j#=L+s9F+QP;DTRq)(Tm*^?xerbk`(_yPzg+>(Ld$oz$c3(+39T zZ9(a=s!ylZ%syN4!TtW4DrUcNIB7cj)uqPfK0UaH(}K%KnDC`%0`sZF$)%G0=B4l~ zJOz3GUSN(*>a#dpkP4adM4X4;6TBHMCKcm?N$J!f>#Cr3+$Rd^CXpy;Lq|c|NaXZM zBnomtPeDftcaMU`LBRE%j0N0;0^Smgv8}fY&JR$H#$iyfwQ$;24zQ_)hpn6};? zrmeRJYU}NRT8)gYM@L9v9D&p?h2HLitS*?;BM;Piq@Y)ij+Z!DZi%{FP}P;4jTh?P zc{*0i&XnMOv@h#H0v9}GanQf`Bl6=Y#rH9iLfKXB8jSC|H%z9L z1Qw6Os}OAktcrh>ta5fhV~y)m2e|5=kPn=8gGkJ!YNH-=Dd9dbmo^g6gZ;>T7YJ77 z+#;m%(VKB99NNw=O^*A?8cCYXXrdGsRHfKTHb=M<8w&5jSzk?p+Cj*j!Isft=&x#H zh<;}<))wat!ogv2@@};U>S)3PwKx^@it~0S)kJa^RLSkT)lCp5dAGXXv#}=FN+<7D zd!VMQpf!5^GUNye?irE`O3L=jkiQBum&W2RL-O6~c8a5KjdqdHw?@|$eztlnM|tADNk+%w#&rOeQ1*Lc)zeluHpbC?I$dL5PZC6c7cED5AJt zK@<-JgZH^cR6KUocweXyFBH_EqIjV3zIWq+x~{_idEc(?sqQ2$y6%2=fB)^zr)KJX z>aD7`-g@io>TVTu1$RN8;JYhD^aNKySAX<;Y5(UO$ytBiQ`nVK9DcsEShBFn+^4YT z%3@G=%+Hrv@4!@R5pUiDSeNl=MZ~C(Gs!C50R?pDG&LZ+&X@w+(Mk*lfx>a?sscf+ zD?zQRfe5!%EtMtowJH^KZIfHojgs4IRV-aI5}db7s1uK+Vn;=~3J|VzwG`k=*GPmb zT`LH$?Y|_oL90$r%A2L$d{U~QPs+z6w_nPN5s-4%kn>vE8W5fi>p{3uHdBBrr9D!S zvI>MJ<;M1;EL`IlfKN&l^hr5Ta(hyW*wQm`4+Yt9Z}dH?YTQ#!ianu>d7q(+`YZr? zeS*qKisjMK1J=0CqDe+YV8iP6pJ6VFcaL_ozzXkLf< zKnTwrrwh`KGSw9qVh@?5&!SY&ErbxI)K4^#z=HMHO5(b`L}_J4e^u~%`l}oNGnF7OY={q8ld;JX-d=Eh6-7Ne*2 zIyfqbqXkdsB#*>ym*k)l&3h7?452xGa9K+0CL)8u`mJQ;!TL$O!gC_Pl$;td_>9pf znveJ@xa@U&v3dqLYbe`ijr>?CIO;(x8-$d@-4JxUOoWA44I%o2MFkxpD#3b}n%`=A zz;7*z)Towoz0qAnUPI|mm$k*EpK1)?(l?P9Q}HMgmHsNFKE2YbV5aofN>*R#A5~@& z^W4&_pjUdat5W(35L|j3<-_*Le3>-1CB(e_jUFs#4Mo^d$~jc75NI0X$*F=YCs#;| z91?sLqJo}C4XQ}Zo=Ba@Mm~~VHr+3n=Twpl`6@{TGnMq2jLkAoC0R$Im|`?abcT@| zpLhkn6hOpfR`_7}&s^geHL>%qych3`2f&K}>T5FsEv_`mBE0}cRd5tehCI}Q z$vCoDyqhs7{Na_@{FNLtAi&}(G?1?W?x{rM!sTL1)dzCndSmbMFv&_9=E7~lKI?1= z(iDXY7kQ=yudbCS%|o%1IM|wt`>ahQ%y!0z$hCL@<2#arj6XaGcj+R7QHb{>N~&Hw z$S4mViz8~ENs#u-7Y{K~;TZvt&#mbzg~v(J`G{Hq;MX!bEhb0t19?{LDm<1?((GV# zwYESDrDNpLhM_2Z6%jbv5bgsaf#YLz(K?rpIFu+Lt)BVr{?u8T$H^ew-9H>)ZyB9I z_wN2+3Ht8ttDtjte=}~K?Jikqnpx~Vt9FP4NxR+=2NmSI+kC`f$lH$iG+C5K9IQ?# zeI3fUcqnw)6U2o|dTax`qKrO}ZD0uGy+^Xr@|A6%Gc^2!1ZjEa*uYBbT#ZhC5b}3HDi0s9oq+s(AmuNt5f9^)v?MqpTCYBaIs}17Z!K$& zY~1)53j(iJ2>qaNgIn4LXeYhpw4;L;i#--l9kMxPulJR<*6VY=6eUVqGEiQFH(o5al7&y)?g!mB6Gg9DxEqpH?gqkr)j}-@=jm<=D!{Nu7puj6)q)CU zSjS3MTCI7nT2Mh|72$g9;0$}wNtP;xPv91=^Mf==%?@HTNv*_f9W}N_lhnr`-bk4w z^&0LZ)tZT-Hc;v4VC!+~aHLjpQS;`5t^1-WsGxVS)dxBUTcfWEu}CIBBPSnh-3tP# zARlZ!9a&u*U@J9v74#0a`apTGbui4QnIxx!tz2$F509cv|lBInQOH(n&(yoN1+2bHK z9c&$bfhGpXw5VG6U~5m5Wt0Sa5l9DHv+wtV&cW8hknQ1;l}gA5Tjv5iMuH?Zz#)-c z(P~ssIoMiB($K-y<6sN5M9{(3Dnz(Sros)9UbXOU6f-ylU|JsJ}EVCxG=cD@AJLg-*CwYUZn(S6lI3kau$eFFZc zB|qze4z|7-0G)%a`0RvuUS)j)2U|CRRRx`ctw%$&w4(t9^b;jB1c{t3;1Ab z0*Q8)Aj?ayS|E96shsYs7F3YskDP-aI4!S-LaEt^wIv;c$g_iT2tc5C!>heIe7kl9Nl%2VDzZ z#bRqbDuE8VQtPe(L9bdk0RDb5JJJgubiD})`#^cn^;t;KK&jBH7On)-v*;4&VnOMk z>r1<7BEHc9sdex{SBlm`(deKnar_`RBB|Tkrsu?5vNa6zJiDdpBaZ0tY{Quo&~TM#)hD4t~|bX#tQYaR;Ft zxtwJ3{Hlf703VmpX&%EfyAuJvC_(0QU$t;10*co=dZ1GBiQIml`9W@q)OGkc=|t|6 z=muSobnBhSRYB)OF7+~9Wlki5dm?ukB&d)$+X0=(Jq{A6AWJX^5~v`b$W0?z70jH- zjZ|W?w2PAC;{A?K7ldC zUi5?frHSyzD|B&|WTo~A)_8a?WUqpqw~O|VOg%RMZlJlEh+TCi#!6Vg;sdd+KL9bC z9iliq3&ck?6@`B)5oA0bPhQ;t%l=V+F}_2$pUn%W*OmwRTU3KG2ipy!K>S zDnV-FEDM{`{SrNzWT}C=zHAXr^2i3&Q4yzE*{d?8tBB=Ht`i{EgH%<^u3fCN$~el z8bHv&bbf=$WTi7Ib`QR*Ad3z;umLg_QamB~sS{w)7B17=#1-R@fyI{2)tpPCKA=2f$`mEz3cOy`_$FP>2eb zXqXFyf#AdYy&?1rnI&77EA-(K%tkVv;#5!yZLLH`^={hN?1?&a2@Scny2QoEwRD2a zwHUdcBQx-+s=mEkRnX0q%36iw*f^-HbuK|=ZFC7LYm1vJm9??Gvfk5Pt}5u}`YbZC zt7NXJJuv@riEm+rwJvcEa%}*?8qPtkue6uzhW2t*L76KmfGwl5yut3X3>EY&BM3T{ z;Y!Drv5#sQF2R-o!n2HRWtKk67$QNRWvHO5Ew&6dZMF=TV9Rg`wv362WlWYC_$=d~ z_HtE0H&?a{B$u%amtf0q3APM3SF(&#+bipW_HtE0H&?cdNvdVI1Y3qnuw{VoEaSTN za=o#=Tvae*8P-eaGn$bi^%d4rAjG~>iXWDt(Ypj~nAU*cjA^6v2WfpiB@5Ym`>Iw2 z-QrTN^+?XkwaLwha&2`9%C&T|lIydwWWHS2Nsw0lURR@nGS~1s$TeGvcsQ83e|#MS zO0fiY2FR^o@YzU80eL_f1+WUzuw}eE2PJTc%?Dx*A_?xY_mXjG4(mOSqk<$-xbw}L z7$Z5UMEpEXR?-i8&*OymM*fFNb{aKU(p#agHXx1pF39r{8eeG4pCzOF8sr>B1W$h| z=$VWD&bv5%{3(7`?ufI)#UUJ2-aG<3fjtZ2VmaL6Ats>b1_3H4j*De*i$5^{#kU1C zp=(?`2eeig4+6A`oEi03K%|1AB#mVeYY5pfC}38ebRZikkzbL4^sxHQ zn9%pn%@+D0cfj`|k+0z={Q-VB5A!*Tuz#*%Z|T-204 z{qdM6Iu<|o!o{@1bgk%-Ct@P7cmSbsA-~3{=x$aS@(H)U}|7 zA08Lyz&T-4AyNZeOtWA&5bCI~&~M%)E{g8P&)0Ca_Nk^7Eg2IRufW;b_n>Yb8yBr` zwiZW!P`TscViKIKJqGG(_}*k{S5RYikBhV6Y;7v2X84Mr zHe0(H)bV@9#r<%$)=4M1zQ+ST`qL;<`X&63T)En|TKXJllQf#Eoea%2juxV5L|t6m z1(&OhLOK%`#>JCxxmp)a=YlKaLZ^ph(pSN^-Bods)G8>00oNm75Ps5?_&E=*Kr7eM z&%l#+0}#c!%_!Z#3_Tad911_$e zprwzxI4*96i)%Y+>BlaMi*MlK+5uX+0MhIZ$HWuJ@OwBWhTIqzN5aLmIa+$lO>r^u zW+EnN>DF7~qB{hMYyJF$NI#CCr+VXbfwo!m5wh^hSH(mR7*Gz`sE>GRbX<%>MRUkb zd!sJlm?%6XF0O)O;(--$u_J_WLXg{4aBT>oSB`>O$Kxlx4}LC$OK3Z2=^NmAn~8B+ zx*WAx1DDYD)zaO@$Hk#=3GE;)-3ZUOOdO@9XTvydfJ_6*b| zdu!mBs6uU=4o8ISBqpB!?%scJe&|)um`7M>18(3 zEAViQh105^$8XkP{4{P3ad;?=CHo_ihc*EyQs@U{=7Ka>8F)crn8tY(%)$#2F=AjB zS4O8zG6OGN47Vap6*Mv2QrOii6Jiq_A7tAbt%D(IwO6rxD8 zD-m%_STja|IJ`f$do>=ln-ao!0@ZZUt*H8Qs4Ey>lMwngC*%sf`gGi<-GsoLKj90b z&M7G;c+*f+F^~8|pvBt}Y^=e9hdm!jh$V1Dn6*-5TCQrv;>tS_O!Eb_N%!ukUUQkr?7rr!X+^(Xwi2WK`yFMpY0it=iF3UeHkEA%x` zkG=sv*1Pz54Tct;tXa<@@AHsEc%-J&f3#tL$0q3}s8;%Zv95f?rwjq9Atf z_%IzwaxYb$gfY@222Oxr+p^w5A|`Qz%&s*?K54;sp=0Q z71|=>%gN&b-4=U&6~`uOB(#$ogn!!A1GZC!A8{d*Fl;dnj`+t?Ymrwu{{8$;$9oib z@0I)~l6lDsGwT5VbRg!{xiw|4gT0&SWU*X{f{nF6ls<%1?*ZP6B>%2d*YfI#f4@k} zfgp>@vPZz4mE~kHvCNHtyXS49IHfKJ?;Od0mcrk*)DHiJ;C(~#&-q0yol7}ZZvpRa zA(kiH1Bq6Nup@e8(31&qWPdIQ9?O>3u^j10Ly#2 zW#0H}TSe1>vZ1{I_JW9$MHTVMtF56qB8>v?&UcxVeQ1JG;I<;2kCe3PbHTsPNk3c< zD=5`ut$Iau+Tgd~>Fm^Th}*oBqoX!B!m`Dga3sg)zi5q4`gei%wEb9Zp?Pj0@!vN6 zB|y1>{D>&KM4c>(A)0&D!sFMz7iBuw|0JW_r`Ws~CGIBTm@k>E&qT+`v@O*{xu0-N zvUa@_SXb$&%jq~B!98`+e2*^+znCp#+u~q2=mi@Eu*S&AXtZ3R zk6GyDH$i{;X8c5Me<~qH55P@qtV@CIF&5Zl{7|Q@Jp*26BC8(_9)7Dq8R%2#4_wxkaF#>cwkNvkoI-YMtK1065m3@h!{Q|MunuIt5 z@v~o`Y3lO{oQX_`?2V=t@r87pnlDbrY`)Zd#Cb0|CCL5^g8D*yN&AS7^Z6Hs_+;x? z>VIL#Ru-;fL466_`z7Ws*jwe=_J#O}tz_HEOnpgrNMI_)jg8tGx#|UIYqPuM2>UB7 z5b`iWzJqHUV#RDR77ihi2VvD@*>)=|dn<`ErG7Y$N(jBG8>ZNwo`AOBX&@$HgVEOB z)uO_>S~GTONr;ExtozUneDE$dF;78z4S~&?sToT?O^9QkzJkvxHdsN}jN2$t3iWEUbGI@I{{cAR+z?PdT1Q^%Hk}oe&QV z*F`zS?~u*eHH}RBP$u&}n7;$TG5-ppo5VQZ!*sMC?R&<5pw2gKL2yyBt#!{ z@r0}Xj`$Va+4qf%L<(GvXHgE7aJ$9TsDLI^K+jLn+f4mAA-?Mp5k1F+NyV37;;C0) zZzS>rs*Hw%*g!pFZ==}~Z-Pb990fr_zZx+j2fmXKm%zmaz_xmRpAggGVpGt0Uj$Dx z5oe(9*MHm#%+>h*+OAuoB6ho_`3Pja{|x8L0>}pkN;$Ww$ZZ*1?wf{OQM`f~dt~jQ z`0^0uG|A_Y<^PC(UI%ikq2lF)xDE^S>m z(GP}=7;mmmh>9iH(Y=^#`$SkvS`pa&fJLPAXIii6)5nVSAQ zAv1wA5z-eb{e6jp{)&!yy&(z;f=T;AIwVA7sVm&6sJq{n7y{vLcm=|3K+=m`Nmm8) zQA6}Sa9>HEv?pph59c;l*X4?WNm(>xs9Zim=x^f2mHr|9e2Sk)!#WIQaD|P?Y1B&z zaVA{hY*_H6@VrVy4`^#Ei4VbF4$CaeK^!09OZvAEK0!Mcr{hfbdnF+*hbz1uCG`;< zr{)XsCEam|uW-Lb>a9%LR|Fs7OJFOBjtl2Yz{lnzIxe;^#FyGu625$VgfHpeLj0Ec z@#W)FypQ-Th4aPfxTL>D>a9%LR|Fs7OW>a-e1+?n@ag)mZzM$jH_?LshTdg3JSP#c z1DbQkAwEH0-w6J<;l9IUZR?W8P?|?Gzq^sQ@gRQa9fVzTaG0QdKW1^xLg6^9v~;>Z z$y@!#6IdebhS@?{xn|UTf}MTLOUZx7-x6ZbkL*XxgRus1_}{^@;9&4|AE+5$1Esj# zyZQZ_w*YIwi&wkRh>wrh$Vu@rU*P@K zKn%*J&j9d%=_m{?bZ0U0(&mKt;B9;u?+TjM@|t8avi_8y9q7g%xF5OK6#Cz>JFe@G z!L~WSaq@eVdM-jDi}14niZw2S{rHI7pB&3D&JTvDY(oDW1G_QBWv-Pb9qVh=J40t@PiOO6z>x8!W|o^ERgA+jZH#*+#tLGXpS@(v(U)Y;I5n+ z-&fGrl5Nr5Y8wBj)X<=(>cj+y`5RCauFW-rW@7_n~>~i$X~pTW~_QEArj~yi|3;pRR}N+ z#?K14(AS#kkF0iwnOj zmONO&IHQXSV`CJ77`vp*S{}$dy-trNKT(W|7>jPfaFIMRnB*1hBze`ZO7f&&lGnDA z&UKYg2Fnoq~^1lB714uFp?yuV7p|7vv}VDH!W_ zNq(}6g0VQ~=O=R&jI&;xpTyUhy^FE)@_hzG!RgzJd|>NW<%S+fD%su&Op zd8a?4Qp)H7`?qG~St^w#y9Da0K@$zl=_g`;RvJB;x+tzJh&`gTQNp_Qja!WYjN5Iw z(r$^-X}2QvEqa=IJdtIZCe*BJ9ULqClSN#M9tDmqo)z2Vz+X%%p_H~TlGy@8i zX_|hzu!XS@KTpDiF#L7FBx?=%%e0Pgp*K^kxA4Q9r(mF@iLQ4e)SH03n(xeQLTfO! zd9E5$n?^YuFhABaL;ZCSizlaiJ|Qz;I#Zl%IWrE2Gcla06CY1-rYN9M>Suy_ieu57G}$q#lz~>%`u{T==%LlgkXuZzz|< z{zw67tT-M;S|{Z*b8s|^V7eB;Y1MSTLFn&ecEigB`%5{`$vHg3=_!kE%XT~8JHPeB(?7A`L;T3L^HiVk2jBD}0u zJW1y-+>63-lN-(DUQ$~eDV!S5E=JR+BLCxkQWM~BV1K9ZF7P+QpFATA`K5+X3(5i8 zX??=I;je&S27QgxYAC2rR_t*~Szfo{KWA8y<*BFe75Tn1AS_Sd3!n z;cq7Y!&dS@DyzH<{O7D5oIIip)=9)zkCKt3%votANuTb;*yE5PHi1sF$%~WRr6l&Q zQg?)v=OwIHf*4*7Vl4@RcsWSuVx`~a*xvhH?Xj@0GswpFa^7@G`5wv^)z`LpMVhl) z>iTk^xhU|s+|)GGa3%Q{=f}=a1~!r(7L}Z(2tZi(3TTg>{%=4em|5z0Ftozoz06Af zK`}WJj7`q5xyn4`alT`7_2ic}*TR0M7VUh`uogm5}?LF2Mg zAEG3!TP9+P|ZdH9jDHPkcQ%d7Yv@V(f9y1enTFl&Lg{r0&S)GS$J4GFg)Y zNm%#{LhMSVpp=BQu)FneAlb-9ZM)Fz0Wf=$K~o0V5L+m}MrqC|_+4{`UomG6@yxjZ zeEUgrCckISL`<_{WX|qI6Ret)>Rb||Gv8NR>wMQlv{gu>UNkU4K>#ilAf375z2 z9Q(VH4`I|}|0Re~k9}njq#oM}Xro;A*sSwLWZTP*vCdn_FLhp8{Qrc`?LT3Q>wUPK za*a>ldvjTIX|Tp!lFmdn2Z!YJcgA33>iev-Wo4SmtnYj<^F)@<5$eNU$HZ?GevEza zvjVQV6@S1 zrTzG>*jM6%Z$?k}R>F1bqZuQyfAun4x9#!dz}wi`{yZYOjns^X;Gcv!Vz)swf8}SE zjPG$AhZ)r@@D9NAs3984@Pz?*?`p9J+IoOuN9J7`cAO{~r3hL$TJ zc_o~Ah@pAgh_f*MXw@_GoZVw{un|4u01TMBhJ`uINJS5UG1n9Ey-}Dv8iadc4J=AV z#Zt4;q?^G|GNv&0Dg5q5du15)vuSQwIyx-+jLa1&deKr92pa8af>}=i19SO+Z!`SP zD4$LF*kh39SeyNo>@Q+}E&2BtD55l(Z2)2ZU?h|39Euu94tCXOhT9B=Uz*`ojQvM5 z+&XZ$Gu&qK%h^WhZsd1n8&&WtGu%1~k~7>!FGz&0gks&RA3Wx0Bk2P%?g?`gUhMHg znad{xJ@I1hZuE-flS<`9U^v(EZ8?(ivqqI-3ZZ61kMf#(7=@wr-QbfK?Yo#e7@b6P z8deJ}kkOosm&I=DEgkUwEwC7q(|i!SVq91lOZ9(x;w@4Q$f1r>n^F{Rg1?dcQ9WP8 zD8#)^puDRcjuw|A^)fi@@!+49vaVFN5vi9n9@J76mVDktV8IjE+MFBUEZ}#@gMUleggTN+}12SHjv1uLR2B^&btT zJj4ZtQo`B{r389IX^~p@w7rDTDA{lw$^yf*!eqORM3Bv9ri*d#YSq05plXIuek~DFh%K=?ujkT{+2Hpsuxa1 zq)taWr~-?zen2V$e;xc}$0_*Ti)1e+JHCf>E-wbjj;l$*D(KoV-OX_?uJ84w$r7c@ zBP`SlQ^ehs3MA2t^_`PDDIEp%W5!#hsTJt^8cEiVi&EV%DQJPeds%)o2Y!36u;@D+ zMsz1?uabx>>0>aoPD4ty0E`oIV_OuFs2eu0!LBNuuwPKtVko7Fl3Fn!RR(`6{G_ab z?J4W=_LMcFBV}a=6l1LDKv~s6Wv%F(+(S`T4i)S6(pXcVM>MYQWZ|}$cae0z&~>71 z&PJ-Gd&9(9jToC)BM6w7uWm>hw{GkSnYyWj->sWk_`SMmAVRI1W{Pz}uCEZJrC=eb zK?e&#SersH=)6M|!TPfpFe1(P;ptL;Ju@ky<$+fHaISOf&-_5MsFQIo(y95O*3H-H zFc|D~2y{A~XfYC~84R6$h&TMU=_zh83VuaT5goDsb0h zx;u%~Ii>%1ClOk}MUCk{=uRSaJn6ulMCw1&fjfze1@0tL=N7z^$aNhwAOe5sR`jj^ z;7($9$|!Ir5lg7HmP+6+WQ0%=q8kV9MS_`k8_6i`gg2wzn)eu~6mNwO#d<<+fme`! zMZRxKo~%Fk+!>`7d^D1=f3PiHPwC5T@mBJ?TU*0?TU(%LYfJ7;5hb_9OSgyL+nXXn zZj0BE|G$1)+`3g6jY;q3BS!CJSXr47817^XuEs_b+I&=2V+(0OR-?TG{Qtsgtflm2 zH8zu9R%7XKwHj+dWva26C|QkSNBG@ptRO;GV-5NL>#H%k3e{MTqL@uaVd_2*tsuhP z^HQa#%Bm6Y54L=__Gzan>rDTxeZqqGb_r{9Zzv|Hc>v?>{-k>Ri#nLBD?9lxov>TdscleYW?Atp^o3*X*)5vPYths*rEi=jm*GZClin|FiCb)!$6SvRp1&#m-!`f0tyese0t;YN`o- zPgAWRz<+-ZXo|BCE0W|qy_$NI1-YgBO#@uoB*oHdid!GNQ#YT z7X*Bi$fn~dmGINC6b`7P06fM)0ZlSMWbaNUj;+J2%kq84D7dZpk5T-VriR3eXe@Ov z?yg11Rv=nHn`?|7_~R4C-r^pw9>W6Q6>RF$i`mR+nlpbdMvrl*R`Acx-+y7;ryRU- zzccz;cibm`V8Ebt-0wE-Q~K_>PkwjYFHr}KdQh1Gqm?Lk-0uRvJ7821;g0*{4-6PI z5&7@B9qt?V$!yz<`vhjjeH1z~?vn=Galb44|H5jlrS#o#pZxB)U#eDPEvQU2HWTHJ z``zGotFeLzciboce|!pH|`VRj{7|_MXQJ3y&u~QKNZa-Qi%_uL@yK}nz|6gbD|0{ORx}tJ^ubngB#GV!hW(N~{t4_Jw zL0fy~Y^}_CRk__kV4FJy4Dy`$Ob)T-mS4@ghBoljkd|;CF(eS-AgE z2h!|eCVhts7D7_vC+BcM6BvGwjO5)F2k;LGZC+9U9(5f7WKY-3s6MqU|aMDloO@B@!0aGNC*<6VFq$R!PRfyG;#PjUr`puhbF?8IoJ|l$qrUI- z9D&a0|2v$DOHmy(P+>Rw>wq?^xDJYmqlGwtcwINGo^Zo$0v5DiOod-wyks9}rjjoN zK>w}yW5KRfk478eTk+eO7Nz7~+-P?+%Y7*`7)+T!=TzBrp1(Em5^v`T z1aF6667LX<#VtbKA-GnH&O)VE_Jg(Gpbbsk0-_d#dy1ri{CtWedcY)Dio;hBT@67? zw?U*?=s?;?y&pbeqw3?ArH+omoxoa3Y?@gdodiPk$AqR2KHI&y4qG)uSy+2yf9n=-ci@-Jy88XPX z2BYKWVyhC;q>sSHN~L$K68o5lm|l!03Con!2z2hM?4_`houtp#ZEFe=b1w={FV(w; z?jaMG7mt+R>)k|Xy28p6tEGC52pyoL%Dg9P`Jq`sa6Z7}6_Cs~eGR6tSm<5_|W}2J3o_ zSg`lT1L_U6>Mt?0@s#s%-3y_~hgRJa2h-@)0p^=H+I$mYM()B7^KQZmHuwc!I+2kC zp5?pvFj(aFzy-f*z)R~oq{XMOZZ#jckR6UNh-hY9;|41OoDJ`qQ?jVbt9jd$wBr)jER=!+=y0ylK9 zruv`@R`x1iW#@g|Y4Kn%uUr~aPbY6}CvsaEt1O?4To}^D z8%iz=ZbR?Nh+GY&ze$RxO6sx}HQy6ITuJ-k!Go=+7nR4Wqiu0hSgRh1I-)f5CZ|>( zgx-hhr6w7E1O6siN8xWFSEYdf$m6Rp8vC3I`#322^nTXkq!oElad?UGj56sWP%be( zMt<%^N#)JRPu}02GD%4H8bXY-k|7e-y{Lsc6%K3jF6#L5X6MJYD4d+lvFYTxcCtz4 zD3Q6sPe{kIr+Mk|5vjc6(#f~mi5yd9q<5U;&9{6qQa8)SPl|Ofufk*BC_=Jf&CE~Y zvq0X(oG^Y7nTA&%UjxUM(E^Y034Yiz7W{h4P_0DudlqvyTg>sW7|JW})YN+iV~$RS zac(mFE&MIyhb4!1fpj(IFIo)lXnGfy==^@x3+-9VEA3m1R^vq%T$OnL#OLj3DMmuN z*I0P+mL)?Ztb0-M9E-tDw0F^qTJkQ=kM*eWASauv(#brUjLOTcj3iEGc^6yEb?Ml) zH6G+x%r)s`*LEVuMg|$LPA9i%k5Mhm2qd0&z141ELR16pl`*Y&jf-JL4R0P^P+?GzElkQb#5;?pUr9d+dQ>}xQO8h?U)Q95}y z$1rw!7iFIJr<8TFGKnGV7uJxm!w&VL;{^#c7%Hsj1PQa$axPHOlju5 z5ZiHvt6)4NP1(Pm4DF?0+?#U+oe-4%tr6CnN_Rme;sNGerMniS-Y1hQN7yJDgY)WZtIx6)JLDyaPAA16~8zgcsrd1eac`Yw^khs2>!0Sl|qq_qk4LMBKeBK$qIiXH~FrDg^2IX+~i*rj0Jitnf!YY+n7v7C}DZAjBh8i zQ^4w}0lb%=91#qEKNdS((G}g^NdKjarM^0lvPo~$vwp=Z^h9!CFr#<#lVw5dousd# ziYTLRivEu(iq*vxwN9xhM!(DV$yrKr{%rf?xSE4R%a*lNC00lCh50(?{fS^8d> zTCGt)9t3&=+@OHW*$3c{D z)KU}m1lwz6QEK9?M0~1eMd`Jm6(JB9TeInPpfwbO@oC zA`mNn8x(SjQb-2-X-S_g^`t_M(c=F}w#0&VY)d~Vw#2OCwR~Th22z=-a5qeCA8bp( z_L1p7)b_!N2HOXNzrB6@a+ySAF*=qt)VVA`Pg90NLet>VtsrK@LmTAjq@htS!Pjow z?QE#S7R&E)7rd1$?mzA>cs9zK4&DW4FnAZ7+yDRWg13L%puM}`zPtFe-|!FahL?t6 zApa$I!+TM2f_KBY0S52f6X=YO|M1Q|j|Raz_dM!3cf%vspq*}{MvJd@N4|uoFJ7yj z7RvjMY;Lqom@ClMRQg8E+FzL~(1bgE3+4(dl>wZAS-wLT+;UlkZI8vQpkpz8mAt6uPd|YP!7v5np8ZLHqZN<~^%O?HeS+ZA0H-M+ zm-HEcbAsS=80ODXKwhP;0eGPTvZB{&F<WcuDn|*2R|q zH`8DOG$f=Q{moaz;!>@~V80D%LSD2BkzR!YbPa&K^~=UoN5=FPPQCmG855T!XiN+S zmBFCX9<8xT85w^Q1>Ye6I!9@!6}cBr9^S*`K~(_954I)(+qNcV{heDA_dP)cFc?&T z(jke+FmymCQYUm9dZe@Ad6I~j(jz^_J<<ZtBan zV8pr=0=gH?j?=3G-4ug~KsS|9Y};;X74m;MnAJ*J_WY=z+;_!L{;+byk(+-UU{V3O z_&Itq)J*|dfCRt+3do!`z#SEkIdcJyQ$SW!9>B>8$W@XL@K6Qh4mqXghmHw?X@I9F zAQdiM2=H75WI@2{CgAH2zbAa1hE)XZhrD1HSlc7SHS zkN@&P$mcZ8$FIg!{SA|CvG{$B(^2t`{2iq4d^gyP_I8AhU9FiPBjutGkn+`#pS}ic z{4mw#4*uGjhA&Ysf_4i?+so zPyl`F*21@LjYWNJarv7d_Sb)j=sDOH58Q1!Y(C89s9Sg%wEJmyeG)zseRb z!L`lQ$JXm~Tbu}IU1Ms7uRK0BAK@#H8X`ZHOkXN9OHkTXyzvT_rDK* z9M0gco$B#zA>-G0=i%`cx+op*rZaV@Ew&Jn(9D0MpIQ}v)0#h3_tk=!;Ez(73(&N} z#kR;fOfyfzzuDRGf4a~X$DGN2#PmK@Xa3O77W5gq;%=Ji2hTce;_zD_%nk6>>}88y z12yy1^HK9l;IGuo)J3+q4i0{q`>1KQ*a+8a9*_eLMfQi|=NY(O-8FMWy)CYSBY)GS zw&;2p`;pgoNSzg|uec&2%q<{~*xMGpH&ERiI05O*#Lt~@yOthpvLZOrEZh{p zPnb0ZQeG!hr7>Bb817Yf;jB?&Ti&XS&~1|2TQF>_T9f{JE9Et8G zIR6j*`ImG4F6hhO1%3H{Eu&K%diif^H~-M7PDOk9BZ>&qW>6J0ikdA7zX*jifM8wU z4x*Jp_SQ%0R+{0 zHr09y5l(H35Y=Mo!4$11Otn`JKZy{gS`#%+b%&|8YC%vfg{hVri9qdSQ|+{ZpjyeM zTB$e$1ZpFjYNOU6#))jIg+@@UeNL~Hs3BT8r&n>Pl3pzcFTF-0-1J%S<0DP!*c{YvtBN=tTu{f7E+f`yf;WEqsn6 z_9~R7f;xSULs-}2p}hq%)wz`F0a};HfdMdYo4m+32y_`~2^H^|6T1rr>S82V4Bx(q z9gfI1$`qM#fE_y?*sT(yd2W2WyjUHul@gtbqoUCb>n zr!Qu3`dp?XWa?bb9rC&CGbP4l+RnY@b{OE!M&@p@sEX}xV7DC`SW9G~$opXd37ekY}~=`6f%8R;ihK)KEbozJ-l-NQ6& zmD~f@eHGOJ3>w{=el>oKTOi|maACYX!KjCf&%!Yw%55gNHboTfOP~GVPRUgPMC-lEnN6{B<;)R zsQqkl8(jEMuq`;i7AxVx4?s2_F&TAy0bIBNNxya&Ivmtw z>|IfN!{ND@LUIu@2fgpTaP~N4aP>?0<{zBh0zG^W&xe%STBJ7anTWXhMkKHT30wr? z-cuk{B@+0*kMp}q;5-0n9I=Zo?uX0T8EW|x)?Kb%1%FcAs9C1y;}#H}KJK|7l+oeO zAUqxZmXI&eHoS@(dNdlbTXE-O>E{V0^yNF{3H=02$(#YRdl@zo;6l5j@^*s!m%@c= z4K2}fmNOQt;j!SGP*m&|M$oyM5e+Btb(}>`Fm3dPF4VTibYvRd3IZ285w-n1baE$h z2@L{qA$p{ZaG?TZ;v*W-vu=h9;iEmqen|gj%A*NvK0=KnjMI=Vr+o!%>>&`FD5HBp zs3Agc?TQIQ{dikE57*-{&3p&{uaZCR^9wT%B2Ylj6E)TEw3bCbS^O4^o_kUct)Ddx zKQ*6c31cL_Kz$lqWH^Lh*xwdU!9{waN&L8jErt&VF%VYK4++nLi;!OC&9udR`{0>X ze6q=yQ)`Qx;Ub?Pq;xKB+QUVPes|&(j7G^5kn|WN{RTWmCxTcF;wN}^m@g%`0bSMy za4hwrYi#iZ9Lv@ddjf~Sk<@~}4{wxVf9BoMD9F_q4xTy!vqB7x|08}c9ei^#o=?YU z!y4^}QR6DOHUup3(4&*GDc|y}CjQnLGnl{Ov$oq+>f#i*+!rylz#5;!v%k3^tU!`j zj_ePYTLA-9qZmhH0doH;uu(|IY#$?={?Fl4T-(9w-`v?2g_TH+rg-OIzVQ?s6CEe8 z9y8T$)nLoV*S=Q3v;I}2)`~X&&{Rw@@Zd}CcqF|FX4&a3h*ORR^M__1O0mqqk zTpnNHe1tDkUx=>=YKR%W(iRutz3{nr{(`22e)7|JyY892ZE?vOO~kQHx*P5-EP{(? zYv$Pqd=@UA+o50X3De5PT!kd)T|9Wkvm<|2>-kQfOm{r-p~)N2p?r*IZz>|qIF{`O z5=-8;y(9DR@57F(h#V2X^wX`#7g(vQe6bz6L|d^^SF!9*G&)WqVjp9L{*9D^7Rh#GVOl;EKTm&(r_O3M)$eRdo5P?+R^@r<%m!hL!CbVL^P;1?FErI} z)Yo7m`Vd>>^?-F=iIuK}Wo;hrni+jBvBec|LX*eXHmE`Yn$wS5!?X6ItV8M!WG!;uxBD@MOHx=_dP@<2-<YkK3_X1(7?DfC?6uA zX`<*@Wb1;Q6F!4uU4z)KtJzam?0w)NAvlkbm)Kt!^ z@bzWm>Iz%D0SD!1J|#L|$Tsrc)x^1Qg;$24>V_RKldU_)DgAT^tyLe5w`Y)56!tg6 zPawZWJZW0EmzfS92~}6lma49Ss%t^8s5I*VFq-9G10B7K@JraT ztfw;VYnDb%f+B8`jhoWT-Ov^HQT!O|B{m#;vwxPHq?OzciiLG79x8Z9f^<@)u-fcz zjSqlD_^MrWSP*pHNViWp?g@}E!_4lX;brK8K$MJ3g!{u^dL;a}Feg#6 zM2oTL`eG6qGetO8bQQ~p9+jM^Llzx>;fJv#uRE{G-&UALjFXMHG& zZ5(z%Ts#F=co*gmTS-(R;;3iP?Ek#=akesPl}+A7d;p6AmT(xx2p{nQMgW$hYcRye zrV?`Le>diBJJLLC5e+rt2EhmxfMn=#f@p{{CS#Vi9ca&yF{6Aq!@aWNPWl;Ga*bmzY`#U_U ze{1sE8Xh&TU+I_j{LwIM#gP^62E$vpJwzodocY@bxi2;an&D(VqKZ5iTV>`oP!wl# zqh@YDMh1VZnJ=Nsn7>*RB~8B`SK`V859i@6MpH0{EGf~=h%@#^;L-RYDESBlK7^YLcH;u4U!Q~?R;ylgE%q+^!T$pIKN`qk-XSt)Wm3?9)^V4~DP4w?+>2HWoD#O{$5Nk#9}+45 z8B5EplZiV?a5Vi$Z2Z_2G63=;*J()mW;mo{y;_g6Z88)|aoW)jP_kVmhi*wnp7Zy7O_<2skNJ12h>?w?Q-U^A%8$%+0 z7ntI;4Te|;mp_OM>Ph5moP_a;wfL9?XcP3QZ^n=D4DivoS<`tgcej)FB>l@hwqrTZ z`!M}KlJwsavF1?LG8Fq!gzaQ41lTOWVFWf=R+y$IEtn;Dp05}1{G{|So}cht*>5E` zRhxTP)`!WvvMMI;$|44~!LZ$D8rbz33YUMqW_HC4yb3NKyKNo#ok@v#%Rn5og3Ete z%c?lrv71duQ>zYLFVlN2G_p4)U640_jTIV$`A!}AZzu{s41Y8Hp_BB!*|&ozodx2) z5bo}W@|Iz;4Kn`*E4(X=r4jyAg_aZUjsW}cu!!`={Ja3RRtW+jCD|5;S`c=gPRrQn zTx44!7Y88#sX-dO9yY5&VkIo+G|0(ieIYg;5q6Y;Wb64aS|Y1T0;p7!>K<@Mu_DiZ znk8&Nb}(y}u*H$Xk+2lY4o|`=5T1l}AXEwGw~^313pb}W!sS1w{VV*a@nKtFwR|s) zEY!%uN_BNzt|*#>Ro8DIWM{r%s4Y%LA6RrVlKHv`WoPS+T~k?eKQ|n zfNvV{U4)Q*-AJd>Wc~!|Ea?4@#&JVzQIDm4x2fn?(1A4J{W#xDN5?V)9sC8zI*I$K zBjJ7pA@tMn*)e?)eoXr)Tf7cWzeA8Mts!)N4fG_yx8Vj{zeAC$;Qe)H02wz5LLG%0 zW8du)7TaWzPzZk=o00k_^z$B0d+VRWXKcaGn-}9m+VCu!z-{HOPX|8nI1RwY>8uLAWmerD|h&ncw(rZW7{ z7-hZ;jOG79GcUyEI2Y_|O{AKxbb7Zix)QB=n;WGVUxh5xXVn=vD)hA#O2OYi{!?;8 z$C_B$lK-0GP%FB$(uMe*$_6Vu4R{s&;WI)-A$k*79S8IaeTfVj;m`Zh;sZFFWR6%g ziCz^JpYm}r?&|534}BClc9kO<5(cC5f~(L{Y!l%Ug%bwnOW%8!S60~o8b2r zx(CXXC`)&tJ5$Bvd7-%y%OO6w&=qINg>GmYXrTg>d1E~E3e;Oe{?l@^=VP%~4?i!_ zMWh=2^~u*bqC=@T>f1lMdjPXXp)Zdd3-oNsN&M!MU86GsnEgC9FC&YA-Yhw(5a#N1 z^t1rxq)Fc_sFIw}AwGpQAQD4us95h_T_aR0D(2RXi_sF;tsNJm%@Wor)y`CzNv3vU z<&fxxtDTaQ>6j z|4kB$5%x_wa-)Kgpfn5nTRg+Z7-nJJ1DG=li#-PTPclhnMa#wG}mcWDBT zS)!%6dlBbmx|d4$-R`9pey@A^vrLF8-R)lPml$_BvU_=2Vl)YJyO#z^bQDD6Bc9Em z%r2Pp(UDPco^!;L5Asf0?g&f2-a*$Q^Tndl%@kUPpKhCy+^Oq7lNdJW|W=XOU&fRdY!;qdNGP)t1t z?4yQ?;BO}Xr-=w{qi&LMsk1J*$>v?uA0q>5#dER~$p>2s31L*j8t^pe}kV)&4!A7jJAw4e$b8un4S!d!t08F>KC zb-|fyQ6V)liF=W*R$YL_ll9SHA*M?hy^}CE-~nu^5En!)!n_F}RmdDg2CqU?FjFB% zOIFkv)tx1*TVRQ`63vpSMlTJ3;TaLCI}*!YjJn&1=Z8t0hCoCX#|3@%p@JE4u5VYI z8w07bI4bCfV|@d0{w#TSB+=i-v%Dmh3vzj$M^{3&=mXgnE&BMx$1(wy_8l!hN}s7v zK^}K4`uaqx%Gv_f;{zaf$rgQnVzbKno|YY@4^^ljvu0x=E-Fc(?`cKC_!t(^2X~>( z4`CwP!_%LL*I**0H#mm-97?HG-;XvMwqPf<6!lBZVta9UXc1|CgvSd=6D~*=PxcZf zdugO-Xt>$ba9coRDx{yx$ZsDN67|`K3QGGR+qKU};-5;Hc9s!oa_8Bw3%aSX(YT<` zXjCvG<1X#WIJ!L-tsH4_qjN!@ zm8)Q;h&4N#0-$51uLFHeWz7Za+5qTSDUC5Ll9l$o%mRG9 zi44L8c|PoRWpz%Gol0p0k&*a)nTWqqK9Q)eQdCe@$~O@1JITwdyiR)8=tlvNB@UNh zM$i&0cqA<6=}7?##x;h})gns2G=vXEvQ>ic|t` zW-~y7wD`fyh8edHGSYlyR|#_7a=zkXG*@ya%ECGujd35z%gcpsdJpR_XhJHOySvfV zx)ZTfkRKP?0}~V#l#dG)Vls1(OchgcVRqB|Tg{kPs~`>;Symdts9^cDm=&QsG}wb$gEFbnBKf z9fGt=>yc@9y+`QPGPG+Dm@r#(@ZdoiVIVl^00L)TM-1-4gGbxRT*We(KOs5Y`7IUM zcw{DyiNl#cVNS9Xw<*@bnU{db#uEp7!kJ%y_#@7BUJPgc5yUQ7jx2yP@1^AkJv6FQ zmuu{SAKsYi#&;R$8!mbrX&Z(3;edm%dsu+uoV=BF9QG>pi8$D4OvBGgIP-RFOI|k@ zd-rhWwIDu%028r1HLn0M8YfN98G&QB=Yu%o6q)8&5FcQ7kkgz&TbVQsHwtQH_$d%Z zx9}K+k;D&keE~79JyGrzZZR~w{%NNbXQN`Y>OQy0s1F&|lKrtKB18K?Vdld|x9AsG zM7bb0o>TOcbt1q<$;mzXDd^ZvsPu!8&-6|_E(JJyI-R(T?wkETAVHGQoBgX`rb~QS zviiHkMV}8%cpL zN|tjZ3(ge@lUSk`qxZi>qLT=H+2|3TiFEB75bqVEXLt;VN)UN(>Y8;O*wd?>%&GUt zn~qlw9g5LL1$kd)KbWoy5P{!Yp;?F{RxgCk#CqWwX^Y+nqwvI-kD#(e> zM4}H$PO1PohB+mzbtHC_@r2~!M#;)J4p}!4%X*_57pg@q)OXLdQz#Ym3gv?SLWS2j z@wZhARUtuNp;XW-)F8>(rck9fLgH7APF%yIBo`(pPW4$-!_y>+UI%MP$vQ)Vyhlpq zXVw&*u*8K;7h%33jUp{Uj?YFxcP{E=0?-=SL4S_Fqhw`pqmj!}RZ1{pcgLKJv5N$M z+sMs+3hCAnk!uu(sS|BD-2WrXs^IcN%V`n{ZI+QYjt%p58u-5ObK## z=59}^V5ZfbBU$~e?mRUCw?9-tf2+Gvvh!jgUzYw_3DS(jX;O2b-CNa^iFF@T#O)H~ zd2PywN9Tj{z5pm~nF{}o%wnBn$talA*g!1r8p&)LgPI*>Ib%s6vifyhs3zd*S_S>O?yr{N18J$-Nid@bvVUxDCvN0c_X0ggB;rK@fv%t({`pK9woPi&nx#VGDA@qAOk+G|8 za+=dVNESyzu;9D_&OC!}@`-90%3aVRy_@x9Kj8zz%R^Rl3PwVgla$-{Vxu5B9pF?M zovfwrC5D9q19~O)1trYOv$J(8dp4@Sk!Fn`up11ywx@~P3SF}sCGQGItW|#n*#_N& zprv~F8ccm#DAI*`moRVUECaC_i*H($RS|)W$S|$O>i$3O-UGajB54<%nUi%C&XFt! z$w8JAHV(3lF&K)^BigV?dt04>gwv6o}L*>pu_k&a;b2nc84K|1|u`*5K`9+ zo)wfFT^NFB(3k;>(MC1f#hc(7qiY*Dus9ZU#L-|RPD0A_I1SfBbAmDhYn2)_;_%{4 zrO-k_(c;Z?&A=|+XfRs5*{#TyNp%VJtoJV%q-#TyMWDKFlfE2OMuTD&Q`4t={& zPDRwk_G~g zkD{`A+#wT`r^t(gyq9Yd;msg89s}ThH3(|v8kO)MXrP201TB=XgP@%fb`YE(9389E zU}SZ(h14AcrwHl{0u8D`&_y-dL2!!{bOwP19dR@miF3P@cLzbcpw1xBpc({^3av8; zzSj)wAkbhm2$I(stK+)tAkbhm2-el4b`WSV8U#~>)Exwy3+fJnn)9JhYp>4>i8}~x z5i}eGTVN2pDWEe5dI;zYf_?%NmGB^Fp@ba-9h9(xz`FnmI|xPz zNA5@)d}%PUx;i0s2f;W&S)bPRYETV=I;zFp z4XQzKgwU=D*Ap(|U#}V1L7>5C5Zt9n?I6%#GzdP^q;?Q!Fd7732&p>=ei76i1Wlw+ zI|z=x!5D`-2(}kA90WUI5S${QGYB4&Dx5*^jDXP~xEPjOEak&Na83be2EoS|1QkLW z4uVDKa0`Zm;AVh>gfbcg!w_wc5R@BEGeKFKAQe0aZomNekp@9q5G#6OIHnHC<~5hQ zf_%~Q0KXNGDvaM3^eH-{2d=blGz#O$?!llo)ekXPE2;FspeB_YiJ2COp3yX%Rml&}Z2~?H$PaNP5#4#Yc`4LT zogD@d>Tyo*wxVL4XvwC+hxPFgTJj0NO9W(3@hFrOI}Q)^--aIrkg;~0d@qSyhtPI` zBR++DEnbs}UwmnhX-CyIml_#=26Oza1)%9!iX1)`Mr<0-1$Z`RSOLfvtj~Z|?r%oZ z^f&%eFs|sK0+4sAnrmAjMOS$7cOd|At<+$68N8XGY_Kl`J($!1`O0C@Hi&+Ol#Swb z34P{hu5U?I4#?$iM)@`&g)+Q&XHe20l7h1l>1GD9kG+#g-i98bijH%;BLBpxzRg8)1n@rD;>yCec zk+ie`jJ(EJA!V*Bf)cLE0lBJ~sA^*&WmgB%?BM{t3t~_lvZ1iGbnCU(sJ6+8bJ>Am#Flh3#-ssqK>I1gs&Dn&!nu9wOV6 zj)SA$6N#(vix=Y_h-GDd*Nq2R0}oTdZ;QPbv%>>9S>D2l*Bq*InZD< z+=d9L>!F4T>Uby(Di75`GFlHcK?)9{nyrVjAor^EP!@D#)L29<}pS!l4DHQF;?r0qFYVV+A|EqL`%RRvOZzQIgiHJFCdb?ntQW&!)3v6* zp@2NtZ9JpF$n>WPsp~B^)eP+9tU+V?ke{9AAB3E>ZI|}<6fn~EGtl-yf^ydp>Dsv1 zI8uYOwEsFNPZW?FLEveyj8g>UA%$BaBEarqdyd!NN5IJIuK?Sl1!cD6^{G#e7w~Yj z2)DuW8R{DcL?2~IfG*QV=3Y$A#j3*^C}BHnHWFcnwV52#VXab?(_xFWP`1M~7hLZ?xDb!tpKt|u2j@g&4s zO?WZM?WQ1G!sYRSY@go=$d+(Ld>{uu4oD)TXuoI^F>8$v9!1s!oT7>N^;^6q3^A}BMk13-gD z9KID%F0^ZtLhNL{nPy-oYYj$|^$wcUPSzTXChLndshzAf7){m-gp|i5T~5gO+5Zk| zliYQNWwP-eEMVx{*v|J67QAi7k{&K#crTl8X4L!zUGmrXNanVcaAW21EPG%J?pp}T z*ZCmzvN4RR1}ccr#xvGzO4u2zjS|)Yb|Mivz}!O4F%Ix>F&xJM9<8m(IzSCZ{eS#Q z&GAId!1lieT?crckYhQ@i`yCNLIFcf73I+2D+RSPmRH^`ia8I3@m$Vvo|nB8PN|++ zX>Zdvn}nImTTT1TZTb!*Ld|%WD9v;UUq>@v3+T+{8jLjaoshZ%^#{$sYDR;uW{U1K z=H^TdWdcT1LqBMyN>CP!l(-Qz*I&SJY8U~^p_-DWhO#C>E@T}}yguh0iyu4q>!Hg! z(u>t)lSvp|wit~WUA7|;>axq^7%OWL{*Ep$&|+9C(_o~_`9kXIa)D-Gb*VvDm)8lo zqsyBFjC45>8oEbwCS9&u?|JtN$gYxRxD7$ML{qXZy}L}8{grk3DD;@VL3DW+bXjw$ z(q)557+ub$gdMSMNQAoVG&x3>b;94#i?SPT}k5@I76ma z8v*&E6Clq~KL`kemV4v$G~RK7_9wJ|%sh=}K}7qwKOs-!ohp<($5~x#Fw*rILdqJU z!v_TAez85SLDS=W zFLE}?XhXwgQm}@UVnagaq1$fv7~UMZnQQb11;U8+ z;s?l+!^rnE=`8q9s^A}mq#Q;zQ?;XGRZKEo8qd}ghLPohvMeCYyoDjW(cg`L zY{nB~HAT-Bfa#5CPYX5jK_TVAwT)~vTP$EGIA8pIBxoOMJWT)z4NQx!LSs%-GA z5il&zq#Fy0HD@orVQetBYBK@(hB>v0Np}^LFZ?zT(me#^JDWt>n;LMCpzJk0=IKDJ zDY{#BqONJ9SS?qyNI-7>G->{g0*2yq^Op$9LG5&D{>QrfX43qxyOpQAZ9UtKrkLyI zu|8b?8UnK4-9pMw7BFlmlPbV|`gw z^9AHS4b?wgMg&h0O=6;33K&fh#PyGYa#eeZRC5FjrOI5pKbGbMWygOMCZ0#IBJiSs zeEHmpPUWH3N``NSUWXle*wQF^p@(h!#<`g6UZzOwIP?6&wvs!D+IM`cn4f>JAX|rh z{$UrPWKANt;O8GSNI?eQt2~X;ya8*KsksqBYq;9aWpP-A}QV&v5+;SqZ?Chh#X!glzQak%- zFq(b(Yf?M=XfT?61_~)#1K;PQVKq!pHc@ml57vmG)YnC(UAWJPAP>ZC!Uj zYvLLVOc&R5ik^nN!Jnv>_cx9A39mU$cK`s z&AP5O;d+dK?tHPOv}!O}cB_!?Bw)1jiMXC7C{MSGL;wd2r-n;~l$&*)aJ@pns99u~ z?Sc*<0p`Yfuwgo&HB1eLhN;2O_gav<9zp&l~sl6uX*+)oOwI7RW4-n8* z?Oy~PO{)C@9Y)VtSdh)Y&UIG{CC~a+-x>_{t-(;=7Ub~E>ic@($!)S1dm4=NeUp&7 z`o3K=uwGk(p}u*1d@AHTK30f%ekq_kK1MxidVqC!tLSi?fRPT#=w}JaF7^)LdZd6Z z*9!#YD}=j*>m>s6&DU^z+$Jb@!sWu%0YlPfg_H&OQb=DD&=sJEJc7p>xKP5xJ_5R= zlLTcAED)|!1dKF50ohDJc`(J}CLo(7AP*)A$hZs6(tgLf*13g#hXe9U1?4!|1mq4x z?f3cw$A+6a@R;k#NIi@nHvRg2YVb6R?DxQikJcroNB6@7i5IZqp;vn3C0-Ke$3SnA z+|_9yl*UcaXF+Em{9P#78`*)N!EhjGFdPULWEW`%!o$Lob!7*F2BU%Sn2@>y;VD6# zc~*nrKuDc%9M)~=X`=FY2|ps!LV<~ln+Aye&0!#pv=HJ77ZG4 zcroG|pGFJxR~Oloo(y zFUfZpY5NK(dn0-d=6>{|1<6P9b1+K)9xasQBh7O#_fEr`W(4Kd(C%j*%0G)K@d)b` zH*u^3+EJ^)aMWrrjAJe6j4us_bj6Fy^Xw3E!J) zqJ+Jl(qa;3{kokJkeeSN?Lva&<ZlM+^HgEKHpuAdfRPE4nu|M^NrTBBgs%^E62JQ|R8*B?Tb1P3N9A zW9)mrjDH0lz2D#9(QD&Hb5US5$>pXDiudNVm!8jd3=|)SV`d)eLM$ zYB21`DvE3x$h6G7y+BH`I!44zpE_U|jyx=+tj=LV`lNu7@lyq}se)1H8?unsMB{7= zq2swnP!5Gb%HwMv0a>}W{J{c7SG82dxq|XgTthnd0s%v5U`!oi8E`Rv<0u#sy{jWW zDb81)!zGumKG%Uyp@&8-=v;k{6-sveb}H9k)JJOwX*l(G?4vialF)oIIc{#Yyel9_ zV*puW9|;&mV|2N6qM*Dyx_#VSE;*p}e;N$UQG=m5TF_3Po@ntHOx8 z)ujVkb!jkEmj*+1SqgK+w|N@3hpOhLBZU0D0sFMylZ6zA6$9CdMbFn6zuW5 zsgXy#6}6v$;d+B{ORtGa*d+cCH*3-F3CIBeyQS4|S|yETFTGd1XJ$|6Xn=qeSESBJ z^e&<=Z)-5VS9}n5kWK)Dp+d{scJ_|x+<%k~b4D(iI!?EOpy_>`_D+;;maY`AyqR?Ly&q_7Ao1;7Ebn(*{7IqK|`@Saq zlaPM4QqqI94w{AZ=t3PZ*Q*8P&O0&Qhke=&D<$<`FgC&C`Ap$jBp_djgxXp|P`(=e zvuJCwF3+TNTly+N*{J5>^JL`Jn@Ml>cJy^Z;mo)ifh@x8;jQVh)0C zlL6N#AekHY4U--!C{IzliV+_tAO`?p(#-V_@D5Vqo}e$V;ZNANe$S&cft*3q@jokEiH`ymdr)FD6aWd6STG zr`s3vT98{{b#FmdmYqp882QVY!Zeym`Nh0VRB`xXUL^3IF@BBRB|=XfZ(n0~m0)B| zc#R#ubMAV}j$a>ZoL_77% zbMZ1Zhz22b48nqrL0Hf+2n|LC(I`v{45CXLM9qznL7XS_+8`DPrVZjU!5o8FA7*{6 zWb8@`p{D(ap>T(Q9B{1e_sI+{05g{%yh}qz_b9%>kks&^L!nX)W^PEW1J*_Bp+)x# z@ldL3f4@8vL*Kq9V2uH*idKM9gM-Fp(UR16=OC^}%j3_((R?=?PaD6g92K4jPTh=j z3sKx1^h|CAv*<*kbY@j51rx0Mn|a_iwI>oyNR*BBOG=UmfmVm;P;rJHD&9>fpwsB#VhdIPv=0|+EPS}wf^_{GK3sf& zu%xQPhl?GMA1+SQ!^MXRZ4K8{T|^HVYs@}u+!rmJF0|ae^ssRp;I7hawp@DHnAb87 z6O_k`$KK*-fp~c{bj6noIt2BT9Wm+E0+LW>w0Xf{`{8{(C*se2_{BHJTmNFa;vIh% z;1@sC_v1UBm-F5-FHsNp|5NzFD!g>J)si2;bwuhzJf?hlIwToA9gM+Yjh}eCA{$aP2-2@;2}^-v)VMBY`i)_dx2- zHTLu;Sef7W_#z`@?f%Il24UaLK`F2Hu&U&?a9s@t^I+%CTei`;eY>RBjD&r=s z9sRYhE!7x17@is0g_7)DW`^X+sIvj=Y7g&|Tsjz6x5OH6wxri-E)jYf4fI+~{^IQG@?){I@pz33_FgL(o@s@? zb?M%>;*R7T*sTULUu61bdZG#qh98sEAb(5}LU_qJXnZG$xKH2Y?ofE{5Yu>it>+{W zmkcNTuBZjc6@(pNLH4imNmPwR9Z)YkX@Nu3l>QE?*<5haY3)9>nH$kyjpcs`hGkAh zrUv;XuRlW)4Vss{ruRda%@C%~G1C#5T?(*4KNe+DvjNtl)q^g{RHmk*$7WOFyP_V+ z12M+ik*M8gjqDHP!w$u#5_CyK3*}AYejQN7mWvuP>W>jb$20Z_L==xSbwYLpTzKW@? z6X(?RH0{+Kg>yUIr7kdCPeD-lHt9+MDa%f|8jHHVN+^}bPriV<8&F5>?E{mSL$$N1 zK6#n+1wv0(L!tRukQ`uWeimfTGV5q8l40RWWOx!Xw2=&FPfyN+4BpYE{WSA6(77GJ zEtIeWxE%>QfV*%W)iFux&?dey>~V$Q8=;EYvo|U_6$WClI$&htMK5ApO_*o&%*{DI zKH5uu3K46Lfrx(^kW3AMnsDB4a;E4wP&WuQjlF)$@omSUAm}85<^Dkaj7`n4NXTbw zc2Kh=i%-59W>Oc85WN0H9&K#1w2{LpU8Q9O&9S3=A z-S>#Q0Pd=ibUIgu63jclTG+sKziL$u-%D%gT#P_~yf7Ag20Db5bsC^&r%)bXXl zYcKATz8bP?4C={@MiVp^&axUbO-eUGT@@Fi01leIYA;y;4gQQ3jXSmu)chAVXl3- z#i%WzFF!yCDdMue{3u;meEI2uIldefiZ4&T3vbYhbnT*{nQEL5zR0MIUX4zR<7p55 ztiiG$66p^S+iDCSd@Fvf02@+9J?s_lit;tWl&qunilN2FfOb2(cpvEE>xLA0qpr+(Wj6LsUQp2$1ZWtbQ zd|t<&+-t%)T{`k7_gW~ixjzhY?+3ZtiSE#W$#%H!E}WCx6oefpYY!ZE*KsDTv-g-z>n{PcQ4ZSE^4=dYd6^w|7fx+ z_w>E^v;{eDHhz^q`vLurk6tLbzhLof#3eazU;HXdeZR6pR`&ji+VOHIEM3zQTIDXu zzhfrp!g6Kh?mhW~j?0A*FvnlnCD@Wsa}#D`3dVMU7S?&4l!-PNiqT$rD!OE$psNF| z+@m`EE=)~h=sKQl8^9_wHA_I1g|qE7!b!)j8jHHDO(>yp+hyq|!0U0rsVgh@9GIy@ ztf4WU8Sg`;26<*Y2{WSxWoGP$&U#sxwlUM;nOp(JGvfk`kJ)G;&y43>0Sl%?I5T=} zYG$lM!p@AJ2y;C%T8y+E&WuHG80FJAv_7FyFzpit3#MnrCRAu=#x2lgEl5}HSCRZ0 z=j}MRqw9}Sb~Ne;FLf-)ml^iMIdg=PWU`}6V^LSl6-w1r$z7nIE|TG(>f{UPwuYNA zswVVIr3XTZIOq7U6{g>YM7TQfj&P!-w{UergP}jxpz+6WEAOD9PO4~PK2?c|a<{08 z>X8Uz%Vs3P*s>J~V$5-C2NITH`g1T$ylHxc_RZ9;lh4$GvBtvnB@KoxDwERW5yBQ} zFl>nXwl?svJ0cG4(Hav*9dF)+-THU(79r?Aa{^lL})DP$`Qg-cjexY zp^0QzGn@PwGPEcerU*TmVmR_GNKPai`4-eNXe^Rpqm{^T2xMp{875_uMT1~kN`~!( zo~yI5z6Gf|l7ZLRG-%h^enJ-?DICZv)oxIlsfAC`7=LQ(Nn~n}eaboTDH;@?G6Z)h zju)oj52igc6JY`xE6?LQp5Mc^G)T9-(jy8ehi#n6P*7nB$rsQ9EHAKHkZv=QC&^4e zlTTMFBzKkG5-c@H-`bjmA*!)KqqAg6IMP=kw7Ecd>;Ry4dav{@n2)vkDn1nnJ2u4E&i#WWr{ET4Koh9`H(sbieWAyRlx6l_3hL0z|3nm&f zA5Zp5&Ou{pZWEW8ejUv{>1`4gZO5;6_fhE=@Lyx)ht{R{E5L%2GU-oHtEMYnyMIv^ zYSmcwBYbBZN4gaXZqXHOUY4OHc8yWIRP+$$Vhd86C2qO}f;K?x+U?92lxO1{{lF`u z%Z0C2?-v>q_5Lgv#WZ$}tSwXpNpq`~u%RCdW3f<}bO|UQ5lT{B?bhW*UIE72#?$+u zF^>x+b!zQ4<(Xq(d`ktRVaHc&!%)0Kv)pD#QB?uPd&Xf^M}p~ycTAr#)9v~vPef4A zN$T0DJe9+F?soHzz3eQ6X!Vrf&@6dB)YyzbR3v*1Lc4KpXSSWC-PEt)tYSgZR_M`p6G}L2 z8zm;s0_P^;yn01)FgUj;&Zn=8vjrW_XLaYC9tXGHE;!A2@%4IUj)IUHW4E5bFwr2p z_5BMdty{N*WKf}7x1cq>%v7*^RO)6*a_c*Tr3T5Z&xa9dOu6+z(*&G3B zVgX@#3_AG%!Ke-K?bj}9DZn_2;A&nL$_Ph;Iq2xdGKw3&_x; zc3Letb`VP6&4$SrIQ4XHLyRq?Ae0(~Iok_Jwq&DbjYVP39zuzJwWiyf^z+qwrh|q7 zk9#b)13^8>ze2`l$Pyn{kz5Zlwi+4vtCS<&HRYYbV?oEnM+>DIJYI1fnzN&15TnXd zbLn+~?I#$CTX|YV<~rDo#@KGQF95@Pk(x3zCJlzhq`}abG-!>R1BqoPjs=2|McP}J*9Zn#!U?(od~kWkvCvF05FKz?jCzb_Dom(X z)8#6P@eTg#psIFC;Bqy4ClcP@G0ph?5S-ztp8YT@$bCgowYo#Zfu#R@{2Zu5ug2mVNK(GR5IvY zwB2f+_q>3Z1qm$8*5LB0j%3=}?^9HP#NrQ4G5T9M%^zO019(jna4dlv`;|qzgV!+v zT3%RAq0gSuZ4^Gp=KaPx*(6lCEB5D?t|c+E#f0CJRm<5o9I zt7uc4_bP&txOX~wElo+UuXh{rC*sZH18$*-!5noDq`aWVWl1l1Vj_fkz23ZUfir0s z`Hkhb<-DGaDbKI-g59vOiBLZ10@!cdSF(d`yx`B+rxa#W2m6ifDtpXee0tTC#q7-4 zeQr0*sq{V7@hICcKSE{yvJ@*$wlvwI-}sEm-fUx4H_>60>5ho`R?A{hX_Gx$WpB8d zDs4LBRh9kLMk?Es9)D-V{HnuMwvqfCmHphY-5U0h%HAE_5jM<}Uhl4mc^~Q=vf+@1 z`rL24SkXBBVl?|tl})x1mNwb@+#S_G+ttEs8u=I?D*M$6CBDg?bWc>ec9JS>#9ySc z9h-pb0rRrIN2OO{6Gy6S$0pY2(w!>Xv58vF-ss+lxznrA0qVX=WjnoU)KYX`RNCoP z!~8In?eyvhX8wxG-ey~+7I*;EJ@x*Gxzp)2Ml_YZ`udruOHAEm4@9L8&?aLfKf-1o z=>_Y3Q52O%_n_{#RQ6?es17wso!&0YQTm1@D%*_WyHxf)BUQtUX#F3INp+N0Qy zj~e{-8&5~}L-@spmAZy(w6?^Sh7Ta87n-86mWdBV?RMCi^Cp?U+si^cx-6cO%WuK+9P2KOP?60!fNG(QdTjLWaG!4^Cd4BiO52@_Wp~z6F zrpLxT9hDxA04mHj%r8;dxBo%89y5qC&qSsFsF@q@aF)tGeI3QzOjKS+RC?c$N^7R> zW|e)3ZkW;eJ1YCxp-ME9z1^~i`PJP^Kc=#8>7G6L*{Jk=I@@&UBP#m|oo&L8HJ^)0 zA3g(DI&cbnm=3*4Wk07&8_9b=AC;ayN~y*4*cmGOOni)7-Lp4)F)B?Tulpwb1z4w*VNf0gx`3w z%ATsTjn=-l*_g*R*V)EW_kKl~BfC*&k7MS`RQ4X-vp0A(Dm_bQ8|JsG?4xzIF^3Va zMWs*G*+!`s+3cB!qjk0!B^9qnr7zamMyV&-Y?NN4vkmj~8&T<-kR9Agf9|9|_v25Z z1)(<`G;#Zl$AUWjCc1rZKb*-;P7dg0l+zsLn0~qUgPb=V-#Ce1S(wuR^bN|nwlL>C zpof2ioExJYQ_qP&Oa6hJn+tP#0=<%QZpS4OU9E(+X*!|TC(=^5NhfGtpPM#cWjnEk z(NoV)qtZ?=VM?E`vYlYUlQJKmnABDZi_MwBl+ZaqS9N<@5cN_mHne$*)XEj zz8jTp(IJ)T@(Wb<-D@l6rgY}LsPtd(L~qzIGrccV*>(Eb-;^HxepGtmLnKc=#O(%HrUC;S+dPTi&?H=4RiWmoqoFKE7LU9X>1^H-)&Bgj05%o}tx z+06T}7Q4FlEeNtj3GWE*Y4fKcmG*)wan29=1#~fH77PJlc@X|{5gteVU<}S)Psdv& z3OIywK0(gpw@N7|F$f!0Z2&my~HzEowOhpn!VV|*{Z}4tZiG6s)~&(8kKw# zbvfY6akM=#B*149h3iI!K_)R7;KKs0K~=S9GO0VUs@w1+w&ooj^h{q2^JqaLF|tSI zZDhPB)Kpz!i(#4Pkndo#CM0VRS7=#K;a z2+57;EeEsGdpYQ*+!7~V$v-RpY*8es7d(Q#&Nly&GkhP&U?_is8iHT&Cws*|bKZv7 zUX?ryPq})*xqrd5HEk-E<+sKkS{TpV=a~{D=kpDPU zl-mnX75;36pFiC9X|CpDCjR=3T@bnKuS)LWfQu#%bqhHhvX`~Syk+?L<9*-F*}H$< zTZEtAfJa~Xu~xbk;G+b8{l?d~&3naLz>*i2y*62L@Q*{yB^fWI#_R;@HMYxpOGgBr z|8!Zi=_4+}*B8$y>Rp)nY*1gd4R}A6{|LNuOJFLGXHq}nydLMdAX}Q+9Al!H5@+J6 zflAcUibQOiOeQ}CIUPv!nAj^d4(Hxe$e5SPq{`qw>L@WMR-OuwXhtF!?B|m!FqZ5= z;svw(>f`~m9ZwD#1^|cRU-EOBP2}Lwcu}e$`7jMuIe6S&lqyf|NVUsB>)){pQ@te_ zH2ndcett~U@_?_;QP;c`SfD-#))Y)9o4X%2w|_l`($9gPy%YUXJ0NcoPEOYbdGE3H z4Vf1lh2q(#+X^*9NK?2jUJstnw80_}dqhaZ`RlP^&1SUli<%0ZGi1&Qq@`czG(Q8}hy^V`834P(mx}2Qe+vL3_{E$=X z^)n4YFo!ZEd4eRiFby+mMuH^o22u+OLDLf9>a-*wpwki!+Ln~o2&GXi$&;e`+qC97 zwdMw|tiF*et51VcUv^E5r9U5I8X9(Me>BZ+oDDVg!%PGnB>z4TkQ_96Sugj}GKn0a zvWC%2SqK((X6bYB{Hi)LbkL+=zj0g!-9mk14^kml&wV9m2y$N)g4|byV4+OEZeYQ{ zJ?(JLB#mz<{{iFYw&fGL=hpZZ!umdtq8V^%^zT8Xvk%ax*G1%Agr!Dhd4#8hy z4#stG-|g7o@d*CVN$qgI_#6Bmg*!;KYxo-Xf_@3i1MRhF1)0>`c>j^8`;h+ zfaU`lwIqE#Q59hy|SYz`r!lQ$QTUpnTe%d*_~mAiJrDY#u-#%w}Oo80j{wYO6-RE zI4Gi3p6pY5cwP@!V&zhF^}=Uk-iP>AcEUWq#mW0`;H?=?!K8jq&H@yEml(Vc22MRr z;`gw27)*OS?Jc}A?p0oefp9(&w;zx8)T1vPGM(@Oy4cTNv|h@42fzGtApR$=pRQXM ziK$5Jw|?N=iC=yS)DoYX^0vY+{|#~utWSBDO+jKcgqOT&AiLYfdGC7s@`uE!GmnBg zvyB+j?Kr78pveFC6RSby;F!8pO1MxUyl31QbOv1Bwqm1 z6E^82jvt0$iXY{8+5IftLuj>=SUMB~6F=gaU2F@141rM-oWMwI2j#&K97!>F)k)aJ zI=_e4>o$x$EJq`m{WF+vh^;fdZh|?iI`KJ}zu$x}V;&2#VOVoI5WimW!o*2H@28yA zs0J@MeH#8uqfUJk_1yeo%Q-3S08xCUnS865ks+*e~7$Zt)EKMrQruGm-fuek1d% zK7SG(^r&T^*~%~O55K${ej|Ik=l>#4nJ~z47C!{B#y#bGqu_d1b>0&md$W?1H);YJ zR5BK&CZYtFIvWW4eBxfY3+D1n^d z6I2j*yjCcIT zj`52ZOwM~V*5h;V`D~rMck;SS4?Zs-elh%C$Jt(pKh_+^?Pt4Mx)4{dw9HvNzZREu z_zlDJhIeg%3Pumkdza%k47LkC8?Ons@cKB|zyX8u-gWp5A64pS*IhgB&Bkx|yo{fH zWm4YjgW8Ahll6nq6HtIe%`SmxW2OL}Mf)GY>k+UCmf=tFu?RRi@T+?tAsyO&1AcXT z;@w%J!qVrgi3Usrygw_M%3r=7R_sc4F1_LAG;dT;#@VssDn|KuF!R$RC{Dz2c#~iFnQe8YlY`ZSbcEO+GF+b^dbvb-0CoC}leWjT>p`VnFv?H$g<;n%MK_K1dnZmuXm3er`7t=#uSp(V z09G!=6C;VEvBt8qaHSy;{MoNaG!%e6AC9M!>lK1kF}ln+9q=B)fG$IVbHQNO0x)Et zDSH|QFMzgL7_hMC`BljW3&37C`#GvbONSv`A5(|AtzU=2caN&+QJ-886W8oKHrxl&O zK&5JNTBN1@SI-qs*MwJx`5s0lJkFI**DN8!EDVWbXQ9hJ#bC|)FU7ox_yyl$M3avT z)#ek)Hqh_Owr)usTi0M@>q~^IW9u3WP1OM-TYpv< zIJU0Akbwh6w%#cW99!35Wa}N&NNel0Cm4M=w!X1|+?>$XJ+k$IKE{w2_xhV9igS?g z8_$HxsM{B6?C_Jjq6tNk%L^~B_&rmn*I>b%iofHRr0zqa3yI<)zr5^4Bx;468ejav z0F>V!r!`N5{v$t;ycvl-g@l$a190>zTLhU3#BaO@5`2YUP#KiHh&AL3B-gGX!_mdS zuJ0Jcu?NA8zOgP=s$M`$I!|0=>>SLy%aFLE2|4E@0)8lgt6f~=#kR)mG7rx4SG zAnm&h9BxkH^kU-$Vwb?{y9q2hkWYxciLuoupZ6Zx0B>tt0dZDMw(6YYWjx2OLlcr1 zw!PuKV*}9yhxIm4$urH-l`22Pp1vGQ^mezAL?M4f{>GBD8W zwXoEKC&L8C;_CI^O~_SV9xL(Boel$eDI48^IfMrh-O%G3cu4UrbIfrf!B(Jy@6+`DaN)p@ElBT;Au?VzzaH?;3@dh zq$dXQ{N1ryL&0RQxDkro1M}h7>+x~!d0F2{$o0zh({OdWpva4@55?b&MD29+(u^Vm zz`NtB#9XJmg`T7NX6>8&VDRD+2?(#=T+rK48|ve!r#Dv4WPKc;@dE5Ojz2Q*or+)V z$b=WXaamB9f1b_14Eg!+$zP2`3ndQD@k6jw{$RCG94c&r1C6jrFCKEZRql24j zI7rhNPh6R~H5S9i$cXZ;QJE(Tu;MQ=nVAD!y5ifXmkmKgX%Ctoi<<<1$aeboBKo%g_Q(l=>Beh7upGYu2O^Z2vm3aOLG=bTAEY$D@f#4F zjl7yFbJ-SVo2AXQjy96g{caO0g#^2E`FSYIO*zfjf0(@iXI~@b)7Zw#*CfS<9*DO| zVfm`~a1&b=eTs$l1Z8wN=h@G9O?X@VA>kF{MaS5k z2&&?_DEByi#rONg*8_NmKwK{u(+6Dkq}tB(dp1jGLOtj=CK_?S5P^5`{(eCJsl9wm z#b3X1GO|y^ulNAJ>|I0!_OMYw&rS&w%w_(WAboeTI;nUDsB`N!eP?4r1-ag9cxp+Jj8LdUom3DR$*bZ4j$$hju zdNu4NENt5PGdk(rLo!~;Jz)k7U%zpKro8tZ0`!vS#oO%pP`Q`=J2=GQ=1Oqw$Jg=| zv&FEm%#Tv%pw!R!m5lXMSqR|0g$MP<`T4|U2n8)ERZvpxua=x!0CMPCgzY?D9hIy0 zC#F7vwwfq0!0(@W4T%;cVsH7G)K_SIJ03|BFQ`J^VEm4gZ^jk{qcW{u;Bx z-@#<~Tg(~$USc&2?QZFB-OR~F5mrOKW(m*`ck}k2NPM2sf>XO-1 z&UQ%~C2W^;A`x~;?rqg2^+?z*v0QbRXe{ayi|Q`XnC%h=`!$bjy2O$@U82FTOEhS^ z#A1bA(u^jCU1Et;mw3Uc8QdX1tru1@_kk_EN^3sB(1VlF@*a&7zi|%wsn;GDI@|gc zoi)at)AA2I1af*(&W?WS8(2&$Rk;&}zz}GtgY&a(H3&sZcJ?!g zGJt;)kZdZpTB>hy3L52r-(&k%648nGXCbB8DmFY-;w6TI!KH#?4)RKN@p~ou7J#uW z<0Xk5!1W5DT$9RI-~&RN0nELN#_bJ#Usr?1QQ|>AUo?9lR*8@(uEVNT@+h?XZdEyv z@a~7F1!QI1CA%Lq$oKG*v>13PL$u*$>d(d@p$ya`Fe0X6!m>rq~l1%C}w5U@O zi4BKXYP`D^r@be~s*|l-Mj#BDn`YENc9S5x zu?JlOk#Qu+e(XVDWJea|kjvVU1xaavwIdBic4Sd)M^U&wh`r6md*;2f@GH3@NW{o2 zz7Y3n0LSsKKYp5QHz0#bNITOkv)71ACIVoPL_ zwnW;4ESt7QVothERnH^-qSOY-*D%xCgF&8te&5zeQgpaAk|!(6nJ25CW4(E@(qK4Q zS#V9_VTVE2M`{?<;BIU<3>uL54-W(0;SpN-QIN}T{0>%5w=YZH4H6eCyTclRSMpxa zyKGDWIOx`LFVzOqulWGh{XRaZ`x2&<21cZ{l-- zyx-@D0#0`yl6TthmsI`LJD0TyibsvBz(ZC27yP zJ!k}%JV>6EcfW_F<^%T|=i5?`$C5v*QZzdZ#>-_KR%40P;uv%qJb@jEp@0^3p^#>npNlz%*8fUkaUQ(0 z;cZIdaWi<^C}9V0ClcY{%`I0pTu%vW!_7!o8*ZiZ|6&`4vgvuRP-Qftu@`y2yf^F0 zQmOyGy0Bt5RxyK4x|G@dt=^GlDB&N#yh z4xSQ^mV2gg_JKD0Y%kdN13${%6WRPk%4?S5GA!+<6Dy(E@K~vWLW2Y7GtPXcqo8td!Bi zVx@J7)M9wZCfv&_9hVrL+F}iieI!ELX{Q|P_`4`!ZKvj$$aWg&{J+_DxB~(jJG{yp zs>6)f^>#2uQu<>$(Xlx+BnJf!r9Y+fiPx(wWFp7hjLhnZeN@~MM(>xYxFw3-QJU9< z!+Pn&Z`^1{)BmNo2>)5tOBWTTK_;JgLxChrZhpFN;vXv$=CG9sbN#A>@yv=NIPzhn z*f@0?o+uNG;m| zSItP|)+oy6_d=o>iRxwRrD8a5#d+1lSZQiSBbKWuLAQ8rL&95zguTU6M+v#b(?sWT zi>C$W;Tmr{68{B5_FufkQ$~-;*@ODMdKsdE6m@wQ8Uz()xa;elMZ$J{GbL=-w^8Ch z*Yz0aJ+ONq?Cu{Rqu=wB~`HIzCU(nEO} z9@cd)sJ?Bc#DB1F19}5c*tI`%*Iu-XjO61?*S3-j$4l3CAQ5)0_oC|BIwWk@HsL(% z+7?RKu5G7;?bE)rFHJuCCVhorhoU3~XSTvMlb+#xJ*CVPcaT33gESX7p>*ANA zjjc`@M*@enlj9^D22PpZmZ-?pngIJ2TwwW)J!WBNGJd&(g4F%!|MqVoC>D!T-_teY zcSwBV_ey<&L>&@*TkNkr5vx+d-l=Rs!kT-FaHp`#ZdA}%bX#npP*Rj)?^J5c-WGE( zxrVhE-LMHaDqt0B30jaDWZFlUnz@sL5?)zzKs-#$D{C4ISJpIWSJo`%tgJbpU0Jgr zH$Pfgs}`Af5zVfwIbgW5wwjP~+-e^>UR}Uqw25w@@&Zh^J{8)JxCG2D6HF#Pee5||y32HYj ziMFn+S_cfPT~tslugPvS*cfB2)|&%by;+dDIMka39ldQTJlV$Nadpz$Ou=bT*p=4A zmuUC5A{i|?+Jgo|d(fb@2aC~lM`#ZYXxn8$T6_uHWkIK1KZ%&CUEBxd z(k`d#9WWd`)h?-dVt;^u&fw`Opfxf`=Otf+>eiJEk|K9nFwk>cb{Kc;iiyW>+#R0t zV)CAs1*y6Xaj^r_$z2ZbSpmhgQG&c@5{XW-FxuyFBfMws2jxBMk+9yAq@aUU@SC=I zfm`T3xhVb+X1%9_{rU=E;vKRaIp{JmcSSHPkuLzpEstf&{zz(*gDA)Ex)tKWL!q5! zv=JoPN(Y)9c(2VT=_&v=7r*kefpf7~lx|a3KnVc%@G(!QasHTJ-sA1ZIQ z*jSMJ#%{6EV6?@?qO2La#YTgXX4*(ZyT!(mux9KQ8w;{#c#Dl`1LL*qnS0}5fuHU} z2!CBXaZ#u>k3RsEyFOl?JiP#%xCTt0x8_*x!*PioCfe?#lD2&CNi-%vxtP!#8U(0I0?NA~EMDR1HV z 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

DZtYMP+hDD({C| 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

3P>iKJ83x!1+rs`sF%f)BNH4V5Im+yMh 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

n?f!w}a4C7X%pFOM_dNu<7$U+&Jy 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ė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 literal 0 HcmV?d00001 diff --git a/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/assert-old.rs b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/assert-old.rs new file mode 100644 index 00000000000..8f28e123693 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/assert-old.rs @@ -0,0 +1,13 @@ +//@run +use prusti_contracts::*; + +#[trusted] +fn main() { + foo(&mut 42); +} + +#[trusted] +fn foo(x: &mut i32) { + *x = 1; + prusti_assert!(old(*x) == 42); +} diff --git a/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/forall.rs b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/forall.rs new file mode 100644 index 00000000000..c56bf48252e --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/forall.rs @@ -0,0 +1,8 @@ +//@run +use prusti_contracts::*; +#[trusted] +fn main() { + let v = vec![1,2,3,4,5,6]; + // success, all elements of v are smaller-eq than 6 + prusti_assume!(forall(|x: usize| x < 6 ==> v[x] <= 6)); +} diff --git a/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/invariant-old.rs b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/invariant-old.rs new file mode 100644 index 00000000000..812a033abac --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/invariant-old.rs @@ -0,0 +1,16 @@ +//@run +use prusti_contracts::*; + +fn main() { + mul(&mut 50); +} + +#[trusted] +fn mul(x: &mut i32) { + let mut res = 0; + while *x > 0 { + body_invariant!(old(*x) * 5 == res + *x * 5); + res = res + 5; + *x = *x-1; + } +} diff --git a/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/invariant.rs b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/invariant.rs new file mode 100644 index 00000000000..8dacc70a620 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/invariant.rs @@ -0,0 +1,13 @@ +//@run +use prusti_contracts::*; + +#[trusted] +fn main() { + let mut x = 10; + let mut y = 0; + while x > 0 { + body_invariant!(x + y == 10); + x = x - 1; + y = y + 1; + } +} diff --git a/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-locals.rs b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-locals.rs new file mode 100644 index 00000000000..143a7be847c --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-locals.rs @@ -0,0 +1,27 @@ +//@run +use prusti_contracts::*; + +fn main() { + test1(&mut 1); + test2(&mut 10); + test3(&mut 5); +} + +#[trusted] +fn test1(x: &mut i32) { + *x = 2; + let a = x; + prusti_assert!(old(*a) == 2); +} + +#[trusted] +fn test2(x: &mut i32) { + *x = 1; + prusti_assert!({let a = x; old(*a) == 1}); +} + +#[trusted] +fn test3(x: &mut i32) { + *x = 1; + prusti_assert!(old({let a = x; *a == 5})); +} diff --git a/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-move-struct.rs b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-move-struct.rs new file mode 100644 index 00000000000..8a1c8001ea8 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-move-struct.rs @@ -0,0 +1,17 @@ +//@run +use prusti_contracts::*; + +#[derive(Clone)] +struct SomeStruct(i32); + +fn main() { + let s = SomeStruct(42); + foo(s); +} + +#[trusted] +fn foo(mut s: SomeStruct) { + s.0 = 52; + // fails because evaluated in old state + prusti_assert!({ old(s.0) == 42}); +} diff --git a/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-move.rs b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-move.rs new file mode 100644 index 00000000000..dc3021ca0be --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/old-move.rs @@ -0,0 +1,14 @@ +//@run +use prusti_contracts::*; + +fn main() { + foo(43); +} + +#[trusted] +fn foo(mut x: i32) { + x = 50; + prusti_assert!(x == 50); + // this one fails because evaluated in old state! + prusti_assert!(old(x == 43)); +} diff --git a/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/sanity.rs b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/sanity.rs new file mode 100644 index 00000000000..02316a3c3d4 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/sanity.rs @@ -0,0 +1,7 @@ +//@run +use prusti_contracts::*; + +fn main() { + prusti_assume!(true); + prusti_assert!(true); +} diff --git a/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/tuple.rs b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/tuple.rs new file mode 100644 index 00000000000..55d9d848225 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/assert-assume-invariant/tuple.rs @@ -0,0 +1,13 @@ +//@run +use prusti_contracts::*; + +fn main() { + bar((6,4)); +} + +#[trusted] +fn bar(mut x: (i32, i32)) { + x.0 = 10; + x.1 = 20; + prusti_assert!(old(x.0 + x.1) == 10) +} diff --git a/prusti-tests/tests/runtime_checks/pass/extern_specs/option.rs b/prusti-tests/tests/runtime_checks/pass/extern_specs/option.rs new file mode 100644 index 00000000000..f31b797e30b --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/extern_specs/option.rs @@ -0,0 +1,26 @@ +//@run +use prusti_contracts::*; + +#[extern_spec] +impl std::option::Option { + #[pure] + #[insert_runtime_check] + #[ensures(matches!(*self, Some(_)) == result)] + pub fn is_some(&self) -> bool; + + #[pure] + #[insert_runtime_check] + #[ensures(self.is_some() == !result)] + pub fn is_none(&self) -> bool; + + #[trusted] + #[insert_runtime_check] + #[requires(self.is_some())] + pub fn unwrap(self) -> T; +} + +#[trusted] +fn main() { + let x = Some(5); + x.unwrap(); +} diff --git a/prusti-tests/tests/runtime_checks/pass/extern_specs/option.stdout b/prusti-tests/tests/runtime_checks/pass/extern_specs/option.stdout new file mode 100644 index 00000000000..5fbe6ad6ebf --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/extern_specs/option.stdout @@ -0,0 +1,2 @@ +check function prusti_pre_check_item_unwrap is performed +check function prusti_post_check_item_is_some is performed diff --git a/prusti-tests/tests/runtime_checks/pass/pledges/conditional.rs b/prusti-tests/tests/runtime_checks/pass/pledges/conditional.rs new file mode 100644 index 00000000000..ebdb9f9a762 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/pledges/conditional.rs @@ -0,0 +1,44 @@ +//@run +use prusti_contracts::*; +#[derive(Clone)] +struct Percentage(usize); + +#[trusted] +#[insert_runtime_check] +#[requires(p.0 <= 100)] +#[insert_runtime_check] +#[assert_on_expiry(*result <= 100, p.0 <= 100)] +#[insert_runtime_check] +#[ensures(old(p.0) == p.0)] +fn index_mut(p: &mut Percentage) -> &mut usize { + &mut p.0 +} + +#[trusted] +#[insert_runtime_check] +#[requires(p.0 >= 100)] +#[insert_runtime_check] +#[assert_on_expiry(*result >= 100, p.0 >= 100)] +#[insert_runtime_check] +#[ensures(old(p.0) == p.0)] +fn index_mut_other(p: &mut Percentage) -> &mut usize { + &mut p.0 +} + +fn main() { + // this one passes because index_mut is called + foo(true); +} + +#[trusted] +fn foo(b: bool) { + let mut p = Percentage(100); + let r = if b { + index_mut(&mut p) + } else { + index_mut_other(&mut p) + }; + // this is only a "valid" assignment if foo is called with + // b = true + *r = 72; +} diff --git a/prusti-tests/tests/runtime_checks/pass/pledges/conditional.stdout b/prusti-tests/tests/runtime_checks/pass/pledges/conditional.stdout new file mode 100644 index 00000000000..d4c3a8faf7f --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/pledges/conditional.stdout @@ -0,0 +1,4 @@ +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pledge_lhs_check_item_index_mut is performed +check function prusti_pledge_check_item_index_mut is performed diff --git a/prusti-tests/tests/runtime_checks/pass/pledges/percentage.rs b/prusti-tests/tests/runtime_checks/pass/pledges/percentage.rs new file mode 100644 index 00000000000..a488aa0c048 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/pledges/percentage.rs @@ -0,0 +1,34 @@ +//@run +use prusti_contracts::*; +#[derive(Clone)] +struct Percentage(usize); + +#[trusted] +#[insert_runtime_check] +#[requires(p.0 <= 100)] +#[insert_runtime_check] +#[assert_on_expiry(*result <= 100, p.0 <= 100)] +#[insert_runtime_check] +#[ensures(old(p.0) == p.0)] +fn index_mut(p: &mut Percentage) -> &mut usize { + &mut p.0 +} + +fn main() { + // this one passes because *r will be set to 72 + foo(true); + foo(false); +} + +#[trusted] +fn foo(b: bool) { + let mut p = Percentage(50); + let r = index_mut(&mut p); + if b { + *r = 72; + } else { + *r = 68; + p.0 = 43 + } + p.0 = 32; +} diff --git a/prusti-tests/tests/runtime_checks/pass/pledges/percentage.stdout b/prusti-tests/tests/runtime_checks/pass/pledges/percentage.stdout new file mode 100644 index 00000000000..dc8816b68f5 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/pledges/percentage.stdout @@ -0,0 +1,8 @@ +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pledge_lhs_check_item_index_mut is performed +check function prusti_pledge_check_item_index_mut is performed +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pledge_lhs_check_item_index_mut is performed +check function prusti_pledge_check_item_index_mut is performed diff --git a/prusti-tests/tests/runtime_checks/pass/pledges/vecwrapper.rs b/prusti-tests/tests/runtime_checks/pass/pledges/vecwrapper.rs new file mode 100644 index 00000000000..db957848cd7 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/pledges/vecwrapper.rs @@ -0,0 +1,66 @@ +//@run +use prusti_contracts::*; + +#[derive(Clone)] +pub struct VecWrapperI32 { + pub v: Vec +} + +impl VecWrapperI32 { + #[trusted] + #[insert_runtime_check] + #[ensures(result.len() == 5)] + pub fn new() -> Self { + Self { + v: vec![1,2,3,4,5], + } + } + + #[trusted] + #[pure] + pub fn len(&self) -> usize { + self.v.len() + } + + /// A ghost function for specifying values stored in the vector. + #[trusted] + #[pure] + #[insert_runtime_check] + #[requires(index < self.len())] + pub fn lookup(&self, index: usize) -> i32 { + self.v[index] + } + + #[trusted] + pub fn insert(&mut self, value: i32) { + self.v.push(value); + } + + #[trusted] + #[insert_runtime_check] + #[requires(index < self.len())] + #[insert_runtime_check] + #[ensures(*result == old(self.lookup(index)))] + // failing pledge: the quantifier iterates over all elements + // including the one that can be changed. + #[insert_runtime_check] + #[after_expiry( + self.len() == old(self.len()) && + self.lookup(index) == before_expiry(*result) && + forall( + |i: usize| (i < self.len()) && i != index ==> + self.lookup(i) == old(self.lookup(i)) + ) + )] + pub fn index_mut(&mut self, index: usize) -> &mut i32 { + self.v.get_mut(index).unwrap() + } +} + +fn main() { + let mut vw = VecWrapperI32::new(); + let x = vw.index_mut(3); + *x = 42; + vw.insert(50) +} + diff --git a/prusti-tests/tests/runtime_checks/pass/pledges/vecwrapper.stdout b/prusti-tests/tests/runtime_checks/pass/pledges/vecwrapper.stdout new file mode 100644 index 00000000000..593cbcc951e --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/pledges/vecwrapper.stdout @@ -0,0 +1,14 @@ +check function prusti_post_check_item_new is performed +check function prusti_pre_check_item_index_mut is performed +check function prusti_post_check_item_index_mut is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pledge_check_item_index_mut is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/custom-clone.rs b/prusti-tests/tests/runtime_checks/pass/postconditions/custom-clone.rs new file mode 100644 index 00000000000..cd5e5d9579c --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/custom-clone.rs @@ -0,0 +1,53 @@ +//@run +use prusti_contracts::*; + +struct SomeStruct { + pub v: Vec, +} + +impl SomeStruct { + #[pure] + #[trusted] + pub fn len(&self) -> usize { + self.v.len() + } + + #[pure] + #[trusted] + #[insert_runtime_check] + #[requires(el < self.len())] + pub fn lookup(&self, el: usize) -> i32 { + self.v[el] + } + + #[trusted] + #[insert_runtime_check] + #[ensures(old(self.len()) + 1 == self.len())] + #[insert_runtime_check] + #[ensures(self.lookup(self.len() - 1) == el)] + pub fn push(&mut self, el: i32) { + self.v.push(el); + } +} + +// a custom clone implementation that is not +// actually used in our code, but will be used +// to check old expressions +impl Clone for SomeStruct { + #[trusted] + fn clone(&self) -> SomeStruct { + println!("custom clone is called"); + SomeStruct { + v: self.v.clone(), + } + } +} + +#[trusted] +fn main() { + let mut s = SomeStruct { + v: vec![1,2,3,4], + }; + s.push(5); +} + diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/custom-clone.stdout b/prusti-tests/tests/runtime_checks/pass/postconditions/custom-clone.stdout new file mode 100644 index 00000000000..75f212c2c57 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/custom-clone.stdout @@ -0,0 +1,4 @@ +custom clone is called +check function prusti_post_check_item_push is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_post_check_item_push is performed diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/generic-old.rs b/prusti-tests/tests/runtime_checks/pass/postconditions/generic-old.rs new file mode 100644 index 00000000000..af3d1f30e00 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/generic-old.rs @@ -0,0 +1,26 @@ +//@run +use prusti_contracts::*; + +fn main() { + let mut x = GenericStruct { x: 40}; + let mut y = GenericStruct { x: 32}; + let c = x.stuff(&mut y); +} + +#[derive(Clone)] +struct GenericStruct { + pub x: T, +} + +impl> GenericStruct { + #[trusted] + // fails because of the +1 + #[insert_runtime_check] + #[ensures(self.x == old(other.x))] + #[insert_runtime_check] + #[ensures(other.x == old(self.x))] + pub fn stuff(&mut self, other: &mut Self) { + std::mem::swap(&mut self.x, &mut other.x); + } +} + diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/generic-old.stdout b/prusti-tests/tests/runtime_checks/pass/postconditions/generic-old.stdout new file mode 100644 index 00000000000..ac1c314e027 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/generic-old.stdout @@ -0,0 +1,2 @@ +check function prusti_post_check_item_stuff is performed +check function prusti_post_check_item_stuff is performed diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/generic.rs b/prusti-tests/tests/runtime_checks/pass/postconditions/generic.rs new file mode 100644 index 00000000000..72132724306 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/generic.rs @@ -0,0 +1,25 @@ +//@run +use prusti_contracts::*; + +fn main() { + let a: i32 = 50; + let x = GenericStruct { x: a}; + let y = GenericStruct { x: a}; + let c = x.stuff(&y); +} + +#[derive(Clone)] +struct GenericStruct { + pub x: T, +} + +impl GenericStruct { + #[trusted] + // fails because of the +1 + #[insert_runtime_check] + #[ensures(result == self.x + other.x)] + pub fn stuff(&self, other: &Self) -> i32 { + self.x + other.x + } +} + diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/generic.stdout b/prusti-tests/tests/runtime_checks/pass/postconditions/generic.stdout new file mode 100644 index 00000000000..a8f6389766e --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/generic.stdout @@ -0,0 +1 @@ +check function prusti_post_check_item_stuff is performed diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/old-non-ref.rs b/prusti-tests/tests/runtime_checks/pass/postconditions/old-non-ref.rs new file mode 100644 index 00000000000..5f1624de031 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/old-non-ref.rs @@ -0,0 +1,24 @@ +//@run +//@compile-flags: -Pcheck_overflows=false +use prusti_contracts::*; + +#[derive(Clone)] +struct Something { + pub field: i32, +} + +// even though x.field is modified, since it not a reference +// if it occurrs in specifications it will be evaluated in +// its old state anyways +#[insert_runtime_check] +#[ensures(old(x.field) == x.field)] +fn nonsense(mut x: Something) { + x.field = x.field + 4; +} + +fn main() { + let s = Something { + field: 1, + }; + nonsense(s); +} diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/old-non-ref.stdout b/prusti-tests/tests/runtime_checks/pass/postconditions/old-non-ref.stdout new file mode 100644 index 00000000000..ff9419f1223 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/old-non-ref.stdout @@ -0,0 +1 @@ +check function prusti_post_check_item_nonsense is performed diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/self-impl.rs b/prusti-tests/tests/runtime_checks/pass/postconditions/self-impl.rs new file mode 100644 index 00000000000..98808d5b25a --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/self-impl.rs @@ -0,0 +1,29 @@ +//@run +use prusti_contracts::*; + +#[trusted] +fn main() { + let mut yxe = Something::new(); + yxe.increment(); + println!("getting to the end"); +} + +#[derive(Clone)] +struct Something { + x: i32, +} + +impl Something { + pub fn new() -> Self { + Self { + x: 5, + } + } + + #[trusted] + #[insert_runtime_check] + #[ensures(old(self.x) + 1 == self.x)] + pub fn increment(&mut self) { + self.x += 1; + } +} diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/self-impl.stdout b/prusti-tests/tests/runtime_checks/pass/postconditions/self-impl.stdout new file mode 100644 index 00000000000..c675e33be1c --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/self-impl.stdout @@ -0,0 +1,2 @@ +check function prusti_post_check_item_increment is performed +getting to the end diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/type-alias.rs b/prusti-tests/tests/runtime_checks/pass/postconditions/type-alias.rs new file mode 100644 index 00000000000..d49a41923a6 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/type-alias.rs @@ -0,0 +1,21 @@ +//@run +use prusti_contracts::*; +#[derive(Clone)] +struct SomeStruct { + pub x: T +} + +type TypeAlias<'a, T> = &'a mut SomeStruct; + +fn main() { + let mut s1 = SomeStruct { x: 2}; + let mut s2 = SomeStruct { x: 3}; + foo(&mut s1, &mut s2); +} + +#[trusted] +#[insert_runtime_check] +#[ensures(old(x.x) == y.x)] +fn foo(x: TypeAlias, y: TypeAlias) { + y.x = x.x; +} diff --git a/prusti-tests/tests/runtime_checks/pass/postconditions/type-alias.stdout b/prusti-tests/tests/runtime_checks/pass/postconditions/type-alias.stdout new file mode 100644 index 00000000000..58140c90ea5 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/postconditions/type-alias.stdout @@ -0,0 +1 @@ +check function prusti_post_check_item_foo is performed diff --git a/prusti-tests/tests/runtime_checks/pass/preconditions/multiple.rs b/prusti-tests/tests/runtime_checks/pass/preconditions/multiple.rs new file mode 100644 index 00000000000..a726d71f466 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/preconditions/multiple.rs @@ -0,0 +1,18 @@ +//@run +use prusti_contracts::*; + +#[trusted] +fn main() { + foo(42, 42); +} + +// This test is about checking if multiple precondition checks are +// properly chained. +// They are currently executed bottom up. If this ever breaks, maybe +// reorder the contracts, and make sure both checks are executed +// (meaning stdout file contains to check messages) +#[insert_runtime_check] +#[requires(x == 42)] +#[insert_runtime_check] +#[requires(y == 42)] +fn foo(x: i32, y: i32) {} diff --git a/prusti-tests/tests/runtime_checks/pass/preconditions/multiple.stdout b/prusti-tests/tests/runtime_checks/pass/preconditions/multiple.stdout new file mode 100644 index 00000000000..304645d659a --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/preconditions/multiple.stdout @@ -0,0 +1,2 @@ +check function prusti_pre_check_item_foo is performed +check function prusti_pre_check_item_foo is performed diff --git a/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.rs b/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.rs new file mode 100644 index 00000000000..b91c8ac1774 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.rs @@ -0,0 +1,11 @@ +//@run +use prusti_contracts::*; + +#[insert_runtime_check] +#[requires(exists(|x: i16| x <= i16::MAX ==> x == i16::MAX))] +fn foo() {} + +#[trusted] +fn main() { + foo(); +} diff --git a/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.stdout b/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.stdout new file mode 100644 index 00000000000..408e13fdcbc --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.stdout @@ -0,0 +1 @@ +check function prusti_pre_check_item_foo is performed diff --git a/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-old.rs b/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-old.rs new file mode 100644 index 00000000000..fffa6c0991a --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-old.rs @@ -0,0 +1,56 @@ +//@run +use prusti_contracts::*; + +#[derive(Clone)] +struct VecWrapper { + content: Vec, +} + +impl VecWrapper { + #[trusted] + #[insert_runtime_check] + #[ensures(result.len() == 8)] + pub fn new() -> Self { + Self { + content: vec![1,2,3,4,5,6,7,8], + } + } + + #[pure] + #[trusted] + #[insert_runtime_check] + #[requires(i < self.len())] + pub fn lookup(&self, i: usize) -> i32 { + *self.content.get(i).unwrap() + } + + #[pure] + #[trusted] + pub fn len(&self) -> usize { + self.content.len() + } + + #[trusted] + #[insert_runtime_check] + #[requires(i < self.len())] + #[insert_runtime_check] + #[ensures(old(self.len()) == self.len())] + // if index is not i, element stays untouched + #[insert_runtime_check] + #[ensures(forall(|j: usize| (j < self.len()) && j!=i ==> self.lookup(j) == old(self.lookup(j))))] + // there is now an element with value x + #[insert_runtime_check] + #[ensures(exists(|j: usize| (j < self.len()) ==> self.lookup(j) == x))] + pub fn set(&mut self, i: usize, x: i32) { + self.content[i] = x; + } +} + +#[trusted] +fn main() { + let mut vec = VecWrapper::new(); + vec.set(4, 55); + println!("executed"); + +} + diff --git a/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-old.stdout b/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-old.stdout new file mode 100644 index 00000000000..92a18e5578f --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-old.stdout @@ -0,0 +1,25 @@ +check function prusti_post_check_item_new is performed +check function prusti_pre_check_item_set is performed +check function prusti_post_check_item_set is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_post_check_item_set is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_pre_check_item_lookup is performed +check function prusti_post_check_item_set is performed +executed diff --git a/prusti-tests/tests/runtime_checks/pass/quantifiers/forall-minimal.rs b/prusti-tests/tests/runtime_checks/pass/quantifiers/forall-minimal.rs new file mode 100644 index 00000000000..d2570b73541 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/quantifiers/forall-minimal.rs @@ -0,0 +1,10 @@ +//@run +use prusti_contracts::*; + +#[insert_runtime_check] +#[requires(forall(|x: usize| (x < 20) ==> true))] +fn foo() {} + +fn main() { + foo(); +} diff --git a/prusti-tests/tests/runtime_checks/pass/quantifiers/forall-minimal.stdout b/prusti-tests/tests/runtime_checks/pass/quantifiers/forall-minimal.stdout new file mode 100644 index 00000000000..408e13fdcbc --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/quantifiers/forall-minimal.stdout @@ -0,0 +1 @@ +check function prusti_pre_check_item_foo is performed diff --git a/prusti-tests/tests/runtime_checks/pass/quantifiers/manual_bounds.rs b/prusti-tests/tests/runtime_checks/pass/quantifiers/manual_bounds.rs new file mode 100644 index 00000000000..c70160f61a4 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/quantifiers/manual_bounds.rs @@ -0,0 +1,26 @@ +//@run +use prusti_contracts::*; + +#[insert_runtime_check] +#[requires( + forall( + |x: usize| (x < 20) ==> true + ) +)] +fn foo() {} + +#[insert_runtime_check] +#[requires( + forall( + #[runtime_quantifier_bounds(0..20, 12..=22)] + |x: usize, y: usize| (x < 20) && (y <= 22) && y >= 12 ==> x + y <= 41 + ) +)] +fn bar() {} + +#[trusted] +fn main() { + foo(); + bar(); + println!("program intact"); +} diff --git a/prusti-tests/tests/runtime_checks/pass/quantifiers/manual_bounds.stdout b/prusti-tests/tests/runtime_checks/pass/quantifiers/manual_bounds.stdout new file mode 100644 index 00000000000..8cd65f300d0 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/quantifiers/manual_bounds.stdout @@ -0,0 +1,3 @@ +check function prusti_pre_check_item_foo is performed +check function prusti_pre_check_item_bar is performed +program intact diff --git a/prusti-tests/tests/runtime_checks/pass/refined/shape.rs b/prusti-tests/tests/runtime_checks/pass/refined/shape.rs new file mode 100644 index 00000000000..0509e14c753 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/refined/shape.rs @@ -0,0 +1,40 @@ +//@run +use prusti_contracts::*; + +trait Shape { + type T; + fn area(&self) -> Self::T; +} + +struct Rectangle { + height: T, + width: T, +} + +impl Shape for Rectangle +where + T: std::ops::Mul + Copy, +{ + type T = T; + fn area(&self) -> T { + self.height * self.width + } +} + +#[trusted] +#[insert_runtime_check] +#[refine_spec(where S: PartialOrd, [ + ensures(result.1 >= result.0) +])] +fn area_pair(a: &dyn Shape, b: &dyn Shape) -> (S, S) { + (a.area(), b.area()) +} + + +#[trusted] +fn main() { + let r1 = Rectangle { height: 6, width: 10}; + let r2 = Rectangle { height: 5, width: 10}; + // larger one is passed first -> fails! + area_pair(&r2, &r1); +} diff --git a/prusti-tests/tests/runtime_checks/pass/refined/shape.stdout b/prusti-tests/tests/runtime_checks/pass/refined/shape.stdout new file mode 100644 index 00000000000..791e6c72f09 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/refined/shape.stdout @@ -0,0 +1 @@ +check function prusti_post_check_item_area_pair is performed diff --git a/prusti-tests/tests/runtimetest.rs b/prusti-tests/tests/runtimetest.rs new file mode 100644 index 00000000000..087569961ef --- /dev/null +++ b/prusti-tests/tests/runtimetest.rs @@ -0,0 +1,130 @@ +#![feature(custom_test_frameworks)] +#![test_runner(test_runner)] + +use prusti_server::spawn_server_thread; +use std::{env, num::NonZeroUsize, path::PathBuf}; +use ui_test::*; + +// copied from compiletest. Maybe create a module with common utilities? +fn find_prusti_rustc_path() -> PathBuf { + let target_directory = if cfg!(debug_assertions) { + "debug" + } else { + "release" + }; + let executable_name = if cfg!(windows) { + "prusti-rustc.exe" + } else { + "prusti-rustc" + }; + let local_prusti_rustc_path: PathBuf = ["target", target_directory, executable_name] + .iter() + .collect(); + if local_prusti_rustc_path.exists() { + return local_prusti_rustc_path; + } + let workspace_prusti_rustc_path: PathBuf = ["..", "target", target_directory, executable_name] + .iter() + .collect(); + if workspace_prusti_rustc_path.exists() { + return workspace_prusti_rustc_path; + } + panic!( + "Could not find the {target_directory:?} prusti-rustc binary to be used in tests. \ + It might be that Prusti has not been compiled correctly." + ); +} + +enum TestKind { + RustcRuntimeChecks, + RustcDeadCodeRemoval, +} + +impl TestKind { + fn build_config(&self, group_name: &str) -> Config { + let path: PathBuf = ["tests", group_name].iter().collect(); + let prusti_path: PathBuf = find_prusti_rustc_path(); + let mut prusti_cmd = CommandBuilder { + out_dir_flag: Some("--out-dir".into()), + ..CommandBuilder::cmd(prusti_path) + }; + + match self { + Self::RustcRuntimeChecks => { + prusti_cmd + .envs + .push(("PRUSTI_FULL_COMPILATION".into(), Some("true".into()))); + prusti_cmd + .envs + .push(("PRUSTI_INSERT_RUNTIME_CHECKS".into(), Some("true".into()))); + prusti_cmd + .envs + .push(("PRUSTI_DEBUG_RUNTIME_CHECKS".into(), Some("true".into()))); + } + Self::RustcDeadCodeRemoval => { + prusti_cmd + .envs + .push(("PRUSTI_FULL_COMPILATION".into(), Some("true".into()))); + prusti_cmd + .envs + .push(("PRUSTI_REMOVE_DEAD_CODE".into(), Some("true".into()))); + } + } + + let mut config = Config { + program: prusti_cmd, + edition: Some("2018".to_string()), + ..Config::rustc(path) + }; + // this filters out the uuid's for the printed messages that tell us + // which tests are performed. + config.stdout_filter(r"_([0-9, a-z]+) is performed", " is performed"); + if std::env::var_os("BLESS").is_some() { + println!("It's a blessing :)"); + config.output_conflict_handling = OutputConflictHandling::Bless + } + config + } +} + +fn compile_and_run(group_name: &str, filter: &Option, test_kind: TestKind) { + let config = test_kind.build_config(group_name); + + // multiple threads lead to problems atm. If we want multiple threads, all + // files need unique names. + let mut args = Args::test().unwrap(); + args.threads = NonZeroUsize::new(1).unwrap(); + let _ = run_tests_generic( + vec![config], + args, + move |path, args, config| { + filter + .as_ref() + .map(|filter| path.display().to_string().contains(filter.as_str())) + .unwrap_or(true) + && default_file_filter(path, args, config) + }, + default_per_file_config, + status_emitter::Text::verbose(), + ); +} + +fn test_runner(_tests: &[&()]) { + let server_address = spawn_server_thread(); + env::set_var("PRUSTI_SERVER_ADDRESS", server_address.to_string()); + + let filter = std::env::args().nth(1); + println!("filter: {:?}", filter); + // Cargo tests don't work at the moment + // compile_and_run( + // &"runtime_checks_cargo", + // &filter, + // TestKind::CargoRuntimeChecks, + // ); + compile_and_run(&"runtime_checks", &filter, TestKind::RustcRuntimeChecks); + compile_and_run( + &"mir_optimizations", + &filter, + TestKind::RustcDeadCodeRemoval, + ); +} From 4a0f5b6df2fda7b49c263492be5244f7a4f1136d Mon Sep 17 00:00:00 2001 From: cedihegi Date: Sat, 2 Sep 2023 08:30:02 +0200 Subject: [PATCH 35/45] Add better error messages to runtime checks + lots of small fixes + remove clippy warnings + make no_std configurable --- Cargo.lock | 247 ++++++++++++++++++ .../prusti-contracts-proc-macros/Cargo.toml | 1 + prusti-contracts/prusti-contracts/Cargo.toml | 2 + prusti-contracts/prusti-contracts/src/lib.rs | 7 +- .../src/runtime_check_internals.rs | 44 +--- prusti-contracts/prusti-specs/Cargo.toml | 3 + prusti-contracts/prusti-specs/src/lib.rs | 1 + .../src/runtime_checks/boundary_extraction.rs | 207 +++++++++------ .../src/runtime_checks/error_messages.rs | 102 ++++++++ .../prusti-specs/src/runtime_checks/mod.rs | 1 + .../src/runtime_checks/quantifiers.rs | 51 ++-- .../src/runtime_checks/translation.rs | 115 ++++---- .../src/runtime_checks/visitor.rs | 48 ++-- prusti-rustc-interface/src/lib.rs | 1 + .../tests/cargo_verify/test_no_std/Cargo.toml | 2 +- prusti-tests/tests/parse/ui/nostd.rs | 2 + .../compilation/warn-unsupported-snapeq.rs | 24 ++ .../warn-unsupported-snapeq.stderr | 8 + prusti-utils/src/launch/mod.rs | 2 +- .../src/encoder/errors/error_manager.rs | 2 +- prusti/src/callbacks.rs | 4 +- prusti/src/modify_mir/mir_modify.rs | 10 +- .../modify_mir/passes/insert_pledge_checks.rs | 14 +- .../passes/insert_postconditions.rs | 1 + .../src/modify_mir/passes/remove_dead_code.rs | 6 +- 25 files changed, 657 insertions(+), 248 deletions(-) create mode 100644 prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.rs create mode 100644 prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.stderr diff --git a/Cargo.lock b/Cargo.lock index 1d02af4de10..6d844346e07 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -68,6 +68,25 @@ dependencies = [ "libc", ] +[[package]] +name = "annotate-snippets" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b9d411ecbaf79885c6df4d75fff75858d5995ff25385657a28af47e82f9c36" +dependencies = [ + "unicode-width", + "yansi-term", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anstream" version = "0.5.0" @@ -381,6 +400,17 @@ dependencies = [ "log", ] +[[package]] +name = "bstr" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +dependencies = [ + "memchr", + "regex-automata 0.3.6", + "serde", +] + [[package]] name = "bumpalo" version = "3.13.0" @@ -399,6 +429,24 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +[[package]] +name = "camino" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" +dependencies = [ + "serde", +] + [[package]] name = "cargo-test-macro" version = "0.1.0" @@ -452,6 +500,20 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "cargo_metadata" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "cc" version = "1.0.83" @@ -537,12 +599,50 @@ dependencies = [ "termcolor", ] +[[package]] +name = "color-eyre" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + [[package]] name = "colorchoice" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +[[package]] +name = "colored" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" +dependencies = [ + "is-terminal", + "lazy_static", + "windows-sys 0.48.0", +] + [[package]] name = "combine" version = "4.6.6" @@ -553,6 +653,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "comma" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55b672471b4e9f9e95499ea597ff64941a309b2cdbffcc46f2cc5e2d971fd335" + [[package]] name = "compiletest_rs" version = "0.10.2" @@ -603,6 +709,19 @@ dependencies = [ "yaml-rust", ] +[[package]] +name = "console" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.45.0", +] + [[package]] name = "const-oid" version = "0.9.5" @@ -898,6 +1017,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "distance" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d9d8664cf849d7d0f3114a3a387d2f5e4303176d746d5a951aaddc66dfe9240" + [[package]] name = "dlv-list" version = "0.3.0" @@ -960,6 +1085,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + [[package]] name = "encoding_rs" version = "0.8.33" @@ -1025,6 +1156,16 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" +[[package]] +name = "eyre" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "failure" version = "0.1.8" @@ -1534,6 +1675,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "index_vec" version = "0.1.3" @@ -1563,6 +1710,19 @@ dependencies = [ "hashbrown 0.14.0", ] +[[package]] +name = "indicatif" +version = "0.17.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b297dc40733f23a0e52728a58fa9489a5b7638a324932de16b41adc3ef80730" +dependencies = [ + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", +] + [[package]] name = "instant" version = "0.1.12" @@ -1984,6 +2144,12 @@ dependencies = [ "libc", ] +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + [[package]] name = "object" version = "0.32.0" @@ -2070,6 +2236,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + [[package]] name = "p384" version = "0.13.0" @@ -2082,6 +2254,15 @@ dependencies = [ "sha2", ] +[[package]] +name = "pad" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ad9b889f1b12e0b9ee24db044b5129150d5eada288edc800f789928dc8c0e3" +dependencies = [ + "unicode-width", +] + [[package]] name = "parking" version = "2.1.0" @@ -2238,12 +2419,28 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "portable-atomic" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b" + [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "prettydiff" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ff1fec61082821f8236cf6c0c14e8172b62ce8a72a0eedc30d3b247bb68dc11" +dependencies = [ + "ansi_term", + "pad", +] + [[package]] name = "primeorder" version = "0.13.2" @@ -2402,6 +2599,7 @@ dependencies = [ "prusti", "prusti-launch", "prusti-server", + "ui_test", "ureq", ] @@ -2908,6 +3106,9 @@ name = "semver" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" +dependencies = [ + "serde", +] [[package]] name = "serde" @@ -3504,6 +3705,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-error" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +dependencies = [ + "tracing 0.1.37", + "tracing-subscriber", +] + [[package]] name = "tracing-log" version = "0.1.3" @@ -3570,6 +3781,33 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +[[package]] +name = "ui_test" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7823f926a62629304c4a47c23949925f6faa0d4f14ddbce4405d55dbaeab324" +dependencies = [ + "annotate-snippets", + "anyhow", + "bstr", + "cargo-platform", + "cargo_metadata", + "color-eyre", + "colored", + "comma", + "crossbeam-channel", + "distance", + "indicatif", + "lazy_static", + "prettydiff", + "regex", + "rustc_version", + "rustfix", + "serde", + "serde_json", + "tempfile", +] + [[package]] name = "unicase" version = "2.7.0" @@ -4191,6 +4429,15 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yansi-term" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" +dependencies = [ + "winapi", +] + [[package]] name = "zeroize" version = "1.6.0" diff --git a/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml b/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml index c6c0cb59e49..7bc28025c66 100644 --- a/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml +++ b/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml @@ -22,3 +22,4 @@ proc-macro2 = { version = "1.0", optional = true } # Are we being compiled by Prusti and should include dependency on # prusti-specs and proc-macro2? prusti = ["dep:prusti-specs", "dep:proc-macro2"] +std = ["prusti-specs/std"] diff --git a/prusti-contracts/prusti-contracts/Cargo.toml b/prusti-contracts/prusti-contracts/Cargo.toml index 6a8e9368096..5b0b1f4fa58 100644 --- a/prusti-contracts/prusti-contracts/Cargo.toml +++ b/prusti-contracts/prusti-contracts/Cargo.toml @@ -19,4 +19,6 @@ trybuild = "1.0" # Forward "prusti" flag [features] +default = ["std"] prusti = ["prusti-contracts-proc-macros/prusti"] +std = ["prusti-contracts-proc-macros/std"] diff --git a/prusti-contracts/prusti-contracts/src/lib.rs b/prusti-contracts/prusti-contracts/src/lib.rs index 812142ef212..78f1256a964 100644 --- a/prusti-contracts/prusti-contracts/src/lib.rs +++ b/prusti-contracts/prusti-contracts/src/lib.rs @@ -1,4 +1,5 @@ -#![no_std] +#![cfg_attr(not(feature = "std"), no_std)] +// #![no_std] /// A macro for writing a precondition on a function. pub use prusti_contracts_proc_macros::requires; @@ -127,10 +128,6 @@ mod private { pub struct Ghost { _phantom: PhantomData, } - - pub fn check_expr(expr: bool, added_info: &str, buffer: &mut [u8], buffer_len: &mut usize) -> bool { - true - } } #[cfg(feature = "prusti")] diff --git a/prusti-contracts/prusti-contracts/src/runtime_check_internals.rs b/prusti-contracts/prusti-contracts/src/runtime_check_internals.rs index 5db0888c401..beaa8363872 100644 --- a/prusti-contracts/prusti-contracts/src/runtime_check_internals.rs +++ b/prusti-contracts/prusti-contracts/src/runtime_check_internals.rs @@ -24,42 +24,12 @@ pub fn num_to_str(n: T, buffer: &mut [u8]) -> &str { let bytes_written = formatter.1; core::str::from_utf8(&buffer[..bytes_written]).unwrap() } -// pub fn num_to_str(mut n: T, buffer: &mut [u8;64]) -> &str -// where -// T: PartialEq -// + PartialOrd -// + core::ops::Rem -// + core::ops::Div -// + core::ops::Sub -// + Copy, -// { -// let length = 0; -// if n == 0 { -// return "0" -// } -// let mut is_negative = false; -// if n < T::from(0) { -// is_negative = true; -// n = T::from(0)-n; -// } -// let mut index = 63; -// while n > T::from(0) { -// let remainder: T = n % T::from(10); -// buffer[index] = b'0' + (remainder as u8); -// n = n / T::from(10); -// index -= 1; -// } -// if is_negative { -// buffer[index] = b'-'; -// } else { -// index += 1; -// } -// core::str::from_utf8(&buffer[index..]).unwrap() -// } + // An internal function used for getting more precise error messages for runtime // checks. // Buffer manipulations because we cannot use std and don't wanna introduce // new dependencies. +#[cfg(not(feature = "std"))] pub fn check_expr(expr: bool, added_info: &str, buffer: &mut [u8], buffer_len: &mut usize) -> bool { if !expr { // buffer already has contents up until buffer_len @@ -71,3 +41,13 @@ pub fn check_expr(expr: bool, added_info: &str, buffer: &mut [u8], buffer_len: & true } } + +#[cfg(feature = "std")] +pub fn check_expr(expr: bool, added_info: &str, message: &mut std::string::String) -> bool { + if !expr { + message.push_str(added_info); + false + } else { + true + } +} diff --git a/prusti-contracts/prusti-specs/Cargo.toml b/prusti-contracts/prusti-specs/Cargo.toml index d9a70fb5c2a..2f60d06f0a8 100644 --- a/prusti-contracts/prusti-specs/Cargo.toml +++ b/prusti-contracts/prusti-specs/Cargo.toml @@ -21,3 +21,6 @@ proc-macro2 = "1.0" uuid = { version = "1.0", features = ["v4"] } itertools = "0.11" rustc-hash = "1.1.0" + +[features] +std = [] diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index d3c4091cef2..889c2532a6e 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -4,6 +4,7 @@ #![feature(proc_macro_span)] #![feature(if_let_guard)] #![feature(assert_matches)] +#![feature(proc_macro_diagnostic)] // This Clippy chcek seems to be always wrong. #![allow(clippy::iter_with_drain)] #![warn(clippy::disallowed_types)] diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs index 268d41692b5..be4a6315853 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs @@ -1,121 +1,166 @@ +use crate::runtime_checks::visitor::expression_name; use proc_macro2::TokenStream; use quote::ToTokens; use rustc_hash::FxHashSet; use syn::{self, parse_quote, parse_quote_spanned, spanned::Spanned, visit::Visit, BinOp}; -pub struct BoundExtractor { +pub(crate) struct BoundExtractor { // the set of bound variables within that expression pub name_set: FxHashSet, } impl BoundExtractor { - pub fn manual_bounds( + /// Try to find manually annotated boundaries with the #[runtime_quantifier_bounds] + /// attribute. Returns None if there is no such attribute, Some(error) + /// if there is one, but the contained ranges are false, and the tokens + /// of the ranges otherwise. + pub(crate) fn manual_bounds( expr: syn::ExprClosure, bound_vars: Vec<(String, syn::Type)>, - ) -> Option> { + ) -> Option>> { let manual_bounds = get_attribute_contents( "prusti :: runtime_quantifier_bounds".to_string(), &expr.attrs, )?; let bounds_expr: syn::Expr = simplify_expression(&syn::parse2(manual_bounds).ok()?); - println!("bounds expression: {:?}", bounds_expr); // there is either one or multiple let bounds_vec = match bounds_expr { - syn::Expr::Tuple(expr_tuple) => expr_tuple - .elems - .iter() - .cloned() - .map(|range| { - // remove surrounding braces or things like that - let range = simplify_expression(&range); + syn::Expr::Tuple(expr_tuple) => { + let mut ranges: Vec = Vec::new(); + for range in expr_tuple.elems.iter() { + let range = simplify_expression(range); if let syn::Expr::Range(expr_range) = range { - expr_range + ranges.push(expr_range); } else { - panic!("Bounds should only contain ranges"); + return Some(Err(syn::Error::new( + range.span(), + "Runtime checks: quantifier boundaries must be provided as ranges", + ))); } - }) - .collect(), + } + ranges + } syn::Expr::Range(range_expr) => vec![range_expr], - _ => return None, + _ => { + return Some(Err(syn::Error::new( + bounds_expr.span(), + "Runtime checks: quantifier boundaries must be provided as ranges", + ))); + } }; + if bounds_vec.len() != bound_vars.len() { + return Some(Err(syn::Error::new( + expr.span(), + "Runtime checks: the provided number of ranges does not match the number of closure arguments."))); + } assert!(bounds_vec.len() == bound_vars.len()); - Some(bound_vars.into_iter().zip(bounds_vec.into_iter()).collect()) + Some(Ok(bound_vars + .into_iter() + .zip(bounds_vec) + .collect())) } // if this function is called, the ranges are mandatory! - pub fn derive_ranges( + pub(crate) fn derive_ranges( closure: syn::Expr, args: Vec<(String, syn::Type)>, - ) -> Vec<((String, syn::Type), syn::ExprRange)> { + ) -> syn::Result> { if args.len() > 1 { - panic!("multiple args without manually defined boundaries are not allowed"); + return Err(syn::Error::new( + closure.span(), + "multiple args without manually defined boundaries are not allowed", + )); } let name_set: FxHashSet = args.iter().map(|el| el.0.clone()).collect(); - args.into_iter() - .map(|(name, ty)| { - let range_expr = if is_primitive_number(&ty) { - let bounds = Self::extract_bounds(closure.clone(), &name, &name_set); - let mut upper_bound_opt = None; - let mut lower_bound_opt = None; + let mut boundaries: Vec<((String, syn::Type), syn::ExprRange)> = Vec::new(); + for (name, ty) in args.iter() { + let range_expr: syn::ExprRange = if is_primitive_number(ty) { + let bounds = Self::extract_bounds(closure.clone(), name, &name_set); + let mut upper_bound_opt = None; + let mut lower_bound_opt = None; - // if there are multiple variables, potentially with dependencies - // the loops need to be in a specific order - assert!(bounds.len() <= 2); - let mut include_upper = true; // if we have the MAX upper limit, - for Boundary { - kind, - bound, - included, - .. - } in bounds.iter() - { - println!("Trying to define boundaries"); - // include it - match *kind { - BoundaryKind::Upper => { - // first idea was to add one here if inclusive, but - // this can lead to overflows! Need to use ..=x syntax - assert!(upper_bound_opt.is_none()); - println!("found upper bound, end included: {}", *included); - upper_bound_opt = Some(bound.clone()); - include_upper = *included; + // if there are multiple variables, potentially with dependencies + // the loops need to be in a specific order + assert!(bounds.len() <= 2); + let mut include_upper = true; // if we have the MAX upper limit, + for Boundary { + kind, + bound, + included, + .. + } in bounds.iter() + { + // include it + match *kind { + BoundaryKind::Upper => { + // first idea was to add one here if inclusive, but + // this can lead to overflows! Need to use ..=x syntax + if upper_bound_opt.is_some() { + return Err(syn::Error::new( + closure.span(), + format!( + "Runtime checks: multiple upper bounds defined for {}", + name + ), + )); } - BoundaryKind::Lower => { - lower_bound_opt = if *included { - // lower bound works the other way around - Some(bound.clone()) - } else { - Some(parse_quote! { - #bound + 1 - }) - } + upper_bound_opt = Some(bound.clone()); + include_upper = *included; + } + BoundaryKind::Lower => { + if lower_bound_opt.is_some() { + return Err(syn::Error::new( + closure.span(), + format!( + "Runtime checks: multiple lower bounds defined for {}", + name + ), + )); + }; + lower_bound_opt = if *included { + // lower bound works the other way around + Some(bound.clone()) + } else { + Some(parse_quote! { + #bound + 1 + }) } } } - let upper_bound = - upper_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => - #ty::MAX - }); - let lower_bound = - lower_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => - #ty::MIN - }); + } + // TODO: proper rules for when we actually want to use + // min values (e.g. unsigned types), and max values + // (e.g. u8/i8 is still efficient) + let upper_bound = + upper_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => + #ty::MAX + }); + let lower_bound = + lower_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => + #ty::MIN + }); - if include_upper { - parse_quote_spanned! {closure.span() => - (#lower_bound)..=(#upper_bound) - } - } else { - parse_quote_spanned! {closure.span() => - (#lower_bound)..(#upper_bound) - } + if include_upper { + parse_quote_spanned! {closure.span() => + (#lower_bound)..=(#upper_bound) } } else { - todo!() - }; - ((name, ty), range_expr) - }) - .collect() + parse_quote_spanned! {closure.span() => + (#lower_bound)..(#upper_bound) + } + } + } else { + return Err(syn::Error::new( + closure.span(), + format!( + "Runtime checks: quantifier over type {} is not supported", + ty.to_token_stream() + ), + )); + }; + boundaries.push(((name.clone(), ty.clone()), range_expr)); + } + Ok(boundaries) } pub fn extract_bounds( @@ -316,14 +361,6 @@ pub fn simplify_expression(expr: &syn::Expr) -> syn::Expr { expr.clone() } -// if expression is a identifier, get the name: -pub fn expression_name(expr: &syn::Expr) -> Option { - if let syn::Expr::Path(syn::ExprPath { path, .. }) = expr { - return Some(path.to_token_stream().to_string()); - } - None -} - #[derive(Clone)] pub struct Boundary { pub bound: syn::Expr, diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs b/prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs new file mode 100644 index 00000000000..d1874c0479c --- /dev/null +++ b/prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs @@ -0,0 +1,102 @@ +use proc_macro2::{Span, TokenStream}; +use quote::{quote_spanned, quote}; +use syn::{parse_quote_spanned, spanned::Spanned}; + +const FAILURE_MESSAGE_STR: &str = "_prusti_rtc_failure_message"; +const BUFFER_IDENT: &str = "_prusti_rtc_info_buffer"; +const BUFFER_LEN_IDENT: &str = "_prusti_rtc_info_len"; + +pub(crate) fn failure_message_ident(span: Span) -> syn::Ident { + syn::Ident::new(FAILURE_MESSAGE_STR, span) +} + +pub(crate) fn buffer_ident(span: Span) -> syn::Ident { + syn::Ident::new(BUFFER_IDENT, span) +} + +pub(crate) fn buffer_len_ident(span: Span) -> syn::Ident { + syn::Ident::new(BUFFER_LEN_IDENT, span) +} + +pub(crate) fn define_failure_message(span: Span, message: &String) -> TokenStream { + if cfg!(feature="std") { + let ident = failure_message_ident(span); + quote_spanned! {span => + let mut #ident = #message.to_string(); + } + } else { + let failure_message_len = message.len(); + let buffer_length = message.len() * 5; + let buffer_ident = buffer_ident(span); + let buffer_len_ident = buffer_len_ident(span); + quote_spanned! {span => + let mut #buffer_ident = [0u8; #buffer_length]; + let mut #buffer_len_ident = #failure_message_len; + #buffer_ident[..#buffer_len_ident].copy_from_slice(#message.as_bytes()); + } + } +} + +/// Create a str from the buffer of the error message (only required +/// in case std is not available) +pub(crate) fn construct_failure_message_opt(span: Span) -> Option { + let ident = failure_message_ident(span); + if !cfg!(feature="std") { + Some(quote_spanned!(span => + let #ident: &str = ::core::str::from_utf8(&_prusti_rtc_info_buffer[.._prusti_rtc_info_len]).unwrap(); + )) + } else { + None + } +} + +pub(crate) fn call_check_expr(expr: syn::Expr, message: String) -> syn::Expr { + let span = expr.span(); + if cfg!(feature="std") { + let failure_message_ident = failure_message_ident(span); + parse_quote_spanned! {span=> + ::prusti_contracts::runtime_check_internals::check_expr(#expr, #message, &mut #failure_message_ident) + } + } else { + let buffer_ident = buffer_ident(span); + let buffer_len_ident = buffer_len_ident(span); + parse_quote_spanned! {span => + ::prusti_contracts::runtime_check_internals::check_expr(#expr, #message, &mut #buffer_ident, &mut #buffer_len_ident) + } + } +} + +pub(crate) fn extend_error_indexed(expr: &syn::Expr, name_token: &TokenStream) -> syn::Block { + let span = expr.span(); + let expr_string = expr.span().source_text().unwrap_or_else(|| quote!(expr).to_string()); + let error_string = format!("\n\t> expression {} was violated for index {}=", expr_string, name_token); + if cfg!(feature="std") { + let failure_message_ident = failure_message_ident(span); + parse_quote_spanned!{span=> + { + #failure_message_ident.push_str(#error_string); + #failure_message_ident.push_str(format!("{}", #name_token).as_str()); + } + } + } else { + let buffer_ident = buffer_ident(span); + let buffer_len_ident = buffer_len_ident(span); + let error_len = error_string.len(); + parse_quote_spanned! {span => + { + #buffer_ident[#buffer_len_ident..#buffer_len_ident+#error_len] + .copy_from_slice(#error_string.as_bytes()); + let num_str = ::prusti_contracts::runtime_check_internals::num_to_str( + #name_token, + &mut num_buffer + ); + #buffer_ident[ + #buffer_len_ident+#error_len..#buffer_len_ident+#error_len+num_str.len() + ].copy_from_slice(num_str.as_bytes()); + #buffer_len_ident = #buffer_len_ident + + #error_len + + num_str.len(); + } + } + } +} diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs b/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs index 2ff026246b1..1f29e1611a4 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs @@ -4,3 +4,4 @@ mod boundary_extraction; mod associated_function_info; mod visitor; mod quantifiers; +mod error_messages; diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs b/prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs index 5a5b1c542f2..87920fe1a65 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs @@ -1,8 +1,10 @@ -use crate::runtime_checks::boundary_extraction::{is_primitive_number, BoundExtractor}; +use crate::runtime_checks::{ + boundary_extraction::{is_primitive_number, BoundExtractor}, + error_messages, +}; use proc_macro2::TokenStream; use quote::{quote, ToTokens}; use rustc_hash::FxHashSet; -use syn::{parse_quote, parse_quote_spanned, spanned::Spanned}; pub(crate) enum QuantifierKind { Forall, @@ -13,7 +15,7 @@ pub(crate) fn translate_quantifier_expression( closure: &syn::ExprClosure, kind: QuantifierKind, is_outer: bool, -) -> syn::Expr { +) -> syn::Result { let mut name_set: FxHashSet = FxHashSet::default(); // the variables that occurr as arguments let bound_vars: Vec<(String, syn::Type)> = closure @@ -37,42 +39,23 @@ pub(crate) fn translate_quantifier_expression( }) .collect(); - // look for the runtime_quantifier_bounds attribute: - let manual_bounds = BoundExtractor::manual_bounds(closure.clone(), bound_vars.clone()); - let bounds = manual_bounds - .unwrap_or_else(|| BoundExtractor::derive_ranges(*closure.body.clone(), bound_vars)); + // look for the runtime_quantifier_bounds attribute, or try to derive + // boundaries from expressions of the form `boundary ==> expr` + let manual_bounds_opt = BoundExtractor::manual_bounds(closure.clone(), bound_vars.clone()); + let bounds = if let Some(manual_bounds) = manual_bounds_opt { + manual_bounds? + } else { + BoundExtractor::derive_ranges(*closure.body.clone(), bound_vars)? + }; let mut expr = *closure.body.clone(); for ((name, ty), range_expr) in bounds.iter().rev() { let name_token: TokenStream = name.parse().unwrap(); - let expr_string = expr - .span() - .source_text() - .unwrap_or_else(|| quote!(expr).to_string()); - let error_string = format!( - "\n\t> expression {} was violated for index {}=", - expr_string, name_token - ); - let error_len = error_string.len(); - // extend the error message if it's a type we know we can - // present to the user - let info_statements: syn::Block = if is_primitive_number(ty) && is_outer { - parse_quote_spanned! {expr.span() => { - prusti_rtc_info_buffer[prusti_rtc_info_len..prusti_rtc_info_len+#error_len].copy_from_slice(#error_string.as_bytes()); - let num_str = ::prusti_contracts::runtime_check_internals::num_to_str( - #name_token, - &mut num_buffer - ); - prusti_rtc_info_buffer[ - prusti_rtc_info_len+#error_len..prusti_rtc_info_len+#error_len+num_str.len() - ].copy_from_slice(num_str.as_bytes()); - prusti_rtc_info_len = prusti_rtc_info_len - + #error_len - + num_str.len(); - }} + let info_statements = if is_primitive_number(ty) && is_outer { + Some(error_messages::extend_error_indexed(&expr, &name_token)) } else { - parse_quote! {{}} + None }; // maybe never turn them into strings in the first place.. @@ -113,5 +96,5 @@ pub(crate) fn translate_quantifier_expression( } } } - expr + Ok(expr) } diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 7574f5cf191..1f7ccde95c8 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -4,11 +4,12 @@ use crate::{ runtime_checks::{ associated_function_info::{create_argument, Argument, AssociatedFunctionInfo}, check_type::CheckItemType, + error_messages, visitor::CheckVisitor, }, specifications::{common::SpecificationId, untyped}, }; -use proc_macro2::TokenStream; +use proc_macro2::{Span, TokenStream}; use quote::quote_spanned; use syn::{parse_quote, parse_quote_spanned, spanned::Spanned, visit_mut::VisitMut}; @@ -24,6 +25,7 @@ pub fn translate_runtime_checks( // the function this contract is attached to item: &untyped::AnyFnItem, ) -> syn::Result { + let span = tokens.span(); // get signature information about the associated function let function_info = AssociatedFunctionInfo::new(item)?; let mut visitor = CheckVisitor::new(function_info, check_type); @@ -32,6 +34,8 @@ pub fn translate_runtime_checks( // make the expression checkable at runtime: let mut expr: syn::Expr = syn::parse2(tokens.clone())?; visitor.visit_expr_mut(&mut expr); + // get updated function info, telling us if arguments were used in + // old. let function_info = visitor.function_info; let item_name = syn::Ident::new( @@ -41,29 +45,21 @@ pub fn translate_runtime_checks( item.sig().ident, check_id ), - item.span(), + span, ); let check_id_str = check_id.to_string(); let item_name_str = item_name.to_string(); - // Does pledge rhs need result? Probably not, at that point - // it should have expired - let result_arg_opt = if check_type.needs_result() { - Some(AstRewriter::generate_result_arg(item)) - } else { - None - }; - let forget_statements = generate_forget_statements(item, check_type); - let contract_string = tokens - .span() - .source_text() - .unwrap_or_else(|| tokens.to_string()); + let forget_statements = generate_forget_statements(item, check_type, span); + let contract_string = span.source_text().unwrap_or_else(|| tokens.to_string()); let failure_message = format!( "Prusti Runtime Checks: Contract {} was violated at runtime", check_type.wrap_contract(&contract_string) ); - let failure_message_len = failure_message.len(); + let failure_message_ident = error_messages::failure_message_ident(span); + let failure_message_definition = error_messages::define_failure_message(span, &failure_message); + let failure_message_construction = error_messages::construct_failure_message_opt(span); let id_attr: syn::Attribute = if check_type == CheckItemType::PledgeLhs { parse_quote_spanned! {item.span() => #[prusti::check_before_expiry_id = #check_id_str] @@ -73,34 +69,35 @@ pub fn translate_runtime_checks( #[prusti::check_id = #check_id_str] } }; - - // we create a buffer for the final panic message, that can be extended - // with more precise error information such as which part of the expression - // failed, or which indeces of a quantifier caused a failure - let buffer_length = failure_message.len() * 5; - - let debug_print_stmt: Option = std::env::var("PRUSTI_DEBUG_RUNTIME_CHECKS") - .map_or(None, |value| { - (value == "true").then(|| { - quote_spanned! {item.span() => - println!("check function {} is performed", #item_name_str); - } + // only insert print statements if this flag is set (requires std!) + let debug_print_stmt: Option = if std::env::var("PRUSTI_DEBUG_RUNTIME_CHECKS") + .unwrap_or_default() + == "true" + { + if cfg!(feature = "std") { + Some(quote_spanned! {span => + println!("check function {} is performed", #item_name_str); }) - }); + } else { + // warn user that debug information will not be emitted in no_std + span.unwrap().warning("enabling PRUSTI_DEBUG_RUNTIME_CHECKS only has an effect if feature \"std\" is enabled too").emit(); + None + } + } else { + None + }; + let mut check_item: syn::ItemFn = parse_quote_spanned! {item.span() => - #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case)] + #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case, forgetting_copy_types)] #[prusti::spec_only] #id_attr fn #item_name() { #debug_print_stmt - let mut prusti_rtc_info_buffer = [0u8; #buffer_length]; - let mut prusti_rtc_info_len = #failure_message_len; - prusti_rtc_info_buffer[..prusti_rtc_info_len].copy_from_slice(#failure_message.as_bytes()); - + #failure_message_definition if !(#expr) { - let prusti_failure_message: &str = ::core::str::from_utf8(&prusti_rtc_info_buffer[..prusti_rtc_info_len]).unwrap(); + #failure_message_construction #forget_statements - ::core::panic!("{}", prusti_failure_message) + ::core::panic!("{}", #failure_message_ident) }; // now forget about all the values since they are still owned // by the calling function @@ -112,10 +109,11 @@ pub fn translate_runtime_checks( check_item.sig.inputs = item.sig().inputs.clone(); } if check_type.needs_result() { - check_item.sig.inputs.push(result_arg_opt.unwrap()); + let result_arg = AstRewriter::generate_result_arg(item); + check_item.sig.inputs.push(result_arg); } if check_type.gets_old_args() { - let old_arg = construct_old_fnarg(&function_info, item, false); + let old_arg = construct_old_fnarg(&function_info, span, false); // put it inside a reference: check_item.sig.inputs.push(old_arg); } @@ -150,13 +148,14 @@ pub fn translate_expression_runtime( "Prusti Runtime Checks: Contract {} was violated at runtime", check_type.wrap_contract(&expr_str) ); - let mut expr: syn::Expr = syn::parse2(tokens).unwrap(); + let mut expr: syn::Expr = syn::parse2(tokens)?; // TODO: properly pass check types - let mut check_visitor = CheckVisitor::new(function_info, CheckItemType::Assert); + let mut check_visitor = CheckVisitor::new(function_info, check_type); check_visitor.visit_expr_mut(&mut expr); - let failure_message_len = failure_message.len(); - let buffer_length = failure_message_len * 5; + let failure_message_ident = error_messages::failure_message_ident(span); + let failure_message_definition = error_messages::define_failure_message(span, &failure_message); + let failure_message_construction = error_messages::construct_failure_message_opt(span); Ok(quote_spanned! {span => { #[prusti::check_only] @@ -166,12 +165,10 @@ pub fn translate_expression_runtime( || -> bool { true }; - let mut prusti_rtc_info_buffer = [0u8; #buffer_length]; - let mut prusti_rtc_info_len = #failure_message_len; - prusti_rtc_info_buffer[..prusti_rtc_info_len].copy_from_slice(#failure_message.as_bytes()); + #failure_message_definition if !(#expr) { - let prusti_failure_message: &str = ::core::str::from_utf8(&prusti_rtc_info_buffer[..prusti_rtc_info_len]).unwrap(); - ::core::panic!("{}", prusti_failure_message); + #failure_message_construction + ::core::panic!("{}", #failure_message_ident); } } }) @@ -180,6 +177,7 @@ pub fn translate_expression_runtime( pub fn generate_forget_statements( item: &untyped::AnyFnItem, check_type: CheckItemType, + span: Span, ) -> syn::Block { // go through all inputs, if they are not references add a forget // statement @@ -189,8 +187,8 @@ pub fn generate_forget_statements( if let Ok(arg) = create_argument(&fn_arg, 0) { let name: TokenStream = arg.name.parse().unwrap(); if !arg.is_ref { - stmts.push(parse_quote! { - ::core::mem::forget(#name); + stmts.push(parse_quote_spanned! { span => + let _ = ::core::mem::forget(#name); }) } } @@ -199,8 +197,8 @@ pub fn generate_forget_statements( // result might be double freed too if moved into a check function if check_type.needs_result() { - stmts.push(parse_quote! { - std::mem::forget(result); + stmts.push(parse_quote_spanned! { span => + let _ = ::core::mem::forget(result); }) } syn::Block { @@ -210,18 +208,18 @@ pub fn generate_forget_statements( } // at the moment deref is false in all use cases. Remove -fn construct_old_fnarg( +fn construct_old_fnarg( function_info: &AssociatedFunctionInfo, - item: &T, + span: Span, deref: bool, ) -> syn::FnArg { - let old_values_type: syn::Type = old_values_type(item, function_info); + let old_values_type: syn::Type = old_values_type(span, function_info); if deref { - parse_quote_spanned! {item.span() => + parse_quote_spanned! {span => old_values: &#old_values_type } } else { - parse_quote_spanned! {item.span() => + parse_quote_spanned! {span => old_values: #old_values_type } } @@ -231,8 +229,8 @@ fn construct_old_fnarg( /// can be used to generate the type of the old_values tuple /// important here is that it only contains the values that actually occurr /// in old-expressions and not just all arguments -fn old_values_type(item: &T, function_info: &AssociatedFunctionInfo) -> syn::Type { - let mut old_values_type: syn::Type = parse_quote_spanned! {item.span() => ()}; +fn old_values_type(span: Span, function_info: &AssociatedFunctionInfo) -> syn::Type { + let mut old_values_type: syn::Type = parse_quote_spanned! {span => ()}; let mut arguments = function_info.inputs.values().collect::>(); // order the elements of the map by index arguments.sort_by(|a, b| a.index.partial_cmp(&b.index).unwrap()); @@ -243,7 +241,8 @@ fn old_values_type(item: &T, function_info: &AssociatedFunctionInfo) elems.push(arg.ty.clone()); } else { // if argument is never used in old, we use a unit type - // in the tuple + // in the tuple (this is then also used in the mir processing + // to determine that an argument doesn't need to be cloned) let unit_type: syn::Type = parse_quote_spanned! {arg.span => ()}; elems.push(unit_type); } diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs b/prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs index 069927fbef3..79d5818ae6d 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs @@ -1,7 +1,7 @@ use crate::runtime_checks::{ associated_function_info::AssociatedFunctionInfo, - boundary_extraction, check_type::CheckItemType, + error_messages, quantifiers::{translate_quantifier_expression, QuantifierKind}, }; use proc_macro2::TokenStream; @@ -10,9 +10,9 @@ use syn::{parse_quote_spanned, spanned::Spanned, visit_mut::VisitMut, Expr}; pub(crate) struct CheckVisitor { pub function_info: AssociatedFunctionInfo, + pub check_type: CheckItemType, pub within_old: bool, pub within_before_expiry: bool, - pub check_type: CheckItemType, /// Whether the current expression is part of the outermost /// expression. If yes, and we encounter a conjunction or /// forall quantifier, we can extend the reported error with @@ -25,9 +25,9 @@ impl CheckVisitor { pub(crate) fn new(function_info: AssociatedFunctionInfo, check_type: CheckItemType) -> Self { Self { function_info, + check_type, within_old: false, within_before_expiry: false, - check_type, is_outer: true, contains_conjunction: false, } @@ -71,7 +71,7 @@ impl VisitMut for CheckVisitor { self.is_outer = false; let path_expr = (*call.func).clone(); // move this function, has nothing to do with boundary extraction - let name = if let Some(name) = boundary_extraction::expression_name(&path_expr) { + let name = if let Some(name) = expression_name(&path_expr) { name } else { // still visit recursively @@ -82,7 +82,7 @@ impl VisitMut for CheckVisitor { ":: prusti_contracts :: old" | "prusti_contracts :: old" | "old" => { // for this function we can savely try to get // more precise errors about the contents - self.is_outer = true; + self.is_outer = was_outer; // for prusti_assert etc we can not resolve old here if self.check_type.is_inlined() { syn::visit_mut::visit_expr_call_mut(self, call); @@ -111,7 +111,13 @@ impl VisitMut for CheckVisitor { if let syn::Expr::Closure(mut expr_closure) = quant_closure_expr { // since this is a conjunction, we can get // more information about subexpressions failing - self.is_outer = was_outer; + // (however, if we are in no_std, we cannot report + // errors recursively because of limited buffer size) + self.is_outer = if cfg!(feature = "std") { + was_outer + } else { + false + }; self.visit_expr_mut(&mut expr_closure.body); // we are throwing away any triggers // extract all the relevant information, construct a @@ -120,24 +126,30 @@ impl VisitMut for CheckVisitor { &expr_closure, QuantifierKind::Forall, was_outer, - ); + ).unwrap_or_else(|err| syn::parse2(err.to_compile_error()).unwrap()); *expr = check_expr; } } ":: prusti_contracts :: exists" => { // here we don't want every failing iteration // to give us additional info syn::visit_mut::visit_expr_call_mut(self, call); - // extend self.surround_quantifiers correctly! let closure_expression: syn::Expr = call.args.last().unwrap().clone(); if let syn::Expr::Closure(expr_closure) = closure_expression { let check_expr = translate_quantifier_expression( &expr_closure, QuantifierKind::Exists, false, - ); - *expr = check_expr + ).unwrap_or_else(|err| syn::parse2(err.to_compile_error()).unwrap()); + *expr = check_expr; } }, + // some cases where we want to warn users that these features + // will not be checked correctly: (not complete yet) + ":: prusti_contracts :: snapshot_equality" | "prusti_contracts :: snapshot_equality" | "snapshot_equality" + | ":: prusti_contracts :: snap" | "prusti_contracts :: snap" | "snap" => { + let message = format!("Runtime checks: Use of unsupported feature {}", expr.to_token_stream()); + expr.span().unwrap().warning(message).emit(); + } _ => syn::visit_mut::visit_expr_mut(self, expr), } }, @@ -160,15 +172,11 @@ impl VisitMut for CheckVisitor { // the expression will be split up even further if !left_contains_conjunction { - let new_left = parse_quote_spanned!{left.span() => - ::prusti_contracts::runtime_check_internals::check_expr(#left, #left_error_str, &mut prusti_rtc_info_buffer, &mut prusti_rtc_info_len) - }; + let new_left = error_messages::call_check_expr(left.clone(), left_error_str); *left = new_left; } if !right_contains_conjunction { - let new_right = parse_quote_spanned! {right.span() => - ::prusti_contracts::runtime_check_internals::check_expr(#right, #right_error_str, &mut prusti_rtc_info_buffer, &mut prusti_rtc_info_len) - }; + let new_right = error_messages::call_check_expr(right.clone(), right_error_str); *right = new_right; } // signal to parent that it doesnt need to wrap this expression @@ -187,3 +195,11 @@ impl VisitMut for CheckVisitor { self.is_outer = was_outer; } } + +// if expression is a identifier, get the name: +pub fn expression_name(expr: &syn::Expr) -> Option { + if let syn::Expr::Path(syn::ExprPath { path, .. }) = expr { + return Some(path.to_token_stream().to_string()); + } + None +} diff --git a/prusti-rustc-interface/src/lib.rs b/prusti-rustc-interface/src/lib.rs index 9480a050035..43769b3ae0d 100644 --- a/prusti-rustc-interface/src/lib.rs +++ b/prusti-rustc-interface/src/lib.rs @@ -24,6 +24,7 @@ pub extern crate rustc_serialize as serialize; pub extern crate rustc_session as session; pub extern crate rustc_span as span; pub extern crate rustc_target as target; +pub extern crate rustc_mir_build as mir_build; // TODO: switch over to `rustc_smir` once RA knows about the crate // pub use rustc_smir::very_unstable::{borrowck, dataflow, hir, middle, trait_selection}; diff --git a/prusti-tests/tests/cargo_verify/test_no_std/Cargo.toml b/prusti-tests/tests/cargo_verify/test_no_std/Cargo.toml index 1785eb1d4b5..11697f3260f 100644 --- a/prusti-tests/tests/cargo_verify/test_no_std/Cargo.toml +++ b/prusti-tests/tests/cargo_verify/test_no_std/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" [dependencies] libc = { version = "0.2", default-features = false } -prusti-contracts = { path = "prusti-contracts/prusti-contracts" } # The test suite will prepare a symbolic link for this +prusti-contracts = { path = "prusti-contracts/prusti-contracts", default-features = false } # The test suite will prepare a symbolic link for this [profile.dev] panic = "abort" diff --git a/prusti-tests/tests/parse/ui/nostd.rs b/prusti-tests/tests/parse/ui/nostd.rs index 2a60ddb3ee4..443f3124f29 100644 --- a/prusti-tests/tests/parse/ui/nostd.rs +++ b/prusti-tests/tests/parse/ui/nostd.rs @@ -1,3 +1,5 @@ +// ignore-test + //! This ui-test makes sure that `prusti-contracts` does not depend on the Rust standard library. //! If this test fails (i.e. this file compiles successfully), then `prusti-contracts` depends on the standard library. #![no_std] diff --git a/prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.rs b/prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.rs new file mode 100644 index 00000000000..210b74926ab --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.rs @@ -0,0 +1,24 @@ +//@compile-flags: -Pcheck_overflows=false -Phide_uuids=true -Pquiet=true +//@check-pass +use prusti_contracts::*; + +#[trusted] +fn main() { + let s1 = S { x: 1 }; + let s2 = S { x: 1 }; + foo(s1, s2); +} + +// this should generate a warning, since snapshot equality currently +// is not checked correctly at runtime. Unfortunately the emitted +// warning is currently not properly parsed by ui_test +// if annotated with a comment. +#[insert_runtime_check] +#[requires(x === y)] +fn foo(x: S, y: S) -> i32 { + x.x + y.x +} + +struct S { + x: i32, +} diff --git a/prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.stderr b/prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.stderr new file mode 100644 index 00000000000..d3886f710ef --- /dev/null +++ b/prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.stderr @@ -0,0 +1,8 @@ +warning: Runtime checks: Use of unsupported feature snapshot_equality(& (x), & (y)) + --> $DIR/warn-unsupported-snapeq.rs:17:12 + | +17 | #[requires(x === y)] + | ^^^^^^^ + +warning: 1 warning emitted + diff --git a/prusti-utils/src/launch/mod.rs b/prusti-utils/src/launch/mod.rs index c546e107c2c..96bb51e704e 100644 --- a/prusti-utils/src/launch/mod.rs +++ b/prusti-utils/src/launch/mod.rs @@ -328,7 +328,7 @@ fn classify_line(line: &str) -> Option { let cname = line.next()?; // We want to allow having crates which enable the `prusti` feature, thus anything that // depends on them need not add `prusti-contracts` as a direct dependency. - if cname != "prusti-contracts" || feats != "[]" { + if cname != "prusti-contracts" && !feats.contains("prusti") { return None; } depth.parse().ok() diff --git a/prusti-viper/src/encoder/errors/error_manager.rs b/prusti-viper/src/encoder/errors/error_manager.rs index eb80eb58134..c8787f48a3e 100644 --- a/prusti-viper/src/encoder/errors/error_manager.rs +++ b/prusti-viper/src/encoder/errors/error_manager.rs @@ -399,7 +399,7 @@ impl<'tcx> ErrorManager<'tcx> { ("assert.failed:assertion.false", ErrorCtxt::AssertTerminator(ref message, def_id, bb, ignore)) => { if *ignore { globals::set_assertion_violated(*def_id, *bb); - PrustiError::ignore_verification(format!("failing assertion used for mir optimization, bug if seen by a user"), error_span) + PrustiError::ignore_verification("failing assertion used for mir optimization, bug if seen by a user", error_span) } else { PrustiError::verification(format!("assertion might fail with \"{message}\""), error_span) .set_failing_assertion(opt_cause_span) diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index ae178b9cd24..1d4a048f169 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -22,6 +22,7 @@ use prusti_rustc_interface::{ session::{EarlyErrorHandler, Session}, span::def_id::{DefId, LocalDefId, LOCAL_CRATE}, trait_selection::traits, + mir_build, }; #[derive(Default)] @@ -158,10 +159,9 @@ pub(crate) fn mir_drops_elaborated(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal( tcx: TyCtxt<'tcx>, local_decls: &IndexVec>, ) { - let mir_info = MirInfo::collect_mir_info(tcx, body.clone(), def_id, &local_decls); + let mir_info = MirInfo::collect_mir_info(tcx, body.clone(), def_id, local_decls); let attrs = tcx.get_attrs_unchecked(def_id); let is_spec_fn = utils::has_spec_only_attr(attrs); let def_kind = tcx.def_kind(def_id); @@ -21,7 +21,7 @@ pub(crate) fn insert_runtime_checks<'tcx>( // MAKE MODIFICATIONS: // replace old arguments - let mut old_arg_replacer = passes::CloneOldArgs::new(tcx, &mir_info, def_id, &local_decls); + let mut old_arg_replacer = passes::CloneOldArgs::new(tcx, &mir_info, def_id, local_decls); // first we just create locals for old clones and replace them where arguments // should be evaluated in an old state old_arg_replacer.create_variables(body); @@ -29,7 +29,7 @@ pub(crate) fn insert_runtime_checks<'tcx>( // we dont insert pledge checks for specification functions if !is_spec_fn && !is_anon_const { // insert pledge checks: - let mut pledge_inserter = passes::PledgeInserter::new(tcx, &mir_info, def_id, &local_decls); + let mut pledge_inserter = passes::PledgeInserter::new(tcx, &mir_info, def_id, local_decls); pledge_inserter.run(body); } @@ -37,11 +37,11 @@ pub(crate) fn insert_runtime_checks<'tcx>( prepend_dummy_block(body); // insert preconditions let mut precondition_inserter = - passes::PreconditionInserter::new(tcx, &mir_info, def_id, &local_decls); + passes::PreconditionInserter::new(tcx, &mir_info, def_id, local_decls); precondition_inserter.run(body); // insert postconditions let mut postcondition_inserter = - passes::PostconditionInserter::new(tcx, &mir_info, def_id, &local_decls); + passes::PostconditionInserter::new(tcx, &mir_info, def_id, local_decls); postcondition_inserter.run(body); old_arg_replacer.clone_and_drop_variables(body); diff --git a/prusti/src/modify_mir/passes/insert_pledge_checks.rs b/prusti/src/modify_mir/passes/insert_pledge_checks.rs index 59419f39f28..258c1000bd9 100644 --- a/prusti/src/modify_mir/passes/insert_pledge_checks.rs +++ b/prusti/src/modify_mir/passes/insert_pledge_checks.rs @@ -38,7 +38,7 @@ pub struct PledgeInserter<'tcx, 'a> { first_pass: bool, } -#[derive(PartialEq, Eq, PartialOrd, Clone, Copy)] +#[derive(PartialEq, Eq, Clone, Copy)] enum ExpirationLocation { Location(mir::Location), Edge(mir::BasicBlock, mir::BasicBlock), @@ -61,6 +61,11 @@ impl ExpirationLocation { } // we need to order them such that inserting checks will not offset other // modifications +impl PartialOrd for ExpirationLocation { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} impl Ord for ExpirationLocation { fn cmp(&self, other: &Self) -> Ordering { match self.block().cmp(&other.block()) { @@ -113,14 +118,13 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { } pub fn run(&mut self, body: &mut mir::Body<'tcx>) { - println!("Inserting pledges into function {:?}", self.def_id); self.body_copy = Some(body.clone()); self.patch_opt = Some(MirPatch::new(body).into()); // find all calls to functions with pledges, and create local variables // to store: old_values, before_expiry_place, self.visit_body(body); // If there are no pledges, we can stop here. - if self.pledges_to_process.len() == 0 { + if self.pledges_to_process.is_empty() { return; } // only try to get polonius info after we know that there are indeed @@ -172,7 +176,7 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { for loan in loans_dying.iter() { // check if any of the loans are associated with one of // our pledges: - if let Some(place) = pledge_loans.get(&loan) { + if let Some(place) = pledge_loans.get(loan) { // a pledge is associated with this loan and dies here!! modification_list.push((ExpirationLocation::Location(location), *place)); let pledge = self.pledges_to_process.get(place).unwrap(); @@ -211,7 +215,7 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { // once we know which locals need to be dropped for (modification_location, place) in modification_list.iter() { // remove pledge temporarily so we can modify it - let mut pledge = self.pledges_to_process.remove(&place).unwrap(); + let mut pledge = self.pledges_to_process.remove(place).unwrap(); let (location, is_edge) = match modification_location { ExpirationLocation::Location(loc) => (*loc, false), ExpirationLocation::Edge(_, bb2) => { diff --git a/prusti/src/modify_mir/passes/insert_postconditions.rs b/prusti/src/modify_mir/passes/insert_postconditions.rs index 253d953fa43..8a7e18d1885 100644 --- a/prusti/src/modify_mir/passes/insert_postconditions.rs +++ b/prusti/src/modify_mir/passes/insert_postconditions.rs @@ -41,6 +41,7 @@ impl<'tcx, 'a> PostconditionInserter<'tcx, 'a> { patch_ref.into_inner().apply(body); } + #[allow(clippy::too_many_arguments)] fn surround_call_with_store_and_check( &self, check_id: DefId, diff --git a/prusti/src/modify_mir/passes/remove_dead_code.rs b/prusti/src/modify_mir/passes/remove_dead_code.rs index 9639923efe6..37286fe1355 100644 --- a/prusti/src/modify_mir/passes/remove_dead_code.rs +++ b/prusti/src/modify_mir/passes/remove_dead_code.rs @@ -21,7 +21,7 @@ pub struct DeadCodeElimination<'tcx> { removable_assertions: FxHashSet, } -impl<'tcx, 'a> DeadCodeElimination<'tcx> { +impl<'tcx> DeadCodeElimination<'tcx> { pub fn new(tcx: TyCtxt<'tcx>, def_id: DefId) -> Self { // collect all the blocks that were inserted but didnt generate // a verification error: @@ -111,7 +111,7 @@ impl<'tcx, 'a> DeadCodeElimination<'tcx> { } } -impl<'tcx, 'a> MutVisitor<'tcx> for DeadCodeElimination<'tcx> { +impl<'tcx> MutVisitor<'tcx> for DeadCodeElimination<'tcx> { fn tcx(&self) -> TyCtxt<'tcx> { self.tcx } @@ -138,7 +138,7 @@ impl<'tcx, 'a> MutVisitor<'tcx> for DeadCodeElimination<'tcx> { targets_vec.pop().map(|tup| tup.1) }; if let Some(otherwise) = otherwise_opt { - if targets_vec.len() == 0 { + if targets_vec.is_empty() { Some(mir::TerminatorKind::Goto { target: otherwise }) } else { let switch_targets = From de67aa41516aa29596b555fafa406d783d295886 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Wed, 6 Sep 2023 12:00:45 +0200 Subject: [PATCH 36/45] Run formatting --- .../prusti-contracts-proc-macros/src/lib.rs | 8 +++-- .../src/expression_with_attributes.rs | 11 ++---- prusti-contracts/prusti-specs/src/lib.rs | 34 +++++++++++-------- prusti-contracts/prusti-specs/src/rewriter.rs | 5 +-- .../src/runtime_checks/boundary_extraction.rs | 5 +-- .../src/runtime_checks/error_messages.rs | 22 +++++++----- .../src/specifications/preparser.rs | 12 ++++--- prusti-launch/src/bin/cargo-prusti.rs | 10 ++++-- prusti-rustc-interface/src/lib.rs | 2 +- .../src/encoder/mir/places/interface.rs | 3 +- .../src/encoder/mir/procedures/encoder/mod.rs | 34 +++++++++++++------ prusti/src/callbacks.rs | 5 ++- .../src/modify_mir/passes/remove_dead_code.rs | 6 +--- 13 files changed, 89 insertions(+), 68 deletions(-) diff --git a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs index 40b4e4d72ff..b690e618704 100644 --- a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs +++ b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs @@ -136,7 +136,6 @@ pub fn quantifier_runtime_bounds(_attr: TokenStream, tokens: TokenStream) -> Tok tokens } - #[cfg(not(feature = "prusti"))] #[proc_macro_attribute] pub fn insert_runtime_check(attr: TokenStream, tokens: TokenStream) -> TokenStream { @@ -295,7 +294,12 @@ pub fn quantifier_runtime_bounds(_attr: TokenStream, tokens: TokenStream) -> Tok #[cfg(feature = "prusti")] #[proc_macro_attribute] pub fn insert_runtime_check(attr: TokenStream, tokens: TokenStream) -> TokenStream { - rewrite_prusti_attributes(SpecAttributeKind::InsertRuntimeCheck, attr.into(), tokens.into()).into() + rewrite_prusti_attributes( + SpecAttributeKind::InsertRuntimeCheck, + attr.into(), + tokens.into(), + ) + .into() } // Ensure that you've also crated a transparent `#[cfg(not(feature = "prusti"))]` // version of your new macro above! diff --git a/prusti-contracts/prusti-specs/src/expression_with_attributes.rs b/prusti-contracts/prusti-specs/src/expression_with_attributes.rs index d2c9e2a631c..228656d72b5 100644 --- a/prusti-contracts/prusti-specs/src/expression_with_attributes.rs +++ b/prusti-contracts/prusti-specs/src/expression_with_attributes.rs @@ -1,6 +1,6 @@ -use syn::parse::{Parse, ParseStream}; use proc_macro2::TokenStream; use quote::quote; +use syn::parse::{Parse, ParseStream}; // By default, attributes can only be attached to // items like functions or closures. The point of this is @@ -17,17 +17,14 @@ impl Parse for ExpressionWithAttributes { fn parse(input: ParseStream) -> syn::Result { let attributes = input.call(syn::Attribute::parse_outer)?; let rest: TokenStream = input.parse().unwrap(); - Ok(Self { - attributes, - rest, - }) + Ok(Self { attributes, rest }) } } // maybe we can make this more generic so it can be used in other places.. impl ExpressionWithAttributes { pub fn remove_runtime_checks_attr(&mut self) -> Option { - if let Some(pos) = self.attributes.iter().position(|attr|{ + if let Some(pos) = self.attributes.iter().position(|attr| { if let Some(ident) = attr.path.get_ident() { if &ident.to_string() == "insert_runtime_check" { return true; @@ -48,5 +45,3 @@ impl ExpressionWithAttributes { attrs } } - - diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index 889c2532a6e..a89cccf62e9 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -37,7 +37,8 @@ use syn::{spanned::Spanned, visit::Visit}; use crate::{ common::{merge_generics, RewritableReceiver, SelfTypeRewriter}, predicate::{is_predicate_macro, ParsedPredicate}, - specifications::preparser::{parse_prusti, parse_type_cond_spec, NestedSpec}, runtime_checks::translation, + runtime_checks::translation, + specifications::preparser::{parse_prusti, parse_type_cond_spec, NestedSpec}, }; pub use extern_spec_rewriter::ExternSpecKind; use parse_closure_macro::ClosureWithSpec; @@ -236,11 +237,7 @@ fn generate_for_requires( if runtime_check { let check_id = rewriter.generate_spec_id(); let check_id_str = check_id.to_string(); - let check_item = rewriter.create_pre_check( - check_id, - attr, - item, - )?; + let check_item = rewriter.create_pre_check(check_id, attr, item)?; items.push(check_item); attrs.push(parse_quote_spanned! {item.span() => #[prusti::pre_check_id_ref = #check_id_str] @@ -274,11 +271,7 @@ fn generate_for_ensures( let check_id = rewriter.generate_spec_id(); let check_id_str = check_id.to_string(); // let store_old_item = rewriter.create_store_check_ensures(check_id, attr, item)?; - let check_item = rewriter.create_post_check( - check_id, - attr, - item, - )?; + let check_item = rewriter.create_post_check(check_id, attr, item)?; items.push(check_item); attrs.push(parse_quote_spanned! {item.span()=> #[prusti::post_check_id_ref = #check_id_str] @@ -539,11 +532,19 @@ pub fn prusti_assertion(tokens: TokenStream) -> TokenStream { } pub fn prusti_assume(tokens: TokenStream) -> TokenStream { - generate_expression_closure(&AstRewriter::process_prusti_assumption, tokens.clone(), CheckItemType::Assume) + generate_expression_closure( + &AstRewriter::process_prusti_assumption, + tokens.clone(), + CheckItemType::Assume, + ) } pub fn prusti_refutation(tokens: TokenStream) -> TokenStream { - generate_expression_closure(&AstRewriter::process_prusti_refutation, tokens, CheckItemType::Unchecked) + generate_expression_closure( + &AstRewriter::process_prusti_refutation, + tokens, + CheckItemType::Unchecked, + ) } /// Generates the TokenStream encoding an expression using prusti syntax @@ -563,8 +564,11 @@ fn generate_expression_closure( let callsite_span = Span::call_site(); let check_id = rewriter.generate_spec_id(); if runtime_attr.is_some() { - let check_closure = - handle_result!(translation::translate_expression_runtime(prusti_tokens, check_id, check_type)); + let check_closure = handle_result!(translation::translate_expression_runtime( + prusti_tokens, + check_id, + check_type + )); quote_spanned! {callsite_span=> #[allow(unused_must_use, unused_variables, unused_braces, unused_parens)] #[prusti::specs_version = #SPECS_VERSION] diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index 7a6dfedb00b..a5715b28105 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -1,9 +1,6 @@ use crate::{ common::HasSignature, - runtime_checks::{ - check_type::CheckItemType, - translation::{translate_runtime_checks}, - }, + runtime_checks::{check_type::CheckItemType, translation::translate_runtime_checks}, specifications::{ common::{SpecificationId, SpecificationIdGenerator}, preparser::{parse_prusti, parse_prusti_assert_pledge, parse_prusti_pledge}, diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs index be4a6315853..998d1f95d34 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs @@ -54,10 +54,7 @@ impl BoundExtractor { "Runtime checks: the provided number of ranges does not match the number of closure arguments."))); } assert!(bounds_vec.len() == bound_vars.len()); - Some(Ok(bound_vars - .into_iter() - .zip(bounds_vec) - .collect())) + Some(Ok(bound_vars.into_iter().zip(bounds_vec).collect())) } // if this function is called, the ranges are mandatory! diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs b/prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs index d1874c0479c..73a32bd008b 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs @@ -1,5 +1,5 @@ use proc_macro2::{Span, TokenStream}; -use quote::{quote_spanned, quote}; +use quote::{quote, quote_spanned}; use syn::{parse_quote_spanned, spanned::Spanned}; const FAILURE_MESSAGE_STR: &str = "_prusti_rtc_failure_message"; @@ -19,7 +19,7 @@ pub(crate) fn buffer_len_ident(span: Span) -> syn::Ident { } pub(crate) fn define_failure_message(span: Span, message: &String) -> TokenStream { - if cfg!(feature="std") { + if cfg!(feature = "std") { let ident = failure_message_ident(span); quote_spanned! {span => let mut #ident = #message.to_string(); @@ -41,7 +41,7 @@ pub(crate) fn define_failure_message(span: Span, message: &String) -> TokenStrea /// in case std is not available) pub(crate) fn construct_failure_message_opt(span: Span) -> Option { let ident = failure_message_ident(span); - if !cfg!(feature="std") { + if !cfg!(feature = "std") { Some(quote_spanned!(span => let #ident: &str = ::core::str::from_utf8(&_prusti_rtc_info_buffer[.._prusti_rtc_info_len]).unwrap(); )) @@ -52,7 +52,7 @@ pub(crate) fn construct_failure_message_opt(span: Span) -> Option { pub(crate) fn call_check_expr(expr: syn::Expr, message: String) -> syn::Expr { let span = expr.span(); - if cfg!(feature="std") { + if cfg!(feature = "std") { let failure_message_ident = failure_message_ident(span); parse_quote_spanned! {span=> ::prusti_contracts::runtime_check_internals::check_expr(#expr, #message, &mut #failure_message_ident) @@ -68,11 +68,17 @@ pub(crate) fn call_check_expr(expr: syn::Expr, message: String) -> syn::Expr { pub(crate) fn extend_error_indexed(expr: &syn::Expr, name_token: &TokenStream) -> syn::Block { let span = expr.span(); - let expr_string = expr.span().source_text().unwrap_or_else(|| quote!(expr).to_string()); - let error_string = format!("\n\t> expression {} was violated for index {}=", expr_string, name_token); - if cfg!(feature="std") { + let expr_string = expr + .span() + .source_text() + .unwrap_or_else(|| quote!(expr).to_string()); + let error_string = format!( + "\n\t> expression {} was violated for index {}=", + expr_string, name_token + ); + if cfg!(feature = "std") { let failure_message_ident = failure_message_ident(span); - parse_quote_spanned!{span=> + parse_quote_spanned! {span=> { #failure_message_ident.push_str(#error_string); #failure_message_ident.push_str(format!("{}", #name_token).as_str()); diff --git a/prusti-contracts/prusti-specs/src/specifications/preparser.rs b/prusti-contracts/prusti-specs/src/specifications/preparser.rs index 388f1e96050..a5ce1954d3d 100644 --- a/prusti-contracts/prusti-specs/src/specifications/preparser.rs +++ b/prusti-contracts/prusti-specs/src/specifications/preparser.rs @@ -277,9 +277,11 @@ impl PrustiTokenStream { todo!() } Some(PrustiToken::Quantifier(span, kind)) => { - let (mut stream, content_span) = self.pop_group_spanned(Delimiter::Parenthesis).ok_or_else(|| { - error(span, "expected parenthesized expression after quantifier") - })?; + let (mut stream, content_span) = self + .pop_group_spanned(Delimiter::Parenthesis) + .ok_or_else(|| { + error(span, "expected parenthesized expression after quantifier") + })?; let full_span = join_spans(span, content_span); // attrs_opt is potentially None even if everything is good let attrs_opt = stream.pop_quantifier_bound_attr(); @@ -412,7 +414,9 @@ impl PrustiTokenStream { fn pop_group_spanned(&mut self, delimiter: Delimiter) -> Option<(Self, Span)> { match self.tokens.pop_front() { - Some(PrustiToken::Group(span, del, box stream)) if del == delimiter => Some((stream, span)), + Some(PrustiToken::Group(span, del, box stream)) if del == delimiter => { + Some((stream, span)) + } _ => None, } } diff --git a/prusti-launch/src/bin/cargo-prusti.rs b/prusti-launch/src/bin/cargo-prusti.rs index aa643249d86..899c19d9275 100644 --- a/prusti-launch/src/bin/cargo-prusti.rs +++ b/prusti-launch/src/bin/cargo-prusti.rs @@ -59,8 +59,14 @@ where config::no_verify_deps().to_string(), ) // flags that influence ast rewriting - .env("PRUSTI_DEBUG_RUNTIME_CHECKS", config::debug_runtime_checks().to_string()) - .env("PRUSTI_RUNTIME_CHECK_ALL_CONTRACTS", config::debug_runtime_checks().to_string()) + .env( + "PRUSTI_DEBUG_RUNTIME_CHECKS", + config::debug_runtime_checks().to_string(), + ) + .env( + "PRUSTI_RUNTIME_CHECK_ALL_CONTRACTS", + config::debug_runtime_checks().to_string(), + ) // Category A* flags: .env("DEFAULT_PRUSTI_QUIET", "true") .env("DEFAULT_PRUSTI_FULL_COMPILATION", "true") diff --git a/prusti-rustc-interface/src/lib.rs b/prusti-rustc-interface/src/lib.rs index 43769b3ae0d..378e4d913b7 100644 --- a/prusti-rustc-interface/src/lib.rs +++ b/prusti-rustc-interface/src/lib.rs @@ -19,12 +19,12 @@ pub extern crate rustc_infer as infer; pub extern crate rustc_interface as interface; pub extern crate rustc_macros as macros; pub extern crate rustc_metadata as metadata; +pub extern crate rustc_mir_build as mir_build; pub extern crate rustc_mir_transform as mir_transform; pub extern crate rustc_serialize as serialize; pub extern crate rustc_session as session; pub extern crate rustc_span as span; pub extern crate rustc_target as target; -pub extern crate rustc_mir_build as mir_build; // TODO: switch over to `rustc_smir` once RA knows about the crate // pub use rustc_smir::very_unstable::{borrowck, dataflow, hir, middle, trait_selection}; diff --git a/prusti-viper/src/encoder/mir/places/interface.rs b/prusti-viper/src/encoder/mir/places/interface.rs index 2cef1342bad..9ef7ecadbdf 100644 --- a/prusti-viper/src/encoder/mir/places/interface.rs +++ b/prusti-viper/src/encoder/mir/places/interface.rs @@ -327,7 +327,8 @@ impl<'v, 'tcx: 'v> PlacesEncoderInterface<'tcx> for super::super::super::Encoder if !matches!( op, mir::BinOp::Add | mir::BinOp::Sub | mir::BinOp::Mul | mir::BinOp::Shl | mir::BinOp::Shr - ) || (!prusti_common::config::check_overflows() && !prusti_common::config::remove_dead_code()) + ) || (!prusti_common::config::check_overflows() + && !prusti_common::config::remove_dead_code()) { Ok(false.into()) } else { diff --git a/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs b/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs index b95faf40493..b916a11ee68 100644 --- a/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs +++ b/prusti-viper/src/encoder/mir/procedures/encoder/mod.rs @@ -24,15 +24,18 @@ use crate::encoder::{ }; use log::debug; use prusti_common::config; -use prusti_interface::{environment::{ - debug_utils::to_text::ToText, - mir_analyses::{ - allocation::{compute_definitely_allocated, DefinitelyAllocatedAnalysisResult}, - initialization::{compute_definitely_initialized, DefinitelyInitializedAnalysisResult}, +use prusti_interface::{ + environment::{ + debug_utils::to_text::ToText, + mir_analyses::{ + allocation::{compute_definitely_allocated, DefinitelyAllocatedAnalysisResult}, + initialization::{compute_definitely_initialized, DefinitelyInitializedAnalysisResult}, + }, + mir_body::borrowck::{facts::RichLocation, lifetimes::Lifetimes}, + Procedure, }, - mir_body::borrowck::{facts::RichLocation, lifetimes::Lifetimes}, - Procedure, -}, globals}; + globals, +}; use prusti_rustc_interface::{ abi::FieldIdx, data_structures::graph::WithStartNode, @@ -1838,15 +1841,24 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { let ignore = config::remove_dead_code() && (!self.check_panics || (!config::check_overflows() - && matches!(msg, mir::AssertKind::Overflow(..) | mir::AssertKind::OverflowNeg(..)))); + && matches!( + msg, + mir::AssertKind::Overflow(..) | mir::AssertKind::OverflowNeg(..) + ))); let (assert_msg, error_ctxt) = if let mir::AssertKind::BoundsCheck { .. } = msg { let mut s = String::new(); msg.fmt_assert_args(&mut s).unwrap(); - (s, ErrorCtxt::BoundsCheckAssert(self.def_id, location.block, ignore)) + ( + s, + ErrorCtxt::BoundsCheckAssert(self.def_id, location.block, ignore), + ) } else { let assert_msg = msg.description().to_string(); - (assert_msg.clone(), ErrorCtxt::AssertTerminator(assert_msg, self.def_id, location.block, ignore)) + ( + assert_msg.clone(), + ErrorCtxt::AssertTerminator(assert_msg, self.def_id, location.block, ignore), + ) }; let target_label = self.encode_basic_block_label(target); diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index 1d4a048f169..95315327847 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -18,11 +18,11 @@ use prusti_rustc_interface::{ query::{ExternProviders, Providers}, ty::{self, TyCtxt, TypeVisitableExt}, }, + mir_build, mir_transform::{self, inline}, session::{EarlyErrorHandler, Session}, span::def_id::{DefId, LocalDefId, LOCAL_CRATE}, trait_selection::traits, - mir_build, }; #[derive(Default)] @@ -257,8 +257,7 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { } fn is_non_const_function(tcx: TyCtxt<'_>, def_id: DefId) -> bool { - matches!(tcx.def_kind(def_id), DefKind::Fn | DefKind::AssocFn) - && !tcx.is_const_fn(def_id) + matches!(tcx.def_kind(def_id), DefKind::Fn | DefKind::AssocFn) && !tcx.is_const_fn(def_id) } pub fn get_specs<'tcx>( diff --git a/prusti/src/modify_mir/passes/remove_dead_code.rs b/prusti/src/modify_mir/passes/remove_dead_code.rs index 37286fe1355..62bf1505329 100644 --- a/prusti/src/modify_mir/passes/remove_dead_code.rs +++ b/prusti/src/modify_mir/passes/remove_dead_code.rs @@ -63,11 +63,7 @@ impl<'tcx> DeadCodeElimination<'tcx> { } = terminator.kind { // Assertions associated with checked operations - if matches!( - kind, - AssertKind::Overflow(..) - | AssertKind::OverflowNeg(_) - ) { + if matches!(kind, AssertKind::Overflow(..) | AssertKind::OverflowNeg(_)) { // this place should be of the form `_x.1` (the check field // of the result of a checked operation) let place = cond.place().unwrap(); From 2fbeed9984f36a97bd78a479c60f07b6ae048667 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Wed, 6 Sep 2023 13:44:07 +0200 Subject: [PATCH 37/45] Refactoring and resolving clippy warnings --- .../src/runtime_checks/boundary_extraction.rs | 5 +- prusti/src/callbacks.rs | 2 +- prusti/src/modify_mir/mir_modify.rs | 15 ++--- .../modify_mir/passes/insert_pledge_checks.rs | 57 +++---------------- .../passes/insert_postconditions.rs | 21 +++---- .../passes/insert_precondition_checks.rs | 13 +++-- .../src/modify_mir/passes/remove_dead_code.rs | 15 ++--- 7 files changed, 40 insertions(+), 88 deletions(-) diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs index 998d1f95d34..c05e65930f6 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs @@ -4,6 +4,7 @@ use quote::ToTokens; use rustc_hash::FxHashSet; use syn::{self, parse_quote, parse_quote_spanned, spanned::Spanned, visit::Visit, BinOp}; +type LoopBoundaries = ((String, syn::Type), syn::ExprRange); pub(crate) struct BoundExtractor { // the set of bound variables within that expression pub name_set: FxHashSet, @@ -17,7 +18,7 @@ impl BoundExtractor { pub(crate) fn manual_bounds( expr: syn::ExprClosure, bound_vars: Vec<(String, syn::Type)>, - ) -> Option>> { + ) -> Option>> { let manual_bounds = get_attribute_contents( "prusti :: runtime_quantifier_bounds".to_string(), &expr.attrs, @@ -61,7 +62,7 @@ impl BoundExtractor { pub(crate) fn derive_ranges( closure: syn::Expr, args: Vec<(String, syn::Type)>, - ) -> syn::Result> { + ) -> syn::Result> { if args.len() > 1 { return Err(syn::Error::new( closure.span(), diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index 95315327847..190406bbcd2 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -115,7 +115,7 @@ pub(crate) fn mir_drops_elaborated(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal( // we dont insert pledge checks for specification functions if !is_spec_fn && !is_anon_const { // insert pledge checks: - let mut pledge_inserter = passes::PledgeInserter::new(tcx, &mir_info, def_id, local_decls); - pledge_inserter.run(body); + passes::PledgeInserter::run(tcx, &mir_info, def_id, local_decls, body); } // insert a dummy goto block at the beginning of the body prepend_dummy_block(body); // insert preconditions - let mut precondition_inserter = - passes::PreconditionInserter::new(tcx, &mir_info, def_id, local_decls); - precondition_inserter.run(body); + passes::PreconditionInserter::run(tcx, &mir_info, def_id, local_decls, body); // insert postconditions - let mut postcondition_inserter = - passes::PostconditionInserter::new(tcx, &mir_info, def_id, local_decls); - postcondition_inserter.run(body); + passes::PostconditionInserter::run(tcx, &mir_info, def_id, local_decls, body); + old_arg_replacer.clone_and_drop_variables(body); // put specs and env back into globals @@ -55,6 +51,5 @@ pub fn dead_code_elimination<'tcx>(tcx: TyCtxt<'tcx>, body: &mut mir::Body<'tcx> if utils::has_spec_only_attr(attrs) { return; } - let mut remove_dead_blocks = passes::DeadCodeElimination::new(tcx, def_id); - remove_dead_blocks.run(body); + passes::DeadCodeElimination::run(tcx, def_id, body); } diff --git a/prusti/src/modify_mir/passes/insert_pledge_checks.rs b/prusti/src/modify_mir/passes/insert_pledge_checks.rs index 258c1000bd9..1f8dd275904 100644 --- a/prusti/src/modify_mir/passes/insert_pledge_checks.rs +++ b/prusti/src/modify_mir/passes/insert_pledge_checks.rs @@ -27,7 +27,6 @@ pub struct PledgeInserter<'tcx, 'a> { body_info: &'a MirInfo<'tcx>, patch_opt: Option>>, pledges_to_process: FxHashMap, PledgeToProcess<'tcx>>, - body_copy: Option>, def_id: DefId, local_decls: &'a IndexVec>, /// For simplicity we use the same visitor twice, once to find all the @@ -99,27 +98,26 @@ pub struct PledgeToProcess<'tcx> { } impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { - pub fn new( + pub fn run( tcx: TyCtxt<'tcx>, body_info: &'a MirInfo<'tcx>, def_id: DefId, local_decls: &'a IndexVec>, - ) -> Self { - Self { + body: &mut mir::Body<'tcx>, + ) { + let mut inserter = Self { tcx, body_info, - patch_opt: None, + patch_opt: Some(MirPatch::new(body).into()), pledges_to_process: Default::default(), - body_copy: None, def_id, local_decls, first_pass: true, - } + }; + inserter.modify(body); } - pub fn run(&mut self, body: &mut mir::Body<'tcx>) { - self.body_copy = Some(body.clone()); - self.patch_opt = Some(MirPatch::new(body).into()); + fn modify(&mut self, body: &mut mir::Body<'tcx>) { // find all calls to functions with pledges, and create local variables // to store: old_values, before_expiry_place, self.visit_body(body); @@ -473,45 +471,6 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { } } } - // mir::TerminatorKind::SwitchInt { targets, .. } => { - // // find switchInts with a check_only target. - // let switch_iter = targets.iter(); - // if switch_iter.len() == 1 { - // // let (value, target) = switch_iter.next().unwrap(); - // let otherwise = targets.otherwise(); - // // check if target is a check_block: - // if let Some(kind) = self.body_info.check_blocks.get(&otherwise) { - // match kind { - // CheckBlockKind::PledgeExpires(local) => { - // // this check_block should terminate with a goto always! - // if let mir::TerminatorKind::Goto { ref target } = - // self.body_copy.as_ref().unwrap()[otherwise] - // .terminator - // .clone() - // .unwrap() - // .kind - // { - // let pledge = self.pledges_to_process.get(local).expect( - // "pledge expiration without an actual pledge,\ - // seems like our assumption that calls of pledges are\ - // always encountered before the expiration is wrong", - // ); - // let start_block = - // self.create_pledge_call_chain(pledge, *target).unwrap(); - // - // let new_terminator = mir::TerminatorKind::Goto { - // target: start_block, - // }; - // // skip this check block and instead call checks-chain - // self.patcher().patch_terminator(otherwise, new_terminator); - // } - // } - // // nothing to do.. - // CheckBlockKind::RuntimeAssertion => (), - // } - // } - // } - // } } } diff --git a/prusti/src/modify_mir/passes/insert_postconditions.rs b/prusti/src/modify_mir/passes/insert_postconditions.rs index 8a7e18d1885..3dfdb2c0c47 100644 --- a/prusti/src/modify_mir/passes/insert_postconditions.rs +++ b/prusti/src/modify_mir/passes/insert_postconditions.rs @@ -18,26 +18,23 @@ pub struct PostconditionInserter<'tcx, 'a> { } impl<'tcx, 'a> PostconditionInserter<'tcx, 'a> { - pub fn new( + pub fn run( tcx: TyCtxt<'tcx>, body_info: &'a MirInfo<'tcx>, def_id: DefId, local_decls: &'a IndexVec>, - ) -> Self { - Self { + body: &mut mir::Body<'tcx>, + ) { + let mut inserter = Self { tcx, body_info, - patch_opt: None, + patch_opt: Some(MirPatch::new(body).into()), def_id, local_decls, - } - } - - pub fn run(&mut self, body: &mut mir::Body<'tcx>) { - let patch = MirPatch::new(body); - self.patch_opt = Some(patch.into()); - self.visit_body(body); - let patch_ref = self.patch_opt.take().unwrap(); + }; + inserter.visit_body(body); + // apply the patch + let patch_ref = inserter.patch_opt.take().unwrap(); patch_ref.into_inner().apply(body); } diff --git a/prusti/src/modify_mir/passes/insert_precondition_checks.rs b/prusti/src/modify_mir/passes/insert_precondition_checks.rs index dea8271bcd3..6551b41715b 100644 --- a/prusti/src/modify_mir/passes/insert_precondition_checks.rs +++ b/prusti/src/modify_mir/passes/insert_precondition_checks.rs @@ -24,21 +24,24 @@ pub struct PreconditionInserter<'tcx, 'a> { } impl<'tcx, 'a> PreconditionInserter<'tcx, 'a> { - pub fn new( + pub fn run( tcx: TyCtxt<'tcx>, body_info: &'a MirInfo<'tcx>, def_id: DefId, local_decls: &'a IndexVec>, - ) -> Self { - Self { + body: &mut mir::Body<'tcx>, + ) { + let mut inserter = Self { tcx, body_info, patch_opt: None, def_id, local_decls, - } + }; + inserter.modify(body); } - pub fn run(&mut self, body: &mut mir::Body<'tcx>) { + + fn modify(&mut self, body: &mut mir::Body<'tcx>) { let mut current_target = get_block_target(body, mir::START_BLOCK) .expect("Bug: Body must start with a Goto block at this stage"); let patch = MirPatch::new(body); diff --git a/prusti/src/modify_mir/passes/remove_dead_code.rs b/prusti/src/modify_mir/passes/remove_dead_code.rs index 62bf1505329..892d5cc8259 100644 --- a/prusti/src/modify_mir/passes/remove_dead_code.rs +++ b/prusti/src/modify_mir/passes/remove_dead_code.rs @@ -22,7 +22,7 @@ pub struct DeadCodeElimination<'tcx> { } impl<'tcx> DeadCodeElimination<'tcx> { - pub fn new(tcx: TyCtxt<'tcx>, def_id: DefId) -> Self { + pub fn run(tcx: TyCtxt<'tcx>, def_id: DefId, body: &mut mir::Body<'tcx>) { // collect all the blocks that were inserted but didnt generate // a verification error: let reachability_map = globals::get_reachability_map(def_id).unwrap_or_default(); @@ -36,19 +36,16 @@ impl<'tcx> DeadCodeElimination<'tcx> { .iter() .filter_map(|(bb, verified)| verified.then_some(*bb)) .collect(); - Self { + let mut modifier = Self { tcx, unreachable_blocks, removable_assertions, - } - } - - pub fn run(&mut self, body: &mut mir::Body<'tcx>) { - self.remove_assertions(body); - if self.unreachable_blocks.is_empty() { + }; + modifier.remove_assertions(body); + if modifier.unreachable_blocks.is_empty() { return; } - self.visit_body(body); + modifier.visit_body(body); } fn remove_assertions(&self, body: &mut mir::Body<'tcx>) { From f4aa968f9eff9e47fca6a597d32142ea6209d7e6 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Sun, 10 Sep 2023 11:44:26 +0200 Subject: [PATCH 38/45] Stop std feature from importing prusti-specs --- Cargo.lock | 449 ++++-------------- .../prusti-contracts-proc-macros/Cargo.toml | 2 +- .../prusti-contracts-proc-macros/src/lib.rs | 2 +- prusti-tests/tests/parse/ui/nostd.rs | 8 + 4 files changed, 101 insertions(+), 360 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6d844346e07..36a82d25ec3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,9 +30,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" dependencies = [ "memchr", ] @@ -68,25 +68,6 @@ dependencies = [ "libc", ] -[[package]] -name = "annotate-snippets" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b9d411ecbaf79885c6df4d75fff75858d5995ff25385657a28af47e82f9c36" -dependencies = [ - "unicode-width", - "yansi-term", -] - -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - [[package]] name = "anstream" version = "0.5.0" @@ -280,7 +261,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -339,9 +320,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" [[package]] name = "base64ct" @@ -400,17 +381,6 @@ dependencies = [ "log", ] -[[package]] -name = "bstr" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" -dependencies = [ - "memchr", - "regex-automata 0.3.6", - "serde", -] - [[package]] name = "bumpalo" version = "3.13.0" @@ -429,24 +399,6 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" -[[package]] -name = "camino" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-platform" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cfa25e60aea747ec7e1124f238816749faa93759c6ff5b31f1ccdda137f4479" -dependencies = [ - "serde", -] - [[package]] name = "cargo-test-macro" version = "0.1.0" @@ -500,20 +452,6 @@ dependencies = [ "windows-sys 0.45.0", ] -[[package]] -name = "cargo_metadata" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "cc" version = "1.0.83" @@ -538,32 +476,31 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "95ed24df0632f708f5f6d8082675bef2596f7084dee3dd55f632290bf35bfe0f" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", - "winapi", + "windows-targets 0.48.5", ] [[package]] name = "clap" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d5f1946157a96594eb2d2c10eb7ad9a2b27518cb3000209dec700c35df9197d" +checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6" dependencies = [ "clap_builder", "clap_derive", - "once_cell", ] [[package]] name = "clap_builder" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78116e32a042dd73c2901f0dc30790d20ff3447f3e3472fad359e8c3d282bcd6" +checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08" dependencies = [ "anstream", "anstyle", @@ -573,14 +510,14 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9fd1a5729c4548118d7d70ff234a44868d00489a4b6597b0b020918a0e91a1a" +checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -599,50 +536,12 @@ dependencies = [ "termcolor", ] -[[package]] -name = "color-eyre" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" -dependencies = [ - "backtrace", - "color-spantrace", - "eyre", - "indenter", - "once_cell", - "owo-colors", - "tracing-error", -] - -[[package]] -name = "color-spantrace" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" -dependencies = [ - "once_cell", - "owo-colors", - "tracing-core", - "tracing-error", -] - [[package]] name = "colorchoice" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" -[[package]] -name = "colored" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" -dependencies = [ - "is-terminal", - "lazy_static", - "windows-sys 0.48.0", -] - [[package]] name = "combine" version = "4.6.6" @@ -653,12 +552,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "comma" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55b672471b4e9f9e95499ea597ff64941a309b2cdbffcc46f2cc5e2d971fd335" - [[package]] name = "compiletest_rs" version = "0.10.2" @@ -709,19 +602,6 @@ dependencies = [ "yaml-rust", ] -[[package]] -name = "console" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "unicode-width", - "windows-sys 0.45.0", -] - [[package]] name = "const-oid" version = "0.9.5" @@ -884,11 +764,11 @@ checksum = "f3b7eb4404b8195a9abb6356f4ac07d8ba267045c8d6d220ac4dc992e6cc75df" [[package]] name = "ctrlc" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a011bbe2c35ce9c1f143b7af6f94f29a167beb4cd1d29e6740ce836f723120e" +checksum = "82e95fbd621905b854affdc67943b043a0fbb6ed7385fd5a25650d19a8a6cfdf" dependencies = [ - "nix 0.26.2", + "nix 0.27.1", "windows-sys 0.48.0", ] @@ -1017,12 +897,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "distance" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d9d8664cf849d7d0f3114a3a387d2f5e4303176d746d5a951aaddc66dfe9240" - [[package]] name = "dlv-list" version = "0.3.0" @@ -1085,12 +959,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - [[package]] name = "encoding_rs" version = "0.8.33" @@ -1121,9 +989,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" dependencies = [ "errno-dragonfly", "libc", @@ -1156,16 +1024,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "eyre" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" -dependencies = [ - "indenter", - "once_cell", -] - [[package]] name = "failure" version = "0.1.8" @@ -1353,7 +1211,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -1505,12 +1363,11 @@ checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" [[package]] name = "headers" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" +checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.13.1", - "bitflags 1.3.2", + "base64 0.21.3", "bytes", "headers-core", "http", @@ -1675,12 +1532,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - [[package]] name = "index_vec" version = "0.1.3" @@ -1710,19 +1561,6 @@ dependencies = [ "hashbrown 0.14.0", ] -[[package]] -name = "indicatif" -version = "0.17.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b297dc40733f23a0e52728a58fa9489a5b7638a324932de16b41adc3ef80730" -dependencies = [ - "console", - "instant", - "number_prefix", - "portable-atomic", - "unicode-width", -] - [[package]] name = "instant" version = "0.1.12" @@ -1756,7 +1594,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ "hermit-abi", - "rustix 0.38.8", + "rustix 0.38.11", "windows-sys 0.48.0", ] @@ -1944,9 +1782,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" [[package]] name = "memoffset" @@ -1957,15 +1795,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "memoffset" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.9.0" @@ -2087,16 +1916,13 @@ dependencies = [ [[package]] name = "nix" -version = "0.26.2" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "cfg-if", "libc", - "memoffset 0.7.1", - "pin-utils", - "static_assertions", ] [[package]] @@ -2144,17 +1970,11 @@ dependencies = [ "libc", ] -[[package]] -name = "number_prefix" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" - [[package]] name = "object" -version = "0.32.0" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ac5bbd07aea88c60a577a1ce218075ffd59208b2d7ca97adf9bfc5aeb21ebe" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] @@ -2167,11 +1987,11 @@ checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "openssl" -version = "0.10.56" +version = "0.10.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" +checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "cfg-if", "foreign-types", "libc", @@ -2188,7 +2008,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -2199,9 +2019,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.91" +version = "0.9.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" +checksum = "db7e971c2c2bba161b2d2fdf37080177eff520b3bc044787c7f1f5f9e78d869b" dependencies = [ "cc", "libc", @@ -2236,12 +2056,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" -[[package]] -name = "owo-colors" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" - [[package]] name = "p384" version = "0.13.0" @@ -2254,15 +2068,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "pad" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ad9b889f1b12e0b9ee24db044b5129150d5eada288edc800f789928dc8c0e3" -dependencies = [ - "unicode-width", -] - [[package]] name = "parking" version = "2.1.0" @@ -2313,19 +2118,20 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.2" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" +checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.7.2" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "666d00490d4ac815001da55838c500eafb0320019bbaa44444137c48b443a853" +checksum = "a2bee7be22ce7918f641a33f08e3f43388c7656772244e2bbb2477f44cc9021a" dependencies = [ "pest", "pest_generator", @@ -2333,22 +2139,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.7.2" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ca01446f50dbda87c1786af8770d535423fa8a53aec03b8f4e3d7eb10e0929" +checksum = "d1511785c5e98d79a05e8a6bc34b4ac2168a0e3e92161862030ad84daa223141" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] name = "pest_meta" -version = "2.7.2" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56af0a30af74d0445c0bf6d9d051c979b516a1a5af790d251daee76005420a48" +checksum = "b42f0394d3123e33353ca5e1e89092e533d2cc490389f2bd6131c43c634ebc5f" dependencies = [ "once_cell", "pest", @@ -2372,14 +2178,14 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] name = "pin-project-lite" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -2419,28 +2225,12 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "portable-atomic" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b" - [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" -[[package]] -name = "prettydiff" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ff1fec61082821f8236cf6c0c14e8172b62ce8a72a0eedc30d3b247bb68dc11" -dependencies = [ - "ansi_term", - "pad", -] - [[package]] name = "primeorder" version = "0.13.2" @@ -2480,7 +2270,6 @@ dependencies = [ "prusti-interface", "prusti-rustc-interface", "prusti-viper", - "rustc-hash", "tracing 0.1.0", "tracing-chrome", "tracing-subscriber", @@ -2578,7 +2367,7 @@ dependencies = [ [[package]] name = "prusti-specs" -version = "0.1.10" +version = "0.2.0" dependencies = [ "itertools 0.11.0", "proc-macro2", @@ -2599,7 +2388,6 @@ dependencies = [ "prusti", "prusti-launch", "prusti-server", - "ui_test", "ureq", ] @@ -2612,7 +2400,7 @@ dependencies = [ "itertools 0.11.0", "lazy_static", "log", - "nix 0.26.2", + "nix 0.27.1", "rustc-hash", "serde", "toml 0.7.6", @@ -2738,14 +2526,14 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.3" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.6", - "regex-syntax 0.7.4", + "regex-automata 0.3.8", + "regex-syntax 0.7.5", ] [[package]] @@ -2759,13 +2547,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax 0.7.5", ] [[package]] @@ -2776,9 +2564,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "remove_dir_all" @@ -2799,7 +2587,7 @@ version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" dependencies = [ - "base64 0.21.2", + "base64 0.21.3", "bytes", "encoding_rs", "futures-core", @@ -2927,9 +2715,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.8" +version = "0.38.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" +checksum = "c0c3dde1fc030af041adc40e79c0e7fbcf431dd24870053d187d7c66e4b87453" dependencies = [ "bitflags 2.4.0", "errno", @@ -2940,9 +2728,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.6" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" dependencies = [ "log", "ring", @@ -2956,7 +2744,7 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.2", + "base64 0.21.3", ] [[package]] @@ -3106,28 +2894,25 @@ name = "semver" version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" -dependencies = [ - "serde", -] [[package]] name = "serde" -version = "1.0.186" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f5db24220c009de9bd45e69fb2938f4b6d2df856aa9304ce377b3180f83b7c1" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.186" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad697f7e0b65af4983a4ce8f56ed5b357e8d3c36651bf6a7e13639c17b8e670" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -3326,12 +3111,6 @@ dependencies = [ "der", ] -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strsim" version = "0.10.0" @@ -3357,9 +3136,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "718fa2415bcb8d8bd775917a1bf12a7931b6dfa890753378538118181e0cb398" dependencies = [ "proc-macro2", "quote", @@ -3411,7 +3190,7 @@ dependencies = [ "cfg-if", "fastrand 2.0.0", "redox_syscall 0.3.5", - "rustix 0.38.8", + "rustix 0.38.11", "windows-sys 0.48.0", ] @@ -3468,22 +3247,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.47" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" +checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.47" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" +checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -3498,9 +3277,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb39ee79a6d8de55f48f2293a830e040392f1c5f16e336bdd1788cd0aadce07" +checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" dependencies = [ "deranged", "itoa", @@ -3517,9 +3296,9 @@ checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" [[package]] name = "time-macros" -version = "0.2.13" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "733d258752e9303d392b94b75230d07b0b9c489350c69b851fc6c065fde3e8f9" +checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" dependencies = [ "time-core", ] @@ -3681,7 +3460,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", ] [[package]] @@ -3705,16 +3484,6 @@ dependencies = [ "valuable", ] -[[package]] -name = "tracing-error" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" -dependencies = [ - "tracing 0.1.37", - "tracing-subscriber", -] - [[package]] name = "tracing-log" version = "0.1.3" @@ -3781,33 +3550,6 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" -[[package]] -name = "ui_test" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7823f926a62629304c4a47c23949925f6faa0d4f14ddbce4405d55dbaeab324" -dependencies = [ - "annotate-snippets", - "anyhow", - "bstr", - "cargo-platform", - "cargo_metadata", - "color-eyre", - "colored", - "comma", - "crossbeam-channel", - "distance", - "indicatif", - "lazy_static", - "prettydiff", - "regex", - "rustc_version", - "rustfix", - "serde", - "serde_json", - "tempfile", -] - [[package]] name = "unicase" version = "2.7.0" @@ -3862,7 +3604,7 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b11c96ac7ee530603dcdf68ed1557050f374ce55a5a07193ebf8cbc9f8927e9" dependencies = [ - "base64 0.21.2", + "base64 0.21.3", "flate2", "log", "once_cell", @@ -3874,9 +3616,9 @@ dependencies = [ [[package]] name = "url" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna", @@ -4086,7 +3828,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", "wasm-bindgen-shared", ] @@ -4120,7 +3862,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.31", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4429,15 +4171,6 @@ dependencies = [ "linked-hash-map", ] -[[package]] -name = "yansi-term" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" -dependencies = [ - "winapi", -] - [[package]] name = "zeroize" version = "1.6.0" diff --git a/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml b/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml index 7bc28025c66..fc4273f0b78 100644 --- a/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml +++ b/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml @@ -22,4 +22,4 @@ proc-macro2 = { version = "1.0", optional = true } # Are we being compiled by Prusti and should include dependency on # prusti-specs and proc-macro2? prusti = ["dep:prusti-specs", "dep:proc-macro2"] -std = ["prusti-specs/std"] +std = ["prusti-specs?/std"] diff --git a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs index b690e618704..2e69a788447 100644 --- a/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs +++ b/prusti-contracts/prusti-contracts-proc-macros/src/lib.rs @@ -138,7 +138,7 @@ pub fn quantifier_runtime_bounds(_attr: TokenStream, tokens: TokenStream) -> Tok #[cfg(not(feature = "prusti"))] #[proc_macro_attribute] -pub fn insert_runtime_check(attr: TokenStream, tokens: TokenStream) -> TokenStream { +pub fn insert_runtime_check(_attr: TokenStream, _tokens: TokenStream) -> TokenStream { TokenStream::new() } diff --git a/prusti-tests/tests/parse/ui/nostd.rs b/prusti-tests/tests/parse/ui/nostd.rs index 443f3124f29..0e8abe9e0c9 100644 --- a/prusti-tests/tests/parse/ui/nostd.rs +++ b/prusti-tests/tests/parse/ui/nostd.rs @@ -1,4 +1,12 @@ // ignore-test +// We changed a few things with regards to no_std. We still want to support it +// with cargo-prusti, but from now on std is a feature of the prusti-contracts +// trait that is enabled by default. Can be disabled by setting default-features=false. +// +// Since prusti-rustc works with a precompiled version of prusti-contracts, +// we decided to enable it permanently there, which is why this test is ignored now. +// Another solution would be to compile 2 versions of prusti-contracts and make it +// configurable which version is linked, but for now we didn't see this as necessary. //! This ui-test makes sure that `prusti-contracts` does not depend on the Rust standard library. //! If this test fails (i.e. this file compiles successfully), then `prusti-contracts` depends on the standard library. From ae80faaaf26baadc38cf1e7a5f3f0ac022008222 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Tue, 12 Sep 2023 01:25:03 +0200 Subject: [PATCH 39/45] Document, refactor and explain with comments --- .../prusti-contracts-proc-macros/Cargo.toml | 2 + .../src/runtime_check_internals.rs | 10 +- prusti-contracts/prusti-specs/src/lib.rs | 114 +++-- prusti-contracts/prusti-specs/src/rewriter.rs | 64 +-- .../associated_function_info.rs | 11 +- .../src/runtime_checks/boundary_extraction.rs | 475 +++++++++--------- .../src/runtime_checks/check_type.rs | 18 +- .../src/runtime_checks/error_messages.rs | 11 +- .../prusti-specs/src/runtime_checks/mod.rs | 2 +- .../src/runtime_checks/quantifiers.rs | 17 +- .../src/runtime_checks/translation.rs | 239 ++++++++- .../prusti-specs/src/runtime_checks/utils.rs | 52 ++ .../src/runtime_checks/visitor.rs | 205 -------- .../src/specifications/untyped.rs | 2 +- prusti-interface/src/globals.rs | 10 +- .../fail/postconditions/generic-old.rs | 2 + .../fail/postconditions/generic-old.stderr | 2 +- .../pass/quantifiers/exists-minimal-2.rs | 2 +- prusti-viper/src/encoder/procedure_encoder.rs | 2 + prusti/src/callbacks.rs | 1 - prusti/src/driver.rs | 4 +- prusti/src/modify_mir/mir_helper.rs | 41 +- prusti/src/modify_mir/mir_info_collector.rs | 460 ++++++++--------- prusti/src/modify_mir/mir_modifications.rs | 13 +- prusti/src/modify_mir/mir_modify.rs | 32 +- .../modify_mir/passes/insert_pledge_checks.rs | 86 ++-- .../passes/insert_postconditions.rs | 34 +- .../passes/insert_precondition_checks.rs | 17 +- .../src/modify_mir/passes/remove_dead_code.rs | 27 +- .../src/modify_mir/passes/replace_old_args.rs | 25 +- 30 files changed, 998 insertions(+), 982 deletions(-) create mode 100644 prusti-contracts/prusti-specs/src/runtime_checks/utils.rs delete mode 100644 prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs diff --git a/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml b/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml index 151d0410ec9..7a258b794ed 100644 --- a/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml +++ b/prusti-contracts/prusti-contracts-proc-macros/Cargo.toml @@ -22,4 +22,6 @@ proc-macro2 = { version = "1.0", optional = true } # Are we being compiled by Prusti and should include dependency on # prusti-specs and proc-macro2? prusti = ["dep:prusti-specs", "dep:proc-macro2"] +# If std is active, and prusti-specs is imported, forward the std flag +# to prusti-specs. std = ["prusti-specs?/std"] diff --git a/prusti-contracts/prusti-contracts/src/runtime_check_internals.rs b/prusti-contracts/prusti-contracts/src/runtime_check_internals.rs index beaa8363872..1b87ddea7e4 100644 --- a/prusti-contracts/prusti-contracts/src/runtime_check_internals.rs +++ b/prusti-contracts/prusti-contracts/src/runtime_check_internals.rs @@ -1,7 +1,10 @@ +#[cfg(not(feature = "std"))] use core::fmt::Write; +#[cfg(not(feature = "std"))] struct SimpleFormatter<'a>(&'a mut [u8], usize); +#[cfg(not(feature = "std"))] impl<'a> core::fmt::Write for SimpleFormatter<'a> { fn write_str(&mut self, s: &str) -> core::fmt::Result { let dest_len = self.0.len(); @@ -18,6 +21,7 @@ impl<'a> core::fmt::Write for SimpleFormatter<'a> { } } +#[cfg(not(feature = "std"))] pub fn num_to_str(n: T, buffer: &mut [u8]) -> &str { let mut formatter = SimpleFormatter(buffer, 0); write!(&mut formatter, "{}", n).expect("Failed to write number to buffer"); @@ -27,8 +31,8 @@ pub fn num_to_str(n: T, buffer: &mut [u8]) -> &str { // An internal function used for getting more precise error messages for runtime // checks. -// Buffer manipulations because we cannot use std and don't wanna introduce -// new dependencies. +// Buffer manipulations because we cannot use std and need to operate on a buffer +// that is allocated before this function is called. #[cfg(not(feature = "std"))] pub fn check_expr(expr: bool, added_info: &str, buffer: &mut [u8], buffer_len: &mut usize) -> bool { if !expr { @@ -42,6 +46,8 @@ pub fn check_expr(expr: bool, added_info: &str, buffer: &mut [u8], buffer_len: & } } +// If ctd is available, the check function can be a lot simpler, and doesn't +// need to operate on a passed buffer. #[cfg(feature = "std")] pub fn check_expr(expr: bool, added_info: &str, message: &mut std::string::String) -> bool { if !expr { diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index a89cccf62e9..4b76935b2da 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -37,8 +37,11 @@ use syn::{spanned::Spanned, visit::Visit}; use crate::{ common::{merge_generics, RewritableReceiver, SelfTypeRewriter}, predicate::{is_predicate_macro, ParsedPredicate}, - runtime_checks::translation, - specifications::preparser::{parse_prusti, parse_type_cond_spec, NestedSpec}, + runtime_checks::translation::{translate_expression_runtime, translate_runtime_checks}, + specifications::preparser::{ + parse_prusti, parse_prusti_assert_pledge, parse_prusti_pledge, parse_type_cond_spec, + NestedSpec, + }, }; pub use extern_spec_rewriter::ExternSpecKind; use parse_closure_macro::ClosureWithSpec; @@ -168,13 +171,18 @@ fn generate_spec_and_assertions( let mut generated_items = vec![]; let mut generated_attributes = vec![]; - // are we sure that these are in the same order as they are defined - // in the file? Otherwise our logic for the runtime checks does not work + // Attributes following a #[insert_runtime_check] attribute will be runtime + // checked. If this attribute precedes an annotation that cannot be checked + // at runtime we emit a warning. let mut runtime_check_next = false; + // This environment variable causes all checkable contracts to be checked at runtime. let runtime_check_always = std::env::var("PRUSTI_RUNTIME_CHECK_ALL_CONTRACTS").map_or(false, |s| s == "true"); for (attr_kind, attr_tokens) in prusti_attributes.drain(..) { + if runtime_check_next { + warn_uncheckable_runtimecheck(&attr_kind, &attr_tokens); + } let runtime_check = runtime_check_next || runtime_check_always; let rewriting_result = match attr_kind { SpecAttributeKind::Requires => generate_for_requires(attr_tokens, item, runtime_check), @@ -214,6 +222,27 @@ fn generate_spec_and_assertions( Ok((generated_items, generated_attributes)) } +fn warn_uncheckable_runtimecheck(attr_kind: &SpecAttributeKind, tokens: &TokenStream) { + if let SpecAttributeKind::Pure + | SpecAttributeKind::Verified + | SpecAttributeKind::Terminates + | SpecAttributeKind::Trusted + | SpecAttributeKind::Predicate + | SpecAttributeKind::Invariant + | SpecAttributeKind::Model + | SpecAttributeKind::PrintCounterexample + | SpecAttributeKind::InsertRuntimeCheck = attr_kind + { + tokens + .span() + .unwrap() + .warning( + "Attribute #[insert_runtime_check] could not be applied to this specification.", + ) + .emit(); + } +} + /// Generate spec items and attributes to typecheck the and later retrieve "requires" annotations. fn generate_for_requires( attr: TokenStream, @@ -223,10 +252,11 @@ fn generate_for_requires( let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); let spec_id_str = spec_id.to_string(); - let spec_item = rewriter.process_assertion( + let prusti_tokens = parse_prusti(attr)?; + let spec_item = rewriter.generate_spec_item_fn( rewriter::SpecItemType::Precondition, spec_id, - attr.clone(), + prusti_tokens.clone(), item, )?; let mut items = vec![spec_item]; @@ -237,7 +267,8 @@ fn generate_for_requires( if runtime_check { let check_id = rewriter.generate_spec_id(); let check_id_str = check_id.to_string(); - let check_item = rewriter.create_pre_check(check_id, attr, item)?; + let check_item = + translate_runtime_checks(CheckItemType::Requires, check_id, prusti_tokens, item)?; items.push(check_item); attrs.push(parse_quote_spanned! {item.span() => #[prusti::pre_check_id_ref = #check_id_str] @@ -255,11 +286,12 @@ fn generate_for_ensures( let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); let spec_id_str = spec_id.to_string(); + let prusti_tokens = parse_prusti(attr)?; - let spec_item = rewriter.process_assertion( + let spec_item = rewriter.generate_spec_item_fn( rewriter::SpecItemType::Postcondition, spec_id, - attr.clone(), + prusti_tokens.clone(), item, )?; let mut items = vec![spec_item]; @@ -267,11 +299,10 @@ fn generate_for_ensures( #[prusti::post_spec_id_ref = #spec_id_str] }]; if runtime_check { - // For now we always check postconditions.. later we might exclude some let check_id = rewriter.generate_spec_id(); let check_id_str = check_id.to_string(); - // let store_old_item = rewriter.create_store_check_ensures(check_id, attr, item)?; - let check_item = rewriter.create_post_check(check_id, attr, item)?; + let check_item = + translate_runtime_checks(CheckItemType::Ensures, check_id, prusti_tokens, item)?; items.push(check_item); attrs.push(parse_quote_spanned! {item.span()=> #[prusti::post_check_id_ref = #check_id_str] @@ -289,7 +320,13 @@ fn generate_for_after_expiry( let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); let spec_id_str = spec_id.to_string(); - let spec_item = rewriter.process_pledge(spec_id, attr.clone(), item)?; + let parsed = parse_prusti_pledge(attr)?; + let spec_item = rewriter.generate_spec_item_fn( + rewriter::SpecItemType::Pledge, + spec_id, + parsed.clone(), + item, + )?; let mut res_items = vec![spec_item]; let mut res_attrs: Vec = vec![parse_quote_spanned! { item.span() => #[prusti::pledge_spec_id_ref = #spec_id_str] @@ -297,7 +334,12 @@ fn generate_for_after_expiry( if runtime_check { let check_id = rewriter.generate_spec_id(); let check_id_str = check_id.to_string(); - let check_item = rewriter.create_pledge_check(check_id, attr, item)?; + let check_item = translate_runtime_checks( + CheckItemType::PledgeRhs { has_lhs: false }, + check_id, + parsed, + item, + )?; res_items.push(check_item); res_attrs.push(parse_quote_spanned! {item.span() => #[prusti::assert_pledge_check_ref = #check_id_str] @@ -317,9 +359,10 @@ fn generate_for_assert_on_expiry( let spec_id_lhs_str = spec_id_lhs.to_string(); let spec_id_rhs = rewriter.generate_spec_id(); let spec_id_rhs_str = spec_id_rhs.to_string(); + let parsed = parse_prusti_assert_pledge(attr)?; let (spec_item_lhs, spec_item_rhs) = - rewriter.process_assert_pledge(spec_id_lhs, spec_id_rhs, attr.clone(), item)?; + rewriter.process_assert_pledge(spec_id_lhs, spec_id_rhs, parsed.clone(), item)?; let mut res_items = vec![spec_item_lhs, spec_item_rhs]; let mut res_attrs: Vec = vec![ @@ -335,7 +378,7 @@ fn generate_for_assert_on_expiry( // same check_id for both lhs and rhs let check_id = rewriter.generate_spec_id(); let check_id_str = check_id.to_string(); - let (lhs_check, rhs_check) = rewriter.create_assert_pledge_check(check_id, attr, item)?; + let (lhs_check, rhs_check) = rewriter.create_assert_pledge_check(check_id, parsed, item)?; res_items.push(lhs_check); res_items.push(rhs_check); res_attrs.push(parse_quote_spanned! {item.span()=> @@ -563,13 +606,25 @@ fn generate_expression_closure( let closure = handle_result!(fun(&mut rewriter, spec_id, prusti_tokens.clone())); let callsite_span = Span::call_site(); let check_id = rewriter.generate_spec_id(); - if runtime_attr.is_some() { - let check_closure = handle_result!(translation::translate_expression_runtime( + let checkable = check_type.can_be_checked(); + // emit a warning if #[insert_runtime_check] precedes an item that is not + // checked at runtime. + if !checkable && runtime_attr.is_some() { + prusti_tokens + .span() + .unwrap() + .warning("The attribute #[insert_runtime_check] can not be applied here.") + .emit(); + } + let runtime_check_always = + std::env::var("PRUSTI_RUNTIME_CHECK_ALL_CONTRACTS").map_or(false, |s| s == "true"); + if check_type.can_be_checked() && (runtime_check_always || runtime_attr.is_some()) { + let check_closure = handle_result!(translate_expression_runtime( prusti_tokens, check_id, check_type )); - quote_spanned! {callsite_span=> + quote_spanned! { callsite_span=> #[allow(unused_must_use, unused_variables, unused_braces, unused_parens)] #[prusti::specs_version = #SPECS_VERSION] if false { @@ -1276,24 +1331,3 @@ pub fn ghost(tokens: TokenStream) -> TokenStream { syn_errors } } - -pub fn pledge_expires(tokens: TokenStream) -> TokenStream { - // make sure only 1 identifier is passed to this macro - let expr = handle_result!(syn::parse2::(tokens.clone())); - // create spec blocks starting with a spec_only closure so - // they will not influence verification result - // marked with spec_only so they are ignored during encoding - // check_only so we can still distinguish them from specifications - parse_quote_spanned! {tokens.span() => - if true { - #[allow(unused_must_use, unused_variables)] - { - #[prusti::spec_only] - #[prusti::check_only] - #[prusti::expiration_location] - || -> () {}; - let expiring = #expr; - } - } - } -} diff --git a/prusti-contracts/prusti-specs/src/rewriter.rs b/prusti-contracts/prusti-specs/src/rewriter.rs index a5715b28105..e5c0e4be03e 100644 --- a/prusti-contracts/prusti-specs/src/rewriter.rs +++ b/prusti-contracts/prusti-specs/src/rewriter.rs @@ -3,7 +3,7 @@ use crate::{ runtime_checks::{check_type::CheckItemType, translation::translate_runtime_checks}, specifications::{ common::{SpecificationId, SpecificationIdGenerator}, - preparser::{parse_prusti, parse_prusti_assert_pledge, parse_prusti_pledge}, + preparser::parse_prusti, untyped, }, }; @@ -147,61 +147,6 @@ impl AstRewriter { self.generate_spec_item_fn(spec_type, spec_id, parse_prusti(tokens)?, item) } - pub fn create_pre_check( - &mut self, - check_id: SpecificationId, - tokens: TokenStream, - item: &untyped::AnyFnItem, - ) -> syn::Result { - translate_runtime_checks( - CheckItemType::Requires, - check_id, - parse_prusti(tokens)?, - item, - ) - } - - pub fn create_post_check( - &mut self, - check_id: SpecificationId, - tokens: TokenStream, - item: &untyped::AnyFnItem, - ) -> syn::Result { - translate_runtime_checks( - CheckItemType::Ensures, - check_id, - parse_prusti(tokens)?, - item, - ) - } - - /// Parse a pledge with lhs into a Rust expression - pub fn process_pledge( - &mut self, - spec_id: SpecificationId, - tokens: TokenStream, - item: &untyped::AnyFnItem, - ) -> syn::Result { - let parsed = parse_prusti_pledge(tokens)?; - let spec_item = - self.generate_spec_item_fn(SpecItemType::Pledge, spec_id, parsed.clone(), item)?; - syn::Result::Ok(spec_item) - } - - pub fn create_pledge_check( - &mut self, - check_id: SpecificationId, - tokens: TokenStream, - item: &untyped::AnyFnItem, - ) -> syn::Result { - translate_runtime_checks( - CheckItemType::PledgeRhs { has_lhs: false }, - check_id, - parse_prusti(tokens)?, - item, - ) - } - pub fn process_pure_refinement( &mut self, spec_id: SpecificationId, @@ -231,10 +176,9 @@ impl AstRewriter { &mut self, spec_id_lhs: SpecificationId, spec_id_rhs: SpecificationId, - tokens: TokenStream, + (lhs, rhs): (TokenStream, TokenStream), item: &untyped::AnyFnItem, ) -> syn::Result<(syn::Item, syn::Item)> { - let (lhs, rhs) = parse_prusti_assert_pledge(tokens)?; let lhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_lhs, lhs, item)?; let rhs_item = self.generate_spec_item_fn(SpecItemType::Pledge, spec_id_rhs, rhs, item)?; syn::Result::Ok((lhs_item, rhs_item)) @@ -243,11 +187,9 @@ impl AstRewriter { pub fn create_assert_pledge_check( &mut self, check_id: SpecificationId, - tokens: TokenStream, + (lhs, rhs): (TokenStream, TokenStream), item: &untyped::AnyFnItem, ) -> syn::Result<(syn::Item, syn::Item)> { - // todo: move parsing out of this function.. - let (lhs, rhs) = parse_prusti_assert_pledge(tokens)?; let lhs_check = translate_runtime_checks(CheckItemType::PledgeLhs, check_id, lhs, item)?; let rhs_check = translate_runtime_checks( CheckItemType::PledgeRhs { has_lhs: true }, diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs b/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs index f57bbc627c8..d6ed364c53c 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs @@ -1,7 +1,8 @@ use crate::{common::HasSignature, specifications::untyped}; use proc_macro2::Span; use rustc_hash::FxHashMap; -use syn::{parse_quote, spanned::Spanned}; +use syn::{parse_quote_spanned, spanned::Spanned}; + /// Information about the function that a specification is attached to pub(crate) struct AssociatedFunctionInfo { /// the arguments of the associated function @@ -9,7 +10,7 @@ pub(crate) struct AssociatedFunctionInfo { } impl AssociatedFunctionInfo { - /// used for assertions etc., where there is no associated + /// Used for assertions etc., where there is no associated /// function pub(crate) fn empty() -> Self { Self { @@ -92,13 +93,13 @@ pub(crate) fn create_argument(arg: &syn::FnArg, index: usize) -> syn::Result &Self} } else { - parse_quote! {Self} + parse_quote_spanned! {span => Self} }; let arg = Argument { name: "self".to_string(), - ty, // newer versions have this field! could be useful.. + ty, used_in_old: false, index, is_ref, diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs index c05e65930f6..44b3caeb751 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs @@ -1,205 +1,218 @@ -use crate::runtime_checks::visitor::expression_name; -use proc_macro2::TokenStream; +use crate::runtime_checks::utils; use quote::ToTokens; use rustc_hash::FxHashSet; use syn::{self, parse_quote, parse_quote_spanned, spanned::Spanned, visit::Visit, BinOp}; type LoopBoundaries = ((String, syn::Type), syn::ExprRange); + pub(crate) struct BoundExtractor { // the set of bound variables within that expression pub name_set: FxHashSet, } -impl BoundExtractor { - /// Try to find manually annotated boundaries with the #[runtime_quantifier_bounds] - /// attribute. Returns None if there is no such attribute, Some(error) - /// if there is one, but the contained ranges are false, and the tokens - /// of the ranges otherwise. - pub(crate) fn manual_bounds( - expr: syn::ExprClosure, - bound_vars: Vec<(String, syn::Type)>, - ) -> Option>> { - let manual_bounds = get_attribute_contents( - "prusti :: runtime_quantifier_bounds".to_string(), - &expr.attrs, - )?; - let bounds_expr: syn::Expr = simplify_expression(&syn::parse2(manual_bounds).ok()?); - // there is either one or multiple - let bounds_vec = match bounds_expr { - syn::Expr::Tuple(expr_tuple) => { - let mut ranges: Vec = Vec::new(); - for range in expr_tuple.elems.iter() { - let range = simplify_expression(range); - if let syn::Expr::Range(expr_range) = range { - ranges.push(expr_range); - } else { - return Some(Err(syn::Error::new( - range.span(), - "Runtime checks: quantifier boundaries must be provided as ranges", - ))); - } +/// Try to find manually annotated boundaries with the #[runtime_quantifier_bounds] +/// attribute. Returns None if there is no such attribute, Some(error) +/// if there is one, but the contained ranges are false, and the tokens +/// of the ranges otherwise. +pub(crate) fn manual_bounds( + expr: syn::ExprClosure, + bound_vars: Vec<(String, syn::Type)>, +) -> Option>> { + let manual_bounds = utils::get_attribute_contents( + "prusti :: runtime_quantifier_bounds".to_string(), + &expr.attrs, + )?; + let bounds_expr: syn::Expr = simplify_expression(&syn::parse2(manual_bounds).ok()?); + // there is either one or multiple + let bounds_vec = match bounds_expr { + syn::Expr::Tuple(expr_tuple) => { + let mut ranges: Vec = Vec::new(); + for range in expr_tuple.elems.iter() { + let range = simplify_expression(range); + if let syn::Expr::Range(expr_range) = range { + ranges.push(expr_range); + } else { + return Some(Err(syn::Error::new( + range.span(), + "Runtime checks: quantifier boundaries must be provided as ranges", + ))); } - ranges - } - syn::Expr::Range(range_expr) => vec![range_expr], - _ => { - return Some(Err(syn::Error::new( - bounds_expr.span(), - "Runtime checks: quantifier boundaries must be provided as ranges", - ))); } - }; - if bounds_vec.len() != bound_vars.len() { + ranges + } + syn::Expr::Range(range_expr) => vec![range_expr], + _ => { return Some(Err(syn::Error::new( - expr.span(), - "Runtime checks: the provided number of ranges does not match the number of closure arguments."))); + bounds_expr.span(), + "Runtime checks: quantifier boundaries must be provided as ranges", + ))); } - assert!(bounds_vec.len() == bound_vars.len()); - Some(Ok(bound_vars.into_iter().zip(bounds_vec).collect())) + }; + if bounds_vec.len() != bound_vars.len() { + return Some(Err(syn::Error::new( + expr.span(), + "Runtime checks: the provided number of ranges does not match the number of closure arguments."))); } + assert!(bounds_vec.len() == bound_vars.len()); + Some(Ok(bound_vars.into_iter().zip(bounds_vec).collect())) +} - // if this function is called, the ranges are mandatory! - pub(crate) fn derive_ranges( - closure: syn::Expr, - args: Vec<(String, syn::Type)>, - ) -> syn::Result> { - if args.len() > 1 { - return Err(syn::Error::new( - closure.span(), - "multiple args without manually defined boundaries are not allowed", - )); - } - let name_set: FxHashSet = args.iter().map(|el| el.0.clone()).collect(); - let mut boundaries: Vec<((String, syn::Type), syn::ExprRange)> = Vec::new(); - for (name, ty) in args.iter() { - let range_expr: syn::ExprRange = if is_primitive_number(ty) { - let bounds = Self::extract_bounds(closure.clone(), name, &name_set); - let mut upper_bound_opt = None; - let mut lower_bound_opt = None; +/// If no ranges were manually annotated, this function tries to derive them by looking at +/// the contained expression. This only works for a very limited set of cases. +pub(crate) fn derive_ranges( + body: syn::Expr, + args: Vec<(String, syn::Type)>, +) -> syn::Result> { + if args.len() > 1 { + return Err(syn::Error::new( + body.span(), + "Runtime checks: multiple args without manually defined boundaries are not allowed", + )); + } + let name_set: FxHashSet = args.iter().map(|el| el.0.clone()).collect(); + let mut boundaries: Vec<((String, syn::Type), syn::ExprRange)> = Vec::new(); + let bounds_expr = split_implication_lhs(&body).unwrap_or(parse_quote! {()}); + let boundary_extractor = BoundExtractor { name_set }; + for (name, ty) in args.iter() { + let range_expr: syn::ExprRange = if utils::is_primitive_number(ty) { + let bounds = boundary_extractor.extract_bounds_recursive(&bounds_expr, name); + let mut upper_bound_opt = None; + let mut lower_bound_opt = None; - // if there are multiple variables, potentially with dependencies - // the loops need to be in a specific order - assert!(bounds.len() <= 2); - let mut include_upper = true; // if we have the MAX upper limit, - for Boundary { - kind, - bound, - included, - .. - } in bounds.iter() - { - // include it - match *kind { - BoundaryKind::Upper => { - // first idea was to add one here if inclusive, but - // this can lead to overflows! Need to use ..=x syntax - if upper_bound_opt.is_some() { - return Err(syn::Error::new( - closure.span(), - format!( - "Runtime checks: multiple upper bounds defined for {}", - name - ), - )); - } - upper_bound_opt = Some(bound.clone()); - include_upper = *included; + // if there are multiple variables, potentially with dependencies + // the loops need to be in a specific order + assert!(bounds.len() <= 2); + let mut include_upper = true; // if we have the MAX upper limit, + for Boundary { + kind, + bound, + included, + .. + } in bounds.iter() + { + // include it + match *kind { + BoundaryKind::Upper => { + // first idea was to add one here if inclusive, but + // this can lead to overflows! Need to use ..=x syntax + if upper_bound_opt.is_some() { + return Err(syn::Error::new( + body.span(), + format!( + "Runtime checks: multiple upper bounds defined for {}", + name + ), + )); } - BoundaryKind::Lower => { - if lower_bound_opt.is_some() { - return Err(syn::Error::new( - closure.span(), - format!( - "Runtime checks: multiple lower bounds defined for {}", - name - ), - )); - }; - lower_bound_opt = if *included { - // lower bound works the other way around - Some(bound.clone()) - } else { - Some(parse_quote! { - #bound + 1 - }) - } + upper_bound_opt = Some(bound.clone()); + include_upper = *included; + } + BoundaryKind::Lower => { + if lower_bound_opt.is_some() { + return Err(syn::Error::new( + body.span(), + format!( + "Runtime checks: multiple lower bounds defined for {}", + name + ), + )); + }; + lower_bound_opt = if *included { + // lower bound works the other way around + Some(bound.clone()) + } else { + Some(parse_quote! { + #bound + 1 + }) } } } - // TODO: proper rules for when we actually want to use - // min values (e.g. unsigned types), and max values - // (e.g. u8/i8 is still efficient) - let upper_bound = - upper_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => + } + let upper_bound = if let Some(upper_bound) = upper_bound_opt { + upper_bound + } else { + // upper bounds are required unless the type is very small + if utils::ty_small_enough(ty) { + parse_quote_spanned! {body.span() => #ty::MAX - }); - let lower_bound = - lower_bound_opt.unwrap_or(parse_quote_spanned! {closure.span() => - #ty::MIN - }); - - if include_upper { - parse_quote_spanned! {closure.span() => - (#lower_bound)..=(#upper_bound) } } else { - parse_quote_spanned! {closure.span() => - (#lower_bound)..(#upper_bound) - } + return Err(syn::Error::new( + body.span(), + format!( + "Runtime checks: a quantifier over type {} requires an upper bound", + ty.to_token_stream() + ), + )); } + }; + let lower_bound = if let Some(lower_bound) = lower_bound_opt { + lower_bound } else { - return Err(syn::Error::new( - closure.span(), - format!( - "Runtime checks: quantifier over type {} is not supported", - ty.to_token_stream() - ), - )); + // lower bounds are required unless the type is very small or unsigned + if utils::ty_small_enough(ty) || utils::ty_unsigned(ty) { + parse_quote_spanned! {body.span() => + #ty::MIN + } + } else { + return Err(syn::Error::new( + body.span(), + format!( + "Runtime checks: a quantifier over type {} requires a lower bound", + ty.to_token_stream() + ), + )); + } }; - boundaries.push(((name.clone(), ty.clone()), range_expr)); - } - Ok(boundaries) - } - pub fn extract_bounds( - expr: syn::Expr, - name: &String, - name_set: &FxHashSet, - ) -> Vec { - // first make sure the expression has the form A ==> B (or equivalent) - // and then extract a bound from A - let mut extractor = BoundExtractor { - name_set: name_set.clone(), - }; - let simplified = simplify_expression(&expr); - match simplified { - syn::Expr::Binary(syn::ExprBinary { - left: box e1, - op: syn::BinOp::Or(_), - .. - }) => { - // there are only a few kind of ways to express boundaries on the - // input values: the ones we allow / recognize so far are: - // - !(bound_cond) || property - if let syn::Expr::Unary(syn::ExprUnary { - op: syn::UnOp::Not(_), - expr: box bound_expr, - .. - }) = e1 - { - // in this case, the contents of the quantifier have the form - // !(potential boundary condition) || (check) - extractor.extract_bounds_recursive(bound_expr, name) - } else { - vec![] + if include_upper { + parse_quote_spanned! {body.span() => + (#lower_bound)..=(#upper_bound) + } + } else { + parse_quote_spanned! {body.span() => + (#lower_bound)..(#upper_bound) } } - _ => vec![], - } + } else { + return Err(syn::Error::new( + body.span(), + format!( + "Runtime checks: quantifier over type {} is not supported", + ty.to_token_stream() + ), + )); + }; + boundaries.push(((name.clone(), ty.clone()), range_expr)); } + Ok(boundaries) +} - fn extract_bounds_recursive(&mut self, expr: syn::Expr, name: &String) -> Vec { - let simplified = simplify_expression(&expr); +/// Given the body of a quantifier, if it contains an implication get its lefthandside +pub fn split_implication_lhs(expr: &syn::Expr) -> Option { + // first make sure the expression has the form A ==> B (or equivalent) + let simplified = simplify_expression(expr); + if let syn::Expr::Binary(syn::ExprBinary { + left: + box syn::Expr::Unary(syn::ExprUnary { + op: syn::UnOp::Not(_), + expr: box bound_expr, + .. + }), + op: syn::BinOp::Or(_), + .. + }) = simplified + { + // in this case, the contents of the quantifier have the form + // !(potential boundary condition) || (check) + Some(bound_expr.clone()) + } else { + None + } +} +impl BoundExtractor { + fn extract_bounds_recursive(&self, expr: &syn::Expr, name: &String) -> Vec { + let simplified = simplify_expression(expr); match simplified { syn::Expr::Binary(syn::ExprBinary { box left, @@ -208,13 +221,15 @@ impl BoundExtractor { .. }) => { match op { - // combining results: + // combining results of and: syn::BinOp::And(_) => { - let mut left_bound = self.extract_bounds_recursive(left, name); - let mut right_bound = self.extract_bounds_recursive(right, name); + let mut left_bound = self.extract_bounds_recursive(&left, name); + let mut right_bound = self.extract_bounds_recursive(&right, name); left_bound.append(&mut right_bound); left_bound } + // generate boundaries from comparisons if one of the sides + // is the name we are currently looking for BinOp::Lt(_) | BinOp::Le(_) | BinOp::Gt(_) | BinOp::Ge(_) => { // one of the two operators have to include "name" if this is // is a boundary: @@ -243,8 +258,8 @@ impl BoundExtractor { expr: box sub_expr, .. }) => { - let sub_bounds = self.extract_bounds_recursive(sub_expr, name); - // invert all the boundaries of the sub_expression + let sub_bounds = self.extract_bounds_recursive(&sub_expr, name); + // invert all the boundaries derived of the sub_expression sub_bounds .iter() .map(|bound| bound.clone().invert()) @@ -254,7 +269,9 @@ impl BoundExtractor { } } - pub fn derive_boundary( + /// Given a comparison, derive the corresponding boundary for the variable + /// we are currently dealing with + fn derive_boundary( &self, name: &String, left: &syn::Expr, @@ -268,8 +285,8 @@ impl BoundExtractor { // for now do it simple: One of the two expressions has to be // exactly "name" - let left_name_opt = expression_name(&left_simp); - let right_name_opt = expression_name(&right_simp); + let left_name_opt = utils::expression_name(&left_simp); + let right_name_opt = utils::expression_name(&right_simp); if let Some(left_name) = left_name_opt { if &left_name == name { bound_expr = Some(right.clone()); @@ -277,9 +294,13 @@ impl BoundExtractor { } if let Some(right_name) = right_name_opt { if &right_name == name { - // in case they both are just "name", this is not a boundary - assert!(bound_expr.is_none()); - // turn the condition around! + // in case they both are just "name", this cannot be used as a + // boundary + if bound_expr.is_some() { + return None; + } + // turn the condition around because implication is of the form + // not cond || expression new_op = match op { BinOp::Lt(_) => BinOp::Gt(syn::token::Gt::default()), BinOp::Gt(_) => BinOp::Lt(syn::token::Lt::default()), @@ -292,7 +313,6 @@ impl BoundExtractor { } // now we can be sure (if bound_expr is some) that our comparison has the // form `name op bound_expr` - // now create boundary: if let Some(bound) = bound_expr { let (included, kind) = match new_op { @@ -316,6 +336,22 @@ impl BoundExtractor { } fn find_identifiers(&self, expr: &syn::Expr) -> FxHashSet { + // a Visitor to extract identifiers that occurr in an expression + struct IdentifierFinder { + pub bound_vars: FxHashSet, + } + + impl<'ast> syn::visit::Visit<'ast> for IdentifierFinder { + fn visit_expr_path(&mut self, expr_path: &'ast syn::ExprPath) { + if expr_path.path.segments.len() == 1 { + // it is an identifier + let name = expr_path.to_token_stream().to_string(); + self.bound_vars.insert(name); + } + // keep visiting :) + syn::visit::visit_expr_path(self, expr_path); + } + } let mut finder = IdentifierFinder { bound_vars: FxHashSet::default(), }; @@ -328,39 +364,32 @@ impl BoundExtractor { } } -// The following two functions should go into some syn-helper file or similar - /// syn expressions can be part of a block, put into braces etc, all of which make -/// it harder to analyze them. -/// This function should help us simplify -pub fn simplify_expression(expr: &syn::Expr) -> syn::Expr { +/// it harder to analyze them. This function removes these. +fn simplify_expression(expr: &syn::Expr) -> syn::Expr { match expr { syn::Expr::Block(syn::ExprBlock { block, .. }) => { if block.stmts.len() == 1 { let res = block.stmts.get(0).unwrap().clone(); if let syn::Stmt::Expr(sub_expr) = res { - let res = simplify_expression(&sub_expr); - return res; + simplify_expression(&sub_expr) + } else { + expr.clone() } + } else { + expr.clone() } } syn::Expr::Paren(syn::ExprParen { expr: box sub_expr, .. - }) => { - let res = simplify_expression(sub_expr); - return res; - } - syn::Expr::Type(syn::ExprType { expr: sub_expr, .. }) => { - let res = simplify_expression(sub_expr); - return res; - } - _ => {} + }) => simplify_expression(sub_expr), + syn::Expr::Type(syn::ExprType { expr: sub_expr, .. }) => simplify_expression(sub_expr), + _ => expr.clone(), } - expr.clone() } #[derive(Clone)] -pub struct Boundary { +pub(crate) struct Boundary { pub bound: syn::Expr, /// Whether or not that value is still in the range pub included: bool, @@ -372,7 +401,7 @@ pub struct Boundary { } #[derive(Clone, Debug, Copy, PartialEq)] -pub enum BoundaryKind { +pub(crate) enum BoundaryKind { Upper, Lower, } @@ -391,47 +420,3 @@ impl Boundary { } } } - -// a Visitor to extract identifiers that occurr in an expression -pub struct IdentifierFinder { - pub bound_vars: FxHashSet, -} - -impl<'ast> syn::visit::Visit<'ast> for IdentifierFinder { - fn visit_expr_path(&mut self, expr_path: &'ast syn::ExprPath) { - if expr_path.path.segments.len() == 1 { - // it is an identifier - let name = expr_path.to_token_stream().to_string(); - self.bound_vars.insert(name); - } - // keep visiting :) - syn::visit::visit_expr_path(self, expr_path); - } -} - -// potentially also create something like a syn helper: -pub fn get_attribute_contents(name: String, attrs: &Vec) -> Option { - for attr in attrs { - if attr.path.to_token_stream().to_string() == name { - return Some(attr.tokens.clone()); - } - } - None -} - -pub fn is_primitive_number(ty: &syn::Type) -> bool { - matches!( - ty.to_token_stream().to_string().as_str(), - "i8" | "i16" - | "i32" - | "i64" - | "i128" - | "isize" - | "u8" - | "u16" - | "u32" - | "u64" - | "u128" - | "usize" - ) -} diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs b/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs index 15d715e19ff..f628d6fe281 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs @@ -1,5 +1,5 @@ #[derive(Clone, Copy, PartialEq)] -pub enum CheckItemType { +pub(crate) enum CheckItemType { PledgeLhs, PledgeRhs { has_lhs: bool }, Requires, @@ -11,6 +11,8 @@ pub enum CheckItemType { } impl CheckItemType { + /// Whether the signature of the check function generated from this contract + /// will contain old_values pub(crate) fn gets_old_args(&self) -> bool { matches!( self, @@ -18,7 +20,7 @@ impl CheckItemType { ) } - // probably pledge_rhs shouldn't actually need it.. + /// Whether the result of the function needs to be part of the check functions signature. pub(crate) fn needs_result(&self) -> bool { matches!( self, @@ -26,6 +28,8 @@ impl CheckItemType { ) } + /// Whether the original arguments to the function are also passed to + /// the check function. Maybe pledges shouldn't be here. pub(crate) fn gets_item_args(&self) -> bool { // maybe pledge_rhs should not get items either matches!( @@ -34,10 +38,14 @@ impl CheckItemType { ) } + /// Whether this kind of contract only occurrs within code, not as an annotation + /// of functions pub(crate) fn is_inlined(&self) -> bool { matches!(self, Self::Assert | Self::Assume | Self::BodyInvariant) } + /// A helper function for pretty printing contracts, allowing us a prettier + /// output for runtime errors pub(crate) fn wrap_contract(&self, s: &String) -> String { match self { Self::PledgeLhs => format!("#[assert_on_expiry({}, ..)]", s), @@ -56,8 +64,14 @@ impl CheckItemType { Self::Unchecked => unreachable!(), } } + + pub(crate) fn can_be_checked(&self) -> bool { + !matches!(self, Self::Unchecked) + } } +/// Opposed to previous debugging output, this one is used for generating the +/// check function names. impl std::fmt::Display for CheckItemType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs b/prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs index 73a32bd008b..599800a89fc 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/error_messages.rs @@ -2,6 +2,7 @@ use proc_macro2::{Span, TokenStream}; use quote::{quote, quote_spanned}; use syn::{parse_quote_spanned, spanned::Spanned}; +// the variable names used in the AST to construct and emit meaningful errors const FAILURE_MESSAGE_STR: &str = "_prusti_rtc_failure_message"; const BUFFER_IDENT: &str = "_prusti_rtc_info_buffer"; const BUFFER_LEN_IDENT: &str = "_prusti_rtc_info_len"; @@ -18,6 +19,8 @@ pub(crate) fn buffer_len_ident(span: Span) -> syn::Ident { syn::Ident::new(BUFFER_LEN_IDENT, span) } +/// Define the error message (or the corresponding fixed sized buffer) so +/// it can be extended with information at runtime pub(crate) fn define_failure_message(span: Span, message: &String) -> TokenStream { if cfg!(feature = "std") { let ident = failure_message_ident(span); @@ -37,8 +40,8 @@ pub(crate) fn define_failure_message(span: Span, message: &String) -> TokenStrea } } -/// Create a str from the buffer of the error message (only required -/// in case std is not available) +/// Create a str from the buffer of the error message just before it's emitted +/// (only required in case std is not available) pub(crate) fn construct_failure_message_opt(span: Span) -> Option { let ident = failure_message_ident(span); if !cfg!(feature = "std") { @@ -50,6 +53,8 @@ pub(crate) fn construct_failure_message_opt(span: Span) -> Option { } } +/// Creates a call to the check() function, that extends the error with additional +/// information in case that the boolean passed to it evaluates to false pub(crate) fn call_check_expr(expr: syn::Expr, message: String) -> syn::Expr { let span = expr.span(); if cfg!(feature = "std") { @@ -66,6 +71,8 @@ pub(crate) fn call_check_expr(expr: syn::Expr, message: String) -> syn::Expr { } } +/// If a quantifier fails at a specific index, extend the error message with that +/// information pub(crate) fn extend_error_indexed(expr: &syn::Expr, name_token: &TokenStream) -> syn::Block { let span = expr.span(); let expr_string = expr diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs b/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs index 1f29e1611a4..f1734ec5836 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/mod.rs @@ -2,6 +2,6 @@ pub mod translation; pub mod check_type; mod boundary_extraction; mod associated_function_info; -mod visitor; mod quantifiers; mod error_messages; +mod utils; diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs b/prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs index 87920fe1a65..7f096f6a435 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/quantifiers.rs @@ -1,7 +1,4 @@ -use crate::runtime_checks::{ - boundary_extraction::{is_primitive_number, BoundExtractor}, - error_messages, -}; +use crate::runtime_checks::{boundary_extraction, error_messages, utils}; use proc_macro2::TokenStream; use quote::{quote, ToTokens}; use rustc_hash::FxHashSet; @@ -11,6 +8,7 @@ pub(crate) enum QuantifierKind { Exists, } +/// Given a quantifier, try to translate it to a runtime checkable expression pub(crate) fn translate_quantifier_expression( closure: &syn::ExprClosure, kind: QuantifierKind, @@ -32,8 +30,8 @@ pub(crate) fn translate_quantifier_expression( name_set.insert(name_str.clone()); (name_str, ty.clone()) } else { - // maybe we can throw a more sensible error and make the - // check function a dummy check function + // not throwing a proper compile error because as of now, this will already cause + // an error in the preparser panic!("quantifiers without type annotations can not be checked at runtime"); } }) @@ -41,24 +39,23 @@ pub(crate) fn translate_quantifier_expression( // look for the runtime_quantifier_bounds attribute, or try to derive // boundaries from expressions of the form `boundary ==> expr` - let manual_bounds_opt = BoundExtractor::manual_bounds(closure.clone(), bound_vars.clone()); + let manual_bounds_opt = boundary_extraction::manual_bounds(closure.clone(), bound_vars.clone()); let bounds = if let Some(manual_bounds) = manual_bounds_opt { manual_bounds? } else { - BoundExtractor::derive_ranges(*closure.body.clone(), bound_vars)? + boundary_extraction::derive_ranges(*closure.body.clone(), bound_vars)? }; let mut expr = *closure.body.clone(); for ((name, ty), range_expr) in bounds.iter().rev() { let name_token: TokenStream = name.parse().unwrap(); - let info_statements = if is_primitive_number(ty) && is_outer { + let info_statements = if utils::is_primitive_number(ty) && is_outer { Some(error_messages::extend_error_indexed(&expr, &name_token)) } else { None }; - // maybe never turn them into strings in the first place.. expr = match kind { QuantifierKind::Forall => { let res = quote! { diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 1f7ccde95c8..5357dbfae80 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -5,19 +5,20 @@ use crate::{ associated_function_info::{create_argument, Argument, AssociatedFunctionInfo}, check_type::CheckItemType, error_messages, - visitor::CheckVisitor, + quantifiers::{translate_quantifier_expression, QuantifierKind}, + utils, }, specifications::{common::SpecificationId, untyped}, }; use proc_macro2::{Span, TokenStream}; -use quote::quote_spanned; +use quote::{quote, quote_spanned, ToTokens}; use syn::{parse_quote, parse_quote_spanned, spanned::Spanned, visit_mut::VisitMut}; // generates the check function that can be performed to check whether // a contract was valid at runtime. // Note: various modifications on the mir level are needed such that these // checks are executed correctly. -pub fn translate_runtime_checks( +pub(crate) fn translate_runtime_checks( check_type: CheckItemType, check_id: SpecificationId, // the expression of the actual contract @@ -113,7 +114,7 @@ pub fn translate_runtime_checks( check_item.sig.inputs.push(result_arg); } if check_type.gets_old_args() { - let old_arg = construct_old_fnarg(&function_info, span, false); + let old_arg = construct_old_fnarg(&function_info, span); // put it inside a reference: check_item.sig.inputs.push(old_arg); } @@ -133,7 +134,7 @@ pub fn translate_runtime_checks( Ok(syn::Item::Fn(check_item)) } -pub fn translate_expression_runtime( +pub(crate) fn translate_expression_runtime( tokens: TokenStream, check_id: SpecificationId, check_type: CheckItemType, @@ -149,7 +150,6 @@ pub fn translate_expression_runtime( check_type.wrap_contract(&expr_str) ); let mut expr: syn::Expr = syn::parse2(tokens)?; - // TODO: properly pass check types let mut check_visitor = CheckVisitor::new(function_info, check_type); check_visitor.visit_expr_mut(&mut expr); @@ -174,7 +174,7 @@ pub fn translate_expression_runtime( }) } -pub fn generate_forget_statements( +pub(crate) fn generate_forget_statements( item: &untyped::AnyFnItem, check_type: CheckItemType, span: Span, @@ -207,28 +207,20 @@ pub fn generate_forget_statements( } } -// at the moment deref is false in all use cases. Remove -fn construct_old_fnarg( - function_info: &AssociatedFunctionInfo, - span: Span, - deref: bool, -) -> syn::FnArg { +fn construct_old_fnarg(function_info: &AssociatedFunctionInfo, span: Span) -> syn::FnArg { let old_values_type: syn::Type = old_values_type(span, function_info); - if deref { - parse_quote_spanned! {span => - old_values: &#old_values_type - } - } else { - parse_quote_spanned! {span => - old_values: #old_values_type - } + parse_quote_spanned! {span => + old_values: #old_values_type } } /// After the visitor was run on an expression, this function -/// can be used to generate the type of the old_values tuple -/// important here is that it only contains the values that actually occurr -/// in old-expressions and not just all arguments +/// can be used to generate the type of the old_values tuple. +/// This type is a tuple, with the same number of fields as the original +/// function has arguments, but if the old value of an argument is never used, +/// this index in the tuple is simply a unit type. On the MIR level we can look +/// at this type, and figure out which arguments need to be cloned depending on +/// if the result type contains the argument type at the corresponding index. fn old_values_type(span: Span, function_info: &AssociatedFunctionInfo) -> syn::Type { let mut old_values_type: syn::Type = parse_quote_spanned! {span => ()}; let mut arguments = function_info.inputs.values().collect::>(); @@ -257,3 +249,202 @@ fn old_values_type(span: Span, function_info: &AssociatedFunctionInfo) -> syn::T } old_values_type } + +pub(crate) struct CheckVisitor { + pub function_info: AssociatedFunctionInfo, + pub check_type: CheckItemType, + pub within_old: bool, + pub within_before_expiry: bool, + /// Whether the current expression is part of the outermost + /// expression. If yes, and we encounter a conjunction or + /// forall quantifier, we can extend the reported error with + /// more precise information + is_outer: bool, + contains_conjunction: bool, +} + +impl CheckVisitor { + pub(crate) fn new(function_info: AssociatedFunctionInfo, check_type: CheckItemType) -> Self { + Self { + function_info, + check_type, + within_old: false, + within_before_expiry: false, + is_outer: true, + contains_conjunction: false, + } + } +} + +impl VisitMut for CheckVisitor { + fn visit_expr_mut(&mut self, expr: &mut syn::Expr) { + let was_outer = self.is_outer; + match expr { + syn::Expr::Path(expr_path) => { + // collect arguments that occurr within old expression + // these are the ones we wanna clone + if let Some(ident) = expr_path.path.get_ident() { + let name = ident.to_token_stream().to_string(); + if let Some(arg) = self.function_info.get_mut_arg(&name) { + // argument used within an old expression? + if self.check_type.gets_old_args() + && (self.within_old || (!arg.is_ref && arg.is_mutable)) + { + // if it was not already marked to be stored + // needs to be checked for indeces to be correct + arg.used_in_old = true; + // replace the identifier with the correct field access + let index_token: TokenStream = arg.index.to_string().parse().unwrap(); + let new_path: syn::Expr = + parse_quote_spanned! { expr.span() => (old_values.#index_token)}; + *expr = new_path; + } + } else if self.within_before_expiry && name == *"result" { + let new_path: syn::Expr = parse_quote_spanned! { expr.span() => + result_before_expiry.0 + }; + *expr = new_path; + } + } + } + syn::Expr::Call(call) => { + self.is_outer = false; + let path_expr = (*call.func).clone(); + let name = if let Some(name) = utils::expression_name(&path_expr) { + name + } else { + // still visit recursively + syn::visit_mut::visit_expr_mut(self, expr); + return; + }; + match name.as_str() { + ":: prusti_contracts :: old" | "prusti_contracts :: old" | "old" => { + // for this function we can savely try to get + // more precise errors about the contents + self.is_outer = was_outer; + // for prusti_assert etc we can not resolve old here + if self.check_type.is_inlined() { + syn::visit_mut::visit_expr_call_mut(self, call); + // just leave it as it is. resolve it on mir level + } else { + let sub_expr = call.args.pop(); + // remove old-call and replace with content expression + *expr = sub_expr.unwrap().value().clone(); + self.within_old = true; + self.visit_expr_mut(expr); + // will cause all variables below to be replaced by old_value.some_field + self.within_old = false; + } + } + ":: prusti_contracts :: before_expiry" + | "prusti_contracts :: before_expiry" + | "before_expiry" => { + let sub_expr = call.args.pop(); + *expr = sub_expr.unwrap().value().clone(); + // will cause all variables below to be replaced by old_value.some_field + self.within_before_expiry = true; + self.visit_expr_mut(expr); + self.within_before_expiry = false; + } + ":: prusti_contracts :: forall" => { + // arguments are triggers and then the closure: + let quant_closure_expr: syn::Expr = call.args.last().unwrap().clone(); + if let syn::Expr::Closure(mut expr_closure) = quant_closure_expr { + // since this is a conjunction, we can get more information about subexpressions failing + // (however, if we are in no_std, we cannot report errors recursively because of limited buffer size) + self.is_outer = if cfg!(feature = "std") { + was_outer + } else { + false + }; + self.visit_expr_mut(&mut expr_closure.body); + let check_expr = translate_quantifier_expression( + &expr_closure, + QuantifierKind::Forall, + was_outer, + ) + .unwrap_or_else(|err| syn::parse2(err.to_compile_error()).unwrap()); + *expr = check_expr; + } + } + ":: prusti_contracts :: exists" => { + syn::visit_mut::visit_expr_call_mut(self, call); + let closure_expression: syn::Expr = call.args.last().unwrap().clone(); + if let syn::Expr::Closure(expr_closure) = closure_expression { + let check_expr = translate_quantifier_expression( + &expr_closure, + QuantifierKind::Exists, + false, + ) + .unwrap_or_else(|err| syn::parse2(err.to_compile_error()).unwrap()); + *expr = check_expr; + } + } + // some cases where we want to warn users that these features + // will not be checked correctly: (not complete yet) + ":: prusti_contracts :: snapshot_equality" + | "prusti_contracts :: snapshot_equality" + | "snapshot_equality" + | ":: prusti_contracts :: snap" + | "prusti_contracts :: snap" + | "snap" => { + let message = format!( + "Runtime checks: Use of unsupported feature {}", + expr.to_token_stream() + ); + expr.span().unwrap().warning(message).emit(); + } + _ => syn::visit_mut::visit_expr_mut(self, expr), + } + } + // If we have a conjunction on the outer level of the expression, we can + // produce a more precise error. + syn::Expr::Binary(syn::ExprBinary { + left: box left, + op: syn::BinOp::And(_), + right: box right, + .. + }) if was_outer => { + // Figure out if the sub-expressions contain even more conjunctions. + // If yes, visiting the children of our current node will already + // procude more precise errors than we can here. + self.contains_conjunction = false; + syn::visit_mut::visit_expr_mut(self, left); + let left_contains_conjunction = self.contains_conjunction; + self.contains_conjunction = false; + syn::visit_mut::visit_expr_mut(self, right); + let right_contains_conjunction = self.contains_conjunction; + + if !left_contains_conjunction { + let left_str = left + .span() + .source_text() + .unwrap_or_else(|| quote!(left).to_string()); + let left_error_str = format!("\n\t> expression {} was violated.", left_str); + let new_left = error_messages::call_check_expr(left.clone(), left_error_str); + *left = new_left; + } + if !right_contains_conjunction { + let right_str = right + .span() + .source_text() + .unwrap_or_else(|| quote!(right).to_string()); + let right_error_str = format!("\n\t> expression {} was violated.", right_str); + let new_right = error_messages::call_check_expr(right.clone(), right_error_str); + *right = new_right; + } + // signal to parent that it doesnt need to wrap this expression + // into a separate check function, since it will be further split up + self.contains_conjunction = true; + } + syn::Expr::Block(_) | syn::Expr::Paren(_) => { + syn::visit_mut::visit_expr_mut(self, expr); + } + _ => { + self.is_outer = false; + syn::visit_mut::visit_expr_mut(self, expr); + } + } + self.is_outer = was_outer; + } +} diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/utils.rs b/prusti-contracts/prusti-specs/src/runtime_checks/utils.rs new file mode 100644 index 00000000000..3a849eafb06 --- /dev/null +++ b/prusti-contracts/prusti-specs/src/runtime_checks/utils.rs @@ -0,0 +1,52 @@ +use proc_macro2::TokenStream; +use quote::ToTokens; + +// if expression is a identifier, get the name: +pub(crate) fn expression_name(expr: &syn::Expr) -> Option { + if let syn::Expr::Path(syn::ExprPath { path, .. }) = expr { + Some(path.to_token_stream().to_string()) + } else { + None + } +} + +/// Self explanatory. But also, these are the only supported types +/// for runtime checking quantifiers +pub(crate) fn is_primitive_number(ty: &syn::Type) -> bool { + matches!( + ty.to_token_stream().to_string().as_str(), + "i8" | "i16" + | "i32" + | "i64" + | "i128" + | "isize" + | "u8" + | "u16" + | "u32" + | "u64" + | "u128" + | "usize" + ) +} + +pub(crate) fn ty_unsigned(ty: &syn::Type) -> bool { + matches!( + ty.to_token_stream().to_string().as_str(), + "u8" | "u16" | "u32" | "u64" | "u128" | "usize" + ) +} + +/// Whether a type is small enough to be efficiently runtime checked +/// even without an upper / lower bound +pub(crate) fn ty_small_enough(ty: &syn::Type) -> bool { + matches!(ty.to_token_stream().to_string().as_str(), "u8" | "i8") +} + +pub fn get_attribute_contents(name: String, attrs: &Vec) -> Option { + for attr in attrs { + if attr.path.to_token_stream().to_string() == name { + return Some(attr.tokens.clone()); + } + } + None +} diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs b/prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs deleted file mode 100644 index 79d5818ae6d..00000000000 --- a/prusti-contracts/prusti-specs/src/runtime_checks/visitor.rs +++ /dev/null @@ -1,205 +0,0 @@ -use crate::runtime_checks::{ - associated_function_info::AssociatedFunctionInfo, - check_type::CheckItemType, - error_messages, - quantifiers::{translate_quantifier_expression, QuantifierKind}, -}; -use proc_macro2::TokenStream; -use quote::{quote, ToTokens}; -use syn::{parse_quote_spanned, spanned::Spanned, visit_mut::VisitMut, Expr}; - -pub(crate) struct CheckVisitor { - pub function_info: AssociatedFunctionInfo, - pub check_type: CheckItemType, - pub within_old: bool, - pub within_before_expiry: bool, - /// Whether the current expression is part of the outermost - /// expression. If yes, and we encounter a conjunction or - /// forall quantifier, we can extend the reported error with - /// more precise information - is_outer: bool, - contains_conjunction: bool, -} - -impl CheckVisitor { - pub(crate) fn new(function_info: AssociatedFunctionInfo, check_type: CheckItemType) -> Self { - Self { - function_info, - check_type, - within_old: false, - within_before_expiry: false, - is_outer: true, - contains_conjunction: false, - } - } -} - -impl VisitMut for CheckVisitor { - fn visit_expr_mut(&mut self, expr: &mut Expr) { - let was_outer = self.is_outer; - match expr { - Expr::Path(expr_path) => { - // collect arguments that occurr within old expression - // these are the ones we wanna clone - if let Some(ident) = expr_path.path.get_ident() { - let name = ident.to_token_stream().to_string(); - if let Some(arg) = self.function_info.get_mut_arg(&name) { - // argument used within an old expression? - // not already marked as used in old? - if self.check_type.gets_old_args() && (self.within_old || (!arg.is_ref && arg.is_mutable)) { - // if it was not already marked to be stored - // needs to be checked for indeces to be correct - arg.used_in_old = true; - // replace the identifier with the correct field access - let index_token: TokenStream = - arg.index.to_string().parse().unwrap(); - let new_path: syn::Expr = parse_quote_spanned! { expr.span() => (old_values.#index_token)}; - *expr = new_path; - } - } else if self.within_before_expiry && name == *"result" { - let new_path: syn::Expr = parse_quote_spanned! { expr.span() => - result_before_expiry.0 - }; - *expr = new_path; - } - } - } - Expr::Call(call) - // func: box Expr::Path(syn::ExprPath { path, .. }), - // .. - => { - self.is_outer = false; - let path_expr = (*call.func).clone(); - // move this function, has nothing to do with boundary extraction - let name = if let Some(name) = expression_name(&path_expr) { - name - } else { - // still visit recursively - syn::visit_mut::visit_expr_mut(self, expr); - return; - }; - match name.as_str() { - ":: prusti_contracts :: old" | "prusti_contracts :: old" | "old" => { - // for this function we can savely try to get - // more precise errors about the contents - self.is_outer = was_outer; - // for prusti_assert etc we can not resolve old here - if self.check_type.is_inlined() { - syn::visit_mut::visit_expr_call_mut(self, call); - // just leave it as it is.. resolve it on mir level - } else { - let sub_expr = call.args.pop(); - // remove old-call and replace with content expression - *expr = sub_expr.unwrap().value().clone(); - self.within_old = true; - self.visit_expr_mut(expr); - // will cause all variables below to be replaced by old_value.some_field - self.within_old = false; - } - } - ":: prusti_contracts :: before_expiry" | "prusti_contracts :: before_expiry" | "before_expiry" => { - let sub_expr = call.args.pop(); - *expr = sub_expr.unwrap().value().clone(); - self.within_before_expiry = true; - self.visit_expr_mut(expr); - // will cause all variables below to be replaced by old_value.some_field - self.within_before_expiry = false; - }, - ":: prusti_contracts :: forall" => { - // arguments are triggers and then the closure: - let quant_closure_expr: syn::Expr = call.args.last().unwrap().clone(); - if let syn::Expr::Closure(mut expr_closure) = quant_closure_expr { - // since this is a conjunction, we can get - // more information about subexpressions failing - // (however, if we are in no_std, we cannot report - // errors recursively because of limited buffer size) - self.is_outer = if cfg!(feature = "std") { - was_outer - } else { - false - }; - self.visit_expr_mut(&mut expr_closure.body); - // we are throwing away any triggers - // extract all the relevant information, construct a - // new expression - let check_expr = translate_quantifier_expression( - &expr_closure, - QuantifierKind::Forall, - was_outer, - ).unwrap_or_else(|err| syn::parse2(err.to_compile_error()).unwrap()); - *expr = check_expr; - } } - ":: prusti_contracts :: exists" => { - // here we don't want every failing iteration - // to give us additional info - syn::visit_mut::visit_expr_call_mut(self, call); - let closure_expression: syn::Expr = call.args.last().unwrap().clone(); - if let syn::Expr::Closure(expr_closure) = closure_expression { - let check_expr = translate_quantifier_expression( - &expr_closure, - QuantifierKind::Exists, - false, - ).unwrap_or_else(|err| syn::parse2(err.to_compile_error()).unwrap()); - *expr = check_expr; - } - }, - // some cases where we want to warn users that these features - // will not be checked correctly: (not complete yet) - ":: prusti_contracts :: snapshot_equality" | "prusti_contracts :: snapshot_equality" | "snapshot_equality" - | ":: prusti_contracts :: snap" | "prusti_contracts :: snap" | "snap" => { - let message = format!("Runtime checks: Use of unsupported feature {}", expr.to_token_stream()); - expr.span().unwrap().warning(message).emit(); - } - _ => syn::visit_mut::visit_expr_mut(self, expr), - } - }, - Expr::Binary(syn::ExprBinary { - left: box left, - op: syn::BinOp::And(_), - right: box right, .. - }) => { - if was_outer { - syn::visit_mut::visit_expr_mut(self, left); - let left_contains_conjunction = self.contains_conjunction; - self.contains_conjunction = false; - syn::visit_mut::visit_expr_mut(self, right); - let right_contains_conjunction = self.contains_conjunction; - // call check function on both sides: - let left_str = left.span().source_text().unwrap_or_else(|| quote!(left).to_string()); - let left_error_str = format!("\n\t> expression {} was violated.", left_str); - let right_str = right.span().source_text().unwrap_or_else(|| quote!(right).to_string()); - let right_error_str = format!("\n\t> expression {} was violated.", right_str); - - // the expression will be split up even further - if !left_contains_conjunction { - let new_left = error_messages::call_check_expr(left.clone(), left_error_str); - *left = new_left; - } - if !right_contains_conjunction { - let new_right = error_messages::call_check_expr(right.clone(), right_error_str); - *right = new_right; - } - // signal to parent that it doesnt need to wrap this expression - // into a separate check function, since it will be further split up - self.contains_conjunction = true; - } - }, - Expr::Block(_) | Expr::Paren(_) => { - syn::visit_mut::visit_expr_mut(self, expr); - } - _ => { - self.is_outer = false; - syn::visit_mut::visit_expr_mut(self, expr); - } - } - self.is_outer = was_outer; - } -} - -// if expression is a identifier, get the name: -pub fn expression_name(expr: &syn::Expr) -> Option { - if let syn::Expr::Path(syn::ExprPath { path, .. }) = expr { - return Some(path.to_token_stream().to_string()); - } - None -} diff --git a/prusti-contracts/prusti-specs/src/specifications/untyped.rs b/prusti-contracts/prusti-specs/src/specifications/untyped.rs index c55fef4593b..851ec94f050 100644 --- a/prusti-contracts/prusti-specs/src/specifications/untyped.rs +++ b/prusti-contracts/prusti-specs/src/specifications/untyped.rs @@ -9,7 +9,7 @@ pub use super::{ }; /// An abstraction over all kinds of function items. -#[derive(Debug, PartialEq, Eq, Clone)] +#[derive(Debug, PartialEq, Eq)] pub enum AnyFnItem { Fn(syn::ItemFn), TraitMethod(syn::TraitItemMethod), diff --git a/prusti-interface/src/globals.rs b/prusti-interface/src/globals.rs index 2cb0ba61674..39ed7607dc4 100644 --- a/prusti-interface/src/globals.rs +++ b/prusti-interface/src/globals.rs @@ -23,6 +23,9 @@ thread_local! { pub static VERIFIED_ASSERTIONS: RefCell>> = Default::default(); } +/// If we encoded assertions in the hope of being able to eliminate them, we +/// store their locations here, so we can later eliminate them in case they +/// don't generate an error pub fn add_encoded_assertion(def_id: DefId, bb: mir::BasicBlock) { VERIFIED_ASSERTIONS.with(|cell| { let mut map = cell.borrow_mut(); @@ -34,6 +37,7 @@ pub fn add_encoded_assertion(def_id: DefId, bb: mir::BasicBlock) { }) } +/// Mark an assertion as violated, meaning we can not eliminate it. pub fn set_assertion_violated(def_id: DefId, bb: mir::BasicBlock) { VERIFIED_ASSERTIONS.with(|cell| { let mut map = cell.borrow_mut(); @@ -43,6 +47,7 @@ pub fn set_assertion_violated(def_id: DefId, bb: mir::BasicBlock) { }) } +/// For each function returns a map telling us which assertions can be eliminated pub fn get_assertion_map(def_id: DefId) -> Option> { VERIFIED_ASSERTIONS.with(|cell| { let map = cell.borrow(); @@ -50,7 +55,7 @@ pub fn get_assertion_map(def_id: DefId) -> Option Option(def_spec: DefSpecificationMap, env: Environment<'tcx>) { let static_env: Environment<'static> = unsafe { std::mem::transmute(env) }; SPECS.with(|specs| { @@ -97,10 +103,12 @@ pub fn get_env<'tcx>() -> Environment<'tcx> { env } +/// Whether verification has already been executed for a specific crate pub fn verified(krate_id: CrateNum) -> bool { VERIFIED.with(|verified| verified.borrow().contains(&krate_id)) } +/// Mark a crate as verified pub fn set_verified(krate_id: CrateNum) { VERIFIED.with(|verified| verified.borrow_mut().insert(krate_id)); } diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.rs b/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.rs index 3df1da3a36c..4094f394d49 100644 --- a/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.rs +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.rs @@ -1,6 +1,8 @@ //@run: 101 use prusti_contracts::*; +// Tests that generics are properly handled, and that if there are multiple +// postconditions, they are properly chained and both executed. fn main() { let mut x = GenericStruct { x: 40}; let mut y = GenericStruct { x: 32}; diff --git a/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stderr b/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stderr index 1fc5bb29f90..bd84cb109de 100644 --- a/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stderr +++ b/prusti-tests/tests/runtime_checks/fail/postconditions/generic-old.stderr @@ -1,3 +1,3 @@ -thread 'main' panicked at $DIR/generic-old.rs:22:5: +thread 'main' panicked at $DIR/generic-old.rs:24:5: Prusti Runtime Checks: Contract #[ensures(self.x == old(other.x))] was violated at runtime note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.rs b/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.rs index b91c8ac1774..ae41e4fb8c7 100644 --- a/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.rs +++ b/prusti-tests/tests/runtime_checks/pass/quantifiers/exists-minimal-2.rs @@ -2,7 +2,7 @@ use prusti_contracts::*; #[insert_runtime_check] -#[requires(exists(|x: i16| x <= i16::MAX ==> x == i16::MAX))] +#[requires(exists(|x: i8| x <= i8::MAX ==> x == i8::MAX))] fn foo() {} #[trusted] diff --git a/prusti-viper/src/encoder/procedure_encoder.rs b/prusti-viper/src/encoder/procedure_encoder.rs index 58d8c425e7f..e64982df160 100644 --- a/prusti-viper/src/encoder/procedure_encoder.rs +++ b/prusti-viper/src/encoder/procedure_encoder.rs @@ -2777,6 +2777,8 @@ impl<'p, 'v: 'p, 'tcx: 'v> ProcedureEncoder<'p, 'v, 'tcx> { if config::remove_dead_code() { globals::add_encoded_assertion(self.proc_def_id, location.block); } + // whether the error generated here should be ignored, i.e. not reported + // to the user (because it was only inserted for optimization) let ignore = config::remove_dead_code() && (!self.check_panics || (!config::check_overflows() diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index 190406bbcd2..024df47dd6a 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -248,7 +248,6 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { }); compiler.session().abort_if_errors(); if config::full_compilation() { - // verification moved into mir_drops_elaborated query! Compilation::Continue } else { Compilation::Stop diff --git a/prusti/src/driver.rs b/prusti/src/driver.rs index 983cf2d9d6c..a9f5918890e 100644 --- a/prusti/src/driver.rs +++ b/prusti/src/driver.rs @@ -8,13 +8,12 @@ #![feature(proc_macro_internals)] #![feature(decl_macro)] #![feature(box_patterns)] -#![deny(unused_must_use)] #![feature(let_chains)] +#![deny(unused_must_use)] mod arg_value; mod callbacks; mod verifier; - mod modify_mir; use arg_value::arg_value; @@ -190,7 +189,6 @@ fn main() { } // these flags influence the behavior of the ast rewriter, where we can't use config - // (or can we?) if config::debug_runtime_checks() { std::env::set_var("PRUSTI_DEBUG_RUNTIME_CHECKS", "true"); } diff --git a/prusti/src/modify_mir/mir_helper.rs b/prusti/src/modify_mir/mir_helper.rs index 49f2837aa16..dc8174da6dc 100644 --- a/prusti/src/modify_mir/mir_helper.rs +++ b/prusti/src/modify_mir/mir_helper.rs @@ -10,7 +10,7 @@ use rustc_hash::FxHashMap; // A set of functions that are often used during mir modifications -/// Check whether this variable is mutable, or a mutable reference +/// Check whether this local is an argument and mutable, or a mutable reference pub fn is_mutable_arg( body: &Body<'_>, local: mir::Local, @@ -28,27 +28,18 @@ pub fn is_mutable_arg( } } -// pub fn make_immutable<'tcx>(tcx: TyCtxt<'tcx>, ty: ty::Ty<'tcx>) -> ty::Ty<'tcx> { -// match *ty.kind() { -// ty::Ref(region, inner_ty, mir::Mutability::Mut) => { -// let new_inner_ty = make_immutable(tcx, inner_ty); -// tcx.mk_imm_ref(region, new_inner_ty) -// } -// _ => ty, -// } -// } - -pub fn fn_return_ty<'tcx>( +pub fn fn_signature<'tcx>( tcx: TyCtxt<'tcx>, def_id: DefId, generics_opt: Option>, -) -> ty::Ty<'tcx> { - let fn_sig = if let Some(generics) = generics_opt { +) -> ty::FnSig<'tcx> { + let fn_sig_binder = if let Some(generics) = generics_opt { tcx.fn_sig(def_id).instantiate(tcx, generics) } else { tcx.fn_sig(def_id).instantiate_identity() }; - fn_sig.output().skip_binder() + let param_env = tcx.param_env(def_id); + tcx.normalize_erasing_late_bound_regions(param_env, fn_sig_binder) } pub fn dummy_source_info() -> mir::SourceInfo { @@ -74,6 +65,7 @@ pub fn unit_const(tcx: TyCtxt<'_>) -> mir::Operand<'_> { mir::Operand::Constant(Box::new(constant)) } +/// Creates an Rvalue containing a references to a local variable pub fn rvalue_reference_to_local<'tcx>( tcx: TyCtxt<'tcx>, place: mir::Place<'tcx>, @@ -107,6 +99,7 @@ pub fn create_reference_type<'tcx>(tcx: TyCtxt<'tcx>, ty: ty::Ty<'tcx>) -> ty::T ) } +/// Find the def_id of clone pub fn get_clone_defid(tcx: TyCtxt<'_>) -> Option { let trait_defid = tcx.lang_items().clone_trait()?; tcx.associated_items(trait_defid) @@ -119,6 +112,7 @@ pub fn get_clone_defid(tcx: TyCtxt<'_>) -> Option { .map(|x| x.def_id) } +/// Given a function body, determine the set of arguments pub fn args_from_body<'tcx>(body: &Body<'tcx>) -> Vec> { let mut args = Vec::new(); let caller_nr_args = body.arg_count; @@ -135,6 +129,7 @@ pub fn args_from_body<'tcx>(body: &Body<'tcx>) -> Vec> { args } +/// Given a body, put a Goto block at the start. pub fn prepend_dummy_block(body: &mut Body) -> mir::BasicBlock { let mut patch = MirPatch::new(body); let terminator_kind = mir::TerminatorKind::Goto { @@ -166,6 +161,11 @@ pub fn replace_outgoing_edges( from: mir::BasicBlock, to: mir::BasicBlock, ) { + fn update_if_equals(dest: &mut T, from: T, to: T) { + if *dest == from { + *dest = to; + } + } match &mut data.terminator_mut().kind { TerminatorKind::Goto { target } => update_if_equals(target, from, to), TerminatorKind::SwitchInt { targets, .. } => { @@ -226,15 +226,9 @@ pub fn replace_outgoing_edges( } } -fn update_if_equals(dest: &mut T, from: T, to: T) { - if *dest == from { - *dest = to; - } -} - /// Given a call terminator, change it's target (the target is the basic /// block the execution will return to, once the function is finished) -pub fn replace_target(terminator: &mut mir::Terminator, new_target: mir::BasicBlock) { +pub fn replace_call_target(terminator: &mut mir::Terminator, new_target: mir::BasicBlock) { if let mir::TerminatorKind::Call { target, .. } = &mut terminator.kind { *target = Some(new_target); } @@ -273,7 +267,7 @@ impl<'tcx, 'a> MutVisitor<'tcx> for ArgumentReplacer<'a, 'tcx> { } // If this block is a goto block, and if it is returns its current target -pub fn get_block_target(body: &Body<'_>, block: mir::BasicBlock) -> Option { +pub fn get_goto_block_target(body: &Body<'_>, block: mir::BasicBlock) -> Option { let terminator: &Option = &body.basic_blocks.get(block)?.terminator; if let Some(mir::Terminator { kind: mir::TerminatorKind::Goto { target }, @@ -286,6 +280,7 @@ pub fn get_block_target(body: &Body<'_>, block: mir::BasicBlock) -> Option, location: mir::Location) -> Vec { let statements_len = body[location.block].statements.len(); if location.statement_index < statements_len { diff --git a/prusti/src/modify_mir/mir_info_collector.rs b/prusti/src/modify_mir/mir_info_collector.rs index 916bf2a335c..a3f708b0d32 100644 --- a/prusti/src/modify_mir/mir_info_collector.rs +++ b/prusti/src/modify_mir/mir_info_collector.rs @@ -4,12 +4,10 @@ use prusti_interface::{ environment::{blocks_dominated_by, is_check_closure, EnvQuery, Environment}, globals, specs::typed::DefSpecificationMap, - utils::has_prusti_attr, }; use prusti_rustc_interface::{ - index::IndexVec, middle::{ - mir::{self, visit::Visitor, Statement, StatementKind}, + mir::{self, visit::Visitor}, ty::TyCtxt, }, span::{def_id::DefId, Span}, @@ -25,11 +23,6 @@ pub struct MirInfo<'tcx> { pub def_id: DefId, pub specs: DefSpecificationMap, pub env: Environment<'tcx>, - /// blocks that the translation specifically added to either mark - /// a location (manual pledge expiry) or that we identified to - /// be the check blocks for a `prusti_assert!`, `prusti_assume!` or - /// `body_invariant`. - pub check_blocks: FxHashMap, /// function arguments that have to be cloned on entry of the function pub args_to_be_cloned: FxHashSet, /// statements in which we should replace the occurrence of a function @@ -38,61 +31,107 @@ pub struct MirInfo<'tcx> { } impl<'tcx> MirInfo<'tcx> { - // Collect this info given a body. - // mir_promoted is also passed in here, because some information - // is removed in mir_drops_elaborated + /// Given a body, collect information about it. pub fn collect_mir_info<'a>( tcx: TyCtxt<'tcx>, body: mir::Body<'tcx>, def_id: DefId, - local_decls: &'a IndexVec>, ) -> MirInfo<'tcx> { let specs = globals::get_defspec(); let env = globals::get_env(); - let check_blocks = collect_check_blocks(tcx, &body); - let mut visitor = MirInfoCollector::new(body.clone(), tcx, local_decls); - visitor.visit_body(&body); - let (args_to_be_cloned, stmts_to_substitute_rhs) = visitor.process_dependencies(); + let (args_to_be_cloned, stmts_to_substitute_rhs) = + determine_modifications_old_resolution(tcx, body); MirInfo { def_id, specs, env, - check_blocks, args_to_be_cloned, stmts_to_substitute_rhs, } } - // when MirInfo is no longer required, put specs and env back into - // global statics (because we only want to compute them once) - // consider putting this inside of drop for MirInfo + // when MirInfo is no longer required, put specs and env back into global statics + // (because we only want to / can compute them once) pub fn store_specs_env(self) { let MirInfo { specs, env, .. } = self; globals::store_spec_env(specs, env); } } +/// Figures out which arguments need to be cloned, and in which locations +/// arguments need to be replaced with their clones +fn determine_modifications_old_resolution<'tcx>( + tcx: TyCtxt<'tcx>, + body: mir::Body<'tcx>, +) -> (FxHashSet, FxHashSet) { + // TODO cedihegi: if check blocks are really not needed elsewhere, move their computation into + // find_old_spans.. + let check_blocks = collect_check_blocks(tcx, &body); + let (old_spans, old_args) = find_old_spans_and_args(tcx, &body, check_blocks); + + let mut args_to_clone = FxHashSet::::default(); + let mut stmts_to_adjust = FxHashSet::::default(); + let mut encountered = FxHashSet::::default(); + + let mut visitor = DependencyCollector { + old_spans, + locals_dependencies: Default::default(), + assignment_locations: Default::default(), + body: body.clone(), + }; + visitor.visit_body(&body); + + for old_arg in old_args.iter() { + // For each old argument, try to figure out on which function arguments + // it depends on, and in which locations of the MIR these function arguments + // need to be replaced with their old values + let mut to_process = vec![*old_arg]; + while let Some(local) = to_process.pop() { + let deps = visitor.locals_dependencies.get(&local).unwrap(); + // all the locations this variable has been assigned to + let assignment_locations = visitor + .assignment_locations + .get(&local) + .cloned() + .unwrap_or_default(); + deps.iter().for_each(|dep| { + if dep.is_mutable_arg { + // the case where we find a dependency on a function argument, meaning + // at this location the function argument will have to be replaced with + // an old clone + // 1. mark this function argument to be cloned + args_to_clone.insert(dep.local); + // 2. In the locations where this local is assigned to, we will have to + // replace occurrences of this function argument on the rhs with the old clone + assignment_locations.iter().for_each(|location| { + stmts_to_adjust.insert(*location); + }); + } else if (!dep.is_user_declared || dep.declared_within_old) + && !encountered.contains(&dep.local) + { + // process this variable too! + to_process.push(dep.local); + encountered.insert(dep.local); + } + }); + } + } + (args_to_clone, stmts_to_adjust) +} + // A MIR Visitor that collects information before we actually start modifying // the MIR. It's responsibilities are: // - finding function arguments that need to be cloned // - finding basic-blocks, that can contain old expressions that should be // resolved (check_only blocks) -// - finding basic blocks, that contain an empty closure, referring to an -// expiration location (when a user manually inserts `prusti_pledge_expires!()`) -// or blocks that are dominated by this kind of block -struct MirInfoCollector<'tcx, 'a> { - /// a MIR visitor collecting some information about old calls, run - /// beforehand - old_visitor: OldSpanFinder<'tcx>, +struct DependencyCollector<'tcx> { + old_spans: Vec, /// dependencies between locals, for each local get a list of other locals /// that it depends on locals_dependencies: FxHashMap>, /// locations where we assign values to locals: - assignment_locations: FxHashMap>, + assignment_locations: FxHashMap>, /// a body of the copy body: mir::Body<'tcx>, - /// the rvalue visitor, so we don't construct it for each assignment - rvalue_visitor: RvalueVisitor, - local_decls: &'a IndexVec>, } #[derive(Hash, Clone, Debug, PartialEq, Eq)] @@ -103,27 +142,51 @@ struct Dependency { is_mutable_arg: bool, } -impl<'tcx, 'a> Visitor<'tcx> for MirInfoCollector<'tcx, 'a> { - fn visit_statement(&mut self, statement: &Statement<'tcx>, location: mir::Location) { +impl<'tcx> DependencyCollector<'tcx> { + // determine all the relevant facts about this local + fn create_dependency(&self, local: mir::Local) -> Dependency { + let local_decl = self.body.local_decls.get(local); + + // calling is_user_variable directly leads to panics for certain variables.. + let is_user_declared = if let Some(local_decl) = local_decl { + matches!(local_decl.local_info.as_ref(), mir::ClearCrossCrate::Set(_)) + && local_decl.is_user_variable() + } else { + false + }; + // if a variable is not user declared this doesn't matter + let declared_within_old = is_user_declared + && self + .old_spans + .iter() + .any(|old_span| old_span.contains(local_decl.unwrap().source_info.span)); + let is_mutable_arg = is_mutable_arg(&self.body, local, &self.body.local_decls); + Dependency { + local, + is_user_declared, + declared_within_old, + is_mutable_arg, + } + } +} + +impl<'tcx> Visitor<'tcx> for DependencyCollector<'tcx> { + fn visit_statement(&mut self, statement: &mir::Statement<'tcx>, location: mir::Location) { self.super_statement(statement, location); - if let StatementKind::Assign(box (recv, rvalue)) = &statement.kind { - // collect all locals contained in rvalue. - self.rvalue_visitor.visit_rvalue(rvalue, location); - // take the collected locals and reset visitor - let dependencies = std::mem::take(&mut self.rvalue_visitor.dependencies); + if let mir::StatementKind::Assign(box (recv, rvalue)) = &statement.kind { + // store this location as one where we assign to this local + self.assignment_locations + .entry(recv.local) + .or_default() + .insert(location); + // collect all locals contained in rhs rvalue and add them as dependencies + let dependencies = rvalue_dependencies(rvalue, location); dependencies.iter().for_each(|local| { let dep = self.create_dependency(*local); - if let Some(dependencies) = self.locals_dependencies.get_mut(&recv.local) { - dependencies.insert(dep); - } else { - let dependencies = [dep].iter().cloned().collect(); - self.locals_dependencies.insert(recv.local, dependencies); - } - if let Some(location_vec) = self.assignment_locations.get_mut(&recv.local) { - location_vec.push(location); - } else { - self.assignment_locations.insert(recv.local, vec![location]); - } + self.locals_dependencies + .entry(recv.local) + .or_default() + .insert(dep); }); } } @@ -135,252 +198,145 @@ impl<'tcx, 'a> Visitor<'tcx> for MirInfoCollector<'tcx, 'a> { args, destination, .. } = &terminator.kind { - // collect dependencies + // Store this location as one where we assign to this local + self.assignment_locations + .entry(destination.local) + .or_default() + .insert(location); + // Add each argument as a dependency for the lefhandside of this call args.iter().for_each(|arg| { if let mir::Operand::Move(place) | mir::Operand::Copy(place) = arg { let dep = self.create_dependency(place.local); - if let Some(dependencies) = self.locals_dependencies.get_mut(&destination.local) - { - dependencies.insert(dep); - } else { - let mut dependencies = FxHashSet::default(); - dependencies.insert(dep); - self.locals_dependencies - .insert(destination.local, dependencies); - }; - if let Some(location_vec) = - self.assignment_locations.get_mut(&destination.local) - { - location_vec.push(location); - } else { - let location_vec = vec![location]; - self.assignment_locations - .insert(destination.local, location_vec); - }; + self.locals_dependencies + .entry(destination.local) + .or_default() + .insert(dep); } }); } } } -impl<'tcx, 'a> MirInfoCollector<'tcx, 'a> { - pub(crate) fn new( - body: mir::Body<'tcx>, - tcx: TyCtxt<'tcx>, - local_decls: &'a IndexVec>, - ) -> Self { - // old visitor identifies spans of old within code - let mut old_visitor = OldSpanFinder::new(tcx); - old_visitor.visit_body(&body); - Self { - old_visitor, - locals_dependencies: Default::default(), - assignment_locations: Default::default(), - body, - rvalue_visitor: RvalueVisitor { - dependencies: Default::default(), - }, - local_decls, +fn rvalue_dependencies<'tcx>( + rvalue: &mir::Rvalue<'tcx>, + location: mir::Location, +) -> Vec { + struct RvalueVisitor { + pub dependencies: Vec, + } + impl<'tcx> Visitor<'tcx> for RvalueVisitor { + fn visit_local( + &mut self, + local: mir::Local, + _context: mir::visit::PlaceContext, + _location: mir::Location, + ) { + self.dependencies.push(local); } } + let mut visitor = RvalueVisitor { + dependencies: vec![], + }; + visitor.visit_rvalue(rvalue, location); + visitor.dependencies +} - // Given the dependencies, figure out which arguments we need to clone - // and which statements will need to be adjusted - pub fn process_dependencies(&self) -> (FxHashSet, FxHashSet) { - let mut args_to_clone = FxHashSet::::default(); - let mut stmts_to_adjust = FxHashSet::::default(); - let mut encountered = FxHashSet::::default(); - // travers the dependency graph starting at old arguments, stopping - // at user defined variables defined outside of old, looking for - // dependencies on mutable function arguments - for old_arg in self.old_visitor.old_args.iter() { - // we put locals in here that are dependencies of old arguments and - // that are not user defined - let mut to_process = vec![*old_arg]; - while let Some(local) = to_process.pop() { - let deps = self.locals_dependencies.get(&local).unwrap(); - let assignment_locations = self.assignment_locations.get(&local).unwrap(); - let mut depends_on_argument = false; - deps.iter().for_each(|dep| { - if dep.is_mutable_arg { - args_to_clone.insert(dep.local); - depends_on_argument = true; - } else if (!dep.is_user_declared || dep.declared_within_old) - && !encountered.contains(&dep.local) +fn find_old_spans_and_args<'tcx>( + tcx: TyCtxt<'tcx>, + body: &mir::Body<'tcx>, + check_blocks: FxHashSet, +) -> (Vec, FxHashSet) { + struct OldSpanFinder<'tcx> { + tcx: TyCtxt<'tcx>, + old_spans: Vec, + old_args: FxHashSet, + check_blocks: FxHashSet, + } + // spans of old calls need to be resolved first, so we can determine + // whether locals are defined inside them later. + impl<'tcx> Visitor<'tcx> for OldSpanFinder<'tcx> { + fn visit_terminator( + &mut self, + terminator: &mir::Terminator<'tcx>, + location: mir::Location, + ) { + self.super_terminator(terminator, location); + if let mir::TerminatorKind::Call { + func, + args, + fn_span, + .. + } = &terminator.kind + { + if let Some((call_id, _)) = func.const_fn_def() { + let item_name = self.tcx.def_path_str(call_id); + if item_name == "prusti_contracts::old" + && self.check_blocks.contains(&location.block) { - // process this variable too! - to_process.push(dep.local); - encountered.insert(dep.local); + self.old_spans.push(*fn_span); + assert!(args.len() == 1); + if let mir::Operand::Copy(place) | mir::Operand::Move(place) = + args.get(0).unwrap() + { + self.old_args.insert(place.local); + } } - }); - if depends_on_argument { - // we potentially have to replace function arguments with cloned - // values in the places these locals are assigned to - assignment_locations.iter().for_each(|location| { - stmts_to_adjust.insert(*location); - }); } } } - (args_to_clone, stmts_to_adjust) - } - // determine all the relevant facts about this local - fn create_dependency(&self, local: mir::Local) -> Dependency { - let local_decl = self.local_decls.get(local); - - // is_user_variable leads to panics for certain variables.. - let is_user_declared = if let Some(local_decl) = local_decl { - matches!(local_decl.local_info.as_ref(), mir::ClearCrossCrate::Set(_)) - && local_decl.is_user_variable() - } else { - false - }; - // if a variable is not user declared this doesn't matter - let declared_within_old = is_user_declared - && self - .old_visitor - .old_spans - .iter() - .any(|old_span| old_span.contains(local_decl.unwrap().source_info.span)); - let is_mutable_arg = is_mutable_arg(&self.body, local, self.local_decls); - Dependency { - local, - is_user_declared, - declared_within_old, - is_mutable_arg, - } } + let mut finder = OldSpanFinder { + tcx, + old_spans: Default::default(), + old_args: Default::default(), + check_blocks, + }; + finder.visit_body(body); + (finder.old_spans, finder.old_args) } +/// Figure out which of the blocks of this body contain a closure marked with +/// #[check_only] or are dominated by such a block pub fn collect_check_blocks<'tcx>( tcx: TyCtxt<'tcx>, body: &mir::Body<'tcx>, -) -> FxHashMap { +) -> FxHashSet { let env_query = EnvQuery::new(tcx); - let mut marked_check_blocks = FxHashMap::default(); + let mut marked_check_blocks = FxHashSet::default(); for (bb, bb_data) in body.basic_blocks.iter_enumerated() { - if let Some(kind) = CheckBlockKind::determine_kind(env_query, bb_data) { - marked_check_blocks.insert(bb, kind); + if is_check_block(env_query, &bb_data) { + marked_check_blocks.insert(bb); } } // all the blocks that are dominated by one of these check blocks, are check // blocks of the same kind too. No two blocks should be dominated by // more than one block containing such a closure. let mut check_blocks = marked_check_blocks.clone(); - for (bb, bb_kind) in marked_check_blocks { + for bb in marked_check_blocks { let dominated_blocks = blocks_dominated_by(body, bb); for bb_dominated in dominated_blocks { if bb_dominated != bb { - assert!(check_blocks.get(&bb_dominated).is_none()); - check_blocks.insert(bb_dominated, bb_kind); + check_blocks.insert(bb_dominated); } } } check_blocks } -/// This function has the specific purpose of finding the local variable that -/// contains the result of a pledge when processing a pledge_expires annotation. -/// it's always assigned to a local variable directly after the empty closure -fn first_variable_assignment(bb_data: &mir::BasicBlockData) -> Option { +/// Goes through the statements of a block, and looks for a closure that is +/// annotated with #[check_only], marking the blocks that start a runtime +/// check for things like prusti_assert, prusti_assume, and loop_invariant +fn is_check_block(env_query: EnvQuery<'_>, bb_data: &mir::BasicBlockData) -> bool { for stmt in &bb_data.statements { - if let mir::StatementKind::Assign(box (_, mir::Rvalue::Use(mir::Operand::Move(place)))) = - stmt.kind - { - return Some(place.local); - } - } - None -} - -#[derive(Clone, Copy, Debug)] -pub enum CheckBlockKind { - /// comes from either assume, assert or bodyinvariant - RuntimeAssertion, - /// a manually annotated location by the user, where a pledge expires - /// containing the local that stores this pledge - PledgeExpires(mir::Local), -} - -impl CheckBlockKind { - pub fn determine_kind(env_query: EnvQuery<'_>, bb_data: &mir::BasicBlockData) -> Option { - for stmt in &bb_data.statements { - if let mir::StatementKind::Assign(box ( - _, - mir::Rvalue::Aggregate(box mir::AggregateKind::Closure(def_id, _), _), - )) = stmt.kind - { - if is_check_closure(env_query, def_id) { - let attrs = env_query.get_attributes(def_id); - if has_prusti_attr(attrs, "expiration_location") { - // there needs to be a single assignment - let pledge_target = first_variable_assignment(bb_data).unwrap(); - return Some(Self::PledgeExpires(pledge_target)); - } else if has_prusti_attr(attrs, "runtime_assertion") { - return Some(Self::RuntimeAssertion); - } - } - } - } - None - } -} - -struct RvalueVisitor { - pub dependencies: Vec, -} - -impl<'tcx> Visitor<'tcx> for RvalueVisitor { - fn visit_local( - &mut self, - local: mir::Local, - _context: mir::visit::PlaceContext, - _location: mir::Location, - ) { - self.dependencies.push(local); - } -} - -struct OldSpanFinder<'tcx> { - tcx: TyCtxt<'tcx>, - old_spans: Vec, - old_args: FxHashSet, -} - -// spans of old calls need to be resolved first, so we can determine -// whether locals are defined inside them later. -impl<'tcx> Visitor<'tcx> for OldSpanFinder<'tcx> { - fn visit_terminator(&mut self, terminator: &mir::Terminator<'tcx>, location: mir::Location) { - self.super_terminator(terminator, location); - if let mir::TerminatorKind::Call { - func, - args, - fn_span, - .. - } = &terminator.kind + if let mir::StatementKind::Assign(box ( + _, + mir::Rvalue::Aggregate(box mir::AggregateKind::Closure(def_id, _), _), + )) = stmt.kind { - if let Some((call_id, _)) = func.const_fn_def() { - let item_name = self.tcx.def_path_str(call_id); - if &item_name[..] == "prusti_contracts::old" { - self.old_spans.push(*fn_span); - assert!(args.len() == 1); - if let mir::Operand::Copy(place) | mir::Operand::Move(place) = - args.get(0).unwrap() - { - self.old_args.insert(place.local); - } - } + if is_check_closure(env_query, def_id) { + return true; } } } -} - -impl<'tcx> OldSpanFinder<'tcx> { - pub fn new(tcx: TyCtxt<'tcx>) -> Self { - OldSpanFinder { - old_spans: Default::default(), - old_args: Default::default(), - tcx, - } - } + false } diff --git a/prusti/src/modify_mir/mir_modifications.rs b/prusti/src/modify_mir/mir_modifications.rs index 22b04ecabbe..4b2cbb69f48 100644 --- a/prusti/src/modify_mir/mir_modifications.rs +++ b/prusti/src/modify_mir/mir_modifications.rs @@ -376,6 +376,16 @@ pub trait MirModifier<'tcx> { (current_target, last_block) } + /// Create a call block to the function with the given def_id. + /// + /// * `call_id`: DefId of the called function + /// * `args`: arguments passed to the function + /// * `generics`: generic arguments passed to the function + /// * `destination`: where the functions result should be stored. If None, a new + /// local will be created + /// * `target`: the basic block where function should jump to after returning + /// + /// returns (id of new basic block, destination) fn create_call_block( &self, call_id: DefId, @@ -396,7 +406,7 @@ pub trait MirModifier<'tcx> { // either use passed destination or create a new one let destination = destination.unwrap_or_else(|| { // find return type - let ret_ty = fn_return_ty(self.tcx(), call_id, Some(generics)); + let ret_ty = fn_signature(self.tcx(), call_id, Some(generics)).output(); mir::Place::from(self.patcher().new_temp(ret_ty, DUMMY_SP)) }); @@ -420,6 +430,7 @@ pub trait MirModifier<'tcx> { Ok((new_block_id, destination)) } + /// Create a statement that assigns a boolean to a given destination fn set_bool_stmt( &self, destination: mir::Place<'tcx>, diff --git a/prusti/src/modify_mir/mir_modify.rs b/prusti/src/modify_mir/mir_modify.rs index 40f046fb93b..9585818ba11 100644 --- a/prusti/src/modify_mir/mir_modify.rs +++ b/prusti/src/modify_mir/mir_modify.rs @@ -7,44 +7,46 @@ use prusti_rustc_interface::{ span::def_id::DefId, }; +/// Insert checks into the MIR pub(crate) fn insert_runtime_checks<'tcx>( body: &mut mir::Body<'tcx>, def_id: DefId, tcx: TyCtxt<'tcx>, local_decls: &IndexVec>, ) { - let mir_info = MirInfo::collect_mir_info(tcx, body.clone(), def_id, local_decls); - let attrs = tcx.get_attrs_unchecked(def_id); - let is_spec_fn = utils::has_spec_only_attr(attrs); - let def_kind = tcx.def_kind(def_id); - let is_anon_const = matches!(def_kind, DefKind::AnonConst); + if matches!(tcx.def_kind(def_id), DefKind::AnonConst) { + return; + } + let mir_info = MirInfo::collect_mir_info(tcx, body.clone(), def_id); // MAKE MODIFICATIONS: - // replace old arguments let mut old_arg_replacer = passes::CloneOldArgs::new(tcx, &mir_info, def_id, local_decls); // first we just create locals for old clones and replace them where arguments - // should be evaluated in an old state - old_arg_replacer.create_variables(body); + // should be evaluated in an old state. We need to do this early, because we rely + // on positions of assignments to variables to be accurate. We can not insert the + // cloning here too, because that would also offset locations for other passes + // that follow + old_arg_replacer.create_and_replace_variables(body); - // we dont insert pledge checks for specification functions - if !is_spec_fn && !is_anon_const { - // insert pledge checks: - passes::PledgeInserter::run(tcx, &mir_info, def_id, local_decls, body); - } + // insert pledge checks: + passes::PledgeInserter::run(tcx, &mir_info, def_id, local_decls, body); - // insert a dummy goto block at the beginning of the body + // insert a dummy goto block at the beginning of the body, so we can easily + // insert blocks at the beginning of the function prepend_dummy_block(body); // insert preconditions passes::PreconditionInserter::run(tcx, &mir_info, def_id, local_decls, body); // insert postconditions passes::PostconditionInserter::run(tcx, &mir_info, def_id, local_decls, body); + // insert cloning of arguments if they are used within old, and drop them again old_arg_replacer.clone_and_drop_variables(body); - // put specs and env back into globals + // store specs and env back into globals mir_info.store_specs_env(); } +/// Perform optimizations based on the verification results pub fn dead_code_elimination<'tcx>(tcx: TyCtxt<'tcx>, body: &mut mir::Body<'tcx>, def_id: DefId) { // no modifications to spec functions! let attrs = tcx.get_attrs_unchecked(def_id); diff --git a/prusti/src/modify_mir/passes/insert_pledge_checks.rs b/prusti/src/modify_mir/passes/insert_pledge_checks.rs index 1f8dd275904..0554d8a211e 100644 --- a/prusti/src/modify_mir/passes/insert_pledge_checks.rs +++ b/prusti/src/modify_mir/passes/insert_pledge_checks.rs @@ -1,8 +1,7 @@ +use super::super::{mir_info_collector::MirInfo, mir_modifications::MirModifier}; use crate::modify_mir::mir_helper::{ - dummy_source_info, get_block_target, get_successors, replace_target, + dummy_source_info, fn_signature, get_goto_block_target, get_successors, replace_call_target, }; - -use super::super::{mir_info_collector::MirInfo, mir_modifications::MirModifier}; use prusti_interface::{ environment::{borrowck::facts::Loan, polonius_info::PoloniusInfo, Procedure}, globals, @@ -58,8 +57,8 @@ impl ExpirationLocation { } } } -// we need to order them such that inserting checks will not offset other -// modifications +// we need to order them by descending block and statement index such that inserting +// checks will not offset the modifications that will be inserted later impl PartialOrd for ExpirationLocation { fn partial_cmp(&self, other: &Self) -> Option { Some(self.cmp(other)) @@ -125,31 +124,20 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { if self.pledges_to_process.is_empty() { return; } - // only try to get polonius info after we know that there are indeed - // pledges + // apply the patch generated during visitation + // this should only create new locals! + let patcher_ref = self.patch_opt.take().unwrap(); + patcher_ref.into_inner().apply(body); + let procedure = Procedure::new(&self.body_info.env, self.def_id); let polonius_info = if let Some(info) = globals::get_polonius_info(self.def_id) { info } else { // for trusted methods this might not have been constructed before - if let Ok(info) = - PoloniusInfo::new(&self.body_info.env, &procedure, &FxHashMap::default()) - { - info - } else { - // sometimes it seems to not be available for trusted methods. - // Example: runtime_checks tests, shape.rs - // I guess we don't just want to fail there, instead just don't - // insert pledges. - return; - } + PoloniusInfo::new(&self.body_info.env, &procedure, &FxHashMap::default()).unwrap() }; - // apply the patch generated during visitation - // this should only create new locals! - let patcher_ref = self.patch_opt.take().unwrap(); - patcher_ref.into_inner().apply(body); - // assumption: only one pledge associated with a loan. + // collect the loans that belong to some call with a pledge attached let pledge_loans: FxHashMap> = self .pledges_to_process .iter() @@ -184,6 +172,8 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { ); } } + // For switchInts, also look at the expirations of loans on edges, since + // in that case they can not be found when simply looking at the location if statement_index == nr_statements && matches!( body[bb].terminator.as_ref().unwrap().kind, @@ -217,7 +207,8 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { let (location, is_edge) = match modification_location { ExpirationLocation::Location(loc) => (*loc, false), ExpirationLocation::Edge(_, bb2) => { - // in this case we need to insert before the location + // in case of an edge, we will insert the check at index 0 + // of the block the edge points to ( mir::Location { block: *bb2, @@ -227,14 +218,9 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { ) } }; - let either = body.stmt_at(location); - if either.is_left() || is_edge { - println!( - "Inserting a pledge check at arbitrary position. Pledge: {:?}, location: {:?}", - pledge, location - ); - // it's just a statement: split the block - // these modifications are not possible with MirPatch! + let either_stmt_or_terminator = body.stmt_at(location); + if either_stmt_or_terminator.is_left() || is_edge { + // it's just a statement: split the block. let bb_data = &mut body.basic_blocks_mut()[location.block]; let nr_stmts = bb_data.statements.len(); let start_index = if !is_edge { @@ -244,30 +230,34 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { }; // in the case of edges this will drain all statements let after = bb_data.statements.drain(start_index..nr_stmts); - // create a new block: + // create a new block with the original block's terminator and all + // the statements following our location: let term = bb_data.terminator.clone(); let mut new_bb_data = mir::BasicBlockData::new(term); new_bb_data.statements = after.collect(); self.patch_opt = Some(MirPatch::new(body).into()); let new_block = self.patcher().new_block(new_bb_data); - // create the checks: + // create the check call chain that continues executing new_block once + // the checks are done: let (start_block, drop_insertion_block) = self.create_pledge_call_chain(&pledge, new_block).unwrap(); + // store the drop insertion block so we can later insert the required + // drops pledge.drop_blocks.push(drop_insertion_block); let new_terminator = mir::TerminatorKind::Goto { target: start_block, }; - // skip this check block and instead call checks-chain + // override the original terminator to point to our check-chain self.patcher() .patch_terminator(location.block, new_terminator); let patcher_ref = self.patch_opt.take().unwrap(); patcher_ref.into_inner().apply(body); } else { - let term = either.right().unwrap(); + // In this case, we want to insert our check after a terminator + let term = either_stmt_or_terminator.right().unwrap(); self.patch_opt = Some(MirPatch::new(body).into()); - println!("inserting pledge expiration for terminator: {:?}", term); match term.kind { mir::TerminatorKind::Call { target: Some(target), @@ -281,11 +271,13 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { pledge.drop_blocks.push(drop_insertion_block); let mut new_call_term = term.clone(); - replace_target(&mut new_call_term, start_block); + // After the call is finished, jump to our check-chain + replace_call_target(&mut new_call_term, start_block); self.patcher() .patch_terminator(location.block, new_call_term.kind); } _ => { + // Can pledges expire at other kinds of terminators? println!("Encountered a pledge expiring at terminator: {:#?}, expiring at location: {:?}", term, location); todo!() } @@ -303,13 +295,17 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { self.visit_body(body); let patcher_ref = self.patch_opt.take().unwrap(); patcher_ref.into_inner().apply(body); + // finally, drop the old values at each expiration check: + // We do this here, because cloning all the values when we traverse the MIR + // the first time, would offset locations. Only after cloning do we actually + // know which values will need to be dropped. self.patch_opt = Some(MirPatch::new(body).into()); for pledge in self.pledges_to_process.values() { for drop_block in pledge.drop_blocks.iter() { // get the target of the current drop block (always a goto, // exactly because we need to be able to append to it) - if let Some(target) = get_block_target(body, *drop_block) { + if let Some(target) = get_goto_block_target(body, *drop_block) { let (chain_start, _) = self.create_drop_chain( pledge.locals_to_drop.as_ref().unwrap().clone(), Some(target), @@ -317,6 +313,7 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { let new_terminator = mir::TerminatorKind::Goto { target: chain_start, }; + // make the drop block, which we created earlier point the the drop chain self.patcher().patch_terminator(*drop_block, new_terminator); } else { unreachable!(); @@ -328,6 +325,9 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { patcher_ref.into_inner().apply(body); } + /// This generates a BasicBlock that does the following: + /// If a pledge has been created, set it's corresponding guard to true, + /// such that subsequent checks at expiration locations will be performed pub fn set_guard_true_block( &self, destination: mir::Place<'tcx>, @@ -366,7 +366,6 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { .. } = &terminator.kind { - // is a visit of the underlying things even necesary? if let Some((call_id, generics)) = func.const_fn_def() { for check_kind in self.body_info.specs.get_runtime_checks(&call_id) { if let CheckKind::Pledge { @@ -375,13 +374,8 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { } = check_kind { if self.first_pass { - // TODO: pack that into a function, use correct param_env let name = self.tcx.def_path_debug_str(call_id); - let check_sig = self.tcx.fn_sig(check).instantiate(self.tcx, generics); - let check_sig = self.tcx.normalize_erasing_late_bound_regions( - ty::ParamEnv::reveal_all(), - check_sig, - ); + let check_sig = fn_signature(self.tcx, check, Some(generics)); let inputs = check_sig.inputs(); // look at the check function signature to determine // which values need cloning. diff --git a/prusti/src/modify_mir/passes/insert_postconditions.rs b/prusti/src/modify_mir/passes/insert_postconditions.rs index 3dfdb2c0c47..06469d3ac23 100644 --- a/prusti/src/modify_mir/passes/insert_postconditions.rs +++ b/prusti/src/modify_mir/passes/insert_postconditions.rs @@ -38,6 +38,14 @@ impl<'tcx, 'a> PostconditionInserter<'tcx, 'a> { patch_ref.into_inner().apply(body); } + /// Given a call, surround it with the following: + /// 1. cloning of all the old values that are required (before) + /// 2. performing the check function (after) + /// 3. dropping all the cloned values (after) + /// + /// this function returns: + /// * `result.0` the basic block where the original call is moved to + /// * `result.1` the basic block that calls the check function #[allow(clippy::too_many_arguments)] fn surround_call_with_store_and_check( &self, @@ -50,17 +58,14 @@ impl<'tcx, 'a> PostconditionInserter<'tcx, 'a> { original_terminator: mir::Terminator<'tcx>, ) -> (mir::BasicBlock, Option) { // find the type of that local - let check_sig = self.tcx.fn_sig(check_id).instantiate(self.tcx, generics); - let param_env = self.tcx.param_env(self.def_id); - let check_sig = self - .tcx - .normalize_erasing_late_bound_regions(param_env, check_sig); - + let check_sig = fn_signature(self.tcx, check_id, Some(generics)); + // old_ty is always the last input of postconditions let old_ty = *check_sig.inputs().last().unwrap(); assert!(matches!(old_ty.kind(), ty::Tuple(_))); let old_dest_place = mir::Place::from(self.patcher().new_temp(old_ty, DUMMY_SP)); + // create a drop-block, where we can later insert the drop chain. let drop_block_data = mir::BasicBlockData::new(Some(mir::Terminator { source_info: dummy_source_info(), kind: mir::TerminatorKind::Goto { @@ -68,13 +73,14 @@ impl<'tcx, 'a> PostconditionInserter<'tcx, 'a> { }, })); let drop_start = self.patcher().new_block(drop_block_data); + // construct arguments: first the arguments the function is called with, then the result of // that call, then the old values: let mut new_args = args.clone(); new_args.push(mir::Operand::Move(result_operand)); new_args.push(mir::Operand::Move(old_dest_place)); - // we store the target, create a new block per check function + // We store the target, create a new block per check function // chain these with the final call having the original target, // change the target of the call to the first block of our chain. let (check_block, _) = self @@ -86,15 +92,16 @@ impl<'tcx, 'a> PostconditionInserter<'tcx, 'a> { // for now we just construct it, this does not modify the terminator // in the CFG yet let mut call_terminator = original_terminator; - replace_target(&mut call_terminator, check_block); + replace_call_target(&mut call_terminator, check_block); + // create a chain of clone calls, that jumps to the original function + // call afterwards let (chain_start, new_caller, locals_to_drop) = self.prepend_old_cloning(call_terminator, old_dest_place, old_ty, args, true); - // TODO: create testcases for calls that have no target. - // Make sure they behave correctly in case of panic + // create the drop chain and append it to the block we created earlier + // for this purpose let (drop_chain_start, _) = self.create_drop_chain(locals_to_drop, target); - // make drop_start point to this chain: self.patcher().patch_terminator( drop_start, mir::TerminatorKind::Goto { @@ -103,8 +110,6 @@ impl<'tcx, 'a> PostconditionInserter<'tcx, 'a> { ); // make the original caller_block point to the first clone block - // after separate_terminator_from_block this is a goto so we don't break - // anything self.patcher().patch_terminator( caller_block, mir::TerminatorKind::Goto { @@ -136,7 +141,7 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PostconditionInserter<'tcx, 'a> { if let Some((call_id, generics)) = func.const_fn_def() { let mut caller_block = location.block; let mut current_target = *target; - let mut call_fn_terminator = terminator.clone(); + // get all the checks that need to be performed for check_id in self.body_info.specs.get_post_checks(&call_id) { (caller_block, current_target) = self.surround_call_with_store_and_check( check_id, @@ -147,7 +152,6 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PostconditionInserter<'tcx, 'a> { generics, terminator.clone(), ); - replace_target(&mut call_fn_terminator, current_target.unwrap()); } } } diff --git a/prusti/src/modify_mir/passes/insert_precondition_checks.rs b/prusti/src/modify_mir/passes/insert_precondition_checks.rs index 6551b41715b..ddc43c9c6aa 100644 --- a/prusti/src/modify_mir/passes/insert_precondition_checks.rs +++ b/prusti/src/modify_mir/passes/insert_precondition_checks.rs @@ -11,7 +11,6 @@ use std::cell::{RefCell, RefMut}; /// This pass inserts precondition checks at the beginning of the /// body, and also in front of each function that is called -/// (in case they have them) pub struct PreconditionInserter<'tcx, 'a> { tcx: TyCtxt<'tcx>, body_info: &'a MirInfo<'tcx>, @@ -34,7 +33,7 @@ impl<'tcx, 'a> PreconditionInserter<'tcx, 'a> { let mut inserter = Self { tcx, body_info, - patch_opt: None, + patch_opt: Some(MirPatch::new(body).into()), def_id, local_decls, }; @@ -42,18 +41,17 @@ impl<'tcx, 'a> PreconditionInserter<'tcx, 'a> { } fn modify(&mut self, body: &mut mir::Body<'tcx>) { - let mut current_target = get_block_target(body, mir::START_BLOCK) + let mut current_target = get_goto_block_target(body, mir::START_BLOCK) .expect("Bug: Body must start with a Goto block at this stage"); - let patch = MirPatch::new(body); - self.patch_opt = Some(patch.into()); let generics = ty::GenericArgs::identity_for_item(self.tcx, self.body_info.def_id); + // 1. check the preconditions of the current body let args = args_from_body(body); for check_id in self.body_info.specs.get_pre_checks(&self.body_info.def_id) { (current_target, _) = self .create_call_block(check_id, args.clone(), generics, None, Some(current_target)) .unwrap(); } - // make the starting block (which should already be a dummy) + // make the starting block (which is already be a dummy goto block) // point to the first precondition check self.patcher().patch_terminator( mir::START_BLOCK, @@ -66,6 +64,7 @@ impl<'tcx, 'a> PreconditionInserter<'tcx, 'a> { patch_ref.into_inner().apply(body); // new patch for other modifications: self.patch_opt = Some(RefCell::new(MirPatch::new(body))); + // Visit the body for calls where we also check their preconditions self.visit_body(body); let patch_ref = self.patch_opt.take().unwrap(); patch_ref.into_inner().apply(body); @@ -90,11 +89,13 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PreconditionInserter<'tcx, 'a> { let mut caller_block = location.block; let _current_target = target; if call_id.is_local() { - // If the call is local, we modify its body anyways + // If the call is local, we can be sure that when the mir of + // this function is processed, the precondition check will be inserted + // anyways. No reason to check it twice. return; } for check_id in self.body_info.specs.get_pre_checks(&call_id) { - let return_ty = fn_return_ty(self.tcx, check_id, Some(generics)); + let return_ty = fn_signature(self.tcx, check_id, Some(generics)).output(); assert!(return_ty.is_unit()); let res = self.patcher().new_temp(return_ty, DUMMY_SP); caller_block = self.prepend_call( diff --git a/prusti/src/modify_mir/passes/remove_dead_code.rs b/prusti/src/modify_mir/passes/remove_dead_code.rs index 892d5cc8259..3b22253e8d1 100644 --- a/prusti/src/modify_mir/passes/remove_dead_code.rs +++ b/prusti/src/modify_mir/passes/remove_dead_code.rs @@ -45,12 +45,16 @@ impl<'tcx> DeadCodeElimination<'tcx> { if modifier.unreachable_blocks.is_empty() { return; } + // this visit will remove all edges from Goto blocks to unreachable targets. + // Later this will lead to the compiler eliminating these blocks. modifier.visit_body(body); } fn remove_assertions(&self, body: &mut mir::Body<'tcx>) { let mut locals_to_replace: Vec<(mir::Local, ty::Ty<'tcx>)> = Default::default(); for block in self.removable_assertions.iter() { + // take the existing terminator, which has to be an assert or something + // went very wrong. let terminator = body.basic_blocks_mut()[*block].terminator.take().unwrap(); if let mir::TerminatorKind::Assert { cond, @@ -67,7 +71,8 @@ impl<'tcx> DeadCodeElimination<'tcx> { // If generated by a checkedAdd or similar, this will be // a tuple with 1 projection. if place.projection.len() == 1 { - // figure out the type of the first field: + // figure out the type of the first field (the one that + // contains the actual value): let base_place: mir::Place<'tcx> = place.local.into(); let ty = base_place.ty(&body.local_decls, self.tcx).ty; let res_type = if let ty::TyKind::Tuple(typelist) = ty.kind() { @@ -79,23 +84,30 @@ impl<'tcx> DeadCodeElimination<'tcx> { } } - // make the terminator a goto + // change the terminator to a goto let new_term = mir::Terminator { source_info: dummy_source_info(), kind: mir::TerminatorKind::Goto { target }, }; body.basic_blocks_mut()[*block].terminator = Some(new_term); } else { + // this only happens if our locations are inaccurate, which is + // hopefully never if we order our modifications correctly unreachable!("Somehow mir must have been modified in a bad way between verification and here"); } } let mut patcher = MirPatch::new(body); + // now we can replace the checked operations with unchecked ones, and if + // let's say _x = CheckedAdd() is replaced with _y = Add(), we have to replace + // every occurrence of _x.0 with _y + // 1. create the new locals with the previously derived types let replacements: FxHashMap = locals_to_replace .into_iter() .map(|(local, ty)| (local, patcher.new_temp(ty, DUMMY_SP))) .collect(); patcher.apply(body); + // replace the operations and occurrences of locals let mut op_replacer = OperationReplacer { tcx: self.tcx, replacements, @@ -193,14 +205,9 @@ impl<'tcx> MutVisitor<'tcx> for OperationReplacer<'tcx> { _location: mir::Location, ) { if let Some(replacing_local) = self.replacements.get(&place.local) { - // make sure this is an access to _x.0, all others should not - // exist anymore at this point - assert!(place.projection.len() == 1); - if let mir::ProjectionElem::Field(id, _) = place.projection.first().unwrap() { - if id.index() == 0 { - // replace the local - *place = mir::Place::from(*replacing_local); - } + // if this is an access to _local.0, replace it + if let mir::ProjectionElem::Field(id, _) = place.projection.first().unwrap() && id.index() == 0 { + *place = mir::Place::from(*replacing_local); } } } diff --git a/prusti/src/modify_mir/passes/replace_old_args.rs b/prusti/src/modify_mir/passes/replace_old_args.rs index 3cc67ffc9b6..a2c2ab93b1b 100644 --- a/prusti/src/modify_mir/passes/replace_old_args.rs +++ b/prusti/src/modify_mir/passes/replace_old_args.rs @@ -37,15 +37,21 @@ impl<'tcx, 'a> CloneOldArgs<'tcx, 'a> { } } - // Creates locals for the clones of arguments, and replaces them in - // the correct places such that old behaves correctly - pub fn create_variables(&mut self, body: &mut mir::Body<'tcx>) { + /// Creates locals for the clones of arguments, and replaces them in + /// the correct places such that old behaves correctly. This function + /// relies on the locations in `stmts_to_substitue_rhs` to be accurate, so it + /// needs to be executed before any of the modifications that alter block indeces + /// happen. It does not modify any block indeces itself. + pub fn create_and_replace_variables(&mut self, body: &mut mir::Body<'tcx>) { let mut patcher = MirPatch::new(body); + // create the temporary variables for arg in &self.body_info.args_to_be_cloned { let ty = self.local_decls.get(*arg).unwrap().ty; let new_var = patcher.new_temp(ty, DUMMY_SP); self.stored_arguments.insert(*arg, new_var); } + // replace the function arguments with the new temporary variables + // according to information we collected earlier let mut replacer = ArgumentReplacer::new(self.tcx, &self.stored_arguments); for (block, bb_data) in body.basic_blocks_mut().iter_enumerated_mut() { for (statement_index, stmt) in bb_data.statements.iter_mut().enumerate() { @@ -61,12 +67,16 @@ impl<'tcx, 'a> CloneOldArgs<'tcx, 'a> { patcher.apply(body); } + /// For variables that need to be cloned at the beginning of a function + /// (opposed to in front of a function call as for postconditions for example) + /// this function inserts a chain of clone calls at the beginning of the function + /// and makes sure these values are dropped again before the function returns. pub fn clone_and_drop_variables(&mut self, body: &mut mir::Body<'tcx>) { let patch = MirPatch::new(body); self.patch_opt = Some(patch.into()); let mut drop_on_return = Vec::new(); // clone the arguments: - let mut current_target = get_block_target(body, mir::START_BLOCK) + let mut current_target = get_goto_block_target(body, mir::START_BLOCK) .expect("Bug: Body must start with a Goto block at this stage"); for local in self.body_info.args_to_be_cloned.iter() { let place: mir::Place = (*local).into(); @@ -90,7 +100,7 @@ impl<'tcx, 'a> CloneOldArgs<'tcx, 'a> { let patch_ref = self.patch_opt.take().unwrap(); patch_ref.into_inner().apply(body); - // create drop chain: + // insert jumps to drop chain wherever function returns: let mut visitor = DropBeforeReturnVisitor { drop_chain_start, drop_chain_end, @@ -135,10 +145,11 @@ impl<'tcx> MutVisitor<'tcx> for DropBeforeReturnVisitor<'tcx> { ) { MutVisitor::super_terminator(self, terminator, location); if location.block == self.drop_chain_end { - // The end of the drop chain should not be modified, - // otherwise we introduce a cycle + // The end of the drop chain also contains a return, so we need + // to skip this one return; } + // Replace return terminator with a goto to our drop chain if matches!(terminator.kind, mir::TerminatorKind::Return) { terminator.kind = mir::TerminatorKind::Goto { target: self.drop_chain_start, From bd3b3dd4358a8b6cff8a76fd3f0b222c4b8606f6 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Wed, 13 Sep 2023 00:21:14 +0200 Subject: [PATCH 40/45] Add runtime checks for predicates --- .../src/expression_with_attributes.rs | 25 ++++-- prusti-contracts/prusti-specs/src/lib.rs | 6 +- .../prusti-specs/src/predicate.rs | 70 +++++++++++---- .../associated_function_info.rs | 4 +- .../src/runtime_checks/boundary_extraction.rs | 2 +- .../src/runtime_checks/check_type.rs | 5 +- .../src/runtime_checks/translation.rs | 50 ++++++++++- prusti-interface/src/specs/mod.rs | 8 +- prusti-interface/src/specs/typed.rs | 18 ++++ prusti/src/modify_mir/mir_info_collector.rs | 27 +++--- prusti/src/modify_mir/mir_modify.rs | 2 + prusti/src/modify_mir/passes/mod.rs | 12 +-- .../modify_mir/passes/replace_predicates.rs | 89 +++++++++++++++++++ 13 files changed, 268 insertions(+), 50 deletions(-) create mode 100644 prusti/src/modify_mir/passes/replace_predicates.rs diff --git a/prusti-contracts/prusti-specs/src/expression_with_attributes.rs b/prusti-contracts/prusti-specs/src/expression_with_attributes.rs index 228656d72b5..5df36c78527 100644 --- a/prusti-contracts/prusti-specs/src/expression_with_attributes.rs +++ b/prusti-contracts/prusti-specs/src/expression_with_attributes.rs @@ -8,12 +8,12 @@ use syn::parse::{Parse, ParseStream}; // prusti_assert!() or similar. // In particular, we want to allow: // `prusti_assert!(#[insert_runtime_check] expr); -pub(crate) struct ExpressionWithAttributes { +pub(crate) struct AttributeConsumer { pub attributes: Vec, pub rest: TokenStream, } -impl Parse for ExpressionWithAttributes { +impl Parse for AttributeConsumer { fn parse(input: ParseStream) -> syn::Result { let attributes = input.call(syn::Attribute::parse_outer)?; let rest: TokenStream = input.parse().unwrap(); @@ -22,11 +22,11 @@ impl Parse for ExpressionWithAttributes { } // maybe we can make this more generic so it can be used in other places.. -impl ExpressionWithAttributes { - pub fn remove_runtime_checks_attr(&mut self) -> Option { +impl AttributeConsumer { + pub fn get_attribute(&mut self, name: &str) -> Option { if let Some(pos) = self.attributes.iter().position(|attr| { if let Some(ident) = attr.path.get_ident() { - if &ident.to_string() == "insert_runtime_check" { + if *ident == name { return true; } } @@ -38,9 +38,22 @@ impl ExpressionWithAttributes { } } + // /// A function that can be used to check that all attributes have been + // /// consumed. Returns an error with the span of the first remaining attribute + // pub fn check_no_remaining_attrs(&self) -> syn::Result<()> { + // if let Some(attr) = self.attributes.first() { + // Err(syn::Error::new( + // attr.span(), + // "This attribute could not be processed and probably doesn't belong here", + // )) + // } else { + // Ok(()) + // } + // } + pub fn tokens(self) -> TokenStream { let Self { attributes, rest } = self; - let mut attrs: TokenStream = attributes.into_iter().map(|attr| attr.tokens).collect(); + let mut attrs: TokenStream = attributes.into_iter().map(|attr| quote!(#attr)).collect(); attrs.extend(quote!(#rest)); attrs } diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index 4b76935b2da..8c8a5f512b9 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -26,7 +26,7 @@ mod print_counterexample; mod runtime_checks; mod expression_with_attributes; -use expression_with_attributes::ExpressionWithAttributes; +use expression_with_attributes::AttributeConsumer; use proc_macro2::{Span, TokenStream, TokenTree}; use quote::{quote, quote_spanned, ToTokens}; use rewriter::AstRewriter; @@ -597,8 +597,8 @@ fn generate_expression_closure( tokens: TokenStream, check_type: CheckItemType, ) -> TokenStream { - let mut expr_with_attrs: ExpressionWithAttributes = handle_result!(syn::parse(tokens.into())); - let runtime_attr = expr_with_attrs.remove_runtime_checks_attr(); + let mut expr_with_attrs: AttributeConsumer = handle_result!(syn::parse(tokens.into())); + let runtime_attr = expr_with_attrs.get_attribute("insert_runtime_check"); let tokens = expr_with_attrs.tokens(); let prusti_tokens = handle_result!(parse_prusti(tokens)); let mut rewriter = rewriter::AstRewriter::new(); diff --git a/prusti-contracts/prusti-specs/src/predicate.rs b/prusti-contracts/prusti-specs/src/predicate.rs index 9469215e312..cf394d6c240 100644 --- a/prusti-contracts/prusti-specs/src/predicate.rs +++ b/prusti-contracts/prusti-specs/src/predicate.rs @@ -2,7 +2,11 @@ use crate::{ common::{HasMacro, HasSignature}, - rewriter, SpecificationId, SPECS_VERSION, + expression_with_attributes::AttributeConsumer, + rewriter, + runtime_checks::translation::translate_predicate, + specifications::preparser::parse_prusti, + SpecificationId, SPECS_VERSION, }; use proc_macro2::{Span, TokenStream}; use quote::{quote_spanned, ToTokens}; @@ -14,12 +18,14 @@ pub struct PredicateWithBody { /// The body of the function is replaced (`unimplemented!()`) pub patched_function: T, pub spec_function: syn::Item, + pub check_function: Option, } impl ToTokens for PredicateWithBody { fn to_tokens(&self, tokens: &mut TokenStream) { self.spec_function.to_tokens(tokens); self.patched_function.to_tokens(tokens); + self.check_function.to_tokens(tokens); } } @@ -81,6 +87,12 @@ fn parse_predicate_internal( in_spec_refinement: bool, ) -> syn::Result { let span = tokens.span(); + let mut attr_consumer: AttributeConsumer = syn::parse(tokens.into())?; + let runtime_checkable = attr_consumer + .get_attribute("insert_runtime_check") + .is_some(); + // attr_consumer.check_no_remaining_attrs()?; + let tokens = attr_consumer.tokens(); let input: PredicateFnInput = syn::parse2(tokens).map_err(|e| { syn::Error::new( e.span(), @@ -100,36 +112,58 @@ fn parse_predicate_internal( if input.body.is_some() { let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); + let check_id_opt = runtime_checkable.then_some(rewriter.generate_spec_id()); if in_spec_refinement { let patched_function: syn::ImplItemMethod = - patch_predicate_macro_body(&input, span, spec_id); - let spec_function = generate_spec_function( - input.body.unwrap(), - return_type, - spec_id, - &patched_function, - )?; + patch_predicate_macro_body(&input, span, spec_id, check_id_opt); + let body = input.body.unwrap(); + let spec_function = + generate_spec_function(body.clone(), return_type, spec_id, &patched_function)?; + let check_function = if runtime_checkable { + Some(translate_predicate( + check_id_opt.unwrap(), + parse_prusti(body)?, + &patched_function, + )?) + } else { + None + }; Ok(ParsedPredicate::Impl(PredicateWithBody { spec_function, patched_function, + check_function, })) } else { - let patched_function: syn::ItemFn = patch_predicate_macro_body(&input, span, spec_id); - let spec_function = generate_spec_function( - input.body.unwrap(), - return_type, - spec_id, - &patched_function, - )?; + let patched_function: syn::ItemFn = + patch_predicate_macro_body(&input, span, spec_id, check_id_opt); + let body = input.body.unwrap(); + let spec_function = + generate_spec_function(body.clone(), return_type, spec_id, &patched_function)?; + let check_function = if runtime_checkable { + Some(translate_predicate( + check_id_opt.unwrap(), + parse_prusti(body)?, + &patched_function, + )?) + } else { + None + }; Ok(ParsedPredicate::FreeStanding(PredicateWithBody { spec_function, patched_function, + check_function, })) } } else { + if runtime_checkable { + return Err(syn::Error::new( + span, + "Abstract predicates can not be runtime checked", + )); + } let signature = input.fn_sig; let patched_function = parse_quote_spanned!(span=> #[prusti::abstract_predicate] @@ -147,14 +181,20 @@ fn patch_predicate_macro_body( predicate: &PredicateFnInput, input_span: Span, spec_id: SpecificationId, + check_id_opt: Option, ) -> R { let visibility = &predicate.visibility; let signature = &predicate.fn_sig; let spec_id_str = spec_id.to_string(); + let check_ref_attr = check_id_opt.map(|id| { + let check_id_str = id.to_string(); + quote_spanned!(input_span => #[prusti::pred_check_id_ref = #check_id_str]) + }); parse_quote_spanned!(input_span=> #[allow(unused_must_use, unused_variables, dead_code)] #[prusti::pred_spec_id_ref = #spec_id_str] + #check_ref_attr #[prusti::specs_version = #SPECS_VERSION] #visibility #signature { unimplemented!("predicate") diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs b/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs index d6ed364c53c..ab351c2f1e4 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs @@ -1,4 +1,4 @@ -use crate::{common::HasSignature, specifications::untyped}; +use crate::common::HasSignature; use proc_macro2::Span; use rustc_hash::FxHashMap; use syn::{parse_quote_spanned, spanned::Spanned}; @@ -18,7 +18,7 @@ impl AssociatedFunctionInfo { } } - pub(crate) fn new(item: &untyped::AnyFnItem) -> syn::Result { + pub(crate) fn new(item: &T) -> syn::Result { let inputs: FxHashMap = item .sig() .inputs diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs index 44b3caeb751..89b35b446b7 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs @@ -233,7 +233,7 @@ impl BoundExtractor { BinOp::Lt(_) | BinOp::Le(_) | BinOp::Gt(_) | BinOp::Ge(_) => { // one of the two operators have to include "name" if this is // is a boundary: - let variables = self.find_identifiers(&expr); + let variables = self.find_identifiers(expr); if variables.contains(name) { // might be a bound for our current variable // transform it such that left is exactly x, diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs b/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs index f628d6fe281..8fc5e8efef9 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/check_type.rs @@ -7,6 +7,7 @@ pub(crate) enum CheckItemType { Assert, Assume, BodyInvariant, + Predicate, Unchecked, } @@ -34,7 +35,7 @@ impl CheckItemType { // maybe pledge_rhs should not get items either matches!( self, - Self::PledgeRhs { .. } | Self::Requires | Self::Ensures + Self::PledgeRhs { .. } | Self::Requires | Self::Ensures | Self::Predicate ) } @@ -61,6 +62,7 @@ impl CheckItemType { Self::Assert => format!("prusti_assert!({})", s), Self::Assume => format!("prusti_assume!({})", s), Self::BodyInvariant => format!("body_invariant!({})", s), + Self::Predicate => format!("predicate!{{ {} }}", s), Self::Unchecked => unreachable!(), } } @@ -82,6 +84,7 @@ impl std::fmt::Display for CheckItemType { Self::Assert => write!(f, "assert"), Self::Assume => write!(f, "assume"), Self::BodyInvariant => write!(f, "body_invariant"), + Self::Predicate => write!(f, "predicate"), Self::Unchecked => unreachable!(), } } diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 5357dbfae80..2ed4fe594d1 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -30,7 +30,6 @@ pub(crate) fn translate_runtime_checks( // get signature information about the associated function let function_info = AssociatedFunctionInfo::new(item)?; let mut visitor = CheckVisitor::new(function_info, check_type); - // let check_translator = CheckTranslator::new(item, expr, lhs, check_type.clone()); // make the expression checkable at runtime: let mut expr: syn::Expr = syn::parse2(tokens.clone())?; @@ -91,6 +90,7 @@ pub(crate) fn translate_runtime_checks( let mut check_item: syn::ItemFn = parse_quote_spanned! {item.span() => #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case, forgetting_copy_types)] #[prusti::spec_only] + #[prusti::check_only] #id_attr fn #item_name() { #debug_print_stmt @@ -174,8 +174,52 @@ pub(crate) fn translate_expression_runtime( }) } -pub(crate) fn generate_forget_statements( - item: &untyped::AnyFnItem, +pub(crate) fn translate_predicate( + check_id: SpecificationId, + body: TokenStream, + item: &T, +) -> syn::Result { + let check_type = CheckItemType::Predicate; + let span = body.span(); + // get signature information about the associated function + let function_info = AssociatedFunctionInfo::empty(); + let mut visitor = CheckVisitor::new(function_info, check_type); + + // make the expression checkable at runtime: + let mut expr: syn::Expr = syn::parse2(body.clone())?; + visitor.visit_expr_mut(&mut expr); + + let item_name = syn::Ident::new( + &format!( + "prusti_{}_check_item_{}_{}", + check_type, + item.sig().ident, + check_id + ), + span, + ); + let check_id_str = check_id.to_string(); + let forget_statements = generate_forget_statements(item, check_type, span); + + let mut check_item: syn::ItemFn = parse_quote_spanned! {item.span() => + #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case, forgetting_copy_types)] + #[prusti::spec_only] + #[prusti::check_only] + #[prusti::check_id = #check_id_str] + fn #item_name() { + let prusti_predicate_result = #expr; + #forget_statements + prusti_predicate_result + } + }; + check_item.sig.generics = item.sig().generics.clone(); + check_item.sig.inputs = item.sig().inputs.clone(); + check_item.sig.output = item.sig().output.clone(); + Ok(syn::Item::Fn(check_item)) +} + +pub(crate) fn generate_forget_statements( + item: &T, check_type: CheckItemType, span: Span, ) -> syn::Block { diff --git a/prusti-interface/src/specs/mod.rs b/prusti-interface/src/specs/mod.rs index c5feb147f70..69c053fa92d 100644 --- a/prusti-interface/src/specs/mod.rs +++ b/prusti-interface/src/specs/mod.rs @@ -170,7 +170,10 @@ impl<'a, 'tcx> SpecCollector<'a, 'tcx> { check_before_expiry, } } - // Todo: Pledges, Assume? + SpecIdRef::Predicate(id) => { + let fn_id = self.check_functions.get(id).unwrap(); + typed::CheckKind::Predicate(fn_id.to_def_id()) + } _ => unreachable!(), }; function_checks.push(kind); @@ -524,6 +527,9 @@ fn get_procedure_check_ids(def_id: DefId, attrs: &[ast::Attribute]) -> Vec, }, + Predicate(DefId), } impl DefSpecificationMap { @@ -115,6 +116,23 @@ impl DefSpecificationMap { } } + pub fn get_predicate_check(&self, def_id: &DefId) -> Option { + let mut check: Vec = self + .checks + .get(def_id)? + .iter() + .filter_map(|el| { + if let CheckKind::Predicate(def_id) = el { + Some(*def_id) + } else { + None + } + }) + .collect(); + assert!(check.len() <= 1); + check.pop() + } + pub(crate) fn defid_for_export( &self, ) -> ( diff --git a/prusti/src/modify_mir/mir_info_collector.rs b/prusti/src/modify_mir/mir_info_collector.rs index a3f708b0d32..91357747c8a 100644 --- a/prusti/src/modify_mir/mir_info_collector.rs +++ b/prusti/src/modify_mir/mir_info_collector.rs @@ -28,25 +28,30 @@ pub struct MirInfo<'tcx> { /// statements in which we should replace the occurrence of a function /// argument with their clone pub stmts_to_substitute_rhs: FxHashSet, + /// the basic blocks that are marked with #[check_only] or dominated by a + /// block that is + pub check_blocks: FxHashSet, } impl<'tcx> MirInfo<'tcx> { /// Given a body, collect information about it. - pub fn collect_mir_info<'a>( + pub fn collect_mir_info( tcx: TyCtxt<'tcx>, body: mir::Body<'tcx>, def_id: DefId, ) -> MirInfo<'tcx> { let specs = globals::get_defspec(); let env = globals::get_env(); + let check_blocks = collect_check_blocks(tcx, &body); let (args_to_be_cloned, stmts_to_substitute_rhs) = - determine_modifications_old_resolution(tcx, body); + determine_modifications_old_resolution(tcx, body, &check_blocks); MirInfo { def_id, specs, env, args_to_be_cloned, stmts_to_substitute_rhs, + check_blocks, } } // when MirInfo is no longer required, put specs and env back into global statics @@ -62,10 +67,9 @@ impl<'tcx> MirInfo<'tcx> { fn determine_modifications_old_resolution<'tcx>( tcx: TyCtxt<'tcx>, body: mir::Body<'tcx>, + check_blocks: &FxHashSet, ) -> (FxHashSet, FxHashSet) { - // TODO cedihegi: if check blocks are really not needed elsewhere, move their computation into // find_old_spans.. - let check_blocks = collect_check_blocks(tcx, &body); let (old_spans, old_args) = find_old_spans_and_args(tcx, &body, check_blocks); let mut args_to_clone = FxHashSet::::default(); @@ -217,10 +221,7 @@ impl<'tcx> Visitor<'tcx> for DependencyCollector<'tcx> { } } -fn rvalue_dependencies<'tcx>( - rvalue: &mir::Rvalue<'tcx>, - location: mir::Location, -) -> Vec { +fn rvalue_dependencies(rvalue: &mir::Rvalue<'_>, location: mir::Location) -> Vec { struct RvalueVisitor { pub dependencies: Vec, } @@ -244,17 +245,17 @@ fn rvalue_dependencies<'tcx>( fn find_old_spans_and_args<'tcx>( tcx: TyCtxt<'tcx>, body: &mir::Body<'tcx>, - check_blocks: FxHashSet, + check_blocks: &FxHashSet, ) -> (Vec, FxHashSet) { - struct OldSpanFinder<'tcx> { + struct OldSpanFinder<'tcx, 'a> { tcx: TyCtxt<'tcx>, old_spans: Vec, old_args: FxHashSet, - check_blocks: FxHashSet, + check_blocks: &'a FxHashSet, } // spans of old calls need to be resolved first, so we can determine // whether locals are defined inside them later. - impl<'tcx> Visitor<'tcx> for OldSpanFinder<'tcx> { + impl<'tcx, 'a> Visitor<'tcx> for OldSpanFinder<'tcx, 'a> { fn visit_terminator( &mut self, terminator: &mir::Terminator<'tcx>, @@ -304,7 +305,7 @@ pub fn collect_check_blocks<'tcx>( let env_query = EnvQuery::new(tcx); let mut marked_check_blocks = FxHashSet::default(); for (bb, bb_data) in body.basic_blocks.iter_enumerated() { - if is_check_block(env_query, &bb_data) { + if is_check_block(env_query, bb_data) { marked_check_blocks.insert(bb); } } diff --git a/prusti/src/modify_mir/mir_modify.rs b/prusti/src/modify_mir/mir_modify.rs index 9585818ba11..170ca2cedfe 100644 --- a/prusti/src/modify_mir/mir_modify.rs +++ b/prusti/src/modify_mir/mir_modify.rs @@ -38,6 +38,8 @@ pub(crate) fn insert_runtime_checks<'tcx>( passes::PreconditionInserter::run(tcx, &mir_info, def_id, local_decls, body); // insert postconditions passes::PostconditionInserter::run(tcx, &mir_info, def_id, local_decls, body); + // replace predicates with their check functions: + passes::PredicateReplacer::run(tcx, &mir_info, def_id, body); // insert cloning of arguments if they are used within old, and drop them again old_arg_replacer.clone_and_drop_variables(body); diff --git a/prusti/src/modify_mir/passes/mod.rs b/prusti/src/modify_mir/passes/mod.rs index 6fa85aee259..4d8f941d53d 100644 --- a/prusti/src/modify_mir/passes/mod.rs +++ b/prusti/src/modify_mir/passes/mod.rs @@ -3,9 +3,11 @@ mod insert_pledge_checks; mod insert_postconditions; mod replace_old_args; mod remove_dead_code; +mod replace_predicates; -pub use insert_pledge_checks::{PledgeInserter, PledgeToProcess}; -pub use insert_postconditions::PostconditionInserter; -pub use insert_precondition_checks::PreconditionInserter; -pub use remove_dead_code::DeadCodeElimination; -pub use replace_old_args::CloneOldArgs; +pub(crate) use insert_pledge_checks::{PledgeInserter, PledgeToProcess}; +pub(crate) use insert_postconditions::PostconditionInserter; +pub(crate) use insert_precondition_checks::PreconditionInserter; +pub(crate) use remove_dead_code::DeadCodeElimination; +pub(crate) use replace_old_args::CloneOldArgs; +pub(crate) use replace_predicates::PredicateReplacer; diff --git a/prusti/src/modify_mir/passes/replace_predicates.rs b/prusti/src/modify_mir/passes/replace_predicates.rs new file mode 100644 index 00000000000..40a1c7693a0 --- /dev/null +++ b/prusti/src/modify_mir/passes/replace_predicates.rs @@ -0,0 +1,89 @@ +use crate::modify_mir::mir_info_collector::MirInfo; +use prusti_interface::{environment::EnvQuery, utils}; +use prusti_rustc_interface::{ + middle::{ + mir::{self, visit::MutVisitor}, + ty::{self, TyCtxt}, + }, + span::{def_id::DefId, DUMMY_SP}, +}; + +pub(crate) struct PredicateReplacer<'tcx, 'a> { + tcx: TyCtxt<'tcx>, + env_query: EnvQuery<'tcx>, + body_info: &'a MirInfo<'tcx>, + is_check_fn: bool, +} + +impl<'tcx, 'a> PredicateReplacer<'tcx, 'a> { + /// If any check function calls a predicate, we want to replace it with + /// a call to the check function that is generated for that predicate + pub(crate) fn run( + tcx: TyCtxt<'tcx>, + body_info: &'a MirInfo<'tcx>, + def_id: DefId, + body: &mut mir::Body<'tcx>, + ) { + println!("replacing predicates in function: {:?}", def_id); + // 1. figure out if this itself is a check function: + let env_query = EnvQuery::new(tcx); + let is_check_fn = utils::has_check_only_attr(env_query.get_attributes(def_id)); + println!("is check function: {}", is_check_fn); + let mut replacer = Self { + tcx, + env_query, + body_info, + is_check_fn, + }; + replacer.visit_body(body); + } +} + +impl<'tcx, 'a> MutVisitor<'tcx> for PredicateReplacer<'tcx, 'a> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + + fn visit_terminator( + &mut self, + terminator: &mut mir::Terminator<'tcx>, + location: mir::Location, + ) { + if let mir::TerminatorKind::Call { func, .. } = &mut terminator.kind { + if !self.is_check_fn && !self.body_info.check_blocks.contains(&location.block) { + // If predciates are called outside of check blocks or functions, this is none + // of our business here. This might be inside a spec function (which is legal) + // or in the worse case, in normal user code, but this doesnt need to + // be handled here. + return; + } + if let Some((call_id, generics)) = func.const_fn_def() { + // check if the called function is a predicate, and also if it has + let attrs = self.env_query.get_attributes(call_id); + println!("handling call to {:?}", call_id); + if !utils::has_prusti_attr(attrs, "pred_spec_id_ref") { + // not a predicate, nothing to be done + return; + } + println!("Call {:?} is being replaced", call_id); + if let Some(check_id) = self.body_info.specs.get_predicate_check(&call_id) { + let func_ty = self + .tcx + .mk_ty_from_kind(ty::TyKind::FnDef(check_id, generics)); + let check_func = mir::Operand::Constant(Box::new(mir::Constant { + span: DUMMY_SP, + user_ty: None, + literal: mir::ConstantKind::zero_sized(func_ty), + })); + // replace the call to the predicate with the call to the + // runtime checked predicate + *func = check_func; + } else { + // if we don't panic here, this will lead to a panic at runtime + // stating that the predicate has no body. Better? + panic!("Tried to execute a predicate in a runtime check, but for predicates to be exeuctable they need to be marked with #[insert_runtime_check]"); + } + } + } + } +} From 5c05f2e639b2fe7860f0ee9ecf95bb94254fba3c Mon Sep 17 00:00:00 2001 From: cedihegi Date: Wed, 13 Sep 2023 10:42:59 +0200 Subject: [PATCH 41/45] More comments, documentation and a test for predicate --- .../src/runtime_checks/translation.rs | 48 ++++++++++++++----- .../runtime_checks/fail/predicates/simple.rs | 18 +++++++ .../fail/predicates/simple.stderr | 3 ++ .../fail/predicates/simple.stdout | 2 + prusti/src/callbacks.rs | 24 ++++++---- .../modify_mir/passes/replace_predicates.rs | 4 -- 6 files changed, 73 insertions(+), 26 deletions(-) create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/simple.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/simple.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/simple.stdout diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 2ed4fe594d1..c2c38d1229c 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -134,6 +134,11 @@ pub(crate) fn translate_runtime_checks( Ok(syn::Item::Fn(check_item)) } +/// Translate a single expression, as contained in specifications such as +/// prusti_assert. Contrary to the other translations, this does not generate +/// a function, but simply a block of code that will be put into user code. +/// To mark this block as part of a runtime check, it starts with a closure that +/// has some attributes. pub(crate) fn translate_expression_runtime( tokens: TokenStream, check_id: SpecificationId, @@ -174,6 +179,9 @@ pub(crate) fn translate_expression_runtime( }) } +/// Translates a predicate to an executable function. +/// This is yet another separate function, because the function we generate here differs +/// from other check functions since we don't actually check any conditions within a predicate. pub(crate) fn translate_predicate( check_id: SpecificationId, body: TokenStream, @@ -218,6 +226,10 @@ pub(crate) fn translate_predicate( Ok(syn::Item::Fn(check_item)) } +/// Since spec and check functions have the same signatures as the function they +/// are attached to, actually executing causes them to take ownership of values +/// and freeing them in some cases. Inserting these forget statements avoids +/// values being freed within check functions. pub(crate) fn generate_forget_statements( item: &T, check_type: CheckItemType, @@ -294,16 +306,23 @@ fn old_values_type(span: Span, function_info: &AssociatedFunctionInfo) -> syn::T old_values_type } +/// The visitor that goes through the AST, finds expressions that need to be +/// modified to make them executable, and performs these optimizations pub(crate) struct CheckVisitor { + /// Information about the function this specification is attached to pub function_info: AssociatedFunctionInfo, + /// The type of specification pub check_type: CheckItemType, - pub within_old: bool, - pub within_before_expiry: bool, + /// Used while traversing: set if we are in a child of an old-call + within_old: bool, + /// Just like `within_old`, for `before_expiry` + within_before_expiry: bool, /// Whether the current expression is part of the outermost - /// expression. If yes, and we encounter a conjunction or + /// conjunction. If yes, and we encounter a conjunction or /// forall quantifier, we can extend the reported error with /// more precise information is_outer: bool, + /// Used to signal to a parent that an expression contains a conjunction contains_conjunction: bool, } @@ -366,32 +385,34 @@ impl VisitMut for CheckVisitor { // for this function we can savely try to get // more precise errors about the contents self.is_outer = was_outer; - // for prusti_assert etc we can not resolve old here if self.check_type.is_inlined() { - syn::visit_mut::visit_expr_call_mut(self, call); + // for prusti_assert etc we can not resolve old here // just leave it as it is. resolve it on mir level + syn::visit_mut::visit_expr_call_mut(self, call); } else { - let sub_expr = call.args.pop(); // remove old-call and replace with content expression + let sub_expr = call.args.pop(); *expr = sub_expr.unwrap().value().clone(); + // Signal to children that all occurrences of function arguments should + // be replaced with `old_values.index` self.within_old = true; self.visit_expr_mut(expr); - // will cause all variables below to be replaced by old_value.some_field self.within_old = false; } } ":: prusti_contracts :: before_expiry" | "prusti_contracts :: before_expiry" | "before_expiry" => { + // Same thing as for old, except that this can not occurr in + // inlined specs let sub_expr = call.args.pop(); *expr = sub_expr.unwrap().value().clone(); - // will cause all variables below to be replaced by old_value.some_field self.within_before_expiry = true; self.visit_expr_mut(expr); self.within_before_expiry = false; } ":: prusti_contracts :: forall" => { - // arguments are triggers and then the closure: + // Get the closure argument of the quantifier. Disregard triggers. let quant_closure_expr: syn::Expr = call.args.last().unwrap().clone(); if let syn::Expr::Closure(mut expr_closure) = quant_closure_expr { // since this is a conjunction, we can get more information about subexpressions failing @@ -424,7 +445,7 @@ impl VisitMut for CheckVisitor { *expr = check_expr; } } - // some cases where we want to warn users that these features + // some cases where we want to warn users that certain prusti features // will not be checked correctly: (not complete yet) ":: prusti_contracts :: snapshot_equality" | "prusti_contracts :: snapshot_equality" @@ -451,7 +472,7 @@ impl VisitMut for CheckVisitor { }) if was_outer => { // Figure out if the sub-expressions contain even more conjunctions. // If yes, visiting the children of our current node will already - // procude more precise errors than we can here. + // produce more precise errors than we can here. self.contains_conjunction = false; syn::visit_mut::visit_expr_mut(self, left); let left_contains_conjunction = self.contains_conjunction; @@ -477,10 +498,11 @@ impl VisitMut for CheckVisitor { let new_right = error_messages::call_check_expr(right.clone(), right_error_str); *right = new_right; } - // signal to parent that it doesnt need to wrap this expression - // into a separate check function, since it will be further split up + // signal to parent that it doesnt need to report a precise error for this + // expression, since we already produce a more precise error here self.contains_conjunction = true; } + // Make sure simple brackets don't stop us from producing precise errors syn::Expr::Block(_) | syn::Expr::Paren(_) => { syn::visit_mut::visit_expr_mut(self, expr); } diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/simple.rs b/prusti-tests/tests/runtime_checks/fail/predicates/simple.rs new file mode 100644 index 00000000000..2461500505c --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/simple.rs @@ -0,0 +1,18 @@ +//@run: 101 +use prusti_contracts::*; + +#[trusted] +fn main() { + foo(42); + foo(41); +} +predicate! { + #[insert_runtime_check] + fn is_even(x: i32) -> bool { + x % 2 == 0 + } +} + +#[insert_runtime_check] +#[requires(is_even(x))] +fn foo(x: i32) {} diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/simple.stderr b/prusti-tests/tests/runtime_checks/fail/predicates/simple.stderr new file mode 100644 index 00000000000..ae9772bc5fd --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/simple.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/simple.rs:18:1: +Prusti Runtime Checks: Contract #[requires(is_even(x))] was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/simple.stdout b/prusti-tests/tests/runtime_checks/fail/predicates/simple.stdout new file mode 100644 index 00000000000..304645d659a --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/simple.stdout @@ -0,0 +1,2 @@ +check function prusti_pre_check_item_foo is performed +check function prusti_pre_check_item_foo is performed diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index 024df47dd6a..d7ddd0a0c4c 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -78,16 +78,18 @@ fn mir_promoted<'tcx>( result } -// a copy of the rust compilers implementation of this query + -// + verification on its first call -// + dead code elimination if enabled -// + insertion of runtime checks if enabled +/// a copy of the rust compilers implementation of this query + +/// + verification on its first call +/// + dead code elimination if enabled +/// + insertion of runtime checks if enabled pub(crate) fn mir_drops_elaborated(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal> { // run verification here, otherwise we can't rely on results in // drops elaborated - // make sure mir was constructed let def_id = def.to_def_id(); let default_query = DEFAULT_QUERY_PROVIDERS.mir_drops_elaborated_and_const_checked; + // For constant items, mir_drops_elaborated is constructed before mir_promoted + // is constructed for other items. If we go into verification at this point this + // will lead to problems. if config::no_verify() || !is_non_const_function(tcx, def_id) { return default_query(tcx, def); } @@ -95,7 +97,7 @@ pub(crate) fn mir_drops_elaborated(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal, def: LocalDefId) -> &Steal Compilation { compiler.session().abort_if_errors(); queries.global_ctxt().unwrap().enter(|tcx| { + // because of runtime checks, verification might already have happened in + // drops elaborated query. This avoids verifying multiple times. if !globals::verified(LOCAL_CRATE) { // already stops if we had an error - let (def_spec, env) = get_specs(tcx, Some(compiler)).unwrap(); + let (def_spec, env) = obtain_specs(tcx, Some(compiler)).unwrap(); if !config::no_verify() { let env = verify(env, def_spec.clone()); @@ -255,11 +260,12 @@ impl prusti_rustc_interface::driver::Callbacks for PrustiCompilerCalls { } } +/// Check if a def_id belongs to a constant function fn is_non_const_function(tcx: TyCtxt<'_>, def_id: DefId) -> bool { matches!(tcx.def_kind(def_id), DefKind::Fn | DefKind::AssocFn) && !tcx.is_const_fn(def_id) } -pub fn get_specs<'tcx>( +pub fn obtain_specs<'tcx>( tcx: TyCtxt<'tcx>, compiler_opt: Option<&Compiler>, ) -> Result<(DefSpecificationMap, Environment<'tcx>), ()> { diff --git a/prusti/src/modify_mir/passes/replace_predicates.rs b/prusti/src/modify_mir/passes/replace_predicates.rs index 40a1c7693a0..76065f8799b 100644 --- a/prusti/src/modify_mir/passes/replace_predicates.rs +++ b/prusti/src/modify_mir/passes/replace_predicates.rs @@ -24,11 +24,9 @@ impl<'tcx, 'a> PredicateReplacer<'tcx, 'a> { def_id: DefId, body: &mut mir::Body<'tcx>, ) { - println!("replacing predicates in function: {:?}", def_id); // 1. figure out if this itself is a check function: let env_query = EnvQuery::new(tcx); let is_check_fn = utils::has_check_only_attr(env_query.get_attributes(def_id)); - println!("is check function: {}", is_check_fn); let mut replacer = Self { tcx, env_query, @@ -60,12 +58,10 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PredicateReplacer<'tcx, 'a> { if let Some((call_id, generics)) = func.const_fn_def() { // check if the called function is a predicate, and also if it has let attrs = self.env_query.get_attributes(call_id); - println!("handling call to {:?}", call_id); if !utils::has_prusti_attr(attrs, "pred_spec_id_ref") { // not a predicate, nothing to be done return; } - println!("Call {:?} is being replaced", call_id); if let Some(check_id) = self.body_info.specs.get_predicate_check(&call_id) { let func_ty = self .tcx From 2e8fb1eef194ba54962e86a793615d47de54d8da Mon Sep 17 00:00:00 2001 From: cedihegi Date: Mon, 18 Sep 2023 14:20:47 +0200 Subject: [PATCH 42/45] Update predicates and predicate checking + other things - some new test cases - only 1 configuration flag regarding runtime checks --- ...th_attributes.rs => attribute_consumer.rs} | 12 +- prusti-contracts/prusti-specs/src/common.rs | 30 +++ prusti-contracts/prusti-specs/src/lib.rs | 33 ++- .../prusti-specs/src/predicate.rs | 93 ++++---- .../src/runtime_checks/translation.rs | 66 +++--- prusti-interface/src/globals.rs | 9 + prusti-interface/src/specs/checker/common.rs | 31 ++- .../src/specs/checker/predicate_checks.rs | 217 +++++++++++++++--- prusti-launch/src/bin/cargo-prusti.rs | 4 +- .../parse/ui/predicates-visibility.stdout | 3 +- prusti-tests/tests/parse/ui/predicates.stdout | 8 +- .../fail/predicates/abstract-error.rs | 11 + .../fail/predicates/abstract-error.stderr | 9 + .../fail/predicates/check-error.rs | 27 +++ .../fail/predicates/check-error.stderr | 30 +++ .../fail/predicates/nested-predicate | Bin 0 -> 4665040 bytes .../fail/predicates/nested-predicate.rs | 19 ++ .../fail/predicates/nested-predicate.stderr | 21 ++ .../fail/predicates/predicate-assert.rs | 21 ++ .../fail/predicates/predicate-assert.stderr | 3 + .../fail/predicates/predicate-assert.stdout | 1 + .../{simple.rs => predicate-pre.rs} | 0 .../{simple.stderr => predicate-pre.stderr} | 2 +- .../{simple.stdout => predicate-pre.stdout} | 2 + .../warn-unsupported-snapeq.stderr | 2 +- prusti-tests/tests/runtimetest.rs | 8 +- prusti-tests/tests/verify/ui/predicate.stdout | 10 +- prusti-utils/src/config.rs | 22 +- prusti/src/callbacks.rs | 14 +- prusti/src/driver.rs | 7 +- prusti/src/modify_mir/mir_modify.rs | 2 - prusti/src/modify_mir/passes/mod.rs | 2 - .../modify_mir/passes/replace_predicates.rs | 85 ------- 33 files changed, 538 insertions(+), 266 deletions(-) rename prusti-contracts/prusti-specs/src/{expression_with_attributes.rs => attribute_consumer.rs} (80%) create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/abstract-error.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/abstract-error.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/check-error.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/check-error.stderr create mode 100755 prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.rs create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.stderr create mode 100644 prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.stdout rename prusti-tests/tests/runtime_checks/fail/predicates/{simple.rs => predicate-pre.rs} (100%) rename prusti-tests/tests/runtime_checks/fail/predicates/{simple.stderr => predicate-pre.stderr} (74%) rename prusti-tests/tests/runtime_checks/fail/predicates/{simple.stdout => predicate-pre.stdout} (64%) delete mode 100644 prusti/src/modify_mir/passes/replace_predicates.rs diff --git a/prusti-contracts/prusti-specs/src/expression_with_attributes.rs b/prusti-contracts/prusti-specs/src/attribute_consumer.rs similarity index 80% rename from prusti-contracts/prusti-specs/src/expression_with_attributes.rs rename to prusti-contracts/prusti-specs/src/attribute_consumer.rs index 5df36c78527..2259c5992ea 100644 --- a/prusti-contracts/prusti-specs/src/expression_with_attributes.rs +++ b/prusti-contracts/prusti-specs/src/attribute_consumer.rs @@ -2,12 +2,12 @@ use proc_macro2::TokenStream; use quote::quote; use syn::parse::{Parse, ParseStream}; -// By default, attributes can only be attached to -// items like functions or closures. The point of this is -// to allow attaching attributes to the contents of a -// prusti_assert!() or similar. -// In particular, we want to allow: -// `prusti_assert!(#[insert_runtime_check] expr); +// By default, attributes can only be attached to items like functions or closures. +// The point of this is to allow attaching attributes to the contents of a +// prusti_assert!() or similar (predicate). +// Note: this kind of consuming is only necessary when we want to consume an +// attribute at the beginning of a TokenStream without fully parsing it (mainly +// because the rest still has to be parsed by prusti_parse) pub(crate) struct AttributeConsumer { pub attributes: Vec, pub rest: TokenStream, diff --git a/prusti-contracts/prusti-specs/src/common.rs b/prusti-contracts/prusti-specs/src/common.rs index 787eef8f21b..b0c4f2bdf1a 100644 --- a/prusti-contracts/prusti-specs/src/common.rs +++ b/prusti-contracts/prusti-specs/src/common.rs @@ -709,3 +709,33 @@ mod tests { } } } + +pub enum RuntimeCheckMode { + All, + Selective, + Never, +} + +impl RuntimeCheckMode { + pub fn determine() -> Self { + match std::env::var("PRUSTI_INSERT_RUNTIME_CHECKS") + .unwrap_or("never".to_string()) + .as_str() + { + "all" => Self::All, + "selective" => Self::Selective, + "never" => Self::Never, + _ => Self::Never, + } + } + + /// Depending on whether a contract has a #[insert_runtime_check] attribute + /// decide whether a check should actually be inserted + pub fn decide_insertion(&self, has_attr: bool) -> bool { + match (self, has_attr) { + (Self::All, _) => true, + (Self::Selective, b) => b, + (Self::Never, _) => false, + } + } +} diff --git a/prusti-contracts/prusti-specs/src/lib.rs b/prusti-contracts/prusti-specs/src/lib.rs index 8c8a5f512b9..dbd8ae3585c 100644 --- a/prusti-contracts/prusti-specs/src/lib.rs +++ b/prusti-contracts/prusti-specs/src/lib.rs @@ -24,9 +24,9 @@ mod type_model; mod user_provided_type_params; mod print_counterexample; mod runtime_checks; -mod expression_with_attributes; +mod attribute_consumer; -use expression_with_attributes::AttributeConsumer; +use attribute_consumer::AttributeConsumer; use proc_macro2::{Span, TokenStream, TokenTree}; use quote::{quote, quote_spanned, ToTokens}; use rewriter::AstRewriter; @@ -171,19 +171,16 @@ fn generate_spec_and_assertions( let mut generated_items = vec![]; let mut generated_attributes = vec![]; - // Attributes following a #[insert_runtime_check] attribute will be runtime - // checked. If this attribute precedes an annotation that cannot be checked - // at runtime we emit a warning. - let mut runtime_check_next = false; - // This environment variable causes all checkable contracts to be checked at runtime. - let runtime_check_always = - std::env::var("PRUSTI_RUNTIME_CHECK_ALL_CONTRACTS").map_or(false, |s| s == "true"); + let mut check_annotation_for_next = false; + let check_mode = common::RuntimeCheckMode::determine(); for (attr_kind, attr_tokens) in prusti_attributes.drain(..) { - if runtime_check_next { + let runtime_check = check_mode.decide_insertion(check_annotation_for_next); + if check_annotation_for_next { + // warn users if #[insert_runtime_check] attribute is in front + // of an unsupported contract warn_uncheckable_runtimecheck(&attr_kind, &attr_tokens); } - let runtime_check = runtime_check_next || runtime_check_always; let rewriting_result = match attr_kind { SpecAttributeKind::Requires => generate_for_requires(attr_tokens, item, runtime_check), SpecAttributeKind::Ensures => generate_for_ensures(attr_tokens, item, runtime_check), @@ -203,17 +200,17 @@ fn generate_spec_and_assertions( SpecAttributeKind::Predicate => unreachable!(), SpecAttributeKind::Invariant => unreachable!(), SpecAttributeKind::RefineSpec => { - type_cond_specs::generate(attr_tokens, item, runtime_check_next) + type_cond_specs::generate(attr_tokens, item, runtime_check) } SpecAttributeKind::Model => unreachable!(), SpecAttributeKind::PrintCounterexample => unreachable!(), SpecAttributeKind::InsertRuntimeCheck => { // generate runtime check functions for the one following this one - runtime_check_next = true; + check_annotation_for_next = true; continue; } }; - runtime_check_next = false; + check_annotation_for_next = false; let (new_items, new_attributes) = rewriting_result?; generated_items.extend(new_items); generated_attributes.extend(new_attributes); @@ -609,16 +606,16 @@ fn generate_expression_closure( let checkable = check_type.can_be_checked(); // emit a warning if #[insert_runtime_check] precedes an item that is not // checked at runtime. + let insert_runtime_check = + common::RuntimeCheckMode::determine().decide_insertion(runtime_attr.is_some()); if !checkable && runtime_attr.is_some() { prusti_tokens .span() .unwrap() - .warning("The attribute #[insert_runtime_check] can not be applied here.") + .warning("This contract will not be checked at runtime.") .emit(); } - let runtime_check_always = - std::env::var("PRUSTI_RUNTIME_CHECK_ALL_CONTRACTS").map_or(false, |s| s == "true"); - if check_type.can_be_checked() && (runtime_check_always || runtime_attr.is_some()) { + if check_type.can_be_checked() && insert_runtime_check { let check_closure = handle_result!(translate_expression_runtime( prusti_tokens, check_id, diff --git a/prusti-contracts/prusti-specs/src/predicate.rs b/prusti-contracts/prusti-specs/src/predicate.rs index cf394d6c240..622834dc099 100644 --- a/prusti-contracts/prusti-specs/src/predicate.rs +++ b/prusti-contracts/prusti-specs/src/predicate.rs @@ -1,8 +1,8 @@ //! Predicate parsing use crate::{ - common::{HasMacro, HasSignature}, - expression_with_attributes::AttributeConsumer, + attribute_consumer::AttributeConsumer, + common::{HasMacro, HasSignature, RuntimeCheckMode}, rewriter, runtime_checks::translation::translate_predicate, specifications::preparser::parse_prusti, @@ -18,14 +18,12 @@ pub struct PredicateWithBody { /// The body of the function is replaced (`unimplemented!()`) pub patched_function: T, pub spec_function: syn::Item, - pub check_function: Option, } impl ToTokens for PredicateWithBody { fn to_tokens(&self, tokens: &mut TokenStream) { self.spec_function.to_tokens(tokens); self.patched_function.to_tokens(tokens); - self.check_function.to_tokens(tokens); } } @@ -88,9 +86,10 @@ fn parse_predicate_internal( ) -> syn::Result { let span = tokens.span(); let mut attr_consumer: AttributeConsumer = syn::parse(tokens.into())?; - let runtime_checkable = attr_consumer + let has_runtime_attr = attr_consumer .get_attribute("insert_runtime_check") .is_some(); + let runtime_checkable = RuntimeCheckMode::determine().decide_insertion(has_runtime_attr); // attr_consumer.check_no_remaining_attrs()?; let tokens = attr_consumer.tokens(); let input: PredicateFnInput = syn::parse2(tokens).map_err(|e| { @@ -112,49 +111,34 @@ fn parse_predicate_internal( if input.body.is_some() { let mut rewriter = rewriter::AstRewriter::new(); let spec_id = rewriter.generate_spec_id(); - let check_id_opt = runtime_checkable.then_some(rewriter.generate_spec_id()); if in_spec_refinement { let patched_function: syn::ImplItemMethod = - patch_predicate_macro_body(&input, span, spec_id, check_id_opt); - let body = input.body.unwrap(); - let spec_function = - generate_spec_function(body.clone(), return_type, spec_id, &patched_function)?; - let check_function = if runtime_checkable { - Some(translate_predicate( - check_id_opt.unwrap(), - parse_prusti(body)?, - &patched_function, - )?) - } else { - None - }; + patch_predicate_macro_body(&input, span, spec_id, runtime_checkable)?; + let spec_function = generate_spec_function( + input.body.unwrap(), + return_type, + spec_id, + &patched_function, + )?; Ok(ParsedPredicate::Impl(PredicateWithBody { spec_function, patched_function, - check_function, })) } else { let patched_function: syn::ItemFn = - patch_predicate_macro_body(&input, span, spec_id, check_id_opt); - let body = input.body.unwrap(); - let spec_function = - generate_spec_function(body.clone(), return_type, spec_id, &patched_function)?; - let check_function = if runtime_checkable { - Some(translate_predicate( - check_id_opt.unwrap(), - parse_prusti(body)?, - &patched_function, - )?) - } else { - None - }; + patch_predicate_macro_body(&input, span, spec_id, runtime_checkable)?; + let spec_function = generate_spec_function( + input.body.unwrap(), + return_type, + spec_id, + &patched_function, + )?; Ok(ParsedPredicate::FreeStanding(PredicateWithBody { spec_function, patched_function, - check_function, })) } } else { @@ -177,29 +161,38 @@ fn parse_predicate_internal( } } +/// Either sets the predicates body to unimplemented, or (in case it should +/// be runtime checkable) with the translated runtime check fn patch_predicate_macro_body( predicate: &PredicateFnInput, input_span: Span, spec_id: SpecificationId, - check_id_opt: Option, -) -> R { + runtime_checkable: bool, +) -> syn::Result { let visibility = &predicate.visibility; let signature = &predicate.fn_sig; let spec_id_str = spec_id.to_string(); - let check_ref_attr = check_id_opt.map(|id| { - let check_id_str = id.to_string(); - quote_spanned!(input_span => #[prusti::pred_check_id_ref = #check_id_str]) - }); + let body = if runtime_checkable { + translate_predicate( + parse_prusti(predicate.body.clone().unwrap())?, + predicate, + input_span, + )? + } else { + quote_spanned! {input_span => unimplemented!("predicate")} + }; + let check_attr = + runtime_checkable.then_some(quote_spanned! {input_span => #[prusti::check_only]}); - parse_quote_spanned!(input_span=> - #[allow(unused_must_use, unused_variables, dead_code)] + Ok(parse_quote_spanned!(input_span=> + #[allow(unused_must_use, unused_variables, dead_code, forgetting_copy_types)] #[prusti::pred_spec_id_ref = #spec_id_str] - #check_ref_attr #[prusti::specs_version = #SPECS_VERSION] + #check_attr #visibility #signature { - unimplemented!("predicate") + #body } - ) + )) } fn generate_spec_function( @@ -247,3 +240,13 @@ impl syn::parse::Parse for PredicateFnInput { }) } } + +impl HasSignature for PredicateFnInput { + fn sig(&self) -> &syn::Signature { + &self.fn_sig + } + + fn sig_mut(&mut self) -> &mut syn::Signature { + &mut self.fn_sig + } +} diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index c2c38d1229c..d1ca9d02226 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -179,16 +179,13 @@ pub(crate) fn translate_expression_runtime( }) } -/// Translates a predicate to an executable function. -/// This is yet another separate function, because the function we generate here differs -/// from other check functions since we don't actually check any conditions within a predicate. -pub(crate) fn translate_predicate( - check_id: SpecificationId, +/// Generates an executable body for a predicate. +pub(crate) fn translate_predicate( body: TokenStream, item: &T, -) -> syn::Result { + span: Span, +) -> syn::Result { let check_type = CheckItemType::Predicate; - let span = body.span(); // get signature information about the associated function let function_info = AssociatedFunctionInfo::empty(); let mut visitor = CheckVisitor::new(function_info, check_type); @@ -197,46 +194,45 @@ pub(crate) fn translate_predicate( let mut expr: syn::Expr = syn::parse2(body.clone())?; visitor.visit_expr_mut(&mut expr); - let item_name = syn::Ident::new( - &format!( - "prusti_{}_check_item_{}_{}", - check_type, - item.sig().ident, - check_id - ), - span, - ); - let check_id_str = check_id.to_string(); - let forget_statements = generate_forget_statements(item, check_type, span); - - let mut check_item: syn::ItemFn = parse_quote_spanned! {item.span() => - #[allow(unused_must_use, unused_parens, unused_variables, dead_code, non_snake_case, forgetting_copy_types)] - #[prusti::spec_only] - #[prusti::check_only] - #[prusti::check_id = #check_id_str] - fn #item_name() { - let prusti_predicate_result = #expr; - #forget_statements - prusti_predicate_result + let fn_ident = &item.sig().ident.to_string(); + let debug_print_stmt: Option = if std::env::var("PRUSTI_DEBUG_RUNTIME_CHECKS") + .unwrap_or_default() + == "true" + { + if cfg!(feature = "std") { + Some(quote_spanned! {span => + println!("predicate {} is executed", #fn_ident); + }) + } else { + // warn user that debug information will not be emitted in no_std + span.unwrap().warning("enabling PRUSTI_DEBUG_RUNTIME_CHECKS only has an effect if feature \"std\" is enabled too").emit(); + None } + } else { + None }; - check_item.sig.generics = item.sig().generics.clone(); - check_item.sig.inputs = item.sig().inputs.clone(); - check_item.sig.output = item.sig().output.clone(); - Ok(syn::Item::Fn(check_item)) + let forget_statements = generate_forget_statements(item, check_type, span); + + Ok(quote_spanned! {span => + #debug_print_stmt + let prusti_predicate_result = #expr; + #forget_statements + prusti_predicate_result + }) } /// Since spec and check functions have the same signatures as the function they /// are attached to, actually executing causes them to take ownership of values /// and freeing them in some cases. Inserting these forget statements avoids /// values being freed within check functions. -pub(crate) fn generate_forget_statements( +pub(crate) fn generate_forget_statements( item: &T, check_type: CheckItemType, span: Span, ) -> syn::Block { // go through all inputs, if they are not references add a forget - // statement + // statement (might not be needed for all of them, but if they're on + // the stack, this will not do anything) let mut stmts: Vec = Vec::new(); if check_type.gets_item_args() { for fn_arg in item.sig().inputs.clone() { @@ -454,7 +450,7 @@ impl VisitMut for CheckVisitor { | "prusti_contracts :: snap" | "snap" => { let message = format!( - "Runtime checks: Use of unsupported feature {}", + "Feature {} is not supported for runtime checks, behavior at runtime might be arbitrary", expr.to_token_stream() ); expr.span().unwrap().warning(message).emit(); diff --git a/prusti-interface/src/globals.rs b/prusti-interface/src/globals.rs index 39ed7607dc4..1cc6e0932aa 100644 --- a/prusti-interface/src/globals.rs +++ b/prusti-interface/src/globals.rs @@ -12,6 +12,7 @@ use crate::{ // data that is persistent across queries will be stored here. thread_local! { + pub static CHECK_ERROR: RefCell = RefCell::new(false); pub static SPECS: RefCell> = RefCell::new(None); pub static ENV: RefCell>> = RefCell::new(None); pub static VERIFIED: RefCell> = RefCell::new(Default::default()); @@ -23,6 +24,14 @@ thread_local! { pub static VERIFIED_ASSERTIONS: RefCell>> = Default::default(); } +pub fn set_check_error() { + CHECK_ERROR.with(|cell| *cell.borrow_mut() = true) +} + +pub fn get_check_error() -> bool { + CHECK_ERROR.with(|cell| *cell.borrow()) +} + /// If we encoded assertions in the hope of being able to eliminate them, we /// store their locations here, so we can later eliminate them in case they /// don't generate an error diff --git a/prusti-interface/src/specs/checker/common.rs b/prusti-interface/src/specs/checker/common.rs index 6d920e7f147..5814674fedb 100644 --- a/prusti-interface/src/specs/checker/common.rs +++ b/prusti-interface/src/specs/checker/common.rs @@ -1,4 +1,8 @@ -use crate::{environment::Environment, utils::has_spec_only_attr, PrustiError}; +use crate::{ + environment::Environment, + utils::{has_check_only_attr, has_spec_only_attr}, + PrustiError, +}; use prusti_rustc_interface::{ hir::{ self as hir, @@ -72,6 +76,29 @@ impl<'tcx, T: NonSpecExprVisitor<'tcx>> Visitor<'tcx> for NonSpecExprVisitorWrap intravisit::walk_expr(self, ex); } + fn visit_block(&mut self, block: &'tcx hir::Block<'tcx>) { + // runtime checks can introduce blocks that call predicates. This will make + // sure they are skipped. They are marked with #[spec_only] too, so if they + // can be skipped in general, this function could be adjusted. + if let Some(hir::Stmt { + kind: + hir::StmtKind::Semi(hir::Expr { + kind: hir::ExprKind::Closure(hir::Closure { def_id, .. }), + .. + }), + .. + }) = block.stmts.get(0) + { + // check if this def_id has a check_only attribute: + let tcx = self.wrapped.tcx(); + let attrs = tcx.hir().attrs(tcx.local_def_id_to_hir_id(*def_id)); + if has_check_only_attr(attrs) { + return; + } + } + intravisit::walk_block(self, block) + } + fn visit_fn( &mut self, fk: intravisit::FnKind<'tcx>, @@ -83,7 +110,7 @@ impl<'tcx, T: NonSpecExprVisitor<'tcx>> Visitor<'tcx> for NonSpecExprVisitorWrap // Stop checking inside `prusti::spec_only` functions let tcx = self.wrapped.tcx(); let attrs = tcx.hir().attrs(tcx.local_def_id_to_hir_id(local_id)); - if has_spec_only_attr(attrs) { + if has_spec_only_attr(attrs) || has_check_only_attr(attrs) { return; } diff --git a/prusti-interface/src/specs/checker/predicate_checks.rs b/prusti-interface/src/specs/checker/predicate_checks.rs index 7a798594955..c29d79f7b2f 100644 --- a/prusti-interface/src/specs/checker/predicate_checks.rs +++ b/prusti-interface/src/specs/checker/predicate_checks.rs @@ -1,7 +1,9 @@ use super::common::*; use crate::{ environment::{EnvQuery, Environment}, - utils::{has_abstract_predicate_attr, has_prusti_attr}, + utils::{ + has_abstract_predicate_attr, has_check_only_attr, has_prusti_attr, has_spec_only_attr, + }, PrustiError, }; use log::debug; @@ -33,12 +35,29 @@ impl<'tcx> SpecCheckerStrategy<'tcx> for IllegalPredicateUsagesChecker { "Abstract predicates with bodies: {:?}", collected_predicates.abstract_predicate_with_bodies ); + let illegal_rtc_pred_usages = + self.collect_illegal_predicate_usages_rtc(&collected_predicates.predicates, env.query); + debug!( + "Predicate usages from runtime check code: {:?}", + illegal_rtc_pred_usages + ); + let illegal_pred_usages = self.collect_illegal_predicate_usages(collected_predicates.predicates, env.query); debug!("Predicate usages: {:?}", illegal_pred_usages); // TODO: check behavioral subtyping of implemented predicates against default implementation + let illegal_pred_usages_rtc = illegal_rtc_pred_usages.into_iter().map(|(usage_span, def_span)|{ + PrustiError::incorrect( + "Referring to predicate that is not runtime checkable in specifications that should be runtime checked is not allowed".to_string(), + MultiSpan::from_span(usage_span), + ).add_note( + "this predicate can not be checked at runtime, make sure it has a body and mark it with #[insert_runtime_check]", + Some(def_span) + ) + }); + let illegal_usage_errors = illegal_pred_usages .into_iter() .map(|(usage_span, def_span)| { @@ -50,7 +69,8 @@ impl<'tcx> SpecCheckerStrategy<'tcx> for IllegalPredicateUsagesChecker { "this is a specification-only predicate function", Some(def_span), ) - }); + }) + .chain(illegal_pred_usages_rtc); illegal_usage_errors.collect() } @@ -74,9 +94,10 @@ impl IllegalPredicateUsagesChecker { } /// Span of use and definition of predicates used outside of specifications, collected in the second pass. + /// Ignores calls to predicates within code generated by runtime checks fn collect_illegal_predicate_usages( &self, - predicates: FxHashMap, + predicates: FxHashMap, env_query: EnvQuery, ) -> Vec<(Span, Span)> { let mut visit = CheckPredicatesVisitor { @@ -91,13 +112,34 @@ impl IllegalPredicateUsagesChecker { visit.wrapped.pred_usages } + + /// Similar to previous check, but now we look at the code generated by runtime checks. + /// For the predicates that are called here, we need to make sure that they are + /// indeed runtime checkable (i.e. they have been marked with a #[check_only] attribute, + /// which means an impelementation for them has been generated) + fn collect_illegal_predicate_usages_rtc<'tcx>( + &self, + predicates: &FxHashMap, + env_query: EnvQuery<'tcx>, + ) -> Vec<(Span, Span)> { + let mut visit = RuntimeCheckablePredicatesVisitor { + env_query, + predicates, + bad_usages: Vec::new(), + within_check_code: false, + }; + env_query.hir().visit_all_item_likes_in_crate(&mut visit); + visit.bad_usages + } } /// First predicate checks visitor: collect all function items that originate /// from predicates struct CollectPredicatesVisitor<'tcx> { env_query: EnvQuery<'tcx>, - predicates: FxHashMap, + /// Maps from predicates to their Span + a boolean telling us whether this predicate + /// can be checked at runtime + predicates: FxHashMap, abstract_predicate_with_bodies: FxHashSet, } @@ -120,8 +162,9 @@ impl<'tcx> intravisit::Visitor<'tcx> for CollectPredicatesVisitor<'tcx> { // collect this fn's DefId if predicate function let attrs = self.env_query.get_local_attributes(local_id); if has_prusti_attr(attrs, "pred_spec_id_ref") { + let runtime_checkable = has_check_only_attr(attrs); let def_id = local_id.to_def_id(); - self.predicates.insert(def_id, s); + self.predicates.insert(def_id, (s, runtime_checkable)); } intravisit::walk_fn(self, fk, fd, b, local_id); @@ -133,7 +176,7 @@ impl<'tcx> intravisit::Visitor<'tcx> for CollectPredicatesVisitor<'tcx> { if has_abstract_predicate_attr(attrs) { let span = self.env_query.get_def_span(def_id); - self.predicates.insert(def_id, span); + self.predicates.insert(def_id, (span, false)); } else if has_prusti_attr(attrs, "pred_spec_id_ref") { if let hir::TraitItemKind::Fn(_, hir::TraitFn::Provided(_)) = &ti.kind { self.abstract_predicate_with_bodies.insert(def_id); @@ -148,8 +191,7 @@ impl<'tcx> intravisit::Visitor<'tcx> for CollectPredicatesVisitor<'tcx> { /// from non-specification code struct CheckPredicatesVisitor<'tcx> { env_query: EnvQuery<'tcx>, - - predicates: FxHashMap, + predicates: FxHashMap, pred_usages: Vec<(Span, Span)>, } @@ -159,41 +201,144 @@ impl<'v, 'tcx: 'v> NonSpecExprVisitor<'tcx> for CheckPredicatesVisitor<'tcx> { } fn visit_expr(&mut self, ex: &'tcx hir::Expr<'tcx>) { - let owner_def_id = ex.hir_id.owner.def_id; - - // General check: The "path" of a predicate doesn't appear anywhere - // (e.g. as in a function call or an argument when we pass the predicate to another function) - if let hir::ExprKind::Path(ref path) = ex.kind { - if self.env_query.has_body(owner_def_id) { - let res = self - .env_query - .tcx() - .typeck(owner_def_id) - .qpath_res(path, ex.hir_id); - if let hir::def::Res::Def(_, def_id) = res { - if let Some(pred_def_span) = self.predicates.get(&def_id) { - self.pred_usages.push((ex.span, *pred_def_span)); - } - } + if let Some(def_id) = resolve_path(ex, self.env_query) { + if let Some((pred_def_span, _)) = self.predicates.get(&def_id) { + self.pred_usages.push((ex.span, *pred_def_span)); } } - // When we deal with predicates in impls, the above path resolving is not enough, - // i.e. when Foo::bar is a predicate and we call `foo.bar()` on some `foo: Foo`, - // we do not observe the called def id `bar` via path resolution. - if self.env_query.has_body(owner_def_id) { - let resolved_called_method = self - .env_query + if let Some(called_def_id) = resolve_impl(ex, self.env_query) { + if let Some((pred_def_span, _)) = self.predicates.get(&called_def_id) { + self.pred_usages.push((ex.span, *pred_def_span)); + } + } + } +} + +fn resolve_path<'tcx>(ex: &'tcx hir::Expr<'tcx>, env_query: EnvQuery<'tcx>) -> Option { + let owner_def_id = ex.hir_id.owner.def_id; + + // General check: The "path" of a predicate doesn't appear anywhere + // (e.g. as in a function call or an argument when we pass the predicate to another function) + if let hir::ExprKind::Path(ref path) = ex.kind { + if env_query.has_body(owner_def_id) { + let res = env_query .tcx() .typeck(owner_def_id) - .type_dependent_def_id(ex.hir_id); - if let Some(called_def_id) = resolved_called_method { - if !self.env_query.tcx().is_constructor(called_def_id) { - if let Some(pred_def_span) = self.predicates.get(&called_def_id) { - self.pred_usages.push((ex.span, *pred_def_span)); - } + .qpath_res(path, ex.hir_id); + if let hir::def::Res::Def(_, def_id) = res { + return Some(def_id); + } + } + } + None +} + +fn resolve_impl<'tcx>(ex: &'tcx hir::Expr<'tcx>, env_query: EnvQuery<'tcx>) -> Option { + let owner_def_id = ex.hir_id.owner.def_id; + // When we deal with predicates in impls, the above path resolving is not enough, + // i.e. when Foo::bar is a predicate and we call `foo.bar()` on some `foo: Foo`, + // we do not observe the called def id `bar` via path resolution. + if env_query.has_body(owner_def_id) { + let resolved_called_method = env_query + .tcx() + .typeck(owner_def_id) + .type_dependent_def_id(ex.hir_id); + if let Some(called_def_id) = resolved_called_method { + if !env_query.tcx().is_constructor(called_def_id) { + return Some(called_def_id); + } + } + } + None +} + +/// This visitors purpose is to detect calls to predicates within blocks marked with +/// #[check_only] that are not actually runtime checkable (because they were not +/// marked with #[insert_runtime_check] for example) +struct RuntimeCheckablePredicatesVisitor<'tcx, 'a> { + env_query: EnvQuery<'tcx>, + predicates: &'a FxHashMap, + bad_usages: Vec<(Span, Span)>, + within_check_code: bool, +} + +impl<'tcx, 'a> intravisit::Visitor<'tcx> for RuntimeCheckablePredicatesVisitor<'tcx, 'a> { + type Map = Map<'tcx>; + type NestedFilter = prusti_rustc_interface::middle::hir::nested_filter::OnlyBodies; + + fn nested_visit_map(&mut self) -> Self::Map { + self.env_query.hir() + } + + fn visit_fn( + &mut self, + fk: intravisit::FnKind<'tcx>, + fd: &'tcx hir::FnDecl<'tcx>, + b: hir::BodyId, + _s: Span, + local_id: LocalDefId, + ) { + // for closures we still need to store this. + let old_within_check_code = self.within_check_code; + let tcx = self.env_query.tcx(); + let attrs = tcx.hir().attrs(tcx.local_def_id_to_hir_id(local_id)); + let check_only_attr = has_check_only_attr(attrs); + // skip normal spec functions, but not if they are also check functions + if has_spec_only_attr(attrs) && !check_only_attr { + return; + } + // the case where the whole function was generated for runtime checks, e.g. + // for preconditions + if check_only_attr { + self.within_check_code = true; + } + intravisit::walk_fn(self, fk, fd, b, local_id); + self.within_check_code = old_within_check_code; + } + + // find blocks generated for a runtime check of e.g. a prusti_assert or similar, + fn visit_block(&mut self, block: &'tcx hir::Block<'tcx>) { + let old_within_check_code = self.within_check_code; + + if let Some(hir::Stmt { + kind: + hir::StmtKind::Semi(hir::Expr { + kind: hir::ExprKind::Closure(hir::Closure { def_id, .. }), + .. + }), + .. + }) = block.stmts.get(0) + { + // check if this def_id has a check_only attribute: + let tcx = self.env_query.tcx(); + let attrs = tcx.hir().attrs(tcx.local_def_id_to_hir_id(*def_id)); + if has_check_only_attr(attrs) { + // signal to members of this block that they are within code + // generated by runtime checks + self.within_check_code = true; + } + } + intravisit::walk_block(self, block); + self.within_check_code = old_within_check_code; + } + + fn visit_expr(&mut self, ex: &'tcx hir::Expr<'tcx>) { + if let Some(def_id) = resolve_path(ex, self.env_query) { + if let Some((pred_def_span, runtime_checkable)) = self.predicates.get(&def_id) { + if !runtime_checkable && self.within_check_code { + self.bad_usages.push((ex.span, *pred_def_span)); + } + } + } + + if let Some(called_def_id) = resolve_impl(ex, self.env_query) { + if let Some((pred_def_span, runtime_checkable)) = self.predicates.get(&called_def_id) { + if !runtime_checkable && self.within_check_code { + self.bad_usages.push((ex.span, *pred_def_span)); } } } + intravisit::walk_expr(self, ex); } } diff --git a/prusti-launch/src/bin/cargo-prusti.rs b/prusti-launch/src/bin/cargo-prusti.rs index 899c19d9275..49e2acdb3cd 100644 --- a/prusti-launch/src/bin/cargo-prusti.rs +++ b/prusti-launch/src/bin/cargo-prusti.rs @@ -64,8 +64,8 @@ where config::debug_runtime_checks().to_string(), ) .env( - "PRUSTI_RUNTIME_CHECK_ALL_CONTRACTS", - config::debug_runtime_checks().to_string(), + "PRUSTI_INSERT_RUNTIME_CHECKS", + config::insert_runtime_checks(), ) // Category A* flags: .env("DEFAULT_PRUSTI_QUIET", "true") diff --git a/prusti-tests/tests/parse/ui/predicates-visibility.stdout b/prusti-tests/tests/parse/ui/predicates-visibility.stdout index f1a453b2e48..db9310e4391 100644 --- a/prusti-tests/tests/parse/ui/predicates-visibility.stdout +++ b/prusti-tests/tests/parse/ui/predicates-visibility.stdout @@ -32,7 +32,8 @@ mod foo { }; prusti_result } - #[allow(unused_must_use, unused_variables, dead_code)] + #[allow(unused_must_use, unused_variables, dead_code, + forgetting_copy_types)] #[prusti::pred_spec_id_ref = "$(NUM_UUID)"] #[prusti::specs_version = $(SPECS_VERSION)] pub fn pred1(a: bool) -> bool { diff --git a/prusti-tests/tests/parse/ui/predicates.stdout b/prusti-tests/tests/parse/ui/predicates.stdout index aea6d0a2371..948686f878b 100644 --- a/prusti-tests/tests/parse/ui/predicates.stdout +++ b/prusti-tests/tests/parse/ui/predicates.stdout @@ -33,7 +33,7 @@ fn prusti_pred_item_pred1_$(NUM_UUID)(a: bool) -> bool { }; prusti_result } -#[allow(unused_must_use, unused_variables, dead_code)] +#[allow(unused_must_use, unused_variables, dead_code, forgetting_copy_types)] #[prusti::pred_spec_id_ref = "$(NUM_UUID)"] #[prusti::specs_version = $(SPECS_VERSION)] fn pred1(a: bool) -> bool { @@ -65,7 +65,7 @@ fn prusti_pred_item_pred2_$(NUM_UUID)(a: bool) -> bool { }; prusti_result } -#[allow(unused_must_use, unused_variables, dead_code)] +#[allow(unused_must_use, unused_variables, dead_code, forgetting_copy_types)] #[prusti::pred_spec_id_ref = "$(NUM_UUID)"] #[prusti::specs_version = $(SPECS_VERSION)] fn pred2(a: bool) -> bool { @@ -99,7 +99,7 @@ fn prusti_pred_item_forall_implication_$(NUM_UUID)() }; prusti_result } -#[allow(unused_must_use, unused_variables, dead_code)] +#[allow(unused_must_use, unused_variables, dead_code, forgetting_copy_types)] #[prusti::pred_spec_id_ref = "$(NUM_UUID)"] #[prusti::specs_version = $(SPECS_VERSION)] fn forall_implication() -> bool { @@ -122,7 +122,7 @@ fn prusti_pred_item_exists_implication_$(NUM_UUID)() }; prusti_result } -#[allow(unused_must_use, unused_variables, dead_code)] +#[allow(unused_must_use, unused_variables, dead_code, forgetting_copy_types)] #[prusti::pred_spec_id_ref = "$(NUM_UUID)"] #[prusti::specs_version = $(SPECS_VERSION)] fn exists_implication() -> bool { diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/abstract-error.rs b/prusti-tests/tests/runtime_checks/fail/predicates/abstract-error.rs new file mode 100644 index 00000000000..8ac22cd3915 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/abstract-error.rs @@ -0,0 +1,11 @@ +//@rustc-env: PRUSTI_QUIET=true +use prusti_contracts::*; + +// This test makes sure that trying to runtime check abstract predicates gives +// a proper error +predicate! { + #[insert_runtime_check] //~ERROR: Abstract predicates can not be runtime checked + fn some_abstract_predicate(x: i32) -> bool; +} + +fn main() {} diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/abstract-error.stderr b/prusti-tests/tests/runtime_checks/fail/predicates/abstract-error.stderr new file mode 100644 index 00000000000..2df9cabe83f --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/abstract-error.stderr @@ -0,0 +1,9 @@ +error: Abstract predicates can not be runtime checked + --> $DIR/abstract-error.rs:7:5 + | +7 | / #[insert_runtime_check] +8 | | fn some_abstract_predicate(x: i32) -> bool; + | |_______________________________________________^ + +error: aborting due to previous error + diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/check-error.rs b/prusti-tests/tests/runtime_checks/fail/predicates/check-error.rs new file mode 100644 index 00000000000..498858b5ee9 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/check-error.rs @@ -0,0 +1,27 @@ +//@rustc-env: PRUSTI_QUIET=true +use prusti_contracts::*; + +predicate! { + //#[insert_runtime_check] -> this would fix it + fn some_pred(x: i32) -> bool { + x == 42 + } +} + +// for predicates to be used in specifications that are checked at runtime, they need +// to be marked with #[insert_runtime_check] too, which is not the case here +#[insert_runtime_check] +#[requires(some_pred(_x))] //~ ERROR: Referring to predicate that is not runtime checkable +fn foo(_x: i32) {} + +#[trusted] +fn bar(x: i32) { + // same problem here + prusti_assert!(#[insert_runtime_check]some_pred(x)) + //~^ ERROR: Referring to predicate that is not runtime checkable +} + +fn main() { + bar(42); + foo(42); +} diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/check-error.stderr b/prusti-tests/tests/runtime_checks/fail/predicates/check-error.stderr new file mode 100644 index 00000000000..cee5da1aebe --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/check-error.stderr @@ -0,0 +1,30 @@ +error: [Prusti: invalid specification] Referring to predicate that is not runtime checkable in specifications that should be runtime checked is not allowed + --> $DIR/check-error.rs:14:12 + | +14 | #[requires(some_pred(_x))] + | ^^^^^^^^^ + | +note: this predicate can not be checked at runtime, make sure it has a body and mark it with #[insert_runtime_check] + --> $DIR/check-error.rs:6:5 + | +6 | / fn some_pred(x: i32) -> bool { +7 | | x == 42 +8 | | } + | |_____^ + +error: [Prusti: invalid specification] Referring to predicate that is not runtime checkable in specifications that should be runtime checked is not allowed + --> $DIR/check-error.rs:20:43 + | +20 | prusti_assert!(#[insert_runtime_check]some_pred(x)) + | ^^^^^^^^^ + | +note: this predicate can not be checked at runtime, make sure it has a body and mark it with #[insert_runtime_check] + --> $DIR/check-error.rs:6:5 + | +6 | / fn some_pred(x: i32) -> bool { +7 | | x == 42 +8 | | } + | |_____^ + +error: aborting due to 2 previous errors + diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate b/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate new file mode 100755 index 0000000000000000000000000000000000000000..bca4865c9bb594ab11cd44fb40510415e02ae0fc GIT binary patch literal 4665040 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

)6A=(*4$a2V9-og*D1K7EKE9gW{hDUk-g-k15D= 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%0DI-1oDrNYH=qJhk~(! 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 #BC<_ke03x(Cz&W)C0_H3HV0SUSt% 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 z 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%0D~N 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 z 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 Vfcd=~*9(~+;<#SS{FQJt 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 UJ+6{}?qm1sAurT!xc0U2Uw|m*cmMzZ literal 0 HcmV?d00001 diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.rs b/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.rs new file mode 100644 index 00000000000..930d1905285 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.rs @@ -0,0 +1,19 @@ +use prusti_contracts::*; + +// For this predicate to be checkable at runtime, the one it calls would also have to +// be checkable. +predicate!{ + #[insert_runtime_check] + fn not_even(x: i32) -> bool { + !even(x) //~ ERROR: Referring to predicate that is not runtime checkable + } +} + +predicate!{ + // #[insert_runtime_check] // this would fix it + fn even(x: i32) -> bool { + x % 2 == 0 + } +} + +fn main() {} diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.stderr b/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.stderr new file mode 100644 index 00000000000..743e35d4244 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.stderr @@ -0,0 +1,21 @@ + __ __ __ ___ + |__) _\/_ |__) | | /__` | ____\/_ | + | /\ | \ \__/ .__/ | /\ | + +Prusti version: 0.2.2, commit 5c05f2e639b 2023-09-13 13:08:47 UTC, built on 2023-09-18 08:28:38 UTC +error: [Prusti: invalid specification] Referring to predicate that is not runtime checkable in specifications that should be runtime checked is not allowed + --> $DIR/nested-predicate.rs:8:10 + | +8 | !even(x) + | ^^^^ + | +note: this predicate can not be checked at runtime, make sure it has a body and mark it with #[insert_runtime_check] + --> $DIR/nested-predicate.rs:14:5 + | +14 | / fn even(x: i32) -> bool { +15 | | x % 2 == 0 +16 | | } + | |_____^ + +error: aborting due to previous error + diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.rs b/prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.rs new file mode 100644 index 00000000000..c2563b18453 --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.rs @@ -0,0 +1,21 @@ +//@run: 101 +use prusti_contracts::*; + +// This test has 2 purposes: +// 1. Prusti's specification checker makes sure that predicates are not called from +// normal user code. With runtime checks this got a bit more complicated, since now +// predicates can (sometimes, after ast rewriting) be called from within user code. +// But then they're in a block starting with a #[check_only] marked closure. This test +// makes sure prusti properly recognizes this block +// 2. It also checks that the runtime check is properly executed and inserted +predicate!{ + #[insert_runtime_check] + fn even(x: i32) -> bool { + x % 2 == 0 + } +} + +#[trusted] +fn main() { + prusti_assert!(#[insert_runtime_check] even(3)); +} diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.stderr b/prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.stderr new file mode 100644 index 00000000000..a5633d9d21a --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.stderr @@ -0,0 +1,3 @@ +thread 'main' panicked at $DIR/predicate-assert.rs:20:44: +Prusti Runtime Checks: Contract prusti_assert!(even(3)) was violated at runtime +note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.stdout b/prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.stdout new file mode 100644 index 00000000000..7987b8b66ae --- /dev/null +++ b/prusti-tests/tests/runtime_checks/fail/predicates/predicate-assert.stdout @@ -0,0 +1 @@ +predicate even is executed diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/simple.rs b/prusti-tests/tests/runtime_checks/fail/predicates/predicate-pre.rs similarity index 100% rename from prusti-tests/tests/runtime_checks/fail/predicates/simple.rs rename to prusti-tests/tests/runtime_checks/fail/predicates/predicate-pre.rs diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/simple.stderr b/prusti-tests/tests/runtime_checks/fail/predicates/predicate-pre.stderr similarity index 74% rename from prusti-tests/tests/runtime_checks/fail/predicates/simple.stderr rename to prusti-tests/tests/runtime_checks/fail/predicates/predicate-pre.stderr index ae9772bc5fd..57e48651988 100644 --- a/prusti-tests/tests/runtime_checks/fail/predicates/simple.stderr +++ b/prusti-tests/tests/runtime_checks/fail/predicates/predicate-pre.stderr @@ -1,3 +1,3 @@ -thread 'main' panicked at $DIR/simple.rs:18:1: +thread 'main' panicked at $DIR/predicate-pre.rs:18:1: Prusti Runtime Checks: Contract #[requires(is_even(x))] was violated at runtime note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/simple.stdout b/prusti-tests/tests/runtime_checks/fail/predicates/predicate-pre.stdout similarity index 64% rename from prusti-tests/tests/runtime_checks/fail/predicates/simple.stdout rename to prusti-tests/tests/runtime_checks/fail/predicates/predicate-pre.stdout index 304645d659a..f2dcde62818 100644 --- a/prusti-tests/tests/runtime_checks/fail/predicates/simple.stdout +++ b/prusti-tests/tests/runtime_checks/fail/predicates/predicate-pre.stdout @@ -1,2 +1,4 @@ check function prusti_pre_check_item_foo is performed +predicate is_even is executed check function prusti_pre_check_item_foo is performed +predicate is_even is executed diff --git a/prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.stderr b/prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.stderr index d3886f710ef..dfab8794380 100644 --- a/prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.stderr +++ b/prusti-tests/tests/runtime_checks/pass/compilation/warn-unsupported-snapeq.stderr @@ -1,4 +1,4 @@ -warning: Runtime checks: Use of unsupported feature snapshot_equality(& (x), & (y)) +warning: Feature snapshot_equality(& (x), & (y)) is not supported for runtime checks, behavior at runtime might be arbitrary --> $DIR/warn-unsupported-snapeq.rs:17:12 | 17 | #[requires(x === y)] diff --git a/prusti-tests/tests/runtimetest.rs b/prusti-tests/tests/runtimetest.rs index 087569961ef..ad39c9cc2ea 100644 --- a/prusti-tests/tests/runtimetest.rs +++ b/prusti-tests/tests/runtimetest.rs @@ -46,6 +46,7 @@ impl TestKind { let prusti_path: PathBuf = find_prusti_rustc_path(); let mut prusti_cmd = CommandBuilder { out_dir_flag: Some("--out-dir".into()), + args: vec!["--error-format=json".into()], ..CommandBuilder::cmd(prusti_path) }; @@ -54,9 +55,10 @@ impl TestKind { prusti_cmd .envs .push(("PRUSTI_FULL_COMPILATION".into(), Some("true".into()))); - prusti_cmd - .envs - .push(("PRUSTI_INSERT_RUNTIME_CHECKS".into(), Some("true".into()))); + prusti_cmd.envs.push(( + "PRUSTI_INSERT_RUNTIME_CHECKS".into(), + Some("selective".into()), + )); prusti_cmd .envs .push(("PRUSTI_DEBUG_RUNTIME_CHECKS".into(), Some("true".into()))); diff --git a/prusti-tests/tests/verify/ui/predicate.stdout b/prusti-tests/tests/verify/ui/predicate.stdout index 1164fc9e071..8302974e170 100644 --- a/prusti-tests/tests/verify/ui/predicate.stdout +++ b/prusti-tests/tests/verify/ui/predicate.stdout @@ -41,7 +41,7 @@ fn prusti_pred_item_true_p1_$(NUM_UUID)() -> bool { }; prusti_result } -#[allow(unused_must_use, unused_variables, dead_code)] +#[allow(unused_must_use, unused_variables, dead_code, forgetting_copy_types)] #[prusti::pred_spec_id_ref = "$(NUM_UUID)"] #[prusti::specs_version = $(SPECS_VERSION)] fn true_p1() -> bool { @@ -62,7 +62,7 @@ fn prusti_pred_item_true_p2_$(NUM_UUID)() -> bool { }; prusti_result } -#[allow(unused_must_use, unused_variables, dead_code)] +#[allow(unused_must_use, unused_variables, dead_code, forgetting_copy_types)] #[prusti::pred_spec_id_ref = "$(NUM_UUID)"] #[prusti::specs_version = $(SPECS_VERSION)] fn true_p2() -> bool { @@ -84,7 +84,7 @@ fn prusti_pred_item_forall_identity_$(NUM_UUID)() }; prusti_result } -#[allow(unused_must_use, unused_variables, dead_code)] +#[allow(unused_must_use, unused_variables, dead_code, forgetting_copy_types)] #[prusti::pred_spec_id_ref = "$(NUM_UUID)"] #[prusti::specs_version = $(SPECS_VERSION)] fn forall_identity() -> bool { @@ -107,7 +107,7 @@ fn prusti_pred_item_exists_identity_$(NUM_UUID)() }; prusti_result } -#[allow(unused_must_use, unused_variables, dead_code)] +#[allow(unused_must_use, unused_variables, dead_code, forgetting_copy_types)] #[prusti::pred_spec_id_ref = "$(NUM_UUID)"] #[prusti::specs_version = $(SPECS_VERSION)] fn exists_identity() -> bool { @@ -168,7 +168,7 @@ fn prusti_pred_item_false_p_$(NUM_UUID)() -> bool { let prusti_result: bool = { false }; prusti_result } -#[allow(unused_must_use, unused_variables, dead_code)] +#[allow(unused_must_use, unused_variables, dead_code, forgetting_copy_types)] #[prusti::pred_spec_id_ref = "$(NUM_UUID)"] #[prusti::specs_version = $(SPECS_VERSION)] fn false_p() -> bool { diff --git a/prusti-utils/src/config.rs b/prusti-utils/src/config.rs index f4e134e8da6..6f66bd35698 100644 --- a/prusti-utils/src/config.rs +++ b/prusti-utils/src/config.rs @@ -146,9 +146,8 @@ lazy_static::lazy_static! { settings.set_default("cargo_path", "cargo").unwrap(); settings.set_default("cargo_command", "check").unwrap(); - settings.set_default("insert_runtime_checks", "false").unwrap(); + settings.set_default("insert_runtime_checks", "never").unwrap(); settings.set_default("debug_runtime_checks", "false").unwrap(); - settings.set_default("runtime_check_all_contracts", "false").unwrap(); settings.set_default("remove_dead_code", "false").unwrap(); // Flags for testing. @@ -1036,26 +1035,25 @@ pub fn num_errors_per_function() -> u32 { read_setting("num_errors_per_function") } -/// When enabled, insert runtime checks into generated executables +/// Whether checks for contracts should be inserted into the generated +/// executables +/// Options: +/// * `never`: don't check any contracts, even if annotated +/// * `selective`: check the contracts annotated with #[insert_runtime_check] attribute +/// * `all`: check all contracts. Note: if any contract contains unsupported features +/// this will fail. /// for methods marked with #[insert_runtime_check] -pub fn insert_runtime_checks() -> bool { +pub fn insert_runtime_checks() -> String { read_setting("insert_runtime_checks") } /// When enabled, runtime check will print messages to stdout /// when they are executed. Used to check that they are -/// properly inserted / performed +/// properly inserted / performed, for example for tests pub fn debug_runtime_checks() -> bool { read_setting("debug_runtime_checks") } -/// When enabled, instead of having to mark every method with -/// #[insert_runtime_check] for it to be checked at runtime, -/// simply try to check all contracts at runtime -pub fn runtime_check_all_contracts() -> bool { - read_setting("runtime_check_all_contracts") -} - /// Try to use verification to identify unused blocks and eliminate them pub fn remove_dead_code() -> bool { read_setting("remove_dead_code") diff --git a/prusti/src/callbacks.rs b/prusti/src/callbacks.rs index d7ddd0a0c4c..8339cab83db 100644 --- a/prusti/src/callbacks.rs +++ b/prusti/src/callbacks.rs @@ -90,7 +90,7 @@ pub(crate) fn mir_drops_elaborated(tcx: TyCtxt<'_>, def: LocalDefId) -> &Steal, def: LocalDefId) -> &Steal, def: LocalDefId) -> &Steal( passes::PreconditionInserter::run(tcx, &mir_info, def_id, local_decls, body); // insert postconditions passes::PostconditionInserter::run(tcx, &mir_info, def_id, local_decls, body); - // replace predicates with their check functions: - passes::PredicateReplacer::run(tcx, &mir_info, def_id, body); // insert cloning of arguments if they are used within old, and drop them again old_arg_replacer.clone_and_drop_variables(body); diff --git a/prusti/src/modify_mir/passes/mod.rs b/prusti/src/modify_mir/passes/mod.rs index 4d8f941d53d..69e04c1fe7f 100644 --- a/prusti/src/modify_mir/passes/mod.rs +++ b/prusti/src/modify_mir/passes/mod.rs @@ -3,11 +3,9 @@ mod insert_pledge_checks; mod insert_postconditions; mod replace_old_args; mod remove_dead_code; -mod replace_predicates; pub(crate) use insert_pledge_checks::{PledgeInserter, PledgeToProcess}; pub(crate) use insert_postconditions::PostconditionInserter; pub(crate) use insert_precondition_checks::PreconditionInserter; pub(crate) use remove_dead_code::DeadCodeElimination; pub(crate) use replace_old_args::CloneOldArgs; -pub(crate) use replace_predicates::PredicateReplacer; diff --git a/prusti/src/modify_mir/passes/replace_predicates.rs b/prusti/src/modify_mir/passes/replace_predicates.rs deleted file mode 100644 index 76065f8799b..00000000000 --- a/prusti/src/modify_mir/passes/replace_predicates.rs +++ /dev/null @@ -1,85 +0,0 @@ -use crate::modify_mir::mir_info_collector::MirInfo; -use prusti_interface::{environment::EnvQuery, utils}; -use prusti_rustc_interface::{ - middle::{ - mir::{self, visit::MutVisitor}, - ty::{self, TyCtxt}, - }, - span::{def_id::DefId, DUMMY_SP}, -}; - -pub(crate) struct PredicateReplacer<'tcx, 'a> { - tcx: TyCtxt<'tcx>, - env_query: EnvQuery<'tcx>, - body_info: &'a MirInfo<'tcx>, - is_check_fn: bool, -} - -impl<'tcx, 'a> PredicateReplacer<'tcx, 'a> { - /// If any check function calls a predicate, we want to replace it with - /// a call to the check function that is generated for that predicate - pub(crate) fn run( - tcx: TyCtxt<'tcx>, - body_info: &'a MirInfo<'tcx>, - def_id: DefId, - body: &mut mir::Body<'tcx>, - ) { - // 1. figure out if this itself is a check function: - let env_query = EnvQuery::new(tcx); - let is_check_fn = utils::has_check_only_attr(env_query.get_attributes(def_id)); - let mut replacer = Self { - tcx, - env_query, - body_info, - is_check_fn, - }; - replacer.visit_body(body); - } -} - -impl<'tcx, 'a> MutVisitor<'tcx> for PredicateReplacer<'tcx, 'a> { - fn tcx(&self) -> TyCtxt<'tcx> { - self.tcx - } - - fn visit_terminator( - &mut self, - terminator: &mut mir::Terminator<'tcx>, - location: mir::Location, - ) { - if let mir::TerminatorKind::Call { func, .. } = &mut terminator.kind { - if !self.is_check_fn && !self.body_info.check_blocks.contains(&location.block) { - // If predciates are called outside of check blocks or functions, this is none - // of our business here. This might be inside a spec function (which is legal) - // or in the worse case, in normal user code, but this doesnt need to - // be handled here. - return; - } - if let Some((call_id, generics)) = func.const_fn_def() { - // check if the called function is a predicate, and also if it has - let attrs = self.env_query.get_attributes(call_id); - if !utils::has_prusti_attr(attrs, "pred_spec_id_ref") { - // not a predicate, nothing to be done - return; - } - if let Some(check_id) = self.body_info.specs.get_predicate_check(&call_id) { - let func_ty = self - .tcx - .mk_ty_from_kind(ty::TyKind::FnDef(check_id, generics)); - let check_func = mir::Operand::Constant(Box::new(mir::Constant { - span: DUMMY_SP, - user_ty: None, - literal: mir::ConstantKind::zero_sized(func_ty), - })); - // replace the call to the predicate with the call to the - // runtime checked predicate - *func = check_func; - } else { - // if we don't panic here, this will lead to a panic at runtime - // stating that the predicate has no body. Better? - panic!("Tried to execute a predicate in a runtime check, but for predicates to be exeuctable they need to be marked with #[insert_runtime_check]"); - } - } - } - } -} From 2f5d8e68200e2265d620342d077f2aab52e2d3c2 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Wed, 20 Sep 2023 14:54:14 +0200 Subject: [PATCH 43/45] Add new flags to dev-guide --- docs/dev-guide/src/config/flags.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/docs/dev-guide/src/config/flags.md b/docs/dev-guide/src/config/flags.md index 016c02a79ca..fe794ceb5b2 100644 --- a/docs/dev-guide/src/config/flags.md +++ b/docs/dev-guide/src/config/flags.md @@ -14,6 +14,7 @@ | [`CHECK_PANICS`](#check_panics) | `bool` | `true` | A | | [`CHECK_TIMEOUT`](#check_timeout) | `Option` | `None` | A | | [`COUNTEREXAMPLE`](#counterexample) | `bool` | `false` | A | +| [`DEBUG_RUNTIME_CHECKS`](#debug_runtime_checks) | `bool` | `false` | A | | [`DELETE_BASIC_BLOCKS`](#delete_basic_blocks) | `Vec` | `vec![]` | A | | [`DISABLE_NAME_MANGLING`](#disable_name_mangling) | `bool` | `false` | A | | [`DUMP_BORROWCK_INFO`](#dump_borrowck_info) | `bool` | `false` | A | @@ -34,6 +35,7 @@ | [`FULL_COMPILATION`](#full_compilation) | `bool` | `false` | A* | | [`HIDE_UUIDS`](#hide_uuids) | `bool` | `false` | A | | [`IGNORE_REGIONS`](#ignore_regions) | `bool` | `false` | A | +| [`INSERT_RUNTIME_CHECKS`](#insert_runtime_checks) | `string` | `"none"` | A | | [`INTERNAL_ERRORS_AS_WARNINGS`](#internal_errors_as_warnings) | `bool` | `false` | A | | [`INTERN_NAMES`](#intern_names) | `bool` | `true` | A | | [`JAVA_HOME`](#java_home) | `Option` | `None` | A | @@ -56,6 +58,7 @@ | [`PRINT_HASH`](#print_hash) | `bool` | `false` | A | | [`PRINT_TYPECKD_SPECS`](#print_typeckd_specs) | `bool` | `false` | A | | [`QUIET`](#quiet) | `bool` | `false` | A* | +| [`REMOVE_DEAD_CODE`](#remove_dead_code) | `bool` | `false` | A | | [`SERVER_ADDRESS`](#server_address) | `Option` | `None` | A | | [`SERVER_MAX_CONCURRENCY`](#server_max_concurrency) | `Option` | `None` | A | | [`SERVER_MAX_STORED_VERIFIERS`](#server_max_stored_verifiers) | `Option` | `None` | A | @@ -81,6 +84,7 @@ | [`VIPER_HOME`](#viper_home) | `Option` | `None` | A | | [`WRITE_SMT_STATISTICS`](#write_smt_statistics) | `bool` | `false` | A | + ## `ALLOW_UNREACHABLE_UNSUPPORTED_CODE` When enabled, unsupported code is encoded as `assert false`. This way error messages are reported only for unsupported code that is actually reachable. @@ -142,6 +146,10 @@ For more information see [here]( https://github.com/viperproject/silicon/blob/4c When enabled, Prusti will try to find and print a counterexample for any failed assertion or specification. +## `DEBUG_RUNTIME_CHECKS` + +When enabled, functions generated for runtime checking will emit a message when they are executed. + ## `DELETE_BASIC_BLOCKS` The given basic blocks will be replaced with `assume false`. @@ -233,6 +241,15 @@ When enabled, UUIDs of expressions and specifications printed with [`PRINT_TYPEC When enabled, debug files dumped by `rustc` will not contain lifetime regions. +## `INSERT_RUNTIME_CHECKS` + +Whether or not to enable runtime checks. Accepts one of the following values: + +- `"none"`: default option, no runtime checks will be inserted. +- `"selective"`: only contracts marked with `#[insert_runtime_check]` will be checked. +- `"all"`: all supported contracts will be runtime checked. + + ## `INTERNAL_ERRORS_AS_WARNINGS` When enabled, internal errors are presented as warnings. @@ -358,6 +375,10 @@ When enabled, user messages are not printed. Otherwise, messages output into `st > **Note:** `cargo prusti` sets this flag with `DEFAULT_PRUSTI_QUIET=true`. +## `REMOVE_DEAD_CODE` + +When enabled, Prusti will perform some optimizations on the generated executable by removing unreachable code and unneeded assertions and their corresponding checked operations. + ## `SERVER_ADDRESS` When set to an address and port (e.g. `"127.0.0.1:2468"`), Prusti will connect to the given server and use it for its verification backend. From 2c92e1a0dd8a0d754b934156503e7225ffe6e6ef Mon Sep 17 00:00:00 2001 From: cedihegi Date: Mon, 9 Oct 2023 15:52:37 +0200 Subject: [PATCH 44/45] Remove prints, add comments, slight adjustment of old_values --- .../runtime_checks/associated_function_info.rs | 9 +++++++-- .../src/runtime_checks/translation.rs | 7 +++++-- .../fail/predicates/nested-predicate.rs | 1 + .../fail/predicates/nested-predicate.stderr | 17 ++++++----------- prusti/src/modify_mir/mir_modifications.rs | 9 --------- 5 files changed, 19 insertions(+), 24 deletions(-) diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs b/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs index ab351c2f1e4..ad69d9d6b49 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/associated_function_info.rs @@ -65,9 +65,14 @@ pub(crate) fn create_argument(arg: &syn::FnArg, index: usize) -> syn::Result { if let syn::Pat::Ident(pat_ident) = *pat.clone() { - let is_mutable = pat_ident.mutability.is_some(); + let mut is_mutable = pat_ident.mutability.is_some(); - let is_ref = matches!(**ty, syn::Type::Reference(_)); + let is_ref = if let box syn::Type::Reference(ty_ref) = ty { + is_mutable = is_mutable || ty_ref.mutability.is_some(); + true + } else { + false + }; let arg = Argument { name: pat_ident.ident.to_string(), ty: *ty.clone(), diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index d1ca9d02226..51b98e22c53 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -345,9 +345,12 @@ impl VisitMut for CheckVisitor { if let Some(ident) = expr_path.path.get_ident() { let name = ident.to_token_stream().to_string(); if let Some(arg) = self.function_info.get_mut_arg(&name) { - // argument used within an old expression? + // Does argument need to be evaluated in its old state? + // Yes if: it occurrs within old and is a mutable ref OR + // its not a reference (this is unfortunately not always determined + // correctly because of type aliases) if self.check_type.gets_old_args() - && (self.within_old || (!arg.is_ref && arg.is_mutable)) + && ((self.within_old && arg.is_ref && arg.is_mutable) || !arg.is_ref) { // if it was not already marked to be stored // needs to be checked for indeces to be correct diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.rs b/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.rs index 930d1905285..f09cf2d7a6d 100644 --- a/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.rs +++ b/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.rs @@ -1,3 +1,4 @@ +//@compile-flags: -Pquiet=true use prusti_contracts::*; // For this predicate to be checkable at runtime, the one it calls would also have to diff --git a/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.stderr b/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.stderr index 743e35d4244..855cc5bcda5 100644 --- a/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.stderr +++ b/prusti-tests/tests/runtime_checks/fail/predicates/nested-predicate.stderr @@ -1,20 +1,15 @@ - __ __ __ ___ - |__) _\/_ |__) | | /__` | ____\/_ | - | /\ | \ \__/ .__/ | /\ | - -Prusti version: 0.2.2, commit 5c05f2e639b 2023-09-13 13:08:47 UTC, built on 2023-09-18 08:28:38 UTC error: [Prusti: invalid specification] Referring to predicate that is not runtime checkable in specifications that should be runtime checked is not allowed - --> $DIR/nested-predicate.rs:8:10 + --> $DIR/nested-predicate.rs:9:10 | -8 | !even(x) +9 | !even(x) | ^^^^ | note: this predicate can not be checked at runtime, make sure it has a body and mark it with #[insert_runtime_check] - --> $DIR/nested-predicate.rs:14:5 + --> $DIR/nested-predicate.rs:15:5 | -14 | / fn even(x: i32) -> bool { -15 | | x % 2 == 0 -16 | | } +15 | / fn even(x: i32) -> bool { +16 | | x % 2 == 0 +17 | | } | |_____^ error: aborting due to previous error diff --git a/prusti/src/modify_mir/mir_modifications.rs b/prusti/src/modify_mir/mir_modifications.rs index 4b2cbb69f48..284ff3f54d6 100644 --- a/prusti/src/modify_mir/mir_modifications.rs +++ b/prusti/src/modify_mir/mir_modifications.rs @@ -146,13 +146,8 @@ pub trait MirModifier<'tcx> { arg.ty(self.local_decls(), self.tcx()).ty }; let mutable_ref = matches!(arg_ty.ref_mutability(), Some(mir::Mutability::Mut)); - println!("arg type: {:?}", arg_ty); let dest = destination.unwrap_or_else(|| self.patcher().new_temp(arg_ty, DUMMY_SP)); - println!( - "trying to clone arg: {:?} into destination: {:?}", - arg, dest - ); if !arg_ty.is_ref() { // non-ref arg means we first deref and then clone. // destination only needs to be dropped if it's not later passed into @@ -200,10 +195,6 @@ pub trait MirModifier<'tcx> { .needs_drop(self.tcx(), param_env) .then_some(clone_dest); - println!( - "dereferenced type: {:?}, needs drop? {:?}", - deref_ty, to_drop - ); let generics = self.tcx().mk_args(&[ty::GenericArg::from(deref_ty)]); let clone_args = vec![Operand::Move(arg)]; // add an additional simple block afterwards, that dereferences From 6279743d518e426562769c994d027aa2c39d7d23 Mon Sep 17 00:00:00 2001 From: cedihegi Date: Thu, 26 Oct 2023 16:22:46 +0200 Subject: [PATCH 45/45] Small changes and fixes --- .../src/runtime_checks/boundary_extraction.rs | 25 +++++---- .../src/runtime_checks/translation.rs | 9 ++- .../encoder/specification_blocks.rs | 7 ++- .../modify_mir/passes/insert_pledge_checks.rs | 8 --- .../modify_mir/passes/remove_check_blocks.rs | 56 +++++++++++++++++++ 5 files changed, 84 insertions(+), 21 deletions(-) create mode 100644 prusti/src/modify_mir/passes/remove_check_blocks.rs diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs index 89b35b446b7..11a3b7a665a 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/boundary_extraction.rs @@ -75,13 +75,10 @@ pub(crate) fn derive_ranges( let boundary_extractor = BoundExtractor { name_set }; for (name, ty) in args.iter() { let range_expr: syn::ExprRange = if utils::is_primitive_number(ty) { - let bounds = boundary_extractor.extract_bounds_recursive(&bounds_expr, name); + let bounds = boundary_extractor.extract_bounds_recursive(&bounds_expr, name, false); let mut upper_bound_opt = None; let mut lower_bound_opt = None; - // if there are multiple variables, potentially with dependencies - // the loops need to be in a specific order - assert!(bounds.len() <= 2); let mut include_upper = true; // if we have the MAX upper limit, for Boundary { kind, @@ -211,7 +208,7 @@ pub fn split_implication_lhs(expr: &syn::Expr) -> Option { } } impl BoundExtractor { - fn extract_bounds_recursive(&self, expr: &syn::Expr, name: &String) -> Vec { + fn extract_bounds_recursive(&self, expr: &syn::Expr, name: &String, exclude_conjunctions: bool) -> Vec { let simplified = simplify_expression(expr); match simplified { syn::Expr::Binary(syn::ExprBinary { @@ -223,10 +220,15 @@ impl BoundExtractor { match op { // combining results of and: syn::BinOp::And(_) => { - let mut left_bound = self.extract_bounds_recursive(&left, name); - let mut right_bound = self.extract_bounds_recursive(&right, name); - left_bound.append(&mut right_bound); - left_bound + // stop processing conjunctions if we are "below" a NOT operation + if !exclude_conjunctions { + let mut left_bound = self.extract_bounds_recursive(&left, name, exclude_conjunctions); + let mut right_bound = self.extract_bounds_recursive(&right, name, exclude_conjunctions); + left_bound.append(&mut right_bound); + left_bound + } else { + vec![] + } } // generate boundaries from comparisons if one of the sides // is the name we are currently looking for @@ -258,7 +260,10 @@ impl BoundExtractor { expr: box sub_expr, .. }) => { - let sub_bounds = self.extract_bounds_recursive(&sub_expr, name); + // For a NOT expression, we can not further derive boundaries from conjunctions + // becuase e.g. !(x < 5 && x > 10) is trivially true, but we would derive the range + // 5..10 + let sub_bounds = self.extract_bounds_recursive(&sub_expr, name, true); // invert all the boundaries derived of the sub_expression sub_bounds .iter() diff --git a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs index 51b98e22c53..2305b30e847 100644 --- a/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs +++ b/prusti-contracts/prusti-specs/src/runtime_checks/translation.rs @@ -189,6 +189,10 @@ pub(crate) fn translate_predicate( // get signature information about the associated function let function_info = AssociatedFunctionInfo::empty(); let mut visitor = CheckVisitor::new(function_info, check_type); + // For predicates, we can never extend the error message with additional information + // since we don't have access to it. + // Therefore we never consider a predicate to be part of the "outermost" conjunction + visitor.is_outer = false; // make the expression checkable at runtime: let mut expr: syn::Expr = syn::parse2(body.clone())?; @@ -350,7 +354,7 @@ impl VisitMut for CheckVisitor { // its not a reference (this is unfortunately not always determined // correctly because of type aliases) if self.check_type.gets_old_args() - && ((self.within_old && arg.is_ref && arg.is_mutable) || !arg.is_ref) + && !arg.is_ref || self.within_old && arg.is_mutable { // if it was not already marked to be stored // needs to be checked for indeces to be correct @@ -451,7 +455,8 @@ impl VisitMut for CheckVisitor { | "snapshot_equality" | ":: prusti_contracts :: snap" | "prusti_contracts :: snap" - | "snap" => { + | "snap" + | "model" => { let message = format!( "Feature {} is not supported for runtime checks, behavior at runtime might be arbitrary", expr.to_token_stream() diff --git a/prusti-viper/src/encoder/mir/procedures/encoder/specification_blocks.rs b/prusti-viper/src/encoder/mir/procedures/encoder/specification_blocks.rs index c7912742909..d9dfd4255bb 100644 --- a/prusti-viper/src/encoder/mir/procedures/encoder/specification_blocks.rs +++ b/prusti-viper/src/encoder/mir/procedures/encoder/specification_blocks.rs @@ -1,6 +1,6 @@ use prusti_interface::environment::{ is_ghost_begin_marker, is_ghost_end_marker, is_loop_invariant_block, is_loop_variant_block, - is_marked_specification_block, EnvQuery, Procedure, + is_marked_specification_block, EnvQuery, Procedure, is_marked_check_block, }; use prusti_rustc_interface::{data_structures::graph::WithSuccessors, middle::mir}; use std::collections::{BTreeMap, BTreeSet}; @@ -38,10 +38,14 @@ impl SpecificationBlocks { ) -> Self { // Blocks that contain closures marked with `#[spec_only]` attributes. let mut marked_specification_blocks = BTreeSet::new(); + let mut check_blocks = BTreeSet::new(); for (bb, block) in body.basic_blocks.iter_enumerated() { if is_marked_specification_block(env_query, block) { marked_specification_blocks.insert(bb); } + if is_marked_check_block(env_query, block) { + check_blocks.insert(bb); + } } let mut specification_blocks = marked_specification_blocks; @@ -118,6 +122,7 @@ impl SpecificationBlocks { for successor in body.basic_blocks.successors(bb) { if specification_blocks.contains(&successor) && !loop_spec_blocks_flat.contains(&successor) + && !check_blocks.contains(&successor) // no entry blocks for check_blocks { specification_entry_blocks.insert(successor); } diff --git a/prusti/src/modify_mir/passes/insert_pledge_checks.rs b/prusti/src/modify_mir/passes/insert_pledge_checks.rs index 0554d8a211e..1b600cfb7b1 100644 --- a/prusti/src/modify_mir/passes/insert_pledge_checks.rs +++ b/prusti/src/modify_mir/passes/insert_pledge_checks.rs @@ -165,11 +165,6 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { if let Some(place) = pledge_loans.get(loan) { // a pledge is associated with this loan and dies here!! modification_list.push((ExpirationLocation::Location(location), *place)); - let pledge = self.pledges_to_process.get(place).unwrap(); - println!( - "Pledge for function {} is associated with loan {:?} and dies at {:?}", - pledge.name, loan, location - ); } } // For switchInts, also look at the expirations of loans on edges, since @@ -278,7 +273,6 @@ impl<'tcx, 'a> PledgeInserter<'tcx, 'a> { } _ => { // Can pledges expire at other kinds of terminators? - println!("Encountered a pledge expiring at terminator: {:#?}, expiring at location: {:?}", term, location); todo!() } } @@ -392,7 +386,6 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { let result_ty = destination.ty(self.local_decls(), self.tcx).ty; let result_copy_place = mir::Place::from(self.patcher().new_temp(result_ty, DUMMY_SP)); - println!("Pledge result type: {:?}", result_ty); // create a guard local let bool_ty = self.tcx.mk_ty_from_kind(ty::TyKind::Bool); @@ -421,7 +414,6 @@ impl<'tcx, 'a> MutVisitor<'tcx> for PledgeInserter<'tcx, 'a> { self.pledges_to_process .insert(*destination, pledge_to_process); } else { - println!("found pledge call, now prepending cloning"); let mut pledge = self.pledges_to_process.remove(destination).unwrap(); // create the clones of old that will be passed to // the check function. Make the chain end with the diff --git a/prusti/src/modify_mir/passes/remove_check_blocks.rs b/prusti/src/modify_mir/passes/remove_check_blocks.rs new file mode 100644 index 00000000000..019387a3f61 --- /dev/null +++ b/prusti/src/modify_mir/passes/remove_check_blocks.rs @@ -0,0 +1,56 @@ +use crate::modify_mir::mir_helper::is_check_block; +use prusti_interface::{ + environment::{blocks_dominated_by, is_check_closure, EnvQuery, Environment}, + globals, + specs::typed::DefSpecificationMap, +}; +use prusti_rustc_interface::{ + index::IndexVec, + middle::{ + mir::{self, patch::MirPatch, visit::MutVisitor}, + ty::{self, TyCtxt}, + }, + span::{def_id::DefId, DUMMY_SP}, +}; + +pub struct RemoveCheckBlocks<'tcx> { + env_query: EnvQuery<'tcx>, +} + +struct SwitchIntBlock { + block: mir::BasicBlock, + check_target: mir::BasicBlock, +} + +impl<'tcx> RemoveCheckBlocks<'tcx> { + fn run(tcx: TyCtxt<'tcx>, body: &mut mir::Body<'tcx>) -> Result<(), ()> { + let mut adjust_blocks = vec![]; + let env_query = EnvQuery::new(tcx); + // identify switchInts in front of check_blocks + for (bb, bb_data) in body.basic_blocks.iter_enumerated() { + if let Some( + term @ mir::Terminator { + kind: mir::TerminatorKind::SwitchInt { .. }, + .. + }, + ) = bb_data.terminator + { + for target_bb in term.successors() { + let bb_data = body.basic_blocks.basic_blocks.get(target_bb).unwrap(); + if is_check_block(env_query, bb_data) { + adjust_blocks.push(SwitchIntBlock { + block: bb, + check_target: target_bb, + }) + } + } + } + } + // simplify the switchInt blocks: + for remove_target in adjust_blocks.into_iter() { + + } + + Ok(()) + } +}

Ws|5UC@^2bkUP{DL8@ySqQ<^E3vR6#1JK?PMo?*CL^ z6}0<52{L=X6&o-JNo}^=>J8qbN}Ci z$S;%i<@Eor0S=O&(*K*I{|}Tfm6G~DRZJ;GjQ&q8p@Qsoy(E1F#;%uKFiyP`f^q7l z1Wc^|Ux>yvQKnKzsi6N;UAZvo|5Rt?6e;z8sw;88sw0!?D2Ev8|5P{6DY;harhxp| z{l6HDa}?&u`x}h{(m_n%Ux)^-+(yG ziNkoj<0r|K97l6IA(;cn@+HU-dwT^brUoRFg@;wAfY@bnTTL7QG1I97DiOrY^s_Ya zGst54fB`Xc{2EPMcdZ>}2*QBarQHHe%my*jxKtCUVkd~1@Cr?g z0}$6aU(Hsk_eL13tK(>Y@ZE#(pbwLy(%a!0Fj^JKLkYy zi0l)?31Sh5?78PAh?_uUZ@VTz3$24IS6hXz|@dXjFs3$~K6K+qD`%iFR4fk_YXV6=Sa&5Dq=+qpU z+D}o|Z;2rDo(YN?C4i0*Gz4o`y~p05cnK87OG1Tb8)`$}gP$vZ0rVk;v7NB={ncWG zr>s7LJa!@|_JhI`u+vi+;W^P7?%%ad5ZAXuNk8FKHX<+4?g?VR$Yi8~y>qn;3KsMU zeL@fE`A7h}?&=r}x=Y&PXE}bntMHTC4tFs=)vC1{1BJK%l>VirkHY_3WFLW6QUS}X zZpk7&4IiO@e1Z_4gK(?E``T?n90QU4_&q}OoMPE$-zUUZAj0o{Mu_)8WPfU|5MP4G zKJs~_03v(-LLugY$Zlfy*9S!Q2Ywb}Cy4AdeiLEXk9IPCmikE3nKjb5t>*GBKz&PXks0R?91-bg!gXCUU82mnoqIp zrPDO=8;Jbeb3YaWAhI8uu8AHqEc=3DO&kFc{>V&Cd zz2$B^`VLAj)UsjLmdq?z(bKd@H@u_?db$8xRT7#08%<0ttgX;%*6Y86U;tVIl8b*jrO%t-$GvA>tDxX2@U9_*fU$ zfmr6G$0S34TE00rA}$A!%*PIauE>fZ!ze>`Y_E>Y7sr8?%qKx)8`b=f%nKkg6?8=A z0xglue~C9?U5;B^^+BlCL^feJbixIim{ zQIPp|8G);vtDq(G2-i`C-WB90|JHc^*Z^?R@lJ zUHl!y?YtQ89@qn7nHS2CP;a4~*B%-X*Mq2?UpWlVuv;-?7(YS0wpT~yU&Voz%wLDd z?pO0eGM@>Nsh}e=7ifuWB_eoOM&QW&Swx_MP6RH{ieMsSzF0;;N7c^QqJoypC!w8} z+A=@dTN4{(I7jAnA@e^Z=*WC1WYYli9T~UGD;$}3`V8-80kO6?TmPAX%3lh zRU@PE{A0-GX9>DxUT8@Sdv#=9I}WsD{v|}#QO3&oA(^j($W+h~nG3W;b{G+KlMy&F-+>5J(22kWS`j=7 znO`j@_o<~<yx5U>kFRu53}TrF4(Or}h-F?TL*g0_ty_j;-2x(+ zH^VoF%WRon1@YQm9hqMe2U;?(1(AKM=7-w(?+}>^IwEs{mdF|-f_*XqN9HCrgDU7m z-~z1(UW3e!%Lqa!mouKLpe6Gmka?vo^Y40VBAFHwFpkVGh0ME2&>7FqgluTzNX9Mm z?51`*zXu{NCo$95lJK=I@~|QzmCF@`2xtM9Zq`4xMg1I$ovtA_)`)y$-L(`x|j)KnHR{A zD-l}DPq`r?27;)ar;Nn`rY-Ygh}ZV&$o#H2(31JZ5ZOdEKP2-Uh)e|?k-0!iWc?Ar zoic(5vc+RdXGEZaP6RH{ieNotUMwTv%-ZX76=a!*=+!Vu%`BM*MnJsVWH?8>SrEe! zwK&dFJeR`pvhW>9)BIM7x50P#P&$ako4uE+#oqqh2hr}7;vI7%9+b3V$S_`pByF#b zc%O~~E%9Ct>2#E_Izx9aNJj-7>9{~kI^z*RHyMGmEX+p)D(FPu0<8!>gm?$Z2wY8C z1+6B%4dN}4;tlpelfFsKIc+&_h0I@8Bcq{v5@fSQ_36mG+>!Yqh`7`Dmdw4!VCiuX z47U7_<9|QdY0EDvSp0%cBeeW0M?}O6AZp%UjKglYIoDu@u^OVby*l!LGY+)me<#FO zTgK|h|2l|I1s(CZKudfx5J7zzfg}Ghh(HCM2wb2Q!RL^FcNqaMukGfof|mS$L?Lsi zkTj%hMR_ih;hZ653gmyc1f4d20>NICAeYgRe}N@2ED`_q1Kvsq;vr>pr7qqEvCJ!E zNK59wL*D0)v}8W`ChUf7nSYDy*j^o(e;Nl`GM^2R{if!JhLlMVnF=~0bAgt~UP1(( z&jcGs=Jz846?7tSfmQ^Ska+_cflKBpXvuso+I*QU^K7*FGh{eN=8r(;*GbTk`B=zi zss!CKuXJSI=#VbPfLP|Wf7HcL5XoF$1k3Nl&;Y;bur4xwk}l(6DISbYY8WG@eqjAr7z#)6*)J1+5YWhuc+wh|EFqH&myn514Lof zINw_iJ^BjZNb6brA0#`{s1gKCuNv@ifcuiBb^R7uWWQ6ChF^ zDt`1%1AJlK8NL{)m8}o-StpFZ;&n*!Sdlc%f(y#vrnWQ0fV^C3;4xm5bXL(VZZnm z#BpUt{P=PL805>lH_EiZDe#NXHDHh{wY1f!QC;fQ|A`+}eXH7A9`K7z-&pxk?O%WA7el_caMiBl zLI3TjUvxeOKUBj5VA&3UOR1)ysPVn0Yle6WM5S-s&=8|R)XpBo|30##{WZ!l#3&Hq z3-N!H?7(NXHAJm;up_J*r;;O=w5rR48unD||7tw{s{d2TgX-tE$pO**&H&428vZ{d zJLEHENR8g2FWvJq+|GOgzBA969N6nj>9~D>QIhFW#Je44t z&PM#xH1DNz62vYLl~K(@(#8bw7>IDyzPxTobju1cUX5L!JuD4Xf)dLrS};Z5|4q{C2@R6B;07ZczZk)5)Xn%+F#=T zjE7-|v^zW#5=%jGrO?N04v8fo?p{5%gv3TroG0(S$3x<$KP+6et726}quMW-8Wyua zl%a$8?>G(i$(RRcghf9PCwu^wQN>^&OEprp&89C3i-91DXes{n*Eu3ro#gHai!~sM z=kkxjVh;#*;d#6Z4u{J}3DIdZwtU~C4>z2MtGKsFrrGU6JO*NybMF^o>NLsJD-q&B z5W94HPKZ}Q%+!BDh_3S`Q|lEWrhwSx0Q8@IK9|MlO@yrKB$hTNhaX|P23D(Z{`ROQ=7E^G z2dA!=;`Ei7CUbEN`>bR}Vo6){ykst4q=|ok*xUJ;KJf;KndIp{aXW~a=6(HQ7KoWy z81nRAG3=3a9(p1q?tBal5R6F3l}DPWBW$}`;FNVBowSx~fzu#>3#6+LuIanAH1is| zsM`>!@6*EOXJ87zbO>rG!GmCiNbjVw>aZhAh|uYXq?r64(0qZbZqmej>4lf(h*9VV zcIl!nok;$oX?%Iaa~e2WZL_gdOmARck~j((%hb%>H{;Z(1>&ryWg5P|n(b3Kdy`+W zH?a+Y*4||4))>m`cG{afzS#{rTMIip`IJY%tCR>F71Mkr0s>EpfI(|-avT+D8{SUX z`#}}7_9jcAV#=dJ(tfZDj-71d>`h9rH?fVgH~A8>v5k9gQe;UiENWB^w|rO!y#pcD zWtL=h^Du&!+M>;ZXl=iaXj9@qOSI*XOu`LTw2o+Bhh$XHk&FwpB=ZR(NRbiLLp-cW zT8Ri$(22kWS`h?a#P&@_z|ycqtAdtjAH%kj;@djiAKvhx^6OD z0#zvqk#uxJBe1}BB*-p zYM(d{lyM=Lifb&j3%iVj{$(+UU2eS7Ctd(?4r)Rna}kJ{6|fv9hH7C5G%%!v;Rrgu z=M$4b9Kj>dz>pS(T^d6_GZMruD=K~B5Qt;j{F6`kp`+m8Ti9m<*5tc0+W(t@!AP(~ilsKfw;Y6E2y)z2LiH?O?ej~Fdq6I()n%lji+7-3bOLezSq;l^VyKb72i1@dsv(a0;=z7#FNj@Sf_L?jeNXy%@665L)e@`s zR=vxQ@AyTFl}NNU`nIdjRUf8$7gu&%%z115;%-pJWVA$AqAqW*eeM^ZgSbj=_{uNl zfmk3T4*11F5Q{1k>Z?8=mgsa?))Pa6-O+FTq74*T>@otDmx$?s!Zm?vYY>RN?KK3^dEk)6~u)b1D)6+ z5GNY)7-Af5&Tw|Zr&*dY9w{yZ^Du~OyHguWH^we^f_WFjE)Sn>h>akQU^~=iHJ~=* zsGsg?h|fXX5?$G;zNFQ=xCVSz&AD7$>9`n|H<#R8-ds%eVO%b*Fs{70T&ibWvAOc* za=E-wKnz@kd5$I)S2`|l)u&T^)UGhqd%I|OKs*Y{_&R<Ypm+kr%*Ypl;&~8zTLf+8ArQNKFV&RXD9+dr6k|c$D4J}x z6qW2U3d}1Yb~$rLP>cp~c3c^C6|Q=@RUgI=t!7scXLJ=TI#isT(Jvb(hF#)85$A` zK^(PynIZ8g$jTdZu8TojbM9K$7!r?wGD7%> zRqstu+k$wg*#}D<=wvhAM^iSTk0k{yk2`mRSq9q&OF=C7S!=`MV^GHF zNYs_lUfaW>FLZM(gFB!tUJ2qH)PcHqF>VyF%cEd+fXGEYL^%{&&-ZEjd0kM`{~hKH z?5FCyj?EHBaK2x>5Bj%b^J7go3d9jSizT3W@P827zf+$7e};J@3;in_O`U4NR}vB< zLCkm;gv1EYpHxX#yeRku(4Tm#UOJg2VR1L;pGP1(TcEe#kMDUuf^7;E7j4?1F)k6f zw%6gFfOr?wCQ0+oejqFwJ{Tsu^)RFNhjn3b^Lik7{8m1+_uI|ZiATm^^oRyfp3@-* zGat>fjxv}j{mDA8V5SugE9k(2nd@=zK!*>^%pPVPJ}~oQk#(xTOc*B$bgID2ARHpl zK>{=1KWQBoFjH@ibwI(zB<2nK`=y)-T)GvlGjr!x^|t~zR+E)av0p_Uag)C`1b*F%OP=2nE@ zP{h3Un+yd;c-pi_Eqr*MCa&#?Sl`EUapQ2i9z^!*1BUnk)P1?;4YoJLLm;y6`PmeM zaH0#l^=cY#Dl$0?)csn``^k7soQ`~weMpiaUI%sWp?SR*1VtW*>RloyP6>wtJ1?;61uot3- zgiK?mQos%XxqyG5fMs?8A4CDgA*+CICX{bV8vM z-i9s`lrbL7p{&d+8oVo+V{5(Q>UEO2A8((cXMf3?_1-3ZS2i?w^`ICVfshy6?Gt|o zG4m;OS{Egwy^+h6Z4$(K5Hp)^N)VlHmQ3Bb3F1KzyXcz|#8?nBlTHtb??ERq!t>_e zkm=ul@ren)BDEbzpx7`(1pSnmJSZ2okb;3+{=kOs_G#GtfkD5Rh+8E*?hb_QFlY@v zLEK?tSZoHtF2~)*i^Jk=(3-Z?n@Vo8L%jwYg<6}fd0)8Q3PtuMODzAe!#_V3-R^eF zYsTM^ix~ooRRc`%DJWwd2KCg}!s0Q|NsRE!iQ-Y{rOyUMtGTF$ zMTmLcb3u_w`zm7kJewdkftV@(FeG~JgaF|pJpFMGg3r&>hr_lR6wppbX7%r3t%==3 zM$Mq+@i)d>#J<^prP)#Z^xud~bj27gJWXk6?tq{4bMf;SsHTyBaT0-^*R==2oKP~^wf`~W*%G%}+{9NJ@jioD%2w6M)rC#dWKOKm7#(x(MhNj8>HI> zTq*aWQdH2c6u1jx1;&L@GVX>H;$y#QtXYQl0V*IT_zV(MK~C@j1>~|VNoXB-`Q4aL z25TpTgs};E8z&>>ye&;g543GxA>{l#4sbP8Z>K+Wut-s>R?Tr=MzGb+e6 zvk;Y_f?P9KD4JZUet_8BYkVHDYvkvc{G0!3EASdo*YSGqso6j=qGBCDWNWc{V}x;O;l)=V#NCUYK0 z%Wpp@BF2NLHIIA|SG=Sv=at5pdMJM>nikKysbDH(J2M{2Mgx%EYalWbLg2TzJPt^6 zH%sPj_&i4`1A|NP+M<&{dM(rW(kC@j=S4&+=oHL2gc|E3y;FU1jkQ81Rgi0JJ1R#7 zISY3vpi^U?qQ-2Wu^JP&pLeB9$*Hj)QDZ6?tFddOSJ(KXf=-R8pi?mY^UbVEilFCd`Ao%0g%gI?@5oCDSe)A zgT3HW1v7q42%GDgVD;5N4n1#!$+ek%U)hp2u*HQ3Y_n;qF zuilsGl8EU+c%D1AOOS8%*i(-RIugPNm5+>mCIi?5rm=Cd=Vb75T&%Hu(guw)@gXwt zWmTE@MuL22%Fcue+L8$H=CUIy{TBmF+VxEhpo0$ZPc_xr_T zpe%Zs@;TG};yzGTUFh{Y&+v=MAl}C8g{59G7~00%4$GUwq{i=QTpOIdqwy3%jHYd-6eNI;uQ6o$NZx8tg4tEkoK!2aq{+` zWn3k#o^j>cRi0`Y;h8xOqMU;t?|6u^3vSLmeJ_xyl39)YcQb6+*yXk5&>pXl%v;z? z*S#7uFoo$n0k3Za5hFZ*^upWT3g6PjLQqyMC@&_j)Wr%AGxJvIq5{OsD{FM|HHevo z8+CC2#LRb?XqvolF~T!$0dm!1nJyjyWi3FQb<1>d4~Utp)w-AhVkUR3E?xjJQ*)Cp zia^W^Lww~FCn6A@a3`#SM1QZi4wSVE{VwAO?!|$a>2}Z*&x4rha%oV^1rZ|^({G^b z>Sg$;{Qw$74G)%vo_mw=bLFFO7=@p0pe!E(0Q`QoA8MUkl;R2eoN=ZQ4e}tlzlgDN zrXNGn4;8112G0aETKBV|Rg#upfp@|igYjb<1C|CQfm%jD(P}c-+iY%3n;P>;D=Jpo zX3}&j4TG$<1>o5+1|m5F?_;|j)L;s3N&L{mBVI1^iv};_*!zWYulQ+2ifB-VQBB|O z73Y8&bb&V)le)q$&R&i%-@==Vc>&k7YBWp~4T>$2d+e2d2^M=#i+3f<!_pNOB`Brq)j@1Waa zNfyf$RM+)+5wQ-`z(_D}cpV$)mr+}R1k)(Q>C7JKHGmKe7U1K8E91ZxZ9S$iPKRcC zzw}BAg$4_~DMnX-$0W#g*x$$ue2Jxs3v2<6QK0pkLL8S~X;F}Im4Oec-Hx=P?^}6& zgkpWgn`7*m>IPff>S-2wA7B~s-D0U93LA3;np7nf;}vg;dD9afk&Ql|F~u~)rEtju z)8@={^Eudy$YGsfnirwLl@jxyo?_;LsRWbWP)iQ91@ofJ1uy1CYPAE~dgEPj5~Q-F zkJK9BFVG<(#M=@lnPqG+@&YGNj#Uz*M|fwcS? zi#@^|fO^SZhyr;MB3!yWV(!&VE?p5Ar*x%Y?9x?`gI&6$SHRe%%LC(-&Q8!(Ivb2H zor*i9v%wH7PU&pWRXXcU#t8)zX($uI8Zmm}Xom-rSpj1#2980}mB)z31DQsB3>+?y z297OgUpC0?i_Uun;W)$vIs?bcnBn#H7vefBUh~=D45+hDjS-&rKEsgnK7PVCU@RGh zSy^R-^}6N{ng+ziEV%CvU|8pM#jwnvxWT|6V`6w#8R1FMaYi`x@}SraYB0;B5r1y~ zMB!~a3J;IL(qWv&j|_PW0K5n4a7^>A&hdz~WUs`~v`rWO?Yiio<9R^UVKJUOuTkI= z9csEAy#1hsUj^#$GhVK#q*JZEH zPCoC|^w;sq+OI$zdLn%#3YT3?UJ2~-qlQ)et9I3oYFGWJ_Qojx2FmD5rMLXWLD{IRs8HI<3G&?)iY`t3CLk*YbAqVY-=f6P^nOb*h6&#l_?- zFvWEs_V)i6P5&RuK*t@t4%Y^%kf>TE!t>zeSht>m!^hPAhUhdB^+qpy_RvbgvjpRm zKJbH}*Z}I3pz$J%)?eOrIM#0Y5e~)?0KV_cOcb6Mv1`|t&`*&NT}EJaaM2*VgdEi6 zN-znxL8Ss>=JTd_sG*rpbh!*Jx3%_(ji4@rz`WemCys(Rf`W&A;x!O^OMToY27%by zvoHEYC5XLUxdIO;fH>;zHT~jY5QoXF>lZUX9A4wIS5#zFE(5HnY8#qJ)&%w|~9w}HV^`1&VJe4-_U-lYwg@elY!8K{c^=0v(* zT$}+xkW2Lu{6CjdmX1qQF2+?Qf0c`GXM*Sp;tGDMLr8oJB1U*#XoFK}>hI3d>o#;} zE&q{~co+L=SY;GFhps%gruh*TucfeO%<-g#w}7btlYXZe=?k^4ZE)Nu(%)(s*%60z zIAlgv$764t9}HmaYa7xFb||1VB245>YmLNAB7VEPkQwkl5CaMGBw+n4yi1mOg-Jc* zSYrx^(@g-l~s4b;0ed#u)uUU3ww9miPO_01z{K)3A2H z=tK;+Qavx%5HEtd+=&H5kM4$e8q{SZtu_X^DKoB$ap<2lUF>@YNE8{`T+zj=~ zd=N3hv+8xP;A=mm#$`iFS}lJGZZ=K40M`kN;pv(8k??c)*$0~1jXELTY#{XEyS!p6 zXlieQ_%_NOu)THzD#gHDErX8m2Q9!T7VjL?-T}FDLdk)4T|Tn=?S9t)A&gr zj57vp2xMM+)(pJj1CUP}02cG!yI2OaXbD>m{d_dvv=)Y$?Z8qjk*+9Q&l?Sq*&9E! z#)w>~d9zDQF$@&BQS&x`&J^Q7ks@^GoADuoTY@6;phkywY)H0R{oeh)k2d-3Su0B=fUs}hRR ziq!K3-igEd=lQZI(eUEkxQL06k>N>^$d$3EX;1dlx~zZ}hw+ok!CP@1(l$6%5p6p+ zQf|b}1ES@RK^cCz%TGl&2jj%3lv0_eg#+h+u?^W~cF+RG5PZkMHgu8*Fe?yEiut7B zJvGl$-?&lnNkc9`Gw?d@q1lGPLJys~nA0Jc3QBlBKIhhG72ef270hdR|NM+`n#d&v zSwclmMP+&)v1_!krng4TbN27WPG}aG4?&UUnm6qQS=FsI@3pXVRiA-IvHKyku~#1s z;OYc^IPCRk_A4L3n~r7%M1)?mHpy-$VSn2K9D1%*1RCYLswijLAED%#X~2d7{t!45K#MX`VL ze8gJlWj={b5H)VP!{nJQg2MX)#-b+eajy1^=CXUBcO%_f(pb%V;Yv%}mUOe0`4#L9 zpvOykUGu7bs);A_02Fhlg$$AOs^*PgI6M!O^rkzlYQk2VpHuMfbVAI#5Z&nyB#P0X zq>;|*VH-OPT7%WY8Ypf`+WAD%Yo;*|N(|eOqNG7vPhI2khhreMRMvhTxIGTElo;V) zp(ZM<*aGjYi}|6Hn{}p(PEH=K1f=DkL3to;SWty%7xug7ZrlB)kP)bV5^JD ziLup1NoV5aE4DHWF|+v#)J5JS_?Xr5VaX!t{!^>hQ)oA?x>xF3UVx?+<$XVl*RElN zPvYCo=N{2T=7&uUo>Y?dYx>)0X*2;RMbHIHJEmsqB_GvR^U|{5OvZQ^~`>-7sB491fMp{C_^(MW|?M&X<1rM z%xIHWr{Zt0%hhQP?9S@60L=dht5YhwGvHVab0T`oGU_!4!k?jR#mH&W*Qw@hI2}+J+p>>31sYi3~m(J%z-baVF4QWS{dSpkYKOToYSKl~ak)1QF?5TQK!7xq_DLC1; z#@OTz}*y9C?#~tvfU5 z-|WXIY}`IDww9pQfCy?CE6;X=DL>(w=Z^Mq;87#p_^zEBOkU_S4Kp6>?ui(QN_(J$ zlG}J1MWV_?Ltqjb#ABEQY(tUrJkunuGi2Dxa(FP#QL>u@0A(ZE|3A6FiiL?X}-3#WWOYm~c3^4n^q~#f+ZK#Hb zehcOvFsne(17LRJEIc{}^aYqqSgt1KAef=c1LFS6@QJpc!8{9QKPdVmm^#KT8qA8`GE;NG%(~1F+b@MnH!z+0 z;{BbtjUK%c%=MSc9NqdmR-aw2h(SW zA%0vC5z*(pTHVs?4NEN3z}z_uuR{Pu9|W^#IHnp<^ht!dY*|2D0E#{aX2RbCVi+ho z2h8uV946*9FpWtHM2o#zjY@oifDEZ9wfs7_C5mDaMSZUxx?>B}8Q*zDw4paK^Z=Mj zVoviWnqr?Wa=r)C+?x{Gi_g*(fWgxvHFz0bVljy!T85VsV=uoCkFpY@>UWmkDoD$3 z47dHT0RLV3r4Bf=JI>USu^05<<^5#nmq2Aja|IwRzt#IV4*Q}W`Wo(OMDO#Okwa~$ z<5`AA>Dv9%0(C=9w-$_7s5`G3xhGa z6q8&A|Fv=n$YVlePq17Dt8$qFRLk#4aybsUl#yJX@|xkTc)yVN0l9r7Bi!*rA#!0K z^nI;xB9`q%uxoWpBa@c!(qL;RwBuSGW6wq#LR%p4TdhT4rgdn`E(|`b;Sm*>NW$r{ zc1e5a+7G7%+AH#BjOFj&9;;t&mot-%mlXMP6a15QSw_|{}n&94v%Kh$W0@$J`+FXG$i-MNVgjn zcJEH^G&t)`@iT%(>Cte%1r~PiPwq6M=yNb|Cl5!IQ{aBq71I44a;H&S|KlnNZ6=7u zZoM~tIF{`M(eR0h0k5Z}j5P-&>Ym@i5EDRAJVxZX9@A6ZG5C3j=BaVe(Uro|<8I70 zg<$rB$s7w8D3A31u*@W87?@44n9v_YM|ff@CTlS%cA&d@Hp5Z>5I=oyfv-*2d{m4x zM1YvDz|xecEaq)sHh{SfmIo;t1HrVKWQgf? z6GgPKt|i#@9fi!a{Ld#Qih4L0jkeZ}(${D>vJ7>bXpVlGalxx@kXKySIYuWyUAfM(8Ei-T!3QXG&*m^x_ z;Bn(g$pQ6?XjklEs!~*mz+|dTX(((oR}a-v!_(jz75_^bEi|OZP%HZSJMdG4dTN2I zt~FK%L>?%bL+>%Tm7dchH{HY!H}sakg=Z2PxxV8Syl|Boe*=7Tnk;(us}gDGCtuUR zdY-_K{+jKOLboD}(dar^_~Fnm<2sw3S{M`rM_NjO)bSI?Y*5fOm3==n8Ye;$Rt%_A^A8Z z6(V)flT?TdS}H_d?$}v#mOD+~k1eICIM#B<)r=y5qx+4Tu1pe0s|{hcL*Yu0%jiL) zrg`yqP*W09W`xZv&~uWaU<@tYyz3fh6~JWOtQA_X8OG|Mb zTQL}SY{l3=JGK%=pUtt7B~uaJG%~7I#9pKLq<+m(Y_K5~oI#eNF<~G)NW+48*YE{0 zg0Y1jfpqU2>&v6}#QG?0rlXaR5OuH;63Q<|)Fn}BH@tpRHOQ3lQ>%U_C8T2Vp!a=ojxt>ELYDlO?Rs0@Ez zS}MayrFB5Hv{Z{Hm6kxev;nnlX{W)Z9ivoul)xVhcZCzkIZ!Ly0S_pe23g_Bf!k?T zlZHXkG#F~zpk8xQ+aOT3jVh)nZ=jkf%J@ID2(DR@rii#%lAu%TwX|42Y0zfS8nlIe z^;otoS`OE(zt$L-71+J{s?Qm6swu=+RxDA(-Bki z6dpEnU`G;Je?DwdH#)TnaJIebu&ErpalXt^t-PXuQcnql!`Ff-rfi{rFI7>%hoCR8 zja|S=N?&ve7&Mf10aXbK$^kufaMYzY!%zBPh<^l@GoFQ|fEMG2p@UfAlSLPcB=Q5V zjQnU4`VBVLneO(#2~K~*pHC#1}SpE(Oea6LFo1AC9XxWnuxASo+;Iv=`}nwvn%0Hgt@j zhHn9Cjvo&A4MFsMglt>DyxYxRI3ba*z(q%3MWQrmnlYjyHMBTB#&<%^;QkZA(mxwY zmgr1R=<+BY;`kby^Ab<8@m%~q;8{;|qf1r$fW9;gOG9&-rFk{CAjRx&5ZfA0lhC_h z^1!tIMQbR`Uq8}B5jk!3WQG=gj0@ag<}}vQg?au49ITPkc2BDL!3~yA6IQX-IXe@Xi0x}(t0*ZUVU-vSpp5evcN+r zM6`|`c123dHw?q|jT(y2R0}i%e<($X4Gn>%=fyuxgl%f(?n>0|u?0^U=DDxlq>X`k8TI99|GE9C%`9to2f_PdVmIHJ((`d&B}w zb0F?m3Yok06{Y0R?>+28|Xv+<>JW<%p+O2`*7cE^KL11ZL) zc6MRfh3 z0!*?O$JTre;U_c~`x*l5v1j zlY@QuTt8gZ35tR-b} zrwIt$&6eK123v$~=fCk1!7wVIHIvZS+&0*&aKf3gjxf*OwS>1}6Jgt3`+^ zb_)k+){uslA+#NOdzFn?Cv4mzg3r=+NE*sD?-oMa?!nR!@l#@fg}29=952rRnz!a5 zb@K7KFV(yg6KMsQlpAnsfF{!Hqsl~D0LGq3OJH{<(h6eii8T9|GLe$qo=9PjO{8Gr zCsNuN#ZRP!#ZRP+o$^FVeJg$}Yow{S0$pmDe&`Dn6avVZw&k6dGFs zvbwVp1&w~;3$eO02aoAH>dr!XX5UtKmV)_TRCmU1a=n1kY5BB2=Y4qv<;dQb=lpIp zM0HM2 zL0bM^$d@z+(Vua~ z1hEWZNHQx_4<5^qq;rx|X))GqknBH{+aPvW67fmmA&@qHr~$eSVjEhA@NJNzTVf!M zzSi*wEZHD7R(DI9lqg7h5k2ZNAA>mZkb~$k$mTvUC16N4ZL5$?rXm|kl^Vtmifjn8 z8paY7xsqa%y)IioA9d`n*M?CKVeDsHD&=L$O?VYx5gCs{* zYS1;Gy3!{NNZj@5nvV;#x_%&lyj7@qGyPHC5Pc&-o;{;@aV2etRFF0o!ua$-j~FZy z>qBA)`;(1**bohs;H3aFYIxJk9RSOzP6lfk#sutXM@S#E(@lRDFFk1fmK*Glqh*P} z@zI*NOL`?ilUIJP)f@@ZHaPt)xqw$eUW*32cj5c;(km4P>0{X)ScbJzO9|8RiX_g< z=D$g>34!T;pFvAd6?FC*@gOfrZIG7s^hzww>e(_*TB= ziA=v4ZV9GBCb6lCNp5l#liUMUPI5z$M7C}vK?kCFut)2lP5l=qxkfy=tbly!dO@_l z-&_Nc7E#U`K)!zmQ%YHed@rs-zU`}!uesW;JY^jp-m?=uOcs8xhTVY|Ni>9fw}UAF zLrKi9LcUj4A>Xl8$v1KkN!W&VF*J{=H#?|@MLYXX;Q;zSzoF|BZJgbxEftivaje6Bs@}`|))8l=OoNs* zJc`p{|M_F97{zVS8O7;wu}h>+XB4MXD;Fq7ak|^{vrLP%u6_I@D3MJ+WN;pUsWknL zL_xe$>Gy#2>7*}ugWrtcP*M1h*Af13*aIdP3`u)Dq&-&#v)lUBkoKz* zv&ZrrNL$5N+QAjrO?)kV#&iaIp))9wi3QeR-a9J2@Z63Z7(N_KHN4TPDM~eZqrXOA zSsZAcT5VZ@r8q@)qd&)d7mUDnG+A-bvkbc>Vr<1h5iwE&Uq*JRIH-i(S*B$hv1M9E znFVTH_A*Vy>}8q@lgl(4qwTu0Ok)lFbQvqvqpdhlF-LJ=oVD32ZjioNHiiCF)*9HL z(>~6F&oR=cqcuo}*1!c??L!}cE1t!4IsaC?sq0Bt_7d}uU&}_0*nEeDjemA>#XEP@ zpNLlS@|_qVm;23GC-8VIw{=3W0|`6d*%ks3ywL}7V2Nly8(?E6*Odq(=U5`94(cvC5M5p9M#PHn?=w?TjSUIC#YD&?&{F*Uy zpc~|s?!8rk>b*D$PCi}t;%ty3H0Plqms0X8{k2_fmsciF;FaEL+og_bwcW`nBst5F z0HWk|a9rEnG!F}UG;`x{RbJb~drkJjtGJE|Vi_j`UE;m|Zg-wa zDkJj9ohK&&HDPz2LSpRBQwqlEJe6SLI}b^K_Rjy2&XW_el9qj^5Nx!>Uz__*DY^YG z_nit#@Ra%vEgMd)@6eQfQr}^)s=h;wh)O98>N~cfaXb2)KVVQFvJHXMmkjDlwqX!` z%5{H=gQIV`ZlG`*k$ud}7>Oqt!zla<=#IzGXmY_kbHB$lpQmj;xoq~Dp=B8NO29bE zt#XU8lv^Sq6#(iz(JBQ+ASnRilw0hV9(5XDwQ|cf6p-iW%W*>ifhP?G4yX=gC4qN6EIVe+fjXx)R6_`RW%dhZ-d%<2x_VuRu>o|;RWN)h_nkAz#;3qCBn?UhJXGJp)CZ)T7N$NRrM55>$E8H1VlHp5 zr3dQ7-AN(PT$zf8jgwHKv$Uk}Js$~?3ue%uE{Ov+2~h~UmVyY(Un{(#guHdd47~o% zfG7vkvXQ@r`DzgwX)+4l4bLDiLu1MzCK=31NTC2s^f^q&B!yxywSTL@DkBy;eyFvc zRB!^V78BW~JdQm@W)%R z7fGQ)CK?A|w+(en?I*3K@sEu*WUUCaFYuTXZY(*5ecq+vkzvaODwMM?nlyQ88CfEo z@kdw1q8sCyGJz*GWd~H7vJJYLvJFxyf$y-awhdK2r!r8|kyPKMbCyP7=Id9<_P3)ccu1coNM zJFD1G4p%mmRMn&x@2qSn39~koN3g}QO#|{7r|Y1FZ?p?8aQvxmiB|Y0bqPv{y2QWq zx)y{H+4MsO<1ZxfAtd1=Npv?@El^65I0p|8{FT|tru>kxYA1yJ(Dl%0Ps8kj3aOwx zosZf%9ZXUUt9E8oQ9CzRQ9He=tQ}L??pIqoz5a`}W1Zi0ge2&WYBbLA)MG`dEQ#;L9BtaOr)9`diqJm8mv-L2^8rhb;QvbVFqO zJR&U@2wC(ZpY=#@+W8*J54{7g?l~rWZPG*<-lkvo=0v<+0hE@eyziqeXRHYC2QwQz z1*tXjiL_LY8Jwdmb;#O%U9;eY@4zBW8veU)z~Do5&!z=_wfqMWlM$hqq-lu%v~BuEPa;d{j-G4NB9HcRf_Y5FJ5jm*NTBJyE>EE&~i66!wrse>%;2 z7&C1s5ITsZZpOxkf@}F@`0^gXY1eynbI$Kr-M2!ahIwk4hhD+*98B+KT1I3hzNu>) zT0-PKksf#sqls+@>sX4>M3|o=^4?VrUv*=8!&-Z`!FL+mT^3?(29?E}v_Ejh9teZV%1 zwTW`~SFw)Att;As=l2REo;KWb3P)O`(sp{U9ieNKvO&@%JEN2fv_`4We9SyaIY{^h zdSXZD{ZL=`QRR(BRV@LM8Lll`7f_kz+eh_>A%v^ZV@>6Q)A~Nf`SefqtoVLvj zFFJtDNh6;q9%>p7e+f{U#`tf(9(yzTP;Ci3H0iCK#viIJC#FTJFdjot+feD6T&iUR z_B|3ygFwX53@hp6uWg^uOcA_6t7RPD83U6KV~wexwT$2su}qRLzWaPo$vJ`T+R*Fwl>XQpjFw-QB>9{oNfb|{ z?WhraM-c~M#UrR2@yqivJJiQVm}vw%gx>f87+(X_;XSBBvgmX0Gbsh5(R1jZyTEX7 zn?haJhxdcE2c=DfXR_%3XeQlnBlqPv+MM)O7!3q31H8V{5OY9jw`%&g#{;7FiGWC3 zjX0BLn4&8vtqigBTWAXJK>TnjZ{e-2mtpX{hX&9qVgoGARk(GA(T7GAHgDlq%TJz~ zC@6}wH^Wn~mMT3Bt@Evv@C4W^VW;)~sw&o13#wRGJ&x9G8|tFg5y$y>a>q8TCL=9z zV)hhGTm8*XYT78YK#?se5n;7xC#8Knftn- zENF{q$Djj99IS}~F!Uwp@P%K|ij%uz;zMYD<*-v{3;)~@u{7c4Yc@pl&4HbotvM$R zx&biMT#fVE#{@%d7#V3}T-VMGCes_9-c;W3L_YZqPvahsO)~`28=hJ}9K$Fce#6sh zxfBGC`_TaHH#`~Tonwhn6G9Ho2>gO;skWhdPR3i-0*~V|v~6gl09Z$aJg4DdC=>_b zIvIVG;?Rf=@LXezQXB%gIIEQ6Fi0<~nyeIuKq^irr8txoE>5{p90r}@d~$MedRASW z`BfGt5ydI9iqjjZk>R(ZWwRAOkASrNnwVj^aRfYO5$5_z3KI037P<7Qn2@MfbU*j> zh`Jac?85PNU26gM$7=!e2Q;+orW}`PQrjv3!=D_d##IJ}J~=-A3&bJ~)gFD3do)#^ zG>qYk+?Z(`Ls;yK+*E&TuEejFe-^ENZl#3+t$vz&BH?$jP$&S?ds{ei*VC~wQNX-Q zvICo+b7Q2V907LB86S9|IQ*2IC#l+Z0%H_n!Bju!)u_NVN*qtNgLNNBtzwR;%G{4wK$|`0bDZ4Ov zq-oV^zL{^J(F}7Zf?9MX09L#@h87@vop~vD-=1pk8XU!dhUtN56AAUf&K%`~TQ`6Zj~K^nJW~W|Hn6GLr)WA(;si!hJ>o(clq4 z5L}O_;DC6<1MvbQUML>%0=%PwCt_s1b(iRR@2XZVjN(2y!aU5sk{ zW*w;U=64;a@zL+K2#~cSZeTMHV;>666bzSa8YJ0N2Lf!$>yH4NX|KcagydP9LpVH3 zjqrI^2m3F&|}yH?F`ar16|L&YvSvK78JH%6D zq}C!*zwsH5^=q(k`*(20qo=GnM?CU$$KUu=$0l;(cW|ns*R$oGUn70r3HjpmLm@jS z#FpNNcAT-C+u1(uDO47iwH^E-YT)}X^1CvuNe0g{x?2mh{sTd0rT?@>OyTmo6X9eV zxsMs|V5roVd}38vWheQbvEnOfw@QU=4TG-C@8)Cpg%jY-Aj;YdJN`?Y=qO%?XN{fZ z)`J?@F;Hd6iSv4g=#j@he=`VnAs|2Kr@AZnT%+2#GdC zXzTX^jS-!-UP#5L0id*_j(dj9qzTj?s2c(A%ZtU zu+Or|TtuUEI1l=G3vsyK7-64)RMmp$vp3>!#4AEHfWW9&-r7fT#XRkga=U{txf5QQ z!LZ=#?k2CPRE8k8mB)Eqr7{FFx5#teG;52z1i2$b-Z7~@XEyVWNqI%30;Pbj@2GP) z3hc*cYd-jR+`ggj$0z7)KY3ltBw65&Gm_TAjtZRhAI&Ls=fN{&K6~}uG+;*B?uq(t zs&z&b^qS6jpP?s>Hhu&eWGTVVfVo>wd0MvDGlIIq?d+Nmrzc$8YleX`(Lhll9hfPIr05(%ZcYQ59j_~E;^ zSY}m$2#6Hw3~6@9uaW*53jGM2Bv*EeVcw`Qg`NMh+lAv zJ_EtqPs&zn!yHbn$li?X#WXNO(Tn+w$2^)D?C)UA!>=dLmNf(W*s^ck#t5QsE%o85 zcR{%Na6RlwA8v;IkEsv0Ge!R|=)->1?lg3xQLP_?vB9!84S7FF3P*jGy#@LHZSNb1GZUFiz0?EnT(2l~wXC?5<&pl{hvuz{Iv1g~|IA0NVCXYcXtcushp* zKJ>mu5S;D4>n+c*;HVF0yN9x~;Tnlyw)+YN;GdX3+a0>C-NN0-_?hu$fk=FBM1F+* zoFC&NvCarz|G6cO+Pz3546MkR@+F3&FTk$gZ*faF>;t~CM4|+jYHarn?wG=ph=8cX zI-NawbP@?0pWJe|Ep9*37Rh^zaNBXV*!*}~B;Z-tm}84w@n9;%2wwrqJ0u2zXoqF| z2_S|VI8VbhheFFU(lc>Y9FI6lJRToChvPDi;bMfulZklC8wzo5Nlo0CXCC;d&rT*h z`l+2TmpW_dq-%ma#WtFk0ZuOLxOuQSDCT=gEcz_Qp^nS|r$28;(;CLf z*RuyvSrYPwftJxZBJp%d;D&)Ryv({`K!O=J3`i{F3^FcqaOZtx0PPImna+U#xJEB4 z010LUAhC=9$SM`Uo%e@CY77HN#YP^0IdIswo>^soiTUsb*keDKak~!l;msht`S3Op zYCe3dHXjbVKOYW4&4(jIX*h(Y=EGe`u3}R2;Q?&@(MEo5{DtAtPfr4$1!<)3h6LuI z2qfN${r#GdXhKvI?{=}TdI77On1(x|cK+n2;B$cPe+=(T~M;O856N{ z;6Woj`x4j0cI26G*LCwd-?N8VR9wSK7UA}{mTMufl**TTeo@KgBR#);{30L1HRmvEUB%fwK%X zYfl%OND1nDx)d1L)1^S^VM=-H#AED*`J(>}v_*S&5RZL+yLeoPc)au+TG6@=;<5j) z7>^3Y5BBzr^lHSTUn8XAAb$Z*1Blht zd9h`%H%t47=uLZYti>^0=&`zYX>_Z-{ibjLvA$)odQ4}hcEIdIh}e`tn4aXf{RRfkk7c_lg+o6-)&uoJcRf%)Kh^{F^J6_wzs`i9 zcjguB(h&5{yb|%ZHTiDDtJQsD=9D_=QvMK=k^NIg;OkfVZ1h~V_VPbJ1lF-l*i7&$ zz=8?x0xX`UTcZeapUKpiwN(=x5AtT?M6`Mk-Z5V)MAorcNhateIgk}y z@rJ3B$KW=(zT1pMt0E-pcXT5zBjFMoJ_eU7K(Zo3(2ESF+@{w7a7{n_kNvZeW8SLq zm7t8{`(R-m0v~(1v9J9)*wLt>bqd(g0)p&_e!H75#*!W1RS9_%nhJ%=RaUg5#X&s}L8e-umar0}eU^G^kBlOjSE9_@*)pgaMazx?Yp+2!;OOQ(- z3U=yhhaQ0b1bfNxQQJNO%2YcDPnoLP$ycW8X?M@7X@=cXrrJSdDpRcEGnFY~naY&J zGL$Kq6LoG6V^fu>SQ4qO+L@^yWWR<~*TL?kx)Fp*bqnl%szG?EPVM5Sx|Vh~)eW$F zscr`G`$@H|(-5Q8gNFwS5^I&;OPv<`7sRw+S447Xp?w$Zb+Cs^aD>cQZLt~_!-??b zk)GDzxBc?Mb_U=eyLb&&nenq>k^Hy~LYaB6%-pIp{^M&I*ndi*?HWdbo4LA6yyigP z9Yt;CtBH8Gx0P?sQpNhAh0z;11L7KX2iYV3^eu%rS|EGG*SYe_Hxar+kN6uuh(M1x ze%VMmam+yc&3vu1d1eMy`1ep}Gp=>+=&*2PPAdL`){7)Ky@wrrP3wa)&!<0#_Ln9; z@*O`GY&~a=>TgwOj3bu2Uv9pLZm+rIa)6oJ3>5a{N!YYYhL4Kis0k3M+8iwECpHFO!eKSI?ZRt*7aWC)WIc}#H&?2-AQ&h{j{XeV)YXk^|F zbhTTK$W0q1!e&gWc9*Y)*o;Ce2nKC4==wc!1cS_DkOh-+R8ZzDO;%ZbMHYkxTKi{! zG6WH=%@FpZCXbB&ps{TfzCUWO-u5TJnh{3iEThz#tNBG$I(M&dg)kRs`N-~TWWLeg zy1L9~oMiVzBW~WJfs~Bg9gVm(`77Tg^5&Ta$fp$Kl!WL5q4MY&mOIzbrLiuBU-KO7l~ra4EV;8HQS0*+3c_k2SVu1m zceTXBKFF@n=tVrY=rZkl@(tgoteEDsm-@a`1KD4Y-{aq0pm7#MZerH3P|Vz{$d8v~ z_u-)tW(7*EbT3j0R@xMVL1#dn$N;uU?T{*hin!{2KSV2lJ*`T>Pg&YbhTeX zKe&m+l|~o)G4_x_$kUj6u``@@6^IfLRUoK9{B%=L*19cAS<`O_V%yw~k>dDd91*Mx z%Rr`rMJ!XnDk1iB3YM@xLp19UnZ#8{=UNbrj3!Tz-Wt(tQE{#U(eB1M?`A)Kta3Bs zOe{Ojj7w&mW&AP*1~(jMlfypBuzV%1#%X{0pbkN2$i>=ofbW*AdEzfvsaS_xOHDzd z??NYt<39ByaBf;);D_muqe%L|j|AmV#>Nl)*m5Y3K`g}zOF5PY!XL|<>W*gx61F`f z`)5Q+AK3Duqz`QQQPO!JQ4VZbKWXeDnz+^|6ZU)zuvQ`D#GOW&-3p=s#MWCQzwDbf^Sc|3f!6V7`Cb?DyBo0_qsMGtP*}-!yNL@$^LSi# zn-goPR0R@#oPb%&VCQdM%gDL7Yb92_q@TPg+38feJ>hT@h?K zQ~PP-C$%mi3rYistU;U&-U}tnLo_|*G;#`ct$CQH@g4~78VJW+Ew6rj{-x@wvy zLAV@jzVilbu0fR}a!-VoIkzJ%^TUp`OmkaJnag*+-^Lul2EsK2r7|~MQ|1Ud%AENp z%>#B%bLU33F~?{g5R@K_);u8Sc12(__Zfj-*PMfYa3;q*Lu;A{N*PLOs`f;H;d67l zn#QZ{xA>DxSP%$rW|M2^QmWeacc{^uk*T>0BEzJJw1Kc+3KdBaDX7y# zq(%`Gk$Oc?scLeG4a@09D1^4j?iGB@J==|v*k6lM6$npi>lDE#H7bHpYH^8QBuXyV z7Z@`wJ5uQiPMaJR>dhk zNM9wmL#E5qjRDpW%_TcM34)U{U7i7Ol;%?U3D7*^5*cCnL&;6dhjh)F?t^T(q;%Vi!zY3(c|Fbl(4a!Obo13gOC@_!) z1>%Feiy#v96p03-r_Jf8CKAjHoj=UrEWZ^P@LPfSK!lGj>m;7eHAHeb)-Z@fC$T4< z#L-v-@kFwdm|WgTB%d?F-{5~&E{^D8xX1C}+jC=-9HlX7n`Yz3RJVtC)P= z=u$a!r4LfxBF3a*tJ5Pva9V8+supXH20x`7QAzd=m0M4K=Yx_}+u&5AEO0EqrKk8V z**+x4hk9hY+#yt$?Q-XiT<+45%Sj!%oD7#)QQA8Lq^gwMANM=2)>6cxojg2L7(ee? zpCtqruB`|h@x%l<#~B1dlAazHiskKq97$aOi8(Q}nR(15$B+W`#v? z)5E&?VHE{vJZ@Ol$Wwg*_v$@UcghmRXa$^l)x3FkN4^$z=&SCO{dVcA?vx-CE6g3H z!|EEgiOI%Lj#-@nO1@0eK$U<%-RyyS+oixj-K;<-+-S8{A(2VRDWjqXXl*rz)KQs6 z=g#ws8C#y@K0TrnG#)DJhJS#>Sj$o<-R20T|ZrqtM zR9V#lD(Y+2t?NHCMjoJ|oU(#Y2dD%vb%2TvssmI4SjM4pevLy{v3Jl6)v|(_nUKd{ zHqidO9k^_O9L*}NdHqDtWG* zRVqiX4wnRK06N^bQi*0ds|FyZY5)=Mu0??9N}gw%)h)2NhM0_iu5b{P5!fW5j()DS z`;0~M!jib&LQ-CmmzGf5U&=w_gZ>Q@>vlan{~h_84Z7T3_<9lNwFBIUbs>ME4@~s^ zVx2R5n?Ct>!>58q_;gF3=-oT`?|b8Y^48+$b=o&jm*h9C_@;*6H1~<#uDxep9DYV0 z(=ZO60E_GOwG^zog4H##tm>Lkm!K}$9;i#U0t3~x0^ti-ewB9PMRx$n`dEBj1IvkH zh+Wp2W42!9bAi|v3yp;JHO{?KhTy2#QI5UG`(&2Q*|FcGY%*!dV+x{^v?fR@UB_=1 zZ`TAuYP55b))|=su`twKMEBRemU`HnLGeD*{FKU)eL@ejyN1!-u#c=FD=!ng#ONxl zVH(P+6;4Y<{zH(MdP>avK>;b-hRK*8i|ZPdlsrg>u22!ns!j=JDLG_Jrb0zbRi|;i z=9G#sg3`r{SXRZUz<_uu5Fh+HzQz_mjP4}ac2|zgE_f^KS>@sXRMSiE#6`cTcQwD5 zcOt%^1zdH_7WfAT0;2`2^d%?s5f6_OdVYGKUR@|Kke>=ZTjRR2FPmg6N?Pniem zDN|q|WeQ}J@P?LT>^g zL;Y|=p)%XDLM7-8{l_!cKQk|N8BsEA>N29hfQ%>*-iz?MDvT&?h7qL+hQGk~Xee|> z`ZbIwEgXb_r=dn*NJA=HTNq{LJK9LYICz#EX~gpOMSrgq3HR>z5tm59x!oqciTEk(XCz$8#&h^9wDWyW;y~HR5?V;#ucJt+U+b z+o;F0rK5Pturo&s2zC%pGFirR=Z%Z!)`+L^z2Di}iSgV9@tlKrw(IdsE!6l~OCpn> z|EG9P?I@o1xFf=%0bwM^7(MK{P$HT^Bqkbm-YgJpAk0r9sK^2XH7sq(aqHXso$YkO z#yg#4bbPIA2NB@Z^F|IT?Uk{)+hw2?^p$9G-}O4p9(OY~W!%l2xx}x;Sm7j3!jVO% zX+v%7F_+AYZe}gkhT0^^1q;HS@E&TWMaV0B7+pd&+clIbu5CO84wPZ>;@ZZOSj)IZ zVp!X_D?QaPcekH)H8yG~LqC%zgBc6v`C6m`ZK^XhjLK!0r=&j903u7Dp`1uiud);v zsInA@52SZ39eJnfwN0u4^BB8!*E?Y{;>s{kCLk~;qGA%Ldp&Sd5+ckCw9F;%lZ%WA z)=gUG5|rbp=8u}DFXMG7SkJ@Blp!dqA@d7W{u`8mscil3-vc!G;aw? zZx?Fb5|rLXP??80pWD0g3I90gr{uoi$F$40stC@Px)G zF9WXCIOS!)?ixq*4A@Kamfs~`MFy)d~kI51?0@}iS$d6P?Gy0-0{Ofb?TkHhIHKdp5F z<1a@}@s%CrrgCN2dSq@cm)NFlE;m2w=@&Yt5doE&6A=YvXyeintKWUWh6ygW#5=M> z8YlK?#=hnq1-i?94i4GzQJ&z!L%i>|Rk=0W``W?!zUyo!4;}m}_U7BC*kbU7*h+pl z?!GY^Y;n;j9O*hs;}{uYq)$2?VZQsGA11v|9Dy(=bP(pL9f#?m{KQC~O+UZT{FKZ& zGSoSGrq<{aL@wYrG;SVl!Px~rSK&$QhD;9acuiD9_Qa3e4}SxY#gF3RpPTVB`XAV{ zdO2pH|NTT%+|mM~3DYp)Ft+;Da=YKHh7r0PUB3`F|Ai07Pq*nv(_wHVLfgI!Y%G2x zb}le4nIFl>zl_Bebd)&9uohxjqB2Zl;#_D8j~@-ak`wFa8Y%kFh>knl+(?+ zR&&l?UgCVHp)bRE4P1~2EZgF+XW{}hefqL3g0dyk*A{!AzP4C_8(w?Dxu2}Q8$qw{ z2EH`(>Ev_b8QDCQU6e0o;Ylnv?7z2RoiS7KtkF;2l7-KuVY9xfd_9V6?06gl(S*-d z^(fCfG?pt`VJ|BV#f5w$4&s{~hNIGy;Q(jiabuv_uahTaf?(MTP+qr) z2Em?_?Lg#Mv-F%<)UlS0cY$k;DT#?yM#{>(j61O!ihAbN#fet{?ysqq3@h=PfuY#Y z3JeoffRu*XfRR2KeB5_tp-6lJN#;FSDd(*aWg;)s-MTds>>5f~_iCX0ycByz9tKzk7AKOSMBXzX8cC$!TyG~iypN8HhX^P$4i2P3_Ggt{v)`0U+~eM`dzMQVF>sx|HVoyTLQ8A=u%;Rt=-W< z*+~ow4Yy+0DyIy=!UM3sA`r9Tj?-f6()*P|3?Dh*4yF#uVl^zZgL(dB-zA#?S*-N3 z=7D-y^FY0u=4!up)2`n<%(1h_BUZIfB#P%#ZJ= zb-ajeeN2x1*F5Zcf>*IoId(n|A87~S96A!rTPbxTA>&!1xK$`7kA_JdjJS>pl>}OG z$~N1Nz-I#(%dJDuz(TowLs(7Wntu2<(yw3Tma?lvXf7(e@I3tRRP@A`vT=B_8sD|_ zMDzIyY&_Z~SsV6`$r&#_`8$`{$TD8O`)Jpd70Gnl#z$`vS+UaA3*bfQsiXZ9aLu`Vn8HfAgM?!A_5}}uI3QqVf z{4{=NiR3I?&Nu8^ODw>XoDHH1=mNeu4n!L)n|}}DL=Xp_W{W%UB=-VwA1q6DDiF!T z!U$*dQE2@q;^*}Fxgt3P@85wMP&FTpD?!}2z!qQNNp1xqFV#tE1j(YXf8@{|G9iPo zddgghc1oEYU`Y-S+j)IY3yT`3yWxza)w_KUd3R+KiOdlyW=d8^gy7GOqqu=PUv_s9C2%sl9e$YN@Wn{FWbtrtLxh%rW#M;EcR3V~fJ3~^FhquhN1x@o z%?FOfxuZLY7w{w-!$$C`A{;G=%spj^Bk;-h!g&XP3#~|N@}qEt`I6REU~`iEFxFfL^(Admc?g`|lp8APqE}urBw?-9+>LYH zAtTxRhbFSTJ-oeJxJr?mDY%ekTQCB*Wg_e7DA_e)E$HL(hBbMzdn9fz0@z6Qm4c`^ z1Iryim@h`U+fm42yYnVt|M>-YeFg3h$_=ILX4KPlAkKIkhi+YWH)a4p#75a&?52NV zyBLVd;n7a9?_0pZD|5toPj72)@c`Ni*tZ=Sj@$h~)RAa1;`W(v)ks3!2Gl~rJ^iSi zc6aM~>MFD@OF~^@PacHrDju|$9HGyq!Ojx<+`P?Js-3A1^{VF)pfGB|p zwteINSkp}+X4~?JDX|#D%l5Bw#1ujo_W6(DzyJh-+_CLF5PUs}-njPaJM6b>{xyR) zAJCQ_vA84HZt?l#kZTCmEH1H5%)o~JCBn9YCKQ?oIga5+)?gL798Z>Vd>#&Cp`&Cn zVlLI>IEt^6sYu+Mp^cCbG?(Vu)~gTGcgL^<%Wb&tYaq+5vyIkX24CC2sbmET!h2_- zLw2=W5W1lt)PTU7gx!pSP!B>DgnuI2n?cBea61Y@I|x}2ZbLyxEpZEi^&kWm1Pekf zWWND+SrEp8XePme(1?Q2MnV;Yf@?sy1)+v^w;@IE-wiYR#np`b}C z2(=`B?SjyNK)iy`LP8Y;aqX`de4rpu*s=-&!OVg{Oe+YWLN9${i_rPAVOxZs@Dlv6 zR8;SZ({R59K?SY4R=aEJAb4V=x4bl8s%zB;h3p&aA|iEkj;Nji#Q3s;vI~-H- z(`9Vc978pu=%+{`&wO2oCc5}3GQ{4m2e!00#0c}QqkLV2&8ZxQ+TuaR+A#$28OBM> zw{dETGVH?@<>lm=FK2=atRnOAOz>XIHdkmtaaf_~sAwv$3t}dYLCmU+PSzML+#I^7 zmUle}xtXzwuC~pI$z6YSAiQ0FjUd!!#unJUU4QK$)Mm!iv3Q|2GuD#8EiI&Yq=`i4ennP~Oi5tBqDQD^JTU67~<%EzyejS055ens;bx-Pkp} z=5Xx#j6Ugm#?hQ>7KMw2xmCDLQ*-jo z*q99Pi(K3MM7w2Gy8PDcX69yqg}3F{W~FxZDqYH}SJT?ns}khZtMyvdLXcOl8t40| zkwP;)I@mfbv!tl2SMiZqszrB(N`qcu@QjS2)mHaFg+Y;Kg<;7G0|X5N%&ItC5aMDU zftpU43c7vOid(C-YKZ-Qb6yV0rgehmRt7dTCuzmC)RDQ?Fm=S}=@ zP4}X&H6Iq6bxNrM%}CXBHu{=-WPn3sIc3)POz?ZDki~vPc(n+k=EDhgJM0Z^aCW!8 zSn{NZD2O(fFdx!(!ZIRqG-}=rJ|if~v8N-Y(UF~l;5Ps18$3dc6=K$kDT406li8|; z#fCzLr4L;Z%<>^)q*|CWo8ZhfET+hW8gt=(3PPU4D*e`%A97U7R2hqF$Z~-b}=%+%H8aNW_PXP^@`_&Q~b{*=oC-O zdf3l7nTEr0Kv1y;GLsP2=2l;=1Tf76pKjCf#pQt51(aq7*o^cg(5L9AdVa|M1Wi%Fi72QGFzx!Q zG)1!2sX-8Itz@fHPXeuu$yP_117Kn6W3u&8h9Fy^I9nlQ2xhiM9BRpIji{+*wnoG@ z*cvr4euxU(TEn#rm!h#Cw3Agh*q0ZU5Hio+JAzC098Q+TYC#mt%@Max#992|98pXA zz7?^P*_(#_j-H+EI!I$P?6J9_qSz!5Z6LbsZOc)Bf|Ig4KTKri2`$7jPnD6_&z>rS zkL(H1S85PS_1U2kdl-sKJ&4K=ar#Oh5KSQDDKkePVyz_9_=Gq)J7%ncGGivIrHr#< zB$g2~W~_HxG0OO4#7i0OQm8&R1a%crQihg89W3g|Ju|yN> zo0r;l(~;2DV83Q_9Fj8ODMaK{5Z_=tf>)1KfhfKTBC4+=;4H^RT~t7k${I!`=nSLA z^*ac;ydm=rLShI0*xkJQNnav~O?xO}S?SgcuoRl1YvS)A>B>+KyJJpaT)e3ewD`mZ zY->$^B8Ww=2vNR-{nH1zq7I24e6`s*|NcjC027G&%5g}*)vM6N^UXEph}gehK@$%G zcl_Bmz@BP=eHL~gUaZ}B%huc&7mCYU0Bh-DT!>M%c?)0zXn0j@^Y*`H5MDQ@4TS0( z6r6?^s&i07BC~VAS}?0~KqkoJY}V5`_(jhxAy2dV5sZP`O_Is2N8AVh*-dT}6M{<) zW4z?B6-4G)F1`76=2~oBUG!&PT>Nh?T z1XECP*g0gSV_1X+--IJ>zSP8=;O(axMe)s^^9u&UzhlQP=EvGKQN*$?l#`&mP!4Z} zxr^2?P*ev`#)%T6Gr$4kL;1p*rlC|!2k&Xb%y%E4H;!SAHn`3(%tuiLDMOG-n)RY~ zoQ`yf3$W?+u0M5tufDS}FNqe}#o>|XF+DyO=VO}1ny*#xtcY*xKlDzY}~98j{^ zwU%M&N;bhP9|(H$!?0T?4D@A)D78Dpwv%y)*3W|CG0-V z(ezUZy83BPO%&Y@v?Mf2=W4O$hhuyPrx&T$AjKF2=%$Tgp z*a>D`#?ExhJHP`Mi!jkQR}YAuPB#;ZePtbEO-?CxKK zr6P$;@cK|6>vZjNCb9bZ&;)ZK=5v&(Ab4YFv-rm?KFE@X`5iOyKoH|RkC~qdV!p?k zlkqj@ec(y-08O>0mU`aPMIx{aNs8{RI2}S?hD1=dA6)L!1U5;6%Y0g0V#7=PxVR{5 z%@09Urw5`z1-Cjg8U(#)hoFeU`V>4zs-VK;2sp)Z0vgS#2gkHMBLe3507{zss=nF)0t! z$D}+^A0|>@V3ewZ-a>d2C>7;rf7Ti1! zB6TE3V?aDvkCB|CK;V9>l>7oeS0M+C^h+3YIsYuYIwx$d)ec6MB7a_ZhvV z-uGZJaSdI{HSdv&gD%yY_tQ1mVR@@=3a6~CG5D$s!JJemM?}xjR$lZ6if#XxmAktk zS48eSBUgNir+T&#nQ&&VI1Nwr8viD)Mo5^E-hH8S6Ib=H*oBytuR97A-tZoBQoafH z%&AZoo~&!9B$zQmAhC=Q0yf5KgdqNa#ygqF5d+QH8taIGbv>+fSD#A+?W4JZKK_{Y zeF|{(7DLQaweN{Z){oa%Pf)V{>x+C(3A(J0eS8zv4v`1rhS;CIj;eV!?2m*y#fL2Q zKcFc6I4x?I_( zijk>{*}FhK>R{&qB=$5AjUZ$}{8}4$?ut+(c#9TIPyfDH8|3a#|0b)mY65~zOzuwEjhLhK| zEG3xL)0Cj$1q>em_}i%wvDZ= z!#m2)>bNI#92;|X|c&ZPMR%T3!S09#&?St{t7K-x`h4x{v zx5FNL5&e8!f;mkCaG0q}Fj*&ikh%mD%<4gIssziRHlZ<$AA+K%%pR~*&y1OcT4IT@ z1jfhR?@KAcMcrfZZ#e|u8opihm!jx!wsEc@HgtHA2-F6Azv%vCyhy9l2UkGW!8Y0$lnZ;V}wLu7sKbvJ#B zJBh>ajN8uW(RP%>g|B5&zquk`jK4BpjH`&>aBEn6?7r-Um*XnC$F5z11yyI~h;iHZ z%6sC^hG>F)RC6ao#E*OhyqWEI#p-a}PO<3juLiMqmZ6-+{|Z0KT$j0Y*{|Fhaa|B| z{QNsyPIg_gr5U$*f2$v=a2*>p$SxJ}PWNKtyz6o|y4*4rjbIj7Va&(z<rP@li!7!?$7I;iLVSI^>yi!9__00X@4sw_8(oa$Z2ZpM;+tJ=h?`xE^0#>Fk|_7U z>ez_y=vp%LcGoF%6ESX7v1Dkg#!zvN&d?Uuwa!o-lMEGPqBPVrjPyD*1kum$VPqV` zqL(>H&r|}-AGS{v|W#<_Rx6r zuVL|t`?5D8U3*x$`6CXS3t&7hekBB>3Y@APU^sGEr`VSF?4204=c|E6fjO5#d9=d? z^00P@5sU6esnkG+iSg&*=P(y$i%@%HPwUSROC6J{^>fcVkFNimAMkYRIaq^xsp296=s<$wV=FQX>~menW9_E z&FPug7Lc<~kdqCJwvw}EFGX)d2-;MN=2OmG+3Kpfq(8N-17uaFToQ9!R%$NUFxEbo3b-WZxTL%) zQ%jet9C=lkF0TR1l~)~e(#UF78C_l##;{d2t1y-`Rn6*{E3c<&IXMyUYhNu5%moC>iNkxjS` z%1Bv1!Gjxh4~mRJGmY>6qkkWEzt=(ey~#v9<2voh2$-nWnJNW(sbT^Ys1hKP`hxqp zN~)8pRW2$y#Z;jm5LuTicEwY>nX`u~#P%!v8Gg9#q;_izJcU@*gdf0S|0 zFVs!9;eqQ&Kjivxcxne3k#q3hN_#S37oq1b!V2Oy@e}y~KU-aFi#26NByt zlv8CnvG2C-CmgW>y{(NC!=j zwP~@4Wk{s!LXs(!q zXW?$B@D9%v58+wJ-o{}7>0;psBec)VToEe%EMG*9fQ{&)Sw>{g+Nd}h&!XFm!kXh8 zPVz!2BmFY=%=f$`Uo6@!HpnzZ!QnY#(VoSz&u~IUE$r|2&WRn@%@mEacec$ve##Yl zx*lwc2womDQqiMsF+7lS;LA5pMngj*;#k*V7h+pkWoLnDEa+R-sBS2awO?3*E`DVn8$N_n%CZJh^}rN zIkrCL$=qUdVJ67L?}pLdfJ-L+Q-r32UgF^u3hH$j_ZjQ@zBPbF2lh9oV1Ql6@{J9#NV|5T-kHNd>x5&63T*q<{ZQlX%P~5~ECyPfh zfqTc|-!H)G2p3~12WGxEBZ$dC^;bFq2jYfS{cGv+dbA7*r1sHcjGeOTF`b};>Zn{H zV|Bb6gT9PGT`d1Y#J&;fUbJVGh#c~9RQv_cqBD)iz4-s0_REdJHus~CWqYz2>Wew7 zGZx2By%uxV?n{=DMOT-}8z&S-6++%P5x*T-{)Ow3gRhI4x|`FHfbhOR&sCV70f zlO5Asw=D6CE{Vk#;rkXha2e2rV`V@J^8#85hyQjRdI9Z#fE1V!&$AVY2}c*FD|S;;@JCMfa$_tb(GtG*ueC19i4C6sV=C z&EopL9I_Se{_AZyG43O5+bTyatxVe7K3GtV{czYeXfw1L64)+ibGu+Y3AIhIiA3f$ zK~@QBn_#@<4HbVJIM3Mj&od8v)K3+an&_u?!d#jc1iAbq%Ckq5p-X2OO7skEzYxWB z>EKv&@I2osocQLV*ya56~l3T+^PU7>OVXfp}5 z0aR=)iA~x7YBS?%`5`ub%A9K;p>nR7gvz-#5-R5kwgHiubJPb_&dF_&HFTx6Mb?Ax zwna99P}?F~VfU5-i*5at&sDH{E1&B~VCk>T4W5l4xZ*jF*EhD1_?c~xftAi=GFB=F z_kK!H?)}tvOtNBu(~a0M$%K0wLd~bOE7jRxaf_?TjiJgABq!qfvS5PXNMKzsF>)rZ zuL~xaxmcQO0J9cLOAs6jY>8#t(7~424X{PuGwQM>xFt5g0R%x4PrdF~_{%nRX|-iu z@`zu4_)#=J+S%MoE2jjr3NJyY@W!}Lx*a*b6vsAjn{;YB$e1b+wIo!5XmE&Nfne;j zc0?1zXXqOQG7p`@?93yWm3ag+GmltS<`K-yJWkAHWu62xGmmWe?=p`*{MB-iEkw4YvyeM%q-j}4c_4*n-@46Z>HwYI{Z3VRLg z^1z3Z7HlUXp$>d#BHA>Pqb_ssfRD;6n_y?0mEAG$ZoWPEoPh&QY;!nh{!y{~oO~oeGrW&qjK`6Y|Avc$OU-AMk_!su~C1@p=?6= zoS|Y^I4&D%2ZA8B)3N1&Ac#3ZU{@yAPb7}o+7#u_ z7-HFQKa9aLj873p>|#W@hG`#Ro6lsXeHd;ReK-RQeHF$5TB|jdQ2QG@0>^40SzKe| zX~LJtU_uZE9^1C8Ja!BMYk3uc_2?W(95vvv<2Mf^j#y^mq&vyKSb8j$Z%eOi`}r~G zkG~cXc`Z0EsN35Zm;ljxPN-}CjcD9jLGWbRPv3%%u3?&Zkok2iUapZC4l@77XS$RC z_aJlWN~W*;oe8EGJ<${ks|>%eQACZjJUc$T3tk>i2U}vwbK-8Mn2kpg1NJb*WIPKo zR}p@Ek}1B%BZ<%UG(|G)64UlE#XLNGBhO7OKYPCp!sHl^k-nFw35VZ=gS(MX!FJfUrIh|fmt0{!Kf8rU$(#AR+6Wm+;fj7nL^+%PIZ zwPDn&U-!i4M!Jl-@+or#DZI0^DE_S`f=o==p@rsRja$UBL{Ngh2sV>j(|=nLwC4J` zEJbiSL{LOZ&NRhNc3t zu`eO9HHhGyRWWmomRKnRoiKTQx|Z4v2!YLdsGg}cjo&o6*6W$cMFfyWr^&uDVmVnq z-blQfXE|BFqmkR{4(>Twf8Dcg);EzGJ2+YYn(IW*dL8phL;&=&zE#WmuUx-azskcn z8&K6o=Q=75IqOx*3Jg@r1+L3Lr5pg=N|{+->N=JsLS}uHi#S=|%)~P51y;P@xs#Li z!?n1SsjSyQFSP+srdDQs6+H8@ev<23Ai0NVL3qhkU?91(T$h3520$mdGVABKj%9LX z))zOr5S4NxeHO;UKVgaAt+*-h;xoMXakM4wM70=t0q3HJVlSB@QjDK|Q1|ZXWd!W2 z!4hG|XZRW3+YGa z9v~ISE-MQ_48FmVs>@1TaUQ-M1Z&Hc+k+T+qa~G{l@UbX6A+WprCIr@5xM_X zOSInt&z?2Hm)&lOr}3=Z9AEUm!x9JLSxFUbi$^SRB%YPKfOzp$99;4m2%hen|GHC1 zSJr?yCH@JBS3z`xrIy585FufU8a!Ay zX@t|TY)|6PhOdcDlyb2Ru1%F!-L_QXy3{?(J3L1HSGxZ;`q9aLlR?Qv`0~sKScUii zkC8rRe!ln%o|T7%Wi;Cv%@aGme(6_=raZs=G5lN89_q*o^?FixXGv5GUWVYO_-;`6l6IaapgF+Jj2XE@Q7Vp!PJg=(3S(HO=3C6u8Cc=o$chMbeg zL#(qRU*m`C+g84bY>`SsxaCbtgbqR77Q=Z>8%K!9>hn5@yz@Ize#2exzdP+iL)b>M z6ROAK@yH(N-m9WmSa%?n!2JV1rypvGRill_53sWzxvB~SLRce7T#Y%lFY&_!tUAPq+_)s__;Z5cZ_VMLypi4pvuJd`YHIwo z&HUm}iTqx*Z%)>waAnIgE?VO!R9zsJ`uDy0{eGMF{mEL9FXZ?84>fyfC7zfp@%L&a zo}eu8ty+mE=$80+r!V|e^{20g*w*}4d`zlYyfSFIRvT~_L|z#rM;k!UsH6sJRn`XU zts=1FyTeNoM?B@1e^&GI$n^LnTCAv(tvakSz5tWP$}py@PVQ=s(l&Sz>w>FMhHN+;WR8{z`lQp#Ap3sQ3r*Ax30=QB*uidl?qK)!~Dy@VvD@0yyms zTik|6R)9PHh`R4D_*oX~EIukWB30{b@y7LCFsf{96#nvjT=tNMZxOF<3p$BC@qC0$ zWttr+xCDzZSL}$@2Y7xw%Lsjke`cXHJK)zykDrr|gDueqI5Gd)*KrgWhCqKjxpS-w z2FvScKecn-D(shPgxwh&kKFnxs#iQerqNb}-`gW9x=g~ZNNTqi9vKz)3z-E^G=75D6z*64BM8_Kvqn}N6E#I zp3j4U;U)z5`V4(OBL3N>EIy9m2>80$UCh3kC&aFqgb95;ID*B8VL{A#g7Z@{3@(lI zhX|_%sa!X=^xP}`@EE~$!qlTc=$Z$xyibpV1T*6xQ}=Umi0eU-ed|uI34}!~D=Y~j zEK5%>L8cdf*}k5--GA?^Hg>;10x{Bifm=(+v5NwE&!LKS*A@mcgV@jIz0^`F;7FRC z@oS`)!Ry2s@O}dHf^EiOIMsP8gfs5k7w_czT@3SlTverv%&}dK&Egenec>bc(@ovY zCpV|fF*0|ia)IJ!~Z-H z%m47K3*iLO3%AkI{;K7Tp0?Ji2%fekN}V@>)7Db( zDf6^7Hm_Nytr5&RZB2sOX=_yoLLF&b=LRQ_G;UM`Pg`qoiNI-V%mlgIR6lKv{%4)G zMsQR2%8S5hYpj)ISevj}9-l}P{%~#-XWO|ldrA^3THH6{X=D&4X_d_W-LMC}ht;A; z?Ye(t$m~z}#*^7p*{?6NwFu+)B(n{Ok0-OuAUv6EQv_wUAn~iqYz=}?GF$HkCuO!t z5tP|hm-u7K>~4_P3zf{yN3E10v(`Mfo_)};+de=umPGFS>*r*)3NC)_dbSQ>{GMdC zkz7&rYzqiaX4@4ZkB%?@)n&F8K`5DRaD#J>j#mU_w#_B}kTT0&gESw@TJ;P_=!1Bm zDcILQpD5^oyoiLh%Rd%G4TztXRS27EK|S9nb)Xr$sJ1t}+Wjv7z{ z$`j895T1CpC_<_M70#O&Z#Jj_k=gun^d_tMCz#dzOHgb6>!okbjRs9_Fj6dA6+y8S zJ)H;y#Ih@J*(B@DKmE^Y{t5nf&3{i7mfrjm%sMWLpgIu`R`d%_#xUhf{H(z9W0T=m zq@AF8<76j@DBY~<7c%d_vNUB(Sk`Te!@$b0(oGqHqYmk02=hm6k%#O;Pr-dG_iM*9 z5%lIQ)%OyV^Oku-K1Ht|d|kJ9s8CKA)Hy^faA`Yr=JgN!=xb(>nC!U$2|5EmGQcK= zu{|!?;DmXrLlox88467BARsFcI=c|-4IK+vmuK>8La4WO9C)mZ&#%Wbo$k0kr+x-? zmKjumxtfFUtZNLJn_*v(GVDIDyBW7FWM$BgMv<`eGu353_uf!t0F=3Qcc`#5%cTe~ zf%7ZtWrC?^0b`UkJtIMPdM1i9y{f?Ib$5hH?f*bn>OfFP@^;4xh(;1pILvJ`(|JQ^ zXvgWqP|#S6yU)TSM}IDA!w@~!eRjJPwpDlxW4h7p6IkAo#Mwru|LZ6c!|+23i$u3$ zUBWOb4be++_ynjGMtUB$fNFyD-`igm)K4!66_r@50!Do@CyIK``qs41$?=VQ`u-^DYd=AoDH^VjH{*qlWQw z?!xH3>^|JE0NOCFh}&m8l_Q!!4BiTxcyf-#6$vDs#dQnwa9={fq4;bNwxJBceF?QB zKE{0sT(#H;qWBzKEG26%5LotSb1_T7VY2e-A-BXKYSOr+v1g!&Qh>6Gs05uN8dwoY zJaa`Pv8-xcg0kc?J4SvQbu>bY~y89$vGh3;If2W2=%Z}1^)Y-8 z)DKEkU|rdfcaAv&*kl)DrCBn~Oju{)82JDw_iWW+>+2NPDXUUA?QdQ9un_yX zAj?|G-X?h{l1(l+4}_6^@$!6;kHhX3e$%h&WG78@ZKNvz?#UNN8Q}@IEBqKd3wOlo zo@Zd`(ig;AMtBVF-kym^PIDZFySEqNk;KJAJBfedk;J#S%(vGzF7Y(3)&2pGY!5k` zRDnkt#@$HwZ^~E8zMYlS-h1Y^kv?5}ABopHn_(BeZ-l?TsFUbe(DesF{%*!k_+I>QT6|&R|~(ZAMpJO{3f^yUb5WZ1CR;G_CiB4T9JD2{&sqQP}` zDnc9iWTn{$mmrlM?gYISrEz3$BPZSru+jw?pS3j=(JxTQ`??sV;_aSE5&s7q?%{$Q zYF;~`B8npj#37juYvHiL1=&Wd{gWNr8(0(K_V(cJ(JSElneO|D>$`}rgo_JZl;f{! zcj+CC!~07*^1jIhIR~|N*Phb*R?Yj{GCmT~ThB7Yhb~G9SUWipy%$*Y2!|gM+p{$K zFtC0)mM)7kK{YPci{DPElpzYt%c%tY$$hWbCE}aos|#H8D1LQdk9Y&H%Uo<{Vi%Uh z&ja>%{p+o}M{fX&0vIyDHKBihm?uJW?!_GDT>RXRXYFF6ux=YC9bAxXq;Iax7hmF8 z+Z6rj$FP{^zNBccy>(!Gdq&O0WDea{8a)p|UgTmbS7gfDT(F!U-=2&!D?fHInOZkX z0~q5QJp?Y-xh^Gt@2HF(1FX}wPF!Vl{#Gful5#OFpI>`dGDfa6UJ3rX+!*4%_xKyV z94_{CQR(~LmC@^f9qwXCk63$8rHEYZ7M-KUqMSDLZG8g|XF8&Dq(AveAKmGzg)mP_=Cd@8hj{i4lFTz=oMW(n05Ak%dDXzvtd#A3Z*bNWu&){g5 zk`l*WIM5VnJj8Fp|L3&BpKDJs#XES2SDk8#xp;`5b&e$-!vmaUQJS;yYo!0S9gdHw z$rnwVM@QV}WFy~_*-cw?icf!#lwLeJ6ywxjNO*KsDrsiiX|?Tovn!_G1+a2f2;*P2q-R; z4Xo>76pOdX-G~LR%%1fR59q6nnAtzOGzaekQb=ZJN+IR;*OWp}+Ac>xM*1B{+Lohb zncsB-(#Gk)Olk9`2=y}Wfx5J*;{EHDdGjS-+9-#=hcaK7nuVCaEW~4^mx9xuJKWwI z+}^@{sn@XMU5v_z;2hJ==B2zORfbYuGH1HO>XDOIF%m4XcAHR-SBM z0hdO4!kBz<1s=3#hyJl;JGK(lS@XOIxhxk;w!vOJIHz*M>mAruZCv%mGLuz(Nzh$c z7-I`sFrTsLn#Y#226kqh%@(s>5zNOXmk6{N8*CxH{JRTLG14C)@3tK)^Y6F~StY2~OolmsnzWd zZr|Z>ym12@|D9`fu~yXlt+Eyqx*G08_NV`xl~}F z#tR*ZP+*t2Kd5jqmSR;_6&9!kd%F(3&K9|x1+o?#;JOU7 zFFL4V<<){EvP|9$PMhN;w{Q7_m&wV6*h~Qlq<&C{(=Zxg?|KME;lH^6Np(#=S&m** z4=U)cQN5^!2NdFT_+>8&jS8Fm7U{9mkZYieC$6AOR}b}1}IdN*Xp zQYTC9*+7>3&buSAuTY0IfG0|2YlgjeTXQ3psQ%I_Tbqo9lYa&0X%$$FBA9>mF0pC( z$Bu?HSK-%4e}KH(dIuJ%aCF5VJOkMXHGwHA16yI=xJKxg&OmX#-vU*^?zKR5ieLsd zy2PespjRh41@IDN-di#Qqfh_A^Ur=AN`&N`t3<$FyyO3(0H!YR^RE_mFaH`8!Tf7> ziT`8%eIyIukO}$XR6OYOzP5q<`@QR#Ly>=Nl5<6Ne@uE7;LOkBuX1|iRp3Pp2yCtF zEPKQC4w0Y7)&I>TxX|g~$EZ&@h9j6+Y9T>%czb5-uVjBkXi4s`behCA z1fqJu1&vyc)+j<&sV=c;IqFrZ*C9+J{TOmHG0~|~KiEK){?6OPz^LpHqz+YUU{tmk z*v5^@{(@C(U`SS1OA#4q0&1xO83CzlGozL9K)rJwP)n6df>~-Qj#)>BABD{Rm(1|! zHygN1xbFRQZ=e)xS0QR=CI_Cscx#F2=~5R|)rj?wyw1m*6ZO#&$?JUo`PA-SUELD!9{+JQ471*1~e*yg4F5~ff|EN^v{m&M83b%7NhTS z#vm@h|I4&%GfU1GMDHE*#c_DhHssvz3$5O}L`c&7-rI)B5UhfWrC`}xB_g5@_TogY z9UBaynJ+K~@wg^3s_%1}CR?iSbKZk0*;?NxHUmM3OW>0`22lljaWeORGX_z|h`6J! z&9HmYBNn;@rKi><0@Aa=>c?wu92NdSNJ!D2oc5+@17h+!Z*OECHi0Rg3J?3n<>4<^ zQ8>k4Eb=q33U)68>lDEZY;=iD%fP}qcK`&}k)i!K44L%J$;|lyM!D?Z?Zg40KR$Kg6XFi#^=-V|2Y!8*t#*(<2{u!GKsOkesC+ zDUY6b#&sE(O$mU`Y>I3@c61%f_G1#-k899=yyAkg{Xnc70jfeARSi%NyC*=+il6|s zyMz>=+gy(V?S~F3Mtgn0MM#N}PVSU1X5m3QG3XCo0bBq9s=Cat0P0{b-p%|U%$qgJ zSU7_)EwFp}*RBZWU+Qw_%_dd=1xGnDd!x+1dy#kc&NBbDLjF~_FZBvwtc&ThJ38i7 z09ha_fC=u`EWy$x7066bRsaeNj3V#seom?P6i6LZa_P+OoT`PUMvN5}nB6(ubr_i4 z$pWdG&v#uGA_ksjrGqL4bRf+F{2J-gz}06Q&W_(e$>@a-GF5Y89%rSu`0+qpHD{ab zaaOrhU_dnwa8|ht%-`#vN|%UUOZCPzoDDz|8R!U6Pg2}g?mFxU1-PwTdZ6AB3UFJw zB&cHLar;t$MtbNj`Jw?2>Y+V0!0q3;A`;;2|Fnzg)bNjktI1s@XY2mhoQ>THIj%*m zsZ_iM*o(i*>G50k1)UbUS;oSt;oIDLTuze|T;W#ttl?{1ViRk4Ra~6>I~aL)kCT5h z|KR!eALL&>c%t&J3HIXm{}=h!Dr4c~pTP2D*1t0UsuaQet8%RjG=wOH0{2G(!y zj)&7EC;qWB@PA&lMb4apqrvcS0Y+kKRLsD`h0Y81j*2Jo5RdH>6;tpKUyT1ZXa`=g zZ&VzChj=sozoH%Z$o-957)p&@1iT|2|9sFwizezjr!84*_4j#IH;_#^G ze1wDVhX2L117Cyx-ZLHiAp9?*9r)+?-)feF&%ysgv;%+U=%^?;#=(!r|G#Jle&K0R z@jM=e+vW7A*bfhI95cKJPOhB!Ar`QI09)i6{Oml*5-m8k?d(OisCdng_S#|C&T?$N zXc=Zi^0!2O9Ou|8YNBG#>ZoWr0NvEkT6`JWpU1Ve!!~xZC6+HWBCo-p%`Ua2eZTi? z@lQO<7h}7xYlh0=GakNQk7xP);rRVSsFgTo0REOgP!|8-8)`+4VQbrhOGqE=g-~5X zO?de}yPDr~9e{?JOVJ0+c}PLdS&gF?hPzrtncyPq*u-jHOFL|mI#0`=x?4Rox5V5# zFe4*JM8y?&mjA~nOdaZIUytFvk&b{v2jW?NfBc!D5i!VpIT0_H|D!4zyVdY8s@%(0 z_K5cdHq&*-y%x(`EB-(B-UL31B7GmPo|&Y(Cz;7)au6WEaG#NIhytSVLcvu+JjUB7 zu&k~})Kz!Yb)&9=t7yD0l(^p48VKMCL}iu3Bi^E-QN&g8h`Zj3{-3A1s;7Dqc5y}B z-}m#c&u5Z)pRTUsecyWP=sN6fS(v<2wFEgd1Ijy9harn5sITdaKL&1|q@q27(Sn-? z+@0fNnww97o2RO99O;sqeUOrgNp6lsN*W9!pycL6fPYkP+XNLiha-lI6+R3&xw$vO zYK(nS89^<;J5@mHhKwL~3{de3?or%hf;$WTO8BJ_KNUo+Chodfhz3pE528gAU)+NM zv?A>EHMm+`B|#07S8VQ@1^QQPA^>#y6li$l9Q^qge#<_`nNGXe2i z_FDX+X*jK0Jsg9F%RVTHue>uifL(cE+)kbw#KydjGe$?P#jTje%VXl9LG~Z63WDDj z;9%YRM??Z4ao2GCS;$zw&6PRJKI{{J74kH(mgz(6?H~;klk&U_tkj?s9c#x80KZZB zG3B`<6f&eXs*#7wKI(3d&cdXUPC`;2~}(Hj_YwZ(8JDGI`K zEoow;YrtQ8#2XzEu{YYVFCGhb*NrZUm*az`c75S_yEGQx|6z^bizKllx;vFif>=%} zgv+xVjdLgx3^`+vlWxrzGhzpM7j(q-LanK0s#_Nplotq55C8DdNfB>1PPm}d){QB) z?=~VP)?p{K1m#ZX=v7(M>+800qZ?2}?Kpq6Zd+HBZ-cWtPsVTEQ06f7HH>)Z{afN9 z^c{RXok~=2Tsu^FTn>20tB}Iu@aMO7t|+X;5y}6@2oYM&B0h;fqqf1Oshv>7|6_y* zjYY|N?u>c}})C=)voBdGgJ9Di6WkQ5{j74@otqzHapTUfep=$Cl#PF}C zD(C?gYRW^oBD_ET?1*1s3VVUiT9zw{`W1-6Q6RQz$raP^D-44;5tq!a)r9#@WJJC# z`r}vlPwR*JQ@XO91do-Ti(2&teuaf0_c)x)-SBuw6edGMW3w*AL^_DXeZB41=VWGn z_QGprdqraQWeA`hO?6o^Qs_)kJKy<0f+vTQ!hY-2Owb(}v?x;Qz5uWt33Qo(tHDpj z6q|OO)9Lasj>#WtY_*ep1(Ct-!4E^6AQA;use8>5h!e#2XNS7Gb3n9{Xtd&PWeX;ep8%n6SF9$XZda_Q zU)`?Q1iyc~VjGC;+Z8#bmVLV-vFzIwC6;x&BD;k8w1eR7itMdr->yi^zg^M3p0_zG zHwoVD{~U5-{oX^H{Up{%9as`S0e(_WhD!5a2hm1i=TH~Np}M!3jbCoL5evC zK%^vwgs86QUi~#&iv1zQK$Q&=N8k>HEAcBl2{xhe@2}BPf0fidi@?R4ngpttO%GZLJ5P z?`>^@-@muDjfAh0D-E5bU+X0N8Jz^7b@EG<5ALkemc_)hWeH%)vS_TMW!WmnD;+JX zwk#&*TNXSI@Bf%99>cG20J>d!?i3UE!AO%3p}-lO2TN9cf~IuMR$$D^kjpEnTTz(8 zRXD6jUPZkM1g@Zt@e1ln5c)FiTKN6TxEny=u3q;>1Zv@f6}Ic{ISm$@guaZs66Tw? z5<9$%TRWPWe|IUjW8Sn)OSXA8ZF6Me-?R1IA1{I z+VR!GH&9VTsC@*uxd_J{SGsUQU!!wh_*^U)>Cp_}+xnc%>$(e5ONzdDWzQ8B1WWUqxbX)9-U-EOjb9vGg zcbx8sr^NWU^Qt?>J% zM*J$`n;M-D)6|%lHZ=ikvpX@SsnIbIGfa&$wl?WZ2Ze~`%t7q>}3D;0*l;elk z=l`ekSx!Esiev(v+wVYmW0ahOT}L=aZG+fGQ| zOllM(c-86pqmy!v?q!Ke2qd}Ii94?v8OQPgVV|3WX4qF2R1;+8piVQ>%l+}?c82t^ zkc8(Xi+i~PMXG8Wuc9x-KP&wtGhH{+e@uWosABarY&)JZO^UX>N7ZQ8?pj}J$vxW*Ar(20%jrGt*qI%l;AR$x8e)^1+I zr>ykO;Mqy!+pJFbHhW9+%`-P{#gDG;_T0meedQ*zY_r`er*v8noVj}pXD2;juy~^v z)O80TXlhSSVPn+ZY7mDca-{Os^MO`gol1t?!uj%uOhRm{lYOm3XJ8-4S(OQyk<8R= z$;@_l6Dcvy)BINuqm{0QR3_{X`*5pk(^N&&Q(4;EV5MkBH8`A^(56d+0fp3HKq2!~ zoEbHjrfa-{IqQK~2MYI4WVnf3xy|k7?t2w(SO>w17+VAGruK>mO!V6&DD1xKT~72T zcfhWg6~7IF2i>0&i}%E-j5;JMz?u<5ocTsTVm#DQ#QzEOAQdO)sMm}tjgH3gjfX0X zb2w}ACq}EVb>n;4>1dVvfXik``wvcE`-=P^ zNG?b7v%nb%S0;w!eh+~zP{~PA-R6$8trH>vkjV4n8)*pWNSaTxw}62&tXaIqf)kqjgSWhR%(G{)nlFq!wGlUR{rGfFK4uW-^fPhBiuV01BsYEy3H)V(>5n0<7uYL*%XMjB>Y2hi zC91bo(155k7!Z{P1ESiXUe6eoeD;Z&n1nPamw;;X67&p8YH!1!RD;k4W$W>tRb)N! z4T=f+21SFWK{2t6K^d>&WOdNO-Ckj=e1<`(M^=1;(geacC~Y8ogOb?CFetxLQL*dk z8Z> zQb=4np5<$$dqF+-po)I&x*XfJ@}+OwE^>^Q*cXHz<5h$3$9N4O^cb%det$YCv7a%< zt0tkwcn$QcF@gn0js16Hyx6@cWh#xNZ!OQyy}%OH z@Ec>ge2(erfyuF)yVLR5YDDT=^bxPYqc##><1)I#F!<4qI-UGJvbDVk!L=hu1L%w~ z25Ktg_OLJ<7$){dZ239)E(eHJBrq^^*~_RSfdQe*0bwHv3`O!e5NsupJpg2~0AZgI zGpDh{0SL8yPE1Z?Rf6!Rv1&o+X{-kL{b{Tg5SYfYIgOZw_vJbw7Q^D_KmeMiuwv&u+{wZ@;ba+jkF?Z{Aa#~g1eE_I+$hH4PH z4E6B)WoQDSr{dc9Ku^Ub4g#U4;;KM&n2KZioQlhTcB&=n8R8gg0I(lY$p1K7M~nLJ zOO603{G?lfzc?=gwQ)9UWNB2^$R^}1*(K`L$TkwXMkWq6YGf4%T_fw@_iJP$2|er5 zNj)f-cvFWW+%C~_cgL|9bCXyW>E_;vkFSj&3VU1K zV~1UguQ?zRCziT3@TU#~|K6}%cl00efse%Xq2kz6)A0(3pNyGQ8~eg}nF=_Ttk^Z$ z%Rc$)AXv6C&y6=3^^YO5t3MkiRw3K0{t`r0a;glQz+MNd)E2HUlw^nc!hyB26wZ;^ zVxI`H)4oW@`fH_WPk;3AH`SsV>lPX38&IRmPQWzm(RucH_c&sW*_0oHDP~?2^o9ai zig~BnIl|rh1oXk60Lf$WMz}96!RQ2S%8;{ja^xj~RUqVwr5BO$I!*BQphiW=O9VHl zXtC(WzeUK}&J!=Kuz!n?3HrAP1wi8#p;jcJFSinhtBiEP5WG?oQ4qC?khcgGsYKc1 zWxj3RBBVj)#J@$z1pQltQtEX!ivA8A6I6Rf+M=t_H~)bqz0b zma12|Y5`%TW9XTcQ@3V$x^=aBD!YlZm2S;53gYS3F(_UG#FLzzS1EO?1%$6#?MiU+ zg38npO1{*sYDGxhx>H4K>ej;w3+R>!`nnYW4c)3o5?Z&KblTLdHce2s64Sg~N!@x* zB^uBz4F+_}1by9VQ?Cbf%LGl`dQSxo=#~lkx@Cd^-8vP_&za!WL8)7ilRXf+Wr9+- z&VX*2AjH+rUXLr6O>o`~=wf!m=>q|9l)7`-1WRTr-O^yTZc)MLTJW>dxPU==22w%4vmEgR~Pc?ZPCFfm!stM{=iz0rp+s^{JrOQIl*DVta=+%65zUxsdtHcqyX;P12U^CnnwOxAtgS-RC*XMo*W zD}6L{>jsW0@5u{K!t#kf;+NbB-yffchifU4+u>_wvNyI@V3kGkR(!L3>T=w4bw$(* zwkj`AY{XA~4(*~*uEZa%&P@I**ZLnLybt!_Sr6vQ zFX+j?A%|O(5TPr%s&SrL)tFowvBLMMRgKB=T&w4)ExF=${E{2-5_+)R zKtd0;TS(}^b~_0@*#1@}#*v~PY}*`c=Wp$muRkAP&~0<=hzWA=9p@Sn6T|>k_R39+ z16kQCH$mMi*BF~bzgHdrb+255fhhIbedC0~%us;&UJXf&(_kB^u-`pFh;s zpkxb%`VNQsV~z5wA-`nS6oqSM$)z~^8G*s9YKPMr2PlvxlYW7F7jygCs?*MZDcn6R>^Rq#@e_VrdYD3@caFR-hZI8b*-vo`e z#~(;FBe0d`1emO)prj*j{92mY0d+;!(rSOkn}rba%{(@m`;bZs|~4_sCYW81pSJqQC;x@6K51saN3jrgl?KVspL{KwuaOrZHC+5!i=q9Mhh@~p2An(~r@)RO-`Yv=Q*>}X9+L%r zWp}Z2v%tc;a$LLb*1?d4JBQ+S8fINP##uNbG$3AwR!cjAi5vUa)|?C`B{?Hn;hbsA zi%Rg5h%yzJv*j|KYW!s0&E-1sYtR;3u2at>vX|>{D$iT40X=j7P)vxRdm>hxZn3CHEMwQ^Eo6i%u$ z;Y{dEII}tvPX1LHL1^Lh#PpnYzHsh4Jqt92!%uZh2PolooxLYtZ@ z64|Cka#EU_z}Hg=^V6J7HP-G}c#^Yny4h3-?G7PGwKi1)%QHK!)B2;l3=fn9XRdCZZ;8tuP1Vi z#t-~@@{=_ct)0n_a?l+<@9WAgD4cF8DnVonEC}Dg!k;m)AbbPM2fl&b)ibbx=~Sku zI&PhPI0<}{kUE_G;YEV7{V>0=bZjcBk-Fbh)PwL#(gZ@6q>Xt**EGfnFNvh!Y zOHxNdcfhpBf1;*Be@NLPoIqYvO{!bO&s0`A-n~HVhF|jUIrdUmu*cO?sql~G^s;}0 z${7IJyp+O%1wdM`3Ro}`l+DXzSg-)d=H*gYumH&Br7J9$39@+^3Jaz&--0cN1q*;XAfnjPKay+ZMiKJNrYK0^r%!7z*7Pn6|`w zW?E0@^pS1I2MT0AIr(&s>&$seh%e2M&*c=l+oEud(4^$^_2jmh#n~|n9Q7nNv)QlQW{IIHsMPJ7tZvQ>%zK;Qg!x!GF1z4ctDt=u>#f#M z=M-E}d6WWa`2ZF+wmdauAB-I3>E+Y89#3m9VV0AikcMd|== zetieumja-)0K@OaPI?toS^!@1>T)>R#@Jp2pZRqtvAa>pt3YUTRmTU~Ts4x=mHa*x zD<$fWvNY%mfTOI3jI8QW7QdE0Zs7iaYLyW!2UN1V+f}V-HEmezHGcA)c1%8fx+E!*H)C!iK-{%UOuUUB-w~l} z_rcO{&WMD!!PaIOdcS91_*znq1l8udmBFX2>l`;5jtQPa#DkBF5K#p zyb;qynzGwFp8bEx8?q+lOGI?C8e z?@(GGPQi~SX!KT31WhIG;RQUOk8-TgsvK8dg)BpGJ+GCvPmGA3_ZPe3Bm9#6LrCPn zkwzp3%1}!Yf!vXCawx?AG9xJ&4gP#D!<2SWVNMMNI!V&loQAU#e(cJ6`@x;SYUTch z|H;!rg--I|3^)W}|KEo=Jp(?i%!PoT!=LT3yEyrK3q?EMc16!C@JH?qc@&#mo&XWW zrh#NDh;Hy4K;mK$N5M0cdUaFwlOtVM{1w0CxgjgJy02#f_d+(XzW!uv#`u0Uz5@+F z#l9-k#eEA5ZUu4Bgh&_n96U)3#FO7!eeyS8EnXFfgQ{~dsUY0Y@6dze!>dE%ozL*v zVJd1SkbEYT?-U@!=?awH!RJE*-9of1O?>V7Q161Tp2a5}5M2Hym*yn~;mHf3M3hVO zu2ApNTw&!^{NlHTxL#q@7H;zV2A?DX7&dvHfM+J=ZSwRIsPYo%ArrXSjErkV%aP-U z6i8J~z7(o(_QHCc0C;m~M`8a4ZPB$x22q{~_SE%3F#3Mjjjls)+6+1LkSU1T9gMW< znVV}uad!-eHWHVFhB&wNw!{V%wdC8ZP>H(;VC7(hm=)^jPQZf6IuKkhR51OI7;S*S zYCOb?id}^z)u-T>j9|ZDKrfcXU2!I#d;ld06}VzI{F1MOI24|_B(4N;7d-1pB*Ipz zv7e_g6A-(Vz8TeK4t5bG?+v*pBjI*t>Ap};XTlmR7*j#Hsw$Zd<+xW2fzAv;2(Hv_ zLhwga2swo0HUsAjDny>JIYg&UZ}1EE;{Nf1g4 ziJWjZcSk%CLqX(*Q||Zg;KMYDk3xOjyfd&Y0|b|N=8t9s-jj)*j{0=gmc z_d>wbFhudM5SCl_fF4(qiiQWqa?uNF00BLAi{NjiA3Y)Wt|!2X3J~Z4<+p=_l_XTp zN4UR1l(j&TOF}W1m9dpXVYs)fl$Be7K&7-l&icYdzSJqMmvdM%#542fXdn-`Y;NDSIS`+juZxa*Hm3OFm&8)nm6=qi60H!Lh ziJ6tR%}cRXhDhijlgV`#PC`E1l;#Fj1gsjbSnRhk) za&?!@I{MgPFT1j*fVyf^BmoejkyR%EqP>$<#{?+_I)B?J*QZ%&wx&VDT?msqg=Y8s zkd@b_GVs0({0b~`w?aJnGURTJVl*PR$!|i#VksD+Hm?|V1^l5QUcQrjjl;D2VVnXW zhiMyOqynHaR(AeBaH6$}VgRB*8hzz93=J~x{x%E^vV2m|Jz;Z)tJi76m~jwnV7UE}1&(13z*$a*yh^2(+So~mNmj+qeQf%eyk<+loC6PRoZl{imByaDin z5I2v6&o6Ps!}ulVp`kMyM-jRkoutS@{9%_h`7k=&Uo5Geef4v9WsfDm%mbBGOi_zL`yBY}_D2d4bPqwz;V-vAP! zN$=!~@L|vy*|499K@Zv) zd}g@2JqdPKJL<5syBt$!M^M{cctcxZ&NO^?k&E+F&?)~lnaCr5Qmsnerom=e>5X88 z3~*}L*#%a7oq8&pmeaxs*;lR{g-l!)?qzce%95d8U6gFr)>nhd`g)y_TE6xI_D-@# z+yKHio3E=lWGcF&8USfFg>&XxFfhZs^rVTsCOp(;=P0GXX((y(+VCKoog@vi;0LTQp;PDG))>MM-48&c}xGzN9ry;&3758lT?FvsI ze%x({I{-57es~;JA;~-4b99eK+-;1zK0G)U!D{3LCJ2#l*Rwl;lJ37nGM2+$U^{R9!4M!0Z{i|Md*wk(1I!)hCz2EGKe)jT?<6dXHi$~ z4!h?e@m40j0ErhelVdWOtfpUPGXHZ(rU7KK84_V*+Ct({RaHJ4?!`}q@;fRT)CwgB zkL`R-SCtgzR{g4ytn}gtRFwcItBQL$a$JoUlglBpp2%@M2+h_e`aQPF;TprO2=|f0 zwHamtdbpO@79sR-tqO!cT&n}&nHl#6B-zM-OOWJHB-si=Cn>Og+)EO+=z}LMk=Har z>5b&}$KW=P(MYz1Wh?lldYVsOy&q0E;Xanopk&|$s%hM)Ldsqvn@0J5WTY26*ZJZ7 zA+i+>fDG!M4I5X9tR+7Uch8@U0bDH!4EXFDG2lB$MKXwyaNze4g8y29@@tVC_??XR z&Q_?*8U}vC{%9p8UlqC?Blswsu>XQhlBEh93(()ZWP)<@lHGu`?omOpV2fF-bkayl zgVY$A)h1+hfeJa0AhWsxuRo-~Ojggr`)d@M$!f!)Si(8VW7u_QSCEuzpPdEHj25`g zFtk$BRY>#;#LTS<`q&@VTH;0pa!Lwdfqflb*Wgws*6W{ysj*{|U3FVx%os5o;>qRjaS;DKr# z6Q`eN4k_UJ2{;+aCF&8)*v#>Xo#c~H-(l#ERN#-)O*xgdJ&rmFPsJbEL+OIa)54KB za_1Qxo!FWofGm1pZE=Kv`HOT(XQq{iN5x$?1#uL^vflBSpK`^l$2-I8mBoNgk=EQrs zIkWJ6oy1Y`zV1K4<#rIs@2zoe8;Gh2AfC6}XbxtSw3Do!Q^{(MDJAVB`k6IS)A%2% z90lfU;J5Ht>HY8}lt(!wkIZ$?dl6aO9Vr}@JIq~M1z}E#h_j!-fmz{|I3o*0;l7bU zvC|Q(7DVEsp>E+3IMz^y`sDDCXaN!X3=0Ly@e!__#H%?)u>^<|jtc5>uq!u8Rnvc# z8{ZcjJ+#|myUv{Rvre{+t_L`Orx!vrO zj4_imI{YHs7o7_2B*-tq&gTC;SXeIk z-oM2M(m(Q$=XqGu-W#t-#|8>#zNb{4F?0{zZa$}~S?TF`KBqB`P7$7uMUz0= zE8Q3r&`SUF81?=f5o#R~%|y?xn3bM*ta|)=B>xzmM_$1n*+#R$ZRvvscf?4AJW9S^ z3@R`68?St{b5{ClL?U1L%yOq)2)nYzGbQ;`L9~)sE>Bwx&BeQZ`EHQ!{!3>7&3EWl z^ZCy5`Q+nN2Eo420zPk7X%CjqZ_v-5wMFQ6cOtvjT#b7euEDq2*K@7VbG1P31vTkf zAaCS?C!s^P2DTG09xU7K495GM?Of< zdO0PDpgPMe-iH9%(YVPh zKD{yvlv#`(usQ?F`tV>`{Bq1OXh-w3;=!`$3r}Uj5j$vIfruT!3ic*)vb?uD7pE## z(*Lg2Eq;7yCI%L3^3=X|Zeb9^)selNQCR`q6GObx5Sl zc`_T^F$BvN{nUWjlV34E8ULrzXQWcDxIJM%yC#zkv4akcB;#MM$bfwL+H{UnW4ugE zeXWc?ZRpuPjP$ndwyAs6(p6_$Zb11YNaeF{e<7o$!&OlGJtIyDV#s2@W`KPeaxB0- z4ULxI-bm@0<1^Xk)M)&89vJ1!?45x*>4FHh!oS$M0hphorahA*H#sKW3d>y@E;l(= zDI&1Rkpijupv11FVNj0h>~GFC!T-3)u?|V-O^%H^ZEm1#)dV*=igjMDez8rC>@xYA zvvmOpcG%=d(Aa1a9gJmh+EI1TfW*hOXatfW)}CX}IxL9E)K2XLbjmn$tQ_BFNRrXl z4bk)48Jh4+$BWGwI{Rqof76VHen|?nbRXicl^*t1T-@Roh@#^x_YQOcD#7uhIvn$G z9L!QZh{@RL<=zIn)Cyw7@m8Ps8Cm9rcB!Z{yR<`AK*KJHx20X`wAT=5%$fbovrnvE z9qf|?m3?xXQSB>{@QPEcl6d^UjC^SRuU*m0v9d6^Kr;G=-7_HvBjo4_1BCO((=s3v zA!qO}g`adDcYg!!=0w5W*_L}RxLb?Vi_TNrZ6XgG#a*#}3v#y-k-_T!{M@Z&DSig- z{t7(CQXg=4<~%6%^_IIF+-*SWMf1SW+0fk<@*p3?=^)yfFA%X4&~Zw=1LE@{XM@p; zr6H4TW4+Oo|9jnAXoU22Z+FsMfaf)m$Np4n7k8A{qGE$&W_TGSym6{Oao-bSIoA0x(iWnn^@fQQFeA3+Ze|# zKd)vWGb#L}tH)m}om>|eJF%EgTJGy8X5t?x=2IxK#Ad zuq9+1jZVriI>cmWXpgLbhS6zc%s+Fra6UKs8tg}|xY+9DTxn>7v>qrTo~7`UZUX*V z>D|Dl4L5>K>nwKz*wjiky$#OX12&0wQJBdfo&cLFL9Do3$+(tJenA<}l$k#Zng5uX z|J<^_MCP?)cd6(L^kN=jA(SIHc`p=(9pDBQ=ISlf0d65Per}oHWQdm~XK7f{P}uB-LknUDJsNQWH;PHnyHSksrTB+# zKm4q8$=h-9yCcE*6GCnhoNq-@i%taRU!-Pk0O!lV`A>R>MJ0$8CD`%)l`(Fik?nqD zp*{C0i*ZUvtiv}G3CaPEptUWZGNJTp^&tcNMGhxPN}7&7k@mq{2pxi=bdp; zbY{ry1-3LGzeQ((E$hIR7P4h9*zz*i(oVMQimLoZHe2$nLi?=E=Zh#jn4s+^Vfp&()e8M8J~6(wdfjUd{Q49#-|#@7BfEe zi0psH`0xX|uaHwDTSD)|#eHR{VmF1{v8ZBA$ZyfjU<)lo8`;w5XSNVavnmoZU}W2q z=HbY;w3)YgHZ#$VY~PM-(`HtI@NH%th%IL`8xh<8kj><`jNXu=bnN(8=~dv2{3`K8 zNQBni>SUg?S+vsq{}C6>&!U@H6i&(4@aMPk$q{&xz^c}w0bzG7x`nOe>Ad-*A{P zd8swlt}sSI1ThkF?K8SE70(fLFS5#=zg>h%ryRlID|0wy3`I>z%ME5E3^{`bO@6(i-KgWEpn0#!nc%S_<1>)1?B~?yI7B;GybvAyk@j4HS znf$w6@$IsLF7FX@hG${k>%tjhOzE*d&pg@YoL(WpN3Gzb9>ETidKwH&>S+)!i2N_1 z991Ydg`QCkuOspTl;g9zp&XZm-7laVbqt5=sO4C&k=(-Eu^jKWlK9!jf+?1Ot`nQ9oH4{FB=mQt(JO5Pz-o1K(xi&8Eg?*%(w}8U0ew=s0QNs5`L^SqV zrW}0hk>349`L-uH;ve`ulETB#fpv&}A)fi~^JAQqrb+$*Hn{wRdPinwc`;Tsa5}_~ zudj@cHhS}oa&&-^bIz_U?~bdx$DFCs=!P`7Xe29*7n#O>Sw?>OpuWzeENs-J7D`$E z)>V0u6U+M}K8_3h_y);5pFbZw9A)H0wnL+O#Ot!+TRy6vGc5~~X~Zc8?I?leqsuy# zO0>#IMh4uvcXZEeY)o%a-a}`)5}9UCoBb{6*xuu^6=b^noRb}qcZwsHKZHQM#oRBM zC*Aj1GKSQS?=HvTm*w5@mV9$L-kh+j@g|fX(f3=B^(GtKwcZUdzt7);i;8AhtV--+6{$g`G#P0 z)I(+z(ecuA_A{j05r3`pp|8iiaz7tu=Cot*d6gLR8fRX#n|%`4vXcVN8Q75aC$BLGjnk9!Wa+@ zAj%%ZVetY)3y8;iyRk2(V+Ruak9AAM9$Jjf@fu7v&U6bVqXSt7|Kw}?#n=yPr2o1u zQL`IH9Yi-QYWA(DB__*|2o7Y0mz^W$N~Eiu1~CQsXamml zK(dde`nZeXPrQQs^A!3t4o0aW!Bgn>08s}bdvPUgc=jb5#Ii5hkl4SwWJ5%YT6FG& z*cRT$`j*6IUJ+MWK`L&avJS8P<^#9pELeQ<8RErLXFZUi;=)7-4%66=5NM5P^ zg#l6`WqtDso#Tv@B#47kgq_=h=gLuxWfgfrF%#?{W)12$B5`wm&^s5QjB8uhgW1n(<~9Ux$9u(ogVN;i6g zF#zN`k;VaT{CI=OluF~kK2Al8E{bQ{hcA``MUh{CQBV~kLoz+Obr6~8Tw=~NqlYCM zYP?-+ibl39NHR2b8>9CG0}RpLuSHvE*%!>uQj(;VXRp692=<-o4z(klEg?SLP+;1w zGQEU2*lT-Drd!pfRH~chJYWcyJX&6ErCb)Ep1kPs6A9Jsz+j}b2^JSZ{@O|POW{zI za!9L*IZWXjab30$0D|LzUAI&PD}Adj`5?<4_?C_pJ22o~J{Yt6yRHv{a$EafX*`r; zNN-!a2;B>dnbHru1h&J16j@uhwd||2MLHHD{by$)E$mFBvo|GD5$eCd5usP-8|z-# zgj(rFbjP0oy!wpzi;q*9o}=wt{U_Hc;be$%#3uK^ErOYzfYbF5TQ{Hw2xuQTGv zL-^HmU8j!`2eHY$195BvSy}1C``)sg)vv_b5l1z~KC7{ZV(JrUY&i}p!RDQtjR~Kv z7}2y!dz>-fLrl*1oNv@(f^xp+L8H18RP#O2nMguA`XSBk5ITG|1=E%N9>I5zWjGn<2sr89nvJ>$^ijB?}?tIhMN- zBC10^S6_$@2tT_wGSib_U^y?=O5&Fuub+eLc4cK72*KeI)L(sU5r&fvvC zi@=MQEq4TXQH`9gUZX@;&urH!(KV6yu8!HpLKkT; z8%g|fqMIp2m;XUrxXf-mWbbc?P8!Ste8Ho^Y-LVQ*g^(VeDe#4F8}mQ-%uJ%l*SO< z{*o7af){s_7u$#28Q?`Fa=Lm4@Zdaj7HXO8)0F5MNc?i5;{<}0z7W|x`d(yr_mF!6 zvfIM!qBV9eM|Rtp!?RU(Q{Vog+4Z>lG_u?0K4cdgj{bz~RwGlZrz-B&Gl%DEoA%3Q z*W+&ChjH;IW_SOPdjYcB#_S%TxSQCB>|Uy}TSelRQwFcG-y7L|lG(j6Nm7T;MYd!2BiqYD?k&i6E3@5#Y;#GG_zu~| ziUPU%uM&j6q^Op}&$}>2IGb2fF`m)uT}iIX~=wmKY=hZ1Y?1 z)5cfW>Joafp+JP*Iik?}!cczs2yZ82@ucjHj1#%MI<)ix9L4Y?{uIo?B-ZDaoRg1S z2V(RyF;Vp{=9RzuYp#fdZ_E|D;8%5z74TnOVT)UCkBh2jgZTXi*y4Nqsv3g08PBHP z&H30Cd*D~K1ZOHMH&&K(&I56IAaB*I=tsutaE=M9&g&OnYG537R$b6PKC4W{fPWI3 zTjrdag$=)(UyY()8?SSyTJ@JfB4TFp$N0^H|I~gnpFbw8O~fN2pA56bC`cX(6Lz+; z#h&<8^|mtK2>vC9eVhf#Jx*_BgYqIb=QhNm9VbPqLb$6Pd!D=F zJh;Ws&362Xr{K7@J)ocG;a7Ydh)q9v85u9Xx0;C(Ok{3hZJ*ouqWt)q0wmos zG{ZS_3+vD5)236nDeTU|cJLGyAQs;oE{?I`r~^^;d@|5}FcTfx4}u-q4+;Le_QM{z zBZ{ot5%^zxSGd0;vul7nCq%eCOTwasdAlRrFTUZG%zNlHh|)Q|oq4YYvFitdJ<;P{ z%%J%)Jo~O;tv{4?u0;AwJSSq_p7vuzM+FRE-3S9|(6Xpo|(oKt>*iTKVLma8Jph7gQuB zhfFNPp)XWOlS2>1y(|ny_T(1P#k*NzNS+6xM=Oe#gbO9xeyu>swx!{iWSa^4Y!iJA zwpA)ZvhBAjjsV;KpuhmzOi;7Uc?M1Qc`9^@d0Q49;V{ETt5Wd8TX9PmoprgWf?=dP z9O{8hOJFe1c`05QcISb?wa8lWD$QUJlEGZ(*}^BQ!{acz!KqFp8p2&=T}kzm!8XxV z5`pT=Pqd6hq`X|<(-J&Zy8Dv2I0e7rXT$ED6g1*2eop11-b=u+5#CFG#0%@sL|^LF zuzN3FYT`?;sh8UHOWrqT-yqc@J!u>c`;9knDLz$%e!bQ>;l>-+EYpwg0q6EQ6o2;N zAFiAV9}3^I_*LAJYq9$;-6H(O%9K~IL=rzda(i5bb5tJ*i;6pPyUJVCTR=#acoEZW z?V8|5{nVr0lb>*-el?QN8};i|a`HCfCQWdoew!lx-`l7!@~V4zb(DukSm|D`#>J)h zQ4(LmoFtY*61V1d$**`5cAP~2++ug-S&pbDF(9|d{TtS_HG!D76Bb0?{}dL2kSGMP z3}!F!_pm6rG2-n#t^(2hn#!?=nT~U$SFZSv)_{0wa2j$uC!vBPdTn^oN%<3bnvp}90_W?|6 zAf!HKRVr*NBi9O>c+61PDos#f>l7gs)=hbg=MYMtEYU+@YzzI9B}~viSt0-$*Jn2( z39YcLI&GdTAs$z`qQX`xLMm*fkr7rj`&?Xqq(OFQV$VdnMYkymg8tR)JE+%bi~VyU zOi-C!yY-Ne*j)wYhiIABBn+HP(2v0cwc*A~BDYCJaWDug-SY(u#V-FOB5F}2YO1^l zsR6{u8!+w8i;!AC__v+4gU}ZtrB>j9z6hzB1lIGoyl%Dugnt3j!zw`v#lH}9r2^42 z@@}BQ%6?ve^t^%l7a+Z)KsK2E1xUHQJ^54b{QEw$4C7s>imBH!hOq_t^7X78gl`yA zD-}UKt5(EMXc+5}gx0eroi_EXO%v3!#40aW|1TOwh($WjFiwON9#E3Vc@u}kpk&f8 zPK05sBSFJ>`!hHriv$c~jOMQm#KNITx%D-%I%EBGzk+c)@GWEKQ%-x&C{^KIYfuzlJ|khU+EMnE|U25es=BiFXC4TP_gi6;!5 ztWv~JsFQU_LhEFsPFtR;qX~Jc4pu8j)AK0ok#;n~5~S_ZE@1mi(6@aW4A?#sG;N>8 z1GdiuecNY(rtQm1D4XHwx3-t=5pG?LId*$QIe zZk|qxr!qQOts)QTqzM{2S*yaDI%#6QP6j}&lNHd(N~A1x@(}1@EePu5QSe`2*hP7Q zYvPG4kUF^=gcArE(8&fyu642%gs+q0X+tL~6(MzUrApUqkJlowh-yR1*qdl%g z5?Uu4blTL(7EMqm+Z7@0WV?|OUneyf&`A^Yb@F@ldO#;l(9}t%k5>l*I%$HwPMV;p zljzx7Q*BX+UqwIMRCoP_ws;ahN&M@3TMQG9sF;B#J4GCEJbo3|f!HnPh?DV?!SZ)@ z#CZJVlM{D$#9jEwcebx~#4-5sNp4$_m)ZMKKX7&vG(Ml2p18-*^lB1X)9XQKO>cr< z_dQd^UPJ*+H$g+wD^*xi(@o6R^Z;mTdKlf<<8DN9LBeO|aOBW)MfA7r~<@YC$agRZM=(ZGxYhp5-9wd6g^| zqx;GV%i|{&dfQrsJlZ0s)MGrSRl4h=ElkiC zYXDSYmD^q4Q;G8vUBwBxy__Z3?)r%W89PBKhbkmpaeQt!DTjIzkVBMms8-ovJ(L$m zP#)71Sj;#empJ8Of?7UDtAOlZ`|=5ZT0Q|#$;W*UD$>N5h16}aFnyto*VQ-N91 zDiV;S%^FqJ)#DIj_a&;qfJFCJA*pS?L`_grA3+RgzlH?lGU?T1dW!ifT{6&ZAJ7_ugs9{m4tKO8XAX7@FYBk#RTv-1H#0_;M@$ zD!60@Y&hMG9Wnz)&fg2^z1zLu7(`SBf5Sc{BHDL9OYESMV%KEQ2mSC@xHrzmP9Ovt zc`1gzdtw~h2*MxKwt?^mwSP2T_XoA-D9{+x%Hee4KE!#s<=rb>4ZC3h zM!V8xug)%mUcRJo8vx4G&sq0EH~?1Ej0$dwF#O%|)z(eh;K zbpX`WBmnyLy8Bz0L4E*{vtIW;#}RcTpzrQtOaiumn71pY`g%W&-DwYkC;=gxED$BP zM!XeBO(6U>>uHrEiq>zlG)S)cZPtq_WT4FofJU43klAK^rQQs*StjVWSpm@RipW-L zjf#Y`HnP=PiB@a90$I;9trimZTdf8Xy49*;cLPq_IN6J6VF)d(b`V-v`>W7Fn`VMq zSb>nHO-n67+}fs9lh8J;Pq~*BZN0o!YQ2hGqeE!B>-nD7<7uK7c`ab8)CNLnZM}-^ zLln+Rp9zg^qSjvLP2eY%;;kjQIdTHO3WPuYs?!ALsTvg_$6rsV82PnB&xgLHu)z4s z1pV<>05ry5tw=(TzjzCc%m~L{m73uAt5y+m{PmeiG%zQi!NB;-1pV<>q=(06S`B~n zWP;}SE2aVm#$P7r$6$iy_$#kYMd3+e4W!`kQ;L#A14`ygqD7ZkeoE1V{FKt-u|`Vb zAr+%3iDwlSkc0{Pk_do?B&v~wmPEZu&ij<22}+_(5mFNCRiXh&XfPlN6Z9qVsd_yi z2@^CWu~7vMNWuhtNtj?j616=&$$OHR04W@8NFwpDA&DvwnL42fStk@BC2^OE(Uim^ z3JXZW1bs;aKtmF(NJ2|O=nrbLPG~~b2}MXryr2>dNJ4`FNtmE7iMQ430ZEvkDTxnN z;D97d(3gY>nv%e6_fKK#8`nC7dmSOfHTaEew5+^DfhVD(q}6%_pF*cDjf;^uA9e}4 z42k~e=3Jn@8dQPsyE%0r^jCvMKG0tcT1n`y28jVi2dlqID$rS}P@vJll3k~54czZK zjaMMsAOEYt?-XcsYea6n0&6jMX{FgKb=e!OLVnl_b=eE82f^NFjJ?km5a@Nr*y|Jn z(W^Y&EvUvIs|tSfDP+&Ho_^KyY+@MQ^L#_4#*&#m&o%_|d!C6w24kv0_`SFu2~P$A z#`IU9!5D7{h&TPN*Rd)PI|;JqL!q@WgzlTRGu3llH`atFslgecRm1Q1IL}b=1bUnr z4D>iP7|82c9rG%MxVM4(LflV*y8r92Z+e{q4I#?D=_v|l0sX$I3Cg~y$Z0cDg1n)^ zpHPjjwQ}3l6Yt{~zl%xDu1E3x?_o{kg=SKl!KB0xk4bXqP(?y(c0CARfL38A0(2E< z2v9Pm*uZ_JbWvbHvnMLhV2a48HeR>VU6;j01AZfKvBGy9=ZH^P>WeLmrntf&a`(Bm zD4k`CkzK9GfuTI{D1PvJ=WIk~ooCDQD@SgyBFnot^4Qst8?A8HzK%SLaHNBXyqJ2v zzKbPSQ&((ltdM1Haikk+m-7;Ys2z2qVjCWn5^7zF#MbZ+&vpr|)4uW#;p6J;npZPR zN%xb{b^9FGWqpF^+LB>Wv$n)}J1gq4Z|t)C!L8_p7eOH3+WnmGj1ZhrDHBf8&O0xY zBg&x6a>hB2OwR(j-P`VtbsO5rpgB%o`{B1Wl1|d|TAwG8EihQNHg5w%7*GYFfF`+jG<| zEB*RnZ)si4W2B`Ug1=V!&tE_s849f+YKv+rF4xvA+ z9eE=^RXmM3N$n)aImxe>W#uHO=Oi7{XgJ2f$ULzOE*G)4=lSAv+BKduXaa$FbZA(|sq+NiCZ;+CiFYK)x5fYgyQ ztJ|u8l!re`H9?M2@k~TN?wKQYSD{(3=F?pfr6~7NAcb4=aW{ES&fyB9+SRo8ik^uf zUqs)IX2CNiLqM5X*SMM0kO7Inh#nE6QjkzBN^#EDy(F@iqypX zNEfPrv@Wzsv^XY4izDJR0}rW?DH(E%O>PY-*n$S;V zOmwf}XQjvAi}il^)y%N$rf(Rj=NPQ!*O=`878Oi8ndU=Q()rVAL9py(92O&-6aSns zg=9v}Oe^N}G4_^H;|SXBMZpMaj<)(Z=XVyXy~M~B`BrnfRqB))@3X$tEU;3}-`Im! zPA0#|8thCoj!DSJ!x)uE82(HvJl`K@KDQ8mvLqKYyM{gXjQfzKsMxb%%m@zm|T1VqWQwo{E2U3ISc%mwKpX6*WWe}{@R<8%qLBgy@dn6l6~MimdyE=KP_`X`R4H8q#Sm8RFAX1jt1Z^xSJOXag?Jcu z_~6@Y@dbW0!?6cxpF3@F;`<3qV( zL2oOv`}a|CF@7wI8P6udgLxN$3z4hw=VSclziCA_7CYh#`fs-axEaRuKfW<4%8`Zn zhggxZ_;Nt=#&7-^AbzeVe*y2ry}e!f-Wdsk{7+2$7;mtF+{*6-6#|}LY{l&! z&=>6__$M4IS&@~g1(S>I*3Hip7*Jvij%Y{701=*C;)qA_o4*GPj)VC;&iu_U15wb+ z5r4sN{x%@y_s8PF0U-9ZtkA#qz%I(afa*68$aEN|urt&V_4v&nj_12oIwD+yKk|7c zp2LhUy9UjloX=yk8hHvNThc{~t;iiO+hWQZ_}5vHC(wgAz777jt;m%1w)hmkMeD81 zQMIRoIoLXm{s7zQMYqOlj4Fk8Tr6si+r8Io26`v%$!WNv3|r+fd~zBt9zQfAnc;kW zaolb@B8bhrG%p@sIxPquGS-d1e{c}1yU&g9@@^(=4nlwZL62xTtB7*!+G5(>t}yaQ zEgW>Q)id7PxA2&VC3to}yTZsfv4Lx?kxnWL41FHv#o8kFJhIt{{_(FrEQwu-maP^3 zy5>T6y^A+W@$q6#UMlwJ1{}--V$tG01rMym$~gG%&vb;NbFwPSqUCPEVQ*rs9^YBf zBi0W?i5B{w?h@+`2Bx~e9@UR@w>{hvb@0nCB==0m7ZMQsLNf0i*sn703&~(GqZWRC zA=wpca~kN!7m`VMxrJf)g~Y|$9PK0{ytO&8MHnTvBT)01rE*PQsw=EtWh`)e6o;z* z5<49U!43_V1ZBe|7X?-$vQ6HEBJE#2LUgcylyZkrFgx@e?4Ja6OC_hgboSU7G@t2; z*dVa838^f4WxRU{IMNQkWaoomXJt2!olk?Eb?|d}(^Rmq34XG0U%b#poGdKe1PgaU z3W@GW;hng9Jzl7SU#2hwDb#_0z}%kjH^TqGsa7oZIEYpd7akIe-HGHxIg&WZjctvX zD&fEHGH=CaE&Ma*x;^BI&jt|uykx(?H6l#1f{kj=pYeaYuIPba@2e~(CLN)%e5mW z2f6mnM)LefU4!AR^Fn9i{bP*rK6OUUF)cHaXKPo(@jeEf3CK-5s(QmgB~dq;DLq+t z;gsU|hgWC9u}~LQ4|NWQW@tz3!5gfBn#TX=aHBb4nlJ_NrG|;+#L}WAg|P*|TA&Jx zD$wafG27`MP~tAVG9*$xFdH!*cfXxs6oC9In-Q&W9yC}jL3PS*^yoJcL^-J^6}?3C znm=dqD^&t%pN@`NHPTqLw9LH|Ri=^Y4G$GY#~AjQfoX~^MBr8gKt0O;cwa=;QwH8f zM874aoVG=F!Vno_s~Hg*YM*bEgE^Bb^SDtCf@%iy)~pQIj1CprS7k@AO{mg&uCoa2 zM^PZ{M!C&2_8b`B%4lC?!H?P68OKa1M{HoLh1o~B zT3EyE@~|$)t_7278UJ@BZVzyvflQhh8s)4olvUOMPKeeT$}05|6QYR8mCXm=+%D8r zwjZKbrv0db-)}$aLFo3Q1%4VlwizNN1tr^zO8Ea>n-OQ5q1||R(00VRxK2A_*=-1I zdWSZIV23tDg0c;<`DsKuIkCD~HxaUCc4$*rw>z{c)Uyt4iUf6=(s5?>%-|@9wl;ed zL@aw0L`;u@&=qkov%%SoMLSuMwV3JP#s{wd@he06`*#m!`>RKqKO|dr1-*!|~&ge{o0S$FK3hWt-KQr;0 z_5seHIo1~Laqxd*MJ9f2doe$3h0le*Tf*kj3_bYjiSo^<-pwKeb&iNP`H6!@O`qr`p$BDB(PVR#ebJaB4&CL^22q8O&NrIjB zV`N1-atm^F3evaIFM^}d(~L1EElKkUJpz@OJ?rKZf@yP+NcJZ|_5!m%2@>n@NswU2 zPl8mMY#TsK+W<~%Nf$+fWu*&R;)1hq%_qfXqX12)NzEtsa96?K4u3@m+eemwsH_07 z6myDSFCcq8$9OCD#s}#qjKK!MzT4&|g|j>7nw29*D)zAoT(0G+V`Tfnf^accBM5(O zQ!9w<#az^e4vV=YsMj{>L?o!!HrZR_%1Z5M`Hi z4~APIr?oh3j;jnSL2#u?K35yo@`+q!h*0uVK?9KHlie7XAGFZ_P?s3L^|r$gfx7(0 zn;MS8o$zf}9{p7fqN4!GscZof(*i8NuGA4{9qEYX{=P ze4fJO>(ThZFXu|jzdGNRovG&2tn$yXtY*K9@NkY*e)vtcyeqi*PnibyI3#DKxw0g% zl4J$%JbCy%PbK${kr_I?;?TB&I z8t1I1b_6kcjdS)>J7O5cMmY>iQV$9xQWJ_#|k8Gu&H)~}3 z(@HvPWc#Be{Tvu&rMW^zu8e5|@Yx1}b6Ii^VPYhn=skp0AlO0XNd($)HrC(B9RT$n!T_i{ z$oZGNi5YrE&JCZOfNCV6Paj<)H&}vhLXSw{JEe@Ba4977}{WNF_))qV$u?i&bu{YfR~?Ne_;p944Sv6)k=VMkjs_eRUrwzldeuBC-*cqY9cyNh*m|&opd@XW`y~cr|oHw zy6T^{XM+AtIt@zcJQpd9ZhLR0gG|ueNv8vIfF#r6X?xlc^mo#kpt+MSFhGRqhYW&4 z3Z9R=g@+XXNm0DH*j$}uulM-)aP)O})RlHan6bIuP689dc|d{oi{ppv_KR4D=^6=k z9A(N*h1yA=)1gAa7jJk2)*zl#vVc{xA2B?){Nk%Imo z=sn)><0Z{cJkpVkR(it2aj|hn^hR#?E0x!++yE7b@tmz%NTm61rSiC~2KfDhnK7U2yHoi)mZwH&|uOb!7bkH!lcg^B1t#e$(z{^J?guY}yxf%t@2%`I^LAV-Ihpcbs@K{^j9d|c37R;yp!cV z^&Qp_Kn0t3wYtV00nrX($sGmp#qev#R(r`yJ>$1$V^a$4J{z;bb+d}%eP8tDE;lh; z@_ljqy6a#=mE+SXQ;MA@ZwzANo7lDTTr_rzZ-edCB6;U4gHj!2C~mSb;fA3$ z5WDmn;GXyAT#*XxaB3bA#2(xomC_96u>v0;pK%%hIZ{bNbEFnT2ad3Nkj)Wd21gqBp5{mk3C)pq5Sk;Y?F^1o zgXq8!juJX>grMd~oE*`PK5!;Z&S)pG5hV^eq#dygr`*BIu<;eCH=kqWxT)i@@fC#Z zX!im?+B7i>DJ3SLD2Y%kmM+DmLLhb-l9Ix$gWnf!BZv+~VNa<;Q3(1)nQdg7{M=<| zSLfs`Y<#y6x)uK)d*1m{ox2;9AOgSt=gsGHlR0On zpEGA>&YYRCI)Yo3<6L#8LbF?Hp2ju&JaX?&_Bpo))h2H1fliS~{dQjvovY`O`zI6M zJ{H0q%-#x@mVfcb?K%g5dD@+tBWkC(%u|ob*52qbkJwgYo)Q2N=3$QwGY@eZ^OQ55 zVxB4jih1e)DCTK~-*55sb}h8{s&%I_L{;6Xl76o{)xaMx3AS>1P^PD9i-GVMnaj}@ zv{+9AVXgy_6%tYv zqZsE8cGr;12gtrwS8cDHM+1P|DsguU`~TKZ%`94`*$r0r2WV+ZB(3hb8Crp&%;=6Y z4YZ7}X1P4e_S?Hb+z39953E@ym-+`3(vqguLi0WM#lP_qy6F75lE@ zW+|-@A{r!if`|r*N}-4bNg`X=ETwVr->_LqF|Z~!OYOcIb4iZtX>@fagO5tka5H*i z5ayYTasvLD3;?ThCWFzuGa1eBt1}tt{Q}M_gMUq($*4qHE88ZQI>R~yh)|ro8lgCa zR)pdb*#gB$nlQzQ3vZ7T*NQV4WJPr*kYAsJV6t|63LS(`)FBlpyA1s_=142#6_}_ zNH;5dPU9!tc<9xP%)=OfPB{t#P`zP)5*~mS!jkM#-KrZ=YKc55q+^*e)Y!s$z9l8g z7l#Fg8e-u%kY+!EO{rQ z%}Nny#xRVF=V%QmrPMH-%cEsS1w(9&F^m=-H2`4Qk)&lu6Z~O|4ynyQs?eIM5tO({ zD@$Zl*GAHHUE3BNa(3A# zM95NPJ7Zh#TwWCcH3l>Rz!;Dm_8z$KK==o2>+n2Y8T>qlXCE3&9Ry2YxOxnEIprL61!QQ?BhcOPuy?8 zK0NDCpcJT~LxF!PP=9$MNSM+ONZ-94j0+;5V9u-FD z4^L_RfK#*?BOs=)*ZP4(QcNGJiD_;PP)rwUVw$*!0Fg*fOxwF?CqB4LMvp@39M7d& zhQGLY7i$muKVhN$HU{P6Ahb&kLeBtTrL}T%2W7@?Mwe87t=tlMU)$7u8jaXO=%7}& zxiUlfhd9|$_X(O;o}BYKs(W!;Ir5#cI|{*vjH&?m7q`^`P*)N*^MksQFg*@{y11Xo0bP^&BVYn_B2w7AzCv@ zBo{(7W~)LeXOw|gS}#WC_X@vD860B#D^^_}N$S@1CkB03k`%7H*Okf?b zqOe}WIW*-Y2ONw0=0DcBNj3`4qkR!Rh9%FVRkLmE$1i^H7DyL-PH#Y5=Vl zTfACRIm$Q+qg7`p8PiETiNkbkl*5dU&Ryt+1?AXIq9rN&WGMiA*?RT*($e>!5Yn~uJx#;1 zuz{uTp#n6QzqppZSuYCHU}VNA7(VzCb(I&x;Y-wY9`NTc3R5IRUKA!$ zS&isVU(2ZyGPIbXazsi~5@xKNkJRl;h>YY#WJ`IGJ6XA`yeOz6c`0O8Wo5m>&u)|5 zA_XAQH*iSo_yte)H9A zr11!krKVm+v6SPy>fwEpmcGD{bFC6%%dE>hh;+|_38xc;UK6XbIqG%mT$oOc2M@jl zMdS;7-WWjpo4j|6s{o+WWW8HVaZzd-U{L!;&Bl(jZhvcRpna!?q{L}I74LR;)m9Ls zY5SXF8wmRgttlu31~nK3&LL2F*Re!z7(J4wH{iK60MvwC1ix}z14DBqy)l^MVvI5mPN9RafHEs>*SKBJLnJc8|AFS_eRK5I0Jj6~K+s^bUxnHcHC?sEyJ}`2B6W8UU=D!(H$u0@(e| zz&d!M%e?y8>7Un%Z&drAN(?kR`gZ{aEc5$>V5iEs~*ev9k7>Xc*QU3G~I?Wz-} zaTRyf>yUfxbdOn@0rgw-;{M96`p1ZGWUdACNPYVKF7p)ZgqC~2W1dn1ig_vkM3`q4 zL{By2DdwpspqNMO957D_{C+>+#B8;6-kiuWk<^g_@G^N=gU%p*DVFPLOJYLI!p0rN;Z zgIaIgLS<_)VRFZ|PsyBe0!rpo0Z=lh4t~GIn*l^x ze60;w=`z&%am73UeCDZC0GX!-fX_Tl0Mvk0Fh;9NDS${-{_hW1pGoGK0p^kFhbLU- zsX%3Mp4uI-stG9OsRs}lusCJ=lc_Q;@%?CZ0zw>OaOsCGulfdwQ2yqfkHiil^Cg6EnOV^hXxDc@W5c91b$_( zP!7K`nyi9d+P~pcUNwLbMyXqZS!7E8L@faUE91TF0y$qk;=v@ zjS$kgCc<~2Y>C<6%4WkFqLoc@_}Ad@n_J>=yZ@6xXP~e4Ys_xaZo)#m1&@*GfMn$X zfd3fQ_Ti-ei=^*qDQRa5BwYe_sQoXx!HEFM0StN$Z*sNQw$E5Td3VXT+72C&-rXfy z`A8A}?vg4drtU7O1K{6X(hOit-Ca_pZBtOj$sLUgLrA%!k#`HQ=_64n+*xADJ4+Cr zj*^r+8W!&^QI0+i_$zrajltyGRy|dOf$$ia(?JSpLjJQ6*lF~UpLTr=hg5#YQJFFn zqV^~=mHZY!B>FDIE&@EnzzF^oU7TmrE@i#v~aHGvCyHHKRs9T_}1FFnu}zS ze>x0Bz78B!!y?~|LkUxFHdHAESG%JR>zZ}E#n;s&ry*JsqK%$VnEL3zAQrpy=&F?c zW(c?0JiG~!|7IG>!lMxDnv_WHH640u0!I|5Ueu~X?h8*Ch;wyose83Dk|jqUS#0m8 z9h@M}(D<(wpO7QEmmFccC)1u{ zJ#Os~7ilk$unp#!^O{%A=S_!Xtw6ihzF<0%ywwC+Pu_acrq$#XM{DFQArK-jX9QvL z64!e2T03AWrX0?5h}sv;9BYdZlHJ@oRg;?xNn~n@cAATwa`YWNvp9)3$w|osShbvW zxwB`gPCK|mF+wfTc#Z#v`ztEOGD*;XfS{7SUUCUqh1_dj_6S-}p!EbTIA(PSTFO|e zzg7?k5p>Pz$+urJDzVj_o2Z& zM?TtqNp5HBmwQ9VsYYjONrw;;S|+a1agu94Rr0QMduPRcvKqDBLIp`u%&dznaNDXqY zo#%CtW&*A6A|=PIP8TU>EY(G-2>g9rBz`K6?jj3W(=E^|#PI+=@w!MU0Kbb=5Lo+N z#QI9>B63puiP6`jeZlC{bs|t-YjH++i&X0 zK=od~5htu(zd^Lt&lSoU%kMV?R=?j+7Kf*T#CcP}s32VUHxjgtbqUQC{tiLt67*6K zR8AfnT!Jm!ns%E4lO+KDeOeU& zI8TwrP}K^cF;u+=WZkDl)8{pJpO!c|FtI9uUlxQWR^WB_q;6uBB_21$$J#eSy@^Pfw!V~7$X3o1>(EfE-)nyE%rv@J;~pV7S^U^E(nvr$_guu@^Srh5JEr}*woarS zZtYU^x*agfYDSR(xC@bzQ?yxDIf1n{%L1FZ3lZlh%(AMGH%iqrIhl{b0C={}NiD!z zRLb>+XXXw)Q*X}U@Z&n-o*0~ycrApxzc1!xiTR;}V>9=4lEdD_mIqRwc|e!s)i3}} zpDJ%J%KPY5*d@~cD(yX!yeYR5;LP$)Nj|+?13xaxP4dz7CivID1-bH3y@J!A1z*Y4 zX7T`cDFQ@}?NOZ)IlxV2QRLX3M7qcJ&>;HL%4}G^qn;|$9;@LxY~~q5Em1|~m+Oez zYb@Rz`d&NZK&1OtO==`sR5>O(^X#6fTQ#du;&?yQHDMedx8G5-B$WYqKhz{nsy#4nMZs9rVvtm@-hRaqB#71kK7suIbnUawVEBE74y5~pfq=*%*lS(x=W6_vO% zFU)?NihG9P$EhUs!jDt=)U*HmaVnW;=y59IqK{MYc8OJcoGOnY`2f29IF&4^e4Hxl zttd%=o!z&h>e<%bTT$Y4_`SEHO5k5pZ$&K$3yqx%Q;%v3zA-5K%w0M=u9ahb!BVhnH}xknguoaelNb0bm`TBn#6Cn zA}vvlpx&ci*{e_{QTr~&K3#i5q#XNn?TwGrwKqgYv^NqN*4{{DSbIaHroCb3maYPS zjSRJ8_Iuh0Ma>)ZPmV)XSu)h!W%{XU`~mdLPzSR%s;Vj}(inWZ2O z=4H9KIHle#RnKHK=4AzEVP016q(0Hc*Pcjd<`4N<<12CDc^PqXUY7Ubdzfn>rJ07& z$9grSVVfDlY46iD@yPB5L2tjQ9mXV%0w30MFF-a|GBLbuZC#|r<8p4VE@n4tb4^&v zh#U^{A*7Wf(w)p$*JufFxjeZgxjaJ4iYBM7Ty}VOd=1MOH#*2WIH2(2ewI2wnznz(8Ucb8Yp)ycI&4()K_vS-2@UN-)(5K-R z`L!^m*PUCCGk+^|*!7y2FS=Y-J!C(`q{m@DEI7xTB(eXM0&x4CDAJSMm`RGPz9{EN ztKSzX>{dQU`eHqqBc)MF=~iIaGBSnpJzeORrk(Rkz-@BSSdKws90rXFv|;UXZ_ua# z;13#21lImk$!Uv0qu^Xws-DSFyxADQvx^=1^g<2%{?iN11k}?D>GQOw7s>$mPcKvg z;88^V=>=)2^sCX$ifOAVi45QOFOmM!3*TetsbS)Ldf}ZXz_J8R%q?>GI%>MoEl}3` zrj+CBF=8D)(NM#9c$&ev3+lxt0PU;1W2Wiz|LB;h zuxDsTN;y`_RCt!N91#bdn(IjQWfcHUaUH5J>pUP!eaY49np0mkv(#Vi>@=ew=?gUV zWtjq~zO3|sEcKPsRcDG(W`FaP3W z64?ttR-^W-kZ>b1vL^A7`T~&1$O2Fz!wW!(3@-qQ^e33`n~x3EY?7$IFftP%;-nGU zw`O3j!~w&|yoFD1E{0LkUNQ5HT_XlxUtA7@uj!ad*MQWur^ULZ9@UJgIPG7#!PjGm z)`V!>L-;*p+(m=0Z$dcN;OiqAd|l}6Asjp%Y)Alm2n$!;;OhmgjGP~Ycln4@24C-@ z($e7Tq!1#%`oQyAW2~!pRQjafk&+fVy6OqnMt@a8Se2qEWGx+)!>v8pPsI#9L?Op%< zSj^}?P~HFiB!C|QNZs}<0Q;%iz+Z_4FPS}o^o`8RNZBsb21TkyY9GhbcBf-dtho+6 z@p!Dgbu<9wcVJ4lW^CEIxh&&Ds(hUa}8kt4p*=}K; zeF{8#5!kd~GI;i>5YKYRitwyN{_Q+lit@NT%U4R2qZv0!>14fHaz2rvS4)VKZ{F#z zmJrDcH9z?n9?ucS3pH2vYDopk!3#C{YDqQx|9iEB8-!RC>YF(m0#UmLUM;aAed+1- ztuO6_sv4Ol_ND$>Uy_pJdGw`g(3k4jm!1#xrFAI(#r3K$McVg;^`w2%XjbV)8EoH+ z7kQ)oi!pnM*38mO^d&U&bTo4bs#W_^sF~NH$SPOO?C@2cDz|iwd|juGfcLsiGyMMR zIwk)CpcHQ90MzR`Rq%%uZd4;g6mCRvGj@$A-1xdq9g9ST+c+rMngMW2@#vNmZUx%n zmxGP*f9`diEP*5Y@XMhNL1bj`_L2H}g~-TyMIyuN6^RV5SBUhdZQ9+X*Rx?W%PDY1 zXgxu0Sj|RHxD`DieFNBQcBm(;LxEF<^0kCJ7xXg9aZib+d2ef{ocNWe zoG!l|-Pm)){gqQrouM5yGLs<@q)w&Ul?df1eC=(XM5rdvdWq14XswqB1(P(1P)cC+ zCBmO5sT{6pE0Be(DVMP|1lFTvY!k}kN(3%r3oetT%U-^o2l|JXuf#=`uSABIuf+Y) z^0gE>s^x11{HwftEn%rbk8Tq8|H-49Qc_iu9BW|NDkW7t6T@;p35(ujh!2tmh;$yq=TD z@Oq9&tp^7)__*u^`!{$Rj{DqRAg)4_PWO6234zx4f^tM_eJ`kDEY%C@2&{fD_>&pD z#a^HsPsY~Xk5!hOczIZLT-KskQ%)gQy>}!z5o=~$*1`nr0!h#(Kv202^?*yz^wpr@ zgC0T43ACP|)ri)5g4Q#ZBB-ePO9cJ12^jSfCCEb7l&Xjd0%29eI$V-fqdZYnguLP) ztcvJIh73KW%y+cc@b&ZDDhxkCLY#VnBuf<`H0x~GntB90o>%B@LSG`xsL9r4IwfckNpG_5EW^-=0cwh-am9LTc z7=22b+02KfNQeDw5#IoR4#n@ey$zH9BHCQ{zI?mUUduq&y0e=pWP`2c_#08_qmteqbqL%9xJModW>>D1>NQ*OJC z$mhm(NZqdCczW!)>FpAEJ%h3mSGVy1{I$DiXx0{KZe|^;WyB_$k}?Xc63uLcNEB~? z^HH>txaj~Xrcv}8VDKK)Z`|pI$b3{rueL_PPDCGA% zir_gPnb9sO8BtVFGdcgf-oA|-b?FN4a>B)JjK%OW#5Jwj$8 zTS?{(TOhM@^Fz=kPXTX{yt``TrEzF&4(x}9hmhN!Vx}y!W57uaDQW(=Mn<3JFKI}2 z1#jWvY=+X5A!Fpx(Rl!+s03hb7VqX9{u4GD_$4>q#W@JZ@n$LOwk!wCl-^iurM0y5oBI|y3c7gDXr4kpq zv6MLf#!_ofZBfD=&dS>}HG3{1<)abqAbOK*pMBgx6aagNG+QlKfE+|U;7nzU^xk)mot34`={5ejHeAuK8S@?sf%3BViH|v9_2V@PR6#24O>w_r!YGe>4 zGBSv=c#$EH$d(3Cc5|7RK8O+-Nr6ah5Oo^Bz?CRID6)?;jJ&BT#@l0?0Qk4Z7EBFp zk1d7YXR8VT5w>EbB5XyZ&sO@q)#SJEUHOs+-MjKnLqAcD+XM2h{4ccr!q40v`23Eb z=MvZI{Q>JRO(3L^Lah~VXJs@bX+Yhhm9I$&iR8$zOcMycl=w1?lp}*xtR+B6x&1A; zKr}osj93!uZ2fHm19BB2E&t-rGx!;q%OK%jp#^V#+@>X{a-4tFc8n)w7p(@(0rZhw zv>t%pMa3;1z%E+i0e@o`Ek_ori&m+;*+uIVzv2hbT)KR7(Vv~<)BhGm$U({BZhDlFs>x;baC*iw$`)6#AH!ZQ*mN=I& zCdbGEgn8cu`NE8CCj_-8(s8M3WZFNO66fRh^eG~C<53AwkKfY+48zPvs&R32LX5@l z>Dh*eUkJ}k0=uD%UvG*sF8jq2o!>}_L5-#nOZ{ev_kOj+AR}hPx?Smr@BZnyUk=(M zAvVQN1~cDJh)>@GFceFOSOFr8V5B__BX&DHZxN_L{z=p&_Q3C!_z=HALr|f1aa%Yi z07&Mb0K-RuQX~4<;%@u~y^85%Y}dZFI2%8i*yjUn(QOcbg-Glxmi9aR=|32l(`_R* zU^82c#c$A4wqf%A;n>6YV{8u0bNGBe=B7X6M?l0rG1`dECLjbBvD1;pJxm8>Hs1lQ z%sLDle!Fs3XJksjByS#UiCKGxK3tCvU*k6`J3TzPv=BGmz? z#5SKPJopISS+hDMek=%j2F1>-=i8=6qddy73(cBSm^wRj)AaaXyI32AZ<>A~Zrhpq zAVJP%#};`PQJM!2(Hf7lb0f1~qq{hr^`+>ka%6NP^B}&wf#0l@Auo#c8<&HekvaFM ze7UNf)z&>85&HbP`V66Fo^=$6eii=Q0LC4368P`+<7_-M=mAe2Z;Q-sE)XnKjzRzMtiv=c83aMo z*0~yz3*OC+w7c3ThLOC97|t1sqm}jGl0jz~UF_kZ;5Y<92ZS82FWwa`sk(6tIuf4)e0f2i;&4Ix)0(1tJc*-RPA32rXU*;E}d%-P?d} zM~fZMF7JzZF;Nab8poEm09Cm_54%GFyR+-Kh;MaEfmyaZ28LTmaL}E`5a&u%su{qB z2N_QCQCxD9{%RHpt{imR(DkLi>yZ;p-WYGPu_2OrB|2sWo zR`<_B>fOKK4$ww*|4+TBWEQ{sk8JDKE9m}DaGg36X_#uf&pKV;?UCU2Nz$j&c+mI&Q2I8(By-$_ZyY zl-#I;U&)Q*yv%jEaRGSs46Wi)ZoCIlH8VxX4QFGJs`M_9>MM|n zLZk{nhs)zm^6O2Z2m;V`Y{$IrAW^~H@RKxBzLXO33ci@^8y4+830(cO94|!zb0U60Q&-_34kwP3hoUA z%mS}*vII;P(ibovXvFme%;z3b_KsJrGW)m746)oph6T(JEi+%h=t#bnCakMLv}ImU zDeNg=HiLlCk?v&&)JI6i`_zogO%N{gJpprIOY@6NOY@6|wW)wFVD1bd0|BG5%n~pP znI&Mdkh*{=1qFNoqe5i~7=;W3%nzs7qJr@#V5-5wH2|g!jpfRY={@cVKj{Xh%N*cs*V<%TL-mMG3b`f@`!V<0%nkfanG z&!EPY0OZW19)hC=fD#-{^lO5n;6WM7otcyZ@C8Q&fc1H1a&MSW6dc>NI5UyYxTIC% zod}PS`5KagTYH1vi`zfH9!w6YpB?mmJZ*K{A?Qv!yGX}6Zu zwfdZ4cFeDYP-p^xn=ew=e25^PV-Edx@0c;Wl&1-KAdNRjd zW2BjqQ>#*j7->?U<2*CT6cvDxR0p|ss|Mgp$a(;fkj}pmN;KjF)@%;fY$XIRyKzbZ zQ~-#)1tN~TPPY`2<>PuTYdI*9b1bs2EPFNb9`tXo?DZ_wC61G< zVR_#O%3cD$U-ohWs_fMO{#w~7&LU-JxBa8C7qQ)yW8gu;I_<`66l;=@HSq#69H@bs zuYh2zN681>1A4r~?*AqPBcFVmq)n07dmqM=Z$rb1xO1V1E1DZ{2LrlOBzR&^LSOq8 zb+$)BuX)2n&1B>vd^R#09qlUD22F%!_P@I)M1SgZ5jge$^tnyc=|a~U+ZNigqo_Ka zY#FibpgFC;kGfJ}o-`0jXx{nKeHQ+3j4G-!4E7-D2I8-gnYjSfaxVqBakv+%Arfkd z3{|}i(%QV#3$<$`lu^&L9>U1f{W<(Gez8SSL$1+%$_0*Cf?v_xTqBKKrP~pIamCg~ z`Qp~y3Pe$DuCqC!mmU`vMUUWWqpilB;Ovd0#qn{ui*If8MnE7k210CMZPS>IyzpCe^z+7KBM<$- zD8#_M;v_?qAT>nXOy-;GWiN)oV`Nw>S(|bMT649jaQ$`q>dFgyHKGzaOONBXQTbQw^M%YPyp58NGe1f@e(Wj|HC#X+2uMKa}=Q-Bd z8jj5;M~&lKLSA}E5Ze!VRtreGbHXQtw4Gv_GHz;;mN1V9vjo>`I6vLLtpvAgxv3I7 zq~ZSd5}=!M$H`aNPeC&nnbEymkyErnn44~)U3cUX|2BMHfmiB^I(ZvHJryn7?@n*; z`$qWA_wjrJu#VVgSd0_g+r7iUuH*Nj({YJt_uQ)-`Hp?jX%t+Spbb1rL zXf)zBABJ9ZKUAgEx}+z>#oL=YsV^IXu1P7|bzGr!by(57a&au@tz}3HODvnJU*$Nu za;ari;vzTY*d-$KR~9$2zb{w?Ap(CYG~mtu}Giz63>8c!|JrhnEPlE=s}ZRvF4}c>HZNkyhya;4w0% zg7r^13gWNUaK?jF1xJ8XkAPHPgH)ve-X7+pe$=>>Ow{$LLTjqVrNl+_DiRs!W-E|Z z*9mL22^03&AugRjF73VtHl4Y5TJ(@%biW_K@{Vmp(R6m;`$1D zX|89DMR?_ija_bbupg>ZC~OJAD}&lcYC&@tbdsE@r&U;2>~uki-^evU%b0x|272YV zsxF#|sYP00RzPY%f+GBk6EM?R7;`=t3e=I{gN9hY{EIHescZn<9`BZX`o~;RLH`p@ z>V8a2lw;wROzLQzsuhhm>-Jp7e!5Nt(`q477ieL*#9uNg$2#`9ASiLt@aXRv%aTu^ z2Gyv|k}JA6SEDrb@XHd9E~p=X%5#$ z8m1o^X^7-V12*9GqRP=Xc?YAby?lOvWRD^eN{C3ST;;V2GG20ZcB_yuORBP4g}6wo zC}dWvC?q1Jb_z{umfT|4TZM3PVwM$B=6{P}=^<6B);?NvAF0#NN9y!b$d#28Wxd*; zv%1q)l-0QaxN@`*%ji5=i8m%Zz&;5pa^*OrclyfM(9)F;?0KD57#$Ns9}7Yf=_wzw z@}q)C0=-Ozrc~2*#OE2d=*PMKdr#+Pyhz>%jxJezK`dI+%G+>d$mr_ z#wuE5IhMX;@CDjhT{8%a{ad;7S+K<@nBLJx0_k`3X4J>;=;>o6;CA#f0)M5WllXto z(eqwMLsudb7En0Nbz*O;|}69v!FSM(bc8C{QYefI@FqTw zIf)6uluRNw8n-8g+~2jJT*MXkHJrqitb*q_8u4y!t!TRdFfu**V8zd(Z4tMeVL=5) z;%m{CP~Y^@CV@m24@Ate~lSxLh<1WE6Mq(_~Jq({fCj#|>t#)zWb;*PyY zn@w=qUR;9rCYm&)Y>E<&i^8lq1?$g8@#lg|b0Oy}BMq!{L-7|C8I+HEaFE+H)B{4G z1lp0JYA6IbhF4HkG609J?t%kOQf7!{aOc~=U53jV@u3Z zD1;)?HF^I(A*hc-c_V^)1dzUNEmNcPaiFnX^IC|4af&f3loWV7hXK``OB~$aKn4d(&;(Si7t_BS-5<30vedl0Cv_ z66x`oeTFs*U=l2WNW&xDHaRTmgDC0UT=DdP)0ebz3a~)o4&a%eBvmD8?psp>zEcxQ&3o0K12?3$*qX00zBbI$5@Ql%u{W4gAs( z>6+5em{qyn@X+YQy5yPw3Ch!|t)spFIU(f092gerrmiw5OkJ~#V%a9NiW3f%TQw{q z?Ng}aYG&b;lB?t-spQI1K9L2&7AeFw}DHL&7jMSPI+CimsZX^xk+nXr`ddSkfq^Cs>|E(d5%aJprmO1 zsvL1)Llm-y;aS067b2XrW}`l}iiMyx8}+Jn0DQe_GXUsSrCv0B3fj#xSu2B|?Utnv zB`-%L4w0@*gvYvdZZMLuXoK!CU=WR}D@UK(1P8+cML7y1TB2Bev?d^u7AdJiunVgk zk=U8F`G}};66ac|So%I7kDk!PEo&!`NbUrt^qoK=!yvsSf6S=M$CEmscHx+Ia_`#yP8fmDKiMH|_L z7FF@eNy)w;jN8L10;!sp@#+|_FXHJlcPWee*~zS#JCSmNt-M4{c8*jO zG^3SR9H}TspXvfxiUKCwYDGa-h8*+#49mPcWQLV%EJJtEh~#8Oa?z+Vl8eUET39ra zi6W%%kvb_9GK&-niBv#%eZ9}wuuOQZuJ^Ont$q=7?pGzw;(i~gbH9&lWh?0GR=)^( zpYRjb*R4Ks4HN-QZ(fR3l}U|G>?5p^I!yrkeHDX5EXDtse2FII4)-GC+SU8^YxBG?H;p0uN3q_iL=-jFu zv|+wjo{!Ct3*uHrOGj4iLR78v6E`^ja%Ee5xap*}rcm*mtj4hJ_DO6@4cGTm_lS`& zH-!07T78nEer7SU9dvbDQFK|{ns|E9qEcAF9Nqf#GZg{#fw%ZrWV>?<*`BwOZ2b%w z$H7V%e3uP&1iruZgB`?o z%k(?GZ#jTv%1tAJbZ*Yu0ed>XY@KVrkJ*88EOF5`xkVzaFcd#V<~)RzwmM^Tvn+BX zvmFF8ojgrP%0}!Kw#bo4TIATNw}bpxP6UO;l`z}lqu&5-(>;Q0Wd%>j73P)uX$|03 za5PManv2l~-op2-FVXhoj*!K!$9EaODc6?vE5Oo`w~F4&9h!A6c?%Z_QDTlnQnB0d zrxCxRV=QAM#-fuu!2_E=a?6y0v8iKTO!Y&-tjM=2fvA1T=# zm%t!P>D;&zzeD>=!=rBM!+Tav7U6^#5yP(hbAtoUN9@D6YJ4=ev!`Uan(gUbyq1 zhT}w+_bP3zsTzoL?^S{)x#@#A&x8V|N40kjITW_0@b|dL=#u;in^)BUl5aWI@!Ccf z$F*U*!V>cJF!F0B^gG(?Yi>nHfb)AYr8 z_(Q7nEDqiyI~eI;;|UFupBVuq3`*Ox8xl7k!3Uq%Za+J4^L+8^;$Kc9)1X3vlCryu^r2jR~l`0d!= zi2v|@u2}YILhRVvh@bmGu6QWfPV88c?Qi#cu6W_$xY)5jpkr@WcCd_%m zY!RD?fk11H$n|#Tj0-W`0ex^V)kik ziwXEi;77z7_74wu7O{R~Oa${TZFskxE%s}V@3|=Lx(6Ci)Lq#sERGJKb?@tlLca*X z7k?POji3@7J@K#*!5fCe zZ-xKY(hvOn_|4joV5;>d5y2rS)-aA$(+( zF=c3pA2&*fstySW2=hdIitqMouDBe(G4)1lTDydJ7r!z63?u$^|Ae@) zc!m2xm^*>#V;TG*tBlD(x|9M*QOXT=67+^iNCL;tt|}%l1#a(Gid1ckRnY{P>$4 zaUXv4A99N$ZpIIOckJ=!25z@|1tNtq?^;-Fn#&+^V%s5=&6v_KvNeaswAWFED-3%K z@uKWxSQlY9R?dd!+MSKz_Ho+t@e;X}!3`=Ytjv4&Xd~iJ;7_|f+lXuHjrfp*+lZ_2 zqkr7FZNy{v!H-cKjS+9cpUsX2=6WN3!AWhz>-fRXnX!Ft}q8XXqo8*ftt5f2gJMcYgf!14ozXIQ7{OS0f zwLs(kG9Io{@gK$az5f+ipzU9hFAhGgP`vXJzE3_y%irz)%kW*M55q2V_!RB?1~UDT zn|kGY3*Rf|X$MK%`kmm-tKYdBZMH<8mv18D&sE=R@ckbpTKaDO1HGxrJ1>Bj%+YMc zteKS?>JgNJrCholDv2=uR30ER|@6g z((^kz7vNlM1^n_p#UHf$;mF0|`xJ@u?o)gKX;d>_TO;XQ_an~l5K#9i3M^gJeTpUU z`xoDp1BhIF$8~Mw;yWVM#dpbR$e@a8_9;xxsm2i#`Zw*6*YysZzlYzyH!=Sgtgq8& z$hsxQW`a)1Y3b6-hosK8gU-vQTY5#(+GZxdx{kPadqQ`U6Y6Qpird@qJA(veTYT*l ziNx=Z1<|>-UdBmr>Lx9t=Yd^%Nn!FT;L1?AcfaqD+y|Lf(*H~{xikDV@GtA>B(DNN zn&{s=Kh;(%1KT4^57|aFZBVGxO^Bvk8lGi?@>2t~=v=t)y1zoL3dBXP`(qVG?w?G2 z8>-gGgITRMj|chCba&aNg^75NpjjvoM|Dr6hG?wBWyq*rZKdFaS32S(DB?{RiRPkj4Hq6RgR$R85NWK8p zDmW8#c(#8saT|<>;a99x0l&vuiF}QojQ{R;`65AXQ*JAGNaXk7sYb-5lN_fl%2N-& z+^yjCkm4-#k^(cC%wWw~0$|4hY3H(waz#1(elMv45a}gsu}CkG&A3aREJaGc9+Gqj zUk^!~yiQnH-{7>pa$I7{>mh5k=cCw~{Le!rS&tjGOo zmH|-Jtc2gMW(|NyHQBb2YD$9r#cFch-|A`>k($b}p_U4ZL{*L`xogs5gZ>t3<#4xR zY}u`_DXX&*Ed-Y0C)eU8rFML?$?m4W(n~;V^HM;?H{#DS{FdGqXinHrMy3~eRn9T} zL13Kxa1I6mIe1)`kYRwNBQGqSJOY2sCD&ls`2c^q?|7{vhT->a+BD)@UgwD8@O$@3 zBR(1b7t;Tgkwz5hC^n7EM@W9l>+$6W!z$N=D(m^~kC>tj(>f+IUDm0+-CdJN#BD8w zYFPR#>kRJoMYo$BWqFqHmidH*x6CIbyn}pN6y9#z^+aK$a|hmDP&u*f-o+b)52;JKkWAW#}!BD!K;3-{tJs%Jh z(5r_Q5@WPIUrHwApH&yA zqdMS3N;zsao3%?~-l+q^oDXzyBmNYy#`^>{J_gAdnSO0@MbgHfGS+V2lzlF)2~v*o ztyiJ3aozy5OCnVIX&`U`Su1}15n!4lQR_*@|NL${c+1*r zf5*a=W^9^TT++b7nTTIL?FmRViub8L<(BTGLU-nSw zw0ze|h1MYpSPs{52#lC-Nn~KY)r`ctUYuN;$20SLaMJ#}%oin0yM-0v0CL` z>rAZ;{)GGvFF-0qYF&HbcEPoHJU4G3=wIPwtk>RUfMF|AqQldueP_d&h}u^pz{Ac@7MEspXF0)ilk*G(-;H~a?( z{|dvuVcN-X_&4?N?kslX*LXLB1$f)Ei?r~vN=x+cZu<8i{GHDt{iUYeR|_x8^R6D= zO+W9OlsEzgH*=dzdvh(kO#i)T_~Q}&@?TS8?gyqlA{_ohJ-l0tY44$h zm*x2+8h*2HQ{v-IEHU>p(;gcR|9Le0zYul{l#}FF@@oOGwnyU@Us1XkA^=S;kWK-in&J2 zejyy*p{ok{CDm+9550ZlAk-Ah^&LQb5q$B zDLl?p4rw8k@|C9IcRDwf=^e2kiWFk}N~5Py9O>NXub=>%{D4ACXrT~?uQZkJ$76Q1 z7{9syh(S_hU1;G_Vi*#YJ^y07%EVPn+RIl^;bUZO#&_pOWPD%D`bujq*%PP79P7Oh zvcqe!uJ*ej)0PhR$G8A=XMJh<=-5QK)&i+ZS@K5Au6ZM%k`#AulD6I?u3>oFK&9%& zJr{AG#&3QHzqvOtnCJ;zb47|0E6T+q19E z4!Ox3*!4q$wfXx&V4A_r@13&J$sjCoiA6A@9v?zZc-={4G~5OVc-cVGH~)3yh23f~ ze~6PBp{37Oogxhxe?oIrlPlVif)`c#O=nF3?C^2K+I{>ER;i^+vT^~WcJ0#`X9{xeVKhT<9x7jlG&G-@PE5ilG&ESuP#}vqCd!{ zj={Wanq@F%6MweB7C+-R|6rr|fkn3X2EX}78}Sv3Z87k5iI2bawkUd5*^$XEw*ejk zxMb&`cWi{v_vD(LvqJU;a(-`PV0-;}3^X*_7P^;L!OihkK$BvKu)UM{!NjToG6F_h zeV|NWhp$AD7mVun_w@TD`+Xf7sCUX?e{Y7L{XEHjp3aSnaR1&Ig?IaRg8f@L%GK8O z^F*mO4P}2vB@;Vb93)8+u;R~Y0&kSWjkNaB1Rilx;N7VSJR+sQdtWOgkxJlUIRnUb z-SKb1&V8&ywN#0dsXnZwN~BD6g_bIjD%DNipdfP{G;CtQzK)#dm!TzR?`agS%~g)Q zyVk&LOcns$?2I|ED)GuFDEy7g8R%v-Zd&l6|AF-|GEd@z_$4J4d>;B>1Gxu3eC>ab zy*aZVkW=~L`_P9wfc%^ve(R|+cVm15A#OJUr9a2n~1xuJj`L3%vIiHhg4#b9XCN8xB> z3V!qI@`Pc{(CQ*N_erBm>cDB-d&jwQUfr4njaW6Kqml7=XcdFfo(VO)jq_92jljPJz0E@VUJc16ysbRHgZ-S=-z4&| ze4IR-sRbn|7xXa;^EORGJfdeU*xcLzrTP(t@i~aQibkf(?;c|xYx-Z<^04T}m-$@^ z#e$QAFH-1d?#CBe!Y?>0_~OR-0bgj8zuha8 zUVWb20|Q4j3o@~f^E}3idiWEkC7sj;pCO*-NWX>cIwbNr#(Iv_bB_t6E^JgtSKY8+ zVt#6x#)~WguQ|ImjJp@d;pS?5A_KZNnkD9it94Q5l+Jy7A<+es+P8xF5^sf*oYE)t zQ5bhqdwUKk={dG&ecN1)_h}C$zJ$lfYztCeL2@oLoiQM%u+fTG{-;F9e1PQqHr)7< zoc%O%O45OxUxy0>au$VC1UZu-oJ-EJAZHm1;*qlw{??N7>c4}WzlN(7BIii7X)DR; zXjh5K)&n^^gmEBeW6R|91&M1#bUjGf4%c-oD2j>r>&WA$|)EfIa6zn4n?yPJj7Q zTg=37LE0!jV1+I2$8W*5hTMkp(;JVfNE_mR9^-BqEU1HE<=w1)kSpCFrM-SpLH5Te zW$uM+%(3{>{Yd<&#jl|lcekB_HNug#05&&_;td+He8R8cU%~R}3dxY8vFw_RU&C3+ zCh%iPA}$&x7A1${7;icKH*}C&QdRKJ-mm-G+_S^BKX(i3Sc-F2;VuqNBiGPw;St*8 zi9;9iPaLS>@`#&QlsdEy9?wzSHC*UeTh%EHIyby>!(KnO=Ogu#g9@2-eo`T2g8m$4 z7l1~F#FA8M)~J+jv-YW!I7Mq14x(V0V3EANEbOgduo;(v$sWir!z8~9#cX)6bK-n0 zW*f$QuyYV|fQ@Dr^3PLTjPc#*)cP zjgD3yt&t^?jl74}$V9r0?6z`29@dl-)@m!~Q%h9Jd=F0w`>HTwp%t~E*zG|VqwSN} zcF9;;V$qGrxQukVY<;TB{~JMw?^y*8*XAF)ufgxkuufcTB<~PsV29be&Lu7WQ00I>eMMg!4-AN;a@fCv_&c_ACMn;jngmJ zQGiJE9X=?goJ4w;7A4rdmCJ`mQfa0}11^CY-qp7r_Xftu+==%8hBWAGTJLJoO^y~_ z&5qV!O}hC*$bp)4Bhr;_k~^zN#3HlHTGi$}uhmqJu_!>mZTrib{*GGCdmOT0E7REp zU8;@+-5M{MJ%`(hn@P11(0epA1cHHW*7f&7>(u$#xQOWj18UDerSq|I{qtIthl$1E zOSON_GF_O28W@=!a&X}GVKl)zF^j{gawp(x!&2N=$zin&rC&?KYA+NZJgoBkZ$o%k zmB{e0N~AulR-)jmG_3w{$J6cR{EnyJN~d+atbTVsYqRp<)iWUF0wlI0HY<3@vY{K* zLtKW$p22!VqJ|K~`B3ad{E?__fpX22{LP7tAqb4jyI5aw3!q`^Dz&MFdN%`HdV zxefD0!mAX3gpzA%o` z*ma%pPlmh%r;L>2sy(?dUX<9fT{d#~D}6=QO}-SPk!OU6Z0R8)KQH|*U?L+a5UD*x zlw1V1tpM#BMs#(igKewn9|E@hxCOR7yCt^$xFxpjxDvJI zC|5_BmgQ~A(e`|gWvX}}y&o=KRF1gWA9QzKUJ?^!U>x2`n|cd?a%_&-A8ci9r!7My zE@c+jhil6aBE8w5yrj6&P0hX5wuV6X{&5awk@Xjm?iG$%4-MopEFT(pZ+8!6}T*FQe(R4mYl5T7l@MrL#L)fW+^=t5)l%gX*tPMZ^Fvd zJ*UKO8z1<-JAqvEVr2f9LE(+eKhcdje_S*u`8^hYHJCv!D(RYhf%8ZDUvyG@_eeRC zo65C^TH=eMmiS`VmiZ#_*fwlY*U{%s9}Cve^pW{;`k16-uK=`Yup?iLtcIVIaX4M9 zSAZ1Z5PJOb_e>AvJCr5JLcK#-?q%n20H{&`1%I6fWW7V#5v?jYN}v9bcO%n3BG=LM z58TRAAw5w7=~xsaGYL}Zprz;}W3Uq9VXU z-)RDh0vZjIB?>u+Exv4x4s1I~lGcML+)-J4YyQztOQvynZSl0ui2|*R6g$8Lwq@VS znBQ%OjiUwBgD}n4L?^DKiH=-J6BTq^H%(N^e9=S$ zT52MHVs)A1q5>yheEcQE#gD0{#|D%>gFN?>ld8=GIQEOzx9x0w9Gdkke%&mvc57+c zb5hIGp43ZogSiRWFk)CcjjR4Y3!(St_FKTu> zev5k>&VHEPRiITCZ(um~bJ{fl;2AOdFr$}q+g!{l5MuUm*ejBUTLJ94qqBB5%7X#K ztwSx!ZzNEMJ={7JbV42W{G&RQA%tItN&xGy4$CDS+M)b+kq-aBF*NMR)vylZ4ad3X z1<<)OihH8bD|N1>MWL|Wbxd!ooz^pngYvJ3yQmF%jL7q#4n`ig1jSxLkw843GOG=Cu7L!+%y4$$_AxSFd^y^a zELF{t%teR$(-&mc+%Tt6e7G#(Hz?uNU!jDL;`vHQvU-;AF_dsFdr%Qdc%LV<>*6^m_EZ$RoW*{~=#x4z)Sub$b6e{8n}q^u9lwgz zUdtWd-clP~Ibg9i5z?K9wn)KDZ1H=Ba}L^~4kcauzDK%dw!w!U>C#=-Dd`TCqWHqers*sGgWJQ!8 zY;QS1(D%T&oh&B^`W~1>dJ_a|S!g;j`!i!x`;(TZ6KSL-T|fNAJem%4-60-yoK6yWfzpipOyt`vvPle^;(j*t^1?|AdJ9L%n^-}uR z%6grXW~H#KK(6azy}_i?Vl?MtnG{!q8;`XA{kD9R~CrMq8Dzv6*#*V~Aj2$I1xTgsx z+C|q1YuDJ(4o!NIKl_ffb4b%iw+ntoW*nwrlFXNz4oO*sxzOS(&=53fuOpyH+RRy! zGHFkDUvEenOfL76HF^;>lDvw0EJ)un6m{{{s1fO0NkGxLhLu=TbZ$ao>j|CRQ@}k* zWIAdDjm(e~ZhRbpb((yJ!@Qo||7QFtz6*b-ihq4@(6ujVi5s-gTnaVL)V-M55+}! z0FwXBah&@nnxc-tlALzQY5>guIvwOBC&Qoa3I7F7YTi9q1bB{Wj!qAy?FpJKBXPrL z;C9Z`zS`3(Y@SY!56XI?g}7m%Ct9Q-;vYTHVxOz+OXVYlJ088*95~RcIma4CT~yyfUwG8nRp=pSUsLyzLb7bS)&2oquSP zbglui63oH0oQnX|DBw}p5;u83mSr%7K!j_FbnSZWpC1o0C&igG{#m!C@z-;tzbyVM zl|f)1dEoc}Ndd*zLleu!1Z~Cc(CMd=Y>Q<|u1+hAj)|d~I3UuqH+CLR3sKO^tLtck|{ zCuY5>28k(pd$lDoOFZEJA7YlP>XDdL3Lr7-6hLA&16X6koK%Nq_1qx*m&82wI)!py zE|GNmn;s~&{=dx(ZRn3;?lffAf_(8DevO|b=4c}qg-zq9kPOn+(O>gWQX83@4#&NF zZ=M&7HB73p1ltHbwR;SR>~;e0n)9P`Mqp&_X7rD==p4BlH%IhAT6E5-x}BUA-7WDW zjQ))louZ&|D59I%4S7U%J3ZD*%bj&HGP4-{cP+Y{pKXKa!?fIq>~=PD@1Fd{7F9pl zqHz=4X;2AZ(vJW(1MnjOe%TVhslVD{@Xr9YhAhrrCsA{6WagojcPd0nk23N`!KN;~ z0VWJP>E{LA)-6LAncr?kF^Zd#?^TT0_Y6S zxdg@mxEP)<36ul)4?JUWaq7JB0LH`f8iB(BEQV+MSpbd)PzKNA1Wp7n3!Y7IS?Rnp z0St%dP687FJP1!Qt{I(o5r6^kTu~3U!LR;h!5UM zUHo4tsklMc|EoaTG7&+H%z)$Y=EWPw8Zrj|uu}cM>znvc!%^n-|E>f{Qi*FarC0)u z%uT`m*W%F$XGN|kJQ~0>0K=Pe#a>h5qJK4{RvJ;I+ZSChXKG>7#9lj3b#KV*f1cr- z`CE>tyu}p#FElnt?g^j|C`Key5b2D?* zPwo;G7^nGWQxx2aY%a&;T=U+*8UsM*yAn?FH3wt8DP5xvO4ND5OIq z@50-h^2BozsjdXIx58T+%JCA4{{J#MIA?u~o5z^_6r*GQe_>i$4}dp{Sr=Xztf|=X z``>7Ew@(WpJCCwc!n)yxP|&GH534F1lrNCaI4e73XZe7*a|uczrlAywn4le@a;yPM z;}o5UyObCLcZ)h#?`Mm00*j4)`7`##ga*Lf2O@CZS9p)Aj-RF(eVm^GG`qmY*5zO) z509Alj}7VO^5b z*>2XNZO3Rk8>RS%LfL8D(Sx{PyZ%mx|Hs~YfY(u+>*KSlBkk_7&QY=4+i|yC<$^5B zU}S?qmN6E^J{SWQ#TW<%nPLI~BSK6s0#j^LEQ;w4qMBwb2t5!)LTI9hglZftN_x_&$JkOEldv|*I=9`&sWl8?I@WuC<0bEFWzoh;oXvoU|b*%gf!(2z3Zh_%F(if2}pE^Z4C` z0cZ2uVCijEZU|(XBZ$s<)+=~u^dkJJ9pj18-y`|q9eW-+veJjGQGM`^#DVB_I5j9r z?-`Pq40{>ux(C+L{!{e81bbj3W4Ujr?0~JX2OY5R((DdME|%2+B^d315)3+E%+NI* zi!gY}ZGs)J7Lk-b?DxM0*xBL}tl4IM*jy+Zd^_#B!53bp8hql{cu}YdROxRLvK!UI zKJ@2y_X2jK77z$5+3j6KrwrT9h&jWP>)76uk=WAh-08F!*zi^hqd84@$UPm1m3~au z)Uz@b9ZbdVJei6VI6{z$dJsQRD)?xEWb(1OZ{+z*9-1FP8!QIDwbDb^suuL3TVxdZ zC?uLi9$$s7tc`4*Z6lLS2DT0#OWP(o2OXQ~TNeXk=S-R$gJ5af)DXj<#1k-#CgePe zVPMqDW*A(O2^fak-$?d8_#&@E9%X>+sxmJR80lu^mA*YXZeEc*k=UOS+1Pstx1y5( zQM^;zaX{5b``(tlVf1R>2-*+0)j>Bg=|iqfH$_sDTjPCy<@hgk{dmsdoJH3wYl z5@QjQWi20tbQ_v8yoif+nX!dRaPZM? zQF8vKOwkcs_~(LT6O^2^A(rm%Ifv$lv4!{NCgS-KaB(3=O|-E$jrf_i(k@nS=M*D; zf-?StjQ9yM{tZU_#2EiEMpV*WG=73X{O8XDr3?j2#6Qq6D}kV_F0&E>(5wUvy2ltR zy%-$iGF@nWlKn5MW(ew<2{kFEw=`+RUD>2S&@fzobiFXzqziD1)_h|PK4{X$nMD6R z+0E!C|G=-bA~SnrGOTnyI?qgYpel=iG#8*=t@Q3dC*^k)rMp<(klP{fppBRAYIRHO zhDQtQKvWdvdSmfcXd~?M&DX;XS(E%c`o<_RU)J=_Ko~9br{8?-AfexUO<@B-zxi4V zdvz)&*L$G>R|12`dghVAWMO^37LmSV(yLHOaSMwUOBO@2PBO2#~V-RHOOc zWQaC{5m@PLD-nOm5N(P9-Z&#yxKA3Kk!dMCz#8pbc%)7Mmcj@gV&!@_18hb%S?At4 zr(qXE6TJ_CaK6^|7lW_eGn0I>+N}MAA8LBuKfuhY5S)y4H0q-sgp8H1i#CA>p51H( zp`YCp5Kw~pCw}3LB1wfiP_=~3tFfkkZTCOO?0h^_e1Us%o zDV}IeO6&w8WlYR!f2xU@a}LHeZ8#%AbQ7J!jW)?N_vEBz{Ye>@5|on~jHCrMSyN0!&mLoYHK zJIinV{C*+Xo+Z1!n(~A<1F0=zN$m!<^*9GwWn?NBI;GBBBR^~}Jr_EC-8DvjBsdz+ zn&fwR7_V+1u%7!l3E^FVWH&PCTB{_%B(;FJ@hGqJq&ROIosp5lTebUQ1awZv1tIQ! zMv|n{J*+bLu&?+uPuMIq`6uTlkg^OP!MuLq=W3GwC?*v_VcVz{oGU`pkq$Ro-XP4q znmPA+#2VurbP5inf}mLEz4H)y`Ze;)4DV$SRUoD{SxN8p&DiQAaX(g&R)J_DakQ5h zdbTZEX}`9Y_Zk?5xE6(TwOx|<9f&dz)JZTk4f-G(QB4D4QB4DheV?X5awD3NHeAA< zc4J>R@4O61%U$(?2tby@%l%6&OZ~n*=-b%P^LgGuGv{D6sfs0lU zH~$%5u3~Fmk1s7&H|G|kX$QS+Q)j)+{e36B)g6j1sLgm-WLLz3(l3^G@tgRaoKuIM z%^U$|m=PV~FQ%3r@4w3$thJKATj?|P=PS`{c0B~Ea(m#gD2*RFYqfr*RpI{a;i`Adt>?eNJ0O;*akWfzw%XZd`+*ocoV)tFfMXt z;SYOc`AKjbOtE&AN!cB*X*>OmNdp&P%8$3kxks+gG*yD~rD3n4ha;+9#7opCS$z_t zK-7a+{Ws6+cN*>nqdjRA=0A()c3bJ{7mxwo1ECG&zw%S90_W8TIO9sIr?a7F*yW7Z zu&;K@quR4S-3COtv<<}BOvnN ze1kk_Lx;?ZBW}$kO8Pz%$^XnqK0%rM2aM!PkjdX@B%h#>{2(&F(Yy)i&)MCOfXP_P z&%?V{?_ZZm0zs*T;#`AA(Y4{i2iiiPz^W^%9_2(0S>=%7kbXUvBa?(ev(*ve4bc`pCnpOz;OF>pXk2|mQxRCL4EHellVM)0h^aLLt!cZ20NGkuQoT4 zv-{3*(SRQdSLB?F3b==r@GuJWDOA9xtOOEopaPubiYP%bPh(Nz%jmk@F_geOh@X{y zc_FG}d%3QoKj2~jX){Fii>t&{2FYU-^`AolF3Li1*rAia5mwH9WdRe5xH|ynCg@x+H1cQ1B zfkwSFAqss{RI84g^&%cssbam9DMHrEnJUsyy=X90FD4k&%O%Qts9sFate2~l<50br zU{Eh6Xx2-xuJ;o7pp~}w14G8Id}ZRs1&*jg#>&rdy|clJ8etFS*Dd@o-p+H*U7HzE z!V6(%&eoajwFOKm&b-SVYY>*H|vt;Mwy^qHBE8_Ix`pI4AS7ve%4?9(sF>7KtIh(;0= zc@lfVSqq(=pX(itFCF~SmebSw1o=okp;{4FHfllavC#GsX-ESNAoR*cGweY=+CgNM zJeyV4N)thyuh7Z{m!NhY)yrLOtTf4GsovZTab7jlYzM;W9tS|p_9UZ%*qv&dQtqCH ztVv9(*^0y>WV-N4B(yQtTaHXu!7elX_F>qq1tFQpkq6lD<(nb+C&5n*RrH{@{KdFd zmtfFaly534@#*n>(D;6_=M(i5>{RSH2}DY841(d)f_cc_Cst2?l7N4o3RedNDXs;<6wB_=KtgwiW)MLN*&W&e=OapYNc`U*GjiQ613m#2Z{PS{E-rMzGZc3p67QWY7ANFd(c>^$5EcN zSQlqvS4{-6jBueFMh!|QAn5XTEG_AF8u zS$rV&m|!rxhCpL@Z9o)ycx~2kb9imn1c%o`%tSSMK^>m~}yI?~`Ec-M9GiILx+j!ZD9qY!A^rT&Eqfjmdwo@`<=p{%p- zltVTLg7Ws{D2Q*;I87*--f6#e%981+O2!0(k{PUAhDs(2WXVK9Suz?lOJ+wEBwIpI zGA0<5Ob9eeW~K_kEEy9EN@k977%G`4s0v0nJ+86DzDDB8`&cP=5yn~*oI2I+F5JH! z5EG{;ryRk{Q`R8a@2^l`Il+F|P-L5XS%Fgt4#YMQ@9%F{-~@m{o67=OvQbc$tOm`J z{YC{DDp?Z@N;U)~s-R4XzDA~AjNER8ixhRNlH13OFvc<~7SO7PTwtLEg z*+qe40G1C|1v6WLWXD0lWPvQ0DCjdx<=vc*EK*pgU`#M5m=I_b%wiP+*J*UYm{?FS zOO2?4f{B6%#5V)l)kLBdLzR_24xI9#j4u`gg3}?vmAEaB$okCEP=i?!POiT$e7-w|Y3o z0{mKm-Fz_ROujHre5*h*2P(cf3;H`D5Z=dlH}%Dog%ZpF9N!#;ot}0QgL6H%KL{NL z6XtA-VG`t304{t^dg$)-9_onr9)9Jp@VNKjUWEe@CWxSC;2YY11JYWkoOAd@3MM;U zmbzkZ1@x%HE zvGe?5SDX-aIvY++aNP%(HhHhZX%+Ix(7b06MLmdh2gN*Z9o#pOI26QRzQehD5ZwmE zyu{le1TGS9>Yf{a>;g+%tD@rab<;2}c^{;$I~2z0b<^-c?mJlgG_i5_Vm~Op%Zs*H zx0heA%u~}SwypeYp}Say2pBc$;?Db^Zve8q-0JQ98I!4I5O=+vGfvJH+d)Y2*y+Hh zQG5EKu{qq;p5srxOmHeEU)}?l`V~HpP~OfdNo)X73xcb`)f;lfG!+J?FRK$)D!FBB zECg;|*e!Xjfl<2Ld~4Tu{y-~mN33P+Nc?qs0bZiQWP?VS6P+UwQN02=q{!9uGAx{% zAd)xI`70KaO;9c-U$hw$JR?j>{qEHOk5wSsvR+}1Keo&gx9{zj43i`ogm)%&+^K_W+WL5`tXK_Z0t z3KFs-b}&OY5GH%uAmx!gKj>{HnCWdP%zrYy4TSD(<5d{k1q^zd3F_XaF_wq!Z6;>) zw%t{jq288OAlpsQ+e|R%Z6+A>HVrb&pttR7M5KC~b1Rz7tE%qEhE^Bi@bhi!!=Mx( z?(Yoz;&waaUAjzTF-?cb)-zy+mvU!Dz+mbtWQX6X(m=sVc6gbH#VW;eV5+c2I84M5 z3S@F+d`v_Z$V6x`ln4{liEx%S3Gs>wSIW$jPz;wW65@3QvL0k)d_Fe|Ag9~gV}btbv#@8ZGEd1?M)Kj3PQceY14lL6+1}S9?>fvN@Ac5VGeMnq zjMgmG?Nu72?8bz#R826bS`7vvvuaIHhdio7$(zR^Usifw?CardIXIN5D`nkPF7#%;A{Eb_Au{8Chm`@pIz;Qvm;!bqg?C= z7tSy9dbjY-` zC_Cl8g~`)K1?Cbw&hG9GM@hY+KrFY5avVc&KY~kpKR;gS@?=c!#i%L;?F{B_r5{Fo zU*T8&nC(ylWMB1l7l!g%JSs|!5DiM1MQenZpwtL)s1dSE`5#CB&JvNR_JPaG)eegs=RSwaAqPR@Oo0>_%Kr+!_cj>ReF_{*@b7l6^X8)>1j?njLy=L_ zr5q^U#eR_q?!jwW&cuF^24(5tT9y;BhGk-U@DL6ae%e(EI6)}?7Ac?tPzcltKqkm0 zN(G=0rWJrpuv{wunP8v*6auvZkO>;CGX6FC`j;xT6Or0gL#Mh0DDCZ46_hatuh;|S zO57<5l#6a}+WzYACIxO!mjt;I_k;o&q%2sj{$_z(aEgL*!AXOI;9al&{z(PN8VJ@n zO)yw+3W3Ig(+4U9thEFSP9`Q3%GKWv<&c92LAm-H1@Vn0{xM6?$Sz7yF2s#jrOMU0 z@;|6@DOVt;y+OHTfh?COD9c5I93gbM)TkgsEhFph%>kTb$#340f&! z*Xhc;=Jatt0z21+O;O65e>XsiWPVf>T%~dG*GfN&prruR9XTA^xX6~@4wc_#9tde< zP)^S3nQ`$be$>Dc_S&C8sFP>c*TWWT#vg81R!p|?YG?S~{ZzkqE6%Pj?}KB%3g$Rf zQ87^z)hl2xWW`E9xQD;1S+P?*4{F0_s*f!3ik&*q zx!xc?Jb@%&=K)mTNX%J&we z0Eg}yR}AX0r!Q<)%!(JI3_6qpSq8O*iIWFI%>-Gh*kgj1*Z@^@*tzVSaG-RZx`rQi zbkByP+MWGOv6J7tpOthj12|8C6drEg-%7f>!PkBYB$MRIvhc2>e}r}O0r0l~PA*hV zsEX=r$?fJ2KGqVK8vfvN625`uKlzv??o?mc{VMhx8h;Vk%O*CzuT%*;d#0a8PQoe{ z4@~ZZGX7j)7ZN+VhpZrtvF*;eB_S)w#8^Q|YW0`w;s;2{aL#RsB$fM3Oe^^hSMFG< zzLI~E>g}}(W;W++NJ#B=6Qg!}lG^S2DTidMbAFwOQ_0=LsO&Ce^SD5{l+EMlsq);o ziTTX~O9PMmDNp?2+dNTGV6h^ksl#6@&9iUv%v;M^RIfVo)&cv!bLK5|1^nry(pnOF zsk8xvUMg*dJy=3)2N5hG`Uyil!xAi&nxI}nlp0orS0YTMVO2%D(y*$BJ&<)ptnNWi ztii8hm{rt1&9B1UB}a&ZBdq0@ZV47c6Z};S^iKe`(ymHFTxFETmnsA%Q7;^um|8gI z3BWS?)1^^ILYGD(2wfU2um`2l0U{_3Z%03|oOJ}HVS>6el3X|*tXz{X>xJVGrWTG( zEK^F!RCAsftAd!1ASwoVvKP%#7>C7*ak(PFgLSE^Q99UP;<>t7*xAmcf=vU6VA;4C zgkCmohdsz;A=qq?%ga;*Y{Nk=O)$tMmyO*jzf34I=w)LQQ_IFYS9gsHxD-xyrh5QnIW36{-v=3lf>rV`p0>BUV?XlcAJrD9Z~ z;m$l!#c^hI_jq?Ox_QdsV8m0g-9)zuQtgEbqXf(Se8QtPvEp!5m><5R7Me+%ZLd%uIVRX1tZhRK7a}-9#Cy#M%K-6z45Q3kKI(hs6 zA+A&4Ao^~!yu*OiBM(v#yBEYp<$!~n1bI?C3*<@hERctkvp^nF&H{NzISZs1XoA6c zWD_*SK$)RpHB=*-AVW=NhK4Bz?0Z3mvOs1i3uK0}KxQZlWQMXpX2=AC44I&rA*4`@ zYf&SCFKu0fVg4=rDsG4$gvF01)JL|J3hc}kwJM-evcZXa6^P~dRos(&Z+c94yZUXa z4_!Yu!g)1<6`$o6JI_YJ`&`d?Y+1%PJ81E;c*-q#8!Ol;{cT)bPaMe1>xpIdvR=k5-;(qaz9XMpN zipJ!4ZW+4XZpt^M7=YNLkt}bGf;ok*c%g4{^Z7CHn!-3!t9U8by$}(ZSn&s47_@(R z7SE#g-LKdZlU_)Onp-j#m(hupzWiQrA9=|~-$zb_T=lFaYF1~)<+!Yrhv2B729kIC zt+}G+iXn-!HsUI<+hD({M{-azxutK|LTip1kQ}rR{3*k)k9DhZyG5{xwH8V`d4}Pg zoxkR|0m9k@t#S2+dk; zBq;9{OYYK^Nr6n(_?~Wi1iN~;)k73~f!CSqk-?|Ndx`rVg=&Sg&r5WB1m|{PKktQU z-VqOjulyPc2t2{MKZr6CJi&Tp3w9$&=o74sB-9Dk7TVPb)(+T%6RfG*bN@ppSlQ{L z$9{=rj{U}u#s-fzJZ5m-3s3+tFNc{5@Tn>B4gPSd$N&RbOnWC7$YKRszy({8O|W_3_6?0L z)~)d83;b%fSULZ=(v{Bw*W}>v;gwgr@=e?~0p_z*yTA#F01nFXq(r0PzWkPj5|%ni2eR zqyMl@O#z4-LEP7~i>OIi76%b&aC`-W=TW!dJ=2Tu>CO11XJnX@9PHmJiJ!b8gR#%l zyj7AIj~7nF-N^i(OX54wt_;Pvr*`r}nB-eKc?r5JgCBgCuNl|TKEMBe_T|}vuO7vI zG*kX=pX700XHvc!QeN|(m;cpsd7=g1FPUL=m2Y2m_(VZIU&u|}gD+Do*Etj&QyU6; zS$BI9VGAWF;+Gj^%|!>KD1Nqq$@2emNwTs<`$hP4 z_d%{h-4kty$(amwPqfjX)IEuUq$y)aQzqNRZD<#V-Gw$c-tzkV4u_kO`I-rMt>{rh z!Ws(?H3yeDeGCbUn3S-dG9)a5Qo=gJkgy0U2`iqDD72AzTAYyWq>0fk{uf>-rc9Vs z4-Av_;FvF|lFeq_u_{6Tj#Vjtw=&*Cy^sJcCBGjfK!?P4&fI^T_zn-kK5@7$`oD@N zoZmklweha;GFBR&aSbrqv~%tqnFd8$%~rcSSsxMVADcMDJvf3*TxB6!&P&ETLHhpy z{^v*BJ~m>oJ1c_u{vom+jE8lvz^`Vm6+4RD4?o(^1xNc0x!Mj^%mas;jvw(u!OyNH zPusz={|xq&Q+kst=3!Bz=5a8r=389RfnUug5O;6DiaUNaPlNatmM=*>2V&aouJ{#x zHMsUNrxBL3NW5fODU^XUP`p7I?S5;4I1j&?b1e7TD3?1Iij&txyBR=_d@gk_+QEg^ zk7IPT@T3`C1MUB5M(4=4vsDoc#Q&N#=(&8%R~vGue|BLrG?&?^nwj-0tv-(FPmT*$ zLA$%NC&NXy)7$=;Q@1%<nJ zylq5hyzP&j@wQd}gtr}rD6}zoTiHfL`#-?j>KO0;3f|Us2Ri<{`11mOHF&})XX%}; zI2ga06o?TRf8-cc0-_Z}x4ZGB8pL2&dXd--#KEvMlh^~q6R_M(VqXvi_uy80{Aw0~ zsE1_{iNiqL2TSg~AeMsY1B*vu8Hht**+61Bh`}3OaU^~uXd5*;GAbt-^;(ib}+Ez-}J2&sF^wirF9}>2Edz24Zc8R;m=oFF<1C)HI?0(c) zuKnZqP#rvJKGaD2f0_?TKGMRZ=h=OHfr^Ajn}@gF%}dr&Mg`47P?*-C>U*-C@(AX5B8vjIOVy&TQpZv1M7*e*G( zHq&9L8D{tMj-j;q07`1O{U3eO(S64#6gfm70h!eQS*HFWq+HGzHrnn(MkAK)@3Z@a zva|!U1kgFn5V!Xsc)#uCpY$vQOXM?PMdwU_&Mfg#oC$g$1f4_}Z+K&V*(u5d3|1ngh_#TDZ} zmUer5x$$B{KlrlJyJDeIE|cDw9QQa7Wn^(|Ds>xf&tTkno_9=MU$@D)OO7ptptHT< zo3pNY$K_Qz{WoR2OYk#XjQj3GVK9B2H6)H*=D?84q+gK3S$vieET;oC508q!ftjv0 zk|RAlF>xf8>FcQ#3PyY-zQE;KRrIUqT&Rl-vLN9#CH&JBy$F4vn$SQdc zH6knN?TZyMfvh#Q1muGb zB}gSMZ32)-;YK4F$YFnaczNWiAb}zXz&VCa9K4t=Yo?=6*s-KA($0{ zT$;kei^^nI*Gd0>b^Y(HuHI(v!Zw?z5uv_CD64M;pxL)HnEcl0g#@+wq-r2SJ9Nxm zK=#FWq*|$VsXeZmEV@h(n)}VBV?}@!!KQq;h9HqR`5nO*(FtOsgg&Uw{}U ztKt6~KR_LwjT(>C$5)U^WPLnl%lc@i@bom6&Hs$XQ~01!A61%Qebg)Bzp*}=5QVOf zRvou&sSl}Cu|CQaA#ViJP3`{#e@0^Mw!^y!`>hXP%h?h8;kT~w_rvExfm7#Y1T1*f z?~i!u`F)%^(S~Ee+^Id>>#q%CQaLC7-Nwv<1$6-DZV#c_9tzPccEDkI;(Gk%?q>Z| z_Fz}J2U2CFUvDZ9y{;(`a}Uf(9KJ!nYibzNdo9W1%baLJKu?l~huE{XXr zR~Rn2DlqrRA)zbGi1{whHC$3qn|peB$R#n~WtaOh1-5`L&+ZnF4alUOL-sEH%Vs7mbN+_mvbbKEO*) zW!L12xhHo^J~S-jjWe^0TSq#_8H+H)oNMzu_lw72Q-)zledHK8uQm=rd1-9H(+IQ< z5nS9lKGBE+HjUCg!aEf97T7n9u(~E513T;>amxhnuvo50U7IWJ+QsUbut3y;xZ{9< ziF2?4*Z}*TgSvVx*iUVSJ@E^>IB_?Kb`X3ln-^0TUYEUb$qlmT#ni;27gI|tvKPmE zXZGSi2={$xnP@W11&j546WH}}*chuusYV&wFpZpY8jZb$5Ux?M);qNnU0 z_g`Be{)QjB$7-X2et-8^Z@B#a?s2E#^835TX2a$G1Ks0ubdM@DCw7mQI_Vy#b=E!l z8?7Md9-|D<=pKJYp!JA=-Qy~Bi6&_u;T;2eE9|m+yo~N4uJ^k~SqVBU>~|e*PfH8| zQ3vAT1zzH6D_1nqzO-NBCg>ovz`p0P1HCI??|{AMTabvJMOR6!H#YfeK}0wCf7-qx z+|P~9G7Js-Ki*kV$0Jslzo9m)^c&X~h~De{&hjjp>qPZ+99-zJ#Ke4V{wiD^q+FKJ zr5a02%y;=7T%My`a;~k%5)<=Xeg>CUDVN;3)?Um z@5d?cBk1z9qU5{#TH+*yv0i33Cf!#e*u>|cU=V*LWr>rO%M@K+loZLUaPIRO1#*0w zefprJXtF}s%jF3 zZM_YLQBaK_x;lM9ys2DJ`EW*F%yYKk_LLAfI9A|zII^`>x#awDMq6G_=Nnv>9s+r< zeH-q#34uJFRl8Y)z~FS2dkgNeIq&BP5r*SAlOUY^;l9ra5)`Zb#^;glm`gH*z%F<~p9M0q?~i3v(U zWA$1~j8rbk5N2OLP*#+Q`Hd_N-TleRWhq^*ADC=GHEWFRoT~c=V|HL-8P)w6%D1Vy zAHtOCe)2FZKi4V8`y<#@%e~~nmN0h7N4d$Vh)TO-`Coe45Vy|_VQlIc-1(H8`9O|X zqC%W6U3$qcp-HMSvYkse6vrolA)DB^NzfM@2+??z@=S((=>z?e#SmVuRhabrKrc5p zf{j}kgQ5t1uU9U~G%tOi9DkKC__+Fjstkld6AOgF=aoZtWi1SvSVkCZQ!abZCFfxA zPiI-eQjM22$NNWv`4egtW8R4v@9tG&UIN`*n;{G&GJhiGk2<{#my*pz=1;_Ym%|O0 z98L6?2dgy1e3z39m(&8&W1jC$2x7iVbN<9uqQ^Y#(j44H3W#w-pH$ADFwR|paZa0H{xtIm4dM9$Smpd_PXjar#2yH=1rcB% zO*A614rwn<9^5?>Fgx50>-xtR89@+xdRehZ9MynV)^5xdH#GH9f?$u&dK&wXkQ-Rpp;_H71LIN;g{Fy}dugqM#xQZbg^r0KpeXo$9?==e}VdE!}Jt zCFLgixx6V+F9 zR&8QF+u9v24^%EGmFkItiTN%U!sR*2C0mzfnkMGEJPa-`Q!dR}wTbyI$u#d)E*CIN zHBr!*$uu`9cM?+*1rw7Y`V$4^lFdRdI(=pO))R%3-~fh9Etn`6m|~g&e5@7?mrQdA z_}d`mgxs5pPB(#RnwXp%90}&8LCGI^IpK)_OOf|k$5KK`{2FeIV zI4cZ{Y2_?C{spEM+Mxt*nIK#XlG*mkH(9DNcU_|3;eho*kBJ4%RD*eRsMc3aEYnO+ zP(cRG6mzb(R(m4$A^uEUBIL?CiCUpymF4R_ukHq5X{C{p0_+-E?o*g?-HE z0%6~I2okypf4UAS5N*3#v3-8-iCa!~Mce*X?42h(QTC)K+R_=F=T)+oHSJv>{_x+&bn^m^k`-PL;`p3Ci96Vk6)?Q9TiGmp!v@w?fitNLkyJ*b}!5YhVK2pp{+V$u4M*!R^> z=$S#v{@;Jz2=%q*5x7!jJN$2(UheHPT8Pw5>Rhh*SaUBpARBPZ$C?Asd?z>n&7%_m zXdayiKy&k+VAd%Kg25>X*azSz4PIr!@Yarww?j>lXxmwKyjoKYrkXTj+ zB$(9!1D9q8lrEzkP=e78NYLnjSL_8*=T@Y#I^kUadll?CJ!78RJUG*nDPZPIhz)Y@ zdp84;c>o;kUE0o}5#A=o3X*4o(B^blmQLxNJSB=f*)v{mVB~pA+e(sE2WR|Jf>`=S z-(-*XbZ8K7VXYrm6u*%|gEAaeA$KP~c}FAIJtQ_~c=CFBP)1@)w{!oVi9)&?-fB&t zljP-->BKjs__y@UuFkI_SkZ%6TS_J}LC|5*=!;e3ON%K6f0qnrT7&ay|jTO**1LBuy1 zjU2meV%faO$!4S2b|bd$Q13cmEr=tw64$}!y_YEsN{D&;<_r{0x3@DW*<|cYtJHk~ zmlUPFGbh(B!ik6+O{3|jw40dR_XW!^vij_}(e3s&FA;{KVvopV=4 z#F6W$vhlrUgiDuxi*Qp$s4{@1cG5A2I!>zd>g`0l!cbl#sE0c58MKoQ)IT_5${A?r z*wGcM$}z`if^az|G)5DY1GhOw2cS7d2cS7dYw(AUH`-3PhFDe>xTTPlg#a|` zBmm7U1fW?b0cbWRf>~K0XlB7I++q0Ewp(tfu@IA~H4_$qX2Jr{Oqd2kjfG1ZJwC>B z7-njR5Zq>U4>f&)nbgKkx-BlA!LMzK6?+5!hi`y=J1h3>ukl(M9%XMEVu{$|qdjpW zer><<-&dv9o;2izR{AO2O7iWC#iFg7uS67lK0$t-0>P2`U2T1Yy?PpYqwg0lyUEWB zzQPq6FQX6EqII?%+dCt7a$0Mp2hS@Ie<^T8+wt-DN|{gJkh!)k?~1#xUysYnIogha zdNJ?x2;^4mg2Vrf@IU54r0(SS45M?CjkcZAHRGD{gq0pYABmlc*iMZv-!H?PI0m*g zAWnH_Mv%dsq@T-gQW-n~-~Te+NWm1O*Giv(^4Wyn2V;_FRW`;}jL6iS ztAd*k%4(z{V?FF_avl}uniLUIoFo5_Dn82)yIRAYy|~h%48bhLX9@a>&r*@GmFZKr zR0_<>W!zMpE7JrO=js&kKc+axHY9tZ*=q=9DK-<#^cqz2E8B2|RG0U#gwYLusBrpW z7vo96_uwASxS=u8&4;sjK(qJ=W-%RtX7MH7 zL4R*XIzQ|(&U^J6oZ^F>R~RO5xFgfWDd2tBWqWsyac>5(!F%9|p7`6iP*5B8-4DA= zE2u#^72e5Ucgeba;KMGnLZcZwiYyT`pFxW-^QplQ$7Pex;<)T5S(zu8$$b11Lo8)p zKg{o%jA7$c8%i-B7J72q)x^}chV8zOmREv5u@wFsINueU3oV=f?fGYQ5wV$XC1iWt zT#CCT>-M2!ij5Ndtn^;@76`i8JR)5j0wT-A+Z9D_y_X4Hg3smk5e{EjI8DW=oTgm9 zvS5P2b=C;WH}*Xrph{ZsC+|Z~Y$>o}uf30f>4P}!>Lr7*?-q#IOSnL?ax0vaSpH?8 zEq_r!cPrNAqqvy$A^c#wF7_@wOQHm=!)^t~iM@qCWHws{qH+tX{l4-wQedUO1hb)= zEvdwN5Sy#e4Ymx-O>FJ%hlj+v8$lvcfnr zY%cGWJQwa}D~!ExbL9YMMFf*K-HyUs!E`8_$NP^!MZoZ_wG%wgazqo-$JbC2k3+Si zm5J>((YX)ydCCW+KB?y6MM0=}xT}#0?UK!X#;bYVojU;@q`b2SO5Kn3QIOgc6-aN$ zCABF&M|w?Ar&qX#fX6(k0>&Wb>wYBvfnHs&&{06QbRX>YM%GSL7!W0XEnO;;J=Pp;H9zuwI2DTjV>=Xm`~5FetA$ zMkFF>J&Hvi<(w6@rB6a?p_rKLa@0bJg6?J%kp^X9KAShlp=!#nRgg%%2vk!-pjJ%@ zfm$`i1cSmvQ1LX%^Bxs8nd+9ls4kmJ{ISzNQ>`7WY(U{GzqQ|w&S0gdrTuMyEh7?n zxI4aug;-jY_!6yM-0eT?!`41Yd76%ZgVwG=O0Sz$YfmeOW^4bM!pzogVnJ&Ufy^*l zy9w$Hdy`^#=8NfLYyUkOb0df?;Hhlw7pwR}tvv+l)~>-&YhS0lhgy3G)U7=P>eg<8 zI=y~t|BDKED9TG}IwgBzR#Y!6#T4RE_eFz0j|Yh1istE9%SIZorYjPhgyeMR}^ z+;z*CT-iWPENGxvAlsq|25m6}>b4jHbz3ySAgfs9N}}hquy*iTk{o6_K*%wN!%XTP zMR1s@)dYu`21UrRW1h-wXzVaSW9*18L*rkpJPb!s;P!DW=3EZO|0+k0A(qYmu^wCf z*Kf8AMdPUq&DK+_e+fVB%r4@2{I;HL6?L5I*U+~} zf|dRb^O-b4+xpAoo?t!tBiq&1(|by>)x@M=lDNph>xS4v-TJG(@e|(85%C5;NY2K# zt}2n(Bon*5XZ&=y+e=|&kXu(Ll8X@IfeK^e*m`A8cg782%omg|gzsg_B}z?fy`iXt zG5<Ghn?zP ziD_40Gx1)07@3OqK?5nA?PrXAZ>MMah~x}_DFt>1_|eFO^YvOggvsW-UBux|*WrSU z$2)U5BIyw`qKjZHe$*8b)e_d}k@yo^jz3FqHP^?`1CXbff)xNttXBF> z)G)8_{CGlqVVvyBH>|*q%X`L;9EDD$jK=PcETeurc~`iwSK-cUdo}*Vn($`?r0Q+o zWHzW>gkz;2-KRhlFDMY({+fLKtW3za!vD4}y5&C)tP0I(^u5>uNNhR_+ym6MzkA;D zHCXwFz2_OYq^=ns+Chw;+{3#L_CoBt_k7Cnyg3JBABV*GImKQThz1ZnhFC@JBoNxj zT3?FWs(z0f=CxtwdMvfLfaFeLZ&rp~ujeyPt^1F&GmhDq02aH?Aa-rIbkp-`hf^n% zM#~^$se^%7>3xv-iI|~oyFB^4QPeE-ZL5>XeT|u%#J(NlY`7>BK2s9_h|px~5CEYq%WR+XPuF+l0(Vm7fn0N(gz= zwihA^VWyZ6cOeQ!8yWl)_9$=sYuJ=SSlb@72PLMxh>HL~Sj7d-c-XaJwye*sUe4I( zG~{c9S?^k--4?bPWu(i~Elx%;+U|hBTN!xD-mc)?X8_&Lz&#<~(vfcP2g_+<+aPQe z%z|@m80NO2_Fl<-jC2rW+Ga;FrfsT`HtCRQ!;Nu)Vc}akZ8n>WeOEr3+T-}c8P~S% zXlmqn($vGbl|Bazi;lLH*v`ksa)hkN?s#zeu0LrH*ffB3-k0`p=WwHO5R7lh@#3#V zk}_)lx%lMuIuv_;C>F%tJ&^~Z9>gb;Jn!?xSU{ouZ7bz1U5))S5|7)7#1?eo!UtkJ zvFBXcTPM!12Xmd z)!T#P#S0?fW~!YfcY{c%4Tq4=4(j9HVb z36^Oq2$ZEK%krU^_|KQ2aP~kG(S~RJK54i5CC5j=Pe*y~1f#Uc13s;@x;i;1Y;EH3 z4bV$|{dfjkhOdoFyrgH`c0z2y=;EZwia5IOJuKN7BTJgRm4nQW$+c8S${)?>(h!c7Cb`{8!^C=!ba9&@A_! zJ``PZN2C66DECa_OrvszIaD`oyJSIBiVi;Z= z#W)OCcQy>a9~t|CVOWgNP30C?tn|Wt@e&Mv+s?H(1ba&{D= zzk8&AgF$tDPUcGgou&W7xjJO?2`T&9lk!B)t@zV{-)h&gV)K8ICq5_fsg-j$R?~lt zpZs9&hlXIxa}LDM!XaL1oNvsq@#l_Ns4>$TQerP(Aef8b6!(6)cyQAKSBmeOs-VMw_ssN zn^IVK3MmNJudY8J%wb61n)1Y92)F5Hwpdd+G~c=&V=e4*9VK~tQzjht{52Ir+~pBW zJ~xwS?uFVv5@AeDc;|kEQ!cPqx5tJhlg5n-6lvD(-@{EJ5^ae2O4px7F11*D0Hu3> z+c`xW&4c(^>77-dqWr;kmDA(Kc}3f3|$W3mV|JQH;R>0 zYy?o_9*5;yZDhIr)g2SsQ5d#&S}ZEO?h5jYTR(o9hg5XCvCh-}xoO zIqt|yb9)Hq7f4x5p)9}w4raC|Z^EoifgI!p40jUl*#NsJkOS6$5e`bsxfTI*RWO?w zvY2o#je^~*V)v{lIMAXvWkdv*kr zp$g|BqWPqGBw*27 z>D~G}!dZlk5pCEfsz1kh-yI|1RgdO$cLqlK*;QBB!<^euAKJ(+#eTN3(|!hL{ZCn) zCpO?$Jt#MG1CGxO7a%p>O?|O~&$<}^jrb!Ysi?+lTh49~P$q3`XGwdgv!q@8Pm<=1 z8UR&X#*9eZ{vfnr+jX|ZFr)D*05|)o>+bX($}hfQ&MD8iS4C2Xe9XYNpy1^kJvvSFn=jXEj8EbJc1%q$(XECe)T_9HVFA&xJb1}qy^I3rysKfD>|CV43 zNwgx zX%7}D;L@`^o8O?;qRlrPs5W_=aDrx7oR(|CxBO`852hm*iL}|0DKnV6oC8 zFHeg3_*L(alYhml*v(=j({j3a4-CMboKNI>*D% zY~hNS>+TtGxNvL^7**(EA`WnsAE)p)Xui*Yu+ofPMqAZcwCrHfXo+P-E5YxHw*Nsm zJ#{{Q)lb+~3L!}IE&f{RMJN^?tg3z`$73bbGbOL*c(O8@NU$=z%fT>P)u&`1Ll9we zUpuacI|4je8)ClHGs1AmRIV-WBkx|&E{SDM_-Qmvmy;4dc&!vggy^woVwn?uIz(~{ zeZo&;td-y@5CyVb1tU?O! zGzB^zAu!PS&?pNTPJNvZ6U^+}r8GPQ7At)ws`^3pf{q;bM)U%0xQ|=?NlvjyY2*@E ztn_c;mgnrM`^03^5R{(=#QdgFMnX1?>(Dgn)TiVOqrzp=*tv&0qtm7_*Ko-KSUbCi zJJ)bYOiHtzl=^_!_WyfJUG6v7`pq}8)x@h>o~I8J@l(+UXa zpP;x0`hNVCdMjN8AIH+y$+4UX7h~?nA!64U#tP!R0JyLZJjhojH1Y>Ar9l=+zdk5Fni6Nt(k ztbX1;=i#^~iBGIP-fR$JneE?lHSi=HG$e7gT_SIUs{;`|YKEAy&JYsQlNDH{k=Xa0 zAr#)W#ja>X6qTQ0DecaKDed@%)1-Aj!>U>QcNx~j+0VL5bGiv=)`*#LfZRiZSALD#}bSC#TKA3PuEe(U~rr;&W znTCAG=C>{7hhN*X{& zU0NzpH-q4?Bekg8H9;-v!ejj}AuVb~7uBL>r~lE{M@ud0Dny~RsOwd99<`{OG(j!u zRz>_D)S`BlHlc8oVWUAM?CxB$NJIX^MsnCU@A0QBEJ5>)Bn^h{@z)>&3`It1CMz-u zky()ipc$D4Ly>7vMmGQQOnd9c$o^^-Ig814lwlK>Tis*8eYBCF-0Jr3+8^EJIJ8T6 z^xDA4sz5B68}H^lhcAu%@^`D$X`wS^u=**MoQG-4Cm(1?2njBL7U2sKaKvj?U+4M= zIBIsR$T{%6jQ26Hj(XZEkW25ah;_ss)=;^}ERF}kOHs}?!eGZ9v8UD3{R%18h9JTi zi8{FFWexhn@Tljkfyo6}T-1iWg^Sp`MKP`(pY~hrObz1P#FZQG3YWh1CN40KB~gZi zE;%23kR?#hR3qmebKVSsIrf<24iY-2spUpa>qta%%BGc-Q-Yo3ltq!1Q-aZ)N-UaF z2}W}&K_jR6dxAeUA)%Eqd!X~a(JGEYJe4l?onMQ9OU9v0SU~OYwq*BsKUqM9Cm01( z1wu9nv);(fvvNZ)nj48lb0fiMZX~F36KZ~(!3UL6&!nOGb+)Y-ZiZ|JS(QW3uN>jV zJ_Ml*=P;vo#ob&m?#zfX5K1oPJ%U!-gvcx7_JD#z(K1^>Ah*JMvIU*@=km)?@0o|d zuR+KcH8+81Ai=8)S~p{1l!QLLKUN1yY2nM-iY?l)6jHfYFgFt{YJ-jX^8bR<}ed0uXX$6t) z?|Hjp!MpGm{)d8m5VatJL-F31Prx6LC0Ba=yk|kQfLQP}xO0V(Zu0U42irrOM;^+g zo8UY=%n?tpDJjDOkZ*7}uOcvQc7|oa61$r-(+HH@VZk2uj?QyNpaf;0y^TO!fa+ln z*uXcRfncJ|cCb`-v5TDUQ#6F31XekAnX6L)Xs%8Lpt(8~faXyif>{eu1cQaBP`aq{ zk(DlX;H-27pqZ`!G}9G;X1WMwrHf#YF5w&jzNXDWSjgX;y^Vp5a(cj7I?x7!fh~2i zV)rK-VX$%}NBO`Q*a#|if3q>Lk()^dxuY?NNfw8JZ9)_ygFNoH@S==#NCx>?rfqgq(EmHXPo&PEizHUx|N<&`+YQ3=`*ESiM3 z3vWO+wINvebFMji2R{lJTHBQi?SA>?AgVx|b%%wy-;Ic{!T*%-)`DmTQT$cR^BzO2 z?Ifn>dfr6DR@i_lk6E77L#+Z)c$cq-S`T}mhuQ=JdZ?kF_D&>7NCE%KfI3;L;?*#-KkD5blR`&OjBazEQI3UQiW z6t45Oj?>r7EB-Dv)>&lCF}XGka69LoWtpmCP0OW;@<%eAlOSAT(a3pkdd4m1?Zx@I z`Od3R@GQ63c{U2(=X%a#MpQlMeOWw}UxJjDG1-+?7k7pcFQWp;c!aFlI=a$T+Xy14 z+7=MHYCB*Lsy6jYS+!EdxEA(6#khflRxxe{!79wBig7!MsA@4=yH+hW6^6;2SRwyz z)iaM-s>$qSR87V|l=%xrS1JWiJPkKpv2kldkR_3%vb8n@Q6dhNuC*b?l1WneS{s7V z#?QLRYWxz6Hh#8}AK&;*J#5ua!g|;e)Oy&ETDu<43h)itL**j7m-jMchQia)_!rrQ z@-3BG5FCr;Vn%}|xR}wbh|ppN$B^h^hDR)VB%EN@k#GqbN5b0?g*T}d`frDUH2m~_% zhj7kW#Mpf!$K-=?pU`JUHz!#9d7kI|sXXkm_)DjU^W}D7u;?~yC3la4JK=Vd*+$!D zm__65VabCp&oo(rh1U&oK9927#qlxj@lkfGHS6ICZ zW1XKVEZLP#ImRPk0jV=U^u`?HO^nU8 zAmkilM|95y5OR+39C%YR2+lEDU~h+AO7i=o8y21kLQC>hAfl2y$GGS!2(jp9jKm^y z405>e9OE|3G3pUZWgpBj-bZ4ZK*%}9Yam*g7(Rw_I2i;agCJ#PApRRu=1`E=hNDeo z3SE{0y*30X*gF*LwUHpCz>o|?FiQp^7?pvDWywGUAp?cZhe?N82tyEJZf>EKEqc(-&AHz^1BBJDoQ4x_~R`C#w77wwk;vpC< z9_dgQkCe_^SRPtB?*I`<=c%(Z(s?cHfpp#gA}V`w{UuBGlpthJ$K2-PausFIe|84& z-<8S9D6(X71%9uXDrct6$W!HD)kZo%u#Noibc`~8)^voSRY4h-DXtOB3PG+P zX5Je1IQOVyHH`#wp}gJ*B1=x6g`l$JbUD^UhZWAKzei5@D5tkDivNmyE(bKq=b@>W zlsCs<>Sam**C0KWV=;l|8UvLvMc1=_fPs2spdHL37^hq?Or2|tTeTp-Cgj2O z2H1mfs~JR;E&Pu&M$S@$wLyO=6v+%m4%X|${g^S?WMpi?1|xIshe)dpCAG>jySLj1 zk!wS6@M(F)!utl=NG}+i$_LVGcBnbxENa6xR8>xx}w2?e&BQ=nK zl8{F&q!tj}pna5(+D8{c7LRBhF#&vz{ywg^DZ`kWh7WSz!HSnQ#N?rZkbV*;$%cMX z6(UgjN#0A?;A{Ymav0`Sb4mkZh||Zc!H8g12y&vC8H}7$@5ppD**YfLL!DD1 zOHsVX&>3NL%3v+({La^++&zumltYxEl$N~}zCF+dzxYYE!joqh z>s?$J;i=_saruEZ#5f^vZZL96kf)ZDmqftp59{U}Y2=g=#k_*}0O$PMGeJslFSpP+ z^MNope-38jCmA4F>il} zs2T^se^HHt(qfhx2f0O-8VAAeRpW5aFzQYY$&>9t?kWRhORJo0PjwE9F1Sy@CHI{! zxJ#k87DZRNqg^D0-Ubj^Lhp2h{I3bU?7}}J^foh!pG4>l?HAm{>{mg)HP_nDW_q|^ zV6L_QWZC&?*V+SFKD4Y(?o&B4vUW_61B=I{*>;qtB)BwNc#%(pmS)*4vzBJrjI)+z z3F@WUP%`9{BASfQ5_Xk}*<&*5J4*(;_rH-0a|xSsURfIE5;j3O%$j!-vo}c4TyqaV zbJ;%tnQ(117%In3Gr;Zpta2o%%Mski%mRn{tSkhQf|&&hKr;&gXl6l!Kb!^G zKB5=B6U<~mg!V2{%tJBe$xK9(S@EquS;dDUEHxt(7aI+}Oc9}6dT^fA(#T@7D#{Su zgfrb>oRm;-?qjT*Zp{o51Q+(^0g1c2;YcK+uAF8~@g6V4%nZcz3s5AtVq(z(!n@Gw zoBsmNJ9K~;_cWAJu*&`O<#CZ(1#i=>q27@oYC&AHrohX;8^^30NUSO-akqaDj+G%> zxaQ&lcz1R;(#P7ZoMD9-J3)UZbttZX*M@nloQ2EWy5a3uZSr6#skH|=6AYKEbAXWgEzOU=AbBShF6D@5i9RUIOVU0GB&X!*hZ z-D=f&I5@TSIV){&Ji z*%wn{`xYF5i*3Xo9?qIG8lKai0683g?!|A;eOBzA-+1CX{N~(b#U3b&i^B17G3RwF z=MengNPBn7Dr&FuIl~kLYNc;D2<41)&3Q6$2%@QbH74f#G2yziEV1K(zQa*S#7%j2 zPq!B)?Pn{H1vy9H<(F=7`K1EKYnOunE^mH* zeQytN>LEV3j|OJ}yg`9FMNU1EJaVz`auWW{DYO#qc*IkoK$*+|)=+moyx*k29dwun z1N=gPI!t-t+G&USVNPT+hv5(suWtQ9fx`)oL`3!QUbe({N%4$@Z4x^28V%jhoZk`e$}HJso1ay<{tFzx+1eZy$Zn2gdfX`>0IwU}vz>llEit zn0H3Li0z9%^YPog7y;z$C`8}SMM7RexcktIH@{W=jNW`#@*rVs>See*aWUR!U2erb zzC0%OTpbfD&#`R&kA1yHeMB>jy?0LYr6=0BmRu1@)gay_*vY zT9XFI!)&b}dYt1WS8cS#Q7Rlc=G{L`>S&tSl)riL%kK-jn{p4E3Cz&vkrJ^v7b)oP zIj@7bTLnk1)N`TJ*X=;$AyDe_{Ryke8;u;mX{p=v1a3-EAP4K7`{ACAp?^eHs$>)c zyLp>m5~2Y_&pYE@!6nawErY;GKCE1wc{T14QNB4?IMzVV`4CCcAWN#}()f7y8zdNHFgFGI^SK~6~HW&JF%M)_uET6qFHPx2cC zy2%W5UVj;=i3Ne0U=Zj#*@1e`;bKK7CeZAT--`KtWuPV&1ZsjopyQNp@&c98?g(_g z8ED#1sfh)FnqUy}S zXc~dOq+l+T|8^Hux$plVGB(8wH>=A@??4ZQC2(^j!y?c4n*5FhM z>@w6A4n2>mP-hRf#7WpbpyBLi<*Cpf7KzpHTn0BQ=Jl7J>tPQ(H!IHt^xOeLd0G!o zso%iU{JzptE$o4(1`skI^i+`@gdfH)1>+J1jIDw3X*)nMb%;v9Di1b+8AX8%@v0DbKRb`~rFvo?Ga7p`X_d({t(x zBjyFlGgZn|%DkLpb^@NoQ}Dc~r}SI~dywop5JAizW2cVB$a8OaZlveB zl=R$UdhReiw<*sYi&cRQhv(GO@Qfb9#!(A<5OV{FAm&GuXD%rCo<(Bu|3}(;$5&OP z|KsP}B%E_@%MB0`Kp=1lp(&RDA{K~Xudx6MDp5q;k1cB#6(b6`#uCL|v(~l8zH5yY zyRod;jf=fT*Hw4b-QW8?=b5=P3E#hd_w@>#=Y8hP^UO2PJkw|HzzQ#Zee~ey9yFE< z&zE^4&hQ6k{)2`{Glr__E(|)i zgT=C=qv*~_*sq6YHN;ZU0TsOv6Tu%Z_q|2Job3g5>c`S6UC^BRk@;)|*3{wK6{knh zJ9uuAc%qj;v}xjhr(vs~CRQGZ`#V9fFPlu_q|CF09h;-(RQ3x6OcB)GcpKE+_{@DN zbU$B&2xnAA)NePQTPOI{v4UT+6%0ZvIE^_q{u~86peWeEM8O(!6dXMPLE6Ehbt2Bo z{R!=^hL=HXhf6{aUK@GKgdtZGv~Hgm8m$1>%n&=^9O;ce3%zy_D-TVV&-)OWgXiPc z4D^y+u(1gk6y}c#T6xr{@>_vyC*`_#I+@T^PZ&vH?0SydAB| zcLb!wY*hw1e0H1_uWG7>*azc)s$Cddh=ygWgr&c4HIG~CkI{#5L z#wjB{jLv!->jy#1+!*Tz&&CmL4P79PFDZ+j`4ZcYLCmTxEf4N}DB-;#Ovi!gtW~8G zgTXiZ24s7E=KPWo;gTC&aErUp#R;xMll^`9o`oMl`zIfSDm2Ijx+)#PpI~IaNKm3+ zH6;5RRB3~CA66tA&_}j0-i6?$_d+$&O|e&%Hh9s(ui)BW1vR#GVDLB+;bSP1KRS_F zw<8gELNXhid2mT4xdxJHuqfF@kZhoQuOz!2l7;Z1Hb}{Kf@C%pOSS}(HBgq@OLy_2 z%b@FKQj<%^2SXlCcn4h+OQvGpv#cig-x*-=GR~M$9 zbFqbuWf)0AKZLyQ7hYx5!h*7qikA%6SX z!yVJNK#9$irlE9LbPsHyoy4{{apEI<@TJ7Uq4ZflmiWQ1N#6n0Q2M6er$Z`*d{;6$ zJRRcL;G`!?YQ6Awr1u+%loM{VdP?wLxCZdq9Ld0s&T`gsC7JL{M0=Bf%0iwmnWoBD z7e#!lWP`YTyzAglqN5D9w@-ybNTO4uDG)0C6CNkCRDvmP$l zKshNJG)~F}jgzuL?WAl>DIi^; zkc>fD@Mf(p855oa@E8Hr=c`NVaY!!As{&*7{EcDI9ZECdwg{?0WuI@AjtC!wOtlh{ zmHe!?O3}Jl3xAUPJFEpnq!9%CNAM>+Hwin&;os~J3-?FF4tRmjK3ud8QnWFa z**I)-PXsEn1^uCPS~9(Z@BQ(~V(H?^$Lg~#ezs-l1}enf5`ujYh8V(#&l9kgLVGHl zhS<1^V?r{#Hxbj+(rh`CQ2?Rb;E;8m_p{VZuP}zGrJ3NB_gyggWJwf#F$A+C_$>Ka zNk#M?h;|TL{xeaQ{uU**n?$;#BK<3fnzbM@Ai_0J2#G8XIjjWHPNH1-PcIk+;PZ>) zMAPTZ8dT;76=($6peo_?NH#cY0QPg9h<1+#nd38$f)%kbWP{4PD(CgJaAL7n&I^Ta z5+wLtaOGnt!P$_&29*Ra!@t|$tkp22hv2kraONWTMDym)#e6={GT^l6wnr?T*y}!@rHZ_hf@A zon7mmiJI^+#I^h7F$31Ft@|a$2NygMdFKkKTHOaFCIpY%nJ^&B{<1GiMg~XS;ezVe z>Dy7X^yds2A3Gh^pAdPMTdWWPrq0g5rB96%@sPym=n*vL+d!POEE*Uc1bI6_EN#b@ z@(#S|0df5N>gYN=H@uA(v;84aDL)}G&5zRWd>VS)AdVa9R|eaoH}IYC>jyE88-;0z zB^Z6T!Q{xSQhf3fa0{=96%iox@%y0E2d@v0yy`1s^a7wKogNL!?lIRlAkF9G$A^d8 z^ung}PmJ)g>k#26`J8M{eiC!a&FSbnkQ8xA4daBWBir}7kJ4{(4;&>zGjR5@DK2B_K*Ma zy^Af$58rHDcq@3@SieQM+zP+&S)~0I2}}zJ1Nl+{SU>a2gI_BA0@}bF29iAbn~a>V=O|KkUut3Pa7R&T0Vy{ zzgy;=Ru=^{^3CNvn@>xh_xlI5b_ayj2ef(zg!PBCehrePDFr)7oXiYU3T#l9g6Lz! z+X88pz5vc^LCpJeEH3AJmo^G#2h^N3NXsysm&oT1XB!mGVcT)OxAC^2E;9(+`6H<$%K}W1siIcf&6k>x$A@yL^L4~{s&b1(}l}}kiF5OQ! zJD}#QL5K5Q@;PnNaJE6MkXxXTxuOu%`-+zr{_AkxdrhKXA);9LFZ>vA#n-!ATrvH$ky^SuJH|MnX))sE2|JQLphci(%-;U)%=Af0-B@K8j&2 z8(bCobt;Nokm(7DVsjwN7W;$46l%H=0OE9;Or9fx9rI$xA4>xMMOm94RKXtT-@M;%)yy#~nMdQW0( z@ChvSHVJVsLwr*z$2AeYU-?HMs)zS5^@mw0+XMQout9ehzRe^cx)T-o)TwH-Jw{NLsNPxvn|27pN9l^q|UlL4wjp zsNwL%Ydr5Y0og53i!9)%DAq^U$Fk0&1V5mUMX|mXa7Th#ECDLO%K^1mXG%y%EC)1VwMkG%tSbei9gA2)sI40W zXT{#?DP1{`)|CT7sE}EpL5{UZq+V2owr)EM$e*zU{&9@Lc7b5mqWpGt&Obz_on4Ax zHk|*xk}Yg4BmC%OEt=*wxaip7UNjmp7Vur`^=L}GgczGaFviS1Z(z0|jxp%O^NxRs zGmnjQb#>>(FZBXx?pMK%oRHewqv;1?syOCU$Q}*5Ss)RzD|7CoT(Ap-wlRpbhZ5Qb zDKrvzG$x0RmG7r9fj1;J%CaD9um<4Dsd0f`E&=TVZDYDXJD4ue4yX&X1L_od;b;`+ zTZ9>h2`N={2}G^whK6rS)JL4hY67t`>&FvW?I1Xj72Seh-F(v@2j{Z8koyS4w*DYh z#WjIo6{lLzqi>FLViZ`YDvnL~i*JoVHY-fM=YVkY5jziUh>Puy%w)6zJ4r0A&HM>1 zy&gP67tzUhuK5R^p@ZnI=h1;8!L)w|9ybXiW}9i{sc!i7^2Vv8Y*1HHsteR|ODr(Q zTTB2<0d*=`Ad^W&2MI|yru3GW#5Gac!2_Xk#>OW~YPEw3)3A zs1@`2`V<3}5gQiGP@(A~&6VutE?v{|bwHh0?fA^(RTl}#EAQiCUKRMPEv|`#7U}=~ zpBA@B-Z=d%8?+lI4@%(iB5&N!S|O-1L-w=MlTnJ>z+V+Umc&j?sJ7K7u?iwK{u@Z3 zd#J{znn{=>gD^?%CLu}AeOgR%1D|!0n@Q*-hquRtqi-Sm&u#G=)(gfwZO~5gbPU|_ zSBF2!87Fy^M9y}e%1w?)oGu{UyD5$isEeZmn)E_?lin^8I*UImrnkUno!%xAI=yEL zcUD$zaa<*DI5BF{YlBX4d`d#A+|j0~j+xS(gjyT%#dB!LmP#dKKBB5%S zOoKFZCRn-LQzTBOma;)(P#h*ZUqZ7bOjSp$YkMFg>sVFnYre3GeIp2?+7=R`+73MH zTB)1QTD7?^E!AEt-006tF~GAL0J&XWvH@g<$Q)4HwgYNqXpjvPql{Ab+Z+3) zRpRK~VYakYgQ#J)^p0@R2JDLgtEwEr99I88jEy5ZIKSBGeLunMV=~gI$p;H zbtVL~$O|MiCyI1yqMHWC9MXyvyHH^(u9v$Dt= z<)veh4yY~C0ktwT=vd_A5~ou#S@dp{2h_xU-vUoQraa7swk&=QgNy9@jdE z)YLjx$)_pSA=20M6s2$EvzESvgqHpmVdUsuNq^J&q_;us1z78( z#bvldc7K&9)NsFUHaMU*WCzqq>wuspY273wX}Rx5~ zq}ia!7#4pS&^=F(jB(wwFDOP8RMNa~CfxJRf>L2DTxdFQD6A7=wcd@P}l z=&OMQ2XWFI@@kG>jZ1T!rJV%#5rtKV`2`uWp?~HmWcb9T*fb?0DJ(dxS72&>>N-q! z3b;svb-lpkq*N4a32=dgWEzs|l6AqKF;?S%mnDWI+wj^3{qND_2!4Y9*k8V-6L4mc^5Pu60Uo(*Dw4Z?fj9qFX^r8R2R`UnP?N{{uu1veJE7_CnwhD3XPhVdk5 zqxG4@xbnZUUHhZVn^L(25Up#Fcq;dD`PLaRb3ijw%Y(39eq)WodvA8{#!tnt>XG`3zYTW(Q{zbi0Bm8TXw?k zI87`D*A7kmv>5AAG}n{B^HI1)7q>FrnMb}TIf#&(to=vb@`>ReP7i|C3Ls|jVX znot(2xzb{<76y*R-nc%lHmJEOi~YB4v6@g8s|jVXAdJO6v%a)Gzdo)usJSYO)p09} z{f}+2not%C!dUFL>*M-^fR4r5pk=Wk9p~lG#uiIAtQ_Z`F~|O?^vfAb>xb~Bhr%^$ zP&s^Vk)4QI)dA`7z3A#kaZ)q{<%iKFkHeGwDmxiEv39qE1a~sL{-x(N{D$?0+{y6n zL#VCcocSAvKedx#3YJD|kbNz)lfee#rO|7!%8t&RKNd5!li?K978+!;Hr~nbAdGK@ z1SP6=G9=M`u|Y14KCs-y;-%52)}fV8vDHq7OBf7s12&1Uhp=ikzSUxuwS6I z2fTwRBpXD-GI*&sh6ZME-Ala!vY~lP;CXLIlyo4v{}R1}q;@fN+#awO*6c@j#pz*f zuC@nMVtKv|n(YA&sBY{IzIzk*m`Vg}T&nE>9T3O{)w;W z2bApr=fQlu|3Y$Z51{#+C(&`JNo@~kKpD^=(qG&jV1scPpru_b-*X1YSegdeppDDG zYtY}V5>#dSL)acL3YKPrw6v39X*L#H+GVh`28zw?0l!}0dk;ulY?IC6_JDsOEiVbk z-p4F%5BLxQ+F-mrU?Z^oRDv>vYJ0$D0KXBCVgsBOUV>6%gZB0SO2h2|pTQQ|NpO3> z_4puvcWeu6IjijfAwt-os*$$?KMg8{aC^W55XT1N?E&Fx-y0*5D$9A0yJ=1!QYQE!zJcpfA2erId^IPX>6KsEZ|BE!zJRzy}0WpQ}at zSEA(XDY=kmP%he^i=Y}*MVE{ADh2pE!zJTrMwY(SBv&py4yf-(f%WNzE;@L z^38O#Ko`Te+BIeQjfl!GyU0shABT$lYI)eAd(TKE)R+TrTD z{Ca*e36)W)^?mCniK_4@R9iL}A8fTb)KdW4)-MxfQ8zXZG=ZQx($7tT(SWG_C6)1l z_h&(4vipE$s5CYSU8_FeGw5PzkTtPtxNeI^`WpG1DKcGymj$FLnQo;G>gMwH5VTth zdh&9Vq(m%e^cJLO(8K}gRyKoBT-Sl?_rieYW4QiHKCYKgrzRLzj~&;(54dp!JnMXa z0i6`splca&QlJzz)eZ0@5N|H}oe4r=t09gKDqGSK#1)?23Bfjc5zp zBoVNVMFcaVSGeE26e-*YM?bAVNqAgB&?mHhgAt@3u(Izh0ml*iR(7_$FW_i^YG=z5 zh~2`tzQfLz|KhWs{}!u(meTrTVtn*BFz8^2UlN(%84x=@7>7_rjOPpOhjQnDYG~@e zaM%kaC|$i8V)_A@vqV60h}T_(M?s3y1!mQvQg#7&T?%)@-zb6wKNH;su$$6M#pK{M zAZp4`c6NdH-3?MSk{D1rDB21{3y7*Eesw@&T`LhOOX=_nNgAyK{-@xD$Ikb?k0oRP zmQ|1WQ-h_@*;fLxlBs$ew|7hcV1qLX{s=Fuz^I=u3S>GMRN2v+k~r0I{3|Z2-2{=^ zpt7T|^z?+6l<(Qcf%uFj>PA94ket?O{=ndM5ZsQ%-#++b>VxBvVC+^=;CzDA!v6v6 z(ORIx&>>XXs0BI<2c#C3Lkr~+m!pM20y3|+C0A)J*kDl$ zlO-sd+FA?$VRrX}7B)tvegk5G1lo%UrWVdef)@$62SIA#41i7eOxeO~(1H$Ow6G_% z;DFS^dCD zO1eOpsw5ZKRmlNjwoX;j2c%_a(5Xrewu=IEqD=V+0iCME2E`=?tV&Lkz{)d0;Naxt zE~qLvRxNf&1+vuIps8xklQ>lYgH-qhJWgcvrLp-B13={jJXXX8RkY_|AW(z!U}_+6 z9^!I9H4w;?NG3|8^c!j*kSCGYpgxHtxygpUx4nd>7I7L#<}oa$ZbXi(_)|qR^<^CT zg6Czc5>-(TjyCE9aR!ezx)z5J^?=~PEtxHF`dCefPtF-0-h&rsp?|<1WmWgfC3irG z36I4nGj_$f@U&jo^K9g8Eimm3d}f5F!m;ik;Mp-)g#$Tp?394p5j-h1mrX-Y?(|1kXwgRTA2u zkge{hYuSry{4nGo<6P2+Jaj7B<;qh4TZOFG3%e|=?8#H`v(D3cB_>PdMT)vY8 zWtkAZhk)-k0@Il-J6rhLpy6wShHtmUcgcGBo*?KL!#BJP%D+xv7N=$B;Bd_w0e)_S z=VE{BJpji)5o<<;JP#o|0Ul<9ZHZywO91b%!SeyW1Mq7bydW{eOKy!KQ}SdSDaQp+ zOw@Tkxd`@uQGA|H1D;uM)pbs~EtV3Y8}Vroa%oG1 z22D_eW=&9pb`VB{JB6F0nFj=PG-HEWgzRT4u&h=>vs#2G!8^S$<>+5pA4t*cuT@Bj zs6i!_J{QUXb^W(?eWKc+7FB7h3rW}7@-mjT3YwruO`4!6Z6J)c)?v7xKSx_%3Fv6c z2DJ!Y>C11Wy>aj0Y^tk$ucG6HII?5$pFe*{N4dvSU02+di4F?APOx2ZcTQb4^RxtH z#d6J|SnHR3IpJxLBaX$(X4XkiI&>AZ3PByvTsG4K4h#~#xH$A`vLN(jGmRwlWixFc z%w;oOAoOK3{}EQKUG-%%{a%cd)Q^~4He+MO%VzeJkQCIqY$jJ8vj&>n1WmT%tzawe z9+})7CGljzRJDG0E;9(~YQ%Rd?kSIMLvmXf$EK(+U#|4M7bWnvh_P~u(s99uITz%4 z*1_QzjIu-WTu=hHP}kn9kT^L|r?0)a zOfWXU%pGhtXzpNhKZxW3I2Bz6%u`kn@<2Xn`@ z4VpWyACk{mQJPC>Y*5Oly4L0?2~20EcyZjp22Bh$Xi7M~N-lzpu9aw1ZE;U|_V9Mk z`#>-{j}`a%>LMf?Q|x#VQXh~PA@v5sYE(YGLBx!sd3khl$%r%4@mb8RI9~a+DH(LQ z!1nZBgqOHsZmC!DWn0?YI!H4Q*C zgHRX8-f}7`CK9~T_G%DaAoRttM+slHul1F-Hm0w%buc-bPh%`y=I}!=*!bUpcd10X z6JD(t?N`^0ghU!-dobx|Xa~{%*5Ka(DnXfO@Ut}i*l>e1h#w`I;}A&Y;gOdo47jHT z#~|dd5^`sN9AS*60Bn)CB3}2m0fed%e@91sQ(-}eV45&9 z1yt=CeORLn8opl802OQ};YVp@9kV>q2aJ9=23DbYzq+UIEnFY(MFKjtu?-6EXlF3? z21$xfMwT^bVgYjn1hXhS7{p46lOrw6Vf3ty0eqdnra%8Ha-$D;F>*zNtg@8q20(Rx zkpK(rT5KK`^6=}0E8LN+u0LOMld{tDLxqe?vX@h8vA8v78v5!9>x(IUD3_%DIe*)16 zV(e~yZTZ&_zJ&x1fC)!|Ynyz_igN7kezg}(z7qWqetf837k%;$91RGytMvHVRD<&t#WWPYVZ7_G;s9-bXx5i9{>&LAp6j|+b8(m zyHr$BTnqRg+VJ@NRY*Q2Np zqT2mX3TuY<^V0tI+2}%)mPQZVd-vCe%jC0A36uSpGPv8S%1jX!#hH6zJ!ToJ;l#WISeUi zR$)%@>k6Ns5U!LkG_I7t34o)_DG)CtJ6FWq9?H+R)*kV-W7t6e0YQ{Mp5 z+f|necY%kwU+wZ?vGzAa7*))?so$cUz9?{ z=6iUSCJ?!!u>l>=ZFp7<(-i9TP7-XGzKrHi4+z~b{Zd$PmR~naZA>>z9ZVXg8gm<_ zSnJT#RO(G09w&)wqbO}f{p>%MdNp~}?uZ?qWjPRwxQ$4fjL#OE_%a-YJG3$pk zX4pTXiFc6rYlw`1Tsh}s{1l33GeeoY17Y&6 z2ZYYMLYt0%N=~7?^y08fxLIM{gS9;BfR1L*};@&ux!o(sfp|( zFjgCcMuOwuf^3XdouyUVptf#}u}^2L+X1z8Yf$M0nu9~R=j?>{v54eYw*$tL>@egX ztz0&S{I&f()CxKHtAF}6cy;7U%3tM&nf=h-Y6rD&T~gUq7oPhs4Pv|U#>I9O(yn$9 zjVcS*_SGaHWsmJkIp8*dl>=TH3=e3f8gv}61|@>nYA=z`iw;-{U;zT9{PUy$Hc>q7 zjM_+OgYE=TG-wdoplilk2HglkXID@|2~aoV&t#Va>g>`W^Tl#TwGx4oT@Gjrc2f!J zIHTN92?XH$Hq*-u|b^^8biCTm=g}Db3%i?a$<#*P~$or&=j1D zBq$Bd6r6MH?{&dZPScxU*;oODv9Tr)+Q!=OY%07?5ISYINW}Df#>N~FDGTUCHOTfF zZ7iH>fhxJ$sopJdGONX@D(}%{Cqmba4rr9nEkQYIY?Sbp{k>L#l)@gQDdnFpmRFb< zTV6VVlV~OZi;GzOwZ}wkY3Y%10i#1VmS%%uX{`1(kg&>BQT+w1{u~h1pmH=0i0V)| z8VxE>g=$gNgu^AyJ~d$%rPPkY+tA9?0tlU{O?Wn$+6Drd8eIq9-^mxcChQ@BOjI>t z%|=#D*hoTW+VLWbm1(LbyueB~+a4+>FSkLRlMZMc%e7V-k&|&N=SBhh)`ZjK4VN;S z0&Rn)K--`$&^BfYv<+&r*BFPajM+P&F3=iOdQml@Qp>Kk2DDn{+n`p90~!NgBtdm4 zhaCLXpNKwC3-Tr9U+jkk4+H$)O2`1OQ~qXtAsl+Wi*9xZmbVu&2wOfXHfUN|%Af7$ z!{gdrRE6~lj~r6!jgi0ys=!y^WFoevZIsSCV9Tstf^roA?NYT*Y|!M24eDI6F_SAc zsB=YQPOdnh&J_)^VHb3y@83;uBruused{_XjkPG zELYV4Lc6LKzR<3!gM@Zf-5^Y(JvZ5MRTJ~EmGfV_(Y~$VD))7n+|>qknRGzos^&{j zY3{_Xs>ubpiX4>%8|`0-N+ts^uF3{Yp|C++C~V9W3LDggLSs&$a6nxsG^q4aY_ylH zPXi8U3Pq&^m2OMi`^?zi_o{XqkS{6!Dh#pHceH>q4Zc6fXR5~227kPOPVe(X0a@xy zHEe^H!JlafV+`H_wZS`}Hh2v>)$myoXP;`glj+g6-2=kdc1?ZJwj1$ms^Jz8+O|9R zLfdvX32ocCDVA+FkkHle2O^7Q+p5O>$x65JYz}D5I2s)n56Q&Xj57l28dp_f|Ft94 zIjd~DUEVkyQX4e3ZG+mjZOquV4QkugnA0J3KyBL^>}A^z*eTGZ+X0PjuaTgRZ9isz zuQh;bn3uRWBVSVf^;qP^8Oe4~YF3jol5<3xW_Fx2lYKzWQ1$^iQ`s9-_nB)@4JhfE z%k6{_yJcqP(gw{mSS)jwBeOSEru8UuK@*g2(R=QP>(iBeMXe6349bm+1fNg**Z0$WD`Q^Yd?ve-rC4`q=0Hg zyPk2i!J>@b)Q>PYS}uuVENa}@t9u927$>faN7NZl${#0uJ zMOTX^xNNFJ6I?dc4MNRyas}WAAH}h9+{4Ut{v_Zkf?8x7G$NP30fBSV)eKDbN3gy3 z>o~qweaz4tR2K54Ya63{h&8U@RQM+wLVM)eKBM&T9DVyU!%Y9Q=}V2~I51?bs=vM}TO(Q3;0Y5{50N}T8buxh6; zM`1SeNDyz>EZ!;0gfC+v%K_m8yx?R6T_-^)clAeQ!^3wG)B#m-Pr-1$vx9z8Hac9q z+V_4EkQq?@Nm*t3T*%!GVXD6=t4RL|9CDk0_zrv8m7EQrRxH783Cel3OnE3(XgM9w z$a%X2b>wtFBj>$#P%Y;}0%|!!%K5s0YKR8%hLras0hLgcJJ=5B0zuW(-GR7)=rnw< zLG^u2zp8K^G;*|rU5oBK|CtbP)2pS&KqFtfIM9XGv^K%pRQBV?Rihj_tXYY*9m!p zi38$v9lVRa$HZ_G#W)c6k)HS-{1XW5VoyK+65JD?pXYX%U^#>u`tMjpbQ`Tp{A_U9 zCoY)8tvJcD&;=*#yDP$b(WzLN&_hm7`@=H3f~eW7pVxM9lsOtJ0~+ys-pnZa7BiYH zcvg!P-Z%g~5D@3?o5_5z4;C!odEXgWyzn{ZuQ%`K9rX3E_%K z#`1e*|>E(?a$o20k7#p2vu z2WHMfI$H4l+{Ovf&6pSNz%y4kr1wPNZV+7Iz?jr8Ivr)p#{{k%M*ju8n_$$)^0hZ`FI;{znYn+4*&L{;+jzx&<@j{&jHjlsXqsAwk&#xl3O zCsJqJH{zq^KgLI5A13dQ#{1*s@(&y1=?uL5!@+nu126w@K%UO<8(2G_J`y`~!lB4% z^8ICW^g9Yr2cF05gPWdKq5yS+U;$c-0+ege1qcP;Q>3>60FoF*1Fgb`* zFsTn>`3S$dydTPJVN03er{bDHEFXy@vw1de2MBWtU=Im>;8|gIKXu@lIzjmyKh_>I z8^^Y(6O?U?n&1h_4hBtxJVDt3p$WvnUwl?FxGW##4^+amgD}E$k7zIK%07$n!CuA1nu_odjj|zpMloT9T6nX`_bIF824D)BN>uT40A%oX!KM zBL(H8@Ul|jq(L?`45wr4?=`1W1XLk)nwHxk6{jn~=@LQFp755Hl?+yC(jYCzaJs_& zUURzM1~sSKT@c#48JwOFbTm2j!?_65o(3gL;(U6+{$6u>!v-~{_gxU2?gytI1XbFL zN=7P98gw}QDj`Lsu|;?#u|cVjno}g8s1%%@1g9Z_Do$xhlLj45dHZ{vrm^eeG}#WR z@~I1)W(%69_R33!sx)cP;k2Xuz2?*?AUnrr=rrvkpd=KP&Y@36-lzTJc{s;8Y(=e9jV-{e+bNra!vA4mEVQ zl60*=em1J^gk#wn#NSZ0tbPnyAaP`rsr^&JYvS{@gQIuQ4Qs=*S-H{)La$u8MMSh$ zuGpAfx#D1=4vjhL$UcBB*P9Y6Tjeuv+92$AHnuTZSR%z!v*b553svRb^w2stRvmApUOoBJP{N=Z_6G?uDuaUt3^^)()x` zd>w%WUpA-~e6?c1mjiOa*CH6819C0qPgsj-gItT*few?#*uGY4Z$CS=7ig`;tiKA2 zD?6arl>a`~J3fN%dq4&LMw#Gw5R=McQ&7Dxo@DS(MCO31^H_~aX=69&xbUZEJ#PyE z>A2KM26gAH!@^iWIr16!lLq8VE=zd(2}p(jGr?N$w?UPd|AD^)s>IYCiqVGsEnbYE z?l{=;siWfr(DMNt;?*awKx2G+ruajDVCH>z>?Tml_8c7Th|A5|@XT$b(WdYYoglb< zw0QUeP!ygpxj8}IHGj>4L`nIWK5vHnN%#F27%3tTRC!75eET+hd9RVzxJ3JsO z8&f-1$zW-Xu4cWB#O1O+V12BA25Z#dV2XYfSY8+6E2lMu+wJy;&p9 zZ0ReJccZ*e>6;&?&&CWB8#GK>943G3%|xm8?}9q2tpMxq<;8YP-`+!2`fSXwwn4+X z!(r_Qv94Uz4inU2JshlO$P1;~1%nl98#AnJ(6H`ySnt%EHB~zSO!k)-O0^5){IfB` z#0CwM+>W;C9MhYLQf-@{PWm)YhTZdC0)ar$h`u(m67 zu>RdHCg#tds4G_0E)*12$fxjIo$hxP7Yy^Flqo~hn%n95ZfGpudUux@u)@4sHw zrwGc1k4g0+u)f4*y{KBTwlTxn1`X>jhxIM%W&OY8+6E14 zZztQ#{<&V(1EM$^*xE3uJ`t>I<%MFs{}9F6#tds4G^`5_>rEssw*>FC9@bv{G+YXAeeuY7(B+ihJ*rQJQpJSC#1=`md4XLNC6B~xp(Y`)gf^qULV!4k)c_2a`6E#+)`1Mmjk4u!lrUub1+_!jKbpm)j@@*8|Q)^Z_|1(Ff$*ga(;! zW{#psI8oPTj^YpjIa+4sC~Q#AQA}e4zfc!zflay;kCsDArAzAWyu!YNtegz8QI!Br z2E8Rg+0IlTCx!ZeoE+){a+0Vws3wav$k9bJS@el8q6L{$*`Q7pGNI%-&-S7D`kf3u^SkO#cjpg!P5DfcAFo*G0P3r6MI zC=Fl4$~#@6FQcCHY+##!?64T+*o<^fjIvc2h65 z3-WMMd!%FgW_Q2!h|=lFQ!a?S`2zC%C3S|`XR9#4&CiZ3ErgTs*?XDzGZwejV@fwp z|A-LX3~@~9#PBwZefs5b2ztNPV@pRxkD)7{+Z`c}D;=5n&jUD041{(zS!|@|&v7;m zD9*;g#Mx-fb~bU&klpd6l`3aCK`3jXy1hLtbvJ-8>Q1%}^S$FlocR#xoMHX5Ib`~0 zqLht@4KEAs+T6udd7(Z0TLQ8L@>J|R5*L+3h~kbJ7()ly zI0U|e7h`)nq(8L?q%iFApXYr;T#GLE=vgm5O>C$f=!W(ZM-dyVM z7mY$)Q2?Q$=9d2^5G>y1JQ}VIM6p;iX+I)0oj_YB^cxWkLuz_JsMNfI1k}uz)V#-} zk%&`M$~i2MtrPoA$y{>_8+DYu*Z)CI&-gL#pxb${#M&3Sg^T$hnk8lN0 zt&{srjb^i*6cd}LH=_sB;gl_O^3`;)1#e%=78*1`TWHY)ZJ|>Wv;}WJ%N80ys2ry) zwD66#g-&^seh`bjy+!d_hKPpIKtdZvGYH2py!77KyW0+U#WiR&1-qcGCvgMjb!p2u z`YtZ#wB?hA#wCmcI;!x~ru%?QPalx!>H{);Hb|QfX!ACx7%{yz$aDuR12(8aGRZb* zsyrKXRS+Ho75q)owgu9*;(l(V@e-Zr{v@u!=@KQk;-5hm;#7%^u}~wylP5|ZZBNHX zRBYk<37%C^vh)@~w&!Y&1W%zTIqMF=_EFdx#8LGg{+W4E8mBd+{i;e_jH@Rt>Sm(FE0{!`S-&5|T?kz{?(fK{z^}SW{7ETS=^vdv?Uf|Vr zewA1IdjqzEor&V$Z!#*{1jDz@ASx~`%c|kq4ib9!wg-e6ll+rCCP~7KNs`cGl6;mi z$(pmQG08>{dQ9>L5p*O3)f*3OOpi%Am{frpquH6!Y&CrQ=WS!D;vN!GsB z1ZM`3lKz}*bka2_Casv&F2gpsT|l&esD237Di7zIv-^2#Mn;))F2)NyKeO@3s0Gj7 zISBM2ipCi&ctL`jEKdO8og1h1;G2E#k{x2HI4)RqXHB>S3%+ek9fh2o3q!qHLUI63 zYsJR2Rvb*UqA^D+UiL?StYkQ$A5**##-<1Kvb=X1h8!*ko198`ed{MEk8tOB#7 zzgb!EIf(mqjhXRZ-ZK^c1=-|)YIJrdi11els^nT2j0+EioS;Lo zsL#|c-9Gf1+Q_eRNZsY&S1Pth&r$8qsHpvJ2_!xr$@e#lg1Z-oUZsSnLkM#$mIfh) zbu8BA5|qOM=2$ETG{<5!fQ300tA&I<7ORtlJ{GG7MCAxnyC40p#H+cWcr4Z~RvFUA zVjUtFTfq8QEE_8xi`6Y5+2yc~#cBitvIbgPiOa)UKvNIV*-%>ti1AyL46R)^2Cazr z&2G_~Aabjve&g9r4MM21o&F_!*w@r&JEgZPnv*%($p+2YP7Y|D?bHkw`fR6m&ASTu z)1?WX?c`l3b>Nfx;vy4as*hF)R-$xkkOpMVcCtZpw$lXpoSHEwGufb2P3ml?sl9oz za=cJ(D+H`6>!zV$o{$Jmjlo=g zk2StGLqc{a5NX6>JqO%-AzaiHgsiz(Evbt>eFjVF@VxgdoE5O>DYz06$0tTdZ$FHF zJBYde#DUm#$kXE`atbs5RkZJexAE~gf^G(M?~@Xh!PbbRQ$ToVZ|~g_vx1ipnGLE) zhal1?B_#ErBE|oimDr%ztppqr{f_lnn7HDNM&>wn6~42 zZh3MCWjtDM?G!6)<0!n3rlrErj8su;i zr3@&g18QmC7e<`OG}79jk=6!_(&97xYR{RAm7LH*wU4!?YA_6h@&IZuOcNXoD_j=8 zQA^^RL6||X`=y9FgJ3qOOJknw9u?DNvyyBBvb90OzFjy*WZxx(8jE|rp*5n5sbQme|b@c_O)AP?Z{4XOk9dV`3?%ahq#BAUbOJpmnN zeLynn4Ju~6K{BhI4v*tqF8S$Az>qBnrO*)lxh73qi+*ey2geB}VW?Id`N(p)rAyGU$=(*bWoCBBh-OZSBiWmW!8EUehv1?z(sv9Q7hE4Z-YCM>LQ zK%S(t9~5bW`Xrs&2QUueUB&h=1RTF5`kNqvgM(qwmpFH|8AQcCi7}ZexQ?X*L~f@+ zQ3B`C_Taht_+%6v)`{|awbjLJCLvwS4n9j4vj@*+g;3#|xZB0f)I3QQTQs^eWn;QC z!nh?Mk4l+{iG(Jn-^6|BA+#Q1$m<1bJvT?sLTdUP?^n|pfcNqP?hPoA`HElQR>g@ zQ>qR2QL4W_rS<`-R1G>x?YBOqCfBD_8!SqZxcM%O{@sOtete`q=GZFz(vkP1y=MHa znCF*XzDdUW0)Kq|(~OMwGX7TV;BVYGHg^9P!Fv4p-{Sz=k(*}l`J|Hk4_HrkxV)x= zO8JEmL1QmaEwY=BMRs;bwaD&F)CD%E7TMi^y1)Th7o3i|zyZ0)ZWxM}4RVp)f3Yr2 zV-#C;PpXig4rnd1tNRsu-d0H(sBWZTK<(Z*! z_c|3~pkI~e!G4jKUf;fNm1BMxle`AjASxVGcrUBEf?Y-^4+P_egm95Ou6*A$k|{nS!!6 zgtIaIVc8$wa8YjQ_^da^oi-n1SB(9+&z&}VKyv8pMMkGVuVWh_xq!w zFeoUYdmI2+RqI0uskoW}Y#;0}^l?KuJ)vm0=p zI?Qr~e8J(2l>axJ;j}nst@ua^eM9k?B(;Q~0L8i|fW~o7D zlQFR8d%9LHX^>1|Bzo94TpucF?MaCogj>b_JGh9T62hHp^YT8g|?8;9S1&(g?8iFSZMAK z#g4)!Nl$~*4OUtmRPyYM0Xr)%(A=m;Y}FshD1nqB&S7!O8F1Vc^&P1 z$1{F-GS*uXFwt=1ECL|sFrxS9*jqH zggc{k=74H1H_tq*m7p|MbMl4*stF$+-Z@=@vj1Yv6q+O;i?lhsQytyb34w~oi-0g` zs5!KlhDJP_G_-&)$BXcVIbMVWWRB0fJPcN-k7yfj$#0Gs*-k*}RgTb6$BZ;tflXo^ zP$ibfmmX=SOCRiYynxI^qk$y?2DSz;K*M!`YvdgZNy_iUL_J&fHmbTQY~jBsLAeM~ zfo$pb0omg31G44c8&o|24Kj0058zc{&_wQGX1 zc4L@t*s*Pg*GEyZ1%^k0nJ89aWu9Uxd zUTvi50%11N+#(;SlE=9QZlrNQWz5`2bGHOlCd#Q=Zlw8}fXYd5s#a~Jc~ww08_hN#0c?wf7YT2<3D!bvb<31pl9rppb z>{x@UUgR(=k4D)^7_qx)Miv$dNMkmmnl`9SBu`iJu7u{0Qp%r`QJ%yGjg9vKSvvcG zwDCS5ZM-+AY+Qqmjd!mv0XC=;0FlclAsf9TR3Fnzu0~nzFWJuu6`fFZV9{ynquGxP9zzZO~}xWeGVJAr(k1^#Q4+J|MN!8&q1- zAnOO??7 zFy7Z%0AU)RO(1mRvklLtd(=rnH$HnvNaM5SkHyAkBc4s;vjv1+7*#zbmW@SUcY170 zH$ELq8lM{L+xXl?Vzo!DZOm$XhBMIk+*iWWt0DQ=c5*t#^E)7C%5Tg@Ut(0nJ1U;z ztewE^zaUcnZd%)zm^l)YQpmJ-Cl&qo$f;Vl}ZBxk?12 zvUD%f#)`ejw)H5~#SKMjeZBpC@dUPf8w}+> z(avm@+PT@_XBdnP2CtV?=GS6m!Uj|R+%du8S)~rhfr{V>+$RndHccg2KwJA(9;Lda#qlspDw}K7o60NZs ze5^~fjcEgPFfl-lIg9$#Qpb-(#jG@Schbfz14IZfe-*ms3na_vuT%cKNL93p1!P41 zpDZg2*krdsQ-$;a>7V<6tU`K&stVDdQ_&tG+?|$!4Ho@&J`Kloq7^>n&z~6lABI_M zPz|&E5hcz6d7aO-7-q3SHO%rDhFKht!z@?8vK)}3+tV@3VuKvrPGMn;##G;t*Ei*% z00*>2w^hTp5q>P??=`gUy<2_nE=dqS5Bv?stJZKELYUU@3swlVaFMNH2Q;nWS0t#@ z8h%qi)wMIN;ZFs1TEkyktW0az22E?&0gJ8S9*Mwd4c{`YSf#1fuxbo+DlIIE8v{Kc zOk<$tSRvRLXw(Fatwj?wvJN3sW1t&^X$%}C44r$0E0d`se9s6WAJn5ySN za``r{Q^KMpPOVf;;6DnQ42W%os;l^qf*Sp*DRVOFszNw0wBZsz-;Wsni+}cbAdP6= z_lF*UhldnV>ia`iZ!+e9%s&f8+{3y9sFZAsc?Xd24M0}`3 zLDNt9$B)imjd=ekAY(}RCk&d})(gz}{S$Rw{z1SONZ2XRddfesy8bqRx#Q5_@SjRl z*FOuYK~a|_Dhoe=I%0aPYYubyX{ zx7B$9)OnHMbly3CJT8%X5UI9NnM}Sd>lQ z48l9UpEqU8#0XF2?@OWr?p`VP7svVgp@5b^Ug2Y;|7&@%TuJnFqN?zwg>J3TyF^#N zN!U7tE*4#B)YX-Z8eO@d=qmUB(A9wT>dHn%S5t?=fG106tgL}%A#wfv>tMssOwPYM zF*5zjD_BDTiralWb?;W2dUsD^+rsPxzPH$tBIn=xorAxj!3JbARXe3aRJ*Iw20{{*t`(EVoH)mHZdeQ`s9n@x0N3 zv25^i!Wrl{IvB3%YeG4-FlAk9QwcxH#h={@vRUi}Ib$40PD`~Dh!eI=o(g$jS0 zsw{8ov%%&`70P}!##RTXSH1jB;GCQhTXn7ae8<7cQf#njDH?SxrB)({QGGd{jfzV^ zQdvwJkW}0wH&7MNedS}$@|ogkgQj@epe~-xh{_aC9l$Q0f0XF$;^|;gJZ;P_o`+lC zo8oDMx_H`{DW0_~p6x1UrC1&>@j1m(gKn|ZsH^M?BmyR~SS)SSDwbV}wJw(4Qma_r zE%7+T(gusg@@Wa`6iXX4#nJ|yVp#y|VzF!jWfjX0C4Q$^+F-F*ek(y6l&wm!)Sy!= z+Z0DBmYpDq#qysPKT|Ai&?=TaDjF%4HJipIg^DN^OB=O|MD7XuCo*h!1 zw|h7=VuSH{yR}cVDm#gV{i%EB1@p4jvNhg@d(hj1$Gd&xp?kxpkp#A~I5g%=nalVZLrtfR|Xw zz|}W3c;{tm(JgL)NYB)aimLJ4foHW%ax-+>x=C=GS4dQJ*?OGB#`HLe zgUL9F#weRvuj?g;J%lXw0!04ca#Ilcj7n3TZPACN^VZy4Io1{71g0>rk~0 zZN~<+4QXsWHk6a%&klgLAsaI`WP`?rG{|viV?!e(O8P%-L%}R$$wu;mimA@0D#C4H zG7hLlGj~GJnN}RtV^Sl-JrUFa)gVbN1`)QgV;z&)C>#$fnI|CYEqq@Q?u|&72uNwG z$EVoc#xMUR9N4?^YAk@1e{~f6hy!zMFxioc!uQc8)gU98b!tf+{+rynIkOczI`Ch= zD=XS=K6TVQbo{4c%pm3erIyPO8&EP*{>?S&TICi+$hFFyAk4MOII*sHt#Shh-Gpi3 z3w^C}7YMe@)V0brr;6v`>cU14dUat7U+C3^9U#o=!fr*#>cU(L-{@WE;m=j~g)rB@Hb%(lE`3woo#Ul{KtS+qO>cR#{k@9aDrFwVGN+i9Q@WEL{ zk&0~@8;!Zt{)5dZ70;jST7navnd<>qa^+R`Icx5yV-Gu@OR`qG#i`)c4 zw?pdoL?pimM>dtQCTvpOMOfWe(GZKVlL8;g)P00*!6Ooq-U#Avo1gbIP8gMh!Z-mw z*+01OK^L4`D9r?&|G@dAR>*nxU>n$C%ocwpAl-WM`)GsUTFe&PpqVYULA|l6_R>di zx&~5|@}C)=nE;{_#QZJFgHk-_X2yx&bkzJi{PJJ~wv1_z14r}E@zdGT573L1kYxbp zzBM8|@MRZM4W;Didtp6*grvN4KW5Bc?ZF3P+n^HSwQQyv6=}`#_}F}QIvVjjb|&_= zu(#Ysg0|d+jdqwEdnh!npQp zqn7>NDS=)4wNbI(JTvP-2~BsK@?RXNGRp={X4#<0EE|k7D_{98Zj+E$*>FItn`Vc? zJZ+E*RI|M?E>QjcrCtHKKy?+ouJg4lP|e>3%UUbESOURoTJQlZ%La|GHmEJjQw6m{ zWyI^lRYC1my4MA@a=iuBMq_p6pG6rPDS_i!;*E6v=XIU|sf>(2t14Lio(q~jg#Mf% z{d-l{KL03^I7y<7tGYMRLHD69xbTs(Om-ATG3}6VZ#F2~+#4&8k_Yz2E@z9x%l{n- z*hV>-N0Y z=C%+AoRrGrUH&Ij)rl=*XBXSTXM@8pdVy2=W8AfNYsi&5gYM;vVd)JZPXh?$ z-fC|`J~yjZUu6noF}N~SqNM!A>d{7}Z#TI~LN3E_n?Jt{2fN(N!(IG;)vbX$({JPR zAb%Q@r(ZluKG_VBr~IF)m49ppd-})x0@RYXONgyih@Z!+L74jlf`b{BHm&XUF+MB@Xg88I=F77nt!6&*o2q1a?SOoOVZE*`O*;vr(LE z&=e;d)WylmUw{F?!6E{aHpt&JTlXtcW`jx%`3OPt5|man$e%T^ZY)NuZ7}0EVmR;` z1RXCy*%}z+Z<(zNu}9DbRjhTB5wzgMy7eH%YP$3NwgdBn5Yh(0Dw|&f9k}4cLBX!j zfejiR*r3)y?QMv+3x+iayIjUlNNz~D>NR5oa8DjSrV zDp4{E({`Mo8+z*VdiF2y;Se}YH}vbx^<3W|Vw|3<8o69!t$x+a6&Y{$OG_aQE@n!w z6<@XOCHg&t^M)S$b=vzI{!+Me$RAqzTiR>HU&?QL;nEV zq4!qnNyg7eZZs|9EyG{RKN&IZG(F>8g};yZT->ce>EvKxP2x%2vj>LHHy%L zu3a|?jv{c?MQ&wr6yZq`#$LQ{V|o<9!DJLcV>IL9C_?=e7)WXWi2G$^|SosJKje z01IjbW!|Z?kET8ZD_AZld6QSULZ1~hZuKt06$q54UCFZu%f!k0YnzK^?SO`Lj~$e& z7YdB-H$ia>99TC=w3S;I>j|||f+=!96YXF-D5F(Ub}1+={}xi5IQp z%QgvB+&&YWuF4d*e+uXnHwRS8=0=g9B`CYDQrzH1L8#wu_}8Bw?i+Z)Tip03zp?m# z#d1HFJ#StSWHamL;|j^U=DOHT3nFje_tw|!F5Ha2c!|oZSc+2m2L73jnrX!@s9O?O zJb-%QPW+SnYX--YY~m;QP<0mnSpqR}^?2349*HZDYJV1LsD`)kY6tvtC;qDaodBsC zaPE7+_v1h6yA%BX-^Aqh`Ee1r7b)=P--4qGEB=o%wbTy4Sv)m2!bAEkqcRcBoM{BH z_r(5LTA%)mBY%62$tv5^81oLcmp%VuC`O`J7)C^Yg)%k9>>P^`(WCIcjmd~;vJyO> zknd?cdv26dyw_N9?m4+i@v$+EypoT`Y(6%o`IO!6doN3z93a}WK2GDiHlIy~Dn2%* z`Do1MV`G|61^E0!;#7K@F+io~C!0^h2*t<7G#`!Gd~8hkln(=+7Ub2QTh@Bsm{&2c z&=F_jI4noV?H1?vc_>ItvKf{>bGg|GmdU@K%55^tmp;Kzs?_>{1Ne7 zC7-iI%Xv<9XF;lat!S(L{bNy|7VuC61{jN~K}Xb*-D5pCqK*`holzsI18Pxi(1+{qG(u@rgN~>dNJvN24gnoe9Z-vEgGSVQmlkpg2$pBI$VkRiGar_`48PdiK;r(x{A99Z-vEgGSUH<#XEr?t-Yt z3m%Kw92>xL0S{NAHpd2_K}Xb13F&C{0|6aT9Z-vEgGSVkM`fC5U z;k7JQUDwmMo;XcuGbbS&5qA=h^_MA5rwK?;WwhylT0|Q(BA#KzDK=XB6wYJtZlE+v zvtzbL=dqxO6L1jit2|dQel=9RYSXXsFCYy^&;9?{dlT?FYU^!WbMLih#>u_5lh_Ga zoEx$d2$-EDKn!7r7DIqb2#X0jfnpXX5T{`Fr9cebSbUyaUO>Do}fUrWFKzUQy!x%Qk_8cFBq=tw%!%tVY;XvR($>mRp5#UP`0 z{VFlme*^=Dq$H^Kj&DMlHW=+4kKG(=@pDYBdJ^EBIC$)i02jMpcI=)2A9TSnV-Eqi z!UfkD>0>18yIWLKifxd0Qf0{l<2+SvKw8x4YpkP2zY2CcG>4~GYIeJ0cHc+T#U?!$ zv4gxbGh->Ns}0EAr$HWsHu6g(z007xM@fh1q>mYJ%Q$J#cG!n7_J384o>QTd4mIFF zNji4LbNI@VHGB;6&V_wXY=X?VW3I!^`0M5NzO7W9*E|5V;X)~)UMW_|KKR4qvx~O! zyySTup<4KnuNLj$dE`Y0O2*6WHM3MbKRZ;5@B!S!#hc=G-j!^B6)U&{Fivm76*lip zmg2qo8rlmvDtt_Y6Ng26BVHvo__SCJy##;G#&6M!-q7H4?8xA^=sj=f0{lOZ*Kc^k zRUKy52+MWhx9?l3=2yY7_GJ2Nd;?1@PpL(nVQ}jxPYp8(sS~GmdLx3=1au(-vg!bb z4*q(l0B>N9vOJZb3f?>dgO!2U*B5Q=t>xc{$Fg$w)lchvVk-)2MVcEB#U!?1S-80#)zS*FBs8ji;hC5nk?8+*R@cSv7$T zw&=~UFx_!X*JY*CoV*Xd6ZhYX&m=yMKf{)y)sFU5>Tq1#N8%5&5Ii7wy zc2){XqIO>Ha|oQ8vIw8tU>Oov;YH=%aHmWSvP_lwYEB=u{jq&mMDor{VSz8h^+9lq zti1tthU)QvB10E`Uhc-5Od02T;V!$NfBmUQEjr(;2=2w}7Q0MR_P|9A-jHz7i}2mv zixjiH>huZEC{+W3J0@r2`a_eNHSxG(GV}2QkUJ)aK%7oW`FJj*#om&|-8yvPua_IV z#MJMWsDAY<{dQBoC?Pn;MO?oQyMEnP{Uo(hKL?chIbgniDskPQ5|#M+dAywecP|vH zR0@A;Cxq&nFF9}RxViefdT3&ftD?y^H)d#hLtnBl8y zcJ^Y0n~fs9+&fs!lyXT^hgP^|m-5nkaox=8UCT3%SWBHOl3%miFlYJ0ysp`X#>Od< zMVD8bra}9om>k-CA%55FQ*t|Y0e@|^+ck&q{7A&z_J+IbrhBPL??xP5cQ`om!O>3m zUAI}Jwy9mfJ2|>;d&I5=Z9f`6#&TW6ZCM>&z+W#{Yn1xBW7AyF)x3~W*UcTGxvu9m z7I5jy5YbAaacr7wck=o-;g7J3`reAH<8rpvF zJyTvwM>odyd3Sx|TgE;Q_BbI(l&Jps{=TM8vD@yjCMDk$srCaBYW`70nLf|O4XM}z z&u<=>@&1r6l(9SRI3RfZY8RW_-bVwe3-DTp^LOc^=I`Sr?!svtLB1 zno%P!cNT7EY4d-ZK5HL*pp@LqFG^=mD^}S96KcV^neehxid7x1H+TdiY!8nFF0agDY0h8w`{D^ zl}Ox4Vro(5!d6ec`ejr#yTwa*%&1gjM==BtV`jn3PPe>E8)y*`Suz97xLswY2Vlv~18w%ir~0 zrM5NMatNE$2j5;EQ~(xb6Vwk?lDP|StT3s$!8ZTk^>uUKXqp>S9$;hf*H4~WtQt*s zph>5S22Vm?9dKNNbF}nT&~J4Jql>aW0-u!JOQ5qR0^;ts)L=F8{n~GJ3Nl6Q} z!ME^a{u&J_AXkDLoDHRX2kK;l`m;a&m6g7F%-m10ZE%h^By&Llc=6|<-;ILogcoPL zvcAvaiQw#^;QL%J8-4_$mc;M9((nxsO&~VE+#3{L2L)*-fusF>XQBnWKt!LmL6K2N z{{}O%vRM@LcK#7a^RB5C=W*jt#`BS%HM^jGKJv7^@$OQS61F*d?tavDIMiZ5&b;)i zG5rB97{3}bFsi^diC=7KgZZb{{Lj$_qfB}}`V%*d14_e8Fe$kc7dMQ6RNJ^=Y%t$2 z>sU358^#8uVH^w%B^D{U={(-j= z4aKX47M$ay4#mTjm*U6k&1M&?Bk|+)4tT0$9)7syK8g;kn3sE`qEvm2--5;DO9w7L zz1(H{1uFABx}XHE%olVP`JL$M5{PYZ0lNAZ3te#XQ6+kEb`*}^q)x;iyw6H4c*jfq z75|e7Tz}-{rz&(kdAS?#lvA(P8|=Sg6=}c$dU&x@>S019DvMCSc>Ljt zazQl~kyR&vx*fj-#h#a~U)5ex1eK+VcPtp?`R}0=iKPu&u)4Q}9*k^Im(q75)^bdW zNd^bw9|+V%CRZBp1#5Zz!plZruw{yBY$RTRi!@znh$Ip+=w)<*AHR+Dl- z?qT~66{IXb7Q_D?y`@}O0G8tmV*c?MZta4~ze;8GE8=Z1KEdU`j?%t2_2O)D!Mff+ zT`wDq>t%y+y=+jYWW8)Ku9pK!y=*XFFTQN5Y-H4Ex?US$ywR_dwZQnvbvva7Pb#=w zgM6sCFr|KST|k=3_#xv8QxK;+@f$~MFmJAvPc6=x8#sAduqk$Csnr6qN5xt_#-wz# z+6E)7j+UDoEp-@;zh3Ub!=vTqf@f9gxvff6@zyw`e~vfw_v8Dh1K8c3goEXSwP7b7 zyR2AMm0uqDZCWl!dR4cA_@J_nYPkl)u~!tUHvC!+NO?)VaQk%<`=-3A6+8Os&Ou0a zH#Ozp_E#-sh6eN6`2}czsyr*ZvC-LE(VEe*^fA5)4?T>_;7AE|*XTnce^xB09%kh1i zEGnx*#LQ{!8MW7u5Xjo8VE4lG>mYs1)1$b{%RPpS!xkiL{VJh9m=k{RLsE5t$bYNn zYs6L-l{|pyssx%!`Bsl$%vrwGV`KSm^$5zUTHoraLjn3*Jyow);Y1Z{|4!0N4j5jd zw#1Jrpc0!wRgzob&k^{w910iR@`vD5c-RoFTl$f{Af{@)t$j5Dua0S%nDCMZKzW++ zYdIZeS88w^F1*|(i!$m^{94}d{0A*z?TFZxH_^XOc%0MZC=jfen!?eLXYeAG*RTTH z-0RK!A-%B|{;?h_ z0+fN;ro(F~cM$x@QFtj@z3dGgvs!o#h#C+Bit*OmY5U^)1tdn(iGVlKw}OywyNU=n z&zZQL*Dv!d5=hXX`L?Trne#`2ajhWdkNl;0>%RmJKqz)#=JY`VVX1-3n#%_Ta|^Jw zZcK40p+jtD@B$08V&#D_GdH05I#KnONoc+&F#VQ5KXk<=snz_~uy&R}P_La2w~8UC z*UoGF-c4!N&bmR>n~>tBsW4y*ccQ zdjMLt8YPoEl|^zLX5p`wdkqR)25(=>0g3PfNTH7D4onOVA03fYt*q`N=!WC^6ss-} zL!R@>(*cO=3cOu^*G%8>C2*SZy4>rh(i?zk(lKG02B)3ZhxhyE+_IPaJZ`BEJ-F4N z;TG}1Lv!;@z|KI1^25tqAYN_|o~ZP{whYk@O!zyr|Fu@z5Uh9{ee*7M2(Uxbs++Rx zElosyvxY=r-~1mL(}v#qre#bUbmh}+8MQUu8`*Lj>iZ=6Aj)sKJrVYO4ApE0Q8B!z zN)ufXv2j%Aw-J*qD*w+mNY#xPJD20v@*qaQ{SPTo?;i}}tOUkRZemnjc6G5j>5u?J zgEdu}sTo}ztrTpDEhGt?2eu@WgTt%ONT`~3!FDnkhCC)!4N=F54qdlEDOiV+WLj6K?7ak@ zi8B?d0TEZI2}E3>mrX`ag;p5Qu29%K5RPfw+R_J^o(!T3#Dt|@CYTK3BXbLl#e`kp z;`t8WAuf9#DR%XSg%vNr7=jpdEk51(*;9Cb9|)|x{KVhj^7A83_1uj6J5OTP<$&Bj z`3g03K-oX>UxZB=X7Zq-qr`E+;|1XOt?AK9N!hyAc+ zpQRj-OOW7sG_aF$Lk|mY{{zVUXp;f^_JnEPs=>48y5Pu-in(%B$u|!6qiOsHm~Sn` zcGWTXwR{5NokM+fJ$@};fcTloe)Jxd*cN8Q~jj$TXK2jWM&tyxhcSoi0L_-6{ zoYRiL!^$6^Y1hCTkJm&eZX)p^M%A}qdfP!%oRtbQAFrJsDY)n!GNUr6>KhMYN@HQ7 zOlAJ@H@BM%*{j_D{Sz)Wn%41TNtTocoJl|G7d5fnRQdjH^k%LcNUv~g>)MxCFw z*tc3KV~f4a8lNnSUGhzVwMO|UQDymuVK@A|+@!^ssPRzQ`4C;%hmh7<5Zz>mu7(6A zRN==ET|J13b0NC#Ezwciha6NHjJHImF)g~UEYXp(A%~Rvms_GE)e?b?`b-GN?7|brJL)`Ueg7k7L(XJtf z$tLjFGBFwc_;A_I6f#_Pfrv+^?8nyVWXe&_=p>*$Iw|%59Y)|Uo`Jx(Q>*%-KH9FX z4I8*O2<=5#J?W|B^?xZ=Pvh6JZi$yXc@1CPfM3gR0x!Wd@s@7}Wq7$iUY}9R&l{jx zzDH+Id~Lh}i;(dn{rI_E^La?6HU;XfI;AP{z+&#ITnCrfGe^MT`X9nq17JZ#ox- z>}l})!z$sGxUR#selTW6BPPNmO*3^LC+N(8${&=zEOG75# z+!HKCtiLzbpBAsNqfh2?e12nE0xP0D z)%OKTE1@OAKohIp(D6t zW9x5~3QSPv&2N=Th(UfnRDyu|^Pz=cL?^gf$x7TzZAV`bJ35Nbj={1)nk}QT%SbP@ zgnzFkt!EKpNn1&XCG8|3mb45{)Ww#x7Q`=VNt;oC`Rsadqt!39C51dfn$k`t8skN_ zwCn{CzpyQ>K^gxgwlsYD7A&I4^H^_i_%MuV2Z)jX@CJtWfKbbgWjzR%wT6UP)+P|Y zoMlzvepu;tpp2Gr(BR!bbc4`q;59)=pc&*E*uTUYC}@fG%Jl34P_ImbYb}&H#Vb_F zRD-fYwLx}Sy+XCY33`Q!j=qC67;wVGng@4VN~Z?{fIdH|EP*DiWjyQy-}NgYwsRaI zB*X@Z+jJ5H{O2PE&2*0ugP@qM@B|1Z`=ag((U?&SA|5lEKu`esgZJ%1aLnj3#4k8z zl)aQ6Giq?HE26*CDg?)jRzv(hF=kLF_5g>+s33*DT&SjtuGJmHQ`I z%oFUfHr1eBn}&3`bdY%;$KC#eK9}J2Lhexk)U~So2w!~yPfN=HEZ7oztOIC^osDX2 z2G!^^p10k#cpjm6s2{Z-Lp+;9Jk*mW5~3&VAYwh~GI!g0Vq>wW95BC(??PsxC!bnQ z#MnFK2a!Fbh~tHafNWcCi~00UrAfMB5~bTAdj0hK%}dGkE%UNLEdNw?M1f z7F0DJqR8TI9qz-F-plpF)|B=DY~zI^IXQz(Z`l@uW{;Wc85mye^Avd>01rk;;9%au zr1n7x4f3Fb&w~sS;-vP$1`YCHgU`be65^!xVF?ZLu!Qz3sFzW36s$c9)g)v-Tt`CY z!>u6V`EVDAUvxg4eI+Uye1ut|a2Z22rT$UTpLuos!2!FbQ(@K(XiVs5)%bYLz; zFBl;u>YC&xV@HY)5w$=&5)W(u>--9K0bk%w;3#Y0=A_cg9drh4(g2vDZVq0fVUw0) zxXE&3;ek|naA$8W{_8Bqy<JI-q zaQ6UyEpH_BYOLmM)cegunf7eelaSR|v$+qOE_u(E4aS}=8;m_$HfVdcT2V&48hhN7 zL7S$HDi6vGG&^pNYy@N*Y1wdlewaxa%ZA(Y4rn&4wP$O&DNGvEP@5OI^%fry**E0a?^7O+W6O=W1d;x1@|Q5QsP&@tUpo=MI%LCZUd z(y#;Tfo2x@W@7E|v!&=`Ama5vH;8yWko~(Mv=7M;dOa}KfsuuID->h-{mrqD`MM1%Ap3CNnnJ|r8AeMozn+Z`X04cb1W z159FBo%!@3*3>ImSBZ%mTCD7eLcClHSkZd~)06(>CHeI%`(4W($v*xg zH@e{PWKbI1#eQW1Qx1Q;7>CZn8?oU~NA~wf_Sc)L%_L+~wS%%K+*IWVRJf_Cv47j9 zYB!4gZ`)Me16n}H)t`Zo z&Dkap@#btN2-%!1`#irnTZ`*oVsn-Tpm1|mWB<0z*=E%I|CP7f%;wEngWYu!ePi^vcGlgvOX1{=+7O#xbU(~Jx5g$R4 zdU7QA$um(ZD@n)U!pofpmh_>hLz4c?LY58%OWnP()YU6X7~8g8qsM^Ie+iys<(c{; zlKv5eCDfyY?|LiYgI-I}YnEm(-coP86CEUE&C(4b_D%?&ws*qDdaON|a7Nxck^K^S z{9ob4%C}i$=Ff&i^-}w&q(84vqDMobB{%gl#D3koMCs+I1*vIFZ1Z(!fX@1#PkmiYICRam3R&Mnm{(EL}2jgLgs*y+eYAAj!>lAxcm*e6B64O8o zINDbsel2r~^N+u%*(xpn2&hE_=i+1^ocs=VpK2O z1MS)RHTu=?qA>jO0qkplsCdTfTRP@1(64V2Dl-la#9*bhImmpNJ}+AMUQpCE%6Fvy`-{<*=({W?*U=b>)!wYB?FE{*VU;emTr?yg^Bwx?fLDvd zn^;>F1E|rtqcJ}0SBwGVw?!&(%wqT)XUy@{ch6wNUWyUrZV*`{)S(~#db#g$2j76# za(YqF@5;PA*Iwu|VED38YP?!ir(gY+j7o9vI;SYO00vcp9<0x`(~s8aXCnPhOn*U9 zaHW;rM{LW5NUsv7W27mVOiIL z)_3du4=u@%HSjRhf4vZVG&v-A^~JoPHt%cDk1X!c;UN6=ay3Y&r+uCue#1(nkS^heeKTnBY7i9%C;O?sLqOG;sC*VD z>MV{z7U$w!kS$ey7(9oW3DXV7PE*4sDb>L&#wACDPd$vCL=fc-$sy?j@5O|$D5=Wc z8WB#%buF$pZS^wYpbi`WA#s-%rsv;>L)ava2-Bm_#Itg|zG{{5#r<(=yEvIYLRbT$ z@CYHFAul|fO|0;6w#Et$XLD{CAI{F)k#7aX*8^;N-O!-;>^w*;(MP`z3|9zMhaB&# zNAL}dmOIh!64mQkt#c*fz1%{GOmD=F_I-9238Qe)GR7b8bRP}=|J^5&k<)!BxE|d{ zgN5BkgFn@M{M)SqlH6i!8S5AMd^d^&f_f6bccaup<21p;maRhYkY%S3`f#NmCHv=x zDrxU}9I7N}@8u;ff?|!33Xvx~ods3W!(K;N5Ht3+jC!mI{qpHBEBD-?@7WVE>+($_ zABEx7&tv(CYPNKTHQ}$YwO0qCVnR`v-V8)D2%aOEXg!rKPpDkUfxrYVs`-kH()$E~ zuyCngk&$^AWk_Hp@q~)c2fQWlzzvEV`Ja8T7=^~8%<8DDm-{{BvJAhLPs8x;NAPkr z%4KEPH@xbol7pUQR-87Pph4@*Ks}0(8F{Oe%>_`W5S)>#zEQ258F?je+6~`+?u2Z{X9i4} zdXGImGaw+v5byZgpnYaQa0*M8Wj}X9utyFA^L8d2b}^nNLhZGHDeXGLik5b>5R`U@ zAslHlyFzK}1}uEahhTg{1J^oe(2{mHiV$gM)25{T^JlK#&7Nh695Hg8#B*as~*z zH@L?DF*PdsXILs8l=*p<${ZbZEtLlIuL8j<0Osuzs^RcvwjAes$+!2#d+$hG=6i|h z*n5m$8MYeA^>X_h7`-yAV7gh3%qf6AS__a&}TW_qFR;Bm?TFWH? z=Bo!iTB1^?cHwP`__e*|4R8Me;zzg>|GeCZf5@oqjtf=WM(H*2ny2b(5~^)tQTl;% z68Qc=LRDVeKfD9i&A8T&Qa&;l?r0M7z)v>_nXTV%vd$uVnXTKH%+?*u%+>|t4o*B< zSLxUAI<)MysL18(mX=|Vti|-EET+p(O&Yo3uBg9v_=e;5+XddbDE80!sGB~PLL zl_n)EL**3}=~sa@G252%@C~wr>p}ffmEp4>x@@MD!?qDQvg{YTZwti6;}9naR}y(pRs6i4d-5yjj|J zb6j`h+TTAwStakYolTZnPK(Pke6h-fR<$Z`NC$ksijDD1fyxwN>Ac9k`|`2DHxQ~F{esT&G=6QTqY_a#1=B(=_X0q51tP9aZ-Z9KUXNb1 zup*p<>snk_u9K(?kNdVrHIZ07kxAcwBi`x(VyC~QGbjHc>X6Kkv#{D7v%SAhyyV_n z^OI24ptd%hX}0dBBGgXn7hJtCpChs8WviK+Q3DA+E_Ql4?cecL0alEczb-BSx2P)5 zJlC4flQ(a%c11A6Du>wQ@9^R$9fE$ACxu<7a=pZ0|FHZ>1D7|z^%E5((+a=@dUtp% zz%B}FgT(Msx{1mb;gB<9)q^kw% z;Pk45RSEJtasC~ar-ltuxnZI@I2N`=0zqwC!adN!O{~p^iShpO=OuwLN!ujW%v}1E z3-bK=IfWSCxpUd01qpfn{1i(#&3wVSG95yf(g^E?mc>L)i`a(LvbzzvRpDUrMvxqCho;EXqq7C*~zg@Wv6? zQ~MawszJ>wcYw66Lt{08V8h*NH5}!y9~`*eYB&wD;m*rvt5sbZE?fsf?TGT;ARG-s z-Do7NI-uDkVhNKl67Jx&kuVQc#S+fm^j{-k2*iKliu}BjtH;Vs5<`P8t-eQa&?_Ya zRX7EmuNJkh+%!=XPN#JQL31A7M(YS-r)h~{nU$C4JDxUhduD^1uW~W{N^WEf*Iftt z@zC2sxaJ@8RNKAY&@W2y)+hYhI`U^v)X9UZM&g+`!R=vi2y&(ueaYC|AC75_6M**7*zibCIzs z9R;uk_q8ovE&T;bZ_?LW>e4%KjYOp^U7<-)x-O?Cx(@zN%c-Y|ES`#@tmsaK>f4qwhWzyl?c57x_dA^Cc6m7e`+CSK8Vq%ra#K_Ff zd*-_g!KquVld%<&*bWUL~o$d=C?1 z6ShF1SY#mC`l}%7-I5i5%FBrD+xA|cbaErSQWWjf_I{;qyINdJ+co1_+O9LY{*ksT z)jIM=eXA;68@f>qqV4?w_%M^4&oeZWEpy#;Lu z?SdI)3S~v~gqsd80XZ*;T`)EnyI|Hew{x8qJ5X%UOt|%nRyHFwVgS<0(6e z2zG;w+R-Yra=!$cE5T>zvWVB=0{r!I&xrz$@&bN*Mglf@RNFYL_O{$653UCA`r-tH zpkGxvLK2V0g_oPqioG}d+VCpb#7P73rMBPU58tcbHp86l?Ooy--i-P5GCx#MlgW_r4k-(jZ4I|5~g=WzBRYwfEzr-<;b=P z*Odoj%=yyFRvgd6t!&w%%(ltOmRO|QxCpn0dUqf@R5=@dejkPbtZK(!STxX)VhxhE z;WOp$g%BINMsnR4x+Li5-I9s>tc;w zs(w!IRS$P(#hLSI_#AU^f8H3Kj!O1mU~MvRnn$bWe!}c3AYSexR9O$dw|Ra)R9V6a zxM;iG3o{G$&$l1J%D;u_oBxgr_z;>83jOonmRpn>i_6s?!FxMjdJ7I)BpA1oH@cJ` zm#!m$k4pO&@m3RPf5z?X4GP|vpD%+T^1x~}D1TQ{Vpc|Y89oj1UBL=v^~b#tnJ27C zEt`rH-TMnMu262XCb~KyC%TKRX_5xz3EA|1=!MOi(ZPNRKBFUnsq`^~53QOLTz_qk zlLD)gt_}jc;^LXs%bkMkwc)5rsATJ^zIq5hj-pva>(GMiag-J5ibf&|8!``|8Xb^r z+fIoh{Yec;%9(cMX^FmJJ*3}_6d=ZiZz6g2E=<(kE2;>e15pbCF_Xis&V?h4#Px}R z;Y1MaAhf4%cq1mmBl&@4>Y8e9d_R6-z;9%6fxH5sD{z{eqfVJ+YwXM80F)TRMTK5x-*8MwR;Z_5A zAj!tz6cF_w^qGggSjDxHkX2kK3A2h*_vBY`)wqsVadjZXi)!kn{%@_5ud^h^K2v#D zqR1azFV#}`Y@V3~EI2Wmi!e&SU<}T4NZ?iMb`!9i;77(2YJ>SPyzg&mJ0KJ2=(d(U zI1kCaT>q;xYJ=6#5gHQV$Lt75*fzVjj(`{21!o~E37VaGiB-b|1pkEm=Oxw;lNA_k zK=@B5E5cu6bGV){P4J=I2Jb*Ch<*!;SJh`;Izhx|UKHA0&b(CPIzIDKM?%`anS`w3 zc`d7WT*vL7UD~t#c|<|H=)wRo@uEA}&pz|QA)@fi3o+}=3qHV-H|i7_*r)MAL$sS& z)o8S=m)jT(ar~WW)wU!NmP3fO;G(S^tNAS6Y1|B=@-VMY_~A3~cz|d*A}9*i$6($K zqT>6aqV#GYvhXW$%V{|J?_W*sTz7CYd@FSHBH z!xxre&jdZbZE&(8y#a_i5KHX>aWP zmf@ia&>QQ|#a$9i%Avtj@FhWmbn(KMgD%yfOV}(t8rR*p)}3+`q?7%#)hTO9m`>Tm zYtt#)aUFNcE)f4EMmh72<-BB9SaS7{k~1vdB{BLgGfx!^VoRD}^p8Kt#rAwSkqM4{G!Ifs_B=enkudYp75P@+C<a2z(rd@sbub&#J+IU0b zm#a;BRhvyTj=5>p+e)GtS@1ZXe0djLs1uH)ww;n;dY#Kq)!k@v=$7kCw_H02 zRAMBmmc>tpsAHleE4oaF0A!rJzLstua#tMl+{ z+sjfluIg|!{YmJ=IgjSsf~SkxW}q$hwmfFk>LqKrdP0mIGh0uH84oT8RUOz@yj&B@ zIn>IMj_|gFUFSn~e9Wz_I_b0C5_FZy7dFC^o6v_P3g60y4&vWlzBpe2nI)M(1xk z0G8lY8C)B@p}<>P)6gox_{a&AZvdCMUDu zwWv+?Urje3f^J?90x{!tH*W_a-MkyuKi$o%VQ!h?C%SnZlEmG-ndW(Nl6_Yt?%2qh zL`DALFR3eZRBx74iQ|W*)Ci_zh~l@s*2K?3yz{)p7D(gec03?Dh2EA#ZmiTwRj zb^Jn!e;AFFz@sE8vDb!WDzV#XeN|%Cm&N(?k@2a-K0WKRxEb*eu3eIkUrp!t#{N-x zi+7@~tHg`fgeq~<`FNB4C;0Ql$;E2f5PY`gwE2O$1HWY_fyiDEsD1HUwlj!had8NV zjlBGBQ;E*|&rjp)H8p4g351so^~&@6M-z3zcahM48Gj^jF0^bS-gWmY>uwEB!wc-5 zvL5DOmN@DUw@Gl&2uQ;O+7o23X1=6JK)f6aaWbWjE-TEGtLZ4y*rZL@w?E0-$(97o z(aES&uWb5@p3NuKB_XL#ZY5|C8_^E;TrT$DUW0`d{b$_cEdOJz__%79rs;lEuD%0Q%&zwFZuL9KP%rT?6;pzK>H?v7QJ$|6pO zqwv?u4Vhf39vu!&uJuClS%(~#UFVf+ew#@Mza1om-)6R+V3K?UoCE5){Z7S2<_KIVm^pX(SGgB_&BuR!NOd!}x`T?^ZQn3C-~zCvaHh!=33@>f5a|(id!9tGw`H*-0ED#d%5W^!uF@EPX;uhh9Zg1S|<)*$2TIO|TCiAoVC+byo({*O#+C1S^ z-E+MexwcE7EAn$=F%!`+vHB}ug5qvMS<80Ehn*<)b`m1?F4m$z?7#ddQFgM3J(yW& zWp;-ts@fc^=}{s_*7(xtEZEl}8YS+8D(g{V??gy8YmnozeG=uG-FgzjZYv34x03}I zu=~po5()?S%%IpSyD%4gp<~>7(ID~et7tvyVKr`Fh8|cx>@Q^u#47nURf3m5f6ezJw!Alf&rY5nV^S=*))rZ-z*B%2*GI`yj<0$rK$-N z(q%Zfq}QZzJo&^Bf_Ux{F2kOlUTS6K{u&*BKjL+%_a%b))}e(p5o-=DoCz;NoGVq% z%VnpO>Id_e!8#-!nQXPT=?;h__s@}wJ<@TQc^_56u z0-0L5gI5x4#Aiw@aPsy=U??jP9VU3}5jm`l%vbK}`TkYz4J&u^DuOKwbD2elZ=dGv zBk^vFTfE%X$l+w>vWFME18?_Y6U%kM%Kg1<^x1?54G3Nd!Z2QpqsI59BI3<4IBL8! zl|P(QBLolU)Ehz{&grv5R5lkaayVzW!6@ALaE=YehjSdzI-JvrBIIyRrP-_f2{9|r^3s{1 zuP4=)1{@7=MP)j(`~51$sGKWi4hgF7buqosn`wO#`tqx&`S`HKiUY<)AK9}o`N-aC z)dq|@%=N6*@4es))XI)oc|M*8U9HBXosUet-0e(zk>@8-*_}+xY{aZ=1qY9=mr_R? zkj{`5>!dSeRWJ;E>dp1~Yfc5D8VIL?*__%~p3_ECip{Bw8BR0ZPkZVblh$YH8w~Jo zgrsaNen+1J>en8YT-@xb8_fNjp}x6cSn@tNy2oG~p5EMuYPMRJff_(~xd$kxYdpUc za(c(a9Eg~eZIBaX;{Q5oE6$NuWCv=Q2!@4fEEBgGwL>9qMcJSRZ_g};hwC`}xfL-5b@{=##lB=W#Uo(< zz#qO)_;*k}~Ug z$t%2+8ks<}^1Rec+@tU7_EHD*PpNnDoBg?$`Uq!w=fI&k`#~>tjpX;Dm%409O3fwy zsF!>VpU6JqNnFD(m)feRSUrK?>`pIr+aASg(;2va4Hck_5=9#&RO)S%wQC=wpF&O& zub=3v#KU)nD!IoONp&fHbE{FkuW+%>mmoF+vE4UGbtZmu;kQUW^leg=dlIR`)1ptx>7-PY<=$O-S` zc?VO{kMXDD2~W*^8{_7nzhi|D^DuWgjsW%nQA6S|oH9!x*#YKmo&=t|K3sY)zMTiT zH8FdHSCLs8=h2QbDcNaf?>9PgW~YnsINH2IjK|S#URIEh$I(7QcbRQ+-qjz>*Oe%ua$=XM5@ilXexPB?l^a23rB|7?ho!%&Kr5uwGBr zU+}X2Xb|U^B(&CZ_croyK#_-ljyx_kx7+ftF_DLZi98%o-QjS&X~?i1Oabw&$xkO)?p0%DQ)BKr3pZmI4D#{Yp&xq~ zcmy+B=JoThE(A9>l5{Kg#mey|HYAqAbl&mT?DI$^yQkeo{@=9|P;`C-<2Auv?MuCk`mA3+S-^STC&G zn6U0(!ny+r>zzN!`b#Fp=_fWQth1j?vsu^uQcu_FXx{jcFL)>ftq)ZCAZl^I})aIB02iZldty4q-SyRB+ACem;)k%j|` zG*&Y?_LRnYy-C9crK{1(JZlo`@g}x1W!TK0+ik4O?k0(2WgJjg7tmq-5OcfDx{V3z z4koNSps;?p$+0Kv$C?<&%GjW=PAl_`Nt_>zX=Q2*>)OiHlla(JnN|{FWo|S#J61+O z$I9GoQri66nDFml!oLFw|4U7dJ^6pc#5f(n1}!VIwmGQgTAA$(Dzh_fW%e;3`*PmO zylV>M!ixPQ;5dDtohwWURtVguOr4K8dN=3k*LbO~F~iOc$Mtz$YX2=$YTlM*YHq8S zI&eiw?x()#oBm1Wn#x6MZ*=v zL-jn!2Iq?LazN2p0Y~8WcpkLE@XzVb}IczJ4Ik`b0 zr>8)Mq_a{3fmtI6as%YjDZcV6m@*jnbU1Z!j9J zIrR~zHWqX0fWoN_#++_yvZTTbr#2>>I+$?kfWoN*+MMnPPIt1oIfbwKbMu-Dljc?HWl)3tkMYD00R4k(%0pve@otpj1p>e2HW zZYoauM}v6Pl)+A}-$*hAHq8O`8%eggTdA*2QqFbt%SVEfXM1YITObkW(P!uOCmrmm zVJkGI=s<0_vbdkW2?i@0)MvF9KAZ=WNEw~g4rU|Q`%DJ3kJ_O9X-B0xSn*qni^3%! z%GU9sosW8W9qWWh?2nye5PXoQR~IV$?!Y_{ueLTieYj&ehuFiM{DMFQOy7^{pFgu#U$n3@tWBIMdJm` zB4w=c?dEoSN@HW9@eU>$?|`E5x0)O&5ZB>!pNU~p#P;3>jm8I@&29o$EJHk-^~=HS zpG_8==`@7?D%z7~gR?#3Nqf|)h8Qgy6UH1&7;`{j%mJke6w37K|&ZYro7PTEMoEclDt$bTCYg55?oCagG^u;PHiN*|MB&o-(wF-{xV zVAMu>ar?rDQN7%0=f?(>X(!%og2`mrdRh+EK38h1m_qvEey-R`xMH)xXyry{Vh!&T zXX4}UM+MU2$Ie6t6gdi*Mao!?ubSI!Iog=W(ZNKH4k&Vb!{pdgjvttqKCFOPcN-L4 z=klfWBcwveFJI_PtT(K~s&eYp3bJ8)e-%CT>SUZuz0~^osaGwoX}9&%tCa*qqNiTn zASenw_-t#nKwLc=l)*<&y$&|1_vnnu7ZQpQcw zZf>`m#>S*+988+V0i|hfH97Wdn)^%)Y-_%0Y|w6+dfN=ee%?A^oi5B3CcpKOU&9c8 zkT%N#I%e4cMIHh=^7yP5dDxi9!@)!z4k+^Y>PO{~dIuFpaJsw=iZ19@Zzk)*!6jRL z6?5zAxIJ!l2NW&^%pzsn>f_DrcB|W%aOq&er2`6=YnmK;w)#X9<8(+Hv|Ihprqx-o z$h-d#wmUiu>)M~tO=6@!NP8`_8=|9$VL#fG>mZy06{rR44U_%BeigdHUriyaGRb_ef97q> zK5cOJ$C=DXXrhBn3H56pnvhfcnum50c+Ep_7P9TMxZ-Obkh?z~__xMx@;U#x7h3FyMf~z%olD?lk>b6T@X#tcEryO`y4b)1+o~8`kxQXl`vV=GFm) zTN{kWg-?6o*2aWe2NP}`P`LfPH*Qhma0i&MPISVCwP4DRho?bJLifDc3rp?+QT;B` zAW-ac&K{%P4m%r+>(M!0 zrkLeM6Durd5IRZ7azjl9A*0e6rVM9P5-@9Oqt75*Vp0YKO?S63k-me8^c_&7{|A#} z&+dM`iE+BS4Mv>nQE75FDum#UO1l`;U2as9b?mw8<;G%DNMGC>FE?y3zuc(feX`ux z!wh)N?8X5_iv`T0gjkDbncHnS+L*}E!9Zk8JzARAUkr=X{|n{l$-$Znh;+3Imkh1biC4iXTFUT&1({c^E_KW|#VF)21E z3a&@CFHLIQ>*(nn&!M&!88*Pdgz7ZmGOkWL2pMR*7$Mau+tjK~4G2~T4P-h|J&=YC zO(*JLTIob(I1Uweq8bv?i8gsp->;lbBw!YCapV8mq_i8~#-#BbOd8(-rSW$*IreP) zy-bYLiEPm7L=C-mqH}xgMD>vzqE1w23UNA-4dy#hEANv|^oQO$kpoI663~(3O}%s? z8xuJ?n8?uqMUJ=pXeYY2w@ze(b|>2Q<46_UPSj~whmLW6qH3UHW3gtZ7q%KiJR|Aq zg)bWuz8p;WazNp0MQ?mX<3$~-v9(e4b`Y_utIaG`uO=a?ewk@+N7V&%n&<|T(pGgF z6IL8dSaCpMrQPJ%Q`PS=F^;O+prz_ddR6s@dsX$iNDh&zFExcYs&0dMRd42fqUuA9 z=gS!{98gqUKu3-f%Wg|+^$x>2W=Gth zSZ0JqeQDSco>|U%Z7`k}IiN^HKt4ba8`0-Xp7yNQ#zZ0xCK7Q#k;rnBV^4{!Ffk!3 zAagJqG!lsplyrmnhH2oEF8FUP)?*jE0}7V{I_;i*A4MYA?QUbjrGp8V4k%ofn;d&` zIn=~B{l^BS-RXkg$0&(5aXe7sPseO|Lz9JG-sB(xZt~jT+;hwcR{^tNE^gCpdg0c_ zgj)v_ZXHm#-Qh>M&6yZ>f&p2)2JZlPz74_=96SKUKa0G}}+Edxi>D{TN2ILb64gH}?9QJK6 z9{wLPDe1hCHI|Kuf;gBchy#j(IAH9M!25q@;Yo%v{MiM+hAnaae<3cCx8u(@cx<4d zq{vI|{&Y$$!LMOq%1geFZ^M6i2#9?^1X~rWD~gL%!)qzL6Xvc)Jo$iM!yUz5Vy_dC z%|ZC1v#BZelAqwwgKatyy+4TH8I$KM5Vt&s1N_e;X4hh5v(qUlbq0P74{ z0!%N*7B1SFL4yNRMPXmOsH=V@`g#_`u6TuED~LgJO2V)eZ^i2bq2E?`1PJvR2)r2W zGwfqm^BONkJ008Cb-0et=QM-hi_v&KXLC~+&8wWxv9bL5oM|Q{RYlI{*qEHp+1;e0 z&r@D0Cs+xwI;tf?W+V!2HmUmp;Cl^^ItOo#w6OTShT$rZLI-NzFdkBv2`O}wCraT4 zFrNL~NTCr#EeS{=aaKY#@fuQSffU+tt)(y@L>CB3VQom^&!$9M3O1IP!t*AjEd?7B zDZFgb*-{Y9l|nTN9f(fLAW}F1Qn0bS6sQYjUqA{Ij4srGh;^YJM63&~B#bU}^4jQv z`qI*cY7n9eHKrD}6l^Rng`G@FTM9NNQrOL;v!x)ID+TJpc?D9SF4$OJ3S%IJI@G*j z9Z2B_=t47jqAuKt=I;QZrEofkZW53}DRd$GRV0Nw(EPQy*1E75L=y-~VN>YBZKf9N ze$pdsEH8yeOiB(1(j#n4r0{4jQV`6Q!X}WyrzSPW6ZVL+Aq5+Yr4Sr39=p^hMw&wj zH*AzD^5+2@XTZ$}P6pV2P^dOF;OYSVr~Toz4RO0-Ht!SKpSo?0<;INk~8t=VnP=ty=3P5BK6>5ATCIF$(cVCsY~%| zSPe1zsbY0KehtrnNZ~C`Q}Jtf62v9Ac!R`kAbvbI=ble6lFXWgtlLq}c)wU3h+o5B zKpcq+o)T?%7KEKlB{oOplGE_#di)v=PJjas)k~J+j~;qjJwSY6QR)jk?sh3htBcT# ziOhf$p6|n-d9Na7 zI}-TKdm3dWC*a*(v+$euh36%<9EhPOa1mbN;yAFs^%_(&te)Gye+=+`6zMC^|Fo=C{v53SN-ec$XKOj|82=Op> zG9vac{uKlk0@~qO3xca0eZHb>k4PFEg5s5j4a#a#J3J?t)U+FVD=!>`$~7ayc^i5C zqob`P%0cjGYuSS+SB|z$H#gJ5$R>WEbwHV& zI-oQWDy)yT9&8mSM_YemFdD%*v!bJ|%?4v@%F$LEi#c^baH@A+1Z0kJJ6&$F)XFHU zejAM2i6>JR+7&e?Q}N9TWQZ34;5X;UVfrj|E!qbsQuSHrCbpF*OgjlwNc#i3K*S<{ z$F7Lkbg?lJxr0IE0U!KyK!}|6(Q3Hd&Q;j6!I-@nVDBT7nj_Vmx&8GK(Z_5oI(KSA zvB(`zL~euR6#42*&+eJ24aJ!{pk!);CR5}ajz*6udkCFmqBk_8L#l?v5cC*2qUu4! ztp}+zK1ah#He?Us;yfn6!d}iQ+q;DE>r~BiEkpHtP@*Lutn*!Um;n@U$R! zQ#i{yZxVJ|u7wS&C9#^9^?B-j3zN}l$Y|bc-TVU$j4aS@vYqGRCwK3t;!Gu!>6i(+^%s8CV)->5%8C!Fz!8n-~Thjzp5L?rZ>sZUX zNQjn~;gjz%CpY)PiH!*-4kny9pl~7}bvfolTcCwjm18Zp!C1?c|3_%{%O?HB$Z6jD zP-belfWIa9jMralxDCb{E+9LwXt<5V?e2im?lu@pOI}Q7x4Vsrv>Z&N<$xlsw+)Yu zv`}HK;qO_IqTwGJjN`EkhF=*>_hqBuHWqX0fWoN_#+)YhjI5u{sf`Jz4knyBpm17j za_qq=HN3<`Mk8nRoJXm_Yz?o0?uv%j<2u&xRuZD&owkN=(hDaxCY(5!aN>Z%iGU6# zTEo{gW$Af^jIlPD*Kp5`DllERXu`%Jq!GseB6ix(mIMK>{r76qljy9NAX4N-&lBYUQQ$3fu zXPi>|)kPBG6nfs8_}5A*Rpp!b+JjgChz`TaizcV zWfgUr6)|+3cMl z;$~M**gZlB-6Mq1Jpx4B?01^_I?etk13JxagI2Snq9!EDi{St~7Vf%R@N2xt_mX`o zQff>58ZQHpti+q7@M~-ZaRn}(Cvl$d_31MEZZBhD;N{jnGJ3GC@g6@o3X{*&r%?f1 zH8gf$|BjQ-jSbjN@Bx369_?%}9_<9=TfSxTX=Cvi;D9m)*kEiqw=snW$Wj)hHYS$S z!NhVppjgfwOpa^@XAIy&#yKleM!OjXvnQVi8f+vvHIq*pi#c^b;nW6WPLD8I+ML>$ zaOz;fsRIh9M_bG|oN}}~(?r^n&vOlCMmv4l_m2k4l2h}Lv5m!?I-qbWAomkuPXA=G zv^ljg;ncx|QwJ1IJ4}vFo9fZXfQTzp z4?-%`!3c4(m2GKNs18J2p>s_URONW0YlBXOuIo`Dp1p2GhK9g0TC!#TbfZ;28 zZ=BjXVjW7a&-a6D+}h|^6XQh3I!TC*sck@rj`jHrIU+bZCZHpm3X{^7jg5(H986^6 zfFhe!OpZNeGs?s`I%b2Gj!j8LqH%R>cY{`dH!>SNPFzja<$V8GQ;4HuHkjA3I^HKb zc581s=76GO0y=VB+KZ0an8?w=M2-$9a{Tj;>e%DG>6i`LIySMmHyvv>tmB~Js!e$7 zfDu|h$hGkiA3Nii0Dbx$RVdobXuL2O6mGLls5)?C<5T`H{qBKo5)1rNeem%(lgFyK zB|iA*fFeKv9RZ$fZnqWD#zcS)CIWOo5#Z@2$DWFKzKP*B+57o*kpf-qTM14-x0YzK_ zI^r5*^0dWeVrUE@3cfM6|j=MxM_ zZX4h8R}IcV$~HUYN`HVJT(WQsG=AZ)swXhDAmYKLiNta*dVy^_2^n0TFd1>J8BbsY z%mR!jFt3@Ew%BY;#O7ckHU|{3y=ijnDYg$y3|6!GK5c`M*z^RZF6?b^InJP*pXDY)LY8FtNFLP+Z#wb=Ens6|Rm4_xAkYeSb2?vaKE=p zAIXPiu<I@uD3_yTN9*l{pn#{q?%(@c&%yViLo#u+Yc zP#Q`%$)#56#`(rp+h8;@PQxJhlF{x;BbeynktHSrtol^rD=^>`mkq|^azGK6fCFuD z-D&cq_K3J_OvL42A}$9MaouBb>?y7XO$;Xtv0mF?EG{a?vnKUGa*Mfv=GF#dZXHm# zwZT|9UNw2z+}fCM>tMpI0}8jVn;ac(QDgncbRCu54~FVTrkg>;dsby%A`OD>v}Vt0 z9fPsa<&kL{i}`gx@T;d-0&+4HTau|JOIpuZ;x;G}H%qDxR(MCVq$>LrDlAK?IubJK zHItB0?_g7gv!oKxnJgS-Qre@QjfwOfOr-CCBK_GWM@RbFt8$`=aV85k7;&ygz26n} zHtH=jXa!`KUs82Ma)_4gr2*n!{dL4TbWA^?46-qaPNAPs zW}G}S-3~&0Rcc2>h_9-a1Vo~T%2p7ug5PKBo+I+$?lfWqw&CdZ!K&NVSk_p?Fa zRxc6HxAGyk`V~xF=r4`qK=8%!Wwq!@V!7K*@)6)JUattaip}!fCZ)}?jS0&RCM-Lk zu)Nf&YP{{BE%zgKS>g}3!H8vTxnDKbiIpV>(FZraFz6tn+8IW>Qv=o;*MJ=KOL-{= zu{*6G#O`!6LhMe>PL|zi1`*qx53TCQcE<*#U9{aP`WiJsi0zJEVs;|K#zAJV&2l$f z2HScP%e`oc*-Ap1Y$KDCGuR49Da00NbCc3;G8>a7b1-Q#2b3n;%H-HnOLsCcPM@?v ztI7V_>tOq8uY+x8B!_6Q-Nh8*47N6yA8ge$h)f3C@m_u<6c4rzD7{@kM~>^6+if}8 zn8?w=M2-$9a>RGOwKnvW<5Uyl^mZFGTBQfuuX-J9s}1WIY`I9S1KHRI8$;{?%_L-z z+QEd<1G+&-52)D%5z+&iNkBe&&*w1NXlD>z_&kvg7I%kBz6nb`_2MP^MPVwtsr5Seu`LS$C9 znyX;6e&a_yq|*2Ud?$SLx0ND-Q&_)N>A+sPn~e!04knB^ zpfGZ1Z{020LF!~Ra$>s zvW>~HXPZnjF^&bcLCXUF(5nR=WXy@X-06(u5Lw{eOd*a1wn57R?+%fP1zu=cz|n07 z6x|lkk>gFhsDzD)934#L=zt=}TY6IoJ^8rT#5lTbgSG{pZaio1E@ic09Tu41JF5fP zIN40Uni(gWG}DOF(If#K2^?lp+L~lzA^`^z2{@ogpx)%zQjyHwhV@YVf>FJUl&XF&IzKY*37po}m51q>hItU7;pq*m#Z{^8gW7s0)Nts2WGi z;|lS4gt$VTAmR$G@oi)`DDk*LHt1Anib)+;XfP$Tzd^GUoANo4wINndAIGslR8uc# zZH(2`J_iSc9JMFO2IHYi>v9>6KsQc>z0}|C0}<=;m8NFSQbIsSmlvCqwl3S4=(2-} zE<2#;@)DC{PhGy-E=!gYHfZVc`sT=itINMOXspZHZ~bSJul5)m5De1-w!v7y4k%Vm zK*wY7sL7KpE{<3m6S+8;$i)FgE>HZZT$Y;{$75iFqKn#N@OP7XD7Eeoa7&MY4aOb= z2NZ4vbhO|Tlc%i(HYVIUm~iWW!tLiK$DUf?neBSVqS;`~EnnPIX;P0Sw}*pUzPQH* z;}`b`=rEQwx7&=_m@wvG!k7aJW1~!tJsDfe#Be;0O^OW~#`LUnnn|o@okxN%&N>Ag zg&g9wkpoIA3g|GqS1-)km@w;L!mI-dv-|!ivxk`&XJocPX+=HjJjKeVk=)YJ*J41u z+&B&(_fKpv?zRpnA`q}Y#f>Swp06(a|44fe=s1exf4paR<(*mWuH~F>APgcNa2$vu#}i5(*Dvvn~QfrqIGJWxe&gTuP-8M#xQc=hdqDgtY^ zPfKVvU3I6Rv@}~6Ow85;wX_OyJeZXBMM=}uZWq(idYG2h1GTiT{BCLAlP8|px}cVJ zFgG`h`xSiRk7KbqW512zLUw;jU!Ib*xdh~LIQmeU{B8nSlV1c$(d1n)F?j_&E0`tG zU7@&`3dO@zC?2RnnJp=b<#$8ffnj1nw}v3|H2qOT($7l%2< z4d)^HAp&xogpt(xAy1~cQ$U+HHqD0HA^Lv=WW&NW#PA@5TqWzmbh>aAJ^qp~M`d4S z;~k+V%SOQQ2$58;2Ws^y$ZkC`@Ff!6)nymc>h&4Dc}*#9DB8Ex<7{)wL=LpLKW#z|#e^JJR4r3Fo2~s${be zTPVH=5lThVg<`H8)Px3E{wWk`lE z7ux+mmth)Nk&9WT($rlO4$H3u*v#P9g_YrR_(D#p7>A&2>uv}~gtuIVk_u=ioHvBM z!hz4?3_nTBTGOpzh5cH>o&vI$ue&|$Wxtj%TR__v$;KiVqXuwek%v(OxUt9ssR7(r zn8=B!P%Jr`5k^DwnN4^-RpK$SdFhrfm|GPOZ`b<4uF>=81i1i|768GBwy zH3+=06rYsA2P*y+5-5fBX10SM_XU2a-W&kpps@vhpuP(C;5Ooi=}Wu^ml4k;X(j>g z^865e8wrQ2o_yh`6ChqR>dCJeRvyUvG4Tm1yswoLRB)eg)Jj4*>Hv{&RB=!jN7cAj zj%s8j@n7M9Pz~V)tjv9Ec9JP{AjygyvN73~6@$TRuNCOl6{G6rupe+bhYg8&nhqZv}9t=m>G4O}^ zSf6dfuUlR{P&HCPZ@BlBM0dML7gLS&Fx5y8RE=CEDX!id{31`h;hqa>7s>tDJ$uIG zvhGOk$F`$`78ZR4iq64bSa6E28&5n?i>{zo^xhKPExL%C$Hei{d`gSc|7rg{XXI4 z;|2TuCtk4M=gkY|5ni0%Cp->bM7<0ii^6^0BPeecRX!Ic70kQ_WA7Ti6Mj-AsyYS& zrutr-Stq|Eq-_oZ(b1!?iMGU}DpI#(CfW)sk$AO7WTGAMsF_q$wod+F#A?%6;Y>VQ zuUD)J>^16IGZUkO0d_LT>ro(Fz`DmUpF`7(1*C$#2JoPYg)Bs`6D z36q+=NyhZ3>>C&R3j7OZo<1L{#Z|9%a$O(AM^2g}F^<%2D^(zLLe#(qIwEf;fqu$P zh$@eYN1Jv+w2kCpw@K@gkPB*`VJAcfOXy@m6fQ?QdxM}>Mr7<2%t1@YrS7z-fANpl z3-Y>zV4t;cB^)~4u#I}BMwsG+Fcbb5JebU62896KxlIadd`ZuTmGqXcA&oPIFXvv{Ec?hbJ7 zW`m23-LWSJ<`y^@&3f)TeTy?NPpEcsnfvb0;vX=Vcd^>_d*xQ5yH<>GIeId=$P zr%-vfN(k#fKz-q$+OW*b!&P^16r>-+O)&y-6o>*YK+MaPnKoQ?=YbdiXN7fG zT-^PM7wqwUdzj*WJ#bjS|2d9H9RXWNpN^kTaMhiNgM(Xe1U(P&t-BCJJx;d$l285! z;+tt1v&U8-f;5ip7!xZ)qqU!PjxU-exa#&xX9t}SnV;n81jwpx|MZ}66|}Z&Y#hb< zMfOaOHPHhnMW*s}=<@7zW%$gAkvUX?Sdm6ib#@P^XrqACvAQr?yZ8`BsxHWJO>1|I zJF8v=!{XmfQrqKzUBaZU+YA-fil4&fcz!NUA3hE@kCVVoll1dA)OhF=5Ep{j zkk0e)+s?nV$le3CJ{ehT8A?!ivY zmYJ7v)s4jI&|an<@#!&TX0uuZdj$!2PyYWBCbcn&nx2ZE23&Rj32_|q9njA5HZi*G zA>?4@#~5*Jz@gvDDEbYpd>ifa(P(gZJF4+>2}(7nJ1M<^9a5XQ2(chtu+F#x2Xs}K z4yj#ChtwXXLuwDyA+-nUklGr}mHp$q#*>><(!;FLTrZ$+G*#rWKHbL}P1@nHjz&X8 z-bO&HR8Z&~71{-<*jXy}P7;zc8>oK&EEU`ZspwfMx(7nxLn^!rs^XjQwG(l8t;+&L z9&G}?8p!z*QNHJ%aHX_@IN?bQ`0{8oI{4(dsAu#L8iMMhL0p>dAGLz0C2?*uL z+e+fRV0`#6T&?3oI<}PO@qBh$_)!Aedc8C~(H7nXS@=8?=+J!F`Bxl+q%TXyoqsh5 zcK)_+KFp~FI4i9~tQG-uK+wv-Iw0sI!HFxqMY}j0CQeZov||7}cBsOvgq|wY16)bA zpXWT~uj#m-e^$iFLTNwmVqN|GYfg=7Kks5mKktHF{ru2@u^u)tBkAWAqmm^3{Du;c zja|~uZz14;1ht=6kkc&f=RHjNdBxaaYCm6+1UZ_}e%{5jpI6N9=Z}!sbg_5!^M4kU zvebUw#gcyhHT3g0NMPG&|24f{_$K=Kn+1d`#8#0BcYy|-FOs)MIJ_D4%8r9#-z7m= zfVvl=3E5xK8G2wU-7oC?w+}AtVLvyJo{N_G9=6VVx{Vq zSKVf*AoIw!8B?|$h|hye!}ge7;;Q@5!_$MNXUt4ob>EZ+>1DY2n#6xWOy4nMPQ_Js zHrn&w4VHRxXPhfvH8|Ff8&RNO=07lBwk`1EMcVfyd1!_8L_S9|cQKlK;oeiw5L36G z=@ZR^tFY!++)qo5v`$2G9L(oIoDxkZVigHE+3eRWOC(@e*7w~Eg4SYpM$D01S@-I> zcQN$@d6;^FJWxGBhf9joki`Fs`|wRH`+P1B*(fh~IOt_p|Jul1TQI<`{&kYj&6l-9 zVu4jMxO%h{^qigxB&1so7t?Zhn3lr>wH)=5qE`;vGMyz)*mfo@lMBYP6TA918D_vg zGRqRg@4oCNC>>fXtO?n=?<=VF|Fxl^{`$ng94a8&4+_bI{{(uA$Z-l#TmL*}qH-RT zVXIVMTgx>dlKt90ICY}6>|!b%4^!!Qpi0LBwKI-Sutc$gNz1GNB^zgxXyoU=Hgh-ZN%zO~KJcWCdHC~?LJ<1p_ zPm$2F9V}^5XA%>%s#|hOos`W59o20fwkFlRNzlRMm#S-?FTjRJM{qbp65u zwXPLptDn^MwG!PmWf#-B_Asq$4^(;FC@HRP%D2iBu9zqCa6zeSySw2RDY{*{N!Bkq zrRd>QnDC<##2PlvbTX#rQoxlbSiLaWc4$n!QupRSWOc zs@h3tDgG(Bv+we)>Rox_mBIzJ6wyCW|K=pr$)2e}MYb5Hi2&YWk-jR+uIh#*El3q& zB`rvagtj1OND_2(B{kZN5J_3vNJv>baj#{qJlQF04GAslrN3Ka7dcOo8goIX1^HUS z`kh}m!f97*3qs3jK=vqK{0_?%5|L{=$w_-I*!2!eE91Q>uk7C{@z{4HEsqCk%cG#T zP4rHQUO;s1CS6Q5-@{b%Jy7MiTvA+J^H<0dujO$;x8NAo+LWvf{u<280lyeYBwHWRSBxSRQL-lc}D@eMqQUf@pcu|4p$%~6MYZ)wNqqs zQX}GHrs_ca0Qu26Ye6Jd*+xS9^-dCMm2FZ6Zskg>vT~tgl{F;9DjRUGR@usXZGk#S zsKnlIi0S{EGRFF(0{n29*-PJr7Q_b@*)jSVWIX)#RuC95{$rIZG=)!{wx>oss zh|IUjS}8haJU2kSK9fMZp-9vr6Q%00#)Ck0b5nz@d3KO!N)@enR@6I6v`1wuxpgQx z?Z&DRB5B%dNr)1);9ix8pBzn;$eijZ(OgNBT>DCNxICd)5+!m$M~N1#(d;f4)K2fH zMBz7>@!ufmREhxQj73ldrs|Fr5!8}U5ww6v>}biFM9_{9i3kj`P!Uw&UPVyiz1mST z39bJtD`T;)E`rPDi6;UVbVTsU8b$Ei8by#7z3LJ{PiR3Kn5vsEjdUjoZKNv~IU-mg zOnHs8f?gy2w1jj`#l_TAJWNf+165SdONy(T%1h3ZL|a_Y5!Fsoe19Ntu%KQeT`!>D zNS`KXS0gQ0bGx`l)`(w&r_PQI!agV090mV`FapGz6MM!E$d66Ir$>N-m7wzNT|fj$XK~nm)I|Bl9&rR5<5kj4PRoH2cEysJ@IAUq`t$VRpuxB@Pn20PY3DfsEnz> zRnKp4_BlFZPCpJrJ_s_KoQWrge&!i%EPbo$Z!>OCZo2X8ZaAZ?gd|Zqwz^!r~Mit;zIS-@?aI2gLs*|b6LoH91 zyw+p>n?`oKpo=Bj1zk|L3woHIZF#%1U9g&jZWnBptf+^wT@Y*D%P)w`4f2HU>G~hW zs_cm67D+HX(fIs%L5>(8U;8POLm7t5M1U*b8=z%Ih5A-DXtmMU^g-X!H z5(&DXO3=eZg0-#$TU-ftNLHQ%qwS$u?Fd$Hg5g#o`5CbiT8S)*b*i6Wu0&i+CE{T! z5f4;}c%Vuock*l4eBtDE>S?1aPn9lD_zd)xZy2+-6HfKq#gr!xQ=U9fdGbKz$vPA( z{*L2t&xq{AqlEjUPirNieOd-R^!c8;rz4kt1YI|D0Poqpv4iD-l9;NJt4M+H3|uaM~Ui6^5B7j)bD4TT+lKwd5E zSO?uW31WvAv4gJX(RlF&VIXIdWrN4_75O&-SAAK~%W8sxuDw1j0bT8MG1UYQQ%&$d z)dUYzO|UKAbCMVR#A>fDme{Kcs=a!c*lP=loNSP8C!sCg8|oTui0qVJa;TRB3sjC#}6CuZfh_mvR5#Vu`d| zP^INzA}w==BdsbDDy`ZzNz0^{V(Z=8xa#*s$GdT%%)C#6-^O-(VV_v5SY}SfRX-NN z-tS#zcEDBthyQ0BH&|xXHRWdgYs*dju0iI6yUWcoT)f}$o^o>zuKHtw%wice)GrG% z_YKOM3)0Brf&Uj-qe)SrLF$fs7e@H{q# zBagSS6N(>iuirZzU5p;K9b16v_eqb=y@AaPXG>73W&N`g3%BA+veiov;F&1L7sbw% z=d{L!i}HnKa|6?g=L;A2jS82-q_N{_!WUSnx$;(gy9xwG!qN5zq)Y?uN1PrED*SYB z%CvzfycK1S#(iph+z@brve}M7@8WCS!BtW5vF_O2({tgy7?4S1HfNia=GP9Bpe5n)7M@ryu2H>#kyq}M(~yCgCryiIDNv9+@&x>7h8W40=6Of z!z3UZ&FSlmDSq3U^0AS_vV;E;Bp4gR5g%pO3G>(Z;1;VQmOb|_H=kG5>H7s{KaMP`(z7R%2M$A8Q?t3CJ;l1wTSl z(%<2<{($tr@DA*c+CV_t?U&Lc!bbtl5|ABP{UPb0;VMKwR6tf${W0lL`CkFHorR{T zETGx>X5}hOSPkmK32}i2GBSdMqrv6R0@@S_?u?M{PK-m+ zn^u1czMsbpq8|!)Cc%2y>-Mt~vM$*mT0*|{r>4i)y>83bi4$YvVfVUmgJ_3}3%F$@3G`Y}6fnCq`iuN886&jqumrFxo>%Whv(#X+qOP@Y=? zoV7s=a*H}EC%+QiO$T#WmY$q1$Nt=kCJ+yxhW0?^9_yyDJUt?sHvqjCL)@1hRp6A` zoD-P&JI6z%b0st@OQ#qvrb8tU)1i_F>QKo8b*NN0158vg-(C9K?L-~C?^QO|o<(!M zFfk5Ha9fdmH&MY+1a&y?f$Ao5K~6dBcB7jmO-dbZwIW}+buku8wilv(vAM@`TJKQyUj_reBXpSbzHUj+26&e%WnA zp9sok80Cz&5v>xCg16g<@;gF_Tfiyn+aCAWPNH|&AiJf~oQHx2*hyedshKEp4B{zlF2v;)uM=N*#oF$xR_dohpA@NC<%y?xF6d}p`DSqme9app zsCAroP5hftbag1VNhaf2bZsd-Q01YZcbvyFYmkSFsXRPP<>7%Uj~9Md9{-Rhw3x&a zUC?zh>?cL<=46nfTPMR*3BtOhV;-#$Tlk+P8>{XU$|7q6w@6qHtLLvZ3nt3y zfhs!%y=9Zc1P_2_{prFEz($gw%=(Q@#Bq{)F| z(vG;Ga$t|Z`A9<3Q9FMI23_34`>lZc5Zt+JyzMYtFxk_)#TK!FxgCa!sc1b+MeBho zS`SpwVr%kQDYLU=Hh^r^l#RECHB?;yh4@q1$cTqElt9p{R`>*ywq_9UrWHnig0oV1 zuU@nZ9WPo93H74=Su$XkWLH@V2V(zw3xb?5wQuylkMPlM+~>YXM?L#^XWixY5u-t3y9D z(DtAmM55|9OMbQ~R%3HPRdxFo&`Jr-+OmTiSC_Xh0V&A7y#r%6u!PP@zZYrNW^l)gzlvoIylkHoZ8l4-vcQSz8&NV1wCR`lo>z6ar*C?Pmr znBUeTpZ^7O$6AJXyhrc2l9x-6;}~SNRPq}FRsc*Y*#nbG{!xOmDM>21Y-(ISjwa(u zz5%M!!i*0u8=k)#e72J~MQYq!3Zha*A%WZK?bVpnVnaIcRk&c%OeV#KyPsI!H|GF(N*r>H}HX0e;Wxkc=K1M`cD!bY=@@??}A?SpX-R+8oXtw8VSzdsz=-cHGoL;u?>VW zRB@%lP>F;x)C%GR?QDNt6GJZOF*IPSSO@6o>SD-T1%|fn5x=)s1tMXn1VR~V;RBUW z2MJ}Uvc+L&p=9CBs$9@x=zJ%%Wyqc#K4p5Bs?Lwk4tF84XI~d^L9l5DFD{l0UOW(N z+rf(qQl5|r{<6!^m^>wHT?zn-)GNCZ;70-`?bb|mP9A96twHFVdTbpRfP)&_ZY@OT z)K9?41lc)7e?p^Pg7D^_ibj1V8ub8zjruu~3foiLFg&s-Fv|txn(F*ld-RKVbWH=Jz1d@2IQO-{^xZbj zoF%WDh!v9M0Iw5}Wvp8l;Ku;}>4sbh+VnRG%3)`sP4^49J3(qwcqzJ; zvK?Y}>ix%gUlrJ7F*hf-4)*o{LhZU5PIa!nh7AJp=w7jLRLpdtkPZ zgxDPo_^AqWUo7xV6_7ptfUkr8xyjwY&3`}c03U0f{83v11SpyJz035*3hGp5toA!S-7BZl|L7T z-$_}(m1lY$532H7P`mUu;UW{3UfpFr z^pNm{xq+FoK@8HjSKpeR936=EuLc>^-Bx}fID_MuJFX8X{o1lxzo z8-yRW4>cf?_Tl6;<$B7Ra&R#Qq*%W)Ju0nZ|AAfdyfRuVeSXc4oq6L1~3eY$B}4h!l)(gk&x6n+MKx=E6- z?q}x6^TIor$#X$(yCSu=q~~og^FU=sL9PoV!^n*!x)rOkZzld8 zJXYKsvtti2ttRm-c;i9-`%8GPnc> zwPfdc$c-m!w~)}KiA55g9)qOD6!h3=l906Sgbf#r*|6`sZ$3G$-LaBt{5sZbLG4S< zV8FhPb&7x-FUPA_siUzuL{N68lq3G--+_?Z!8?p(6B8baR{Bj*P|k#DN8!wq0`rZ4 zwv`5$U5w2R<+3#X5JNtZF0(rz6y)-SZG*W3Vm0vcmM)NGAF)-`D?A8#t067;e2*a} z%gqvfBq!Dug2tOATu?SkWZ5N*lfZvd4%jtJ642`!x`VcBsJO*xE~}Mbb6Kkdo68mu zNpm@U;u^Y!odxu|1{c)kl0%4gO`BbVxm8$T*HEPdyM_`7n=8A9xsm~8l?)-~uPIj- z)Lhv$G;7-I2HTWiSv!?rSu1aI%6hS6;B^g`ttnR*)Lhv$)F3(A4YF%!P=Z}Us}k%Q zIy6@f9q(ULt`Ds#R~PK+8gTB*xnF0@3%KfE!vR*qadh8oT=oA0@kx&|GZ6zLaCRx>}^ti!n*{S{qb`Hu0=zU;+ESQlev39!Q6KQkg~wN zN37ot?Q2rcFF~x=@iVXy$EHj|ta*41A#)mjUd46l0w5F50x}stHq7Th)`J~qZeBM| z`P6dqaAdZJNo{y84pnL1S=1VxRWP#^?=4(4Qe>BM zv81vg11`$jo<%XPK_x4g9;mIif^2z`p5-PY9IYyC#b$x;D5(YT;;Vl!%EM(4yC zb-Ec<-sNO;^O`dHc1;<%pk|c&9Cc8!Yb+oRdyrv)3o4wyk8wei_^p$yrG-_MeL{7-T&=E@roHJDX%$NucERJpJkwAhg8xtoU{y)KPm@d`DYy zR=gdCJzf*nQ=*SO|AX4=TxmJYJ%)7tewtz8e)vYOlqaC?MgX6t9!09(7i31(~e-hQ@rT`aEM zw-7tCTbDEz-`lS*jki_wp6o9+#RFeQUAfSb&BIj?iHn`~Tna;*%yW2+tcYG<@pD1u zTl{CczxY!$!e5}D$ov;STb>MLT_BIt0eKNW7MTfTA2groyT8fXbFCH+55QRJlRsmd zH&5HkUacOvOu<>{uH^xu%Q3o_}#mPoq&<-nY=ba;3d0`!7` z@Q;p_?2@v9CbuI(j26^pelEtc;o3(BW@ACws*-tAUL#1%(ae*JrV*ENw7)#{IC8;+ zBlAiZN5@JmpQFx<^k zxRj&!q-^0uLBZ;zg71aarQm z>&ne~*9)=n4drGIF8k!@8_Ug=xGZtaP37hlT$XtC=5mv{MTqiS%gq+J?2|v-R&I{M zWr>=Pw-25GvCGNhX+{BTylT8 zc>4qqrT6Zt8rOk@Bie@xwtGb{l6H#fX2N#6}^B68mycQKqSx$(7l31!90S?60Z~sCf!qrVnxAB!DXLJ?^Q4-#k=7E78U$GXW38aMy0taY4=m>@KKjk~zmKx*yNQbTHvz zI+*Z49ZYO1DYAc022QxQhb&$!53OS*+4cM?y8C3;GYNGB-73MYb4JUdAiZiyIqqCT zIb2N3;bB@157ctpv!-&`^{|!l#B&q6U_5fSPN&{S#?6<%M|Gm0Od<9!@sPzyg3{rU z?2ex528EFDf_Y#L5)L>U;Qn`$D*!!4P`Uu2GjB;652ezUUNBE8fLa zU>>Fd^FS4t2X>7j2ZOV#Br`5?gPS5}kZ%jddBc+H;(gnSaYmLnB|T8*ZZ1eAKm>be z*&jt*E1BxeBkiGOE|$EdT){EsTS0v6VKoU=x;-Qb_Bfm?#m6Q`xQ&d!QPnf_B=hjmtub?lvwiraITpSw>b~UGI8_%*QuRPh)deNh!e93aOywKk`|e`C z8TU1~-)I`X6;YUpSwaJ!+*8b6@?vC8lDz4D;yj{wFM_+^l6!`QH+RD}dOjF|@VSGL zSe+!mIqQ;pi#dKe@dhW+C2f7|LQyL-ZHpI*o_C(>LXnG6A-L_)!>AD4_UM6B2yT1y zKy7q#)6nMpUGlP3))wVv0pmgO{G&oHxxa627huZ-V_Ujp+0fi1V0#G0mKZ9K8xQOU zX|FgFMtgLG2#4~PxH@UfQX~)mmqTLxDDXf zT#O%!6fgx%JxAzG{LnGDWRjhg?t(!(Lmz45`~PR6+`v%y zw+Adem>Dz_V-7zKqDSArdGDy~#!rLM_E`9iH$hw*#K*!{yoELsF3sq51gi$ocw>MU z_+SN7Bt@=xG#(#p8SfZ!z{CvPkZhUlutq_3aN1$bRubK9d0b3e9uL!&#{;$H*-lbi zz2(_mp0IOES{@gamM8ugP1V~d`ia2=yYsCCBH7o~3_|yHb?|{MTvojU0>!mk-y1;C z+HL32ELl^>ldN4(v$k7ZZ*&-qH=2Epx@bd!jfVxp!U>B5^OFRDdYi`mQ~knC0ggap z$Uka+rsBL_p zMK$j_MXd&r6tzvVvo)%Vp)TkZ^&JV#mbGh7T>}zqtQUq_nH4sz*>nFpKqy0%?>P*W zNT}>vKqL%R9@Ev9B(irwkD)Cjw9iln5^P)?42`!zzV9$p4MG`e-~*LV8wq8|bT|z0 z+XejdB;xChgQ{*5l*ZJ!Bp4Fz29V!A;GYH03WnzQ2Uv})8_&ji>5(7~ zu8l*m4Q*VC@^Fu5Ekm3e46}u61CdC(;)AZj)#5%WTssLZT-86F!d>R%kVxAFy~5om zp_9T{h8mDyV_mSeWvCrQ!cgUhT?{qgK4GYXgfdk9k;72Kv2l@Ep$S7S=rMGeg!UO~ zL4u8^iiA2qbTRaC7elqUPZ(+=p$t`g;xNP`_W9>AB71gx=7M0; zb|EfC`Psp%2ZC+uymmpdZ{--yN2kxTiuq@oJ~Wc?7a{rx$|e5B)}WXDOvKd!a(h+d zEl4Elj|Q>wGf4DHj9@NJWK~$9;kyY4@?GIXJ7_Y zCV8=UTr_r+-KkR$jE#cs)M*3L*r{Xt{Vn78qw$eOME6oG7(iF6_aP1Jcku<$F z&;?cJ?1q?%FQB`+A?9%rxt){iX8=4Q=f{dbUEw@8 zKAftW?C9R1wGJ$5=II(z4Y9T!w~`1RXOTy~I`$#d^et*~R?BW@v~ zn|0br=ycggWSuTsi&D_rtdo|iU1-0`wFkm<994R21 zve=oz%{pTxGb=yTvE8!uB}|%sHa=7ixA~LMf0=(-!x|fI2;2KgS|aLl<5+yaqza~2 z#Sp!49x6A&HIPu#+iqT*CNomg`;%a<>A9Gio`9vDt zHNEp4o)gpaKs7xNRE<;6Grh|tO|N!c&@;WtFCEi6T!grz)+bn6F|>u^qxG65Q3w8U#?Syg{C;b=nTW163R-pcd42 z2rb|y=@6DnR8K2CP;*w$6Y=8`-P1}JR5hShE|hVOua)g&N44@rNzc0Zv_tSfWk*4e zowp>qCkPi*cBqvtE<1@$_52WXJt*jPItCg+q z4lH!o<$-Et9;g+mpl4;1B~7pGcR|m}+Q3a>Wly=Sn-04?P;*w$Q=ymF)R4KLsx_^w zm#fyvu&a~osFi&n>3LS>fy$189y|Y%=$=Nqpt3_N+t_6%v9iieVTWyhPq8K225H;x zfogRgs5~m@@i<7*^cp4?)XK7EGp3u_uXfpMR;D}CNSyKZp)Y_ zaWx*7f_L*2oMV|e6F;xvYWyk4{I^$`*#?JHHsX7Ef0hF)8=s~hbVH=DZO<~3uEEcl zSe0!I10)#lDzB2$CUy`GP2b^+lZF9CTAKL;Ivou>B!ITJUT z%ke{`;TRwRwjgEZ;z(|0KYJpOXF+6M!_U_DBOOR8m3|*cAN(xARmU)I;>^zUhxoCa zECAD~jc~GNW?TGRfonF}w$x^SK+-+N=FKx&fSa(FJafX@dGjGI6v@3uiI+bRnbcSP z;oyGar?mMI*NM9anah4jn*smB{oz4oQ8~UiOuQk;dG-r1Q$>Yn*ng00EFepZU z)P3rbgK?L}*ALFtdli%hpweq$LDx)VS2xtBH%GLIczW_le_ zW_W&NY8jL?PUz#l675L9ha8DW^YCL6YNEEa?%%^?F2r|qZ8|px>4R65nFnx{c&h3l zcuJX-)(L`MbPe(EC~S=>yP{Xi!cqHQP&BvVD*cv!93Q}~odt&T!MJc9PQ#oGR}KHz z(Uryqld~@)#B>4Kt^phwHk=fhodsk|Pdv4L+8)L#s-7(4}oYWQ4x#|8<6s= z5}q@yQmTAbU78e(Hc?eNXQ~*aKZ2ZtMCM2kE@GDE z!&g}K30~%6i1|Ukp3Bf}wSeG@u-W&)_y{;q_{YI`=>&KrmxA%p0$RqK!Fc$@ago_U zQ1(Kl6N7cKj}FHMQvo?UE?ta*-_s3@57T=C%-0~ z7{@;VCVHL(WzSnWKiD}s>~ahqSh6~KgQ{Y`lzoHB4j#Uj;1q-o9)1;!d!W>3<6=5^ z@Gu=bc%Tj*JTMtN&}Y;evv~fw1BDter~`#R$a6bj(t&~p>OjE*weL~T8z^imX?g<% z7u3GT4#%6pO)^mU5rbj=dBbrJ)SMOcdc8CnI{taRo(pQv%z?s964(walYv4T+0lVQ zZwcZJ6g*JbQP5*&s6_V$3NEPZaG>yl%T6*-=u~z%P?#z~tQSTH3LdBf1rJmn74&$V zE@^s|<$_vScA)T(gx2vjWF3A4tNK=O>H!R4!)QLNqH=#&#p2)(@q2|J_+Fv4iVH+T zT&wttV6IiTm|BI0sa1HOT7?ICR`GYq%e9IYFsN4XmOS^Y!UNSRJWvI#pl22Tlr%j- zyPyi%T15xANvvWwk*;SI9;i7h=vDD7iSAj23#uB@D*9lc%s<~MDrP%YafGDjS%n8G zI|_R2952y5t8hVOhgLD!Whb$UYGsF3@n=cTvkDJXtMEYOQ9+N#t0hgZvRqIr%UZ>F zVbZmVRj`Wv1h-bPIM^r}46CRG@1-;Gp}}214Et9s?F}ID`h(DUmSgc_qJSJV*G~xY zCK`{RZHQMtCzu+2heZZc09njv8#Z#(&g|e7gKZcFf}I+ zRCDq`H7Co!EXm6b{?o$1!2(h!+RM3^GT>p#fCnlA9;gi159C!t9F6$wwmllN8AP%J ztb@c`vIDH*01&DSb;6%j8&w7cJ!LpULVC*Jg0V7K55_Lv#&yA#t;?l-sGuW>f&p0y zAUki$F02aa`K;>$if$LOJWzR5(BpBKME8u!1zn@MM%b}7ZjFjNqiTg6dxYef5`>dH z?l8l9<5wPyVI#s&(Am*An|hk$NfqPC>*2$f1s;eg*LXZL;kw5J=0{19QiL9FZlYH( zoa;b>rQ7ft4v#*mI51`EUhNT?r~{9xL6vR}CfG-{`Y4=@>Ep(dmK}s)5EmW=5S#Lt znPG*}z{1=)IP6SJkhzxbhSd!K_^yB_5xfVb83XV;0a;>uEJ(DV8)%OOslgca2MNlq z${q{y8rAdQ6AE(z}uVk)37zcfT#x1 z_;SJSrK;uqSFsguy(&)BwPF`jBl0jcA`es}@<25rupGTcZjp7<*JZt;9WbD8C-E7G z4ImwZH(X0Af%;nf2ZUPrBo*R=)Y zo=4%;vUT(~am`o`z7w|U1l-7F%LNm*E|HKPTOOFOb(sXEvL_vqA} z{xlgYD-TjxxgePeSuYCGf+SHB?heyx6meJL0kt_SKRqxTNLFlz2%7vrpjA{9P6Nk+ zcu`D}4GpJ{(TSYLGDLZR?L#Nx96%6tbECddD~JvfcVQ3IRkV*eAkJe0l4rY8O%ef- zQh6)(necA{Y!y@GhWb&jo?kTOoGSkiWY56j-7^wmCPJ0csiD~oF`-m&CxG=h$uYZk zH?VGeYFKul15QN9x>up~WL2Y&C3tTzJWG~emyFoUk@b+QE6B!}MX(Ly2NIHVOn_MI z7D+t{QV)nrUjCbu@zBMG!6WMKQ zEg+JeAhU!w+b!t=oeS!a$!=3SUP7~7i1%*2G926?!Mf9;{>4A;5t!d32pi;uD~E^M zb;CC5jV-Um5C4)fg@49kVPXp(9haSs@sEoQygnD@ZhgTAaV7<}lOOs=v|Jy?(HAlL zlTo;QC=LY_jP{jYjtv`gu_xyN0a>pA*Uer9@Noh6BluvdXYoP@tN}Q8v%$s2?%0z9 za|;}d6*~8wzQq{_;q);{kb<21?$F{N;5u=!+Vy+oRzf8dV_bStOm6bC_*j6%<|5PF z_wZXh7XH40;#{IE=Welfcnk7&u^zK~u+cT)Qz-j75}0jM-IAynKHCtO^#$ZkU{;X{ zw?)Hnqtuag1wpOCL*V=wC)GhQmGb!bJDooj)_axeWt~6OAnYk<_oJVGPlB@?rDAHW z?0wMFTLh%Bl?vEJGY@8Ymw=Wr>k+yMewvcQZfR7i5KabT&B7R)Z8QJ_OzI{$+tT;r z$GYMU3gED78zp|c^ow(P#9q6Hf#VHIh>U-a;9oE^ePPi|##MSX2){svm&jAw@O>F< zlD)A!XRa6U6=sN2v$D_N{MefXJPu$}&-8%oL*2mK`sGpf9{@j=kgT@chq(da*rx*@ zT)%uYo<%>ReQ7{j*fbQ;cs3B(2{}3CM|Q()uY#@g%L^0TR+yUDEm;EGVnK ztMxldP}@@4)-QZzabS)Um{!ixn{Wv#`X7SYp&;ZQZg@I&I10!CTIsW3RCqE%zAT`v zHh_G07s>MP2WWLLbL+E<<~UqUN2SAkFt3_$TKtrKPSd<}6pelar*Hfi#Kb}nogmKK zCKz3Kpe0-1HL<5PIpcp;20`W=Qk73`1AUa4K6BWkd zki&|fasRhL(c9<*t8qW@%2eON3m|Gi48XVl_P~*Emk3L2&j;MMuKggCi)|)fEb=h< zVv%Aj|7Q9@s3O)O%(Idzn}8`d3=Mmn6L?sv9B2R9zuXyjrp((;@N-_mll)r)(36AB zrjyf!>?a_;l^~qgHZ4ex&tA|CoPSi0D0>YQ-=MnqM^&AFb7n$#KiX**%xrRV!n5CKYD)L8 zVt7M9j-?VYtOimHtAP~5Y9Phnf{7ShuuBXlLA4JPy|v|-k8-ejT3C*A;n!fbw1cqc z@{kYnKOvZZwGjE^FmY-CF@W6wnK)kxMmZ)-xM0FWYSmF`)1y=LVFk1>n91J7_9o$y zSSzWfNpIqUNpG^Pg!Fn74|IByRP~-}Ov-k%bbFeRa}{DCmu$8zrRQi<~W}--}!zXjd8PnMexa5YW9 z8sLhjP(r*#)U*wr^clsV{@B8EDFH4|4f9z2G+^V(OjPJy$eB(M5KXinR!&<2Jh&<|EI0IQ^qi6o93!SQWms-) zV5u-Y5eoNJr*^b*&3C7_MX0Ic&m6-c!K!SGe_a=sc9%$!&A*a7N z^y>U$Avpatg(EP~u1R4+IBlSPm#Z1~b#tPq=bljRb`X4*%M>|jAHFn>%pqZEtC4m> zteBnqVrp(D#0uKss7{DI(9Y@Ylz4qfl!FU9w=ZytT9F1vTaS)U?8bf93>5@tsCEK* zlEh`nF@dx%__QE^&RRPdSZA%3nRwP}->2G5VzP}-wr;whov7LgE@sMhf{TzCdUJ-_ z3?!MMJ}fD*fz%nQi*?OVpOTOqrRogT#gZAS3wF&=Kal8)7+q$lictW`4E5g*N68HJ z8vzetNS&c7xHmwZp?a9iP!*%r=nS>u+*lbnlGGWhi|GtiF~;qhp$?YVbWwH9Pi+MBD10}HS2XuxyM?l-)bB3Dh3;SCrD93lDZTjY>VuE^_U=&?xyR{0OpSGc5 zOWTdK)6-7eli$MmP)DBVP}+WcI0GiM!+CMRZN8j<=B~m7_5?xge0Taf1+MbcFxCO< z+LfCY+}G>MO$P~Gx%rpGq*^2^H{Us#=)#GMsn6HL)aUDg>htwL_4(SB8`B&Yhz(Ms zuG~ZdvPDt`Tud48FlE34l>rY_2JFgBWe;cNrWQo9a??iQtss7PzmtTn+zb=`*lf@j zWnV^6kUE+8q{d4~Dqv#jF6gY>oOM?$3aVw-%FW*d?MF0Oxv9*8oi}CWrt*R~q79-e zHy)@wD(LYzL84Q85*}U9UAfso*kRk%^-g<@uwz$l?v)@^cxUCN0b!Dro9&!Dla(76 z^j2 zLz(ODm}bE^SXS+GG1Wc~Q|L-o&0f3uiAHbVZZM4?p6$%g3oE7vm?Nf>FS%V9z zrg0y@{TIgdYc2dWrd6UBfRVoU4?2MP_p8dI?N`>1I-gl*vY)5DjcI;+==Ou`3o%Efg z+oT*;n(-F&o+B~WY)8z}URxKY!AeXH_q*<7t)vF`iIr?9Ry7g@R4ds+FixP=N?c5> z#KY7|JW#E~13fF5DS5e8(gFt6N=}pKo|Sl@T8Rg0ttjYO$@!9|rz9@uSxG0jNvx!_ zCM)qk%~?TDAC6g*mAIhl1FeML5aXY3C6(olmDG?>D>;2lR-&NC#)T5n6MzdkRx)0+ z%T@pihp{RTVQgT|Y9%d_o@XT)r|*g-&T?RYRk#E*v5GvNA2~2P3s$t>Me%b??7G(4 zYY-q=Yi|IdYwfMPm$mjYB_;=VYEmwyCgovjQXZ%#<$-EaNIhH+h5ALZvo0_$c0YxZ z48Az#em1$sLVUIXL)b9_!WCr~yNjEgo$|oaQG>Eu1Dh-X+4bAC?nm)u6A!eD%HyD| z(We=av5+zWnh*Bq?RYL^1y_FVLyB54j&gLVJ+}qaqDe|?Clf~wEYzT0JE-5s4$AI_ z``0B?cH)-r7g5I^X!+g}o5j`d|BD%&)$4@F=iHXnC zg4rqm@x#KYm;k*bn4JJ|GkMP}c&;dbzvKHAx4ROZ!liMoP*|l!QT7P%>|z7w<~9gF z1~?tvo#P?$7XtF$1YEq zhb7C2$Z~39W}WO#HwFpFPHW1{^oVfI^**@e9YF7aae7uiUkmIJwyRlTf()o$!ctlI_M!wTV7KAu4-8 zo8le8UY#UKd(#68qlZw`8Wd>iX3(U}%UIx-P^|Q+lgfH#KY889m*RKG;i6wCpP zHSK@MeOC!;D}8yUvbYyC%>}7x4?@#iEY`H=plPjSdwFKh@G`iiW=UF=$YE+*reAg{ zOrcJ|wFy3&=@pIugDyCw7N>%S2P4~SB`8Zc^{LGG?6ClE5ztn`Q<;s!Utu*axc)tC zZt^$(3!5m&O*Ndj1Ip2k^#ZYdrdPInxiPOxD(rTqewPliuR>c~&@NHcBR>VLK)z0o z31{NY1=oKhJ=TQRqr7iPqKIXtcBbJu4ch=;d_`P)m4u&87sBTd;BEnJvd^S9w#HaZ z7T-({wZ_;0BDSzk5Wde}ofhD&^ziVlZs7W}GWb-8K@|^?pjJX}rz^v65!3~3(C~S% zHc^72KF!p3u@w3?z+D9#OYk=ETR@`63uyVhJ-xAQA+B|!KbRhB&E5qq|KX=d^nM9S z6P@}navF?8pB9jP*wht>KOW%o0$STyiIUz4_UDSYEO=phT(|<@d;zUNUzpwy#Yd$N z{7WpUkxX>QOd)JSPz9|_-pq^$?*dQbB_tiQ3tCfT)8T?s z`(R8s2hE^@l@(zOQw)DC*yN`0`5()Po{tL z?Mc`Zf>;CQ1Ov0hgS$dd^9QsBRk@3I$GZm-&4TzyUD&t>4*D06<}hGIFe$qL%$*=0 zw9pJ#iGz+NqPca!&8l!9WO&QbfjL`(vJ+=eySn{1H~xL{Z9*5ctJ`7bw3Indf>MlN zpQcv05(RIe5Y8BwJsFc*5T~Kx#6yHEbH%Q=1 z5Ez+ff4VGX?iK7HU{GOh&$~S_bCVO9ty!fi*uDwE4Y&{0b71ZI8|G3FPO3 zaejDe|FR?ZGG>&-83M?b`;EB>CpkX*(hJ?d%Tj}L z2V)H4h749=TpV72jCPm!lr8sJqN)$aRKA+be4QB@{Rcz~iItg=(Y_$e01&&E^^11I zDu0Q@1(~RL$W}QX*os7q8I6k@AtqsHuNVgaO&4aS#2X=QmXKR9B%~RB2?2g9Alt&G zi!#ONM}W;AfV2rK zsdphM52U1yg``|CmQ-=OoS7r>2gmUTU}}a`KNFOVXVaXrDcR4FstaUpe^) z|JWo~kDNS=b%Ilgk?4;SbYCWV2>8Dc;PC6>LM1gFyx0vS|4m5M4Qct$4gvq8Bz_Tz z+8wpqJ{x!-a@rnR@$ShO)(Znj%vLtwF95$KFwM(q#}w#54JH3+W>8@Qc6yjW@lKEH zpjs`sZ~82=Zs8>C;HVjlcKeRXh#M~&aL)}F5#Kjx1ChLEuWyl0>w+o5ES z)NBb!b4&I}Dad9h*=c*2gru{s>pg>`1!beqwbS+lLD}ooai^_a6n;WbN~7*Ad7aM% z)jR59>K*kk^^SU=dPhC5%R8F=3Y%RXaM-n*UDm~B7Zv<`8* zi=+nexcrBZPj#AY+vwVUL0K`Be!P2ytSZjwtSu+?|nP4X83tr^+fBzwb8x?E7s$V&GP zwL3=|P`#yl<5MkKaZlcgh2b~=5_1p!v6@OxjKxv#K4uS<$lZz^B!^2#7OnI^WpO-0 zzAYFTD6JeD4(^79I3U~dSu{{?emkt*Fm8kefIDV^dj=8X+ z`8>)#jyQ_3JG749@ffyyVC?w4=0WU}9)`3&kD@K%_-)4hlyW$J$IvS?TpYi*eu0m1 zg0PO?8Ou{-gQE9Nth;aQtSs zM~(EqH5M;5kPhH*Q}l8!h$!4AKUo>rp2k!QpEkRaVL)lRe`NV?Gt$ zx&OmDdRMjkAbXXMx?}8B20hy?AbXWdA(^inaVC!5Z(qYC1X){e$2df70AXFREgi-@ zDCInqT+rKbH@qFK2w}Y)GvL^GTS6q>j;Y;1>+QH4b)+E^Z^sP)S4ngZMXa}D8NlBJ zbiExB#AZ6kC_U1{;U?bxwzv-1hFFiZdBF!0kF*BNw1hvLVkMs;gazUCv2c+*}u?g$~6R0NJ^hkfV6z*wB zYc$!WNBR(yU`GrT?@>>HI zr@|9$`E5{s!>y3W&^zMtvAeP!=pqtXM?elGtOt4sz{vtycIkn>9_&6PGAn0DdZ6zD z_=Kwp!7hWil7QwEujax2%e6YkhZke16}?)S|=8Q9%x!~CkT3= zH^Tk>k{#s`&;xxL681pxKtByGszxIfdZ5oipxs49$F9;?xJ$9$s5u?L#bY8j0l zXoi?4A=vF(4>UvEB%pYp8BQTiCmAmL4mA2|5hJpX-KrD6@IkB5v_LN;9lPhCHBpeV zO&q%}7&~@ptk+3S9MPy__cL&CkKk6kbS)nT4qVW3Fb^EKpmprdLb5LCICkI1*rx?j zD*aR$y^Q+~+|!pC&A|AlVhjlSFsE`b1j0IU-#aK}{vphigGuYiJpk?;52O$C_C2tW z?1ofF?#}|!loKDO3&uXoKF0*6=bdrAdOpm>0wO+Zfdtq}GG*rGz%$O%EyvO>5T<<)2wq!5+^ykF9? zpbCK>Yvvy{HW7jg#zNpXJYJWeo)CT&(AI%Ea$T@X2ptmC6~ZCVsdftCe`V3$xHn_P z54!VWe5GCqma_!H`s`S~7nMSXTIC_cNwJY>|2|BXXeNDW+E=X3b*Ov=E z{9{QIudfTnUf3+XzI76o0|1*py}zr0%>PUYNmWbocR`y!y}+kSNLFv+1$MzMFL3zs z(Re>e+#js@rq46Ov+o1kT09Oc1RYS;?7LGJW+2DZ&;P-DTH${)W^Y_gE7C!F|6elZHe5~1 z(|GCXqF*yOqoXkv`I#7b1T&w&Yt==(Vb%19OtuIo+B5Q$BZHI(ATAX0Q zvnB-Q0}07~qiJSl^Jss1*M3FUw0CAqb~g}%&x~{086oO_O;={`hXYALwhi^Kr-x;K zywwM-1L+QQwQk7xq>OMZCdOkWRr+j^KtGf3SPcIxGOqs(?*!g-N@UKGAndQ}(_F|! zAzZNTfoPb?Uk9{}@zR;`Ve^TRxkKWy-Kj6j^a=k8Fm-lZ3JYd4eQ;a{>bx^9=pV8# zLud=mii7Ngc>KU$_!T(1UO-Nvnr3CjVw7g?fT8~e3DsxDX1Rj>xP+m!M|_lBCv1Z% zx!@M7BFHyf0I&9I5_T=7cXDQEb{uj(LYU)3x#?iM%+`c5ohTqjOY~}I2P0%!%0{qh zHwo#2Hslkip-Uw?$EZy^WwyxnfQ!!sZ4EsP;d-ET@nv5@0<r%*gy9+Xo4_piSUe zB;bMZ3vrDo>W7lR7;>;9M4ld#E;A?LYPt;X8@`8=Tt^%Qq6tKAye7E^uBHb;%>A;= zJcz65wQd9s`K^GxyoR5VIGMQV{jwna^?^Oi76;+gPZFOF&YO*f;2lN~CUx&*Sks6; zh_N1iF2&XK2?F&xxQD63Wr;rz&0}zf7~_lGVmugw1mflDAZ9v84#jQ^q& zurkyPwCSy2V*W4$X(RD|21l3OfoV`Dsb_)>!X8a2^U#Aa)7F_bEf^c!)`6k-1axZC zam?ETAhvxd4#DQ$F4YuX>;`hF<4#zL8!}$1nU3sgBt9pGT>Cx76N}Q`!KTIXmwb?}nqT3naRcH= zwn5qIXS;!P)vQ2aypXa0kX?CY%KY)+SRUk{v_D?(S_@sQ3l4mjD|gwS&CyPHZyrC2H?bqUb!^`} zz6-=D`2M3ck84xlGIc2iFZL|x^nJPb44I}4(FvN=VY7PRfRPn(Ngk-Am0XWgs(AWL z(^~2Lx~P;E)KJs9>0#mKAU0}?gWA?;z4XZFIIJgjGQ|4nVfjCSsGOKG^Y1Q$j+H>w zfNH8rk13o1qGBC9`o4E~0q##<87IVX!u-q7a}_3G$)TDde(aOo1aC0?Dj_Jd`A4Pl zIlk}fg7zDZ+ap%Xx`&%0lXsMg{#H`JV1@dDheW~tf;6F1#gY3uD8Y; z6*b-$YF50@sIT|+|2|Jw%~W?17hQMX-QWN1&!=YU`PNfaPd)Y2(N)#muf7|`Ow5fA zRq%EQf5S1UKoVAeq1eR8susekJQ!KkO^^FPvZ~K;emSjDB;(NwfP%Md`l=9`6J)n+ zOi(?;;C{m~H3UU}RhIF~v8q61UyfA=LT?Z?Q9yQssM6gaa-SUrk$vdvc(a)L41m}GzyR$$olog(Z=I5TvhUNsShd(P&3lY#i3skk4A<%0o3z`yS zbzy=Yfxc~5pk+vK-kY)~3)BQ6D^M#4t)Z%6hCs`R&;qr9$ZBY-2VLv%2xNjDfu<{N zs!G;Sn7&NALZMXk^S+Z6yqkG}0%-*mU=hC^b+rPi1?b&O6Vtny9!&3MdO*FK=>hd_ zCVv8LjmnFrMDxDK8^`G(LKDn38xIIA@q?`zq*-QGTQ{gQJ*I4eT3fvTSvDLM^|S2D z6;%x)TT%5ObVW5&fHvi_5k^JTfyie4rplT|lC0&Jpw1dIQTjq;BO=cWT0LB|rDV0) zrZ&%IUJHLV^F|`Hm542j%%6MAwGvvc$!2bXI&*GEKPc|3mDq1I51?5A)l8Oh)^9gS#_G1GW#F3kp!&dR6Ns$2w1Uv)QaQ>nmpUS#2mZ)?BM55Dkt31I_OH7o zqN(lt+5zr3*`TtfZZxYD6VyuKMs}Ox&e~A;QoK*9MWH+ixk+y8)I)!*$a>yQvYe|k zPc=@O79Xd-Jm3M*7x7z=J)o{m4SK3Gq0;2pgdS#1P)p9wR#$HcwdgNH9-*2l_0q@b zPZW7TowEkn=%GlSTP!p>fUM3;Q02^DhTP`~SL?JjMtKST*j7D>qo1vABtkzmx>O}j zy&lygj|&>~h_O;}dK6%St{D8P>P4#Vd#F_1uP z76QG1Hh2Q&LbV`{!y6MLchPH!P5vc)_(Rak6-JxWN1tBE69E$=p?T!+fDoQLP7TtE za<&lHsw6#jZ-TlISbC*?Vi^f6Sbt3p@u_+s@# z;H;!<9}A>o_28%lv3wX(wogJ(!Z6Eu>mbBgU@<{ghz7707_9}Yc);%t6e(qv^Myb! z5xy9ue^b>Kmwu1HU@rYK5@QcMibSRV!Klw{=}jDj%B0WaTtLmXj-_N(~7trxwWsvm(_| z4!S}bvLbaM8=0UwL)tHx=T?%2*iv*QnP9Gxc2Kcd2C5`yCRT}>DZi5g`SDxMKuITp zIN!1FhyQJZomU-ej`4xK>ev}O)*l<4G(W7q@J=DVRNzDitDcf~oy{R8g9pHENIJ^|s{%d4g#hQ8;8>gtd9($Sab&T0Vqlm(5o>cR z6vrIMvA7xyWGcYxjA&fA6OZ+QT(}WfyL?2kl7_i(*4=o*T!A!2;lhQVN50{wT(M~$ zij~CS&Vk*q?L@+C7T7wx1TSFRMsbkw+rzL+7w&;VY^zYJnZ?5b<@WwXQtY5WS}$Kb zB2Z+{@PT}8EeT;XCq?HYYFz>DrlQl$APMJ~R{J zleYDDSy_-a0Qsct1y{)|NLHOaX{)0X=pN=f;C5`wsYI#Q;ghzTqwpG}38;IXbs{S3 zbHz&L%_nVlf$~g{4)cACS}`#`%om=Art&{3I^8$BCvJy-Bt#WT$R}>kLScSVEPUjR zUbS!}Bs4)jaXStYYLE)!N;m})<~O_5Lv4jm-0lGhO^_t~78076d))A3NLWX*@QK^~ zp!)`*=v51GR8eXN5c*XMRUq7_yD4ZshCRAiE&5dpCYWPgt61r7E&Hkk6J%ClUyN;? z^Ho`>V)z7ZZ*1$BAWc$>{TNMBcgD7khmj_!>mlC7DoN@!^d!|e0!6K(($T@zkU8Q%?De%pedPP_F$_AbPu*>UKHY8l>m*Le6V#U1TsNB*g76reWp0MzUW|UUu0#1 z*@LYfP#tU?3-f6p$?0G#na}KJ+?wc08Pls4)}k$FkfycSS1p*J+ZM>u=BoHK`^#FI z2C27lEo~ooPgJa2>2$F509cv{lBEUFqnMa$X=lUIT1ad<*t*M7DVD0Vs9N}7>xC%G zWeV&|ARTNy5dxZ^d$9FLWV=qWQVIEBYdyfH6-Z(O91*TYt1&_2U~6heNJ9r(PlPR0 z5kUuA_dL&r50C5BI;KyG=gwj*jM21^Sqk~>w*rpzV8FwgRMzy zQVud%U&X;ze2c;Zx(8e7m84@7D@_RaVCyn~^At$K1|Mwgiuk80kmaRUEs(sAnwHu#`x1rq&4fz;XYLD$Uzey%_+DIIjZA0@p|sVhpHbkOxFfNK=U z(fOe3WVD?AXn%B75Gx&Yy%4M#jxB>@1d{AG6=U-lQMXLk{ziQz~AIOuqxoAh4lT4mpwQw}R9x6J`V|ZqFD!?HM zWKR96h2;oXpaQ6r{Gx-AA9_Js8(zKG6040I7taWEwy(qL-^~i#5)v=o zBajTQLdSWp0!e4{-U^o4pS0kOE(#=zoA*ABdv$)=3-XsH>`CWa;vL0G?GvnV`$lAM zg2nqq28HjzT+IW19;8CY=tCWKuzXE3YRbt+|B$bJ{@<`(p;)O=EZz$z>lQuW1IM0eAS`z?$-Nh*$|U!B?aA!{vvOb3p4_VyNb2XQau-s~O$zNnBH|?#D4>Q| zLHr>;Vic1h%f7gEBUzqRv8Z5K9eTj5EFZQf%clyYHqNrJDP>-EYvxdrr55V?zD0-u z3Z(I7-aEk_;oh(s6LhVH3~Yj8rM{93%q9afL4LM+D8RiHCpBMsw)$O+f*y>Yt!7g` zOtGTlV^bF4%VA!PhE&i>aX23~u<#XEe(LK9bT&d&RiwB51BK3uAnHKy&E8wExdtNW z9Qz9(nnCbQ-l4e3D^UrN`SVR)>u%Bu(oNnA)9~>k#p$`p8>v9gId&6tZ}KJ{CdE#Q zl}3{6P2NYZx#i&a`UtlP=5F$)srY0F`X=uuvX)&?>H`ABb}NX?1~42EAZg((XrZ?PN%7g&vJ6xp)p7P9y9v5l zm(7d+t<;Q{%r zAoRVIWr#)`{JoSWP0;sJS~Wr6OR21O+4y@Ybs)0eOSx5LMV(Rh4JIbYq9YIsAX6Yk zx$3-n0ASJHImv1Zl4WX6Rw}(kg)DQRiq7VWI^nmd3|AnlPanQFK_!FzFcfv8Vm=Q7 zu) z6=#Aoq}TZ3K}mYf3d}Pgx5U=qalS>Rew$MlCw+o;zZiG)0N9J94ek#D^$r9SF|# zP?U9ed%2EmFIN*(xsqv;Wh_)p%VQZPn6(T)=vs!Bjx9qIY#CEc%K(wp)^e4lM_Vft z=+Tx5YHhJ)=(O1~G{Kgk3APNKD_O>^Dg%#Y+|ypJCa7~|%a~?bh9=lDG{KeuB3sti z+biqe+soAib*^j~I&HR$-A&8T1X~7(tYt{GkL=NKo&r4@Ho=@_IB&u-8jvFO70$CD znsr_?Pe!A!QBu%?X(b5Gm=;Q>E9>(pxwbu%G(lZl%C#2BWpiDoGooCZG(owxnz>e} zl6i6+s=$cZ)tI2l)&3Z{9;`$>Q1_2pVL(}+KpaeWd+o8O<5t4}c|e&Auxz?g$fpOR z1e!Q@Z_Ggy!M)%0DlQEh+2?UgkVLYhS4y!)aZ-u+d7SUlUNHMSj=cx+e?YO*sKMwY0TFk&qru{p)vna72RVlPZ%O(yJ{26nv1pFyD<@%jGy|^I6GVt!a?P|M_?sz zahJHTOX67Br?bnW#{*i>Jube6Tl{_i(9q2R-BKPGLwW&vmY_4Rf@_swTP099SbaQc zXh;USZ5DSQ0N4$wgX4kALc*#X1mC0NYxp=Ug3rR2UL6vb-z|gP@xPby_kJQQ_J<>U zV_{TuFN%uGpYZra@CYzmM@+BE;MVKI;#fF}aOqQF@d_OIP5krbu;}-Ui=T%7dzJsU z@}Ki8Mk^f2geF=2huDJrZ-Zia6-kz3;@GYLOe z!o}oRnd#kxx`B(yok8pw7stWH*Tlu>!ziRL z>gX2A`AMXgc^yA9@U7RFoCN#iEh@UQx5ZnHiEa|x}CJup% z$sV0rr{0S~5F9mh!pYSPiI5(^bBIT_m%7NVo>--~Z zJPkH6E=r2=Qv;WhA4pm9#iY0xwF6P#fQs)J7t`QUGL95i!M7(<`Jgty*JmdRI~&w| z_-<$FK2UP!I2Ju9Y#gX-Cdb9ca4ES5s1Z=viEt@-6{uIL1C&a>CY5C7U|q_dR$a2BB~pw^FNowg+&j^ zWW=R$aXwt3tfUOiy%GT{@snADpU>br$#R()cvV~+4cAF-h76Y8fbeti^CDa)S&xXq z+HgQvScg&t9fzNL;Nr3$J#%yE#o!LkiHmLE;&Q&sJi8K}3y2saGrd;D#dNs1oGCL4 zAlHp>O!T`N3Wa0hLU^8G;$WGXb6s4lhKtKxWM&$KI0G&&2Y3mQ=>zzka-1%ZKT8jx z3U5Ce6KBFD$VNRx|4DIiJsgKzz8mUtiXx8R4?XVwiYUD{E*jvN?fB~vf*jir!df#P zYP|tJnZM!Z8@Qw#B{R;1xEKeQl-tY9B6uEVVyeuX2J?6nE-CktnWD*P1#n4uh|D|< z<8WXW9A{T}mNGGwYOkp$YIIk$LRY|jWG09jbW6Aos)8Qh$m};aE?$RA$o(kJBC@6> z__-f0Eyu~strx|`+i+>wRc0h=qY{pZTVVok!x5o6i91h1BWc3V4{!x?B{!eGsB&vC z)%yti906A(4@Qht@Rh8=&sz+wAX^mTFBmF8@hU-;$!|q#(BJb5~;?n&cYL zR^mH++xR1}d~&rE61QH#hUr)mz%>C*);x*dyy5s+7PL7$l)*IPdc{La6BH@*Ei%&} z4ORiXAkn6A$^`T9f<%lMc=MKuPK#s#yads1MVclU#BfVt+uoiO7r{{;;Z_yv5QNB@ zEAC8+PIqxo9tqi`A7Yl7JnOwdgsaPJ*S;mkn9?QI!&3&b{+SndtbsC~uVNf9{cwxl@e8c>URJrmPvF7B^-$?Bq)$Y!R*6ij zda{OUmuqvjf;|c{!K{Mn6esPQW{YQnT)betVx!w)SwqTVTQK2lY!h^q!$X@>fJ)yU zE<(UHsUslk9aUlFo>x_d)%!X!!R%3AA|C=$XENbkFP<6#Kxq_0>8PJ=00I z1%-7PQ0prCIkvAQ0yo09d|9Eeu0$WDxzB({)}SLsjnRid^LDylafNbB70fh;ndrIM zyz&PWQ)P~634(*G@~e7Ml7gR%&AaVE#TUu(xryDxO!c2byNmD>9BBzFjc)Kk5Y876 zc`p$2;klcLEu^$>_$evqNn7h1G~LcXLj&=1BW{JP^DXHmZu>^@F7bz$afG$}BbeHc znz>rq-+h-9c_hoh(jN9b%#(6|%!?lcLGB@ZC9)pzEd<#bKP|5TX@$`5A^7t`B+(P& ziFFKxpMswWUxC7;P*_a_J))!Bf+*!bt0+%Uw-iEU(ajNGv+)b9*7m$Dm2ztjyI$7m zxEso{&|wi-Q=G5DvF~ij!A5vL4nJOp?}hOA)*8mrtjhjE(6cZzpiki(d7oRyy#WTZ)8@n3^^B2i(m zQVYmzXQf2sDI+852{R`pBc~diT=?a&$Z`YYjLt2NjWz^gY(>xb^M?H}_KX#Ybn$^* zu7>4DF7YRMK|4ua^qZ2r)}Q31?Id~GZ%XoZBS|vQ%o=Z!`Gj5B%~Nn1elq@o6X+KF zXd_A9LRyxN%r!8sowL)Cy$p^qOHnEaXkzjLJwCx2Jw@Mp;WmG9o#7K290rQ!^eQVpkZAz67Bq zRh?p=8EurX9{uC-w|p44+iCR(RTnY3?N&s0M5j@Q97-nT#~O_csAwf8CnG-^i4oRg z6c!uWFrLx@{fHdOLhhXA zLNrhzcK?ql1dHY?1ecZy5j_Z6Zzh5FNJNGiodsDlMxaQQfzeby{C$N;ne|@`uta#O zpCEtr6V|5s8RTvop_rhah*=HINy0s)w0i%D0j>f+bK$}m{vN{r;pFcrJHmxE9}M=% znsXrr%1O8zqBh6ZZ2a=nWMR^sdW4_ANdGF$36hw_=Dn?kd*{I1aG#BH11W`6#}~B^ zS+hL`J!?5+wpZbYgm>mcyf>3#5O%qobEUoZEq9{i{29WWPn^?UPl|_H5ZWZ|x;HSU z!#P)Awuo5o!8wme`y>4KZh`+!Y2W%zQhX2RT#xa4b1+vBF<4rc6yc`-Apo4$g?J`H z$tG+}He}63Y8-d^ML!_f3vA(3q@t(R<7gE57p5b79;KtWMeEr+9<2tp4BxN~Wt6poK4cRmKGrQyH7B6<@1_3ZDQJ_`Ou_zO?YLz9Xg0J4RGPN+!F zgg;f74XQ?JRUn;;yjXX-CsNn-_;B>!DbWGTw0FSIY=tQ#J=s14Rx#7K|&BExd-b|R!teKB@FWQf%p3pt$RwxzKG zA68zFjOY0=9KDU-YbcE(m*ePd;$frvVleykbl%5rCq+N9v7PbEqq=6XMK!~s=)T99 z7?qH{g$lfVesozqG?amVaXNMj{Q4sKVNsElh5&^1s)Y8|*F$@V1T%}S0YfwVy?Q#4 zYmKTS!Pw;7nky?t9!p%Ct0TX%xhD3zwb%;3vbkHK%CgR2JF6mn75vrktDsxZ`PEa< z_Ic59C`mK0ljwq^ZcKBTYT-wj z;-~qN2;wC}u_ugzQWC*adc{BXB^!8MZkBk{2Zp{5(8#IHneuB?=3D~5HfQ(^bLNn& zId=u$bY;%u&zdt4dpj{QXMNEz6TexrZvJVrc0Yv6`QTUzdMv7z7}bZqxDVLfVZ}C* zY)Y}I(hiN~U#jdnp;Oa#Xo6IZr9UHiK)60-Qm}DRY}CZudZn3 z$=6c+%9>CtC7yi`oy7Ce4d~!&NthS%qI9yk0sg*D-)I1fKh5OtUy^LCN1tD2i+)ob z5&6zAXc|ZR?$9$9I+7FTA8Ph}cdCf@F`5lwp^d?U!~)|ci@?-(c#W2bq>cDwoqcyL zij?`W-HKv^42*8c`%di_A7bS^Kp#duc6UEUJ@ylZKopsK>@5w+8B{$s>wFoq?VF0R&YQ@ubS`@QKcVxy zU9s$S2Aoqad2Ks8r9+nnYkXhL=bQ^MALDh68?Y#7{gr-b&nEA7wMH17oSWIXQ5O{= z1$S93@@Z1+jn$Uu4D?3s(uflvRK-QPm*FXTyluCr{kZN zQqvP#2h+Wty;xwsh=!%SK#n^zKFYQ6_YY?Au+3qtS)BBJf*G+ zP#^EY#imF*qzV?R!X)(?XyIMB*a6Z$7o~p%E`~#T*4d*`lHm`lHM;k#oN$*RXSXjS?rY43yo+sHph+QI*E=i8-2kl|7g55kq6Cb|4s>&TXQ z2elSiiUl0&q|LCP_%If}c!R-S58o^-to5jn_D1|4`wILcrM({ijjdtPW3;quUrmbd z;Cc+>ile<+`(ku|)CKkpOM3(U6Ys-cCha@W8&HqXH-RD_{~Y!i=6;wI4RH2B0U5dy z9L@ym1i>|82WE2dgV;n;}DUd+l+b;_P2q;h&j8ZKGVUn z->LOT6b!$1?~&T+AKiP@fhqE>P$JX|>lL8z_t?jfOxwefAE4zOnaxU^3tFtcg07olPdl$vm8%wWLF6$0i6z}N+JK;0Mi8X$Z zpPfsGkw@7sNbFwODRad6 zVFr)Bs|*{<@dL?b)I|ni&kAG`d-%Y_DHfK$v(c%ez~qvmzr3A}?2b$J+(1#}P9GQ_ zk#b+&&b+HR_84@WTkMYf4hh65C4G_7>=Odzo|GB%r%WKHOkY2CuhE#O%9^8)^tEvI z8-e)Aq%d{$$G`niAeESBfHZ3iTQXl{jzcqPB3*qFD2W~lqIOqU_ObcVG0;mh`JXS2 za(cUAjdhUYNrqD7Wbl@3w1Y~pST78Yj)K1yezM~U@av0YFDE;G2MtAE43Zr$GA5A> zYCGP6YDisFXzPWt$WcBl+!vGg1x5vuXx0l|Bbyr?1@&XrhO+3(^{@|;^}R09DJP-) z@b~JO&Q!tQ3V;7CVMH6z6O>H>aUs0~4|lYuA*E^n*8Kd~?nd_14O`d&FqKZ&uPEzo zD5ZgtT01y81^#CENm;e+DeH^&l(nKGWz8}qV`Z)FKv|3Y%39ksGR{yIW+OP(R2KWf z*CSe&ca9J7VZYLKqHWHiRHwqkS_3gQv1K4&VxGDo9qYPjrEpa@Wz%wXQw@K%Zt96J z>!uL^>c&$DYP0@AP&eQ&1YvCo!Jzx>G(|ZK)5g$z{P1*Xkd>Ph{m2b)-?+OsX}>Mw z)XC_p7#{l_*~8Q6FzD}e2y{E0Od1JPZ3&&dgEynL=_#%bbovcFMP|@k%$+E)8_~wg zKs14%t7I0Bx`VZRbq>e7*+v=qCxr}eClQG{`Cv|Qa-&QBr zwSTLVz+c-d|3_P$y(lB!Rwr(uM8=;HfxnUwLPdhMbo51n**6CYGqgw1h<0n=5-5t& zCPfPfy*ZKE8veCu&t?f(Kkl6VkPVAEN?&bQG?QO1I*#@%I)cKD5XMm2uxKVqZCHpg z@Ml*IiBKCBwdDV=->`^(WYiex-M%N#FS3EgWpxpl?3@x@jmuDI`(9OzO{4*}$J9#x ze_=INZ-ewzH8zr8RimgftFanXt{NMOQq|Z(eqD{Ju^?16R+0a|z8W(D)L0#gVmAef zqu-!Tn?WRd6-2*6K;^dZ4|hCg4`}$0o$5V%K$w5?nXopS&kVYo&yk77JdbQ8c6w=S zUjr*3Y*9&Kst@Chn25PTMjcG-!p4XC>D>sq6t?sgN*|^*tZ7uw?lpm$#^acu;+Al-P z=*{rcon@Mr&$qMH9p%4kd0!+Cg+P_aH}+8``2ZG7>d60LFTv_>Bw~3!7cDiOi}vr5 zj5Sq7|HEEUs^NO_zh9bk>M_5BzX#5&MET6hL^ptH zvJQT(K{B2e3V1h}r1LXn+amzyW}*~O3j$`x0SziZBo{z^EfjKo+H=l>+nV>B$M0!s zu&rVmOZCOwwMblV^x(9$X+II@jXyry4N=`|A*M#M<~VG(&;x1q-qM}F_dt&^OLqEa z=kLEV?o$rgaUX;pFj76?_YD|WjrilneM(=C`{dW-ez`ed)Pc$k7|lfKalaS*dcde8 zLXZ38_YD{{)%ou_sNfm*Y1-Uo+$S(M?xWDTai27x$9?ku3#+lZH`3SRKKb>y-^Z-R zYEZdqY$QsL`{dWvnCc5ckNf2RudhaT+(%Jz<35P&xZm&pjd35v_^%rGNnSnfR~X|y z{JC+T0`#~Ke|9tz{q<<}?;2gzxQ~3Z<39Pb<3163+#irDS{?j)k-iarDw;=R>J@+M zg8U|)MBoWQD+!=fST@j5VKoSILQoG{7p;l>YC<3e!LKF+Rq$sg1obL_CIqb%KvOy% z_Xi_}nh-R=pPdl2P=J~clnrqM+zCM~sDIsrfLG2MkVSUoOjPDp&T7fOultZd6a4;_ zGpZr~${As8R?Zmw<5$jj<<9qz!2hkBVdAYX(z|>7{{LSO3H(>AoOMU#{81}so{2r( z9M~O9?Bjnmb~b1m6c0T1jE8+-o1FsU?8G|-@eyV4tBdRl2~@Sc0T^sKzhMC%$ygtK zhR005!4K~~3=YcB&{p?JKYLm*w-teJ^5IV8W_>=RG?<~&u&vk{u`7b!gAdddIA=P1 zM7DBw%-0sD-IK5I>yxid@c)C8uc8J~)ydat@~aaM4eWPMJT${^oO~72!KO~WR>JQF zWqyJ{wIJ=@!9vgBf>THVKe~qt8o=$*I z93dPR_{A^+YCu*qz^#2?8_OV0*E0AFK|Q7R0?rVun}=0fB3_i;lZSw40f8+*yrK%bE}MR{UncIHja7ZnRqk%RMPG=ueqIcPn04bI}+>N8#rhI2$i7aZkHt zR|ux?3c<&Eh2T<|S&2$78wzW`LT(;?6+|@%SOA|QsV6_5BFXHAhdmozzD}7Y5_B^} zIshF=8>y!UJN*W!Go$7rQ%Y>_U`b|25G^3ORY)iE^+8yw83rODooF)%F&xvIg?aJH zdid2v#n05pWW2myLs(#dm*+S8`az!G#7{694DSriKr8yYah~-bYz=0{?un&JNRv4T z3oAz)pUat=ZDuhZb)0IXMxeW^a-zXXc9L0QrQ(y3n7+~kF130k-Zf?j)O<7FSUp5y z4}+B_R!c2>2z-f=D)SzV&!%1A2af@`)&R+TGsgnF*#KFc#{q0IK$dhNz$Xomw#qZd z1ANs0x%el@SmHecg-hAOIwYW+Of%_BG45LFNxMk}#gAiH=BgSXrKhLPKD`-g_X`s&ayM10&4 zy11_SXI7$WHur(N9v>&;)z?6HGMCDfN7jGVh>#T|Gvi?=ooTOpr?96KxX(x0IN4>5+QL16$AT=;EH`MDqrpOtB4$$=#}dWTDv2h9 z(`|z)_!%r0O*N8eVi8Wz;oYG= zt1}Mq^K0+&O4V`xcqVrMy@F$`*baZzw>Z3Q|A?P{&{}+NY5IjVkPdQ>zz>HGm!{u+ zj+BnT@#QAkOFf(rM<3z7=H!HehzOmHbMQ~W6?DhruJra3JN1ZLH3fK+SZEH2BRArq z&Ix#v$oU{%g)1oO&|jc4eGt_uYpxHc1SMK9I9f6udvvxf3Pu&C2f^P;{tAp@TY}IR z8CXGoiKh}L8YuPP1*2n;2j*)&9N;Gm+YvEJS6}@J98;K}^z}sp6Xhc!pVw*3eHgc3 zY&tf@;N)y3Wg<_vlTGAjBQhsBITPE*h)g|i!48?ohIS&im9g6K$jF5uT|{ZZsxAfx zO7z>IZ6C$!m*BXP9)ibSj~{A31=Fz!wF&iN@?`61C}!HSW+Uo|(kz%3ZJL1ICyaWj zElfWPe*^g;SGqUkDswXRJRy!B0qg` zP0UG0K4?#wB&5DZz*BHQVSXCi^4b=;g?MYb^_ zbA`{(!~zp@j9lSIWFo0{BF9V_hf~hSI35|Pn`PrC#p)|t;jxblAvvG@(vh#*(S-;F zA4`gHaBLZ;!DBDQ4_n4bzuhuSD>409i@BLCri+sjlvly=(O0*}9Gwi~jKcKC@Hdg4 zEapfQtSa)W7PFJT>`Mm3e`(KRLdG=Tu$b?VpT4*%@q&!f_G*KK)E8;CV0mGJgwQvC>JJ4+c!wMVZKU?PL?#--yf>b6F-X}2&5ssVlFOe@cy58gD=zrB3&{ftY~kuBO`6rmZ9C&fy*g3U05 zjM)y)B)tZTZ4hsTGwrA&f7ZT+^Qf^a?2FPVxGJ`TF=3$_fP!m_;@2DI@DJ`GV|(wY zRX}fuK>V8v6Lkg_CTuiDhuHB3%GG>ZEOKx=?o07;+Y&f+@{{r((l)MxN^GjsJpI3KQcEjC*sgpey~- zZ`e8>J4(lOZ^(FnNgMV-#Z&{#ZbqtH!LO$y=d`CfQ>4KpQj1q4wj&m4u0P2SGLh@r zNisSgjE&SAewc~e(GG)04P7bERwqqrXrV})*WN~6T=Q?FBbT<56y|Ku?B%3gYLD;1 zW4GdmtM0qsUUmPlO7G_?Z9&>kdH7wM!)eW|Fjg?MLwVm3T=> zw$S-cCdEr|nNfHR;Qmi1#cH_BdP^2o?m=%g)Xk!i&r7lTgtvs7)MucDf?1k zTr27=WgjSvX1e<5{+lMIj_$vxFcw!G-LFz2awVyw`x@g)(lu{_xtbqumN5I4vRxI* zLaMiv%~n{3gj7fOHRj341alc3=+8)mZa_o%lp4#+kW2n^`V)EN@H`UYDRanDDzCG_`@&` zeX$azV+DOnBO?Oc!aZxSaz)Rul8HABkmJt;_^}_{!|Iaw&H%Yy_rO9?9=-^I#x?|RlA!z5OhCpDH(DDH4RP#BJ#VxE0^2k<2D!N5gZ6g8J-hfNq~~AX4Ht13$bZRhcwZ`xe>a>PpnvC{ zKzDrnhdcK?8vM#`cxW8j=_%A`@wJlBx$ra-A&mDOrMS`VkGTRZO=Z@|_+n$Oz%%o! zF<1E17{LF*)I1ZY#baPpHFsb-P-2{R;3262(}8`B)ChEo+s|O-Ve&GJ{38sI)wLSn zwtnz(jQqQ_1;gF4`M=a zkO6Yf{t&?V2FQha7$e{*e(({1%M6f9`Y6DQ{ovym=5I4VzDs=q;6nz;ie4{cp5n7e z&)~GDc_@fMfAJaQ;(HR{1FJ8|Zk`0VnfeppDWLvRd(fNGj2k!#-tpT#O@4*d9!HK#8)sou1=%%{21;g>x5KvzQ@MIqFbyEx`ece<} zv2DAl2atcBKdZaxwr8M$a^Dq0`9~QbH~%=m2?of;PgsSCDF(;_BmveMAakYw9%6vZ znGf(d17t-N06g6Qxk}Oi&oe;okc+Hz;xa#&0eFJ}(rh$S4Dc=kNJ;-mB4EmK}44&;8VEkG`8*Bpop`uHCpxX(Oiu5&-YIYb7wVDl>;g zHehD;H(&<;;0BD-U~L;PgML*R4Y*xZiM&C0KPDX|%A{oAoz^685aT6<*wC7-Ldy1$ z9)H)*U9K{0I@$yAxfzPytwtSlIuEgmzDSC0wbC~H9?sBhDx+>ewY43Zj6^wF99d)2 zWDWiB*P(h261f+((E&Al!{+CtSPLgNgwtbyREF>+yA9znB9y!*DQ?*wJR8Ef_nsck zksd>YNk7FYD1OddKAp9?c zp|7I0i->Pq+`kE}T!ybmjW z{?w5QEuc_RQI@}g`9BBmD3Rjy`Kw2YzfT+f*+BRWv$Mf|t%|~*O;Ay$wTUu?keV04 zJAEh4KJl}m&Pi?f-6C|8DSW9m$RgDn$HUqdVIZf!KlpEeBNfd7qOWpzyhV2Tp960R zzS2Yd{C;2+p)LPe2;mcxlfb@QML9#KkAITRn+1i+np?s9lgpo`*ZekX1EsZSz8w6@ znx27_mQq**21HeJ^Qhk|#G+btwU{AxK}{$s&kH-qaoG4ogXS0iUOk^2$F zv0ah)HOES%)9}wl$gX0!-4S&`o-POCF=O29a=4l6E~gUO$aXn(ApW2($BH5EPz}0H z*3o?q&h&nU?#KETKcO@4#Y>Z65P9^mIK0d9FZe#?sI5^oVRji2_J-0I*j%7vnXT`u`3M0US?YF!Rd`MWTo zH7F2$d^7M9ZUjt1Sl59mRD54j+=OSw0_*T0wa)J)#fG!N`~rDsifaN)Y-8f_g$c zNqdNn^Z6Hscx3BX>VIL#CKj$^K|KlV@d38W@MT=CZBK}Y*hIEX%+!-~hlKl9aPEm{ zRwZltqK69OHR-9(Wp*fXL-s|;D!8^GHv;|G4GHa|EIZW-%ictyztRuKF$rOv+!d$x zuUUvsV^7`ztv-de_GT!84prLk<7-O$ZorPf-_RRP!Uyl|>1eN8fi1WnzJ-Y|*zAL| z@V#e9dj^{B#uuar(z6PuHlrdwd@CuA*@(F3qcJ+~CPnw=0ufxqE&E^_->|2LK0o5WJZuQB2K2KLR*J|`6qk^?4@8-ByMn|hd|a7F$<(sL%v4iSJp`6 zwgp^1-pa4XFpRCCJ7<9()2G5Gk>~#r|GW;|k5k((K7|&DkE9h|EkjeDPl}zd!ZT*Y z&~e8^@^w`5^+8d11=yB?cmb~P8kpBccq-liaYEj&g&g>1QY^AUqVR1b&>xLETd^Ic zX38n}%dvJhoH8QGyIciRqX(<(ldvzjVtHH?o=3*LAFL(R1Kr>a@D$CB$p0`xSoCGz z&_#2N{aHA0-{qVf6|_i4haz&u7x`ub@#^- zuYHIU*Dpf2myz^9E$IXPe9RCl_7sMsYjD>T`T(CdjxWp?ou=f`m|=2x2)x{yKDe7Z z>p21EJWq!!ZbVM+!P6g2qIfPWcx!kT644vl+C*Y8_#dM<3B>Ubo}_;d;SscBaXQZQ zXSA3xI3-kkIZEmwI!?_K;z_#W5KrNLkJOu(w5JFj!jr%z5*-)LlYocKLv&nhPlzYA zO(Z<|cnD9@zlZoe_2bFMqj(STdkW`?({V|EkJOu(w5JFj!jr&1O?V2|G2zkm3M}G2 z2Uq+ZdY2Y>x?>Tycodp*#~~g;PsGQR?u9G<8nd-cOBzGz2Y67@nt|->eegriFLzJi zJ5cTWF^zNY6eexJz7(_%sz9{D_%{n*e^{ zsQqW$7vzDb7e3y#5-7#()x+z*;)kU8;Vnrx;_gNn@~pV%{iJvYR6kmzc9Xk8LsN)# z%w&`(uni^+>+pa!WmB=WwEKSTW>Ya3Ji@9!5`znUr9O1b_epWr-=*k(0nKaqrsM}e zO$3b!5VH`&Zp9ssSRKOi&kS@Guj9ezPcIINJ&IDyK|fXZp(LzdKEtu$* z%9@O+Ip0SGAMBapdnap#3|`$U#rIUP{bX>9!6|VZTx_Nco`L_z;H(p*hu@5A`X}s~ z60_cwg3>YZj{F^@@7@On8_QjxW2=C9q{Lwu3aSUABOg(H*qFAL1z;GJqnAx5u zcuC(B_bMelr0ECG(c7b?QMVC10lv_rl;}G|2Fn+v#Eo!$t7P!5r71D-Z1$_%-RTzMewskM90P_ z!xy40T!tT&9u(S&9@+YqeyA7At2;h`KOqL=gn_Kt>cW(G5Ke9vnoBz&`(k@!ykoBc zPZj*Ztz-6Yp5n-SJ|Ddp$PYTu^XuLnW39;I4uBEqe05u#cY`%$zmHq~Ao{3L=+wblZHYRjhDs@@;DqLyr` zrDa5*cA``}%^;{&qEsuX13;iQqEs8zF0s9cQY|b4#oFienu!`A%Q?N&fkt}OAhPK# zBSNRw>=G)y)IlmeD!N^cMpR8mwd@kT3N=*^BC-zWEuDumLL73U+t#QGgEM5gvm5kc zg8AQBeVttqYJv{F7#@2ON;5%guU)|AT#j|k!&RzBQmQj$xA2}muwY<8_)7$8MhGe5 zeG;+1!ay}fg2e_Fir9gOyh5eOjDu6LqkvtgFoz;A&G9t1O1vIf}v)qi5Sb}^Sp~d*v-YD;lpa!4hYH=olQQm=E zUK7;i)tFgcjp_1o`YmqyT&5W+buQLX-OrH@WrTp+X46ECLK+1tb_ehDG;mUW4No(R> z=;%3{UE#YEuDm8j@jr&ll?zq;6OK=bd*I6ZL}g$-a!mbMg}ee!@o69^<@4crjR?x~ z^fOZ85jcutjYs2jv)OuaN?Zz8J_t!Yv>dYn%nXP?p2N<#OO~a?OgPSS#9vb4 zSU3*Z{`{0U9ggxuvKK*-)>Zfk4w{ZB30%cHz!8%84qGkRozwumte^K=v6K2M#PUHn zmkAe0{VJO$wOguF;u+)``1PbcasE&OrOj?U2gc*}g*Kj}*mw@uyI~>&$AlT;?m`C+ z>g8%Bie2cym#Xa1w?Kq&=R<{}5R9GTRJUD`Ze`8ktDvEa@ztZxWg_JXnGWOtrj;oaGBlmWMK4cgurpg=s7qz0r$s;25HUZf8GI;3zDRDI% z{J1In5u1ORLsMcBTyhr~4AkZP+aI3w3+qzkAH3)!oV0;UuBD{;{`~5t=pMS`PJJF+ zuLmekwXsEeRe@bfQeqLDjlHVC=B2oWgkxfDx0HAb&b|WXJG2bvd*C?av&~Xsz%Ugu ze+(w~a2zsyyOj6~oP84XKMb?+g>d%qAsILd^YB~XY`Sm#YUh;Lax#b~k+dhD^wgA? z0%y+xTi@MrFAitl4%s}!52)}FsAszYNgqE89S)q09k#&h@N_|?+t^|IT_H0M!prND z5w|>lY|eqj*~v^7(Dt7$4c~Q)RVy9>d^?`Sn)Ndq{K2fCQdysB_4p| z1ZJ&BiHqS_i6-H`?k+HJn%lVw?f*J#qFzI@X{E+JD6{tn1n9k}6gC;Xgx(EH zVQb8N6<^?R++ExWmwE>+pbWPb2f?NKqgpQS6BM7qrN*K5eun2@3du*vw&;DAz@@fF z21mXS5ck5RT3}31!E-mIwjQZDPliS9l}KPM5||3&ay(0#szL()`*HqI3EZ9eK-G9l zEQQP425Pw)_gz}A!kUT6OQ6U3hCb$k$m(O(IiZ{muLY6S;qM7K7i}Y3aT`EnE3O*1 zep#V}HEhcQVa>smjPLydkE2g1LRS*n0hPBk=-F9zKN29i{fKDz25E=$zBzmM%;6j~{iHF!7J?j;4 zA$+|)ushOUOL;Vb%|n=RMBqEBb$ek&BD^Jpuc&~| z;lh2;BpOCwy$&us1Xl43dfhlO2$Nn)_QkSBO+lTDueS7cpF?izeB%T6Q)JFU?Y;C z&(`5(haLIzTF!F&WUSO+`u^jkDY5f=cnMWyxETlWbRe-54DA=5hkp-tL}mCOA7-8C zgg?fey2%$C)h*JBJ9QI_zAw8Ys))UZJM@i83c5)y80u`2=p7a5x8nFx!(iM8Z@|wL zpW&5Tb<*^^i_*c~P$R4IOmt>6N(To{O1a3#()0&5-xCYba0R_#omFRIIt^EVow-0W zZdgivbgZ-HVY+=sNEGZy+iq7Z35vi6I-KspOaiU=aTtPi z0(MIRXW{2%xZ-2;WU5l#TQyizq1`S?iH4yGQG80Cy$_~;skyc&UYa*BIu*h7Ae_A{ zY;;y)v7?oO*5-Axv7IE!4t7_dqNDm_ZHkCPteCSLY*+u;H5mGh)LG@R&#+qN0q^UI zAm=eKG$~$GJ)TR->lD5b37B9>&$ROZvNN&BmH{U+0oiJhbHexFor@9sF*EyBR*%?^ z$le1!OxcUbM*JP9<|DMETKsTcVRSLh-_@fu#TVsu5`k?8rbIm)lp{S#6xMl1VZ8bP z6WQ9gq1OvTQ1#JUVl>Q{|Txtt5d43 zg{rGTu&SfY;H#$~h+vOKiCTyty+4gKQ->?PPk{oeh|qfPx7f{@wW0Oy0bRXgW-Y1| zZ&vSjBOepgdN;AG-ZjWMX}wP}v)6j}fUe$!{VbL&>mYgY)L>coSSaFr)wn6W{Fl39 zAH|EYUSeBfZFZI7gtQ|6?GoV}K0t_T6iAP37S{v^Ig@-~mj{F4$QFK(KiXsOT8=#d z5@w5Fuh5n~vEmD&bac`l1iv@}{u^Y{A(1~(1%x??(z9fYMgKy9wEC_^H?f@P-z!ek zA&ZVb`!3v)S0WE&K0HLrtF<7o%ow6&)n)KwIWIzYWy268Przc#7i==%Tnf8$=)FpDW=xPMlfq)(yVK<@??=l}l>q5(vAw0U%(aTGc5#JO?N|GYT5C(Iu|T)+yY~Shj-WT;~vU{BxL@+z#?|H=VdzZ$uclmWHaW@H$X3fOHPpV7>Oh#;36I_Kg z6*#2hytqt=auqs3r5$-2`&7deh#D3}U1bG&wGXi{qohUM|2!K|c#aUG;nEdS7A#Xy z4&Yp-_r=XlC;Z&0U?d?rjqZc_`D{iVby({a%)UK?Fsa;vbz)3nR_XV$pVT*Qkt(q0Ha2o3vW=^o1Dd%N4dYKY=9MX|l;sTK{+i4BRBRF=3{Zh&>*=Q* zkyoXF!OT4q+>LPQM_9soWCycm37cFwTnPnkJF*g1f`IIJBH=P2P zeq8=5{HSqy@FVx=LO?&d&;^e!{2oGe<|k~H61$-f>~cGj`QIS0EZ zjGK7d#q+ zC2Y-yXGFZj)!?ItYP#T|n!xuu5*}F**1c%y{2`=3@z9i*isOtu_CUXawNuiB1yr<$P__qU7;w5+n?2Bya9>StK_=M@eJQ51wCt@+uT1r1FaV*GM4qspmes)`l6KNySJz8C`>$@Mi zkRc%6Ex{t*ToC9hE%F4qbyLB^srRH<7ICLP1-`61mU+fXNjFS#vqjc)49 z+>LH6{Q5?>0sicb?oO-RLQVho#1%FApCM^k~IN{K1F1N9Opj z)RS1e3@-+{QgKotg6lGo6MUGPCVjlON^w%{1n(Ujj-fV8tY6>mVX74q)3u{9x&_v? zqcK`6VVzR#?5Hxy)lRG&5}kLkTXHh};N9h+6L6>AK#ID%)ZQKbX836tB}&UEVhIRd zJ_)S^SqUnu*y)kG=25)U5_ zDWAO5m5jCWdiO9HuZh8k9Wr7QBV!JeF`Hn&mj|%=OiZg!V^KqW8uO^{WhG5ceK;-} z!;Ii%rB|C2_*{PMOH3e4tj{rdBD@AAzC|&HiSem)WTg*dEyRX(65?*f$(Hj}z6e)S zd%nz7M>$15yCD1v{?At!t>y*4%!Jn%7zs+Vu*d4TSy=2oz!#|`nH4P? z?I?mtNa`$9%(s!~c95hNe*3uq$}X&PahIQJQgLoZBa=0im*G$rT(C&mhoBc|q^OT;0cz>40kUrAoMy~+1a`7r5gTh_p(YQM3t_)mn#*=fW@hR|_f4Sx9i`)Z7C8$j?FdL!;7>Q(ed5na|igQ3NlHB5*r z6in3=yj`Z9X$DBEg~3Ld@BAHAra4K};N`M3awkqJF3_%380Yni%KI3&5W# zPO?i{0Olk^SGY>13M#$IO){!5Gf5N6C7Dv3)ai4QJ3!)*M)cC_d&b7V@H`kB9_saL zENDzSFkb}MqCz%K!?`Y;U<$5Bg;c8~ZbiDXrW0|w}|tq>E;Rmk3o6*We6=LqL&SYoY0^Hi!4yaLAq+H=BGcO+IT)!pkd#o{dU zMPzX_=&=tI%!zYuyW*_yrOM)%pev5^CB#{!c()?a-;hNtmIk>zPogU!Tl9czi_QU9 zD|ksIz|y{nkKD}kfjsUyCjo6SSzEw*ln>-C*|`YlrzY!LG8$Rx1DQ37nY1Wd4u!sj zw?_odf<-({R`Cu@9D%(a>8nizW6a_cEcZMlsgxEi9=yj$EL8Y%-_ag?J5F8H97sj9VZ+xZ5T zk1q`)-;ef0P}Jg9vz-bpBi+ZW63$zLo>r4O*T}mHM9u_uQHgk4%~XYIJ7*IxLDh}z zwj~}~QM`0B7>rvP7DI!y;uCyGW>^JvrWlP{3|2v_8$>-drCE6%1WsDrIjshj0b4oJ z;zp-IkCmHXu85bb_*p9#&V87W-lq9Q55>2j-Q=sgg%Am|Lh&G0vn{{WffV++khY_InIk5svub!%d|x;;j5 z>bj*&M<8wS7i8MY>K%HqC)za#Wa`ktgR519A>g3{2%LE>G3bK_H?)(viRCiCS#j$5 zEs_+0+56&{I9%{Y%t?mh5d9Hw!4)7b#S;fDaKVp3YwDVMG1r!#% zE6^kIF>azX$c<;ARpij?N*fd>_vj1JvCXgYg5eLX&O9#pIQzJrxQgzX{a>X(l90MW zz8y2cT$gyQV)b^3*DEwg3H*Q5eFu0QMY8V9oG>RzI!Cq~B-_Yx!dcjWF~%S=CJJmg zm?(k?Cdp(lV3ENjkug!^3}VS(gUERi!DNic(I9ro@%>d@JyUaJxa{70-`h9ecckgR ztE;Q4tE+2zdS+~>qCw*lk;|=JB;<5K9bXt5#0`spwqY6!8m7Vc5uRz71?gHZ2veQw zm2a;{f*Zm!U6aX@%a>=C)c_4f8}Pc2WB54nMX`R|fCy+CpuwO48Vnj>K^nNhb(sYt zJ)^;}XWkN-qCK-@Sq;-**sxuu;c=`djg|5h<1?|UOl$;VF9CTjz0NDcYp+4tN(y{l zNDdVe>??BOM3OlN-hY9h(+PbkHq4&|zTH&r<=Ak4T_kF6z~af9o}0cLI}eM3ye_jfOxIEpJx@33Ex_ymDL;kE?~d_u3z%LbAkF!en|o`d_XSf8GSgXL zdc9Cm2gn>|TG|L9A+b@$?Lx(al9jPPs%{~Y#j(NMs1DtzkDggZqcj*a%7W2GeJ|x# z(2c5n)-a7UN`pb8h6rVkMmaY^;#Xq*xrbK}Dg-B{`_k0In+giAgKJ13ogpBvky87a zH1V_%2#YRG{0&i+FCdp^qo6w%&B6d$Bdw0*@}q^6!M9@tma1OB(C+q|i@A#gUlJ>1 z9|PYeN)%!>J~`1=lNjNXpX{InMxjssu^R~*eZ2fodlTmvx6v$hL@wP96p-DS^@kb^ zN8O=98Xa|qYX;UIYA`zL<_kGrEcBArpCKScBxXqM1?^s_ITPvT=!i=NfrqnTMAx3! zcSP4340W9p(x|Rent|1|2BW$jDCFFR55!XI1Pm2H_TNQq?}!ayW86%}Jqypqymu=e ze+%=w?Zxh;UAhBCKAF{np@}2Jammu`* zph9PPgM41hp~P>v_@=9}`ty;%LZnZZ=S`GAhw*jfBH>8w4nhzOhGx(qq){_?SWt3w zK?tHjV+JfnE7fclZ~h?#ZQ#J-STG`v219YamGV4JgY{77deeiz-{(UiH6SEmY$z#eg-CjV< z=rThgn0GD|lso+#uPU>33Fse-CkoOpV0>IHq&!1ifVG2Wbhrgk%8ZXA0p2N;G!S@v zWa=7lhfGkOA{TfCC*LT-n?W$-N<4jppB)6w1x6)22>>y~PgdGI?2*-%k zX)v_9W+9CZg8c=J3<3?RLC{Gx+d*)J6pRc43r57zU?|SjQa(Be+69da0u8D`aHr5l z2EnJAfgJ=I3vc$WDvv!j0}P@0mDHs50<;3pur%(MRWu-gJ1~;!InZA41)RSa0>>5 z;Cz6ygfbii6&M723mOgr=O&}e3wb8E1p}a44T1(y2@is1O4vcrP6;~*x+q}>!9d~2 zy<>wf4Te@%E2PmuP$wws)4E;_szH#y5H;IDu!R(i3<3*A#L-|V&X!U>ItZEsWd>Fp z4XQyfOK4Yy>j{?eFVYO`Akbhq2(Htlb`WSV90W@=sT~9w31P!E6 zI|%l;*%(K35UeL?FbKB6AlP5P$RM~&s)!7N2L%iV0Uqvkei1Yn1gDmOW)OUiK@gLw zf6Qmapf-SDfJD1}ZZ}(!ECr4uHkZfLa zxyLJHUIzHFfK*|8k=H+SLT_AY-(nQTk=;XHoj(vUSPQB2A+OfYkHJif#PChsNvR@Q zy0MUBV#l7g-sw-FJ&n<8n=&ah*@Dy&{1DgkD803mrYia2x%I&(0`fy#$!j2DH>w@I zb4_*xM5w*UyxWS3b)hAz3LnYZ7AO+q)>(v@A9gg*o%A1_JFxia2gAd8{-$xVePS9XnnNSEp7zm zoGM!_0z8k8u8N_ z6hBQ@5v?Sny(Rpi6dXcLx7!*lm?qH5Xu*h#8VqIpM40lOnjnn-a#=EJP|YQsB%_^6 z8gHXIv57~EW5I|x8VtpmF6G&E2I6clC@a#=B^p$7$xcE$ktDFUgwGL>TWRMK4Tf{c zl|stG+POr7;au{BCbe^k2E)1JX(0{f622w;tf1U^_Li^)nSohqdR=Jw<`2x4$Ji19 zd5rQHxek-cKLusaM3)zDV6Se znvfvxo_-fOEkaK1Vn_ZKd|3p9BhS=e9ymo);$dE_q@LV>(M7EP;q~?_w}ii?#L`$5 zFR67?q7XAnYPFXjVVBezkqDO5T1<{vQtOsV*mUhk{6;_??ABXoFf{!igf!|ce$ouA z>1)uKK2*TkE|;!nZQCWaUIK>NJ{{T~q^*QVCu5Qyu0dK-y9kuy1ms2#cpNNaf`B}v zuoNi*6#iz+jH8U-#CG}!7_75q?gZQA1!cA%O;ewY5%55?2)CaKY3iE@h(5}a0PUoF zy9U~25~joQm#PkHKqBa{W|Lz&tWm0pbl40nl z=C@LC2({48n-+}Bn-+}7sKHRiAB1Ui-u!J@GHOs{q>#h83^Lkzv-S=%Y$D=VFd~iy zLve;k`KUM}1!YBAm1)q3!>e&)g%;Wi=gnO;TRU%RFq}6J5K>!qdWbBx&FJp_c@#wO!&=ICmP=Uk=DEZU!H87WtuEES5bJI_{tr+6kcBBxJ^J zLrySbBN0phEhfiI0QJH@G6Ae8ARB@8QyL5h-6}#F^;4^A26oVCFggKD6Y|Ieu&IDy zKgXc#nVK_A0OK1RXL|wJ+0q1%2jy%{NfSUtyCCPWF5iY8Yp)euUP_ZG>BZ`@%Oqqn zy2I~Jfg$P1PpaJ37WY4mPIPMCHpE!?iTlgVcuem^ByR+m6Sw^orXT@ zqy*Xd{kuBOz4w@2L={f_iuho5FRuy6p6JT>V7`2bfaHdK+6$h)63p7-gLy%qff9C4 z_=39)=OM(|E(ll8GAYC^2#gjRVFos^(O?+ZtfEP6V57k>usKAN+Q3GG zVPJE(kn%92z(!*94euq99EU9$mdVDunSjCE%67hOpb;Tx5m)Fqe4 z$1u0?!j0R`5eePWFBg>8@IdNhHzygcLP3l+zACP#guNZFc(x^G^pc&Zy*I?AA%@Ok6q!e;gF)U>sEMTCi%noSq@q)7Z z0;yBkCW^Tjh20`;#o;YD-9{N^3r_9TN;8d=u$pN>BG62`$uXMg6uuE}|FVD)&1f*x z%xgj#)yx~3fz^x#qni0t$RpnVO94Y~Pg`())SO9)v<2r^0RwMOTW}Kh85`zCu($se zp5AP7#V(2l$;K<-q0k@U>1iu#ye7tX+Gk2GJB$IbG@JT|0&)-!kUQ`*0Wm`uQ|Ct_ z_7Zdup@U-PX*>%eBE|g)c^dBkq2zI3XI2e{x;|J)StI0y%=FPk{ka|1jOdY~+G~)o z)5kSZAaY%7L5|bySg>G33Jr!*TrW(c)5ooXMy3x9ifg9p;wF;OP9G0R!CF#^ojxoW zk4Rjn)5pe(j44H?4+}=b(O@XfW>P*neasY;8Q4Lh zK_d=NA3F;zU9kt#$9bB8ojx=eP9IllQagQUFq}TBA2f|+vF!Ar!EpK*D5Pro=tGxQ zouoV`Oa86)TAY%5?@R7|v-=HicJF4b@HT-kVx9P2vL);;0i#pR%bIi_aiFi4lJZp3 zNY##uRr3%XB8_Kj3Z@!QP?iOx>31-MS6XNUWHX)=tIfPv0;blZJuTG8+k}({*L2xv zcAtQO;2a>nCMa*voe>+z<+B~8DsK3ivcWSiU{Ib(R~8g2%lJ%3Y$&&Cihz8>oLa@C zn+VFm;o3sFg@Al#lSunf19lLUy{5xFBM@tf?w0MVYg#u}#}%C;AUA&lY5pYw2I6z` z?-!IOzG>3@H+A`qr1>B8C{K6Wk`Eb8G1rY_{ki_30nbSYr^B9sePicpk-7!{Y*Sh~0)x<)PO?hHr*myB&Ji(kObNhi%;A zDtP|kDE#7c&GQfINbV47-x0AKKmTAswhsIJ!^T3%nnZBH&p&98f(*WusX>GxCfKlG z#E;Gpp43Odm5T;LKUx&hXs|I;(8$!I!64Y+i!YOwY>x8~q|w&(2xv`QgMo=_kWHK(#kXL@7&RCeqmyqEsd~ZC z++r(6Bt6CyKOx2;@e?LRv5qLLM)a5nIq;XbUF^X&6GX+q&iv(?L88P!}uh zMgar2l|39&cmtW{$+4OYDZBDfQ;tn@eylgg&bLb)tk%;cc799O0FY~Vx3mTp=2I!p z!rUM}^h*H)VVHDzVZc80X7Qn81q^*CiQ1&=Y8S413K*R)R+m-{C39^P(hUU+cRmr< z0|n*j_9_t|0tPel=|alQI#alwEnwIzGR$^Cmm>kriuGp0jDXfKH5eGC1_R$~LGG%+ zi%3Ng%dwOMhL&@?kd}B6L9MIgXQb~{U|{Y%J2jK>nAxd=PDwc&7vWQv@AHs{I-rM$cJTkj=o(b>|Bu&-zy1 z8VvNU!9d>@-5ZURQR9w#VYA>1QePZN-DW(DKpDnYput`M#f zFd%(cNLhe?2z#LKpugp{Z9Yu@NodyT!zP7M;weVt>A~9?{5Fc zaS~+ZTc0&Ox+f+`ynyw3d=msuyTr@l{21tEk~^9PLV4T-eHM%igd2sDy^$RV8Vm-4 z27`fM!N_v;?ZT6FWe0)=!+~&@kVXf>LO~<*tOkRD;2${`OYAqp+f>HO_z{@~N?@C; zS<9vbHb$Ebc*1oEDaD3^PYW3FoED5UK!afeo?B)EUJ^9oIW=e+z>mzdk&HGReDOKc ztr5p!!H75-48>V2<%1A_-*?g_C^N8*MT15hUX1uqXjdjJ*|qGNzZ0vG zHK`2;H5i726Evv}2Q?UmgDVMX5Ds!MvWB31852A*(ZyaY7&=6}FQ+geE38_{zx51eIM#xZ@uk6Fe6g47 zEhfPY>mN6p_4*4KxLKd>Qs!@gF;~aS_-(|o-j7+l{3`avzNZD$FJ3BKq13MZt7;XJNLe8_CUD@AXKptmoR&=-W zNI|&=iInbE9Vt4Mb%Pb&eTIp=vZ#(w0>_<8W?kKh-ti)YS4fqs(9O&JpJ$7?Ui zPE&;YU|ig6eHbbr$Fk$4x5f$>+=*b@Y80kCO$>`yaJ*!}$TYE?P)4Q+4F(3M!C;!O zV8pF83C~DJYB21`U4=9{P0ZE|Y)5J^=*Vh{Z0gCh%)C8cO0qge#m(KC2pEJTw+kt& zbA*uID`05+d=)|!j78tj+UPT)akhoP@!TLNhr%G`@wJtJtXx}uM*+jDTB>56pga^; zl+Ha)z(5)p(+gr5a4~N2B^VODt0TT@oUcCnODqbFHOXg--5H#b{e5|E=YfUL3C1Pr4wx?I{9BB1qu8Vt-) zgMm3(&`!^M$Iyb2rfM*3>Ku_N>Q@dBG~!h?7?>mX`td@}Iw;1?!w>TX40S*e=^{b7 zgYTAz^a%mkz&Ii$b!A^P9nb1IG(Lo{E+e2-mj(lMX)sWi1taRRU_@OS4AoUGGDX#u z7c`A+w`#x+4H{f?<5jG?YhN<0WCPwrhC#c4f$s2eSrqJ`g2%D_hDT% zlH~h|wVQK|#xdcL6Cc}K;~>pw1D zCh6CL@_0T`xc(#{Ux@_T8v2ScAHEtsU9>e;z`)_NS3gfsHmY;+c{1|qjkiH>_IC7z zLJ^s9HOOO@U*gk3<@h!ReF4ebxNn$rXF++2+Fp!!F9A6K2pV^! zCcQ*dc8q{w<7nc$O;BTZLVBNoJO~1=Z)>g>2Y6sF-! z$}i?^po)VR^CDqiV|SX+Q^(ua*qtXBSrcAk$M2lGNHFStdN~~(+-2R8!L2~kcsl-8 zz+j|j=yu&>n)E>lU^aQ(D2#o{BVx~62pIS{u4-RFIr4f`NFyNiL53EiPZ!eh5HtRC zyqe1|5|F$687UtDx%^u2a7%@hhtAXZq8!=L2m$MescmY#fWhrPC$`^F_kWi^d?@s9#=+SFk}e2x-J1EEq8e3q}k=gP}pJFHB1eqEj1$ zb9-nIM+?0+i1~tPgE&L5h(W9cvtA$>+mn{4X+L8qTq7U{9HZU->7gZH`Z9!fDd^}1 z#n&6=kId|kVWq+JP5uWjcnweObU-16F6g1EmIsOvs`o{tu@j zu1Cw`FT>INFcNp6-c*hXPXzn7A>B+A_j-Mjo53tPkSO21+V^3C`8&)5xBf0jG$2v2 zf?HOWL7n8@Jyg7zP(Y{Q z!^IZt1<*cRtg+zXVhhssZ}4#Ow!)IC4jwL!fc$WA3j42}orSiRYpTi6L&h5OC&p>a zW(J^zlZBSMmmW5b1KdQK&6Z0K8}nM`E`suSaoAhzArLQb2Cn!lL5HCdvLhxvUqBMd zcwEPuFbnVNnTkJ0;1}N*Z~cqK@Q%M#@r&>8y7Axf(E0J^CF&mk-~UW`x6kTseBRme zYQVMevcSocu%8;7`9O0qU{|Jsyk*uP_Nh_rsqp@vEEVdh|bD zHrWVVw;P1K13b;QLFTS0@TK@3NNuaJr&C~MZgHPBBV^s||l6iXctPdcbOTIN2AXAgHh*!{gclP z#XUBh)0-{nb(;4JJ&gu>ttNk3(}Ki=Ua!fVHE21nawfug;(W-Osn5|TwPzVQ$qm)* z=BM`@9K{OtSlW1^HVXDz#T%J!gT8g?ez)U}#C4R{CPVS8{-iAcoZYySgf)DG$d9trd6N^6^^Iq+tAiOv| zkiX&3hy=djz#pHPC-o8~J{7|spRpKOK=@4uO(@?+y;@`PO^4eBqo^|YrUNSEZ#n== zB`^c7f3~qM@jfEhNQv3kThrwDY*c4)DDU2jvAQU z7q-)dbNhPOeT6l;IkY1Sk|B^C@gUNmwT?(* z9x6-U46Z#~UM9*-e^}(vp6Os1StF?Gj#-s$tOe(=vD_Y*k47ypy-oD?b0Fgdqc+*k z>aHdj?PIW}(+)o7YeTo86V^nFP?02HKd3w1LurMJu zF?}EO9^px@Wg|&7V79+g}4&xxDN89U%>%!tNP7;hRV{NZD zqC)F1;Q1G!>stWT-7!4*2Bx|WoRb05wC5a&b35IAFT5xS3f?B2IM>(%{k2oB#=@@8 z2&MA)$;GI<9(B~+IXHO*RNF-L$;+gV6MDKD3e3-f%jdj2!|c}_*vhz9_;ZW!Pf;| zH-FvCu`m#e)e|jDJo5_1)v)sn18&aT_&6uI6e2qFAmS;@CH-Mg6V3-tO=sp(5HHj; z_6B~2Z#xbLK?f0h<__l1*f=dn$Y*ReP`vF`@`j273Ctg-nIRwzDf@96i;;M?uQe9x zV5X`@bl@a^L@VkcOWi5slMAV{NiON^IZ|LORcC#T1u0?=I=e-)md@5#D8xyc(p>!~ z--QgVB*TfrlD9&JP9p<%cK&F{W9z;_+$Fc)PD|~|*GjXJEl_s@O4gm#KY1Ynv1Z~j zDDBrlOKmu(>7$H3;@ydanKqKsVGhnQD0A@$zZGWCfODF<{4Z-U7LlMS%cm*2gA$1G ze2Vd$V_|2A?fgFA-GD^Ey9J4GN=ncu22yv)O3A0tNar|KG&iz=&TS)~6b;deN1$K} zl0n&C)>x?E7o|8mXrtiNsZhsz3a?wxKXol+*BI239)~7qESP0AXquF2g1TboqW}(? zzUnSrEsbvuM=*{H7a&s;vNP|CA{vyq@DWHoNSHpxOxH=@Rf2I`cpAWFXpQ2+Y!l+b zc1j>FG{IjtrEKt5dwl52R}<#ims^b568Q3Mg^(gH>&ti7g~gX2Bv{0kqeAiJ$@k$6 zT9B^0YIwQ^=e;j5D&udBVR1a=pr18Z@lzu8F=AVd;e&6vH%qW#71YB{ZhMr^3sbU= zx+{n04g>AFf>F3pckSrZ1+amW1>;EV?Ea}cU;`Q>8(0I0_aEm;h);!5f0{5Ry^w zv0(ZVsF9eji54ZdAA&J}R9*AHT7BvJe(1LtT0zc0mcC#Rvy>)>a z3tixS!czq`Wlv%3b&(AFjY#f@;gLU)&g=P;dkr|JOGp0XUNa@|$vw!uC**D;y8QO#&+fVYky`>C94xn@zTZaQ4M$$tA-lU=n7zPS4(@`s;?MWGBXZDXFVxQ+nMRebiM@R znejr5k0!K`XU0>ngauO~m>Ih$WoO3xUE$35mN3^dqs2(u!OZxR5YjlbJ|VHhbcpr| zy#>=VV*@I*Gvg-cvSy^K_Ux7X2Ip-!x1;M&DLW2z1eZD%edz2-lJm6MkIpRvIPlZ%yDZw5|&}=D=_?4WTJgDbyEuI zIxyB)u)d_hphdq+Y4Qj`i!>OtNP|{@%Z$YY#WZ=an4ccqfU(m(72?z2@b!(TW@e%e2 z#-G}H3YnUaeafluDH;@?G7NVp_71d5Y^a_aal4Y9I0y%+8if5 zwgyl)t#4{OOvoCutG*V~?#*Ikpn-e4L>Q8!*1cV&F$sBY6^w=q7IAoK`9Z;`JIflD zOVN!>jnT)G-$7qQFnm1ueK66O`FOHZb}B^|_le6)y@lrP_Z|t0w&Pc~)7aEv{MT6J z{`ILnOE7OG&Yhgu+r%s3?&ZyQhTiN@S5l+>wp(<{@5!T1&lM#GM_Go?nLc!y>=eORWt1miv9 zu&RT>wEBJ1XUufVLCK>K6m*b!wyE^CJdppi;KXQ;`O!ZY3NOj1vaI@z@{`9*pvnXo6?}|_0(06ZK4RUAqgtB=#^X@GPaOhvbJ3PfhivuJQj?Y z_#mNFgU89$qdC(ggBVpEn@_CLWEtoqGQ(@SVI#+QiiB2$AL&Mm-Xu0aXs&V(-a zk&3cZ(Qg&$<4Q2TM5No}?dXf(IM@$BFri*cm#ZkoH~4RWs@f=l%hl}NNOU1l<+_-P=%{J_h)Uv9R`|Ka z->`(R;*D5BSn3VIB1285>zCPbdB=HFK+J*!mS<~md6j<%Ot*0RXL=!V-zTOR{jJ)-9huo0 zyjBr#1p?P|t1>%**Pa4eURX|{&z{n46h6r2-Qp`&tnINsX9aBf2{sX}&G~1^CZei0 z9B-QmD4ze+2tba~Eq-gWX;Yl@27;2fb3A%2MM-CXv(3$UC^zmrivRY=Kju5$!~nMs9Jzt$C;Sw!Y)mJKm#^iBLZ10@y8nCE4C|#~X(>2ierYZgKr~ zQ<}1qBk)mHQx=Nk>^7Bs)WCR{ZJ7U}vcGr^D^9jF*`izA>b8)%i`9Z4n@-%~Eh>BX z%dygI|8HUGi)N_OrZaX@+4U1uwqbss%0A~nm2D*Nh3{C9)~Ma*AJL;>`>E{YEm%3T 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 z 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�@=P38sSB_ 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≧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