diff --git a/compiler/noirc_driver/src/lib.rs b/compiler/noirc_driver/src/lib.rs index 6c28a4e4af6..7c098e1a5d1 100644 --- a/compiler/noirc_driver/src/lib.rs +++ b/compiler/noirc_driver/src/lib.rs @@ -687,7 +687,6 @@ pub fn compile_no_check( force_compile: bool, ) -> Result { let force_unconstrained = options.force_brillig; - let experimental_ownership = options.unstable_features.contains(&UnstableFeature::Ownership); let program = if options.instrument_debug { monomorphize_debug( @@ -695,15 +694,9 @@ pub fn compile_no_check( &mut context.def_interner, &context.debug_instrumenter, force_unconstrained, - experimental_ownership, )? } else { - monomorphize( - main_function, - &mut context.def_interner, - force_unconstrained, - experimental_ownership, - )? + monomorphize(main_function, &mut context.def_interner, force_unconstrained)? }; if options.show_monomorphized { diff --git a/compiler/noirc_frontend/src/monomorphization/mod.rs b/compiler/noirc_frontend/src/monomorphization/mod.rs index 423ab6e472a..2b7f69336ea 100644 --- a/compiler/noirc_frontend/src/monomorphization/mod.rs +++ b/compiler/noirc_frontend/src/monomorphization/mod.rs @@ -138,15 +138,8 @@ pub fn monomorphize( main: node_interner::FuncId, interner: &mut NodeInterner, force_unconstrained: bool, - enable_ownership: bool, ) -> Result { - monomorphize_debug( - main, - interner, - &DebugInstrumenter::default(), - force_unconstrained, - enable_ownership, - ) + monomorphize_debug(main, interner, &DebugInstrumenter::default(), force_unconstrained) } pub fn monomorphize_debug( @@ -154,7 +147,6 @@ pub fn monomorphize_debug( interner: &mut NodeInterner, debug_instrumenter: &DebugInstrumenter, force_unconstrained: bool, - experimental_ownership: bool, ) -> Result { let debug_type_tracker = DebugTypeTracker::build_from_debug_instrumenter(debug_instrumenter); let mut monomorphizer = Monomorphizer::new(interner, debug_type_tracker); @@ -211,11 +203,7 @@ pub fn monomorphize_debug( debug_functions, debug_types, ); - Ok(program.handle_ownership( - monomorphizer.next_local_id, - monomorphizer.next_ident_id, - experimental_ownership, - )) + Ok(program.handle_ownership()) } impl<'interner> Monomorphizer<'interner> { diff --git a/compiler/noirc_frontend/src/ownership/last_uses.rs b/compiler/noirc_frontend/src/ownership/last_uses.rs index 810924c92ac..334c5ecca4e 100644 --- a/compiler/noirc_frontend/src/ownership/last_uses.rs +++ b/compiler/noirc_frontend/src/ownership/last_uses.rs @@ -428,46 +428,3 @@ impl LastUseContext { } } } - -#[cfg(test)] -mod test { - use crate::{ - monomorphization::ast::{IdentId, LocalId}, - test_utils::get_monomorphized, - }; - - #[test] - fn smoke_test() { - let src = " - fn main(d: [Field; 2]) { - if len(d) == 2 { // use 1 of d - if len(d) == 2 { // use 2 of d - assert(eq(d, [5, 6])); // use 3 of d - } - } else { - assert(eq(d, [5, 6])); // use 4 of d - } - } - - fn eq(lhs: [Field; 2], rhs: [Field; 2]) -> bool { - (lhs[0] == rhs[0]) & (lhs[1] == rhs[1]) - } - - fn len(arr: [Field; 2]) -> u32 { - 2 - } - "; - - let program = get_monomorphized(src, None, crate::test_utils::Expect::Success).unwrap(); - - let function = program.main(); - let last_uses = super::Context::find_last_uses_of_variables(function); - - let d_local_id = LocalId(0); - let d_last_uses = &last_uses[&d_local_id]; - - // We should improve testing of this pass so that it is more clear where these ids - // correspond to. - assert_eq!(*d_last_uses, &[IdentId(7), IdentId(10)]); - } -} diff --git a/compiler/noirc_frontend/src/ownership/mod.rs b/compiler/noirc_frontend/src/ownership/mod.rs index 4a5377ca455..2f09d4de9da 100644 --- a/compiler/noirc_frontend/src/ownership/mod.rs +++ b/compiler/noirc_frontend/src/ownership/mod.rs @@ -14,44 +14,8 @@ //! Arrays in brillig have copy on write semantics which relies on us incrementing their //! reference counts when they are shared in multiple places. Note that while Noir has references, //! arrays can also be shared by value and we want to avoid clones when possible. This pass -//! clones arrays (increments their reference counts) in the following situations: -//! - Function parameters: -//! - Any arrays behind a mutable reference `&mut [T; N]` will have their reference count -//! incremented iff there was already a prior array of the same type passed into the same -//! function. E.g. if there are two parameters of type `&mut [Field; 3]` we increment only -//! the later. If there are 3 we increment the last two. -//! - This applies within struct & tuple types as well. If a function only takes 1 struct -//! parameter but that struct contains 2 or more mutable references to the same array -//! type, we increment the reference count of each instance of the type after the first. -//! - In the case of references to nested arrays, only the outer array has its reference count incremented. -//! - Arrays taken by mutable value are always cloned, e.g. in `mut x: [u32; 3]`, `x` will -//! have its reference count incremented. -//! - Let bindings (`let _ = ;`): -//! - Binding an array to a let binding increments the reference count of the array unless -//! the expression is an array literal in which case it is considered to be moved. -//! - Assignments (`x = ;`): -//! - Similarly, assigning an array to an existing variable will also increment the reference -//! count of the array unless it is an array literal. -//! - Array literals: -//! - Arrays stored inside a nested array literal (e.g. both variables in `[array1, array2]` -//! have their reference count incremented). -//! - This does not apply to nested array literals since we know they are not referenced elsewhere. -//! - Extracting an array from another array (`let inner: [_; _] = array[0];`): -//! - Extracting a nested array from its outer array will always increment the reference count -//! of the nested array. -//! -//! Additionally we currently only decrement reference counts at the end of the function when -//! a parameter goes out of scope. These means reference counts likely trend upward over time -//! until the array is eventually mutated and it is reset back to 1. -//! -//! --------------------------------- EXPERIMENTAL OWNERSHIP RULES --------------------------------- -//! -//! This pass currently contains two sets of ownership rules. There is the current default set of -//! rules described above, and there is the set of rules enabled by `Context::experimental_ownership_feature`. -//! The experimental ownership rules aim to be less ad-hoc than the current rules with the goal of -//! making it easier for users to see where clones occur - and possibly forcing users to write -//! their own clones manually. These rules treat each variable roughly as a variable in Rust which -//! implements `Copy`: +//! clones arrays (increments their reference counts) in the following situations which roughly +//! correspond to where a `Copy` variable in Rust would be copied: //! - Variables are copied on each use, except for the last use where they are moved. //! - If a variable's last use is in a loop that it was not defined in, it is copied instead of moved. //! - The last use analysis isn't sophisticated on struct fields. It will count `a.b` and `a.c` @@ -73,30 +37,19 @@ use crate::{ ast::UnaryOp, monomorphization::ast::{ - Definition, Expression, Function, Ident, IdentId, LValue, Let, Literal, LocalId, - Parameters, Program, Type, Unary, + Definition, Expression, Function, Ident, IdentId, LValue, Literal, LocalId, Program, Type, + Unary, }, }; use fxhash::FxHashMap as HashMap; -use fxhash::FxHashSet as HashSet; -use noirc_errors::Location; mod last_uses; +mod tests; impl Program { - pub(crate) fn handle_ownership( - mut self, - next_local_id: u32, - next_ident_id: u32, - experimental_ownership_feature: bool, - ) -> Self { - let mut context = Context { - experimental_ownership_feature, - next_ident_id, - next_local_id, - variables_to_move: Default::default(), - }; + pub(crate) fn handle_ownership(mut self) -> Self { + let mut context = Context { variables_to_move: Default::default() }; for function in self.functions.iter_mut() { context.handle_ownership_in_function(function); @@ -106,29 +59,11 @@ impl Program { } struct Context { - experimental_ownership_feature: bool, - - /// If `experimental_ownership_feature` is enabled, this contains each instance of a variable - /// we should move instead of cloning. + /// This contains each instance of a variable we should move instead of cloning. variables_to_move: HashMap>, - - next_ident_id: u32, - next_local_id: u32, } impl Context { - fn next_ident_id(&mut self) -> IdentId { - let id = self.next_ident_id; - self.next_ident_id += 1; - IdentId(id) - } - - fn next_local_id(&mut self) -> LocalId { - let id = self.next_local_id; - self.next_local_id += 1; - LocalId(id) - } - fn should_move(&self, definition: LocalId, variable: IdentId) -> bool { self.variables_to_move .get(&definition) @@ -140,211 +75,10 @@ impl Context { return; } - if self.experimental_ownership_feature { - self.variables_to_move = Self::find_last_uses_of_variables(function); - } - + self.variables_to_move = Self::find_last_uses_of_variables(function); self.handle_expression(&mut function.body); - - if !self.experimental_ownership_feature { - let new_bindings = self.collect_parameters_to_clone(&function.parameters); - - // Prepend new_bindings to the function body and insert drops for them at the end. - if !new_bindings.is_empty() { - let unit = Expression::Literal(Literal::Unit); - let old_body = std::mem::replace(&mut function.body, unit); - - // Store anything we want to clone in let bindings first so when we later drop - // them we know we're dropping the same instance rather than a fresh copy. - let (mut new_body, new_idents) = self.create_let_bindings(new_bindings); - - // Now push the clones for each parameter - for new_ident in &new_idents { - new_body.push(Expression::Clone(Box::new(new_ident.clone()))); - } - - // Insert a `let` for the returned value so we can insert drops after it - let return_id = self.next_local_id(); - let return_let = Expression::Let(Let { - id: return_id, - mutable: false, - name: "return".to_string(), - expression: Box::new(old_body), - }); - - new_body.push(return_let); - - // Now drop each parameter we cloned - for new_ident in new_idents { - new_body.push(Expression::Drop(Box::new(new_ident))); - } - - // Finally, return the original return value we held on to - new_body.push(Expression::Ident(Ident { - location: None, - definition: Definition::Local(return_id), - mutable: false, - name: "return".to_string(), - typ: function.return_type.clone(), - id: self.next_ident_id(), - })); - - function.body = Expression::Block(new_body); - } - } - } - - fn create_let_bindings( - &mut self, - bindings_to_create: Vec<(String, Type, Expression)>, - ) -> (Vec, Vec) { - let mut bindings = Vec::with_capacity(bindings_to_create.len()); - let mut idents = Vec::with_capacity(bindings_to_create.len()); - - for (name, typ, expression) in bindings_to_create { - let id = self.next_local_id(); - let expression = Box::new(expression); - bindings.push(Expression::Let(Let { - id, - mutable: false, - name: String::new(), - expression, - })); - - idents.push(Expression::Ident(Ident { - location: None, - definition: Definition::Local(id), - mutable: false, - name, - typ, - id: self.next_ident_id(), - })); - } - - (bindings, idents) } - /// Returns a vector of new parameters to prepend clones to a function - if any. - /// Note that these may be full expressions e.g. `*param.field` so they should - /// be stored in a let binding before being cloned to ensure that a later drop - /// would be to the same value. - fn collect_parameters_to_clone( - &mut self, - parameters: &Parameters, - ) -> Vec<(String, Type, Expression)> { - let mut seen_array_types = HashSet::default(); - let mut new_bindings = Vec::new(); - - for (parameter_id, mutable, name, parameter_type) in parameters { - let parameter = Expression::Ident(Ident { - location: None, - definition: Definition::Local(*parameter_id), - mutable: *mutable, - name: name.clone(), - typ: parameter_type.clone(), - id: self.next_ident_id(), - }); - - // (by-value) Mutable parameters are always cloned. Otherwise, we have to recur on the type - // to find a duplicate array types behind mutable references. - let parameter = if *mutable { - let name = name.clone(); - new_bindings.push((name, parameter_type.clone(), parameter)); - // disable cloning in recur_on_parameter, we already cloned - None - } else { - Some(parameter) - }; - - recur_on_parameter( - parameter, - parameter_type, - name, - &mut seen_array_types, - &mut new_bindings, - false, - ); - } - - new_bindings - } -} - -/// Recur on a parameter's type, digging into any struct fields, looking for references to arrays. -/// This will build up an Expression of the current parameter access we're doing, e.g. `*foo.bar` -/// would correspond to a parameter `foo` with struct field `bar` that is a reference to an array. -/// -/// This function inserts a .clone() expression to any parameter arrays behind references with -/// repeated types since these may potentially be aliased by other parameters. -/// -/// If `parameter` is `None` we'll still traverse the type to find any array types mentioned but we -/// will not issue any clones. This is required e.g. on a mutable by-value parameter like `mut x: ...` -/// since `x` may contain arrays internally that we'll need to remember in case there is another -/// parameter which uses them. E.g. `mut x: [Field; 2], y: &mut [Field; 2]`. -fn recur_on_parameter<'typ>( - parameter: Option, - parameter_type: &'typ Type, - parameter_name: &str, - seen_array_types: &mut HashSet<&'typ Type>, - new_bindings: &mut Vec<(String, Type, Expression)>, - passed_reference: bool, -) { - match parameter_type { - // These types never contain arrays - Type::Field | Type::Integer(..) | Type::Bool | Type::Unit | Type::Function(..) => (), - - Type::Array(..) | Type::Slice(_) | Type::String(_) | Type::FmtString(..) => { - // If we've already seen this type and this is behind a reference - if !seen_array_types.insert(parameter_type) && passed_reference { - if let Some(parameter) = parameter { - new_bindings.push(( - parameter_name.to_string(), - parameter_type.clone(), - parameter, - )); - } - } - - // Don't recur on the element type here, we rely on the reference count to already be - // incremented in the nested array case when the nested array is created. - } - - Type::Tuple(fields) => { - for (i, field) in fields.iter().enumerate() { - let expr = parameter.clone().map(|p| Expression::ExtractTupleField(Box::new(p), i)); - recur_on_parameter( - expr, - field, - parameter_name, - seen_array_types, - new_bindings, - passed_reference, - ); - } - } - - Type::Reference(element_type, _mutable) => { - let expr = parameter.map(|parameter| { - Expression::Unary(Unary { - operator: UnaryOp::Dereference { implicitly_added: true }, - rhs: Box::new(parameter.clone()), - result_type: element_type.as_ref().clone(), - location: Location::dummy(), // TODO - }) - }); - recur_on_parameter( - expr, - element_type, - parameter_name, - seen_array_types, - new_bindings, - true, - ); - } - } -} - -impl Context { fn handle_expression(&mut self, expr: &mut Expression) { match expr { Expression::Ident(_) => self.handle_ident(expr), @@ -378,8 +112,10 @@ impl Context { } /// Handle the rhs of a `&expr` unary expression. - /// When the experimental ownership flag is enabled variables and field accesses - /// in these expressions are exempt from clones. + /// Variables and field accesses in these expressions are exempt from clones. + /// + /// Note that this also matches on dereference operations to exempt their LHS from clones, + /// but their LHS is always exempt from clones so this is unchanged. fn handle_reference_expression(&mut self, expr: &mut Expression) { match expr { Expression::Ident(_) => (), @@ -409,13 +145,8 @@ impl Context { panic!("handle_extract_expression given non-extract expression {expr}"); }; - if !self.experimental_ownership_feature { - return self.handle_expression(tuple); - } - - // When experimental ownership is enabled, we may clone identifiers. We want to avoid - // cloning the entire object though if we're only accessing one field of it so we check - // here to move the clone to the outermost extract expression instead. + // We want to avoid cloning the entire object if we're only accessing one field of it + // so we check here to move the clone to the outermost extract expression instead. // E.g. we want to change `a.clone().b.c` to `a.b.c.clone()`. if let Some((should_clone, tuple_type)) = self.handle_extract_expression_rec(tuple) { if let Some(elements) = unwrap_tuple_type(tuple_type) { @@ -456,15 +187,11 @@ impl Context { } } - /// Under the experimental alternate ownership scheme, whenever an ident is used it is - /// always cloned unless it is the last use of the ident (not in a loop). + /// Whenever an ident is used it is always cloned unless it is the last use of the ident (not in a loop). fn should_clone_ident(&self, ident: &Ident) -> bool { - if self.experimental_ownership_feature { - if let Definition::Local(local_id) = &ident.definition { - if contains_array_or_str_type(&ident.typ) && !self.should_move(*local_id, ident.id) - { - return true; - } + if let Definition::Local(local_id) = &ident.definition { + if contains_array_or_str_type(&ident.typ) && !self.should_move(*local_id, ident.id) { + return true; } } false @@ -481,10 +208,6 @@ impl Context { } } - /// - Array literals: - /// - Arrays stored inside a nested array literal (e.g. both variables in `[array1, array2]` - /// have their reference count incremented). - /// - This does not apply to nested array literals since we know they are not referenced elsewhere. fn handle_literal(&mut self, literal: &mut Literal) { match literal { Literal::Integer(..) | Literal::Bool(_) | Literal::Unit | Literal::Str(_) => (), @@ -492,19 +215,8 @@ impl Context { Literal::FmtStr(_, _, captures) => self.handle_expression(captures), Literal::Array(array) | Literal::Slice(array) => { - let element_type = array - .typ - .array_element_type() - .expect("Array literal should have an array type"); - - if !self.experimental_ownership_feature && contains_array_or_str_type(element_type) - { - // We have to clone nested arrays unless they are array literals - for element in array.contents.iter_mut() { - if !is_array_or_str_literal(element) { - clone_expr(element); - } - } + for element in array.contents.iter_mut() { + self.handle_expression(element); } } } @@ -519,16 +231,13 @@ impl Context { // Don't clone `rhs` if this is a reference or dereference expression. // - If this is a reference expression `&rhs`, `rhs` by definition shouldn't be cloned // - If this is `*rhs` we're going to clone the extracted element instead - if self.experimental_ownership_feature - && matches!(unary.operator, UnaryOp::Reference { .. } | UnaryOp::Dereference { .. }) - { + if matches!(unary.operator, UnaryOp::Reference { .. } | UnaryOp::Dereference { .. }) { self.handle_reference_expression(&mut unary.rhs); } else { self.handle_expression(&mut unary.rhs); } - if self.experimental_ownership_feature - && matches!(unary.operator, UnaryOp::Dereference { .. }) + if matches!(unary.operator, UnaryOp::Dereference { .. }) && contains_array_or_str_type(&unary.result_type) { clone_expr(expr); @@ -540,21 +249,13 @@ impl Context { self.handle_expression(&mut binary.rhs); } - /// - Extracting an array from another array (`let inner: [_; _] = array[0];`): - /// - Extracting a nested array from its outer array will always increment the reference count - /// of the nested array. fn handle_index(&mut self, index_expr: &mut Expression) { let crate::monomorphization::ast::Expression::Index(index) = index_expr else { panic!("handle_index should only be called with Index nodes"); }; - if self.experimental_ownership_feature { - // Don't clone the collection, cloning only the resulting element is cheaper - self.handle_reference_expression(&mut index.collection); - } else { - self.handle_expression(&mut index.collection); - } - + // Don't clone the collection, cloning only the resulting element is cheaper. + self.handle_reference_expression(&mut index.collection); self.handle_expression(&mut index.index); if contains_array_or_str_type(&index.element_type) { @@ -608,15 +309,8 @@ impl Context { } } - /// - Let bindings (`let _ = ;`): - /// - Binding an array to a let binding increments the reference count of the array unless - /// the expression is an array literal in which case it is considered to be moved. fn handle_let(&mut self, let_expr: &mut crate::monomorphization::ast::Let) { self.handle_expression(&mut let_expr.expression); - - if !self.experimental_ownership_feature && !is_array_or_str_literal(&let_expr.expression) { - clone_expr(&mut let_expr.expression); - } } fn handle_constrain( @@ -631,20 +325,15 @@ impl Context { } } - /// - Assignments (`x = ;`): - /// - Assigning an array to an existing variable will also increment the reference - /// count of the array unless it is an array literal. fn handle_assign(&mut self, assign: &mut crate::monomorphization::ast::Assign) { self.handle_lvalue(&mut assign.lvalue); self.handle_expression(&mut assign.expression); - - if !self.experimental_ownership_feature && !is_array_or_str_literal(&assign.expression) { - clone_expr(&mut assign.expression); - } } fn handle_lvalue(&mut self, lvalue: &mut LValue) { match lvalue { + // A variable can never be moved into an LValue position so it doesn't + // need to be cloned or checked here. LValue::Ident(_) => (), LValue::Index { array, index, element_type: _, location: _ } => { self.handle_expression(index); @@ -669,45 +358,6 @@ fn clone_expr(expr: &mut Expression) { *expr = Expression::Clone(Box::new(old_expr)); } -fn is_array_or_str_literal(expr: &Expression) -> bool { - match expr { - Expression::Literal(literal) => match literal { - Literal::Integer(..) | Literal::Bool(_) | Literal::Unit => false, - - Literal::Array(_) | Literal::Slice(_) | Literal::Str(_) | Literal::FmtStr(..) => true, - }, - Expression::Block(exprs) => { - if let Some(expr) = exprs.last() { - is_array_or_str_literal(expr) - } else { - false - } - } - - Expression::Unary(_) - | Expression::Ident(_) - | Expression::Binary(_) - | Expression::Index(_) - | Expression::Cast(_) - | Expression::For(_) - | Expression::Loop(_) - | Expression::While(_) - | Expression::If(_) - | Expression::Match(_) - | Expression::Tuple(_) - | Expression::ExtractTupleField(_, _) - | Expression::Call(_) - | Expression::Let(_) - | Expression::Constrain(..) - | Expression::Assign(_) - | Expression::Semi(_) - | Expression::Clone(_) - | Expression::Drop(_) - | Expression::Break - | Expression::Continue => false, - } -} - fn contains_array_or_str_type(typ: &Type) -> bool { match typ { Type::Field diff --git a/compiler/noirc_frontend/src/ownership/tests.rs b/compiler/noirc_frontend/src/ownership/tests.rs new file mode 100644 index 00000000000..1ba46e81053 --- /dev/null +++ b/compiler/noirc_frontend/src/ownership/tests.rs @@ -0,0 +1,115 @@ +#![cfg(test)] +//! The easiest way to test this pass is a bit indirect. We have to run +//! ownership in its entirety and look at where the clones are inserted. +//! Testing e.g. the last_use pass directly is difficult since it returns +//! sets of IdentIds which can't be matched to the source code easily. + +use crate::test_utils::get_monomorphized_no_emit_test; + +#[test] +fn last_use_in_if_branches() { + let src = " + unconstrained fn main(d: [Field; 2]) { + if len(d) == 2 { // use 1 of d + if len(d) == 2 { // use 2 of d + assert(eq(d, [5, 6])); // use 3 of d + } + } else { + assert(eq(d, [5, 6])); // use 4 of d + } + } + + fn eq(lhs: [Field; 2], rhs: [Field; 2]) -> bool { + (lhs[0] == rhs[0]) & (lhs[1] == rhs[1]) + } + + fn len(arr: [Field; 2]) -> u32 { + 2 + } + "; + + let program = get_monomorphized_no_emit_test(src).unwrap(); + insta::assert_snapshot!(program, @r" + unconstrained fn main$f0(d$l0: [Field; 2]) -> () { + if (len$f1(d$l0.clone()) == 2) { + if (len$f1(d$l0.clone()) == 2) { + constrain eq$f2(d$l0, [5, 6]); + } + } else { + constrain eq$f2(d$l0, [5, 6]); + } + } + unconstrained fn len$f1(arr$l1: [Field; 2]) -> u32 { + 2 + } + unconstrained fn eq$f2(lhs$l2: [Field; 2], rhs$l3: [Field; 2]) -> bool { + ((lhs$l2[0] == rhs$l3[0]) & (lhs$l2[1] == rhs$l3[1])) + } + "); +} + +#[test] +fn does_not_move_into_loop() { + let src = " + unconstrained fn main(param: [Field; 2]) { + let local1 = [0]; + let local2 = [1]; + loop { + use_var(param); + use_var(local1); + use_var(local2); + break; + } + use_var(local2); + } + + fn use_var(_x: T) {} + "; + + let program = get_monomorphized_no_emit_test(src).unwrap(); + insta::assert_snapshot!(program, @r" + unconstrained fn main$f0(param$l0: [Field; 2]) -> () { + let local1$l1 = [0]; + let local2$l2 = [1]; + loop { + use_var$f1(param$l0.clone());; + use_var$f2(local1$l1.clone());; + use_var$f2(local2$l2.clone());; + break + }; + use_var$f2(local2$l2); + } + unconstrained fn use_var$f1(_x$l3: [Field; 2]) -> () { + } + unconstrained fn use_var$f2(_x$l4: [Field; 1]) -> () { + } + "); +} + +#[test] +fn can_move_within_loop() { + let src = " + unconstrained fn main() { + for _ in 0 .. 10 { + let x = [1, 2]; + use_var(x); + use_var(x); + } + } + + fn use_var(_x: T) {} + "; + + let program = get_monomorphized_no_emit_test(src).unwrap(); + insta::assert_snapshot!(program, @r" + unconstrained fn main$f0() -> () { + for _$l0 in 0 .. 10 { + let x$l1 = [1, 2]; + use_var$f1(x$l1.clone());; + use_var$f1(x$l1); + } + } + unconstrained fn use_var$f1(_x$l2: [Field; 2]) -> () { + } + "); +} diff --git a/compiler/noirc_frontend/src/test_utils.rs b/compiler/noirc_frontend/src/test_utils.rs index 2baceffc24e..479c951675a 100644 --- a/compiler/noirc_frontend/src/test_utils.rs +++ b/compiler/noirc_frontend/src/test_utils.rs @@ -27,6 +27,10 @@ use fm::FileManager; use crate::monomorphization::{ast::Program, errors::MonomorphizationError, monomorphize}; +pub fn get_monomorphized_no_emit_test(src: &str) -> Result { + get_monomorphized(src, None, Expect::Success) +} + pub fn get_monomorphized( src: &str, test_path: Option<&str>, @@ -42,7 +46,7 @@ pub fn get_monomorphized( .get_main_function(context.root_crate_id()) .unwrap_or_else(|| panic!("get_monomorphized: test program contains no 'main' function")); - monomorphize(main, &mut context.def_interner, false, false) + monomorphize(main, &mut context.def_interner, false) } pub(crate) fn has_parser_error(errors: &[CompilationError]) -> bool { diff --git a/compiler/noirc_frontend/src/tests.rs b/compiler/noirc_frontend/src/tests.rs index 635caa64a39..50d8da4d7e6 100644 --- a/compiler/noirc_frontend/src/tests.rs +++ b/compiler/noirc_frontend/src/tests.rs @@ -181,13 +181,7 @@ fn check_errors_with_options( panic!("get_monomorphized: test program contains no 'main' function") }); - let ownership = options.enabled_unstable_features.contains(&UnstableFeature::Ownership); - let result = crate::monomorphization::monomorphize( - main, - &mut context.def_interner, - false, - ownership, - ); + let result = crate::monomorphization::monomorphize(main, &mut context.def_interner, false); match result { Ok(_) => { if primary_spans_with_errors.is_empty() { diff --git a/test_programs/execution_success/reference_counts_inliner_0/src/main.nr b/test_programs/execution_success/reference_counts_inliner_0/src/main.nr index a4dd03f4586..e493302d237 100644 --- a/test_programs/execution_success/reference_counts_inliner_0/src/main.nr +++ b/test_programs/execution_success/reference_counts_inliner_0/src/main.nr @@ -2,7 +2,7 @@ use std::mem::array_refcount; fn main() { let mut array = [0, 1, 2]; - assert_refcount(array, 1); + assert_refcount(array, 1, true); borrow(array, array_refcount(array)); borrow_mut(&mut array, array_refcount(array)); @@ -20,14 +20,12 @@ fn main() { } fn borrow(array: [Field; 3], rc_before_call: u32) { - assert_refcount(array, rc_before_call); + assert_refcount(array, rc_before_call, true); println(array[0]); } fn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) { - // Optimization: inc_rc isn't needed since there is only one array (`array`) - // of the same type that `array` can be modified through - assert_refcount(*array, rc_before_call + 0); + assert_refcount(*array, rc_before_call, true); array[0] = 3; println(array[0]); } @@ -35,17 +33,15 @@ fn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) { // Returning a copy of the array, otherwise the SSA can end up optimizing away // the `array_set`, with the whole body just becoming basically `println(4);`. fn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] { - assert_refcount(array, rc_before_call + 1); + assert_refcount(array, rc_before_call, true); array[0] = 4; println(array[0]); array } -/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although -/// only one is needed to bring the rc from 1 to 2. fn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) { - assert_refcount(*array1, rc_before_call + 1); - assert_refcount(*array2, rc_before_call + 1); + assert_refcount(*array1, rc_before_call, true); + assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference array1[0] = 5; array2[0] = 6; println(array1[0]); // array1 & 2 alias, so this should also print 6 @@ -60,17 +56,21 @@ fn borrow_mut_two_separate( rc_before_call1: u32, rc_before_call2: u32, ) { - assert_refcount(*array1, rc_before_call1 + 0); - assert_refcount(*array2, rc_before_call2 + 0); + assert_refcount(*array1, rc_before_call1, true); + assert_refcount(*array2, rc_before_call2, true); array1[0] = 7; array2[0] = 8; println(array1[0]); println(array2[0]); } -fn assert_refcount(array: [T; 3], expected: u32) { +fn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) { let count = array_refcount(array); + if expect_copy { + expected += 1; + } + // All ref counts are zero when running this as a constrained program if std::runtime::is_unconstrained() { if count != expected { @@ -87,9 +87,12 @@ fn regression_7297() { let mut array = [0, 1, 2]; let refcount_0 = array_refcount(array); + + // This is currently copying the array due to the inc_rc in the array_refcount call above borrow_mut_two(&mut array, &mut array, refcount_0); + let refcount_1 = array_refcount(array); - let array_2 = copy_mut(array, refcount_1); + let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line let refcount_2 = array_refcount(array); // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident. @@ -107,7 +110,16 @@ fn regression_7297() { refcount_1 != 0, "borrow_mut_two should create a fresh array and not decrease its RC", ); - assert_eq(refcount_1, 1, "borrow_mut_two should create a fresh array with an RC of 1"); - assert_eq(refcount_2, refcount_1); + assert_eq( + refcount_1, + 2, + "There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)", + ); + + assert_eq( + refcount_2, + refcount_1 + 3, + "after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut", + ); } } diff --git a/test_programs/execution_success/reference_counts_inliner_max/src/main.nr b/test_programs/execution_success/reference_counts_inliner_max/src/main.nr index 501370587f3..99609118b2a 100644 --- a/test_programs/execution_success/reference_counts_inliner_max/src/main.nr +++ b/test_programs/execution_success/reference_counts_inliner_max/src/main.nr @@ -2,7 +2,7 @@ use std::mem::array_refcount; fn main() { let mut array = [0, 1, 2]; - assert_refcount(array, 1); + assert_refcount(array, 1, true); borrow(array, array_refcount(array)); borrow_mut(&mut array, array_refcount(array)); @@ -20,14 +20,12 @@ fn main() { } fn borrow(array: [Field; 3], rc_before_call: u32) { - assert_refcount(array, rc_before_call); + assert_refcount(array, rc_before_call, true); println(array[0]); } fn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) { - // Optimization: inc_rc isn't needed since there is only one array (`array`) - // of the same type that `array` can be modified through - assert_refcount(*array, rc_before_call + 0); + assert_refcount(*array, rc_before_call, true); array[0] = 3; println(array[0]); } @@ -35,17 +33,15 @@ fn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) { // Returning a copy of the array, otherwise the SSA can end up optimizing away // the `array_set`, with the whole body just becoming basically `println(4);`. fn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] { - assert_refcount(array, rc_before_call + 1); + assert_refcount(array, rc_before_call, true); array[0] = 4; println(array[0]); array } -/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although -/// only one is needed to bring the rc from 1 to 2. fn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) { - assert_refcount(*array1, rc_before_call + 1); - assert_refcount(*array2, rc_before_call + 1); + assert_refcount(*array1, rc_before_call, true); + assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference array1[0] = 5; array2[0] = 6; println(array1[0]); // array1 & 2 alias, so this should also print 6 @@ -60,17 +56,21 @@ fn borrow_mut_two_separate( rc_before_call1: u32, rc_before_call2: u32, ) { - assert_refcount(*array1, rc_before_call1 + 0); - assert_refcount(*array2, rc_before_call2 + 0); + assert_refcount(*array1, rc_before_call1, true); + assert_refcount(*array2, rc_before_call2, true); array1[0] = 7; array2[0] = 8; println(array1[0]); println(array2[0]); } -fn assert_refcount(array: [T; 3], expected: u32) { +fn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) { let count = array_refcount(array); + if expect_copy { + expected += 1; + } + // All ref counts are zero when running this as a constrained program if std::runtime::is_unconstrained() { if count != expected { @@ -87,9 +87,12 @@ fn regression_7297() { let mut array = [0, 1, 2]; let refcount_0 = array_refcount(array); + + // This is currently copying the array due to the inc_rc in the array_refcount call above borrow_mut_two(&mut array, &mut array, refcount_0); + let refcount_1 = array_refcount(array); - let array_2 = copy_mut(array, refcount_1); + let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line let refcount_2 = array_refcount(array); // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident. @@ -108,8 +111,17 @@ fn regression_7297() { "borrow_mut_two should create a fresh array and not decrease its RC", ); - // Difference from min & 0 inliner settings: we fail to remove an inc_rc here - assert_eq(refcount_1, 2); - assert_eq(refcount_2, refcount_1); + // `5` here is higher than in other inliner settings. This is likely due to references getting optimized out, + // and mutations being optimized and removed so the original array ends up being aliased more. + assert_eq( + refcount_1, + 5, + "There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)", + ); + assert_eq( + refcount_2, + refcount_1 + 3, + "after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut", + ); } } diff --git a/test_programs/execution_success/reference_counts_inliner_min/src/main.nr b/test_programs/execution_success/reference_counts_inliner_min/src/main.nr index a4dd03f4586..e493302d237 100644 --- a/test_programs/execution_success/reference_counts_inliner_min/src/main.nr +++ b/test_programs/execution_success/reference_counts_inliner_min/src/main.nr @@ -2,7 +2,7 @@ use std::mem::array_refcount; fn main() { let mut array = [0, 1, 2]; - assert_refcount(array, 1); + assert_refcount(array, 1, true); borrow(array, array_refcount(array)); borrow_mut(&mut array, array_refcount(array)); @@ -20,14 +20,12 @@ fn main() { } fn borrow(array: [Field; 3], rc_before_call: u32) { - assert_refcount(array, rc_before_call); + assert_refcount(array, rc_before_call, true); println(array[0]); } fn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) { - // Optimization: inc_rc isn't needed since there is only one array (`array`) - // of the same type that `array` can be modified through - assert_refcount(*array, rc_before_call + 0); + assert_refcount(*array, rc_before_call, true); array[0] = 3; println(array[0]); } @@ -35,17 +33,15 @@ fn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) { // Returning a copy of the array, otherwise the SSA can end up optimizing away // the `array_set`, with the whole body just becoming basically `println(4);`. fn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] { - assert_refcount(array, rc_before_call + 1); + assert_refcount(array, rc_before_call, true); array[0] = 4; println(array[0]); array } -/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although -/// only one is needed to bring the rc from 1 to 2. fn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) { - assert_refcount(*array1, rc_before_call + 1); - assert_refcount(*array2, rc_before_call + 1); + assert_refcount(*array1, rc_before_call, true); + assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference array1[0] = 5; array2[0] = 6; println(array1[0]); // array1 & 2 alias, so this should also print 6 @@ -60,17 +56,21 @@ fn borrow_mut_two_separate( rc_before_call1: u32, rc_before_call2: u32, ) { - assert_refcount(*array1, rc_before_call1 + 0); - assert_refcount(*array2, rc_before_call2 + 0); + assert_refcount(*array1, rc_before_call1, true); + assert_refcount(*array2, rc_before_call2, true); array1[0] = 7; array2[0] = 8; println(array1[0]); println(array2[0]); } -fn assert_refcount(array: [T; 3], expected: u32) { +fn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) { let count = array_refcount(array); + if expect_copy { + expected += 1; + } + // All ref counts are zero when running this as a constrained program if std::runtime::is_unconstrained() { if count != expected { @@ -87,9 +87,12 @@ fn regression_7297() { let mut array = [0, 1, 2]; let refcount_0 = array_refcount(array); + + // This is currently copying the array due to the inc_rc in the array_refcount call above borrow_mut_two(&mut array, &mut array, refcount_0); + let refcount_1 = array_refcount(array); - let array_2 = copy_mut(array, refcount_1); + let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line let refcount_2 = array_refcount(array); // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident. @@ -107,7 +110,16 @@ fn regression_7297() { refcount_1 != 0, "borrow_mut_two should create a fresh array and not decrease its RC", ); - assert_eq(refcount_1, 1, "borrow_mut_two should create a fresh array with an RC of 1"); - assert_eq(refcount_2, refcount_1); + assert_eq( + refcount_1, + 2, + "There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)", + ); + + assert_eq( + refcount_2, + refcount_1 + 3, + "after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut", + ); } } diff --git a/tooling/nargo_cli/src/cli/check_cmd.rs b/tooling/nargo_cli/src/cli/check_cmd.rs index 48ace1646ed..f4c0a8e260f 100644 --- a/tooling/nargo_cli/src/cli/check_cmd.rs +++ b/tooling/nargo_cli/src/cli/check_cmd.rs @@ -59,9 +59,7 @@ pub(crate) fn run(args: CheckCommand, workspace: Workspace) -> Result<(), CliErr let Some(main) = context.get_main_function(&crate_id) else { continue; }; - use noirc_frontend::elaborator::UnstableFeature::Ownership; - let ownership = args.compile_options.unstable_features.contains(&Ownership); - let program = monomorphize(main, &mut context.def_interner, false, ownership).unwrap(); + let program = monomorphize(main, &mut context.def_interner, false).unwrap(); let hash = fxhash::hash64(&program); println!("{}: {:x}", package.name, hash); continue; diff --git a/tooling/nargo_cli/tests/snapshots/compile_success_empty/brillig_slice_input/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/compile_success_empty/brillig_slice_input/execute__tests__force_brillig_false_inliner_0.snap index c0951f82b7a..99f63bccf6d 100644 --- a/tooling/nargo_cli/tests/snapshots/compile_success_empty/brillig_slice_input/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/compile_success_empty/brillig_slice_input/execute__tests__force_brillig_false_inliner_0.snap @@ -10,7 +10,7 @@ expression: artifact "return_type": null, "error_types": {} }, - "bytecode": "H4sIAAAAAAAA/+1YS2/TQBDeJHYSO0/Bz0BCdhI3LRJSVbWgHhAqAsQJySSNBBInLiBx8E8nW2bI5/HGThovtHRXivYxs988dsa7mYYqtsb656ndWpP6r9QHYl1jtda/U5pHh7U4ANy68Y+jWRqooi9q1H8aAKYF/CQQ51czftQhnPMsj6+E3JbgM+0Z0Lihijxsh404Wp+zbT/FjN+2gz9lv/ngu5bBJpY/UPmzYrqpVyp/pkrICpXVGI7LbEP9OTbGgl/6YBuWvyfWvzxT9HVb6NOxo0/E+F1L+GxvYLAX874j7O3Z0WfGORKCPg0hu29HdrJrDrL8UOhqKwf7qng26B8+pwHzZBt9AkHzsqIdTPOBxuer4+4J2Ic01AdzlWN1rIqxEoJM093CMo9gPIc9ul1meX2Usn5XnVh+M8SPS/zBNnYylfP7TQ9rfH7spy7yC1oANC/Lywlp7oEcxGI9fMGf0HxEfRv28P6xQX5byM/pbVhDH0mslmGN+fU3+ymNe/TT8bWkNY5JfHfvcz+jLI4XvEdOqY8ObGNVvF/9LXJt3UdtYXtN+LHl+3Ri+T6N5RsPz0L77AzW8fvsK/M7owF05H8JmBc0Hok9GCM9A8Yl9doXX2hs+Y6dlt0hmNd94QPTHSjfIOiDwIAl3xbybF4LmYyPZ4N7O0BH/neA+UZgmt5ZeN5doSvSAsA9E/aiL+S7m+1vVtjB/EODjqh3U/CPDPxD4OkLXQdAG+0gG2Ohu4PsMl3HBn7UYSh0Rdm4V+oq7eoLmpz3DDim77rMA1Pe4FnK+AkNMjHW2VdetuGrK9/nx7//X9zoSvicS7J5QEf+zzRHO7j3DtBzNU/j1TRdpUm6XM4W6SOBrxvHTs+C/EVy9GkxS9LoOtbTSZX8nzS+57W963te2ztxtb3q9hdqexNX27t1c7W9ErtRvqvtudre/17bewb2IQ312be2ZzlvZrb/w7u8+dNc3gDNdt5U1cQvYPwC9uj2Ksvro5T1N97S1cQ3/Ntq4uc0v8s18ec0xpr4N1pzNfHq5mri5fpX1cSvYB2/z/vWxN8D5lsa71sT/0C99sUPGj/kmvhHIfO2NfElYKYCs66a+JWw19XEXU3cFD/bauIc63e9Jv6d5g+9Jv4Ldz3JHDgrAAA=", + "bytecode": "H4sIAAAAAAAA/+1ZbWsTQRCeJHdJLy9N0J8hSC6Xa1pBKFIFhSJ+koqK16QBoV8UBMEvJwj+bXN1pnlubvN+W9u6C2H3dmefee9udypUbJXZz6P1WpX779wHaj7Dqs1+x/zd362FAeCWjX/YHyYBFW1RovxRAJgW8ONA+a9k/H6DcU7SPD4pvjVFZ9rT4XGFijSih404mvnZtp1Cwa/bwY/Ebj7YrmbQSfh3KO8rWTf1RHmfkuLVJKsxHC7TDeWX2Ogpem2DRVj+hlj/0qdo67qSp2FHnr7g71nCF30Dg76Y9w2lb8uOPEPJkSbIU1G823Z4x+vmoPBvKllt5WCbir5B+4ifOkKTzuUJ1JqXFvWQNR/WxL9Z3D0C/XAN5cFclVjtUTFWmsDTdLYIzwMYj2BP1l6meXmIrJ9VR5bvDOHDJfYQHRsp5ex+1cOc+E/stIf0ai2ANS/N82nytwd8EEvk8BV9zN9d7uuwR/b3DPzrin9ObsMc2khj1QxzQp/9zX7M4xb/svi65DmJSbx3b3I+Iy+JFzxHjrnv79h6VDxfhU+XivmoZbJ0dl6fJXJWSPxonj7YSp+dDZo3X8094z7z2VfYs83domqQR/vM1lmO+hKVf9+1dFcYCH5gBz/U92P0RRY/ryjvc4kpn8x3tAqsI/1rwDzlcVftwfxqGTDecJ/Z+huPLd9PomXnL8ZzW9nAdH/Q9ze0Qd2Ape9l2jdvFU/BR9/g3j1YR/oPgPlOYYpcqAf6O1Cymu7rGEddKtpC/88i+ldX6CH0+wYZUe6qou8a6PeBpq1k7cBadw3eGAvBGryXydoz0KMM+0pW5I17taxar7Za098tA47pTNR5YMob9KWOn6aBJ8a60HvpnK6sfB8d/j1Pr2RlfMkl3TxYR/ov/I16SO/tIOd0lITTKJkmcTKZDMfJA4WfNYmdlgX+ySg6HA+G49F5HCXRwY3zH8cH5+NhnPQvwuxzsIr/bx7f8XfZizv+Lnvk3mVXtxt4lx24d9mtm3uXXaI38nfvsu5d9r6/yz4B/XAN5dn0XdZy3gwt503o8ua6ubyBNdt5s6qe8RzGL2BP1k7TvDxE1u94E1fPmNMvqmec8Pdtrmc85THWM37wnKtn7NYkH23VM/AN+SfsWXTPdfWM+1XPOKO8z7etZ3wEzPc83rSe8Yn7zNa/ePw/1zOmiue29YxLwPysMMuqZ5wpfV09w9UzTPGzqJ4hsX7b6xncuXpGyfw3rWf8AaJBIiqwLgAA", "debug_symbols": "XYxLCoAwDAXvkrUn8Coi0k9aAqEpsRWk9O5+cCFdzhveNPBoa9woBdlhXhqwOFNI0k2tT2CVmCluw3wYJWMZPww1uZ8tZ8bhn1Uc+qr4lF7X134B", "file_map": {}, "names": [ diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index c98f95e8872..60bc46d0936 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/92aWVMTQRDHJ2E3YYMI3rei8gFyEI43q7xQPLjva0kIvOqLVvmSB6ssv4CfVxpm8J/ONGCxg9VOFTWbnd92/2e203OQnDkqwwd/OXsd2Tpva7ofm87i2Ge2Lp+vVDK0VQ6lMadAY16Bxh4FGqMMNZK2IdNZstYbKxjTggKNRQUaexVoTBRoLCnQ2KdA4yUFGvsVaLysQOOAAo2DCjReUaDxqgKN1xRovK5A4w0FGm8q0HhLgcbbCjTeUaDxrgKN9xRovK9A4wMFGh8q0PhIgcYhBRofK9D4RIHGpwo0DgfQeFjwUJ9E0+ExHc7S4ecQMHRwRwdjdPBEBzt0cEIHE7Txp401bVxpY0gbL9rY0MaBFua08KWFJS3caGFECw+a2GnipImJEj8lVkpcj6xPCmwKHHoxw6a7uMH9ZevE1nloz/CAuZIwv1naHy+PTiSe/mWov5aAzeztV+vOfhRGf7lo7bxod9o3zG8P4/gz+NxLYF4KzCtgXgnMa2BeC8wkMJMC8waYNwLzFpi3AjMFzJTAvAPmncC8B+a9wHwA5oPAfATmo8BMAzMtMDPAzAjMLDCzAjMHzJzAzAMzLzALwCwIzCIwiwKzBMySwCwDsywwK8CsCMwqMKsCswbMmsCsA7MuMBvAbAjMJjCbArMFzJbAbAOzLTApMKnA7ACzIzANYBoC0wSmKTC7wOwKTAuYlsDsAbMnMPvA7DMmgWtjsp7bRkYCzw31ftZXA31xvuMwvkdzzJ8xnfOSYf5LJuQ8fPTjBPTn9PDxceukfse0/+jJsbao3d0P1xZDm3u/tD6cBM4XW1TcuwmxZjuIu4mwcVct/7u4q1b+x7jjbVG7ux9/G3c8thw3B9cL9jpsHhydCBnvVK559KMvKsW2OS5uPHrgnhtXN869yLO2BNqidqefkv0cgR+05XTEjJ+1nwdsXYBn3PODHv8F5r9Dt+ceH5fEwycenvbAU/aa9r5u3/a83Wnvma3L5yuH//inGP1s7Z0l5wTKd2fOOc7/ReWciOnJMY15Nj6B1gJ157fg0ePLgVfsNX9nqM/ZGrL1gDl9Pg21B+c5PoL+oc8c9JP3B+eHmN1r2pri/Suzx2NOeseDpjvmLmot6L6b+P5dcW1F5hvbeqGN5yfD+o8F+0Q2voFdznE9GEdOW8zaPtk69Px1lelEX5hro3b2/sfGj+KbipvnYtM91ug/ZvwX+7nk6cd5fkjaGksrrVraSutpsznSSPk4GTZOWftPx2rjjepIY2ynXktro6f6981XmKNzQn04lifYHvTYcvNu4O922dkvBLFfPbZfDKO/wtcNOFbUp+9wH9vcd4A/W4B25H+CzR/22jdnuXfYB+2xp909h+fjJ+V/d7/k4fEMv4dpw9xbOoOt/Am++zx86QTfqKtP8B3BPdSaML7Xoyn29I1/l7hdfA77gTHgYvWssfUbgwGCXWUyAAA=", - "debug_symbols": "ndbdioMwEAXgd8l1LmYmMT99lWUptk2LIFqsXVhK331jd6WiwnK8EUf8DOaEZB7qlA73y75qzu1N7T4eqm6PZV+1Ta4eT60OXVXX1WU/faxouAT3ev92LZuhvPVl16udFKxVak75znP256pOalfQ81Or4GERYBFREQkWDAuBhYGFXROGR2HMQhSwcLDwsAiwiKhgIpwwTlZjN9aOxNGCGJxYnBQ4cTjxOAk4iTBhwgnjBE9f8CgFj1LwKM3qv3D04+rnGCbL/9cU6ya6cQ8jcXPjN4yzfkgQvcdhMzcRN5Y2mPWjgti/56CYG9lgzAZj//+faT56mYvQuGZY2M+/vyF/6zYYD5pnLr7KrioPdfprc8735jjpevrva5o1QNeuPabTvUtDK/TugoZ596KDvLaiXDBbzRxfG8BQCmkWyWPmcX8A", + "bytecode": "H4sIAAAAAAAA/+2ayW4TQRCG2/GMk3EwCfsOAfIAXuIsNyS2QIDs+zpx4uQKF5C4+MINCfECPCuppDv8LneZoEwLFaKlqMfTn6v+7qmpXpycOSnDR385ex3ZusfWdD827cWxT2xdPl+pZGirHEpjToHGHgUa8wo0RhlqJG1Dpr1krTdWMKYFBRp7FWjsU6AxUaCxqEBjvwKNFxRoLCnQeFGBxgEFGgcVaLykQONlBRqvKNB4VYHGawo0Xleg8YYCjTcVaLylQONtBRrvKNB4V4HGewo03leg8YECjUMKND5UoPGRAo2PFWgcDqDxuOChPommw2M6nKXDzyFg6OCODsbo4IkOdujghA4maONPG2vauNLGkDZetLGhjQMtzGnhSwtLWrjRwogWHjSx08RJExMlfkqslLgeWJ8U2BQ49GCGTWdxg/vD1omte6A9wwPmSsL8Zml/vDw6kXj6l6H+WgI2s7dfrTv7URj95V5r51mr3b5hfvOM49/B7z0H5rnAvADmhcC8BOalwEwCMykwr4B5JTCvgXktMFPATAnMG2DeCMxbYN4KzDtg3gnMNDDTAjMDzIzAzAIzKzBzwMwJzDww8wKzAMyCwCwCsygwS8AsCcwyMMsCswLMisCsArMqMGvArAnMOjDrArMBzIbAbAKzKTBbwGwJzDYw2wKzA8yOwKTApAKzC8yuwDSAaQjMHjB7ArMPzL7ANIFpCswBMAcCcwjMIWMSuDYm67ltZCTw3FAvsb4a6IvzHYfxPZpj/oxpn5cM8180Iefhk39OQH9ODx8ft04qOab1S0+OtUWtzn64thja3POl9eEkcL7YouKeTYg121HcTYSNu2r578VdtfIvxh1vi1qd/fjTuOOx5bh5uF6012Hz4OhEyHincsWjH31R6W2Z0+LGIw/33Li6ce5DnrUl0Ba12v0U7ecI/KAtpyNm/Jz9PGDrAnzHfX/Q47/A/Lfp9tzj45J4+MTD0x54yl7T3tft25622u09sXX5fOX4h3+K0Q/W3oDpfI95zgm1B+PvuHu2Pp9uzHgOxPwQs3sbtqb+fmL9wxzSLa8MGnm++Z+vT0vXfJ3zjKsbn0IYPXXnt9ejx/ecLxl/fKE+Z2uI9SHUWrDENGApMU2+uOyDNp6fDBsXLNgnsvEZ7HKO68HYc9pi1vbe1qHnr8tMJ/rCXBu1svc/Nn6S36i4eS42nWON/mPGf7Sfi55+nOcfSZtjaaVZS5tpPd3bG2mkfJwMG6es/adjtfFGdaQxtluvpbXR3/rH+apk2ucHrovbyXexPeix5eZdNy/iu81ze6DcVea5C+dF9BlDf3guwLwXs3tfbO2bF335O+4ydr65JnBeLCfGn/uysV89td8XRn+FrxtwrOj5fhWeSWw65zBfnnX8d7D5zV4PmM7n5uK/3/jjPmJ68LeFbnO8u1/08Pj7R55pwxgvnsFWTxff/R6+2MU36uoXfEdwD7UmjC94NMWevvE8xO1K7yXGgIvVs8bWTziHM3ahMwAA", + "debug_symbols": "ndbvioMwDADwd+nnfkhia+1e5TiG27ohiA7/HBziu1/1JorzOJIvYsSf0aa2GdQtXPrHuajudatOH4Mq62veFXUVo2HU6tIUZVk8ztvLCqaDN/P97TOvprDt8qZTJ7KoVahu8cxh9PeiDOpkYfzUylu2SNnCsUXGFp4rEIBPkE/oiCTGvEiSwhtJ+MTwieWTlE8cn2R84tkEgU+QT/jVJ34piV9K4peSDkuJ3i2zH322mf6/JhMYzzcJCAwKDAlMIjCGb4xgDMwf7+bTZUUDSvfGCvIcbxoAax5M9sYJTCYwx1sHoFvHwO6MBYFBgaH/v2dbH/1eF4Lln0ZCt3++oP7WCIxlmjEGX3lT5JcyvNqee19dN11Q9/0Mu4bo2dTXcOubMLVGa1c0faMjndG8VcQA0WhEPy/QU0igkSjmjHl/AA==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_0.snap index d61680c20c5..ef3f9846ef6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_0.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/92aWU8bMRDHnbCbsAkUet8tbfkAOQjHWx9a7vu+YQkEnir1oX2O1JdW6ocuAzb8M9lJqVirnVpCdtY/z/xtz64PkTGXafD8L2PLgc2zNqfnoWlNjn1v89LtUjlFWyVfGjMKNGYVaOxSoDFIUSNpGzCtKW29oYIxzSnQmFegsVuBxkiBxoICjUUFGnsUaOxVoPGOAo19CjT2K9B4V4HGewo03leg8YECjQ8VaHykQONjBRqfKND4VIHGZwo0Pleg8YUCjS8VaHylQONrBRoHFGh8o0DjWwUa3ynQOOhB40XCS30STZfHdDlLl58DwNDFHV2M0cUTXezQxQldTNDBnw7WdHClgyEdvOhgQwcH2pjTxpc2lrRxo40RbTxoYaeFkxYm+vDTh5U+XK+tTwpsChyamEHTntzg/rR5ZPMs1Kd4wVyOmN807Y+WhseihP6lqL8agc307Vdqzn7gR38pb+18aLbaN8xvF+N4G2z3EZiPAjMOzLjATAAzITCTwEwKzBQwUwIzDcy0wMwAMyMws8DMCswcMHMCMw/MvMAsALMgMIvALArMEjBLArMMzLLArACzIjCrwKwKzBowawKzDsy6wGwAsyEwm8BsCswWMFsCsw3MtsDsALMjMLvA7ArMHjB7ArMPzL7AHABzIDCHwBwKTAxMLDBHwBwJTB2YusAcA3MsMCfAnAhMA5iGwJwCcyowZ8CcMSaCsjFpr21DQ57Xhlov66uBvjjfoR/fwxnmz5jWdckw/wXjcx2+/OcE9Of08PFx+6RexzSv9WRYXdBs74erC6HOzS/tDyeBS4otSm5ufOzZzuNuzG/cVUp/L+4q5f8x7nhd0Gzvx5/GHY8tx61AedWW/X4Hh8d8xjul+wn60RelfNNcJTceXfDMjasb527kWV0EdUGz1U/B/g7AD9pyOkLGL9vffTbPQRvXvj/Bf475b9Gd8IyPS5TARwk8nYFnbLlo/yiGvtlnLu6C66b//DfB07rc8ZuAGrNsfHJ+9NSc33yCniBBz11b5nOG+pytAZv3mfZ3MGD987QXKWWYvgD6hz4z0E/eH1c2tg0+q9uc4v0Hs8djTprjftMec7jf4O0yQu78GHPzWKL03ual26Vyv2mf5xzznYe6NOfZ2e/2Yr9yZT/yo7/M9004VjSGn+A5xm5o2vcUOA4h47+Czc+27N7PLPOB7V3dF9M6nz72BZTugV2uqQiak95hVy6Y69Tpm+b4YgJfYP3D8cJYLt7AVraD754EvtjBN+rqEXwH8Ay1FhifT9AUJvQt6f3OM1ud9rr4/iTFu2uL8e74oHnNpRVnI6OX68OFVms/NK17c8P8h4z/bn/jmLr8Nv8o3RiJy41q3Ihr8fHxUD3m7wMlN19FD/7jkepovTJUHzmqVePq8G/9/wL/VZVpLTEAAA==", - "debug_symbols": "tZbLaoUwEED/JWsXmcS87q+UcvERLwFR8VEo4r83phXFuuhgsxFHck5kJo+ZSWnz6fV0TdUO5PE2k7otstG1jY/mJSF57+ravZ7Hz4SuDy3C+KHLmjUcxqwfyYMJSIhtSv+mwPOVqy15CLq8J0RLNKHQhEYTBksYiiYATTA0wa8IDhvB+S8iRRMCTUg0odCERhMGSwCleOSy6jxNN0TSI5L8fWiws6h2HtWexrQDvWkHo7aygtGHun7r+W29kds2pkye9bjcBETgEYlHdNy0mpt6RumeVuAnPaNx9RBXz27rQe1rTpz1PK4+jasX/5r744a8WMSMbl5fdHX+FRn1bGAqrl7H0y8++Mh6l+W1/ektq6kpDq3m+NnZU9fZ9W1hy6m3a/+5t57ralUs0SzcJT4ADglwGY6RECofGj+nn/cL", + "bytecode": "H4sIAAAAAAAA/92aWVMTQRDHJ2E3YRMQvG9F5QMkhHC8+eCB4gl44rUEo2++WeWDVt590So/sLZMw3870wjFjlY7VanZ7Pxm+j89nbkqFbeVpn99Kv458XnV5/Q+dcXE7FWftw6W2iW21YqlsWJAY9WAxhEDGpMSNZK2KVdMZetNDfi0ZkBj3YDGUQMaMwMaGwY0Ng1oHDOgcdyAxkMGNE4Y0DhpQONhAxqPGNB41IDGYwY0Hjeg8YQBjScNaDxlQONpAxrPGNB41oDGcwY0njeg8YIBjRcNaJwyoPGSAY2XDWi8YkDjdASNvxNe6pNoujymy1m6/JwChi7u6GKMLp7oYocuTuhigg7+dLCmgysdDOngRQcbOjjQxpw2vrSxpI0bbYxo40ELOy2ctDDRxE8TK01cF71NCmwKHBqYaTec2Lk/fJ75vArlJV4wtzNht8z2F1pzi1mgfyXq72TQZvntz3S5/SSO/lbdt3NtUGzfCbsjgpN1sN51YK4rzA1gbijMTWBuKswSMEsKcwuYWwpzG5jbCrMMzLLC3AHmjsLcBeauwtwD5p7C3AfmvsI8AOaBwjwE5qHCrACzojCrwKwqzBowawrzCJhHCvMYmMcK8wSYJwrzFJinCvMMmGcK8xyY5wqzDsy6wrwA5oXCvATmpcK8AuaVwrwG5rXCvAHmjcLkwOQKswHMhsL0gOkpzCYwmwrzFpi3CtMHpq8w74B5pzDvgXkvmAyenSt7bZudjbw2dMdFXx30hW2ncWzPVYQ954rrkhP2Gy7mOrz15wS0x3qkf3ifNM7MYEdPRZQlg+F+cFkKZTy+tD9cAi4UW5R4bGLs2X7F3WLcuJtp/bu4m2n/j3Eny5LBcD/2G3cytphbhec1/xx3HpxbjBnvlI4G9KMtSvWB207sjxF4x35lP48iL8oyKEsGRTsN/z0BO9gW60gFv+K/T/i8BnW4/mTAfk3YL+gOvJN+yQJ8FuDpDLzsn5v+QzH0FXTLOecvrUUttlXz7bHvpU38Yx/y+Ox8HXy37nPq73fRv8QV/Sffsf8m3XCMMjceqCd9V4viu73Pp2y/4aLuadpyLNGvlYBf2T/1OHq6bHc0oCc0zoddOL5QH7c15XO5V3Cu6Hvndh+fkD9qgrnqSvFHOxTHbGsi0NdE6BqFshhzAN8n4RyANuvgL+TxmVIq3n3weWgOqEO9kcA7OQckAT2R47iVBfpb5p6Q22/E0d+We070FcXfRzEmPO+nbng/hn5IBf8F2vzknzmuq8IG1ueyz644njH2VJSOQLtSUxM0p4Hy/c5pzDcDvPw9o78wlpt7aKu6i+2xAN/cxTbqGlNsJ274NyzryjmD36eBvoXmxrpoa7dzAv5+QvHOdTHet+e7wQ5XVpzNL2zNq7+1+vZTVzzXOGE/Ffw3/x3nBc4P8ifz/nze7nfyft7NNzdne7n8PVDi8WpGsJ/PdxZ6M7O9+Y1uJ+/M/dH+TwIKroppMgAA", + "debug_symbols": "tZbLaoUwEED/JessMnkaf6WUi494CYiKj0IR/73RXlHkLhrsbMQRz4nMJOPMpHT59Hz4pmoHkn7MpG6LbPRtE6J5oSTvfV375+P8mLD1YsX2/tBlzRoOY9aPJOUKKHFNGe4MBL7ytSOpYssnJVZGEyqa0NGEiSaSaMLGEsBYPALvECHlCxGanRH691c3O0e1C1S7RLWrm3awZi8r2ORU11+9xtUbXH2Cq7eoemC4esDVc1w9bmn5/eRYvXdLxvVVH5ecDRHxiIxHcM87v3veOWNHWkFc9Qmu3qLqBbutB3PsOXXVA66e4+rFv+b+fCDfbGLOdm/oBOb6KRK1NwiFq9d4+iUEX1nvs7x2rxm+mpriNNKP3527TPdd3xaunHq3zvnHiL/W23Ca8O1PGwIQloKUW/NfQ6lCaMKaYd0f", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index d61680c20c5..ef3f9846ef6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/92aWU8bMRDHnbCbsAkUet8tbfkAOQjHWx9a7vu+YQkEnir1oX2O1JdW6ocuAzb8M9lJqVirnVpCdtY/z/xtz64PkTGXafD8L2PLgc2zNqfnoWlNjn1v89LtUjlFWyVfGjMKNGYVaOxSoDFIUSNpGzCtKW29oYIxzSnQmFegsVuBxkiBxoICjUUFGnsUaOxVoPGOAo19CjT2K9B4V4HGewo03leg8YECjQ8VaHykQONjBRqfKND4VIHGZwo0Pleg8YUCjS8VaHylQONrBRoHFGh8o0DjWwUa3ynQOOhB40XCS30STZfHdDlLl58DwNDFHV2M0cUTXezQxQldTNDBnw7WdHClgyEdvOhgQwcH2pjTxpc2lrRxo40RbTxoYaeFkxYm+vDTh5U+XK+tTwpsChyamEHTntzg/rR5ZPMs1Kd4wVyOmN807Y+WhseihP6lqL8agc307Vdqzn7gR38pb+18aLbaN8xvF+N4G2z3EZiPAjMOzLjATAAzITCTwEwKzBQwUwIzDcy0wMwAMyMws8DMCswcMHMCMw/MvMAsALMgMIvALArMEjBLArMMzLLArACzIjCrwKwKzBowawKzDsy6wGwAsyEwm8BsCswWMFsCsw3MtsDsALMjMLvA7ArMHjB7ArMPzL7AHABzIDCHwBwKTAxMLDBHwBwJTB2YusAcA3MsMCfAnAhMA5iGwJwCcyowZ8CcMSaCsjFpr21DQ57Xhlov66uBvjjfoR/fwxnmz5jWdckw/wXjcx2+/OcE9Of08PFx+6RexzSv9WRYXdBs74erC6HOzS/tDyeBS4otSm5ufOzZzuNuzG/cVUp/L+4q5f8x7nhd0Gzvx5/GHY8tx61AedWW/X4Hh8d8xjul+wn60RelfNNcJTceXfDMjasb527kWV0EdUGz1U/B/g7AD9pyOkLGL9vffTbPQRvXvj/Bf475b9Gd8IyPS5TARwk8nYFnbLlo/yiGvtlnLu6C66b//DfB07rc8ZuAGrNsfHJ+9NSc33yCniBBz11b5nOG+pytAZv3mfZ3MGD987QXKWWYvgD6hz4z0E/eH1c2tg0+q9uc4v0Hs8djTprjftMec7jf4O0yQu78GHPzWKL03ual26Vyv2mf5xzznYe6NOfZ2e/2Yr9yZT/yo7/M9004VjSGn+A5xm5o2vcUOA4h47+Czc+27N7PLPOB7V3dF9M6nz72BZTugV2uqQiak95hVy6Y69Tpm+b4YgJfYP3D8cJYLt7AVraD754EvtjBN+rqEXwH8Ay1FhifT9AUJvQt6f3OM1ud9rr4/iTFu2uL8e74oHnNpRVnI6OX68OFVms/NK17c8P8h4z/bn/jmLr8Nv8o3RiJy41q3Ihr8fHxUD3m7wMlN19FD/7jkepovTJUHzmqVePq8G/9/wL/VZVpLTEAAA==", - "debug_symbols": "tZbLaoUwEED/JWsXmcS87q+UcvERLwFR8VEo4r83phXFuuhgsxFHck5kJo+ZSWnz6fV0TdUO5PE2k7otstG1jY/mJSF57+ravZ7Hz4SuDy3C+KHLmjUcxqwfyYMJSIhtSv+mwPOVqy15CLq8J0RLNKHQhEYTBksYiiYATTA0wa8IDhvB+S8iRRMCTUg0odCERhMGSwCleOSy6jxNN0TSI5L8fWiws6h2HtWexrQDvWkHo7aygtGHun7r+W29kds2pkye9bjcBETgEYlHdNy0mpt6RumeVuAnPaNx9RBXz27rQe1rTpz1PK4+jasX/5r744a8WMSMbl5fdHX+FRn1bGAqrl7H0y8++Mh6l+W1/ektq6kpDq3m+NnZU9fZ9W1hy6m3a/+5t57ralUs0SzcJT4ADglwGY6RECofGj+nn/cL", + "bytecode": "H4sIAAAAAAAA/92aWVMTQRDHJ2E3YRMQvG9F5QMkhHC8+eCB4gl44rUEo2++WeWDVt590So/sLZMw3870wjFjlY7VanZ7Pxm+j89nbkqFbeVpn99Kv458XnV5/Q+dcXE7FWftw6W2iW21YqlsWJAY9WAxhEDGpMSNZK2KVdMZetNDfi0ZkBj3YDGUQMaMwMaGwY0Ng1oHDOgcdyAxkMGNE4Y0DhpQONhAxqPGNB41IDGYwY0Hjeg8YQBjScNaDxlQONpAxrPGNB41oDGcwY0njeg8YIBjRcNaJwyoPGSAY2XDWi8YkDjdASNvxNe6pNoujymy1m6/JwChi7u6GKMLp7oYocuTuhigg7+dLCmgysdDOngRQcbOjjQxpw2vrSxpI0bbYxo40ELOy2ctDDRxE8TK01cF71NCmwKHBqYaTec2Lk/fJ75vArlJV4wtzNht8z2F1pzi1mgfyXq72TQZvntz3S5/SSO/lbdt3NtUGzfCbsjgpN1sN51YK4rzA1gbijMTWBuKswSMEsKcwuYWwpzG5jbCrMMzLLC3AHmjsLcBeauwtwD5p7C3AfmvsI8AOaBwjwE5qHCrACzojCrwKwqzBowawrzCJhHCvMYmMcK8wSYJwrzFJinCvMMmGcK8xyY5wqzDsy6wrwA5oXCvATmpcK8AuaVwrwG5rXCvAHmjcLkwOQKswHMhsL0gOkpzCYwmwrzFpi3CtMHpq8w74B5pzDvgXkvmAyenSt7bZudjbw2dMdFXx30hW2ncWzPVYQ954rrkhP2Gy7mOrz15wS0x3qkf3ifNM7MYEdPRZQlg+F+cFkKZTy+tD9cAi4UW5R4bGLs2X7F3WLcuJtp/bu4m2n/j3Eny5LBcD/2G3cytphbhec1/xx3HpxbjBnvlI4G9KMtSvWB207sjxF4x35lP48iL8oyKEsGRTsN/z0BO9gW60gFv+K/T/i8BnW4/mTAfk3YL+gOvJN+yQJ8FuDpDLzsn5v+QzH0FXTLOecvrUUttlXz7bHvpU38Yx/y+Ox8HXy37nPq73fRv8QV/Sffsf8m3XCMMjceqCd9V4viu73Pp2y/4aLuadpyLNGvlYBf2T/1OHq6bHc0oCc0zoddOL5QH7c15XO5V3Cu6Hvndh+fkD9qgrnqSvFHOxTHbGsi0NdE6BqFshhzAN8n4RyANuvgL+TxmVIq3n3weWgOqEO9kcA7OQckAT2R47iVBfpb5p6Q22/E0d+We070FcXfRzEmPO+nbng/hn5IBf8F2vzknzmuq8IG1ueyz644njH2VJSOQLtSUxM0p4Hy/c5pzDcDvPw9o78wlpt7aKu6i+2xAN/cxTbqGlNsJ274NyzryjmD36eBvoXmxrpoa7dzAv5+QvHOdTHet+e7wQ5XVpzNL2zNq7+1+vZTVzzXOGE/Ffw3/x3nBc4P8ifz/nze7nfyft7NNzdne7n8PVDi8WpGsJ/PdxZ6M7O9+Y1uJ+/M/dH+TwIKroppMgAA", + "debug_symbols": "tZbLaoUwEED/JessMnkaf6WUi494CYiKj0IR/73RXlHkLhrsbMQRz4nMJOPMpHT59Hz4pmoHkn7MpG6LbPRtE6J5oSTvfV375+P8mLD1YsX2/tBlzRoOY9aPJOUKKHFNGe4MBL7ytSOpYssnJVZGEyqa0NGEiSaSaMLGEsBYPALvECHlCxGanRH691c3O0e1C1S7RLWrm3awZi8r2ORU11+9xtUbXH2Cq7eoemC4esDVc1w9bmn5/eRYvXdLxvVVH5ecDRHxiIxHcM87v3veOWNHWkFc9Qmu3qLqBbutB3PsOXXVA66e4+rFv+b+fCDfbGLOdm/oBOb6KRK1NwiFq9d4+iUEX1nvs7x2rxm+mpriNNKP3527TPdd3xaunHq3zvnHiL/W23Ca8O1PGwIQloKUW/NfQ6lCaMKaYd0f", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 544627ff4c4..217102dcecf 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -80,8 +80,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "pdvbTuNIEAbgd8k1F9116up5ldVoxCGMkBAgDiutEO++zgx2kLvi6C9uEEb56FRXO3GV2++7m/3V2+9fdw+3jy+7H/+87+4fry9f7x4fpqP3j4vd1fPd/f3d719f/7wrhx8mf17/8nT5cDh8eb18ft39qLVe7PYPN4ffdPK3d/f73Q8tHz8vdqawMFg0VDQKhbRZiK9FHIfrLHpdizAOquVTULW1aLBwWHRUeDhXXORTcFnProdzJcU/hRivRThX4jSL3taiwcJh0VHRCyxqJFTsU+j0spUIZ1dtnl21vhZh5Nbn1d5oGCOMvEmfha7HqKXgpOKEcMI4CT/mms9LvrkPJJwxL3MevawzX2sYi7d5sXi3gYSxdJo/hTrrQAQnihPDScNJuJCnpcfzp3Cp45z1BKKSQTWDKIM4gySDNINOTLkt36/FhjOIOYMkgzSDLINaBnkGZaZcSgbVDKIMyqwIOZGnflywXQbUT1xB2nIJybRGSomRlDNIMkgzMVkGtQzyDMrkyUoGMfx9HhdHTnOSnEaiODGchPlxnq/5nYfFY46TDpNWzsQSkIoTwgnjRHCiODGcNJzE2a++QTpMvOCk4oRwEudFl3Nfh1MsLi43r+Xjym9zlH6iYphLGfchls44EZwoTgwnDSeOk3glt7aQdV1Cce27TSpO4uy7n1xjFNe+20RwomdiCYjhpOHEcdLRE3nqneGk4oRwwjgRnDS0H0VxHa/LGtNOA+kwiWv4bRJ347ouZIglrt+3CeNEzsUyEsWJ4aThxHHSYcIFJxUncfaXTmFEGCeCE8VJmH2T+dy3NpKGE8dJh0nc2dgmFSeEE8aJoO17EsWJ4aThxHHSYaIFJxUnhBPGCZ59xbOvePYVz77i2Vc8+4Zn3/DsG559w7NvePYNz77h2Tc8+4Zn3/Dsx90eprkNxUOvj+JuD9tyh9vbQAQnihPDScOJ46TDJO72bJPwrGSfi3fuPBDCCeMkzv5y056HbjzFPaVtYjhpOHGcdJjEGyO2ScVJmH3ReY2J+kAYJ4KTeEfMst8oIoaThhPHSUcJx/2xbVJxQjiJs0/zuS9GAxGcKE4MJw0njpMOk7g/tk3i7G/sIOO4P7ZNGCeCE8WJ4aThxHHSYRJ34bZJfI98Y3cmn9jbYssNchuJ4sRw0nDiOOkwiftj26TiJN4j0ZatuU0HwjgRnJzLfkAMJw0njpMOEyk4qTghnMTZ39hnzXF/bJsoTgwnDScOk7h6nToHy5Zuk+M00/RdO15U03KqTL8eX1zp7whydgTvX0f4gzSD4j3z1mlBX3ZQp2JpZ99WH99WvM3elj0U1EoZUE+guEo+h2oGUQZxBkkGxXlymi8CprqdvrUS4sJ3+rfHEeSbI/SzMYisA48r5akXUo5IB1QziDKIM0gySDPIMijOk5S5QpnuDcl3VoLEBfD0b48j0DdHqGdjIFsFLnHFPN1voyNqA+IMkgzSDLIMahnkCRRXtmeSWymDGEUf09G/l893l1f3+89HAW/fHq6/PBn4+t/TfvWQ4NPz4/X+5u15f3hc8Pik4GFw6Rfafx4ejpkOWOsFqx0OD1PA1i+41WnMadz/AQ==", + "bytecode": "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", + "debug_symbols": "pdvbTuNIEAbgd8l1LtzVdWpeZTUacQijSAgQh5VWiHdfh40d1l1x9Bc3IzLKR6f8t4m73P7Y3O1u3v/83j/eP71urv762Dw83V6/7Z8ex1cfn9vNzcv+4WH/5/f3/94Mh3+Uv97/+nz9eHj5+nb98ra5KqVsN7vHu8NPMvr7/cNucyXD56/tRgUWCgtDhVEo2CbBvhRxHS6TaGUpwjqoDEdBRZfCYOGwaKjw8FjVgY+iDsuj6+Gx4sGPgrUuRXis2GkSzZbCYOGwaKhoAyxKJIT1KGR820KER1d0OrqibSnCyrVNs92oGyOs3LhNQpZjlGHAScEJ4aTiJPwzZz5NeXPvSHjEfJhy9GGZfClhLW7TZPGmHQlraTT9FWpVOsI4EZwoTgwn4URu89RvVjvSYEIDTgpOCCcVJ4wTwUn8lT3o/H06aHfGkGWQZ1BLoDpkUMkgyqCaQZlDzpmaOFMTZ2ri+JJ0aHVGjTskGaQZZBnkGdQSSIYMKhmUyUnOXdnrfGlfaYk0U5NmalLKoJqpiTNIMkgzKJWTJ5AV+DorXuw5TSE59aTihHES5uN1Wot57SZPvKhcJ4YTv1BLQBpMfMBJwQnhpOKEcSI4idMvvkIMJ46TBpN4qbxO4lxkPvelO8WawmuseO27NgrFa1+3aYnpzh0pOCGcVJwwTgQnipN4JpvNRDriOGkwKXH67mfnGJWCE8JJvVBLQBgnghPFiaEnMhXHSYMJDTgpOCGcwH1CitfxMs8xadQRw4njJMxFmsykqyVev6+TghO6VEtPKk4YJ4ITxYnhxHHSYMJx+nMHNyIFJ4STipMwfeXp3FfrieBEcWI4cZw0mMRdjXVScELobRWSihPGieBEcWI4cZw0mMT9n3VScIKnr3j6iqevePqKp694+oqnr3j6hqdvePqGp294+oanb3j6hqdvePpxt6fS1IaqXa+P4m5P1XnngXcr8TObFVZJxQnjRHCiODGcOE7Cs7L6tHivbXmHkOJuzzopOInTnzdT1K4bT3FPaZ0wTgQnihPDieOkoaTG/TGWaY6xeEcKTggnYfo87wOLCONEcKI4MZw4ThpM4v7YOonTp+ncZ6WOEE4qThgnghPFieHEcRKnv7Kzr8b9sXVScEI4qThhnAhOFCeGE4fJmd0tK7tm65m9LTrfINeeVJwwTgQnihPDieOkwSTuj4131ydi0pGCE8LJpfQDwjgRnChODCeOkwaTM7t+Vkmc/sr+9xr3x9ZJxQnjRHCiMIlXr2NHZ95qr3w6zDR+1/YX1TSfKuOPpzcX+m8EujiCt+8jfKGaQRyjRjP6trM9VYtc/Fit/1jxIxY676EYu0FDhyyDPINaAsUr5UuoZBBlUJyT03QRMPZT6EczIV74jr/2NAL/cAS7WANzV3g8A/z05Iz//3T+Qg1HHK+WL6GSQZRBNYM4g+KceJhWKOM9O/7JTOB4ATz+2tMI9MMR2sUaSJeFxyvm8T4onZB1qGQQZVDNIM4gySDNoLirtR4uDRlUUPQ5vvr7+mV/ffOwOz6ief/+ePvtic23f553i4c3n1+ebnd37y+7w2Ocpyc4D9Fx20r7dXhoaXxRpW3Hbu/h5eGDVbNttTaOOY77Lw==", "file_map": { "12": { "source": "// docs:start:from-trait\npub trait From {\n fn from(input: T) -> Self;\n}\n// docs:end:from-trait\n\nimpl From for T {\n fn from(input: T) -> T {\n input\n }\n}\n\n// docs:start:into-trait\npub trait Into {\n fn into(self) -> T;\n}\n\nimpl Into for U\nwhere\n T: From,\n{\n fn into(self) -> T {\n T::from(self)\n }\n}\n// docs:end:into-trait\n\n// docs:start:from-impls\n// Unsigned integers\n\nimpl From for u32 {\n fn from(value: u8) -> u32 {\n value as u32\n }\n}\n\nimpl From for u64 {\n fn from(value: u8) -> u64 {\n value as u64\n }\n}\nimpl From for u64 {\n fn from(value: u32) -> u64 {\n value as u64\n }\n}\n\nimpl From for u128 {\n fn from(value: u8) -> u128 {\n value as u128\n }\n}\nimpl From for u128 {\n fn from(value: u32) -> u128 {\n value as u128\n }\n}\nimpl From for u128 {\n fn from(value: u64) -> u128 {\n value as u128\n }\n}\n\nimpl From for Field {\n fn from(value: u8) -> Field {\n value as Field\n }\n}\nimpl From for Field {\n fn from(value: u32) -> Field {\n value as Field\n }\n}\nimpl From for Field {\n fn from(value: u64) -> Field {\n value as Field\n }\n}\n\nimpl From for Field {\n fn from(value: u128) -> Field {\n value as Field\n }\n}\n\n// Signed integers\n\nimpl From for i32 {\n fn from(value: i8) -> i32 {\n value as i32\n }\n}\n\nimpl From for i64 {\n fn from(value: i8) -> i64 {\n value as i64\n }\n}\nimpl From for i64 {\n fn from(value: i32) -> i64 {\n value as i64\n }\n}\n\n// Booleans\nimpl From for u8 {\n fn from(value: bool) -> u8 {\n value as u8\n }\n}\nimpl From for u32 {\n fn from(value: bool) -> u32 {\n value as u32\n }\n}\nimpl From for u64 {\n fn from(value: bool) -> u64 {\n value as u64\n }\n}\nimpl From for i8 {\n fn from(value: bool) -> i8 {\n value as i8\n }\n}\nimpl From for i32 {\n fn from(value: bool) -> i32 {\n value as i32\n }\n}\nimpl From for i64 {\n fn from(value: bool) -> i64 {\n value as i64\n }\n}\nimpl From for Field {\n fn from(value: bool) -> Field {\n value as Field\n }\n}\n// docs:end:from-impls\n\n/// A generic interface for casting between primitive types,\n/// equivalent of using the `as` keyword between values.\n///\n/// # Example\n///\n/// ```\n/// let x: Field = 1234567890;\n/// let y: u8 = x as u8;\n/// let z: u8 = x.as_();\n/// assert_eq(y, z);\n/// ```\npub trait AsPrimitive {\n /// The equivalent of doing `self as T`.\n fn as_(self) -> T;\n}\n\n#[generate_as_primitive_impls]\ncomptime fn generate_as_primitive_impls(_: FunctionDefinition) -> Quoted {\n let types = [\n quote { bool },\n quote { u8 },\n quote { u16 },\n quote { u32 },\n quote { u64 },\n quote { u128 },\n quote { i8 },\n quote { i16 },\n quote { i32 },\n quote { i64 },\n quote { Field },\n ];\n\n let mut impls = &[];\n for type1 in types {\n for type2 in types {\n impls = impls.push_back(\n quote {\n impl AsPrimitive<$type1> for $type2 {\n fn as_(self) -> $type1 {\n self as $type1\n }\n }\n },\n );\n }\n }\n impls.join(quote {})\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_0.snap index 368bea544aa..0e8ea0431b3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_0.snap @@ -80,8 +80,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdvZTiM7EAbgd8k1F3ZtLs+rHI1GLGEUCQFiOdIR4t1Ph8Ed1K509DvDDUqjfHbb5V5csd82N9ur19+/dve3D8+bH/+8be4eri9fdg/309Hb+8Xm6ml3d7f7/evrvzdp/8fk4/vPj5f3+8Pnl8unl82PnPPFZnt/s/+kk7/d3W03PzS9/7zYmMLCYFFQUSgUUpoQX4q4Ha5N1LwUYTsop09B2ZaiwMJhUVHhYV9xkk/Badm7HvaVJP8UYrwUYV+JUxO1LEWBhcOioqImWORIqNin0OlrCxH2rlrrXbW6FGHLrbbRXqirI2x5kdqELuvIKeEk44RwwjgJb3PF25Av7h0Je8xTi6OnZeRzDtvipQ0Wr9aRsC2V2l2osnZEcKI4MZwUnIQDeRp63O7CKfd9VgcQpRGURxCNIB5BMoJ0BB3pcpufr8m6K4h5BMkI0hFkI6iMIB9BI10uaQTlEUQjaGREyJE41cOArdKheuQN0uZXSKYlUhqoSXkEyQjSkTbZCCojyEfQSJwsjSCGn+fx5MipBcmpJ4oTw0kYH+f2zu/cDR5znFSYlHSiLQHJOCGcME4EJ4oTw0nBSRz97CukwsQTTjJOCCdxXHS+9rW7xOLJ5eq7fDzzW62lHpkxtKmMe9eWyjgRnChODCcFJ46TeCSXMpPlvITiue86yTiJo+9+dIxRPPddJ4ITPdGWgBhOCk4cJxW9kKfcGU4yTggnjBPBSUHzURTP43UeY1qpIxUm8Rx+ncTZuKoz6doSz9/XCeNETrWlJ4oTw0nBieOkwoQTTjJO4ujPmcKIME4EJ4qTMPom7dq30pOCE8dJhUmc2VgnGSeEE8aJoOl7EsWJ4aTgxHFSYaIJJxknhBPGCR59xaOvePQVj77i0Vc8+oZH3/DoGx59w6NvePQNj77h0Tc8+oZH3/Dox9keppaG4i7XR3G2h23+hdtLRwQnihPDScGJ46TCJM72rJPwqmRvk3eu3BHCCeMkjv78oz132XiKc0rrxHBScOI4qTCJF0ask4yTMPqibYyJekcYJ4KTeEXMvN4oIoaTghPHSUUJx/mxdZJxQjiJo0/t2hejjghOFCeGk4ITx0mFSZwfWydx9I+tILvovjpNAFvx08TucKMgCr7MVNpSwenjIe+a6c/J0Nknkw8nQ2eeDP/NniH7ejIf5cu55XOlQ/mlK1+/uXz75vLLN5fv31x+/d7y46TrXywfuzN8EMJJvHZiZX0wx7nTbPMSDetJwYnjpMIkzp2uk4wTwgnjJLyh5fkmm4t2RHFiODkV/YA4TipMJOEk44RwwjgRnMAr/fnImrNVUnDiOKkwiXOnqyTObEy5q3lTgYme9dZzZC/F1xq8Lh8VR7ZTnEDxjgo7PJSslvPaUk+eVu1OK86eTEnINpCppNShPIJoBPEIkhGkI8hGUBwnp/YSMGWO6KyRECdFpmIPNciZNeSTbRBZNjzOokzZuHRA2iEeQTKCdATZCCojyHEkcbZjPbiSaAQxit6no38vn3aXV3fbzw2Ct6/311/2C77897hdbB18fHq43t68Pm33mwgP+wf3lUu90Ppzv2VmOmDlC1bfH+67gKfT4MJTnVO9/wM=", + "bytecode": "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", + "debug_symbols": "tdvbTvM4EAfwd+l1L+zxnMyrrD594lA+VUKACqy0Qrz7pqhJ2Xia6u9ubxBB+TmZjHPwYH+uHjZ3H39+b58fX95WN399rp5e7m/fty/Pw9bn13p1t9s+PW3//P7551Xa/1D+3v/t9fZ5v/n2frt7X93knNerzfPD/jcZ/OP2abO6kfT1a71SgYXCwlBhFAq2UbDPRRyHyyhqnoswDsrpICjrXBgsHBYVFR5eq5L4IEqaX10PrxUnPwjWMhfhtWKnUVSbC4OFw6KioiZY5EgI60HIsNtMhFdXdLy6onUuwsi1jr3dqDlGGLlxHYXMj5FTwknGCeGk4CR8zJmPXd7cGxJeMU9jHj3NM59zGIvb2Fm8akPCWCqNT6FapCGME8GJ4sRwEnbkOnX9aqUhFSaUcJJxQjgpOGGcCE7iV3bS6X2atLljyHqQ96DagUrqQbkHUQ8qPajnknNPTNwTE/fExPEnaaplQpUbJD1Ie5D1IO9BtQNJ6kG5B/XkSU592ev0aV9ojrQnJu2JSakHlZ6YuAdJD9Ie1JUn70CW4e+seLDnNCbJqSUFJ4yTMD9exrGYl6bzxIPKZWI48TOxBKTCxBNOMk4IJwUnjBPBSZz97AvEcOI4qTCJh8rLJM6LTPe+NLdYVXiMFY99l45C8djXbRxiunNDMk4IJwUnjBPBieIk7slmE5GGOE4qTHKcffeTfYxyxgnhpJyJJSCME8GJ4sTQG5my46TChBJOMk4IJ3CdkOJxvEx9TCo1xHDiOAnzIlUm0sQSj9+XScYJnYulJQUnjBPBieLEcOI4qTDhOPtTBTciGSeEk4KTMPvK472v1hLBieLEcOI4qTCJqxrLJOOE0H+rkBScME4EJ4oTw4njpMIkrv8sk4wTPPuKZ1/x7CuefcWzr3j2Fc++4tk3PPuGZ9/w7BuefcOzb3j2Dc++4dmPqz2FxjJUaWp9FFd7ik4zD7wZiZ+YrLBICk4YJ4ITxYnhxHES3pXFx8F7qfP/EFJc7VkmGSdx9qfJFKWpxlNcU1omjBPBieLEcOI4qSgpcX2MZexjLN6QjBPCSZh9nuaBRYRxIjhRnBhOHCcVJnF9bJnE2afx3melhhBOCk4YJ4ITxYnhxHESZ//UzL51s+swMB+bHwbcxwcFUbBzGb7MxofK8GEz7Zzp+2Tiyht0Mvl4MnThyeT/88qQ/jyZ7/bp0vZLpWP71rRfrtw+X7l9uXL7euX27crt+5Xbx54Me1ISTuK5EwvztktcO806TdHQlghOFCeGE8dJhUlcO10mGSfx3JnpIZtNGlJwwjg5l/2AKE4MJ46TChNJOMk4IZzE2V9YgVFOzDlbJIITxYnhxGESVzaGmuK02ENZLvrqiQsh/zmC1/mrIi6FnEPxaho9vpS02mWx2NnTqu1pxQtwdJrFM9QjU4NqB4orKOdQ7kHUg0oP4h4U58lp/AgYKnp0UU+IiyJDs8cj8IVHqGdjYJ4FznEVZaiSpiOSBuUeRD2o9CDuQdKDtAfFta7F5HJOPSij6GvY+vt2t729e9ocFm4+fjzf/1jH+f7P62a2pPN193K/efjYbfaLO4/rOvep47qW+mu/lGnYKJrXRXW/uT+xYnVdPA/HHI77Lw==", "file_map": { "12": { "source": "// docs:start:from-trait\npub trait From {\n fn from(input: T) -> Self;\n}\n// docs:end:from-trait\n\nimpl From for T {\n fn from(input: T) -> T {\n input\n }\n}\n\n// docs:start:into-trait\npub trait Into {\n fn into(self) -> T;\n}\n\nimpl Into for U\nwhere\n T: From,\n{\n fn into(self) -> T {\n T::from(self)\n }\n}\n// docs:end:into-trait\n\n// docs:start:from-impls\n// Unsigned integers\n\nimpl From for u32 {\n fn from(value: u8) -> u32 {\n value as u32\n }\n}\n\nimpl From for u64 {\n fn from(value: u8) -> u64 {\n value as u64\n }\n}\nimpl From for u64 {\n fn from(value: u32) -> u64 {\n value as u64\n }\n}\n\nimpl From for u128 {\n fn from(value: u8) -> u128 {\n value as u128\n }\n}\nimpl From for u128 {\n fn from(value: u32) -> u128 {\n value as u128\n }\n}\nimpl From for u128 {\n fn from(value: u64) -> u128 {\n value as u128\n }\n}\n\nimpl From for Field {\n fn from(value: u8) -> Field {\n value as Field\n }\n}\nimpl From for Field {\n fn from(value: u32) -> Field {\n value as Field\n }\n}\nimpl From for Field {\n fn from(value: u64) -> Field {\n value as Field\n }\n}\n\nimpl From for Field {\n fn from(value: u128) -> Field {\n value as Field\n }\n}\n\n// Signed integers\n\nimpl From for i32 {\n fn from(value: i8) -> i32 {\n value as i32\n }\n}\n\nimpl From for i64 {\n fn from(value: i8) -> i64 {\n value as i64\n }\n}\nimpl From for i64 {\n fn from(value: i32) -> i64 {\n value as i64\n }\n}\n\n// Booleans\nimpl From for u8 {\n fn from(value: bool) -> u8 {\n value as u8\n }\n}\nimpl From for u32 {\n fn from(value: bool) -> u32 {\n value as u32\n }\n}\nimpl From for u64 {\n fn from(value: bool) -> u64 {\n value as u64\n }\n}\nimpl From for i8 {\n fn from(value: bool) -> i8 {\n value as i8\n }\n}\nimpl From for i32 {\n fn from(value: bool) -> i32 {\n value as i32\n }\n}\nimpl From for i64 {\n fn from(value: bool) -> i64 {\n value as i64\n }\n}\nimpl From for Field {\n fn from(value: bool) -> Field {\n value as Field\n }\n}\n// docs:end:from-impls\n\n/// A generic interface for casting between primitive types,\n/// equivalent of using the `as` keyword between values.\n///\n/// # Example\n///\n/// ```\n/// let x: Field = 1234567890;\n/// let y: u8 = x as u8;\n/// let z: u8 = x.as_();\n/// assert_eq(y, z);\n/// ```\npub trait AsPrimitive {\n /// The equivalent of doing `self as T`.\n fn as_(self) -> T;\n}\n\n#[generate_as_primitive_impls]\ncomptime fn generate_as_primitive_impls(_: FunctionDefinition) -> Quoted {\n let types = [\n quote { bool },\n quote { u8 },\n quote { u16 },\n quote { u32 },\n quote { u64 },\n quote { u128 },\n quote { i8 },\n quote { i16 },\n quote { i32 },\n quote { i64 },\n quote { Field },\n ];\n\n let mut impls = &[];\n for type1 in types {\n for type2 in types {\n impls = impls.push_back(\n quote {\n impl AsPrimitive<$type1> for $type2 {\n fn as_(self) -> $type1 {\n self as $type1\n }\n }\n },\n );\n }\n }\n impls.join(quote {})\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 0e0e9b00ee4..30d32ace07b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/6_array/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -80,8 +80,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zdvZbts6EAbgd/G1L8iZ4XCYVzkoiixOYSBIgiwHKIK8e2XDlF1xpOCngyY3RVToo7gMaXHR2+pmc/X66+f2/vbheXXx39vq7uH68mX7cD9cvb2vV1dP27u77a+fp/+9Crt/VPb3Pz9e3u8un18un15WFzHG9Wpzf7P7Kw3+dnu3WV2k8P5jvdIEC4VFRkUmV0iuQmwq/HJYqqLEqXDLQTEcBEWdigwLg0VBhbEnOMhBcJjWrrkll2AHIcpT4ZZcjKooeSoMFgUVJcAiwsKNxCR6EGm4bSLcukpaazdpmYgY3IJoqeGeKTTELUmWUklqn0I4YZwIThJO3BDOVoM+23SAGIYbj1ioLWkhN8Qti+UaLla0IW5ZCtVxqHBqiOIk48RwUmBCbiQPAc51HA7NABYp9iDqQdyDpAelHqQ9KHcgnqlyHX9hgzY9iFMP0h6Ue5D1oNKBJPSgnioX6kHcg6QH9USEzLRTOQZskSlKceYdUseXSKYGSc+TUg/SHpR7ymQ9qHQgDT2op52UelCCf8/9qYtRbSSjlmScGE7c9jGub/3GTfDkgJOIE/qgLA5hnAhOEk4UJxknhpMCE/NbP9oCiTghnDBOBCd+u6Sx76emi/mTxcV3+cL4U2ZmDHUqY9aUpSScKE4yTgwnBSUUAk78SM55JKkhhBPGid/6ZrMxRv7cd5koTvIHZXGI4aTAJAacRLQjUyScME4EJwknipOCrkiRP49PY4ylQg2JOCGcuO2SShpJWxbBScKJflSWlmScGE4KTDjgJOKEcMI48Vt/XCn0SMKJ4iTjxHDitr5KHS40/0XWza2kMu49qBx/8oicm5ly3dQZ/jzeHGmfGX/dpDczVk4zs08/fmb6pU2fzk5/fKmnHMJ5lcnfKTNu/CuNmaHplhJJQTc9KGH1vycMPcWppWG6XmvJTlYhemrJX4/qzYzIND79pSso/eNGo53Z2f0lsa/KTP5OmTE88vHO4i+qMdVicLOkRupvJeu4lWz533UW/yxDb2bazuKvH0Lpf15I+CuTX5UZt7Ow1Sk5l2Yw99c8l0mBib/myeNmPP+9xu7VEp+ExHnx6a+mQplZjE9/6RVK//NCwl/U/arMuCODpNpZJFkTOQknihP/mMx4bMkjhpMCE3+5eJlEnBBOGCeCE7/1qQ41ovTvJkEzp686M9NOgmbOanWm306CZk52Iel/3rxj5tDY12Rm5jza3Lk6JzMSasaHuaZOa37m9BqQPhc6pp/PKyx9p8zwd8qMQJnZk4QT/xzAwhFZ8ndnoo5nFJqzGuzvziyTiBPCCeNEcJJwojjxz4GMQRZzaojhpMAkftT6Dok4IZwwTgQnCSeKk4wTv/UXDruzvwe0SGbOci6SiBPCCWPkfbj6//Jpe3l1tzl8QnH7en998kXFy+/HzeTjisenh+vNzevTZveZxfELi92jpaxT+bE7hTxcMOmaOe4ud4VnkfUwLRqeOTz3Dw==", + "bytecode": "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", + "debug_symbols": "zdvbbts8DAfwd8l1LiSSksi+yodh6CEdAhRt0cMHDEXffU4XOZnFOPgrwbKboi78k3WgXIuWPxZ3q5v3H9/Xj/dPr4ur/z4WD0+312/rp8fh6ONzubh5WT88rH983//zImx+ZPk6//X5+nFz+Pp2/fK2uIoxLherx7vNb2nw9+uH1eIqhc9vy0VOsMiwKKgo5AopVYhOhd8OTVVYnAq3HRTDVlDMU1FgobAwVCh7goNsBYdp76rbcgm6FZJ5KtyWi1IVVqZCYWGosACLCAs3EpPkrUjDaRPh9lXKtXdTtomIwW1IthruhUJD3JYUsUpSexXCCeNEcJJw4oZw0Rr0Rac3iOF24xENdSQ1lIa4bdFSw0UtN8Rti1G9DxmnhmScFJwoTgwm5EayjcFvhRsScUI4YZwIThJOMk4KTtzRH6bR+B815GbGkHUgDj0o9iDqQdyDpAelHtTT5dLTJulpk/S0SfwHxmA8IpMGlR6kPcg6UAo9KPYg6kHcg3rGKdmBZ/s8PtwzTVHuaVPuadOBBdERlHralHtQ6UHag3rGqYQexPBzVvGfs6gOklJLEk4yTtzxUa6rMeUmePwl3zwxmGg40haHRJwQThgngpOEk4yTghN/9KPOEIOJv/CdJxEnhBN/XNI491MzxUzRNRb5a9+5q5C/9tVSl5iq0hDGieAk4STjpOBEceJHcikjma4Xh7wWTiJO/NFXPRxjkXEiOElH2uKQjJOCE8WJwROZAk4iTggnjBPBCZwpJH8dn8YYS0YNMZj4a/h54o5LsjSSpi3++n2eME7kWFtaknCScVJwojgxmEjAScSJP/pjBtcjjBPBScJJxok7+lnq7SKXP8iyOZWyjO+Esuz+5RE5JzOV+rJt+HV3cqTfldFzVkZtvzJf5ds5y7emfD8bA5U/PtRTCeGkzvSzPJeqjBv/mcbK0DRVTKmgL6MoY/3/RSJ0FaeXhuV67SXdy0L09JKfj+qtjMg0Pv3UFVT+7gWwnjjZ/ZTYpSqT/qXKZDzy8cniJ9WYajO4SakNtXZJHl/xa/l7k8Xfm9FbmXay+PlDqPzzhYSfmbxUZdzJwlqX5GzNzdzPec6TghP3+YHHTRL8Z47d6yXeC4kT49NOrsxsfPqpV6j884WEn9S9VGXcO4OkOlkkTd8Nkp8unieCE3fiyLidzCMZJwUnihODyYF9UrMk4oRw4o8+1VuNZPp7iyCTc1amXQT5ufHe8ttFkOWTyz/fusPfBHepyviz7NB+R6cyEmrFh7xFbnreTi2fjXbll1May/5ewktVJv5LlSGoMl+EceLvA5jZusz+25mYxz0KuSWKE4OJ/3ZmnkScEE4YJ4ITfx/IGGSxpIZknBScHBt9hxhMKOAk4oRwwjgRnCSc+KM/8xEC+++A5onixGByYB/nLIkY+RyO/r9+WV/fPKy2n7bcvz/e7n3p8vbzeTX56OX55el2dff+stp8/rL78mUTEmLLZN82u8OHA2ZZMn8dbqrFiZacZLjmcN1f", "file_map": { "12": { "source": "// docs:start:from-trait\npub trait From {\n fn from(input: T) -> Self;\n}\n// docs:end:from-trait\n\nimpl From for T {\n fn from(input: T) -> T {\n input\n }\n}\n\n// docs:start:into-trait\npub trait Into {\n fn into(self) -> T;\n}\n\nimpl Into for U\nwhere\n T: From,\n{\n fn into(self) -> T {\n T::from(self)\n }\n}\n// docs:end:into-trait\n\n// docs:start:from-impls\n// Unsigned integers\n\nimpl From for u32 {\n fn from(value: u8) -> u32 {\n value as u32\n }\n}\n\nimpl From for u64 {\n fn from(value: u8) -> u64 {\n value as u64\n }\n}\nimpl From for u64 {\n fn from(value: u32) -> u64 {\n value as u64\n }\n}\n\nimpl From for u128 {\n fn from(value: u8) -> u128 {\n value as u128\n }\n}\nimpl From for u128 {\n fn from(value: u32) -> u128 {\n value as u128\n }\n}\nimpl From for u128 {\n fn from(value: u64) -> u128 {\n value as u128\n }\n}\n\nimpl From for Field {\n fn from(value: u8) -> Field {\n value as Field\n }\n}\nimpl From for Field {\n fn from(value: u32) -> Field {\n value as Field\n }\n}\nimpl From for Field {\n fn from(value: u64) -> Field {\n value as Field\n }\n}\n\nimpl From for Field {\n fn from(value: u128) -> Field {\n value as Field\n }\n}\n\n// Signed integers\n\nimpl From for i32 {\n fn from(value: i8) -> i32 {\n value as i32\n }\n}\n\nimpl From for i64 {\n fn from(value: i8) -> i64 {\n value as i64\n }\n}\nimpl From for i64 {\n fn from(value: i32) -> i64 {\n value as i64\n }\n}\n\n// Booleans\nimpl From for u8 {\n fn from(value: bool) -> u8 {\n value as u8\n }\n}\nimpl From for u32 {\n fn from(value: bool) -> u32 {\n value as u32\n }\n}\nimpl From for u64 {\n fn from(value: bool) -> u64 {\n value as u64\n }\n}\nimpl From for i8 {\n fn from(value: bool) -> i8 {\n value as i8\n }\n}\nimpl From for i32 {\n fn from(value: bool) -> i32 {\n value as i32\n }\n}\nimpl From for i64 {\n fn from(value: bool) -> i64 {\n value as i64\n }\n}\nimpl From for Field {\n fn from(value: bool) -> Field {\n value as Field\n }\n}\n// docs:end:from-impls\n\n/// A generic interface for casting between primitive types,\n/// equivalent of using the `as` keyword between values.\n///\n/// # Example\n///\n/// ```\n/// let x: Field = 1234567890;\n/// let y: u8 = x as u8;\n/// let z: u8 = x.as_();\n/// assert_eq(y, z);\n/// ```\npub trait AsPrimitive {\n /// The equivalent of doing `self as T`.\n fn as_(self) -> T;\n}\n\n#[generate_as_primitive_impls]\ncomptime fn generate_as_primitive_impls(_: FunctionDefinition) -> Quoted {\n let types = [\n quote { bool },\n quote { u8 },\n quote { u16 },\n quote { u32 },\n quote { u64 },\n quote { u128 },\n quote { i8 },\n quote { i16 },\n quote { i32 },\n quote { i64 },\n quote { Field },\n ];\n\n let mut impls = &[];\n for type1 in types {\n for type2 in types {\n impls = impls.push_back(\n quote {\n impl AsPrimitive<$type1> for $type2 {\n fn as_(self) -> $type1 {\n self as $type1\n }\n }\n },\n );\n }\n }\n impls.join(quote {})\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index e889f7b920d..7f5de07815d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/92aWVMTQRDHJ2E3YYMI3rei4nsOwvFmlReKyn2fS0LgVV+0ypc8WGX5Bfy80jCD/zTTgMUOVjtV1Gx2ftv9n9lOz0Fy5rAM7v/l7HVk67yt6X5sOotjn9u6fL5SydBWOZTGnAKNeQUauxRojDLUSNoGTGfJWm+sYEwLCjQWFWjsVqAxUaCxpEBjjwKNlxRo7FWg8bICjX0KNPYr0HhFgcarCjReU6DxugKNNxRovKlA4y0FGm8r0HhHgca7CjTeU6DxvgKNDxRofKhA4yMFGgcUaHysQOMTBRqfKtA4GEDjQXkG1ySaDo/pcJYOP+lAkQ7s6ECMDpzoQIcOTOhAgjb8tKGmDSttCGnDRRsa2jDQgpwWvLSgpAUbLYhowUETOk2YNCFRwqeESgmLEsLA/h8FNAUMvZBBIxc3uL9sndg6D+0ZHjBXEuY3S/uj5eGxxNO/DPXXErCZvf1q3dmPwugvF62dl+1O+4b57WIcfwafewXMK4F5DcxrgXkDzBuBGQdmXGDeAvNWYN4B805gJoCZEJj3wLwXmA/AfBCYj8B8FJhJYCYFZgqYKYGZBmZaYGaAmRGYWWBmBWYOmDmBmQdmXmAWgFkQmEVgFgVmCZglgVkGZllgVoBZEZhVYFYFZg2YNYFZB2ZdYDaA2RCYTWA2BWYLmC2BSYFJBWYbmG2BaQDTEJgmME2B2QFmR2BawLQEZheYXYHZA2aPMQlcG5P13DY0FHhuqPeyvhroi/Mdh/E9nGP+jOmclwzzXzIh5+HDHyegP6eHj49bJ/U6pv1HT461Re3j/XBtMbS590vrxHHgfLFFxb2bEGu2/bgbCxt31fK/i7tq5X+MO94WtY/342/jjseW42bhet5eh82Dw2Mh453KNY9+9EWl2DZHxY1HF9xz4+rGuRt51pZAW9Tu9FOynyPwg7acjpjxM/Zzn60L8Ix7vt/jv8D8d+j23OPjknj4xMPTXnjCXtMe2O3bXrQ77T23dfl85eAf/xSjn629s+ScQPnuzDnH+b+onBMxPTmmMc/GJ9BaoO78Fjx6fDnwCmjFd4b6nK0BW/eZ0+fTUHtwnuMj6B/6zEE/eX9wfojZvaatKd6/Mns85qR33G+Ox9xFrQXddxPfvyuurch8Y1s3tPH8ZFj/sWCfyMY3sMs5rgfjyGmLWdsnW4eev64ynegLc23Uzt7/yOhhfFNx81xsjo81+o8Z/8V+Lnn6cZ4fkrZG0kqrlrbSetpsDjVSPk6GjVPW/tOR2mijOtQY2a7X0trwqf598xXm6JxQH4zlCbb7PbbcvBv4u1129gtB7FeP7BfD6K/wdQOOFfXpO9zHNvcd4M8WoB35n2Dzh732zVnuHfZAe+xpd8/h+fhJ+d/dL3l4PMPvYtow95bOYCt/gu8eD186wTfq6hF8R3APtSaM7/Zoij19498lbhefw35gDLhYPWts/QaOj2AGZTIAAA==", - "debug_symbols": "ndbRioMwEAXQf8lzHmYm0WT6K8uy2DYtgmixdmEp/feN3RaLFZbrizjiMSQ3hrmafdpejl91e+jOZvNxNU23q4a6a3N1vVmz7eumqY9fr48NjZdY3t8/n6p2LM9D1Q9mI4Vak9p9vouU/aFuktkUdPu0JgZYRFgoKpRgwbAQWDhYeFgUsIAzVzhzhTNXOHMmwgnjZDl2dQ/iSN+Iw4nHSYGTEicBJxEnChMmnDBO8PQFj1LwKAWP0i3OhTXww7BGntCfKZaNls8/hqScm7BinOU9QzSNw25uFDeeVpjlbUMcpjUo5kZWGLfC+P/n85qPfc9FyD9zEQ7z76/I35crTADNLRffVV9X2yY92pzDpd29dD3DzynNGqBT3+3S/tKnsRWauqBx3YPYKPejKBfM3jLr/QAYSyHLInnMPO4v", + "bytecode": "H4sIAAAAAAAA/92aWVMTQRDHJ2E3YYMI3rei4ntCCMcbVcp93/exBAL6os8+xSrLL2CVn1caZvSfznRE2dVqp4qazc4v3f+Z7e05SMZclN6zv4y9DmydtTXdD01jceyIrYtXK6UEbRXT0phRoDGrQGObAo1BghpJW49pLEnrDRWMaU6BxrwCje0KNEYKNBYUaOxQoPGaAo2dCjReV6CxS4HGbgUabyjQeFOBxlsKNN5WoPGOAo13FWi8p0DjfQUaHyjQ+FCBxkcKND5WoPGJAo1PFWh8pkBjjwKNzxVofKFA40sFGntT0HheXsE1iabDYzqcpcNPOlCkAzs6EKMDJzrQoQMTOpCgDT9tqGnDShtC2nDRhoY2DLQgpwUvLShpwUYLIlpw0IROEyZNSJTwKaFSwqKE0HP2RwFNAUMPpNfIxQ3uN1tHts5Ce4IHzKWI+U3S/lBxYDjy9C9B/eUIbCZvv6/i7Afp6C/mrZ039Ub7hvltYxz/Dn5vFJhRgRkDZkxgxoEZF5gJYCYEZhKYSYGZAmZKYKaBmRaYGWBmBGYWmFmBmQNmTmDmgZkXmAVgFgRmEZhFgVkCZklgloFZFpgVYFYEZhWYVYFZA2ZNYNaBWReYDWA2BGYTmE2B2QJmS2C2gdkWmB1gdgRmF5hdgdkDZk9g9oHZF5gDYA4EJgYmFphDYA4FpgpMVWCOgDkSmGNgjgWmBkxNYE6AORGYU2BOGRPBtTFJz239/SnPDZVO1lcDfXG+w3R8D2SYP2Ma5yXD/BdMmvPwxY8T0J/Tw8fHrZM6HVP/qSfD2oJ6cz9cWwht7vnSOnECOF9sUXHPJo0121ncDacbd33Ffxd3faX/Me54W1Bv7sfvxh2PLcctw/WqvU43Dw4MpxnvVG559KMvKvm6+VHceLTBPTeubpzbkWdtEbQF9UY/Bfs5AD9oy+kIGb9kP3fZOgffcd/v9vjPMf8Nuj33+LhEHj7y8LQXnrbXtAd2+7bX9UZ7I7YuXq2c/+OfYvSdtXeZnJNSvrt0znH+/1bOCZieDNOYZeOT0lqg4vzmPHp8OfAGaMVnhvqcrR7Wh7TXUvyHnlQ6mSbsl2vLQxt/xwwbFyw8j38Au5zjejD2nLaQtb21ddo5+CbTib4wXwT15P0PDl38yJCKy9WhaR5r9B8y/r39XPD04yo/hqwNxqVaOa7FlfjoqL8a83EybJx8OQ/f84xQn/elhe1ujy2Xu7tM8/vHcyuP/ZE/HA9enC/3/rh5k/sMoT/8fctDn0J276OtaVy/sv751mxhi7HzrS9Tzq3FyNPfJNfyzn57OvpLfN7GsaLn+0l4JqFpnkNwHELGfwGbn+11l2l+bi7+O4w/7gOmB8+nW82x7n7Bw+MZehvThjFeuIStbAvfHR6+0MI36uoQfAdwD7VGjM95NIWevvE8xO1K7yXGgIvVy8ZW0jk9HiwPVfv6q4OHlXJcHvhlTv8OpYiX42UyAAA=", + "debug_symbols": "ndZdioQwDADgu/TZh6Sttp2rLMvgaB0EUfFnYRHvvtV1UFyXIXkRI36mNiVkErl/jM97WRdNL24fk6iaLB3Kpg7RNEfi0ZVVVT7vx8cClotN1vf7Nq2XsB/SbhA3GbtI+DoPdxaCL8rKi1sM82ckrCELSxaOKhyQBZKFJAtFFvpSOLUJBe4sYrJIyMKQhSULRxUIQCdIJ5JOFJ2QC49Iz4KMLDGdXB4wdAY3g87ijn6NYRjLMI5uJDAMMoxkGMUwjD1Q/6zNJa9eBjI5G83Ic33cAPY8qM4mYRjDMNdNDdDsexCfjaMbDQyD7//nWJ/ob10k6FddJJrz9xn114phNNHMIfhKuzJ9VH4bd4qxzg7Tz/Dd+tMg1HZN5vOx88tItE9Dy3qNjKxcO3IIMGwfIq6NYwm1iVC7kDPk/QE=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_0.snap index 2e91cd2f49d..1215274070a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_0.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/92ayW8TMRTGnXQm6SQtLfsOBco9S9PlxgHovu97p2nTnpA4wDkSF5D4o+lr7fbLy7xQ1LHgYSmyZ/zze5/tN2OPlYy5SINnv4wtBzbP2pzuh6Y1OfadzUs3S+UUbZV8acwo0JhVoLFLgcYgRY2kbcC0prT1hgrGNKdAY16Bxm4FGiMFGgsKNBYVaOxRoLFXgcZbCjT2KdDYr0DjbQUa7yjQeFeBxnsKNN5XoPGBAo0PFWh8pEDjYwUanyjQ+FSBxmcKND5XoPGFAo0vFWgcUKDxlQKNrxVofKNA46AHjefpLZRJNB0e0+EsHX7SgSId2NGBGB040YEOHZjQgQR98NMHNX2w0gchfXDRBw19MNCGnDa8tKGkDRttiGjDQQs6LZi0INELn16o9MKiF8LA2Y8CmgKGJmTQyMkN7k+bRzbPQn2KB8zliPlN0/5oaXgsSuhfivqrEdhM336l5uwHfvSX8tbO+2arfcP8djGOt8F2H4D5IDAfgfkoMOPAjAvMBDATAjMJzKTATAEzJTDTwEwLzAwwMwIzC8yswMwBMycw88DMC8wCMAsCswjMosAsAbMkMMvALAvMCjArArMKzKrArAGzJjDrwKwLzAYwGwKzCcymwGwBsyUw28BsC8wOMDsCswvMrsDsAbMnMPvA7AvMATAHAhMDEwvMITCHAlMHpi4wR8AcCcwxMMcC0wCmITAnwJwIzCkwp4yJoGxM2mvb0JDntaHWy/pqoC/Od+jH93CG+TOmdV0yzH/B+FyHL/6cgP6cHj4+bp/U65jmlZ4Mqwua7f1wdSHUufmlfeIEcEmxRcnNjY8921ncjfmNu0rp78Vdpfw/xh2vC5rt/fjTuOOx5bhlKK/Yst/34PCYz3indDdBP/qilG+ay+TGowvuuXF149yNPKuLoC5otvop2OsA/KAtpyNk/JK97rN5Dtq49v0J/nPMf4vuhHt8XKIEPkrg6Vt42paL9kcx9M3ec3EXXDX9598Jntblju8E1Jhl45Pzo6fm/OYT9AQJem6DVpwz1OdsDdi8z7Q/gwHrn6e9SCnD9AXQP/SZgX7y/riysW3wXt3mFO8/mD0ec9Ic95v2mMP9Bm+XEXLnx5jrxxKldzYv3SyV+037POeY7zzUpTnPzn63F/uVS/uRH/1lvm/CsaIx/AT3MXZD076nwHEIGf8VbH62Zfd8ZpkPbO/qvpjW+fSxL6B0B+xyTUXQnPQMu3LBXKVO7zTHFxP4AusfjhfGcvEatrIdfPck8MUOvlFXj+A7gHuotcD4fIKmMKFvSc93ntnqtNfF5ycp3l1bjHfHB80rLq04Gxm9WB/OtVr7oWndmxvmP2T8d3uNY+rym/xRujESlxvVuBHX4qOjoXrMnwdKbr6KHvzHI9XRemWoPnJYq8bV4d/6/wWAF+CuLTEAAA==", - "debug_symbols": "tZbLioUwDED/pWsXSau28VeG4eKjXgRR8TEwiP8+1fGiyF1McLoRIz1HSdKaWRQ2m56PqinbQSQfs6jbPB2rtnHRvAQi66u6rp6P82MB68VE2/qhS5s1HMa0H0UiIwqEbQp3Z8DxZVVbkUSwfAbCxGxCswnDJohLELAJZBOSTSg2EbIJds2JXXNi15zYNSd2zRGAj7yvOqkdUUBnJPj70s0uvdqVV3vo045w046kcV+LZPBY/KtXt/UUv7oGZHzV83KzIREfifmI8ZtWutsTAEdaUV30Evzq0a/+9mYH1EfPRVe98qsP/eqjf839eUO+aWIJ4auJJerrp8Rezwap/eqNP/3igq+0r9KstvtsWU5Nfho1x+/OXqbOrm9zW0y9XefPY/Rcu1XLwMjtX+ICVBigirdjZAu1C8m90733Bw==", + "bytecode": "H4sIAAAAAAAA/92ayVMTQRTGO2EmYRIQ3HdFxXtCCMvNg7Lv+w5DIHCyyoOeU+VFq/yj5UG3fPPoF7GYKX12Vapnpn/T7+vXb3qDnLlI/We/nL0ObJ63OT0PTTI59p3NKzdL1RTrqmSlMadAY16Bxg4FGoMUNZK2PpNMaesNFfi0oEBjUYHGTgUaIwUaSwo0lhVo7FKgsVuBxlsKNPYo0NirQONtBRrvKNB4V4HGewo03leg8YECjQ8VaHykQONjBRqfKND4VIHGZwo0Pleg8YUCjS8VaOxToPGVAo2vFWh8o0BjfwYaz9NbuCbRdHhMh7N0+EkHinRgRwdidOBEBzp0YEIHErThpw01bVhpQ0gbLtrQ0IaBFuS04KUFJS3YaEFECw6a0GnCpAmJBnwaUGnAogGh7+xHAU0BQx3Sb+TknPvD5pHN81Ce4gFzNWJ206x/pDI0Gnnal6L+WgR1pl//QN3VH2Sjv1K09bxvJes3zG4H4/g7+N4HYD4IzBgwYwIzDsy4wEwAMyEwk8BMCswUMFMCMw3MtMDMADMjMLPAzArMHDBzAjMPzLzALACzIDCLwCwKzBIwSwKzDMyywKwAsyIwq8CsCswaMGsCsw7MusBsALMhMJvAbArMFjBbArMNzLbA7ACzIzC7wOwKzB4wewKzD8y+wBwAcyAwMTCxwBwCcygwDWAaAnMEzJHAHANzLDBNYJoCcwLMicCcAnPKmAiujUl7bhsczHhuqHezthpoi7MdZmN7KMfsGZOclwyzXzJZzsMX/5yA9pwe7h+3Tup2TOtST46VBa2r7XBlIZS5/qV14gRwvtii5PomizXbWdyNZht3A5W/F3cD1f8x7nhZ0Lrajj+NOx5bjluG6xV7ne04ODSaZbxTuuvRj7YoFVvmV3L+6IBnzq/Oz53Is7IIyoJW0k7J3gdgB+tyOkLGL9n7HpsX4B33fq/HfoHZT+j2PON+iTx85OFpLzxtr8v2RzH01T5zcRdcvvrPjwkZzcttxwTUmGf+KWSjp+7sFj16Ao+e26AV+wz1ubr6bM7nO2OSvjemff/4/BEy5p1JxR/nfyDn44Wz1eNpa8B0FaEszXHMaeq09bkxhNssgL+Qx2tj24TPTmxO99/hHazTgE185vqm11z9dgrMPxnFcSXytDfNdY2rP8pGf5Wvm9BXlH8U+iQ0V9cU6IeQ8V+gzk/22sV1ntnA913ZZ5PszyzWBZTuQL1cU9n4v0XOlsxlajemOb7s4Uusfegv/O7K16gr38Z2l4cvt7GNuroE2wE8Q60lxhc9mgqetvnGxiKryzdWYFy67+e68e74oHXJpRVnwyMX4+q5Vlt/aJJrc8Psh4z/Zu/Rpy6/yT9KN4fjarMWN+N6fHQ02Ij590DJ9Vc5A/vxcG2kMTDYGD6s1+La0G/t/wTasbk3LTEAAA==", + "debug_symbols": "tZZLioQwEEDvkrWLVGJ+XmUYGj+xCYiKn4FBvPvEYKNILybYtRFL6r1IWYm1kMoW8/Ph2robSfa1kKYr88l1rY+WNSHF4JrGPR/nx4RuFy1C/tjn7RaOUz5MJGPCJMS2lb/T1PO1ayzJBF2/E6JlNKGiCR1NmFjC0GgCogkWTfC3hOE7wak5E8n/Uzd5iikXmHKJKVc35WAU7LlgNBzJwa5R7QbTDpTi6gFXz3D1HFefouoB99PC/eIY+TomKZNXfVxxAiLiERmPaNyy3t3vjNKjrMAvekZx9YCrZ7f1oI6eE1c9x9WnuHrx0dqfN+SbJmY0fTUxA3V9FYl6NjCFq9d4+tUHP/ng8qKx++xez215GuWn395epvp+6EpbzYPd5vtjtN+6VbFEs/Az8QFwSIDLcIyEUPnQ+DX9un8=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 2e91cd2f49d..1215274070a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/7/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/92ayW8TMRTGnXQm6SQtLfsOBco9S9PlxgHovu97p2nTnpA4wDkSF5D4o+lr7fbLy7xQ1LHgYSmyZ/zze5/tN2OPlYy5SINnv4wtBzbP2pzuh6Y1OfadzUs3S+UUbZV8acwo0JhVoLFLgcYgRY2kbcC0prT1hgrGNKdAY16Bxm4FGiMFGgsKNBYVaOxRoLFXgcZbCjT2KdDYr0DjbQUa7yjQeFeBxnsKNN5XoPGBAo0PFWh8pEDjYwUanyjQ+FSBxmcKND5XoPGFAo0vFWgcUKDxlQKNrxVofKNA46AHjefpLZRJNB0e0+EsHX7SgSId2NGBGB040YEOHZjQgQR98NMHNX2w0gchfXDRBw19MNCGnDa8tKGkDRttiGjDQQs6LZi0INELn16o9MKiF8LA2Y8CmgKGJmTQyMkN7k+bRzbPQn2KB8zliPlN0/5oaXgsSuhfivqrEdhM336l5uwHfvSX8tbO+2arfcP8djGOt8F2H4D5IDAfgfkoMOPAjAvMBDATAjMJzKTATAEzJTDTwEwLzAwwMwIzC8yswMwBMycw88DMC8wCMAsCswjMosAsAbMkMMvALAvMCjArArMKzKrArAGzJjDrwKwLzAYwGwKzCcymwGwBsyUw28BsC8wOMDsCswvMrsDsAbMnMPvA7AvMATAHAhMDEwvMITCHAlMHpi4wR8AcCcwxMMcC0wCmITAnwJwIzCkwp4yJoGxM2mvb0JDntaHWy/pqoC/Od+jH93CG+TOmdV0yzH/B+FyHL/6cgP6cHj4+bp/U65jmlZ4Mqwua7f1wdSHUufmlfeIEcEmxRcnNjY8921ncjfmNu0rp78Vdpfw/xh2vC5rt/fjTuOOx5bhlKK/Yst/34PCYz3indDdBP/qilG+ay+TGowvuuXF149yNPKuLoC5otvop2OsA/KAtpyNk/JK97rN5Dtq49v0J/nPMf4vuhHt8XKIEPkrg6Vt42paL9kcx9M3ec3EXXDX9598Jntblju8E1Jhl45Pzo6fm/OYT9AQJem6DVpwz1OdsDdi8z7Q/gwHrn6e9SCnD9AXQP/SZgX7y/riysW3wXt3mFO8/mD0ec9Ic95v2mMP9Bm+XEXLnx5jrxxKldzYv3SyV+037POeY7zzUpTnPzn63F/uVS/uRH/1lvm/CsaIx/AT3MXZD076nwHEIGf8VbH62Zfd8ZpkPbO/qvpjW+fSxL6B0B+xyTUXQnPQMu3LBXKVO7zTHFxP4AusfjhfGcvEatrIdfPck8MUOvlFXj+A7gHuotcD4fIKmMKFvSc93ntnqtNfF5ycp3l1bjHfHB80rLq04Gxm9WB/OtVr7oWndmxvmP2T8d3uNY+rym/xRujESlxvVuBHX4qOjoXrMnwdKbr6KHvzHI9XRemWoPnJYq8bV4d/6/wWAF+CuLTEAAA==", - "debug_symbols": "tZbLioUwDED/pWsXSau28VeG4eKjXgRR8TEwiP8+1fGiyF1McLoRIz1HSdKaWRQ2m56PqinbQSQfs6jbPB2rtnHRvAQi66u6rp6P82MB68VE2/qhS5s1HMa0H0UiIwqEbQp3Z8DxZVVbkUSwfAbCxGxCswnDJohLELAJZBOSTSg2EbIJds2JXXNi15zYNSd2zRGAj7yvOqkdUUBnJPj70s0uvdqVV3vo045w046kcV+LZPBY/KtXt/UUv7oGZHzV83KzIREfifmI8ZtWutsTAEdaUV30Evzq0a/+9mYH1EfPRVe98qsP/eqjf839eUO+aWIJ4auJJerrp8Rezwap/eqNP/3igq+0r9KstvtsWU5Nfho1x+/OXqbOrm9zW0y9XefPY/Rcu1XLwMjtX+ICVBigirdjZAu1C8m90733Bw==", + "bytecode": "H4sIAAAAAAAA/92ayVMTQRTGO2EmYRIQ3HdFxXtCCMvNg7Lv+w5DIHCyyoOeU+VFq/yj5UG3fPPoF7GYKX12Vapnpn/T7+vXb3qDnLlI/We/nL0ObJ63OT0PTTI59p3NKzdL1RTrqmSlMadAY16Bxg4FGoMUNZK2PpNMaesNFfi0oEBjUYHGTgUaIwUaSwo0lhVo7FKgsVuBxlsKNPYo0NirQONtBRrvKNB4V4HGewo03leg8YECjQ8VaHykQONjBRqfKND4VIHGZwo0Pleg8YUCjS8VaOxToPGVAo2vFWh8o0BjfwYaz9NbuCbRdHhMh7N0+EkHinRgRwdidOBEBzp0YEIHErThpw01bVhpQ0gbLtrQ0IaBFuS04KUFJS3YaEFECw6a0GnCpAmJBnwaUGnAogGh7+xHAU0BQx3Sb+TknPvD5pHN81Ce4gFzNWJ206x/pDI0Gnnal6L+WgR1pl//QN3VH2Sjv1K09bxvJes3zG4H4/g7+N4HYD4IzBgwYwIzDsy4wEwAMyEwk8BMCswUMFMCMw3MtMDMADMjMLPAzArMHDBzAjMPzLzALACzIDCLwCwKzBIwSwKzDMyywKwAsyIwq8CsCswaMGsCsw7MusBsALMhMJvAbArMFjBbArMNzLbA7ACzIzC7wOwKzB4wewKzD8y+wBwAcyAwMTCxwBwCcygwDWAaAnMEzJHAHANzLDBNYJoCcwLMicCcAnPKmAiujUl7bhsczHhuqHezthpoi7MdZmN7KMfsGZOclwyzXzJZzsMX/5yA9pwe7h+3Tup2TOtST46VBa2r7XBlIZS5/qV14gRwvtii5PomizXbWdyNZht3A5W/F3cD1f8x7nhZ0Lrajj+NOx5bjluG6xV7ne04ODSaZbxTuuvRj7YoFVvmV3L+6IBnzq/Oz53Is7IIyoJW0k7J3gdgB+tyOkLGL9n7HpsX4B33fq/HfoHZT+j2PON+iTx85OFpLzxtr8v2RzH01T5zcRdcvvrPjwkZzcttxwTUmGf+KWSjp+7sFj16Ao+e26AV+wz1ubr6bM7nO2OSvjemff/4/BEy5p1JxR/nfyDn44Wz1eNpa8B0FaEszXHMaeq09bkxhNssgL+Qx2tj24TPTmxO99/hHazTgE185vqm11z9dgrMPxnFcSXytDfNdY2rP8pGf5Wvm9BXlH8U+iQ0V9cU6IeQ8V+gzk/22sV1ntnA913ZZ5PszyzWBZTuQL1cU9n4v0XOlsxlajemOb7s4Uusfegv/O7K16gr38Z2l4cvt7GNuroE2wE8Q60lxhc9mgqetvnGxiKryzdWYFy67+e68e74oHXJpRVnwyMX4+q5Vlt/aJJrc8Psh4z/Zu/Rpy6/yT9KN4fjarMWN+N6fHQ02Ij590DJ9Vc5A/vxcG2kMTDYGD6s1+La0G/t/wTasbk3LTEAAA==", + "debug_symbols": "tZZLioQwEEDvkrWLVGJ+XmUYGj+xCYiKn4FBvPvEYKNILybYtRFL6r1IWYm1kMoW8/Ph2robSfa1kKYr88l1rY+WNSHF4JrGPR/nx4RuFy1C/tjn7RaOUz5MJGPCJMS2lb/T1PO1ayzJBF2/E6JlNKGiCR1NmFjC0GgCogkWTfC3hOE7wak5E8n/Uzd5iikXmHKJKVc35WAU7LlgNBzJwa5R7QbTDpTi6gFXz3D1HFefouoB99PC/eIY+TomKZNXfVxxAiLiERmPaNyy3t3vjNKjrMAvekZx9YCrZ7f1oI6eE1c9x9WnuHrx0dqfN+SbJmY0fTUxA3V9FYl6NjCFq9d4+tUHP/ng8qKx++xez215GuWn395epvp+6EpbzYPd5vtjtN+6VbFEs/Az8QFwSIDLcIyEUPnQ+DX9un8=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 8b1446c7324..f54bf37b86b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -83,8 +83,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "tdzdbtRIEIbhe5njHHT1T3U1t7JarQIEFCkKKMBKK8S9rwewJzvdbate7ZwgBvI4tuuzx11u+/vp/cPbbx//enz+8OnL6c0f309Pn97df3389Lx8+v7j7vT25fHp6fHjX6//+RTOf9T28+e/fL5/Pn/88vX+5evpjai2u9PD8/vzX2telvDh8enh9KaEH3/enSwAI8BEYNLYWFxNDeHaZGAKMApMBcaAaX7TxjmoQTeTruvTBJgITAImA1OAUWDGOahtq4/FzhgwzW8kBIKEoEhQIigTVAhSgipBRhBJhJBECEmEkEQISYSQRMg4EXb5DrPaIyWoEmQENYBiIEgIGifC7IJa6dA4ES3JilrWDmWCCkFK0DgRreQNaeyQEdQASoEgISgSNEmE2oZqt8tTJqgQpARVgoygSSLsgppdozxJxHYRGkPo6pSFoEhQIigTVAhSgoaJiEHKhmLokBHUACqBICEoEpSOUepQJqgco+54KkpQJcgImiRC64b6b3cNBAlBkaBEUCaoEKQEVYKMIJKIShJRSSIqSUQliagkEZUkopJEVJKIShJRSSKMJMImidiGDTG02qFIUCIoE1QIUoIqQUZQA6gFgkgiGklEI4loJBGNJKKRRDSSiEYS0UAiYggECUGRoETQOBFLN25FS2upQ4UgJagSZAQ1gMY9yyMkBEWCEkEkETJJREwbil32RAmqBBlBDaAYCBKCIkGJoEwQSUQkiYiTRJStibGMADtkBDWAUiBICIoEJYImiaiXOlmPCkFKUCXICGoA5UCQEBQJSgSRRGSSiEwSMelZLkFeUcytQ0ZQA2jSszxAQtA4EctJdA8lgjJBhaBxIlJc73Qtu0Q6VAkyghpAk57lARKCIkGJoExQIYgkQkkilCRCSSIqScSkZ5nDdo7IMXYoEpQIygQVgpSgStA4ETleUO5RA2jSszxAQlAkKBGUCZokouiGtHRICZokYptdslxpdIPjSc/yALVDZN3qTXqWr7dpgISgSFDyozSZILdc5f1Gsow1O6QEVYKMoDZBsoMmE+QOkBAUCZrUybYZM0vSOqQEVYKMoEmdat1Bk2lrB0gIigSN65R02xHJcoeUoEqQEdQAmkwmO0BC0LhOqa0tVcldSzVNJpMdoExQIUgJqgQZQeNE5LjN6Mzd7Mc0mUx2gISgSNCkTlv0cuiIusl0/tR2F6lbsensqR0S/ST5SfaT4ifqJ5MO5XZx13+/TnoPu6S5yaTvsEvET8Z1qes10zJ26EjxE/WT6ifmJ81NJqP/XTKuS1svtlM3tTNNRv67JPlJ9pNhXZZTwkq03/xhXVJuO2RYl1S3Fet38ngMvk/ET6KfJD8Z1iW1NWODr9nxyHufqJ9UPzE/aW4yHm/vE/GTYfUv1wo5d6Ucj7T3SfaT4ifqJ+NLuZLXicLLX6/3WZ48X3iAhKBIUCIoE1QAGncNTNZ7wiY9iX6S/CT7SfET9ZPhKcrCOkax0DpiftLcZNyN2CfiJ9FPkp9kPyl+on7ir370Vz/6q5/81U/+6id/9ZO/+slf/eSv/rivYWk9XVp/thx3NfaJ+Ulzk3E/Y5+In0Q/SX6S/aT4ib/6435Ja+vQREKQzggwEZjJ44f18gywvUK/TAamAKPAVGAMmOY3GoAB9dHJftuGzzFEvTZgH8werAqX3yPpysyeq9o1Asyse3h5Wud10+mXScBkYMrx9ryuz11flxguN6WkXi8f1L9WYMxvJq9fCpen5kM3mTRP3r90gDJBhaBxf6/YloHSPVaRJ3fv99Hk7v0BEoIiQYmgTFAhSAmqBJFENJCIEgJBQlAkKBGUCSoEKUGVICOIJEJIIoQkQkgihCRi8kiPXu4gafcehTJ50Ea319tE7SaKlckzMwe/abxNunXQohbpUCaoEKSHSPttqmTvGUENoESKO3lm5gBFghJBmaBC0HCXb+/eqdcd9jLrE6yDXuuAeEH0guQF2QuKF6gXDOuwnCN/i9K9s6WMmwn7RPxkWI2S15N00f90OfoRSjTdzi72auQo9mv56cbLzzdefrnx8vXGy683Xr7dePnttssft2r+x+XLjZd/4+NXb3z86o2P33HrqtjauSj9uXrcUdK43vJT045k/28Znlg0rOdqDT3R8Yqt279cCnSk+on5SXOT8WSZfSJ+Ev0kjclWl9RdZI0bUPuk+IkekNxvy7j6eY2lltwROwh/KR0ZV7+07XjpVmzc3tJi80OsifuobP4DuSUf+bF8+vv+5fH+7dPDl9PPt+V/+Pb87tXL87/+8/nh6j36n18+vXt4/+3l4fxG/cvL9M/7pCwtVZW6rMp5c1XsTpMun86rtewdtfP/nH8wtnKXQjh//PmTqS4/2Zb1WdbpXw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_0.snap index ce3e006c6aa..bd63b023908 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_0.snap @@ -83,8 +83,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 722683c9fcb..fc6d1fdbd4d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/7_function/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -83,8 +83,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "1V3bbts4EP0XP+eBHHKGw/7KYlEkaVoYCJIiSRdYFPn3ld1Izpq6ICMehX4J6kbnEmnOUBIl+vfu293Nrx9f9w/fH593X/76vbt/vL1+2T8+dJ9+v17tbp729/f7H1/f//fOHX4kf9z++ef1w+Hj88v108vuixfJV7u7h2+Hf6bYMXzf39/tvrB7/ftql8iACQZMNGDYgJFRTMrUY5T+h7kqNw7Z9RtHLwsbU0r9xpT9uZvUlBttyk1uyY26ptyMJ1lPla9p0U0czLhzesLSj/cH1RN95nPMeH/IwfeYHOUcwwaMGDDJgFEDZjwRmYddnYXmDwv5fh8Tne/i7LD0HktPWPqApZ8ob9GBPi10DEr9tqRhftOBNYVzH9yID9nSh4a3LVXtXS2n9ZazvG0bHJ3TK5Y+Q+m9c2D+ie6iJ/6sBWiiZ2g/qJNzC6EO3NdOkFDwh/X8Mc/wx/X8adipWvIzmF/A/AnMr2D+vJ4/9wFYPOVk35cyU2HFu3as+Has0KZWYn9JwLLUK1V4GP30dPng9Y/vcKG+44X65gv1LRfqO12ob71Q3/kyfZO7UN/+Qn1f6HhJFzpe0oWOl2Hb+tb+HJy1uEYMm+5CoZ5WVAor688iIvWXkzEWZ7NBwPwJzK9g/ozlj6OjETlJA38xn9XNJFhAZAEFCyhaQGwBiQWULCC1gLIBxJaKYEtFsKUi2FIRbKkItlQEWyqCJypimJwil9N8yBP32yYpmjgrmD+v5lfXz1Oqy+f84sD8HsxPYP4A5o9gfgbzC5g/gfkVzA/ObwLnN1XIb+ivDTQunC/n3N+d7WaYfOGFGvISGvKiW3rpZvZODzW8u9bjoxf123oZJhHJkZx7AdbLkT+A+SOYn8H8Hx0bjqBkAakFlA2g7CwgbwGRBRQsoGgBjRdPN7PYg7xf1dXGnxmpKZCwAjT+kMSHBGabLY0/kPBBgZkOSi5+UOAIYgtILKBkAY33iu6m8ACiVICyAeSdBeQtILKAggUULSC2gMQCmqgIHu7pdVe8r+bLcfIK5s+r+dX322pZ/OTA/B7MT2D+sJ5/5nKKKIL5GcwvYP4E5lcwf8byBwfm92B+AvOD8xvA+Q0V8lvptgIFachLasdLdFt6mb8CiGFbL3MXCzHivBz5GcwvYP4E5p8Y29LphFndqsLPYIGJ+dGKAmG1wHweJ+YoPyYwF7KJ+cxpgSNILaBsAImzgLwFNH4mQcMrPd25djG8TszmLYCiBcQWkFhA4xXRnUrPgdQCygbQxATVAmi8IqIbdkSkpdfzWAcFLm5f0sRcUk2FAFeIcAWGKwhcIcEVFK6Q0QrjL8RXVYBnWuGZVnimFZ5phWda4ZlWeKYVnmmFZzrDM53hmc7wTGd4pjM80xme6QzPdEZnOrgK1SqnVR+EXKFQ4UjLsGZId+VBhcLEkaaTQly5lwSukOAKClfIaIWJ2eOaCh6uQHCFAFeIcAV4pj080x6eaQ/PtIdnmuCZJnimCZ5pgmea4JkmeKYJnmmCZ5rgmSZ4pgM806FCHubPWyemek9vulL5fmOYmJNdAKkFlA2giWnaBZC3gMgCChbQRN/iYcYoChcgtoAmusuwZmQ3nSkFKFlAugjS0l5e/JtK0MT04gLIW0BkAUV0zLnCoCRxeNNf2BcKAldIcAWtqyDlcagwKM3fJhAHV/BwBYIrBLhChCswXEHgCgmtkCrcCp/vrTWmrOf7Uo0p6wWFAFeIdRXK3lpjynqhlgSukOAKClfIaIUaU9YLCh6uQHCFAFeo8czbzEN1QdNqAXLu9FCdD+cCihbIYIHsKgj400Iq71c0/yPg0QKEFgiVj8H7RzNHSpqGhPlO5NxMxD4nGqZez60nIGiBCq/SVHrMPrpNH/mfjXp0viEv1JCXsK2XmV7TDa4NeeGGvMjn1cuKdh1d2rYXzfTF6LQhL7kdL1PvwNdabSH69astzHewqXfr6wkwWkAqCMw1EJ/QAooWyJWPwZq+RjVWKJkL5dR6APUECC0AXCTpox2IZEsv81Gn1JAXbchL3tbLXK8JriEvviEv9Hn1sqZdh7BtL5rrixMrIXyOF27Iy7bf+TGz1n0Mm36Nh7j+zo+4wkrc9Js5hPqD2d25Lqz4dqxQO1ZCO1ZiO1a4HSvSjpW0rZWhrwQqrGg7VnIzVth9kpVY1Apv221jPxwKx8LKxt12+OoX5sLKtt12WHFQtDxA23Zb1sGKFFb4kw7QiBVpx0pqw8pr9+mf66f99c393XOHOPzy18Pty/7x4e3jy78/+9/cPO3v7/c/vv58ery9+/br6e7r/ePt4Xc79/bjr5j9FXvq/sRDizg87hs1dZ8O0eiqRPTwm+OG4q6i8OHjYcvDN3iy585P5+k/", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index b9fbfb4221a..f1504012630 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -54,10 +54,6 @@ expression: artifact "error_kind": "string", "string": "attempt to multiply with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -68,8 +64,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndrdTuMwEIbhe8lxDuIZ/4x7K6sVKlBQpapFpay0Qtz7JhXJCuKGvD7DNA8K+SZhJua9edzdvz3f7Y9Pp9dm8+u9OZwetpf96div3psUr997fdkeh+XrZXu+NJtkXdvsjo/NxkL6aJun/WHXbEL38bttUiqJrPopcnDfhWGRqbAOC4eFYKFYeCwCFhELnLnhzA1nnnHmGWeeceYZZ57Lmcc4CrPvImARsUhYGBaZCtd1nDhOhBPlxHMSOImcJE6ME56+K6bf/4rj3eWcyzPkapDUIK1BvgaFGhRrUKpBVoNyBZKaipCaipCaipCaipCaipCaipCaipByRTj1E0rdDFkNyhVIuxrkapDUIK1BvgaFGhRrUE1FaE1FaE1F+JqK8DUV4XFF9Iv78/5w2D/ffRnMuut0VkxQTD5/mph+O4PyPLcoEhaGRaaiPM8tCoeFYKFYeCxw5oYzN5y54cwNZ55x5hlnnnHm5XlOO/sU6mZTjcciYBGxSFgYFpmKG/PcIikPAaoT0ZWNue/GUcOv7bA1jJ2RBlvXXy+T9AOJuq63XiTlLnSZFIvYO52umK3rQJdJ5KR4xbyGkfi4rvdcJhmTct/pRSaS1nWdy0Q4UU48J4GTyEn6gQRZ12cuk4yJ7zhxnAgnyonnpJx+SiOxOYmcJE6Mk4xJ6DhxnJTTjzaR2WM8KCeek3L6YXpamp+RyEnixDjJmMSOE8fJT/d+gSgnnpPASeQkcWKcZNwopo4Tx4lwwpve5DkJnERMynNbGEWcdWPlsW0J3HgVKtObm9nzOCdKpDzuuOm+72+mGXGcCCfKieekfMVket2sOiPGScbkxsbSInGclP/bYvyTb2kGEgVGQYagvOFyC/QLNxx2YxMuOjfekIXZWDhRTjwngZPISeLEOMmYlCtgmfD0hacvPH3h6QtPX3j6wtMXnr7A9D/61Z/teb+9P+yGbYrhw7fjw7hr0S8vf1/GT8Z9jZfz6WH3+HbeDTsc/zc3hioSda0E6U9liC5Km4avrw9jl3LrzF9rdDiyf1klIUwPlOH4bK3rbAIqbf9+YAT93N/2U3l/yv1p/wM=", + "bytecode": "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", + "debug_symbols": "ndndTuMwEAXgd8l1LuIZ/8z0VVYrVKCgSlWLSllphXj3dRDJimZwc+bSJB9ycybJ2HnvHnf3b893++PT6bXb/HrvDqeH7WV/OtbRe1fy599eX7bHcfh62Z4v3abI0He742O3kVQ++u5pf9h1mzR8/O67UiyhzF9CU7gWAgtFhQywCLAgWDAsIiwSLDIs4MwFzlzgzBXOXOHMFc5c4czVzjznSYhciwSLDIsCC4GFoiIMA04CTggnjJOIk4STjJOCE8EJnn4w068/cbq7Qgi6QMGDyIPYg6IHJQ/KHlQ8SDxIHYg8FUGeiiBPRZCnIshTEeSpCPJUBNkVETjOqAwLJB6kDsSDBwUPIg9iD4oelDwoe5CnIthTEeypiOipiOipiAhXRB3cn/eHw/757tvCbPhcnZkJktDXfyPhqxnY67mmKLAQWCgq7PVcUwRYECwYFhEWcOYCZy5w5gJnLnDmCmeucOYKZ/7DWoBZvgizruvS4zB1tnH5UrVbbk7Ti5jTypa7TfQGybyu5W6ThBOzhmPg+YrJusa0TQQn5hWLnCYS87qWtE0CTsyyjEQzKeua0TaJOEk4yTgpOBGc6A2SaF372SYBJ4QTxknEScJJxomdfikTEVrXbraJwsRuNdsk4IRwwjix088yk8VjPCacZJzY6af5aSlxQQQnCpM04CTghHDCOLl17xsk4STjpOBEcKIwyQNOAtwoZsIJ4yTiBG96c8ZJwYnAxF5MpknkRTdmryVb4IftOpo3ChbPY8k4sbdL5vu+hnZN7FVYmwScEE4YJ/YVo3l3kxfvFvuzV5sIThQlZH/4ahOzxuZXvpQFyCgoKBAUKALqIIyn/fDNJ4cw3ZDLtbH9xadNGCcRJwknGScFJ4IThYm9nG4TMP2POvqzPe+394fduPs6Hnw7PkybsXV4+fsyHZm2a1/Op4fd49t5N27c/t+zHWdLNPQUQ53KWCCZ+kLjtMZDoYQ+lPx5LcYzI9Uz41y44/kqfd3bmQHFvq5D6xzrPP8B", "file_map": { "50": { "source": "unconstrained fn decode_ascii(ascii: u8) -> u8 {\n if ascii < 58 {\n ascii - 48\n } else if ascii < 71 {\n ascii - 55\n } else {\n ascii - 87\n }\n}\n\nunconstrained fn decode_hex(s: str) -> [u8; M] {\n let mut result: [u8; M] = [0; M];\n let as_bytes = s.as_bytes();\n for i in 0..N {\n if i % 2 != 0 {\n continue;\n }\n result[i / 2] = decode_ascii(as_bytes[i]) * 16 + decode_ascii(as_bytes[i + 1]);\n }\n result\n}\n\nunconstrained fn cipher(plaintext: [u8; 12], iv: [u8; 16], key: [u8; 16]) -> [u8; 16] {\n let result = std::aes128::aes128_encrypt(plaintext, iv, key);\n result\n}\n\nfn main(inputs: str<12>, iv: str<16>, key: str<16>, output: str<32>) {\n let result: [u8; 16] =\n std::aes128::aes128_encrypt(inputs.as_bytes(), iv.as_bytes(), key.as_bytes());\n\n // Safety: testing context\n let output_bytes: [u8; 16] = unsafe { decode_hex(output) };\n assert(result == output_bytes);\n\n // Safety: testing context\n let unconstrained_result = unsafe { cipher(inputs.as_bytes(), iv.as_bytes(), key.as_bytes()) };\n assert(unconstrained_result == output_bytes);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_0.snap index b9fbfb4221a..f1504012630 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_0.snap @@ -54,10 +54,6 @@ expression: artifact "error_kind": "string", "string": "attempt to multiply with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -68,8 +64,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndrdTuMwEIbhe8lxDuIZ/4x7K6sVKlBQpapFpay0Qtz7JhXJCuKGvD7DNA8K+SZhJua9edzdvz3f7Y9Pp9dm8+u9OZwetpf96div3psUr997fdkeh+XrZXu+NJtkXdvsjo/NxkL6aJun/WHXbEL38bttUiqJrPopcnDfhWGRqbAOC4eFYKFYeCwCFhELnLnhzA1nnnHmGWeeceYZZ57Lmcc4CrPvImARsUhYGBaZCtd1nDhOhBPlxHMSOImcJE6ME56+K6bf/4rj3eWcyzPkapDUIK1BvgaFGhRrUKpBVoNyBZKaipCaipCaipCaipCaipCaipCaipByRTj1E0rdDFkNyhVIuxrkapDUIK1BvgaFGhRrUE1FaE1FaE1F+JqK8DUV4XFF9Iv78/5w2D/ffRnMuut0VkxQTD5/mph+O4PyPLcoEhaGRaaiPM8tCoeFYKFYeCxw5oYzN5y54cwNZ55x5hlnnnHm5XlOO/sU6mZTjcciYBGxSFgYFpmKG/PcIikPAaoT0ZWNue/GUcOv7bA1jJ2RBlvXXy+T9AOJuq63XiTlLnSZFIvYO52umK3rQJdJ5KR4xbyGkfi4rvdcJhmTct/pRSaS1nWdy0Q4UU48J4GTyEn6gQRZ12cuk4yJ7zhxnAgnyonnpJx+SiOxOYmcJE6Mk4xJ6DhxnJTTjzaR2WM8KCeek3L6YXpamp+RyEnixDjJmMSOE8fJT/d+gSgnnpPASeQkcWKcZNwopo4Tx4lwwpve5DkJnERMynNbGEWcdWPlsW0J3HgVKtObm9nzOCdKpDzuuOm+72+mGXGcCCfKieekfMVket2sOiPGScbkxsbSInGclP/bYvyTb2kGEgVGQYagvOFyC/QLNxx2YxMuOjfekIXZWDhRTjwngZPISeLEOMmYlCtgmfD0hacvPH3h6QtPX3j6wtMXnr7A9D/61Z/teb+9P+yGbYrhw7fjw7hr0S8vf1/GT8Z9jZfz6WH3+HbeDTsc/zc3hioSda0E6U9liC5Km4avrw9jl3LrzF9rdDiyf1klIUwPlOH4bK3rbAIqbf9+YAT93N/2U3l/yv1p/wM=", + "bytecode": "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", + "debug_symbols": "ndndTuMwEAXgd8l1LuIZ/8z0VVYrVKCgSlWLSllphXj3dRDJimZwc+bSJB9ycybJ2HnvHnf3b893++PT6bXb/HrvDqeH7WV/OtbRe1fy599eX7bHcfh62Z4v3abI0He742O3kVQ++u5pf9h1mzR8/O67UiyhzF9CU7gWAgtFhQywCLAgWDAsIiwSLDIs4MwFzlzgzBXOXOHMFc5c4czVzjznSYhciwSLDIsCC4GFoiIMA04CTggnjJOIk4STjJOCE8EJnn4w068/cbq7Qgi6QMGDyIPYg6IHJQ/KHlQ8SDxIHYg8FUGeiiBPRZCnIshTEeSpCPJUBNkVETjOqAwLJB6kDsSDBwUPIg9iD4oelDwoe5CnIthTEeypiOipiOipiAhXRB3cn/eHw/757tvCbPhcnZkJktDXfyPhqxnY67mmKLAQWCgq7PVcUwRYECwYFhEWcOYCZy5w5gJnLnDmCmeucOYKZ/7DWoBZvgizruvS4zB1tnH5UrVbbk7Ti5jTypa7TfQGybyu5W6ThBOzhmPg+YrJusa0TQQn5hWLnCYS87qWtE0CTsyyjEQzKeua0TaJOEk4yTgpOBGc6A2SaF372SYBJ4QTxknEScJJxomdfikTEVrXbraJwsRuNdsk4IRwwjix088yk8VjPCacZJzY6af5aSlxQQQnCpM04CTghHDCOLl17xsk4STjpOBEcKIwyQNOAtwoZsIJ4yTiBG96c8ZJwYnAxF5MpknkRTdmryVb4IftOpo3ChbPY8k4sbdL5vu+hnZN7FVYmwScEE4YJ/YVo3l3kxfvFvuzV5sIThQlZH/4ahOzxuZXvpQFyCgoKBAUKALqIIyn/fDNJ4cw3ZDLtbH9xadNGCcRJwknGScFJ4IThYm9nG4TMP2POvqzPe+394fduPs6Hnw7PkybsXV4+fsyHZm2a1/Op4fd49t5N27c/t+zHWdLNPQUQ53KWCCZ+kLjtMZDoYQ+lPx5LcYzI9Uz41y44/kqfd3bmQHFvq5D6xzrPP8B", "file_map": { "50": { "source": "unconstrained fn decode_ascii(ascii: u8) -> u8 {\n if ascii < 58 {\n ascii - 48\n } else if ascii < 71 {\n ascii - 55\n } else {\n ascii - 87\n }\n}\n\nunconstrained fn decode_hex(s: str) -> [u8; M] {\n let mut result: [u8; M] = [0; M];\n let as_bytes = s.as_bytes();\n for i in 0..N {\n if i % 2 != 0 {\n continue;\n }\n result[i / 2] = decode_ascii(as_bytes[i]) * 16 + decode_ascii(as_bytes[i + 1]);\n }\n result\n}\n\nunconstrained fn cipher(plaintext: [u8; 12], iv: [u8; 16], key: [u8; 16]) -> [u8; 16] {\n let result = std::aes128::aes128_encrypt(plaintext, iv, key);\n result\n}\n\nfn main(inputs: str<12>, iv: str<16>, key: str<16>, output: str<32>) {\n let result: [u8; 16] =\n std::aes128::aes128_encrypt(inputs.as_bytes(), iv.as_bytes(), key.as_bytes());\n\n // Safety: testing context\n let output_bytes: [u8; 16] = unsafe { decode_hex(output) };\n assert(result == output_bytes);\n\n // Safety: testing context\n let unconstrained_result = unsafe { cipher(inputs.as_bytes(), iv.as_bytes(), key.as_bytes()) };\n assert(unconstrained_result == output_bytes);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 4f1ea404fa5..50049a56e82 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -54,10 +54,6 @@ expression: artifact "error_kind": "string", "string": "attempt to multiply with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -68,8 +64,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1dSWwkSRWNsqtsl8tbu9vd7lm7Z+3ZM2txlWfpcc+0e9/bvbnXqnJVr3bvu4TqwAUkhBAHhDggjhyQOCFxQBwQ4oA4IHHmAtJISEhIHBAXREQ7w37164cXHGnmzzilUGa9fPXj/cjIn+mIX+GEmt2e6vLd6DihS3u0N1sXwRIM1sZg7QyWZLAUg3UwWCeDdTFYmsG6GSzDYD0M1stgfQzWz2ADDLaOwQYZbD2DbWCwIQbbyGCbGGyYwTYz2HMM9jyDvcBgLzLYSwz2MoNtYbCtDPYKg73KYK8x2OsM9gaDvclg2xjsLQZ7m8HeYbB3Gew9BnufwT5gsIDBQgbLMliOwfIMVmCwEQYrMliJwUYZ7EMG+4jBPmawTxhsO4N9ymBjDLaDwT5jsM8ZbCeDjTPYLgbbzWB7GGwvg+1jsP2Ama0n2tvP9lwCjmmct8cY1zGeYxzH+I1xG+M1xmmMzxiXMR5jHMb4i3EX4y3GWYyvGFcxnmIcxfiJcRPjJcZJjI8YFzEeYhzE+LcFjrfCMcY5jG8Y1zCeYRzD+LUNjjFeYZyy8cm0pdkO6HJQl0O6HNbliC5HdTmmy3FdJnQ5octJXU7pclqXM7pM6nJWzfYRpeb7l/UTN3tuLNoHK9vCd/3ZCuLS+J4Aje8L0PiBAI2BAI2hAI1ZARpzAjTmBWgsCNA4IkBjUYDGkgCNowI0fihA40cCNH4sQOMnAjRuF6DxUwEaxwRo3CFA42cCNH4uQONOARrHBWjcJUDjbgEa9wjQuFeAxn0CNO73qBHHJO145zldzutyQZeLulzSpaxLRZeqLlO61HSp63JZlyu6XNXlmi7XrTE72G6M0QH48wx2gcEuMtglBiszWIXBqgw2xWA1Bqsz2GUGu8JgVxnsGoNdjzDc2qL9WLQPVraFB8BWLhjJ52vFbC3MheUgO1opFYJ8oTJSCkthoVSYypZyuVopXyqOVkaLwWiYz9XCemE0V4+MnVP+b5Y4fD7o0efzQnw+5NHnC0J8PuzR54tCfD7i0edLQnw+6tHnshCfj3n0uSLE5+Mefa4K8XnCo89TQnw+4dHnmhCfT3r0uS7E51Mefb4sxOfTHn2+IsTnMx59virE50mPPl8T4vNZjz5f9+izSbiyf1crNZ9Ih5vvQRmPtmIbOEoI0NgmQGO7AI1JARpTAjR2CNDYKUBjlwCNaQEauwVozHjUiBMTcentEdCmvQI09gnQ2C9A44AAjesEaBwUoHG9AI0bBGgcEqBxowCNmwRoHBagcbMAjc8J0Pi8kvUu+YKANn1RgMaXBGh8WYDGLQI0bhWg8RUBGl8VoPE1ARpfF6DxDQEa3xSgcZsAjW8J0Pi2AI3vKL/vklajfae8ocu0LjO63NTlli63dbmjy11d7ulyX5cHujzU5ZEuj3V5omYXompKBjbGaILwNIPNMNhNBrvFYLcZ7A6D3WWwewx2n8EeMNhDBnvEYI8Z7AmDPVWLJ06vdIIaE6eDlW3hDeX/ZonD54MefZ4W4vMhjz7PCPH5sEefbwrx+YhHn28J8fmoR59vC/H5mEef7wjx+bhHn+8K8XnCo8/3hPh8wqPP94X4fNKjzw+E+HzKo88Phfh82qPPj4T4fMajz4+F+Dzp0ecnQnw+69Hnpx59Nn9L29UqD4D/iagN2qPzJnHTJEbalU1N4pxJTDOJXyaZyiQrmWQgk2xjBkdMsohJxjDJDiaZwEzWm8lwM9lsJnPNZKmZjDSTfWYCzUxQmQkgM8GyRc2uBGoG4M0AtxlANgO0ZgDUDDCaATwzQGYGoMwAj1n50qwsaVZuNCsjmgtpsrPNynlmZTqz8ptZWc2sXGZWBjMrb5mVrczKUWZlJrPykVlZyKzcY1fG2aFmV7o1K5OYlT/Myhpm5QqzMoRZecGsbGBWDtiv3JvtQ+lo5ChNcDueMRZ9Dla2hWmw69t+KSjm08Q/z/pzaTXf7/zbzwZp1fojAZ+J3Z2RnZ2NefvUFwV7y6PfQe44cMYdnF3A2eXg7AbObgdnD3D2ODh7gbPXwdkHnH0Ozn7g7HdwDgDngINzEDgHHZxDwDnk4BwGzmEH5whwjjg4R4Fz1ME5BpxjDs5x4Bx3cCaAM+HgnADOCQfnJHBOOjingHPKwTkNnNMOzhngnHFwJoEz6eCcBc5ZB+cccM45OOeBc97BuQCcCw7OReBcdHAuAeeSg1MGTtnBqQCn4uBUgVMlnDQcK+X7OZHPxxtns0Gvao6tCnyxdSfjqTtMkPoU8VOR+rtVnM+02R94YX1WD20fe9xrOY15PQlyLtlo9cOeSzWa/TCbeR/cDjzat9qAtxeO96lmDW2MDwnGhzj7V0m/58fbh8KAuwb0+iQbzXXjObwGSWjP7aR94uhz2D7x3N9hsN6h3x6brbOh5rZ20p7YRrbNupBPzqXhXLLRXE939DkJ9aAtqyNF+Huiz/3RvgO+Y78/wNTfQepv0s1g2EbUVjuDWb75W25HdJxR8/+B4s/2O6q13U0Ziz4HK9xsnMC4RWN4CnCP/WvJMXzumqo448F8DE8RPbR9aPzriKd9ggSxj3o6mPax17KTOWdt2bn6FNhCfgf4iHw8tt9HbDLaDzA2ad/tVK3+IIb3xgTxrR14CcdeqdZ+hHYHGF32+var1j62OvdD0HK9bayjdSbBH9oXsK+kCFaN9uaa/ZX4x723JBdoO+4dK97ndRDEe7/Nj0t0xqM/a+3jPaX82Q+t/TS5tn7s58rWfnc87TOnPxOP/rnr2xOL/XzR2u+NxX44p78vnvaZ098fi/3CnP2BWPpP2PL3KMYiEzPuEr9sTMVnIX63A84j/xHYfBAd96vWuGifLxmwPwjn6Tuj5awDfJDYSxA86fgefX7Zc8rhazfx1dpvgK/fiI65dl4HPNvOtk3WEx9Q1wbQxOnqJLrsNfhmtDex9Atic0i1+poArI3wNzL8IeC0EX/wWbzRUXdKtfYzjM0pwv9RtDft922HPpfNHnLe8r8PNr/jsJlw2KQxYBPYSjCcFNFg+d+L9uY6/S067lWtbbwR7P9wmVr7lqC1bwlaf7ACrZaH9+sQ8H5CNA4t4lPG0QboU2YBnyz/xwv4tFytbao1/uDzzsb3TeT7Y9HnYIUbbYukar3mqIe2xU+Jrs3R53bFXxf6HB9m6t0MnEFS7zCp11yDvxOb9juog4vLXD/g+IMO338GGv7hsInPQby+HQ6bPwebNAbb64F+LRSDhxn+JsavftUaE4aJLdoGlE9jsOX/Ltobf3/h8Mdlk8Zgy/812Pylw2bCYZPG4GGwxcVg+pyw/F9F+8ViAMbN3y5Ta98StPYtQetvVqDV8jCODgLvD0Tj4CI+ZRxt4IrB1CfL//0CPi1XK2IYq+g4D/e8GGLqovf0H0ErjRPc+/IG4AwQm5b/J7D5BfhvNhx7t++J9v5Mwjmf445Gxz9BB2p9pr/R7Df3Pon85b5P2jYbUK19bpCcw/dlOs632Pt3nO1YLM3/EMtew5RqHp9TpP4U4f8l+ozPOLtfySJ69WI5rOfK9XKhPDWVr5YHiX0FbZeJof5yMVeqZvPVYqWQK+dGVr3+amGkUs0XykEtNB+zq11/tlQaGc1W9IjIVLU+lc+tdv0j+ZGwVCqXqiPV+mi+Wlnt+nXTF6vlYhiO5sNaPiwsVj83N4Vx0Wx2fgvnv5Bv7aUI/1+Wq8u/o2M6f4n1Pfvv6Qk3L+HYP7PBYMlGM8bNi+F8oeXbursbrRrtuQycw5http7oM7YX2rI6UoSfigzYa4JzfPb7A0z9XaT+Jt0MRsd+Mgw/w/DN9fmPtRft0Xff82HP6iT2EaPabN8x/dqOOcjOtywFq5VvGVOuTDXueSsu3xJ9mXvuEx79DvavceCMOzhr+ZbNx5Szlm/ZfEw5a/mWzceU81XLt7ScKeBMOTg14NQcnDpw6g7OZeBcdnCuAOeKg3MVOFcdnGvAuebgXAfOdQfnBnBuODjTwJl2cGaAM+Pg3ATOTcJZrfzYmJ6L1aXkVsWTyxBMJUh9SrW+n2P9q5VbxeUycXkmy82P7SDnUnDOXl8z7lMBHu1bNI8lnrzNQhBzXl3w/+t3S8/pk9TvFsoJ/l/7HZejEHM+9Vq/U7L6XTs5l2y0+rHcfsflPBreNBzPAAf7KvqQYHyIt/8WA6m/B6iQ9onnuVKM+XeVX43fA9yIPn+Zfw9Qi47x9wA232ktX39eUILUZ/UsFp9ieueu2nq5/PY2Ro/ldzH89gX4aYa/0O8T4snXDQPMN8Q+h+1r2wJzPrsYDMdwrV4up3I13tHNllDN1wHzLOn1sG3OxV67pQjWiPamLWi+H72/XP15QLXeX5a30N83GfXlnxv+VvT56z43/F/9HPozLp8AAA==", - "debug_symbols": "tdnRTuMwEAXQf8lzHuKZsT3mV1YrVKCgSlWLSllphfj3dSqcFcSE3AE/hvYMgTtJPPFLd7e9eX643h3uj0/d1a+Xbn+83Zx3x0M+euliuPzs6XFzGA+fzpvTubuKOvTd9nDXXamPr313v9tvuys/vP7uuxhrIjG/ieTdR6GwSKjQARYOFgQLhoXAwsMiwALOXOHMFc48wZknOPMEZ57gzFM98xCKUP0oPCwCLCIsFBYJFW4YcOJwQjhhnAhOPE4CTiJOFCd4+q6afv4Ty9XlnEsz5CyILIgtSCzIW1CwoGhBakHJgMjSEWTpCLJ0BFk6giwdQZaOIEtHUL0jHMuE4jBDakHJgHiwIGdBZEFsQWJB3oKCBVk6gi0dwZaOEEtHiKUjBO6IfHBz2u33u4frd4PZcJnOqgmS0ls1Uv5wBvV5blFEWCgsEirq89yicLAgWDAsBBZw5gpnrnDmCmeucOYJzjzBmSc48/o8x4O+CXazqUZg4WERYBFhobBIqPhknlsk9bUv80R45XpUhjJqyNqFJfuyMmKv65aVy4S+IIHXLSmX/xbFf0s1SnE8/RZdt/BaJg4n1f+YsC9Ewrol1zIRnFTbUogm8u5Vaj/7qi8JhrBurQTUzm80phUIrVvqINV9+b+44NetiX6sOjetLk2rx+9Wp2lO49kVLNq0empZ3Q9Nq3/3So2xbI/EWe3QsHZsWFvb1Q5f3V/87JYUCCeME8GJx0nAScSJ4qR+DU9Jis5IHHDicEI4YZwITjxO6ukHncjs/lQfyZeJ4qSe/vTAEhXzeqU+WgO1F9cr9REZqb70VK6P0z9WPTatri2r18dtpPrSUzlR0+rctLo0rf7dK/XzZzPV5+8fqu0a1qaGtb96xr+vfSEBJxEnipMEEzfgxOGE0NcY5BgnghOPk4CTiBPFScJIPnDjFz/ZMw/OlUf+/FVWPdBlwjgRnHicBJxEnChOEkzqLzKXCZ4+4ekTnj7h6ROePuHpE54+4ekTmP5rPvqzOe02N/vtuKs4fvh8uC2bjPnw/PexfFK2IR9Px9vt3fNpO25I/t+LHLuIhHsKkk9ljC5QH2k8rctH+V5PFC89Oh7mHU/iMN1Qxu8n7d2gBeQXuX3eOC4gv+Ls80ZtPuV82v8A", + "bytecode": "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", + "debug_symbols": "tdnbbuIwEAbgd8l1LuwZH2Z4ldWqoi2tkBBUlK60qvrum6AmqzZuyD/gSwPfEJhJPLbfm8fN/dvz3Xb/dHhtVr/em93hYX3aHvbd6L3J6fza68t63w9fT+vjqVllcW2z2T82K4n5o22etrtNs4ru43fb5FwSyvwpNPrvQmChqBAHCw8LggXDIsAiwiLBAs65wDkXOOcK51zhnCucc4VzruWcpzQIke8iwiLBIsNCYKGo8M7hxOOEcMI4CTiJOEk4yTgRnODZ98Xsdz9xuLu89zpB3oLIgtiCggVFC0oWlC1ILEgNiCwVQZaKIEtFkKUiyFIRZKkIslQElSvCcxhRdhMkFqQGxM6CvAWRBbEFBQuKFpQsyFIRbKkItlREsFREsFREgCuiG9wft7vd9vnuy8LMnVdnxQyS0Gc0Ev52BeX13KzIsBBYKCrK67lZ4WFBsGBYBFjAORc45wLnXOCcC5xzhXOucM4VzvkPzTCzfBJmXdamBjd0tmFpv8lxmIg5yrJuc56ECyTxsk5z9reUe7LZbyl3ZMHz+C2yrB+bJ4yT4j8WOA4kpGWd2DxJOCmWZSAayZedu3by0ThkMKVlLRQQu1tAjxMeLeuAkOhx+F98istapZtFj1Wjp6rR9droNC4LmJc1WTeL7qtGp6rRr71Tcx524/MktlSMrfViR1cx9qXnS5w8kmLAScRJwknGieBEYZIcTsr38JjJIFNCOGGcBJxEnCScZJyUs59kJJPnU1KYZIeTcvbHCStIMPcrOVwZe7ZfKa+Qkehzs3J5NX2z6FozenmVfrPofG30uVlZQtXosWr0VDO6XnunzszN5fX3jWJzxdihYuxLc/zX2GciOFGUkHM48TghnDBOArqNQS7iJOEk40RwojDBN7GofNL6M+kGvv/gD0e0yfthyi9sZRFOGCcBJxEnCScZJ4IThUl582+egNn/6EZ/1sft+n636Q9L+jff9g/D2Uk3PP19Gd4ZTldejoeHzePbcdOfs/w/YumvlphaitxdSl8gidpM/WWd3/KhJa/n/6IfdvMmURwLt/+8SuudDKDbMGy7c8vuGrvr/Ac=", "file_map": { "50": { "source": "unconstrained fn decode_ascii(ascii: u8) -> u8 {\n if ascii < 58 {\n ascii - 48\n } else if ascii < 71 {\n ascii - 55\n } else {\n ascii - 87\n }\n}\n\nunconstrained fn decode_hex(s: str) -> [u8; M] {\n let mut result: [u8; M] = [0; M];\n let as_bytes = s.as_bytes();\n for i in 0..N {\n if i % 2 != 0 {\n continue;\n }\n result[i / 2] = decode_ascii(as_bytes[i]) * 16 + decode_ascii(as_bytes[i + 1]);\n }\n result\n}\n\nunconstrained fn cipher(plaintext: [u8; 12], iv: [u8; 16], key: [u8; 16]) -> [u8; 16] {\n let result = std::aes128::aes128_encrypt(plaintext, iv, key);\n result\n}\n\nfn main(inputs: str<12>, iv: str<16>, key: str<16>, output: str<32>) {\n let result: [u8; 16] =\n std::aes128::aes128_encrypt(inputs.as_bytes(), iv.as_bytes(), key.as_bytes());\n\n // Safety: testing context\n let output_bytes: [u8; 16] = unsafe { decode_hex(output) };\n assert(result == output_bytes);\n\n // Safety: testing context\n let unconstrained_result = unsafe { cipher(inputs.as_bytes(), iv.as_bytes(), key.as_bytes()) };\n assert(unconstrained_result == output_bytes);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index e89cc5f0e17..357cedf6574 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -68,8 +68,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndrdbuo4FIbhe8kxB15e/u2tjEZbtKVbSIhWtB1pVPXex+whaYVXg16fIBnxQOLPCfGyP6bH3f3771/749Pz63T318d0eH7Yvu2fj6318bmZ7k/7w2H/+9f3tyd3fpHo/4DXl+3x3H59257eprtc3GbaHR+nuxJz+4Kn/WE33UX3+femEeUkcBI5SZxkTgonFZPkOBFOePqJp594+omnn3j6iaefePqJp595+tlMv6peSI3SEc+JchI4iZwkTjInhZOKSXGc8PQLT7/w9AtPv/D0i51+SjMppSOZk8JJxaQ6ToQTz4lyEjiJnPD0q5m+uDQPMhGpHSojqHLknRtBMoL8CNIRFEZQHEFpBOURVEbQyIiQkREhIyNCRkaEjIwIsUeEaFhQdh2KIyiNoDyCygiqA8i7ESQjyI8gHUEjI0LNcH3xF+OLdiRzUjipmATHiXDiOVFOAieRE55+4OkHnn7g6UeefuTpR55+5OnbJR915UJUSkciJ4mTzEnhpGJil3zWiXBin74uRLv/absaEdz8fB36v3a7tKBxfhzQ2B2YXVpYJ+EGSd2wtEsLq8Sejq8TM5cguvRYdy72dHydKCdmjwWNMwmpI5GTxIk5LIP3C8kdKZxUTOzp+DoRTjwnykm4QaLvSOQkcZI5KZxUStQ5ToQTO/2cZ1J6opwETiIniZPMSeHETj+VhVzfxtWedK8T4cROPy53yxI6opwETiIniZPMSeHk1rXfE+84EU48J8pJ4CRykuiDovrMSeGkYqKOE+HEc6KcmJ2cRC4kdY/Wapc71knFxC5EtOr8bFrN/dtiz//GLgDWOndAq2mna5MHfsee8jv39Tui16Zy88Okf93Ys34n+asP4rXxA0YHTLh9Pt/z2fS5tLWCOZdWhb3+/oH87TLBDZO5sefjq5eAvQVjnSgngZPISeKE35oSvzUlfmuyix7rhKefefqZp595+pmnn3n6maefefqZp29XMOJ86afUgQxB/WFBzy8rHd0MpgonZvKyPClLih2JnCROMieFkvDDkrhfViVVO+I5UU4CJxETe/66TJJL7oBQ4ClQCgIBn631z/a0394fdpfNr0/vx4dve2Hf/n3ZXW2LfTk9P+we30+78wbZr72x584LPm5atfI8/FpLWgVTQmytPz3rfdp4lXPz3G+t4NY+W9sxtOP4Dw==", + "bytecode": "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", + "debug_symbols": "ndrdbuIwEIbhe8kxBx6Pf3srq1VF27RCQlBRutKq6r2v0yWAYhP05gRhpAcSf0nITPzVvfRPn2+Pm93r/qN7+PXVbffP6+Nmvyujr+9V93TYbLebt8frjzszvEgwP+Djfb0bxh/H9eHYPSSTVl2/eynvrJYveN1s++7Bm+/fq0KEE8uJcuI48ZwETiInqUlsHImmimRMouFEOLGcKCeOE89JM/2YzEh8rEjkJHGSMUmGE+HEcqKcOE48Jzz91Ew/q55I9lKRxEnGJBtOhBPLiXLiOPGcBE54+pmnn3H61hhOhJN2+iGMJKWKKCeOE89J4CRykjjJmIjhRDjh6dtmlDbZE7FJK+I5CZxEThInGRM1nAgnlhPlhKevPH3l6StPX3n6ytN3PH3H03fN3Vcd6xfVPCW+uWHOjOe+k5o0jzH14/+L+upy4ZUTd4eEave9x6RdVs+TZi5O9Dxj1b60y+p5opw0Z8ypH4kLFfGcBE6ah6Wz9kxiRRInGZN2WT1PhBPLiXLi7hBvK+I5CZxEThInGZNkOBFO2unHsXfhUk2UE8eJ5yRwEjlJnLTTD+lMqst4u6yeJ8JJO31/vlomVxHlxHHiOQmcRE4SJ/fO/YqoMZwIJ5YT5cRx4jkJ9EZR22X1PEmcZEzEcCKcWE6Uk+YkB5ETCdWttUriJGNim5NcOm2jKR20q0bUfyMLjF1gdIFxC4xfYMICE7nRBfnojXnL4wFaOolhahbMwY3S35jL74hOTVxg0gLTrv6NxMsc+Im5Uf7PG1lg7P39uc5nVedSurRjLlbi9PsX5O/cAuO5abcl/CjCtCzVdlNiDrTPTDP+a4rYikRM2i0JOd8AlWfhFRFOLCfKieOkPWN2bHyIakUSJxmTdrNgnggn7SeX5yfdsQKRgkRBhuDG8+ob4LuM/qwPm/XTtj+tg3n93D1fLYs5/n3vJytk3g/75/7l89APa2Uuy2SGH9YsKyd22JAyktKYEufL6Oemz4pbWcnDcMhm6Kc58WUbynb8Aw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_0.snap index 582e126028d..bb11a38427c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_0.snap @@ -68,8 +68,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tZvRbuIwEEX/Jc88eDz2eNxfWa0q2tIKCUFF6Uqrqv++SZdQFLupJu59QTLyOQSPBwdP/NY9bO5en263+8fDS3fz663bHe7Xp+1h37fe3lfd3XG7222fbq/f7tzwQtF/AC/P6/3Qfjmtj6fuJqlbdZv9Q3ejMfWCx+1u091E9/571SNsR4IdiXZE7EiyI2pHshkRZ0fIjtijL/boiz36Yo++2KMv9uiLPfpij36yRz9Vo5+Zz0iOdI2siq5e/bmrVy7sHmpnqD1A7RFqF6g9Qe0KtWekXR3UDs1VheaqQnNVobmq0FxVaK4qNFcVmqvamqvs9NyVSaf27KB2gto91M5Qe4DaI9QuQLt3zVHli51zYW8dmeDk3DVQabeNzAeS7IjakWxGyNkRsiPejrAdqWebjKHMWkxDinZE7EiyI2pHshnxzo6QHfF2hO2IPfq+Gn1yMk4yojL7vSyB0hJIl0B5AcRuCURLIL8Eal5G49iVYzELOELt8nN24cKekPbgofbWW69AfFmki3EPAWqPUHvrnAkcR3uQwp6gdoXaW/8mBe8v9ukGoY8Oaieo3UPtDLUHqD1C7fJz9ugLe4LaFWrPSLs4qJ2gdg+1M9TenKspjXYt7RFqF6g9Qe0KtWekPTmovTlXRS/24i61uaw3b2eovTlX4+VeTENhj1C7QO0JaleoPSPtzWW9efsPrqsVu4faGWoPUHuE2gVqT1B7c67OlQqay3qz9uay3rydoHYPtTPUHqB2ZPGK62UlITojUmxhcr2sNIvUy0rzSDVklNPIUNarL/6fqe/F5zwOQF9nlCmjCz6nOgLeuc/PIZ4w9drKNwwtYHydofQ5BnHK8AImLGDi99/nOj7lXCbvwhiXvo429S+I/xelmHlG7Uy9rBBHQqZ7m1yvFMwBX5R6xtWOaPpfiYOzI/W8vNzlkcQCCXYk2hGxI8mM1PeEyV/qVcwFQnbE2xG2I8GO1J/MHXNep/uh/MVT2TMAWQFvBdgCvPetP+vjdn2325wPBzy+7u+vzgqc/j5vJscGno+H+83D63EzHCD4PDswjAWnsOIchwvpW9RXNygMrY8l0mddseOhOQwD9z8onLW/hv46/gE=", + "bytecode": "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", + "debug_symbols": "tZrRbuIwEEX/Jc882DMee9xfWa0q2qYVEoKK0pVWVf99DUsoir1ZTdL7gjD4HIInY4zHH91T//D+cr/ZPe/fursfH912/7g+bva70vr4XHUPh812u3m5v325c6cHH90ZeHtd707tt+P6cOzu1Omq63dP5RlxETxvtn13J+7z56og3o6QHWE7EuyI2JFoR5Id0SZCaUBYKySbkeTsiLcjZEfYjgQ7InakGf2kbkAkVUiyI2pHshlRZ0e8HSE7wnYk2BGxI/boazP6mfmCZPG3yKrqSkqXrqTVNKEKtWekPTuo3UPtBLUz1B6gdoHaI9QOzdUMzdWMzFVyDmr3UDtB7Qy1I3OV/NKoMg9LWOZc2ZeOTHDx0jX42m4bmTMidiTakWRH1I5kM0LOjng70s62OIQyq1YI25FgR8SORDuS7IjakWxG2NkRb0fs0eelUxzL0JWltgvUHr/PHqvpmRPSHghqXzz5e75O/tW4hwC1C9S+9J4JLIM9xMqeoHaF2pcuYQPR1T7+I07ioHYPtRPUzlB7gNoFao/fZxeq7AlqV6g9I+3RQe0eaieonaH2xbmahr3zoLVdoPYItSeoXaH2jLQnB7UvztWoV3u1Sk0EtTPUvjhX5boW01DZBWqPUHuC2hVqz0i7Oqj9G39XG3aC2hlqD1C7QO0Rak9Q++JcndqCXlwenbQvLo9O2z3UTlA7tLCwuDw6bRegnV3zfo/eX5BYbWGyy2akXTaaRpq3Wym4Dkypjt588b8MzWB4BhNmMDKDiTOYNINRO0Mz4kP/GLc83KCl8hrHzIwxaJdUSkn663M8jxmdwWQ7066qlI7pawxkzPgZDM1g+P/f5zY+9VzjS/15iEupa479M+LPMoOJdqZdfpCBiOO9Z25XFKaAdma6YTXiPVWImpH2trK/rsJ9lAohO8J2JNgRsSPtEaPh19IzV0g2I+3dxmnE2xGyI+2To9fjqakC1ApkI9De7ZkCvAX4LK1f68Nm/bDtL4fXn993jzdn2Y+/X/vRsfbXw/6xf3o/9KcD7l9n209Xykqr4Ph0IaXlS/XJBymt8xKGsq74/OZ5eRLKZFdWV+UaynX8AQ==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 2679f9da64c..b1bd85e7907 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/aes128_encrypt/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -68,8 +68,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zZvRbuMgEEX/xc95YBgYhvzKalWlbVpFipIqTVdaVf33dbKxmw1eS5hci5dKVNzDFcNgmJbP5nn9+PH6sNm97N+b5Y/PZrt/Wh03+13b+vxaNI+HzXa7eX24/nVjTj/I6Vnw/rbandrvx9Xh2CyDmkWz3j03S/WhBbxstutm6c3Xz0UridkSb/IllC+x+RLOl7h8ic+XSL4k5Evyo+/zoy/50Zf86Et+9CU/+pIffcmPvuRHXwajH5kvkujpWrJIulq1l65WOaErlB6R9GCgdILSLZTOULqD0j2ULlA6NFcDNFcDNFcVmqsKzVWF5qpCc1WhuaqlucpGL12ZNKELlB6gdIXSI5IeDZROULoF0q0pXjPc0zne0ql03p2RS1dHKT1v3s8Smy/hfInLl/h8ieRLQr5E8yXDuSxdKKPqeNSF6NJVfLJirYHSCUp3hXSKocNT1KuZ/4sPxfjY9bXGyi1es/BnScyWsMmXDAaNjHSLlCjdPdhOEfEUkZsi8lNEMkUUpoh0imhwNRCx60XBFKSXM2A+gfmumD++QbhwhwHGtojhGu3IAGdRnCDyZorIgid4uEibNYA15nuCiW8HcOgBPHoAucMAFL7XoL8dIKAHUPQA8c4xuE7TgSVtTQ9uj4g3ZsSA9wwh9AAWPYCHHuuGS+wZ+PGElIDFKxYfi/FjqRgMFk9YvL3r3JdsI/8p4N/rbhIcFu+x+OLamu+6cnqsLK6Dj9KL6+BXdOGEXlpbG60glddjR72X1tYcce89nXeF0iOSXlyPdew7upOETlC6hdJL/3birO3pYbyr7zJDUhsynw0ytj+H2cRInNGI7wJD4m+MsDG1GKFajNhajPgZjdi+wMWcGJFajIRajGglRmjGfTV0J3INiQ1Xhw1fhw2pw8YdvzH+9gvG1kDpBKVbKJ2hdAeleyhdoPTir0OfTE5TukLpEUlnA6UTlG6hdIbSi3NVtKcn3372ULpA6cW52p+cnbqp90F2Zj4bY/dBdjyjkbFLh3O1GPG1GJFajMQZjYxdOrypxQjVYsTWYmTGfXXk6uG1DhuxChti6rBxx3vJvzbOdAeleyhdoPQApSuUHpH0gPw/ag4EpVsonaF0B6V7KF2g9ACjf7WtX6vDZvW4XV9ehb987J6uHokff7+tb96Lvx32T+vnj8P69HL8+9H4KW+coUWbXSfXbYvav76R823r/DiB1SxYz81TFnC0C46u9dD6+AM=", + "bytecode": "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", + "debug_symbols": "zZzRTis5DIbfpde9iBPbcXiV1eqoQDmqVBVUYKUV4t13hu2UnqYayaR/lRtEIP/nX0nsmUza+Vg8ru/ff//a7J6eXxd3f30sts8Pq7fN825ofXwuF/f7zXa7+f3r9M+LMP4g0S/B68tqN7Zf31b7t8WdBVsu1rvH4beYBsDTZrte3En4/Hs5SLJfYn5JcUs0+CXkl0S/JPklfFES8yRJVknEL1G/JPsl5pcUtyQHv4T8kouzny1MEsmVJPkl7JeIX6J+SfZLzC8pbokFv4T8Ev/s28XZLykdJEXoVLKsukaLh67RqjJhDKULlK5QeobSDUovSHoJUDpB6RFKh+ZqgeZqgeZqgeZqgeZqgeZqQeZqDMhcjdS6ZlKabmFTKhW9ddw56KErU033jfsoicEvIb8k+iXJL2G/RPwS9Usu57JOU1nM5mddiQ5dVayiG5RekPQUGulDnZzwQ1E7Gfn/8YTFRyw+YfGMxQsWr1h8huIZu+65feWUqW8MUc/xvpXzJRG/RP2Si7NGlHgaq+GRSEO5YgPzC5YvoZk/v/CE0AEiOkBCB2B0AEEHUHSADA6g6DzQa6yiuRKs3lX0JZKfiPQnIkMPcHulHDaS3wNM6SxADugAhA4QrxCA8vcalPMACR2A0QHkynNwmqYXlnQMR3CkfG5GwTUjZ3QAAwcw7H7OWvdz8wlpCYtnLF6a8XOpaIrFZyzerjr2LWXESnOOzKVgCVg8YfHc+nRXpq6p3l41nzfM0/V6dK2eezefN8w9mU4hAr2n0HpGxZSO3q2iM5QuUHrrmuEkE521omco3aD01jMqjvFIz/NdZcoMrWxQvJ0NCvF4HxYrI3JDIzJNDKlURrQXI7kXI9aJkUg3NBInKqWq4MfYi5HUixHuxcgN62o+fijx/CNmKYU+bFAfNmIfNq54jZHqCpYUSs9QukHpBUnnAKUTlB6h9OarwzGZ2Go6Q+kCpSuUnqF0g9ILki7Nuap2pFfXfiEoPULpzbl6vHNm4x/vB0VvZ2N2PyjlhkbmNh0aejFCvRiJvRiRGxqZ23So9mIk92LEOjGSb1hXZ7YemfuwIX3Y0D5sXHFf8qeNkW4BSicoPULpCUpnKF2g9ObEmDsFM+gZmxmUXpD05u/fzdMJSo9QeoLRP4fWP6v9ZnW/XR/eivD0vns4eUnC278v67P3Jbzsnx/Wj+/79fjmhO+XJozzx5SXnGx0PbRoOH0jlqFF4z/TcCzPgcbmOBscbMkUBg+Dj/8A", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index e19a252b4a9..b693262a9a0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -41,8 +41,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+2azW7TQBDH142dxEnThBYKfQVO8Ufi9IBUCcQrcEBCcpIGwQEqQJU4IHzghgSvTF127H8m47bAbMmhK1Ve787+5mN3x2unnqmLZ68+uzeCzIm9jv+tRIqssWjoVYVkDm0ltPc70N9SdDZkejX5s3E6CQX/FO1PQst0GR9iOuCPO5bzrKj53BcDV5LjY8r+ga3jOiOZru2n+tDWQzbGxfw7nJ/xgWD/DvhWlqdF3WcUdfdtLN+yWNJcKeqq1qGvz46JHeizq/3Z1menxO7osye0l7rA9tg8Y+5UXNNTj+kzZj3/GKa/x2zVzoEe00f28PjQvqPY9QRbR0If+oZ9qKcn6JFYviIrUGS1FVm03odmM340HzxfaOddj8XIBz+4TvKHxxTzTcDaHttr6c8ZjOH5tSW08djxfYHxcfVcDwV/FfkTnle1D8Hucuts7Dh/RpR/pHNUGa8E2nG9BqZeTzg2gH6Uz4A5tfXyTDA0m/uA78ueG9+rfdm3PNyXUp7cYfJYR5+p7Ym9SvsSzyYtoe2qfenfgCWd8bi/7QZ5v8Gfp+DPxwZmYOTcFjQwnwPz3Nbp7N0q6vG4JsriQ5/meaLU8xns2JjjYt3vXehrCfI89gNBfhdkKGYjJo/5JRTGKcZgORBsNSwme6C7zfqG0Id7hZcWu0efynn4CVwuh3Uch3tYymkBk39tr6UPLxiT5x2+psMGG3BfoYzfYMNLU/t84K0zpXwrnbt4vn0FzPMGO43RWbNkj5TLcSzKBoJsx8i++8L4stC7Kmet7DU0m2tQ8/mxD1xjNnPr6wZ/jJHXKK0V6ZnsAzcB/y7jU+j7l81+Px8vbS3qOPM9i/oDJv/e3uN6RX9O/tLOVZZHqyRf5ZN8uUwXOZ8HA7HrO9CfZ8lsEaeLbD5J8mR66/rTSZ4t8iyKjtPoNI0mt61/MZnOFxdGjE+j8ja+Tj89D9pF3Y/P9rJ07D3lby5PvIDJfyHZi7+vtk45JxD0lXI/rpDzGq6XDKHNL9bbwmJTvlVsypPuXrFpI/X1oQ/PHWXZtfcYL2SRHQGT/27vaU66MIbGjwT9XaZ/zW6hDXMXZ7WENpIv5+cb8ewVfdf+VnOpk/GxjdtGa+e675mU809UbM3m0jcKPX4cS+/gevzpXHoHV+Qf83dwZf4p8btu+Kn0nq/HT3LpXVrR/kg6aymu/1h651HkV+tn4IQfL4i/5yb+FX/ohl99Qxu54WfEv+dmfqv9te/G/hnxD5zwkyr+993Ep/rO+MBNfKbEP3Rjf/XN4qGpS3Ums/VH0K53jkjSm5wVUX+P2eriXIP6yB4eH/4b1JFg60jo42ecI0HPkaBHYvmKrECR1VZkdRRZXUWWZuzDLbWrp8jqbylL08ddRZbmPA621K49RdZQkaWZc0aKrHuKrH1F1rbmwgNF1rbuIc01oZm/7iuyNPf2tq7Vu3Ph/8vRd+fCP2M9UGRprgnNPKF5NtnW9XXokCX979yOwPKYXygvvW+XzyjKSWcf3rz7ZFhBEMElw4IGAxLGox/KOZfzTQOX25IIHBc/NMaz2fQ4no/TbLlYLdPkuh8afwH9lLSXDjMAAA==", - "debug_symbols": "tdrdSuNQFIbhe8lxDvb61v71VgaRqlEKpZVaBwbx3ieRplMyYYb3oCfSyH53rE9Lymo+u+fh8eP1Ybt/Obx3dz8+u93haXPaHvbj0edX3z0et7vd9vXh+tddmH5Y/l7//rbZT4fvp83x1N2l2nfD/nl80Mb6Zbsbxofh677vrMD1Fa5vbL0CXG9wveB6h+sjXJ/geugr6CvoK+jr0Nehr0Nfh74OfR36+qqvWTkHZnVZFFxUXDRaxIALw4Vw4bRIq39VaeeghuX6hM+AxRMWT1g8YfGMxTMWz1g8r4u75sLLsoi4SLjIuFg3jzYXMS6LiotGi7JurnZ5HkuPYrgQLhwXERcJFxkX6+YpzkVO10X/19LaZromvyyVvjevt9y83XDzGm65ud1yc91yc7/l5utvkMt10GpavHjr6otXFs6FbPnRp1ZcNFq0gAvDhXDhuFj1UJgvhNLyg0lLuMi4KP8rlpe1VnHRaGEh8MR44jiJq4r/eh9aTDzJPCk8qTxpOEmBJ8YT8cR5wvUT109cP3H9xPUT189cP3P9zPUz189cP3P9zPUz189cP3P9wvUL1y9cv3D9wvUL1y9cv3D9wvUL169cv3L9yvUr169cv3L9yvUr169cv3L9xvUb129cv3H9xvUb129cv3H9xvUb1lcIPDGeiCfOk8iTxJPMk8KTyhOub1zfuL5xfeP6xvWN6xvXN65vXN+4vri+uL64vri+uL64vri+uL64vri+c33n+s71nes713eu71zfub5zfef6ketHrh+5fuT6fNYnPusTn/WJz/rEZ33isz7xWZ/4rE981ic+6xOf9YnP+sRnfeKzPvFZn/isT3zWJz7rE5/1ic/6xGd94rM+8Vmf+KxPfNYnPusTn/VpfdZX4vz9S7m6V2dOxBNnydd49HNz3G4ed8P55s2Xj/3T1b2cp19vw+K2zrfj4Wl4/jgO0w2ef+7tnP4nJust6n76wmk6DLk3s+lwevoqqVcp41nHM/8G", + "bytecode": "H4sIAAAAAAAA/+2azW7bOBDHqViyLduJ3aTtbrDAPsCeLEu2nMMCAbrYF9gHWMhyDOylXRQFWqBAoR6KXnor0L5uy5Qj/T0aJf0Ytj6UQCCKHP7mg+SIkhOYpgTuGrJ7I8hcuuv820qiyJqLht5USOZ3V4nd/RH09xSdjZleTf56ni1jwT9F+9PYMX3Gh5ge+POB4/xVNXzui4EryfExtv/Y1XGdkczQ9VN96uoxG+Nj/j3Oz/xMsP8IfLPlQdX0GUXdYxfLxyyWNFeKuup1GOqzF8SO9Nn1/uzrszNiD/TZS9pLQ2AHbJ4xdyqu6VXA9Bmzn38M0z9itmrnwIDpI3t4fGjfUexGgq0zoQ99wz7UMxL0SKxQkRUpsvqKLFrvU9OOH80HzxfaeTdgMQrBD66T/OExxXwTsbY/3NX68wzG8PzaE9p47Pi+wPj4eq7Hgr+K/CXPq9qHYH+5dT33nD8Tyj/SOcrGK4V2XK+RadYTjo2gH+VzYK5c3Z4Jpqa9D/i+HPnxvd6XY8fDfSnlySMmj3X0mdr+dFdpX+LZpCe03bQvw89gSWc87m+/Qz7s8OcB+PO8gxkZObdFHcy/gfnC1ens3aua8bgmbAmhT/M8YfW8BDtac1zt+z2Bvp4gz2N/LMhPQIZiNmPy0rMMx40hPnycjz1z4ni4Z1DnBPxHeazbErG2f9xV2jOTG2JHujB2Y8Ge2LRjpxifq2PBRyrUNwXdfdY3gz60n5ceu0efbOzeA5fLYR3H4VxKz4OIyT9yV+vDv4zJczbPB3GHDZiTUCbssKE0jc+/BftM6VklnVn5s2oHzBcddhqjs9/JHuk5iGNRNhJkB0b2PRTG20Lv+Zz10F1j016DmnnkFLjGtJ9Ljzr8MUZeo7RWpPNMCNwU/LuOT6XvX77+lCevba2aOPM9i/ojJv/U3eN6RX8uv9LOXV4ku7TYFctiu83Kgs+DgdiNPegv8nRdLrIy3yzTIl19d/3ZssjLIk+Siyy5ypLl99ZfLleb8qMR86vE3i5u00/Pin7V9OO5yJaBu6f8zeWJFzH5VyT78e+1q1POiQR9Vu7dDXJBx/WaIbSF1X5bXLXle1VbnnSPqraN1DeGPjyz2TJx9xgvZJEdEZN/6+5pToYwhsbPBP1Dpn/PbqENcxdn9YQ2krfz84Z47oq+a3/nutbJ+NjGbaO1c9u3YMr5lyq25hvp+44ef7GQvl/o8Vcb6fuFIv+Cf79Q5l8Rf+iHn0nfSPT4aSF9h1C0P5HOWorrfyG98yjyL6R3TsX9VRL/xE/8a/7UD7/+/jjzw8+Jf8fP/Nb769SP/Wvin3nhp3X87/qJT/2N9p6f+KyIf9+P/Vt6Z/rFNKU+k7n6r9Cud45Is885K6L+EbPVx7kG9ZE9PD7897tzwdaZ0MfPOOeCnnNBj8QKFVmRIquvyBoosoaKLM3Yxwdq10iRNT5QlqaPE0WW5jweH6hdJ4qsqSJLM+fMFFl3FFmniqxDzYVniqxD3UOaa0Izf91VZGnu7UNdqz/PhT8uR/88F34Z654iS3NNaOYJzbPJoa6v+x5Z0v8dHgmsgPmF8tL7tn1GUU76//F/D58YVhBEcMmwqMOAlPHoh3LO5XzTweW2pALHxw+Ni/V6dbHYzLN8W+62WXrbD40fAOfF/BJKNAAA", + "debug_symbols": "tdrNSiNBFIbhe+l1FnW++jvlrQwiUVsJhERiHBjEe59uSZzQFg7vIhtJS72VyJNAe1Lvw+N4//Z8t9k97V+Hm1/vw3b/sD5u9rvp6v1jNdwfNtvt5vnu8tdDmH9Y+Vz/+rLezZevx/XhONxkXw3j7nF60Kb6abMdp4fh43Y1WIXrHa5vbL0CXG9wveD6CNcnuD7D9dBX0FfQV9A3Qt8IfSP0jdA3Qt8IfWPX16yeAjNfFhUXjotGixRwYbgQLiItcvdV1XYKPCzXZ/wMWDxj8YzFMxYvWLxg8YLFS1886lzEuiwSLjIuCi765snORUrLwnHRaFH75mpff8fSoxouhIuIi4SLjIuCi4oLx0WjhWNzx+aOzR2bOzb3vnlO56Lky2L1bam380epKX4tlT43L9fcvF5zc7/m5u2Km7dwzc3tmpv3PyBf9yXmefHmbd03ryycCtnyVrQVXFRcOC4aLSwEnhhPuiQK53sTKXxLIk8ST/L/kvotKTypPHGeNJyY4SR3KX/6PFqOPEk8yTwpPKk8cZ40nPT/xfg5MZ5w/cL1C9cvXL9w/cL1C9cvXL9y/cr1K9evXL9y/cr1K9evXL9y/cr1nes713eu71zfub5zfef6zvWd6zvXb1y/cf3G9RvXb1y/cf3G9RvXb1y/YX2FwBPjiXgSeZJ4knlSeFJ54jzh+sb1jesb1zeub1zfuL5xfeP6xvWN64vri+uL64vri+uL64vri+uL64vrR64fuX7k+pHrR64fuX7k+pHrR64fuX7i+onrJ66fuH7i+onrJ66fuH7i+onrZ66fuT6f9YnP+sRnfeKzPvFZn/isT3zWJz7rE5/1ic/6xGd94rM+8Vmf+KxPfNYnPusTn/WJz/rEZ33isz7xWZ/4rE981ic+6xOf9YnP+sRnferP+mo6f/9SL85QnZL+rO/nxFjyMV39Xh826/vteDpU+/S2e7g4Y3v88zIujtu+HPYP4+PbYZwP3v47czu/2vncgOVwO39HNV9aWpm1+XJ+YfK4kufpWadn/gs=", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_0.snap index 27bdf943398..b2c547781ad 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_0.snap @@ -41,8 +41,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+2azW7bOBDHqUiyIzv+SNK0TfMEe5Ms2XJuOeyLyHYC7GWxWOwD6JkK7J72VKAv0GMPBXpsgV5aoECBHlqmHPnv8cj9GrY+VEAgihz+ZjgcjhjRgVlfgbtH7NkIMlfunn7flSmyUtHQXRfJnLlC4p4PoD1UHGzC9Gry52kxTYTxKdqfJ47p0z/E9MBPu47ze73m87EYuJMc72PbB66McUYyh66dykNXTlgfH/PvcX7SU8F+0tV3Y33FxhqCf5TsaOIk0mdPiB3rs5v109FnF8Tu6rOnFOuHwA7YPGNuU4y5WcD0GbOZHwzT32O2aueogOkje7h/aF2Q73qCrWOhDceGbainJ+iRWJEiK1ZkdRRZFO8js+0/mg+eL7TzYsB8FME4uE4aD/cp5puY1f3m7nY8b6APz6+hUMd9x9cF+ofH3pWKf8pFYuQY0uFPJjyv6vJnC55blfmXUg5V5F8Tv+eH37x7+l74eUX8Iz/2N/uJgZ/4b+Jz6IffxM/IC3+yJP7Yj/8b/rEffrMvPvHDL4l/6md+m/V1x4/9c+KfeeHnjf/v+vFPSvx7fvwzI/59P/avaI94btYX318/gHq9vUtefOn+mvT3mK2+9tcPmD3cP3x/fSHYOhba+B7nQtBzIeiRWLEiq6PI6iqyEkVWT5Gl6fv+ntp1pMga7ClLc4xDRZbmPI721K6xIutYkaWZc04UWaeKrDuKrH3NhWeKrH1dQ5oxoZm/7iqyNNf2vsbqr33hz8vRv/aFX8e6p8jSjAnNPKG5N9nX+LrvgeX7DF36lq/In0rf8o0eP/N3TjpPPZ+FZtJ3fEXfpPQtRfpNhJ2Ph1Bv/+hsKzbreMW+MbSj/H/A/NeVba4dMTlb5md4fT++bc7w6P9RPMNDnWTbAZPHMo6Z6v53d+kMD3/HEAp1u87woi9gBSBzwOTJvk6LfNQynkcwnrctzNjI56BxC/MxMN+5Mn1rCOt1f4wJe0XQpvnbA6vnPdixNcf15rgH0BYK8tz3Q0Eev62Qz8ZMHvPXSOh3Dv7h/XysGfrfDNcM6hzA+FEey/aKWd0Td5fWzGCH70gX+u5csOdb520kyEvfpo/MOtb/+vuPP/8x7MLFyl96aFjcYkDO+vdauNgXr7iljZ7zHZwB6JKSfwg6UP6lu9uxPmVMntx54khabMDkhTJRiw3P3N0G1kmwyZReamhX20vtOTDftdhpjE5iIHukFyb2RdlYkOWbf2qLhP4YX5z1wt2lg3rNhIMf84zZfoG9bBmPMXKMUqxIG58IuA9hfLf+qfXHV84/JdRbW+u1n/HHPIbpj5n8a/fMN4g0nqtvtPOmrLKbvLqpptVqVSwrPg/GbP4QVFt/Vebz5aRYlotpXuWzH66/mFblsiqz7LLIrots+qP1L6ezxfKjEel1Zh8nn9NP74dOvW7HDZS9uu6Z8jeXJ17M5Alg18WBKzfvqXpbn5U73iEXtNxvGUJdVG/WJfW2fFhvy5PuXr1tI7X1oQ03d/Y6cs/oL2SRHTGTHzoAzckh9KH+Y0H/IdO/YbdQh7mLs0KhjuTt/HRdpya/g27tw/1bnYyPddw2ih0f62oyn88uJ4u0KFfLm1WRf25dfQCQH95nLjMAAA==", - "debug_symbols": "zZzNSiNREEbfpddZ3K/uv68yDBI1SiAkEuPAIL77dEviBNNmqM1wNpLWOqRihZMm1HffhofV3evT7Xr7uHsZbn68DZvd/fKw3m3Hq7f3xXC3X28266fb818PYfqh/FH/8rzcTpcvh+X+MNzkthhW24fxQR/px/VmNT4M7z8Xg4qzvjrrm7O+++otOOvlrDdnfXTWJ2e9c77mnK8552vO+ZpzvtE53+icb3TONzrnG53zjbPzleoRkNpXoriJ6iaam+heIgU3ITdhbmJ23srpRJR8TiwuSlvXsbRb/Cw185ROfSRIHxnSR4H0USF9NEgfndFHDpA+BOnDIH1AfJohPs0Qn2aITzPEpxni0wzxaYH4tEB8WiA+LRCfFohPC8SnBeLTAvFpgfi0QHxaIT6tEJ9WiE8rxKcV4tMK8WmF+LRCfFohPq0QnzaITxvEpw3i0wbxaYP4tEF82iA+bRCfNohPG8SnHeLTDvFph/i0Q3zaIT7tEJ92iE87xKcd4tMO8akCRKgKEKMqQJSqAHGqAkSqChCrKkC0qgDxqgJErAoUs4piVlHMKopZRTGrKGYVxayimFUUs4piVlHMahSzGsWsRjGrUcxqFLMaxaxGMatRzGoUsxrFrJFi1kgxa6SYNVLMGilmjRSzRopZI8WskWLWSDFropg1UcyaKGalZKlECVOJkqYSJU4lSp5KlECVKIkqUSJVomSqRAlViZKqEiVWJUquSpRglSjJKlGiVaJkq0QJV4mSrhIlXiVKvkqUgJUoCStRIlaiZKxECVmJkrLSfEyi9iPRwnkbE9DcJ4TomxX3q0jyI9mPFD9S/UjzI+7DYfTNPnK0ExLrBSI/Yn4k+pH56afT+3j8fuICyX6k+JH56Vv/fC2Xc2l+pHsR+2Z58ioiP2J+JPoRyAe5UZb8jLLkZ5QlP6Ms+Rllyc8oS35GWfKz/7nkV9Ppo7me3TKdGomURhKlkXmzft52jjdzXz8V5pfPxrf9ETFdnmTZ3cj8Qtd1RH7E/Ej0I8mPzM5l1P4JsXCBFD9S/Uj7F1IvkO5G5pdOriPyI+ZHkg95H69+Lffr5d1mdTwR9/F1e392QO7h9/Pqy1m5z/vd/erhdb+aTs39e2Du9D+xbAurcbo5/biMdWHJpsvp5VtN41/L+KzjM/8B", + "bytecode": "H4sIAAAAAAAA/+1azW7TQBBe13YaO0kTKBTaigfgZsdOnN564EWcpJW4IIR4AD8TEpw4IfECHDlyQOIIEheQELjsOF8m4/A3CzmwUrTr3dlvfnZ2PNm1Z1bFs3XAno1Ac27r5M9KqoiViIJuK0RzxzYi+7wH476ishHjq4k/S/JJJOinKH8WWUyX9iFMB/jJvsW5V63wuS4GaqLjc+rxgW2jnxFN145T+8C2IzbHxfo7XJ/kUJCfePWsrh+Zrj7YR0mOxk8CfewxYYf62M3+6ehj54S9r489IV/vArbH1hljm6LPTT3Gz5j1+GAY/5jJqh2jPMaP5OH2oX1BtosFWUfCGOqGY8gnFvhIWIEiVqiI1VHEIn8fmk370XrweKEdFz1mowD04DxJH25TjDch67tr61qfzzCHx1df6OO24/sC7cN971zFPsU8MrIP6eCPxzyu6uJP5zy2KuOfSTFUEf+C8GM3+M27p+cEPysJv+9G/iafGLjx/8Y/D9zgN/4zdII/XhD+yI39G/xrbvCbvPi6G/yC8A/drG+zv264kX9G+Ded4GeN/Y/c2Cch/Ftu7DMl/Ntu5F9SjnhsVoXn1yfQr5e7ZPnP5tfEP2ayusqvT5g83D48vz4VZB0JYzzHORX4nAp8JKxQEaujiLWviBUpYsWKWJq27+2oXH1FrMGOYmnqeKCIpbmOwx2Va6SIdU0RSzPmXFfEOlTEuqGItaux8KYi1q7uIU2f0IxfR4pYmnt7V331f17472L0/7zw17BuKWJp+oRmnNDMTXbVv247wHJ9hy6d5SviT6SzfKOHn7q7J50lju9CU+kcX9E2CZ2lSN9E1OvxBPrrH91thWblrzg3hHGkfwaYT227jrVDRle3+R1ez41tmzs8+j+Kd3jIk2TbY/TYRp2p77mtpTs8/I7BF/q23eEFP4HlAc0eoyf5Oi30QYs+L0CfLy2YoZHvQcMWzJeA6Vkh6KzBr1bz0SfqEsCY5rcHNZ8A5NhY42pd7wGM+QI9t/2BQI9nK2SzEaPH+DUU5vXBPnyeiz1D/81wzyDPAeiP9NiuS8j6Xtla2jODLbYjXmi7viCPZLtjZruhY9uNBNsNt9gO8yJqo+2o77XRs92xIM/v+vxIoJfO9ftmFScePrr/4LFhBQMdTxhQsLBFgIzNj1twcS6WsGWMnrMtOAPgJb04feCB9B9sXev6hmHyFyMPulGLDBj4kSZokeGtrWvHOvHWMaWEAOVqSwjeAabnyXIaoxNUSR4p2cC5SBsKtPyPE40Fwnz0L4713tbSRw6aAQcPQo3ZfPl/aNHHGNlHyVekpDEA3Ceg35V9Kn39itn3gHola7WyM34IZRj/kNF/ss88uSZ9zn9TzsuiTC+z8rKclMtlvij5Ohiz/hGtNv+yyGaLcb4o5pOszKZ/nX8+KYtFWaTpWZ5e5Onkb/NfTKbzxTchkou0fhz/iD+9fDvVahyTz7rs22eK35ye8EJG37UA9b6Ibbt5Twn8arrjLXReS32FIfQF1XpfVG3S+9UmPfGOq00ZaawHYyHj07fPaC/EIjlCRn9kAWhNujCH5o8E/l3Gf01uoQ9jF8fyhT6ir9dnaCc18R14a38YccWT4WMfl418x8W+Gs9m07PxPMmL5eJymWc/2ldfATd8RiZqNAAA", + "debug_symbols": "zZzNSiNREEbfpddZ3K9u3z9fZRgkaiuBkEiMA4P47tMtiRPsNkNthrORtNYhJRVOOlrffesehrvXp9vN7nH/0t38eOu2+/v1cbPfjVdv76vu7rDZbjdPt5ff7sL0Remj/uV5vZsuX47rw7G7SXXVDbuH8UEb6cfNdhgfhvefq07ZWV+c9dVZ33z1Fpz1ctabsz4663tnvXO+5pyvOedrzvmac77ROd/onG90zjc65xud842L85XKCZDqVyK7ieImqptoXqIPbkJuwtzE4ryV+jOR0yWxmpXWplNps/hZauYpnfroIX0kSB8Z0keB9FEhfTRGHylA+hCkD4P0AfFpgvg0QXyaID5NEJ8miE8TxKcZ4tMM8WmG+DRDfJohPs0Qn2aITzPEpxni0wzxaYH4tEB8WiA+LRCfFohPC8SnBeLTAvFpgfi0QHxaIT6tEJ9WiE8rxKcV4tMK8WmF+LRCfFohPq0QnzaITxvEpw3i0wbxaYP4tEF82iA+bRCfNohPG8SnChChKkCMqgBRqgLEqQoQqSpArKoA0aoCxKsKELEqUMwqillFMasoZhXFrKKYVRSzimJWUcwqillFMatRzGoUsxrFrEYxq1HMahSzGsWsRjGrUcxqFLNGilkjxayRYtZIMWukmDVSzBopZo0Us0aKWSPFrD3FrD3FrD3FrJQslShhKlHSVKLEqUTJU4kSqBIlUSVKpEqUTJUooSpRUlWixKpEyVWJEqwSJVklSrRKlGyVKOEqUdJVosSrRMlXiRKwEiVhJUrESpSMlSghK1FSVlqOSZR2Imq4bGMCqvuEEH2z4n4V6f1I8iPZjxQ/Uv2I+3AYfbOPHO2MxDJD5EfMj0Q/sjz9/vw6Hv8+MUOSH8l+ZHn61j5/l/lcqh9pXsS+WZ68isiPmB+JfqT3I8mPZD9S/Ej1I/7pyz99+adPWZoyytKUUZamjLI0ZZSlKaMsTRllacooS1P2P5emSn++ZSoXt7LnRkRpxCiNLJv18+PAeJP99V1heZlnfEs6IePrboYUP1L9SHMjy0sn1xH5EfMji3MZb0jOiIUZ0vuR5Efyv5AyQ4ofqX6kuZHlf4xfR8yHvI9Xv9aHzfpuO5xOKn583d1fHFx8/P08fDnD+Pmwvx8eXg/DdJrx34OMp24th5VVTR8aPi77tLIUpsvpZWnVxp/247OOz/wH", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 27bdf943398..b2c547781ad 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -41,8 +41,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+2azW7bOBDHqUiyIzv+SNK0TfMEe5Ms2XJuOeyLyHYC7GWxWOwD6JkK7J72VKAv0GMPBXpsgV5aoECBHlqmHPnv8cj9GrY+VEAgihz+ZjgcjhjRgVlfgbtH7NkIMlfunn7flSmyUtHQXRfJnLlC4p4PoD1UHGzC9Gry52kxTYTxKdqfJ47p0z/E9MBPu47ze73m87EYuJMc72PbB66McUYyh66dykNXTlgfH/PvcX7SU8F+0tV3Y33FxhqCf5TsaOIk0mdPiB3rs5v109FnF8Tu6rOnFOuHwA7YPGNuU4y5WcD0GbOZHwzT32O2aueogOkje7h/aF2Q73qCrWOhDceGbainJ+iRWJEiK1ZkdRRZFO8js+0/mg+eL7TzYsB8FME4uE4aD/cp5puY1f3m7nY8b6APz6+hUMd9x9cF+ofH3pWKf8pFYuQY0uFPJjyv6vJnC55blfmXUg5V5F8Tv+eH37x7+l74eUX8Iz/2N/uJgZ/4b+Jz6IffxM/IC3+yJP7Yj/8b/rEffrMvPvHDL4l/6md+m/V1x4/9c+KfeeHnjf/v+vFPSvx7fvwzI/59P/avaI94btYX318/gHq9vUtefOn+mvT3mK2+9tcPmD3cP3x/fSHYOhba+B7nQtBzIeiRWLEiq6PI6iqyEkVWT5Gl6fv+ntp1pMga7ClLc4xDRZbmPI721K6xIutYkaWZc04UWaeKrDuKrH3NhWeKrH1dQ5oxoZm/7iqyNNf2vsbqr33hz8vRv/aFX8e6p8jSjAnNPKG5N9nX+LrvgeX7DF36lq/In0rf8o0eP/N3TjpPPZ+FZtJ3fEXfpPQtRfpNhJ2Ph1Bv/+hsKzbreMW+MbSj/H/A/NeVba4dMTlb5md4fT++bc7w6P9RPMNDnWTbAZPHMo6Z6v53d+kMD3/HEAp1u87woi9gBSBzwOTJvk6LfNQynkcwnrctzNjI56BxC/MxMN+5Mn1rCOt1f4wJe0XQpvnbA6vnPdixNcf15rgH0BYK8tz3Q0Eev62Qz8ZMHvPXSOh3Dv7h/XysGfrfDNcM6hzA+FEey/aKWd0Td5fWzGCH70gX+u5csOdb520kyEvfpo/MOtb/+vuPP/8x7MLFyl96aFjcYkDO+vdauNgXr7iljZ7zHZwB6JKSfwg6UP6lu9uxPmVMntx54khabMDkhTJRiw3P3N0G1kmwyZReamhX20vtOTDftdhpjE5iIHukFyb2RdlYkOWbf2qLhP4YX5z1wt2lg3rNhIMf84zZfoG9bBmPMXKMUqxIG58IuA9hfLf+qfXHV84/JdRbW+u1n/HHPIbpj5n8a/fMN4g0nqtvtPOmrLKbvLqpptVqVSwrPg/GbP4QVFt/Vebz5aRYlotpXuWzH66/mFblsiqz7LLIrots+qP1L6ezxfKjEel1Zh8nn9NP74dOvW7HDZS9uu6Z8jeXJ17M5Alg18WBKzfvqXpbn5U73iEXtNxvGUJdVG/WJfW2fFhvy5PuXr1tI7X1oQ03d/Y6cs/oL2SRHTGTHzoAzckh9KH+Y0H/IdO/YbdQh7mLs0KhjuTt/HRdpya/g27tw/1bnYyPddw2ih0f62oyn88uJ4u0KFfLm1WRf25dfQCQH95nLjMAAA==", - "debug_symbols": "zZzNSiNREEbfpddZ3K/uv68yDBI1SiAkEuPAIL77dEviBNNmqM1wNpLWOqRihZMm1HffhofV3evT7Xr7uHsZbn68DZvd/fKw3m3Hq7f3xXC3X28266fb818PYfqh/FH/8rzcTpcvh+X+MNzkthhW24fxQR/px/VmNT4M7z8Xg4qzvjrrm7O+++otOOvlrDdnfXTWJ2e9c77mnK8552vO+ZpzvtE53+icb3TONzrnG53zjbPzleoRkNpXoriJ6iaam+heIgU3ITdhbmJ23srpRJR8TiwuSlvXsbRb/Cw185ROfSRIHxnSR4H0USF9NEgfndFHDpA+BOnDIH1AfJohPs0Qn2aITzPEpxni0wzxaYH4tEB8WiA+LRCfFohPC8SnBeLTAvFpgfi0QHxaIT6tEJ9WiE8rxKcV4tMK8WmF+LRCfFohPq0QnzaITxvEpw3i0wbxaYP4tEF82iA+bRCfNohPG8SnHeLTDvFph/i0Q3zaIT7tEJ92iE87xKcd4tMO8akCRKgKEKMqQJSqAHGqAkSqChCrKkC0qgDxqgJErAoUs4piVlHMKopZRTGrKGYVxayimFUUs4piVlHMahSzGsWsRjGrUcxqFLMaxaxGMatRzGoUsxrFrJFi1kgxa6SYNVLMGilmjRSzRopZI8WskWLWSDFropg1UcyaKGalZKlECVOJkqYSJU4lSp5KlECVKIkqUSJVomSqRAlViZKqEiVWJUquSpRglSjJKlGiVaJkq0QJV4mSrhIlXiVKvkqUgJUoCStRIlaiZKxECVmJkrLSfEyi9iPRwnkbE9DcJ4TomxX3q0jyI9mPFD9S/UjzI+7DYfTNPnK0ExLrBSI/Yn4k+pH56afT+3j8fuICyX6k+JH56Vv/fC2Xc2l+pHsR+2Z58ioiP2J+JPoRyAe5UZb8jLLkZ5QlP6Ms+Rllyc8oS35GWfKz/7nkV9Ppo7me3TKdGomURhKlkXmzft52jjdzXz8V5pfPxrf9ETFdnmTZ3cj8Qtd1RH7E/Ej0I8mPzM5l1P4JsXCBFD9S/Uj7F1IvkO5G5pdOriPyI+ZHkg95H69+Lffr5d1mdTwR9/F1e392QO7h9/Pqy1m5z/vd/erhdb+aTs39e2Du9D+xbAurcbo5/biMdWHJpsvp5VtN41/L+KzjM/8B", + "bytecode": "H4sIAAAAAAAA/+1azW7TQBBe13YaO0kTKBTaigfgZsdOnN564EWcpJW4IIR4AD8TEpw4IfECHDlyQOIIEheQELjsOF8m4/A3CzmwUrTr3dlvfnZ2PNm1Z1bFs3XAno1Ac27r5M9KqoiViIJuK0RzxzYi+7wH476ishHjq4k/S/JJJOinKH8WWUyX9iFMB/jJvsW5V63wuS4GaqLjc+rxgW2jnxFN145T+8C2IzbHxfo7XJ/kUJCfePWsrh+Zrj7YR0mOxk8CfewxYYf62M3+6ehj54S9r489IV/vArbH1hljm6LPTT3Gz5j1+GAY/5jJqh2jPMaP5OH2oX1BtosFWUfCGOqGY8gnFvhIWIEiVqiI1VHEIn8fmk370XrweKEdFz1mowD04DxJH25TjDch67tr61qfzzCHx1df6OO24/sC7cN971zFPsU8MrIP6eCPxzyu6uJP5zy2KuOfSTFUEf+C8GM3+M27p+cEPysJv+9G/iafGLjx/8Y/D9zgN/4zdII/XhD+yI39G/xrbvCbvPi6G/yC8A/drG+zv264kX9G+Ded4GeN/Y/c2Cch/Ftu7DMl/Ntu5F9SjnhsVoXn1yfQr5e7ZPnP5tfEP2ayusqvT5g83D48vz4VZB0JYzzHORX4nAp8JKxQEaujiLWviBUpYsWKWJq27+2oXH1FrMGOYmnqeKCIpbmOwx2Va6SIdU0RSzPmXFfEOlTEuqGItaux8KYi1q7uIU2f0IxfR4pYmnt7V331f17472L0/7zw17BuKWJp+oRmnNDMTXbVv247wHJ9hy6d5SviT6SzfKOHn7q7J50lju9CU+kcX9E2CZ2lSN9E1OvxBPrrH91thWblrzg3hHGkfwaYT227jrVDRle3+R1ez41tmzs8+j+Kd3jIk2TbY/TYRp2p77mtpTs8/I7BF/q23eEFP4HlAc0eoyf5Oi30QYs+L0CfLy2YoZHvQcMWzJeA6Vkh6KzBr1bz0SfqEsCY5rcHNZ8A5NhY42pd7wGM+QI9t/2BQI9nK2SzEaPH+DUU5vXBPnyeiz1D/81wzyDPAeiP9NiuS8j6Xtla2jODLbYjXmi7viCPZLtjZruhY9uNBNsNt9gO8yJqo+2o77XRs92xIM/v+vxIoJfO9ftmFScePrr/4LFhBQMdTxhQsLBFgIzNj1twcS6WsGWMnrMtOAPgJb04feCB9B9sXev6hmHyFyMPulGLDBj4kSZokeGtrWvHOvHWMaWEAOVqSwjeAabnyXIaoxNUSR4p2cC5SBsKtPyPE40Fwnz0L4713tbSRw6aAQcPQo3ZfPl/aNHHGNlHyVekpDEA3Ceg35V9Kn39itn3gHola7WyM34IZRj/kNF/ss88uSZ9zn9TzsuiTC+z8rKclMtlvij5Ohiz/hGtNv+yyGaLcb4o5pOszKZ/nX8+KYtFWaTpWZ5e5Onkb/NfTKbzxTchkou0fhz/iD+9fDvVahyTz7rs22eK35ye8EJG37UA9b6Ibbt5Twn8arrjLXReS32FIfQF1XpfVG3S+9UmPfGOq00ZaawHYyHj07fPaC/EIjlCRn9kAWhNujCH5o8E/l3Gf01uoQ9jF8fyhT6ir9dnaCc18R14a38YccWT4WMfl418x8W+Gs9m07PxPMmL5eJymWc/2ldfATd8RiZqNAAA", + "debug_symbols": "zZzNSiNREEbfpddZ3K9u3z9fZRgkaiuBkEiMA4P47tMtiRPsNkNthrORtNYhJRVOOlrffesehrvXp9vN7nH/0t38eOu2+/v1cbPfjVdv76vu7rDZbjdPt5ff7sL0Remj/uV5vZsuX47rw7G7SXXVDbuH8UEb6cfNdhgfhvefq07ZWV+c9dVZ33z1Fpz1ctabsz4663tnvXO+5pyvOedrzvmac77ROd/onG90zjc65xud842L85XKCZDqVyK7ieImqptoXqIPbkJuwtzE4ryV+jOR0yWxmpXWplNps/hZauYpnfroIX0kSB8Z0keB9FEhfTRGHylA+hCkD4P0AfFpgvg0QXyaID5NEJ8miE8TxKcZ4tMM8WmG+DRDfJohPs0Qn2aITzPEpxni0wzxaYH4tEB8WiA+LRCfFohPC8SnBeLTAvFpgfi0QHxaIT6tEJ9WiE8rxKcV4tMK8WmF+LRCfFohPq0QnzaITxvEpw3i0wbxaYP4tEF82iA+bRCfNohPG8SnChChKkCMqgBRqgLEqQoQqSpArKoA0aoCxKsKELEqUMwqillFMasoZhXFrKKYVRSzimJWUcwqillFMatRzGoUsxrFrEYxq1HMahSzGsWsRjGrUcxqFLNGilkjxayRYtZIMWukmDVSzBopZo0Us0aKWSPFrD3FrD3FrD3FrJQslShhKlHSVKLEqUTJU4kSqBIlUSVKpEqUTJUooSpRUlWixKpEyVWJEqwSJVklSrRKlGyVKOEqUdJVosSrRMlXiRKwEiVhJUrESpSMlSghK1FSVlqOSZR2Imq4bGMCqvuEEH2z4n4V6f1I8iPZjxQ/Uv2I+3AYfbOPHO2MxDJD5EfMj0Q/sjz9/vw6Hv8+MUOSH8l+ZHn61j5/l/lcqh9pXsS+WZ68isiPmB+JfqT3I8mPZD9S/Ej1I/7pyz99+adPWZoyytKUUZamjLI0ZZSlKaMsTRllacooS1P2P5emSn++ZSoXt7LnRkRpxCiNLJv18+PAeJP99V1heZlnfEs6IePrboYUP1L9SHMjy0sn1xH5EfMji3MZb0jOiIUZ0vuR5Efyv5AyQ4ofqX6kuZHlf4xfR8yHvI9Xv9aHzfpuO5xOKn583d1fHFx8/P08fDnD+Pmwvx8eXg/DdJrx34OMp24th5VVTR8aPi77tLIUpsvpZWnVxp/247OOz/wH", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index e19a252b4a9..b693262a9a0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -41,8 +41,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+2azW7TQBDH142dxEnThBYKfQVO8Ufi9IBUCcQrcEBCcpIGwQEqQJU4IHzghgSvTF127H8m47bAbMmhK1Ve787+5mN3x2unnqmLZ68+uzeCzIm9jv+tRIqssWjoVYVkDm0ltPc70N9SdDZkejX5s3E6CQX/FO1PQst0GR9iOuCPO5bzrKj53BcDV5LjY8r+ga3jOiOZru2n+tDWQzbGxfw7nJ/xgWD/DvhWlqdF3WcUdfdtLN+yWNJcKeqq1qGvz46JHeizq/3Z1menxO7osye0l7rA9tg8Y+5UXNNTj+kzZj3/GKa/x2zVzoEe00f28PjQvqPY9QRbR0If+oZ9qKcn6JFYviIrUGS1FVm03odmM340HzxfaOddj8XIBz+4TvKHxxTzTcDaHttr6c8ZjOH5tSW08djxfYHxcfVcDwV/FfkTnle1D8Hucuts7Dh/RpR/pHNUGa8E2nG9BqZeTzg2gH6Uz4A5tfXyTDA0m/uA78ueG9+rfdm3PNyXUp7cYfJYR5+p7Ym9SvsSzyYtoe2qfenfgCWd8bi/7QZ5v8Gfp+DPxwZmYOTcFjQwnwPz3Nbp7N0q6vG4JsriQ5/meaLU8xns2JjjYt3vXehrCfI89gNBfhdkKGYjJo/5JRTGKcZgORBsNSwme6C7zfqG0Id7hZcWu0efynn4CVwuh3Uch3tYymkBk39tr6UPLxiT5x2+psMGG3BfoYzfYMNLU/t84K0zpXwrnbt4vn0FzPMGO43RWbNkj5TLcSzKBoJsx8i++8L4stC7Kmet7DU0m2tQ8/mxD1xjNnPr6wZ/jJHXKK0V6ZnsAzcB/y7jU+j7l81+Px8vbS3qOPM9i/oDJv/e3uN6RX9O/tLOVZZHqyRf5ZN8uUwXOZ8HA7HrO9CfZ8lsEaeLbD5J8mR66/rTSZ4t8iyKjtPoNI0mt61/MZnOFxdGjE+j8ja+Tj89D9pF3Y/P9rJ07D3lby5PvIDJfyHZi7+vtk45JxD0lXI/rpDzGq6XDKHNL9bbwmJTvlVsypPuXrFpI/X1oQ/PHWXZtfcYL2SRHQGT/27vaU66MIbGjwT9XaZ/zW6hDXMXZ7WENpIv5+cb8ewVfdf+VnOpk/GxjdtGa+e675mU809UbM3m0jcKPX4cS+/gevzpXHoHV+Qf83dwZf4p8btu+Kn0nq/HT3LpXVrR/kg6aymu/1h651HkV+tn4IQfL4i/5yb+FX/ohl99Qxu54WfEv+dmfqv9te/G/hnxD5zwkyr+993Ep/rO+MBNfKbEP3Rjf/XN4qGpS3Ums/VH0K53jkjSm5wVUX+P2eriXIP6yB4eH/4b1JFg60jo42ecI0HPkaBHYvmKrECR1VZkdRRZXUWWZuzDLbWrp8jqbylL08ddRZbmPA621K49RdZQkaWZc0aKrHuKrH1F1rbmwgNF1rbuIc01oZm/7iuyNPf2tq7Vu3Ph/8vRd+fCP2M9UGRprgnNPKF5NtnW9XXokCX979yOwPKYXygvvW+XzyjKSWcf3rz7ZFhBEMElw4IGAxLGox/KOZfzTQOX25IIHBc/NMaz2fQ4no/TbLlYLdPkuh8afwH9lLSXDjMAAA==", - "debug_symbols": "tdrdSuNQFIbhe8lxDvb61v71VgaRqlEKpZVaBwbx3ieRplMyYYb3oCfSyH53rE9Lymo+u+fh8eP1Ybt/Obx3dz8+u93haXPaHvbj0edX3z0et7vd9vXh+tddmH5Y/l7//rbZT4fvp83x1N2l2nfD/nl80Mb6Zbsbxofh677vrMD1Fa5vbL0CXG9wveB6h+sjXJ/geugr6CvoK+jr0Nehr0Nfh74OfR36+qqvWTkHZnVZFFxUXDRaxIALw4Vw4bRIq39VaeeghuX6hM+AxRMWT1g8YfGMxTMWz1g8r4u75sLLsoi4SLjIuFg3jzYXMS6LiotGi7JurnZ5HkuPYrgQLhwXERcJFxkX6+YpzkVO10X/19LaZromvyyVvjevt9y83XDzGm65ud1yc91yc7/l5utvkMt10GpavHjr6otXFs6FbPnRp1ZcNFq0gAvDhXDhuFj1UJgvhNLyg0lLuMi4KP8rlpe1VnHRaGEh8MR44jiJq4r/eh9aTDzJPCk8qTxpOEmBJ8YT8cR5wvUT109cP3H9xPUT189cP3P9zPUz189cP3P9zPUz189cP3P9wvUL1y9cv3D9wvUL1y9cv3D9wvUL169cv3L9yvUr169cv3L9yvUr169cv3L9xvUb129cv3H9xvUb129cv3H9xvUb1lcIPDGeiCfOk8iTxJPMk8KTyhOub1zfuL5xfeP6xvWN6xvXN65vXN+4vri+uL64vri+uL64vri+uL64vri+c33n+s71nes713eu71zfub5zfef6ketHrh+5fuT6fNYnPusTn/WJz/rEZ33isz7xWZ/4rE981ic+6xOf9YnP+sRnfeKzPvFZn/isT3zWJz7rE5/1ic/6xGd94rM+8Vmf+KxPfNYnPusTn/VpfdZX4vz9S7m6V2dOxBNnydd49HNz3G4ed8P55s2Xj/3T1b2cp19vw+K2zrfj4Wl4/jgO0w2ef+7tnP4nJust6n76wmk6DLk3s+lwevoqqVcp41nHM/8G", + "bytecode": "H4sIAAAAAAAA/+2azW7bOBDHqViyLduJ3aTtbrDAPsCeLEu2nMMCAbrYF9gHWMhyDOylXRQFWqBAoR6KXnor0L5uy5Qj/T0aJf0Ytj6UQCCKHP7mg+SIkhOYpgTuGrJ7I8hcuuv820qiyJqLht5USOZ3V4nd/RH09xSdjZleTf56ni1jwT9F+9PYMX3Gh5ge+POB4/xVNXzui4EryfExtv/Y1XGdkczQ9VN96uoxG+Nj/j3Oz/xMsP8IfLPlQdX0GUXdYxfLxyyWNFeKuup1GOqzF8SO9Nn1/uzrszNiD/TZS9pLQ2AHbJ4xdyqu6VXA9Bmzn38M0z9itmrnwIDpI3t4fGjfUexGgq0zoQ99wz7UMxL0SKxQkRUpsvqKLFrvU9OOH80HzxfaeTdgMQrBD66T/OExxXwTsbY/3NX68wzG8PzaE9p47Pi+wPj4eq7Hgr+K/CXPq9qHYH+5dT33nD8Tyj/SOcrGK4V2XK+RadYTjo2gH+VzYK5c3Z4Jpqa9D/i+HPnxvd6XY8fDfSnlySMmj3X0mdr+dFdpX+LZpCe03bQvw89gSWc87m+/Qz7s8OcB+PO8gxkZObdFHcy/gfnC1ens3aua8bgmbAmhT/M8YfW8BDtac1zt+z2Bvp4gz2N/LMhPQIZiNmPy0rMMx40hPnycjz1z4ni4Z1DnBPxHeazbErG2f9xV2jOTG2JHujB2Y8Ge2LRjpxifq2PBRyrUNwXdfdY3gz60n5ceu0efbOzeA5fLYR3H4VxKz4OIyT9yV+vDv4zJczbPB3GHDZiTUCbssKE0jc+/BftM6VklnVn5s2oHzBcddhqjs9/JHuk5iGNRNhJkB0b2PRTG20Lv+Zz10F1j016DmnnkFLjGtJ9Ljzr8MUZeo7RWpPNMCNwU/LuOT6XvX77+lCevba2aOPM9i/ojJv/U3eN6RX8uv9LOXV4ku7TYFctiu83Kgs+DgdiNPegv8nRdLrIy3yzTIl19d/3ZssjLIk+Siyy5ypLl99ZfLleb8qMR86vE3i5u00/Pin7V9OO5yJaBu6f8zeWJFzH5VyT78e+1q1POiQR9Vu7dDXJBx/WaIbSF1X5bXLXle1VbnnSPqraN1DeGPjyz2TJx9xgvZJEdEZN/6+5pToYwhsbPBP1Dpn/PbqENcxdn9YQ2krfz84Z47oq+a3/nutbJ+NjGbaO1c9u3YMr5lyq25hvp+44ef7GQvl/o8Vcb6fuFIv+Cf79Q5l8Rf+iHn0nfSPT4aSF9h1C0P5HOWorrfyG98yjyL6R3TsX9VRL/xE/8a/7UD7/+/jjzw8+Jf8fP/Nb769SP/Wvin3nhp3X87/qJT/2N9p6f+KyIf9+P/Vt6Z/rFNKU+k7n6r9Cud45Is885K6L+EbPVx7kG9ZE9PD7897tzwdaZ0MfPOOeCnnNBj8QKFVmRIquvyBoosoaKLM3Yxwdq10iRNT5QlqaPE0WW5jweH6hdJ4qsqSJLM+fMFFl3FFmniqxDzYVniqxD3UOaa0Izf91VZGnu7UNdqz/PhT8uR/88F34Z654iS3NNaOYJzbPJoa6v+x5Z0v8dHgmsgPmF8tL7tn1GUU76//F/D58YVhBEcMmwqMOAlPHoh3LO5XzTweW2pALHxw+Ni/V6dbHYzLN8W+62WXrbD40fAOfF/BJKNAAA", + "debug_symbols": "tdrNSiNBFIbhe+l1FnW++jvlrQwiUVsJhERiHBjEe59uSZzQFg7vIhtJS72VyJNAe1Lvw+N4//Z8t9k97V+Hm1/vw3b/sD5u9rvp6v1jNdwfNtvt5vnu8tdDmH9Y+Vz/+rLezZevx/XhONxkXw3j7nF60Kb6abMdp4fh43Y1WIXrHa5vbL0CXG9wveD6CNcnuD7D9dBX0FfQV9A3Qt8IfSP0jdA3Qt8IfWPX16yeAjNfFhUXjotGixRwYbgQLiItcvdV1XYKPCzXZ/wMWDxj8YzFMxYvWLxg8YLFS1886lzEuiwSLjIuCi765snORUrLwnHRaFH75mpff8fSoxouhIuIi4SLjIuCi4oLx0WjhWNzx+aOzR2bOzb3vnlO56Lky2L1bam380epKX4tlT43L9fcvF5zc7/m5u2Km7dwzc3tmpv3PyBf9yXmefHmbd03ryycCtnyVrQVXFRcOC4aLSwEnhhPuiQK53sTKXxLIk8ST/L/kvotKTypPHGeNJyY4SR3KX/6PFqOPEk8yTwpPKk8cZ40nPT/xfg5MZ5w/cL1C9cvXL9w/cL1C9cvXL9y/cr1K9evXL9y/cr1K9evXL9y/cr1nes713eu71zfub5zfef6zvWd6zvXb1y/cf3G9RvXb1y/cf3G9RvXb1y/YX2FwBPjiXgSeZJ4knlSeFJ54jzh+sb1jesb1zeub1zfuL5xfeP6xvWN64vri+uL64vri+uL64vri+uL64vrR64fuX7k+pHrR64fuX7k+pHrR64fuX7i+onrJ66fuH7i+onrJ66fuH7i+onrZ66fuT6f9YnP+sRnfeKzPvFZn/isT3zWJz7rE5/1ic/6xGd94rM+8Vmf+KxPfNYnPusTn/WJz/rEZ33isz7xWZ/4rE981ic+6xOf9YnP+sRnferP+mo6f/9SL85QnZL+rO/nxFjyMV39Xh826/vteDpU+/S2e7g4Y3v88zIujtu+HPYP4+PbYZwP3v47czu/2vncgOVwO39HNV9aWpm1+XJ+YfK4kufpWadn/gs=", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_0.snap index 27bdf943398..b2c547781ad 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_0.snap @@ -41,8 +41,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+2azW7bOBDHqUiyIzv+SNK0TfMEe5Ms2XJuOeyLyHYC7GWxWOwD6JkK7J72VKAv0GMPBXpsgV5aoECBHlqmHPnv8cj9GrY+VEAgihz+ZjgcjhjRgVlfgbtH7NkIMlfunn7flSmyUtHQXRfJnLlC4p4PoD1UHGzC9Gry52kxTYTxKdqfJ47p0z/E9MBPu47ze73m87EYuJMc72PbB66McUYyh66dykNXTlgfH/PvcX7SU8F+0tV3Y33FxhqCf5TsaOIk0mdPiB3rs5v109FnF8Tu6rOnFOuHwA7YPGNuU4y5WcD0GbOZHwzT32O2aueogOkje7h/aF2Q73qCrWOhDceGbainJ+iRWJEiK1ZkdRRZFO8js+0/mg+eL7TzYsB8FME4uE4aD/cp5puY1f3m7nY8b6APz6+hUMd9x9cF+ofH3pWKf8pFYuQY0uFPJjyv6vJnC55blfmXUg5V5F8Tv+eH37x7+l74eUX8Iz/2N/uJgZ/4b+Jz6IffxM/IC3+yJP7Yj/8b/rEffrMvPvHDL4l/6md+m/V1x4/9c+KfeeHnjf/v+vFPSvx7fvwzI/59P/avaI94btYX318/gHq9vUtefOn+mvT3mK2+9tcPmD3cP3x/fSHYOhba+B7nQtBzIeiRWLEiq6PI6iqyEkVWT5Gl6fv+ntp1pMga7ClLc4xDRZbmPI721K6xIutYkaWZc04UWaeKrDuKrH3NhWeKrH1dQ5oxoZm/7iqyNNf2vsbqr33hz8vRv/aFX8e6p8jSjAnNPKG5N9nX+LrvgeX7DF36lq/In0rf8o0eP/N3TjpPPZ+FZtJ3fEXfpPQtRfpNhJ2Ph1Bv/+hsKzbreMW+MbSj/H/A/NeVba4dMTlb5md4fT++bc7w6P9RPMNDnWTbAZPHMo6Z6v53d+kMD3/HEAp1u87woi9gBSBzwOTJvk6LfNQynkcwnrctzNjI56BxC/MxMN+5Mn1rCOt1f4wJe0XQpvnbA6vnPdixNcf15rgH0BYK8tz3Q0Eev62Qz8ZMHvPXSOh3Dv7h/XysGfrfDNcM6hzA+FEey/aKWd0Td5fWzGCH70gX+u5csOdb520kyEvfpo/MOtb/+vuPP/8x7MLFyl96aFjcYkDO+vdauNgXr7iljZ7zHZwB6JKSfwg6UP6lu9uxPmVMntx54khabMDkhTJRiw3P3N0G1kmwyZReamhX20vtOTDftdhpjE5iIHukFyb2RdlYkOWbf2qLhP4YX5z1wt2lg3rNhIMf84zZfoG9bBmPMXKMUqxIG58IuA9hfLf+qfXHV84/JdRbW+u1n/HHPIbpj5n8a/fMN4g0nqtvtPOmrLKbvLqpptVqVSwrPg/GbP4QVFt/Vebz5aRYlotpXuWzH66/mFblsiqz7LLIrots+qP1L6ezxfKjEel1Zh8nn9NP74dOvW7HDZS9uu6Z8jeXJ17M5Alg18WBKzfvqXpbn5U73iEXtNxvGUJdVG/WJfW2fFhvy5PuXr1tI7X1oQ03d/Y6cs/oL2SRHTGTHzoAzckh9KH+Y0H/IdO/YbdQh7mLs0KhjuTt/HRdpya/g27tw/1bnYyPddw2ih0f62oyn88uJ4u0KFfLm1WRf25dfQCQH95nLjMAAA==", - "debug_symbols": "zZzNSiNREEbfpddZ3K/uv68yDBI1SiAkEuPAIL77dEviBNNmqM1wNpLWOqRihZMm1HffhofV3evT7Xr7uHsZbn68DZvd/fKw3m3Hq7f3xXC3X28266fb818PYfqh/FH/8rzcTpcvh+X+MNzkthhW24fxQR/px/VmNT4M7z8Xg4qzvjrrm7O+++otOOvlrDdnfXTWJ2e9c77mnK8552vO+ZpzvtE53+icb3TONzrnG53zjbPzleoRkNpXoriJ6iaam+heIgU3ITdhbmJ23srpRJR8TiwuSlvXsbRb/Cw185ROfSRIHxnSR4H0USF9NEgfndFHDpA+BOnDIH1AfJohPs0Qn2aITzPEpxni0wzxaYH4tEB8WiA+LRCfFohPC8SnBeLTAvFpgfi0QHxaIT6tEJ9WiE8rxKcV4tMK8WmF+LRCfFohPq0QnzaITxvEpw3i0wbxaYP4tEF82iA+bRCfNohPG8SnHeLTDvFph/i0Q3zaIT7tEJ92iE87xKcd4tMO8akCRKgKEKMqQJSqAHGqAkSqChCrKkC0qgDxqgJErAoUs4piVlHMKopZRTGrKGYVxayimFUUs4piVlHMahSzGsWsRjGrUcxqFLMaxaxGMatRzGoUsxrFrJFi1kgxa6SYNVLMGilmjRSzRopZI8WskWLWSDFropg1UcyaKGalZKlECVOJkqYSJU4lSp5KlECVKIkqUSJVomSqRAlViZKqEiVWJUquSpRglSjJKlGiVaJkq0QJV4mSrhIlXiVKvkqUgJUoCStRIlaiZKxECVmJkrLSfEyi9iPRwnkbE9DcJ4TomxX3q0jyI9mPFD9S/UjzI+7DYfTNPnK0ExLrBSI/Yn4k+pH56afT+3j8fuICyX6k+JH56Vv/fC2Xc2l+pHsR+2Z58ioiP2J+JPoRyAe5UZb8jLLkZ5QlP6Ms+Rllyc8oS35GWfKz/7nkV9Ppo7me3TKdGomURhKlkXmzft52jjdzXz8V5pfPxrf9ETFdnmTZ3cj8Qtd1RH7E/Ej0I8mPzM5l1P4JsXCBFD9S/Uj7F1IvkO5G5pdOriPyI+ZHkg95H69+Lffr5d1mdTwR9/F1e392QO7h9/Pqy1m5z/vd/erhdb+aTs39e2Du9D+xbAurcbo5/biMdWHJpsvp5VtN41/L+KzjM/8B", + "bytecode": "H4sIAAAAAAAA/+1azW7TQBBe13YaO0kTKBTaigfgZsdOnN564EWcpJW4IIR4AD8TEpw4IfECHDlyQOIIEheQELjsOF8m4/A3CzmwUrTr3dlvfnZ2PNm1Z1bFs3XAno1Ac27r5M9KqoiViIJuK0RzxzYi+7wH476ishHjq4k/S/JJJOinKH8WWUyX9iFMB/jJvsW5V63wuS4GaqLjc+rxgW2jnxFN145T+8C2IzbHxfo7XJ/kUJCfePWsrh+Zrj7YR0mOxk8CfewxYYf62M3+6ehj54S9r489IV/vArbH1hljm6LPTT3Gz5j1+GAY/5jJqh2jPMaP5OH2oX1BtosFWUfCGOqGY8gnFvhIWIEiVqiI1VHEIn8fmk370XrweKEdFz1mowD04DxJH25TjDch67tr61qfzzCHx1df6OO24/sC7cN971zFPsU8MrIP6eCPxzyu6uJP5zy2KuOfSTFUEf+C8GM3+M27p+cEPysJv+9G/iafGLjx/8Y/D9zgN/4zdII/XhD+yI39G/xrbvCbvPi6G/yC8A/drG+zv264kX9G+Ded4GeN/Y/c2Cch/Ftu7DMl/Ntu5F9SjnhsVoXn1yfQr5e7ZPnP5tfEP2ayusqvT5g83D48vz4VZB0JYzzHORX4nAp8JKxQEaujiLWviBUpYsWKWJq27+2oXH1FrMGOYmnqeKCIpbmOwx2Va6SIdU0RSzPmXFfEOlTEuqGItaux8KYi1q7uIU2f0IxfR4pYmnt7V331f17472L0/7zw17BuKWJp+oRmnNDMTXbVv247wHJ9hy6d5SviT6SzfKOHn7q7J50lju9CU+kcX9E2CZ2lSN9E1OvxBPrrH91thWblrzg3hHGkfwaYT227jrVDRle3+R1ez41tmzs8+j+Kd3jIk2TbY/TYRp2p77mtpTs8/I7BF/q23eEFP4HlAc0eoyf5Oi30QYs+L0CfLy2YoZHvQcMWzJeA6Vkh6KzBr1bz0SfqEsCY5rcHNZ8A5NhY42pd7wGM+QI9t/2BQI9nK2SzEaPH+DUU5vXBPnyeiz1D/81wzyDPAeiP9NiuS8j6Xtla2jODLbYjXmi7viCPZLtjZruhY9uNBNsNt9gO8yJqo+2o77XRs92xIM/v+vxIoJfO9ftmFScePrr/4LFhBQMdTxhQsLBFgIzNj1twcS6WsGWMnrMtOAPgJb04feCB9B9sXev6hmHyFyMPulGLDBj4kSZokeGtrWvHOvHWMaWEAOVqSwjeAabnyXIaoxNUSR4p2cC5SBsKtPyPE40Fwnz0L4713tbSRw6aAQcPQo3ZfPl/aNHHGNlHyVekpDEA3Ceg35V9Kn39itn3gHola7WyM34IZRj/kNF/ss88uSZ9zn9TzsuiTC+z8rKclMtlvij5Ohiz/hGtNv+yyGaLcb4o5pOszKZ/nX8+KYtFWaTpWZ5e5Onkb/NfTKbzxTchkou0fhz/iD+9fDvVahyTz7rs22eK35ye8EJG37UA9b6Ibbt5Twn8arrjLXReS32FIfQF1XpfVG3S+9UmPfGOq00ZaawHYyHj07fPaC/EIjlCRn9kAWhNujCH5o8E/l3Gf01uoQ9jF8fyhT6ir9dnaCc18R14a38YccWT4WMfl418x8W+Gs9m07PxPMmL5eJymWc/2ldfATd8RiZqNAAA", + "debug_symbols": "zZzNSiNREEbfpddZ3K9u3z9fZRgkaiuBkEiMA4P47tMtiRPsNkNthrORtNYhJRVOOlrffesehrvXp9vN7nH/0t38eOu2+/v1cbPfjVdv76vu7rDZbjdPt5ff7sL0Remj/uV5vZsuX47rw7G7SXXVDbuH8UEb6cfNdhgfhvefq07ZWV+c9dVZ33z1Fpz1ctabsz4663tnvXO+5pyvOedrzvmac77ROd/onG90zjc65xud842L85XKCZDqVyK7ieImqptoXqIPbkJuwtzE4ryV+jOR0yWxmpXWplNps/hZauYpnfroIX0kSB8Z0keB9FEhfTRGHylA+hCkD4P0AfFpgvg0QXyaID5NEJ8miE8TxKcZ4tMM8WmG+DRDfJohPs0Qn2aITzPEpxni0wzxaYH4tEB8WiA+LRCfFohPC8SnBeLTAvFpgfi0QHxaIT6tEJ9WiE8rxKcV4tMK8WmF+LRCfFohPq0QnzaITxvEpw3i0wbxaYP4tEF82iA+bRCfNohPG8SnChChKkCMqgBRqgLEqQoQqSpArKoA0aoCxKsKELEqUMwqillFMasoZhXFrKKYVRSzimJWUcwqillFMatRzGoUsxrFrEYxq1HMahSzGsWsRjGrUcxqFLNGilkjxayRYtZIMWukmDVSzBopZo0Us0aKWSPFrD3FrD3FrD3FrJQslShhKlHSVKLEqUTJU4kSqBIlUSVKpEqUTJUooSpRUlWixKpEyVWJEqwSJVklSrRKlGyVKOEqUdJVosSrRMlXiRKwEiVhJUrESpSMlSghK1FSVlqOSZR2Imq4bGMCqvuEEH2z4n4V6f1I8iPZjxQ/Uv2I+3AYfbOPHO2MxDJD5EfMj0Q/sjz9/vw6Hv8+MUOSH8l+ZHn61j5/l/lcqh9pXsS+WZ68isiPmB+JfqT3I8mPZD9S/Ej1I/7pyz99+adPWZoyytKUUZamjLI0ZZSlKaMsTRllacooS1P2P5emSn++ZSoXt7LnRkRpxCiNLJv18+PAeJP99V1heZlnfEs6IePrboYUP1L9SHMjy0sn1xH5EfMji3MZb0jOiIUZ0vuR5Efyv5AyQ4ofqX6kuZHlf4xfR8yHvI9Xv9aHzfpuO5xOKn583d1fHFx8/P08fDnD+Pmwvx8eXg/DdJrx34OMp24th5VVTR8aPi77tLIUpsvpZWnVxp/247OOz/wH", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 27bdf943398..b2c547781ad 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dedup_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -41,8 +41,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+2azW7bOBDHqUiyIzv+SNK0TfMEe5Ms2XJuOeyLyHYC7GWxWOwD6JkK7J72VKAv0GMPBXpsgV5aoECBHlqmHPnv8cj9GrY+VEAgihz+ZjgcjhjRgVlfgbtH7NkIMlfunn7flSmyUtHQXRfJnLlC4p4PoD1UHGzC9Gry52kxTYTxKdqfJ47p0z/E9MBPu47ze73m87EYuJMc72PbB66McUYyh66dykNXTlgfH/PvcX7SU8F+0tV3Y33FxhqCf5TsaOIk0mdPiB3rs5v109FnF8Tu6rOnFOuHwA7YPGNuU4y5WcD0GbOZHwzT32O2aueogOkje7h/aF2Q73qCrWOhDceGbainJ+iRWJEiK1ZkdRRZFO8js+0/mg+eL7TzYsB8FME4uE4aD/cp5puY1f3m7nY8b6APz6+hUMd9x9cF+ofH3pWKf8pFYuQY0uFPJjyv6vJnC55blfmXUg5V5F8Tv+eH37x7+l74eUX8Iz/2N/uJgZ/4b+Jz6IffxM/IC3+yJP7Yj/8b/rEffrMvPvHDL4l/6md+m/V1x4/9c+KfeeHnjf/v+vFPSvx7fvwzI/59P/avaI94btYX318/gHq9vUtefOn+mvT3mK2+9tcPmD3cP3x/fSHYOhba+B7nQtBzIeiRWLEiq6PI6iqyEkVWT5Gl6fv+ntp1pMga7ClLc4xDRZbmPI721K6xIutYkaWZc04UWaeKrDuKrH3NhWeKrH1dQ5oxoZm/7iqyNNf2vsbqr33hz8vRv/aFX8e6p8jSjAnNPKG5N9nX+LrvgeX7DF36lq/In0rf8o0eP/N3TjpPPZ+FZtJ3fEXfpPQtRfpNhJ2Ph1Bv/+hsKzbreMW+MbSj/H/A/NeVba4dMTlb5md4fT++bc7w6P9RPMNDnWTbAZPHMo6Z6v53d+kMD3/HEAp1u87woi9gBSBzwOTJvk6LfNQynkcwnrctzNjI56BxC/MxMN+5Mn1rCOt1f4wJe0XQpvnbA6vnPdixNcf15rgH0BYK8tz3Q0Eev62Qz8ZMHvPXSOh3Dv7h/XysGfrfDNcM6hzA+FEey/aKWd0Td5fWzGCH70gX+u5csOdb520kyEvfpo/MOtb/+vuPP/8x7MLFyl96aFjcYkDO+vdauNgXr7iljZ7zHZwB6JKSfwg6UP6lu9uxPmVMntx54khabMDkhTJRiw3P3N0G1kmwyZReamhX20vtOTDftdhpjE5iIHukFyb2RdlYkOWbf2qLhP4YX5z1wt2lg3rNhIMf84zZfoG9bBmPMXKMUqxIG58IuA9hfLf+qfXHV84/JdRbW+u1n/HHPIbpj5n8a/fMN4g0nqtvtPOmrLKbvLqpptVqVSwrPg/GbP4QVFt/Vebz5aRYlotpXuWzH66/mFblsiqz7LLIrots+qP1L6ezxfKjEel1Zh8nn9NP74dOvW7HDZS9uu6Z8jeXJ17M5Alg18WBKzfvqXpbn5U73iEXtNxvGUJdVG/WJfW2fFhvy5PuXr1tI7X1oQ03d/Y6cs/oL2SRHTGTHzoAzckh9KH+Y0H/IdO/YbdQh7mLs0KhjuTt/HRdpya/g27tw/1bnYyPddw2ih0f62oyn88uJ4u0KFfLm1WRf25dfQCQH95nLjMAAA==", - "debug_symbols": "zZzNSiNREEbfpddZ3K/uv68yDBI1SiAkEuPAIL77dEviBNNmqM1wNpLWOqRihZMm1HffhofV3evT7Xr7uHsZbn68DZvd/fKw3m3Hq7f3xXC3X28266fb818PYfqh/FH/8rzcTpcvh+X+MNzkthhW24fxQR/px/VmNT4M7z8Xg4qzvjrrm7O+++otOOvlrDdnfXTWJ2e9c77mnK8552vO+ZpzvtE53+icb3TONzrnG53zjbPzleoRkNpXoriJ6iaam+heIgU3ITdhbmJ23srpRJR8TiwuSlvXsbRb/Cw185ROfSRIHxnSR4H0USF9NEgfndFHDpA+BOnDIH1AfJohPs0Qn2aITzPEpxni0wzxaYH4tEB8WiA+LRCfFohPC8SnBeLTAvFpgfi0QHxaIT6tEJ9WiE8rxKcV4tMK8WmF+LRCfFohPq0QnzaITxvEpw3i0wbxaYP4tEF82iA+bRCfNohPG8SnHeLTDvFph/i0Q3zaIT7tEJ92iE87xKcd4tMO8akCRKgKEKMqQJSqAHGqAkSqChCrKkC0qgDxqgJErAoUs4piVlHMKopZRTGrKGYVxayimFUUs4piVlHMahSzGsWsRjGrUcxqFLMaxaxGMatRzGoUsxrFrJFi1kgxa6SYNVLMGilmjRSzRopZI8WskWLWSDFropg1UcyaKGalZKlECVOJkqYSJU4lSp5KlECVKIkqUSJVomSqRAlViZKqEiVWJUquSpRglSjJKlGiVaJkq0QJV4mSrhIlXiVKvkqUgJUoCStRIlaiZKxECVmJkrLSfEyi9iPRwnkbE9DcJ4TomxX3q0jyI9mPFD9S/UjzI+7DYfTNPnK0ExLrBSI/Yn4k+pH56afT+3j8fuICyX6k+JH56Vv/fC2Xc2l+pHsR+2Z58ioiP2J+JPoRyAe5UZb8jLLkZ5QlP6Ms+Rllyc8oS35GWfKz/7nkV9Ppo7me3TKdGomURhKlkXmzft52jjdzXz8V5pfPxrf9ETFdnmTZ3cj8Qtd1RH7E/Ej0I8mPzM5l1P4JsXCBFD9S/Uj7F1IvkO5G5pdOriPyI+ZHkg95H69+Lffr5d1mdTwR9/F1e392QO7h9/Pqy1m5z/vd/erhdb+aTs39e2Du9D+xbAurcbo5/biMdWHJpsvp5VtN41/L+KzjM/8B", + "bytecode": "H4sIAAAAAAAA/+1azW7TQBBe13YaO0kTKBTaigfgZsdOnN564EWcpJW4IIR4AD8TEpw4IfECHDlyQOIIEheQELjsOF8m4/A3CzmwUrTr3dlvfnZ2PNm1Z1bFs3XAno1Ac27r5M9KqoiViIJuK0RzxzYi+7wH476ishHjq4k/S/JJJOinKH8WWUyX9iFMB/jJvsW5V63wuS4GaqLjc+rxgW2jnxFN145T+8C2IzbHxfo7XJ/kUJCfePWsrh+Zrj7YR0mOxk8CfewxYYf62M3+6ehj54S9r489IV/vArbH1hljm6LPTT3Gz5j1+GAY/5jJqh2jPMaP5OH2oX1BtosFWUfCGOqGY8gnFvhIWIEiVqiI1VHEIn8fmk370XrweKEdFz1mowD04DxJH25TjDch67tr61qfzzCHx1df6OO24/sC7cN971zFPsU8MrIP6eCPxzyu6uJP5zy2KuOfSTFUEf+C8GM3+M27p+cEPysJv+9G/iafGLjx/8Y/D9zgN/4zdII/XhD+yI39G/xrbvCbvPi6G/yC8A/drG+zv264kX9G+Ded4GeN/Y/c2Cch/Ftu7DMl/Ntu5F9SjnhsVoXn1yfQr5e7ZPnP5tfEP2ayusqvT5g83D48vz4VZB0JYzzHORX4nAp8JKxQEaujiLWviBUpYsWKWJq27+2oXH1FrMGOYmnqeKCIpbmOwx2Va6SIdU0RSzPmXFfEOlTEuqGItaux8KYi1q7uIU2f0IxfR4pYmnt7V331f17472L0/7zw17BuKWJp+oRmnNDMTXbVv247wHJ9hy6d5SviT6SzfKOHn7q7J50lju9CU+kcX9E2CZ2lSN9E1OvxBPrrH91thWblrzg3hHGkfwaYT227jrVDRle3+R1ez41tmzs8+j+Kd3jIk2TbY/TYRp2p77mtpTs8/I7BF/q23eEFP4HlAc0eoyf5Oi30QYs+L0CfLy2YoZHvQcMWzJeA6Vkh6KzBr1bz0SfqEsCY5rcHNZ8A5NhY42pd7wGM+QI9t/2BQI9nK2SzEaPH+DUU5vXBPnyeiz1D/81wzyDPAeiP9NiuS8j6Xtla2jODLbYjXmi7viCPZLtjZruhY9uNBNsNt9gO8yJqo+2o77XRs92xIM/v+vxIoJfO9ftmFScePrr/4LFhBQMdTxhQsLBFgIzNj1twcS6WsGWMnrMtOAPgJb04feCB9B9sXev6hmHyFyMPulGLDBj4kSZokeGtrWvHOvHWMaWEAOVqSwjeAabnyXIaoxNUSR4p2cC5SBsKtPyPE40Fwnz0L4713tbSRw6aAQcPQo3ZfPl/aNHHGNlHyVekpDEA3Ceg35V9Kn39itn3gHola7WyM34IZRj/kNF/ss88uSZ9zn9TzsuiTC+z8rKclMtlvij5Ohiz/hGtNv+yyGaLcb4o5pOszKZ/nX8+KYtFWaTpWZ5e5Onkb/NfTKbzxTchkou0fhz/iD+9fDvVahyTz7rs22eK35ye8EJG37UA9b6Ibbt5Twn8arrjLXReS32FIfQF1XpfVG3S+9UmPfGOq00ZaawHYyHj07fPaC/EIjlCRn9kAWhNujCH5o8E/l3Gf01uoQ9jF8fyhT6ir9dnaCc18R14a38YccWT4WMfl418x8W+Gs9m07PxPMmL5eJymWc/2ldfATd8RiZqNAAA", + "debug_symbols": "zZzNSiNREEbfpddZ3K9u3z9fZRgkaiuBkEiMA4P47tMtiRPsNkNthrORtNYhJRVOOlrffesehrvXp9vN7nH/0t38eOu2+/v1cbPfjVdv76vu7rDZbjdPt5ff7sL0Remj/uV5vZsuX47rw7G7SXXVDbuH8UEb6cfNdhgfhvefq07ZWV+c9dVZ33z1Fpz1ctabsz4663tnvXO+5pyvOedrzvmac77ROd/onG90zjc65xud842L85XKCZDqVyK7ieImqptoXqIPbkJuwtzE4ryV+jOR0yWxmpXWplNps/hZauYpnfroIX0kSB8Z0keB9FEhfTRGHylA+hCkD4P0AfFpgvg0QXyaID5NEJ8miE8TxKcZ4tMM8WmG+DRDfJohPs0Qn2aITzPEpxni0wzxaYH4tEB8WiA+LRCfFohPC8SnBeLTAvFpgfi0QHxaIT6tEJ9WiE8rxKcV4tMK8WmF+LRCfFohPq0QnzaITxvEpw3i0wbxaYP4tEF82iA+bRCfNohPG8SnChChKkCMqgBRqgLEqQoQqSpArKoA0aoCxKsKELEqUMwqillFMasoZhXFrKKYVRSzimJWUcwqillFMatRzGoUsxrFrEYxq1HMahSzGsWsRjGrUcxqFLNGilkjxayRYtZIMWukmDVSzBopZo0Us0aKWSPFrD3FrD3FrD3FrJQslShhKlHSVKLEqUTJU4kSqBIlUSVKpEqUTJUooSpRUlWixKpEyVWJEqwSJVklSrRKlGyVKOEqUdJVosSrRMlXiRKwEiVhJUrESpSMlSghK1FSVlqOSZR2Imq4bGMCqvuEEH2z4n4V6f1I8iPZjxQ/Uv2I+3AYfbOPHO2MxDJD5EfMj0Q/sjz9/vw6Hv8+MUOSH8l+ZHn61j5/l/lcqh9pXsS+WZ68isiPmB+JfqT3I8mPZD9S/Ej1I/7pyz99+adPWZoyytKUUZamjLI0ZZSlKaMsTRllacooS1P2P5emSn++ZSoXt7LnRkRpxCiNLJv18+PAeJP99V1heZlnfEs6IePrboYUP1L9SHMjy0sn1xH5EfMji3MZb0jOiIUZ0vuR5Efyv5AyQ4ofqX6kuZHlf4xfR8yHvI9Xv9aHzfpuO5xOKn583d1fHFx8/P08fDnD+Pmwvx8eXg/DdJrx34OMp24th5VVTR8aPi77tLIUpsvpZWnVxp/247OOz/wH", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 5a5059b2379..ec72986586f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -85,10 +85,6 @@ expression: artifact "error_kind": "string", "string": "attempt to multiply with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -99,8 +95,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ldrRTuMwEIXhd8l1L+LxzNjmVVYIFSioUlVQgZVWiHffZkW6VT2k+m8QRnxS4hPb8cSfw+Pm/uP5brt/enkbbn59DruXh/X79mV/bH1+rYb7w3a32z7fnf95GKcfRf/9/9vrej81397Xh/fhJrmshs3+cfqtHP3TdrcZbmz8ul0NxbBwLAoWFYtGRR2xSFhIKKz+LDIWioVh4VdESZeiYFGxaFS0OHMrs6idCDOXPH4LyZd91QSLMHNJchL1UigWhoVjUbCoWDQq0jhyEqde5ydLauuIcJI5UU7C5LPoN8liHXFOCieVk4ZJGjlJnAgnmRPlhKefePqJp594+omnLzx94ekLT194+sLTl7iT9US0Izm+ffOZlNyR+PbbPMHm1k2wOXOinBgnzknhJMxF05yLSulIw0RHTsL0dWwn0t2LCidhLmpzj6lLR5yTwknlpGFicS7qJ9INMUucCCfhqFSfX4+1eEeUE+PEr9xLQAonlZOGiQuekz2eLf1ESveMuXJinDgnhZPKScOkxK8Knn5e+EriRDjJeEWO60DLxDBpCT/8TTjJnCgnxgmflBqflBqflBqelGQcOUmcCCeZE+UkTN9sHpVm1hHnpHBSr5Du7ULiPfIiiffIyyRxIpxkTpQT48Q5idMv82NpdexI5aRhEu+Rz0npSOJEOMmcKCdx+m1+VbBu+ybinBROKicNkzxykjgRTsL0Pdk38dQ6opwYJ36FSLe+xCWCZVI5aZjEJQLX+WOFq3YkcSKc5Guky0WVE+PEOYnTt7lC4t33NokLEcukYRIXIs5It0uSuBCxTMJOLjKvlaWrW0q8318mhZPKScPER04SJ8JJPF5qnqPs18q4RLBMnJPCSeWkYRKXCJZJ4iTjKOP9ftH5s2CxblTG+/1l4tdIN/XFRz+WSeWkYRKf/lgmiRPhJHOinBgnPP0K0/86tn6vD9v1/W7zfdbp6WP/cHb06f3P6+biFNTr4eVh8/hx2Eznof4fhZrylWarnPx4KVOnWl15vZ2+Ih8bqdRVqnlqTrGmWo7NdryC41X8BQ==", + "bytecode": "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", + "debug_symbols": "ldrRSiMxFMbxd5nrXkxOTnISX2URqVqlUFqpdWER331nlqYrzXHK/0aM+IPMfJNkTiafw/Pm8eP1Ybt/ObwPd78+h93haX3aHvZT6/NrNTwet7vd9vXh+5+Hcf5h+u//39/W+7n5flofT8NdyLIaNvvn+Teb/Mt2txnu0vh1vxosYZGxMCwKFpWKMmIRsBBXpPKziFgoFgmLfENYuBaGRcGiUlH9zJM1UTrhZi5xPAuJ1/eqChZu5hLkIsq1UCwSFhkLw6JgUakI48iJn3ppT5aU2hHhJHKinLjJR9EziZI6kjkxTgonFZMwchI4EU4iJ8oJTz/w9ANPP/D0A09fePrC0xeevvD0hacv/k3WC9GORP/yU27EYkf8y69tgo21m2Bj5EQ5SZxkTowTNxcNLRcV60jFREdO3PR1rBfSXYsKJ24umtod0ywdyZwYJ4WTiknyc9F8Id0QS4ET4cQdlZrb67Fa7ohykjjJN67FIcZJ4aRikgXPydmfLfOFWPeMZeUkcZI5MU4KJxUT818Vcvh54bPAiXAS8Yrs7wMtk4RJDfjhr8JJ5EQ5SZzwScmvkFNq6afUjX2/RF4mlRLxa+RvpFvFxK+Rl4lwEjlRThInmRPjpHDip2/tsUxlvCZ+jbxMAidyi1hHIifKSeIkc+KnX9uSlLoyQfwaeZlUTPwaeZkEToSTyIly4qafQzqTHGpHMifGSblBJHekYhJHTgInbvpZ26Z4Vu1I5EQ5SbdIl4u/RbBMjJPCiZ9+apV47r7riL9FsEwCJ3KDdG/jopET9yabtLXSuv0x8ev9ZVIx8ev9ZRI4EU4iJ8qJP15KbFH2a6VfvC+TwknFJI+cBE6Ek8hJwlH69b5p+/xkqRuVfr2/TMot0k19fr2/SPx6f5kERr6m1u/1cbt+3G3OZzdePvZP345ynP68ba5OdbwdD0+b54/jZj7f8f9ox9xbmd4vpdrUlTnt6Tt3LvfzV7GpEaysQolzc+5kKDY169SDqRd/AQ==", "file_map": { "50": { "source": "fn main(\n x: [u32; 5],\n mut z: u32,\n t: u32,\n index: [Field; 5],\n index2: [Field; 5],\n offset: Field,\n sublen: Field,\n) {\n let idx = (z - 5 * t - 5) as Field;\n //dynamic array test\n dyn_array(x, idx, idx - 3);\n //regression for issue 1283\n let mut s = 0;\n let x3 = [246, 159, 32, 176, 8];\n for i in 0..5 {\n s += x3[index[i]];\n }\n assert(s != 0);\n\n if 3 < (sublen as u32) {\n assert(index[offset + 3] == index2[3]);\n }\n}\n\nfn dyn_array(mut x: [u32; 5], y: Field, z: Field) {\n assert(x[y] == 111);\n assert(x[z] == 101);\n x[z] = 0;\n assert(x[y] == 111);\n assert(x[1] == 0);\n if y as u32 < 10 {\n x[y] = x[y] - 2;\n } else {\n x[y] = 0;\n }\n assert(x[4] == 109);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_0.snap index b43cf6ad6bd..13dea0d347a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_0.snap @@ -85,10 +85,6 @@ expression: artifact "error_kind": "string", "string": "attempt to multiply with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -99,8 +95,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tZvbTuMwEIbfJde9sMdzsHmV1WpVoKBKVYtKWWmFePdtUF1Q7QaN0v8GEfD3Kclkcpix34fH1f3b85/19mn3Otz9eh82u4flYb3bHrfePxbD/X692ayf/3z/8xDGHxY/x7++LLfj5uthuT8Md1FpMay2j+NvduSf1pvVcCfh4/diMHITyU2wmxA3oW7C3ER2E8VL5NAlJF8nopsgN5HcBP9AWLwkxE2omzA30Y+5WCVyQ3RjTimcCEqX56oEN9GNOUU6E/k7sWiGMutpKJteygkpT0g5I+WClCtSbkh5RsoLUB5DgNoj1E5Qe4LaGWqfm6ci8TRURBq7Qu0Gtefb2ZUae0HaY4DaI9ROUHuC2hlqF6hdofbZuWr1LiY5NPYMtRekncIN7dbYI9ROUHuC2hlqn52rhau95MauULtB7RlqL0h7ClB7hNoJak9Q+9xc1SinoRpLYxeoXaF2u52dmq+DlKH2grRzgNrn5qpyLVgpc2MnqD1B7XxDe3O9s0DtCrUb1D47V6VUe1OgjlyQdglQe7yd3ZovGyGofe4VaVS/yoyaGocY1J6h9oK0a4DaI9ROUHuC2mff33Oq2dR+lalC7Qa1Z6i9IO0WoPYItRPUzshssrnZZFybvSbNs8kUarcb2pu3JctQe0Hac4DaI9ROUHuC2hlqF6hdoXZormZorl6ZgZIrQrlBrkxBmUSiHyE/0r3+E9XSWmofEf1ZINOI+BH1I+ZHsh8pXoT6EyGmkehHyI8kP8J+RPyI+hHzI9mP+KMf/dGP/uhHf/T7/dvEZ4RbpH/4UvtaydIl0u9WplLvxakp3lO/BTmNkB9JfoT9iPiRblw41rgwWYOYH8l+pBt9DuWMNMfS739NI924sNQzxs1cAep3e6YR8SPqR8yP9OPyNSVLmxTrt0UmkX6vYxrpZiVrnarbzhWjfldiGkl+hH84lg4ifkT9iLmRfl178p7cL1YnPSNNjZj6FehpJPkR9iPiR9SPmB/pvypovP7g65ebJ5F+DXkaie4ncr/aO40kH/Jx3Pq73K+X95vVaVXN09v24dsim8O/l9XFepuX/e5h9fi2X40rb74W3YznhDIvUpDjrow7InmheXwX//yX6oIsjpvjqSCT46Yd9+C4F/8B", + "bytecode": "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", + "debug_symbols": "tZrRTuswDIbfpde9iB3bSXiVo6OjAQNNmgYa40hHiHc/K1oGWkKR1f03iEC+T21dt42dt+F+ffv6+Geze3h6GW5+vQ3bp7vVYfO0O47e3sfhdr/ZbjePf77+eQjTj0Qf81+eV7tp+HJY7Q/DDRmPw3p3P/2WjvzDZrsebjS8/x6HxG4iuglxE+omzE0kN5HdRPESOXQJzd8T5CbYTUQ3IT8QiS4JdRPmJpKb6MdcUyVyQ3RjzjGcCI6X16oEN9GNOROfifyVGJupInaaKsku5YyUR6RckHJFyg0pTwvlqnSaqqqX8oyUF6CcQrie3bixE9TOUHuE2gVqV6jdoPYEtWeofXGupvoI0xwu7RSgdoLa+Yr21Ngj1C5Qu0LtBrUvztUi1V5yY89Qe0HaOUDtBLUz1B6hdoHaFWpfmqtGeppqVBp7gtoz1F6uZ+fLpQHFALUT1M5Q+9JcNakLeBNp7AK1K9RuV7Q393tMUHuG2gvSLotzVUu1NwU7EoLaGWqP17OnZmUjArUvvSMT11VZ4qbGIQVp1wC1E9TOUHuE2gVqV6h98fM9x5pN7apMM9RekHYLUDtB7Qy1R6hdoHZDZpMtzaYktfmVtHk3WYbayxXtzddSClA7Qe0MtfezKVeEc4uIH1E/Yn6ke/9HrqWG2KZMv40/jxQ30m/kzyPkR9iPRD8ifkT9iPkRf/SzP/rZH/3ij37xR7/4o1/80S/+6Bd/9Is7+tzv30Y5I9Ii/dPXWuePKTZI//RLfRbHppjJ/RbkPGJ+JPmR7EeKG+n36oRqXIRTg5AfYT/Sjb6EckbacxE/0o2LaL1i0vROud/tmUeKG+n3ZeYR8iP9uHzuT7EmxfptkXlE/Eg3K8XqVq524wz3uxLzSPIj+Ydz6SDFjfQr/fMI+RFxP5P7xepoZ6SpmXG/Aj2PJD+S/UhxI/2q7jxCfqT/qWD0/YuvX1SdR8SPqPuNLOZHkg95P47+rvab1e12fdp1/fC6u/uyCfvw73l9sR/7ef90t75/3a+nndmfm7Kn+LLpyNmOhzJdVM2j5emj5+NfGkZWnYb0MSwjGx2P4HgU/wE=", "file_map": { "50": { "source": "fn main(\n x: [u32; 5],\n mut z: u32,\n t: u32,\n index: [Field; 5],\n index2: [Field; 5],\n offset: Field,\n sublen: Field,\n) {\n let idx = (z - 5 * t - 5) as Field;\n //dynamic array test\n dyn_array(x, idx, idx - 3);\n //regression for issue 1283\n let mut s = 0;\n let x3 = [246, 159, 32, 176, 8];\n for i in 0..5 {\n s += x3[index[i]];\n }\n assert(s != 0);\n\n if 3 < (sublen as u32) {\n assert(index[offset + 3] == index2[3]);\n }\n}\n\nfn dyn_array(mut x: [u32; 5], y: Field, z: Field) {\n assert(x[y] == 111);\n assert(x[z] == 101);\n x[z] = 0;\n assert(x[y] == 111);\n assert(x[1] == 0);\n if y as u32 < 10 {\n x[y] = x[y] - 2;\n } else {\n x[y] = 0;\n }\n assert(x[4] == 109);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index b43cf6ad6bd..13dea0d347a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -85,10 +85,6 @@ expression: artifact "error_kind": "string", "string": "attempt to multiply with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -99,8 +95,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tZvbTuMwEIbfJde9sMdzsHmV1WpVoKBKVYtKWWmFePdtUF1Q7QaN0v8GEfD3Kclkcpix34fH1f3b85/19mn3Otz9eh82u4flYb3bHrfePxbD/X692ayf/3z/8xDGHxY/x7++LLfj5uthuT8Md1FpMay2j+NvduSf1pvVcCfh4/diMHITyU2wmxA3oW7C3ER2E8VL5NAlJF8nopsgN5HcBP9AWLwkxE2omzA30Y+5WCVyQ3RjTimcCEqX56oEN9GNOUU6E/k7sWiGMutpKJteygkpT0g5I+WClCtSbkh5RsoLUB5DgNoj1E5Qe4LaGWqfm6ci8TRURBq7Qu0Gtefb2ZUae0HaY4DaI9ROUHuC2hlqF6hdofbZuWr1LiY5NPYMtRekncIN7dbYI9ROUHuC2hlqn52rhau95MauULtB7RlqL0h7ClB7hNoJak9Q+9xc1SinoRpLYxeoXaF2u52dmq+DlKH2grRzgNrn5qpyLVgpc2MnqD1B7XxDe3O9s0DtCrUb1D47V6VUe1OgjlyQdglQe7yd3ZovGyGofe4VaVS/yoyaGocY1J6h9oK0a4DaI9ROUHuC2mff33Oq2dR+lalC7Qa1Z6i9IO0WoPYItRPUzshssrnZZFybvSbNs8kUarcb2pu3JctQe0Hac4DaI9ROUHuC2hlqF6hdoXZormZorl6ZgZIrQrlBrkxBmUSiHyE/0r3+E9XSWmofEf1ZINOI+BH1I+ZHsh8pXoT6EyGmkehHyI8kP8J+RPyI+hHzI9mP+KMf/dGP/uhHf/T7/dvEZ4RbpH/4UvtaydIl0u9WplLvxakp3lO/BTmNkB9JfoT9iPiRblw41rgwWYOYH8l+pBt9DuWMNMfS739NI924sNQzxs1cAep3e6YR8SPqR8yP9OPyNSVLmxTrt0UmkX6vYxrpZiVrnarbzhWjfldiGkl+hH84lg4ifkT9iLmRfl178p7cL1YnPSNNjZj6FehpJPkR9iPiR9SPmB/pvypovP7g65ebJ5F+DXkaie4ncr/aO40kH/Jx3Pq73K+X95vVaVXN09v24dsim8O/l9XFepuX/e5h9fi2X40rb74W3YznhDIvUpDjrow7InmheXwX//yX6oIsjpvjqSCT46Yd9+C4F/8B", + "bytecode": "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", + "debug_symbols": "tZrRTuswDIbfpde9iB3bSXiVo6OjAQNNmgYa40hHiHc/K1oGWkKR1f03iEC+T21dt42dt+F+ffv6+Geze3h6GW5+vQ3bp7vVYfO0O47e3sfhdr/ZbjePf77+eQjTj0Qf81+eV7tp+HJY7Q/DDRmPw3p3P/2WjvzDZrsebjS8/x6HxG4iuglxE+omzE0kN5HdRPESOXQJzd8T5CbYTUQ3IT8QiS4JdRPmJpKb6MdcUyVyQ3RjzjGcCI6X16oEN9GNOROfifyVGJupInaaKsku5YyUR6RckHJFyg0pTwvlqnSaqqqX8oyUF6CcQrie3bixE9TOUHuE2gVqV6jdoPYEtWeofXGupvoI0xwu7RSgdoLa+Yr21Ngj1C5Qu0LtBrUvztUi1V5yY89Qe0HaOUDtBLUz1B6hdoHaFWpfmqtGeppqVBp7gtoz1F6uZ+fLpQHFALUT1M5Q+9JcNakLeBNp7AK1K9RuV7Q393tMUHuG2gvSLotzVUu1NwU7EoLaGWqP17OnZmUjArUvvSMT11VZ4qbGIQVp1wC1E9TOUHuE2gVqV6h98fM9x5pN7apMM9RekHYLUDtB7Qy1R6hdoHZDZpMtzaYktfmVtHk3WYbayxXtzddSClA7Qe0MtfezKVeEc4uIH1E/Yn6ke/9HrqWG2KZMv40/jxQ30m/kzyPkR9iPRD8ifkT9iPkRf/SzP/rZH/3ij37xR7/4o1/80S/+6Bd/9Is7+tzv30Y5I9Ii/dPXWuePKTZI//RLfRbHppjJ/RbkPGJ+JPmR7EeKG+n36oRqXIRTg5AfYT/Sjb6EckbacxE/0o2LaL1i0vROud/tmUeKG+n3ZeYR8iP9uHzuT7EmxfptkXlE/Eg3K8XqVq524wz3uxLzSPIj+Ydz6SDFjfQr/fMI+RFxP5P7xepoZ6SpmXG/Aj2PJD+S/UhxI/2q7jxCfqT/qWD0/YuvX1SdR8SPqPuNLOZHkg95P47+rvab1e12fdp1/fC6u/uyCfvw73l9sR/7ef90t75/3a+nndmfm7Kn+LLpyNmOhzJdVM2j5emj5+NfGkZWnYb0MSwjGx2P4HgU/wE=", "file_map": { "50": { "source": "fn main(\n x: [u32; 5],\n mut z: u32,\n t: u32,\n index: [Field; 5],\n index2: [Field; 5],\n offset: Field,\n sublen: Field,\n) {\n let idx = (z - 5 * t - 5) as Field;\n //dynamic array test\n dyn_array(x, idx, idx - 3);\n //regression for issue 1283\n let mut s = 0;\n let x3 = [246, 159, 32, 176, 8];\n for i in 0..5 {\n s += x3[index[i]];\n }\n assert(s != 0);\n\n if 3 < (sublen as u32) {\n assert(index[offset + 3] == index2[3]);\n }\n}\n\nfn dyn_array(mut x: [u32; 5], y: Field, z: Field) {\n assert(x[y] == 111);\n assert(x[z] == 101);\n x[z] = 0;\n assert(x[y] == 111);\n assert(x[1] == 0);\n if y as u32 < 10 {\n x[y] = x[y] - 2;\n } else {\n x[y] = 0;\n }\n assert(x[4] == 109);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index cde36959757..01ffb59d3ea 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -76,8 +76,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndnRauMwEIXhd/G1L6QZaSTlVZalpK1bAiEpabqwlLz72iVOQiSy/L4pqOGrLB97omq+u9fh+ev9abN72392q1/f3Xb/sj5u9rtx9H3qu+fDZrvdvD/d/rpz0w9fwg/4/FjvpvHncX04dqsU+m7YvXYr7/3o3zbboVtFd/rdjyJiYVgkLDIWBQpxDguPhVDh8Ryez6FYBCwiFoZFwiJjgZ8rwc+V4MwFZy44c8GZSzNzdXIm6rQixkniJHNSMFHHiedEOFFOAic8feXpK09fefrK0w/N5YvlMxErFWlemCV3JpZdRdrlSOe3MoVqlug48ZwIJ8pJ4CRyYpwkTjInPH3jFcZ4hTFeYYxXGOMVxniFMV5hjFcY4xUm8e+XxNNP7fTVz0RTRZSTdvqmM0lSkchJO327LD/liiRMcnMtocQzCaVafm7OEqOdSUxVLrn9ZSHz8i1Wy88Fk+I48ZwIJ8pJ4CRyYpwkTnj6BaevznHiORFOlJPASeTE6BZOXeIEbxS1fY7wqChp+yAhXpYfJVdEOQmcRE6Mk3ZN1rnyx1Cl3z5OeEwKJu0DhcfEcyKctNP3FyKlIoGTyIlxkjjJnBRM2qcK0dJlq1Dl0j5VeEyEE+WknX6eN4qx+IpEToyTxEnmpGASHCft9NNlb1mqXIJwopwETiInxgnejWv76OYxKZi0j24eE8+JcKKcBE4iJoaPodSUk8BJ8xkbW2Pzmzz2vG5e5R/T/od/bHXNN2DsL9m9kQXzNO/A2CC7zuP13oQFJi4w1jY+Xe9BvDdpgckLTPn/em7z6etcxF36KWM76+7v5wX5Z7/ACDSncfBnfdisn7fDuSn99rV7uelRH/9+DHft6o/D/mV4/ToMU+P62rOe1qjF98HLdC3jyKfU+5zGkZ8+nG6RuDINp7Vpjr2On55O43X8Aw==", + "bytecode": "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", + "debug_symbols": "ndnfSiMxFMfxd5nrXiQ5OfnTV1kWqTpKobRS68IifffNuJ22NLHyzY0Q5WOS+c1kMiefw/P4+PH6sN6+7N6H5a/PYbN7Wh3Wu21pfR4Xw+N+vdmsXx+ufz2Y6YfN/gu8v622U/v9sNofhmX0i2HcPg9La23xL+vNOCzVHH8vilAsAhYRi4RFhsIZg4XFwlFhcR+W9yFYeCwUi4BF874S405EjFQkcZIxcYYTy4njRDjxnCgngROevuPpO56+8PSFpy/N6buQTsSFfEt8c2AhmhMJyVSkvRzJ/FRGX/fiOBFOPCfKSeAkcpI4yZio4YSnr3yFUb7CKF9hlK8wylcY5SuM8hUm8BUm8BUm8PdL4OmHdvpiZyKxIspJO/0gM4muIpGTdvrhPP2YKpIxic25+Kwn4nM1/djsRTWciMYql9R+Wbh5+kGr6SfLieNEOPGcKCeBk8hJ4iRjkvlWIVtOHCeKb/72B6uep6+uesTaX6z3SeIkUyLtj9b7pJmLyrzCqHcVcZwIJ54T5SRw0k7fnonLFUmcZEys4cRy4jgRTtrph3h+JVW5tGsK90ngJHLSTj/NGxLNtiIZk3ZV4T6xnDhOhBPPSTv9eN7D5CqXdlXhPomcJE4yJu2qwn1i6a5PxHEinHhOlJPASeQkcYJ348IrJMIrJMIrJNKukJSS//wkl1r+1aP838QOkzpM5qZdJfnB2A7jOox0mI589JvrlucbtJxrhBsTOq5Bu8BQDmYu/Vi5NdJhfIfRtrHxcg301oQOEztM+nk+1/ks6lycOZ+rlGOU2//fkX80HcZCcyyNP6v9evW4GU+HoS8f26ers9HD37fx5pj0bb97Gp8/9uN0YHo5K53GK0kW3vhpLKVlY1zYFEvra589XSJn8tScxinlrxJzGUMZxz8=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap index 7c3dc8884f1..e4de27a223c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap @@ -76,8 +76,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zdvfquIwEAbwd+m1F5mZZJL4Ksty8Gg9FETFPwuL+O6bilVpl7Ls8Hl6cyCH+GOw/WwmbS/Vqv48f3002/XuWM1/XKrNbrk4NbttGV2us+rz0Gw2zdfH678r1/6h7G4fOO4X23Z8PC0Op2oe/ayqt6tqTkTl8+tmU1fz4K6zf575c1ZsAtoMtAVoe6AdgLYC7Qi0E9DOMJudA9oEtBloC9A25lIc36eKkwEekLgi8YjEExLPQJwcEickzkhckDgyoYRMKCETSsiEEjKhbMRZ030qa+7jYgyRRnefqskNcOtFTrqp0ef/nHqrQyZSh59IHfFtdZRFK3VsTi/urRDv3lhI1i4GjrVfCIEKueGMxAWJh6mcKPq2QkpL8TxRSPqFxKkUkqZSSH5jIRSfGQ69QoKbSiE0lUL4m86R15/Xv0S9dJFdCWVd1i9aJnJNCH4qhYSpFIJc5gZkI6rIRlSRjagiG1FFNqKKbEQV2YgqshFVZCOqyISqNaHSrfBEYh+PDolbE6rS4ZEHOCNxa0L1cUBjGuAeiCfjd+5zuE/1eXBAk7HyELrLXIiD8zwZf1uUuwOqYXBAkyLxiMQTEs9A3HrzdhwnJM5IXJC4R+LIhGZkQjMyoRmZ0AxMqDiHxAmJMxK3JnRkd16cR+IBiSfc0kKsN0TD44AG7i+KxHpDdBwnJM5IXJC4da0o3So3+EFCrTdEx3FF4hGJJySegThbE0oPnPMAJyTOSFyQuEfiAYkrErcmVOOjyR2e5wmJZyAuDolbE5q6baiQaYAzEhck7pF4QOKKxCMStyY0Pva48vA8z0Dc+ljHOE5InJG4IHFrQkd2RMX6HMg4rkg8IvGExDMQtz4rMY4TEmcUfi2jX4tDs/jc1PcXgtbn7fLl/aDT733de1Vof9gt69X5ULcvDT3fF2q/XilbGJKpLbqMKMYZpVhGtz0ACWEm6tph+22J+jLUUkOp4w8=", + "bytecode": "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", + "debug_symbols": "zdvfqhoxEAbwd9lrL5JMZibxVUo5eHQ9CKLin0IR37271lUxZSkdPpubA3uIPz5MZmOS3XOzaD9PXx+rzXJ7aKbfzs16O58dV9tNd3W+TJrP/Wq9Xn19PP+7cf0fn931A4fdbNNfH46z/bGZapw07WbRTL333eeXq3XbTNldJn/d8vuksz3QDkCbgHYE2gy0xWaTC7em5KjAFYknJJ5xeHAOiXskHpA4IfGIxBmJCxJXJJ6QOLJCPbJCgxEPkm5Ng+QCNxaRqLs1leQK3DrJ0dBUY/7HptccXEkOqSSHvi1HN6f7gc3pyf0dJNUSJFcShFwtQXwtQUItQaiWILGWILXcR+I7qybLMJ26IK9BUFVzxQMSJyTOtQyU983A3bLtMVA8vQbRWoKkWoLkNwbx+qhhfgnCrpYgvpYg4T+Nkefb6x9KvVulDxGC19fQVMmcwLGWIFxLEORCn5ELfUEu9AW5FSfIrThBbsVJROLIrThBbsUJcitOkBUq1gql4Rcekb7i6pC4tUKFBlxDgQckbq1QuXeopgKPQDwZv/OY+dY05qJDkzE58zDNsRbjPBnvLRKGDhUuOjQJElcknpB4BuLWQ/Jx3CPxgMQJiUckbq3QsdMP61H5OK44nKwHzmO3XLIeOPO9QzmkAg9InJB4ROKMxI3jnGmY/TmGAlcknpB4BuLWA+dx3CNxa4X6Ox5ygRMSj0ickbggcUXiCYlbK1T0/uO/GOfWpzbGcY/EAxK3VmgaluecfYFHJM5IXJC4IvGExDMQtz5qwXpf++dinFsfnxjHAxInJB6ROCNxa4WO7BSR9UGKcTwh8QzErY91jOMeiQckTkg8ovBLd/Vjtl/NPtft7YWU5Wkzf3o/5fhz1768qrLbb+ft4rRv+5dWHu+r9AOj3zWmRH3o7sqrTnzS7uq6NqKoE+LQX/b9TF0q4tRl6HL8Ag==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 7c3dc8884f1..e4de27a223c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -76,8 +76,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zdvfquIwEAbwd+m1F5mZZJL4Ksty8Gg9FETFPwuL+O6bilVpl7Ls8Hl6cyCH+GOw/WwmbS/Vqv48f3002/XuWM1/XKrNbrk4NbttGV2us+rz0Gw2zdfH678r1/6h7G4fOO4X23Z8PC0Op2oe/ayqt6tqTkTl8+tmU1fz4K6zf575c1ZsAtoMtAVoe6AdgLYC7Qi0E9DOMJudA9oEtBloC9A25lIc36eKkwEekLgi8YjEExLPQJwcEickzkhckDgyoYRMKCETSsiEEjKhbMRZ030qa+7jYgyRRnefqskNcOtFTrqp0ef/nHqrQyZSh59IHfFtdZRFK3VsTi/urRDv3lhI1i4GjrVfCIEKueGMxAWJh6mcKPq2QkpL8TxRSPqFxKkUkqZSSH5jIRSfGQ69QoKbSiE0lUL4m86R15/Xv0S9dJFdCWVd1i9aJnJNCH4qhYSpFIJc5gZkI6rIRlSRjagiG1FFNqKKbEQV2YgqshFVZCOqyISqNaHSrfBEYh+PDolbE6rS4ZEHOCNxa0L1cUBjGuAeiCfjd+5zuE/1eXBAk7HyELrLXIiD8zwZf1uUuwOqYXBAkyLxiMQTEs9A3HrzdhwnJM5IXJC4R+LIhGZkQjMyoRmZ0AxMqDiHxAmJMxK3JnRkd16cR+IBiSfc0kKsN0TD44AG7i+KxHpDdBwnJM5IXJC4da0o3So3+EFCrTdEx3FF4hGJJySegThbE0oPnPMAJyTOSFyQuEfiAYkrErcmVOOjyR2e5wmJZyAuDolbE5q6baiQaYAzEhck7pF4QOKKxCMStyY0Pva48vA8z0Dc+ljHOE5InJG4IHFrQkd2RMX6HMg4rkg8IvGExDMQtz4rMY4TEmcUfi2jX4tDs/jc1PcXgtbn7fLl/aDT733de1Vof9gt69X5ULcvDT3fF2q/XilbGJKpLbqMKMYZpVhGtz0ACWEm6tph+22J+jLUUkOp4w8=", + "bytecode": "H4sIAAAAAAAA/+2dV3QbxxWGFwRAEiwiKFKUnDiJ7PTESQASEOFUuqg3qneJIEiq994h9957L3KvsuUqyf01T3nNOXnOQ87Jg/1uXGkv8fNiLgyZWPlcH+85OFvmm7n/zM7Ozk5DyDu35Qu/kH8cEXu6PtEbuTHb4+8To9uSVQwrEZTGkAGNNQY0hg1ojBjQGDWgsdaAxjoDGusNaIwZ0NhgQGOjAY1NBjQ2G9A4xoDGFgMa4wY0thrQONaAxjYDGtsNaBxnQGOHAY3jDWicYEDjRQY0/siAxh8b0HixAY0/MaDxpwY0/qyKGrENLii9Ew2k6SUGNF5qQOPPDWj8hQGNvzSg8VcGNP7agMbfGND4WwMaf2dA4+8NaLzMgMY/GND4RwMa/2RAY8KAxqQBjZ0GNHYZ0JgyoDFtQOMkAxq7DWjMGNB4uQGNfzag8S8GNP7VgMa/GdD4dwMa/2FAY48BjVcY0HilAY1XGdB4tQGNkw1onGJA41QDGqcZ0DjdgMYZBjTONKBxlgGNsw1onGNA41wDGnsNaJxnQON8AxoXGNC40IDGRQY0LjagcYkBjUsNaFxmQONyAxpXGNC40oDGVQY0rjagcU0AGoPQ2VdFnRdi/njWwL3vN6AxZ0DjgAGNgwY0DhnQuNaAxnUGNK43oHGDAY0bDWjcZEDjZgMatxjQuNWAxm0GNG43oHGHAY07DWjcZUDjbgMa9xjQuNeAxn0GNO43oPGAAY0HDWg8ZEDjYQMajxjQeNSAxnwAGs9ux+CYRNcUfrQ4IS3+R4vr0eJ1tDgcLb5Gi5vR4mG0OBctfkWLS9HiTbQ4Urzwo8V9aPEcWpyGFn+hxVVo8RJaHIQW36DFLWjxCFqcgRY/oMUFaPI+TY6fWPhdUvhdWvjRhGSa8EsTamnCKk0IpQmXNKGRJgzShDya8EYTymjCFk2IoljRhB6aMEMTUmjCB02ooAkLNCGABtzTgHYaME4DsmnAMw0opgG7PCD2isLvysKPBiTSgD8aUEcD1mhAGA24ogFNNGCIBuTQgBcaUEIDNmhARG/hRx361GFOHdLU4UsdqtRhSR2C1OFGHVrUYUQdMtThQR0K1GBPDeJ9hR814FIDKTVAUgMfNaBRAxU1AFEDCzVgUAMBfYDTBy59QNIHGn0A0QcGVeCpgkwVUKrgUQWKKihUAaAXLL3A6AVBBTAVcFSA0ANKD0De0zfOzHn/IOaf14B7FRe0TMaE3WqGn0nk0jFH/KqovyvmhxkNJPxMksOvDUZ/os4P5+p8MXyMC9sNC076CQEzGZjJCjMFmCkKMxWYqQozDZhpCjMdmOkKMwOYGQozE5iZCjMLmFkKMxuY2QozB5g5CjMXmLkK0wtMr8LMA2aewswHZr7CLABmgcIsBGahwiwCZpHCLAZmscIsAWaJwiwFZqnCLANmmcIsB2a5wqwAZoXCrARmpcKsAmaVwqwGZrXCrAFmjcL0AdOnMFlgsgrTD0y/wuSAySnMADADCjMIzKDCDAEzpDBrgVmrMOuAWacw64FZrzAbgNmgMBuB2agwm4DZpDCbgdmsMFuA2aIwW4HZqjDbgNmmMNuB2a4wO4DZoTA7gdmpMLuA2aUwu4HZrTB7gNmjMHuB2asw+4DZpzD7gdmvMAeAOaAwB4E5qDCHgDmkMIeBOawwR4A5ojBHgTmqMHlg8gpzDJhjCnMNMNcozLXAXKsw1wFzncJcD8z1CnMDMDcozI3A3KgwNwFzk8LcDMzNCnMLMLcozK3A3KowtwFzm8LcDsztCnMHMHcozJ3A3KkwdwFzl8LcDczdCnMPMPcozL3A3Ksw9wFzn8LcD8z9CvMAMA8ozIPAPKgwDwHzkMI8DMzDCvMIMI8ozKPAPKowjwHzmMI8DszjCvMEME8ozJPAPKkwTwHzlMI8DczTCvMMMM8ozLPAPKswx4E5DkwYmOeAeU4J53lgnleYF4B5QWFeBOZFhXkJmJcU5mVgXlaYV4B5RWFeBeZVhXkNmNcU5nVgXleYN4B5Q2HeBOZNhTkBzAmFeQuYtxTmbWDeVpiTwJxUmHeAeUdh3gXmXYV5D5j3FOZ9YN5XmA+A+UBhPgTmQ4U5BcwphTkNzGmFOQPMGYX5CJiPFOZjYD5WmE+A+URhPgXmU4X5DJjPFOZzYD5XmC+A+UIwMTj2wF+Pf54YxZZJpFLBtoV1Jpr9MKPFKA7HhW3XBWM7GRL2PK+Y5ujG9huE1urqOffnT2iP9cj04XbhZmbyRT0h4RbJl8aD3aLgxveX+iFOACfzFuvgexNEG3UmMSngfJf6DvNd6nuZ76RbJF8aj/PNd5i3osKN04u24354fN8iAaRTJpFN/1AW2sqTEeEWyZfG43zzJOatKHCn4fiMfxzsuzmXDrIMpq3NoR9t0VaX94Y3zi9huMbpyulcj7xwi4FbJD/SToN/HgE7GBbriAr+lH/e4u9rwQ/7jzvs1wr7I3Q7rsl0iTn4mIOnvHbSP270f5SHVvgBcb6rLXr1QsoebeE1thX3SssvrC+EhL/R2pH5nraYOGeuxz9PjHLjeNQ54sG264Wu6tiu/L3O9hu8IMv0YhlaL/TI9KkR6RMLJn0SIRE+6ok50ofvZYPDjcNq9M+jEBbyOJYCeTxm/3jtX/4+7ghT5t0GrzQ+eA2f9X/6x67noJpld7B5PdEZbF7pHNaP6e5VT//wGI/GYNJnOPymQMJPDadPM4RfxXI0KeuimFcpH/9b2B3jn+NziH7rwR35mlAxzP/411q80roGv7PK1ZG/7XsKdTYIDfiu5LpfsHXxREKW21znkTZrIT7yWccyPyqu/dff03k2VPSDYXpgs7ZM2kUcelztBph3/ueNtBkGnWGH35iIB/NfQZj/949bHP6jwj+7fenvg65Hj4VwPWGrETSHHZpZr+s7KALXagRf7p2PaeDK5/UVhFVTxnaTg68vYxt1NSm2I15pHnXFqdahKeyIm+vZl/XisCMeeA/53VFpfuf4tjj0cx6MizB6/PPEKDfW1+oV0zPssNkC6Yc8Hnte8Vnia/V+5F1lSotXmo54TZYpdQ49zQ5/IWXPduQ1acd1H2Q61Xju9xmXSXxPxwr/HvhrBzdZFjDTBteRx3zHfiOKvzBolm7stxJdYWDwepuiqw3suvxhHRHdahQtzPM9HyPs0kbP1UUin3E+xvfIGEe4UcFfFiqGebF/3OLwX0leDPY5rrydju03eKV5PYhvzLjQg2lHm/zGbA1ET/Eb05XfXWVOq1d8XvCeoT4Oa6K/d7WjcNiufBMSx8w2eu582izshBx2Ql5pGrvKKfmOQjf2i/V51h8vY7PdYRP1twl+HNhx8RxeVPBJeKcMiOdyHPiX7+3xDn3j4Jqsr0xw8OOBYa1suwPcJihxxTIIy7YmJa4ZiOta/9jVpj3cVunvI+BWzbYs0rEBdMg0jOZHxrvaac5pFvdK07lDhFWu7JHvIgxby4/4HkH+Kkd+LPdMYBkiy4MOh4ZWR/yjgp9aRkMH+Kkk7zE/w5H3yt3XcnX/Su9rJc9SuyM+8TLxYb63wmeJ8+d38SxhfqnkWUL+fNOc06zcs+SqE7cLO9/0nMl3jeuZwnpbkOnenTn3zXNWqx8+5yO5RcAd+T4/ANkGSfvIKHQOdWeTQ13ZoWw6OzCQymXlNwFt2D5QbfvZ7q5MrjOV6+5Pd2W7Jl1w+6l0tjuX7U4mL08lB1PJ9IW2n0tP6s8VRCQGk3Ta+U32XX2HWI7Qxv2P2D+JPIcXFfwWPwB6LraJsirqsEfc0TJcSNmfDcNxLZIfec3Vb4n9ucyz7YZ8qUZ2awQ3LONoa/LPMb0wLNYRFfwhPwC+J9gHy/7jDvv1wv4I3Y5rsj+30cE3Oni6P7tFuYFxr/a311mbIny8JrVx3qF8/TWVPOyqmZEAAA==", + "debug_symbols": "zdvfqhoxEAbwd9lrL5JMZibxVUo5eHQ9CKLin0IR37271lUxZSkdPpubA3uIPz5MZmOS3XOzaD9PXx+rzXJ7aKbfzs16O58dV9tNd3W+TJrP/Wq9Xn19PP+7cf0fn931A4fdbNNfH46z/bGZapw07WbRTL333eeXq3XbTNldJn/d8vuksz3QDkCbgHYE2gy0xWaTC7em5KjAFYknJJ5xeHAOiXskHpA4IfGIxBmJCxJXJJ6QOLJCPbJCgxEPkm5Ng+QCNxaRqLs1leQK3DrJ0dBUY/7HptccXEkOqSSHvi1HN6f7gc3pyf0dJNUSJFcShFwtQXwtQUItQaiWILGWILXcR+I7qybLMJ26IK9BUFVzxQMSJyTOtQyU983A3bLtMVA8vQbRWoKkWoLkNwbx+qhhfgnCrpYgvpYg4T+Nkefb6x9KvVulDxGC19fQVMmcwLGWIFxLEORCn5ELfUEu9AW5FSfIrThBbsVJROLIrThBbsUJcitOkBUq1gql4Rcekb7i6pC4tUKFBlxDgQckbq1QuXeopgKPQDwZv/OY+dY05qJDkzE58zDNsRbjPBnvLRKGDhUuOjQJElcknpB4BuLWQ/Jx3CPxgMQJiUckbq3QsdMP61H5OK44nKwHzmO3XLIeOPO9QzmkAg9InJB4ROKMxI3jnGmY/TmGAlcknpB4BuLWA+dx3CNxa4X6Ox5ygRMSj0ickbggcUXiCYlbK1T0/uO/GOfWpzbGcY/EAxK3VmgaluecfYFHJM5IXJC4IvGExDMQtz5qwXpf++dinFsfnxjHAxInJB6ROCNxa4WO7BSR9UGKcTwh8QzErY91jOMeiQckTkg8ovBLd/Vjtl/NPtft7YWU5Wkzf3o/5fhz1768qrLbb+ft4rRv+5dWHu+r9AOj3zWmRH3o7sqrTnzS7uq6NqKoE+LQX/b9TF0q4tRl6HL8Ag==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 19a86f9eedc..6a26caec0a6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -39,10 +39,6 @@ expression: artifact "visibility": "public" }, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -53,8 +49,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VYzW7TQBBeJ3ZS2w0JLQ+AxA042HXSBHHhwIUDPYCExAEhJyEXJHgFPzo76U797WSSSNRbySuN1t4Zz3zzs7ObROZ+vLAUuefYzQM303pm/MGyH9xcPG6UHeoqQmGMeoBx0AOMwx5gjHuAMekBxlEPMI57gPGiBxjTABhD4Mw6xBkBRj4jc0uXliaWnlmaWppZem7pytK1uT9vH4TRUWrg1CCpAdEGpw1EBUoFkBr/IP4vg6YN6F83p27GA7/DJl2mwm6X+lfF4l1q/NEx/ioFnQH0r1l/HEZ/MXZ6Pja+fiPs8tpd08byDr4hSuG5+1zO54FjUU+E/wZ8YdtJoDxHwp4ReTDCfmaC1l0ZCXuMR8aH+8KEZZoWTyR4cXPoB/MS4HF+qa+9BDmttpDHWGhwbZKON6DvrfHxDRT/IsW/kPvc1vbuKWp772PT6pe5ixvfNvLO5ScVOkPFJ1C919dH8PMzjXFjHsZQxBNjxDG7QHnBS4EXN76dzL3HYAd1MY5EyL9271M3j+Ab/n6m2B8J+x5uZQ1jJHUNlTWWp/vKK/ecO6Ia+gy4Zdxl/w11Dsp+x7HXbLJP8jzAXpmItcrN5O9X4R/201M9dmaO90D5nVbLIfco7SEZw+QMLg2P6Q5PKXPw3rQ5+HYEQ4f2i1NnIt9L4yZILtbk43ena2KU+hSYRsAbKvKYI6KxIj8yvi80ZkIeYz01h/mX+z1Qvy+k37jftVodKD5izBKx9snN2n6X+0/W36n9jme25HG+chO2vpar9sct1zbvdTli4KP8F/eeAX6eH/MH225Zl7uq3tWLerudb+orod9ADPMA9utltdrczDfL9aKqq9snt79Z3K4380Vd/Crp9eacfe2ugP2KBt838D6C8qwvEfI/WNbST/cs75Noj+T+nJCLjsx7Hcpa3Phr2j0F728sz7az5hAj83LgYS+lceneMV6oi3EkQv63e+ec4J2Lv58p9i+EfQ+3sibP21yRzxV5ys+W9bkZfe/69+feptCPaxIb1w7V9T/tvRXNvRoAAA==", - "debug_symbols": "ldTNqsMgEAXgd5m1i/zp2LzK5VJMYoogJpikUELevVpaWko3ZxOc+ImDB2anwXbb5ezCOC3U/u3kp96sbgqp2g9BXXTeu8v58zcV+SPrh19mE3K5rCau1LIUZMOQFiqdHp231Mri+BckG9BL0CvQM+g16E+/vGpevvryqgB9CfoK9DXoG9BL0CvQM+g16MF8GcyXwXwZzJfBfBnK90jV1URnOm+fo2TcQv8xWdbbbL+GzByn3g5btHncvCdNfjh9EmVZpDZy13Ulmiqty7zDLPSjyO+la6Flujw1cAc=", + "bytecode": "H4sIAAAAAAAA/9VXwW7bMAyVEzuJ7WbN2n3AgN22HewlWbvDgGIbdhiGArsNaC9O2nyHPr2iS9ZPrNIArVXAAghZEs33RNJkkpj78c5Jws8pzyOeab8w/hDdC56rl426R1tVLI7JADiOBsBxPACO6QA4ZgPgOBkAx+kAOM4GwDGPwDEGz6JHnglwlB5ZOjlyMnfyxsmxk4WTt05OnJya+377oIwXpQJOBZIKEH3g9AFRglIC5MZvxM8CNJ1Dr3nOecaG32ORrnOF26f982r9LTf+6Jn/MgebEexvxH4ax341ZTu/rG/fKFzZu7SdLy/hHZIcnvuP5WoV2RfNXN3fwF0EO4sU50ThGRUHo/ALEzXv6kThCR/tH6kLc9GxHZ9EnaX28T3kLIMziS/VtfegF8otPBMuNCQ3ycYnsPfZ+PxGgfslgfvF/M5dbu9eI7fbO9rOvo5dan1sPDsUn1zZjOWfSPnenO7hL880ptY8jLHyJ/pIfDZDfXWWw1lqfZyC1yngoC3hkSn9j7w+5nkC78j7iwD+ROF7vAN76CNtaxzYE336vfKBn0sWyqHv8K72u45HzDyjPJDvX3I8O8ArxMf0x6f9I4d8ljyT337u4dAjfvVUXZffVqmNEosN3fE325orP7SxUZxCvQr1MUYkk4C+7u80Fkpf107dlwSzjOyjs/PuT4bEJzN+fzYKP1P6P3hdAH+8x8Uzee7Omnq3bHbNurm5WW2bE2XfgA/LCPjb9dfNdrVuqtuall8O4YdqJuY8Dam7WJdRX+xlSv+P6Dr5y8+6ryIe6V09oZfsmVsbgb3U+nuheo19TPQFu7CPOcpZCWf4PdI44jX6C20Jj0zp/+e1xAR7j7y/CODPFL7HO7Cna3YZ0C8D+hSff2KPZ7x737/DW0xlH/c0N8kdyus7HEOz0MUXAAA=", + "debug_symbols": "ldLdCoMgFAfwdznXXvShx+pVxggrC0EszAYjevfp2FjEbs6NePQniue/w6C7bWqNG+cVmtsOdu5VMLOL1X4w6Lyx1kzteRmyNHDx9uuiXCrXoHyARgoG2g1xgvH0aKyGRmTHnQFHopdEXxF9TfMiI/r8n0f+9cXVF0RfEj0nekH0SPSS6CuKP2L1UN6ozupPlMfN9adkh+eiLyFf/NzrYfM6xf2X9NR4mbE6j69In14WjBdxnqcNzBliKlK7UTKs493x/hc=", "file_map": { "50": { "source": "fn main(mut x: [Field; 10], index: u8) -> pub [Field; 10] {\n x[index] = 0;\n x\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_0.snap index 19a86f9eedc..6a26caec0a6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_0.snap @@ -39,10 +39,6 @@ expression: artifact "visibility": "public" }, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -53,8 +49,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VYzW7TQBBeJ3ZS2w0JLQ+AxA042HXSBHHhwIUDPYCExAEhJyEXJHgFPzo76U797WSSSNRbySuN1t4Zz3zzs7ObROZ+vLAUuefYzQM303pm/MGyH9xcPG6UHeoqQmGMeoBx0AOMwx5gjHuAMekBxlEPMI57gPGiBxjTABhD4Mw6xBkBRj4jc0uXliaWnlmaWppZem7pytK1uT9vH4TRUWrg1CCpAdEGpw1EBUoFkBr/IP4vg6YN6F83p27GA7/DJl2mwm6X+lfF4l1q/NEx/ioFnQH0r1l/HEZ/MXZ6Pja+fiPs8tpd08byDr4hSuG5+1zO54FjUU+E/wZ8YdtJoDxHwp4ReTDCfmaC1l0ZCXuMR8aH+8KEZZoWTyR4cXPoB/MS4HF+qa+9BDmttpDHWGhwbZKON6DvrfHxDRT/IsW/kPvc1vbuKWp772PT6pe5ixvfNvLO5ScVOkPFJ1C919dH8PMzjXFjHsZQxBNjxDG7QHnBS4EXN76dzL3HYAd1MY5EyL9271M3j+Ab/n6m2B8J+x5uZQ1jJHUNlTWWp/vKK/ecO6Ia+gy4Zdxl/w11Dsp+x7HXbLJP8jzAXpmItcrN5O9X4R/201M9dmaO90D5nVbLIfco7SEZw+QMLg2P6Q5PKXPw3rQ5+HYEQ4f2i1NnIt9L4yZILtbk43ena2KU+hSYRsAbKvKYI6KxIj8yvi80ZkIeYz01h/mX+z1Qvy+k37jftVodKD5izBKx9snN2n6X+0/W36n9jme25HG+chO2vpar9sct1zbvdTli4KP8F/eeAX6eH/MH225Zl7uq3tWLerudb+orod9ADPMA9utltdrczDfL9aKqq9snt79Z3K4380Vd/Crp9eacfe2ugP2KBt838D6C8qwvEfI/WNbST/cs75Noj+T+nJCLjsx7Hcpa3Phr2j0F728sz7az5hAj83LgYS+lceneMV6oi3EkQv63e+ec4J2Lv58p9i+EfQ+3sibP21yRzxV5ys+W9bkZfe/69+feptCPaxIb1w7V9T/tvRXNvRoAAA==", - "debug_symbols": "ldTNqsMgEAXgd5m1i/zp2LzK5VJMYoogJpikUELevVpaWko3ZxOc+ImDB2anwXbb5ezCOC3U/u3kp96sbgqp2g9BXXTeu8v58zcV+SPrh19mE3K5rCau1LIUZMOQFiqdHp231Mri+BckG9BL0CvQM+g16E+/vGpevvryqgB9CfoK9DXoG9BL0CvQM+g16MF8GcyXwXwZzJfBfBnK90jV1URnOm+fo2TcQv8xWdbbbL+GzByn3g5btHncvCdNfjh9EmVZpDZy13Ulmiqty7zDLPSjyO+la6Flujw1cAc=", + "bytecode": "H4sIAAAAAAAA/9VXwW7bMAyVEzuJ7WbN2n3AgN22HewlWbvDgGIbdhiGArsNaC9O2nyHPr2iS9ZPrNIArVXAAghZEs33RNJkkpj78c5Jws8pzyOeab8w/hDdC56rl426R1tVLI7JADiOBsBxPACO6QA4ZgPgOBkAx+kAOM4GwDGPwDEGz6JHnglwlB5ZOjlyMnfyxsmxk4WTt05OnJya+377oIwXpQJOBZIKEH3g9AFRglIC5MZvxM8CNJ1Dr3nOecaG32ORrnOF26f982r9LTf+6Jn/MgebEexvxH4ax341ZTu/rG/fKFzZu7SdLy/hHZIcnvuP5WoV2RfNXN3fwF0EO4sU50ThGRUHo/ALEzXv6kThCR/tH6kLc9GxHZ9EnaX28T3kLIMziS/VtfegF8otPBMuNCQ3ycYnsPfZ+PxGgfslgfvF/M5dbu9eI7fbO9rOvo5dan1sPDsUn1zZjOWfSPnenO7hL880ptY8jLHyJ/pIfDZDfXWWw1lqfZyC1yngoC3hkSn9j7w+5nkC78j7iwD+ROF7vAN76CNtaxzYE336vfKBn0sWyqHv8K72u45HzDyjPJDvX3I8O8ArxMf0x6f9I4d8ljyT337u4dAjfvVUXZffVqmNEosN3fE325orP7SxUZxCvQr1MUYkk4C+7u80Fkpf107dlwSzjOyjs/PuT4bEJzN+fzYKP1P6P3hdAH+8x8Uzee7Omnq3bHbNurm5WW2bE2XfgA/LCPjb9dfNdrVuqtuall8O4YdqJuY8Dam7WJdRX+xlSv+P6Dr5y8+6ryIe6V09oZfsmVsbgb3U+nuheo19TPQFu7CPOcpZCWf4PdI44jX6C20Jj0zp/+e1xAR7j7y/CODPFL7HO7Cna3YZ0C8D+hSff2KPZ7x737/DW0xlH/c0N8kdyus7HEOz0MUXAAA=", + "debug_symbols": "ldLdCoMgFAfwdznXXvShx+pVxggrC0EszAYjevfp2FjEbs6NePQniue/w6C7bWqNG+cVmtsOdu5VMLOL1X4w6Lyx1kzteRmyNHDx9uuiXCrXoHyARgoG2g1xgvH0aKyGRmTHnQFHopdEXxF9TfMiI/r8n0f+9cXVF0RfEj0nekH0SPSS6CuKP2L1UN6ozupPlMfN9adkh+eiLyFf/NzrYfM6xf2X9NR4mbE6j69In14WjBdxnqcNzBliKlK7UTKs493x/hc=", "file_map": { "50": { "source": "fn main(mut x: [Field; 10], index: u8) -> pub [Field; 10] {\n x[index] = 0;\n x\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 19a86f9eedc..6a26caec0a6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_main_output/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -39,10 +39,6 @@ expression: artifact "visibility": "public" }, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -53,8 +49,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VYzW7TQBBeJ3ZS2w0JLQ+AxA042HXSBHHhwIUDPYCExAEhJyEXJHgFPzo76U797WSSSNRbySuN1t4Zz3zzs7ObROZ+vLAUuefYzQM303pm/MGyH9xcPG6UHeoqQmGMeoBx0AOMwx5gjHuAMekBxlEPMI57gPGiBxjTABhD4Mw6xBkBRj4jc0uXliaWnlmaWppZem7pytK1uT9vH4TRUWrg1CCpAdEGpw1EBUoFkBr/IP4vg6YN6F83p27GA7/DJl2mwm6X+lfF4l1q/NEx/ioFnQH0r1l/HEZ/MXZ6Pja+fiPs8tpd08byDr4hSuG5+1zO54FjUU+E/wZ8YdtJoDxHwp4ReTDCfmaC1l0ZCXuMR8aH+8KEZZoWTyR4cXPoB/MS4HF+qa+9BDmttpDHWGhwbZKON6DvrfHxDRT/IsW/kPvc1vbuKWp772PT6pe5ixvfNvLO5ScVOkPFJ1C919dH8PMzjXFjHsZQxBNjxDG7QHnBS4EXN76dzL3HYAd1MY5EyL9271M3j+Ab/n6m2B8J+x5uZQ1jJHUNlTWWp/vKK/ecO6Ia+gy4Zdxl/w11Dsp+x7HXbLJP8jzAXpmItcrN5O9X4R/201M9dmaO90D5nVbLIfco7SEZw+QMLg2P6Q5PKXPw3rQ5+HYEQ4f2i1NnIt9L4yZILtbk43ena2KU+hSYRsAbKvKYI6KxIj8yvi80ZkIeYz01h/mX+z1Qvy+k37jftVodKD5izBKx9snN2n6X+0/W36n9jme25HG+chO2vpar9sct1zbvdTli4KP8F/eeAX6eH/MH225Zl7uq3tWLerudb+orod9ADPMA9utltdrczDfL9aKqq9snt79Z3K4380Vd/Crp9eacfe2ugP2KBt838D6C8qwvEfI/WNbST/cs75Noj+T+nJCLjsx7Hcpa3Phr2j0F728sz7az5hAj83LgYS+lceneMV6oi3EkQv63e+ec4J2Lv58p9i+EfQ+3sibP21yRzxV5ys+W9bkZfe/69+feptCPaxIb1w7V9T/tvRXNvRoAAA==", - "debug_symbols": "ldTNqsMgEAXgd5m1i/zp2LzK5VJMYoogJpikUELevVpaWko3ZxOc+ImDB2anwXbb5ezCOC3U/u3kp96sbgqp2g9BXXTeu8v58zcV+SPrh19mE3K5rCau1LIUZMOQFiqdHp231Mri+BckG9BL0CvQM+g16E+/vGpevvryqgB9CfoK9DXoG9BL0CvQM+g16MF8GcyXwXwZzJfBfBnK90jV1URnOm+fo2TcQv8xWdbbbL+GzByn3g5btHncvCdNfjh9EmVZpDZy13Ulmiqty7zDLPSjyO+la6Flujw1cAc=", + "bytecode": "H4sIAAAAAAAA/9VXwW7bMAyVEzuJ7WbN2n3AgN22HewlWbvDgGIbdhiGArsNaC9O2nyHPr2iS9ZPrNIArVXAAghZEs33RNJkkpj78c5Jws8pzyOeab8w/hDdC56rl426R1tVLI7JADiOBsBxPACO6QA4ZgPgOBkAx+kAOM4GwDGPwDEGz6JHnglwlB5ZOjlyMnfyxsmxk4WTt05OnJya+377oIwXpQJOBZIKEH3g9AFRglIC5MZvxM8CNJ1Dr3nOecaG32ORrnOF26f982r9LTf+6Jn/MgebEexvxH4ax341ZTu/rG/fKFzZu7SdLy/hHZIcnvuP5WoV2RfNXN3fwF0EO4sU50ThGRUHo/ALEzXv6kThCR/tH6kLc9GxHZ9EnaX28T3kLIMziS/VtfegF8otPBMuNCQ3ycYnsPfZ+PxGgfslgfvF/M5dbu9eI7fbO9rOvo5dan1sPDsUn1zZjOWfSPnenO7hL880ptY8jLHyJ/pIfDZDfXWWw1lqfZyC1yngoC3hkSn9j7w+5nkC78j7iwD+ROF7vAN76CNtaxzYE336vfKBn0sWyqHv8K72u45HzDyjPJDvX3I8O8ArxMf0x6f9I4d8ljyT337u4dAjfvVUXZffVqmNEosN3fE325orP7SxUZxCvQr1MUYkk4C+7u80Fkpf107dlwSzjOyjs/PuT4bEJzN+fzYKP1P6P3hdAH+8x8Uzee7Omnq3bHbNurm5WW2bE2XfgA/LCPjb9dfNdrVuqtuall8O4YdqJuY8Dam7WJdRX+xlSv+P6Dr5y8+6ryIe6V09oZfsmVsbgb3U+nuheo19TPQFu7CPOcpZCWf4PdI44jX6C20Jj0zp/+e1xAR7j7y/CODPFL7HO7Cna3YZ0C8D+hSff2KPZ7x737/DW0xlH/c0N8kdyus7HEOz0MUXAAA=", + "debug_symbols": "ldLdCoMgFAfwdznXXvShx+pVxggrC0EszAYjevfp2FjEbs6NePQniue/w6C7bWqNG+cVmtsOdu5VMLOL1X4w6Lyx1kzteRmyNHDx9uuiXCrXoHyARgoG2g1xgvH0aKyGRmTHnQFHopdEXxF9TfMiI/r8n0f+9cXVF0RfEj0nekH0SPSS6CuKP2L1UN6ozupPlMfN9adkh+eiLyFf/NzrYfM6xf2X9NR4mbE6j69In14WjBdxnqcNzBliKlK7UTKs493x/hc=", "file_map": { "50": { "source": "fn main(mut x: [Field; 10], index: u8) -> pub [Field; 10] {\n x[index] = 0;\n x\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index a00de3b2077..5200b38202a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -95,8 +95,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndjZiuJAFIDhd8l1LqrOqdVXGYbGJTYBUXEZGMR3n4pjWknSNH9uxBK+bH8Ki7pVm2Z1/fxo99vDuVr8ulW7w3p5aQ/7Mrrd62p1ane79vPj/efKdB9i3AOcj8t9Nz5flqdLtRDVumr2m+5bKgfYtrumWnhz/10X4jkJnEROEicZE2s4sdPEfpE8IsKJcuI4ma4fvm4/+BEJnEROEicZEzGcWE6EE+XEccLrC68vvL7w+pLxy6+GEz73lc995XNf+dxXz0ngZLp+7lOqsSOSOMmYOMOJ5UQ4UU4cJ56TwAmv7ybrOx+exEUdkYyJN5xYToQT5cRx4jmZrO+yexIvYxI5SZxkTILhxHIinCgnjhPPCa8feP3A6wdeP/L6kdePk/W95p74MCLKiePEcxI4iZwkTjImyXBiOeH1E6+feP3E6ydeP/H6iddPvH7G9VUiJ4kTfC86vea3OfbLcZvT2/Lqv4nTJvf//GIkDE3m5/lmdW3M6zxWh8bOMDLDTC+wjY2vZ+CHxs0wfoYJP9/Pe5963KXsAvZdys7L8Pgz+k+vyH8wGZp7GfxZntrlatc8Nzq31/36bd/z8vfYDLZAj6fDutlcT023GfraB+3ePS1PQcV311JGNtnaZltGjw0/yVJLjt3QPoapVmPKNZTr+Ac=", + "bytecode": "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", + "debug_symbols": "ndjdisIwEAXgd+l1LzIz+fVVlkWqVimUKlUXFvHdN3Wtum1kObkRI3w1yWnaZC7Fpl6dd8um2+6PxeLjUrT7dXVq9l1sXa5lseqbtm12y9efCzV8ULA3cDxU3dA+nqr+VCxYpCzqbjN88/EC26ati4VR188yEocTj5OAElYKJ4QTxomkCT1ImBGNE4MTi5N0+vYxfGtmxOMkwIQUTggnjBPBicaJwYnFCZ4+4ekTnj7j6TPBNz8zTvC1z/jaZ3ztM7722eHE4ySdfhijFEVTIgonhBPGieBE48TgxOLE4cTjBE9fJ9PXxt6JdjIjhBPGieBE48TgxOLE4SSZvg76TgzPSYCJUTghnDBOBCcaJwYnyfSNhJEYOyMOJx4nASZW4YRwwjgRnGicGJzA6YsSnGicGJwkxxJPqOP2Ip48X14Xv8ZlGJ9hAm7SZ5h/DGUYzjCSYTLmjd+MJ4xvmngCt1OT0bc3u2ylnv9DMjUmw9gMk95qKXLPOTBT4zNMwM2bvfaf8bzmU85zidWNMZd4opxePyN/4QwjoLnGxlfVN9Wqre+Fte25W7/U2U7fh3pScjv0+3W9Off1UHx71t2GOWTnSg5+6EtskaeSAsXW7SHA1pfsZGgO88EhlHHnG/sQ+/ED", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap index f18f7a05f22..bebea0c0100 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_0.snap @@ -95,8 +95,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1cS3MbRRCelXdta2XZSkIIBAgOBMIbPS2HKqpySFFJOCShiiTkvZbtvN/vm/4UVdyAG2d+DGdoe1r6ttWjOLDjMBVNVWpXO99Of9Mz3TPTvU5kNkvnn3+RvY/tdcpe6fluky+MPWyv9f9WGgW2VffFMQqAYykAjlMBcIwD4JgEwHE6AI4zAXCcDYBjOQCOaQAcKwFwnAuAYzUAjvMBcFwIgGMtAI47AuC4MwCOuwLg+IYHjj547i6QJ3FbNPlSNN83Axj7PQFwfCsAjm8HwHFvABzfCYDjuwFwfC8AjvsC4Ph+ABwXA+C4PwCOHwTA8cMAOB4IgONHAXD8OACOBwPg+EkAHD8NgONnAXD8PACOXwTA8csAOH4VAMevA+BYD4BjIwCOzQA4tgLg2A6AY8cDx42CH68QafpIgj5CoCQ/JdEpSU1JYEqyUhKTkoSUhKMkFyWRKElDSRBKMlAQn4LkFISmIO9+kEHBSQr+UXCNglcUHKLgCwU3KHhAh3M6/C7a9+hwRIcP2tzT5pk2p7T5o80VbV5oc0CLLy1utHiQcybnR70j4yXjoMlHg9sxo4UH6LS9KdvfJagv8GOMRlnILbL95Xo3Kyv9K5B/q2zbjL2031ri9hM//Osztp0j/WH72BeWyx92He0PdXkU3okAcwwwxxyY44A57sCcAMwJB+YkYE46MKcAc8qBOQ2Y0w7MGcCccWDOAuasA3MOMOccmPOAOe/AXADMBQfmImAuOjCXAHPJgbkMmMsOzBXAXHFgMsBkDswKYFYcmB5geg7MKmBWHZg1wKw5MOuAWXdgrgLmqgNzDTDXHJjrgLnuwNwAzA0H5iZgbjowtwBzy4G5DZjbDswdwNxxYO4C5q4Dcw8w9xyY+4C578A8AMwDB+YhYB46MI8A88iBeQyYxw7ME8A8cWCeAuapA/MMMM8cmOeAeS4wZbg3pui1tt32vFYdqpr8+mSgLyx72o/sLBLyjMl/7GyE/NT43BdsfliM8piP1E9J6GfWD586t1/21D73N1X6i/rn/i3Y3zNQl8K9qy2cP9yXmvL+zPboteFZr42X1SvzmfPDp8U2XgE+0sarfmS3t2rjLD8VXH2NTdWMjg3qh22ccVP9IZ9U1MX90X7wNYE6Hl8a95+hf1iHfMbZDc4V5u3Zbtqe7aY5sZtBmdgN1AVuN13PdtN6TdfxZc96bU/8UV4XKI91YczEH/HzQPzRime76UzsZlAmdgN1gdvNmme7WXpN1/F1z3rtTvzRoEz8EdSF7Y8aTc92szyxm0GZ2A3U+babqhmdY7GoK4Gcn/qbV54DOC7F5WI6md9cTLP+6nIxzcZW5/f/NRejze8pURf3R/uhzW8eX5zfVTM6t2LA/Qb3v9t7v7nB7mA+evqOqL5L4Y+yqMz0zaCwbqbgGeuV9TyLeFFXhrq4n5eT2t8xyMG2mEci8L/a3wv2Og3v8Ps1Rf60kJ/jrTyTeikr+LKCp3n4i72v2H80h3jB4T0++pzt8QnD/CCfA1j3UmYCfUI83huLw2d/2Cv195so37/E5PUnn7H+amZ0jiZCP/je4WJ00zBKX6V9JIJ/SdELj5nftWUYI2a5iYOX1B3uXYvUn5wLf9oryftWzAXGlLbI2ZMOB2sSfv84ZUbHU/JJ/fAZ5MsqL+CTCj5yzhbDZynT+ltg+yva+aK49usZr/G4p5a+dt7PWG75fMHyU8HV11yfF3ykfnD/RXULCteaUifn4IIiZ0GRo7WVFtiWnFszSlt43mZb1/afOHeoxFBX5HdUG/8pWTTkIX1UIjilY/qE+omEThCvxQm1M13V+JXNvk+Lhc6JurLC2bOPrksfHTv6gX8TgHjp3xPx7C971fZQ2jql6bqm6K4s9IO6K9Dn1jW7wbHZ0BnUFelzNbvJ6bqf77M2F7VYC+O12AzahtQ/2gr3XYt3RKAfOW6vIibA8lPB1deapPlkbRy267sLbV6UFD47jH5GQn7c1qK9an5tm/o31ndpvvRlfde8nUSa79LGGJ9J29HOVlXlvchxZTny2TgfKePenmK9db9x9dG4I/aFzvl7xNjw2R/PkPjuHNQj/mA0bHOvvef5rY1fIur2RXl9+4jzUtkJ7RohS+Mr/bEvXpHQNdojymRuJTM6Nhg7TcSzA2PsUfp0l4/T4jFcVwH9YfxIngW0PaImS/onxKdKn7V9YGULbU2NkT0u/6LJRl5Vh+zYjO7h5LtYh5ymlb6N299Jm8Z+aH+zqPkKfhd9hc+9W3d50xY2uNr22RfJEkM94g/ZBlCnBvp2+F/yXO9mjfVWtp51stXVdi+TvoQK2kPR8rNua7nXbPe6K51W1lradvm9ztJKr93J6msN+tl8kXwtLo9nASoc28fYP+K5vUTgj8B68529l/kelEe4H8fgIsd1ow3lWdzPP9NyApgrYfwgh9wf5ch1FahLhJw5+xv1hW0xj0Tgf4A1mQrmN/j9miJ/VsjP8VaeyVxJRcFXFDyNz/fCbrHvRZ81NmSK9vGZ5MZzh+b13zlfmVfRYwAA", - "debug_symbols": "tdjfiuIwFAbwd+l1L3LOyb/jqyzLULUOhVKl6sIivvumxY5d24v5cHIzTMTfR+iXRM2t2Nfb6+dH0x2O52Lz61a0x111aY5dGt3uZbHtm7ZtPj/mLxdm+MOGR3A+Vd0wPl+q/lJsWKQs6m4//BdTwKFp62LjzP13mYjgxOLE4cTjJOAk4kRhQmad0BfRBSGcME4EJxYn6+37ryfm3YJ4nAScRJwoTNjghHDCOBGcWJzg7TPePuPtM94+K7z4Bd/7gu99wfe+4Htf8L0vDiceJ+vt61SlGFqQiBOFiTU4IZwwTgQnFicOJx4nePt2tX3r/IPYIAuiMHEGJ4QTxongxOLE4WS1fav2QRwvScBJxInCxBucEE4YJ4ITixOHE7x9j7fv8fY93n7A2w94+2G1fSc6EefnpPz+W8d0yZpus6brm+mkYfrGQRpnnyBjfOS343U6B9Pvdv8ajz35kVicOJx4nAScRJwoTNTghHDCOMHbV5d1uat/M56NeS53ktf4kDc+5o3Xt+MpPM8C93+8GJM3nvLG848++/lBubKI0+XktIjThdDrVCTnmS3G5o13+eLvafCn6ptq29aPa+bDtdvNbp0vf0/1ywX0qT/u6v21r4er6Oct9LBahU0ploZppxFFKkmH0XgRKiaWQjIMh6UnZNPQpzmkefwD", + "bytecode": "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", + "debug_symbols": "tdjfiuowEAbwd+l1LzKTTP74KofDUrUuhVKl6oGD+O6bFruW2ov9cOdGjPj7KJkkJXMr9vX2+vnRdIfjudj8uRXtcVddmmOXR7d7WWz7pm2bz4/5z4UZPii5EZxPVTeMz5eqvxQbtrYs6m4/fIs54NC0dbERc/9bZiI48TgJOIk4SShhY3BCOOF1Qt8kvRCLE4cTwYnHyXr1/feMeXkhEScJJmRwQjhhnFicOJwITjxO8OoTXn3Cq8949Zngxc/43md87zO+9xnf+4zvfQ44iThZr36aSmkNLYk1OCGcME4sThxOBCceJwEnESd49d1q9Z34B3HBvhDCCePE4sThRHDicRJwslp9l9yDCL+SBBMxOCGcME4sThxOBCer1RebJiJ+Tsqf/3VMD6rpUTU9vZmeL0fTmy1femYn1RjvjW486cazbrzVjXe68aIb71Xjg+7KCe/PfZreM/n+7Zfx2NyPxOMk4ET3OInvHie5Y/KcVrLLeNKNZ914+3Y8heeak2W8040X3Xj/q3M/35Arizg3s6ZFnBsIy0cJqmdDjLrxSS/+ngf/qr6ptm39aBcfrt1u1j2+/D/Vi0byqT/u6v21r4eW8rObPJwU+eZUWub82MPWoEglJcqjsXHGiUtOYRgO296yzf+V/Az5Ob4A", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index f18f7a05f22..bebea0c0100 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_dynamic_nested_blackbox_input/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -95,8 +95,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdjfiuIwFAbwd+l1L3LOyb/jqyzLULUOhVKl6sIivvumxY5d24v5cHIzTMTfR+iXRM2t2Nfb6+dH0x2O52Lz61a0x111aY5dGt3uZbHtm7ZtPj/mLxdm+MOGR3A+Vd0wPl+q/lJsWKQs6m4//BdTwKFp62LjzP13mYjgxOLE4cTjJOAk4kRhQmad0BfRBSGcME4EJxYn6+37ryfm3YJ4nAScRJwoTNjghHDCOBGcWJzg7TPePuPtM94+K7z4Bd/7gu99wfe+4Htf8L0vDiceJ+vt61SlGFqQiBOFiTU4IZwwTgQnFicOJx4nePt2tX3r/IPYIAuiMHEGJ4QTxongxOLE4WS1fav2QRwvScBJxInCxBucEE4YJ4ITixOHE7x9j7fv8fY93n7A2w94+2G1fSc6EefnpPz+W8d0yZpus6brm+mkYfrGQRpnnyBjfOS343U6B9Pvdv8ajz35kVicOJx4nAScRJwoTNTghHDCOMHbV5d1uat/M56NeS53ktf4kDc+5o3Xt+MpPM8C93+8GJM3nvLG848++/lBubKI0+XktIjThdDrVCTnmS3G5o13+eLvafCn6ptq29aPa+bDtdvNbp0vf0/1ywX0qT/u6v21r4er6Oct9LBahU0ploZppxFFKkmH0XgRKiaWQjIMh6UnZNPQpzmkefwD", + "bytecode": "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", + "debug_symbols": "tdjfiuowEAbwd+l1LzKTTP74KofDUrUuhVKl6oGD+O6bFruW2ov9cOdGjPj7KJkkJXMr9vX2+vnRdIfjudj8uRXtcVddmmOXR7d7WWz7pm2bz4/5z4UZPii5EZxPVTeMz5eqvxQbtrYs6m4/fIs54NC0dbERc/9bZiI48TgJOIk4SShhY3BCOOF1Qt8kvRCLE4cTwYnHyXr1/feMeXkhEScJJmRwQjhhnFicOJwITjxO8OoTXn3Cq8949Zngxc/43md87zO+9xnf+4zvfQ44iThZr36aSmkNLYk1OCGcME4sThxOBCceJwEnESd49d1q9Z34B3HBvhDCCePE4sThRHDicRJwslp9l9yDCL+SBBMxOCGcME4sThxOBCer1RebJiJ+Tsqf/3VMD6rpUTU9vZmeL0fTmy1femYn1RjvjW486cazbrzVjXe68aIb71Xjg+7KCe/PfZreM/n+7Zfx2NyPxOMk4ET3OInvHie5Y/KcVrLLeNKNZ914+3Y8heeak2W8040X3Xj/q3M/35Arizg3s6ZFnBsIy0cJqmdDjLrxSS/+ngf/qr6ptm39aBcfrt1u1j2+/D/Vi0byqT/u6v21r4eW8rObPJwU+eZUWub82MPWoEglJcqjsXHGiUtOYRgO296yzf+V/Az5Ob4A", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index f0e7c77ba5a..c60ae90646f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -32,14 +32,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+2b627TQBCFN4mdxC6hoeV+LRTKtcVp3TZASyvKTyTECyBFVH0OPzo9dKeMJ0soihfpSF0pWtuznvl2PWvvZdJyZ+ng9Nfyx4nP2z7H9RVXT1L20OfFfGnUoK4iFmOLgLFNwNghYEwIGFMCxi4BY4+AsU/AmBEw5gSMCwSMVwgYBwSMVwkYFwkYhwSM1wgYlwgYlwkYrxMw3iBgvEnAeIuA8TYB4x0CxrsEjPcIGO8TMD4gYHxIwPioQcb/sRa5QtCmjwkYnxAwrhIwPiVgfEbAuEbA+JyA8QUB40sCxlcEjK8JGN8QMK4TMG4QML4lYCwIGEcEjJsEjFsEjCUB4zYB4w4B4y4B45iA8R0B43sCxg8EjHsEjPsEjB8JGA8iMNYABRqBeAh0QyAZArUQCIVAIwTyIFAGgSgI9EAgBQIVEAiAjfbh6Q8bxdiIxUYnNhKxUYeNMGw0YSMHGyXYiMBCPxbSsVCNhWAstK6c/rA4iMU3LG5h8QiLM1j8wOICJu+YHGPyickdJk+YnGDwj8E1aoXBIQZfGNxg8ICPMz5++Ljg5Y2XI14+6NzoPHBOPPwD9+ckD/K7zzOft5W8wcDAUWbsNql/XIzLLFC/Bvm3MqWzef1lIfqTOPxFz+v5XNX1O2NXOOI8p7KMW8/NYmDq5lRdxHYax/aoZew508bO2M9dTJ86C5DW9oTHto/0+YGUqX7ztIwsqabrIbJUyeT54v26qsqFfAtJnk2M98+42Ln0O8fld1aWVNP1+Fe/s74l5TbUsYwi4r4Hx2VMf0daDvBrW0i9yp0naY+OuibtKu3c1+WNLFOypKrbyf15ouxoXcKRmvLr/nzR5111j9w/DNjvGvs17sA12y5ZoHwWKI8x5Jo/xthRxiBHVV3foc+L+dKvQGT46L4wuahjhm3pN7ofSxJZV9luGVlPyWwb69Qx57YfHym9tpzl0e80YUuNbM/nMfs40pLh1La0vyRV8/Z3x2fBGUjSV1M33dbafmrKf/LneaAe8/wh52R3MjrZmpxMtifHx+WPiW0npLZqJ+3zA1f3D8tl9XRm6B4GdEnfjfvNLs7H+90o+jfP9ffi8I9C/U3aCnX6oq5rmfjg3/qqlP+mdH71x4tuut/KM1xQ8jQgl/v0fLFj9CG1Tfk8UF7PaTuGra9k+QV0tWfYXgiUz2fY1lz6Xn1fGuDMjN1+gCcN6LL9yOq135DQ8xc/vahf/QTn777EKTsAAA==", - "debug_symbols": "ldTbaoQwEAbgd8l1LjJqTr5KKYuHuARExUOhiO/eZLForbD8N2JkPmbiDLOy2pXL8+G7pp9Y/rGytq+K2fddOK0bZ+Xo29Y/H+fPTMRHZl/x01B08TjNxTiznEhw5ro6vqngG986lkuxfXImBSwIFgksUlhksJCwULDQsDCwgHuu4BwKzqHhudL3f9dq+iXW0GFe5L4sa9VOEpGov8QQnMXcjm8ixJGF0gtJcZLhRN4T0sf15YUonGicmPd3OfeF/4vVOt1Dtbl2EG+6FTghkGzh8FWMvihbt+/pZumq09qevwd32eDD2FeuXkYXd/mxxuP0pJJnMhRCsXZFXKmQIqT5AQ==", + "bytecode": "H4sIAAAAAAAA/+2b224TMRCGnWQ36aaUBMr5WCiUY8sm2TQBWlpRbrlDQlyGVpF4i310+lNPmUzcUNQ10i9hKfLu2jvz2R57fZjU3EnYO/7V/HXi47qP8XzNzQbJu+/j/GKhV6GsPBZjjYCxTsDYIGBMCBhTAsYmAWOLgHGJgDEjYGwTMC4TMF4iYFwhYLxMwNghYOwSMF4hYLxKwLhKwHiNgPE6AeMNAsabBIy3CBhvEzDeIWC8S8B4j4DxPgHjAwLGhxUy/ou9yDWCOn1EwPiYgHGdgPEJAeNTAsYNAsZnBIzPCRhfEDC+JGB8RcD4moBxk4Bxi4DxDQFjTsDYI2DsEzAOCBgLAsYhAeM2AeOIgHFMwPiWgPEdAeN7AsYdAsZdAsYPBIx7ERhnAAUajnhwdIMjGRy14AgFRyM48sBRBo4ocPSAIwUcFeAIgIP27vEPB8U4iMVBJw4ScVCHgzAcNOEgBwclOIjARj820rFRjY1gbLSuHf+wOYjNN2xuYfMImzPY/MDmAhbvWBxj8YnFHRZPWJxg8o/JNUqFySEmX5jcYPKAjzM+fvi4YPDG4IjBB50bnQfGicbfc2cHacgfPs58XFfpFToG9jKjt0r543xcZIHyVcg/yJTM6uUXuchP4vDnLS/nUzkr3xm9whGnnYoibjn7+Yopm1NlEd1pHN29mtHnTB07o7/tYtrUiYO01ic8tn6kz69InvI3T82kJeV8OSQtVWnSvhhf11W+kG0hSNvEGH/G+fZ/u3NcdmfTknK+HH9rd9a2JN+WupZZRNxxcFzEtHeE1QC/1oXQKt1pkPpoqGdSr1LPSzq/SctUWlLO6mn7+0Tp0bKEIzX5N/19x8dN9Y683w3obxr9M9yBZ7ZeskD+LJAfc8gNf425o8xBDspZefs+zi8Wfjkiw0Z3hclFnTMMpd/ofixB0ppKd82ktVSarWMdGube9uMDJdfmszx6TBO21KTt+DhmH0e4aji1Lm0vSVm9/tH4xDkDQfpq6ubrWutPTf6P/r4dKMdF/pAzHU1608FkOhlOjo6Kw4mtJ4S6qidt8ytu1j4sl5XTWCC7G5Alfbfj5r/Z9nuubb9KuxFd0n9k3LQ6U1Ue299aqkypefbZx6jXqSlf6JudLqi70Pwi7nwnP10rtaLI75/KX4rD3wuNVVJXaN8vZ7RJ6ubnUboeUpP/m5L51V933Hy7if0vu7DdJ4ZHr7UbRh5C3eRvB/Lr/YCGYdM23j6HrPoC3cuB/O0FujWXfle/lwY4M6O3GeBJA7LsGBT6pi6aR2s7Pa9dVT2eT0aD8WG/OBx9Hw4mg+0/juc/AVGeUZXlPAAA", + "debug_symbols": "ldXbaoQwEAbgd8l1LpKYo69SyuIhLgFR8VAo4rs3WSyKtSz/jTghH5NhBmYltS+X5yN0TT+R/GMlbV8Vc+i7GK0bJeUY2jY8H+djwtJHutf9aSi6FE5zMc4k55xR4rs6/enom9B6kiu2fVKiGCw4LAQsMlhIWChYaFgYWFhYwD3XcA4N5zDwXJn7uXKG/xJn+WFeROAkw4nEicKJxonBiYWJxcu3/zzM6Z0IJvSFODiLux0xwdiRhWcXwnEicJLdE26O8tWFSJwonOj3tZz7Qv/cNSbbrxp76aDDm+4sThxIthh8FWMoytbv+7NZuuq0TufvwV826zD2la+X0acde6zX1NdMUaniQ3iaPs2p1ilIc8WZoJzJmDFm/QE=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_0.snap index e34b7ad2250..e5e0eca8d8d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_0.snap @@ -32,14 +32,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+2ba0/bMBSGnZKkpIXBYPcrGxu7AikEKBsbTNrnfdn+QDXU35Gfvr7Uh56eGsTUeNIrzVLkNLbPeewcO76cJm4cTkdX4u9TH7d8jOcbbjpI3jMfl/OFXoOyyliMCQFji4BxgYAxJWDMCBhzAsY2AeMiAWNBwNghYOwSMC4RMC4TMN4iYFwhYFwlYLxNwLhGwLhOwHiHgPEuAeM9Asb7BIwPCBgfEjA+ImB8TMD4hIDxKQHjMwLG5w0y/ou9yA2CNn1BwPiSgHGTgPEVAeNrAsYtAsY3BIxvCRjfETC+J2D8QMD4kYBxm4Bxh4Bxl4CxJGDsETDuETDuEzBWBIwHBIyHBIxHBIx9AsZjAsZPBIyfCRhPCBi/EDB+JWA8jcA4BSjQcMSDoxscyeCoBUcoOBrBkQeOMnBEgaMHHCngqABHABy0r44uHBTjIBYHnThIxEEdDsJw0ISDHByU4CACG/3YSMdGNTaCsdG6MbqwOYjNN2xuYfMImzPY/MDmAhbvWBxj8YnFHRZPWJxg8o/JNWqFySEmX5jcYPKAjzM+fvi4YPDG4IjBB50bnQfGiZd/6q4O8iJ/+bjwcUulN+gY2CuM3ibl98t+VQTq1yD/fqFkNi+/KkV+Goe/bHs53+tp+c7oFY4476mq4tZzr1w2dXOqLqI7i6O7lxh9zrSxM/o7LqZNjR2ktT7hse0jfX5Z8tQTnsSkpfVsPSQtU2nyfjG+bqp8IdtCkHcTY/zpl4f/7c5x2Z1NS+vZevyt3Vnbknw76n7X38cdB/tVTHtHWA/wa10I7dpdBmmPBfVM2lXaeVHnN2mFSkvraT0d/ztVerQs4chM/m3/e8XHuSoj5VcD+nOjf4o78My2SxHIXwTyYw655e+7/oIN/fDPxO7SSVGXXBFrXfqZ6AqNIQhnPi7nCxcOm3Z8zIzuXKU1aasivx1F/t6l/MU4/D079uu2Qnysnuu0zM2Oi7odMpP/m5J54u9X3Gw/T015ayuxx541JdcZXV3FnAeYhbfjJmHB1MMZ9sTLtfk7pn66vfR6pHsDWa1rdC8F8nev0a25dFldLgtwdoze0JotD8gK9e3CyMrdbB20TUrfuamti/y0nuRrysaO+mPHowvWetJeem7hjP7M5P/pf+s2lXieP5sNjwa94f5gODgYnJ9Xvwe2LyDovvAHwrW+2PE5AAA=", - "debug_symbols": "tZXdioUgFIXfxWsvNLOtvcowHPqxgyAWVgND9O6jQ0NNczPR2TfilrU/ZaGuhbSmnp8P67t+JOXbQlzfVJPtfayWlZI6WOfs83FcJiwNufrWj0PlUzlOVZhIyTmjxPg2zYrY31lnSCnZSv8vfack14hwyTDhHBMOd+Ea+I9WK76LE7247YvWxabNWFac6NeMSR3Z5Q5xuUOiOlrcpGeM7Y5ycaIDKl2h0vVtOof9rsnfdGCodI5Kz17q+/EV/tUCiE0K6vReQWD+BpCj0iUefY3FRxVsVTuzhWQ3++aQmdPnYE7xOYS+Me0cTArSPUOTxULSXMYz83RnQVEl4hZxmy8=", + "bytecode": "H4sIAAAAAAAA/+2ba0/bMBSG3TZJSQtrB7tf2djYFUhpoB27wCQ+bH9gXzZpykD8jvz08YLPenpqGBPJpFfCUuUkts95fHyJY5823GnYPf41/HXk46aP8XzZTQfJu+fj7HJhUKGsrC7GBgFjk4CxRcAYETDGBIwJAWObgHGOgDElYOwQMHYJGOcJGBcIGK8RMPYIGPsEjNcJGBcJGJcIGG8QMN4kYLxFwHibgPEOAeNdAsZ7BIz3CRgfEDA+JGB8RMD4uELG/7EXuUxg0ycEjE8JGFcIGJ8RMD4nYFwlYHxBwPiSgPEVAeNrAsY3BIxvCRjXCBjXCRg3CBgzAsYBAeMmAeOQgDEnYNwiYNwmYBwRMI4JGN8RMO4QML4nYPxAwPiRgPETAeNuDYxTgAINRzw4usGRDI5acISCoxEceeAoA0cUOHrAkQKOCnAEwEF7//iHg2IcxOKgEweJOKjDQRgOmnCQg4MSHERgox8b6dioxkYwNlqXj3/YHMTmGza3sHmEzRlsfmBzAR/v+DjGxyc+7vDxhI8TLP6xuEatsDjE4guLGywe8HLGyw8vF0zemBwx+WBwY/Cgc6Lxd93ZQRryp49THzdVeoWOgYPU6K1S/jgb52mgfhXyD1Mls3r5eSbyo3r4s7aXs19Oy3dGr3DU0055Xm89N7MFUzen6iK643p0DxpGnzM2dkZ/x9XZp04dpLU+4bH2kTG/IHnKCU/DpEXlbD0kLVZp0r6YX1dUvlDfQpC2qWP+GWfbV/3OcfU7mxaVs/X4135n+5bkW1fXG/663nlwnNfZ3xGWAvxaF0K7dH+C2KOlnoldxc5zOr9JS1VaVE7r6fj7SOnRsoQjNvnX/H3Px4kqI+X7Af2J0T/FHXhm7ZIG8qeB/FhDrvrrrv+hD33zz6TfRZOirnFGrHXpZ6IrNIcg7Pk4u1w4cdi086Po6vn7RKXZua2t0qrsx6JrzsuTPmR1JspeOr++dr5O+tmOj3H/w9QvUeVagWfSNn03O9YSY5+kJvukgfpW+V4T+Wk9/AP73tS2Qvz5jDaJ3ew7RdshNvm/Kpn7/rrnZtstMuUl7Yubbs+65u1FJdcZXV0XHouRsVHHTULL1MMZ9oaXa/N3TP20vfS4615AVvMc3fOB/N1zdGsuXVaXiwOcHaO3HeBJArJC82LbyArNE7pPyti5aF+X/FE5yVdVHxuNT+fUE9ZyYi+9LnNGf2zyf/f32qYSX+aPekejYnA0LI6KreLwMD8o7FhA0GOhav3FaDg+2MwPRr+2hsVw+6/6fwNLF9MKrTsAAA==", + "debug_symbols": "tZbNaoUwEIXfJessMtH8+SqlXPyJl4CoRC0U8d2bXCxKuql4ZyOOnPkSTpxwVtLYank+XN8OEyk+VtINdTm7oQ/VulFSedd17vk4fyYsPnL90k9j2cdymks/kwKAUWL7Jr7J0N+6zpJCsI3+X/pJSW4Q4YJhwgETzu/CjYJfrdFwiF/0DJWeo9IFKl2i0hUqXaPSDSZdop6qvO+MkbuWMy4T+jVnQodilzvgcgfqjKu7M84ZOxyFLKELVLpEpavbdFDHvyYSukalG0y6Zm/1/TyFf7VKZbtU6WReNWDeBpqj0jM8+haKr9K7sursHgrbpa9PGXH+Hm0SF0c/1LZZvI3B8ciMcZuZoLkIe4Z47lpSA7GI5htOTR7WC2v+AA==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index e34b7ad2250..e5e0eca8d8d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_eq/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -32,14 +32,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+2ba0/bMBSGnZKkpIXBYPcrGxu7AikEKBsbTNrnfdn+QDXU35Gfvr7Uh56eGsTUeNIrzVLkNLbPeewcO76cJm4cTkdX4u9TH7d8jOcbbjpI3jMfl/OFXoOyyliMCQFji4BxgYAxJWDMCBhzAsY2AeMiAWNBwNghYOwSMC4RMC4TMN4iYFwhYFwlYLxNwLhGwLhOwHiHgPEuAeM9Asb7BIwPCBgfEjA+ImB8TMD4hIDxKQHjMwLG5w0y/ou9yA2CNn1BwPiSgHGTgPEVAeNrAsYtAsY3BIxvCRjfETC+J2D8QMD4kYBxm4Bxh4Bxl4CxJGDsETDuETDuEzBWBIwHBIyHBIxHBIx9AsZjAsZPBIyfCRhPCBi/EDB+JWA8jcA4BSjQcMSDoxscyeCoBUcoOBrBkQeOMnBEgaMHHCngqABHABy0r44uHBTjIBYHnThIxEEdDsJw0ISDHByU4CACG/3YSMdGNTaCsdG6MbqwOYjNN2xuYfMImzPY/MDmAhbvWBxj8YnFHRZPWJxg8o/JNWqFySEmX5jcYPKAjzM+fvi4YPDG4IjBB50bnQfGiZd/6q4O8iJ/+bjwcUulN+gY2CuM3ibl98t+VQTq1yD/fqFkNi+/KkV+Goe/bHs53+tp+c7oFY4476mq4tZzr1w2dXOqLqI7i6O7lxh9zrSxM/o7LqZNjR2ktT7hse0jfX5Z8tQTnsSkpfVsPSQtU2nyfjG+bqp8IdtCkHcTY/zpl4f/7c5x2Z1NS+vZevyt3Vnbknw76n7X38cdB/tVTHtHWA/wa10I7dpdBmmPBfVM2lXaeVHnN2mFSkvraT0d/ztVerQs4chM/m3/e8XHuSoj5VcD+nOjf4o78My2SxHIXwTyYw655e+7/oIN/fDPxO7SSVGXXBFrXfqZ6AqNIQhnPi7nCxcOm3Z8zIzuXKU1aasivx1F/t6l/MU4/D079uu2Qnysnuu0zM2Oi7odMpP/m5J54u9X3Gw/T015ayuxx541JdcZXV3FnAeYhbfjJmHB1MMZ9sTLtfk7pn66vfR6pHsDWa1rdC8F8nev0a25dFldLgtwdoze0JotD8gK9e3CyMrdbB20TUrfuamti/y0nuRrysaO+mPHowvWetJeem7hjP7M5P/pf+s2lXieP5sNjwa94f5gODgYnJ9Xvwe2LyDovvAHwrW+2PE5AAA=", - "debug_symbols": "tZXdioUgFIXfxWsvNLOtvcowHPqxgyAWVgND9O6jQ0NNczPR2TfilrU/ZaGuhbSmnp8P67t+JOXbQlzfVJPtfayWlZI6WOfs83FcJiwNufrWj0PlUzlOVZhIyTmjxPg2zYrY31lnSCnZSv8vfack14hwyTDhHBMOd+Ea+I9WK76LE7247YvWxabNWFac6NeMSR3Z5Q5xuUOiOlrcpGeM7Y5ycaIDKl2h0vVtOof9rsnfdGCodI5Kz17q+/EV/tUCiE0K6vReQWD+BpCj0iUefY3FRxVsVTuzhWQ3++aQmdPnYE7xOYS+Me0cTArSPUOTxULSXMYz83RnQVEl4hZxmy8=", + "bytecode": "H4sIAAAAAAAA/+2ba0/bMBSG3TZJSQtrB7tf2djYFUhpoB27wCQ+bH9gXzZpykD8jvz08YLPenpqGBPJpFfCUuUkts95fHyJY5823GnYPf41/HXk46aP8XzZTQfJu+fj7HJhUKGsrC7GBgFjk4CxRcAYETDGBIwJAWObgHGOgDElYOwQMHYJGOcJGBcIGK8RMPYIGPsEjNcJGBcJGJcIGG8QMN4kYLxFwHibgPEOAeNdAsZ7BIz3CRgfEDA+JGB8RMD4uELG/7EXuUxg0ycEjE8JGFcIGJ8RMD4nYFwlYHxBwPiSgPEVAeNrAsY3BIxvCRjXCBjXCRg3CBgzAsYBAeMmAeOQgDEnYNwiYNwmYBwRMI4JGN8RMO4QML4nYPxAwPiRgPETAeNuDYxTgAINRzw4usGRDI5acISCoxEceeAoA0cUOHrAkQKOCnAEwEF7//iHg2IcxOKgEweJOKjDQRgOmnCQg4MSHERgox8b6dioxkYwNlqXj3/YHMTmGza3sHmEzRlsfmBzAR/v+DjGxyc+7vDxhI8TLP6xuEatsDjE4guLGywe8HLGyw8vF0zemBwx+WBwY/Cgc6Lxd93ZQRryp49THzdVeoWOgYPU6K1S/jgb52mgfhXyD1Mls3r5eSbyo3r4s7aXs19Oy3dGr3DU0055Xm89N7MFUzen6iK643p0DxpGnzM2dkZ/x9XZp04dpLU+4bH2kTG/IHnKCU/DpEXlbD0kLVZp0r6YX1dUvlDfQpC2qWP+GWfbV/3OcfU7mxaVs/X4135n+5bkW1fXG/663nlwnNfZ3xGWAvxaF0K7dH+C2KOlnoldxc5zOr9JS1VaVE7r6fj7SOnRsoQjNvnX/H3Px4kqI+X7Af2J0T/FHXhm7ZIG8qeB/FhDrvrrrv+hD33zz6TfRZOirnFGrHXpZ6IrNIcg7Pk4u1w4cdi086Po6vn7RKXZua2t0qrsx6JrzsuTPmR1JspeOr++dr5O+tmOj3H/w9QvUeVagWfSNn03O9YSY5+kJvukgfpW+V4T+Wk9/AP73tS2Qvz5jDaJ3ew7RdshNvm/Kpn7/rrnZtstMuUl7Yubbs+65u1FJdcZXV0XHouRsVHHTULL1MMZ9oaXa/N3TP20vfS4615AVvMc3fOB/N1zdGsuXVaXiwOcHaO3HeBJArJC82LbyArNE7pPyti5aF+X/FE5yVdVHxuNT+fUE9ZyYi+9LnNGf2zyf/f32qYSX+aPekejYnA0LI6KreLwMD8o7FhA0GOhav3FaDg+2MwPRr+2hsVw+6/6fwNLF9MKrTsAAA==", + "debug_symbols": "tZbNaoUwEIXfJessMtH8+SqlXPyJl4CoRC0U8d2bXCxKuql4ZyOOnPkSTpxwVtLYank+XN8OEyk+VtINdTm7oQ/VulFSedd17vk4fyYsPnL90k9j2cdymks/kwKAUWL7Jr7J0N+6zpJCsI3+X/pJSW4Q4YJhwgETzu/CjYJfrdFwiF/0DJWeo9IFKl2i0hUqXaPSDSZdop6qvO+MkbuWMy4T+jVnQodilzvgcgfqjKu7M84ZOxyFLKELVLpEpavbdFDHvyYSukalG0y6Zm/1/TyFf7VKZbtU6WReNWDeBpqj0jM8+haKr9K7sursHgrbpa9PGXH+Hm0SF0c/1LZZvI3B8ciMcZuZoLkIe4Z47lpSA7GI5htOTR7WC2v+AA==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index c90b66ceb47..b4455ad268f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -34,18 +34,14 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/9WaSW8TMRTHPelM0iSUhJZ9KV8h0yRN4cTWfd/3ZbrkwAmJC0gcIi7ckEDi+8JL/Jr/vNgpUuODLVWesX/z3n+8PNvTBKqTxv/9Bfo61HlG9SZm3ui8crsUD9BWJdDv4VJvMEC9rjRmPNA45IHG0AONkQcasx5ozHmgcdgDjXkPNBY80Fj0QOMdDzSOeKDxrgcaSx5oLHug8Z4HGkc90Djmgcb7Hmh84IHGhx5ofOSBxsceaHzigcanHmh85oHG5x5ofOGBxnEHGtvpJVyTaPqwRB9u6MMIfXiggz0dnOlgSgc/OljRwYUOBrTxpo0tbRxpY0YbH9pY0MJNCyMtPBTYKXBSYKKJTxOLBi4NDGp4+TFPCT2U/ug8r/MM1A/wI1OcF34HaX+qMlnNG95vgPrb9tnm4O3HTbYfutFfyWk7H1pp+0r4HRKcfAaZaWCmhV1mZoCZsTCzwMxamDlg5izMPDDzFmYBmAULswjMooVZAmbJwiwDs2xhVoBZsTCrwKxamDVg1izMOjDrFmYDmA0LswnMpoXZAmbLwmwDs21hdoDZsTC7wOxamD1g9izMPjD7FuYAmAMLcwjMoYU5AubIwhwDc2xhToA5sTCnwJxamDNgzixMAkxiYc6BORfMiL4Oush1bOH452L9marU6m7ja3w1otIxVcF7su/Ije9mIPwplY7tSvgvKJdrWeeffOiP9cj24b4eYabV1SPrwlbve3BdBHXcv7SnagBnGlvMvYPr9/qa+8zlfsXVeKc0ZtCPvijlWuo6cXsMQRm3K7fzMPKiLg91YSvtp6DvQ/CDtlhHJPi3+r6k8yw8w8+XDf6zwn9Kt6FMtkvewOcNPO3fX+vrov6jMfRZl/WLCf8zZ9FXWfXOWa4rqd7YxnVuY0/nRwOBbgulun0sfeKPIpDHa6WfwbJlnVO7foVn0KYCn2GftssY9Djed8eRSs/DDZ3T+x0JDS5iDaV+8ZXPTWHLhe+4Sf32Tdvi+YDrAsZuORaGDDz2If3lDHxWMJTKgsc+N80t9on9VFLmfkJfpjUvMPgs9fHpeM5O9Gs7036BtWK75sR7BwZb+G5ZSztlLTzbiwTf1DmNq9+C5+dD1b/tI8F/1LnrWDkKdpUyt7FpvXb77aEbw0ND+5n6JKN6YybG3UiUfdK5KYbLuSTHUr8YzlxRuY1jjalOG1HiGBqp9LquhP9I8F/0fQH0c36bH0o1G0ncrCbNpJ5cXtYuEjnGsA2LDvwnjerUxUTtonFerybVyRv9m/ZyuC5R4v0g7heRZ3uR4BmhmPJdX8szAvoj7lcfLrDkbRuGsrCVLjPtI3F/zTz7LrR6NXJdEepwzaR0R99je6Et1hEJ/qe+5z7BPTE/Xzb4Hxb+U7oNZXJ/XTTwRQNP/fOD7ekc333QZ9a2T2Efy6Q2Hjsu5lWtnjQukkYcv6rFV7W4ftO8+gsHvILHiSwAAA==", - "debug_symbols": "lZXdqoQgFIXfxWsv3I2a9iqHw9CPDUJUWB04RO8+GsEMTQysG2Hr98HCdbFX1rhqedx93w4TK35W1g11Ofuhj9O6cVYF33X+cX+/ZiIdJtv5aSz7NE5zGWZWKM2Z6xtWaBHt1ncu3ontlzNzA3kJ8grkNcjnIG9A3mK8FSAP9mUv+zLq4I098xLkL/uy2cFbfeY1yOcgb77m/+QtxpMQqECocFkxCXsYROpDueGKxBWFKxpXclwxuGJhhQSuEK7g7RPY/hanvzL4surcsSDapa/f9sX8P7rT6hjDULtmCS4tkdf+SH9CmeQkVYySgijFtdq/OD2R4pSJPWUapY6kiQliiic=", + "bytecode": "H4sIAAAAAAAA/9WaV3PTQBDHT7FkxzbGJqGX8BUsYuPAEy29916U4oEHhhfemAENn5ysc5v8tb4zMNE93M1oVO6n3f/1PdmBukpjl0egr0N9HlL9iZl3+ty8XYpztNUMdDlc6g1y1OtK45AHGgseaAw90Bh5oLHogcaSBxqHPdBY9kBjxQONVQ803vFAY80DjXc90Fj3QGPDA433PNA44oHGUQ803vdA4wMPND70QOMjDzQ+9kDjEw80PvVA4zMPND73QOMLDzSOOdDYSy/hmkTThyX6cEMfRujDA23saeNMG1Pa+NHGijYutDGgwJsCWwocKTCjwIcCC1q4aWGkhYcmdpo4aWKigU8DizoudQyqePkxTwk9lH7rc1mfhyA/x49McVn4zdP+RPP1eNlQvhz19+yzzfztx122H7rR3yxpO5/SrH0l/BYEJ99BZhKYSWGXmSlgpizMNDDTFmYGmBkLMwvMrIWZA2bOwswDM29hFoBZsDCLwCxamCVglizMMjDLFmYFmBULswrMqoVZA2bNwqwDs25hNoDZsDCbwGxamC1gtizMNjDbFmYHmB0LswvMroXZA2bPwuwDs29hDoA5sDCHwBxamCNgjizMMTDHFuYEmBMLkwCTWJhTYE4FU9PXwQ1yPbfw/Odi/Zlottpu59f4oqayc6qCcrLvyI3vbiD8KZWd25XwX1Eu17KrH/nQH+uR9cNtXWMmvdEj88K0vxycF0Eety/FVB3gTH2LuQ9w/VFfc5u5jFdc9XdKowb96ItSKVXXieujAM+4Xrmeh5EXeWXIC9Osn4q+D8EP2mIdkeDf6/u6PhfhHX6/YfBfFP4zug3PZL2UDXzZwFP8/lZfV/VBfehMPxs0J/zLmEVfDdU/ZjnPcezY+5EU+9IclH9DaHAxXigNmiM49g9TF77jLrXpF22L2xTnNpx/Al0vnAoGHvsbHSUDXxQMpYbgsc1N/YN9YjvVlbmd0FfBoCcw+GRbpnnV7X6p+WpQXZvKVlf9a7Cs48BgC8sWWeqpaOHZXiT4I32mfvVL8Px+qAbXfST4U312XO/NEbCrhK+qcjsWOxNXf1KixPNApLL9VQn/keA/6/uKoRy3+cNKt5PE3fGkm7ST8/PWWSLridIQ1JNpTcO5jRKvi7huIs/2IsF/Zfby+KavZayE/oj7OYD73zUrTLPPTOspxhnMs+9K2q+R86qQh/MupTv6HusLbbGOSPA/9D23CcYG/H7D4H9Y+M/oNjyTcUbVwFcNPLXPd7anz1j2vGP3nk9hH59Jbdx3qir/cdVqJ52zpBPHb1rxRStu/21c/QETOPUdkSkAAA==", + "debug_symbols": "ldTbaoQwEAbgd8l1LjLp5jC+SilL1LgEQpSohSK+e5MidHFlYW7ESb6BIT/Mxnrfro97SMM4s+ZzY3Hs3BLGVKpt56zNIcbwuD8fM1E/5vbn58mlWs6LywtrlObMp541WpTuIURfzsT+xZlRRK+J3hC9JXqkeSuIHoheEj0xL3uZl1WHt3j2mugv80J5eNRnb4keaR7F2/lfPRC9JPoPor/MFwQeDQDq3KHIHZrcYWgde6m+XQ6ujf5YQcOauqeNtPxM/rScpjx2vl+zr2vqf0PVQEEoDlKXSepzKsW1Kv9QrxA5iFutapIgTYFYBihD/AI=", "file_map": { "50": { "source": "fn main(x: bool, mut y: [u32; 30]) {\n if x {\n y[0] = 1;\n }\n\n let z = y[0] + y[1];\n assert(z == 1);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_0.snap index c90b66ceb47..b4455ad268f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_0.snap @@ -34,18 +34,14 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/9WaSW8TMRTHPelM0iSUhJZ9KV8h0yRN4cTWfd/3ZbrkwAmJC0gcIi7ckEDi+8JL/Jr/vNgpUuODLVWesX/z3n+8PNvTBKqTxv/9Bfo61HlG9SZm3ui8crsUD9BWJdDv4VJvMEC9rjRmPNA45IHG0AONkQcasx5ozHmgcdgDjXkPNBY80Fj0QOMdDzSOeKDxrgcaSx5oLHug8Z4HGkc90Djmgcb7Hmh84IHGhx5ofOSBxsceaHzigcanHmh85oHG5x5ofOGBxnEHGtvpJVyTaPqwRB9u6MMIfXiggz0dnOlgSgc/OljRwYUOBrTxpo0tbRxpY0YbH9pY0MJNCyMtPBTYKXBSYKKJTxOLBi4NDGp4+TFPCT2U/ug8r/MM1A/wI1OcF34HaX+qMlnNG95vgPrb9tnm4O3HTbYfutFfyWk7H1pp+0r4HRKcfAaZaWCmhV1mZoCZsTCzwMxamDlg5izMPDDzFmYBmAULswjMooVZAmbJwiwDs2xhVoBZsTCrwKxamDVg1izMOjDrFmYDmA0LswnMpoXZAmbLwmwDs21hdoDZsTC7wOxamD1g9izMPjD7FuYAmAMLcwjMoYU5AubIwhwDc2xhToA5sTCnwJxamDNgzixMAkxiYc6BORfMiL4Oush1bOH452L9marU6m7ja3w1otIxVcF7su/Ije9mIPwplY7tSvgvKJdrWeeffOiP9cj24b4eYabV1SPrwlbve3BdBHXcv7SnagBnGlvMvYPr9/qa+8zlfsXVeKc0ZtCPvijlWuo6cXsMQRm3K7fzMPKiLg91YSvtp6DvQ/CDtlhHJPi3+r6k8yw8w8+XDf6zwn9Kt6FMtkvewOcNPO3fX+vrov6jMfRZl/WLCf8zZ9FXWfXOWa4rqd7YxnVuY0/nRwOBbgulun0sfeKPIpDHa6WfwbJlnVO7foVn0KYCn2GftssY9Djed8eRSs/DDZ3T+x0JDS5iDaV+8ZXPTWHLhe+4Sf32Tdvi+YDrAsZuORaGDDz2If3lDHxWMJTKgsc+N80t9on9VFLmfkJfpjUvMPgs9fHpeM5O9Gs7036BtWK75sR7BwZb+G5ZSztlLTzbiwTf1DmNq9+C5+dD1b/tI8F/1LnrWDkKdpUyt7FpvXb77aEbw0ND+5n6JKN6YybG3UiUfdK5KYbLuSTHUr8YzlxRuY1jjalOG1HiGBqp9LquhP9I8F/0fQH0c36bH0o1G0ncrCbNpJ5cXtYuEjnGsA2LDvwnjerUxUTtonFerybVyRv9m/ZyuC5R4v0g7heRZ3uR4BmhmPJdX8szAvoj7lcfLrDkbRuGsrCVLjPtI3F/zTz7LrR6NXJdEepwzaR0R99je6Et1hEJ/qe+5z7BPTE/Xzb4Hxb+U7oNZXJ/XTTwRQNP/fOD7ekc333QZ9a2T2Efy6Q2Hjsu5lWtnjQukkYcv6rFV7W4ftO8+gsHvILHiSwAAA==", - "debug_symbols": "lZXdqoQgFIXfxWsv3I2a9iqHw9CPDUJUWB04RO8+GsEMTQysG2Hr98HCdbFX1rhqedx93w4TK35W1g11Ofuhj9O6cVYF33X+cX+/ZiIdJtv5aSz7NE5zGWZWKM2Z6xtWaBHt1ncu3ontlzNzA3kJ8grkNcjnIG9A3mK8FSAP9mUv+zLq4I098xLkL/uy2cFbfeY1yOcgb77m/+QtxpMQqECocFkxCXsYROpDueGKxBWFKxpXclwxuGJhhQSuEK7g7RPY/hanvzL4surcsSDapa/f9sX8P7rT6hjDULtmCS4tkdf+SH9CmeQkVYySgijFtdq/OD2R4pSJPWUapY6kiQliiic=", + "bytecode": "H4sIAAAAAAAA/9WaV3PTQBDHT7FkxzbGJqGX8BUsYuPAEy29916U4oEHhhfemAENn5ysc5v8tb4zMNE93M1oVO6n3f/1PdmBukpjl0egr0N9HlL9iZl3+ty8XYpztNUMdDlc6g1y1OtK45AHGgseaAw90Bh5oLHogcaSBxqHPdBY9kBjxQONVQ803vFAY80DjXc90Fj3QGPDA433PNA44oHGUQ803vdA4wMPND70QOMjDzQ+9kDjEw80PvVA4zMPND73QOMLDzSOOdDYSy/hmkTThyX6cEMfRujDA23saeNMG1Pa+NHGijYutDGgwJsCWwocKTCjwIcCC1q4aWGkhYcmdpo4aWKigU8DizoudQyqePkxTwk9lH7rc1mfhyA/x49McVn4zdP+RPP1eNlQvhz19+yzzfztx122H7rR3yxpO5/SrH0l/BYEJ99BZhKYSWGXmSlgpizMNDDTFmYGmBkLMwvMrIWZA2bOwswDM29hFoBZsDCLwCxamCVglizMMjDLFmYFmBULswrMqoVZA2bNwqwDs25hNoDZsDCbwGxamC1gtizMNjDbFmYHmB0LswvMroXZA2bPwuwDs29hDoA5sDCHwBxamCNgjizMMTDHFuYEmBMLkwCTWJhTYE4FU9PXwQ1yPbfw/Odi/Zlottpu59f4oqayc6qCcrLvyI3vbiD8KZWd25XwX1Eu17KrH/nQH+uR9cNtXWMmvdEj88K0vxycF0Eety/FVB3gTH2LuQ9w/VFfc5u5jFdc9XdKowb96ItSKVXXieujAM+4Xrmeh5EXeWXIC9Osn4q+D8EP2mIdkeDf6/u6PhfhHX6/YfBfFP4zug3PZL2UDXzZwFP8/lZfV/VBfehMPxs0J/zLmEVfDdU/ZjnPcezY+5EU+9IclH9DaHAxXigNmiM49g9TF77jLrXpF22L2xTnNpx/Al0vnAoGHvsbHSUDXxQMpYbgsc1N/YN9YjvVlbmd0FfBoCcw+GRbpnnV7X6p+WpQXZvKVlf9a7Cs48BgC8sWWeqpaOHZXiT4I32mfvVL8Px+qAbXfST4U312XO/NEbCrhK+qcjsWOxNXf1KixPNApLL9VQn/keA/6/uKoRy3+cNKt5PE3fGkm7ST8/PWWSLridIQ1JNpTcO5jRKvi7huIs/2IsF/Zfby+KavZayE/oj7OYD73zUrTLPPTOspxhnMs+9K2q+R86qQh/MupTv6HusLbbGOSPA/9D23CcYG/H7D4H9Y+M/oNjyTcUbVwFcNPLXPd7anz1j2vGP3nk9hH59Jbdx3qir/cdVqJ52zpBPHb1rxRStu/21c/QETOPUdkSkAAA==", + "debug_symbols": "ldTbaoQwEAbgd8l1LjLp5jC+SilL1LgEQpSohSK+e5MidHFlYW7ESb6BIT/Mxnrfro97SMM4s+ZzY3Hs3BLGVKpt56zNIcbwuD8fM1E/5vbn58mlWs6LywtrlObMp541WpTuIURfzsT+xZlRRK+J3hC9JXqkeSuIHoheEj0xL3uZl1WHt3j2mugv80J5eNRnb4keaR7F2/lfPRC9JPoPor/MFwQeDQDq3KHIHZrcYWgde6m+XQ6ujf5YQcOauqeNtPxM/rScpjx2vl+zr2vqf0PVQEEoDlKXSepzKsW1Kv9QrxA5iFutapIgTYFYBihD/AI=", "file_map": { "50": { "source": "fn main(x: bool, mut y: [u32; 30]) {\n if x {\n y[0] = 1;\n }\n\n let z = y[0] + y[1];\n assert(z == 1);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index c90b66ceb47..b4455ad268f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_if_cond_simple/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -34,18 +34,14 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/9WaSW8TMRTHPelM0iSUhJZ9KV8h0yRN4cTWfd/3ZbrkwAmJC0gcIi7ckEDi+8JL/Jr/vNgpUuODLVWesX/z3n+8PNvTBKqTxv/9Bfo61HlG9SZm3ui8crsUD9BWJdDv4VJvMEC9rjRmPNA45IHG0AONkQcasx5ozHmgcdgDjXkPNBY80Fj0QOMdDzSOeKDxrgcaSx5oLHug8Z4HGkc90Djmgcb7Hmh84IHGhx5ofOSBxsceaHzigcanHmh85oHG5x5ofOGBxnEHGtvpJVyTaPqwRB9u6MMIfXiggz0dnOlgSgc/OljRwYUOBrTxpo0tbRxpY0YbH9pY0MJNCyMtPBTYKXBSYKKJTxOLBi4NDGp4+TFPCT2U/ug8r/MM1A/wI1OcF34HaX+qMlnNG95vgPrb9tnm4O3HTbYfutFfyWk7H1pp+0r4HRKcfAaZaWCmhV1mZoCZsTCzwMxamDlg5izMPDDzFmYBmAULswjMooVZAmbJwiwDs2xhVoBZsTCrwKxamDVg1izMOjDrFmYDmA0LswnMpoXZAmbLwmwDs21hdoDZsTC7wOxamD1g9izMPjD7FuYAmAMLcwjMoYU5AubIwhwDc2xhToA5sTCnwJxamDNgzixMAkxiYc6BORfMiL4Oush1bOH452L9marU6m7ja3w1otIxVcF7su/Ije9mIPwplY7tSvgvKJdrWeeffOiP9cj24b4eYabV1SPrwlbve3BdBHXcv7SnagBnGlvMvYPr9/qa+8zlfsXVeKc0ZtCPvijlWuo6cXsMQRm3K7fzMPKiLg91YSvtp6DvQ/CDtlhHJPi3+r6k8yw8w8+XDf6zwn9Kt6FMtkvewOcNPO3fX+vrov6jMfRZl/WLCf8zZ9FXWfXOWa4rqd7YxnVuY0/nRwOBbgulun0sfeKPIpDHa6WfwbJlnVO7foVn0KYCn2GftssY9Djed8eRSs/DDZ3T+x0JDS5iDaV+8ZXPTWHLhe+4Sf32Tdvi+YDrAsZuORaGDDz2If3lDHxWMJTKgsc+N80t9on9VFLmfkJfpjUvMPgs9fHpeM5O9Gs7036BtWK75sR7BwZb+G5ZSztlLTzbiwTf1DmNq9+C5+dD1b/tI8F/1LnrWDkKdpUyt7FpvXb77aEbw0ND+5n6JKN6YybG3UiUfdK5KYbLuSTHUr8YzlxRuY1jjalOG1HiGBqp9LquhP9I8F/0fQH0c36bH0o1G0ncrCbNpJ5cXtYuEjnGsA2LDvwnjerUxUTtonFerybVyRv9m/ZyuC5R4v0g7heRZ3uR4BmhmPJdX8szAvoj7lcfLrDkbRuGsrCVLjPtI3F/zTz7LrR6NXJdEepwzaR0R99je6Et1hEJ/qe+5z7BPTE/Xzb4Hxb+U7oNZXJ/XTTwRQNP/fOD7ekc333QZ9a2T2Efy6Q2Hjsu5lWtnjQukkYcv6rFV7W4ftO8+gsHvILHiSwAAA==", - "debug_symbols": "lZXdqoQgFIXfxWsv3I2a9iqHw9CPDUJUWB04RO8+GsEMTQysG2Hr98HCdbFX1rhqedx93w4TK35W1g11Ofuhj9O6cVYF33X+cX+/ZiIdJtv5aSz7NE5zGWZWKM2Z6xtWaBHt1ncu3ontlzNzA3kJ8grkNcjnIG9A3mK8FSAP9mUv+zLq4I098xLkL/uy2cFbfeY1yOcgb77m/+QtxpMQqECocFkxCXsYROpDueGKxBWFKxpXclwxuGJhhQSuEK7g7RPY/hanvzL4surcsSDapa/f9sX8P7rT6hjDULtmCS4tkdf+SH9CmeQkVYySgijFtdq/OD2R4pSJPWUapY6kiQliiic=", + "bytecode": "H4sIAAAAAAAA/9WaV3PTQBDHT7FkxzbGJqGX8BUsYuPAEy29916U4oEHhhfemAENn5ysc5v8tb4zMNE93M1oVO6n3f/1PdmBukpjl0egr0N9HlL9iZl3+ty8XYpztNUMdDlc6g1y1OtK45AHGgseaAw90Bh5oLHogcaSBxqHPdBY9kBjxQONVQ803vFAY80DjXc90Fj3QGPDA433PNA44oHGUQ803vdA4wMPND70QOMjDzQ+9kDjEw80PvVA4zMPND73QOMLDzSOOdDYSy/hmkTThyX6cEMfRujDA23saeNMG1Pa+NHGijYutDGgwJsCWwocKTCjwIcCC1q4aWGkhYcmdpo4aWKigU8DizoudQyqePkxTwk9lH7rc1mfhyA/x49McVn4zdP+RPP1eNlQvhz19+yzzfztx122H7rR3yxpO5/SrH0l/BYEJ99BZhKYSWGXmSlgpizMNDDTFmYGmBkLMwvMrIWZA2bOwswDM29hFoBZsDCLwCxamCVglizMMjDLFmYFmBULswrMqoVZA2bNwqwDs25hNoDZsDCbwGxamC1gtizMNjDbFmYHmB0LswvMroXZA2bPwuwDs29hDoA5sDCHwBxamCNgjizMMTDHFuYEmBMLkwCTWJhTYE4FU9PXwQ1yPbfw/Odi/Zlottpu59f4oqayc6qCcrLvyI3vbiD8KZWd25XwX1Eu17KrH/nQH+uR9cNtXWMmvdEj88K0vxycF0Eety/FVB3gTH2LuQ9w/VFfc5u5jFdc9XdKowb96ItSKVXXieujAM+4Xrmeh5EXeWXIC9Osn4q+D8EP2mIdkeDf6/u6PhfhHX6/YfBfFP4zug3PZL2UDXzZwFP8/lZfV/VBfehMPxs0J/zLmEVfDdU/ZjnPcezY+5EU+9IclH9DaHAxXigNmiM49g9TF77jLrXpF22L2xTnNpx/Al0vnAoGHvsbHSUDXxQMpYbgsc1N/YN9YjvVlbmd0FfBoCcw+GRbpnnV7X6p+WpQXZvKVlf9a7Cs48BgC8sWWeqpaOHZXiT4I32mfvVL8Px+qAbXfST4U312XO/NEbCrhK+qcjsWOxNXf1KixPNApLL9VQn/keA/6/uKoRy3+cNKt5PE3fGkm7ST8/PWWSLridIQ1JNpTcO5jRKvi7huIs/2IsF/Zfby+KavZayE/oj7OYD73zUrTLPPTOspxhnMs+9K2q+R86qQh/MupTv6HusLbbGOSPA/9D23CcYG/H7D4H9Y+M/oNjyTcUbVwFcNPLXPd7anz1j2vGP3nk9hH59Jbdx3qir/cdVqJ52zpBPHb1rxRStu/21c/QETOPUdkSkAAA==", + "debug_symbols": "ldTbaoQwEAbgd8l1LjLp5jC+SilL1LgEQpSohSK+e5MidHFlYW7ESb6BIT/Mxnrfro97SMM4s+ZzY3Hs3BLGVKpt56zNIcbwuD8fM1E/5vbn58mlWs6LywtrlObMp541WpTuIURfzsT+xZlRRK+J3hC9JXqkeSuIHoheEj0xL3uZl1WHt3j2mugv80J5eNRnb4keaR7F2/lfPRC9JPoPor/MFwQeDQDq3KHIHZrcYWgde6m+XQ6ujf5YQcOauqeNtPxM/rScpjx2vl+zr2vqf0PVQEEoDlKXSepzKsW1Kv9QrxA5iFutapIgTYFYBihD/AI=", "file_map": { "50": { "source": "fn main(x: bool, mut y: [u32; 30]) {\n if x {\n y[0] = 1;\n }\n\n let z = y[0] + y[1];\n assert(z == 1);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index ccc513f640b..b8e368b2dd8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -51,8 +51,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/91Y247aQAx1kgnZgBC0/YhKfUpIKFTqAw97UfsRlbKs+IJW6mM+vZtlvDk4hpbdsSp2JJQhduxjj8dzkoj2I3v8RX7u/DWh4WCdjb8WrxtlQFtFpGAOjTcKiNcKY3wBGJPA6+7Idt3dBeQ0vQCMowvAmBlgfBpXokC7jZr44u0Wr0tORscHB/rbX3N/jUEecGOVufAb0v66qLe5El9A/FXubTob+2u2n9rYL7gWrtvePsbCfvnQu2n7XN7AM3gw3oLO7RGdO9C5EzpTmJPAx/mwqMfHelka57uaihwTxMm+Rza+60j4I+rXA2Xsf0ymtV1Gwh/jkfnhtZ6yTtvjkTLXDuNgWQoyXt+uX34EPVlbjCOnw/oNXHfW+7z+j3W3fIt1lwiZa4dxnFt3mBMHeguYV37Oa2Z5blr12W58UPCjr25kLT0Pzk0C9zivnOcr1BeyHGSuPfQz9v8d+EFbjCMV+qX/P/PXETzDz88V/yPh/wC3ck/mJVf0c0W/q8NPfj7xv66GrvkZMt1n9al9ptX6jIY9cCSw4sv3JhBOiSMlvRejjHW/CnxGPbR4D3aP5cZoHZdTkQ8cUyVurd/z0D6eYK/7DnalnvSZKLmYUP/O4tpeHiofq/X+Y8BTLN5+SvqHLAdy1P/m/49FbJyLzQtx7lZNuauaXbNsHh7qbSNrphsx5EnrBSb9viwKrUaJwu0PWRPow5hbfflXfvN8fpAdlyyA36QCj8xPLPJj1LvW72h/Dp4677Wer/HvzAijxvEYk8bxGEe3h+79fEY6J0P8VnwqEvliLiN9MraYhvsRua88535AvL+EPVn38h77n9Ow7llPvvOjHvZ05E4B87dgv8wpE/Dv2j4W9q9xTtZjrLkN1kLyVjx/kAdyLLHQl3PJa39SjxtjxDU5xU8nINN4O2PUePOkPc/WlbCVvcIW45or+tkLcWm2JP8/h8/v2B6F5w/NqlpvF/V2db+smurzX/nDHxdWZu/ZGwAA", - "debug_symbols": "tdbbioMwEAbgd8l1LhJz7qsspXiIJSAqHhYW8d03WdxWRCgjzI0kMp+/mgRmIZUv5ucjtHU3ktvXQpquzKfQtXG2rJQUQ2ia8HzsbxOWLir7qx/7vE3TccqHidwUl5T4toojwaKvQ+PjmK13SpQACwkW6pNQR6HBwoCFBQsHFZqdCePUJiyzR8HBIgMLARYSLBRYaKgw5/tKCva/IFLql+GRnzyeu63YOGH2xSlAYwcY7ACLHeCQAyzDDuDYARl2gMAOkNgB2CfZYp9ki32SLfQkJ+PgxrELhl8w2QUjLhh5wUC3432Ns+98CHnR+K1Lq+e23DVt00/vD/1bP3Slr+bBp07u3cSln+ks5VzHV0lfLByVLo55WhptqRFpkso4N7HOxfj4Cr8=", + "bytecode": "H4sIAAAAAAAA/91Y247TQAx1bk3TqtoCH4HEU9q0NPBUIXZX4pFnXkKrSiDxCUjhC+CTaXbH6anrBLodC5WRokxmPPbxGc/FCeixpPsncPXYvSM6LSyzdu/8sjLzqCsPFMy+8QYe8VphDK8AY+R53mOynff4CjhNrgDj4AowpgYYH8pQBGizUCMXvM3kNeSk1F3Y0V/unbl3CP0eF9YsE3Z96i/zxSZT/POIv8iczthGf8n6Exv9OcfC+/qgH31hu3zo3dYHLm9hDB6MdyBz1yFzDzL3QmYCdRL4mA+LeNzHy9KY72IiOCbwk20PbGwvAmGP6DAf2Mf2R2Qa27NA2GM8kh+e6wnL1Ac8si+uT/3gvgT6eH6b/fIlyMnYYhwZHcev57izXueLfxh3y/8x7iLRF9enfpwbd8hJDHJzqBeuznNmeW5a7bNNeaHgR1tNSWtqC3MTQRvzyjwPUV70ZdAX18d2Ru47Bjuoi3EkQn7mvm/cewBjePxUsT8Q9o9wK22Sl0yRzxT5Jg5fufrYPU0MbQG3XGc81vreIdcgcy9txuCT3KNw/Sai7a17N/5+hTFyjfet+yl1nwcad+1ckOl+2nKXKtwNerhLoS9VuOO2d+SPu+gvuZNxlxpzN1S4S3u4G0LfUOGO2z6QP+764k7uy8id0bnZy502l+dy95G6uQvplDts64s7GVtGZ9qCsWYKVg3PjcJP1oGVPOIkgSlRcISij2U/CXyZDZf5c9DbxY3FXXxfygmdxiqXieJ3ILBi0X4Wt2f8/vkGeqWctBkqXIyhHtfHNtauPb+grMrHdf/gi9OfkP7jPoZ+lP/ivkfCN9431k/EuVtVs11R7apltd0uNpWMGQLOxgb2q1VRbuaLzerzsqiK13+0j3cv071olufaWUDkb33KnAVtGN8d32jrTcsn2/s6me4XbT6ZCDySH3kOGd0Py2d0OAeRj1DhpuvOaHwPK7WcmjFpOTXjaNbQd5CTPjLfuC9ivuXRhznbTZz+COwzdrSv5aks155tNljbPZxzV9zDMXdkX0IhL+syF/5JB9zo49F5B+NlTjuGPi3XZ4xarj2uz9M1FLrSC3Qxrqkinz4Rl6ZL/jM45x/AD9a3f34DCvWGJY0fAAA=", + "debug_symbols": "tdfdioMwEAXgd8m1FzP5T19lWYpt0yKIFmsXltJ330SUigjLuchN6Ug+T3SIMC9xiafn7dh01/4hDl8v0fbnemz6LlWvdyVOQ9O2ze24viwo/1ia1j/udZfLx1gPozgo5krE7pL+KZn8tWmjOBh6f1fCMiwkLBQsNCwMLCwsHCz8rtB2EdZtRUCFI1gwLCQsFCw0LAws9nvulw5qslvhYOFhEVDhCRYMCwkLBYvdnhvWszCKtsLAwsLC/SfMVnhYBFQEggXDYrfnLphZePJboWChYWFgYWHhYOFRwbzfQq1o6YjWnyPCye/cn8O82AXl1ounBC6eIIsnqOIJuniCKZ5giye44gm+eEIonSCLn2lZ/EzLsmf6naqfemjqUxvnEeb67M6riWb8vcfNcHMf+nO8PIeYx5zPhJPfBUtTsVZp5/lLoUKlQ36K3AgmqpjM1PqptKn0aQdpF38=", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_0.snap index 18fa57a9681..98518bb3f0b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_0.snap @@ -41,14 +41,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/91YwW7bMAylY9mOEwTtto8YsJPcOGgG7NDD2gK7bIf9gJci3+FPX9SI9QvDtkgjonAJGJJNmnx6okTZGe2l2l1Z7LvY5nQsbHMTW3+eNAl9+UzBnBpvlhCvFcbJCDDmiefdke28uxFwWowAYzkCjJUBxkeZigQNCzWPyRsmL5BT0fPCA93Eto7tBPQJF1ZTi7gp/a99u6mV8SXEv6yjT2fjf83+Cxv/nnPhZz/4x7FwXC56t/3A5S28g4XxDmzunrG5B5t7YbOAPgl8zIdFPu7yZWXM93IhOCYYJ8cubWK3mYhHNMwH6jj+jExzu8lEPMYj+eG5XrBNP+CROtcfj4N1Beh4fsN++RXsZG4xjpoO8zdx3lmv8/Yd8271EfMuFzrXH4/j1LxDThzYXUF/Gfs8Z5Z102qfDfJFwY+xglQ9PQlzk8Mz5pV5nqK90NWgc/1hnFm8dxAHfTGOQtg38f4itiW8w+9fKvFLEf8At/JM8lIr9rViH/LwW+zP4xVy6Be/Q6brrH1pnWm5fkHHe2ApsOLH900inBJHQfpejDq2/SHwGe2h/jP4fY2bpLEb77XalJB//4616fvYaxPzU9ngWX+i/R6m1RpS5gZxFALj1AijVp9lDXagYxyh/RP7cxq+ddE2Fc7r9f4nEuIsSP8B6kCP9r/j/YwGfNye8/Noe90122W37Vbdw0O76eReE2Si8FQa8LSTK47L9T2ngSfmBuNr9Z/tGGttg9XLMwTOKdZkHstE2Mu+PGP8owE3jhHX4EtnhTnotDMUY9TOMPP+NF9T4as6wxfjulTsqzfi0nzJs9gpZ6u/7G93/QdmrhGi5RgAAA==", - "debug_symbols": "zZbRasQgEEX/xWcfdNWM7q+UspjELIKYYJJCCfn3aknbsF1YfJuXMBPu0avIcDfSu3a933wcxplc3zYSxs4ufoy523ZK2uRD8Pfb+Tdh5aMu3/p5srG082LTQq6KS0pc7HMlWOYHH1yu2f5OiRLVhKwm1CtCPRJNNQHVhK4mTC3RsGcEGHUQmukzQf8vLgX7WV3K5lfM9RMxGG4OMRgBZ3HxwhF5uSDyIhB5kYi8KEReGkReAJEXjciLweMFEM1dQDR3Ac3c3XP3YZO3bXBHrBnW2J1SzvI5uYfAM6Wxc/2aXIk+f6mnXLBm1Oh8wjLMhaHS5JqXVwCSgsnb5S2/AA==", + "bytecode": "H4sIAAAAAAAA/91ZwY7TMBCdNE4Tt1ptgY9A4pQ0KS2cEGJ3JY6cuYSueuACEgeuucB307Ce5nUyyVJqCxVLlZ3MeOb5zdjO7Eb00NL9L3Jj4/qY+o113rg+P68VHm3lkYLZN97II95QGCcXgDH2HHdDYeNuLoDT5AIwTi8AYxoA4++WiQRtN2rskrcNXktOSsONF/rT9db1E5B73FiFFX592t/k1dYq6/OIv7TOpgljf8P2kzD2c86Fd01nH9fCfvnSu2k6Lm9gDl6Mt6BzO6BzBzp3QucKxiTwMR8h8nGfL6vAfJdXgmOCdbLvaRjfVST8EXXxQBn7n1HQ3C4i4Y/xSH441les03R4pMw0/XWwLAEZx7c9L5+DnswtxmHpOH89513ofV79w7xb/Y95FwuZafrrODXvkBMDeksYl27MMQt5b4Y6Z9v2TMGPvtqWNnRozE0M75hX5jlDfSGzIDPNsZ+ZezbgB20xjkToF+752vVTmMPzF4r/qfB/hFt5J3mxir5V9Ns8fOHGc/drc+gz4Jb7jOeG/u6Qe5C5lz4NrEmeUbh/E/Hutevb9X6FOXKPj+37BQ3fBxp3h1hQ0PP0wF2qcDcd4S4FWapwx+/ekj/u4j/kTuZdGpi7TOEuHeEuA1mmcMfv3pM/7sbyTp7LyF2ge3OUOy2Wp3L3gYa5m1CfO3w3lncytwLdaRVjtQpWDc+1wo8dwEoecZLAlCg4JkLGuh8FPhuGy/wp2H2MG6++izy3Ch8e+c/l9x76CMzrq0j4I9K/xdn/jPr5G+JbfGzPEPX38CwMns0T6s6QoW9TjA3iyATGeSCMWj3CmLR6hHG0+L658RzmoK4vnOvNw32BOBPS/+FjQI76X9wzcsz9OX8s363rYlfWu3pV399X21qeNW2bAE++/dfrcrNdVtv1p1VZly8f9c9xwrrBYz4t2S/XUzF1cTJNh4n9a/UW6x3O6DBYc1mzYU5hDcRrmQh9OZY13Q/qcOMa8Twaq83mINNqVsao1Yzz5jRbmbCVnmGLcS0U/fQvcWm2ZO17Si37ne3tf78AHCeSSVUeAAA=", + "debug_symbols": "zdfdasJAEAXgd9nrvZjJ/vsqpUjUVQIhkRgLRXz37toEQxoo525vxNH5wkkmLMxDnOLhftk33bm/id3HQ7T9sR6bvkvV4ynFYWjatrnslz8Lyh+WXv23a93l8jbWwyh2ilmK2J3SN1Ulf27aKHaGnp9SWIZFBQsFCw0LAwsLCwcLvym0nYV1axFQ4QgWDIsKFgoWGhYGFtsz9/MENdm1cLDwsAio8AQLhkUFCwWLzZkb1pMwitbCwMLCwv0nzFp4WARUBIIFw2Jz5i6YSXjySyH/Xlwrmq+u9Xvc7DeaXeAwNbug3LI5Z1EFZdEFZTEFZbEFZXEFZfEFZQnlZGGiksJwSWEKOnqZCjp7mYo5fJ+p+qqHpj60cdrFzvfuuFjNxu9rXG1p16E/xtN9iHlfe69q+d1jNpKVSjeZn7cKUofXDee/yEpmzuVvZ5VKnRKkFD8=", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 18fa57a9681..98518bb3f0b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_len/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -41,14 +41,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/91YwW7bMAylY9mOEwTtto8YsJPcOGgG7NDD2gK7bIf9gJci3+FPX9SI9QvDtkgjonAJGJJNmnx6okTZGe2l2l1Z7LvY5nQsbHMTW3+eNAl9+UzBnBpvlhCvFcbJCDDmiefdke28uxFwWowAYzkCjJUBxkeZigQNCzWPyRsmL5BT0fPCA93Eto7tBPQJF1ZTi7gp/a99u6mV8SXEv6yjT2fjf83+Cxv/nnPhZz/4x7FwXC56t/3A5S28g4XxDmzunrG5B5t7YbOAPgl8zIdFPu7yZWXM93IhOCYYJ8cubWK3mYhHNMwH6jj+jExzu8lEPMYj+eG5XrBNP+CROtcfj4N1Beh4fsN++RXsZG4xjpoO8zdx3lmv8/Yd8271EfMuFzrXH4/j1LxDThzYXUF/Gfs8Z5Z102qfDfJFwY+xglQ9PQlzk8Mz5pV5nqK90NWgc/1hnFm8dxAHfTGOQtg38f4itiW8w+9fKvFLEf8At/JM8lIr9rViH/LwW+zP4xVy6Be/Q6brrH1pnWm5fkHHe2ApsOLH900inBJHQfpejDq2/SHwGe2h/jP4fY2bpLEb77XalJB//4616fvYaxPzU9ngWX+i/R6m1RpS5gZxFALj1AijVp9lDXagYxyh/RP7cxq+ddE2Fc7r9f4nEuIsSP8B6kCP9r/j/YwGfNye8/Noe90122W37Vbdw0O76eReE2Si8FQa8LSTK47L9T2ngSfmBuNr9Z/tGGttg9XLMwTOKdZkHstE2Mu+PGP8owE3jhHX4EtnhTnotDMUY9TOMPP+NF9T4as6wxfjulTsqzfi0nzJs9gpZ6u/7G93/QdmrhGi5RgAAA==", - "debug_symbols": "zZbRasQgEEX/xWcfdNWM7q+UspjELIKYYJJCCfn3aknbsF1YfJuXMBPu0avIcDfSu3a933wcxplc3zYSxs4ufoy523ZK2uRD8Pfb+Tdh5aMu3/p5srG082LTQq6KS0pc7HMlWOYHH1yu2f5OiRLVhKwm1CtCPRJNNQHVhK4mTC3RsGcEGHUQmukzQf8vLgX7WV3K5lfM9RMxGG4OMRgBZ3HxwhF5uSDyIhB5kYi8KEReGkReAJEXjciLweMFEM1dQDR3Ac3c3XP3YZO3bXBHrBnW2J1SzvI5uYfAM6Wxc/2aXIk+f6mnXLBm1Oh8wjLMhaHS5JqXVwCSgsnb5S2/AA==", + "bytecode": "H4sIAAAAAAAA/91ZwY7TMBCdNE4Tt1ptgY9A4pQ0KS2cEGJ3JY6cuYSueuACEgeuucB307Ce5nUyyVJqCxVLlZ3MeOb5zdjO7Eb00NL9L3Jj4/qY+o113rg+P68VHm3lkYLZN97II95QGCcXgDH2HHdDYeNuLoDT5AIwTi8AYxoA4++WiQRtN2rskrcNXktOSsONF/rT9db1E5B73FiFFX592t/k1dYq6/OIv7TOpgljf8P2kzD2c86Fd01nH9fCfvnSu2k6Lm9gDl6Mt6BzO6BzBzp3QucKxiTwMR8h8nGfL6vAfJdXgmOCdbLvaRjfVST8EXXxQBn7n1HQ3C4i4Y/xSH441les03R4pMw0/XWwLAEZx7c9L5+DnswtxmHpOH89513ofV79w7xb/Y95FwuZafrrODXvkBMDeksYl27MMQt5b4Y6Z9v2TMGPvtqWNnRozE0M75hX5jlDfSGzIDPNsZ+ZezbgB20xjkToF+752vVTmMPzF4r/qfB/hFt5J3mxir5V9Ns8fOHGc/drc+gz4Jb7jOeG/u6Qe5C5lz4NrEmeUbh/E/Hutevb9X6FOXKPj+37BQ3fBxp3h1hQ0PP0wF2qcDcd4S4FWapwx+/ekj/u4j/kTuZdGpi7TOEuHeEuA1mmcMfv3pM/7sbyTp7LyF2ge3OUOy2Wp3L3gYa5m1CfO3w3lncytwLdaRVjtQpWDc+1wo8dwEoecZLAlCg4JkLGuh8FPhuGy/wp2H2MG6++izy3Ch8e+c/l9x76CMzrq0j4I9K/xdn/jPr5G+JbfGzPEPX38CwMns0T6s6QoW9TjA3iyATGeSCMWj3CmLR6hHG0+L658RzmoK4vnOvNw32BOBPS/+FjQI76X9wzcsz9OX8s363rYlfWu3pV399X21qeNW2bAE++/dfrcrNdVtv1p1VZly8f9c9xwrrBYz4t2S/XUzF1cTJNh4n9a/UW6x3O6DBYc1mzYU5hDcRrmQh9OZY13Q/qcOMa8Twaq83mINNqVsao1Yzz5jRbmbCVnmGLcS0U/fQvcWm2ZO17Si37ne3tf78AHCeSSVUeAAA=", + "debug_symbols": "zdfdasJAEAXgd9nrvZjJ/vsqpUjUVQIhkRgLRXz37toEQxoo525vxNH5wkkmLMxDnOLhftk33bm/id3HQ7T9sR6bvkvV4ynFYWjatrnslz8Lyh+WXv23a93l8jbWwyh2ilmK2J3SN1Ulf27aKHaGnp9SWIZFBQsFCw0LAwsLCwcLvym0nYV1axFQ4QgWDIsKFgoWGhYGFtsz9/MENdm1cLDwsAio8AQLhkUFCwWLzZkb1pMwitbCwMLCwv0nzFp4WARUBIIFw2Jz5i6YSXjySyH/Xlwrmq+u9Xvc7DeaXeAwNbug3LI5Z1EFZdEFZTEFZbEFZXEFZfEFZQnlZGGiksJwSWEKOnqZCjp7mYo5fJ+p+qqHpj60cdrFzvfuuFjNxu9rXG1p16E/xtN9iHlfe69q+d1jNpKVSjeZn7cKUofXDee/yEpmzuVvZ5VKnRKkFD8=", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index a8ff945d9ad..1d0f8c83276 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -32,14 +32,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+2a+07bMBTG3TZpm3RdO9j9ysbGrkAKAboLF2n8PWnaC6wa4jny6OMTPnB66lZsxJM+aZYiJ7Fzzs/2sePLabjzcHh2Nfx94uOmj/F+xU0HyXvk4+J6YVSjrCIWY4OAsUnA2CJgTAgYUwLGNgFjh4CxS8CYETDmBIw9AsYbBIx9AsabBIwDAsYhAeMtAsYlAsZlAsbbBIx3CBjvEjDeI2C8T8D4gIDxIQHjIwLGxwSMTwgYnxIwPquR8V/sRa4Q1OlzAsYXBIyrBIwvCRhfETCuETC+JmB8Q8D4loDxHQHjewLGDwSM6wSMGwSMmwSMBQHjiIBxi4Bxm4CxJGDcIWDcJWDcI2AcEzB+JGD8RMD4mYDxCwHjPgHjAQHjYQTGKUCBhiMeHN3gSAZHLThCwdEIjjxwlIEjChw94EgBRwU4AuCgfXh24aAYB7E46MRBIg7qcBCGgyYc5OCgBAcR2OjHRjo2qrERjI3WlbMLm4PYfMPmFjaPsDmDzQ9sLmDxjsUxFp9Y3GHxhMUJJv+YXKNUmBxi8oXJDSYP+Dnj54efCwZvDI4YfNC50XlgnGj8Qzc/SEP+9HHm46ZKr9ExcJQZvXXKHxfjMguUr0b+7UzJrF9+WYj8JA5/0fFyjqtp+c7oFY447VSWccu5VfRN2Zwqi+hO4+geNYw+Z+rYGf25i2lT5w7SWp/w2PqRPt+XPNUlT8OkJdVsOSQtVWnSvhhfV1W+kG0hSNvEGH/Gxe5/u3NcdmfTkmq2HH9qd9a2JN+Gut/093HHwXEZ094RlgP8WhdCp3IXQeqjpd5JvUo9d3V+k5aptKSa1pP750Tp0bKEIzX51/3zwMdt9Y18Pwzobxv9U9yBd7ZeskD+LJAfc8g1f9/zF2zoQL5xUf/pO2LXup9JkLS20t0waR2VZutAh5Z5tv3sWMm1+SyPHnOELdTXEI58XFwzNEwZbXs4oz81+fcNZ6w52pIpv9bVc5dz9KSqX//e+LyeEKRvp2627bX+1OT/6p/zOeU4+kvO073J6HR7cjrZmZyclL8mtp4QmqqedB/su+l6tFxWTmuB7NB/3Ln6/ptDN2tf6QLdddqeyG9Hkb91Ib8Th38UGl+krlCmb+q9ThMbnzc2pSb/DyXzu78fuNnxS/fbQaDtEsOj168tIw+hafLngfx6jd0ybF2Vll9BVnOB7l4gf75At+bS3+rv0gBnZvR2AzxpQFaoH3WNrEVzU22nV7Wr3yQlAP+5OwAA", - "debug_symbols": "ldXbioUgFAbgd/HaCw/pyv0qw7DpYBshKjoMDNG7jw4NRRNs/ptI8eNXl7BWVvtyeT1D1/QTe3ysrO2rYg59F0frxlk5hrYNr+d5mon0yfLf9dNQdGk4zcU4s4eUGWe+q+OfEtE3ofXsYcT2yVnmUGEELCQsFCw0LDJYGFhYWBAs4JobuOYWrrmFMwjOIPhdEfyu6P52Hck/4nJ5mETy+205Z3eihLIXovGU2+erhDhSpL4QgxOLE7onko7jmwvJceJg4sT7s5zrwv+tJdL7UsovFXR40Z3CiQbJFgdfxRiKsvV792iWrjo1k/l78Je+Mox95etl9KnDHM0lZWvDMxM3ItNdWsUtxYgY8wM=", + "bytecode": "H4sIAAAAAAAA/+2aaW8TMRCGnWQ36SaEBMp9FgrlbLtJNk04ekj0O9+QEJ9CqwqJP5GfTl/V004mbih0jfRKWFrtYe/M4/H4dsWdhN3jq+KfE3+v+ju+r7jZIGn3/D2/XOiVKCuPxVghYKwSMNYIGBMCxpSAsU7A2CBgXCJgzAgYmwSMLQLGKwSMbQLGqwSMHQLGLgHjNQLG6wSMywSMNwgYbxIw3iJgvE3AeIeA8S4B4z0CxvsEjA8IGB8SMD4iYHxcIuO/WItcIbDpEwLGpwSMqwSMzwgYnxMwrhEwviBgfEnA+IqA8TUB4xsCxrcEjOsEjBsEjJsEjDkBY4+AsU/AOCBgLAgYhwSMWwSMIwLGMQHjOwLG9wSMHwgYPxIwbhMw7hAw7kZgnAEUaBzEw0E3HCTDQS0chMJBIxzkwUEZHETBQQ8cpMBBBRwEwEZ79/jCRjE2YrHRiY1EbNRhIwwbTdjIwUYJNiKw0I+FdCxUYyEYC60rxxcWB7H4hsUtLB5hcQaLH1hcwOQdk2NMPjG5w+QJkxMM/jG4Rq4wOMTgC4MbDB7QOaPzQ+eCxhuNIxofVG5UHjgnCn/XnR+kIH/6e+bvVRVf4sHAXmb0lil/nI+LLJC/EvkHmZJZvvwiF/lJHP684eXsT2flO6NXOOKUU1HEzWc/b5u8OZUX0Z3G0d2rGH3O2NgZ/U0X06dODkhrfcJj7SN1vi1ppmc8FROXTOfzIXGpipPyRfu6qtKFfAtByiZG+zPOt/77nePyOxuXTOfz8ad+Z31L0m2o503/HLcdHBcx/R1hOcCvdSE0pu40iD1q6pvYVey8pNObuEzFJdNZPU3/nig9WpZwpCb9un/v+Htd/SP/dwP660b/DHfgm7VLFkifBdJjDLnmn1v+gg/tyD8uap8+FL/W9UyCxNWV7oqJa6g4awMdaubd1rN9Jdemszy6zRG2UF1D2PP3/JKhYvJoy8MZ/alJv204Y43Rrpv8a10tdzZGT6bl6x+NT+yEIHU7dfNlr/WnJv0n/948Jx97f8l5NJr0jgaTo8lwcnhYHEysnRCqyk66DrbdrB0tl5VTWyA71I87V16/2XXz/iW6OgHddnyh63qZfim6pL2QdtzqTJW9bPsiz86d1S/59tnfUW4/TP5CYwj9Tcqm6+bbkNTYJ874Kz+duzWiyO+fyl+Kw98Ltc1iK5Tvl3PKJHXz4zpth9Sk/6ZkfvXPHTdfbrrNC/l9Ynj03L9m5CFUTfpmIL1en6gZNu3jzQvIqi7Q3Qqkby7Qrbn0v/q/NMCZGb31AE8akBVqg+wYYtG4XvvpRf2q7P5iMhqMD/rFwej7cDAZbP22v/gFeDhGtHU9AAA=", + "debug_symbols": "ndVbaoUwEAbgveQ5D4kmmcStlHLwEg+CqHgpFHHvjWLRWkv5z4s4IR+TYQZmZoXPpuejasp2YMnbzOo2T8eqbUI0L5xlfVXX1fNxPmZi/Si73R+6tFnDYUz7kSVSKs58U4S/SARfVrVniRbLO2fKoUILWEhYRLCIYaFgoWFhYEGwgHuu4Z4buOcGzkFwDoLniuC5ovu5ciS/ibPyMBtRONE4MTghnFicOJhYgRO8fPvHw5zZSSQi85M4CWdxtyMWCXFkkfGFxDhRONH3RNJRvr4QgxPCif2/lnNf+K+7RPF+ley1g3jTpRAvGAmaJQQfaV+lWe33vV5OTX5a8+Nn5y8bv+vb3BdT79fdf6z9dX5izZXeXhICE3FDa7C+SgrFpTAhY8j6BQ==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_0.snap index 5a8ca3d099b..575594981b0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_0.snap @@ -32,14 +32,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+2b207bQBCG18FO4qQUCj0faWnpEXDAQGhpQW0foDftfVSU5/CjNz/ZIZPJElHFW+mXupK1jnc9882evIdJ4sbhdHQl/j71ccPHeL7hpoPkPfNxsVjo1SiriMWYEDA2CBiXCBhTAsaMgLFJwNgiYGwTMOYEjB0Cxi4B4w0CxmUCxpsEjCsEjKsEjLcIGNcIGNcJGG8TMN4hYLxLwHiPgPE+AeMDAsaHBIyPCBgfEzA+IWB8SsD4rEbGf7EXuUFQps8JGF8QMG4SML4kYHxFwLhFwPiagPENAeNbAsZ3BIzvCRg/EDBuEzDuEDDuEjAWBIw9AsY9AsZ9AsaSgPGAgPGQgPGIgLFPwHhMwPiRgPETAeMJAeNnAsYvBIynERinAAUajnhwdIMjGRy14AgFRyM48sBRBo4ocPSAIwUcFeAIgIP21dGFg2IcxOKgEweJOKjDQRgOmnCQg4MSHERgox8b6dioxkYwNlo3Rhc2B7H5hs0tbB5hcwabH9hcwOIdi2MsPrG4w+IJixNM/jG5hlWYHGLyhckNJg/4OOPjh48LBm8Mjhh80LnRedA4Ufmn7uogFfnLx7mPGyq9RsfAXm701im/X/TLPGBfjfz7uZJZv/yyEPlpHP6i5eV8r6blO6NXOOLUU1nGtXOvWDa2OWWL6M7i6O4lRp8zZeyM/o6L2abGDtJan/DY8pE+vyx5qglPYtLSatYOSctUmtQvxtdNlS/UthCkbmKMP/3i8H+7c1ztzqal1awdf9vubNuSfDvqftffxx0H+2XM9o6wHuDXuhBalbsMUh5L6pmUq5RzW+c3ablKS6tpPR3/O1V6tCzhyEz+bf97xcdN9Y68vxrQ3zT6p7gDz2y55IH8eSA/5pBb/r7rL7ShH/6ZtLt08qpLroi1Lv1MdIXGEIQzHxeLhQuHTTs+ZnN019lWRX4zivy9S/mtOPw9O/brsoJNx+q5Tsvc7LioyyEz+b8pmSf+fsXN9nM7l7Pt+6weu4vEsKfGTmf0Zyb/V8MZa+67ZuzXurqqDLNAutii1xdLbtpGZ8oYVyeQPzf2OaW7rdI615DVmKO7G8jfmaNbc+l39XtZgDM3etsBniwgKzTWtI2seXMH3Zev2/eENa0m+epqY0f9cV+4YK0m5aXnOs7oz0z+n/63rieJF/nz2/Bo0BvuD4aDg8H5efl7YPsCgtQX6v4P3SRjBIE6AAA=", - "debug_symbols": "tZXRioUgEIbfxesu1DS1V1mWg5UdBLGwWljivPvq0lK4Nyvt3Igj//8po+PsaDDd9nxYP04Lat925KZer3byMdpfFeqCdc4+H9dlhNPA5Ld+mbVP4bLqsKKWEFYh44c4ozj6R+sManmc/l36XiGmAOEcQ8IJJFzchStBfrRKklOc6M3tvCjVHFqKaZPRyxKTHLTYURc7WLGDFztgb+1uHVKMz1sjdUZXkHSBQenkNp2I8z3zjE5B6TUonf1r3q+V/lsrRH1Ihcz+BMEhfxzRgNIFHP0Vgw8drO6cORrxuPn+0pfXz9lkLXoOU2+GLZjUrM8+nR5SzSvG45lJqjeJK8njFnGbLw==", + "bytecode": "H4sIAAAAAAAA/+2baU/bQBCGN8FOcFKaFHqftLT0BJzEEJceUIlP7R/ol1ZyQfwO//Tywk4ymSyUCrvSK3Ulax3veOfZa7zHpOHOwt7J1fD3kY+bPsbzVTcbRHbfx+nVwqDCvNK6GBsEjE0CxgUCxoiAMSZgbBEwtgkYFwkYEwLGDgFjl4DxGgHjEgHjdQLGHgFjn4DxBgHjMgHjCgHjTQLGWwSMtwkY7xAw3iVgvEfAeJ+A8QEB40MCxkcEjI8JGJ9UyPgv9iJXCer0KQHjMwLGNQLG5wSMLwgY1wkYXxIwviJgfE3A+IaA8S0B4zsCxg0Cxk0Cxi0CxpSAcUDAOCRgHBEwZgSM2wSMOwSMYwLGnIDxPQHjLgHjBwLGjwSMnwgYPxMw7tXAOAMo0HDEg6MbHMngqAVHKDgawZEHjjJwRIGjBxwp4KgARwActPdPLhwU4yAWB504SMRBHQ7CcNCEgxwclOAgAhv92EjHRjU2grHRunpyYXMQm2/Y3MLmETZnsPmBzQUs3rE4xuITizssnrA4weQfk2uUCpNDTL4wucHkAR9nfPzwcYHxhnGE8cHgxuBB50Tj77nzgzRk4ePEx02VXqFj4CAxeqvMP0/zLAmUr0L+UaLyrD7/LJX8o3r407bP56Cczd8ZvcJRTztlWb3lHKZLpmxOlUV0x/XoHjSMPmfq2Bn9HVdnnzpzkNb6hMfWj4z5JZEppzwNkxaV8+WQtFilSfvCvq4puVDfQpC2qcP+5OnO/37nuPqdTYvK+XL8bb+zfUvkNtX9lr+v1w7mWZ39HWElwK91IbRLNwlSHwvqmdSr1POiljdpiUqLylk9Hf87Unp0XsIRG/kN/7vn45Z6R97vB/S3jP4Z7sAzWy9JQD4JyGMOue7vu/5CH/run0m/i6avusY5sdaln4mukA1B2PdxerVw6rBp7aPo6gV0W9vWUmlV9mPRJfMX6UNWZ6zqS8vre+fl9LNdH6PdfpryheyXfiZt03fzYy029VOP7U8n88Z2LfkPJ/kv1sM/sN9NXVdo3y/ntEns5r8puh5iI/9N5Xng73tuvt3sPNjahv1qyj3p18IemXI6oz828l8NZ13rhmVTfq2r68K2wZZFr80W3GwZnaljXJ2AfGLK55RubQc6l8ireYHubkC+c4FuzaXf1e/FAc7E6G0FeOJAXiE73TJ5XTTv0mP5smNPWKNyKldVHxvnZ2PhlLWc1peeJzqjPzbyP/xv3U4SX+WPg8fjYnA8Ko6L7eLoKDss7FhAkPbq1qC/GI/yw2F2OP61PSpGO3/U/xtV22ooPTwAAA==", + "debug_symbols": "tZbbaoQwEIbfJde5yPngq5SyeIhLQFSiForsuzdZLFp7s8GdG8nI/38JM5MwK2pctdxvvm+HCRUfK+qGupz90MdofWBUBd91/n47/kYkfYR56qex7FM4zWWYUUGpwMj1TVwxEv2t7xwqZFy+Lv3ESFhAuCSQcAoJZ1fhVtNfrTV0Fz/pHJQuQOkSlK5A6RqUbkDpFpKuQKuqrmfGqk3LCFMnel5mokOTbAfNdrBsB892gFZNX72LjJC9apSf6BqUbkDp9jKd6r2f5V+6IaB0Ckpnb8378ab/12rNN6k2pzfBcMgXxwhQuoSjP2LwVQZfVp3bBs926evDHDp/j+40ko5hqF2zBJeG030uTSnmEgsZz0xTzxqDLU9BajErsFVxv7jnDw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 5a8ca3d099b..575594981b0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_neq/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -32,14 +32,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+2b207bQBCG18FO4qQUCj0faWnpEXDAQGhpQW0foDftfVSU5/CjNz/ZIZPJElHFW+mXupK1jnc9882evIdJ4sbhdHQl/j71ccPHeL7hpoPkPfNxsVjo1SiriMWYEDA2CBiXCBhTAsaMgLFJwNgiYGwTMOYEjB0Cxi4B4w0CxmUCxpsEjCsEjKsEjLcIGNcIGNcJGG8TMN4hYLxLwHiPgPE+AeMDAsaHBIyPCBgfEzA+IWB8SsD4rEbGf7EXuUFQps8JGF8QMG4SML4kYHxFwLhFwPiagPENAeNbAsZ3BIzvCRg/EDBuEzDuEDDuEjAWBIw9AsY9AsZ9AsaSgPGAgPGQgPGIgLFPwHhMwPiRgPETAeMJAeNnAsYvBIynERinAAUajnhwdIMjGRy14AgFRyM48sBRBo4ocPSAIwUcFeAIgIP21dGFg2IcxOKgEweJOKjDQRgOmnCQg4MSHERgox8b6dioxkYwNlo3Rhc2B7H5hs0tbB5hcwabH9hcwOIdi2MsPrG4w+IJixNM/jG5hlWYHGLyhckNJg/4OOPjh48LBm8Mjhh80LnRedA4Ufmn7uogFfnLx7mPGyq9RsfAXm701im/X/TLPGBfjfz7uZJZv/yyEPlpHP6i5eV8r6blO6NXOOLUU1nGtXOvWDa2OWWL6M7i6O4lRp8zZeyM/o6L2abGDtJan/DY8pE+vyx5qglPYtLSatYOSctUmtQvxtdNlS/UthCkbmKMP/3i8H+7c1ztzqal1awdf9vubNuSfDvqftffxx0H+2XM9o6wHuDXuhBalbsMUh5L6pmUq5RzW+c3ablKS6tpPR3/O1V6tCzhyEz+bf97xcdN9Y68vxrQ3zT6p7gDz2y55IH8eSA/5pBb/r7rL7ShH/6ZtLt08qpLroi1Lv1MdIXGEIQzHxeLhQuHTTs+ZnN019lWRX4zivy9S/mtOPw9O/brsoJNx+q5Tsvc7LioyyEz+b8pmSf+fsXN9nM7l7Pt+6weu4vEsKfGTmf0Zyb/V8MZa+67ZuzXurqqDLNAutii1xdLbtpGZ8oYVyeQPzf2OaW7rdI615DVmKO7G8jfmaNbc+l39XtZgDM3etsBniwgKzTWtI2seXMH3Zev2/eENa0m+epqY0f9cV+4YK0m5aXnOs7oz0z+n/63rieJF/nz2/Bo0BvuD4aDg8H5efl7YPsCgtQX6v4P3SRjBIE6AAA=", - "debug_symbols": "tZXRioUgEIbfxesu1DS1V1mWg5UdBLGwWljivPvq0lK4Nyvt3Igj//8po+PsaDDd9nxYP04Lat925KZer3byMdpfFeqCdc4+H9dlhNPA5Ld+mbVP4bLqsKKWEFYh44c4ozj6R+sManmc/l36XiGmAOEcQ8IJJFzchStBfrRKklOc6M3tvCjVHFqKaZPRyxKTHLTYURc7WLGDFztgb+1uHVKMz1sjdUZXkHSBQenkNp2I8z3zjE5B6TUonf1r3q+V/lsrRH1Ihcz+BMEhfxzRgNIFHP0Vgw8drO6cORrxuPn+0pfXz9lkLXoOU2+GLZjUrM8+nR5SzSvG45lJqjeJK8njFnGbLw==", + "bytecode": "H4sIAAAAAAAA/+2baU/bQBCGN8FOcFKaFHqftLT0BJzEEJceUIlP7R/ol1ZyQfwO//Tywk4ymSyUCrvSK3Ulax3veOfZa7zHpOHOwt7J1fD3kY+bPsbzVTcbRHbfx+nVwqDCvNK6GBsEjE0CxgUCxoiAMSZgbBEwtgkYFwkYEwLGDgFjl4DxGgHjEgHjdQLGHgFjn4DxBgHjMgHjCgHjTQLGWwSMtwkY7xAw3iVgvEfAeJ+A8QEB40MCxkcEjI8JGJ9UyPgv9iJXCer0KQHjMwLGNQLG5wSMLwgY1wkYXxIwviJgfE3A+IaA8S0B4zsCxg0Cxk0Cxi0CxpSAcUDAOCRgHBEwZgSM2wSMOwSMYwLGnIDxPQHjLgHjBwLGjwSMnwgYPxMw7tXAOAMo0HDEg6MbHMngqAVHKDgawZEHjjJwRIGjBxwp4KgARwActPdPLhwU4yAWB504SMRBHQ7CcNCEgxwclOAgAhv92EjHRjU2grHRunpyYXMQm2/Y3MLmETZnsPmBzQUs3rE4xuITizssnrA4weQfk2uUCpNDTL4wucHkAR9nfPzwcYHxhnGE8cHgxuBB50Tj77nzgzRk4ePEx02VXqFj4CAxeqvMP0/zLAmUr0L+UaLyrD7/LJX8o3r407bP56Cczd8ZvcJRTztlWb3lHKZLpmxOlUV0x/XoHjSMPmfq2Bn9HVdnnzpzkNb6hMfWj4z5JZEppzwNkxaV8+WQtFilSfvCvq4puVDfQpC2qcP+5OnO/37nuPqdTYvK+XL8bb+zfUvkNtX9lr+v1w7mWZ39HWElwK91IbRLNwlSHwvqmdSr1POiljdpiUqLylk9Hf87Unp0XsIRG/kN/7vn45Z6R97vB/S3jP4Z7sAzWy9JQD4JyGMOue7vu/5CH/run0m/i6avusY5sdaln4mukA1B2PdxerVw6rBp7aPo6gV0W9vWUmlV9mPRJfMX6UNWZ6zqS8vre+fl9LNdH6PdfpryheyXfiZt03fzYy029VOP7U8n88Z2LfkPJ/kv1sM/sN9NXVdo3y/ntEns5r8puh5iI/9N5Xng73tuvt3sPNjahv1qyj3p18IemXI6oz828l8NZ13rhmVTfq2r68K2wZZFr80W3GwZnaljXJ2AfGLK55RubQc6l8ireYHubkC+c4FuzaXf1e/FAc7E6G0FeOJAXiE73TJ5XTTv0mP5smNPWKNyKldVHxvnZ2PhlLWc1peeJzqjPzbyP/xv3U4SX+WPg8fjYnA8Ko6L7eLoKDss7FhAkPbq1qC/GI/yw2F2OP61PSpGO3/U/xtV22ooPTwAAA==", + "debug_symbols": "tZbbaoQwEIbfJde5yPngq5SyeIhLQFSiForsuzdZLFp7s8GdG8nI/38JM5MwK2pctdxvvm+HCRUfK+qGupz90MdofWBUBd91/n47/kYkfYR56qex7FM4zWWYUUGpwMj1TVwxEv2t7xwqZFy+Lv3ESFhAuCSQcAoJZ1fhVtNfrTV0Fz/pHJQuQOkSlK5A6RqUbkDpFpKuQKuqrmfGqk3LCFMnel5mokOTbAfNdrBsB892gFZNX72LjJC9apSf6BqUbkDp9jKd6r2f5V+6IaB0Ckpnb8378ab/12rNN6k2pzfBcMgXxwhQuoSjP2LwVQZfVp3bBs926evDHDp/j+40ko5hqF2zBJeG030uTSnmEgsZz0xTzxqDLU9BajErsFVxv7jnDw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 656b2e2101c..b16048ef955 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -19,8 +19,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1YzY7TMBB2mrptGpat4BG4wC1t2m25VaK8AG8QuuoJCYkD4oKUAxK8Aa9LvZppv36dhN1tDJcdKXJij7/58YzHTuKOlEjbdxeQgvyWNpO2B+Pp/lnLd3EZTTOS2yX+qpgvMsO+DvUvM8FM4uAXih/J/8VQcN7XR3y0ReWO9k8O78/dMT5i2a/rF9P+ly02a+y8q92BOpJ7iPtN99izXNboleBdkY0O3iP7t0xInhN81+DzsYuaT9OE5Kk+7J8e+S41dJ3QWCCNlcQYS42+NqxNfaoD6pw0tM6d+9eSg+vNsYDzO/T9XO2wCpSOeUMvHRvAGOrPlNI32hTy4g3gMp9S7o75369PcdbSX1xAy1VRqLxU8L071x3le+J/Ld9j0l99vH6knrtlNd2V1a5aVLe38231gvAD9cBPuNdcu+Z8uXan6498GnuextaPtIFJ40ljqO+O+ejJb2ofx5y+O5mDfVNpgy8+wxyO99Toa9oDkC9ztu/WHfknM2zsBvtmrnmmccvrHqhfR7GrDOvxRbB0HxmCjR7khmcEY6nBz/tmZvCPgEfXa0L86GtrTx6SztbeHzkm7l27Vf7YRT1LTNvyCf3DtbttPXC9uXZbsTAy5FhYG8HKDB069MlbtZHvOWg/1geuqTmMPbSmqk2h/QW4zMf6YLyqbtY9ItBa2uIymnqS/YHkxrpfcO1EWU+5faCouc11vOvcHsTxyerKkO3IfqwnXDMw7x+a22rTJbmtunHu7aT9n7mnZ9GEZP8LvTjW8Sxq3ct6hm8xT9i/n6S1zqJsL/Y5134WVb5QM7q+c1TLcrWdzbfLj4uyKm/+eue4lvdBfRzH82WgoXyrf5lf8Tzxf1Xe/fNN3jX2vSEv8P1s4Usa2jsMo69fn/Zl9Tl/Wp/zq+xxfa6jjuUw5knOM/lGfyGW6uGJ/4d865qMYI7OnxjyRyT/RG+jj/ew3ODPDf6wPt8VT1q0ves6dieT8LGPddPY4bt05P8xh5rr3akfm/ZF6/7O/2sGBlavBQvn41zk9S1yI5+TZm12WeekNrvu6yPGSgwsR/O8s9cD37GeoK8YK8ThH9UIbhhZGgAA", - "debug_symbols": "tdjdiuJAEIbhe8lxDrr6t3puZVkGf+IQCFGiLizivW/iOurEyPAG5kTs+D0dk6p0oE/FuloeP97rdrPdF2+/TkWzXS0O9bbtR6dzWSy7umnqj/fHw4UZPiRc8vvdoh2G+8OiOxRvwZRF1a77L9LrTd1Uw7Hz77KQCPMJ5hXmM8tbA/MC8xbmHcx7mIf1tbC+drq+es2rGecV5jPLOwPzAvMW5h3Lezi/p/N7mA8wH2Ee9o+H/eNh/wTYP2Gyf8SnK5CnJyZYLBwWHouARcQiYaFYZCqiwWK65vq5SIo+CYuFw8JjEbCIWCQsFItMRZqueXI3YcdCsLBYOCw8FgGLiEXCQrHIVCiuueKa62TNrclXYWX8/lCHhcciYBGxSFgoFpmKbLCYrnm+i/Faki0WDguPRcAiYpGwUCwyFWIMJ8KJ5cRx4jkJnEROEifKCa++e7EQmfhpjLg7+m90hsnc+BfLkaSbsWFsZIax3/+3+GDKp2y6veSSxvHsbsaV+xkmzDBxxt1KM4z+6B1+1fb32e0Xc+4HfxZdvVg21XXLb3NsVw87gIe/u2q0GbjrtqtqfeyqYVvwviM49KiIL8WFyyPYD10ovRkGcvlNShHXn7M/7z8=", + "bytecode": "H4sIAAAAAAAA/9VYS47TQBBtJ3a+DIngBKzZOONkkmUkwhFYsTIZZQ8LxAbJCyTYcQSuSjpTFb88V4xD3DOakqJ2d5dffbo+7USupEjG2F1BCvJHxqGMHdjv7n9rmafX0WxIctvEX6XzxdCwr0X9s6FgRmHwU8UP5P+0LzjvixIfbVG5g/1vDM8vXRkfoezX8wtp/+samzV23hXuSC3JPcb9pn3s27Gc0VvBuyEbHTwH9m8WkTwn+O6Mz0cuaD7NIpKn+rB/OuS7rqHrlPY8aaxExl7XWKvD2hSnOqDO0ZnRuap/LTl43so3cVVbOU5i2GszD1VWInixK/3FMtUe5MdnJ8+49kZGnxczsu/SM+LYRP90w/hncWPYqKR7PbIL9/qwh2fP1KU52uR9Nwdc5lMau7J2xsUpzlrW0ytouXqIl4O+gp+4qu4oPyH+VOYj0l/jbf2feu6W+WyX5bt8kd/fz7f5K8L31AE/tS0/X2ar7e18u/y0yPLs7p/ysU9Y+Y+9MGT+Kz7GdzvYd3ONVT17zltPcRHErsz794tgcZ56SkAu5qlzZS1Cfq7bA4Mfc13Pa0r86GurJ/RIZ6v3BK55je8OujZyQe8ys7p+gf7hu4PVv6a054nvDrEhJzbkWFgbwQqct0vuL0i6hzHHfQm//y7tS2qTx/8FuMzH+mAMqW7Wd4yntYzpdTRLSPYHkhvq+4brP8qauPN5Hzi3U45xvO9Z/afjqnGM8Z7Q2kcZrfuedfe38nfqqvcqzu26uhgo5xrXRZX/WHUxbuhX607KfQr38I5/rkf2DTlTY29TPIxDA/sp6yL322vqotp0aV3EeFXdOK8+y/iUdcvfWyfy3CtKO/B+56kvc60tzN8BG5H/q/Luf99c6aMDb1GV5/l+1vBFZ8YDhrEWF6drw6LK3y2q/Cp7VFR11L0x7OHd09MLmaO/EEv1SIj/h8z1TAbwjr4/NeQPSP6J3sYa58HY4B8b/P58viuejGh727XwIJPwcY1109hp8j32SD0m+P8xv2V8pv/HHHtez9DV0mdi+If/r7H6WqcGC9/Hd5E3qZEbuAfe1tmFPkoa2NXUR4wVGViO3kucfR74rHPrPLg3/QXFfuvOlRsAAA==", + "debug_symbols": "tdjbiuJAFIXhd8l1LmrXcVe/yjA0HmITEJWoA4P47pM4niZGhr+gb8QK60u0lla0TtWymR+/PtvNaruvPn6cqvV2MTu0200/Op3rat6163X79fl8uDLDg4RLfr+bbYbh/jDrDtVHMHXVbJb9E+n1ql03w7Hzz7qSCPMJ5hXmM8tbA/MC8xbmHcx7mIf9Wtivhf1a2K+F/TrYr4P9Otivg/062K+b7leveTXjfIT5BPMK85nlvYF5YfngYH6yL/HpCuSlsRCwiFgkLBSLTEU0WAgWFguHxXTnevuSir6IgEXEImGhWGQqksFCsLBYTHee3F3YsfBYBCwiFgkLxSJToQYLwcJigTtX3LnizhV3rrhzxZ0r7jzjzjPuPOPO82Tn1uSrsDK+n2ePRcAiYpGwUCwyFWIMJ8LJdO35QV7+FBrHieckcBI5SZwoJxkTMZwIJ7x992bGktwWivz8i+Cv0QKTufGmwEiBsQXGFRhfYN6smCbeOjXixiYWmFRg3qybku7GhrHJ3ATz/9cWn0z9kk33+17SOD678HcebIFxBcYXzFYoMPFbZ/jdqvw4u/3HnPvBr1nXzubr5roruzpuFk+btIffu2a0X7vrtotmeeyaYef2sWk7fHZEfC0uXNbufuhd7fWyXg6DXAfpr9hf9Q8=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_false_inliner_0.snap index 2947fe6b3b8..b4a954c08de 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_false_inliner_0.snap @@ -19,8 +19,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/8VXwW6CQBAdhBXRmpr23m9AQfDQg4de2kub9AtQ43f46ZV0N0yeTzRht52ELOzAvHmzM7NLJJ1EdkxkgDgjOztmdhwpfXy+tvY5HybLDHB92t/kZZkRfh79LzJrMwpjP3f2A8U/T62dt1NnX3NxuJPzNVP3D9LlRyj+bv1C8n/u4TyzXD+ucBXxWwca26Pt1VzFTRRPzSkJE98iAjxRfmidw5+Cr777TQR4zh+Mj1sHFztDfF0QXQT3huAYgsNsOd2j8BprJfD65cgjUTwSwntEeGi+BuZe7NjW2RfYw5zBOYxdTPwJV7NVibkhBHes5v+jrhz+VC7XJURdjcGfa/nuYpcSXxdEh3WVEpyU4DBbThd4b6nmchkT6eEfg25CdBGxFcMz7tvfyi6+h/7oODvfWJxa2doxHyZLA9gV4AbaC/In4KOxWM81f+QX1pLuuazHjeSy1+icMzD3akcfPZftfYF7X421o4XVjgFdRnT31pXjNKSunG+Y9+92zCRor6Z577Bm0sUnOfnHrze/+d1KfOrigLHW+Abe/7TPU8IjGeDnsW6Wx6I5NuvmcCj3DcapFf1v4Bu/qYvNflXu6926aIrqJj77Nwl9bmbn2b7+qc+I2CvYWWHUY0t/r7/V75oe3MBn5VUfL8yRW7zujRHaYmc/ge+MXO/duA+w9dC22jz8AdjtV9yFEgAA", - "debug_symbols": "tdjfioJAFAbwd5lrL+bM/+lVliWsLATRMFtYonffMazMhO0g302kfN9PUw/JXMSu2JwP67LeNyex+rqIqtnmXdnUaetyzcSmLauqPKzHu4XsP0jf8qdjXvebpy5vO7GyMhNFvUtfKLX3ZVX0+67fmSDDzFtm3jHznpkPzHzk5ZVk5omZV8w88/6q+fsbhnyQ43z2abCHLQp2KNij4ICCIwjWEgUTClaLYDJ+SNLbiGiNow2Otjja4WiPowOOjjDaSBxNOHrhNHp9p4Oa0hpHGxxtcbTD0R5HBxwdYbSVOJpwNG4aLW4a7bJpVDIOSUXTlwVrcbTD0R5HBxwdYbSTOJpw9MJpjE96+rfrNI42ONriaIejPY4OODrCaC9xNOFo3DSG2ZFRUrp7RZJ+dm4Vy684fsXPV8g/KspOKoFfif+fmBtV3i+uf7wd+OBe8SjZvzoSv6L4Fc2+UNHwKxZ5bWefqPSkP3H1UrmmjZ+8LfNNVQwL0PtzvR2tR3e/x2KyNH1sm22xO7dFv0g9Wp/ub6w3mY/pTKi/ZUFmQaVjpOP8AQ==", + "bytecode": "H4sIAAAAAAAA/8VXS07rQBAcf4bg5D0RvbfnDE5scFaIBReADUisTFAOwAlydLCYVkpFxYA8AyNFHbvtrq6erplx5g4jC7Z0E4YFeQm2CjYHf/H2uw7X9bSxqgg3ZvxN3baV4Bcx/6YKMbM08WuLn6j+9SzEudkf4iMXwz19+y3g/x936I9U/G3+UvL/P8J5EbjeHeHqXFwdIHbE2Ou/UDcHPJFTmaa+TUZ4DvJAn+HPKdfY601GeJYP18fmwWrnRa5L4cvovxc4XuCoWOY7c1pjw0g8fzXzKIFHKXjnggfy9XTvPNhBZw8Uj3uG73HtCpFPOs1ettwbTuCewP3f0JXhz93HeUmhqxPK51i/W+1mItel8LGuZgJnJnBUrO/oKtW+w/VCXeWCd+4+9hPW2tO9OtjUukrU3x33Bw7znRI2+irhy0Ssgq6R0xD/EeLyc5wP9pHlVh3J4TrYetpYecK+ItxE81P/Iz6IpXTlfygvXh9QV4jJusL1AXvO072bYGPoSp0bKpFPxPpsWDs4lHY8+ebC91VdGacpurLcuO9vg61c0n1O9r1hLSC/ch8fv9u89/cwiv2hDlxrxPf0/H24xnk0W07Ic9f1q13T7/qL/vm53fZcp2Hgd1Vs/L5rNtt1u+2eLpq+ufwUH7/rbL0a2+d++3xdAAfu77Hz9VOwar3Cvhn7Blo69+k5KfX3mjpXqnzORH143Vdnx3wkFr6P7+KzfgQ38Zq0HuOl1qkxXl+tEcfKRCxH73l3fB/mPVTNB8YaNPwKEEkUCv0UAAA=", + "debug_symbols": "tdndiuJAEAXgd8l1Lrqqf6p6XmVZhqhxCIQoURcW8d03EXWy0WWpyLkRW+p8iSnLBPpcbOrV6euz6ba7Q/Hx41y0u3V1bHbdsDpfymLVN23bfH1OPy7c+EL+Wn/YV924PByr/lh8RFcWdbcZ3tCQ3jZtPX52+VkWFIz10VifjPVirFdjfbbVszPWk7GejfXG/rKxv2zsLxv7y8b+srG/bOyvN/bXG/vrX/dXb/XqpvXlUyEFuVXSM+1xdMDREUcnHC04WnF0htHB4WjC0W9Oo97nnPSJ9jg64OiIoxOOFhytODrD6PjmNIp/0DynCUczjvY4OuDoiKMTjhYcrTg6w+iEm8aEm8b03jSyy7dKJjenPY4OODri6ISjBUcrjs4wWt6cxvxNz2+7QjiacbTH0QFHRxydcLTgaMXRGUYrbhrzy5GhLHS/5+Xpg/M14u2RYI9EeyTZI2KPqD2SzRFyL3vOzqV7Lx35eYYWZHhBxr/OkDwyHOeZsCAT/39uaZJ5/unL49lNNM31tOCby4KMLshk+9UityBDyCtM//hzyd86/5W5DItfVd9Uq7a+7dpsT916solz/L2vZ/s5+363rjenvh53diabOuPlUC5VrqcyLrTMbjjGcJw/", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 656b2e2101c..b16048ef955 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -19,8 +19,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1YzY7TMBB2mrptGpat4BG4wC1t2m25VaK8AG8QuuoJCYkD4oKUAxK8Aa9LvZppv36dhN1tDJcdKXJij7/58YzHTuKOlEjbdxeQgvyWNpO2B+Pp/lnLd3EZTTOS2yX+qpgvMsO+DvUvM8FM4uAXih/J/8VQcN7XR3y0ReWO9k8O78/dMT5i2a/rF9P+ly02a+y8q92BOpJ7iPtN99izXNboleBdkY0O3iP7t0xInhN81+DzsYuaT9OE5Kk+7J8e+S41dJ3QWCCNlcQYS42+NqxNfaoD6pw0tM6d+9eSg+vNsYDzO/T9XO2wCpSOeUMvHRvAGOrPlNI32hTy4g3gMp9S7o75369PcdbSX1xAy1VRqLxU8L071x3le+J/Ld9j0l99vH6knrtlNd2V1a5aVLe38231gvAD9cBPuNdcu+Z8uXan6498GnuextaPtIFJ40ljqO+O+ejJb2ofx5y+O5mDfVNpgy8+wxyO99Toa9oDkC9ztu/WHfknM2zsBvtmrnmmccvrHqhfR7GrDOvxRbB0HxmCjR7khmcEY6nBz/tmZvCPgEfXa0L86GtrTx6SztbeHzkm7l27Vf7YRT1LTNvyCf3DtbttPXC9uXZbsTAy5FhYG8HKDB069MlbtZHvOWg/1geuqTmMPbSmqk2h/QW4zMf6YLyqbtY9ItBa2uIymnqS/YHkxrpfcO1EWU+5faCouc11vOvcHsTxyerKkO3IfqwnXDMw7x+a22rTJbmtunHu7aT9n7mnZ9GEZP8LvTjW8Sxq3ct6hm8xT9i/n6S1zqJsL/Y5134WVb5QM7q+c1TLcrWdzbfLj4uyKm/+eue4lvdBfRzH82WgoXyrf5lf8Tzxf1Xe/fNN3jX2vSEv8P1s4Usa2jsMo69fn/Zl9Tl/Wp/zq+xxfa6jjuUw5knOM/lGfyGW6uGJ/4d865qMYI7OnxjyRyT/RG+jj/ew3ODPDf6wPt8VT1q0ves6dieT8LGPddPY4bt05P8xh5rr3akfm/ZF6/7O/2sGBlavBQvn41zk9S1yI5+TZm12WeekNrvu6yPGSgwsR/O8s9cD37GeoK8YK8ThH9UIbhhZGgAA", - "debug_symbols": "tdjdiuJAEIbhe8lxDrr6t3puZVkGf+IQCFGiLizivW/iOurEyPAG5kTs+D0dk6p0oE/FuloeP97rdrPdF2+/TkWzXS0O9bbtR6dzWSy7umnqj/fHw4UZPiRc8vvdoh2G+8OiOxRvwZRF1a77L9LrTd1Uw7Hz77KQCPMJ5hXmM8tbA/MC8xbmHcx7mIf1tbC+drq+es2rGecV5jPLOwPzAvMW5h3Lezi/p/N7mA8wH2Ee9o+H/eNh/wTYP2Gyf8SnK5CnJyZYLBwWHouARcQiYaFYZCqiwWK65vq5SIo+CYuFw8JjEbCIWCQsFItMRZqueXI3YcdCsLBYOCw8FgGLiEXCQrHIVCiuueKa62TNrclXYWX8/lCHhcciYBGxSFgoFpmKbLCYrnm+i/Faki0WDguPRcAiYpGwUCwyFWIMJ8KJ5cRx4jkJnEROEifKCa++e7EQmfhpjLg7+m90hsnc+BfLkaSbsWFsZIax3/+3+GDKp2y6veSSxvHsbsaV+xkmzDBxxt1KM4z+6B1+1fb32e0Xc+4HfxZdvVg21XXLb3NsVw87gIe/u2q0GbjrtqtqfeyqYVvwviM49KiIL8WFyyPYD10ovRkGcvlNShHXn7M/7z8=", + "bytecode": "H4sIAAAAAAAA/9VYS47TQBBtJ3a+DIngBKzZOONkkmUkwhFYsTIZZQ8LxAbJCyTYcQSuSjpTFb88V4xD3DOakqJ2d5dffbo+7USupEjG2F1BCvJHxqGMHdjv7n9rmafX0WxIctvEX6XzxdCwr0X9s6FgRmHwU8UP5P+0LzjvixIfbVG5g/1vDM8vXRkfoezX8wtp/+samzV23hXuSC3JPcb9pn3s27Gc0VvBuyEbHTwH9m8WkTwn+O6Mz0cuaD7NIpKn+rB/OuS7rqHrlPY8aaxExl7XWKvD2hSnOqDO0ZnRuap/LTl43so3cVVbOU5i2GszD1VWInixK/3FMtUe5MdnJ8+49kZGnxczsu/SM+LYRP90w/hncWPYqKR7PbIL9/qwh2fP1KU52uR9Nwdc5lMau7J2xsUpzlrW0ytouXqIl4O+gp+4qu4oPyH+VOYj0l/jbf2feu6W+WyX5bt8kd/fz7f5K8L31AE/tS0/X2ar7e18u/y0yPLs7p/ysU9Y+Y+9MGT+Kz7GdzvYd3ONVT17zltPcRHErsz794tgcZ56SkAu5qlzZS1Cfq7bA4Mfc13Pa0r86GurJ/RIZ6v3BK55je8OujZyQe8ys7p+gf7hu4PVv6a054nvDrEhJzbkWFgbwQqct0vuL0i6hzHHfQm//y7tS2qTx/8FuMzH+mAMqW7Wd4yntYzpdTRLSPYHkhvq+4brP8qauPN5Hzi3U45xvO9Z/afjqnGM8Z7Q2kcZrfuedfe38nfqqvcqzu26uhgo5xrXRZX/WHUxbuhX607KfQr38I5/rkf2DTlTY29TPIxDA/sp6yL322vqotp0aV3EeFXdOK8+y/iUdcvfWyfy3CtKO/B+56kvc60tzN8BG5H/q/Luf99c6aMDb1GV5/l+1vBFZ8YDhrEWF6drw6LK3y2q/Cp7VFR11L0x7OHd09MLmaO/EEv1SIj/h8z1TAbwjr4/NeQPSP6J3sYa58HY4B8b/P58viuejGh727XwIJPwcY1109hp8j32SD0m+P8xv2V8pv/HHHtez9DV0mdi+If/r7H6WqcGC9/Hd5E3qZEbuAfe1tmFPkoa2NXUR4wVGViO3kucfR74rHPrPLg3/QXFfuvOlRsAAA==", + "debug_symbols": "tdjbiuJAFIXhd8l1LmrXcVe/yjA0HmITEJWoA4P47pM4niZGhr+gb8QK60u0lla0TtWymR+/PtvNaruvPn6cqvV2MTu0200/Op3rat6163X79fl8uDLDg4RLfr+bbYbh/jDrDtVHMHXVbJb9E+n1ql03w7Hzz7qSCPMJ5hXmM8tbA/MC8xbmHcx7mIf9Wtivhf1a2K+F/TrYr4P9Otivg/062K+b7leveTXjfIT5BPMK85nlvYF5YfngYH6yL/HpCuSlsRCwiFgkLBSLTEU0WAgWFguHxXTnevuSir6IgEXEImGhWGQqksFCsLBYTHee3F3YsfBYBCwiFgkLxSJToQYLwcJigTtX3LnizhV3rrhzxZ0r7jzjzjPuPOPO82Tn1uSrsDK+n2ePRcAiYpGwUCwyFWIMJ8LJdO35QV7+FBrHieckcBI5SZwoJxkTMZwIJ7x992bGktwWivz8i+Cv0QKTufGmwEiBsQXGFRhfYN6smCbeOjXixiYWmFRg3qybku7GhrHJ3ATz/9cWn0z9kk33+17SOD678HcebIFxBcYXzFYoMPFbZ/jdqvw4u/3HnPvBr1nXzubr5roruzpuFk+btIffu2a0X7vrtotmeeyaYef2sWk7fHZEfC0uXNbufuhd7fWyXg6DXAfpr9hf9Q8=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_true_inliner_0.snap index 2947fe6b3b8..b4a954c08de 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_rc_regression_7842/execute__tests__force_brillig_true_inliner_0.snap @@ -19,8 +19,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/8VXwW6CQBAdhBXRmpr23m9AQfDQg4de2kub9AtQ43f46ZV0N0yeTzRht52ELOzAvHmzM7NLJJ1EdkxkgDgjOztmdhwpfXy+tvY5HybLDHB92t/kZZkRfh79LzJrMwpjP3f2A8U/T62dt1NnX3NxuJPzNVP3D9LlRyj+bv1C8n/u4TyzXD+ucBXxWwca26Pt1VzFTRRPzSkJE98iAjxRfmidw5+Cr777TQR4zh+Mj1sHFztDfF0QXQT3huAYgsNsOd2j8BprJfD65cgjUTwSwntEeGi+BuZe7NjW2RfYw5zBOYxdTPwJV7NVibkhBHes5v+jrhz+VC7XJURdjcGfa/nuYpcSXxdEh3WVEpyU4DBbThd4b6nmchkT6eEfg25CdBGxFcMz7tvfyi6+h/7oODvfWJxa2doxHyZLA9gV4AbaC/In4KOxWM81f+QX1pLuuazHjeSy1+icMzD3akcfPZftfYF7X421o4XVjgFdRnT31pXjNKSunG+Y9+92zCRor6Z577Bm0sUnOfnHrze/+d1KfOrigLHW+Abe/7TPU8IjGeDnsW6Wx6I5NuvmcCj3DcapFf1v4Bu/qYvNflXu6926aIrqJj77Nwl9bmbn2b7+qc+I2CvYWWHUY0t/r7/V75oe3MBn5VUfL8yRW7zujRHaYmc/ge+MXO/duA+w9dC22jz8AdjtV9yFEgAA", - "debug_symbols": "tdjfioJAFAbwd5lrL+bM/+lVliWsLATRMFtYonffMazMhO0g302kfN9PUw/JXMSu2JwP67LeNyex+rqIqtnmXdnUaetyzcSmLauqPKzHu4XsP0jf8qdjXvebpy5vO7GyMhNFvUtfKLX3ZVX0+67fmSDDzFtm3jHznpkPzHzk5ZVk5omZV8w88/6q+fsbhnyQ43z2abCHLQp2KNij4ICCIwjWEgUTClaLYDJ+SNLbiGiNow2Otjja4WiPowOOjjDaSBxNOHrhNHp9p4Oa0hpHGxxtcbTD0R5HBxwdYbSVOJpwNG4aLW4a7bJpVDIOSUXTlwVrcbTD0R5HBxwdYbSTOJpw9MJpjE96+rfrNI42ONriaIejPY4OODrCaC9xNOFo3DSG2ZFRUrp7RZJ+dm4Vy684fsXPV8g/KspOKoFfif+fmBtV3i+uf7wd+OBe8SjZvzoSv6L4Fc2+UNHwKxZ5bWefqPSkP3H1UrmmjZ+8LfNNVQwL0PtzvR2tR3e/x2KyNH1sm22xO7dFv0g9Wp/ub6w3mY/pTKi/ZUFmQaVjpOP8AQ==", + "bytecode": "H4sIAAAAAAAA/8VXS07rQBAcf4bg5D0RvbfnDE5scFaIBReADUisTFAOwAlydLCYVkpFxYA8AyNFHbvtrq6erplx5g4jC7Z0E4YFeQm2CjYHf/H2uw7X9bSxqgg3ZvxN3baV4Bcx/6YKMbM08WuLn6j+9SzEudkf4iMXwz19+y3g/x936I9U/G3+UvL/P8J5EbjeHeHqXFwdIHbE2Ou/UDcHPJFTmaa+TUZ4DvJAn+HPKdfY601GeJYP18fmwWrnRa5L4cvovxc4XuCoWOY7c1pjw0g8fzXzKIFHKXjnggfy9XTvPNhBZw8Uj3uG73HtCpFPOs1ettwbTuCewP3f0JXhz93HeUmhqxPK51i/W+1mItel8LGuZgJnJnBUrO/oKtW+w/VCXeWCd+4+9hPW2tO9OtjUukrU3x33Bw7znRI2+irhy0Ssgq6R0xD/EeLyc5wP9pHlVh3J4TrYetpYecK+ItxE81P/Iz6IpXTlfygvXh9QV4jJusL1AXvO072bYGPoSp0bKpFPxPpsWDs4lHY8+ebC91VdGacpurLcuO9vg61c0n1O9r1hLSC/ch8fv9u89/cwiv2hDlxrxPf0/H24xnk0W07Ic9f1q13T7/qL/vm53fZcp2Hgd1Vs/L5rNtt1u+2eLpq+ufwUH7/rbL0a2+d++3xdAAfu77Hz9VOwar3Cvhn7Blo69+k5KfX3mjpXqnzORH143Vdnx3wkFr6P7+KzfgQ38Zq0HuOl1qkxXl+tEcfKRCxH73l3fB/mPVTNB8YaNPwKEEkUCv0UAAA=", + "debug_symbols": "tdndiuJAEAXgd8l1Lrqqf6p6XmVZhqhxCIQoURcW8d03EXWy0WWpyLkRW+p8iSnLBPpcbOrV6euz6ba7Q/Hx41y0u3V1bHbdsDpfymLVN23bfH1OPy7c+EL+Wn/YV924PByr/lh8RFcWdbcZ3tCQ3jZtPX52+VkWFIz10VifjPVirFdjfbbVszPWk7GejfXG/rKxv2zsLxv7y8b+srG/bOyvN/bXG/vrX/dXb/XqpvXlUyEFuVXSM+1xdMDREUcnHC04WnF0htHB4WjC0W9Oo97nnPSJ9jg64OiIoxOOFhytODrD6PjmNIp/0DynCUczjvY4OuDoiKMTjhYcrTg6w+iEm8aEm8b03jSyy7dKJjenPY4OODri6ISjBUcrjs4wWt6cxvxNz2+7QjiacbTH0QFHRxydcLTgaMXRGUYrbhrzy5GhLHS/5+Xpg/M14u2RYI9EeyTZI2KPqD2SzRFyL3vOzqV7Lx35eYYWZHhBxr/OkDwyHOeZsCAT/39uaZJ5/unL49lNNM31tOCby4KMLshk+9UityBDyCtM//hzyd86/5W5DItfVd9Uq7a+7dpsT916solz/L2vZ/s5+363rjenvh53diabOuPlUC5VrqcyLrTMbjjGcJw/", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 54b0c7b2904..9aede848a39 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -53,8 +53,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "2": { "source": "use crate::cmp::Eq;\n\nunconstrained fn __get_shuffle_indices(lhs: [T; N], rhs: [T; N]) -> [u32; N]\nwhere\n T: Eq,\n{\n let mut shuffle_indices: [u32; N] = [0; N];\n\n let mut shuffle_mask: [bool; N] = [false; N];\n for i in 0..N {\n let mut found = false;\n for j in 0..N {\n if ((shuffle_mask[j] == false) & (!found)) {\n if (lhs[i] == rhs[j]) {\n found = true;\n shuffle_indices[i] = j;\n shuffle_mask[j] = true;\n }\n }\n if (found) {\n continue;\n }\n }\n assert(found == true, \"check_shuffle, lhs and rhs arrays do not contain equivalent values\");\n }\n\n shuffle_indices\n}\n\nunconstrained fn __get_index(indices: [u32; N], idx: u32) -> u32 {\n let mut result = 0;\n for i in 0..N {\n if (indices[i] == idx) {\n result = i;\n break;\n }\n }\n result\n}\n\npub(crate) fn check_shuffle(lhs: [T; N], rhs: [T; N])\nwhere\n T: Eq,\n{\n // Safety: shuffle_indices is ensured to be a permutation of 0..N, and then\n // shuffle_indices is ensured to map lhs to rhs: assert(lhs[i] == rhs[shuffle_indices[i]]), for all i in 0..N\n unsafe {\n let shuffle_indices = __get_shuffle_indices(lhs, rhs);\n\n for i in 0..N {\n let idx = __get_index(shuffle_indices, i);\n assert_eq(shuffle_indices[idx], i);\n }\n for i in 0..N {\n let idx = shuffle_indices[i];\n let expected = rhs[idx];\n let result = lhs[i];\n assert_eq(expected, result);\n }\n }\n}\n\nmod test {\n use crate::cmp::Eq;\n use super::check_shuffle;\n\n struct CompoundStruct {\n a: bool,\n b: Field,\n c: u64,\n }\n impl Eq for CompoundStruct {\n fn eq(self, other: Self) -> bool {\n (self.a == other.a) & (self.b == other.b) & (self.c == other.c)\n }\n }\n\n #[test]\n fn test_shuffle() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [2, 0, 3, 1, 4];\n check_shuffle(lhs, rhs);\n }\n\n #[test]\n fn test_shuffle_identity() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [0, 1, 2, 3, 4];\n check_shuffle(lhs, rhs);\n }\n\n #[test(should_fail_with = \"check_shuffle, lhs and rhs arrays do not contain equivalent values\")]\n fn test_shuffle_fail() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [0, 1, 2, 3, 5];\n check_shuffle(lhs, rhs);\n }\n\n #[test(should_fail_with = \"check_shuffle, lhs and rhs arrays do not contain equivalent values\")]\n fn test_shuffle_duplicates() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [0, 1, 2, 3, 3];\n check_shuffle(lhs, rhs);\n }\n\n #[test]\n fn test_shuffle_compound_struct() {\n let lhs: [CompoundStruct; 5] = [\n CompoundStruct { a: false, b: 0, c: 12345 },\n CompoundStruct { a: false, b: -100, c: 54321 },\n CompoundStruct { a: true, b: 5, c: 0xffffffffffffffff },\n CompoundStruct { a: true, b: 9814, c: 0xeeffee0011001133 },\n CompoundStruct { a: false, b: 0x155, c: 0 },\n ];\n let rhs: [CompoundStruct; 5] = [\n CompoundStruct { a: false, b: 0x155, c: 0 },\n CompoundStruct { a: false, b: 0, c: 12345 },\n CompoundStruct { a: false, b: -100, c: 54321 },\n CompoundStruct { a: true, b: 9814, c: 0xeeffee0011001133 },\n CompoundStruct { a: true, b: 5, c: 0xffffffffffffffff },\n ];\n check_shuffle(lhs, rhs);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_0.snap index 0bb1efe0db7..9dd184059f3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_0.snap @@ -53,8 +53,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1cTYxjRxHuZ/t5bM+PPbuzmw27y85mk93sBsR7/hl7CKARIdldCSQOnOBAPD9GCggUIXF2Dhw4ceAMQhESAikSB34kOCAhwp0bioTEAXHhhhSkSDnE7e0afy7Xe7bX1V6/rFua6fe6qquqq6qr+r3u58A8Ki8N/h6662Dwl3e1LSXWFghtOddWcH1yjBYWonvk6mixEivSinzJGGRAxpwHGbEo0W4Egm/lne+FdJMIdNe2LScImVNWah5oNaKDZvOsXT+LG3E3qh8ed1pRs3V80Ik7cavTOq13Go2zTrPTPjw+bEeHcbNxFvdah42eI1bQkiv2aKABbdRr0dUbaLHAAQLWZpFKTKhCRgzyuLTOerZEcVFRrg1FY84zWRaVO69o5yxOFvL9sv2HE4PSLbaVzfTJsqoGWXSylBTHWFZ2lEDZBkVnZ+XMVNcMOBU9uYYBpwB6lHQaLVaGwbYC9HX8stdDmTd9C6/taFuKivAxbqvQLUWjYRZf1nJQIwiS3KHJXobbdvUOOQhls20zmeEsku/loC+DLJrhthXl2lE05jKXg2pLuIHkWZwsVVfX7D+cGFUzOVksku/loC+DLDpZqopjrCk7inaW3nb2114OagacXT25lrIctGPfBfo6fjm+HLzgW3htR7uoqAgf47YKvahoNAxy9Eqb5F6/wn76XmEvw+6K71e86bSQARlDo2t3kpHsvzf4uzT4u2zMaPkrAs2jbJUzyw0ge2b1jXQpAzJe9iAjFi3auLJ4hpwu6blMW0nPKNByC4NTo6+kmC5QF1dc/SwphJ6bbMM+EyDvUWGPuTypu+VJfMXoLXWe9WRI7aXoFT1bRBiZFZ3uvCTpIFqsqEw63zJ+woOMKy/oOt3LMq7Tve6zF5Wr9t8y0/1Vk710f83V10khlO5twz4TQDvdo8IWTffXjF4avW6yke6vmXW6v2pWX8ZPepDRu6AarwfX6X5SxnW619uLwXR/w/5bZrq/YbKX7vddfZMUQun+pvGf7lFhi6b7faMXqW6abKT7fbNO9zfM6sv4nAcZvQu66M7lMiOvRppfduS95ernSSEUeW3DPhNAO/LuGb3Ie8voRbTnTTYi7y2jG3kDo+505yVJB9FiJRNr6xc8yDgsOWWHWtVBLzOKazwILTuK33b1HVIIRXHbsM8E0I7il4xeFL9t9Jz5jslGFL9t1lE8C28fXvQg47BoR3HFk16qg15mFNd4VbTsKH7X1fdIIRTFbcM+E0A7il82elH8rtFz5nsmG1H8rllH8csZkPElDzIOi3YUz2Vg0D7P02o8y/iSU+9b6Edn633JqfeRTu/MykYfJOWZzFJGx4+Zaq7effN7D9/6+zfeR7xrKTB6O5UztZ2v//Xb7yLsXgosToG1U2CfT4G9kgCjXyX50NXlc7xHhRL5kbuPFitxGehq0+9EzeOyGS/K8jfKZnzTVZl+k+gX/NAf/jiHLV/qj9M3jG+e4fE+2O9VwHk1Aec1wHmN4ZThWnvMA5/wrdPGtpnciKexEO/QD+9mwPgZM25Pw/hXjFf/jQPGj+Th+qH4Qp9k5/sjeQIGK/Qnx0GwEGBkXxu7nwM8ybcQhvH/fn9E49NA7zNmXL6cML5AGJ/PeDHw7c4yfHs4xv6IPrddoT/OG2HT7FNmNH3px5O/Ny4myE/Xtmz0zXnJM32ijkhnJcRnsDLACv1xPhV3T28qOC2SI2T4n3L39MV3EfpQ/5rAv8j4j8kttKGOOK280Eb49idHXnDX9mc4KMe/0h/R08yRlof10fuOXtVM2pXHd1/5msdTsq3Ek3TG8w3G4pC1HbjajvcrbHwYr9NieM1Mj7FSbpwld0l80uzgYw0xKHXPefyA9FQ0k4VgG4w3wvB5heYFwcqCvghWARifn1ikQ4akC8v7q0CX41HBH47g48B5XeiPw49ce7RAaXdGn61RTA3N5LiQf8jwv+zuUWdUL/Kdaq/djXuNbq/b6p6eNk+6Fxh9W3KgJ23+3Xajc1JvnrSPW41u42Aqf4yNPD6RTpNyIo8/X3O19fufumtpLiwaM4qAw9dmfF4duftosdIg3ZQE3aDMG0we/oysJE9M9KXfHosWLER7048uz2Xf0pe9Tv4WCj5i/eab0G7/zte2YE+eFwiO+D8Dmsfuuir0DxgM53uR4RUFWRB/g8lC+N9ytfXNfzKa1McI47Mlx/C3BHycUxU2HhzDFpOP5sp3UuQrzSlfWcAvAU6eyYeyU1/pOYh4+sxbg9K0sv4L5OA6CPuzj1fSj2Q/jEFkvxrDR11J+hn7QdEl6ydM0c+8/i3pU1qL1cyk7ooMhvmLz3meQ23BZ5wKwBH/LVdbXj9OoBkYOT5sMvwi0MoLOFwGwv+hq60t/u+uy2Zyviva/YRsjf5LhWDbbHwI2wFYjsGqAAsZrAYwfAbjRVozF0FPs6yZJZtK757SbBoCLQmf6HG/+gnI+oG7XrXnIG7TkjAu6TmIPz+hPua16bzPQbjWtbaivIP+GLBr8sekNQfP84T/NsjG82jNjI8LZbCFx8FdAR/nAslTNZNzaJfJR3b6ZYp8u3PKd0HA3wUcnudR9guM1g6Tl4+nxuCE/ztXWxu/MwNNlKEK4+L8doSx1abAdwTaJoUf0ttiuLWEvshHirnUz+rjDyl4FQGP0w+Ffnz9SLjvAb0/uuuqSc4J0hzka21pDiJ+0hz8s6tnnYMYO+adgztsPNIcTKOVxnva/OLzX5pf0jrx/N22qwsA871ORB2E/dnHK+nnooCPcYVsU2P4qCtJP7tPUD/bKfqZ13clfUr5o2YmdVdlMMyPfD5vC3xwnvL10fm+RwI+Pu8j/j9cjesj6X3TNtB/bwZZQ0FW6R0F0qV3FNrvBk9aB8cnzVY3Ohse+qxPezco7SGhL9tC+1C4T4X4uB5F/H/DeP9jRnoZ4vYn+Vm891PwgoR6SENoK/TH26T9K9zXI3ziXelPykiwTYDhPLNly92jvpAWyREy/P+5e7IJ7sVR/5rAv8T4j8kttPF9g00Bf1PAt/b5L9FzNY5d+1zCkCejj21cNvIdH+/c653OwWH9OGq2T096p83Gst/5D6Z0+6TbjuPDZnzWjFvT+P/NXWf8fNhpxs+HHTyN58MI5z7g3E/AeQA4DxJwHgLOQ4azPov22GV9Fg1geNYpAjzJt2zxfA6qvfa7bPld2hm7x/U7aT/e4r0M158DHOyDY5DWCJ7POXazes4xYvrxNL+763OOI3ySg59z/Ky7X+Vzjg13vWlGZ21+QX2M37WftHfKY7invbyZYzjxrxivOeU8hheZPFw/fI9pQ5C1JsDQhghDPhsCn2XR8n0GC89OcDvacuTqaMHC7YI8iDc/C6LEe2afJv4VM2kPHz4tnZ+R/EPaN6W+0lkHfp5BOjdRFvgsi5Z0dmZRn0bf4ef4fJ0rXPY5QW0/5M8KGHdsjHjdjNrtH70Dn3Z+MmT4Z0DzxF1LZ5ApLtl+0pmSRX0Ez0txX8S9CNTBG9AeGPnMIfblZyKk/WCUlZ/jIfrfBxm+666rAj++70qwN11t58Wv2ViR/w7weZ3xwb2XUoKcPwA+7wB+YMb3umc5NyDtY+G+6SaTT9rfzgmy496O1HeL9a0m9OU+gPJLe/xpPpB2lovo912N51TSdCv5/qy65WcyJN2m0cql8J62V87tmrZXTv0KZtIe2Ddk+D9yNepSigtlk6wHik9Peu/8NyAH94UQ+E6zuy3z2or8pGYm7bPJYLjOJJ6SXkswniHf/gj2tOiV6w71WmYwXOvgnjn5dVqM4zHmbej/c3ct5UTME2/Mibfq3xP9yt1/3L4nOm0fd+rd4/ZZ++AwPjjpLZv/Kp1Z+C3hDv5+766nnVl4NwUvSKiHNIS2Qn+8bdXPLPzF3a/ymYU/ET1X49i1n9eHPBl9bOOyke9Yv37grjO+Z3+4/k2X9KK1Z5830/fsESdpzx5xkvbsLXy91/7YZb3XDjDcb7sOeJJvIQyfHck3LY0Xgd5dxpefKbEl479hEn8c9vbuuPtV3tvbd9e4t/dF10Y+WRh1nXutx/fiPcWeqGYm4yrfz/G0T9jw/G5dfDeN38/VoR1hSe+m8ftsxG8BzSNGU9qfkexM7fN+34x+UU7gjb8zI30Xz7/j+gKM52VGMy0noC1n1b3kf3nAO2Lj5c+VtmTh90boNzae9PsB/h23p32hehl4eqAf4R6nYWNBvlwHBaFfkHCfY3UaLm/Htm0BRjTpuyGUl8ZRZvUloOvjmW/PD33RVpfgeo+NE/V9pCQD0aM5G5rJwt/7nK8ZmHyBvnwxl0VaE1Ahn9mDNtLnRx8QcWmHnQAA", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "2": { "source": "use crate::cmp::Eq;\n\nunconstrained fn __get_shuffle_indices(lhs: [T; N], rhs: [T; N]) -> [u32; N]\nwhere\n T: Eq,\n{\n let mut shuffle_indices: [u32; N] = [0; N];\n\n let mut shuffle_mask: [bool; N] = [false; N];\n for i in 0..N {\n let mut found = false;\n for j in 0..N {\n if ((shuffle_mask[j] == false) & (!found)) {\n if (lhs[i] == rhs[j]) {\n found = true;\n shuffle_indices[i] = j;\n shuffle_mask[j] = true;\n }\n }\n if (found) {\n continue;\n }\n }\n assert(found == true, \"check_shuffle, lhs and rhs arrays do not contain equivalent values\");\n }\n\n shuffle_indices\n}\n\nunconstrained fn __get_index(indices: [u32; N], idx: u32) -> u32 {\n let mut result = 0;\n for i in 0..N {\n if (indices[i] == idx) {\n result = i;\n break;\n }\n }\n result\n}\n\npub(crate) fn check_shuffle(lhs: [T; N], rhs: [T; N])\nwhere\n T: Eq,\n{\n // Safety: shuffle_indices is ensured to be a permutation of 0..N, and then\n // shuffle_indices is ensured to map lhs to rhs: assert(lhs[i] == rhs[shuffle_indices[i]]), for all i in 0..N\n unsafe {\n let shuffle_indices = __get_shuffle_indices(lhs, rhs);\n\n for i in 0..N {\n let idx = __get_index(shuffle_indices, i);\n assert_eq(shuffle_indices[idx], i);\n }\n for i in 0..N {\n let idx = shuffle_indices[i];\n let expected = rhs[idx];\n let result = lhs[i];\n assert_eq(expected, result);\n }\n }\n}\n\nmod test {\n use crate::cmp::Eq;\n use super::check_shuffle;\n\n struct CompoundStruct {\n a: bool,\n b: Field,\n c: u64,\n }\n impl Eq for CompoundStruct {\n fn eq(self, other: Self) -> bool {\n (self.a == other.a) & (self.b == other.b) & (self.c == other.c)\n }\n }\n\n #[test]\n fn test_shuffle() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [2, 0, 3, 1, 4];\n check_shuffle(lhs, rhs);\n }\n\n #[test]\n fn test_shuffle_identity() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [0, 1, 2, 3, 4];\n check_shuffle(lhs, rhs);\n }\n\n #[test(should_fail_with = \"check_shuffle, lhs and rhs arrays do not contain equivalent values\")]\n fn test_shuffle_fail() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [0, 1, 2, 3, 5];\n check_shuffle(lhs, rhs);\n }\n\n #[test(should_fail_with = \"check_shuffle, lhs and rhs arrays do not contain equivalent values\")]\n fn test_shuffle_duplicates() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [0, 1, 2, 3, 3];\n check_shuffle(lhs, rhs);\n }\n\n #[test]\n fn test_shuffle_compound_struct() {\n let lhs: [CompoundStruct; 5] = [\n CompoundStruct { a: false, b: 0, c: 12345 },\n CompoundStruct { a: false, b: -100, c: 54321 },\n CompoundStruct { a: true, b: 5, c: 0xffffffffffffffff },\n CompoundStruct { a: true, b: 9814, c: 0xeeffee0011001133 },\n CompoundStruct { a: false, b: 0x155, c: 0 },\n ];\n let rhs: [CompoundStruct; 5] = [\n CompoundStruct { a: false, b: 0x155, c: 0 },\n CompoundStruct { a: false, b: 0, c: 12345 },\n CompoundStruct { a: false, b: -100, c: 54321 },\n CompoundStruct { a: true, b: 9814, c: 0xeeffee0011001133 },\n CompoundStruct { a: true, b: 5, c: 0xffffffffffffffff },\n ];\n check_shuffle(lhs, rhs);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 0bb1efe0db7..9dd184059f3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -53,8 +53,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "3ZzRbtQ6EIbfZa9z4RmPxzavcoRQgYIqVS0q5UhHiHc/SandrdeZahQGOblBXerv7zhj+0+c8f48fb7++OPrh5u7L/ffT+/++Xm6vf909Xhzfzd/+nnyT//1/dvV3fLp++PVw+PpHbnpdH33ef4h/ppOX25ur0/vgvs1XTRkH/m5KfuUa2PfaRtDjM9tI4M/a/t+OtEYYYS/F0YkKGHEGMS27HMJmcl5sW3IUGIIGdNLwEv3+Njdi8fuXjp29/IBuhdT7V52r7sH7uD9g4P3Dw/ePxqgf0scI3jwEscIZrnEcXBXg4PbGhzB14T+4RF8TerfwX0ND+5r6A/ePzp4/wbxYRzBh5c4RvDLJY6/6GsZscSRmcS24KGMO/D0spbjErN3O4wZBo25zm8gbGPGHcbsdxgz7TDmsMOYecyYKWCNOWITc9xBzKGJOe1wbIzqg0LMNKoPSjHv0Adphz5Ig/qgtNbRoD4orXW0Qx+kQX1QjHlQHxRj3qEP0g59MAzqg9JaFwb1QWmtC4P6YPBUYg6hvc6D+qAY86A+KMY8qA+KMQ/qgyFBjflM93fMg/ogU9EF5vY6D+qD4tgY1AelmHlQHxRjHtQHxZhH9UFh3eBBfVBaN3iHPsg79EEe1QelmAf1QTHmUX1QWjcG9UFp3YhdH+QqzucxL+27HpRLH8FRC3QNAKC8/gaPr4j5w8eHm9vbm68fXlXtu+Wf/i4BoKsDCeHsKq8/pItI/xlZRrqXBVyuV97lF4TWnxBlxOsR0iNBj7AeiXok6ZF+9h1XZM7la6R/ZygjoEdQj3g9Qnok6BHWI1GPJD2iz37qppLBl5UZfQN0LzHXrSFO4Qy4XJ2TKy1TaAZvCnbSbCcdt0mjLy3Rp0Y6mUnnjdcaXRlTCK6R3hi1D8V3PLfS2UwanDPUBkNtNNT2G7VzWUd8zq02GWoHQ2021I6G2hunJUEZJ4TUamc7bXCG2hvnJblQtAFabTTU9obaZKgdDLXZUDsaam+dl74+cFO7fkO200ZnqA2G2mio7Q21yVA7GGr352UuGyIRfEt0R20MlYgt0a/6FglQE6gmuqMhYiUStgSpiaAmWE1ENZHURNYS/QpHkQA10c1gwlJvkuiCIDUR1ASriW4GhYda6O88ikTWEv19R5EANYFqwqsJUhNBTWzdClh/XoeQ7bTZGWqDofbGuwRh6wXYG2qToXYw1GZD7a07dPWVFoaLcZIMtbOddtw6LzFUbRBb/rlj9tGPGbP0lRuR9hdzGuA6P8XBNnE8aUdD7WSone20szPU3urVdcBianfxMhpqe0PtjWuDd2Xy+Itn6K3vd0RtNtTeOi/rvoJ3F9c7GWpnM23c+mZK1AZDbTTU9obaW+dlfRL33rfawVCbDbWjoXYy1M522lvfTInaYKht98YYt76ZErXJUDsYarOhtlWxxfwzLO1War1iedE8P+FUTKiAlwCvBUgLBC3AWiBqgaQFshLoP+FLgDbTUZvpqM101GY6ajMdtZmO2kxHbaajNtNJm+mkzXTSZjppM520mU7aTCdtppM200mb6aTNdNZmuv+ohlRuDrD9LqqV55gK8JlL4O/aH1D+iZWKNZHwaqLbcV/fsPiz3aZnon9qJJS/cXHkeaUyKbhyYiIAtwRor+7KvZpEBG3PQX2t+vUwItGdGx5rvZpvM9ivXZGIfkWKSMAbxNkZlmcC1YRXE9Qn6tUNuSWCdiT2v2PQpxpVuvgbWUv0qzJEop+PblXjM4FqwqsJeqMfr4jOgSTpJM1KdcWa+vvV6gqRyNq1beX7oyQC1ASqCa8mSE0ENcFqQu01/XoMaYb36zEkIqj9rF+PIRKoJryaIDWhXj/7x7lWiflnXNr1h3ziMnUTNzdwKxVIAkBaICiBlbKdVItXUmP+KxU1dQc2u/ZLe0gLBC3AbwDQfr9NVgL9bRAJIBXwa/7w79XDzdXH2+vlwOjyux93n8r50fnj43/fym/KCdNvD/efrj//eLhezpq+HDNdEopIE1KYA1my5Wkierornj9EmCI/3ZIt7YjndqnuDy0NIPI0v7l5ZilNIRUWmCbgXGiIboKIdT4s7TFPPpf2zFOEuXNzB/8H", "file_map": { "2": { "source": "use crate::cmp::Eq;\n\nunconstrained fn __get_shuffle_indices(lhs: [T; N], rhs: [T; N]) -> [u32; N]\nwhere\n T: Eq,\n{\n let mut shuffle_indices: [u32; N] = [0; N];\n\n let mut shuffle_mask: [bool; N] = [false; N];\n for i in 0..N {\n let mut found = false;\n for j in 0..N {\n if ((shuffle_mask[j] == false) & (!found)) {\n if (lhs[i] == rhs[j]) {\n found = true;\n shuffle_indices[i] = j;\n shuffle_mask[j] = true;\n }\n }\n if (found) {\n continue;\n }\n }\n assert(found == true, \"check_shuffle, lhs and rhs arrays do not contain equivalent values\");\n }\n\n shuffle_indices\n}\n\nunconstrained fn __get_index(indices: [u32; N], idx: u32) -> u32 {\n let mut result = 0;\n for i in 0..N {\n if (indices[i] == idx) {\n result = i;\n break;\n }\n }\n result\n}\n\npub(crate) fn check_shuffle(lhs: [T; N], rhs: [T; N])\nwhere\n T: Eq,\n{\n // Safety: shuffle_indices is ensured to be a permutation of 0..N, and then\n // shuffle_indices is ensured to map lhs to rhs: assert(lhs[i] == rhs[shuffle_indices[i]]), for all i in 0..N\n unsafe {\n let shuffle_indices = __get_shuffle_indices(lhs, rhs);\n\n for i in 0..N {\n let idx = __get_index(shuffle_indices, i);\n assert_eq(shuffle_indices[idx], i);\n }\n for i in 0..N {\n let idx = shuffle_indices[i];\n let expected = rhs[idx];\n let result = lhs[i];\n assert_eq(expected, result);\n }\n }\n}\n\nmod test {\n use crate::cmp::Eq;\n use super::check_shuffle;\n\n struct CompoundStruct {\n a: bool,\n b: Field,\n c: u64,\n }\n impl Eq for CompoundStruct {\n fn eq(self, other: Self) -> bool {\n (self.a == other.a) & (self.b == other.b) & (self.c == other.c)\n }\n }\n\n #[test]\n fn test_shuffle() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [2, 0, 3, 1, 4];\n check_shuffle(lhs, rhs);\n }\n\n #[test]\n fn test_shuffle_identity() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [0, 1, 2, 3, 4];\n check_shuffle(lhs, rhs);\n }\n\n #[test(should_fail_with = \"check_shuffle, lhs and rhs arrays do not contain equivalent values\")]\n fn test_shuffle_fail() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [0, 1, 2, 3, 5];\n check_shuffle(lhs, rhs);\n }\n\n #[test(should_fail_with = \"check_shuffle, lhs and rhs arrays do not contain equivalent values\")]\n fn test_shuffle_duplicates() {\n let lhs: [Field; 5] = [0, 1, 2, 3, 4];\n let rhs: [Field; 5] = [0, 1, 2, 3, 3];\n check_shuffle(lhs, rhs);\n }\n\n #[test]\n fn test_shuffle_compound_struct() {\n let lhs: [CompoundStruct; 5] = [\n CompoundStruct { a: false, b: 0, c: 12345 },\n CompoundStruct { a: false, b: -100, c: 54321 },\n CompoundStruct { a: true, b: 5, c: 0xffffffffffffffff },\n CompoundStruct { a: true, b: 9814, c: 0xeeffee0011001133 },\n CompoundStruct { a: false, b: 0x155, c: 0 },\n ];\n let rhs: [CompoundStruct; 5] = [\n CompoundStruct { a: false, b: 0x155, c: 0 },\n CompoundStruct { a: false, b: 0, c: 12345 },\n CompoundStruct { a: false, b: -100, c: 54321 },\n CompoundStruct { a: true, b: 9814, c: 0xeeffee0011001133 },\n CompoundStruct { a: true, b: 5, c: 0xffffffffffffffff },\n ];\n check_shuffle(lhs, rhs);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index b2a6ccff937..cd229096551 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -45,8 +45,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdrhTuMwDAfwd+nnfUhsx3Z4ldPpNGCcJk0DDTjphHj3W2EtkPmK/pH2BVHwL9virHXcvgy3m+vn37+2+7v7x+Hqx8uwu79ZP23v98ejl9fVcH3Y7nbb378+/3lI4w+Rt/jHh/V+PHx8Wh+ehitJq2Gzvz3+Ykd9t91thquSXldngcqmp1Blr3Mwv/5cDVIuOLZecGy74Nh+wbHr5cYu6YJj5wuOTRccm4Gxx3gB4wsYr2C8gfEOxlcsXhMYH64bpVO85TaewHhejtc2XsD4AsYrGG9gfJjfOs1/rW18xeItLcbnJC3IKCAUMAoEBWGSc/ZJULusTWFh3wimVjgsKio8wSKjooavYcVsXuSZv561a8YJ4YRxIjgpOFGcGE4cJxUmOaUOkzsMdRjuMNJh8DWQc/x5lD+uDWM59NVwh5EOUzqMdhjrMN5hKm4odZjcYTrWAYXrICedCuXj6vqopOTdSIcpHUY7jHUY7zAVN5w6TO4w1GHi6jXztF8ibkU4a1qmxaZeWlFRIQkWGRYEC4aFwKLAQmFhsIhzXn3edLWrpPzn+jwLOxMEC4aFwCK+jtEsnFqhsDBYOCwqKuJ9/KLIsCBYMCzCDDpNhZXLmVBYGCwcFmEGPU3fWi/WiHinvigyLAgWDAuBRYGFwsJQ4fDsOjy7Ds+uh7NLc/FI7K0I1y6lqcygnBoR79a5yEmwngmCBcNCYFFgEa4rrlN9xZ/6aydhsHBYVFBQvEdfFPH9gDzNlZC0gmDBsJC4O10mkXMrCiwUFgYLh0VFRU6wiHPOc/NfUisIFgwLgUWBhcLCYOGoiLsJC2dqinsJi4JhIbAo4DWK4h7CojBYOCwqKuLeAc2306i0cxV3DhYFwSLOOZVZtGcGFlgUWCgsDBYOi4qKuPuxKND6igTOh8D5EDgfAudD4HzEz1eQTTtI8rZmiJ+aWBQZFnG9m6b9ILcdFoq7H4tCYBHnfO77cDr7HAoLg4XDoqIi7n4sigyLOOdzD4C5zUfc/VgUAosCC4WFwcJhUVER90uWzqIGn3eNYMGwQPe1HFf6ynWaLJXU3H3kuNb/xlCH4Q4jHaZ0GO0w1mG8w1TcxLV8qXkqzUuljwq1vBuNzXyxK7Wm1hhoXo8Hf9aH7fp6tzk9DXv3vL/59HDs09+HTfOc7MPh/mZz+3zYjE/MfjwsO651cltx8vG9jEe6Yv053oU/HjivfPzH2/oeL9nk6fj6x/fwDw==", + "bytecode": "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", + "debug_symbols": "tdrbTuMwEAbgd8l1L+w52cOrrFarAmVVqSqowEorxLtvAyRl3SHot9QbRGA+t/WkzniSl+F2c/38+9d2f3f/OFz9eBl29zfrp+39/nj08roarg/b3W77+9fnPw9p/CHyFv/4sN6Ph49P68PTcCVpNWz2t8dfylHfbXeb4UrT6+os0LjYR6hx9TmYX3+uBtELjm0XHLtccOx6wbH9cmNruuDY+YJj0wXH5mhsow9Q8uexx3gB43U53tp4A+MLGF/BeMfiLTzHfMqVexufwXhajM9JWsAoEBQoCgwFYZJzrpOg0ooKC/9GMDWiJFhkWBAsGBU1fA129g/CLulk3gjjRHCiODGcFJxUnDhMPDy/ipYyLz6Z/1/NPeOEcMI4EZwoTgwnBSbH9Sk0xqergqbWaIexDhMvlcltXl39tPTJu6kdxnGTU4fJHYY6DHcY6TAaG5tNptwa6zClw9QO47ih1GFyh6EOwx1GOkxct2aeKnXiRnA4a6bTYmBVW5FhQbBgWAgsFBYGiwKLCgtHhcQ59zpvt9qzRL64Ns+inAmBhcLCYBFfl2kWlVpRYeGoiDsIiyLDgmDBsBBYKCzCDFaaCqsqZ6LCwlER788XRZjBmqZvbdX2Gh/v0RcFw0JgobAwWBRYVFg4Kgo8uwWe3QLPbglnl+binrg2oobnLqWpzKCcWhHv01WmTaedCYGFwsJgUWDx1RZ93m57KxwV8QZ9UWRYECzCnEue5kpIWiGwUFh8ca9DJ5HbCtkLLCosHBSUEiwyLAgWcc55vkUgqRUCC4WFwaLAosLCURH3LRYFgys1xb2ERaGwMFgU8BpFcQ9hUTgq4v7BosiwCL+DNN90I23nKu4cLAqBRZxz0lm0KwMZLAosKiwcFXH3Y1FkWBAs0PqKGM4Hw/lgOB8M50PgfEicjzLtIKlKKwgWDIu43k3TfpDbDgvF3Y9FYbCIcz73fTidfY4KC0dF3P1YFBkWBAuGRZzzuQfA3OYj7n4sCoNFgUWFhaMi7pcsigwLQldRg9ddE1goLNB9LceVvrFPk2WSmruPHNf63xjpMNphrMOUDlM7jOMmrvy/MbnDhHOtnqfSXJ1OFaq+mxqb+WKn7qk1DprX48Gf9WG7vt5tPp7DvHve33x6LPPp78OmeULz4XB/s7l9PmzGZzVPj2mOc0nFV5zS+F7GI1ux/RzvJh8Piq7q+I+3+aOSVlTo+PrH9/AP", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_0.snap index 063b217796b..42401a14f8d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_0.snap @@ -45,8 +45,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VaO4/zRBQdO3ESJ9k4fHRIdFDQ5eE8tovEwn4lHR3Im+yKghaJBsniT1BQU1BDQUNFiZBo+Bvok5AoEAWZ3bnJ8fG147D2Loy0Gsf3+D7OzJ25nrVnHpq///Pcddv1HvQtk20i27h+8rg2rVHXpCkfvf+Bj34DPt63Fg2+b4qbBPXCXYTutw/yVo1Bh2S3Tv3rSXwZKvHV6P88JE6b0t9qRv+k6/S8nx71cywGesHxM4i9Bsx1AeYlYF4SJoTrumPez4llw5zOL0w+zyQWsd1uxnbskT1DcRqy3zeNzt+pR/bEH+ZHri8Ekx798UjWTvNxiCxIs3HY1tv/vQE4nls+4N6G63fcdcPz8bLhNWTyeknMcq+bmkM75DzcE16F5x7iSRaCrJ1m7fTd7zbYQV3iR0D4t9zvyPUdeEaeHyv2O2Q/47dyj3kJFXyo4Dv7vzfd9cAc981306O+OsdU9F81o/+wL7/XjP655cjm2MdOX2Ty85LXzKb2QF6jZG6yTR/GnNdwXN8CuifVmI33luLDNbBsXRyb4hwu22+q7AeanbJxaGId3LcZ742mPt2HOipoxveljEHH5JvIumCbx64HeFkzRBYqYyGyPsj45Q+b9hIoXFjbn4BexkmLFDs+yXzFn4a5P+SvcI/5Gyi++oTncQvo3jXw9Nj81bhj/1EX5sJV+tBrXMuzocnHZv827vfkce1Qz8lcbitcoP2A8B+Qnz14ps458QL0GsXWKb4x16rw7TXD90yb2xrfHvEt+A/Jz+4T8t0l//wSvm2TWiMyxXtdWBD7pp445lot4JX4w3v9R+Rn5wn5FltYf7bT+u2v1g9rrm1S+wcmv8eg/YDwO/cb9y8DXG7+pZ93q2R6N0/ukkWy28XbhHmyzQee6rafrObr7Szerm4W82S+PGkfa2CZY8KVcMrzvQVyxH/qejsPvnPXWl3iFfTGVKsNcU5zHnYV33FeSI5r679tG9dPHtemoh/P/2rSPRHd/fp1z2S8tLrF8v4Z8T1Q+OY6S+SI/x50fu6uI+V53gOxFuUao6P4gvzL2PMe9YXr7Vz4g3QixxyfbTz/BgoeczykeDAG5BLn8pcl/vXO9E+Lh2sg9A/3UHlWOyMTm02u+/sWW1//BD+YgyCtHq/GT9XxGxMeudL46T0jP0EJP10l3nPnD9d0yA9y1yEZrv+c87wH2YZnWSHIEf+V662tbwp0ekZfH67SLL4DuloKhn0Q/Neut2MxdEE2XI8l/D6OTWQD4gNlQ5Dx2cAFyAKSjUB27vt/B3iq8v6vjalW05eNaQC6GI/6eF59C75GNKb/lTMdHtOeEpd2ptMi2VOe6WCtaOen7Ds4Hz26PvyvxehrFu/zgv8BfON9dGSycaEPtvE6GCl4zAXxJzL5HIpM1j8Zwx9L/IvO9G+s4CPA8D6Pvo9J15D85XhGJBf8z663Y/xTBZ3owwXExfaGSmyjE/KhotuU2EN9fcKOCp5FO9qaK89ZPn4pwYUKjvUHynN9kgn2Fej71V1HpnhP0HKQa20tB5H3ohz8zfVVcxDrsXNzcEjxaDlYpqvM9qn84vzX8kurE8Xmc9SJyEGQVo9X4+c1BY/riozNmPDIlcZP9Iz8DEr4OXfuanxq+8fY5Lm7IBnuj5zP2vsM5ulVmsWL7o7R105+RxX8767H+kg7rxmA/lcVfA0UX7UzCtQrZxR1n61tF8ubbbxIJrdT+3N26mxN+1YA57Jt8r0Bfo+AeKxHEf8XxPu3OfJyj03z9ixu4BXjvIL+Xodyr51m72nfKeD3G4IX2/0076PIBiDDPLNt6H4jX6hL/AgI33MKZEzwmwt5fqzY75H9jN/KPf5+Y6DgBwrejo/nHjrs42C77m+i7m2SfrzHvsncaeLMerZeLy9nN5N4tdve7eL5U5+Z71N6tU1W0+llPL2Np4tT9v8Bi3Wt0fksAAA=", - "debug_symbols": "1ZvRauMwEEX/xc9+0MxIo1F/ZVlK2qYlEJKSpgtLyb9vnI3VrGK0DGLAfil1cu/JxdZkLCn+6l7WT59vj5vd6/6je/jx1W33z6vjZr87H32d+u7psNluN2+Pty93bvjj8aL/eF/thsOP4+pw7B6867v17uX8Tzy7XzfbdfcQ3Km/EzJFvkqZJGUxTWhjiPGqjQxU1zJh1g6fnLU/+87TAjP7BWYOC8zMC8wcF5hZFpg5LS9zcAvMDAvMvMA+GObZB8HxyAVAyFp/yTzPPljPPM8+WM88zz5YzzzPPljPPM8+WM88zz5Yzczz7IP1zPPsg/XM8+yD9cwL7IO8wD7Imj446Fmpj0q9KPVJp49OqQelHpX6yXHO+QYRSr1X6kNdz6Welfqo1ItSn3R6mby+aTz/KZV6UOqxqgfnSwNpDV5rCFoDaw2TFxlARgeWw1pE7Uj/cRAWjuTUDlA7UO0grQPcdI0Cjd0A6d8vbXDTVRTGsmAJN477liBuVEqIJTvZscEZsqGNjXlWjiQlOzay3diBEVzBxsZzQsFflcR3bDBkoyGbDNnekB0a2WmsebrpPFc2G7KjIVsM2cmOTY116WEcJx59yQZDNhqyG+vSuzCyAUq2N2QHQzYbsqMhWwzZyY7tW+uS8mTMl9/fHgzZaMgmQ7Y3ZAdDNhuyoyF7ui6T5Cl+ORuY3puLITvinQPVDlI7vNoxORoiZodg6WC1I6odonYkrWN6JbzqALUD1Q5SOyavoOC4Vin+zsFqR1Q7RO2YvIK12ef0umLVAWoHqh2kdni1I6gdrHZErUMa7xJqM3YBQzYassmQ3XiXUFt9kWDIZkN2NGSLIbvx7h3zdgeGcpwkZ8gGQ3ZrXWLIbKgqmdLYmNi7+tZeSDCWZEj4fR3D38xhnpmj5MzJlZl5cZnRzeA8X3KITY4LO9mxW3cFqmwwZKMhu7VX5wGL4ku2N2QHQ3brCrgbi4fKOTS27vBU2WLIbq3LvK5ArjzfrTtTVTYYstGQTYZsb8gOhuzWuswzcaJyfDfvTNXYYshOduzWnakqGwzZaMgmQ3ZjXVZ2jLF1Z6rKZkN2NGSLHdtb/dridD74tTpsVk/b9fUJzdfP3fPNA5vH3+/r4tnN98P+ef3yeVgPT3F+P8A5ZETPPXI8Zx5GNnJPPMyPhrdS6MG54Qgub0mP0Z0DnEP8AQ==", + "bytecode": "H4sIAAAAAAAA/9VaO6/jRBQeJ3ES5+WwdEh0UNDlnVzRROLCbklHB/JN7hUFLRINksWfoKCmoIaChooSIdHwN9BKSBSIgszdOcnnz8eOs9ezVztSNLbnzHl8Z86Z44kD86I1Dr/AXbdcH0DfNNkmY1vXTx7WpjXymvjSMXgNdGx40PG+Ncn5DVPcxKgn7iJy9w0Yb9ZodERy6+S/mSyuIsW+GvWfR4SpL/5NP/wnHcfno/TEn20x0Asdz0Hap0DztIDmGdA8I5oIruu2+bAmVp4xnQ9NPs7EFpHd8iN7EZA8Q3Yakt8zXtfvNCB5og/jI9dDoUlP+gQ01krzdshYmGbtsK17+L0FdLy2GkD3Lly/5649r8crzzlk8maJzfKsk5pjO8Y8PBNcBecu0tNYBGOtNCun5+5bIAd5iR4h0b/j7mPXt2GOzB8r8tskP6O38oxxiRT6SKFvH35vu+u+Oe2bH6QnfnX6VPhf++F/3Jc/9MN/bjGyMfaZ4xeb/LrknOlrD+QcJWuTZTbA55zDMb+F9EyqMWvvLdmHObAsL45NcQyX7TdV9gNNjuaH2OTtZh+FMObDR23HD32EMltgD9LjtTEnH8mz912v+Ujbu1ol2Gn7rM895NBmkaJXTbyPNWjbj+5rWb8dk28y1gXZvO6xxpd8K2M9mBfQvL7ip8Dkm/YCLVhYvT4HvkwnTYsdjrE2yWR/XqdZXg1FH81X9rd195OHtWM9J75qmXwuQ/kh0X9MeqJf68wXT4CvUWSdw1vLe2V4B37wnml5T8M7ILyF/hPSs/MK8e6Qfo0SvG2TWiM2xXtdVGD7th475lotEJTow3v9p6Snp5yp4i2ysP5spfXLX29e7Me2Se0fmnyeRPkh0e/dPeZnA1huX1LPu3UyvZsnd8ky2e8Xu4Rxsq0BONUtP1nPN7vZYre+Wc6T+eqsfKyBZY0JVoIpr/cmjCP9F6636+BHdy17Hea6oKA3plptiGua47Cj6I7rQmJcy/+2bV0/eVibCn+sDWriPRHevfp5z8RfoYKxxf1Lwruv4M01uIwj/U/A8yt3HSvzeQ/E81quMdqKLoi/+J73qK9db9fC38QTMWb7bOP111foMcYjsgdtQCxxLX9Tol/3Qv00e7gGQv1wD5W52hmZyPSZ9w9tYXX9B/RgDMK0ur0aPlX9NyZ6xErDp/uI+IQl+HQUey9dP1zTIT6IXZvGMP9zzPMeZBueZUUwjvTfut7K+r6AZ2D0/HCdZunbwKup0LAOQv+d660vBs5Iz/VYwu+b2LT3zYDGBjDG77dDGAtpbARjvt9hNZ9qNX2ZT0PgxfTIj9fVD6BrTD71dOa00monAzhx7LFPq5xZYMxqZxaX+jQEnKr6VGpFuz5l38H1GND18b8Wo+cs3ueF/mfQjffRkcnahTrYxnkwVugxFkSf2ORjKDZZ/cSHv5ToF1+o31ihj4GG93nUfUy8BqQv2zOicaH/zfXWx79W4Ik6DMEuljdQbBudGR8ovE2JPOTXI9pRwVyUo+VcmWfx+L2ELlLomH+ozOvRmNA+B35/uOvYFO8JWgxyra3FIOJeFIN/ur5qDGI9dmkMDsgeLQbLeJXJPhdfHP9afGl1osh8jDoRMQjT6vZq+Lyh0GNeEd+MiR6x0vCJHxGffgk+l65dDU9t/xibPHZDGsP9keNZe5/BOL1Os/TCu2303MnvqEL/l+uxPtLOa/rA/3kFXUNFV+2MAvnKGUXdZ2u75epmt1gmk9upvZ2dO1vTvhXAtWybfG+A3yMgPdajSP8v2PufOeFyT5vm5Vm6flBMFxT09zyUZ600+0z7TgG/3xB6kd1L8zrKWB/GMM5sG7h7xAt5iR4h0XcdA/EJfnMh88eK/C7Jz+itPOPvN/oKfV+ht/4J3KTjPg6y6/4m6l4m8cdnrJusHR9n1rPNZnU1u5ks1vvd3X4xf9Vn5oeQXu+S9XR6tZjeLqbLc/L/B4QQLxX5LAAA", + "debug_symbols": "1ZvdauMwEIXfxde+0MzoZ9RXWZaStmkJhKSk6cJS8u5rZ2Mlqxgtg5gi35S4OefjYGs8lhR/dS/rp8+3x83udf/RPfz46rb759Vxs98NR1+nvns6bLbbzdvj7b87M/6xeNZ/vK924+HHcXU4dg/W9N169zJ8CIP7dbNddw/OnPo7oafgL1JPHJOYZrQUKV60FK25gk8/+85SIzlsIzlcIzl8IzlCIzm4kRyxjRzOfFuO4EK4aIMHKms9YdI6c6MdM8MCM+MCM1OTmcHEiTt8vIaw58x2gZndAjP7BWYOC8zMC8wcl5fZt9kHy5nb7INgfMoMCFnmNvtgOXOrfbCUudU+WMrcah8sZW61D5Yyt9oHS5lb7YOlzK32wULm0GofLGVeYB8MC+yDYbYP+jSBhNvMo94K9a6s97neC/VBqGehPsr0PFtrcRoDMeZ6EOqxqAdjcwNJDVZqcFKDlxpmLzIATw4MuYPFjvgfB2HmiEbsALEDxQ6SOsDM1yjQdDdC+vemAWa+itxUFp7djeP+lsRmUrILOTvqscEosqGOjWnVDolzdqhkm6kDIJiMjZXnhJydVqL9HRsU2ajIJkW2VWS7Snacap5uOs+F7RXZQZHNiuyox6bKurQwjROLNmeDIhsV2ZV1aY2b2AA52yqynSLbK7KDIpsV2VGPbWvrktKE0Ob3bwuKbFRkkyLbKrKdItsrsoMie74uI6cpfj4bmN+7Dy45wp0DxQ4SO6zYMTsaAiYHY+7wYkcQO1jsiFLH/E5Z0QFiB4odJHbMXkHGaa2M7Z3Dix1B7GCxY/YKlmaf82u8RQeIHSh2kNhhxQ4ndnixI0gdXPmUUJqxMyiyUZFNiuzKp4TS6gs7RbZXZAdFNiuyK5/eMW25oMvHSTSKbFBk19YlusSGotJTnBqTt6a8teQiTCXpIl6vo/ub2bWZOXDKHE2e2S8uM5oGzvM5B+vkOLOjHrt2V6DIBkU2KrJre3UasMg2Z1tFtlNk166Am6l4KJ9DY+0OT5HNiuzaukzrCmTy8127M1VkgyIbFdmkyLaKbKfIrq3LNBMnysd39c5Uic2K7KjHrt2ZKrJBkY2KbFJkV9ZlYccYa3emimyvyA6KbNZjW61fW5yGg1+rw2b1tF1f3jB+/dw937xwfPz9vs7ePX4/7J/XL5+H9fgW8vUF5DEjWt+jD0PmcWSj78mP86Pxq+h6MGY8gvNX3GMwQ4AhxB8=", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 063b217796b..42401a14f8d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_sort/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -45,8 +45,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VaO4/zRBQdO3ESJ9k4fHRIdFDQ5eE8tovEwn4lHR3Im+yKghaJBsniT1BQU1BDQUNFiZBo+Bvok5AoEAWZ3bnJ8fG147D2Loy0Gsf3+D7OzJ25nrVnHpq///Pcddv1HvQtk20i27h+8rg2rVHXpCkfvf+Bj34DPt63Fg2+b4qbBPXCXYTutw/yVo1Bh2S3Tv3rSXwZKvHV6P88JE6b0t9qRv+k6/S8nx71cywGesHxM4i9Bsx1AeYlYF4SJoTrumPez4llw5zOL0w+zyQWsd1uxnbskT1DcRqy3zeNzt+pR/bEH+ZHri8Ekx798UjWTvNxiCxIs3HY1tv/vQE4nls+4N6G63fcdcPz8bLhNWTyeknMcq+bmkM75DzcE16F5x7iSRaCrJ1m7fTd7zbYQV3iR0D4t9zvyPUdeEaeHyv2O2Q/47dyj3kJFXyo4Dv7vzfd9cAc981306O+OsdU9F81o/+wL7/XjP655cjm2MdOX2Ty85LXzKb2QF6jZG6yTR/GnNdwXN8CuifVmI33luLDNbBsXRyb4hwu22+q7AeanbJxaGId3LcZ742mPt2HOipoxveljEHH5JvIumCbx64HeFkzRBYqYyGyPsj45Q+b9hIoXFjbn4BexkmLFDs+yXzFn4a5P+SvcI/5Gyi++oTncQvo3jXw9Nj81bhj/1EX5sJV+tBrXMuzocnHZv827vfkce1Qz8lcbitcoP2A8B+Qnz14ps458QL0GsXWKb4x16rw7TXD90yb2xrfHvEt+A/Jz+4T8t0l//wSvm2TWiMyxXtdWBD7pp445lot4JX4w3v9R+Rn5wn5FltYf7bT+u2v1g9rrm1S+wcmv8eg/YDwO/cb9y8DXG7+pZ93q2R6N0/ukkWy28XbhHmyzQee6rafrObr7Szerm4W82S+PGkfa2CZY8KVcMrzvQVyxH/qejsPvnPXWl3iFfTGVKsNcU5zHnYV33FeSI5r679tG9dPHtemoh/P/2rSPRHd/fp1z2S8tLrF8v4Z8T1Q+OY6S+SI/x50fu6uI+V53gOxFuUao6P4gvzL2PMe9YXr7Vz4g3QixxyfbTz/BgoeczykeDAG5BLn8pcl/vXO9E+Lh2sg9A/3UHlWOyMTm02u+/sWW1//BD+YgyCtHq/GT9XxGxMeudL46T0jP0EJP10l3nPnD9d0yA9y1yEZrv+c87wH2YZnWSHIEf+V662tbwp0ekZfH67SLL4DuloKhn0Q/Neut2MxdEE2XI8l/D6OTWQD4gNlQ5Dx2cAFyAKSjUB27vt/B3iq8v6vjalW05eNaQC6GI/6eF59C75GNKb/lTMdHtOeEpd2ptMi2VOe6WCtaOen7Ds4Hz26PvyvxehrFu/zgv8BfON9dGSycaEPtvE6GCl4zAXxJzL5HIpM1j8Zwx9L/IvO9G+s4CPA8D6Pvo9J15D85XhGJBf8z663Y/xTBZ3owwXExfaGSmyjE/KhotuU2EN9fcKOCp5FO9qaK89ZPn4pwYUKjvUHynN9kgn2Fej71V1HpnhP0HKQa20tB5H3ohz8zfVVcxDrsXNzcEjxaDlYpqvM9qn84vzX8kurE8Xmc9SJyEGQVo9X4+c1BY/riozNmPDIlcZP9Iz8DEr4OXfuanxq+8fY5Lm7IBnuj5zP2vsM5ulVmsWL7o7R105+RxX8767H+kg7rxmA/lcVfA0UX7UzCtQrZxR1n61tF8ubbbxIJrdT+3N26mxN+1YA57Jt8r0Bfo+AeKxHEf8XxPu3OfJyj03z9ixu4BXjvIL+Xodyr51m72nfKeD3G4IX2/0076PIBiDDPLNt6H4jX6hL/AgI33MKZEzwmwt5fqzY75H9jN/KPf5+Y6DgBwrejo/nHjrs42C77m+i7m2SfrzHvsncaeLMerZeLy9nN5N4tdve7eL5U5+Z71N6tU1W0+llPL2Np4tT9v8Bi3Wt0fksAAA=", - "debug_symbols": "1ZvRauMwEEX/xc9+0MxIo1F/ZVlK2qYlEJKSpgtLyb9vnI3VrGK0DGLAfil1cu/JxdZkLCn+6l7WT59vj5vd6/6je/jx1W33z6vjZr87H32d+u7psNluN2+Pty93bvjj8aL/eF/thsOP4+pw7B6867v17uX8Tzy7XzfbdfcQ3Km/EzJFvkqZJGUxTWhjiPGqjQxU1zJh1g6fnLU/+87TAjP7BWYOC8zMC8wcF5hZFpg5LS9zcAvMDAvMvMA+GObZB8HxyAVAyFp/yTzPPljPPM8+WM88zz5YzzzPPljPPM8+WM88zz5Yzczz7IP1zPPsg/XM8+yD9cwL7IO8wD7Imj446Fmpj0q9KPVJp49OqQelHpX6yXHO+QYRSr1X6kNdz6Welfqo1ItSn3R6mby+aTz/KZV6UOqxqgfnSwNpDV5rCFoDaw2TFxlARgeWw1pE7Uj/cRAWjuTUDlA7UO0grQPcdI0Cjd0A6d8vbXDTVRTGsmAJN477liBuVEqIJTvZscEZsqGNjXlWjiQlOzay3diBEVzBxsZzQsFflcR3bDBkoyGbDNnekB0a2WmsebrpPFc2G7KjIVsM2cmOTY116WEcJx59yQZDNhqyG+vSuzCyAUq2N2QHQzYbsqMhWwzZyY7tW+uS8mTMl9/fHgzZaMgmQ7Y3ZAdDNhuyoyF7ui6T5Cl+ORuY3puLITvinQPVDlI7vNoxORoiZodg6WC1I6odonYkrWN6JbzqALUD1Q5SOyavoOC4Vin+zsFqR1Q7RO2YvIK12ef0umLVAWoHqh2kdni1I6gdrHZErUMa7xJqM3YBQzYassmQ3XiXUFt9kWDIZkN2NGSLIbvx7h3zdgeGcpwkZ8gGQ3ZrXWLIbKgqmdLYmNi7+tZeSDCWZEj4fR3D38xhnpmj5MzJlZl5cZnRzeA8X3KITY4LO9mxW3cFqmwwZKMhu7VX5wGL4ku2N2QHQ3brCrgbi4fKOTS27vBU2WLIbq3LvK5ArjzfrTtTVTYYstGQTYZsb8gOhuzWuswzcaJyfDfvTNXYYshOduzWnakqGwzZaMgmQ3ZjXVZ2jLF1Z6rKZkN2NGSLHdtb/dridD74tTpsVk/b9fUJzdfP3fPNA5vH3+/r4tnN98P+ef3yeVgPT3F+P8A5ZETPPXI8Zx5GNnJPPMyPhrdS6MG54Qgub0mP0Z0DnEP8AQ==", + "bytecode": "H4sIAAAAAAAA/9VaO6/jRBQeJ3ES5+WwdEh0UNDlnVzRROLCbklHB/JN7hUFLRINksWfoKCmoIaChooSIdHwN9BKSBSIgszdOcnnz8eOs9ezVztSNLbnzHl8Z86Z44kD86I1Dr/AXbdcH0DfNNkmY1vXTx7WpjXymvjSMXgNdGx40PG+Ncn5DVPcxKgn7iJy9w0Yb9ZodERy6+S/mSyuIsW+GvWfR4SpL/5NP/wnHcfno/TEn20x0Asdz0Hap0DztIDmGdA8I5oIruu2+bAmVp4xnQ9NPs7EFpHd8iN7EZA8Q3Yakt8zXtfvNCB5og/jI9dDoUlP+gQ01krzdshYmGbtsK17+L0FdLy2GkD3Lly/5649r8crzzlk8maJzfKsk5pjO8Y8PBNcBecu0tNYBGOtNCun5+5bIAd5iR4h0b/j7mPXt2GOzB8r8tskP6O38oxxiRT6SKFvH35vu+u+Oe2bH6QnfnX6VPhf++F/3Jc/9MN/bjGyMfaZ4xeb/LrknOlrD+QcJWuTZTbA55zDMb+F9EyqMWvvLdmHObAsL45NcQyX7TdV9gNNjuaH2OTtZh+FMObDR23HD32EMltgD9LjtTEnH8mz912v+Ujbu1ol2Gn7rM895NBmkaJXTbyPNWjbj+5rWb8dk28y1gXZvO6xxpd8K2M9mBfQvL7ip8Dkm/YCLVhYvT4HvkwnTYsdjrE2yWR/XqdZXg1FH81X9rd195OHtWM9J75qmXwuQ/kh0X9MeqJf68wXT4CvUWSdw1vLe2V4B37wnml5T8M7ILyF/hPSs/MK8e6Qfo0SvG2TWiM2xXtdVGD7th475lotEJTow3v9p6Snp5yp4i2ysP5spfXLX29e7Me2Se0fmnyeRPkh0e/dPeZnA1huX1LPu3UyvZsnd8ky2e8Xu4Rxsq0BONUtP1nPN7vZYre+Wc6T+eqsfKyBZY0JVoIpr/cmjCP9F6636+BHdy17Hea6oKA3plptiGua47Cj6I7rQmJcy/+2bV0/eVibCn+sDWriPRHevfp5z8RfoYKxxf1Lwruv4M01uIwj/U/A8yt3HSvzeQ/E81quMdqKLoi/+J73qK9db9fC38QTMWb7bOP111foMcYjsgdtQCxxLX9Tol/3Qv00e7gGQv1wD5W52hmZyPSZ9w9tYXX9B/RgDMK0ur0aPlX9NyZ6xErDp/uI+IQl+HQUey9dP1zTIT6IXZvGMP9zzPMeZBueZUUwjvTfut7K+r6AZ2D0/HCdZunbwKup0LAOQv+d660vBs5Iz/VYwu+b2LT3zYDGBjDG77dDGAtpbARjvt9hNZ9qNX2ZT0PgxfTIj9fVD6BrTD71dOa00monAzhx7LFPq5xZYMxqZxaX+jQEnKr6VGpFuz5l38H1GND18b8Wo+cs3ueF/mfQjffRkcnahTrYxnkwVugxFkSf2ORjKDZZ/cSHv5ToF1+o31ihj4GG93nUfUy8BqQv2zOicaH/zfXWx79W4Ik6DMEuljdQbBudGR8ovE2JPOTXI9pRwVyUo+VcmWfx+L2ELlLomH+ozOvRmNA+B35/uOvYFO8JWgxyra3FIOJeFIN/ur5qDGI9dmkMDsgeLQbLeJXJPhdfHP9afGl1osh8jDoRMQjT6vZq+Lyh0GNeEd+MiR6x0vCJHxGffgk+l65dDU9t/xibPHZDGsP9keNZe5/BOL1Os/TCu2303MnvqEL/l+uxPtLOa/rA/3kFXUNFV+2MAvnKGUXdZ2u75epmt1gmk9upvZ2dO1vTvhXAtWybfG+A3yMgPdajSP8v2PufOeFyT5vm5Vm6flBMFxT09zyUZ600+0z7TgG/3xB6kd1L8zrKWB/GMM5sG7h7xAt5iR4h0XcdA/EJfnMh88eK/C7Jz+itPOPvN/oKfV+ht/4J3KTjPg6y6/4m6l4m8cdnrJusHR9n1rPNZnU1u5ks1vvd3X4xf9Vn5oeQXu+S9XR6tZjeLqbLc/L/B4QQLxX5LAAA", + "debug_symbols": "1ZvdauMwEIXfxde+0MzoZ9RXWZaStmkJhKSk6cJS8u5rZ2Mlqxgtg5gi35S4OefjYGs8lhR/dS/rp8+3x83udf/RPfz46rb759Vxs98NR1+nvns6bLbbzdvj7b87M/6xeNZ/vK924+HHcXU4dg/W9N169zJ8CIP7dbNddw/OnPo7oafgL1JPHJOYZrQUKV60FK25gk8/+85SIzlsIzlcIzl8IzlCIzm4kRyxjRzOfFuO4EK4aIMHKms9YdI6c6MdM8MCM+MCM1OTmcHEiTt8vIaw58x2gZndAjP7BWYOC8zMC8wcl5fZt9kHy5nb7INgfMoMCFnmNvtgOXOrfbCUudU+WMrcah8sZW61D5Yyt9oHS5lb7YOlzK32wULm0GofLGVeYB8MC+yDYbYP+jSBhNvMo94K9a6s97neC/VBqGehPsr0PFtrcRoDMeZ6EOqxqAdjcwNJDVZqcFKDlxpmLzIATw4MuYPFjvgfB2HmiEbsALEDxQ6SOsDM1yjQdDdC+vemAWa+itxUFp7djeP+lsRmUrILOTvqscEosqGOjWnVDolzdqhkm6kDIJiMjZXnhJydVqL9HRsU2ajIJkW2VWS7Snacap5uOs+F7RXZQZHNiuyox6bKurQwjROLNmeDIhsV2ZV1aY2b2AA52yqynSLbK7KDIpsV2VGPbWvrktKE0Ob3bwuKbFRkkyLbKrKdItsrsoMie74uI6cpfj4bmN+7Dy45wp0DxQ4SO6zYMTsaAiYHY+7wYkcQO1jsiFLH/E5Z0QFiB4odJHbMXkHGaa2M7Z3Dix1B7GCxY/YKlmaf82u8RQeIHSh2kNhhxQ4ndnixI0gdXPmUUJqxMyiyUZFNiuzKp4TS6gs7RbZXZAdFNiuyK5/eMW25oMvHSTSKbFBk19YlusSGotJTnBqTt6a8teQiTCXpIl6vo/ub2bWZOXDKHE2e2S8uM5oGzvM5B+vkOLOjHrt2V6DIBkU2KrJre3UasMg2Z1tFtlNk166Am6l4KJ9DY+0OT5HNiuzaukzrCmTy8127M1VkgyIbFdmkyLaKbKfIrq3LNBMnysd39c5Uic2K7KjHrt2ZKrJBkY2KbFJkV9ZlYccYa3emimyvyA6KbNZjW61fW5yGg1+rw2b1tF1f3jB+/dw937xwfPz9vs7ePX4/7J/XL5+H9fgW8vUF5DEjWt+jD0PmcWSj78mP86Pxq+h6MGY8gvNX3GMwQ4AhxB8=", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 81597b900b9..91c87940e4c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -38,8 +38,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_0.snap index 954bff46e14..b8679678e62 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_0.snap @@ -38,8 +38,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 1aec09e3649..94047b20b45 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/array_to_slice/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -38,8 +38,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index f183b5324e0..7305836d1f5 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdvRautIDAbgd8l1LjzSaCT1VZbDIW3TQyCkJW0XltJ3X+dQuyWjxOiH3JS45BsT6489I8cfq8ft/fuf37vD0/Pr6u6fj9X++WHztns+jFsfn+vV/XG33+/+/P7579Vw+sPy9/2vL5vDafP1bXN8W90V4vVqe3gcXzUZ/dNuv13dyfC57t7KOny9tXKd30rD56/1itstB9dbDm63HNxvOHgdbjl4ueXgdMvB+ZaD13BwtWlwaz8HPwlJi5YWmhaWFRLug4r4F6Gi50dL7IKx2ZidG8+bFn4TaESTIeZzUwBDgGHAVMAIYBpgFDAGGM8bBXKgQA4UyIECOVAgBwrkQIEcKJADBXKgQA4MyIEBOTAgBwbkwIAcGJADA3JgQA4MyIEBOXAgBw7kwIEcOJADB3LgQA4cyIEDOSjDhQLJN2qtQ/En0qFOSIt2qCFIEWQIcgCVAUEFQYQgRlBFEJKIcqG4dZiR1A4ZghxANCCoIIgQxAiqCBIENQRduCzZHCPyDnF8yJl0QszSIUIQIyg+5Fx4RtSdYeNW0RJqCFIEGYIcQHGLZQkVBBGCGEFIcWt49KRO0ZN6viYvMuRJyRPKE86TmieSJy1PNE8sT/LVj1syYmUiRh0peUJ5wnlS80TypOWJ5klY/TbP0ls/SY87MVdJ3Ii5TkqeUJ5wntQ8kTxpeaJ5kq++5qtv+erHK/UyzPO1cVnlHSoIiu89jKf4CY256hAjqCJIEBTfMRib+BOioT8Q8b2pStPZY3x5vieKF+xLqCCIEMQIqggSBMV1kjoXV7R0SBFkCHIAxU2IJVQQRAiKEyH+fTuwcIcqggRBDUGKIEOQA4gGBMXFZZ4RS/d9ipsQS6giSBDUEKQIMgQ5gHhAUEEQkghGEsEXEtHmu+Fs3Ynlws9pFlBDkCLIEOQAuvAzlAWETAkqMiWoyJSgIlOCCvSGKW6sjMu0+aKmQ7enuLWyhAqCCEHxIVef+gXFSutQRZAgqCFIEWQIcgDF7ZYlVBBECEIS0ZBENCQRDUlEQxLRkETEDZhxUTpf1Lx2KG7BXEccr5+0TWcwbd0vHOM1jbdpN679XjRPLE88TQrQheBSEEQIYgRVBAmCGoIUQYYgBxAhiSAkEYQkgpBEEJIIQhJBSCIISQQhiSAkEYwkIl7LXD2vxisZp6mJ6rUnNX3Gi9cW1/dieeJpEq8qrpOS/vjxiuI64TyJ62JT9d25I5InLU+WLsQByV+Ia/5CHC9wrpN89SVffclXX/LfynhZc53kp2GSn4ZJsvqf49a/m+Nuc7/ffj2g9PR+ePjxvNLbfy/bs0eXXo7PD9vH9+P29BDT9/NLp0iMK+g1eft1+sXcuCnDWuS0cao9jXNoch/3Oe73fw==", + "bytecode": "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", + "debug_symbols": "tdvdTuMwEAXgd8l1Lzx/HptXWa1QgYIqVQUVWGmFePdNVySg2mk1R+oNIpDPVjKnie00H8PD5u796Xa7f3x+HW5+fQy75/v12/Z5P259fK6Gu8N2t9s+3f7885COP8T+7//6st4fN1/f1oe34YZYVsNm/zD+lm30j9vdZrix9LlqdhVPX7uq6Lwrp8/fq0HyNRv3azZertl4vWLjmq7ZOF2zcb5m43LNxrXbuJep8ZJ/Nn4UFhY5LDwsSlRYtw8mq1+EyU/PlpUFU2ZTyqmpcZO7nwQe0WRY5NQQYBgwAhgFjAEmA8YBUwBT48aBHDiQAwdy4EAOHMiBAzlwIAcO5MCBHDiQgwLkoAA5KAs5sG+T86kRwChgDDAZMA6YApgaNxWoT+0fjyedjJOfmgKYGjeUEoIIQYwgQZAiyBCUEeQIWiiuphnZ6WCJKCGIEMQIEgQpggxBGUGOoAIgXrgllTlGXFvUP+XCPiERa5AiyBDUP+VCMiPODXIEFQRVAElCECGIESQIUgQZgpDi9pcaTKfomZaGcJxInGicWJzkOPE4KXFSw8RSnMSrb93q53mknpuBOpnEicaJxUmOE4+TEic1TPrLMOcJxUm8+jle/Ryvfn+2Po5vp3EBpVIbZAjqrxCOkZ0QOTfIEVQQVAHUn7OPg608IU7NiehPpsfbA01Iue1JEWQIyghyBBUEVQDVfp1M5+KaU4MIQYwgQZAiyBCUEdRPhNXvRxrUXI36axKXUI0jTglBhCBGkCBIEdQvrsiMxLhBjqCCoAqg/qLEJUQIYgQJghRBhiAkEYQkghYSkecnelKoQRVAnBBECGIECYIUQcCQgDkjyBEEDAlYgJVB7i9KUJ7XtshT25MiyBCUEbTwSL1O81IqlBtUEFQBtPDdjwuIEMQIEgQpggxBGUFIIhRJhCKJMCQRhiTCkET0F2DG4fp8U6vaIgVQf/7kebqCeW4uYP05Tc1TN9WbXvozmvOE40TiROPE4iTHicdJiZMaJZJSnFCccHyhRxbmLheQIsgQlBHkCCoIqgBamPBcQIQgJBGEJIKQRPTnLueuo9KfuVSeFk2rtiT8EZf+XOJsL/2ZxHkicaJxYvHDz3HicdKvS5mqX6s0pIZJ/2nreXLp0tsh4RuviMSJxkm8+hKvvsSrL/FPpcRvvBq/8Wr8xqvB6n+OW3/Wh+36brf5eqni8X1//+Mdi7e/L5uT1y1eDs/3m4f3w+b44sX3OxfHA2SrKy7p9/FrQeOmpZXZceN4JFxo/J+MfY79/gM=", "file_map": { "20": { "source": "use crate::default::Default;\nuse crate::hash::Hasher;\n\ncomptime global RATE: u32 = 3;\n\npub(crate) struct Poseidon2 {\n cache: [Field; 3],\n state: [Field; 4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub(crate) fn hash(input: [Field; N], message_size: u32) -> Field {\n Poseidon2::hash_internal(input, message_size, message_size != N)\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2 {\n let mut result =\n Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal(\n input: [Field; N],\n in_len: u32,\n is_variable_length: bool,\n ) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\npub(crate) struct Poseidon2Hasher {\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv: Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_0.snap index 34fb35d000e..79b94e8eb28 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_0.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VazW7rRBQeJ3ESO03qC2KDkLgSL2A3yU3ZVaItLHmFNG0XPIVhi8SOPRseA4kNSEhIvAM7NjwDnd455PPnr2566+FyR6rGnnPm/J8z45Mmbj+SMI/o3QmcszCXzxtVj7RKKWjXMJxPwkMW3gcAH/aobEZ8+6R/Wq5OM6Ffj/Ivs0Azpn2MZgT65STQ+bze02dd/JiHd4wh2zO9+zty++cX4TmjPTF8G9H25ftC/gHo5sdndf+8q+XJyuifR6Bfhrj14yIO/dLoX8ahX81CrP0c6M1dM16Np/nKP2MR79FX64T4OdfMV0f8cxc1p6uE+Jk8bJ8B2SeNY59VQvRRnlTYx3w5FjCjZXUrBVqIn4KOiI/Pth/XXoa5EDQTeh67tj64Zvb1ax+GZ66JfpyFuXzmmLu23zkHYvj4bqwOzQHjn7t4OVlCDqiYGwkfqZizvX3Gwn9F69g9nF+Z2Ndn7eccHbl+c/QkzL7+/0q6d9UY44W2Gwl5MrHv7A1s42sfr82FfpyjU1jv0S8Hn1PGP3dtv8TI0SnJw/bhHM2ErIWAcV5lgk8m+LxLtCxGD8n3SHFVsh6Y71Mh60DogfqmtPZFmGPlu7LdhGyXRbZdLmyXddguB5g9o+1s7UvXn+0mQp652Jc8MBsfXmM+XXfCUY98MBYmxGfSIx+kdVE3+eQ98LEYnRHOWZjLZ47CtWNuRryP4vCuzE4D17ahv0tcAV+8X+B3Ae617/WU8L9xe5o34fmY9rMNrBb4gbE0EHZKCf+rMMe+i70HdB3xitw/uTbfzV17GGwBvLmmHAOM60ABMM7dFwBDf/EY0jvawtfL34Au49lQMcLnylDoYbCx0EPVwa7aNSQY1ukxwdAemLNcW1W/wHo5Smeuy7YvFbgJPdu70knlkOF/HebYfUCVQ8ZrBjKpe6zqtxi+uvdNBQ8VKxnBcN+EYHiP4PplsT0StJXtDf/bMJvtMY9j235BOnTdO/04r5s6GP6PYfZ2/c41baburcqenM9zgLEfUG72g9U6PLfmHToY/vdh9vJOgpFs37De8zB9/rUVwPrsA3k+OciBst7LXzf1LgA2FPicMy8EPp4Fpnvh2mcB90lUnwVtfkmymg3HAh/ppYT/Q5j9+8ukKR/W+GOSXeXkU2v8AmT+KTxH/h58J899s8VTz/0+6kRO/P4veWs+8oPzFnN0KPA5bx/L84v69Vy4tp85vjFnFgQ7JGf8uCR+GC/mB8yZrpoxEHT5uwX34ndLTL9uTl/3F+5lDfTtfOExAjji/xLeOZ/M1mdvKOftZlvdLre32/X2+nq12/I571zzjtU3/+1mebo7We02V+vldvnqUf7qt0bseVj8et/+DrT4XFB9lvN6D0f8v9ye5h/hWfWqEoLhOcd3SO7lIgxrGfcOI/W/Vl19ENXXeBv9cOOfu3atiNEPn5E8XHe473MUyTcmz1zIkwt5/Pm7cG2foXxd3xsqfnPSNXYfdgbyqT7sGHRmPdFvKa39GWbVh33q7325kKdwzVqANcJgqo9lMIx77kOgr6xGeL2Uv4akm/qdPhXyd9kCa6Wdr/yb4N9h9vvTYARV87hWdn1vc6whDH3A/5tg8Y464Pco341UfmHO8L0SY25+AK1JB++FwJ938Ea5cC/zfqgGvMU77lrdcRs5Wzdto/yI+IfYUvmxIHy0ncpjzkfVX1Z5zPdfjFOLX8wXvtdgPuK9pu+72G796mq3Wm/Lm8q/njx2F7PvhnG9h2M8+TEJ71bHGd/opYS/SPb6FmCXe1zBz+N93IGXPDDf0xBro7q5ltVt/GHdxjfeed2W0WAzgGGs+3EU3tFeSMvkSAn/I6i1fkxhj+0vBP8p8W/ILdYw5pnWUKzh/159EDZZ3KLufd/f7nkSfVxj2Sx2Ynzj3KXUZrfdVNWnq+pmVa0fy6t/AIHsj4/5LgAA", - "debug_symbols": "1Z3dTuMwEIXfJde9iMd/Y15ltUIFCqpUFVRgpRXi3TdGTdptwli2UHXmBjXIQz5q+3xpYysf3cPm7v3pdrt/fH7tbn59dLvn+/Xb9nk/HH18rrq7w3a32z7dnv+66/MPS1/tX1/W+3z4+rY+vHU3huyq2+wfhlfBD/WP292mu/H952rW1Mb+2NRZNzWlpaZExh/bElkrN/YuHtt6x+dNf686azVCO43QXiN00AgdNUKzRuikENr1GqGNRmiNRnQajehgjchmhGa6hIY1ogQNa0QJGtaIEjSsESVoWCMK0B7WiBI0rBElaFQjhqlt+L9phkY1ogiNakQRGtWIIjSqEUVoVCOK0KhGFKFRjShBB1QjitCoRhShNRoxaDRi0GjEoNGIAcOImQRDc5kEw12ZBENIA0nEsEwmwVBHJsHwQSbBCPlMgpHcmQQjjjMJTMZGmIyNMBkbYTKWYTKWYTKWYTKWYTKWYTKWYTKWYTKWYTKWYTKWYTI2wWRsgsnYBJOxCSZjE0zGpqvOYn8iCeGCxPTXHLLRjW0p+vbGX9wEym0Cu5Eh9jTjtkq5nVJur5Q7oHLHNC4EMmzmeRKVcrNS7qST2/RKuVF9WeKG9WWBG9aXBW5YXxa4YX1Z4FbqS6PUl0apL41SX5JSX5JSXxKsL5OdGJKbc8P6ssC97MvIUx+Fc+6vEl9fEupLYn0JV5fYa05vS+PIH76a8pc9YQ0OCuGgXHNeWWMnFAqFedVPk3D4EJtm3E4pt0flNn763sbE2fc2V92y+pPcUSk3K+VOsNwcRgbqZ/Pyqpsqq7gdjRtfhpez99vB5neBGza/C9yw+V3ghs3vAjdsfhe4YfO7wA2b395N3vHRXHJfdbPlT3Ibpdywvixww/qywA3rywI3rC8L3LC+9OnEYOyMG9aXBW5YXxa4cX0pcgdcX8rcuL6UuXF9KXPj+lLmhvWOPd0vsH52/R1gvVPghvVOgRvWOwVuWO/I3BHWOwVuWO8UuGG9U+CG9U6B2ynlVurLqNSXEdeXYbqfb3n2uTji+lLmxvWlyM24vpS5cX0pc+P6UubG9aXMDetL+T4JK70PyErvA7LS+4CM4Z0BhfrFqRbD+PdjcLOSxXc9hfE0Kc7PwvUlqbpkeZuNXLJsJHG5Fn2zvaRQZFuKXEuRbykKLUWxpYhbilJD0TfLyAtFLSOCWkYEtYwIahkR1DIiqGVEUMuIoJYRQS0jwraMCNsyIpaX0Iq5urx6NdG4oz25eYmvTrzlNYTyWVJ1yfKDH+QSU19C1f/+8tI4ucTVlyz3C4+9n5KdlYT6klhfUhLxQkm9iH29iJeXvMgl9b3v63vf1/e+r5+VyysL5JL6yzBffxnmK3v/czj6sz5s13e7zfExXo/v+/uzp3q9/X3ZXDzg6+XwfL95eD9s8qO+Tk/5yqOIQlgRx3zVnA9NopVJX4d5wBDzilI/nHU48z8=", + "bytecode": "H4sIAAAAAAAA/9VavY7rRBQex3YSx3HihY6KR7A3zs3SrcTeRUKi4Q18c+9K0CLRIbmk4TGQaEBCouYRaHgLhESBaKjYWebgz59PvFntDIKRVjP2OXO+M+dvZpyNTN8i1yf0bBSea9dXz2u1R1mVquhUE57cDTL3PAN67HGxGeH6lH9VNVeZsj6P+u8yJzOkfURmAPnVwsn5oOvl81psK9wzxpDMWd7/rU0/vnDjjOaE8G1A21dvK/rPYG22vd/5x653l43Ivwkgv3Jxa9vLMPIrkX8bRn6du1j7xskrzDBeBVN8ZcdYxD36ah8RnjHDfDWEvzJBc7qOCE/0YfvMyD5pGPs0EclHfVLFPuLLuUITWVK3UpCF/CmsEflxLPPx3buuLxWZEY3nZrwefCf2te/ecWOuibZdu756ZivM2O+cAyF8fN+ac3NA8FcmXE5WkANazCWKj7SYk7k+Y+HfksX+tu3a9U8y5H3+8rtC0YlxMd88+vXsWiv4K8VGIeJsQfqc8pnYbqnoWio0jo2lgrNUcP5PsiRGCzOO2ehELzj8jnGm9pfEIw7WsTnhzD3ioCw5uwnOwgOO5O+SeK5dXz2zlWZcH5aEnYXBrsVOMzO2obXrh4Br/1buGc8YOFfO/inxf2p6mR+58Zbmsw2kLtmGsTRT7JQS/8euz0gPz7WuegvkGsIKfBdrC8LDJrQcsLmmrIHGdaAAGufuBmjoL24xPaMtrN++A7nMJ02LkZRosbIOoa2UdWh1cKp2xUTDfXNFNLQH5izXVu3uIfdCbc1cl2VeqvDyPiTP2pq0HBL+T1wf+puClkOClYNOEsvGTN/dhH+t8OcKhhYra6LhvDnRMI+4fklsJ4pszfbC/5nrxfaYc6Ftv6E1rGENbEfbbrrhGoT/K9dbe31uhjbT6pJmT85nrS5tzXRdihyP6BiTLG0Nwv+F662ffnVjmRd3PYasR3I+AZrPO6XV4zfQA3V90L8brrsEWqzwc85cKPwl8MjaS+Ln/MFnlIU2vyVdxYZzhZ/PHsj/peutbdJoqB/W+C3pruXkU2v8BnT+2o0zM45xjzFw5P0bm7Z/876PecL7/hZovO9jHDx13xdbPHXf91EnFoT3X8lb8YNtnLeYo7HCz3n7WJ6/7P7uSzP2Jcc35syGaOfkjG23hIfxIn7AnJmqGTNFLt9bcC7eW0L69XBVVRKzElOyv3BLgI7837pnrJ3SJ8/Q8+7Q1ne79q7dt69fN8eW93ljhmcs7XcD/OYg8WNt+z3IQr/j3opzb7qejvw/mV7mD268NeMYjIiGtZnPcPyNDWl4f+d6gWd1kR/67sj7Hp6vEBN/b+aaiOcw3hd/dL1d9zLq56BMA5j4bup7akb2ycLYp+E7rGAg9joM9tnfVAV/ZYLu+f98U9XuNNo3VbFPEcg3os9G0SdX9LlwvOwz1E9k4R4jsSVxiLbn3yJwL8iJhr7jb8uIJzXCztfqDcpBWVrt47nsK61Wyv7Gv8H97Ho7/xc31moe10qseVwrOW+RhvWHf2fUYlD7ri38hcKPMcDnOsyh4gxZiwlsLT6LCWzUC+cyNusp87QzJn7LtS0Bms+apZ0xB/sD4J7yo5a7U7bU/FgSP9pOy2POx3PzmGsDximeBSVf+FyD+YjnGt9nseP+xatjs2+rN7V9vHzsLCbn9nnX0zGebFu4ZzkzML/IS4n/d1jvH6a3ywNvN8azfEl0mi860T/IUN4l3fBd1o35427ML9irbqyj0HKgYazbtnbPaC+UJXqkxB85AeKTJcyR+aWCvyT8gd7KO4x5lhUr7/D/KP4Uea7Htfs+gzxgknx8x7pJ7OTGf17dp9Th2B7q+r2mftPU+8fyyjd+e9hdHS+b4+HVftfuXjx6x/oLEeQWlkUrAAA=", + "debug_symbols": "1ZxbTuNAEEX34u98uKvfbGU0QgEMihQlKISRRoi9jxvFTiY21SoLRbd+EIa6+CSdroMf7Y/mqXt4f7nf7J73b83dr49mu39cHzf7Xb/18blqHg6b7Xbzcn/546YtXyx91b+9rndl8+24PhybO0N21XS7p/674Pv882bbNXe+/VxNSm1sT6XOurGU5kqJjD/VElnLF3sXT7XepcvS36vGWo3QTiO01wgdNEJHjdBJI3RWCO1ajdBGI7RGIzqNRnSoRgxjbfi/tECjGpGFRjUiC41qRBYa1YgsNKoROWiPakQWGtWILDSqEVloVCOy0BqN6DUa0Ws0otdoRI9hxEKCobmeJGC4q5BgCKmQYFimkGCoo5Bg+KCQYDT5QoLRuQsJRjsuJDA9NsD02AjTY+NNZ7E/k4RwTXLLT2x0Qy1Fv7y4YCdQbBOSGxhiS9fYWSV2anViG53YhIod83Dq1iRz3UmS1YntdGJ7ndhBJzaqJSvYsJbksWEtyWJnWEvy2LCW5LF1WjLrtGTWacms05JZpyWzTktmWEtmOzJkN8GGtSSLbdp5TcY0jlC45P6KGHmE5BErjzh55JZz29Lwue/PQfnJSEQclISDcst5ZY0dUShU5lU7TsL+/crX3KZVym1QuY0fz9KYSBNuUsptlXI7pdweljuFgYHa6bxMqNyOzMDgaPp+w/Zvnptg+3eFG7Z/V7hh+3eFG7Z/V7hh+3eFG7Z/ezd6x0cz4Q5KuaNSblhfVrhhfclzW1hfVrhhfVnhhvWlz2cGYyfcsL6scMP6ssKN60ueG9eXPDeuL3luXF/y3Li+ZLkdrHfs+XqB9ZP/vx2sdyrcsN6pcMN6p8IN650KN6x3Ktyw3qlww3qnwg3rHZ7bwx6nVbiV+tIr9aXH9WUYr+fbNDkuvukK3Z/kxvUlz43rS54b15c8N64veW5cX7LcQel1wKD0OmBQeh0wKL0OGDC8U1DmFz/GMPz9GK7XHZr5pXA5DLvJcbKX+WVofITkESuPOHnEyyNBHonySJJHsjiS5aOf5aP/zdIG/ja6bxYWVEJuScgvCYUlobgklJaEsjxE39zJXAmZJSFaErJLQm5JKEj7KM3fe5xpWKqe3TQinuI0f28pu5f52zr5iJVHnDzi5S8/yCNRHpkflzSMfs52EsniyPztcXyk1npnImLxEll5xMkj8tEn+eiTfPRJPitJLF6yrTxi5BHh6H/2W3/Wh836Ydudnqv+/L57vHjM+vHva3f1xPXXw/6xe3o/dOXZ6+fHrpcXSDavKLRFSGXT9MeJJtqyWV4LBdP/1vZ77ff8Dw==", "file_map": { "20": { "source": "use crate::default::Default;\nuse crate::hash::Hasher;\n\ncomptime global RATE: u32 = 3;\n\npub(crate) struct Poseidon2 {\n cache: [Field; 3],\n state: [Field; 4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub(crate) fn hash(input: [Field; N], message_size: u32) -> Field {\n Poseidon2::hash_internal(input, message_size, message_size != N)\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2 {\n let mut result =\n Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal(\n input: [Field; N],\n in_len: u32,\n is_variable_length: bool,\n ) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\npub(crate) struct Poseidon2Hasher {\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv: Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index e971149538a..449d8ab49ed 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/bench_2_to_17/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "5Z3dTttAFITfxde58J7951UQQgECshQlKIRKFeLd643iQHF6VmldM3v2BuFmHb4p9cxk1+u+NQ+ru9en227zuH1prq7fmvX2frnvtpv+6O190dztuvW6e7r9/MdNm77o9jD+5Xm5SYcv++Vu31wp0otmtXnov3O2P/+xW6+aK9u+L0ZDtW+PQ402p6F0biiRssexRFrzg63xx7HWhM9DbxaNViVCU4nQukRoUyK0LRHalQjtS4QOJULHAqFNiYloSkxEA5uIQQ3Qgb5CwyYiBw2biBw0bCJy0LCJyEHDJiIHDZuIHDRsIjLQFjUR3Wms+31ogkZNRBYaNRFZaNREZKFRE5GFRk1EFho1EVlo1ERkoVETkYVGTUQO2pWYiK7ERHQlJqIrMREdRiImEoyYSyQY2ZVIMAIpkWCkTCLBiI6exGPkQSLBMPlEguHciQTDjhMJjMd6GI/1MB7rYTzWw3ish/HYAOOxAcZjA4zHBhiPDTAeG2A8NsB4bIDx2ADjsQHGYyOMx0YYj40wHhthPDbO+i/WfpA494VEtXP+erwZxpK3fz/4wK1BuZULZmDwLY24TaHctlBuVyh3ROX2cbglSQXl+MHeDW/s3egSVqjWc5HE6Abe6EfuqmBdajqJsIY2nURY77tEYh89wzurNsSRSFijnFKkr0FkqEGkiHzMiKS2BpGqBpEiuk5OpIi2kxNpahBZQ+OhGhoP1dB4qIbGQzU0Hl1D49EFNp4Dd4El5sBdYC85cJtCuWHbQ9QnhmjG3LCFIMN9PuN9OP2O3Gfuwynh8lPixaf8YS8we4q6/BQRHzvYqXJToBOcmWSlYSUymrFEEUWVlyiipvISRZRUVqIVUVF5iSKm5Ng1HSt/8dHKX3ycdRvq/5MYhjeOUY8kipiK4yWKmIjjJcpoNx/X4hmJMtoNazcy2g0n0cloN6xE+e3GyW83Tn67mXVL8TdJlNFuWIky2g0rUVq7OSNRfrvx8qN/1q3MmgZq0tqOUAwOisVBmdMstdInFPq3Jd1Z9z5PyR1Qufu5nYFB+dH2iFn3VU/IPesu7Cm5VaHcBMsd3MBA7ei6nHXv80XchoYnXfbfjv++Yf07ww3r3xluWP/OcMP6N88dYf07ww3r3xluWP+25pQ71qsRty6U2xTKDZuXGW7YvMxww+Zlhhs2LzPcsHlp4weD+rooSC1sXma4YfMyw42blzw3bl7y3Lh5yXPj5iXPjZuXLLeC9UH9cWu5tsQP5u5RJgV7CV8ikVs+IAV7tU8nEdYYppMI6yGXSOQn9knBFvQpRcK2+SlFwlb/CUWSiHzMiYT9UDGlSNhPIFOKFNF1ciJNDSJF9J2cyBoaD9XQeKiGxkM1NB5dQ+PRNTQejdt43GnbvA5qxI1bYnhuUyg3btXguXHbA8+NWwh4btyM57nLvKeHTJn39JAp854eMrB5meHGyJ0DiojPOuxykhHxSYd7zAZZEe2YlyhiNpCXKGPdk5WI27gnkyh/3dOKmAXkJYrIRV6ijFxkHpZCVsT8HyvRiZj94yXKaDfMI2/IyWg3nN04+Xd1zfqYjW+SKL/dOPntxslvN05Gu2Elymg3nEQvo92wEqW1mzMS5bebeR/CMr/E9/7ox3LXLe/Wq5f+jPTi6+Z+3203x8P9z+fhlbtdt153T7fPu+396uF1t7pdb+/Ta017/HJNwS1062/Sf1CaDr1fUKB0mC4HrdSiF9n/1P4n/wI=", + "bytecode": "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", + "debug_symbols": "5Z3dTttAFITfxde58J79Na9SVShAiiJFCQqhUoV493qjONAYnVVa152d3iCM18k3BJ8Z71mb1+ZhdffyeLvefts9NzdfXpvN7n55WO+2/dbr26K52683m/Xj7ccfN23+Ytvj+Oen5TZvPh+W+0NzY8QumtX2of8u+P74b+vNqrnx7dtiNNTG9jTUWXceKp8NFTH+NFbEWn2wd/E01rv0cejXRWNNjdBSI7StEdrVCO1rhA41QscaoVON0F2F0K5GR3Q1OqJDdcRwHht+HZqhUR1RhUZ1RBUa1RFVaFRHVKFRHVGFRnVEFRrVETVoj+qIKjSqI6rQNTqir9ERfY2O6Gt0RI/hiJkEw+YyCYZ3ZRIMQ+pJAobLZBIM68gkGH6QSTCKfCbBqNyZBKMcZxKYGhtgamyAqbEBpsbGWf9i/TtJCJckc3460Q1jJfrfH5yxO1BsE5IbGGIrF9iprRPb1IktdWJ7VOzYDZPIJpmgD45heOEYLs/ehFp0rlLYhYG3i5dlNcHWp6kUdrClbDKFsFVvMoWwBXIyhZZeoaNXSOGHqsJArzDSK6TPNB1FpjHt+ZVNm7oLjaaliDUlkRTJpiSSItyURFLkm5JI9z+IpEg5JZEUQackssKsc+SuMMEcuSvMJZnbVBg1jtyw6aGzZ4bOjblhA0GB+3OPj+n8GYWP3MdD3PWH+OsPCdcfEq8/hOKyQ5sON8IxlypDn7FzY4kcE3GqRIqYqkvkmIpTJXLMxakS6SfjjNDPxhmhbzEay+GLaXjhrrMjiRxNRlUiR5dRlcjWZvxEouMvN/SNRmPpO43G8qcby59uLH+6cfQrqIyjX0JlHP0aKuPoF1GZWW/M/0cS+a1/1ru6rQzUYq2/RJn1Xu0CisFBmbNYWmPPKPJnLd1Zb62ektuhcvdoA4OJMuL2lXKHSrljpdwJljuFgUHa0Xk5653NV3E7MQODk9HvO8DW7wI3bP0ucMPW7wI3bP0ucMPW7wI3bP0ucMPWb+/OvuOjGXF3dXLHtlJuWL8scMP6ZYEb1i8L3LB+WeCG9UvfvTOYUVMwwvplgRvWLwvcuH6pc+P6pcqdcP1S58b1S50b1y91btg6aN+Xllsv+mB1jXKCPYWvkai2DzrYs306ibCFYTqJsDVkOomw8Xw6iY5fImzon04ihS/qEmEvJaaTCHvVMZ1E+nQjLUW60Rve0lLkm5JIioRTEkmRcUoi3f8gkiLnlERSJJ2SSIqsUxKJm3bC+TZ5m8yIGzfCqNwGN5fo3LhRQ+fGTQ86N24g0Lldpdx1ruERU+caHjF1ruERA+uXOrdg+M4RheJaR2sfieBWwWsmWJTHaohwzASqEjlmAlWJHDOBmkTL0edUJdL3OcXS9znF0vc5ZdbHavw9icrDUcRy9DlViRx9TlUiW5/zE4n0fU6x/H1OR7+KSxx/unH86cbxp5tZH6vxjyTSr+ISR7+KSxz9Ki5x/OnGk1v/W7/1fblfL+82q+f+iLzzZXt/WO+2p83Dj6dhz91+vdmsH2+f9rv71cPLfnW72d3nfU17+vJFgiwk2a/5nyjkTW8X4lPezAFDUuz3dv279u/8Ew==", "file_map": { "20": { "source": "use crate::default::Default;\nuse crate::hash::Hasher;\n\ncomptime global RATE: u32 = 3;\n\npub(crate) struct Poseidon2 {\n cache: [Field; 3],\n state: [Field; 4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub(crate) fn hash(input: [Field; N], message_size: u32) -> Field {\n Poseidon2::hash_internal(input, message_size, message_size != N)\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2 {\n let mut result =\n Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal(\n input: [Field; N],\n in_len: u32,\n is_variable_length: bool,\n ) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\npub(crate) struct Poseidon2Hasher {\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv: Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index d3727f5c629..708a40bfede 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/92aWVMTQRDHJ2E3YYMI3rei4nsOwvFmlReKyn2fS0LgVV+0ypc8WGX5Bfy80jCD/zTTgMUOVjtV1Gx2ftv9n9lOz0Fy5rAM7v/l7HVk67yt6X5sOotjn9u6fL5SydBWOZTGnAKNeQUauxRojDLUSNoGTGfJWm+sYEwLCjQWFWjsVqAxUaCxpEBjjwKNlxRo7FWg8bICjX0KNPYr0HhFgcarCjReU6DxugKNNxRovKlA4y0FGm8r0HhHgca7CjTeU6DxvgKNDxRofKhA4yMFGgcUaHysQOMTBRqfKtA4GEDjQXkG1ySaDo/pcJYOP+lAkQ7s6ECMDpzoQIcOTOhAgjb8tKGmDSttCGnDRRsa2jDQgpwWvLSgpAUbLYhowUETOk2YNCFRwqeESgmLEsLA/h8FNAUMvZBBIxc3uL9sndg6D+0ZHjBXEuY3S/uj5eGxxNO/DPXXErCZvf1q3dmPwugvF62dl+1O+4b57WIcfwafewXMK4F5DcxrgXkDzBuBGQdmXGDeAvNWYN4B805gJoCZEJj3wLwXmA/AfBCYj8B8FJhJYCYFZgqYKYGZBmZaYGaAmRGYWWBmBWYOmDmBmQdmXmAWgFkQmEVgFgVmCZglgVkGZllgVoBZEZhVYFYFZg2YNYFZB2ZdYDaA2RCYTWA2BWYLmC2BSYFJBWYbmG2BaQDTEJgmME2B2QFmR2BawLQEZheYXYHZA2aPMQlcG5P13DY0FHhuqPeyvhroi/Mdh/E9nGP+jOmclwzzXzIh5+HDHyegP6eHj49bJ/U6pv1HT461Re3j/XBtMbS590vrxHHgfLFFxb2bEGu2/bgbCxt31fK/i7tq5X+MO94WtY/342/jjseW42bhet5eh82Dw2Mh453KNY9+9EWl2DZHxY1HF9xz4+rGuRt51pZAW9Tu9FOynyPwg7acjpjxM/Zzn60L8Ix7vt/jv8D8d+j23OPjknj4xMPTXnjCXtMe2O3bXrQ77T23dfl85eAf/xSjn629s+ScQPnuzDnH+b+onBMxPTmmMc/GJ9BaoO78Fjx6fDnwir3m7wz1OVsDtu4zp8+nofbgPMdH0D/0mYN+8v7g/BCze01bU7x/ZfZ4zEnvuN8cj7mLWgu67ya+f1dcW5H5xrZuaOP5ybD+Y8E+kY1vYJdzXA/GkdMWs7ZPtg49f11lOtEX5tqonb3/kdHD+Kbi5rnYHB9r9B8z/ov9XPL04zw/JG2NpJVWLW2l9bTZHGqkfJwMG6es/acjtdFGdagxsl2vpbXhU/375ivM0TmhPhjLE2z3e2y5eTfwd7vs7BeC2K8e2S+G0V/h6wYcK+rTd7iPbe47wJ8tQDvyP8HmD3vtm7PcO+yB9tjT7p7D8/GT8r+7X/LweIbfxbRh7i2dwVb+BN89Hr50gm/U1SP4juAeak0Y3+3RFHv6xr9L3C4+h/3AGHCxetbY+g2/sOxpZTIAAA==", - "debug_symbols": "ndbdioMwEAXgd8l1LmbGaExfZVmKbdMiiBZ/Fhbx3Te6FsUK5XhTGDlfg55Wplc3f+ke57y8V406ffWqqK5Zm1dlmPpBq0udF0X+OK8vKxo/0mTKN8+sHMemzepWnWKrlS9v6mRt0Pe88OEaDd9apRbMp2DeYXlHYJ7BvID5CMwbMB+DebBfB/brwH4d2C8ToYBRsFuxoxkwJW8igoWBRQyLBBYWFiksHCqYYMGwgDsXuEGBGxS4wWj3PthZfhmX8oL+TbxvXDIbIUm2xh44Z/e3IkTLORxtjcONoQOG9w3b5RnEWyMHTHTAmM/3s+5Hv/ciZF69CNvt9x/o3yQHjAXNEIafrM6zS+HnxeXeldfVHtP+Pv1mpXnW1dXfutqPy82y14zP3YpOZXoHhYHZaGY3/fnHUUizSDgznPsH", + "bytecode": "H4sIAAAAAAAA/92aWVMTQRDHJ2E3YYMI3rei4ntCCMcbVcp93/exBAL6os8+xSrLL2CVn1caZvSfznRE2dVqp4qazc4v3f+Z7e05SMZclN6zv4y9DmydtTXdD01jceyIrYtXK6UEbRXT0phRoDGrQGObAo1BghpJW49pLEnrDRWMaU6BxrwCje0KNEYKNBYUaOxQoPGaAo2dCjReV6CxS4HGbgUabyjQeFOBxlsKNN5WoPGOAo13FWi8p0DjfQUaHyjQ+FCBxkcKND5WoPGJAo1PFWh8pkBjjwKNzxVofKFA40sFGntT0HheXsE1iabDYzqcpcNPOlCkAzs6EKMDJzrQoQMTOpCgDT9tqGnDShtC2nDRhoY2DLQgpwUvLShpwUYLIlpw0IROEyZNSJTwKaFSwqKE0HP2RwFNAUMPpNfIxQ3uN1tHts5Ce4IHzKWI+U3S/lBxYDjy9C9B/eUIbCZvv6/i7Afp6C/mrZ039Ub7hvltYxz/Dn5vFJhRgRkDZkxgxoEZF5gJYCYEZhKYSYGZAmZKYKaBmRaYGWBmBGYWmFmBmQNmTmDmgZkXmAVgFgRmEZhFgVkCZklgloFZFpgVYFYEZhWYVYFZA2ZNYNaBWReYDWA2BGYTmE2B2QJmS2C2gdkWmB1gdgRmF5hdgdkDZk9g9oHZF5gDYA4EJgYmFphDYA4FpgpMVWCOgDkSmGNgjgWmBkxNYE6AORGYU2BOGRPBtTFJz239/SnPDZVO1lcDfXG+w3R8D2SYP2Ma5yXD/BdMmvPwxY8T0J/Tw8fHrZM6HVP/qSfD2oJ6cz9cWwht7vnSOnECOF9sUXHPJo0121ncDacbd33Ffxd3faX/Me54W1Bv7sfvxh2PLcctw/WqvU43Dw4MpxnvVG559KMvKvm6+VHceLTBPTeubpzbkWdtEbQF9UY/Bfs5AD9oy+kIGb9kP3fZOgffcd/v9vjPMf8Nuj33+LhEHj7y8LQXnrbXtAd2+7bX9UZ7I7YuXq2c/+OfYvSdtXeZnJNSvrt0znH+/1bOCZieDNOYZeOT0lqg4vzmPHp8OfCGvebPDPU5Wz2sD2mvpfgPPal0Mk3YL9eWhzb+jhk2Llh4Hv8AdjnH9WDsOW0ha3tr67Rz8E2mE31hvgjqyfsfHLr4kSEVl6tD0zzW6D9k/Hv7ueDpx1V+DFkbjEu1clyLK/HRUX815uNk2Dj5ch6+5xmhPu9LC9vdHlsud3eZ5veP51Ye+yN/OB68OF/u/XHzJvcZQn/4+5aHPoXs3kdb07h+Zf3zrdnCFmPnW1+mnFuLkae/Sa7lnf32dPSX+LyNY0XP95PwTELTPIfgOISM/wI2P9vrLtP83Fz8dxh/3AdMD55Pt5pj3f2Ch8cz9DamDWO8cAlb2Ra+Ozx8oYVv1NUh+A7gHmqNGJ/zaAo9feN5iNuV3kuMARerl42tpHN6PFgeqvb1VwcPK+W4PPDLnP4dlLcbjGUyAAA=", + "debug_symbols": "ndbbaoQwEAbgd8l1LmZiNMm+SimLq3ERRMVDoYjv3mhdFGtZZm4WRv5vRx0JM4ncP8bnvayLphe3j0lUTZYOZVOHapqleHRlVZXP+/GygOXHJmu+b9N6Kfsh7QZxi40Uvs7FzZigi7Ly4RrMn1JYQ8xbYt7R8g6IeSTmFTEfEfP6Ku9gyyMkZxBTQUIFhgosFTgiQACyQLJQZBGRBXXciOQeSO8Rk8XlR4XO4Ms4izv6NYZhLMM4ulHAMMgwimEihmG8g+ife3PJZhSo5Gw0o8/l16YA9j4YnU3CMIZh7LVBs7+D+Gwc3WhgGHz/PMf5yL9zUaBfc1Fozv/PmL+OGEYTzRyKr7Qr00flt4WmGOvssN8M360/rTpt12Q+Hzu/LD37vrPcr1HSqvU0DkU43CQirgfHUmojUbvQM/T9AQ==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_0.snap index c45e5e388af..6bba2020657 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_0.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/92ayW8TMRTGnXQm6SQtLfsOBco9S9PlxgHovu97p2nTnpA4wDkSF5D4o+lr7fbLy7xQ1LHgYSmyZ/zze5/tN2OPlYy5SINnv4wtBzbP2pzuh6Y1OfadzUs3S+UUbZV8acwo0JhVoLFLgcYgRY2kbcC0prT1hgrGNKdAY16Bxm4FGiMFGgsKNBYVaOxRoLFXgcZbCjT2KdDYr0DjbQUa7yjQeFeBxnsKNN5XoPGBAo0PFWh8pEDjYwUanyjQ+FSBxmcKND5XoPGFAo0vFWgcUKDxlQKNrxVofKNA46AHjefpLZRJNB0e0+EsHX7SgSId2NGBGB040YEOHZjQgQR98NMHNX2w0gchfXDRBw19MNCGnDa8tKGkDRttiGjDQQs6LZi0INELn16o9MKiF8LA2Y8CmgKGJmTQyMkN7k+bRzbPQn2KB8zliPlN0/5oaXgsSuhfivqrEdhM336l5uwHfvSX8tbO+2arfcP8djGOt8F2H4D5IDAfgfkoMOPAjAvMBDATAjMJzKTATAEzJTDTwEwLzAwwMwIzC8yswMwBMycw88DMC8wCMAsCswjMosAsAbMkMMvALAvMCjArArMKzKrArAGzJjDrwKwLzAYwGwKzCcymwGwBsyUw28BsC8wOMDsCswvMrsDsAbMnMPvA7AvMATAHAhMDEwvMITCHAlMHpi4wR8AcCcwxMMcC0wCmITAnwJwIzCkwp4yJoGxM2mvb0JDntaHWy/pqoC/Od+jH93CG+TOmdV0yzH/B+FyHL/6cgP6cHj4+bp/U65jmlZ4Mqwua7f1wdSHUufmlfeIEcEmxRcnNjY8921ncjfmNu0rp78Vdpfw/xh2vC5rt/fjTuOOx5bhlKK/Yst/34PCYz3indDdBP/qilG+ay+TGowvuuXF149yNPKuLoC5otvop2OsA/KAtpyNk/JK97rN5Dtq49v0J/nPMf4vuhHt8XKIEPkrg6Vt42paL9kcx9M3ec3EXXDX9598Jntblju8E1Jhl45Pzo6fm/OYT9AQJem7bMp8z1OdsDdi8z7Q/gwHrn6e9SCnD9AXQP/SZgX7y/riysW3wXt3mFO8/mD0ec9Ic95v2mMP9Bm+XEXLnx5jrxxKldzYv3SyV+037POeY7zzUpTnPzn63F/uVS/uRH/1lvm/CsaIx/AT3MXZD076nwHEIGf8VbH62Zfd8ZpkPbO/qvpjW+fSxL6B0B+xyTUXQnPQMu3LBXKVO7zTHFxP4AusfjhfGcvEatrIdfPck8MUOvlFXj+A7gHuotcD4fIKmMKFvSc93ntnqtNfF5ycp3l1bjHfHB80rLq04Gxm9WB/OtVr7oWndmxvmP2T8d3uNY+rym/xRujESlxvVuBHX4qOjoXrMnwdKbr6KHvzHI9XRemWoPnJYq8bV4d/6/wUYC5ISLTEAAA==", - "debug_symbols": "tZbLaoUwEED/JWsXM4nm4a+UcvERL4Ko+CgU8d8bUy+K3EUHm40w4cyJzMQ4CyttPj8fdVt1I0s/FtZ0RTbVXeuiZY1YPtRNUz8f52UG20Mnnh/7rN3CccqGiaWJiphtS5Yq5bKrurFuDdbPiGlJ5BWR10Te0HgDRB6JPCfygsjHRJ7YX0PsryH21xD7a4j9RQBqwtsOG9gTEOQ5I/oz6d08oFsEdMfh3Aj33GgUvlij8YB/7eKu3cid5cDl1U6qi89IyBmSnKGDVtTcs3OAo6IoLnYOQe0Y1M7v2lEdZy252kVQexzUnvxn3c9f4ZvTyyF+eTmq65vIkPcBV0HtOph9dcFXNtRZ3th9RqzmtjiNjNN3by/TYz90hS3nwW5z5DFCbudU8Uhz/+dwAQqMUEh/efhQudC4Pd2+Pw==", + "bytecode": "H4sIAAAAAAAA/92ayVPbMBTGlWAnOIFC972lLb0nhLDcemjZ930HEwicOtNDe85ML+1M/+jyQCqfH3opHexpXzWTkWz9rPfp6VmSBTlzkfrPfjlbDmyetzndD00yOfadzSs3S9UU26pkpTGnQGNegcYOBRqDFDWStj6TTGnrDRX4tKBAY1GBxk4FGiMFGksKNJYVaOxSoLFbgcZbCjT2KNDYq0DjbQUa7yjQeFeBxnsKNN5XoPGBAo0PFWh8pEDjYwUanyjQ+FSBxmcKND5XoPGFAo0vFWjsU6DxlQKNrxVofKNAY38GGs/TWyiTaDo8psNZOvykA0U6sKMDMTpwogMdOjChAwn64KcPavpgpQ9C+uCiDxr6YKANOW14aUNJGzbaENGGgxZ0WjBpQaIJnyZUmrBoQug7+1FAU8DQgPQbOTnn/rB5ZPM81Kd4wFyNmN002x+pDI1Gnv6lqL8WQZvptz9Qd+0H2eivFG0771vJ9g2z28E4/gw+9wGYDwIzBsyYwIwDMy4wE8BMCMwkMJMCMwXMlMBMAzMtMDPAzAjMLDCzAjMHzJzAzAMzLzALwCwIzCIwiwKzBMySwCwDsywwK8CsCMwqMKsCswbMmsCsA7MuMBvAbAjMJjCbArMFzJbAbAOzLTA7wOwIzC4wuwKzB8yewOwDsy8wB8AcCEwMTCwwh8AcCkwDmIbAHAFzJDDHwBwLTBOYpsCcAHMiMKfAnDImgrIxaa9tg4MZrw31btZXA31xtsNsbA/lmD1jkuuSYfZLJst1+OKfE9Ce08P94/ZJ3Y5pXerJsbqgdbUfri6EOje+tE+cAM4XW5Tc2GSxZzuLu9Fs426g8vfibqD6P8YdrwtaV/vxp3HHY8txy1BeseVs58Gh0SzjndJdj360RanYMr+S80cH3HN+dX7uRJ7VRVAXtJJ2SvY6ADvYltMRMn7JXvfYvADPuOd7PfYLzH5Ct+ce90vk4SMPT9/C07Zctj+Koa/2nou74PLRf35OyGhdbjsnoMY8808hGz11Z7fo0RN49Ny2ZT5mqM+11Wdzvt4Zk/S9Me3Hx+ePkDHvTCr+OP8DOZ8vnK0eT18DpqsIdWnOY05Tp23PzSHcZgH8hTyWje0T3juxOV1/h2ewTQM28Z4bm15z9d0pMP9kFMeVyNPfNPc1rv0oG/1Vvm9CX1H+URiT0FzdU6AfQsZ/gTY/2bKL6zyzgc+7us8mOZ5Z7Aso3YF2uaay8b+LnC2Zy9RuTnN82cOXWP/QX/jela/RVr6N7S4PX25jG3V1CbYDuIdaS4wvejQVPH3zzY1F1pZvrsC4dO/PdePd8UHrkksrzoZHLubVc622/dAk9+aG2Q8Z/81eo09dfpN/lG4Ox9VmLW7G9fjoaLAR8/eBkhuvcgb24+HaSGNgsDF8WK/FtaHf2v8JQq3Liy0xAAA=", + "debug_symbols": "tZZLioQwEEDvkrWLVGJ+XmUYGj+xCYiKn4FBvPvEYKNILybYtREqvHqRshJrIZUt5ufDtXU3kuxrIU1X5pPrWh8ta0KKwTWNez7Oy4RuDy0CP/Z5u4XjlA8TyYRKiG0rkinls2vXWL9G1++EaBnJq0heR/Imjjc0kodInkXy/B1v6M4DleeE5N/kpk7x1AJPLfHU6p4ajIIXazQccJBrTLlBlAOlqHZAtTNUO0e1p5h2QP2qcLsyRu4so0xe7VGVCRkiOkNGZ2jUit4844zSo6LAL3ZGUe2Aamd37aCOXhNXO0e1p6h28cm6n0/hm+5lNH15Gajrm0jM+4ApVLtGs68++MkHlxeN3Wfxem7L02g+/fb2MqX3Q1faah7sNq8fo/rWp4olmoV/hw+AQwJchssjhMqHxu/p9/0D", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index c45e5e388af..6bba2020657 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/blake3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/92ayW8TMRTGnXQm6SQtLfsOBco9S9PlxgHovu97p2nTnpA4wDkSF5D4o+lr7fbLy7xQ1LHgYSmyZ/zze5/tN2OPlYy5SINnv4wtBzbP2pzuh6Y1OfadzUs3S+UUbZV8acwo0JhVoLFLgcYgRY2kbcC0prT1hgrGNKdAY16Bxm4FGiMFGgsKNBYVaOxRoLFXgcZbCjT2KdDYr0DjbQUa7yjQeFeBxnsKNN5XoPGBAo0PFWh8pEDjYwUanyjQ+FSBxmcKND5XoPGFAo0vFWgcUKDxlQKNrxVofKNA46AHjefpLZRJNB0e0+EsHX7SgSId2NGBGB040YEOHZjQgQR98NMHNX2w0gchfXDRBw19MNCGnDa8tKGkDRttiGjDQQs6LZi0INELn16o9MKiF8LA2Y8CmgKGJmTQyMkN7k+bRzbPQn2KB8zliPlN0/5oaXgsSuhfivqrEdhM336l5uwHfvSX8tbO+2arfcP8djGOt8F2H4D5IDAfgfkoMOPAjAvMBDATAjMJzKTATAEzJTDTwEwLzAwwMwIzC8yswMwBMycw88DMC8wCMAsCswjMosAsAbMkMMvALAvMCjArArMKzKrArAGzJjDrwKwLzAYwGwKzCcymwGwBsyUw28BsC8wOMDsCswvMrsDsAbMnMPvA7AvMATAHAhMDEwvMITCHAlMHpi4wR8AcCcwxMMcC0wCmITAnwJwIzCkwp4yJoGxM2mvb0JDntaHWy/pqoC/Od+jH93CG+TOmdV0yzH/B+FyHL/6cgP6cHj4+bp/U65jmlZ4Mqwua7f1wdSHUufmlfeIEcEmxRcnNjY8921ncjfmNu0rp78Vdpfw/xh2vC5rt/fjTuOOx5bhlKK/Yst/34PCYz3indDdBP/qilG+ay+TGowvuuXF149yNPKuLoC5otvop2OsA/KAtpyNk/JK97rN5Dtq49v0J/nPMf4vuhHt8XKIEPkrg6Vt42paL9kcx9M3ec3EXXDX9598Jntblju8E1Jhl45Pzo6fm/OYT9AQJem7bMp8z1OdsDdi8z7Q/gwHrn6e9SCnD9AXQP/SZgX7y/riysW3wXt3mFO8/mD0ec9Ic95v2mMP9Bm+XEXLnx5jrxxKldzYv3SyV+037POeY7zzUpTnPzn63F/uVS/uRH/1lvm/CsaIx/AT3MXZD076nwHEIGf8VbH62Zfd8ZpkPbO/qvpjW+fSxL6B0B+xyTUXQnPQMu3LBXKVO7zTHFxP4AusfjhfGcvEatrIdfPck8MUOvlFXj+A7gHuotcD4fIKmMKFvSc93ntnqtNfF5ycp3l1bjHfHB80rLq04Gxm9WB/OtVr7oWndmxvmP2T8d3uNY+rym/xRujESlxvVuBHX4qOjoXrMnwdKbr6KHvzHI9XRemWoPnJYq8bV4d/6/wUYC5ISLTEAAA==", - "debug_symbols": "tZbLaoUwEED/JWsXM4nm4a+UcvERL4Ko+CgU8d8bUy+K3EUHm40w4cyJzMQ4CyttPj8fdVt1I0s/FtZ0RTbVXeuiZY1YPtRNUz8f52UG20Mnnh/7rN3CccqGiaWJiphtS5Yq5bKrurFuDdbPiGlJ5BWR10Te0HgDRB6JPCfygsjHRJ7YX0PsryH21xD7a4j9RQBqwtsOG9gTEOQ5I/oz6d08oFsEdMfh3Aj33GgUvlij8YB/7eKu3cid5cDl1U6qi89IyBmSnKGDVtTcs3OAo6IoLnYOQe0Y1M7v2lEdZy252kVQexzUnvxn3c9f4ZvTyyF+eTmq65vIkPcBV0HtOph9dcFXNtRZ3th9RqzmtjiNjNN3by/TYz90hS3nwW5z5DFCbudU8Uhz/+dwAQqMUEh/efhQudC4Pd2+Pw==", + "bytecode": "H4sIAAAAAAAA/92ayVPbMBTGlWAnOIFC972lLb0nhLDcemjZ930HEwicOtNDe85ML+1M/+jyQCqfH3opHexpXzWTkWz9rPfp6VmSBTlzkfrPfjlbDmyetzndD00yOfadzSs3S9UU26pkpTGnQGNegcYOBRqDFDWStj6TTGnrDRX4tKBAY1GBxk4FGiMFGksKNJYVaOxSoLFbgcZbCjT2KNDYq0DjbQUa7yjQeFeBxnsKNN5XoPGBAo0PFWh8pEDjYwUanyjQ+FSBxmcKND5XoPGFAo0vFWjsU6DxlQKNrxVofKNAY38GGs/TWyiTaDo8psNZOvykA0U6sKMDMTpwogMdOjChAwn64KcPavpgpQ9C+uCiDxr6YKANOW14aUNJGzbaENGGgxZ0WjBpQaIJnyZUmrBoQug7+1FAU8DQgPQbOTnn/rB5ZPM81Kd4wFyNmN002x+pDI1Gnv6lqL8WQZvptz9Qd+0H2eivFG0771vJ9g2z28E4/gw+9wGYDwIzBsyYwIwDMy4wE8BMCMwkMJMCMwXMlMBMAzMtMDPAzAjMLDCzAjMHzJzAzAMzLzALwCwIzCIwiwKzBMySwCwDsywwK8CsCMwqMKsCswbMmsCsA7MuMBvAbAjMJjCbArMFzJbAbAOzLTA7wOwIzC4wuwKzB8yewOwDsy8wB8AcCEwMTCwwh8AcCkwDmIbAHAFzJDDHwBwLTBOYpsCcAHMiMKfAnDImgrIxaa9tg4MZrw31btZXA31xtsNsbA/lmD1jkuuSYfZLJst1+OKfE9Ce08P94/ZJ3Y5pXerJsbqgdbUfri6EOje+tE+cAM4XW5Tc2GSxZzuLu9Fs426g8vfibqD6P8YdrwtaV/vxp3HHY8txy1BeseVs58Gh0SzjndJdj360RanYMr+S80cH3HN+dX7uRJ7VRVAXtJJ2SvY6ADvYltMRMn7JXvfYvADPuOd7PfYLzH5Ct+ce90vk4SMPT9/C07Zctj+Koa/2nou74PLRf35OyGhdbjsnoMY8808hGz11Z7fo0RN49Ny2ZT5mqM+11Wdzvt4Zk/S9Me3Hx+ePkDHvTCr+OP8DOZ8vnK0eT18DpqsIdWnOY05Tp23PzSHcZgH8hTyWje0T3juxOV1/h2ewTQM28Z4bm15z9d0pMP9kFMeVyNPfNPc1rv0oG/1Vvm9CX1H+URiT0FzdU6AfQsZ/gTY/2bKL6zyzgc+7us8mOZ5Z7Aso3YF2uaay8b+LnC2Zy9RuTnN82cOXWP/QX/jela/RVr6N7S4PX25jG3V1CbYDuIdaS4wvejQVPH3zzY1F1pZvrsC4dO/PdePd8UHrkksrzoZHLubVc622/dAk9+aG2Q8Z/81eo09dfpN/lG4Ox9VmLW7G9fjoaLAR8/eBkhuvcgb24+HaSGNgsDF8WK/FtaHf2v8JQq3Liy0xAAA=", + "debug_symbols": "tZZLioQwEEDvkrWLVGJ+XmUYGj+xCYiKn4FBvPvEYKNILybYtREqvHqRshJrIZUt5ufDtXU3kuxrIU1X5pPrWh8ta0KKwTWNez7Oy4RuDy0CP/Z5u4XjlA8TyYRKiG0rkinls2vXWL9G1++EaBnJq0heR/Imjjc0kodInkXy/B1v6M4DleeE5N/kpk7x1AJPLfHU6p4ajIIXazQccJBrTLlBlAOlqHZAtTNUO0e1p5h2QP2qcLsyRu4so0xe7VGVCRkiOkNGZ2jUit4844zSo6LAL3ZGUe2Aamd37aCOXhNXO0e1p6h28cm6n0/hm+5lNH15Gajrm0jM+4ApVLtGs68++MkHlxeN3Wfxem7L02g+/fb2MqX3Q1faah7sNq8fo/rWp4olmoV/hw+AQwJchssjhMqHxu/p9/0D", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index afeedcb8d8d..ab9fb886c73 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/91YTY/TMBAd56NtWlZdwQGJG0jcs5uWllsRi8R/4BS6qsSJE0gcEDlwQ4K/TF089OVlmkUQg5aRIjueycyb8die2MkPSvaPC/0stA7aVNqkvE1oyz+jiwF1lbEwuluAMYmA8UApTX4ip0md+hbaIrQJ8NMBnS7I7pD61+ViXRj+DYi/KiimsfSncfSX46DnRXPUz75oHjiJNk/LyH5WZ9LNfUe+ZXFsLxzZE/JTyP5UoubUhSN7iofjo/0zlWmOeBzxsqbrh/Lypu2Hp8n+uQ9ynFsJyD2C/uPQj5yP68jrurzX47OOjRv5SRq3FMY0rhrnCcoTrwBe1rTtTMN7BnZQl+LISf5heJ+HdgTf6Pfnhv0R2W/hNsY4LoUhXxjyo/3zIPRncjzLnjdHfTHOsivAMpRuj9/nf6X+Stxz50zs4tGT8nC/tPY4JasAxfX9FPSynPyH/j4DvSynhPmaNcP7vFqXpdrTvSIX2/8M+Ci/Du9Twq+x2vwmzt2qvthV9a5e1tfXi219l/R7SiBOuC6cdOcxlfacedI9YC6nax6h73LpnpFXTZvHPwWx6zeODdri2Fi+ur+Ek2sOPWvYpmJLpLvmsF7JaexlaL2/78k/nK++OudcTp/JsesBrkFlON3Lvvot5h6zp4Wfjw9Bl+6jOfiYE6YR8FJDnnN3bMiPQIbndgy8DGIQcW4vf8U3tD+Xbu6PCCvq2gyEUyhGeQ+OnGRfEb5JnFia+92EbEf6j6sc2ROx51Htz6Wbc4wVc3szEE62lRs4cuKp7JbwFXFiac4j2joVZwdjfIZbcb4pFp6uGjsWb25JLKy9oy8WyYlYWOtbZd9SLP7F+u7bR7n2xFgkhn8i/bWdtUZU9h3FItJ+Y8ZCbfnabui6u15V6+3lYrt6vazq6smNdbf13481hie9O8C7BZTHXET5jyq7fz6FPt8noT0v97VHzp1oDzqMsaxpj1l3DngXo/Jqe9p0MSpvBjysfzzdCe8YL9SlOHKS/xLedU7w/kS/PzfsT8h+C7cxxncxM0N+Zsj7+fms+kKLvg99v3mwSfpxjLFp7vi8/g790XW8WRsAAA==", - "debug_symbols": "ldfRioMwEAXQf8mzD5kkM0n6K8tSbGuLIFqsXVhK/31jqWyJAbkvYiSHxNxEmYc6NYf7Zd/25+Gmdl8P1Q3HemqHPrUez0odxrbr2sv+87HS88WGV//bte7n5m2qx0ntSEKlmv6U7gIlf267Ru1YP78rZSMqnIYFwcLAwsLCFUWktzCkc8GwEFh4WARYRFRwcQzj/SJWq8sRFaK3hOSCYGFgYWEBZy5w5gJnLnDmXsOCYGFgYWFRPOeOli+DMyYXDAuBhYdFgEVERdCwIFgYWBQzd2IXIT4XDhYMC9kQfvUeHhYBFhEVUcOinHmQRcT8DEYDCwsLtyU4FwwLgYWHRYBFMXMm/RZMLhOkNU5oi8QVMTixOHE4KSbPdtnzbP2KCE78BnFmRQJOIkxI46ScPi+7kkWviMGJ3SK8Ig4njBPByDO1fuqxrQ9d867azvf++FHETb/XJqvnruNwbE73sZkru/+ibg6LDFXkTJrKvELGVta+sk8NporlNce5X/qNktFp/DSHPw==", + "bytecode": "H4sIAAAAAAAA/+VYMa/TMBA+J3HbtFStYEBiA4mNIX1JaSWWIsoEG78g9KkjExOTGRALGxL8Xeo+H718ueYhiIUKJ0VO7C93353P58SGbiQ5XCbcZ6E1ok2pKTy2CW3xZ7LoUVcRi6O5AI5JBI5HSWHyEzov7NT30OahTcR42qPTOdjtU/+6qNa54l+P/MscYhpLfxpHfzEMel66k370hfPAULR5Wkb2s5xSO/cN+JbFsV0ZsEfgJ4H9MUXNqYUBe8wH48P3U8a4Ex8DY5lr+8Fj1jX98DI6XPcFDnMrEbhH4v5xuI+cj+vI67q41+Ez9w0d/RSOWyr6OK4c55HEw1guxjLXtDMOz5mwI3UxDwv4h+F5FtqBeIffnyv2B2C/wVvpw7jkCj5X8IPD9SDcT+i0l71wJ30x9rKt4NKXbs/f5/+zoG9G7ZzBehZrz8D6wXmDNhMxH1hfZe2x0PcktN7f5+CfrE9dNWtO59dX5LVdTRUfWXjMgl9Ezf1B+igFa+NW6EUc/YP+vhZ6Ecci13rm+vd5tb5ZA0e+Qb+lNndp3wJ+E57HwJ/j+Ls896t6sS/rfb2sr6+rXX0X9HtJRJz6tl+vyvXuqtqt3i7Lunx6q31Z0zg3ZBxTauaMF67fWg3Efx1+z1K7Vmxdc4yxr0Ibu45ibKSt/6nevwnthdb7Av8fqD/dy65v75g17iCVn4+PQRfWcS8WOA3EWKrgMXeHCn4gMDi3QzGWiRhEnNurX/FN2p9RO/cHwFXq2vTEkyBGtoOHBewe+I3ixFKtdyOwHekfvDRgj0ifR7Y/o3bOIVeZ25ueeKItq/CwMMbYd8AvjxNLdR6lrXNxNqIP93AtzrfFwsvW6bF4fyGx0GpHVyySM7HQ1jdjP0As/sb67qqj+O0pY5Eo/hF1f9tpa4SxDmIRqd6osWBbE9LPTOQe74XPXeS5jMTLXJD4T4w9XJ/DPZ7FSXse960DZ860Rx1KX+aafdp5jTzHYjzbHrs2Rx6biDH5/eHlTniW8ZK6mIcF/NfwzHMiz574/blifwT2G7yVPjzHmij4iYL38/OF9YVW+t732fDRJuiXfciNc8fn9Q8fhQNplRwAAA==", + "debug_symbols": "lddRioMwEAbgu+TZh0ySmSS9yrIU29oiiBZrF5bSu28slS0mIP+LOOKHMTMTmIc6NYf7Zd/25+Gmdl8P1Q3HemqHPkWPZ6UOY9t17WX/+Vjp+eLk9f7tWvdzeJvqcVI7klCppj+lu0DJn9uuUTvWz+9KOQ+LAIuICtawIFiYooj0Fob0WlhYOFgwLAQWHhVSzKDxfhHZ7noNC9oSshYGFhYWDhbw7voAi4iKoGFBsIA7KsAdFeCOCsWOcrScDM6YtRBYeFgEWERURA0LgoWBhYVFMedO7CLErwXDQmDhN4TP/iPAIqKCtMYJ4aSc9iALiTojFicOJ7xFOCOCE4+TgJMIEypmn0m/CZPLCOHEbJGYEYsThxPGSTH7bJfiZ+sz4nESNojLWowiTIzGCeGknH1eypIl60pjceK2SFb8hnEiOPEYeabopx7b+tA17wHufO+PH/Pc9HttVqPddRyOzek+NvOQ9z/fzfklEytinZYyb6qxlbWvwyIFHCtxr9pJgXAlPn09reAP", "file_map": { "50": { "source": "// Tests a very simple program.\n//\n// The features being tested are array reads and writes\nfn main(x: [Field; 3]) {\n // Safety: testing context\n unsafe {\n read_array(x);\n read_write_array(x);\n }\n}\n\nunconstrained fn read_array(x: [Field; 3]) {\n assert(x[0] == 1);\n let y = [1, 5, 27];\n\n assert(y[x[0]] == 5);\n}\n\nunconstrained fn read_write_array(x: [Field; 3]) {\n let mut y = x;\n\n y[0] = 5;\n\n assert(y[0] == 5);\n assert(y[1] == 2);\n assert(y[2] == 3);\n\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_0.snap index 617a0fbefde..99c17dd68fe 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_0.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VYv6/TMBA+J3GaNDy1ggGJDVgZ0iYlHTvAyMQEC4Q+FbGwIcGWP52mz0cvXy4Bga0nLEVO7C/3fXe++EcM3ZXofBl3n7jaiDqmYeG+g6vLfysbj7bKUBrNf6AxCqDxUmIY/IimCzv1w9W5qyPRH3t0Ogden/b3Zd3kin8e9Vc5xDSU/TiM/XLh7LzqrvbRF84DQ8HGqQ7sZ3VD49w34FsShrs2wEfgJwH/koLm1MYAH+vB+PD9DWO6qx4DfUk39oP7bDf0oy/Z+XoscJhbkcA9E/fP3X3gfGwCf9floxmfuW3R0a/CcYtFG8eV45xJPPTloi/phjxL95wIHmmLdVjAP3XPK1en4h1+f63wp8A/0K20YVxyBZ8r+PR8PXH3hbv6HHrP79D9fWfauK9oPAcmE1rJo07ksoqOCPoY+wL02TCxLB8KuwRcKxqPI87todZPHGP+hqbiF9F4rZH5gfHdurrP24/gn8yFufl7TdM5F3qew7WV/Nneza1LvO9LuiB+1f14HJ0tXr+s8NGCplT0xQoec3eh4FOBwbFdiL6pOcNzDLZ/4ps2v8ncT0GrtHXwpJMgRnZGhwXsa9CXhYmlOr9lwB1of1oZ4CPSx5H5VzTOOdQqc/vgSSdyWUWHhT7GvgF9eZhYquMouabiPLcf0OKMWC0WmNOMfQuxuI+cnps7JB5zLlL8I3jPKljMC8a+g1gE+sbUWDBXQWHXq2Z/t0+5xLi7xgF/DEp+C/gP7nk54cfhL3WemnZzqtpTu2tvb+tji3HqSyTi5Ju/bar9cVsfm0+7qq1e/pZfO+vI/Udf+Lwkz1MSL79Zif/M2PP1xd3jGVry9bjvMzgzUV9sKG1JN2zTzlny/Ml45l52Y43cV4g+uTfqywP3LOMlbbEOC/hv7pnHRJ4Z+f21wp8B/0C30obnz0LBFwq+H5+vbM/V0nffZ80LJ9iXbaiNc6fP658Wtf05TRgAAA==", - "debug_symbols": "tdjfaoMwFAbwd8l1LvLvnCR9lTGKbW0RRIu1g1F89yWlsi7ddqPfjRg9/gySL8K5iUO9u562TXfsL2LzdhNtv6/Gpu/S6DZJsRuatm1O2+fLQuWD5Xv95Vx1eXgZq2EUG81Biro7pLOg0/PHpq3FhtQkX0qN949S87P0XQrrkXhA4nFFnAvcKSSukbhB4haJu1/xqOcntPof/7M044TEGYl7JB6QeATipJC4RuJmIe70nDdnTIlbJO6QOCFxRuIeiQckHoE4KyS+NKGO7YyzL3GDxC0Sd+vh/uWbExJnJO6ReEDiixMaeMZj+SfyColrJG5WxKnELRJ3SJyQOCPxpQklO4eIbLkr+oDE43q4K+MfFBLXSNwg8aUJJZqXInG5twSHxGlFvAxRYCTukXiA4VMafVRDU+3a+tFrO167/VPrbfw810UX7jz0+/pwHercj/tuxeU0xii1UWnOeQ0aK61N5/p+R8lIeZBzFVnGkF6eJvAF", + "bytecode": "H4sIAAAAAAAA/9VYTY/TMBB1Ppw2DatWcEDiBtw4pZuUVJx64MqRE6dsVwWJA+LCDSn8c5quZ/vyOgkrrS20liI79svMm+exEycydyU+XpFrp66OoE7MsMjYztXl48rao60yFMfoCXCMA3A8lYQmPzbjRYL64+rc1TGMJx6DzsmvT/vbsm5yJT6P/KucNA1lPwljv5w5Ox+7s32ORfIgMsHmqQ4cZ3VlLnM/otjSML7riPwZitOQ/4UJmlPriPwJH9ZH2leC6c58IhpLu8s4ZMx2wzj6Mj9eLwHHuRUD7g2037p24HxsAq/r8sVEzNI368x9Ed0S6BNdRec54mksh7G0G/pZuPsU/KAt4WEJ/9rdL12dwTPy/Erxn5H/AW+lj3XJFXyu4LPj9cq1C3f1OXQDvFl33hNC7bu8BkV79hlDTLxH4fq11PfO1X283yg+XONT635lxnM08Pq436OswlXjs1T0sSNcjUee7MsqPGIaE2xN/LIwWpbPwa4hXw9ZA4HeiyXPMa4BTb+Y8JwfrO8HVz/RNVDmSoyebG+m3unyzZx2QeKq+/n47mzJuz+DGC1xmsFYouA5d+cKfgYYnts5jI3tGZ41uH5IbNr+hrk/I65oa+eJpyGN7AQPS9hPxC8Po6W6v+Xk24bxXUXkzxh9HsX/0lzmHHPF3N554sm+rMIjozHBfiZ+izBaqvOIvsZ0nvoe0HRmrKYF57Rgv5AW/yOnp/YOxHPOxUp8hp6zCpbzQrAtaRFojalaiK/ChH1fNdu775STxt1ZB/6piv4t4b+6e8xlqdNH8Dw07fpQtYd2097e1vuWdepLDDr59t821XZ/Xe+bm03VVu//6V87J+L3R1/krIlnUcTjmkX8D8Eer5+uzf8f0F+P6yZw0Uh9sqH0pd2wTzuj4tld8OJ70V1ylLECxvDbqC/P3D3qhbaEhyX8b3cvc4LnbXl+pfifk/8Bb6WPz+6Fgi8UfD8/v8SeqzF232fNk0+yj33MTbr7vP4LQMAf/YkZAAA=", + "debug_symbols": "tdhLasMwEAbgu2ithUaPkZSrlFKcRAkGYwfHKZSQu1cKMU3Vx8b+N0Zjjz6ErZFhrmKftpfjW9sfhrPYvFxFN+yaqR36HF1vUmzHtuva49vzbaHKxdp7/vnU9CU8T804iQ1xkCL1+zwKlOcf2i6JjVM3+SNVe/9I1d9TX6WwDokzEvcr4lzjAYlHIO4UEickrn/FI80zSP2P/5lacIPELRJ3SJyRuEfiAYlHIM5qIW5prjerdY0TEtdI3CBxi8QdEmck7pF4QOJLK9SymXH2Fe4VEickrtfDff3OvUHiFok7JM5IfHGFBp7xWP+JfEDiEYgHtSLuapyQuEbiBolbJL60Qp2Zi8iZ+lQMjMT9erityz8EJB6BeFRIfGmFOjdvRcf12RI1Ejcr4nURRYvEHRJnGH7L0Xszts22S49e2+HS755ab9PHKVVduNM47NL+MqbSj/tqxZU9TcpL0iEvunxKbaQxeUzlUQyS1D2ie6LNIecF5EV8Ag==", "file_map": { "50": { "source": "// Tests a very simple program.\n//\n// The features being tested are array reads and writes\nfn main(x: [Field; 3]) {\n // Safety: testing context\n unsafe {\n read_array(x);\n read_write_array(x);\n }\n}\n\nunconstrained fn read_array(x: [Field; 3]) {\n assert(x[0] == 1);\n let y = [1, 5, 27];\n\n assert(y[x[0]] == 5);\n}\n\nunconstrained fn read_write_array(x: [Field; 3]) {\n let mut y = x;\n\n y[0] = 5;\n\n assert(y[0] == 5);\n assert(y[1] == 2);\n assert(y[2] == 3);\n\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 617a0fbefde..99c17dd68fe 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_arrays/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VYv6/TMBA+J3GaNDy1ggGJDVgZ0iYlHTvAyMQEC4Q+FbGwIcGWP52mz0cvXy4Bga0nLEVO7C/3fXe++EcM3ZXofBl3n7jaiDqmYeG+g6vLfysbj7bKUBrNf6AxCqDxUmIY/IimCzv1w9W5qyPRH3t0Ogden/b3Zd3kin8e9Vc5xDSU/TiM/XLh7LzqrvbRF84DQ8HGqQ7sZ3VD49w34FsShrs2wEfgJwH/koLm1MYAH+vB+PD9DWO6qx4DfUk39oP7bDf0oy/Z+XoscJhbkcA9E/fP3X3gfGwCf9floxmfuW3R0a/CcYtFG8eV45xJPPTloi/phjxL95wIHmmLdVjAP3XPK1en4h1+f63wp8A/0K20YVxyBZ8r+PR8PXH3hbv6HHrP79D9fWfauK9oPAcmE1rJo07ksoqOCPoY+wL02TCxLB8KuwRcKxqPI87todZPHGP+hqbiF9F4rZH5gfHdurrP24/gn8yFufl7TdM5F3qew7WV/Nneza1LvO9LuiB+1f14HJ0tXr+s8NGCplT0xQoec3eh4FOBwbFdiL6pOcNzDLZ/4ps2v8ncT0GrtHXwpJMgRnZGhwXsa9CXhYmlOr9lwB1of1oZ4CPSx5H5VzTOOdQqc/vgSSdyWUWHhT7GvgF9eZhYquMouabiPLcf0OKMWC0WmNOMfQuxuI+cnps7JB5zLlL8I3jPKljMC8a+g1gE+sbUWDBXQWHXq2Z/t0+5xLi7xgF/DEp+C/gP7nk54cfhL3WemnZzqtpTu2tvb+tji3HqSyTi5Ju/bar9cVsfm0+7qq1e/pZfO+vI/Udf+Lwkz1MSL79Zif/M2PP1xd3jGVry9bjvMzgzUV9sKG1JN2zTzlny/Ml45l52Y43cV4g+uTfqywP3LOMlbbEOC/hv7pnHRJ4Z+f21wp8B/0C30obnz0LBFwq+H5+vbM/V0nffZ80LJ9iXbaiNc6fP658Wtf05TRgAAA==", - "debug_symbols": "tdjfaoMwFAbwd8l1LvLvnCR9lTGKbW0RRIu1g1F89yWlsi7ddqPfjRg9/gySL8K5iUO9u562TXfsL2LzdhNtv6/Gpu/S6DZJsRuatm1O2+fLQuWD5Xv95Vx1eXgZq2EUG81Biro7pLOg0/PHpq3FhtQkX0qN949S87P0XQrrkXhA4nFFnAvcKSSukbhB4haJu1/xqOcntPof/7M044TEGYl7JB6QeATipJC4RuJmIe70nDdnTIlbJO6QOCFxRuIeiQckHoE4KyS+NKGO7YyzL3GDxC0Sd+vh/uWbExJnJO6ReEDiixMaeMZj+SfyColrJG5WxKnELRJ3SJyQOCPxpQklO4eIbLkr+oDE43q4K+MfFBLXSNwg8aUJJZqXInG5twSHxGlFvAxRYCTukXiA4VMafVRDU+3a+tFrO167/VPrbfw810UX7jz0+/pwHercj/tuxeU0xii1UWnOeQ0aK61N5/p+R8lIeZBzFVnGkF6eJvAF", + "bytecode": "H4sIAAAAAAAA/9VYTY/TMBB1Ppw2DatWcEDiBtw4pZuUVJx64MqRE6dsVwWJA+LCDSn8c5quZ/vyOgkrrS20liI79svMm+exEycydyU+XpFrp66OoE7MsMjYztXl48rao60yFMfoCXCMA3A8lYQmPzbjRYL64+rc1TGMJx6DzsmvT/vbsm5yJT6P/KucNA1lPwljv5w5Ox+7s32ORfIgMsHmqQ4cZ3VlLnM/otjSML7riPwZitOQ/4UJmlPriPwJH9ZH2leC6c58IhpLu8s4ZMx2wzj6Mj9eLwHHuRUD7g2037p24HxsAq/r8sVEzNI368x9Ed0S6BNdRec54mksh7G0G/pZuPsU/KAt4WEJ/9rdL12dwTPy/Erxn5H/AW+lj3XJFXyu4LPj9cq1C3f1OXQDvFl33hNC7bu8BkV79hlDTLxH4fq11PfO1X283yg+XONT635lxnM08Pq436OswlXjs1T0sSNcjUee7MsqPGIaE2xN/LIwWpbPwa4hXw9ZA4HeiyXPMa4BTb+Y8JwfrO8HVz/RNVDmSoyebG+m3unyzZx2QeKq+/n47mzJuz+DGC1xmsFYouA5d+cKfgYYnts5jI3tGZ41uH5IbNr+hrk/I65oa+eJpyGN7AQPS9hPxC8Po6W6v+Xk24bxXUXkzxh9HsX/0lzmHHPF3N554sm+rMIjozHBfiZ+izBaqvOIvsZ0nvoe0HRmrKYF57Rgv5AW/yOnp/YOxHPOxUp8hp6zCpbzQrAtaRFojalaiK/ChH1fNdu775STxt1ZB/6piv4t4b+6e8xlqdNH8Dw07fpQtYd2097e1vuWdepLDDr59t821XZ/Xe+bm03VVu//6V87J+L3R1/krIlnUcTjmkX8D8Eer5+uzf8f0F+P6yZw0Uh9sqH0pd2wTzuj4tld8OJ70V1ylLECxvDbqC/P3D3qhbaEhyX8b3cvc4LnbXl+pfifk/8Bb6WPz+6Fgi8UfD8/v8SeqzF232fNk0+yj33MTbr7vP4LQMAf/YkZAAA=", + "debug_symbols": "tdhLasMwEAbgu2ithUaPkZSrlFKcRAkGYwfHKZSQu1cKMU3Vx8b+N0Zjjz6ErZFhrmKftpfjW9sfhrPYvFxFN+yaqR36HF1vUmzHtuva49vzbaHKxdp7/vnU9CU8T804iQ1xkCL1+zwKlOcf2i6JjVM3+SNVe/9I1d9TX6WwDokzEvcr4lzjAYlHIO4UEickrn/FI80zSP2P/5lacIPELRJ3SJyRuEfiAYlHIM5qIW5prjerdY0TEtdI3CBxi8QdEmck7pF4QOJLK9SymXH2Fe4VEickrtfDff3OvUHiFok7JM5IfHGFBp7xWP+JfEDiEYgHtSLuapyQuEbiBolbJL60Qp2Zi8iZ+lQMjMT9erityz8EJB6BeFRIfGmFOjdvRcf12RI1Ejcr4nURRYvEHRJnGH7L0Xszts22S49e2+HS755ab9PHKVVduNM47NL+MqbSj/tqxZU9TcpL0iEvunxKbaQxeUzlUQyS1D2ie6LNIecF5EV8Ag==", "file_map": { "50": { "source": "// Tests a very simple program.\n//\n// The features being tested are array reads and writes\nfn main(x: [Field; 3]) {\n // Safety: testing context\n unsafe {\n read_array(x);\n read_write_array(x);\n }\n}\n\nunconstrained fn read_array(x: [Field; 3]) {\n assert(x[0] == 1);\n let y = [1, 5, 27];\n\n assert(y[x[0]] == 5);\n}\n\nunconstrained fn read_write_array(x: [Field; 3]) {\n let mut y = x;\n\n y[0] = 5;\n\n assert(y[0] == 5);\n assert(y[1] == 2);\n assert(y[2] == 3);\n\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index f8d9a997c76..e879f8de225 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -36,14 +36,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/92a2W8TMRDGnXQ36aaUXtxngfKe9O5bJeh93/eRHmnhBV6REMo7/zSd1i5fJp4oqGvQYKmys/7tzGevd3x0M+Ym9V39ZWw5snnW5nQ9NrXJseM2L94tlVK0VQylMaNAY1aBxhYFGqMUNZK2XlOb0tYbK+jTnAKNeQUaWxVoTBRoLCjQ2KZA4z0FGtsVaLyvQGOHAo2dCjR2KdDYrUBjjwKNDxRofKhA4yMFGh8r0PhEgcanCjQ+U6DxuQKNLxRofKlA4ysFGl8r0NirQOMbBRrfKtD4ToHGvgAar9N7KJNoOjymw1k6/KQDRTqwowMxOnCiAx06MKEDCdrw04aaNqy0IaQNF21oaMNAC3Ja8NKCkhZstCCiBQdN6DRh0oREAZ8CKgUsCgi9V380oGnA0APpM3JynfvT5onNs1Cf4gFzKWF+07Q/WhweSzztS1H/QAI207ffP+TsR2H0F/PWzsdqrX3D/LYwjt+D900AMyEwk8BMCswUMFMCMw3MtMDMADMjMLPAzArMHDBzAjMPzLzALACzIDCLwCwKzBIwSwKzDMyywKwAsyIwq8CsCswaMGsCsw7MusBsALMhMJvAbArMFjBbArMNzLbA7ACzIzC7wOwKzB4wewKzD8y+wBwAcyAwh8AcCswRMEcCcwzMscCUgSkLzAkwJwJzCsypwJwBcyYw58CcC0wFmIrAXABzITCXwFwyJoGyMWnPbYODgeeGoXbWVgNtcb7jML6HM8yfMbXzkmH+CybkPHzzcQL6c3p4/7h1Urtjqr/1ZFhdVK1vh6uLoc49X1onTgPnG1uU3LMJsWa7GndjYcddf/Hfjbv+0v847nhdVK1vx5+OOz62HLcG5Q1bDhsHh8dCjndKPR796ItSvmpuk+uPFrjm+tX1cyvyrC6Buqha66dgf0fgB205HTHjV+3vDpvn4B53f6fHf475r9Htucb7JfHwiYenvfCcLdMe2O3bPlRr7Y3bvHi3dP2Pfxqjn629ZmJOoHjXdMxx/v9WzImYngzTmGX9E2gtMOT85jx6fDGwC7TiM0N9zlYva0PotRT/0JNSO9OE7XJ1eajj75hh/YKJx/GvYJdzXA+OPactZnWfbB46BncznegL40VUTd//yOjNR4aUXKyOTX1fo/+Y8V/s74KnHXf5GLIyUi5VBsqV8lD57GzwtMz7ybB+8sU8fM8zQn7dlga2Oz22XOwOHB+Kzn4uiP3+W/v5MPpLfO7BvqI2fYPrWOfGIL+Xv6uO/wE2v9tyh6l/190zbIP62FPv7sMz1kbzhLte8PB4DtzCtLVCXaEJW9kGvts8fKGBb9TVJviO4BpqTRjf6tEUe9rG3yVul88jvjHgxmqzY+sXZHzK5akwAAA=", - "debug_symbols": "tZbbioQwDIbfpddeNOlUW19lWQYPdRBExcPCIr771tnZUToySwq9ESP5/tCkkX9hpcnn27Vuq25k6cfCmq7IprprbbSsEcuHumnq2/X4mfHtoeJ7/thn7RaOUzZMLAUlI2ba0r5pafmqbgxLJV+jl1RM8JGKWhxTPyOmkpDiKqS4DiiueUhxCCmOIcVFSPHLe3Hk0iUkmYjJREImFJnQVAI4pyNAR5COCDpCHjzAaZV3twvgQkckGcHzJusEniuiYId+mfPzax0/G4Cxy8QedU6vMnK+1wHhMsqD0XRG8HMGkr0H0mXAg0EPRvx/nuN8Xn97gPzyNxeExNX3mL+QHkxMZFYbfGVDneWNediUam6Lg2uZvnvjGJh+6ApTzoPZrMzuYrYe2sVReN94G4BtHwDYIrbQDw==", + "bytecode": "H4sIAAAAAAAA/92aWVMTQRDHJ2E3YYMI3rei4ntCCMcbVcp93/exBAL6os8+xSrLL2CVn1caZvSfznRE2dVqp4qazc4v3f+Z7e05SMZclN6zv4y9DmydtTXdD01jceyIrYtXK6UEbRXT0phRoDGrQGObAo1BghpJW49pLEnrDRWMaU6BxrwCje0KNEYKNBYUaOxQoPGaAo2dCjReV6CxS4HGbgUabyjQeFOBxlsKNN5WoPGOAo13FWi8p0DjfQUaHyjQ+FCBxkcKND5WoPGJAo1PFWh8pkBjjwKNzxVofKFA40sFGntT0HheXsE1iabDYzqcpcNPOlCkAzs6EKMDJzrQoQMTOpCgDT9tqGnDShtC2nDRhoY2DLQgpwUvLShpwUYLIlpw0IROEyZNSJTwKaFSwqKE0HP2RwFNAUMPpNfIxQ3uN1tHts5Ce4IHzKWI+U3S/lBxYDjy9C9B/eUIbCZvv6/i7Afp6C/mrZ039Ub7hvltYxz/Dn5vFJhRgRkDZkxgxoEZF5gJYCYEZhKYSYGZAmZKYKaBmRaYGWBmBGYWmFmBmQNmTmDmgZkXmAVgFgRmEZhFgVkCZklgloFZFpgVYFYEZhWYVYFZA2ZNYNaBWReYDWA2BGYTmE2B2QJmS2C2gdkWmB1gdgRmF5hdgdkDZk9g9oHZF5gDYA4EJgYmFphDYA4FpgpMVWCOgDkSmGNgjgWmBkxNYE6AORGYU2BOGRPBtTFJz239/SnPDZVO1lcDfXG+w3R8D2SYP2Ma5yXD/BdMmvPwxY8T0J/Tw8fHrZM6HVP/qSfD2oJ6cz9cWwht7vnSOnECOF9sUXHPJo0121ncDacbd33Ffxd3faX/Me54W1Bv7sfvxh2PLcctw/WqvU43Dw4MpxnvVG559KMvKvm6+VHceLTBPTeubpzbkWdtEbQF9UY/Bfs5AD9oy+kIGb9kP3fZOgffcd/v9vjPMf8Nuj33+LhEHj7y8LQXnrbXtAd2+7bX9UZ7I7YuXq2c/+OfYvSdtXeZnJNSvrt0znH+/1bOCZieDNOYZeOT0lqg4vzmPHp8OfAGaMVnhvqcrR7Wh7TXUvyHnlQ6mSbsl2vLQxt/xwwbFyw8j38Au5zjejD2nLaQtb21ddo5+CbTib4wXwT15P0PDl38yJCKy9WhaR5r9B8y/r39XPD04yo/hqwNxqVaOa7FlfjoqL8a83EybJx8OQ/f84xQn/elhe1ujy2Xu7tM8/vHcyuP/ZE/HA9enC/3/rh5k/sMoT/8fctDn0J276OtaVy/sv751mxhi7HzrS9Tzq3FyNPfJNfyzn57OvpLfN7GsaLn+0l4JqFpnkNwHELGfwGbn+11l2l+bi7+O4w/7gOmB8+nW82x7n7Bw+MZehvThjFeuIStbAvfHR6+0MI36uoQfAdwD7VGjM95NIWevvE8xO1K7yXGgIvVy8ZW0jk9HiwPVfv6q4OHlXJcHvhlTv8OpYiX42UyAAA=", + "debug_symbols": "tdbbjoIwEADQf+kzD51eaOuvbDYGtRoSAoTLJhvCv29hXSHIamaSvhjH9MxgO9YZ2MWf+tsxL69Vyw4fAyuqc9blVRmiYUzYqcmLIr8d1x8zPr3YdF7f1lk5hW2XNR07gNUJ8+UlvHM6+GteeHbQfEyelgoj7kuFk+ulnwmzJmZyGzO5i5jc8ZjJIWZyETO5jJlcvU4uuN4KjRYpWhi0sGjhsAI4xxPAE4EnEk/QBw+wW+VVdwEoPNF4st9gzsDjJ2JhQb/GEIwlGIc3ghMMEIwgGEkwhD2Q/zybSx8NKtKtUYQ6++3G+VIH5NakBGMIxu4bMMse6K1xeKM4wcD777M+n+e/pdDm6u9cBJhtfsL5K0kwCmnGEHxlTZ6dCn8fI699eV5Nld137TcDZt1UZ3/pGz+NmsuUOT1vuNismG/kEEDYPgCYL44pVCYB5ULNUPcH", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_0.snap index d37d7015659..9cb5dbcef3d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_0.snap @@ -36,14 +36,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/92ayVIbMRCGZTNjMzaEANlXJyF3GzDLjUPY931fDMaQQ/ICuThvHhqk+J+22kWKmUo6qnJJjL7p/tWSteGMuUtDN5+MLQc2z9qcnocmnhw7ZfPyw1IlQVvltDRmFGjMKtDYpUBjkKBG0lYy8ZS03lBBTHMKNOYVaOxWoDFSoLGgQGNRgcYeBRp7FWh8pEBjnwKNjxVo7FegcUCBxkEFGp8o0PhUgcZnCjQ+V6DxhQKNLxVofKVA42sFGt8o0PhWgcZ3CjS+V6CxpEDjBwUaPyrQ+EmBxqEUNN6mz1Am0XR5TJezdPlJF4p0YUcXYnThRBc6dGFCFxJ04KcDNR1Y6UBIBy460NCBgTbktOGlDSVt2GhDRBsOWtBpwaQFiSZ8mlBpwqIJoXTzoQFNA4Y6ZMjIyQX3p80jm2ehPsEL5krE/CZpf6I8Nhl52peg/pEIbCZvf7jq7Afp6C/nrZ0vzbh9w/x2MY6/g+9NAzMtMDPAzAjMLDCzAjMHzJzAzAMzLzALwCwIzCIwiwKzBMySwCwDsywwK8CsCMwqMKsCswbMmsCsA7MuMBvAbAjMJjCbArMFzJbAbAOzLTA7wOwIzC4wuwKzB8yewOwDsy8wB8AcCMwhMIcCcwTMkcAcA3MsMCfAnAjMKTCnAnMGzJnA1ICpCcw5MOcCcwHMhcDUgakLzCUwlwLTAKYhMFfAXAnMNTDXjImgbEzSa9voaMprQ7WXtdVAW5zvMB3fYxnmz5j4umSY/4JJcx2++3EC+nN6eHzcPqnXMc2WngyrC5rt7XB1IdS5/qV94hxwvrFFyfVNGnu2m3E3me64Gy7/vXE3XPkfxx2vC5rt7fjTccfHluM2obxly+nOg2OTaY53SoMe/eiLUr5pficXjy545uLq4tyNPKuLoC5oxv0U7N8B+EFbTkfI+A37d5/Nc/COe/+xx3+O+Y/p9jzjcYk8fOTh6Sy8aMtF+6Ex9MM+c+MuaL36z88JKa3LHecE1Jhl8cmlo6fq/OY9egKPnn7Qin2G+pytks35emdMPPbGdO4fXzxCxkyZROJx+w9yPl+EzHdKfVGOWPySXpud/e509Ff42o+xorwBz7EuNO3rIsYhZPx3sPnVlvtM+9yeYe+7um8m3p9prG2UBsAu11QEzTlPvSsXTCt1+l46vujhC6x9GC+8wyvew1a2g+8eD1/s4Bt19Qi+A3iGWguM99115jxt832/I2bLvYftwHHpvj/3He/OftBscUmNs/GJux/R3mq19kMT318a5j9kvM1iMXX5Q37s2xivVRojtUatWqvXRy9q/PtAyfUX9c8vbXTXaXEvAAA=", - "debug_symbols": "tZbbioQwDIbfpddeJHFqW19lWQYPdSiIioeFRXz3re7sKO4wIE5uxMifr5Im7T+K3KbD7eqqou5E/DGKss6S3tWVj8YpEGnrytLdrtvPAuaHlou+a5JqDrs+aXsRo5aBsFXu34z0+YUrrYglTME/KSm6S8mEW+lnIHTECVeccM0JN4xwA5xw5IQTJzx8DSc4A79wwiUnPGKEI9BJOhqFj93XuIp/8fI03kQPLUV7/LHaLCnqeIo+nILAWlbEsz0BsJYVwz2eePEhL/70qAOqtefkHi958REvXr219tuBfNLEBJe/JiZU+1/RrGcDGlY8AR9+8sFX0rokLe3dHhZDlW3cYv/d2J1xbNo6s/nQ2tlCru5xnjV/AWhaTjIfIIUBkvaL+IV+AA==", + "bytecode": "H4sIAAAAAAAA/92ayVMTQRTGO2EmYRIQ3HdFxXtCCMvNg7Lv+w5DIHCyyoOeU+VFq/yj5UG3fPPoF7GYKX12Vapnpn/T7+vXb3qDnLlI/We/nL0ObJ63OT0PTTI59p3NKzdL1RTrqmSlMadAY16Bxg4FGoMUNZK2PpNMaesNFfi0oEBjUYHGTgUaIwUaSwo0lhVo7FKgsVuBxlsKNPYo0NirQONtBRrvKNB4V4HGewo03leg8YECjQ8VaHykQONjBRqfKND4VIHGZwo0Pleg8YUCjS8VaOxToPGVAo2vFWh8o0BjfwYaz9NbuCbRdHhMh7N0+EkHinRgRwdidOBEBzp0YEIHErThpw01bVhpQ0gbLtrQ0IaBFuS04KUFJS3YaEFECw6a0GnCpAmJBnwaUGnAogGh7+xHAU0BQx3Sb+TknPvD5pHN81Ce4gFzNWJ206x/pDI0Gnnal6L+WgR1pl//QN3VH2Sjv1K09bxvJes3zG4H4/g7+N4HYD4IzBgwYwIzDsy4wEwAMyEwk8BMCswUMFMCMw3MtMDMADMjMLPAzArMHDBzAjMPzLzALACzIDCLwCwKzBIwSwKzDMyywKwAsyIwq8CsCswaMGsCsw7MusBsALMhMJvAbArMFjBbArMNzLbA7ACzIzC7wOwKzB4wewKzD8y+wBwAcyAwMTCxwBwCcygwDWAaAnMEzJHAHANzLDBNYJoCcwLMicCcAnPKmAiujUl7bhsczHhuqHezthpoi7MdZmN7KMfsGZOclwyzXzJZzsMX/5yA9pwe7h+3Tup2TOtST46VBa2r7XBlIZS5/qV14gRwvtii5PomizXbWdyNZht3A5W/F3cD1f8x7nhZ0Lrajj+NOx5bjluG6xV7ne04ODSaZbxTuuvRj7YoFVvmV3L+6IBnzq/Oz53Is7IIyoJW0k7J3gdgB+tyOkLGL9n7HpsX4B33fq/HfoHZT+j2PON+iTx85OFpLzxtr8v2RzH01T5zcRdcvvrPjwkZzcttxwTUmGf+KWSjp+7sFj16Ao+e26AV+wz1ubr6bM7nO2OSvjemff/4/BEy5p1JxR/nfyDn44Wz1eNpa8B0FaEszXHMaeq09bkxhNssgL+Qx2tj24TPTmxO99/hHazTgE185vqm11z9dgrMPxnFcSXytDfNdY2rP8pGf5Wvm9BXlH8U+iQ0V9cU6IeQ8V+gzk/22sV1ntnA913ZZ5PszyzWBZTuQL1cU9n4v0XOlsxlajemOb7s4Uusfegv/O7K16gr38Z2l4cvt7GNuroE2wE8Q60lxhc9mgqetvnGxiKryzdWYFy67+e68e74oHXJpRVnwyMX4+q5Vlt/aJJrc8Psh4z/Zu/Rpy6/yT9KN4fjarMWN+N6fHQ02Ij590DJ9Vc5A/vxcG2kMTDYGD6s1+La0G/t/wTasbk3LTEAAA==", + "debug_symbols": "tdfbaoQwEAbgd8m1F5mJOe2rlLK4u9lFEBUPhSK+e6NsV7GlIPa/EUcmnzIm0RnELVz6xzkv71UrTm+DKKpr1uVVGaNhTMSlyYsif5zXl4WcDk7P+W2dlVPYdlnTiRM5nYhQ3uKZ13H8PS+COGk5Jj9S2fIzlb1ap74nwhkkbpG4Q+IeiHuJxAmJMxJXf+Msj+ApEtdI3CBxexAnb+n18h0tybPuoLpH6iQllicsz1heYfkUyhP21dLx4njzymWz5fcVZx6i9w8x+4c4bFmPrneWcikrqQ3PEssTlufDPNllzuktr7B8iuX1v9Z+vSB/mcQs0+9JzGS3j2KgewNbLO9w/BiDj6zJs0sRnj3RvS+vqxap+6zDpluqm+oabn0Tpr5paZmm2Rr/ehzPH5MYkKKElJm3kTm0MfTxnvG+Xw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index d37d7015659..9cb5dbcef3d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_blake2s/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -36,14 +36,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/92ayVIbMRCGZTNjMzaEANlXJyF3GzDLjUPY931fDMaQQ/ICuThvHhqk+J+22kWKmUo6qnJJjL7p/tWSteGMuUtDN5+MLQc2z9qcnocmnhw7ZfPyw1IlQVvltDRmFGjMKtDYpUBjkKBG0lYy8ZS03lBBTHMKNOYVaOxWoDFSoLGgQGNRgcYeBRp7FWh8pEBjnwKNjxVo7FegcUCBxkEFGp8o0PhUgcZnCjQ+V6DxhQKNLxVofKVA42sFGt8o0PhWgcZ3CjS+V6CxpEDjBwUaPyrQ+EmBxqEUNN6mz1Am0XR5TJezdPlJF4p0YUcXYnThRBc6dGFCFxJ04KcDNR1Y6UBIBy460NCBgTbktOGlDSVt2GhDRBsOWtBpwaQFiSZ8mlBpwqIJoXTzoQFNA4Y6ZMjIyQX3p80jm2ehPsEL5krE/CZpf6I8Nhl52peg/pEIbCZvf7jq7Afp6C/nrZ0vzbh9w/x2MY6/g+9NAzMtMDPAzAjMLDCzAjMHzJzAzAMzLzALwCwIzCIwiwKzBMySwCwDsywwK8CsCMwqMKsCswbMmsCsA7MuMBvAbAjMJjCbArMFzJbAbAOzLTA7wOwIzC4wuwKzB8yewOwDsy8wB8AcCMwhMIcCcwTMkcAcA3MsMCfAnAjMKTCnAnMGzJnA1ICpCcw5MOcCcwHMhcDUgakLzCUwlwLTAKYhMFfAXAnMNTDXjImgbEzSa9voaMprQ7WXtdVAW5zvMB3fYxnmz5j4umSY/4JJcx2++3EC+nN6eHzcPqnXMc2WngyrC5rt7XB1IdS5/qV94hxwvrFFyfVNGnu2m3E3me64Gy7/vXE3XPkfxx2vC5rt7fjTccfHluM2obxly+nOg2OTaY53SoMe/eiLUr5pficXjy545uLq4tyNPKuLoC5oxv0U7N8B+EFbTkfI+A37d5/Nc/COe/+xx3+O+Y/p9jzjcYk8fOTh6Sy8aMtF+6Ex9MM+c+MuaL36z88JKa3LHecE1Jhl8cmlo6fq/OY9egKPnn7Qin2G+pytks35emdMPPbGdO4fXzxCxkyZROJx+w9yPl+EzHdKfVGOWPySXpud/e509Ff42o+xorwBz7EuNO3rIsYhZPx3sPnVlvtM+9yeYe+7um8m3p9prG2UBsAu11QEzTlPvSsXTCt1+l46vujhC6x9GC+8wyvew1a2g+8eD1/s4Bt19Qi+A3iGWguM99115jxt832/I2bLvYftwHHpvj/3He/OftBscUmNs/GJux/R3mq19kMT318a5j9kvM1iMXX5Q37s2xivVRojtUatWqvXRy9q/PtAyfUX9c8vbXTXaXEvAAA=", - "debug_symbols": "tZbbioQwDIbfpddeJHFqW19lWQYPdSiIioeFRXz3re7sKO4wIE5uxMifr5Im7T+K3KbD7eqqou5E/DGKss6S3tWVj8YpEGnrytLdrtvPAuaHlou+a5JqDrs+aXsRo5aBsFXu34z0+YUrrYglTME/KSm6S8mEW+lnIHTECVeccM0JN4xwA5xw5IQTJzx8DSc4A79wwiUnPGKEI9BJOhqFj93XuIp/8fI03kQPLUV7/LHaLCnqeIo+nILAWlbEsz0BsJYVwz2eePEhL/70qAOqtefkHi958REvXr219tuBfNLEBJe/JiZU+1/RrGcDGlY8AR9+8sFX0rokLe3dHhZDlW3cYv/d2J1xbNo6s/nQ2tlCru5xnjV/AWhaTjIfIIUBkvaL+IV+AA==", + "bytecode": "H4sIAAAAAAAA/92ayVMTQRTGO2EmYRIQ3HdFxXtCCMvNg7Lv+w5DIHCyyoOeU+VFq/yj5UG3fPPoF7GYKX12Vapnpn/T7+vXb3qDnLlI/We/nL0ObJ63OT0PTTI59p3NKzdL1RTrqmSlMadAY16Bxg4FGoMUNZK2PpNMaesNFfi0oEBjUYHGTgUaIwUaSwo0lhVo7FKgsVuBxlsKNPYo0NirQONtBRrvKNB4V4HGewo03leg8YECjQ8VaHykQONjBRqfKND4VIHGZwo0Pleg8YUCjS8VaOxToPGVAo2vFWh8o0BjfwYaz9NbuCbRdHhMh7N0+EkHinRgRwdidOBEBzp0YEIHErThpw01bVhpQ0gbLtrQ0IaBFuS04KUFJS3YaEFECw6a0GnCpAmJBnwaUGnAogGh7+xHAU0BQx3Sb+TknPvD5pHN81Ce4gFzNWJ206x/pDI0Gnnal6L+WgR1pl//QN3VH2Sjv1K09bxvJes3zG4H4/g7+N4HYD4IzBgwYwIzDsy4wEwAMyEwk8BMCswUMFMCMw3MtMDMADMjMLPAzArMHDBzAjMPzLzALACzIDCLwCwKzBIwSwKzDMyywKwAsyIwq8CsCswaMGsCsw7MusBsALMhMJvAbArMFjBbArMNzLbA7ACzIzC7wOwKzB4wewKzD8y+wBwAcyAwMTCxwBwCcygwDWAaAnMEzJHAHANzLDBNYJoCcwLMicCcAnPKmAiujUl7bhsczHhuqHezthpoi7MdZmN7KMfsGZOclwyzXzJZzsMX/5yA9pwe7h+3Tup2TOtST46VBa2r7XBlIZS5/qV14gRwvtii5PomizXbWdyNZht3A5W/F3cD1f8x7nhZ0Lrajj+NOx5bjluG6xV7ne04ODSaZbxTuuvRj7YoFVvmV3L+6IBnzq/Oz53Is7IIyoJW0k7J3gdgB+tyOkLGL9n7HpsX4B33fq/HfoHZT+j2PON+iTx85OFpLzxtr8v2RzH01T5zcRdcvvrPjwkZzcttxwTUmGf+KWSjp+7sFj16Ao+e26AV+wz1ubr6bM7nO2OSvjemff/4/BEy5p1JxR/nfyDn44Wz1eNpa8B0FaEszXHMaeq09bkxhNssgL+Qx2tj24TPTmxO99/hHazTgE185vqm11z9dgrMPxnFcSXytDfNdY2rP8pGf5Wvm9BXlH8U+iQ0V9cU6IeQ8V+gzk/22sV1ntnA913ZZ5PszyzWBZTuQL1cU9n4v0XOlsxlajemOb7s4Uusfegv/O7K16gr38Z2l4cvt7GNuroE2wE8Q60lxhc9mgqetvnGxiKryzdWYFy67+e68e74oHXJpRVnwyMX4+q5Vlt/aJJrc8Psh4z/Zu/Rpy6/yT9KN4fjarMWN+N6fHQ02Ij590DJ9Vc5A/vxcG2kMTDYGD6s1+La0G/t/wTasbk3LTEAAA==", + "debug_symbols": "tdfbaoQwEAbgd8m1F5mJOe2rlLK4u9lFEBUPhSK+e6NsV7GlIPa/EUcmnzIm0RnELVz6xzkv71UrTm+DKKpr1uVVGaNhTMSlyYsif5zXl4WcDk7P+W2dlVPYdlnTiRM5nYhQ3uKZ13H8PS+COGk5Jj9S2fIzlb1ap74nwhkkbpG4Q+IeiHuJxAmJMxJXf+Msj+ApEtdI3CBxexAnb+n18h0tybPuoLpH6iQllicsz1heYfkUyhP21dLx4njzymWz5fcVZx6i9w8x+4c4bFmPrneWcikrqQ3PEssTlufDPNllzuktr7B8iuX1v9Z+vSB/mcQs0+9JzGS3j2KgewNbLO9w/BiDj6zJs0sRnj3RvS+vqxap+6zDpluqm+oabn0Tpr5paZmm2Rr/ehzPH5MYkKKElJm3kTm0MfTxnvG+Xw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 188636bd429..d69c7f7f46e 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -27,18 +27,14 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+1ZT4/TRhSfSexAtloRlVurVj2USu3Jju3YlnpYtUlZegBunDh4s4k4IpAQ3HzixBdAQuKrsoZ5ydtf3oyz4NlNREaKPB4//96fvPdm/J5WX0b/4jcwc23utbn/Dda0sNYzawHD4Fh80LMTc42+bcQdYkW+ZNR7IGOvQxk1+7/x/+9c8D7DSqJJmi7y8SJO4ioal2dFFqXZ2aSIizgrsvNxkSSLIi3y8qzMozJOk0W8zMpksfw8ikCtnZxkPTjw9+fAigtJWa0PTtBT9kHPXpnrENbJsU46Un7IcLvGL6K0GoJ+HcufDMGmvvD7fvCjWwbnv3qNj7oodiU6fKfPaO4zmvsWmlNGcwo0pLMnn5h4tmlyrDbjjHQh3oEf3qkGfgr0VMD/SHn131gDP5IH7UPzY6Kp1/JoeBbUm3rQs7C+rEczbl/8fmZ06Fs9RvcHm/8F2A/qTZl8xv+Fr5aefTW+q+wxTzreqtVqrPIBWyObk51uc3p4NmTPgvoynyNzHzA+HIvkCIH+nrm/Y64D9g69PxL4D4D/JbmFNW4jxOoLa0TffKH8auY/qPWe+m+9xvOxp0794I8Jf+YHP2ls1MTf/2RT5TUGUsoJPEfRoGch4y3lWBrSoZvnoccMF+mQJ/c34n9H2fOX77MC5nKKU+RJsvXU5l7HbRzCWsHs9BzwcD/DNbLBSG3aTsO8bS+iuJRsHQBW2II1BSz+frgFlos3VT4GFnrCC4H+H3Nt7PwSMNtsMwN9XPL1BCxbHPH3Bxb6HuhD9KeCPq59nufgoF4/7ypW8mJdSaD9L1RCRYHxD4H+kbk/YvIrpvfJV8q5zKt4mVTLKqvOz9N59SPgK7ATz8NaXY51peRYxPixnS1sWFIsunxEwkcfeWKu2/o812da2/UJtsBy6RO26BOAPkT/1KGPK480Y+bQB+NTd6yPtugzF/TZ5juKy3sT31Grs6iSffGkG3nibfebHthuIMg6Ep5hXA4EPgOBj4QVdIilQR9bPu86T1Z5UszH6Tw/y5IqmbTmya75p1mVz6s8jss0XqRx1sb/o5nveb2uPNTr3ONQr+v+PzvU61ZjZ+p1PzE6W95v6O6x+Z9m7tkfS885JLrr0JnWdr0m97u53+Wa3C9mfqjJtY5VTe4BszePWbI391tuz6t8C/K6kvStEQI9dT095+oIz2DSWbfNHtO6O3tMLfaY7JE9Zlewh26xxwzsQfR/gz18nc0ke/SBt69z57HatDcNqb7N8xwOqYbN99xHDBfpkKfkG55tMXHFj7SnYvycgpw3ET/7UKN8aO53oUZJ+9I2Z3lffSQtyCmd5fvMbtdxlm+rsWLNKBBkHSk5v/O59M0QCHyuC2vX+oZ4VlWgIx9c7sa/3zBcpEOe3JbYN5RqsbvSNyTZrto3fMbs9B70k3pQku+PlH1/cPkkt7/rrLtN39B1Trxq39DFW+obSj0A7Bu+MNfGzh8As802rnMeyqcFLFsc8fdtfUMN+hD9a0Gf6/zO4Vg+el61oN+2/9e0tutzUz2vtw599rHn9U7Q59DzWo1Dzwvuud6HnpdSnwDgfacaBjQAAA==", - "debug_symbols": "ldndTuMwEIbhe8lxDmzPjH+4ldVqVaCgSlWLSllphbj3TStSlsTr5D1BmOahE31tPBq/d4/b+7fnX7vD0/G1u/vx3u2PD5vz7ngYVu+dXP/0+rI5XFav583p3N35bH23PTwOv5Xy0XdPu/22uzP38bPvtA2C0wmwGgj+BiR9A8Pi/rTb73fPv74V6i4/tFqulPL5z9SlabmKhWERsUhYZCwKFeaw8FgELHDmhjM3nLnhzA1nbtXM1cso/EwUKmI1cw1uFGH6fY4ei7BQ1VwIFoqFYRHrd55GIX4qEhZLmc9FoSI5LDwVuf5kcKOQ2ac9ByxkQfhZVYqFYRGxqD8Z/JeY3XnGoiyIMK2qOCw8FgGLeubhS0zvvCgWtiBmn/YSsUhYZCwKFd45TjwngRPhRDkxTiIniZPMCUx/WPhrj10NJ6p+uqh52mkKFrogTFZ15U0RsUhYVGOJcdzfY/KruvKWqHfl/4q4qitvioCFYFHPvIx9Yyy6qitvirgkyqquvCkyFoWKeleebvtiUreqK2+KgIVgoVgYFhGLtCRsVVfeFIWK5LDwVOTqe2QZn3BZZVUf3xQBC8FCsTAsIhYJi4xFoaLgzOt9vOk4srPZPljv45tCsFAsDIuIRcIiY1Go+E8f3yaek8CJcKKcGCf16G0cz1mUdX18m9TDj3Ekya3r45vEu4XCKsRzEjgRTurpJ7mRNCPGyVL6FZI4yZwUTAIepPkgnOBRmg/GSeQkcYLHaT4UTAQP1Lx4TgInwsnSbCXMb9844bMV4bMV4bMV4ZM15ZM15ZM15ZM15ZM15ZM15ZM15ekrT195+srTN5j+x7D6vTntNvf77eX4+/Li2+FhPA0fluc/L+Mr43n5y+n4sH18O20vJ+dfh+aXfIcTJ0nXbmJYJO1TuW4uw2LYLfthL7uN/65Xx17i7WrpU75dbbH3lof6hhr/Ag==", + "bytecode": "H4sIAAAAAAAA/+1ZS2/TQBBexw+aoqoVvYFAHCgSnOzYTmzEIYKEphd64sTJbRMhuMCNE/KBP4DED6aGnWTyZew86m0T4ZEi72P8zSOz491ZS/0j+/rn6bal+5buP4UxSxhr6TGHYXAsTjTX10//ZhTUiOWb0tHaAR1bNeposf8b///aFbcZVuh3o2jc64yDMMj8TnqRxH4UX3STIAniJL7qJGE4TqKkl16kPT8NonAcTOI0HE/+UuKoWZCTrk0A/38BrLiSlNVsCIKWKiea+6KfbRinwOrXZHyb4daNn/hR1gb7atY/bINPTeHbZvD9exrnXT7DR1sUexIfvmMznlPGc1rCM2I8I+Ahmw3FRNewT8MDtbjOyBaS7ZiRHVkgT4GdCuTvK6PxG1ggj/RB/1D7gHjymT4WzDn5oh005+bzdhS0d/17xPgwtlqM7zlrvwTss3xRJ5Pr/zpWU8OxGhyr8jVPNt7L1ZSm+YCNkc/JT3ucH+babM7J5+Xs677D5HAs0sMF/hPdP9RPj71D7x8J8j2QP6e3MMZ9hFi2MEb8xQnliW7fV7Nv6tt8hmfimzowg98h/KEZ/LDwUbH+3pBPldE1EFFO4DmKiOZcJlvKsUTSppvnoRHDRT6UyeMN5dsgE/MpxdahKj8YrJqbB4DF33dWwKqSTXZ5JfyE5wL/K/0sfPoJMJf5Zgj2VOnXErDQZkm2V8LfAnuIvy/YU/Wt4nnEyef1Jyz/BtRLZqdhyuGuEk7FTL4L/Ke6v8/0V8wn/Q31nPSyYBJmkyzOrq6iy+wB4CvwE88lVTHC38f1U/Z9XGct4hrxBH6O5wL/uX5KMV+17goa5OX2rLKGq+xxl9hTtoY/VNjjqmp7hhX2YK60arbHKrHno2DPKmcBru9dnAWm+ymljO1lfXYWkP7bsrNAMecJuh4Jc7guPUGOJ8iRsJwasSywpyyf150nozjrXWa9IEijYBwF8bI8+Vu3d7zmkzY1n2pqaj71/2dNzWdKW1Pzecj4yvJuwXfC2i9023A8poZziH9cYTONbXtd55nub3Nd57FuN3WdpTSt65wxf/M1S/7mccv9uc5ZzFHVe308f9PNmeFc7eMeTNprLvPHIK/PH4MSf3R3yB/DNfxhLfHHEPxB/K/BH6b2ZpI/bJBtat95oBb9TSTVSHmeQ5LqoPybe85wkQ9lSrFh2BfdqvUjfVNx/YxAz7tYP7tQI3yv+9tQI6Tv0ip7eVN3EZagp7SXt5nfbmMvv6zGiTUbR9D1SMn5nbelM4MjyLktrG27e8K9qgIbOXG9i/j+xnCRD2VyX65y97Tpfm3duvW6d09VsjetW3/Wz8KnvwDTxF6FY0l3SSi77O7JAnuI/6tgz23u1TmWiXuT74J9m8bfNtyb/KiwZxfvTX4K9jT3JlNq7k2gz+3ehnuTP4fCZt+OMAAA", + "debug_symbols": "ldnRbuIwEIXhd8k1Fx6P7bH7KqvVira0QkJQUbrSquq7r0E13RJvkv8GYZIPTTRRfGK/D4+b+7fnX9v90+F1uPvxPuwOD+vT9rCvo/dBLz+9vqz359HraX08DXeS42rY7B/rt1I+VsPTdrcZ7qL7+LkawjTwLtyA2ANerkDtG6iD++N2t9s+//pWqDt/hG65WsrnnwVnt+UGLCIWCQvDImNRqIiuJ4JoEzISgoXvCu+a8KP7R7EIM1WNRcQiYWFY5P6VWxMqt6JQkeZ6PhaChcdCqbD+k8E1oaO73QIWcUbIqKqEhWGRseg/GeRL3F55dljIjPC3VWWPhWIRsOj33H+J0ZUnLGxGjO72nLEoVBSHhWDhsVAsAhYRi4QF7nnBPS+45+IcJ7DrdSCXLNftfQrh06WQbxONYhFmRNRF6W9SJCwMi27vU2rzejJZlP6mRD/9/SvSovQ3KTwWikW/56XlxVSWpb9JkeZEWZT+JkXGolDRT392nQ8tuEXpb1J4LBSLgEXEImFhcyLeioxFocIcFkJFPy9mbU+4HHRRXpwUHgvFImARsUhYGBYZi0JFwT3v58UY2tJQHM2D/bw4KRSLgEXEImFhWHR7HmNb/4lJF+XFKfGfvBhTasTcsrw4TfxMYR2inAROIif91pteiY2IcTLX/A4pmIjjRDjBCzUikRO8VCNinGROCiYeL9eIF07wgo145SRwEjnBizbijRP8Ci+ev8Mrf4dX4cRzopwETiIniRPjhHdfefcD737g3Q+w+x919Ht93K7vd5vzdt754Nv+oe3u1eHpz0s70vb/Xo6Hh83j23Fz3gn82gQ830V1R0PtMmvVQY0OJpdHZR3UaXxVJ9nrMtPl7LTS1M6u06bl69k1QEmwWl+t8S8=", "file_map": { "50": { "source": "// Tests a very simple program.\n//\n// The features being tested is brillig calls passing arrays around\nfn main(x: [u32; 3]) {\n // Safety: testing context\n unsafe {\n assert(entry_point(x) == 9);\n another_entry_point(x);\n }\n}\n\nunconstrained fn inner(x: [u32; 3]) -> [u32; 3] {\n [x[0] + 1, x[1] + 1, x[2] + 1]\n}\n\nunconstrained fn entry_point(x: [u32; 3]) -> u32 {\n let y = inner(x);\n y[0] + y[1] + y[2]\n}\n\nunconstrained fn nested_fn_that_allocates(value: u32) -> u32 {\n let x = [value, value, value];\n let y = inner(x);\n y[0] + y[1] + y[2]\n}\n\nunconstrained fn another_entry_point(x: [u32; 3]) {\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n assert(nested_fn_that_allocates(1) == 6);\n // x should be unchanged\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_false_inliner_0.snap index be0c7876794..e971a990a3f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_false_inliner_0.snap @@ -27,18 +27,14 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+1ZT4vTQBSfSZPstrLs4t4UxYMr6CnTJE0CHoq27upFD4InhfQf6MUFQU9CwC8gCH5eG53XvL7MJF3N7LZuBkomMy+/96fvvZl5w9mf1ln+XNnn8p3L93tkjCvGLDlmIwyMhRvMDeXT+7cmGsTyTMnId0BGq0EZOfq/6f/fuOAdhOV7gyCYR/258EXq9ZNJHHpBOBnEIhZhHM76se/P4yCOkkkSeYkI/LlYhIk/X/xusc0KJwdZWwe+fg7MsJCQ1TrECSymbzD3WT67ZBwca9iQ8l2E2zR+7AVpl+jXsPx+l9jUFH7HDL63J3GeZQU+1YWhJ9DRbzqI5hTRnGpozhDNGaEBnQ35xMCwTf0DVo4z0AV422Z4B5zwY0RPRvj3mFH/FZzwA3mofaB/ADRZIQ8nc3ZW1gPmnGxdj7ztL3+3ER31LQvRPUD9RwT7eVaWyWT8L301Meyr4pjpYx503MvYqq3yARoDm4Od9jE9meuiOTtb59OT7zbig7FADofQn8j3Q/l00Tfw/ZGCv0v4r8mtGMM2olgdxRjQ5yeUu7J/gxVr6tOswDOxpo7M4PcBf2wG389tlMffC7ApMxoDAeQEnKOgwZyDeKtyLDTVphvnoVcIl9JRntjfgP8h0+cv03sFmsshTilPkM1i5bUO29ghYzGy0znBo+sZHQMbHLGy7Tjp161FEJcqW9sEy6nBGhEs/L2zAVYVb6h8uBp6wHMI/RP5zO38iWDW2WZM9KmSz1Jg6eIIf+9q6C2iD9CfKfSpWudxDrazYr6pWIniopIA65/DFBUFxN8h9C/lew/Jz5Dew7+UcxGlYuGnizRMZ7Ngmt4k+IzYCedhztZjnTF1LNL40e0tdFiqWKzyERU+9ZE38rmpz2N9RpleH3sDrCp9nBp9bKIP0L+t0Kcqj+RtXKEPjU/esD5co89Uoc8m5ygs71Wco1Z7Uab2xWEz8ohN1xuL2M5VyHqkmKNx6Sr4uAo+Kiy7QSxO9NHl86bzZBr58bQfTKNJ6Kf+oDZPNs0/CNNomkZCJIGYByKs4/9T9ne8Xpe09brq1tbrmv/P2nrdqm1Nve4WotPl/ZzuBPUfyr5hf0wM5xDvuEJnGNv2mtx9+b7NNbk7st/W5Grbqib3AdkbxyzYG/sttudFzoK4rqQ6aziEHm49Dedqj+7BVHvdOnuMsubsMdLYY7BD9hhfwB68xh5jYg+gf0zsYWpvprIH8KLrGKYzvJ5svMcA/j1mbv300B5DVR9UnW8OWPl/o2dG7Ge0JqHywY6Cz2Vh/U/3GecIl9JRntftPuM1stN3gkdjUef77X1GGZ/eZ7yTz9zOPwjmLt5nzBT6mDzTLNugKhaq6rdA/57Iaaguq1xjgdcu3Ot8lO/bcK9zGXt5jGXiXueLfG4a+1ifUabX56rudb5W6LOL9zrfFPq09zqr1t7rsPK61t7rFPx/Ac8aAGHqMgAA", - "debug_symbols": "tdrRbuIwEAXQf8lzHmzP2GP3V1arira0QkJQUbrSquLf16AaaOxNcgXzUjUl58p04sTy5Kt7WT59vj2uNq/bj+7h11e33j4v9qvtJh99dXT608f7YnM8+tgvdvvuwUbfd8vNS/4tpUPfva7Wy+7Bm8PvvuNx4AwPgG8BZ8+A5AfIB0+71Xq9env8MVBz/MHN4VJK32FsZDhchoWHRYCFwCLCIqHCG1hYWDhYwDX3cM09XHMP19zDNffNmrOlImwlEipCs+bsTBFuOJ+DhYWbGFUtCBYMCw+L0P7mUgTZoRBYTNW8FgkVYmBhURHbdwZTBFVXe3SwoAlhq1ExLDwsAizadwZ7EdU3j7BIE8INR5UMLCwsHCzaNXcXMfzmiWHhJ0R1tacAC4FFhEVChTUGJxYnDieEE8aJx0nAieAk4gSsfj6wpzV2sziB+dsFjsOVJsGCJ4SnWavyURFgIbBoliWE8nwPYmetysdEe1V+LcKsVfmocLAgWLRrnsq6MSSetSofFWFKpFmr8lERYZFQ0V6Vy/m5KGyuRV+dGqlctJFp1gL+XuFOM5w0w1kz3GuGB81w0QyPmuFJMVw0Z6jcOkM9l+01Xz2zxGmGk2Y4a4Z7zfCgGS6a4VEzPCmGR6MZrjlDo+YMjZozNGrO0Kg5Q+PNM9SXjVwfqnDRDL95hoZQwsUc5mwb3Sk8mfv9W+pwqxnuNMNJM/zmGSp0Dp+3cXav8DvO0DpcNMOjZnhSDP/PfuB1uj/M2g8cJw4nhBOGiZ3qMFQ9CWsZJ3CPwdqAE8FJxMlUn6HqTFhncAJ3GqxzOCGcME6m9pxd/fUDTvA9Z4fvOTu840B4x4HwjgPhHQfCOw7EOME7DoR3HAivPuHVJ7z6jFefweof8tGfxW61eFovj28SHT/83DyXF4vy4f7ve/mkvHr0vts+L18+d8vjS0iX94+Ol0Ru3pOcnif5QLiXdLrv5YN8I+/zbfbcSTmdHXoK5ezcLMon2PP5LL3llEeYR/kP", + "bytecode": "H4sIAAAAAAAA/+1ZS2/TQBBex482QVUregOBOFAkOHljO7YRhwgSWk6c4AIXp01A4sCJExcfkfjTxLCTTCazm4R62xg8UuT17uSbh2dnd2cd8Yfc+S9QbUe9O+r9EelzmL6O6vMQBsbCBGND9QyvR7JGrNCWjk4DdOzUqKODvjf9/rUr7iKsKBzE8TTtT2Uki7CfT7IkjJPJIJOZTLLkqp9F0TSLszSf5GmYyziaylmSR9PZb8o8sQxy0LUN4P8vgAVWErKaS4KgI/QEY1/Us0v6IbCGNRnfRbh142dhXHSJfTXrH3WJT23hu3bwwwOF87pc4lNbBHoCH/2Pi3jOEc+5hucC8VwQHrDZUkwMLPs0OhLr8wxsAdmeHdmxQ+QJYqcg8nvCavxKh8gDfah/oH0EPOVSH4eMeeW6HTDml6t2VHQ4/91HfDS2OojvCWo/I9hvynWdbM7/eazmlmNVngr9nAcbD0qxoEU+QH3gc/DTIeYnY1005pWrcnrq3UNyMBbo4RP+M/V+rJ4B+g/8/4SRHxD5K3ozfdhHFMtl+oC/OqE8VO07YrmmviqXeDbW1JEd/D7gj+3gR5WPqvn3EnwqrM6BGHICzlFAMOYj2VyOBeI23TgPXSBcykdl4nij8l0ik+ZTiK1joT8YbJubRwQL/9/bAsskG+wKNPyA5xP+5+pZ+fQzwdzkmzGxx6Rfh8GiNnOyAw1/h9gD/EPGHtNahfOIV67qD1jhNSjNlqdhyOG+YE7FSL5P+M/Vew/pL5BPhn+p5ywt5CwqZkVSXF3Fl8Vdgi+In3AuMcUI/j+dP7r1cZe5SOdIwPBjPJ/wv1VPLuZN866iUam3Z5s5bLLH32CPbg6/M9jjC7M9Y4M9NFc6NdvjaOz5wNizzVkA63sbZ4HFfkoIa3vZEJ0FuG+rOwtUYwGj6wkzRudlwMgJGDkcllcjlkPs0eXzuvNknBTpZZFKmcdyGstkU578qdoNr/nkbc3HTG3Np/5v1tZ8FrQ3NZ97iE+Xdyu+M9R+qtqW4zG3nEPCU4PN0LfvdZ3H6n2f6zoPVLut62ykRV1ngvyN5yz4G8ct9ucuZzFPmPf69PwNN2eWc3VI92DcXnOTP0Zlff4YafwxaJA/xjv4w9ngjzHxB/C/IP6wtTfj/AGy6DqG+SyvJ1vvMUB+T9hbP0O0x+Dqc9z55kisfzd6ZsNxRmsCXAy6jJybwvqXauK4VkL5qMy2Jq6vp71Xz8qnPwhmE2viHxl7bO7L5zTYZt3E8qnOBdHzNtbNJtwNfFLv+3A3cBP7UYxl427gq3pyc7+JdwPfDPY08W7gO2NPezewoPZuQKyva/t0N/ALwpbsw3IvAAA=", + "debug_symbols": "tdnbbuMgEAbgd/G1LxgGBuirrFZVTq0iRUmUw0qrKO9eHJWkNcj2r4SbqjT+/uKOsen40ixX8/Pn+3r7sTs2b38uzWa3mJ3Wu20cXRq+/ei4n2270fE0O5yaN/K2bVbbZfwuhGvbfKw3q+bNquvftjHDQCvTA7YENN0Bu18gDuaH9Waz/nz/NVHVfTHF6XII32FGuf50DSwsLAQWDhYeFgEVVpWEIU6CMkGw0EWhVRI6u34YFmZkVrmwsBBYOFj48pm7JJj6IqBCxmqeC4KFhgWjwpXvDCoJzq52Z2BhRwRlsxJYOFh4WJTvDPQQ/TP3ChY0InR/Vl7DgmFhYFGuuX6I7MwFFm5EZFe797AIqAgKFgQLDQuGhYGFhYXAAq55gGse4JqTUjgBqx4HdNvLFWsvxnw7Mb6/o2FYmBFhedLub1AILBwsirUXSc91cTRp9zckyru/n0Im7f4GhYYFw6Jc85D2ixKm7f4GhYyJMGn3Nyg8LAIqyrs/d38eOqN+ijY71HO6aL3hSRvFV4XrmuFcM9zUDLc1w6VmuKsZ7muGh4rhruYKdc+uUGtSG8dmzyyna4ZzzXBTM9zWDJea4a5m+LMr1NrU2LKShYeK4f7ZFWpFUrhT1yn/Rr8qXL/uz5KHc81wUzPc1gx/eoU6vodPayS8KvyFKzQPDxXDg6oZTjXDR1eovU7pjwwKAwsLC0EFqbFma9aeJSU4gdutpDxOAkxI4WSs5Zo1aYk0TuCmK5HBicWJ4GSsCafz0/c4wdtwGm/DacKJxgnjxODE4kRw4nDicYJXn/HqM159xqvPYPWvcfRvdljP5ptV9xK/+/C8XaR3+nF4+r9Pn6S3/vvDbrFang+r7v3/49V/96vje0x2txtqHMSNraPb+ooDUqaN9/97c/l2tLQs6ejg4+d8P5ylJfZxgnGSXw==", "file_map": { "50": { "source": "// Tests a very simple program.\n//\n// The features being tested is brillig calls passing arrays around\nfn main(x: [u32; 3]) {\n // Safety: testing context\n unsafe {\n assert(entry_point(x) == 9);\n another_entry_point(x);\n }\n}\n\nunconstrained fn inner(x: [u32; 3]) -> [u32; 3] {\n [x[0] + 1, x[1] + 1, x[2] + 1]\n}\n\nunconstrained fn entry_point(x: [u32; 3]) -> u32 {\n let y = inner(x);\n y[0] + y[1] + y[2]\n}\n\nunconstrained fn nested_fn_that_allocates(value: u32) -> u32 {\n let x = [value, value, value];\n let y = inner(x);\n y[0] + y[1] + y[2]\n}\n\nunconstrained fn another_entry_point(x: [u32; 3]) {\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n assert(nested_fn_that_allocates(1) == 6);\n // x should be unchanged\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index e1f64e48fca..f313406224b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -37,8 +37,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/91YvW4TQRDevb/kgqJY0CHRQUF3lzvbcYEUEZukpaY6HFJQUVGfoKOi4gUiIfEa1FTwQuRgxx5/nt07h1uTZCVr927nvpn5vDOzu1r9bcHVT5txZHrN+lCtNpo7Nn32by3vESvzZaO+BTYGHmz800L48wNlb+TUL9Onpg/YfNij0yno7RP/KCsnqeBfj/YXKXDqCz/0g5/tGJwX9RIffVGsJzn8JmQyp0zm1CJzxmTOQIZ89rQmRp45LfbVepyRL6Q78qO71KBPgZ8K9O8pr+s316CP7EF+aLxPMvXSHg1zUb3uB83F9aofTdu9+j1kcri2Aib3hI2fmrHn9TjxnEOyBw6f6d1OrRZtEfPsHfFKPO9yeZhL2VxUr+rZM88R08OxyI4Y5B+b5wPTJ+wb+n4g6E9A/4rdwjvkJRXkU0E+ufo9MuN7alk3T+olno+6OfWDf0j4Mz/4RcNRE2PPiFPlNSeXFPc8D1GjuZjplvIoNWlDzXPNCcNFOdTJ11u8HS4mmJMpFm21Pwb5EdgZ+7Ezu89wbRz52nftAwdK+O94Dd90vfCaM2e4KEeN55So7t/n8VGWkT7K57GS/Y/YPJd/bp73wH7i6viadl6Mq/yiqC6qYXV+Xs4rXBdNCxhPdzWvfGS4KIc6pbxyoOz7AN/nDFfO4TrJtkCtxxjnGHPSS8bTJeDhXhjfEQcDtc6dhnHbPpbqvcQ15ou4BWsKWPz7uAOWS3dinhOLPOHFIP/K9A3PXwGzjZsZ+OOyLxCwbHHEv08s8gH4Q/KV4I/rjID5heRCwV6+xnBdSHUWsaS6zLFikH9res9nTLEuRxYfbHxM6/74mFr4eHeL+JhtwIdu4WMGfJD8e+DDV66X+AhB903YtzWNn8+wte3bvjFclEOd0trwzMXIFT9SbsP4+QB2/o/42Wa+5VhSvnXVmi7npk+m71o7u+bLqAOWy5+4xZ8I/CH5zw5/XPuRprnyHdZ53bM/2uLPF8GfLne5ns6/ne9yF3dlyms+yV3/re0ut5lLBFsHwhzGZSLoSQQ9ElbUI5YGf6Tc2eSpvs+91bg4mh+W8/HrYVEVo9Zzb9/6y2E1nlfjPJ+U+ZsyH25y7u4SN77O5F3jht5tK27a6gzGTSTYOlDy+uZjKf9Hgp5tYd20Oxi841fgI2/c7k3vYKQcLdW7LfHU+Q6GbNv0DuY74+kS/JPO89LaHyh7jnWtSc6/a+/X5Q6GY00Ba9M7GJdu6Q5G2gfhHcwP019nHzmrV/1x2acFLFsc8e9tdzAa/CH5n4I/TT35Dfoe/0vhJAAA", - "debug_symbols": "ldndauMwEIbhe/FxDvQzM9L0VpalpK1bAiEpabqwlN577VK3JRIx70mIQh5s6ZOFPHobHsa716fb3eHx+DLc/Hkb9sf77Xl3PEytt/fNcHfa7fe7p9vfPw9h/pD0+f+X5+1hbr6ct6fzcBOrbobx8DB9c5/8424/Djca3v9uBslYCBaKhWFRsKhY+HWRglwIDVhELBIWGYtu5il+i1wuhWJhWBQsKhZOhXWvkd2/hIRGOBUlYBGxSFhkLAQLxcKwKFjgzAvOvOLMK8684sxrN3OJeRGxEYJFN3NJYRHpcr2qhkVZuatWVCycCg9YxH7PyyJyvBQJi7XMWyFYKBZGRQzd4TWRL2JSGxI5SStEc0MyJ8KJctIdZLNlslhpB7lwUteINcQxiYGTyEk/fV+WInNpSOZE1og3RDkxTgon3fTL94NcJDTEMUmBk8hJ4iRzIpzoGtGGGCeFk8qJY5L7G52wkNxsdGLOnMgKic3Sl5UT46Rw0t/ixh/Sdt8xkbBCUnNjEjlJnGRO+umnH9J2XzmxFdJue/q1kuukcuKY9Msl10nkJHGSORFOlBOevvL0laevPH3j6ffrIDUvO9gqzQ62Xwi5ThInmRPhRDkxTgonlRPHpPL0+yURlaWcp+0rT78mcp1kToQT5cQ4KZxUThyTfm3kOuHpO0/fefrO03eefr9CorpU99RaUjjpp2+2kNK8jLhTkvqlm1831iGRk8RJ5qSffsnfpDREOVlLv0MKJ5UTZ+R9av3bnnbbu/34dSL6+Hq4/3VAev7/PF6clT6fjvfjw+tpnE9Nfw5M57CSbbLN03CeUhY39tmYJ0ucZmC0Ol1xuuoH", + "bytecode": "H4sIAAAAAAAA/9VYwW7TQBBdO7api6JGcEPiBgduce00zQVVIqEVSHwCkknJjRMnbr7AjRMnfgCJ/+AEP0Xd7jST59m1UzwpXSlaxzt+M288O7PjwFyN8OIX2OvIzgGbB2Zz0NqJncf/NrIescZaNgZ3wMZQwcbLMYCXHxr3IFJ/7JzaOWTrgx5Jp6C3T/zjcTFLBX492p+n4FMt/IEO/viexXlZrfGRi2EzyeEzAyZzymROHTJnTOYMZIizUkwcKfs0H5rmPiMupDvS0V0EoM8ATwP6941q/GYB6CN70D90PSSZam1PAGtR1eRBa3G1yaMeexe/R0wOYytkck/Z9TN7rRyPM+UcMn7o4Uz37lXmelzveXaP/Ep+3uPysJaytaja1LNv/0dMD8ciO2KQf2L/H9g5Yc/Q8yNBfwL6N+wW7qFfUkE+FeSTi99je33frOvmi2qNp1E35zr4h4S/0MHPax/Ve2xh8Q5MMy4xZ2rVQMxRFJuoM2TvHHM4z28x3KPTWM33NfDjOdCXF0fGvYeVa8qEcmZsmoPWEuBlzGYN4hz54HbX/nnDcFEOdfJYSXbji1kAvuCxEgqcYpB/DnYmOnaOHzBcl4+U6k0xNM09ge8uZrq3jRder1cMF+Vo8HwcVf1znh5f5ZBLey1+bJq2c/0xyL+y//fBfvLjyQ3tXE3LbJWXq3JSnp8XyxLjoh4h81Pf+stpfrw8LJbTd5O8zI9a9fOaoJz31eOUnz+/MFyUQ518X6L+AejEekHnjQMjn1k5VtuZfA5Y/PmoA5ZPN/FKHPKu/PnWzrVPfwBmm28WwMdnn1SXkbOkO3HIh8CH5M8FPr4eBfeIjzuPLYwLqcdHLKm2cSzk8sHOyjVYrG2Rg4PLH/OqP3/MHf74eIf8sdjCH0GLPxbgD5L/BP7QOs9L/hiAbq3vdUPT9DcNqd7w/hBH29nnJ8NFOdQpxYayL458+0fKbbh/PoOdt7F/dplvOZaUb7HWJkbuPQgP+9CvdpZqp69+12Neufl0OQv4+MQtfFxngW8ePnELH1++wzNX0DOfwMHnu8Cny7dkbu9tfEu+/lZnVPNJ5nu3rm/J9Voi2DoS1nBfJoKeRNAjYUU9YgXAR8qdGr1bMSmny3KaZbMie19kk216ty5xq9XXdY1bureruG3L8xi3kWDryMjxxa+l/BsJenaF9b/18fiN3wBHPrjd2/bxUo70xcJNzw/b1u5t+3if7pvW7l927trHd63drl6FY0l9Oep29fFYu0n+t8Cnzol/AUJkZU2lIwAA", + "debug_symbols": "ldnbquIwFMbxd+m1FzmsrCS+yjBsPNRNQVQ8DAziu087WN00wfK/ESP+aNKvLasr92bbrm/fX91hd7w0y1/3Zn/crK7d8dCP7o9Fsz53+333/fXz58YMH8H8///ltDoMw8t1db42S5vComkP2/5bzr3fdfu2WQbz+L1ogsXCYeGxECwCFopF/CyckalIWGQq1GBhsahm7uxL+DgVHgvBImChWEQqYjVBn/NTiJmKZLCwWDgsPBaCRcCimqBYPwpbiIhF9a4VZ0bhpvdHylRkMzOrUlgsHBYeC6mvPI7C26kIWMxlXoqIRcIiU2FN9fSqyJOopIIIJ2GGBF8Q5SRykjipnmTV8WLRWJxkazixc0QL4jjxnAgn9fTz+CjSLAVRTuIcyQVJnGRMnOGkmn583chRTEEcJ54T4SRwopxETtIcCQXJmHjDieXEcVIvdMxIfFHoWK+cxBlii0efT5xkTMRwUi9x7ZsUyxfHiZ8hrpyYcBI4UU7q6bs3KZefOMkzpCx76l2Jz8Ry4jjxnAgngRPlJHKSOOHpK09fefrK01eefqyuJfmxgk1SVLDRcuI48ZwIJ4ET5SRykjjJmCSefr1RE2RsH4XylafeqflMPCfCSeBEOYmcVNMPYewiBS1JxqTesQmqI4lF0Vtv2XwmbmZiFeI5EU4CJ/X0o3+RorqoN24+k7n0KyRT4ozhxDLy6Ed/Vudutd63z52e3e2w+bHxc/17aid7QKfzcdNub+d22A16bwQNl4TThddhucPUNS+iDINhUra/Aq2m/oj9Uf8B", "file_map": { "50": { "source": "// Tests a very simple program.\n//\n// The features being tested is brillig calls passing arrays around\nfn main(x: [u32; 3]) {\n // Safety: testing context\n unsafe {\n assert(entry_point(x) == 9);\n another_entry_point(x);\n }\n}\n\nunconstrained fn inner(x: [u32; 3]) -> [u32; 3] {\n [x[0] + 1, x[1] + 1, x[2] + 1]\n}\n\nunconstrained fn entry_point(x: [u32; 3]) -> u32 {\n let y = inner(x);\n y[0] + y[1] + y[2]\n}\n\nunconstrained fn nested_fn_that_allocates(value: u32) -> u32 {\n let x = [value, value, value];\n let y = inner(x);\n y[0] + y[1] + y[2]\n}\n\nunconstrained fn another_entry_point(x: [u32; 3]) {\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n assert(nested_fn_that_allocates(1) == 6);\n // x should be unchanged\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_0.snap index ae9c2e4e53e..dcc27680681 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_0.snap @@ -37,8 +37,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VZMW/TUBC+59huHVQ1gg2JDQY2u3bqZisioR2YmJiQTEp/ArMnFlhgY2LiDyAh8fOI6bvm8uX87LR+VD0pei9+57v7vry7d3YMXUmw+hg7D+1oxDiiTeG1Uzumt5NsQFuprxjNPYgx8BDjPxnBjx9QuzCoP3ZM7BiI9dGAoBPwO6T9k7SYJQq+AePPE+DUl/2RH/vpnrXzql7bRywkRtbDe0ZC50zonLXonAudc9BhzJ72xLFnTvMD2s4zxsK+Qz++CwP+CHAS+B+T1/2bGfDH8SA/PD9gnXodj4G1sN7GwWtRvYmjkf3V57HQw70VCL1nYv7czj3vx5nnGpI+cmDma3s1Xct1zotrzCvzvC/1YS0Ra2G96Wdsv4fCj7TFcUSg/9R+P7RjLO7h+yeK/xj8b8StXENeEkU/UfTj1eeJnT+g9bn5sl7b83Fuzv3YP2L7Cz/284ajJse+MKfktSYXnPeyDrHwWiR8a3WURWuoZa35JuyiHvqU+439H9I2F6zn+fxIDcTCear5JFo/fEQKDrJzea0UPP0S90ibJHzKa8zBhNr7FIxf2pLnDeelxjXug7jD1hxsyfvjHrZcvrk/i1v02V4E+i/s2PD8G2x2cbMAPK74AsWWxNz2u8Qt+gHgYf0zBY/nmjFz5YK29zDm1xBn7CfO9KGwS6TvOy23jLiG+eDKrZGDD2krAv03wEf0H/mIWjC08TGvh+Nj3sLH23vEx2IHPkwHHwvgg/XfAR++nnk1PtgXPh9IPc99eu9nN/Y/hlgHjidz1XgZYwDcaX3LhLb3meyNb3L++7bleR9Ose+UwmtYx4k2uZcYpci4b9OTsv9DJQbsSX3lq+scxtpDtHtP+lHwhD0p5mLb3td6UgPzXXtSV7323ZO6fGs9qVHsY09a23GIntQVX1dP2va77NqTflLw+HxXtJJjVy5oew9j/gxx3kVPKt+PhPXw/suTq5rRCL+bimi7Rkr/Eeh/td/HCo7wFnFellV2mVeX1bS6uCiWFfLUSCB4ku9IXGebvP8mvby0pdUkI7A3ElO/ZyHW/25HLffDDjzzuh1P2MOWC0/UgScEPKz/w4En6sCzcODBWmYGxtNWF34qePr8j+HpmaV3L3z9npj0vXg6TDxZ33MKe+FYiXVCeu3luVyTfmLFj2YrHNCWATySe1mnhq6TVZmfLI+KZfl+mlf5cWedHNp/Ma3KZVVm2azIPhTZtMv/X+xSwOuNIQAA", - "debug_symbols": "zZrfiuowEIffpde9yCSZTOKrHA6Lf+pSEJWqBw7iu5/2YFWSUgntuHOzbJf8Pr92nFnBuRabanX5/qr328OpWPy6FrvDenmuD/v26nori1VT73b199frnwvV/bD6//nTcbnvLk/nZXMuFuCxLKr9pv0thDa/rXdVsUB1K5OjJoT7Uavo9ejvsrCGE2454cgJd5xw4oR7TnhghKPihAMnnLNDkbNDkbNDkbNDkbNDcWqHWjA9HBK454RP7VCrVQ/XNoI7xQmH+R5LCteccMMJt5xwnFxQ6uEGYrjjhM/YoSncc8IDI5wUJ/xNh2oVv79IZydMdsJmJzA7MfhW1vBIGBp/rM7a+1FnfQwnTrifD44mhgdGuFeccOCE66lw1w8+R3ETesMJtzPCXQxHTrjjhBMnfHKHhv5DlQvx4PKBER7UjPAQw4ETrjnhhhM+tUPp8Q+erBo/6k0/47yNZ1xAIR5OiAcJ8fBCPIIMD1BKighIEdFSRIwUESFDFdQHpyranoqYijgpIiRFxEsRCUJEQEkRASkiWoqIkSJipYhImawgZbKClMkKUiYrSJms+pOTFfuvwdClIiBF5JOT1blehFQiYqSI2B8pzYAIShFxUkRIisgnJyuZhwglIkGIiPmZyTogAlJEtBQRI0VkzsmKCR1Z6Y6VTqx0z0kfXrozqo+YZAkIhlfpxiPhTQTir9xgeO1tPAL5EZ0fGWxIA89IcvvD62TjEXwT0amYy49QfsTnR4arr5+R5PaHV6rGI/AmkixuwPD603jE5EdsfgTzIy4/QvkRnx8J2RFS+ZH86lN+9Sm/+pRffcqs/q29+rNs6uVqV93X5reX/fpli/7891hFC/XH5rCuNpem6lbrn1v13Q1qVxrXiXRlAKtKsNhddo8YPJTgTfua7ev+Aw==", + "bytecode": "H4sIAAAAAAAA/+1ZwW7TQBBdO7tuHVQ1ghsSNzhwi2unaW5FJKQHTpw4IZmUfAMnZAkuIHHjxIkfQOITielOMnmeXbuqt6hSV4rW8U7ezHudnR27kboa8eYT2Wtt54jNA7U/aO3czuObjaxHrHGoGKM7EGMcIMZ/YwB//Fi5B5H6Y+fUzjFbH/RIOgW/feKfjYtZKvDrMf48BU1D4Q/C4I8PLM6raoePXBSbyQ5/M2A2S2azdNhcMJsLsCHOgXLiNLCm+ZFq7jPiQr51GN9FBP4U8FTgf6iC5m8WgT+KB/Wh6yOyqXbxRLCmqyYPWjPVPo96HG4+j5kd5lbM7J6x6+f2OnA+zgLXkPEjD2e6d1Cp7djueXaPdCWdD7k9rKVsTVf7fob2u2Z+OBbFYcD+qf1+bOeE/YZ+PxL8J+B/L27hHuqSCvapYJ9sPk/s9QO1OzdfVju8EOfmPAz+CeEvwuDntUb1Hvti8Y5VMy+xZoY6A7FGUW6iz5j9zbGG8/pm4B51YzXfb8CP10BfXRwp9x4OfKZMqGYa1Ry0lgAvpfbPIM6RDx53rc93hot26JPnCvo34BN1pX15rJraGcBKWrDmgGU8cUlYPt/UnyUOe8IzYP/CzrWmvwGzTZsF8PHFJ+Uv56wdvhOHfQx8yH4p8Amc9zOMWQt6cf8Y82uIMwkT5/ghw1VKzjup/+J7CveDxM9XJ6W9hXXwDehhblEP4+Dg0mNe9afH3KHH2zukx+IaekQteixAD7J/B3oE2teiHvw5ArljHxKoT+/87Eb+hxBrz/FkvhrPY4xBOy3EOlLNPOO9sSsHteDntrDu+6pu54ivr5L2WNc+ZA5Yvj5EwvL5Jl6Jw57wDNh/tLPUV7VpgzXUF5+055Cz5Dtx2GNfRfafBD4h33dsxmmXc5P7x5g/Q5z/49zkz/i66t//9OzqubQe9H7FqOY+5/4N2H+134cCD32DONfTMlvn5bqclJeXxapEneoRM5369l9O87PVSbGavp/kZX7a6p+/Z6C84jpetx8edMCSaqJvr0r4mPc/7Ny19nA+88rNR3fA8vExLXxcz0c/PXx89bweCw8frJNRz3wiB59fAp8u/wsIVL8695Pbd61KzsXzfuLJup772E8mQqwjYQ33pfSuJRH8SFi6R6wI+HDtQ9bJYlJOV+U0y2ZF9qHIJm118i8YbShGUSAAAA==", + "debug_symbols": "zZrtiuowEIbvpb/7I8lkMsneyuGw+FGXgqj4ceAg3vu2i1VpijK0484fMZL36dNOMxbNuVhW89PXZ71ZbQ/Fx59zsd4uZsd6u2lG50tZzPf1el1/fT5+XJj2Bc3P/MNutmmHh+Nsfyw+bMSyqDbL5l1KTX5Vr6viA82lzKZCStep3tDj1L9lgVYS7iThIAn3knCUhAdJOI2Eewsd3GbwKAlPY+HOdHDne/BgJOF2usuSw50kHCThXhKOowtKHRxsHx4k4ROu0BweJeFJEE5GEv5ihTrTv7/IsRPATnh2AtmJwVvZ2VsC6PllDd5fpwYf+3CShMfp4Ah9eBKERyMJt5JwNxYeusYXqL8II0jC/YTw0IejJDxIwkkSPnqFpu6hKqR+44pJEJ7MhPDUh1tJuJOEgyR87Aql2xc8efN8aoSux0Xf73EJlXgEJR6kxCMq8Ug6PKwxWkSsFhGnRQS0iChpqta8saui76iIuUjQIkJaRKIWkaRExBotIlaLyBs7K2L38zWGXAS0iLyxs2IInQiZTAS1iIRfKc2ACGkRiVpEkhIR987OSnAToUzEahH5nc46IAJaRLwWEdQiMmVnxYxOovQoSk+SdDCSdD+48sF0Ecj+vLce+BH/ImJtFkF+JPAjxI8M3ktg75H89BM7Mrxb5yHiMrHhPTjPI44fAX5kuPruHslPH/mR8CICuRjxI5EfSezI8E6Q5xHLjzh+BPgRz48gP8KvfuBXP/CrH/jVJ2b1L83o32xfz+br6roNcHXaLB52BR7/76reBsHdfruolqd91W4VvO8SbOvrQgmhFWk9LLjSAv08wLfD5jHSEjbHbI77DQ==", "file_map": { "50": { "source": "// Tests a very simple program.\n//\n// The features being tested is brillig calls passing arrays around\nfn main(x: [u32; 3]) {\n // Safety: testing context\n unsafe {\n assert(entry_point(x) == 9);\n another_entry_point(x);\n }\n}\n\nunconstrained fn inner(x: [u32; 3]) -> [u32; 3] {\n [x[0] + 1, x[1] + 1, x[2] + 1]\n}\n\nunconstrained fn entry_point(x: [u32; 3]) -> u32 {\n let y = inner(x);\n y[0] + y[1] + y[2]\n}\n\nunconstrained fn nested_fn_that_allocates(value: u32) -> u32 {\n let x = [value, value, value];\n let y = inner(x);\n y[0] + y[1] + y[2]\n}\n\nunconstrained fn another_entry_point(x: [u32; 3]) {\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n assert(nested_fn_that_allocates(1) == 6);\n // x should be unchanged\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 29f747675a3..af439f19ced 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_calls_array/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -27,14 +27,18 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/9VYwWrcMBAd2ZJteQkp7a3QW9tjsbtenEAPOTSBHnroob20UEyS/Q5/enYTzWb27VgJxCKJwIxsPc+89yxpxRq6a9nmMqFvQzQi5rTfeOwsxOZprZ0xV5OKo3kFHLMEHG9bDh8/o+nGov6H6EPMxHg+o2gPdefMf9J0vVf0zch/6cHTVPnzNPmbMuT5Pt7nRy0kIuPwnVxgzgXmfAJzITAXgGHNieZEl9jT5REdrjPWwrVtmtqdgXoEOgnq15R0/rYG6jEf9If7R4wZ7/kYGLPjoQ4ec+O+jm2rNtd7gcO5lQncJ9H/HPqJ52OfeA9p3kU087NypF3brXnxjH1lnyuJhzEvxuy4X6cO91bUkbmYhwP8x3B/HGIh3uH33yj1C6i/x1t5hr54Be8VfLG5PoT+IlzbOfSH36HnW2fadz+mwz1Q7klTuXIlF+Od8CKP5HeA/xLi1q9/4JdL49dX5lxS3C8HfhVirAT9Wq4i4lel+KXld4BfRfyq0vi1ZM41xf2qwC95vqtBv1Fy+YhfteKXB4z0i/HfFL9ieuQ6wG+8UDhYRaMD/FmEg7bO0CvZLxUOEo/rbHfGUzik/G3btFPkbCd8MxOcfwDPOg3P5q3ISxSfr1KDth86wP8EDYnOfqoG+wgNcs9xExp+gYZUZxVNQ/YIDXIfqCY0/H4BGhaCqx3nr9+fNA3X5XOZo8M/gWR9B/i/4V7Of472CTzX/dCul8N6WA1XV93lgD4R+DR3/W419JdD37anXXvdtauH6t8ANf14OGETAAA=", - "debug_symbols": "zZjbasMwDED/xc9+8N1Rf2WMkrZuCYSkpOlglP777JHenEEJnRq9hChIxwes6EEntgmr425ZNdv2wBYfJ1a367Kv2iZGpzNnq66q62q3vP/MRHpo+M0/7MsmhYe+7Hq2kIXlLDSb+AYQ67dVHdjCijMfpWqAIdUI/yRV6CFVP6Z+cmYEEQ9JxEPN4iFl7qGJeBgiHpaIh3ujh7x5jPrUE/EoiHjALB4q7w8riHhIIh6KiMc756m6eeR9ag0RD0vEw83ioUf94Yl4FEQ8gIaHe3WemutQMMrkcIkJV5hwjQk3/wcfX6jFhDtMuMeEP/nvlRjdEkyt8GJyhZxcoSZX/NnKSl4r9JPx4YwZUp3VOdxgwi0m3GHC/atw5y9w73J4gQkHRHghMOHyVTiIC/xx0iS4woRrTLhBg59j9FV2Vbmqw7CQ2x6b9d1+rv/eh2xVt+/addgcu5CWdnf7umipHNcuKsvUJoXjIFOQrhUUBxPPi2f+AA==", + "bytecode": "H4sIAAAAAAAA/9VYTW/UMBB1PpyNE6pWcEPiBtyQkibbbA9IHNqKAxcOHDiAZLIsEr8iP72b1rOdfTtxKzWuWkvROPHLzHtvPVa0kbod8faK3Dx1MWIxUfuD1r64WD1u1DPmqkJxjF4AxzgAx5uRwI8fq+lBov67aFyM2Xoyo2gDdefMv6razgj6ZuTfGPA0VP4kTP5q4fJcDHf5UYtikXD4TsIwlwxzOYG5YpgrwJDmQHuiDexpc6QO+4y0UO00TO02gnoKdCqoX6ig+7eOoB7xQX9ofkSY4Y5PBGvpcKiD1vSwr2Mc+fZ6y3C4t2KG+8DmH9088H7sAp8h1RuPZnq2GNRu7HqePSNfyeec42HNsLV02K9TuPuU1eG5iIcG/Ht3f+xixt6h90+E+hnU3+MtPENfjIA3Aj7bXu/cvHTXuId+M97oO54Joc547EHyHmvGTBOeUbx/NTz75OKodw36eI/7+v5ETe/RwP2xO6O0wFXicyz4o0G3lCsVchE+c/fZBJ7yacCfuTh6/w/8ysL4dUqcc+X3KwO/FmwtB/1SroXHLyP4JeXXgP/s8cuE8ashzqXy+2XAr4KtlaA/EnIVHr9Kwa8CMNwvwl8Ifvn08D7A3/iVwEELGjXgv3o4SH2GXvF5LnDgeOwzwn8TOIT8LtiOc+ScTvgWTXD+DjzLMDyr1yyvUv79yjVI56EG/A/QoJ9Qg36ABn7mZBMafoKGUN95kob4ARr4OWAmNPx6BhpKxi8d5q/frW6/lcZB37RaHf6BxutrwPfunntKMX0Ez01n601jN3Zp1+u2t+iTAp/mrm+7ZtWftn33Z9nY5uzJ67dL2/W2q+vztv7b1sv76l8Dv6114R0VAAA=", + "debug_symbols": "zZjbioMwEED/Jc8+5DJJnP7KshTbpkUQLdYuLKX/vslib7pQpDt1XsTIzPGQTOZhTmITVsfdsqy3zUEsPk6iatZFVzZ1XJ3OmVi1ZVWVu+X9ZyHTA/xv/GFf1Gl56Iq2EwuV20yEehPfEGP+tqyCWFh5zkahBrEPBemfhErTh5rH0M9MQM7EA3l4WDmLh1JDD8XEQzPxMEw84I0e6uYxqlPLxMMx8fCzeOhRfeRMPJCHh5NMPN7ZT/XNY1inTjPxMEw8YBYPM6oPy8TDMfHwTDxe7adwbQqgYQhHQriXlHBFCdf/Bx8dqDeUcKCEW0r4k3uv5eiU/OSMfHIGTs3I5eSMP0tZq2uGedI+HEAf6qwZwjUl3FDCgRJuX4U7f4F7N4Q7SrinhOeUcHwVjvICf+w0EY6SEq4o4ZoMfo6rr6Iti1UV+oHc9liv7+Zz3fc+DEZ1+7ZZh82xDWlod5vXpauuXWZcVFZpsxEyxLRIm6PixEBJG/8Y//oD", "file_map": { "50": { "source": "// Tests a very simple program.\n//\n// The features being tested is brillig calls passing arrays around\nfn main(x: [u32; 3]) {\n // Safety: testing context\n unsafe {\n assert(entry_point(x) == 9);\n another_entry_point(x);\n }\n}\n\nunconstrained fn inner(x: [u32; 3]) -> [u32; 3] {\n [x[0] + 1, x[1] + 1, x[2] + 1]\n}\n\nunconstrained fn entry_point(x: [u32; 3]) -> u32 {\n let y = inner(x);\n y[0] + y[1] + y[2]\n}\n\nunconstrained fn nested_fn_that_allocates(value: u32) -> u32 {\n let x = [value, value, value];\n let y = inner(x);\n y[0] + y[1] + y[2]\n}\n\nunconstrained fn another_entry_point(x: [u32; 3]) {\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n assert(nested_fn_that_allocates(1) == 6);\n // x should be unchanged\n assert(x[0] == 1);\n assert(x[1] == 2);\n assert(x[2] == 3);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 5b4429778d5..8ab40580cf9 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -88,8 +88,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndrdTqNQFAXgd+Gai/O/9/ZVJsZUraZJ05paJ5kY331gtLTTc6BZ68aI6SfIWiBs+Oye148frw+b3cv+vbv79dlt90+r42a/G5Y+v/ru8bDZbjevD5c/7tz4RfTf59/fVrtx8f24Ohy7Ox+d9d169zx+m2z4DS+b7bq7y+7rvu/EcKOOMJ4wgTCRMIkwmTCFMEKYdg+Cpsk4vTaGG3OE8YQJhImESYTJhCmEEcIQPTCiB97dLsLwyWvkGRQYNHNO0OkYSjFXKDEoM6gwSBikDDICeccgz6DAoJlGlHONtGq5TwzKDCoMEgYpg4xAwTHIMygwiGlEYBoRbjYixVKhwiAhUGyuSZL+GClSEcGJ4sRgkhxOPE4CTiJO2l1zYQrThSrMlBlUGCQMap99nCtn5CtkBMqOQZ5BgUGRQYlBmUGFQcIgphGZaURhGlGYRhSmEWWmESIT0up4KolBmUGFQTONMDchCxVSBhmBxDFophFFzzuiOpdLYFBkUGJQZlBhkDBIGWQEmhl03UBMI5RphDKNUKYRyjRCmUYo0whlGqFMI4xphDGNMKYRxjTCmEYY0whjGmFMI4xphBGNCM4xyDOoucuj+R+TQqhIwYngRHFiMGmPlJaJx0nASfOgS/E0gErqKpJwknFScCI4UZwYTNrjo2Uyk76biK9IM/1kp6vanOq1RJwknGScFJwIThQnBpPolqPMqYoy3pzN1cOvEDODCoOEQcogI1ByDPIMak/P3MmIq0nEScJJxkmzCUXLRKqatudmy0RxYjBpT8yWicdJwEnEScJJxgmefsbTz3j6GU+/4Om3Z2OSZZppV8dLezK2TCJOEk7ax76c/t+IVFeB7YnYMhGcKE7g5yZBHE48TgJOIk4STjJOCk4EJ4oTPH3F01c8fcXTVzx9xdNXPH3F01c8fcXTVzx9w9M3PH3D0zc8fcPTNzx9w9M3PH3D0zc4/di+a1q60Yox46TAZObewuQ0mBlGfhfo27RvAc1OVzHhv2fS36YQ62mmGc4P+IZ5X7w2ShjDTfsyfvignPdBvjaeMIEw8fbfc5lP37jwiacu63WSmUh/5un4simg+RoWfq8Om9Xjdv3zTvfLx+7p4hXv45+39dXb3m+H/dP6+eOwHt/7Pr/yPaYbnfYx2Lgtw1Lxvfj78b29YcEH631M4+KYaYyujzEMWzBsxV8=", + "bytecode": "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", + "debug_symbols": "ndrRbuIwEAXQf+GZB3tm7LH7K6vVira0QkK0onSlVdV/36RbAosd0L0vFak4EHxvArHzsXhc378//9rsnl7eFnc/Phbbl4fVYfOyG7Y+PpeL+/1mu908/zr/9yKMf2IMX+DtdbUbt98Oq/1hcRc11OVivXscH1odXuJps10v7lL4/LkcUGSQMEgZZAxKDMoMcgYVBlUCSb8RUmxCoTQoMkgYpAwyBiUGZQY5gwqDKoGUaYQyjdDbjRieeYmUQcagmXNEmY4n09SgzCBnUGFQJZAFBkUGCYOUQcagmUbkU41K03LLDHIGFQZVAqXAoMggYZAyyBjENCIxjUg3G2GaG1QYVAnk3XDdyrfx7A0RnChODCcJJxknjpOCk36YQaYwgzRhlsCgyCBhUP/wDiGfUGyQMSgxKDPIGVQYVAlUA4Mig4RBTCMq04jKNKIyjahMI+pMI9wnVJrjqVYcSQgMigyaaUQNE6rSIGWQMSgxaKYRuZwGwhvkDCoMqgSamVy6gSKDhEHMkEdmyCMz5JEZcmGGXJghF2bIZ2ZvbiBjUGIQ0whhGiFMI4RphDKNUKYR/dkbrfHbmDRnvf7czXViOEk4yThxnBScVJj0Z2uuk4gTPH3D0zc8fcPTNzx9w9M3PH3D0094+glPP+HpJzz9hKef8PT7szGmx4lAK6EhjpOCkwqTHHAScSI4UZzMpB8mEhvSTd/q8eoiWfsuGSeOk4KTChMPOIk4EZzo9SiTNVE6Md0pXhhETHdKCQyKDBIGKYOMQf250nA0HlqSceI4KTjpNiGXPJGmpv15sesk4kRwojgxnCScZJw4TgpO4PQ1BJxEnAhOFCfd9D35tLaQG5JwknHiOOkf+378vnGXhlSY9Oe7rpOIE3iVTKPixHCScJJx4jiBV8l07qpp/geKzl01XSOCk/4XefXjBc0w43+G/hkjTCJMJowTphCm4qZ/8XTDEOOWZz5PPZ6d5b81zy/jxL71f9vLaQFpWI7RSyOEUcJY30Q/jUG6NIkwmTB++/Oc57PsnND1eK4pTZJM+hU3M1co8+Zz2Pi92m9W99v1953ET++7h7Mbiw9/XtcX9xi/7l8e1o/v+/V4t/HpRuPxvXVYw1dL474MWzkuPQ6Pv74047AVcx43x46q5eGZZdiDYS/+Ag==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_0.snap index bda74fad7fc..ee14f54dcbd 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_0.snap @@ -88,8 +88,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1bMW8jRRSetXccr+1czF0o+Be7ZzsOBVIkgkBHR0W78SUdBX8AbUXJH0FCoqKkpKREogEJiQLR0CHdSXd+9rz489u3G1ueyWWkjBTN7ry3733vmzezszNOYtbldPmXuOvU1dbVCVwbaKNy4er8sFJ4tJWHwphEgLETAcZuBBjTABhD4LQecd7HOO9F0PdHEWDsR4AxiwDjwMQ1foYRcDqKAONxBBifRIDxxMQ1fsYRcPpeBBifRoDxWQQYTwNgXJX34ZpA04cBLbxpYUuDjBZitNChhQS9qOlFSC8XmrxpcqTJhwY3DRhKSOpwIvTUNBcm5wN3kbn7Dsg9Lv6LTPj1af88n5WZEp9H/JPM2ewFsV/M2P5RGPw52/2k2tjHWFjedfWLasPlC3iGcpKxhunLaWguZscifgOxsO9+GN9nifCHnKOM/Q9MyLxbb5SgP8Yj+eF54Zh1qg2eRMjSqh4HyyzIuH9J5yPQk7nVEzLGQoVzMwNujPGek1ePORlXTnaFLK3qceybk8gJ4+C+SQNwsXyv5Y95F1fepUKWVvU49s07zC2ZdzYAF8u8e3wHm7jyzgpZWtXj2DfvMLd6oPcZXH/ursOuCdfre3z3e+6D/JmCH31ROarMbeF86UIb88o891FfyDKQpdW2n4G7T8EP2mIcVuh/6u5PXN2DZ/j5seK/J/xv4VbaJC+Zop8p+nigQN+v/M32cbVtj3Xyw8rtN+cl2Pc5h1EMNAZ+d/ZOTH2ekHNaqO87OYdw7kifPegTOcfi/GNF2xeupvs/RXw4R7XNW2PTvLaXz2ljXcZoG/xdVnoMX0IMf7lr+a6hcuHq/KBSXLV9K3FuptV2jH5852cUz9/OFs/nuEdiBaYByLqKPvYF/Q0V/QHocH+MhT5yrY2XDPiRNkOMF8aV3hFHR4kDObCi7cbVPsZLpuDR9qM8HoQXWj+npj4u5Vw3cve9Bv2h4Iv1vwK+XgtutOflnNADu/I5KpfVtl/W/xr88pygjVvMSypptY3jwrXnhxV13GJuyHGrjUMtl2T/oD5yKnNvBDI5bqVt5ke+V+5r3PaVOPYdt9+4Whu3HYU7bGt7z3VauJNz3jAwdyOFOy0HOqaeAyOFO2771vjjLjO7cSfnw1Fg7m6/ryCOkWnm7hhkfI3ccdt3xh932hoqU/B45Oea56onpl5YdiJ8o2wsYjZQGxE/FoyJuHsDdqWexIN5xNgeGk+pkCFP8kwNi0+ecG/kofJkhQx5wvEgi0+ecJ+OsfE451z73tUh9++oPBU40Zc12/36g8AUao9Fw9QRmJjDHx8Apl3WOSHOm6gkgg9833QVrB1Tz0G+1vj9ydXvcp0T4swEubMKd6lp5q7pR/RWtP1s/HG36zpH5l2oeaNtnWNNM3e7rnN+Mf64a8s7lMm8CzWXtHGn9eW+3P1qmrlLTJ07bGvLu6SFO7m+zt4Bd5kH7n4z/rjT9ndxPzut/HM0P19ztMJYbWKU6xf0b4X+H+4e97e4PmTv6GZeFjeT8qaclS9fThelfKcih8MA/sv55HzxfLqYX80m5eTs3v0vZmdXi+mszK8Lun1+l3/tfAb3mqjwGQ+eAaE+rptQ/x/WXf79667luR/6I71XLXpJQ72yobSl1XabdjaEZ2asz74HVR0jy4Ygs8LPyN0jX2iLcVih/7+75z7Bcy5+fqz47wv/W7iVNnlmNlT0h4o+9c9/bM/VGLvvc+iVT2Ef2yQ2zp0Q42o5pOaLcl4UH06L62kxu2tc4Vmc/CaTuKSdbovtsWKLzyxDr8fC/u50/c8ViYifY1n97jjZtKMM99nxHXRZbeSoP0o2NgfuWltvMMdDkFtFzs9pv5nQ+pDbM0Vf7lUjNjw7zXaw1Wnx3XbGpvlGXPgsPmcVnH3h90jBYxVbMs+lXXwOY9B+F7drXr0F29eEVNU8AAA=", - "debug_symbols": "tZvdTqNQFEbfhetenL33+fVVJhNTFU2TpjW1TjIxvvuAStsBaiNl3Zii51sLC1+hB3irHuq716fb1eZx+1Ld/Hqr1tv75X613TRLb++L6m63Wq9XT7env65c+yPFj/Evz8tNu/iyX+721Y2YK4uq3jy0L31pCI+rdV3dBPe+GAxOPn+NTTGdDv29qFJi8ZnFFxSfHYsXFq8s3li8vxovTn032GnsCwItiLQg0YI8g8DFo0D6ggILiqMFQguUFhgt8LQg0IJICxItoJtc6CY3f8UNghsUNxhumKPOKR0MOQ4MATdE3JBwQ8YNc3S6uIOhaN8gDjcIblDcMEenYz5u6TQweNwQcEPEDQk3ZNxQaIM63CC4QXED3mnFO614pxXvtOKdVrzTinfa8E4b3mnDO214pw3vtOGdNrzThnfa8E4b3mmPd9rjnfZ4pz3eaT/eac2HiVlz+XuDFfka63Xw7cEHmB9hfoL5GeYXlh8czBeYr1fzvXVt9NkN+AbzPcwPMD/C/ATzM8wvLD9e319fumm84Id8gfkK8w3me5gfYH6E+QnmX+5vGIbKhFByU0IyJaRTQjYl5KeEwpRQnBI681UsH06fvYULp88W/XHw4CLFuTuMZjQU2nDuPqMZDYIbFDcYbvC4IVxtiLm7Opvc4OLsuXuOZuMnmJ9hfmH5xcF8gfkK86/v8Hc3DUrxMD/A/AjzE8zPML+gfHUO5gvMV5hvMN/D/ADzI8xPMD/DfLi/AvdX4P4K3F+B+ytwfwXur8D9HZ9stcPtX8HLIJJ+Hsk/jpyZZSupm7lvDu0noc/M+JtVSncCqP89UvCZyRM8ox8aerxNtTmsWi8zPtdzISMTMjqekXR8D0I/YxMyfkImXP5/TrfPyL6crNuXc39Lpglb/8x00PeZ/MPMe7PwZ7lbLe/W9dfjdY+vm/uTp+32f5/r3oN3z7vtff3wuqvbR/COT9+1e5GaW2iQZl3a7RZlkdrXH0calbxQtXax3Xc0aDPSN2vQrMU/", + "bytecode": "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", + "debug_symbols": "tZvdbuIwEEbfJddc2GOPx+6rrFYr2tIKCUFF6Uqrqu++Sbf8LCFUODk3Fan8nRMIX0uG5L15XNy/Pf9arp82r83dj/dmtXmY75abdbv1/jFr7rfL1Wr5/Ov0143rfnjnPgOvL/N1t/26m293zZ0PrsyaxfqxexhLi3harhbNnbqPWW+xxfy11pKdLv05a/ke5gvMDzA/wnyF+QnmG8zPo/ntezDuFztJPUOhDd7hBo8bZAKDS0eD7xkCboi4QXFDwg2GGzJuKLRBHG7wuAHvtOCdFrzTgnda8E4L3mmZotNmB0Pu/QeSQhuCww0eNwhumKLTxR0MRXqGiBsUNyTcMEWnUz4e6d5n75BxQ6EN0eEGjxsENwTccLnTkg8nHcHlcQbFDQk3GG7IuKHQBnW4weMGwQ0BN+CdVrzTinda8U4r3mnFO53GdzoU/7U2Su/TUvIwX2B+gPkR5ivMTzDfYH6G+YXlG9xfg/trcH8N7q/B/TW4vwb31+D+Gtxfg/ub4f5muL8Z7m+G+5vH9zeG/dl6zK7HV5ifYL7B/AzzC8svDuZ7mD++v7Hsx9Ya+/wA8yPMV5ifYL7B/AzzC8oX931/tR/yNSGpCYWaUKwJaU0o1YSsJpRrQgNfc+TDeD0Gvf7mab9QisfF51/KydAlRhMaPG4Q3BBwQ8QNihsSbrDRhpT3VyOY8z1+hvmF5YuD+R7mC8wPMD/C/IEOH0sT8qhxugxdUjShwXBDxg2FNgxdUjShweMGwQ0BN0TcgHc64J0OeKcD3umAdzrinY7jO31t2ChRYH6A+RHmK8xPMN9gfob5heWrg/lwfxXur8L9Vbi/CvdX4f5eHsaGw+XAGnunFJfnq9cj+fbI5WIW2z+Zdg57EuoyYWCyeT3jKzJSkQkVmViR0YpMuj3jK163gZFVKfsTWPnvdsB/mZp9u/gOleNtJe04O5xnckWm3J65PHBpF9rxNdDzjK/ISEUmfP98To9P/2+NWdjPIvL5kZSKoz8wvrieSTdmPtqN3/Ptcn6/WnzdJv/0tn44uWt+9+dlcXYD/ct287B4fNsuulvpj3fRd0dXzM2k+G5f2q3kZ9Y9/pybi+aZpNBtdsdUirQrY7sH7V78BQ==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 181801b8374..47ba6546839 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -88,8 +88,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zZ3dbiI5EIXfhWsuXD922XmV1WhEEjJCQiQiyUqrKO++9Ez4GRiMxvQxdROlg6vOF6hTpt2G/pg8zu/ff3xfrJ6eXyd3/3xMls8Ps7fF82pz9PE5ndyvF8vl4sf3wz9PwvDD9Of415fZajh8fZut3yZ3JKFMJ/PV4/Crlk2Gp8VyPrmL4XN6Mtg0f421ZIdDv00nFrHpEza9YdNnbPoCTZ8DNj1h0/PV6SmwbgcHTscCghZQtEBECyS0gKEF8ggCIe0F6FiggAVKQAsQWoDRAoIWULRARAsktIChBdBOLmgnbx6FKxBcgeEKAlcYw85mO4WcThQiXCHBFQyukOEKY3i6hJ1C4WMFCnAFgiswXGEMT6e8f6XtREHhChGukOAKBlfIcIWCVuAAVyC4AsMV4J5muKcZ7mmGe5rhnma4pxnuaYF7WuCeFrinBe5pgXta4J4WuKcF7mmBe1rgnla4pxXuaYV7WuGe1j97mvNuYVZCritIoa+xynxp6PZMI+rJqb1GPyjJDUqknihUbDuWSj6A+cWifVnKdiWIf7s68Ivl+mpR2dpIc7jmJUp+UMwNSgo9UeqFm6QvS61w0/Um0mK75/2qlyj6QUl+UEpPlHrhGvdlqRWuXTZRDMdPpmlLUGwJSi1B1hKUW4JKQ1AOLUHUEnTmvWzevdNUiReqR5LuB5+s55/bszGigsIVIlwhwRUMrpDhCgWtcG7rxl8opLxtphZOJplzOzdGy8/g/ALOr+D8EZw/gfMbOP/1Hq7tEKRSoPk5BHB+AudncH4B51dw/gjOn8D5DZw/g/OD/Utg/xLYvwT2L4H9S2D/Eti/BPYvgf1LYP8S2L8M9i+D/XtuD8b+pEFynysAfG6zxi1Q1A+K9USprtLxuQ0KKJbKKh2f28rwFywjXQFgYT8o4gcl9US5ULilL0utcPV6E410BYCV/KCwH5TYE6VeuJr7slQL96KJTtcXOYaWIGoJ4pYgaQnSlqDYEpRagqwlqPgp+tS1Q/L+gzib1S45ZiFHLOyIRfqykO0bUzxmUUcs0RFLul29HE4efzglNdmekubjaSaZnykvOZp+U/HDYl3PeOqzhXU95al3RVNHLNERS+rLUuuKZo5YsiOWcrt6aZ8tcujbiWpdMZMjFnbEcn0nGm0JM6eeLPWumM0RS3bEUvqy1LpiCY5YyBEL365e2meLIn07Ua0rFnXEEh2xXN513GtbOpeuW+SrXVFCcMRCjli4L0ulK0oQRyzqiCXerl6aZwsJqW8nqnRFCeaIJfthoRE60UgrUULck6XeFUkcsagjltiXpdYVKTliMUcs+Xb10j5bUOnbiWpdkYMjFnLEcn0nGmslSrjr10DUuyInRyzmiCX3Zal1RS5+WCQ4YqHb1Uv7bCHctxPVuqKIIxZ1wvK5Ofh3tl7M7pfzrxtgPL2vHg7uh/H238v86NYYL+vnh/nj+3o+3CRjf3+MwS2iZSoWhv9xc5RoavRt+PbX4SGxqSgPh0Mty2bWEJMNwYbifw==", + "bytecode": "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", + "debug_symbols": "zZ3dTiM7EITfJde5cHf7r3mV1Qrxk0WRogQFONIR4t1PsksIh9k40mTK1A1iiLvqk+JqZwbLeZ3dL25fHq6X61+bp9nVj9fZanN387zcrHdXr2/z2e12uVotH64//3kW9j+8/h7/9Hiz3l8+Pd9sn2dXYsHns8X6fv9r9J3Cr+VqMbtK4W0+GFxifR9bcvk89Od85g6VlxDA+gLWV7C+gfUjWD+B9fPF+rv3MB4GB80DhwJ3qHAHRztIgDsI3EEncAj56CADB4M7RLhDgjtkuEOBO1S4g6MdNMAdBO4Az7TCM63wTCs80wrPtMIzrVNkupQPhzpYgdTRDhbgDgJ3ULjDFJn28OHgOnCIcIcEd8hwhykynevxnR7cP1iFOzjaIQa4g8AdFO5gcIe/Z1rrx02HhXqZQ4I7ZLhDgTtUuIOjHVKAOwjcQeEOBneAZzrBM53gmU7wTCd4phM80/nyTJvL+9ioem7o4ZNVioNbmSw8KMqDYj1RxMthrHj9BPOHJRKxJCKWTMRSiFgqEYvzsJRAxEKUo9J5vvjhyZr+7z8vf1iA82WvXwNYX8D6CtY3sH4E6yewfgbrF7B+BeuD8+vg/Do4vw7Or4Pz6+D8+uX5jXZ4jBdruOAWwDMPSuFBqT1R2h9c3GlYNAQiFiFiUSIWI2KJRCyJiIWnv6h0zlHjxkhlghx5+ejrFywBKsaDEnlQUk+UMxM3E7EUIpZKxOI8LBqIWISIRYlYiPqLds5Ra2HU8zlK4WuztjCmSMYU6ZgiG1MUxxSlMUV5TFEZU3RiT1b92KkTLZ2ZPZbjcXAeODja4dSerAkdBO6gcAeDO0S4Q4I75Isdcj000xIGH2JP7MiaTr+C9R2rnwJYX8D6CtY3sP6JDB9DY/WinTl6Yg/WlA4Z7lDgDhXu4GiHE3uwpnQQuIPCHQzuAM90hmc6wzOd4ZnO8ExneKbL5ZmeaAehFuFBUR4U64nSfopRIhFLImLJRCyFiKUSsTgPSw1ELET9pXbOUespaQXm6Ld+Bes7Vt8DWF/A+grWN7B+BOsnsH4G64Pz6+D8Oja/FgJYX8D6Cta/PL8T7SC0EHlQEg9K7onS/OBioRCxVCIW52GRQMQiRCxKxGJELET9RTrnqHFjZDpBjqbZQWgqPCjKg2I9UdoTVyMRSyJiyUQshYilErE4D4sFIhai/mKdc9RaGO1sjob7k8zqmCIfURTDmCIZU6RjimxMURxTlMYUETXJ2LVJ6vFgTw1iX1mchyUFIhbpyyLl2JjSVxYlYjEilvh98+Xz4jEcW4q9Dy316zKTEs+Sl4iW31R4WDLRs6bc9VlTuytmJWIxIpbYl6XVFXMiYslELOX75sv41SJ3/m9AsysSPcUsgYiFZwuO9d3i1+6Kfbf4nWHJRCylL0urK/bd4neGxXlY+m7xm2q1qNK3E7W6YlUiFiNi4TmqwmrXoyraXbFWIhbnYfHQl6XVFV2IWJSIxb5vvoxfLSY42nCyJy6eiFgyEQvPiX+x74l/za4Y+574d4ZFiVisL0ujK8YQiVgSEUv+vvkyerWIofTtRI2uGHufmdhkcR4W6fp9Iu3VQrp+oUi7K05wauJ0LImIJfdlaXVFKUQslYjFv2++jF8ttPNXj7S6ogoRi5KwvO0u/rnZLm9uV4unXcn+tZf13fNys36/fP738fDK7Xa5Wi0frh+3m7vF/ct2cb3a3O1fm4X3Hz+ilXlMdX/PsrvKMi/yc//t+/uXNM2jhf3l/p2Iyecxy45gR/Ef", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 5b4429778d5..8ab40580cf9 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -88,8 +88,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndrdTqNQFAXgd+Gai/O/9/ZVJsZUraZJ05paJ5kY331gtLTTc6BZ68aI6SfIWiBs+Oye148frw+b3cv+vbv79dlt90+r42a/G5Y+v/ru8bDZbjevD5c/7tz4RfTf59/fVrtx8f24Ohy7Ox+d9d169zx+m2z4DS+b7bq7y+7rvu/EcKOOMJ4wgTCRMIkwmTCFMEKYdg+Cpsk4vTaGG3OE8YQJhImESYTJhCmEEcIQPTCiB97dLsLwyWvkGRQYNHNO0OkYSjFXKDEoM6gwSBikDDICeccgz6DAoJlGlHONtGq5TwzKDCoMEgYpg4xAwTHIMygwiGlEYBoRbjYixVKhwiAhUGyuSZL+GClSEcGJ4sRgkhxOPE4CTiJO2l1zYQrThSrMlBlUGCQMap99nCtn5CtkBMqOQZ5BgUGRQYlBmUGFQcIgphGZaURhGlGYRhSmEWWmESIT0up4KolBmUGFQTONMDchCxVSBhmBxDFophFFzzuiOpdLYFBkUGJQZlBhkDBIGWQEmhl03UBMI5RphDKNUKYRyjRCmUYo0whlGqFMI4xphDGNMKYRxjTCmEYY0whjGmFMI4xphBGNCM4xyDOoucuj+R+TQqhIwYngRHFiMGmPlJaJx0nASfOgS/E0gErqKpJwknFScCI4UZwYTNrjo2Uyk76biK9IM/1kp6vanOq1RJwknGScFJwIThQnBpPolqPMqYoy3pzN1cOvEDODCoOEQcogI1ByDPIMak/P3MmIq0nEScJJxkmzCUXLRKqatudmy0RxYjBpT8yWicdJwEnEScJJxgmefsbTz3j6GU+/4Om3Z2OSZZppV8dLezK2TCJOEk7ax76c/t+IVFeB7YnYMhGcKE7g5yZBHE48TgJOIk4STjJOCk4EJ4oTPH3F01c8fcXTVzx9xdNXPH3F01c8fcXTVzx9w9M3PH3D0zc8fcPTNzx9w9M3PH3D0zc4/di+a1q60Yox46TAZObewuQ0mBlGfhfo27RvAc1OVzHhv2fS36YQ62mmGc4P+IZ5X7w2ShjDTfsyfvignPdBvjaeMIEw8fbfc5lP37jwiacu63WSmUh/5un4simg+RoWfq8Om9Xjdv3zTvfLx+7p4hXv45+39dXb3m+H/dP6+eOwHt/7Pr/yPaYbnfYx2Lgtw1Lxvfj78b29YcEH631M4+KYaYyujzEMWzBsxV8=", + "bytecode": "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", + "debug_symbols": "ndrRbuIwEAXQf+GZB3tm7LH7K6vVira0QkK0onSlVdV/36RbAosd0L0vFak4EHxvArHzsXhc378//9rsnl7eFnc/Phbbl4fVYfOyG7Y+PpeL+/1mu908/zr/9yKMf2IMX+DtdbUbt98Oq/1hcRc11OVivXscH1odXuJps10v7lL4/LkcUGSQMEgZZAxKDMoMcgYVBlUCSb8RUmxCoTQoMkgYpAwyBiUGZQY5gwqDKoGUaYQyjdDbjRieeYmUQcagmXNEmY4n09SgzCBnUGFQJZAFBkUGCYOUQcagmUbkU41K03LLDHIGFQZVAqXAoMggYZAyyBjENCIxjUg3G2GaG1QYVAnk3XDdyrfx7A0RnChODCcJJxknjpOCk36YQaYwgzRhlsCgyCBhUP/wDiGfUGyQMSgxKDPIGVQYVAlUA4Mig4RBTCMq04jKNKIyjahMI+pMI9wnVJrjqVYcSQgMigyaaUQNE6rSIGWQMSgxaKYRuZwGwhvkDCoMqgSamVy6gSKDhEHMkEdmyCMz5JEZcmGGXJghF2bIZ2ZvbiBjUGIQ0whhGiFMI4RphDKNUKYR/dkbrfHbmDRnvf7czXViOEk4yThxnBScVJj0Z2uuk4gTPH3D0zc8fcPTNzx9w9M3PH3D0094+glPP+HpJzz9hKef8PT7szGmx4lAK6EhjpOCkwqTHHAScSI4UZzMpB8mEhvSTd/q8eoiWfsuGSeOk4KTChMPOIk4EZzo9SiTNVE6Md0pXhhETHdKCQyKDBIGKYOMQf250nA0HlqSceI4KTjpNiGXPJGmpv15sesk4kRwojgxnCScZJw4TgpO4PQ1BJxEnAhOFCfd9D35tLaQG5JwknHiOOkf+378vnGXhlSY9Oe7rpOIE3iVTKPixHCScJJx4jiBV8l07qpp/geKzl01XSOCk/4XefXjBc0w43+G/hkjTCJMJowTphCm4qZ/8XTDEOOWZz5PPZ6d5b81zy/jxL71f9vLaQFpWI7RSyOEUcJY30Q/jUG6NIkwmTB++/Oc57PsnND1eK4pTZJM+hU3M1co8+Zz2Pi92m9W99v1953ET++7h7Mbiw9/XtcX9xi/7l8e1o/v+/V4t/HpRuPxvXVYw1dL474MWzkuPQ6Pv74047AVcx43x46q5eGZZdiDYS/+Ag==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_0.snap index bda74fad7fc..ee14f54dcbd 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_0.snap @@ -88,8 +88,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1bMW8jRRSetXccr+1czF0o+Be7ZzsOBVIkgkBHR0W78SUdBX8AbUXJH0FCoqKkpKREogEJiQLR0CHdSXd+9rz489u3G1ueyWWkjBTN7ry3733vmzezszNOYtbldPmXuOvU1dbVCVwbaKNy4er8sFJ4tJWHwphEgLETAcZuBBjTABhD4LQecd7HOO9F0PdHEWDsR4AxiwDjwMQ1foYRcDqKAONxBBifRIDxxMQ1fsYRcPpeBBifRoDxWQQYTwNgXJX34ZpA04cBLbxpYUuDjBZitNChhQS9qOlFSC8XmrxpcqTJhwY3DRhKSOpwIvTUNBcm5wN3kbn7Dsg9Lv6LTPj1af88n5WZEp9H/JPM2ewFsV/M2P5RGPw52/2k2tjHWFjedfWLasPlC3iGcpKxhunLaWguZscifgOxsO9+GN9nifCHnKOM/Q9MyLxbb5SgP8Yj+eF54Zh1qg2eRMjSqh4HyyzIuH9J5yPQk7nVEzLGQoVzMwNujPGek1ePORlXTnaFLK3qceybk8gJ4+C+SQNwsXyv5Y95F1fepUKWVvU49s07zC2ZdzYAF8u8e3wHm7jyzgpZWtXj2DfvMLd6oPcZXH/ursOuCdfre3z3e+6D/JmCH31ROarMbeF86UIb88o891FfyDKQpdW2n4G7T8EP2mIcVuh/6u5PXN2DZ/j5seK/J/xv4VbaJC+Zop8p+nigQN+v/M32cbVtj3Xyw8rtN+cl2Pc5h1EMNAZ+d/ZOTH2ekHNaqO87OYdw7kifPegTOcfi/GNF2xeupvs/RXw4R7XNW2PTvLaXz2ljXcZoG/xdVnoMX0IMf7lr+a6hcuHq/KBSXLV9K3FuptV2jH5852cUz9/OFs/nuEdiBaYByLqKPvYF/Q0V/QHocH+MhT5yrY2XDPiRNkOMF8aV3hFHR4kDObCi7cbVPsZLpuDR9qM8HoQXWj+npj4u5Vw3cve9Bv2h4Iv1vwK+XgtutOflnNADu/I5KpfVtl/W/xr88pygjVvMSypptY3jwrXnhxV13GJuyHGrjUMtl2T/oD5yKnNvBDI5bqVt5ke+V+5r3PaVOPYdt9+4Whu3HYU7bGt7z3VauJNz3jAwdyOFOy0HOqaeAyOFO2771vjjLjO7cSfnw1Fg7m6/ryCOkWnm7hhkfI3ccdt3xh932hoqU/B45Oea56onpl5YdiJ8o2wsYjZQGxE/FoyJuHsDdqWexIN5xNgeGk+pkCFP8kwNi0+ecG/kofJkhQx5wvEgi0+ecJ+OsfE451z73tUh9++oPBU40Zc12/36g8AUao9Fw9QRmJjDHx8Apl3WOSHOm6gkgg9833QVrB1Tz0G+1vj9ydXvcp0T4swEubMKd6lp5q7pR/RWtP1s/HG36zpH5l2oeaNtnWNNM3e7rnN+Mf64a8s7lMm8CzWXtHGn9eW+3P1qmrlLTJ07bGvLu6SFO7m+zt4Bd5kH7n4z/rjT9ndxPzut/HM0P19ztMJYbWKU6xf0b4X+H+4e97e4PmTv6GZeFjeT8qaclS9fThelfKcih8MA/sv55HzxfLqYX80m5eTs3v0vZmdXi+mszK8Lun1+l3/tfAb3mqjwGQ+eAaE+rptQ/x/WXf79667luR/6I71XLXpJQ72yobSl1XabdjaEZ2asz74HVR0jy4Ygs8LPyN0jX2iLcVih/7+75z7Bcy5+fqz47wv/W7iVNnlmNlT0h4o+9c9/bM/VGLvvc+iVT2Ef2yQ2zp0Q42o5pOaLcl4UH06L62kxu2tc4Vmc/CaTuKSdbovtsWKLzyxDr8fC/u50/c8ViYifY1n97jjZtKMM99nxHXRZbeSoP0o2NgfuWltvMMdDkFtFzs9pv5nQ+pDbM0Vf7lUjNjw7zXaw1Wnx3XbGpvlGXPgsPmcVnH3h90jBYxVbMs+lXXwOY9B+F7drXr0F29eEVNU8AAA=", - "debug_symbols": "tZvdTqNQFEbfhetenL33+fVVJhNTFU2TpjW1TjIxvvuAStsBaiNl3Zii51sLC1+hB3irHuq716fb1eZx+1Ld/Hqr1tv75X613TRLb++L6m63Wq9XT7env65c+yPFj/Evz8tNu/iyX+721Y2YK4uq3jy0L31pCI+rdV3dBPe+GAxOPn+NTTGdDv29qFJi8ZnFFxSfHYsXFq8s3li8vxovTn032GnsCwItiLQg0YI8g8DFo0D6ggILiqMFQguUFhgt8LQg0IJICxItoJtc6CY3f8UNghsUNxhumKPOKR0MOQ4MATdE3JBwQ8YNc3S6uIOhaN8gDjcIblDcMEenYz5u6TQweNwQcEPEDQk3ZNxQaIM63CC4QXED3mnFO614pxXvtOKdVrzTinfa8E4b3mnDO214pw3vtOGdNrzThnfa8E4b3mmPd9rjnfZ4pz3eaT/eac2HiVlz+XuDFfka63Xw7cEHmB9hfoL5GeYXlh8czBeYr1fzvXVt9NkN+AbzPcwPMD/C/ATzM8wvLD9e319fumm84Id8gfkK8w3me5gfYH6E+QnmX+5vGIbKhFByU0IyJaRTQjYl5KeEwpRQnBI681UsH06fvYULp88W/XHw4CLFuTuMZjQU2nDuPqMZDYIbFDcYbvC4IVxtiLm7Opvc4OLsuXuOZuMnmJ9hfmH5xcF8gfkK86/v8Hc3DUrxMD/A/AjzE8zPML+gfHUO5gvMV5hvMN/D/ADzI8xPMD/DfLi/AvdX4P4K3F+B+ytwfwXur8D9HZ9stcPtX8HLIJJ+Hsk/jpyZZSupm7lvDu0noc/M+JtVSncCqP89UvCZyRM8ox8aerxNtTmsWi8zPtdzISMTMjqekXR8D0I/YxMyfkImXP5/TrfPyL6crNuXc39Lpglb/8x00PeZ/MPMe7PwZ7lbLe/W9dfjdY+vm/uTp+32f5/r3oN3z7vtff3wuqvbR/COT9+1e5GaW2iQZl3a7RZlkdrXH0calbxQtXax3Xc0aDPSN2vQrMU/", + "bytecode": "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", + "debug_symbols": "tZvdbuIwEEbfJddc2GOPx+6rrFYr2tIKCUFF6Uqrqu++Sbf8LCFUODk3Fan8nRMIX0uG5L15XNy/Pf9arp82r83dj/dmtXmY75abdbv1/jFr7rfL1Wr5/Ov0143rfnjnPgOvL/N1t/26m293zZ0PrsyaxfqxexhLi3harhbNnbqPWW+xxfy11pKdLv05a/ke5gvMDzA/wnyF+QnmG8zPo/ntezDuFztJPUOhDd7hBo8bZAKDS0eD7xkCboi4QXFDwg2GGzJuKLRBHG7wuAHvtOCdFrzTgnda8E4L3mmZotNmB0Pu/QeSQhuCww0eNwhumKLTxR0MRXqGiBsUNyTcMEWnUz4e6d5n75BxQ6EN0eEGjxsENwTccLnTkg8nHcHlcQbFDQk3GG7IuKHQBnW4weMGwQ0BN+CdVrzTinda8U4r3mnFO53GdzoU/7U2Su/TUvIwX2B+gPkR5ivMTzDfYH6G+YXlG9xfg/trcH8N7q/B/TW4vwb31+D+Gtxfg/ub4f5muL8Z7m+G+5vH9zeG/dl6zK7HV5ifYL7B/AzzC8svDuZ7mD++v7Hsx9Ya+/wA8yPMV5ifYL7B/AzzC8oX931/tR/yNSGpCYWaUKwJaU0o1YSsJpRrQgNfc+TDeD0Gvf7mab9QisfF51/KydAlRhMaPG4Q3BBwQ8QNihsSbrDRhpT3VyOY8z1+hvmF5YuD+R7mC8wPMD/C/IEOH0sT8qhxugxdUjShwXBDxg2FNgxdUjShweMGwQ0BN0TcgHc64J0OeKcD3umAdzrinY7jO31t2ChRYH6A+RHmK8xPMN9gfob5heWrg/lwfxXur8L9Vbi/CvdX4f5eHsaGw+XAGnunFJfnq9cj+fbI5WIW2z+Zdg57EuoyYWCyeT3jKzJSkQkVmViR0YpMuj3jK163gZFVKfsTWPnvdsB/mZp9u/gOleNtJe04O5xnckWm3J65PHBpF9rxNdDzjK/ISEUmfP98To9P/2+NWdjPIvL5kZSKoz8wvrieSTdmPtqN3/Ptcn6/WnzdJv/0tn44uWt+9+dlcXYD/ct287B4fNsuulvpj3fRd0dXzM2k+G5f2q3kZ9Y9/pybi+aZpNBtdsdUirQrY7sH7V78BQ==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 181801b8374..47ba6546839 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -88,8 +88,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zZ3dbiI5EIXfhWsuXD922XmV1WhEEjJCQiQiyUqrKO++9Ez4GRiMxvQxdROlg6vOF6hTpt2G/pg8zu/ff3xfrJ6eXyd3/3xMls8Ps7fF82pz9PE5ndyvF8vl4sf3wz9PwvDD9Of415fZajh8fZut3yZ3JKFMJ/PV4/Crlk2Gp8VyPrmL4XN6Mtg0f421ZIdDv00nFrHpEza9YdNnbPoCTZ8DNj1h0/PV6SmwbgcHTscCghZQtEBECyS0gKEF8ggCIe0F6FiggAVKQAsQWoDRAoIWULRARAsktIChBdBOLmgnbx6FKxBcgeEKAlcYw85mO4WcThQiXCHBFQyukOEKY3i6hJ1C4WMFCnAFgiswXGEMT6e8f6XtREHhChGukOAKBlfIcIWCVuAAVyC4AsMV4J5muKcZ7mmGe5rhnma4pxnuaYF7WuCeFrinBe5pgXta4J4WuKcF7mmBe1rgnla4pxXuaYV7WuGe1j97mvNuYVZCritIoa+xynxp6PZMI+rJqb1GPyjJDUqknihUbDuWSj6A+cWifVnKdiWIf7s68Ivl+mpR2dpIc7jmJUp+UMwNSgo9UeqFm6QvS61w0/Um0mK75/2qlyj6QUl+UEpPlHrhGvdlqRWuXTZRDMdPpmlLUGwJSi1B1hKUW4JKQ1AOLUHUEnTmvWzevdNUiReqR5LuB5+s55/bszGigsIVIlwhwRUMrpDhCgWtcG7rxl8opLxtphZOJplzOzdGy8/g/ALOr+D8EZw/gfMbOP/1Hq7tEKRSoPk5BHB+AudncH4B51dw/gjOn8D5DZw/g/OD/Utg/xLYvwT2L4H9S2D/Eti/BPYvgf1LYP8S2L8M9i+D/XtuD8b+pEFynysAfG6zxi1Q1A+K9USprtLxuQ0KKJbKKh2f28rwFywjXQFgYT8o4gcl9US5ULilL0utcPV6E410BYCV/KCwH5TYE6VeuJr7slQL96KJTtcXOYaWIGoJ4pYgaQnSlqDYEpRagqwlqPgp+tS1Q/L+gzib1S45ZiFHLOyIRfqykO0bUzxmUUcs0RFLul29HE4efzglNdmekubjaSaZnykvOZp+U/HDYl3PeOqzhXU95al3RVNHLNERS+rLUuuKZo5YsiOWcrt6aZ8tcujbiWpdMZMjFnbEcn0nGm0JM6eeLPWumM0RS3bEUvqy1LpiCY5YyBEL365e2meLIn07Ua0rFnXEEh2xXN513GtbOpeuW+SrXVFCcMRCjli4L0ulK0oQRyzqiCXerl6aZwsJqW8nqnRFCeaIJfthoRE60UgrUULck6XeFUkcsagjltiXpdYVKTliMUcs+Xb10j5bUOnbiWpdkYMjFnLEcn0nGmslSrjr10DUuyInRyzmiCX3Zal1RS5+WCQ4YqHb1Uv7bCHctxPVuqKIIxZ1wvK5Ofh3tl7M7pfzrxtgPL2vHg7uh/H238v86NYYL+vnh/nj+3o+3CRjf3+MwS2iZSoWhv9xc5RoavRt+PbX4SGxqSgPh0Mty2bWEJMNwYbifw==", + "bytecode": "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", + "debug_symbols": "zZ3dTiM7EITfJde5cHf7r3mV1Qrxk0WRogQFONIR4t1PsksIh9k40mTK1A1iiLvqk+JqZwbLeZ3dL25fHq6X61+bp9nVj9fZanN387zcrHdXr2/z2e12uVotH64//3kW9j+8/h7/9Hiz3l8+Pd9sn2dXYsHns8X6fv9r9J3Cr+VqMbtK4W0+GFxifR9bcvk89Od85g6VlxDA+gLWV7C+gfUjWD+B9fPF+rv3MB4GB80DhwJ3qHAHRztIgDsI3EEncAj56CADB4M7RLhDgjtkuEOBO1S4g6MdNMAdBO4Az7TCM63wTCs80wrPtMIzrVNkupQPhzpYgdTRDhbgDgJ3ULjDFJn28OHgOnCIcIcEd8hwhykynevxnR7cP1iFOzjaIQa4g8AdFO5gcIe/Z1rrx02HhXqZQ4I7ZLhDgTtUuIOjHVKAOwjcQeEOBneAZzrBM53gmU7wTCd4phM80/nyTJvL+9ioem7o4ZNVioNbmSw8KMqDYj1RxMthrHj9BPOHJRKxJCKWTMRSiFgqEYvzsJRAxEKUo9J5vvjhyZr+7z8vf1iA82WvXwNYX8D6CtY3sH4E6yewfgbrF7B+BeuD8+vg/Do4vw7Or4Pz6+D8+uX5jXZ4jBdruOAWwDMPSuFBqT1R2h9c3GlYNAQiFiFiUSIWI2KJRCyJiIWnv6h0zlHjxkhlghx5+ejrFywBKsaDEnlQUk+UMxM3E7EUIpZKxOI8LBqIWISIRYlYiPqLds5Ra2HU8zlK4WuztjCmSMYU6ZgiG1MUxxSlMUV5TFEZU3RiT1b92KkTLZ2ZPZbjcXAeODja4dSerAkdBO6gcAeDO0S4Q4I75Isdcj000xIGH2JP7MiaTr+C9R2rnwJYX8D6CtY3sP6JDB9DY/WinTl6Yg/WlA4Z7lDgDhXu4GiHE3uwpnQQuIPCHQzuAM90hmc6wzOd4ZnO8ExneKbL5ZmeaAehFuFBUR4U64nSfopRIhFLImLJRCyFiKUSsTgPSw1ELET9pXbOUespaQXm6Ld+Bes7Vt8DWF/A+grWN7B+BOsnsH4G64Pz6+D8Oja/FgJYX8D6Cta/PL8T7SC0EHlQEg9K7onS/OBioRCxVCIW52GRQMQiRCxKxGJELET9RTrnqHFjZDpBjqbZQWgqPCjKg2I9UdoTVyMRSyJiyUQshYilErE4D4sFIhai/mKdc9RaGO1sjob7k8zqmCIfURTDmCIZU6RjimxMURxTlMYUETXJ2LVJ6vFgTw1iX1mchyUFIhbpyyLl2JjSVxYlYjEilvh98+Xz4jEcW4q9Dy316zKTEs+Sl4iW31R4WDLRs6bc9VlTuytmJWIxIpbYl6XVFXMiYslELOX75sv41SJ3/m9AsysSPcUsgYiFZwuO9d3i1+6Kfbf4nWHJRCylL0urK/bd4neGxXlY+m7xm2q1qNK3E7W6YlUiFiNi4TmqwmrXoyraXbFWIhbnYfHQl6XVFV2IWJSIxb5vvoxfLSY42nCyJy6eiFgyEQvPiX+x74l/za4Y+574d4ZFiVisL0ujK8YQiVgSEUv+vvkyerWIofTtRI2uGHufmdhkcR4W6fp9Iu3VQrp+oUi7K05wauJ0LImIJfdlaXVFKUQslYjFv2++jF8ttPNXj7S6ogoRi5KwvO0u/rnZLm9uV4unXcn+tZf13fNys36/fP738fDK7Xa5Wi0frh+3m7vF/ct2cb3a3O1fm4X3Hz+ilXlMdX/PsrvKMi/yc//t+/uXNM2jhf3l/p2Iyecxy45gR/Ef", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index bc8236a6f03..ad7586bd1c0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -157,8 +157,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_0.snap index 60b898fd362..2a6c01c14a6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_0.snap @@ -157,8 +157,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index f0a324fdaf9..9431288c1c2 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -157,8 +157,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index bc8236a6f03..ad7586bd1c0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -157,8 +157,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "1d3drty2rgfwd8l1LiRS/FBfZeOgSNvsIkCQFGl6gIOi73680ow8KakR8see2ZqbIquZX8yRadqmZa0/X/3y9qc/fv3x3Yd/f/z91Q//+vPV+48/v/n87uOH46c//3r96qdP796/f/frj9f/+1V5+U/l9gX8/tubDy8///75zafPr35gEX/96u2HX778sR//xL/fvX/76gcpf/3P6wMJghRBhiBHUAdQKwiqCCIEMYKQjGhIRjQkIxqSEQ3JiIZkhCAZIUhGCJIRgmSEIBkhSEYIkhGCZIQgGSFIRiiSEYpkhCIZoUhGKJIRimSEIhmhSEYokhGKZIQhGWFIRhiSEYZkhCEZYUhGGJIRhmSEIRlhSEY4khGOZIQjGeFIRjiSEY5khCMZ4UhGOJIRjmRERzKiIxnRkYzoSEZ0JCM6khEdyYiOZERHMqLnGdHNLqib/wNRKQiqCMr3U+8X1ErtAaWj1wqXgbQF5Dk6t1QpbqkDqBYEVQQRgtIsb8eNy0AaUT56x9nkgqiGIa/56FHTgcz+iaggqCKIEMQI0hz1gZjD6FE+eo0HavF44nz0hPmCxCWgiiBCECOoISivEVraBSmF0ct7LE25D2QcUD56VuoFGYfw8h7LCjGCGoLyGmFKA/USkCLIEOQI6gDKeyzNaWSEt3C45z2WFSIEMYIaggRBiiBDkCOoA0iRjNBJjThPAE4aECGIEdQQJAhSBBmCJhkhJ4qHu3YAWUFQRRAhiBHUECQIUgQZgpCMMCQj8h5L6z7OuccNTkAVQYSgPCP6eQeQ3KnlPZYVEgQpggxBjqAOoLzHIqVdLkelSLgDyHssK0QIYgS1HI1+hBSLSBCkCLIcUT2/U7jwzXssK9S/H3EpCKoIIgQxghqC8oyoRS7oeLgckCLIEOQI6gDKuzlSxw2KHN3xgCaj18eRS+E+l2s+esd14AUxl4AMQY6gDqC8b7RCeZZz6wNZRPno8TjnSqshyykfvaOLcUFCNSBHUAdQ3jdaoYqgPMuPgR4oDnneN1qhhiBBUJ4ROjpUxx9bQIYgR1AHUN4LW6GKIEIQI6ghSBCEZERDMqIhGdGQjBAkIwTJCEEyQpCMyJtNYjTOGibhcM97LFrK5XJUC4cTdd75UKqXwqLHRU1AaXhHP/oSnrZkS46gDqC887FCFUGEIEZQQ5AgSBGEZIQhGWFIRjiSEY5khCMZkXc+jk/2gYwCaggSBCmCDEGOoA6gvPPxDfJQ9/LOxwoRghhBDUGCIEVQ//7zU8v7EVrr5Qm/1tACank/YoUIQYygfD8VtxNJQIIgRZAtkVpAjqAOoHweywpVBBGCGEF5RhxPVi7oaKAGlGcEsd9CiiBDkAMonzGjVMbxRCWi9v3XsI0M2dLyOx19w4A6gPLOxwpVBE2uWEgGkhoQI6ghSBCkCDIEOZB73AHUCoIqgghBjCDkyG2CIEVQ//7b8DbpR1gf/XKnUFgm/YgFIgTxEoV+RMvn5qyQIEgRZAhyBHUA5XNzpJ+PXXoNuZd3c8R1dHw9zIdteTdH3EfC9vC0oeU9lsWWbP2dKKKKIEIQIyjP8n626rpEJAhSBBmCHEEdQHmPZZF7eY9lhQhBjKCGIEEQcuTmPZYVcgBN5nzcfCLZJnM+FijfT23MkD4eY4YKO5nzsUCCIEXQ5ClrHRNFjqu7gBxB/fuRTOZ8LFBFECFo8jT81oNtyXssKyQIUgQZghxBHUB5j2WFKoLy/XRzdonMZpfcRpPZJeMOQIgsIEOQI6gDaDa7hMeQU7hllbzHskKEIEZQQ5AgaDJb69YkJZnMmFkgR1AH0GTGzAJVBBGCGEENQcCbVpJ3c1Yon3mr5xs8Gp4/yeydrtuoIogQlM/FVhvzy9V7QA1BgiBFkCHIETTJiFsv7IkUBFUEEYIYQQ1BgiBFkAFo8qbVzbdmZfKm1QLl+4nHq+tH9zkcuZM3rVj9FmoIEgQpgvL9xH6+cxwaaDJ502qBOoAmb1otUEUQIYgR1BAkCFIEIRkxedOKm5y5Fw73yZtWt9HkTasFqggiBDGCGoLyjDj66GM/hXUJZPKm1QIZghxBkxUQzpfbjlvhf6J8vtEKVQTlGXFzgQbJu24r1BAkCFIEGYIcQcCaGFoKgvL9dHOVlOPuBUH5fqIylregygEpggxBjqDJyi+jx9IoXIXpZN2cBaoIIgQxghqCJiv03FpsR/Ou2woZghxBHUCTtYAWqCKIEMQIytcLu7nilea9sBWarHg1Xs9qRcORO1l16DaarDq0QBVBkxWv9ByIsBaQTlYdWqCGIEGQIsgQNMmIWwun6aTrdhtNum4LVBFECGIENQQJghRAeRPDabzD76TnDX/1vxEjqCFIEKQIMgQ5gjqA8ibGCqWHhrfL/Umnb57mvg4frU6X5Kku5+Xuy2kjfJjKuC+jouX6w1+CoZ2C4Z2CaTsFIzsFozsFYzsF4zsF0zcKJm/u/beC2akC+04V2HeqwL5TBfadKrDvVIF9pwrsO1Vg36kC950qcH9sBa58ed5ydOtaCIZ2CoZ3CqbtFIzsFIzuFIztFIzvFEzfJxgrZadgNqrAVjaqwFY2qsBWNqrAVjaqwFY2qsBWNqrAVjaqwFZ2qsB1pwpcd6rAdacKXHeqwHWnClx3qsB1pwpcH1uBaczgI650+8N8Psk9Pqshcn/ayPuzRk7laSOvTxs5PW3k/LSRt6eNXJ42cn3ayJ/2HEpPew6lpz2H8tOeQ/lpz6H8tOdQftpzKD/tOZSf9hzKT3sO5ac9h/LTnkPbY+s5jwUyjj9SCOax5YL7ZY49tRJH5rEVoI1/+Ni7NQSjOwVjOwXjOwXTNwpGyk7B1J2CoZ2C4Z2CaTsFs1MFlp0qsOxUgWWnCiw7VWB9bAUWG8FovNLTx1ZgZRrBNAnB0E7B8E7BtJ2CkZ2C0Z2CsZ2C8Z2C6RsFY2WnYHaqwLZTBbadKrDtVIFtpwpsO1Vg26kC204V2HaqwL5TBfadKrDvVIF9pwrsO1XgB7+9qDaa0kYcgtGdgrGdgvGdgukbBfPgtxcXwdSdgqGdguGdgmk7BfNfrMChjdZ1p2AeW2duPr31B7+jx9ZGMB6DqTsFQzsF89g6w6JnMByCaTsFIzsFozsFYzsF4zsF0zcK5sHv6C2CeXAFbuNEyRKDoZ2C4Z2CaTsFIzsFozsFYzsF4zsF0zcK5sEvxy2C2akC004VmHaqwLRTBaadKjDtVIFppwpMO1XgB7+H1cpYHq1d/VLtr8E8+NWqRTB1p2Bop2B4p2DaTsHITsHoTsHYTsH4TsHsVIHbThX40e833XqlyBvtFAzvFEzbKRjZKRjdKRjbKRjfKZi+UTAPfvNrEcxOFVh2qsCyUwWWnSqw7FSBZacKLDtVYNmpAstOFVh3qsC6UwXWnSqw7lSBdacKnM9Gq8eD1LGFb8P5ghqCZI0sIJ2gOlD4haKer/W+Qp4jOcPT+J3696Oez5/6FllAdYLO72QtIELQLCPOnDMJqCFIEKQImmREH0N+7JWAHEF9jcLOrZOM6GM/9fCbVXutCKLV6PUaRq8yghqCBEF5RnQ+h7yF/ZQ/Z18hX6O4c/sEnftJwn7Kny+vUF2OnoTRI0IQI6ghKM+IbueQe9hPpAiyNQo7lyYZYed+6nE/dQBxWY5eD6PHFUGEIEZQmhFUxiUBlXAd0fPnJiukaxR2bv4c4kBjdnThuJ8cQX0xegcKo9cKgiqCCEGcD4ScQx6vjVpDkKxR2LltkhFy7ifjgAxBvhy9eBXWOoCkIKgiiPKB6CfqHhAjqK1QLSH3ZHUdcSANSBFkCHIEpRlB9XypscYrlrw/sUIVQbRG4SDM78sPNI6nGi9z8vtnqnZuKZ7d8xVOVkgRZGsUB8In6ByIeEmgs4w40yiec60gqCKIEJRnBJ0n6uPPATUECYJ0jUIJy1cwONDYuRRPn+ar0SMONcI6gLwgqCIozwiS0aG6/l3wF8QIagiSNeoBTTLivPggiwNhy9GzUCPcEdQB1AuC8oygfr6kVsK1UScEMYLaEtVQy/skI86WKtc4ELoaPa6hRnRDkCOofz+qJW9aEp+/cIhbi6pCiiDFSyU1qjZRZ1pIMhqyHEPpUSmkDFIOqTw32K5eAJOgaoFUhRQtVaeoJrlhZ270uJdrW45hj2NYBVIKKYNUnhutjtFoFI+vvI+5Unkj8xvF8aik5dVF47iXiSDFkGqQynOjiQ2lGpVCyiDlSxU6HIea5Mb54mgLN0q18CQ3ul+UhGclh6qQIkjxUtWY85O2ZutjDIVizvMsN+RUMaNYIWWQckjluSE8pvNKi7U3b24uVYUULZXEM9Gkvyl85obG0Zg0OK/HUOPx1QRSCimDVJ4b4qMeisczUeuIkgKpulQ91sNJo1Ns5IaWOBqTTufVGGqJdUMapARSCqk8N5TOBak51vm83blUHVGThuc3Ktb5ScdTxzwb0uSOY9LyvB7DFuuGMqQapARSeW6onsvnWTx/TfqeK+WQ6msV6/yk9al65kZyxzHpfV6Poce6YQQphlSDVJ4bVs6FqGo8f00aoCtlkPK1inV+0gO1MnLDKO7lSRP0agyvl+UaqkKKIMWQynPD2jkaSVdk0gldKYWUrVU8ln15LWpJf8M7onqBVIVUnhvmox9lPV5vTDqiK9UgJSvlJZ6XJ01Rcz5VPC9PuqJOYwzjTM5DOaQ6oOqkL3qtWo2qTtQ5hvE+pZZZbtCpelQMqQYpgVSeG66jexCndB7KIOWQ6kvl4fxVJ31R1zM34n1KnfRFr8ewl6gIUgypBqk8N3oZXZFeNSqFlEHKl4o4qj5RIzd6vE+pk77o1Rj22BetVCFFkGJI5bnR2+iKdLGoBFIKKVsqjXV+0hft7cwNS0ajL8fQYt3gAqkKKYJUnhvH0+ah4vOUOumLrpRASheKS4l1ftIXPR69D1WT0fDFGB4q1g3uiGoFUhVSaW4cz9bLUBzPX3lfdKkapGSpWqzzeV+Uj6cYQ0ncy5O+6PUYSjKGDqmOKCmQqvlo6DkasZdShSDFSxU7MFXa8nvF/kYVgZRCyiDlkOqI0gKpCimCFEMKyg2FckOh3FAoNxTKDYVyw6DcyHuVTHS5o2dKrg/zXuVSCaQUUgYph1RHVN6rXKoKqbzOH4/Nhkque50h1ZYqziKoPsmNMWOBqcfreZ/kxnhGz3E64KEMUr5W8drG++p7ZSrvVTK3cUXEyTVA3qtcKlqq+AS85r1K5vG0ndlitcl7lcdHT9WTbQmkdKVaidmb9yqvv1eqHFIdUFQKpCqkCFIMqQYpgZRCKt1f2svlyaP2q3nEL9Nvw4eP3vClOezXc9ePD3/ZRN5s/M9uot5/E3T/TfD9N9Huvwm5/yb0/puw79zE38oh1RFFBVIVUgQphlSDlN89Jej+pZLvXyr5/qWS718q+f6lku9fKvn+pZIVOZoYqn4MVT+Gql+Dql+Dql+Dql+Dql/ey2Uda3Cx+nnPmK6r5WM+kV//vj77ugG/9wb6nTeQN5P/kxuo994A3XsDfO8NtHtvIL8HMh09Ib+6m/l7ybhD5fdAdnYmUpUfc9b6TeWQ6ojKe+RLla9h6qO7c/zRQwXKe8lLZZBySOXrbHa6zGvwfv1LtL+qvJe8VBVSBCmGVIOUQGoy8laGsngNkndq+7nwUC8WtzX5FeyrbU2+l4+M6lczB4fSSYRtRHi1ctNQBimHVEdU3nNdqgopghRPFJ2qRtUgJZDSpeLke01yY7zz3UuLedh9eaRcve0x1CQ3xryh4/gKEXKZ5MaYN5QdlVwqcCxzIUgxpPJ7l3GbpNe/Psq+GgdMft/i4/LePZhJK3S86GUlbmfS27xtZvNWr+Z3hkznapBySHVEUYFUhRRBiiHVICWQgnKDoNwgKDcIyg2GcoOh3GAoNxjKDYZyg6Hc4O/Ojb+On/73zad3b356//b3w7z85R8ffv787uOHrz9+/r/fLn/z06d379+/+/XH3z59/PntL398evvj+48/v/zdq/L1P//y4/LOe32J5vipcqPXlbUcP78MXj3uGWull799+bAe9z8q7eXHvz99POs6SD2iOiL7fw==", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_0.snap index 60b898fd362..2a6c01c14a6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_0.snap @@ -157,8 +157,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index f0a324fdaf9..9431288c1c2 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_cow_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -157,8 +157,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_nested_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_nested_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 359aae4ed04..b604ef8849c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_nested_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_nested_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -24,10 +24,6 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -38,8 +34,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+VazW7TQBAee+00dqgagXiPOL89ViLl98QDcHBTeuUCNw458xCceCUkngAeAYkTWrrTjL+MHRvvKqiMVDn2rL/52ZnZ9WwjuqXI/VlK3DWmfeIxF+466UeFR6xJSD2jQHpWnBxRPTHvl7tm8L7lG48GZyDXJ/75ZL7JFPs86j/LBGYA/CnjJ2HwJycO5+W2ik8g95SqySvfYZ6MsVeON3R8/v3Y/c4AL8S8S518++2Ron8sbLP0ZLvzhye5d/my9o89ZexL/9gzxn7qH3vO2M/8Yy8Y+7l/7CVjv/CPXY7oNt/eOTzOUbMTdRe7gWvMPAJ5RNUaQyA/p6A1tYhAHuuD/onBd6mi6xh4ljjvI4VnlGdxA9baIxbn9Snt24+xIG31uV62jQWWn1PQ2Cya/JoofmXfDRRdx8CzhLEwUOQMFDka1npb1UHqjPMn9TvG/LH8nILGU9HkVy0v2Hcniq5j4Fni9SpSeEZ5Fjdg8fqEMcT4ljJFP4/+WrWdP5afU9B4Kpr8quUF+26o6DoGniWueZHCM8qzuAYLa1BfLOMJyxLvTXzolXrSS9oYeH+xwpyWpMXLAHgZ2Cx5ueDJbwkkA/fSXiv7g8DFcairjI1hDWYKYy3xPjKFsa/dNfDaPnkocAlkBY6BhbYmEugj6dB8fXG/u84Xx9ZZjb3SF6HmAdfEhPbXRKlbTPs1XtbeFJ69EX76Kt6RmETN+6gx7fsuAf8EipWltv4yafsDA7wh2Cx5spb0qRffBC6OYwrce+rsJ/TFsIcvjPDFD4GL45hGtPN9sq3iXLjnkx60Or/Nqz/6OvyU9nWX8lMY/97dyzWFr0kPPW9WZXEzK2/KRXl9Pd+UWIctxcJPsi+AOYpzZWgXZ4F6aVOOHfZXekAv7RuH/OlTpKDPR3e1fvsJOoT8Tpb5Fdf4BPdrst9tqJqXjCPH58p4WcNYPq9nMqdz8EUWxhdFk66y/uA+bkTdfPFAGT9S7D1TZD+A93LwhfwdwfO05r1Y8OX4T+4q47HJZu379G9tNorNTbEq7cFY/dfmM2uw7ZCuKPuko66jA/ioq3x/1EJ21iD7kG0JyI4UvUiRjfESAS+qeRfrTF2uaHUQc+Wzu2q5ovX85BkW+qmpx6T5SfsuIEUO+hT3m5HyXl1/H31qKfD63bq/z/LzGpsv/Ohzt17EoE9dDmrfcXXfKZawp2sUOdo5goa19oh1ua3ao535B/5maN0f5mc5BY3NosmvWq7j2Yh8dww8SxgLXb9/JW+9repwhLO61vN3X87qsL/f53wN+/tHOF9r3d+/L+drXPOa1ug252tYg/piRZ6wLGF/v49expNe0kZtn8Jza/cpvvsd5Wp2vpnON6urxaycLTv1OwLnX5CemdZbxJyWZOBe2tv1LELWBdzb83g8b7CEZxE89ru7hv7/LO0s4lBM/C9nE8e0V6vv+L0Tqqfctb8eonZtFsurzXxRTt4W9nZ6qHb9BnWebe05LQAA", - "debug_symbols": "ndrRaupAEAbgd8m1Fzszu7M7fZXDodjWFkG0WHvgUPruR0vNkew04Z8bMeJH0P9PYsb9GJ42D+8v99v98+FtuPv1MewOj+vT9rA/b318roaH43a3277c3748pMsD89f7317X+8vm22l9PA13JnU1bPZPl2ft7J+3u81wV9Ln79XAAosMiwILhUWFRYOFoUISLAgWcObiZ97kKlqeigyLAguFRYVFg4WhIidYECzczCnla+jnp9PUswRMDpgSMBowNWBawBhuSgoY8k1poyk2NRwwEjA5YErAaMDUgGkBY7jRFDCBHmigBxrogQZ6oIEeaKAHGuiB/tCDNh6nxDw1hpuaAoYChgNGAiYHTAkYDZi6aDJNTQsYw01LAeP3gLSMpk2vJY0DRgImB0wJGA2YGjAtYAw3lgIm0AML9MACPbBAD+yHHth4vmaZHtumAVMDpgWM4YZSiiCKII4gvwuceUQtdShHUIkgjaAaQS2CLIDI3VNJ1ytESa0jBhNOOCGcME4EJ27fONk3YaodKThRnFScNJwYTPyx1DwhnDBOBCd4+oKnL3j6gqcvS+mzdsRgkhNO/PR5JNJ9Fn9ENU8EJxknBSeKk4qThhODiT+auiG5S78QThgnS8e+Q5aOfZWO+OmrXknNHVGcVJy0BWLUEYOJP5CaJ0tnfoe4X7JY/iZipSOKk4qThhODiT/tmSeEE8aJ4CTjBE/fn/NkudYy9+cxf8wzTxpODCb+jGeeEE4YJ4KTjBM3/WwjsZ4oTipOGk4MJv5kZ54QThgngpMM34v5Q515ojipOMFvqw2+reaUcEI4YZwITjJOCk4UJxUnDSd4+oSnT+5nUbleK1VTRxpODCb+gGieEE4YJ4KTjJOCE10g1TpScdJwYjDxRzd1XJHSknZEcJJxUnCiOKk4cXOpSldC0hGDiT+6mSeEE8aJ4CTjpGDk87z1Z33crh92m++1k8/v+8ebpZSnv6+byarK1+PhcfP0ftxc1lf+X1r5dXInotX5X63Lr4PL18okK6Zy3s95X/8A", + "bytecode": "H4sIAAAAAAAA/+1aS27bMBAdipYTyQlitOg9JMeOswxQp99Vj6A6TTftrgcweoiueqWeoD1CgV6hIMKxR88jWY5IOAgyQEBLQ735cIafYQzdkfF/jga+TWibuM+Vb4t+VAbEKmLqaSLpWXOyoWZi3j/fZvC949uABmcgNyT+ZTFdZop9AfU/zwRmBPwJ4w/i4BdHHufdqo5PIPeU6skrv2GejLH3nnfs+fz7hf+dAV6McZc6hfbbc0X/RNjm6OVq449Actf5sgiPPWHs6/DY54z9Kjz2lLFfh8eeMfab8NgXjP02PHY1ort8++zxOEftRtQ6diPPMVMD8ojqcwyB/JyizqmlAXmsD/onAd+liq5j4DnivDcKzyrvkhasRUAszutT2rYfY0HaGnK97BoLLD+nqLFZtvl1oPiVfTdUdB0DzxHGwlCRM1TkaFiLVV0HqTOOn9TvEOPH8nOKGk9lm1+1vGDfHSm6joHniNcro/Cs8i5pweL1CWOI8R1lin4B/TXvOn4sP6eo8VS2+VXLC/bdsaLrGHiOeM4zCs8q75IGLJyD+mLZQFiOeG8SQq80kF7Sxsj7iznmtCQtXobAy8BmycsFT54lkCw8S3ud7K8CF/uhrjI2jhswU+jriPeRKfT94NvIa3vxTOASyIocAzNtTSTQR9Ku8frpf+87XsMHYK+2R7HAk+sLxrzMlT4x/0vgYj+myPWTqbbXJbAX5zzJG/bwhRW++CNwsR/TiDZz0WBVx7ny74seNL8sCpZnPX5K27pL+Sn0/+Kf5bzI7aCHnrfzqrw9r26rWXVzM11WOJc4SoSf5NkW9+s4VpY2cRapHjTh2GF/pTv00vbpFE6fMgV9vvnW+e0v6BDzrCfnmqTBJ5h/smZrqZ6XjCP750p/uaaz/DPant9y8EUWxxdlm65yLsa9yIj288WJ0n+k2HumyD6B73Lwhfxt4H3a8F0i+LL/d9/KeGyzWTtj3ddmq9jcFqvSHozVhzaeWYttu3RF2Ud76jragY+6yu9HHWRnLbJ32TYA2UbRixTZGC8GeKbhW5xnmnJFmwcxV374VssVrW4l72HQT211Es1P2t6WFDnoU9xvGuW7pho1+tRR5PW7c42a5ecNNl+F0We9XiSgT1MOamcRPJvLfR7WJa0iR6uFa1iLgFjXq7o92r115DND5xonv8spamyWbX7Vch3PPPLbMfAcYSxo9yJaLVzDWqzqOhzgvqnz+D2W+yasUfe5I8Ia9QHuiDrXqB/LHRHPeW1rdJc7IpyD+mKZQFiOsEbdRy8bSC9po7ZP4bHFfUrk+L/Q7ocI9Ny3fqfVujGnJFl4lvbuW8+WeYl7a+6PNWtHWM/mvr99G/t/fLR6dtPe9am+/VTflv2YXJyErpUuZxcfl9NZVXwq3eNkV630P1oymYN9KwAA", + "debug_symbols": "ndrRauMwEAXQf/FzHqSZ0Wimv7IsS9qmJRCSkqYLS+m/r1Mab7G0Nndegh1yMPEdS9FE78Pj7v7t+df++HR6He5+vA+H08P2sj8dx7P3j81wf94fDvvnX9/fHtL1hejz868v2+P19PWyPV+GO+e6GXbHx+uRjf5pf9gNdyV9/NwMxLAQWBRYKCwqLAwWjgpOsMiwgDPnfubGN2EyFwKLAguFRYWFwcJRIQkWGRbdzHOSW+jj4Tx14YCRgCkBowFTA8YCxnFTUsDkvik2meJzQwHDASMBUwJGA6YGjAWM40ZTwATqQAN1oIE60EAdaKAONFAHGqgD/U8d2PScZqK5cdzUFDA5YChgOGAkYErAaMDUVSN5bixgHDeWAqZfB1nLZGw+lxgFDAeMBEwJGA2Yfh1kn8YD4nntmAWM48ZTwOSAoYDhgJGA6dcBCU3G0txowNSAsYBx3OSUIigHUO5eqaTbyFOSNSTjhHDCOBGcFJx0i42SfxHKtSEVJ4YThwklnGScEE4YJ4KTghM8fcLTJzx9wtPntfRJG5JxQjjpp08T4fa7CE4KThQnFSeGE4dJvyG1TDJOaIVIk74wTgQna89+h6w9+8oN6aeveiNVGmI4cZj0W1HfiOeGZJwQTtZG/g7p3mR2+SLspSGGE4dJv8+zTDJOCCeME8FJwYniBE+/398RvpWltONYv72zSPrdnWWScUI4YZwITgpOFCfd9MUn4i0xnDhM+j2dZZJxQjhhnAhOCk4UXov1mznLxHDiMHF8We34strxZbXjy2rHl9WOL6sdT9/x9B1P3+H0KSWcZJwQTro3Wfk2V6qmhlScGE4cJv3O1TLJOCGcME4EJ2WFVG+I4qTixGDS7ynVaaeDJW0I4YRxIjgpOFGcdHOpmm8kc0MMJw6Tfk9pmWScEE4YJ4KRj/Hs9/a8394fdl978p7ejg/ftuhd/rzsZrv1Xs6nh93j23l33bf3b8ve5+iWE2/GfwGvs9D1HtH4Q5jYxuuM1/oL", "file_map": { "50": { "source": "struct Header {\n params: [Field; 3],\n}\n\nstruct MyNote {\n plain: Field,\n array: [Field; 2],\n header: Header,\n}\n\nunconstrained fn access_nested(notes: [MyNote; 2], x: Field, y: Field) -> Field {\n notes[x].array[y] + notes[y].array[x] + notes[x].plain + notes[y].header.params[x]\n}\n\nunconstrained fn create_inside_brillig() -> [MyNote; 2] {\n let header = Header { params: [1, 2, 3] };\n let note0 = MyNote { array: [1, 2], plain: 3, header };\n let note1 = MyNote { array: [4, 5], plain: 6, header };\n [note0, note1]\n}\n\nunconstrained fn assert_inside_brillig(notes: [MyNote; 2], x: Field, y: Field) {\n assert(access_nested(notes, x, y) == (2 + 4 + 3 + 1));\n}\n\nunconstrained fn create_and_assert_inside_brillig(x: Field, y: Field) {\n assert_inside_brillig(create_inside_brillig(), x, y);\n}\n\nfn main(x: Field, y: Field) {\n // Safety: testing context\n unsafe {\n let header = Header { params: [1, 2, 3] };\n let note0 = MyNote { array: [1, 2], plain: 3, header };\n let note1 = MyNote { array: [4, 5], plain: 6, header };\n\n assert(access_nested([note0, note1], x, y) == (2 + 4 + 3 + 1));\n\n let notes = create_inside_brillig();\n assert_inside_brillig(notes, x, y);\n create_and_assert_inside_brillig(x, y);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_nested_arrays/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_nested_arrays/execute__tests__force_brillig_true_inliner_0.snap index 0537da5cab5..f95afe4df6f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_nested_arrays/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_nested_arrays/execute__tests__force_brillig_true_inliner_0.snap @@ -24,10 +24,6 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -38,8 +34,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/91ZS27cMAyVLHsS2wkyaHsQe/7LAJ30t+sBunAmzardtLuuvOwhuuqVChTobQohYkK/oTWeWkKKEAg0MSXykSIp2dTqjrT7s5S6MVH7RHMu3ViNozqgrComTh0JZ8fJWvUT8f64MYf1lm8CGpyD3pDyN9XiOhfsC4h/njOZEeTPSH4aR3514uS8bbvyFeg9V93k5WuIx2PsneOdOj79fuF+5yAvxr5zTKH99lzAnzDbLL1sH/wRSO99vmzDy56R7Kvwsuck+1V42QuS/Tq87CXJfhNe9qpUdznx2cmjPDIPqu7jK3IdWGjQp1S3DijQX6ioda/WoI/woH8S8F0mYJ0CzxLlphZ4RniWeGRtA8qi3DtX+/ZjLHBbQ55pQ2OB9BcqamzWPr+mgl/JdxMB6xR4ljAWJoKeiaBHkrVtuxg4Ztw/ju8x9o/0FypqPNU+v0p5Qb47EbBOgWeJzhQt8IzwLPHIojMEY4jkW8oFfAH9tR66f6S/UFHjqfb5VcoL8t2pgHUKPEtU87TAM8KzpEcW1qCxskwgWZbo/hACVxYIF7cx8v1ijTnNSYqXCfBysJnzCsbj930kA/9ze63ur0wuzkOsPDYIN/rQ0qUbq3HUkC7a+0zAkQKP5r4HfJHqRPWMyVWgK/KdZSXVawV4OEmxQNjsfv50v4+NBYrvix57uS9i7QPW61Tt12uOLVH75xnP0wyefWB++sXWcJlKDbv7GgFP5PN1g/WGk1RvDPAKsJnzSsY7thaRvcfWIh5jOcyl+ZkwF+sFzf3kxtjfUKR6QbpKZkvahte/3tzliSXTPvgB94Xrz2D+F/c/jwca0xE4b9dNfTtvbptlc3Oz2DXoJwV+4t8Q8L1I2r/I+zrDWpAdwCXVQxUOT42x/82N1m+/AUPMd2qe40mPT/Bux/PZqG6ekhw+vxDm81qG5xO/cxXgizyOL2ofVl7z8c5XquN8cSbMLwV7LwTdZ7CuAF/w3xqeZz3rEsbn87+7kcejz2bpXfZfbTaCzb5Y5fZgrP5v+5l7bDuEFXWfHIm1PCAfsfL15QDduUf3IdtS0K0FXErQjfGigad71mKd6csVqQ5irvxwo5Qr0t2T96TQT77vUZKfuO34XQj7q9yneH/Uwrq+XgD61FLk83twL4D0Fz02X4bBc39eJICnLwel97K+9w5L+P3XCHqknoMkaxtQ1lXbtUfq4UfuPw/+lkzPChU1NmufX6Vcxz4KXzsFniWMBan/JPUcJFnbtovhEfp6g/fvqfT1sBcwpheHvYBH6MUN7gU8lV4c1TzfGT2kF4c1aKwsHUiWJewFjMFlAuHiNkr3FNpbe08J/b2jWc83u9lit75ezpv56uD3jtD6d8vV9W6xbKqPtf13dkj/X9sJhj3NKAAA", - "debug_symbols": "tdrRTuMwEAXQf8lzH2zPeDzDr6xWqEBAlaoWlbLSCvHvm6xol41NojsiL6hBOdNWc5PWU791D/3d69Pt7vB4fOlufrx1++P99rw7Hoajt/dNd3fa7fe7p9vP/+7C+CfFv+e/PG8P4+HLeXs6dzdGZdP1h4fxkQ7+cbfvu5sc3n9uupRgQbBgWGRYCCwKLBQWhgoKsIB7Tu2eK12E8lQQLBgWGRYCiwILhYWhggMsmj2PgS9NHx5Ou87JYchh2GGyw4jDFIdRhzHc5NA2Wa8m29REh0kOQw7DDpMdRhymOIw6jOFGHDkQRw7EkQNx5EAcORBHDsSRA/kiB3q9TmNKU6MOY7gpwWGiwySHIYdhh8kOI4uG49QUh1GHMdxocJh2DqLkq9Hp548mhyGHYYfJDiMOUxxGHcZwY8FhHDkwRw7MkQNz5MC+yIFd7/GJ/rsfbKqThfjjXJEwLS/rli/rltd1y9uq5WMIK9ePK9dPK9enlevzd9YvVtXPK9eXleuXdevH5uvP4fIxn4NWpOBEcWIwSQEnESfNKy4F+yAplooQThgnGSeCk4ITxYnBpD3DnCcRJ3j3Ce8+4d0nvPu01P0kFSk4UZy0u5+uhKr30p5mzpOIk4QTwgnjJONEcFJwoguEq+6zwSQHnCxd+w2ydO0LVaTdfZELKVwRxknGiSwQixUpOFGcLN35a9KeD5JdvvaQ5YowTjJOBCcFJ4oTg0l7MDhPIk4STvDut4eCTJdYcn0fa88E54ngpOBEcWIwaY8D50nEScJJs/tsV2I1YZxknAhOCk4UJwaT9hBwnkScJHgt1p4AzhPGScYJvqw2fFlt+LLa4GV1CgEnEScJJ4QTxknGieCk4ATs/vtw9Gt72m3v9v3Hnq7H18P9py1e59/P/WS31/PpeN8/vJ76cd/Xvy1fccxEHL6UDT8DjbEa+51i3KRIw/MMz/UH", + "bytecode": "H4sIAAAAAAAA/91ZS27bMBAlRdmO5AQx2h5E8jdLA3X62/UIih0v2l1PoEN01SsV6JkKIhx79Dyi5YqEiwxgUNZQb94MZyiK1OpFtPtZSV2bqFOhPmvXFv2kDIhVxOSpI/FsBFmrdiHdH9dm8LzVm4AOZ2A3JP5DMX/KBP8C8p9lDDMC/pTw0zj4xcjhfK6b+Ars3qlm8fJnSMdz7IvT3Tg9Xb9z1xngxRh3zil03N4K/BPmm5X39TEegewe6mUTHntK2I/hsWeE/SE89pywP4bHXhD2p/DYy7F6qYlnh0d1ZI6mDvkVeR6Ya7CnVHMeUGA/V1HnvVKDPeKD8UkgdgOB6wR0Vqg2taAzwr3Eg7UJiEW1d6dO/cdc4L6GfKd1zQWyn6uouVn64poKcaXYDQWuE9BZwVwYCnaGgh0Ja1M3OXDOOH6c3zXGj+znKmo+lb64SnVBsRsJXCegs0LvFC3ojHAv8WDROwRziPCtZAK/gPFadR0/sp+rqPlU+uIq1QXF7kbgOgGdFZrztKAzwr2kBQvnoL5YJhCWFVo/hOA1CMSL+xh5fbHCmuYi5csQdBn4zHU50/H1PoqB/9xfa/s7w8V+yJXnBvHGGFpZu7boJxXZorEfCDxS0FHfr8Av0jxRvGG4CmxFXrMspflaAR8uUi4QNzuev9z1pbkwAn8jxfriejKgi1VP5O+l9cTz4gb6Uv+B0BdznvruXBt7H0DKebI1Vsc4p3V4+6uHoiC7pj7GAceF2x9A/2/uPx9zatMePPerqtzPqn21qHa7+bbCOCmIE/8OxrW9NH6Rx3VKucTnWx8vqd5VOD4l5v4P19q4/QYOMb8L+ZyTtMQE1yd8D9aoZp0SDu+fC/35fEX279XpPJdDLLI4sSh9XPl3Ac6zY3VZLG6F/mPB33vB9i08l0Ms+LWG+4OW5xKm5/1r1/J89PksfY/9q89G8NmXq9wfzNX/bTwzj2/nuKLt0YVcx2fwkSt/ftzBduaxfc63FGxrgZcSbGO+aNDplmdxnmmrFWkexFr56VqpVqQ9Ln6ugnHy7alIceK+494GnhHymOL6UQvPte1nY0ytRH5/d97PJvt5i8/rMHwO74sE+LTVoPRtgd/xfJ2He5hGsCPtm0tYm4BYj3XTH+kcOvIZauf9ULqXq6i5WfriKtU6ngXwZyegs4K5IJ2hSPvmEtambnK4wtlU5/F7LWdTuJ/d5zwJ97OvcJ7UeT/7tZwn0Zzne0d3OU/COagvlg6EZQX3s/vwMoF4cR+ldQqNrV2nhN7v2C6WT9v5oiqeS/t3em6/4y9ZREvPEScAAA==", + "debug_symbols": "tdrbiuJAEAbgd8m1F91V3dVdvsqyDB7iIIiKh4VFfPeNg2bdpDfhLyY3gxnylTP+lcQu+lat6+X182O73xzO1fzHrdodVovL9rBvjm73WbU8bXe77efH+68r9/hB/uv883GxfxyeL4vTpZorp1lV79ePV7nxm+2urubR3X/OKiJYMCwCLCIsBBYJFhkWigp2sIAz53LmmV8ih65gWARYRFgILBIsMiwUFcHBopi5d+EVevOym3ogg2GDCQYTDUYMJhlMNhjFTXRlE3NronaNNxgyGDaYYDDRYMRgksFkg1HciKEPxNAHYugDMfSBGPpADH0ghj6Q//RBbq9TT9Q12WAUN8kZjDcYMhg2mGAw0WBk1ATfNclgssEobrIzmHIfeImtyd3nTyaDYYMJBhMNRgym3Ade23sI8T/9NuudLBye54q4bvk8bXmdtLy6acv7acvTtOV52vJh2vJx2vLyneVT9ymuadryedryOmn55kFRqh/d6/ERXe4RhYl3OPE4IZwwTooXGzl9EvKpRyJOBCcJJxknChNyOPE4IZwwTvD0CU+f8PQJT5/G0ifpEYUJO5yU06eWcO9/KU8thwnjJOAk4kRwknCScaIwKU8v30jopR88TggnY9d+gYxd+8I9Uk5f5EVS6BHBScJJHiHqe0RhUp5aDpOxO3+BFD9k1tfXHtbYI4KThJOME4VJeSQ4TDxOCCeMk4ATPP3yMDDwqy1D/z5WngUOk4wThUl5EDhMPE4IJ4yTgJNi+kFbon0iOEk4yThRmJTHf8PE44RwwjgJ8FqsPPkbJoKThBN8WZ3xZbXiy2rFl9WKL6sVX1Yrnr7i6SuevuLpK56+wumTA9O/N0e/FqftYrmrn3uFNtf96m3r0OX3se7sIjqeDqt6fT3Vj/1Ef7cSfQ10vPMz7+Tx5z+6ihzPyMXmfZr3+gM=", "file_map": { "50": { "source": "struct Header {\n params: [Field; 3],\n}\n\nstruct MyNote {\n plain: Field,\n array: [Field; 2],\n header: Header,\n}\n\nunconstrained fn access_nested(notes: [MyNote; 2], x: Field, y: Field) -> Field {\n notes[x].array[y] + notes[y].array[x] + notes[x].plain + notes[y].header.params[x]\n}\n\nunconstrained fn create_inside_brillig() -> [MyNote; 2] {\n let header = Header { params: [1, 2, 3] };\n let note0 = MyNote { array: [1, 2], plain: 3, header };\n let note1 = MyNote { array: [4, 5], plain: 6, header };\n [note0, note1]\n}\n\nunconstrained fn assert_inside_brillig(notes: [MyNote; 2], x: Field, y: Field) {\n assert(access_nested(notes, x, y) == (2 + 4 + 3 + 1));\n}\n\nunconstrained fn create_and_assert_inside_brillig(x: Field, y: Field) {\n assert_inside_brillig(create_inside_brillig(), x, y);\n}\n\nfn main(x: Field, y: Field) {\n // Safety: testing context\n unsafe {\n let header = Header { params: [1, 2, 3] };\n let note0 = MyNote { array: [1, 2], plain: 3, header };\n let note1 = MyNote { array: [4, 5], plain: 6, header };\n\n assert(access_nested([note0, note1], x, y) == (2 + 4 + 3 + 1));\n\n let notes = create_inside_brillig();\n assert_inside_brillig(notes, x, y);\n create_and_assert_inside_brillig(x, y);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 4e4d309d56c..f743ad68e6c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -62,8 +62,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "H4sIAAAAAAAA/+1cyY7jyBFNSqKqpVqk2nq+wTcmk2SSPhXg6vb6E8klP8MgYP+BAV98MeCTgTkM5jK3AWb+Ya5zmMv8xohVDCkUDFFUF7OrG+gEurlEMpYXkZFryRPPxd/889r7WXudi26BOg/tNXhZkSPyClzq6X0mek4+Ez2nn4mes89ET9+RnntJoFG6CbDGeQ0wvjhcwMCf25tF+zxB9BGDQC6I3DH5p0FULhj7RtRfLVqeZ274J8D/jRv+Aej9x3rHH9sCci/bZw9hCd8AbYJofyK0KaL9mdBmiPYXQsOx+ldCwzH+t5bW6Hstdvdv2/sF0d9FnGEMxvbTLaP/BNnWlD/UOzwGypXH5ALvx9qJXdv2/84N/xD4v3fDX523cfb31jEQm292rtj6DGJk4SZGlEfkCbFrd5gG8pfCaW6RHpEH+lB8II4BuyWj65qheeR+ychZMnI4XrgtNc/nbjApwMYL0S1AuzxgIy1T8oz1bvD9J4pJWo/KxDF5SWgYp6v2fsHoOiJO1SWRJxidV0g2zru0cDiB3qfihONiRWgXiLYmtEuGL2B4hd6PiGE8NB+A/KVw6tNtPrgi+lB8aD5YMbquGRqOYUzDclaMHI7XckRe5yPyghijfUlTHtprkKpKZ1KWqYqDTCdhZjcjSR0raQsZF8aWOjNplldVkassC5RNsliHRaISG5nYLEQ3dwJvabSNK2tMqa3aMAtjk8nUqqAo0lIrpWxRmFxvyEUWWBmVVSrzoojD1GaZiksuv+7p/sKyEN38uuUdR8akidGqyFOjojiMqzjPqzKpIpUbKbO0SpPAxlZlcRAmqdWytFGcybysouexBI1f4B0GWVnY3Iab/2JtM5sE0QbNqNTSFIk1NtXhRrwtdBToIoiqPAmlScJUF6aQYUJjHWMDctfo/YjtUg/NEyB/Kbpx6SJPrIk+h9oJYHfN6LpmaDRPXDNyrhk5HK/liLzOR+R1MSKvKwc2LhjaeDEkQ4iJG9EtQLtFsmlffodouD+khRtb4Pnnv08YW2Cf3RIa9sEdoeG8cE9kgFyfkTEjNKhr2qtbHwXBDeIrRDeOsL4+g4N/wLaK6O9oPMPqf0lk4/WLseRycwjv49g8uK8A+UvRjTsXfcUl0YfiQ/uKK0bXtTgcY31j1ytGzhde4/Hqm0MNiUdODm4fdEx9Qb5/aK/By4rk5rS03TrKtWZouwX5S9H1h4t2y40luPig/Tn+ds3QaBzeMHJuGDmueV18onp9sfHDbOzriz80N2H8oC2sRLc9wpjV9TiN4jUT3XE/1m0iunhhXH3y7j/ttRkv/9/bfUNzwZD+g1srcrzOth2PnTGymz2q/wreJh/ZdIZseleLPZyg/u+9Hc//te9WjGw6BnW0vh/1rYcELysh2DCtd7qfIbuaMqud2KUbvL5usebWZXwkt/k3dJ2ir8/DczjwV99c3PG+c8zhj/NNU2a1E9ks/ni/iOLP5Qhuf6nPXzg3AKZr0fWNT2h4HAkyV6Lb39AxJm7vD+01LG2aZ1FQxWkWVFElldZVECutrKmSzMhSx9FmrVbF1WYRMw3yJEmySEebdd2wKIvS8dwv4WLCR3Y1ZVY7kW24mMB+pzHBrbFz/caQNowx5WIC5yWMiUD2h1VRpmkp4yzReRGrPE0368phFZQySZNEbtaGizwxpghLZdO4CjfrwrqqbB4WMtss6Dtu75rzLc41TZnVTmSzvsVzvSG+5faPhvp2SHunvh0Zg5TDH/fjTZnVTmSz+OP8NCTf4voU/762yOVUbu+MGxuDTO6sUGsOO6cfcwzkEXlgI36H5S+F0zjazqsvRBdzzkeO+4zs1D4a9HG0t5T05QSf0acZe81FN4YwXtycDMvA8UDt5mQ/1s9XbmxPzxXRNXBcd05oUPeX9ur6bCG3Pn5M/zmizdA9fp4x3+Nc4ZP6vxJ75x/R3jmRjc86jiQ3pVhMEGaCkYtpHI4TQpsc+Bbw4+wbGduTz02deh4I9D71PBDGgp6bwu3+itAmDF/HGA4+Hwjyl6KLpYu+akb0ofjQNWCf0XXN0Dxy7zNyuJzP8ZoSHWj7acpCdP3+GmMNeLcUfHt9GEefrf+mDK4egys9742/XTM0ek6Di5MZI4fjtRyRFz3D4Kg/0dxYHApdF8GYc2c6T82HYFPD/8cT8iGOR/q3A5xvuTYNvqJn6pvy0F6DF5Uwdzz2yagPBIMVd/54qH9A71P7KxyrS0LDY8dzQuvrrxxhOLi/Avkfq7/ixu99/dWC0XXN0LBvaOxMmXeTHl7gy9UB3kI4X0MOKF5434ibp0xEN5721n3Ju9+1hnD7RnMGu3kPdh6jDz0HOzI+OT1Tjgt3Jozm95eMd8GmU/M7jiO6B4r9RsfCODbp+QeQw80Bp4QGdbP2hvYRY8cwN6cDWY3fuH1Z+vcb3H5P3/4Ety+N94Bo28brlfAt4HLrBBcZ0XOSuADtHsnGOtLCxSfofWr/hnG6JzTsy7foHus3Ef17sq+4Ts7ui90iHf163ybsmylTn8bdPVMfn4OlZ6qxf68JL269D6+5PdY7O57q1LvvQcfXwBPrSPHs27dtCsWTw5/by12LLtY3hIZzCsjkcg/tL47F9ft6vz6Xe/r2sm+Z+jc9umL7b8Vx2VzM9OHbp+ux+L4humL97sVx2VjXd0TXtyfq+hVTH+esO6Ir1g++/dT29DBm/gB87l6AD81VXyHadQ8+d6+IT99+dt+ZBQ6fY2dMaH7pa5ecbNxWH+udHU916t33rxlvGAOKZ98YqykfmufW4nDu4PYwh/SbOF8/1mLPxmNnzlzirtPnOd6Tri1/ONNGywzRcf1/tAzwHAuuL/kRF6uNtMpYE5uyjApDx/FNweN4/Df8jtfhY26/Ggo3z/IY3aEc28v4CbUJWo/KxDE/JzS87nJ2QB58D79Dgb+DZ7pHP2H40Gc698N86F7fv4gPX2Ovj9sbomtCdL7alEO/JUExxPY5itHBew10r8jR3kfvXhHXph2f19meI+DWmSY9+jhaa4tAH25tcsrog881HNpPx22HO4NAzzVMjsh+rJ+vK3G4ffT5GfN6R3hxecQT3ZzD8XpPeHF4cHkQ6jXtduz+y2iVFmFU6DxWRiVH+y+YS8xrZGu9/81Z+wzrsLQ+8PNJ/W9aBk08fIty01NdRl5T74eeet6B6xMP5t2s3n+3qLv1p3W3/vZvEOuujkA7RzQ8RmzKRfuM8cK8QA+f1P++ZQA+eYO+ge/XjPw3RP6e3sw7uuZ7ztQ/Z+o3/vmOjLuw7WPn7SeZhD9+R3WD2PnSH/bj+gn1h+oT6w/DL/3h7vvX6A9xu50ydT3CcyoOj4sF884ThzGjv/XXlIf2KpWSQVBqaUurYp2FuUxUktjI6iSNShtHptSVjIwKs0oHVqZVpWNV6MRmZZFYauukx7ZT5wEYv98ABrZwleFXAAA=", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_0.snap index 05b7e561599..3c618d3d73e 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_0.snap @@ -62,8 +62,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 9595a9fcad2..0a6ac0e2381 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -62,8 +62,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 4e4d309d56c..f743ad68e6c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -62,8 +62,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_0.snap index 05b7e561599..3c618d3d73e 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_0.snap @@ -62,8 +62,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zZ3RTttKEIbfJddc7M7OzO72VaoKAaVVpAgqoEc6qnj3k3Cwm9ZukOt87dwgTDxffiX+Jom9Gb5tPt5ef/18ub37dP+4eff+22Z3f3P1tL2/2299e77YXD9sd7vt58vjP2/S4Yf0l/0fv1zdHTYfn64enjbvspaLze3dx/1vve/rP213t5t3lp4vprtaScO+ZnXcOffnDxebklh8ZvHC4guLVxZvLN5ZfGXxjcWz1iprrbLWKmutstYqa62utza3ES8TvLP4yuIbi+8o3hKLzyxeWHxh8criWWuNtdZYa229tc2Hfd3KMX66c0leX3cuWfznLD1OFk+BsuRAWSRQlhIoiwbKYoGyeKAsNVCWQH3XA/XdGqjv1kB9twbquzVQ362B+m4N1HdroL5bA/XdGqjv1kB9t4F994DPLF5YfGHxyuKNxTuLryx+dT9w6yO+22kH1bq+7qyu6fvO/pKlx8nSU6AsOVAWCZSlBMqigbJYoCweKEsNlOUv9t3yc5YeJ0tOKVKYHCmMRApTIoWZbb6S5bVGjt7u78O8lNjyEl9eUpeXzDYG0eGyrJhOSvrikpyWl+TlJbNHrNTxc9jR5ZjZg0TSeJBI8vTTe9ecC8xXmG8w32F+hfkN5neWLwnmZ5gP+yuwvwL7K7C/AvsrsL8C+yuwvwX2t8D+FtjfstrfXGzg56oTvsJ8g/kO8yvMbzC/s3xNMD/DfIH5sL8K+6uwvwr7q7C/CvursL8G+2uwvwb7a7C/BvtrsL8G+2uwvwb7a7C/vtpf0ZG/v2h/zF96gT97jhRGIoUpkcJopDAWKYxHClMDhamrbSolj2GKTPirD4PShwsj+xPm0/yrn1nVMb9anvArzG8wv7P8lmB+hvkC8wvMV5hvMB/2t8H+NtjfBvvbYX877G+H/e2wv321v1ZHvk9f3/tqf72Ml9xdbcJ3mF9hfoP5HeVLSjA/w3yB+QXmK8w3mO8wv8L8BvNhfzPsb4b9zbC/GfY3w/5m2N8M+5thfzPsb4b9Fdhfgf1dv07J63h+pkqZ8AvMV5hvMN9hfoX5DeZ3lr9+ndIb/Azzz+uvT/gF5s/6W8bF8MXzMf+lxJaX+PKSurxk1oVSh+8Q7s9kT0r64pL5lTmnS/LyElleMnuoaB9efixNHrH5VS6nS+yNkmyTktln32Q4hu3oK0ZDyeyzbzaUeNbTh/3paXAyv7zkjPzO8ueXl5yRn2G+wPwC8xXm22r+qdFhMr+85Iz8CvMbzO8s3xPMzzBfYH6B+ev9Pdv8DnGLFMYjhamRwrRIYXqgMDVFCpMjhZFIYUqkMJE6cAU78AvfYX6F+Q3md5bfEszPMF9g/urOcL7xItI0UhiLFMYjhamRwrRIYXqgMD1FCpMjhZFIYf5iBy6TMBopzGwH9vHssbf81mvfyVNt8yvozsivML/B/I7yy/wKujPyM8wXmF9gvq7mnzrVVpLBfIf5FeY3mN9Zfk4wP8N8gfnr/T312a1khfkG8x3mV5jfYH5n+ZJg/mp/z/c2u4hEClMihdFIYSxSGI8UpkYK0yKF6YHClBQpzF/swGUSRiKFeasDT1bZlaLLS2x5iS8vWb0S+OQkgbJ+4lmpOvLbhL9+4tkb/Azz109yMP/On7yPWj/x7A2+wnyD+Q7zK8xvML+z/PUTz74v7t7f1ZSfYb7A/ALzFeYbzHeYX2F+g/md5Tvsr8P+Ouyvw/467K/D/jrsr8P++vpJMmmcOK3SJ/zO8muC+RnmC8wvMF9hvsF8h/kV5sP+Vtjf9ZPcTk7qK+snub3BF5hfYL7CfIP5DvMrzG8wv7P8DvvbYX877G+H/e2wvx32t8P+dtjfDvvbWX81JZifYb7AfNZfnV8ns/9YPFyU2H9C+2FM+/QeWhqmELTj7/jUmV1dh3P5PyxZqP9H0ThR7I9GaQPWW5tE8T8bZVi0WNP0Ualxovxq6Mg4qKSlPDnWfzF2ZFxhPVckvxg8ov1UUf6dIvmdorK06Hm/9c/Vw/bqenf7uK853Pj17uZpe3/3uvn075fhluuH7W63/Xz55eH+5vbj14fby939zeG2TXr98V5LulDLHw7/V/SwmfxC88vm4UHQ/cXT/ceu/b3u7/k/", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 9595a9fcad2..0a6ac0e2381 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_pedersen/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -62,8 +62,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_rc_regression_6123/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_rc_regression_6123/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 33a34627622..9c5717e4bac 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_rc_regression_6123/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_rc_regression_6123/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VZzYoTQRDu+U0m2TVBn8A3mMnPznoTdPXoRcGDoLPJxgcQPHkYfAjBs+BBvHgT9ORdEHwh02vX5suXyiTLTrvYEHqmq/qrn66u6p4EZtUC18fmCk1Afrs+c30I9Gj5u+ve86u1IiO5beIf55MyU+xrUf9x5jADP/i54Hvyf95xOA/rFT7aInK7y18fnodmFR++7Jf182n/rQabJXbu1f7W1rb7gG9M+3vrxI/+F/gP/OCP+i7WHhk91lr0VX5Ia4/rkYFtHuwcByTPkCxD8nvG654oApIn+rB/5Fl8Fyu6DhVaQM+xIidW5DRhDUzzPva4fjnbEYMdkaJrqNiB9iY0dtv1di88ITyOGR5j34WKPofKvGBLL3LMDjnaOnCctCEHsSRPi5ykRTlJgz1hi3JCxR6J3xTmtxi/pdjRMZtNaF2QzXGDZ7iYaD2gJUTrA419egA6YH3hFtE7+snq/BRwmU/awGzfGwOzuf5iY1Osa7kqacDkXOVprS9ylaw15qpU0TUkfo6ThMbuuV7LVbgfI2WsKVcl5B9Pte+f7AXbTup1Wh9oeN7kpsU7ntFfg0zmk9YHPeN6RW/Lj+Xx3zg719fhJ2ZTd5SfEP9j9475Q/r4CnouyqpYjKtFNa3m88msukn4toXgp7blV+X4eDaazMrT6bgaH+2Uj+dfyRu4FzlvpoAjcWTHnsEcjGFZF54rOTch/hdmhfkc9NwHF/cx484A99UWXQ1gog9S4s8AS+Pvkg7C/9L1lv6O5GXKfGNW+QhzQov5qNJyhzStjnI+OgAax8oh6Yy0G0DjPDYAGn+/wablKvGT7d8DLvNJ2zceMHY5t6aKfNwT2h5LSCbSEI/PDBJnGP/oB95Xwv8GdPlgdtur1U2Of+Tn+ER7cG9kW2SjPXGDPcL/tsGe7JL29BR+rc4OFFtlrsSY1Bc+U9gWA63N+73V5yPowT5I6v3t1fzTV/ixbvFdHPNFF/Ri/2TX6J+owT/aOTJq8E/T/sH4GZrN+OkQDc8B7FeUKznCxxliMq3KWVUWxZ1JcTYpppc5Q/xPd0muV9pdMlDk7LoTfgdc5pPmY91m06PT2XLx8rPCvo52rZvU2bQG2+r1OR33Lvc45he8hPg/Ce/y99k9iz8SRZ7l+9bAF2zpzzGUsbheH8vqTf6o3uQX2b16U0eh9YGGucO2A/eO/kIs0SMh/q/uXdakC3Nk/lCR3yX5a3orY5hDGCtSxoTfrs8XwXM92t729+FzmYSPY6ybxM62O03TN13tO4nwyb7G8wnWBz6fCP8P11tdfrlnrQaKXtdRA/FMyzUQ86t2Bt6nBuK5T3ym1UD+hq39L4A+P6nX+cWHqdHrr+Dxd++frsf7mFaHU6KFCraXOrz8mHC0KPPpaD45G8133uX/AGIGjfutHwAA", - "debug_symbols": "tdntquIwEAbge+lvf2QmmcnEW1mWgx/1IIiKHwuLeO/bHoxH2qyHN9A/YqTPtPqmaWJuzbpdXj8/tvvN4dzMf92a3WG1uGwP+651u8+a5Wm7220/P14/blz/QvHr+PNxse+b58vidGnm5tKsaffr7h1r5zfbXdvMxd1no0M5On4cy5H5ebDef88askmrpymrs5u0Ok1anSet7ietHiatLpNW10mrl+/V4HJ1ia/Ve2GwSKjwDhYEC4aFh0WAhcBCYQFn7uHMPZx5gDMPcOYBzjzAmQc48wBnHuDMQzlz1YdIjofCYJFQIQ4WBAuGhYdFgIXAQmEBZy5w5lLMPBFlEdxAqIMFwYJh4WERYCGwUFhEWBgsipkTUZ5mEEkYmOgqDFUYrjC+woQKIxVGK0zEjRUzjS7f+ZGHT5RU/KVZQp5r2rDfpOJ34WQP4Wl0juJVec3POR91IMg5nBBOGCfFXuYlz+O9jUmxk3mfQ/FiIyI4UZxEnBhOEkzI4YRwwjjxOMGjpP+MzEnync9ehohdDaIaxDXI16DinaOcBycNcUQEJ4qTiBPDSYJJecmtMQ9P0bkRIZwwTor5q/j8XcZDbXnZ/Z4IThQnESeGkwST8uL73eOfyqvv94Rx4nEScCI4UZxEnBhMymvRYHlqIo5GRHCiOIk4MZwkmJRXpO8JwcTwC0v4haXymGzPabla/EaPLQ+uML7ClIfl5PKTXNNLd34YqTBaYWKFsQqTYMPlJc0PptwPUnjmk2RkuML4ChMqjFQYBc29a/xZnLaL5a597HJurvvVy6bn5e+xHex/Hk+HVbu+ntp+J/R7E7TPjLo/zshin3vf7GY5Fr6m6V2Dnc2YXHfO7rz/AA==", + "bytecode": "H4sIAAAAAAAA/8VZzYoTQRDu+ekkk7gk6BP4Bvnd2b0J6+rRi4LX2fyg4MGzIAx48iEET94FwYN48SYo+Eim167Nl28qk+hOuwWhZ7pq6q+/rq6ZRGZDkR9Tcw0SJb/8mPkxBn6y/t3z98Pr0Sgju03qPxlO80yJr0H/J5nXGYXRPxT9gfI/bHs9D8uNfoxF7HbWvx5cD8wGH6Hil/ULGf+dmpgFO2dluLV1dB/0G9P83joP4/+V/gdh9I97HmuPjI61BnM1PKK1x/XIILYAcU4ismfIliH7XRN0T4wisif+cH7kWnKXKr4OFF5E16liJ1Xs1Onqm/p9HHD9hhxHCnEkiq+xEgfGa2nurh/dXnhC+hgzPMe5ixV/jpTnoh2j2DF77GjrwDhpwg7qkjotdmyDdmxNPHGDdmIlHsFvC55vEL+5xNE2VRJeB2wzbrCHS4nXBZ4lXg94nNNb4AOeL0wJ3WOenM9PQS/LCfXN7r3RN9X1lxjrsK7VKlujk2tVoLW+qlWy1lirWoqvMckzTizNnflRq1W4HxNlrq5WWcpPoLPvv+wFR+flNq8HPOw3mTS8Y4/+GmyynFAP/EzLDb+pPOYnf3B26a/Xb03Vd7RvSf6xv8f6IWN6DT9XeTFaTYpVMSsWi+m8uE36HcWQp6btF/nkZD6ezvOL2aSYHO+1j/2v1A3ci1ynEJsx8RCbokP2E8YZot4IvrHeoE38zsBnA+4NS3OFH7V6g+/+iTLH9aat+CP7swXPyf50c0uymYCfifKsnGWW5J+bjc5n/rp3oF6sj6z3Beh9tcNXAzoRPy2ST0GXJp+QDyL/0o9O9h3Z094ZHAXu2U+5XiNpvQvX+UN6F46PSavlMudy9R70spzQoeuKGOSzh3sN0bsEX7gGWbKJPNTHPZXsMcQx+sv7Q+TfgC+fSGfHVOPV+oq6uqDhWKu32Q7bGE9aE4/Iv62JJ/vLeLqKvNaHaGeEPCsYk/OXey5HKfCa/P7h/PkMfnAObHl4vFp+eoo8n3eOBqa6tzvgF+cnu8H8JDX50frspCY/dfsH8TMwVfy0iReZ7RwgD+1KjQjRY01nRT4v8tHodDpaTkezf+mx6r4xae9tEcWF9QDXg+uByH/wo/Plp7/WMCd+3QTm8AxhzOH7knbmHII5rLOSMw1z/E1NO+8w5+fkq9bHWEU/9zEf/Yh9jIb7FvFiRXcI3M9nxxfzNfiHy5G7He/DfV/yUG74iDVHbX8vfTvLiz5L8l9Edv376q8Fz1ax5+R+1MhFO8ZLHcpcWm7PZWVVPimr8mK7W1Z9FF4PeLgPHN3y95gv1CV+WJL/7u9lTTrwjDw/UOx3yP6W38ocYpF1JcqcyLv1+Sb6/IixN/3/w6VN0o9z7JtgJ8h5sv5ocLzKh7PxYrocL/a+s/8Gwzcq8pUfAAA=", + "debug_symbols": "tdnbbuIwEAbgd8k1F56xx4e+ympVcQgVEgLEYaUV4t03YTFFyWyq31vfVHWV7yd0nPh0bVbt4vLxvtmt96fm7ce12e6X8/Nmv+ta19usWRw32+3m4/31z43pf1C4X386zHd983SeH8/NWzRp1rS7Vfcb+86vN9u2eRNzm40u5WD4cS0H5ufF/vZz1lCsmp5qprOpmk5V07lquq2a7qqmS9V0XzVdf1adyekS/ic9Vk1PNdOtqZpOVdO5arqtmu6qpguU3gsPiwCLCIuECmdgQbBgWFhYOFjANXdwzZ1ec+8fIhkeigiLhAoxsCBYMCwsLBwsBBYeFnDNBa65qDVPRFk4MxDewIJgwbCwsHCwEFh4WARYRFioNSeiPKwRiRuYYAoMFRguMLbAuAIjBcYXmICbqNY0mPzkBx6OKMnAQq0ni8uzoTjsaYlhYWHhYCGw8LAIsIioIEM40b97ig9iKYyIemPW58mKDX5EEkzI4IRwonZIK3mxa+OYqD3S2vycWInT6wUX8w2JoVG6q5ouVdN91fRQNT1WTU810/Vdvm9LZyj9Tv4xyCXJAxZbGaFQgmIJSgXImhKkvpE85xeyd6O3q76VMk0sThxOBCceJ2ov8CG/kIMZDWH6ZsY0STDRtzO82PxdxoOLvp8xTRgnFicOJ4ITj5OAzkFJ39aYJvDcmMTghHDCOLE4cTgRmOiL/MmRRl/lTxO988fnlNfH8In+nrjpC/0vjBQYvf8nk0cMn17+bQ8TCkwsMAk3+pL/C0MFhguM3g+Se9Ynyci4AiMFxheYUGAiaG5d49f8uJkvtu3jkH192S1fztzPvw/t4Pj9cNwv29Xl2PYH8Z9n8H3foGhnbFx/L32zG03jvdH3Ae6qxyZ0n9l97h8=", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_rc_regression_6123/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_rc_regression_6123/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 33a34627622..9c5717e4bac 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_rc_regression_6123/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_rc_regression_6123/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VZzYoTQRDu+U0m2TVBn8A3mMnPznoTdPXoRcGDoLPJxgcQPHkYfAjBs+BBvHgT9ORdEHwh02vX5suXyiTLTrvYEHqmq/qrn66u6p4EZtUC18fmCk1Afrs+c30I9Gj5u+ve86u1IiO5beIf55MyU+xrUf9x5jADP/i54Hvyf95xOA/rFT7aInK7y18fnodmFR++7Jf182n/rQabJXbu1f7W1rb7gG9M+3vrxI/+F/gP/OCP+i7WHhk91lr0VX5Ia4/rkYFtHuwcByTPkCxD8nvG654oApIn+rB/5Fl8Fyu6DhVaQM+xIidW5DRhDUzzPva4fjnbEYMdkaJrqNiB9iY0dtv1di88ITyOGR5j34WKPofKvGBLL3LMDjnaOnCctCEHsSRPi5ykRTlJgz1hi3JCxR6J3xTmtxi/pdjRMZtNaF2QzXGDZ7iYaD2gJUTrA419egA6YH3hFtE7+snq/BRwmU/awGzfGwOzuf5iY1Osa7kqacDkXOVprS9ylaw15qpU0TUkfo6ThMbuuV7LVbgfI2WsKVcl5B9Pte+f7AXbTup1Wh9oeN7kpsU7ntFfg0zmk9YHPeN6RW/Lj+Xx3zg719fhJ2ZTd5SfEP9j9475Q/r4CnouyqpYjKtFNa3m88msukn4toXgp7blV+X4eDaazMrT6bgaH+2Uj+dfyRu4FzlvpoAjcWTHnsEcjGFZF54rOTch/hdmhfkc9NwHF/cx484A99UWXQ1gog9S4s8AS+Pvkg7C/9L1lv6O5GXKfGNW+QhzQov5qNJyhzStjnI+OgAax8oh6Yy0G0DjPDYAGn+/wablKvGT7d8DLvNJ2zceMHY5t6aKfNwT2h5LSCbSEI/PDBJnGP/oB95Xwv8GdPlgdtur1U2Of+Tn+ER7cG9kW2SjPXGDPcL/tsGe7JL29BR+rc4OFFtlrsSY1Bc+U9gWA63N+73V5yPowT5I6v3t1fzTV/ixbvFdHPNFF/Ri/2TX6J+owT/aOTJq8E/T/sH4GZrN+OkQDc8B7FeUKznCxxliMq3KWVUWxZ1JcTYpppc5Q/xPd0muV9pdMlDk7LoTfgdc5pPmY91m06PT2XLx8rPCvo52rZvU2bQG2+r1OR33Lvc45he8hPg/Ce/y99k9iz8SRZ7l+9bAF2zpzzGUsbheH8vqTf6o3uQX2b16U0eh9YGGucO2A/eO/kIs0SMh/q/uXdakC3Nk/lCR3yX5a3orY5hDGCtSxoTfrs8XwXM92t729+FzmYSPY6ybxM62O03TN13tO4nwyb7G8wnWBz6fCP8P11tdfrlnrQaKXtdRA/FMyzUQ86t2Bt6nBuK5T3ym1UD+hq39L4A+P6nX+cWHqdHrr+Dxd++frsf7mFaHU6KFCraXOrz8mHC0KPPpaD45G8133uX/AGIGjfutHwAA", - "debug_symbols": "tdntquIwEAbge+lvf2QmmcnEW1mWgx/1IIiKHwuLeO/bHoxH2qyHN9A/YqTPtPqmaWJuzbpdXj8/tvvN4dzMf92a3WG1uGwP+651u8+a5Wm7220/P14/blz/QvHr+PNxse+b58vidGnm5tKsaffr7h1r5zfbXdvMxd1no0M5On4cy5H5ebDef88askmrpymrs5u0Ok1anSet7ietHiatLpNW10mrl+/V4HJ1ia/Ve2GwSKjwDhYEC4aFh0WAhcBCYQFn7uHMPZx5gDMPcOYBzjzAmQc48wBnHuDMQzlz1YdIjofCYJFQIQ4WBAuGhYdFgIXAQmEBZy5w5lLMPBFlEdxAqIMFwYJh4WERYCGwUFhEWBgsipkTUZ5mEEkYmOgqDFUYrjC+woQKIxVGK0zEjRUzjS7f+ZGHT5RU/KVZQp5r2rDfpOJ34WQP4Wl0juJVec3POR91IMg5nBBOGCfFXuYlz+O9jUmxk3mfQ/FiIyI4UZxEnBhOEkzI4YRwwjjxOMGjpP+MzEnync9ehohdDaIaxDXI16DinaOcBycNcUQEJ4qTiBPDSYJJecmtMQ9P0bkRIZwwTor5q/j8XcZDbXnZ/Z4IThQnESeGkwST8uL73eOfyqvv94Rx4nEScCI4UZxEnBhMymvRYHlqIo5GRHCiOIk4MZwkmJRXpO8JwcTwC0v4haXymGzPabla/EaPLQ+uML7ClIfl5PKTXNNLd34YqTBaYWKFsQqTYMPlJc0PptwPUnjmk2RkuML4ChMqjFQYBc29a/xZnLaL5a597HJurvvVy6bn5e+xHex/Hk+HVbu+ntp+J/R7E7TPjLo/zshin3vf7GY5Fr6m6V2Dnc2YXHfO7rz/AA==", + "bytecode": "H4sIAAAAAAAA/8VZzYoTQRDu+ekkk7gk6BP4Bvnd2b0J6+rRi4LX2fyg4MGzIAx48iEET94FwYN48SYo+Eim167Nl28qk+hOuwWhZ7pq6q+/rq6ZRGZDkR9Tcw0SJb/8mPkxBn6y/t3z98Pr0Sgju03qPxlO80yJr0H/J5nXGYXRPxT9gfI/bHs9D8uNfoxF7HbWvx5cD8wGH6Hil/ULGf+dmpgFO2dluLV1dB/0G9P83joP4/+V/gdh9I97HmuPjI61BnM1PKK1x/XIILYAcU4ismfIliH7XRN0T4wisif+cH7kWnKXKr4OFF5E16liJ1Xs1Onqm/p9HHD9hhxHCnEkiq+xEgfGa2nurh/dXnhC+hgzPMe5ixV/jpTnoh2j2DF77GjrwDhpwg7qkjotdmyDdmxNPHGDdmIlHsFvC55vEL+5xNE2VRJeB2wzbrCHS4nXBZ4lXg94nNNb4AOeL0wJ3WOenM9PQS/LCfXN7r3RN9X1lxjrsK7VKlujk2tVoLW+qlWy1lirWoqvMckzTizNnflRq1W4HxNlrq5WWcpPoLPvv+wFR+flNq8HPOw3mTS8Y4/+GmyynFAP/EzLDb+pPOYnf3B26a/Xb03Vd7RvSf6xv8f6IWN6DT9XeTFaTYpVMSsWi+m8uE36HcWQp6btF/nkZD6ezvOL2aSYHO+1j/2v1A3ci1ynEJsx8RCbokP2E8YZot4IvrHeoE38zsBnA+4NS3OFH7V6g+/+iTLH9aat+CP7swXPyf50c0uymYCfifKsnGWW5J+bjc5n/rp3oF6sj6z3Beh9tcNXAzoRPy2ST0GXJp+QDyL/0o9O9h3Z094ZHAXu2U+5XiNpvQvX+UN6F46PSavlMudy9R70spzQoeuKGOSzh3sN0bsEX7gGWbKJPNTHPZXsMcQx+sv7Q+TfgC+fSGfHVOPV+oq6uqDhWKu32Q7bGE9aE4/Iv62JJ/vLeLqKvNaHaGeEPCsYk/OXey5HKfCa/P7h/PkMfnAObHl4vFp+eoo8n3eOBqa6tzvgF+cnu8H8JDX50frspCY/dfsH8TMwVfy0iReZ7RwgD+1KjQjRY01nRT4v8tHodDpaTkezf+mx6r4xae9tEcWF9QDXg+uByH/wo/Plp7/WMCd+3QTm8AxhzOH7knbmHII5rLOSMw1z/E1NO+8w5+fkq9bHWEU/9zEf/Yh9jIb7FvFiRXcI3M9nxxfzNfiHy5G7He/DfV/yUG74iDVHbX8vfTvLiz5L8l9Edv376q8Fz1ax5+R+1MhFO8ZLHcpcWm7PZWVVPimr8mK7W1Z9FF4PeLgPHN3y95gv1CV+WJL/7u9lTTrwjDw/UOx3yP6W38ocYpF1JcqcyLv1+Sb6/IixN/3/w6VN0o9z7JtgJ8h5sv5ocLzKh7PxYrocL/a+s/8Gwzcq8pUfAAA=", + "debug_symbols": "tdnbbuIwEAbgd8k1F56xx4e+ympVcQgVEgLEYaUV4t03YTFFyWyq31vfVHWV7yd0nPh0bVbt4vLxvtmt96fm7ce12e6X8/Nmv+ta19usWRw32+3m4/31z43pf1C4X386zHd983SeH8/NWzRp1rS7Vfcb+86vN9u2eRNzm40u5WD4cS0H5ufF/vZz1lCsmp5qprOpmk5V07lquq2a7qqmS9V0XzVdf1adyekS/ic9Vk1PNdOtqZpOVdO5arqtmu6qpguU3gsPiwCLCIuECmdgQbBgWFhYOFjANXdwzZ1ec+8fIhkeigiLhAoxsCBYMCwsLBwsBBYeFnDNBa65qDVPRFk4MxDewIJgwbCwsHCwEFh4WARYRFioNSeiPKwRiRuYYAoMFRguMLbAuAIjBcYXmICbqNY0mPzkBx6OKMnAQq0ni8uzoTjsaYlhYWHhYCGw8LAIsIioIEM40b97ig9iKYyIemPW58mKDX5EEkzI4IRwonZIK3mxa+OYqD3S2vycWInT6wUX8w2JoVG6q5ouVdN91fRQNT1WTU810/Vdvm9LZyj9Tv4xyCXJAxZbGaFQgmIJSgXImhKkvpE85xeyd6O3q76VMk0sThxOBCceJ2ov8CG/kIMZDWH6ZsY0STDRtzO82PxdxoOLvp8xTRgnFicOJ4ITj5OAzkFJ39aYJvDcmMTghHDCOLE4cTgRmOiL/MmRRl/lTxO988fnlNfH8In+nrjpC/0vjBQYvf8nk0cMn17+bQ8TCkwsMAk3+pL/C0MFhguM3g+Se9Ynyci4AiMFxheYUGAiaG5d49f8uJkvtu3jkH192S1fztzPvw/t4Pj9cNwv29Xl2PYH8Z9n8H3foGhnbFx/L32zG03jvdH3Ae6qxyZ0n9l97h8=", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_uninitialized_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_uninitialized_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 20d19df3df0..6e39915bdb0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/brillig_uninitialized_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/brillig_uninitialized_arrays/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -29,10 +29,6 @@ expression: artifact "visibility": "public" }, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -43,8 +39,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/7VWW27CMBC0kxhiUEvVHqAX6EeehI9+IPWhSj2FCeUcHL24tcUyWYha7JWiONn1zOzaG0eKX0sOl3TjjLxD8zFrdy+uszIgVhFTpwyoUxKdyWBAxNMx5/90dw0x1p8GTF4Db0j8VdF0WpxaYP21JpgR8CuPn8XBL6YO53V/ii+A98Y90/3j53gf3UdvzpcfrltxHC8InrV3wuuxNeAF3hPLyGtWPpzRb23u6vAEdfV+wdQh0trXEvgE1EQA/yxy3STweT1YnwRqpxitd4xPwlgxPIrh4bC8byH4NbKmmXkhe9fnMXF4GZMH1ZZAPB0LN4e+e3R3u18rMufcGmUXasd9UzSjJ2B9Or8/pmJo3pcDN/VpyJn6ZsRH+xwthWear+VuCS7GoVa6x3Lwcf06Jzlk+6M/VI271fGHI3X4SgxzpvwK4kv3TOtJ81j/U+euM+WuNjvTmu226c094FtLSJ1C85uuXvVV03ebtjb1cpSfngnYT9xZEvOMPFiF30g1oovrZRFOT6lAz7O727p9EE7s91QM/1sSiM+Z+CmJ8fkuxPDbmsM87hyQoMO/H6upgviXCzmnf8x5wsSnF3Km8+lc5Dl3Tsbosb5dbvqmNcVX+bNnx3rsG3UoSZORDgAA", - "debug_symbols": "tdbLaoQwGAXgd8naRW5/ovMqpQxe4hAQFS+FIr57kzIFay3DWWQjRvKdLI7ov7HGVevj7vt2mNntbWPdUJeLH/qw2vaMVZPvOv+4Hx8zHi/CfO+fx7KPy3kpp4XdBLcZc30T7iQF3/rOsRvxPfuzVUrz3Cr1r63vGRM2ZXieMrxIGC55ynCRMlymDFcpw3XKcILCozCwsLDIYVGgQnFYCFhIWFy/SYp+BKmz0LAgWBhYWFjksChQoTksBCoI7oPgPgjug+A+CO6D4D7MZR+H75XSZyFgIWGhYKFhQbAwsLjsXCr779/A5LAoUGFfdX4Se1h9lJMvq849Z8J27evDiLh8ju40LY7TULtmnVycGw8jYzxb60wXcVCKrxLxjGQ4I5zzBQ==", + "bytecode": "H4sIAAAAAAAA/7VVW07DMBC0k7qNW0ERXIEf+Er6/kHqB3CP0NJz9OjU4FWnk20rwF4piu1dz85O1o41P1YcHhvHPVhjk5h1fNf/syYhVp2Tp03I0wLPojMA8jguLhTnKSb4y4TFe8qbEn9Vz5benFpi/lMPmBnwJ4Lfy4NfDyLO6/4U31DemzjH/pE94sM+eou+6vDcmuN4DHjB3iGvYHvCS9wTi8zfrHk4wz/YKOrwSLqK3yg6ZPr2U0v5DGliKP8ws26W8gkf1qcg7ZzC9U7xWRo7JY9T8mhY4vOKL6EmC6mxb7omvgHlRl+l1C8+r9RjlTwlzbHegP8MuBzHXLGXB+TTem4EPHv7oz+VxsvV8adZRnxnujVjfkfxT3E+BP5Yx/qPPHfLttlN2107b7fb2aa9J/xgBeiE90ppunrzfZTznj3YhM+Zu8JL+PTBZ9LxaRzxaeI76PYCObE3UUtNd1mvlHg8l1Lv2HTvi4r28X2PY0vr1zR1FL+6UHP5y5r7Snx5oWbcj3s5z7m7NvR46jO2mS8+NrN5W3823z177Yx9AYmmGffVDAAA", + "debug_symbols": "tZbLaoQwFIbfJesscjmJjq9SyuAlDgFR8VIo4rs3KVOw1jL8i2zEI+f7sshvcjbWuGp93H3fDjMr3jbWDXW5+KEP1bZzVk2+6/zjfvzMRHxI+90/j2Ufy3kpp4UVUmScub4Jb8oEvvWdY4URO//TqpR9tir61frOmcxSyvOU8ltCuRIp5TKlXKWU65RySik3l3JtfuRGnwkLExlM5DBxQwktYELChIIJjRKEEwQTcEoITgnBKSE4JXSZksP/oelEGAETEiYUTGiYIJgwMHG550pn/54+JoOJHCZe7fmJ2EP1UU6+rDr3nEHata8PI8nyObrTdDJOQ+2adXJxTjmMKDE92nKS8WKOwbCSWx3WCOt8AQ==", "file_map": { "50": { "source": "fn main(x: Field, y: Field) -> pub Field {\n // Safety: testing context\n unsafe {\n let notes = create_notes(x, y);\n sum_x(notes, x, y)\n }\n}\n\nfn sum_x(notes: [Field; 2], x: Field, y: Field) -> Field {\n notes[x] + notes[y]\n}\n\nunconstrained fn create_notes(x: Field, y: Field) -> [Field; 2] {\n [x, y]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 8de1dd5c193..eb61f6793f0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -80,8 +80,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndzdblwpDAfwd5nrXAC2MfRVVqsqbSZVpCiJ8rHSKsq790yVYarYHPT3TdWp+ssw2BzAkHk/3Bx/vP36fvdw+/hy+PbP++H+8ef1693jw/bq/ePq8OP57v7+7tf3v//5kE5/5Nz/gJen64fT65fX6+fXwzdOenU4Ptxsf8uy/YDbu/vj4Zukj3+vDrkknGScFJwQThgngpOKE8VJwwkefcKjT3j0CY8+4dEnPPqER5/w6BMefcKjz/7Hl3YmNRniNkwpfRIlNsRtWEtn0lIzpMNE0oJkMiTjpOCEcMI4cdOylXP0G5noS8WJ4qThpMOkJpxknLjR78SfpDuEcMI4EZxUnChOGk46TDThJOMEj77i0Vc8+opHX/3o5z6IGqI4aTjpMGkJJxknBSeEE8aJ4ASPfsOj3/DoNzz6HY9+96Mv5+m1i1nD9IITWpFuCONEcFJx4kdfB9H6hZTkxiUnpk+TkzSDcgSVCKII4giSCKoRpBHUfFTbQFoM6gGUUwTlCCoRRBHEETTJiH6JU1eDagTpCuWUDfIzYsujgXIyqAeQX0haoRxBZdkRDqII4giSCJpkRKuXjLBII6hFUA8gShGUI6hEEEWQnxFb7W0El7pBfkZsm/aBKhlUI0jXyMwa1CKoBxCnCMoRVCLIX7I1HQmRzPOfJWBqwGjAtIDpuPHLdQszGee5DJTNOlRKBFEEcQRJBNUI0ghqAVQjQ7ZOhmwbK6ltE2ZQiSBaI7OSqhxBEkE1gvzgbgvAM9qWdQa1COoB5JfOtkOegahYRBHkd/mW/aN5anrPr4atkEZQi6AeQH5VbIVyBJUIogjiCIpkRItkRItkRItkRItkRI9kRJ9kRM9jECaz4u0lgiiCJPCM8Atg28numNSoml2xXwJbIT+4xLqHOo5oUm5boBxBJYImz3K99J52gziCJIJqBGkEtQjqATQpty1QjqASQZGMyJGMyJGMyJGMyJGMyJGMmJTbqF9Q/7oup0m5bYHyCrEpIdKk3LZAFEEcQX5GMI0lNpuKDE3KbQukATQpgtU8KpzV3OWhSRFsgfwu5yqjedU2jyNIIqhGkEZQi6AeQJN61gLlCPLjJJe9u5h7ROTXplbI73LhkeXCtnl+71Ua71Tp69KNZDI05JLlYlGOoLJEppZKk2pO1dER1T7LJ4WZBfITtvaBNLFBPYAm1ZwFyhHkd7leVpbKJk6Tas4C+UND5dI8G9xJjUXb2KBo+1psIv9qUm5lpFEjM+f6l5Nyuwz3pmZSm9RYFogiiCNIIqhGkEZQi6AeQJPCzAJFMqJFMmJSY9nP8kmNRfuo+Dazd6dJjWWBNILaGpm10aTysT9yJ5WPBeIIcjtCxim45K/PV/Z37sLnyAoXQ9wY7V33Zn+zuvsu/lZV6jk8YtKU/Y3qPik4IZwwTtzRI3qewaRVQypOFCcNJx0m/rZ0n2Sc+NFXGUQNIZwwTgQnFSeKEz/6dQxkc7OJ/Tsfu4QSTjJOCk4IJ4wTwYkblzoO4Ko5f2N//1j5/FCy+x/2b0PUfn4XTSZh/L3jPpnML2XML2QI/BtI7F9q2CcdJv7edJ9knBScEE4YJ/hSwd+P7mayvxvdJ37yS54nv78T3SeEE4ZHpX+jYJ9UnChOGk46TPwdTRml8u183RDCCeNEcFJxojhpOOkw8Y+W90nGCR59/3xYxqrHLBMnJ7aXe2ndLN8n57U7RCantbsk46TghHDCOBGcVJzgcfG3iHq+qNuSAYqCyf3Kc5vMrUfJHRUlwSLDosCCYOFnVhrlq9QNEZxUnOjio1gBP1aEMvomkyvtNKpcbNJxcgC4Sxgnk2OR0cXVfpaKE8WJH5bLMUA1STk59NsjkyO/XZJxUnBCOGGc4E97xp/2kzPIXYIPSsbnFMHnesHnesHneoFXkyINJ/BqUiq4mvzYXv13/Xx3/eP++PmFR7dvDz//+v6j1/+fjl++Cunp+fHn8ebt+Xj6UqTL9yGd3lpquZJGW1NO46Onq5zS9uJPlZq3VrDq6eUpSFvZbPuvfWvC1ozf", + "bytecode": "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", + "debug_symbols": "ndzRahw7DAbgd9nrXNiWJdl9lcOhpO22BEJS0uTAIeTdO1uynhLJY37dlGzhy85a8ngkO/t6+nb+8vLj893D98dfp0//vJ7uH7/ePt89PmyvXt9uTl+e7u7v7358/vu/T+nyT875D/j18/bh8vrX8+3T8+lTTXpzOj98237KvP2C73f359MnTm//3myk4IRwUnHCOBGcKE4aTjpMSsIJHv2CR7/g0S949Ase/YJHv+DRL3j0Cx59wqNP/sfndiWSDHEvTCm9E6X6kVT3wlq6kpaaIRknZUEyGUI4qThhnAhO3LRs5Rr9Rib6teGkw4QTTjJOCk4IJ270O9V30h3COBGcKE4aTjpMJOEk46TghHCCR1/w6AsefcGjL370cx9EDekw0YSTjJOCE8JJxYkffb7exjubtVIFJ7oi3ZCGkw6TlnDiR18HUTHEjUtOld5NTmweFhpHkESQRlCLoB5APUVQjqDiI2kDaTGIIqhGEEeQRJBGUIugSUb0PU79402rpBRBeYVyygb5GbHl0UA5GUQRVCOII0iWA+EgjaAWQT2A8iQjmuwZYVGOoBJBFEE1gjiCJII0gvyM2HoJI7jUDfIzYitCBpKPxWbxG00rlNeoGVQiiCKoRhBHkESQ/8jWdCREKsZ03PhdpIXJAVMChgKmBsxknucyUBaDJII0gloE9QCqKYJyBJUIikzZOpmybTxJbY+qBkkE6RqZJ6naIqgHEKcI8oO7LVhXtC1DBpUIogjy40Sjqbf9aJFGkD/k2y8bl6dm9Pxu2ArlCCoRRBFUI4gjSCLID27peQQ3mScpvzu2Qj2A/HbXIvf8hlcmHjdLElNt+S2vFfKDS1WPEEeQRJBGUIugHkB+A2yFcgSVCKIIimREi2REi2TEpN1Gume5mhpo0m5boB5Ak3bbAuUIKhFEEVQjaJIRfUfdPO9N2m0LpCtUbWtq0m5boI4jmrTbFsjPiErj0a2aSp8m7bYFogjy4yR5dM7EnEWgSRNsgfwhr8Lj8sRc3qSftUA5gkoEUQTVCOIIkgjSAJp0mXivCdmcg6BJl2mB/CHnOrKcq708f/SExjsJNYMmU4P3LGeLNILaEpkeHfmdnG2DeQyEmHs5+W2ZFfITVvpAmqpBHEESQRpB/pDr/sSi1cRp0pg5RpPGjPJ+eTa4/nGnbTN4FCjaikH+6LUy0qiRGOSPXtune1OzqE06HwvUA2jS+VigEhi9SRND++hQNVMTkn/KaIU4gmSNzJo76XwcZ8Sk87FAJYLcgeCxa8fZzFv/mArXa2S5msD6hfHRMUjyi9Xjd3GnBMs1PGzT1C9UD4lfph6TjJOCE3f2sF7vjNxM9P3y9JgwTgQnipOGkw4TvyRl5UHUkIyTghPCScUJ48SPvoyJbE5ikF+EHpOGk46SmhJOMk4KTggnblxkbBiI2S+ofv0o9XpTss/V1a8epV/fRZMaQjiZrC9lrC9kCKNLUvVruWOiOGk4gf/KoPrV4jHJOCk4qThROJP9cu+Y+MnPeZ78/umAY5JxUuBZ6degx6TihHEiOFGY+AVXGS3YbdPDkIaTDhO/auKxuooBfh2zn9fo2RCFiV+O6PWgVEsGMAr8g9z7cU2zfE1O8R+JBouOiskR/iORYTE5/DHK8dQNIZxUnPDio1ghcC5qR99ktq8o+5aBIRknBSeTTuAYYrGfpeKEceKHZW+XiUnKyU7iIWk46TCZ7CEekoyTghOCc3+yd3hI8AWi45Oy42vKZM/wkHSU8GS/8JAwumyzX0odE8UJ+Ajytr367/bp7vbL/fn9iw2+vzx8/et7Dp7//3n+8JUHP58ev56/vTydL19+sH/vwWUYOacbprxdyiVze7rJKW0v/lR4taabWvny8jJ5eNvw5Jq2S9gu4zc=", "file_map": { "50": { "source": "fn sort(mut a: [u32; 4]) -> [u32; 4] {\n for i in 1..4 {\n for j in 0..i {\n if a[i] < a[j] {\n let c = a[j];\n a[j] = a[i];\n a[i] = c;\n }\n }\n }\n a\n}\n\nfn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //Test case for short-circuit\n let mut data = [0 as u32; 32];\n let mut ba = a;\n for i in 0..32 {\n let i_u32 = i as u32;\n if i_u32 == a {\n for j in 0..4 {\n data[i + j] = c[4 - 1 - j];\n for k in 0..4 {\n ba = ba + data[k];\n }\n if ba == 4864 {\n c[3] = ba;\n }\n }\n }\n }\n assert(data[31] == 0);\n assert(ba != 13);\n //Test case for conditional with arrays from function parameters\n let b = sort([1, 2, 3, 4]);\n assert(b[0] == 1);\n\n if a == 0 {\n must_be_zero(0);\n c[0] = 3;\n } else {\n must_be_zero(1);\n c[0] = 1;\n c[1] = c[2] / a + 11 % a;\n let f1 = a as Field;\n assert(10 / f1 != 0);\n }\n assert(c[0] == 3);\n\n let mut y = 0;\n if a == 0 {\n let digest = std::hash::blake3(x);\n y = digest[0];\n } else {\n y = 5;\n }\n assert(y == result[0]);\n c = sort(c);\n assert(c[0] == 0);\n //test 1\n let mut x: u32 = 0;\n if a == 0 {\n c[0] = 12;\n if a != 0 {\n x = 6;\n } else {\n x = 2;\n assert(x == 2);\n }\n } else {\n x = 5;\n assert(x == 5);\n }\n if c[0] == 0 {\n x = 3;\n }\n assert(x == 2);\n //test2: loops\n let mut x: u32 = 0;\n x = a - a;\n for i in 0..4 {\n if c[i] == 0 {\n x = i as u32 + 2;\n }\n }\n assert(x == 0);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_0.snap index 8de1dd5c193..eb61f6793f0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_0.snap @@ -80,8 +80,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "ndzRahw7DAbgd9nrXNiWJdl9lcOhpO22BEJS0uTAIeTdO1uynhLJY37dlGzhy85a8ngkO/t6+nb+8vLj893D98dfp0//vJ7uH7/ePt89PmyvXt9uTl+e7u7v7358/vu/T+nyT875D/j18/bh8vrX8+3T8+lTTXpzOj98237KvP2C73f359MnTm//3myk4IRwUnHCOBGcKE4aTjpMSsIJHv2CR7/g0S949Ase/YJHv+DRL3j0Cx59wqNP/sfndiWSDHEvTCm9E6X6kVT3wlq6kpaaIRknZUEyGUI4qThhnAhO3LRs5Rr9Rib6teGkw4QTTjJOCk4IJ270O9V30h3COBGcKE4aTjpMJOEk46TghHCCR1/w6AsefcGjL370cx9EDekw0YSTjJOCE8JJxYkffb7exjubtVIFJ7oi3ZCGkw6TlnDiR18HUTHEjUtOld5NTmweFhpHkESQRlCLoB5APUVQjqDiI2kDaTGIIqhGEEeQRJBGUIugSUb0PU79402rpBRBeYVyygb5GbHl0UA5GUQRVCOII0iWA+EgjaAWQT2A8iQjmuwZYVGOoBJBFEE1gjiCJII0gvyM2HoJI7jUDfIzYitCBpKPxWbxG00rlNeoGVQiiCKoRhBHkESQ/8jWdCREKsZ03PhdpIXJAVMChgKmBsxknucyUBaDJII0gloE9QCqKYJyBJUIikzZOpmybTxJbY+qBkkE6RqZJ6naIqgHEKcI8oO7LVhXtC1DBpUIogjy40Sjqbf9aJFGkD/k2y8bl6dm9Pxu2ArlCCoRRBFUI4gjSCLID27peQQ3mScpvzu2Qj2A/HbXIvf8hlcmHjdLElNt+S2vFfKDS1WPEEeQRJBGUIugHkB+A2yFcgSVCKIIimREi2REi2TEpN1Gume5mhpo0m5boB5Ak3bbAuUIKhFEEVQjaJIRfUfdPO9N2m0LpCtUbWtq0m5boI4jmrTbFsjPiErj0a2aSp8m7bYFogjy4yR5dM7EnEWgSRNsgfwhr8Lj8sRc3qSftUA5gkoEUQTVCOIIkgjSAJp0mXivCdmcg6BJl2mB/CHnOrKcq708f/SExjsJNYMmU4P3LGeLNILaEpkeHfmdnG2DeQyEmHs5+W2ZFfITVvpAmqpBHEESQRpB/pDr/sSi1cRp0pg5RpPGjPJ+eTa4/nGnbTN4FCjaikH+6LUy0qiRGOSPXtune1OzqE06HwvUA2jS+VigEhi9SRND++hQNVMTkn/KaIU4gmSNzJo76XwcZ8Sk87FAJYLcgeCxa8fZzFv/mArXa2S5msD6hfHRMUjyi9Xjd3GnBMs1PGzT1C9UD4lfph6TjJOCE3f2sF7vjNxM9P3y9JgwTgQnipOGkw4TvyRl5UHUkIyTghPCScUJ48SPvoyJbE5ikF+EHpOGk46SmhJOMk4KTggnblxkbBiI2S+ofv0o9XpTss/V1a8epV/fRZMaQjiZrC9lrC9kCKNLUvVruWOiOGk4gf/KoPrV4jHJOCk4qThROJP9cu+Y+MnPeZ78/umAY5JxUuBZ6degx6TihHEiOFGY+AVXGS3YbdPDkIaTDhO/auKxuooBfh2zn9fo2RCFiV+O6PWgVEsGMAr8g9z7cU2zfE1O8R+JBouOiskR/iORYTE5/DHK8dQNIZxUnPDio1ghcC5qR99ktq8o+5aBIRknBSeTTuAYYrGfpeKEceKHZW+XiUnKyU7iIWk46TCZ7CEekoyTghOCc3+yd3hI8AWi45Oy42vKZM/wkHSU8GS/8JAwumyzX0odE8UJ+Ajytr367/bp7vbL/fn9iw2+vzx8/et7Dp7//3n+8JUHP58ev56/vTydL19+sH/vwWUYOacbprxdyiVze7rJKW0v/lR4taabWvny8jJ5eNvw5Jq2S9gu4zc=", "file_map": { "50": { "source": "fn sort(mut a: [u32; 4]) -> [u32; 4] {\n for i in 1..4 {\n for j in 0..i {\n if a[i] < a[j] {\n let c = a[j];\n a[j] = a[i];\n a[i] = c;\n }\n }\n }\n a\n}\n\nfn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //Test case for short-circuit\n let mut data = [0 as u32; 32];\n let mut ba = a;\n for i in 0..32 {\n let i_u32 = i as u32;\n if i_u32 == a {\n for j in 0..4 {\n data[i + j] = c[4 - 1 - j];\n for k in 0..4 {\n ba = ba + data[k];\n }\n if ba == 4864 {\n c[3] = ba;\n }\n }\n }\n }\n assert(data[31] == 0);\n assert(ba != 13);\n //Test case for conditional with arrays from function parameters\n let b = sort([1, 2, 3, 4]);\n assert(b[0] == 1);\n\n if a == 0 {\n must_be_zero(0);\n c[0] = 3;\n } else {\n must_be_zero(1);\n c[0] = 1;\n c[1] = c[2] / a + 11 % a;\n let f1 = a as Field;\n assert(10 / f1 != 0);\n }\n assert(c[0] == 3);\n\n let mut y = 0;\n if a == 0 {\n let digest = std::hash::blake3(x);\n y = digest[0];\n } else {\n y = 5;\n }\n assert(y == result[0]);\n c = sort(c);\n assert(c[0] == 0);\n //test 1\n let mut x: u32 = 0;\n if a == 0 {\n c[0] = 12;\n if a != 0 {\n x = 6;\n } else {\n x = 2;\n assert(x == 2);\n }\n } else {\n x = 5;\n assert(x == 5);\n }\n if c[0] == 0 {\n x = 3;\n }\n assert(x == 2);\n //test2: loops\n let mut x: u32 = 0;\n x = a - a;\n for i in 0..4 {\n if c[i] == 0 {\n x = i as u32 + 2;\n }\n }\n assert(x == 0);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 42dc65cf0aa..1a9c2c82ce6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -80,8 +80,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "50": { "source": "fn sort(mut a: [u32; 4]) -> [u32; 4] {\n for i in 1..4 {\n for j in 0..i {\n if a[i] < a[j] {\n let c = a[j];\n a[j] = a[i];\n a[i] = c;\n }\n }\n }\n a\n}\n\nfn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn main(a: u32, mut c: [u32; 4], x: [u8; 5], result: pub [u8; 32]) {\n //Test case for short-circuit\n let mut data = [0 as u32; 32];\n let mut ba = a;\n for i in 0..32 {\n let i_u32 = i as u32;\n if i_u32 == a {\n for j in 0..4 {\n data[i + j] = c[4 - 1 - j];\n for k in 0..4 {\n ba = ba + data[k];\n }\n if ba == 4864 {\n c[3] = ba;\n }\n }\n }\n }\n assert(data[31] == 0);\n assert(ba != 13);\n //Test case for conditional with arrays from function parameters\n let b = sort([1, 2, 3, 4]);\n assert(b[0] == 1);\n\n if a == 0 {\n must_be_zero(0);\n c[0] = 3;\n } else {\n must_be_zero(1);\n c[0] = 1;\n c[1] = c[2] / a + 11 % a;\n let f1 = a as Field;\n assert(10 / f1 != 0);\n }\n assert(c[0] == 3);\n\n let mut y = 0;\n if a == 0 {\n let digest = std::hash::blake3(x);\n y = digest[0];\n } else {\n y = 5;\n }\n assert(y == result[0]);\n c = sort(c);\n assert(c[0] == 0);\n //test 1\n let mut x: u32 = 0;\n if a == 0 {\n c[0] = 12;\n if a != 0 {\n x = 6;\n } else {\n x = 2;\n assert(x == 2);\n }\n } else {\n x = 5;\n assert(x == 5);\n }\n if c[0] == 0 {\n x = 3;\n }\n assert(x == 2);\n //test2: loops\n let mut x: u32 = 0;\n x = a - a;\n for i in 0..4 {\n if c[i] == 0 {\n x = i as u32 + 2;\n }\n }\n assert(x == 0);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 147ec7fb6f4..8a163adafab 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -32,18 +32,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/9VZvY7TQBAe/6zvHBRdBDUSHRQUyTm5pKCIdAn38wYUFL5EeQGERAOyBAUdSBQ0QAMPSpbbIePP41xEdk/cSNHa3s8z3/zs7CaJ6FrS9ScS11Ziagpjpm7s7ycDj7r6keAeim/kkW8ojvEd4JjcAY5pAI5/xECB2oQlSvES4Kz8cmPuxljMewzqIAe7PvVP+sOrXPHPI/8iFzoD6B+x/jSM/v6B0/O8qusnsJsATnuHMWcCc9aCOReY8xbMhcBctGAuBeYSMF13HVGTM8c1RF2v624cOG/DLtVzRcJPtm3C2B5FYI+oXjME9jsUdI0MIrDHfDA+nOsuY6oNH5xLq6YfPGfEHOf3cP15KHBabTHuibh+6q45ZyH7YKh6t/JA4S9tWTmo6K9wPBLxjOPKcT6UeJjLxVxa1e103H0q7EhdzMMA/rG7P3JjJt7h93uK/Qzs13grzzAuuYLPFXy2/jxy1/doszefVht9Pg+OrH8m9IfY++dh9B/bGNk19s7p29Yzd+lpMhc9avY0ntN6v8e8DAL39xOOU0ZN4bkDYVv6iZLAveRtc/NB6EUcbYmnz96F+wf3Dexn6e3wGRrgM3ejzcczYRNzxJzlF2peW0fUrJkMdMWK/0bRpdUfkf98ZIIPUXNPYfsG8DOq85S16rNu7oP/0pbl8hJ4BNp7iy41c4VnwSyM7Z3Pgmy/Q0F712DbupDxkec9rBF+twdzVmbVBodzifIs3qJr7kkX1ta+uni9HVH7mgtcV330Q/akTPE7VvyQ/hp49sKNdg/6LN7B/qn1VIydUfho5wPGyd6gxTgBPuYGPtjjNZvbenyi6DKAX7ox8NlD7alYc4H66Ejroyx4JsL9H0U79zBvW3NfhF7Eoc1Ymd+l7xI1z6SS19SN/T2lR+01HPb3seOS65pz0XZ2Qz6R/zicGODy2o22Zl65ay1WkcC9aYmbR57FtnxJDlo/wVrke0N675JzjH0LPoY612u9hG3J789p5d/+eHK9h1nh3y4MNfuCtG8A/97dd1r8mP4jz9W4HKyKclWOyuVyuCgxTlZiESf5HVrbRyJqrqlT4ZPEf3SjrbNP7vq2zsda7LvUrEGtt7Lc1Nd/CL2II8V3G1/f+S3HxWRxPFyMr0ZFWZzslV9Zs7OqjuF5if8qfPzeopN/v8eawfMwz8merp17DOC/uTHwfzNqf0kU/32voZ//gX/Wp99WxKqr1R8AAA==", - "debug_symbols": "tdjRiuowEAbgd8l1LzLJZJL4KofDUrUuhVKl6oGD+O7bitmVJrvLf5EbMdJvapPOpJ2b2nfb6/tbPx6OZ7X5c1PDcdde+uM4j273Rm2nfhj697fXn5VePjg8jj+f2nEZni/tdFEbY1yjunE/f7N29od+6NTG6fvfRnFEhdOwIFgYWFhYMCxcUbBNguNaCCqkOLtW01NY7daCYGF+EaTXwsKCYeFgIbDwsCjnh3BaQU+voskOJZ8WmzyvgntdMzjVDG5qBrc1g3PN4K5mcKkZ3NcMHmoGr5mhoWaGhpoZGmpmaMAydBEMCwcLgYWHRYBFREXUsCBYwDt6LO/oEpPw6+el6GAhv4mwFh4WARYRFaTLj3FBEomcEcKJwYnFCePE4aS49CypCLHkxOMk4CTChIqrz58FlYPOCOGkOMnOhidxzmakOGNO60S0ZCTAxGj4j5ni5TtvEgk5MTixOGGY2OJZPlfSxwwUb/2YZpiyFziyHhYBFhEVrGFBsCheh1B6axeT5Um5/SA2lW/hLIHL/QeRtDuK+IxYnDBOHE6+2b1SYTFr8E0L4gdAKDAIuM+jf+3Ut9uhe3bADtdx99IQu/w/dave2Gk67rr9deqWLtlXg2xZJBMbGx+VfR6QkYYsPSrdMmRuiGU+53zeDw==", + "bytecode": "H4sIAAAAAAAA/9VYPY/TQBAdf6xzDooSQY1EBwVFfEkuV1BEuoT76OloDKc0CIkGGijcQUEDNPBvyd7tkOfx2Bdddk/cSNGuPc8zb2fGs+tEdC3p5hfB3EpMTWHMwo3j/aTwaGscAfdQfCOPfENxjO8Bx+QecEwDcLwSIwrUJixRipcEzsofN+ZujEHvMahFLvz6tH88nr7JlfV55D/JwWYA+zO2n4axP+45Oy+run0SfhOB055hzClgTlswZ4A5a8GcA+a8BXMBmAuBGbh5RE3OHNcQdb2pu3ngvE0HVM8VwTrZtwnjexYJf0T1miHhv09B35EiEv6Yj4wP53rAmGrLR+rSqrkO1hnQcX4PNr/HgNNqi3HPYP7czTlnIftgqHq38kjhj76s9Cr6JxyPBO5xXDnOB4gXuhx0aVX303fXKfhBW8zDCPxTdz10YwbP8PMjxX8m/Nd4K/dkXHIFnyv4bPN74uYPaLs3n1Rbez4Pjmx/CfZD7P2rMPYPbYzsO/bJ2evqmbv0NMzFiJo9jXVa7/eYlyJwfz/iOGXUFNb1wDeuU0oirpG3zc0XsCtx1BFPn71L7h/cN2Q/S++Gz9QIPis32ny8AJ8yR8wZP6j53RpSs2YyYStW1m8UW1r9EfnPRwZ8iJp7Cvs3Ar+kOk+sVZ9181CsH31ZLq8Ej0B772RAzVzJs2AWxvfOZ0H236egvavoei8wPnjekzXCz46Ezsqy2uKkLlHuxR22Vp5sydra11YqdJhPjiHW95Daz7uytyKfrj6l+ezqU4liywj8azcG3j/VvmCE70C9YKb1Aha5r99m72bedu/+BnYlTvqMFf0uvYOoea5CXgs3jveUEbXXcNj/eA5LrmvORdv5Q/KJ/MfhyAgu791oa+adm2uxigD3oSVuHnlOuvKFHLR+ImuRrw3pvQt1jP0o1hjqbKr1EvaF34Bp5d///Pj6LGaFv78NNfsC+jcC/9ld91vWsbglz/W8LNaTcl3OysvL6dtSxslKDHHC70BtH4mo+U6dwJoQ725f1dlXN7+rM54W+wE1a1DrrSw39fVfYFfiSFn7TfHFmllWdQzrEf8dfPxsscn/AcucyTMV67CnaucOI/A/3Bj4/331/U6U9fuu4d//wfrsmv4CdnDbnhkeAAA=", + "debug_symbols": "tdhRa8MgEAfw75LnPHh6ntqvMsZI23QEQlrSdjBKv/uSUbeijvF/8KXUkt9ZPU+Jt2bfb6/vb8N0OJ6bzcutGY+77jIcp6V1u7fNdh7GcXh/e/65UesH++/nz6duWpvnSzdfmo3Wtm36ab98M2bxh2Hsm41V99e24YAKq2BBsNCwMLBgWNiiYBMFh1QIKqQ4u0bRQxhlU0Gw0P8IUqkwsGBYWFgILBwsyvUhHDPo6Fm02aPkYrLJcRLcqZrBqWZwXTO4qRmcawa3NYNLzeCuZnBfM3jNCvU1K9TXrFBfs0I9VqGrgHd3X97dJUTh0vPZO1j4/4RPRUBFULAgWJRPdC9RhDSDwcCCYWFhIbBwsCjmnCWudpZMBFSQUjghnBTTzj+Fy15lxOCkOMXW+Aex1mSkOGNWqUiUpIQUTjT8x6g4fOt0JD4njBOLE4GJLvbyk0kXMlBc+SHOMGUvCqQDKoyCBcFCw8LAorjoheLboeisTrg4dDFx2xbOCpiLYxeJp6KIy4jGicEJ4+SPszRuLDoDAQRWoYAQcF9aH908dNuxf9y0HK7T7uni5fJ56pM7mNN83PX769yvtzG/FzHrjOvQmvC9Gy4NIt+SNksnS0df", "file_map": { "50": { "source": "fn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn test3(x: u8) {\n if x == 0 {\n must_be_zero(x);\n }\n}\n\nfn test4() -> [u32; 4] {\n let b: [u32; 4] = [1, 2, 3, 4];\n b\n}\n\nfn main(a: u32, mut c: [u32; 4]) {\n test3(1);\n\n if a == 0 {\n c = test4();\n } else {\n assert(c[1] != 2);\n }\n if false {\n c[1] = 5;\n }\n assert(c[1] == 2);\n\n test5(4);\n // Test case for function synchronisation\n let mut c_sync = 0;\n if a == 42 {\n c_sync = foo2();\n } else {\n c_sync = foo2() + foo2();\n }\n assert(c_sync == 6);\n}\n\nfn test5(a: u32) {\n if a > 1 {\n let q = a / 2;\n assert(q == 2);\n }\n}\n\nfn foo2() -> Field {\n 3\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_0.snap index 2d6f8cd1f0d..2748f7a8863 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_0.snap @@ -32,18 +32,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/9VYPY/TQBCddbxOnFN0EdRIdECXxMklQJOC+2gp6GhMjiDRQAMSnX86WW4neZ6Mwwl2TrqVrLW9b+e9+dj1Jo7uWr67HNyHltFxY8w69pP/a9OEtiYOtFvpdQn1WmnMHoHG3iPQmBto/NO8KNCQsJ5SvCRwof2KfRn7DMYTBnVaCt6U9leT+etS8S+h/qoEmwb2F2w/t7E/6Uc775q2fRK8PYHT5jDmEjCXHZgrwFx1YK4Bc92BuQHMjcCM4r2jY80cV4u63tWddd7mI2rnisBP5vY23Asn+IjaNUOCf0ima2TqBB/rkfHhXI8Y0xz0yLG8OfaDxzyMcX4Hu+sZ4LTaYtxLuH8V7zlnlvugVb2H9lTRj1yh9RvaN45HD95xXDnOA8SLsRLG8qbNM4zPOfCgLdbhBf5FfD6PfQFzeP5Y4S8Ef0u38k7GpVTwpYIvdtfzeH8Wr1BD3+O7U3vCfdYsco3peM3ymPU3Sa5nzqOsr/xh9My80PM29iEfM+B08R3GV64D1nhOx3t0IWxliv/+hP84RpQ+HwXoIcU35vcC/0bo7MOclHXzRPiPXEHLB6HD8kxr+P3dnzkLG/v7swXHDmPK3AMb7nufLZh/SKY1tT9bDIQeGR88Pzg6/G7CuWNlDGsQx5CnVHg0W3lCWz6hLa5T3vPQZ46h8ZpR9zBtT83AH7nGcG+Xe9z72Idc/4Q5aBNjl52IXV/Ro32Ptb1Ni3FP6PEn9GjfKJzvO3zDeGq/H73Af4y9dd61bwKe52UuXEfPsZLv5JkIz17rRD6MqTuntv8/zGrOM+ex6ywm9bj0cbjwQsuX2If6/xzvtVg5wH3tiFtCndWpfKEGbX3JWuRnT/paxjHGfhM+Wp3TtbXFXGd0+AbkTXr+5epuTw+Nfxt6aueTBL8X+B/xedjhx/ofdW6X9XRb1dt6Ud/ezje1jFNoGcQpNX+9rFab2Xyz/LSo6urir/y/ASctpn+dGQAA", - "debug_symbols": "tdfNioMwEAfwd8nZw0y+JumrLMti27QIosXahaX03Vel7pYYKHOYS2mKv7+p44hzV8e0v52/mu7UX9Xu467a/lCPTd9Nq/ujUvuhadvm/PX6s4L5w7rl+Oul7ubldayHUe20NZVK3XH+Fid/atqkdg4en5WynisclIQBfAoDLhfIFvqNQMiFYQvLFo4tPFsQW8RiBb1dK0j4KqrNoUhrsZFsFu5BMhwlw7VkuJEMt5LhTjLcS4aTZHiQDJfsUJLsUJLsUJLsUJLsUJLsUOJ16Cw8WxBbBLaIXBGALZAtNFsYtmC/J4Tye4KPqyCTC2KL8E6EXESuiMAWyBbFClq/dpT1eUdFwxaWLRxbFGtu/54MNuR3SSSuQCheXmfCkzhnNqR4tRzASsBviOUTz99Y8e870isJWxL4JLIJAo88ptV3PTT1vk3Pke506w4vE974c0nZsHcZ+kM63oY0j33/E99cLB0rE5e9TwtEXSHSsq9lGSrUMJ1zOu8v", + "bytecode": "H4sIAAAAAAAA/9VXTW/UMBAdJ3F2s9WqKzgjcQNu+0kLXPZAPy7cuCIUqBYu8Bvy07tuPbsvk0lUtZ5KtRTZiV/mPc+MnYmj+1bsLwfj0DLqNsZsYz9/WlsktDV3oN1Kr0uo10pj9gI05i9AY2Gg8a55kaAhYLmSvCRwof2PfRX7DOYTOnVRCd6U9s/n60+Vsr6E+lcV2DSwv2H7hY39+Sja+dq07ZPgzQVOe4cxF4C56MFcAuayB3MFmKsezDVgrgVmGseOuprZrxZ5vc8767itp9SOFcE6mdvbcG+c4CNq5wwJ/gmZ7pGFE3ysR/qHYz1lTHPUI+eKprsOnvMwx/Ed7683gNNyi3HvYfwhjjlmluegVb6H9lrRj1yhjRo6NPZHDs/Yr+znMeLFXAVzRdPmmcT7AnjQFuvwAv8u3p/GvoR3+P2Zwl8K/pZu5Zn0S6XgKwVf7q+3cXwSr5BDf+OzoTPhIXsWuWbU3bM8Z/1NkvuZ4yjzq3gePUsv9HyJfYjHEjhdfIb+lfuANZ5S94wuha1MWb8fWD/OEaWPRwl6SFkb83uB/yx0juCdlHnzSqwfuYKWb0KHZU1r+P091Jyljf1DbcG+Q58y99iG+8G1BfNPyDSnDrXFWOiR/sH6wdHxvwnfnSlzmIM4hzyVwqPZKhLa8gltlWIO46ntTz4btfppqNYbOmfzgbVp56z2D+QF/nvsjfe7eq5hTYqaJA579pV8Jr/rWD9sE61hRv0xtf2HXtYcZ45jXz0h9bj0fvjohZafsQ/5/yOONV85wP3q8VtCnauheKEGbX/JXOR7T/pexjnG/hFrtKo1tb3FXCd0PMeKJj3/2fl9bRUa/994aseTBL8X+H/xftKzju0jde7O6sVuVe/qTX1zs/5dSz+FloGfbgGPiVeC4RcAAA==", + "debug_symbols": "tdfbioMwEAbgd8m1F5PjJH2VZSm2TYsgWjwsLOK7rxbdlWygzMXclEb8fg+TQWYSt3gZH+eqube9OH1Mom6v5VC1zbKa5kJcuqquq8f5eFjA+mPs6/z+WTbrsh/KbhAnZXQhYnNb/4XF36s6ipOF+bMQxlGFhZzQIDehwaZCkoV6IySkQpOFIQtLFo4skCxCtoLO7BVEeRTFv1Ml7sWWaJJwB5zhkjNccYZrznDDGW45wx1nOHKGe85wzg5Fzg5Fzg5Fzg5Fzg5Fzg5FWoeugvzNwOx21y7sAnUqAlV4eCd8KiRZKLLQZJEttnF7BY1LK+gtWTiyQLLI1tz87kTj013iA1WE7Nu12m/C2nSXhOy7sgC7AJcKRxaefFfZJ7eoduFTIQHoRNKJopF5WX2VXVVe6rhND/exuR6GieH7GZO54tm113gbu7hOGH/DxVpbFQodXjeyLCSYQkJYLrJc6Ac=", "file_map": { "50": { "source": "fn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn test3(x: u8) {\n if x == 0 {\n must_be_zero(x);\n }\n}\n\nfn test4() -> [u32; 4] {\n let b: [u32; 4] = [1, 2, 3, 4];\n b\n}\n\nfn main(a: u32, mut c: [u32; 4]) {\n test3(1);\n\n if a == 0 {\n c = test4();\n } else {\n assert(c[1] != 2);\n }\n if false {\n c[1] = 5;\n }\n assert(c[1] == 2);\n\n test5(4);\n // Test case for function synchronisation\n let mut c_sync = 0;\n if a == 42 {\n c_sync = foo2();\n } else {\n c_sync = foo2() + foo2();\n }\n assert(c_sync == 6);\n}\n\nfn test5(a: u32) {\n if a > 1 {\n let q = a / 2;\n assert(q == 2);\n }\n}\n\nfn foo2() -> Field {\n 3\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 2d6f8cd1f0d..2748f7a8863 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_2/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -32,18 +32,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/9VYPY/TQBCddbxOnFN0EdRIdECXxMklQJOC+2gp6GhMjiDRQAMSnX86WW4neZ6Mwwl2TrqVrLW9b+e9+dj1Jo7uWr67HNyHltFxY8w69pP/a9OEtiYOtFvpdQn1WmnMHoHG3iPQmBto/NO8KNCQsJ5SvCRwof2KfRn7DMYTBnVaCt6U9leT+etS8S+h/qoEmwb2F2w/t7E/6Uc775q2fRK8PYHT5jDmEjCXHZgrwFx1YK4Bc92BuQHMjcCM4r2jY80cV4u63tWddd7mI2rnisBP5vY23Asn+IjaNUOCf0ima2TqBB/rkfHhXI8Y0xz0yLG8OfaDxzyMcX4Hu+sZ4LTaYtxLuH8V7zlnlvugVb2H9lTRj1yh9RvaN45HD95xXDnOA8SLsRLG8qbNM4zPOfCgLdbhBf5FfD6PfQFzeP5Y4S8Ef0u38k7GpVTwpYIvdtfzeH8Wr1BD3+O7U3vCfdYsco3peM3ymPU3Sa5nzqOsr/xh9My80PM29iEfM+B08R3GV64D1nhOx3t0IWxliv/+hP84RpQ+HwXoIcU35vcC/0bo7MOclHXzRPiPXEHLB6HD8kxr+P3dnzkLG/v7swXHDmPK3AMb7nufLZh/SKY1tT9bDIQeGR88Pzg6/G7CuWNlDGsQx5CnVHg0W3lCWz6hLa5T3vPQZ46h8ZpR9zBtT83AH7nGcG+Xe9z72Idc/4Q5aBNjl52IXV/Ro32Ptb1Ni3FP6PEn9GjfKJzvO3zDeGq/H73Af4y9dd61bwKe52UuXEfPsZLv5JkIz17rRD6MqTuntv8/zGrOM+ex6ywm9bj0cbjwQsuX2If6/xzvtVg5wH3tiFtCndWpfKEGbX3JWuRnT/paxjHGfhM+Wp3TtbXFXGd0+AbkTXr+5epuTw+Nfxt6aueTBL8X+B/xedjhx/ofdW6X9XRb1dt6Ud/ezje1jFNoGcQpNX+9rFab2Xyz/LSo6urir/y/ASctpn+dGQAA", - "debug_symbols": "tdfNioMwEAfwd8nZw0y+JumrLMti27QIosXahaX03Vel7pYYKHOYS2mKv7+p44hzV8e0v52/mu7UX9Xu467a/lCPTd9Nq/ujUvuhadvm/PX6s4L5w7rl+Oul7ubldayHUe20NZVK3XH+Fid/atqkdg4en5WynisclIQBfAoDLhfIFvqNQMiFYQvLFo4tPFsQW8RiBb1dK0j4KqrNoUhrsZFsFu5BMhwlw7VkuJEMt5LhTjLcS4aTZHiQDJfsUJLsUJLsUJLsUJLsUJLsUOJ16Cw8WxBbBLaIXBGALZAtNFsYtmC/J4Tye4KPqyCTC2KL8E6EXESuiMAWyBbFClq/dpT1eUdFwxaWLRxbFGtu/54MNuR3SSSuQCheXmfCkzhnNqR4tRzASsBviOUTz99Y8e870isJWxL4JLIJAo88ptV3PTT1vk3Pke506w4vE974c0nZsHcZ+kM63oY0j33/E99cLB0rE5e9TwtEXSHSsq9lGSrUMJ1zOu8v", + "bytecode": "H4sIAAAAAAAA/9VXTW/UMBAdJ3F2s9WqKzgjcQNu+0kLXPZAPy7cuCIUqBYu8Bvy07tuPbsvk0lUtZ5KtRTZiV/mPc+MnYmj+1bsLwfj0DLqNsZsYz9/WlsktDV3oN1Kr0uo10pj9gI05i9AY2Gg8a55kaAhYLmSvCRwof2PfRX7DOYTOnVRCd6U9s/n60+Vsr6E+lcV2DSwv2H7hY39+Sja+dq07ZPgzQVOe4cxF4C56MFcAuayB3MFmKsezDVgrgVmGseOuprZrxZ5vc8767itp9SOFcE6mdvbcG+c4CNq5wwJ/gmZ7pGFE3ysR/qHYz1lTHPUI+eKprsOnvMwx/Ed7683gNNyi3HvYfwhjjlmluegVb6H9lrRj1yhjRo6NPZHDs/Yr+znMeLFXAVzRdPmmcT7AnjQFuvwAv8u3p/GvoR3+P2Zwl8K/pZu5Zn0S6XgKwVf7q+3cXwSr5BDf+OzoTPhIXsWuWbU3bM8Z/1NkvuZ4yjzq3gePUsv9HyJfYjHEjhdfIb+lfuANZ5S94wuha1MWb8fWD/OEaWPRwl6SFkb83uB/yx0juCdlHnzSqwfuYKWb0KHZU1r+P091Jyljf1DbcG+Q58y99iG+8G1BfNPyDSnDrXFWOiR/sH6wdHxvwnfnSlzmIM4hzyVwqPZKhLa8gltlWIO46ntTz4btfppqNYbOmfzgbVp56z2D+QF/nvsjfe7eq5hTYqaJA579pV8Jr/rWD9sE61hRv0xtf2HXtYcZ45jXz0h9bj0fvjohZafsQ/5/yOONV85wP3q8VtCnauheKEGbX/JXOR7T/pexjnG/hFrtKo1tb3FXCd0PMeKJj3/2fl9bRUa/994aseTBL8X+H/xftKzju0jde7O6sVuVe/qTX1zs/5dSz+FloGfbgGPiVeC4RcAAA==", + "debug_symbols": "tdfbioMwEAbgd8m1F5PjJH2VZSm2TYsgWjwsLOK7rxbdlWygzMXclEb8fg+TQWYSt3gZH+eqube9OH1Mom6v5VC1zbKa5kJcuqquq8f5eFjA+mPs6/z+WTbrsh/KbhAnZXQhYnNb/4XF36s6ipOF+bMQxlGFhZzQIDehwaZCkoV6IySkQpOFIQtLFo4skCxCtoLO7BVEeRTFv1Ml7sWWaJJwB5zhkjNccYZrznDDGW45wx1nOHKGe85wzg5Fzg5Fzg5Fzg5Fzg5Fzg5FWoeugvzNwOx21y7sAnUqAlV4eCd8KiRZKLLQZJEttnF7BY1LK+gtWTiyQLLI1tz87kTj013iA1WE7Nu12m/C2nSXhOy7sgC7AJcKRxaefFfZJ7eoduFTIQHoRNKJopF5WX2VXVVe6rhND/exuR6GieH7GZO54tm113gbu7hOGH/DxVpbFQodXjeyLCSYQkJYLrJc6Ac=", "file_map": { "50": { "source": "fn must_be_zero(x: u8) {\n assert(x == 0);\n}\n\nfn test3(x: u8) {\n if x == 0 {\n must_be_zero(x);\n }\n}\n\nfn test4() -> [u32; 4] {\n let b: [u32; 4] = [1, 2, 3, 4];\n b\n}\n\nfn main(a: u32, mut c: [u32; 4]) {\n test3(1);\n\n if a == 0 {\n c = test4();\n } else {\n assert(c[1] != 2);\n }\n if false {\n c[1] = 5;\n }\n assert(c[1] == 2);\n\n test5(4);\n // Test case for function synchronisation\n let mut c_sync = 0;\n if a == 42 {\n c_sync = foo2();\n } else {\n c_sync = foo2() + foo2();\n }\n assert(c_sync == 6);\n}\n\nfn test5(a: u32) {\n if a > 1 {\n let q = a / 2;\n assert(q == 2);\n }\n}\n\nfn foo2() -> Field {\n 3\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index cc1b3e2fa07..671f77384fe 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -36,18 +36,14 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+1ZPW8TQRCd+3QuyEoENRIdSDQ++xwHKiRCPnoK2sNJOgpaaI6Of4BER4vEf8Sb7JDnd+OLQ24jBzGStXe3c/NmZ+fN7p4juZR08Yvg2kksbVGdV74d3U7KHm2NIvA9lL9Rj/6G8jG+Bz4m98DHNICPF5JRgroJS4zkFdJz8su3hW9j6O8xqGVBuH3a3x9VdWGMr0f/JwXYDGB/qvbTMPZHA2/nTbNsXwg3IT3rHdU5BJ3DFTpHoHO0QucYdI5X6JyAzgnpDP11JG2fNa4h8nqRd3uB560ayvJcCYxTsbMw2NOI8ESWc0YIf1uCcqSMCE/94fjoXA9Vp7nyh/vSpj0O7cugT+d3a/F7DHpWbqneM7h+7q91zkLWwVD57uSR4T9iORk08kc0Hgk807hqnLdQn/oK6EubZZxtf58CDtpSPzLSf+rvd3ybwzv6/q6BnxP+kt/GM45LYegXhn6++D3x1w/kam1+3VzZ63NO1f5BGPulG4PjwGdvb52aFqiejtetaYp/VzUtJX+6ahrXfH13V9r1UXNmaOBEK1r1gZ/FhMNz5CT0PonXgEza8cL6lJH+O986jr0knwOto3sa+1zaon0DwOa6gZLQPfrtOPYF7LIeY2K8BhSLQOvHuGsNX7WmYOzyFfqYD6h/CLH5djdjvPF8J9S3ZYxr3VyIYbzfwS7rsT8YS/VtR+y5cBKY5yPOE13jGVN9i6UdL8wxrgNvIU4/aXz4oSoxnnEdtPLWqpGq5/Lio7/+X3vatWdTYtHFS2vNVLkuTjfhJc4H89LKu03hpfp2U15+gDgxL3l/ws+Ye1bdsniJ+27lpRVj5nJyjT8HzbIt65wY8jxYnY1H7Cvul7rqOud3H/4spMzIn0+EG+rc+pDGg1h4xkqb/vFn+5e8caLn20zadQLxM9L3zcV5hMdxmw/L57O6PJ/U5/W0Pj2t5jXHSShOeI7rkwddHI8NW4ydS3dec9599S3uC4cGHvMi5LkG8UTsc6k+25agfCm75tbaC/H5Et/t2gtF1Ic4qYGza/Thd5FNtGXtsZFTfXO6mtazeT0ryxdVeVaV07/htDXuLk5b/yV0cdrawzN2Luud7VX/h283hNNrf2v61zh91/lezyb783E1n72fTurJ3rVr2G+0mT1+pSAAAA==", - "debug_symbols": "ldjdiuJAEIbhe8mxB13dXf3jrSzL4E8cAiFK1IVFvPdJxDhD0oy8J2KFPDTk61SHulX7env9/Gi6w/Fcrf/cqva421yaYzdUt/uq2vZN2zafHz8vV2b88f5x//m06cbyfNn0l2otxqyqutuP/2Twh6atq7Wa+99V5RWLgEXEImGRqVCDhWBhsXBYlDMXmYSEuVAsinlY8U9hnZmLTEUwWAgWFguHhceimId19iXiXAQsIhYJi0xFLGf+2u3WpbkQLCwWDguPhWIRsIhYJCwyFQlnnnDmCWeecOYJZ55w5glnnsonp89Tbw86F5mKbLAQLCwWDguPRfnkdPoSeS4CFhGLhEWmYvgC4UQ4sZw4TjwnykngJHKSOOHpC09fePqCm7BIuQtrnMjiHRZRTsIbEt2CRE4SJxkTazgRTFxxFXXhSdSbBRFO7DviF8Rx4jlRTop7TO10GqlbPuTISeIkY+INJ8KJ5cRx4jlRTnj6nqfvefrlYYF3U0/2y56sgZP4hni7IImTjEl5KvE7EU4sJ44Tz4lyEjiB6d+H6t+mbzbbtn7ORA/XbvdjRHr5f6pn09JTf9zV+2tfj3PT75Hp+BiH/e/y48toKMS6ldj0OF3HUmUl6oY1h3W/AA==", + "bytecode": "H4sIAAAAAAAA/+1YTW/TQBAdxx+Jg6JGcEbiBhKXOHWawgmJkrY3/oLVNge4wI2jb0jcuPJriekOeX4euyn1VinqSNHa3ud5b2dndtcJ5NqizS+A68oG0jTFvHPt7G6W9ehrFoB2X3qDHvX60jh4ABrDB6Ax8qDxj8WUoNWEhUbyCuEq++Xa1LUD6O8xqFlKvH36P57lRWqMr0f9hyn49OB/of4jP/5nQ+fnQ1n3L8QbEs56RzErwKxaMKeAOW3BnAHmrAVzDphzwkzcdSBNzRpXH3m9ybsjz/OWT6Q+VwLjVO7YD/ciID6Res4I8Y/Fa41kAfGpHo6PzvVEMeVWD/dFZXMc2hdDn87vaPN7DjgrtxT3Cq5fu2udM5/roK98r+yZoR+5KhuW8tc0HiE807hqnEeIp74U+qKyzjN29xHwoC/VERP+pbs/cG0C7+j7U4M/If6abuMZxyU18KmBTza/F+76iWz35vfl1l+fc6r+T/z4z6oxVDXw2fnbZU3ztJ7Od13TlP++1rSI9HStabzm67tTaa6PmjMTgydoaVUDPxsQD89RZb7PSbwHxNKMF65PMeE/uraqsbek2dM+eqSxT6Rp2jcEbl430EK6R91VjX0Fv4xjTozXkGLhaf+Yd+3hbXsKxi5pwWM+IH4Fsfl+P2O89XyH1DcyxrVrLgxgvD/AL+NYD8ZStVl1rrhqbIW7fqyfZv3sSyy6csta99VuitNtcgvnoyu38PyjuXVgaOV8DEl3QDpOyrov67zu81yeX81nrBX3LV7r2vSI9HfuiEnPJ+L19f3wlMaDXHjWjcr++ZfH13/qVqbfGbE0cx35Y8J/cfdjYxx3+YNvvSyy9WGxLhbF5WV+UXCchOKE5+k+6yAw3uM8RV/MnUh3XnPefXMt7s8Tg4/rwuf5EvlE7O8DfTYWr/WSdc0txoe/D6yzedd+HlAf8kQGz9Tow+/TffRlnXWwpvqu6XxRLC+KZZa9ybOrPFv8S01b4+6qaes/3a6aDo1YMHciu31jKf6na/ekpnf+5v/favqmfP8NtHhbMK0dAAA=", + "debug_symbols": "ldjdqqMwEMDxd/G6F5lMPkxfZVkOtrUHQWyx7cJS+u4bS+0eNFD+N+KIP4LOOIa5V4d2d/v+6obj6VJtf92r/rRvrt1pyNH9sal2Y9f33ffXz8uVmQ7OPe+/nJthCi/XZrxWWzFmU7XDYTqT7I9d31Zbbx6/N5XzWAQsIhY1FokKb7AQLCwWikU55yKzkLAUHotiPqy4l7BqliJREQwWgoXFQrFwWBTzYdW+RVyKgEXEosYiURHLOX9Xu9V6KQQLi4Vi4bDwWAQsIhY1FXW5i7o095Lgl0KwsFgoFg4Lj0XAovznVP8WaSlqLBIVyWAhWFgsFAuHhccCf4Op/A36OItVlaRERd5PfCBRV0Q4sZwoJ44Tj4kUV/EaXsQ7syKek/CJuBWJnNScJExssca8ndud19VLtsKJ5UQ5cZx4TgInkZOak4SJ8uwrz77y7GvxWZzOHdmtOrI4w4l8IM6uiOVEOXGceE4CJ5GTmpOEiTecwOw/cvSnGbtm17evIc/xNux/zHyuf8/tYvxzHk/79nAb22kQ9H8GNJVErn9Nzx9dDsTEjYh9dvEpzLsV0ZjXzOv+Aw==", "file_map": { "50": { "source": "fn main(a: u32, mut c: [u32; 4]) {\n // Regression for issue #661:\n let mut c_661: [u32; 1] = [0];\n if a > 5 {\n c_661 = issue_661_foo(issue_661_bar(c), a);\n } else {\n c_661 = issue_661_foo(issue_661_bar(c), a + 2);\n }\n assert(c_661[0] < 20000);\n}\n\nfn test5(a: u32) {\n if a > 1 {\n let q = a / 2;\n assert(q == 2);\n }\n}\n\nfn issue_661_foo(array: [u32; 4], b: u32) -> [u32; 1] {\n [array[0] + b]\n}\n\nfn issue_661_bar(a: [u32; 4]) -> [u32; 4] {\n let mut b: [u32; 4] = [0; 4];\n b[0] = a[0] + 1;\n b\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_0.snap index 973f9aacfbc..a17c2bdc5e6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_0.snap @@ -36,18 +36,14 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+1ZvY7TQBAe/yXnoCgR1Eh0INHYifMDFRIhdyfxAhQUJncpeAEKGhfQQMcbICHxmmTJDhl/HjtG5w0cYiVrbe/sfLOzM99sHI/2Ldxdnrg3zadqY5lntk9u1tIOdSWesN2VvV6H9rqy0b8FNga3wMbQgY0/WwQBajYsUIKXQM6077aPbe+L8Q6dmsaA26X+ZZLlsbK+Du2fxkKnA/0z1h+60Z/0rZ4XRVk/AW4ActocllkLmXWNzLmQOa+RuRAyFzUyl0LmEmSG9t6jqs3sVxdxvYu7ueN9y4ZU3isS62TsyA32zAM8onLMEOAPyGmOpB7gsT3oH97rIcsUB3twLCyq6+CxSIzx/p7trvtCTostlnsk7h/be94zlzzoKt5Nu6fYL7FM6xf0q7E/AvGO/cp+PpPyMBaLsbAo4wzscyhwpC62IwL5h/Z5ZPuemMPzxwp+D/BLdivv0C+xIh8r8r3d9cDe36FDbX5eHPR1uaesf+VGf2rWYHLgo9XXhtMc8emkLacx/qk4LQR7mjgNOZ/njqnKjxwzQwXHq+nZBnznAw7ukWmuz0lYAyKq+kvyUwTyr21vcuwp2Oyojs7Z9z2qNh7rC2zkDdkCeJZ2mxz7LPSiHGJKf/XBF47qx6SphtfVFOm7Xo28jAcpvxa++Qo6fcUG6d9Vse9HLezzj6wnAvngyHp8WA/Lv1TWo51/kU8d5WNrPuV3A3J3/kkEnwZgD/qniU957lgZ43kj0uPgBD5PMIdC0jnQF2vFdcj8Q458ZXsTY99gfVqcy3dYI7SY1uoHy5l8eG/v//NyGb+ON5s4y1fsacoRLZ4Ru1cjz/ownt7a/nc5y2UNIjrOWYx/Ks5qqiFEzZyFuaXx2b/MWe9s/6c5Szsr4JxjtWlVlHVpOebyO0J2PUnQ1oiaOUKzh6i7HMFz0AfAdfW94y6sR2LJ3+Zh0T3+YrnPG9P4u0hE1Voj8SOQ/2SfB8o6bvKHxHaRp9tpvs1n+dVVtsnRTwR+kr//u8wDT5mn5TjrQuy6Wsb6MO6+2F6rZRLvRLza+hstnr9d/c/T5mxBVK1l2reEJs71YEzihArOWBmT39P+Rl14RkLu6Tqns1m+2OSLNH2SpddZOjuW013j54vpcjPJNos3s2k+nR/llB8lVauWbSAAAA==", - "debug_symbols": "tdndavJAEAbge8lxDnZ2dvbHW/n4KFFjCYQoUQtFvPcmYqxNlpa3dE7ElX3ehUzWDNlLsa3X59eXptvtj8Xq36Vo95vq1Oy7YXS5lsW6b9q2eX15/rkw44dzt/nHQ9WNw+Op6k/Fiowpi7rbjt9o8LumrYuVmOv/snACCw+LAIsIi4QKMbAgWFhYMCzyNSeaBPm5EFhk62HJ3YVlMxcJFd7AgmBhYcGwcLDI1sOyfYgwFx4WARYRFgkVIV/zx91uOT6LcjHV8TTVfZ06hpNmuP27cGfn4awZ7jTDRTPca4YHzfCoGZ4Uw6PRDCfNcM0dGrEdOgoHC4GFh0WARYRFQkUysCBY5Bstl6YmyMtcOFgILDwsAiwiLBIqhoY1S1geJP3+4Ts0warp9u/SF/8cZFg13ammi2q6V00PqulRNT1pppNRTSfVdNW9SthevRGHE8GJx0nAScRJgok1OCGcwB0b2XzLJmEiy8eeFZz4H0jgBQk4iThJMGGDE4KJy64i7O9EnFkQwon9ibgFYZw4nAhOsveY2KmBE15e5ICTiJMEk/x72+8J4cTihHHicCI4wasvePUFrP51GL1VfVOt2/p+sLE7d5unc47T+6GeHXkc+v2m3p77ejz8+Dz3GK/8sBCnW7M0DIi5JI63J9I49FSS52HNYd0P", + "bytecode": "H4sIAAAAAAAA/+1ZzW7TQBAe/yV1UNQIzkjcQOJit05TOCER0lbiygOYtrlwhQtcLN4AiQcmS3bI+PP4B9VTUYmRorW93843Ozsz63UC2ku8+wXi2klITWHMG99md5N8RF1ZIGy3sjcY0V4rG8MHYGP0AGyMDWz8LQkEqFuwSAleApyTn75NfRuK/hGdmqfAO6b+86woU2V+I9p/mgqdBvqXrD+20Z9NvZ53VV0/AW8EOG0MYzYCs2nBXAjMRQvmUmAuWzBXAnMFmLm/DqhpM/vVIq53cXdmvG7FnOprRWKezJ3YcC8D4COqxwwB/4xMcyQPgI/tQf/wWs8ZUx3swb64as6D+xLRx+t7tPs9FTgtthj3Qly/9Ne8ZpZ10CrenTxR7JdcTqYV/RH2RySesV/Zz0cSD32p6IurOs/M38eCR+piOxLAP/f3x76diDE8fqHwT4C/ZrfyDP2SKvhUwU92v2f++hEd9ua31UHfmGvK+tc2+nM3B5cDX7y+ITXNqJ6eDK1pzH9fNS0Ge7pqGtZ8HrugZn3kmJkrPEFLyzbgsxB4cI2cWL8n4R6QUNNfsj4lgP/gW5djr8Fmo330jH0/oaZw31RwY92QEsG9tNvl2DehF3HIKf01BV8Y7R8nXXt4254ifTdpwct4kPiN8M0P0BkqNkj/rqt9ezzAvrBnPgngo575hDAfxr9X5qO9/2I9NcrHwfWUn83I7v0nE/U0AnvQP131lMculL6uGsj63Zp+8tf/a0udvy33u/IuVOzpWmfMTY170oJnfbhvfPTt3+adZR0l6s875r+vvOuqg0TdeYe51ZWTfXmn1Wwc01cj1lVdlxYnlue54vYkQ1vl+44W55o9ROOtM+5Hn4HX6tz5GOYjueQZKa7G51+d7/8McMLn04Sa9VLyJ4D/6u9nyjzu8mF4uyrz7Wm5LZflzU1xXaKfCPwkz2Fj5kGgjMM4lbq63oO0uMa4++5brR5LPswLy3OJ5CMa9h5k9b19yP5I1KzH2pmuq+YG0Cd5YoVnofTJ7xr/oi7c57H2jJ3TxbJcXZerPH9V5LdFvuzL6V+8fK4OdR0AAA==", + "debug_symbols": "tdjfiuowEAbwd+l1LzKZyT9f5XBYqtalUKpUPXAQ333bYl23DSzfsnMjRvL7Ak6SprkV+3p7fX9rusPxXGz+3Ir2uKsuzbEbWrd7WWz7pm2b97fXnwszfohM/c+nqhub50vVX4oNGVMWdbcfv9HgD01bFxtn7n/LQhwsPCwCLCIsEiqcgQXBwsKCYZGvOdEsyC+Fg0W2HpbkISybpUio8AYWBAsLC4aFwCJbD8v2KcJSeFgEWERYJFSEfM2fs91yfBXlqqvw3FW+dh3DSTPc/l642GU4a4aLZrjTDPea4UEzPGqGJ8XwaDTDSTNcc4VGbIWOIv/QlTQ/dL1bCg+LAIsIi4SKZGBBsMgftNg9Rfr5Xp9YM1x+L3w1TZPTDPea4UEzPGqGJ8Xw4UVANZ1U061qOqumi2o6tk4ngp1XJpI/hbgwk9W2SibBhMw3JPCKEE4sThgnghMHE5sdxbF/ECdmRRxO/HdEViTgJOIkwYSzc8zZ+YDgePUnM+HE4oRxIjhxOPE4CTiJOEkwEbz6gldfwOrfh9a/qm+qbVs/LmoP1273cm97+X+qF1e4p/64q/fXvh4vcz/vccdZNAzEadqDhwZRKMnaaYMZm+JKkjCMOYz7AQ==", "file_map": { "50": { "source": "fn main(a: u32, mut c: [u32; 4]) {\n // Regression for issue #661:\n let mut c_661: [u32; 1] = [0];\n if a > 5 {\n c_661 = issue_661_foo(issue_661_bar(c), a);\n } else {\n c_661 = issue_661_foo(issue_661_bar(c), a + 2);\n }\n assert(c_661[0] < 20000);\n}\n\nfn test5(a: u32) {\n if a > 1 {\n let q = a / 2;\n assert(q == 2);\n }\n}\n\nfn issue_661_foo(array: [u32; 4], b: u32) -> [u32; 1] {\n [array[0] + b]\n}\n\nfn issue_661_bar(a: [u32; 4]) -> [u32; 4] {\n let mut b: [u32; 4] = [0; 4];\n b[0] = a[0] + 1;\n b\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 3b6b751e7e9..25e893a1043 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_661/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -36,18 +36,14 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/9VYTW/bMAylP+TUKYIE23nAbttudmLPKbBDD0vb/YEddhjgps11h103wFiBAfvXi1uxoV+o9MsKWgGGZOuJfKRI2nJANy1eX4EYty2k7caYY9tnT2t5j7KyQHD3xTfoka8vjuEL4Bi9AI6xB47XzUCAthsWKcFLgGvbP9untg/FfI9OzVPQ26f8eVYcpYp9PfKfpUKmB/kly4/9yM8GVs7npiufQG8EOG0NYxYCs3BgTgTmxIE5FZhTB+ZMYM4AM7LjgLY5s199xPU67nzvWzGi7l6RsJN1Gz+6ywD0EXVjhkD/kLzmSB6APuaD/uG9HjGm2fDBubjZtoPnjJjj/T1YX28ETostxr0X4w92zHvmsw76ive2vVb4S11tGzR029gfkXjGfmU/H0g8zKViLm66eob2PhZ6pCzmYQD/zt6PbZ+INbx+ouhPQH+Ht/IM/ZIq+FTBJ+vrrR0f2quNod+8hrzmWcZxLb8f9lRzpo+tOZ7q786aI/0j60o7lyhcJ8pcBOu0On8fn0gOE3K/3z2/r0r0l6Ftf8n64ZnP7f4NqOs7rFusf0zbezQQtkjbvtm+xX4C20JFX6LoQ38lDnzo4HBs+7Y+XNnxPnJU8pM2ajmKe5A48AnYyPiFYmMA6yWHUJG5y88hYCQHxn9ROOD7n+j510lf57tddVL657F1km0ak/v7w7PPM4z7WNhoFK6hYofMGQPPvtq+jbG/IE+L8121X4tp7b0gvzl+wpp91bDvtLH7yiFTctBsw71x5bcBDow/Vzho50rMb0/5dO/8Zv1DxR8+8luLCS0OtfzGGNVyf0zuPX4u+R0KWx+S3z9sr+W35letbk7IXf+0/GaczG+thuKaSOEj8fi9pJ2BfZ51i8tphlwN7a4RGh+i/nLEAJ9foNfXmfwV2CN1HdLm327c9K+/mt/kTdv47G6oGz8E+g3g/9j7oWLHU36ar6o6X83qVV3WFxfFskY/Efipb/1FWVfLusrzoyK/LPJy3/rrajZfTotldV7O6tnHO+3/D7rt/7q9GwAA", - "debug_symbols": "tdjdaupAFIbhe5njHMxaa369lc2mRI0lEKJE3bAR772ToNamoeUrXSfiSJ43YJxknIvZNuvz60vb7/ZHs/pzMd1+U5/afV9Gl2tl1kPbde3ry/PHxo4vjqfjj4e6H4fHUz2czIqsrUzTb8d3VPyu7Rqz8vb6tzJOYOFg4WERYBFhkWCRUeEtLAgW8DX3y9ec6C4ozIWDxeI1Z3I3wWKfRfXpUC/hdqh3dh4PmvGoGA/2F+NuHifNOGvGRTO++ONl4Uc8zoWHRYBFhEWCxeINix+3Bpb09dfq5H6oczyLR6sZJ804a8ZFM+40414zHjTjUTOeNOOaMzRhM3QUBAuGhcDCwcLDIsAiwiKhIi+vH12+r7uC//lzMZNmnDXjohlfXuuKf8Tzz6dk9prxoBmPmvGkGc+K8fI/S7VOqnVWrYtq3anWsXk6kYCTiJOEkwwTsjghnDBOBCfwWqDsZiwSH+/k4/NlIhEn6RsS5RPJMGGLE8IJ40Qwci2jf/XQ1uuuuW2E7s795mlf9PT/0My2SA/DftNsz0Mzbpa+75OOp+ZcSZ7mRxkQ+4rETt/xOBQqQynnLOd9Aw==", + "bytecode": "H4sIAAAAAAAA/9VYPW/bMBA9fTpyYNho5wLd2m5SIsEJ0CFDnaRrhw7dBCee2qUFOuun12x4yenpqAaJzmgICKTMR753x+PRVER3Jd0/kWi7EtOwMObC1+XzSjXhXGUktFvpjSbUa6UxfgEakxegMTXQ+LdkEKBuwRIleAlwrvz2deHrWPRP6NSqAN4p5z8r6/NCsW9C/aeFmNNg/obnT23mL2d+nk9df34C3gRw2hjGbARmE8BcCsxlAHMlMFcBzLXAXANm4dsRDTWzXy3ieh931utWL6i/ViTsZO7MhruJgI+oHzME/HMy3SNVBHysB/3Da71gTPegB/vSbmgH92Wij9f3aP+8ETgtthj3XrQ/+DavmWUetIp3V14r+iWXK7OO7gv7IxG/sV/Zz0cSD32F6Eu7Ps/cv6eCR87FOjLAv/PvS1/nYgyPXyn8OfD3dCu/oV8KBV8o+Hz/vPXtY/+4GPrBY8h0n5Uc1/L/w4FyzslTc45R/h3NOdI/Mq+4vlzRulL6Ehin5fnH+ERqWFH4fDc+rxr0V0ZDf8n8Yaznfv1m1Pcd5i3mX9JwjWbCFmnbF1877EewLVb4coUP/ZUH8HFAw4WvXX745duH2KNSn7RR26O4BnkAn4ONjN8oNkYwXmqIlTnH/BwDRmpg/GdFA57/RP9/nrS6343lSemfp+bJCPqkrfLc3MKYQ+3Dr77WYnTMJ7gHJF8oRjPQwPhvigbtboQxahQTj45R5p8r/rCIUS0mtHNUi1E8Y8fiV9rK88sYXQbslWOSEa3auaXdRSzvHPXtSYla5Zmvxbmmh2i6dc5Az3fgtbobvQJ7JNcxPXxjS7vp+ddndx+sXeE7VEb9+CHgzwD/07/PFTue8/Fyt26r3Wm7a5v25qbetugnAj9NzV837XrbrqvqvK5u66r5F/8fa6b9NsUYAAA=", + "debug_symbols": "tZhta4MwEID/Sz77IZfcJaZ/ZYxiW1sE0WLtYJT+9yWlds6Gjdt2X8STPE8kL2e8i9rVm/Nh3XT7/qRWLxfV9ttqbPouRpdroTZD07bNYT1/rHS6oLm1Px2rLoWnsRpGtQKtC1V3u3QHkd83ba1WpK+vhULLJpBNEJtwbMKziZJNBC5Bmk0Am2DPOeXnHGAiwC0JZBPZOTeAd8JYPSeKp6Zk3b0poV7KnaTcC8qd/kc5LuUgKTeScispzy5eY81D7pcEsQnHJjybKNlENmGZR2owtvx+WNFOTRHNQu61pBwk5UZSbiXlKCknSbmTlHtJeSkpl9yhJW+HJiJ/lsAwfecd/T4Pl1ZSjpJykpTnz7qWHvLwhyXgJeWlpDwIyoOWlIOk3EjKraQcJeUkKZfcoYG3QxMRuGk9/gxmEfIT8jWB3RDgI+YHxNsnxPIR5CPERxwf8TzkGqO3amiqTVvfKzv7c7edFXrG92O9qPkch35b785Dnao/n4WfNIwmFDbcXiQGoEMBgClMEwlAMfSxz9jvBw==", "file_map": { "50": { "source": "fn main(a: u32, mut c: [u32; 4]) {\n // Regression for issue #661:\n let mut c_661: [u32; 1] = [0];\n if a > 5 {\n c_661 = issue_661_foo(issue_661_bar(c), a);\n } else {\n c_661 = issue_661_foo(issue_661_bar(c), a + 2);\n }\n assert(c_661[0] < 20000);\n}\n\nfn test5(a: u32) {\n if a > 1 {\n let q = a / 2;\n assert(q == 2);\n }\n}\n\nfn issue_661_foo(array: [u32; 4], b: u32) -> [u32; 1] {\n [array[0] + b]\n}\n\nfn issue_661_bar(a: [u32; 4]) -> [u32; 4] {\n let mut b: [u32; 4] = [0; 4];\n b[0] = a[0] + 1;\n b\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 064c48932a8..e70217e79d4 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -68,8 +68,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdjbyuIwEAfwd+l1L5LMTA6+yrJ8eKgfBVHxsLCI776pa9bSxJV/ITdixd+EZpI2M7dm062u31/9fns4N4sft2Z3WC8v/WEfr273tlmd+t2u//4a/9yo4UMr/wDn43I/XJ8vy9OlWWht2qbbb4ZvIQbY9ruuWYi6/2wjCTDRVCTkEmGTEcaJ4MTipDxjEhKx+e2XZ0wkEaemxCicaJwYnBBOGCflVHqViLcZsTCh4iQbpZ/EKD8mbfZXa9JfrckWCumq0U3V6FQ1OleNLlWj26rRXdXovmr0UDM6V92rXHWvctW9ylX3KmN79UEEJxYnDiceJwEmonCicWJwgqdSyqk06XxkSGfE4sR9ItmrWzxOAkyswonGSTmVTInYLC+WcMI4EZxYnDiceJi44ijE/CQk2bJ0Hia+mH2yqTYi6zJicEI4YZwITELxXphTbcR5bRQIJ4wTwYnFicOJx0lAiVHF55ioRMTkROPE4IRwwjgRnFicOJwUsy+ctpiIz0iAiVY40TgxOCGcME4EJxYnDid49ss9HlLpdEGaMmJwQjjBZ8zgM2bwGSt3MuKjOp164yN49Br/a8qtpBDsv5OysVPjZ4zzprhQr3HGM/0w7+rg/xo9w7yrL9xrDmRqaIbhGUY+3884P3nJG/ur6RQX+6ZuGn9G/svl6AfjQXOPF7+Wp3652nXP3v72ul+PWv2X38du0vU/ng7rbnM9dUP//9X6H3IVVKuVGg4Vw6qKfdhWOxkuhwWjvW91UHHQOPAf", + "bytecode": "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", + "debug_symbols": "tdnrquIwEAfwd+nnfkhmJjdfZVkOXuqhICpeFhbx3bd1zbGY9Bz+gXwRK/1NTSZDLr01m251/fzo99vDuVn8ujW7w3p56Q/74ep2b5vVqd/t+s+P6c+NGj+08g9wPi734/X5sjxdmoXW1DbdfjN+C0OAbb/rmoVR99/tQAJMNGcJu0iEEiI4MTixOMn3mAmR2LT5+R4zJhKn3gkpnGicEE4YJ4KTfCq9isTbhFiYcLaTSeknIeWnpE1utRRvtZQMFNZVo1PV6Fw1ulSNbqpGt1Wju6rRfdXooWZ0qVqrUrVWpWqtStVaFaxWH8TiJD/uKc7DxDohHifhJ5JMEUbhROOEcMI4yadSOBKb5MUYnFicOJx4nASYWIWT7FNY5EnYJMPSKZxks882rsHZuoQITgxOLE4cTLyG8+IJJ4wTvMQ8XmIeLzGPl5jHS8xnB79I3BtJujcKCicaJ4QTxongxODE4iSbfSOxxIxJUhk8TgJKSCmcaJwQThgnghODE4sTOPuk81OSiqsL1pwQjRPCicfbgg9LwoflzOlLcHHVO1TUZBr/b6jAcIGRAmMKjC0wrsB43HBBv/FMe4L92smQfTcl/21m56xez5lWwsPM7Ye/NbrAzO1d3asPzLvhAiMFxvzcnml+0q3vcM4aV9nD+al7j1+Qf3EFxoPmPlz8WZ765WrXPc/4t9f9enLkf/l77N5O/4+nw7rbXE/d+B7g9QpgzFVQrVZqnMPHUaWHpbe2brwcBwxpaUnb4aHDg/8B", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_0.snap index 00f960402bc..f0d1dbe2d2d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_0.snap @@ -68,8 +68,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zZndjtowEIXfJde5GI89/uFVqmoVIKwiRQEFqFQh3r1JiksUR13Nrob1zWoD+T5OiI8x+Fbs6+31/a3pDsdzsflxK9rjrro0x244ut3LYts3bdu8v80fLmD8o8BOwPlUdePx+VL1l2KjFJZF3e3H/8IgODRtXWwI7j/LAXFsROEqol1EDCaI5iOGjxAfWb98ChGx6eX7dYQi4mCOlMmp2pjHqZpUYg+SdsSv2m0cGNq6xK5F7UbUTqJ2K2pfH5Eeot3bBAlsRK++/wjqgSD4/1+DxXiqxaSImkTtVtTuRO1e1B4k7QZE7UrUjqJ2LWoX7aoR7aoR7aoR7arhdXVCAhsh4COKjyAf0XzE8BHiI5aP8G8lrd9KjOtP1MmCzAIfUR8hyUe3RT6i+YjhI8RH1m+l0RGxHxSYIC7uCZPFvXWidi9qD5J2B6J2JWpHUbsWtRtRO4naRbvqRLvqRLvqRLvqRbvqRbvqv9xVE78qE3321CmIziWIySVIeF0QFVxcaangZ4ugKUnAVyYJ9t+aD+0yidgomexG1E6idpfNaPGvS4IAz9Gi9DJJyCTJ8GQ2SdQrkyj37DItk2A2SXQ2Scx3jZP5TLvS+CFZbDwqt0xNmXw+INhskrhckqxvummIw1DP5wj4i3g+EnjIfTj6VfVNtW3rx1br4drtZjuvl9+nerEJe+qPu3p/7etxO/a5EzvWN0CpAMZZf5xqUUGJisbDcb7D4VdERD286PDCfwA=", + "bytecode": "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", + "debug_symbols": "zZrRjtowEEX/Jc95GM947JhfqapVgLCKFAUUoFKF+PfGLC5RnHblRcP6ZbUBn8MNzNgJ+FJsm/X5/a3td/tjsfpxKbr9pj61+348ulzLYj20Xde+v00fLsD/UWBuwPFQ9/74eKqHU7FSCsui6bf+PzcKdm3XFCuG689yRGwyonARIRsQjRFC6YhORzgdWT59dgEx8elXywgHxMIUKaOhpPV9KLGK7E7Sjvis3YTCIGMjO4nataidRe1G1L5ckRUEe2UixCUjtPj+I6g7glD9/xwMhqEGo0YkFrUbUbsVtVeididp1yBqV6J2FLWTqF20V7Vor2rRXtWivarTetUjDOnIct1juM5BihZ+xnSEPkOiJYJ1OsLpiElHbDqy/FFqCoj5pFD+OfRmd5J2A6J2JWpHUTuJ2rWonUXt5kk7Q7hpYoxumowVtVeididptyBqV6J2FLWTqP3ZXmUdbsmYvzr0FoRzCWJyCWJfF0Q5G660lKsmF0EfSapskrhcklSQTRKVTRLMJgllk0RnkySb3nEvrRNn/t5DopknEauTm12L2lnUns3q4164+iDAo1oUzZO4TJKMT2aTRL0yibKPXuZ5EswmCWWTRH9XnUxn2oWOH5OFjkdl56k5k/UBwWSTxOaSZPnHYoJQhjSdI+ADqdIRl4Zcx6Nf9dDW6665bxHYnfvNZMfA6fehmW0eOAz7TbM9D43fRvDYQeDb10GpAPys76daVFCiYn/o5zscv/1GpPFFxxf+Aw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 8c882cbf176..54c924402d4 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/conditional_regression_short_circuit/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -68,8 +68,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/92byW4bRxCGe8QZSkNKoWxn36zs0W1EipJyy8H7vi+yZZvi4h3IIbnkEPCQh8ghxzxBrgFySF4glwTI28QldYm/ilUMDU/DaA8g9JD9TdXf3dXrUInbvZaf/SX+PhUpXsx87dPixa6VEm0ViaK5bL1JiXpDaZyJQGMlAo1pybGZubCxmUVQp9UINM5GoHEuAo25K7f/LDkXtP/UIqjTegQa5yPQuBCBxtci0NiIQONiBBoPRKDxYAQaD0Wg8fUINL4RgcY3I9D4VgQa345A4zsRaHw3Ao3vRaDx/Qg0fhCBxg8j0Hg4Ao1LEWj8KAKNH0eg8ZMINH4agcbPItD4eQQav4hA45cRaFwOoHHnqsE9iaaXL/Ryg14e0IE8HXjTgTId2NKB6BI8R4d5dFhGh1F02EOHKXRYQYcBtNmmzSxtFmkzRpsd2kzQYp0Ww7TYpMUcLZZoMUKT/WFvnyYDGmxpMKPBgjojBTsFEzXWshu/uML/9Wnu0xnIL/GlzUou/JZpf6NY6+dK+UrU38q9zSyI/WaH7VfD6C9mvZ0jw5F9LAv7rQhOPlMB5igwRw3mGDDHDOY4MMcN5gQwJwzmJDAngUmAOQXMKYM5DcxpgzkDzBmDOQvMWYM5B8w5gzkPzHmDuQDMBYO5CMxFg7kEzCWDuQzMZYO5AswVg7kKzFWDuQbMNYO5Dsx1g7kBzA2DuQnMTYPZBGbTYG4Bc8tgbgNz22C2gNkymDvA3DGYu8DcNZh7wNwzmA4wHYPZBmbbYLrAdA2mB0zPYPrA9A1mAMzAYO4Dc99gHgDzwGAeAvPQYB4B88hgHgPz2GCeAPPEYJ4C81QwC3DP1xHP8FwUYi2wUay2A891q1w2/AEGl5N9z4bx3U6EP+dG7YF57L/mQq4rdn/AhP5Yj6wfbusFZoYjPTIvHY6Xg/MyyOP2pbXwJnAytlhH7vbHb8lx91XguGu/xLhbexXjriLy0uF4OZ437rBOZNylAeriWdz1w8Zds3h5cddceRXjLhV56XC8HM8bdxhbGXB9uB/4e26zJEAd8V451PxO1yFFP/qia3bo9i6Olwp8x/XK9TyHvMjLIS8d7vdT859T8IO2WEcm+J7/3PBpFZ7h5xcV/1Xhf59u5TtZL7nC5wpPsbbl7+v+j2LoL//dpDFhmj6LvhbdeJ/lvLCx1GxxHHHf4naUPpMJepwrL7a18bRE+zs/6sXyfuNT+vydKC/WiVPKzRqlzW9FXc25EG1XFAfBrhO+sDwVNz4/YhxKnSXW94D95UZdod9MsN9DWX4QWqvla10JWA+FrIfKhHqYVN6SY2iv/7Nv7P8YV1WhJ8TcWUAb5GHsNzNR3h+hzn8WZQzUb/f2z/JdB/quh/E99f6Z/deE1lDrybrQI+sH15OUN69oXVTyEnE/r/iZV/xotvISbVVLtMVx2lBscx2GnotkO+I4MqeUe8aNxznGQCa++8mnZOsfeEbOBRXlO1l3NUWPtgZjDseGhlKmTOipKXqQz4UtzeekcTlTbCUiD9cs6JvrIhP8Lz4NPP6qaxb2Jc+ukAv8fnDqffbePkZoDTUuZkJPArqcG98nBOrf7US0FeqZUfQccKM+jm2m9YMlnzZE+RKlfIHONYpp+1sFyinLg+tGuc741afa+IXtOamNF50ec3QtKM8lRurcdPtRZHivE3oeCTv+jM7yrHX3b/A9tn3m9DW73Ncw/yfY/N3fN8Aulg2f57w/RH2HOkvSxmP2VXf6HFURdaTNd9qYINcIyGtzsjbX1qewlU7wra2z6hN8o655w3fqxudr+Szmae9m0J7W/+aELW1e0Pb3WrzzsxjvHMfpcMSVFWfrG7vj645Wb5/7k7xSyEf+b/8Z65TTF/nH8sF6Z2XQ6gw67U6vt9rtyP5AF/aHsv131lsb3eZqd3273eq01v7X/38BxPGJYUIAAA==", - "debug_symbols": "zZndjtowEIXfJde5mBn/8ypVtQoQVpGigAJUqhDv3iTFJcXRotnVsL5BGPk7OcY+sZO5FNt6fX5/a7rd/lisflyKdr+pTs2+G1qXa1ms+6Ztm/e3+c8FjB8IdgKOh6ob28dT1Z+KFSKVRd1tx29hENg1bV2sDFx/lgPi2AjSIqJcRDQliOIjmo8YPrI8fBMiYtPh+2XERMTBHCmTrkrrW1dlMFEPkupEX1W3cWEo6550hfi/K1SJEZWLEZ2LkeXseohGvE0Qx0bU4gIgwBtC4D8eg6XY1VKSJqVE1bWouhFVt6LqTlTdi6oHSXUNouooqi6aVS2aVS2aVS2aVc3L6oQ4PuL5SGAjBvgI8hHiI4qPaD7Cn0qzPJUUt25SyanKeD4SniHJ1m2BjyAfIT6i+MjyVGoVEfskwAbiCd1QckK3RlTdiqo7UXUvqh4k1R2IqqOoOomqK1F10aw60aw60aw60aw60aw60az6L2dVx6dqYz7bdTKCuRihXIy41xnB4OJJC4OfHYImJwFe6STYf2c+so9OxFbJpE6i6kpU3WSzWuzrnBDAfbXMX9X9deKyceKzcRJe6QTdPcvmfyeDzWycYDZO6LvWyfxOu5B4glisQEL36Fplsj8MLrNxYrJwch0av6q+qdZtfStL7s7dZlalPP0+1A8Fy0O/39Tbc1+Ppct71XKc5QAlAow3kjG9w1uZklCNzTFChHpo2uGiw4X/AA==", + "bytecode": "H4sIAAAAAAAA/92buXIbRxCGB8QuiAVIk5J8X6JvM1sCBElnCnTf90GJkkAC0F3lwE4cuBD4ERw68js4cpUD+wWc2FV+G6vJaeJnbzcElXakGm0VaxeYb7v/6e05F6y4nWPx6V/FXyfijAczh/w5f7FjqURbeUXRXLbeSol6Q2mcikBjNQKNScm5mbqwuZlGENNaBBqnI9BYj0Bj5sptPwvOBW0/jQhi2oxA40wEGmcj0PhGBBrnItA4H4HGfRFo3B+BxgMRaHwzAo1vRaDx7Qg0vhOBxncj0PheBBrfj0DjBxFo/DACjR9FoPHjCDQejEDjQgQaP4lA46cRaPwsAo2fR6Dxiwg0fhmBxq8i0Ph1BBoXA2jcPhpwTaLp5Qu93KCXB7QhTxvetKFMG7a0IboA99FmHm2W0WYUbfbQZgptVtBmAC22aTFLi0VajNFihxYTNFmnyTBNNmkyR5MlmozQYH/Q26fBgDpb6syos6DGSMlOyUQPa9EVDw74f/6c+fMUlJf40mYpE37LtL+Wr/QzpX4l6m9n3mYaxH6ry/ZrYfTn097O4eHIPtaF/VYFJ++pAnMEmCMGcxSYowZzDJhjBnMcmOMGcwKYE8BUgDkJzEmDOQXMKYM5DcxpgzkDzBmDOQvMWYM5B8w5gzkPzHmDuQDMBYO5CMxFg7kEzCWDuQzMZYO5AswVg7kKzFWDuQbMNYO5Dsx1g7kBzA2DWQdm3WBuAnPTYG4Bc8tgNoDZMJjbwNw2mDvA3DGYu8DcNZguMF2D2QRm02C2gNkymB4wPYPpA9M3mAEwA4O5B8w9g7kPzH2DeQDMA4N5CMxDg3kEzCODeQzMY4N5AswTwczCNR+HPcNjUYi5wFq+3Ak81i1z3fAHGFxP9j0dxnenIvw5N3oeWMb+Gy7kvGLnB0zoj/XI+PCznmVmONIjy5JhsR5clkIZP1+aC68DJ3OLdWRub/6WnHffBM67zivMu5XXMe+qoiwZFuvxvHmHMZF5lwSIxdO864fNu1b+6vKutfQ65l0iypJhsR7Pm3eYWylwfbge+Gt+ZpUAMeK1cqjxnY4Din70Rcf00O0enC9V+I7jynGuIy/KMihLhnv9NPznBPygLdaRCr7nP8/5cw3u4fvnFf814X+PbuU7GZdM4TOFp1zb8NdN/0c59Lf/blyfMEmbRV/zrthmuSxsLrXanEfctvg5Sp+VMXqcKy+3tf60RPvbP+rF+n7rz/T5e1FfjIlT6s0apc3vRKzqLsSzy/P9YNcJX1ifqiuOj5iHUmeJ8R6wv8yIFfpNBfsD1OVHobVWvtalgHHIZRyqY+Iwrr4l59Bu+2ff2P4xr2pCT4ixM4dnkIWx30pFfX+CmP8s6hio3e6un+W7DvTdDON74vUz+28IraHmk02hR8YH55NUNqNonVfKKuJ6RvEzo/jRbGUl2qqVaKsuynAewTHE/J5zxfxOhZ6Gogf5TNjSfI7rW1LFVkWUJUodcQxOBf+LPwfuQ9RxV8ZDztdQV6C1WT5pvFnblBJbHPtkX/mrP9Pnf+EetOlccf7oXDF/q4qeWeU+2S+G6ZMnX2ez/4bTn/OhUvSM+sW6EteqK8Y1cM53xvUL2nPe5/T8Qn1sa8Gf5R4Sc9rZucnWVMjwfF3r/15SHHMZR2yj6LMO9ZF9Kj6DVHz3mz9rbVTLpfqY2E0pekKvaTIXcr4x2suz5t2/i5ilEGdtzt6AcuT/Apt/+Os5sIt1w/u57E8R71B7SdpYxr6aTh/fqyJG+NuQcX0C89pcD3O/JuKFudacwFYyxrc2z2qO8Y26ZgzfiSu2MXmvbNP8farUTeu76sJWqtRDW99r+c73Yr6z1mQ44srKs9W1nX5vW6u3z+1JHgmUI/+P/4z9Ap9f5B/LB6vdpUG7O+h2ur3e8lZXtgc6sD2U7b+72l7bai1vrW522t32yjP9/w9coarwYUIAAA==", + "debug_symbols": "zZnbjtowEIbfJde5mBmfeZWqWnEIq0hRQAEqVYh3b5LFJcXpIi8adm4QRv6/fCGeOI7PxaZand7f6na7OxSLH+ei2a2Xx3rX9q3zpSxWXd009fvb9OcChg8EOwYO+2U7tA/HZXcsFohUFlW7Gb6FHrCtm6pYGLj8LPuIy44gzUaUixFNSUTlR3R+xORH5k/fhBix6en7+YiJEQfTSJl0VVpfuyqDCT1w0omepds4MJR1D7pC/N8VqkRESRHRUkTma9dDFPE2ibjsiJodAAR4jRD4z8/BUuxqKakmpVjpmpVuWOmWle5Y6Z6VHjjpGljpyEpnrVXNWquatVY1a63qvFodIz4/Mj/uKU4RpJLZ20B+BB9FkinCUH5E5Ud0fsTkR+YvpVYxYh8MlP92HemOle5Z6YGTboGVjqx0YqUrVrp+km4grnwMJSsfa1jplpXuWOmelR446Q5Y6chKf7ZWjY6rN2O+2nUUUVJEtBQR8zoRDC4+aWHwk4egDxMrxsSJMfFiTIIUEw9iTFCMCYkxEVM74aXjJNi/a0iy9yZs42SkEytdsdLFzD7hhbMPAdxGy/QV84eJE2PixZiEV5qgu9Wy+dek1xRjgmJM6LvGyfROO1PxBHGTDQndvbUSMj/0lmJMjAiTS9/4tezq5aqprtvp21O7nuyuH3/vq7uN9n23W1ebU1cNW+633fbhKgcoEWC4kQzV27/lLQnV0BxKiFD3TdsftD/wHw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 479d64de795..2a87074bd19 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -64,10 +64,6 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -78,8 +74,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1ZO4/TQBBen+0kzlvwR+KLcwndnXTvV0vt5C41Eh2VewpKKjp6GpCQKBANHRJI/CCydzuXL+NZJ8d5QUasZK298+28dmZ2s/HUbesuHs+8B6b3Te/BmIIx3XZNP3hYi0vkNXClo1cBHbcqoKNfoo4exKkrfYMK+DSsgI61ktfddU2qV8CnjQroGFVAx2bJsUk6Uoy2Fk978XTU7V57N4gG6eLtm0k6oXXC6CDUi6yd2AR8IWNw0E/TR6bfAnqJhTiOmNwy+U8Go2GkVlvJ+t/wxwUrmf+U+Idu+A/qhs9+tuSPtpBcn+H4HB8wB4A5sGAOAXNowRwB5siCOQbMsQVzApgTC+YUMKcWzBlgziyYc8CcWzAXgLmwYC4Bc8kwFBNuciZJHMdc0lH5HwdkC8muuZE98pg8pVZ/sCgmv6mc5nfsMXmkD/cP1d8OYbKlPh6jBVneDqKFQKP11fvEHuB4bJEetDYu9oJF3E0cx93wL8Zd8i/GHacFWd6O+8YdxhaPO9+BLxZxN/1f76oVdz6jBVnejvvGnXRppXHn8H4BGIxVtMETbHAcv3PHZ9DkvrnP1wfXAH27x/zjaF+Zu/S/9s9ji/70rls9U3fNZ/5EH5HPGohntAhoQbYqp2m+A5CDvEiPkOHPzHfP9DWYQ/P7gvwak7+itzCGPuK8fGGM8Dqv9817yzw6ht6ZMcrjcDlVeZYeZUn52lf5/YBwPZWv17yW14FW9qWlZ+zWjdaYy6yBPYjHd2Xsw7GnptffH5h9Ur2uFfhO2lsc73WDjmAjX5vIjeyN91mS31T5tXGxz0ZMH+4frOOeWt4V4dy+QOPx3xTkNAU5VeRFvkFfPrS2YBzSekTKbUxEgo0u7sJazP6y9W+70T93TscY0P0zGEdaqPJnWPRzyPCvgOdz8077Cu6PEaNJ93JF9RnxbcYrFGz02Dy0KxR4hQz/wvQ6fj9uoJ8PY1sMXxfwqGfI7EFbaW7RuZV8GwCtzP1A++AT6MHtxTOxS//0GR59JdUikinFI99LHf3euDvnkA14zkGZW+AbHqN4DgzZ2EvTS+ccfobHMaWKzzl8L/UYL910bZTOkDyfOyCz6LxF+K6A7wCG/EayMR66jIZ6RRa9sDYgL17zCP/a9FJtkHSXfE74noDvAqbO7EE/9CyybfbwWkf4NwX2SPoV5XJfwPcK7EFb+xvIRvu7Ftk1C77H7Cf8W7W0/4d5l+otnv11C4Dmut5iDvF6W5Qvum2yRlLM9VV+XXqMhjnVYXLW7eMNZuO6s4pLv48nyz+tac0pj3gLgI749+Ybz6QKbNv9TT3n4zSeD9N5OkqvrpJZ+ojx143WuOVAfjoeTmbbyWw8HQ3T4c4flz8b7UxnySgdXMf6c3udfOneB/NYN7o7wrslxBO/kOE/E3bxfDHv/G4Q5Wnc9wKcZ+lveAhjQbY6Jt054V0c4Ul2M8vrSLQW0LDG6NY23+gv5EV6hAz/zXzTmuD9Gc3vC/IbTP6K3sIYv4trCfiWgNfr85X4mR5tL/se40Ym449jXDeKHRd5tUip8Swdx/GTJL5O4tG6vPoF3z1SlykrAAA=", - "debug_symbols": "ldfbioMwEAbgd8m1FzOZHPsqy1Jsa4sgWqxdWErffaNUt2wCy38jRv0wcZI481Cn5nC/7Nv+PNzU7uOhuuFYT+3Qp9bjWanD2HZde9m/X1Y0H0Jcnr9d635u3qZ6nNROhCrV9Kf5jJM/t12jdpaen5WKBAuGhYaFwMLAwsLCwcLDIsACjjkT4YRxonEiODE4gSPPXB6LlZVYk5HyW0J8EUOUEYeT4gwz4ldi8rEEnBTnmDEbsRnRhBPGiS4TuxGdEcGJwYktf2TaPnJOHE48TgJOIkyEcMI40TgRnBic4NEXPPqCR1/w6AsefYNH3wi8wZryzu/XVSk+ZsTixOHE4yTgJMLEEk7Kq5Jk+yXlRONEcGJwYnHicFJelaxXwiEjAScRJo7+GUuBME40TgQnBs6UHJ6POTwfcx4nAScRJp5wwjjRGHmm1lc9tvWha17V7fneH9+K3en72vype6/jcGxO97GZK+Df4nceIAdfaQqpK/Occrbydsn451tpm+NASzqbmppipZlTD1IvfgA=", + "bytecode": "H4sIAAAAAAAA/+1ZzW7TQBDeje382PkTvEhMHVJurdT/v3dI00ZI3HgBfOPEjTsXkDggLtyQQOLNyLY7zZfxrJtQL2DEStHaO59nvpmd2V07Wt22/uKn7XVo+8D2GsYUjJm2Y/vRw1paoa6RL466BhwbNeAYVMhRQ5764hvWIKZRDTg2K55332tSqwYxbdeAY6cGHOOKc5M4Uo4mi1938eup2732bhAdMot3YB8yBW0KxiShmWQTxBjwpYohQD9s37F9A+QVLsRph9mtUv/2aLzVUautYv43+nHCKtZ/SfojP/pHLatnL1/qR1/IbsBw/JkAMPuA2XdgDgBz4MAcAubQgTkCzJEDcwyYYwfmBDAnDswpYE4dmDPAnDkw54A5d2AuAHPBMJQTfmomyzznXNZTxZcD8oVsN/3YHmtmT6nVFxbF7MfKa32nmtkjPjw+tP72CJMv+WgmC/OiHySLQEbza/aJXcDx3CIeNDc+9oJF3m17zrutP5h32b+Yd1wW5kU/Ns07zC2ed4GHWCzy7vL/elevvAuYLMyLfmyad9JHK4M7g+tzwGCuog9a8MFz/s49n0GzTWufzw/OAcZ2l8XH074y9xl/E5/HDv50bVorV3ctYPHEGFHM2ohnsg7IwnzVTmzvQ7CDuohHxPCn9n5g+yY8Q88PBftNZn+FtzCGMeK6AmGM8Kau9+x1Yn8mh97ZMarjaPmo0o4ebUn1OlTF/YCv1z7O3qaRH03BD7Ld8mN77b2C7MfK6951t1e0GB8eH1yLjKwtcB0KMs2u24KdtmCnjrooNhjLh9YH5iHNh+fzTNoRfPTxPYd/l6qaf+yHf+GsiTlg5uQ5GydZpIrnMIxzxPCvQOcLez1QxfxtMRmu/3x9xbU7EPAx0xWW6Grc41fM/CL8S9sbvz+swS+AsQbDS2dc5Bkyf/B5fo6V3vcpR0OQVbkfmBh8BB7c3yj/PfEZquKaUrYWBYyzFmTm/CDlK8+jrsBRl/jUE/BdwSeynYCsx2RSHXFemN+oi9ct4V/bXspviXujxNe+gO8BJmH+YBz6Dtsuf3i9Ev5NiT8Sv7J8HAj4fok/6OtgDdvof89hu+nA95n/hH+rlv5/t9d/25qBNcTXjLJ6MW2dOZJybqiK89JnMqypLrOjBTu4f+D6zGX0LO63PuM+2V7+eUhzTnXEWwhyxL+393guUeDbzi/ynE+m6XxrOp+Op1dX2Wz6iOk3jeY48WB/Nn56OcvG09F1am6f3Gdfev/FOjKN3qHxHRvxePZA/CfCLn6f7TX/RoL2DO5bCU47+hsdwliYr45J7974TYLwZDvOixxJloAMa9y0rr3HeKEu4hEx/Fd7T3OC3xHo+aFgv83sr/AWxvg3iUTAJwLezM8X0md79L3qd+Ebm0w/jnFulDs+6mpRUpPZdJKmz7L0OkvH99XVT8BUYUwxKAAA", + "debug_symbols": "ldfdioMwEAXgd8m1F5Nk8jN9lWUptrVFEC3WLiyl775Gqls2geXciFE/THKMOg91ag73y77tz8NN7T4eqhuO9dQO/dx6PCt1GNuuay/798OK0ibq5frbte5T8zbV46R21lKlmv6U9vTsz23XqJ2j52elooGFhQXDwsHCwyLAIsJCUCEECzhzgTMXOHOBMxc4c4EzFzhzTeWBOLsSxxkp3yXKizBRRiJOis8W27ASzsaiCSfFp4t5Iy4nBicWJ1wmbiMmIw4nHiehPMm0TXJOIk4EJoZwonFicGJxwjgJ8EI25VUZ1vRtkIwITCzhROPE4MTihHFSXpVkt1dfTjxOAk4iTgQmTDgpr0ptVqJjRgxOLE74n7EUiMOJx0nACf5FZoGJI5xonBicWJwwThxOPEaec+urHtv60DWv+ul8749v5dT0fW3+VFbXcTg2p/vYpBrrt7xKYWkfKx1l7kqaIe+q4Ja/sXTKSaU9L5/n1BSqtJi5B3MvfgA=", "file_map": { "50": { "source": "// An simple program demonstrating two calldata array inputs and a single return data array. As an arbitrary example,\n// the return data is computed as a linear combination of the calldata.\nfn main(\n mut x: [u32; 4],\n y: call_data(0) [u32; 3],\n z: call_data(1) [u32; 4],\n) -> return_data [u32; 4] {\n let mut result = [0; 4];\n for i in 0..3 {\n let idx = x[i];\n result[idx] = y[idx] + z[idx];\n }\n result[x[3]] = z[x[3]];\n result\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_0.snap index 479d64de795..2a87074bd19 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_0.snap @@ -64,10 +64,6 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -78,8 +74,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1ZO4/TQBBen+0kzlvwR+KLcwndnXTvV0vt5C41Eh2VewpKKjp6GpCQKBANHRJI/CCydzuXL+NZJ8d5QUasZK298+28dmZ2s/HUbesuHs+8B6b3Te/BmIIx3XZNP3hYi0vkNXClo1cBHbcqoKNfoo4exKkrfYMK+DSsgI61ktfddU2qV8CnjQroGFVAx2bJsUk6Uoy2Fk978XTU7V57N4gG6eLtm0k6oXXC6CDUi6yd2AR8IWNw0E/TR6bfAnqJhTiOmNwy+U8Go2GkVlvJ+t/wxwUrmf+U+Idu+A/qhs9+tuSPtpBcn+H4HB8wB4A5sGAOAXNowRwB5siCOQbMsQVzApgTC+YUMKcWzBlgziyYc8CcWzAXgLmwYC4Bc8kwFBNuciZJHMdc0lH5HwdkC8muuZE98pg8pVZ/sCgmv6mc5nfsMXmkD/cP1d8OYbKlPh6jBVneDqKFQKP11fvEHuB4bJEetDYu9oJF3E0cx93wL8Zd8i/GHacFWd6O+8YdxhaPO9+BLxZxN/1f76oVdz6jBVnejvvGnXRppXHn8H4BGIxVtMETbHAcv3PHZ9DkvrnP1wfXAH27x/zjaF+Zu/S/9s9ji/70rls9U3fNZ/5EH5HPGohntAhoQbYqp2m+A5CDvEiPkOHPzHfP9DWYQ/P7gvwak7+itzCGPuK8fGGM8Dqv9817yzw6ht6ZMcrjcDlVeZYeZUn52lf5/YBwPZWv17yW14FW9qWlZ+zWjdaYy6yBPYjHd2Xsw7GnptffH5h9Ur2uFfhO2lsc73WDjmAjX5vIjeyN91mS31T5tXGxz0ZMH+4frOOeWt4V4dy+QOPx3xTkNAU5VeRFvkFfPrS2YBzSekTKbUxEgo0u7sJazP6y9W+70T93TscY0P0zGEdaqPJnWPRzyPCvgOdz8077Cu6PEaNJ93JF9RnxbcYrFGz02Dy0KxR4hQz/wvQ6fj9uoJ8PY1sMXxfwqGfI7EFbaW7RuZV8GwCtzP1A++AT6MHtxTOxS//0GR59JdUikinFI99LHf3euDvnkA14zkGZW+AbHqN4DgzZ2EvTS+ccfobHMaWKzzl8L/UYL910bZTOkDyfOyCz6LxF+K6A7wCG/EayMR66jIZ6RRa9sDYgL17zCP/a9FJtkHSXfE74noDvAqbO7EE/9CyybfbwWkf4NwX2SPoV5XJfwPcK7EFb+xvIRvu7Ftk1C77H7Cf8W7W0/4d5l+otnv11C4Dmut5iDvF6W5Qvum2yRlLM9VV+XXqMhjnVYXLW7eMNZuO6s4pLv48nyz+tac0pj3gLgI749+Ybz6QKbNv9TT3n4zSeD9N5OkqvrpJZ+ojx143WuOVAfjoeTmbbyWw8HQ3T4c4flz8b7UxnySgdXMf6c3udfOneB/NYN7o7wrslxBO/kOE/E3bxfDHv/G4Q5Wnc9wKcZ+lveAhjQbY6Jt054V0c4Ul2M8vrSLQW0LDG6NY23+gv5EV6hAz/zXzTmuD9Gc3vC/IbTP6K3sIYv4trCfiWgNfr85X4mR5tL/se40Ym449jXDeKHRd5tUip8Swdx/GTJL5O4tG6vPoF3z1SlykrAAA=", - "debug_symbols": "ldfbioMwEAbgd8m1FzOZHPsqy1Jsa4sgWqxdWErffaNUt2wCy38jRv0wcZI481Cn5nC/7Nv+PNzU7uOhuuFYT+3Qp9bjWanD2HZde9m/X1Y0H0Jcnr9d635u3qZ6nNROhCrV9Kf5jJM/t12jdpaen5WKBAuGhYaFwMLAwsLCwcLDIsACjjkT4YRxonEiODE4gSPPXB6LlZVYk5HyW0J8EUOUEYeT4gwz4ldi8rEEnBTnmDEbsRnRhBPGiS4TuxGdEcGJwYktf2TaPnJOHE48TgJOIkyEcMI40TgRnBic4NEXPPqCR1/w6AsefYNH3wi8wZryzu/XVSk+ZsTixOHE4yTgJMLEEk7Kq5Jk+yXlRONEcGJwYnHicFJelaxXwiEjAScRJo7+GUuBME40TgQnBs6UHJ6POTwfcx4nAScRJp5wwjjRGHmm1lc9tvWha17V7fneH9+K3en72vype6/jcGxO97GZK+Df4nceIAdfaQqpK/Occrbydsn451tpm+NASzqbmppipZlTD1IvfgA=", + "bytecode": "H4sIAAAAAAAA/+1ZzW7TQBDeje382PkTvEhMHVJurdT/v3dI00ZI3HgBfOPEjTsXkDggLtyQQOLNyLY7zZfxrJtQL2DEStHaO59nvpmd2V07Wt22/uKn7XVo+8D2GsYUjJm2Y/vRw1paoa6RL466BhwbNeAYVMhRQ5764hvWIKZRDTg2K55332tSqwYxbdeAY6cGHOOKc5M4Uo4mi1938eup2732bhAdMot3YB8yBW0KxiShmWQTxBjwpYohQD9s37F9A+QVLsRph9mtUv/2aLzVUautYv43+nHCKtZ/SfojP/pHLatnL1/qR1/IbsBw/JkAMPuA2XdgDgBz4MAcAubQgTkCzJEDcwyYYwfmBDAnDswpYE4dmDPAnDkw54A5d2AuAHPBMJQTfmomyzznXNZTxZcD8oVsN/3YHmtmT6nVFxbF7MfKa32nmtkjPjw+tP72CJMv+WgmC/OiHySLQEbza/aJXcDx3CIeNDc+9oJF3m17zrutP5h32b+Yd1wW5kU/Ns07zC2ed4GHWCzy7vL/elevvAuYLMyLfmyad9JHK4M7g+tzwGCuog9a8MFz/s49n0GzTWufzw/OAcZ2l8XH074y9xl/E5/HDv50bVorV3ctYPHEGFHM2ohnsg7IwnzVTmzvQ7CDuohHxPCn9n5g+yY8Q88PBftNZn+FtzCGMeK6AmGM8Kau9+x1Yn8mh97ZMarjaPmo0o4ebUn1OlTF/YCv1z7O3qaRH03BD7Ld8mN77b2C7MfK6951t1e0GB8eH1yLjKwtcB0KMs2u24KdtmCnjrooNhjLh9YH5iHNh+fzTNoRfPTxPYd/l6qaf+yHf+GsiTlg5uQ5GydZpIrnMIxzxPCvQOcLez1QxfxtMRmu/3x9xbU7EPAx0xWW6Grc41fM/CL8S9sbvz+swS+AsQbDS2dc5Bkyf/B5fo6V3vcpR0OQVbkfmBh8BB7c3yj/PfEZquKaUrYWBYyzFmTm/CDlK8+jrsBRl/jUE/BdwSeynYCsx2RSHXFemN+oi9ct4V/bXspviXujxNe+gO8BJmH+YBz6Dtsuf3i9Ev5NiT8Sv7J8HAj4fok/6OtgDdvof89hu+nA95n/hH+rlv5/t9d/25qBNcTXjLJ6MW2dOZJybqiK89JnMqypLrOjBTu4f+D6zGX0LO63PuM+2V7+eUhzTnXEWwhyxL+393guUeDbzi/ynE+m6XxrOp+Op1dX2Wz6iOk3jeY48WB/Nn56OcvG09F1am6f3Gdfev/FOjKN3qHxHRvxePZA/CfCLn6f7TX/RoL2DO5bCU47+hsdwliYr45J7974TYLwZDvOixxJloAMa9y0rr3HeKEu4hEx/Fd7T3OC3xHo+aFgv83sr/AWxvg3iUTAJwLezM8X0md79L3qd+Ebm0w/jnFulDs+6mpRUpPZdJKmz7L0OkvH99XVT8BUYUwxKAAA", + "debug_symbols": "ldfdioMwEAXgd8m1F5Nk8jN9lWUptrVFEC3WLiyl775Gqls2geXciFE/THKMOg91ag73y77tz8NN7T4eqhuO9dQO/dx6PCt1GNuuay/798OK0ibq5frbte5T8zbV46R21lKlmv6U9vTsz23XqJ2j52elooGFhQXDwsHCwyLAIsJCUCEECzhzgTMXOHOBMxc4c4EzFzhzTeWBOLsSxxkp3yXKizBRRiJOis8W27ASzsaiCSfFp4t5Iy4nBicWJ1wmbiMmIw4nHiehPMm0TXJOIk4EJoZwonFicGJxwjgJ8EI25VUZ1vRtkIwITCzhROPE4MTihHFSXpVkt1dfTjxOAk4iTgQmTDgpr0ptVqJjRgxOLE74n7EUiMOJx0nACf5FZoGJI5xonBicWJwwThxOPEaec+urHtv60DWv+ul8749v5dT0fW3+VFbXcTg2p/vYpBrrt7xKYWkfKx1l7kqaIe+q4Ja/sXTKSaU9L5/n1BSqtJi5B3MvfgA=", "file_map": { "50": { "source": "// An simple program demonstrating two calldata array inputs and a single return data array. As an arbitrary example,\n// the return data is computed as a linear combination of the calldata.\nfn main(\n mut x: [u32; 4],\n y: call_data(0) [u32; 3],\n z: call_data(1) [u32; 4],\n) -> return_data [u32; 4] {\n let mut result = [0; 4];\n for i in 0..3 {\n let idx = x[i];\n result[idx] = y[idx] + z[idx];\n }\n result[x[3]] = z[x[3]];\n result\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 479d64de795..2a87074bd19 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/databus_two_calldata/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -64,10 +64,6 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -78,8 +74,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1ZO4/TQBBen+0kzlvwR+KLcwndnXTvV0vt5C41Eh2VewpKKjp6GpCQKBANHRJI/CCydzuXL+NZJ8d5QUasZK298+28dmZ2s/HUbesuHs+8B6b3Te/BmIIx3XZNP3hYi0vkNXClo1cBHbcqoKNfoo4exKkrfYMK+DSsgI61ktfddU2qV8CnjQroGFVAx2bJsUk6Uoy2Fk978XTU7V57N4gG6eLtm0k6oXXC6CDUi6yd2AR8IWNw0E/TR6bfAnqJhTiOmNwy+U8Go2GkVlvJ+t/wxwUrmf+U+Idu+A/qhs9+tuSPtpBcn+H4HB8wB4A5sGAOAXNowRwB5siCOQbMsQVzApgTC+YUMKcWzBlgziyYc8CcWzAXgLmwYC4Bc8kwFBNuciZJHMdc0lH5HwdkC8muuZE98pg8pVZ/sCgmv6mc5nfsMXmkD/cP1d8OYbKlPh6jBVneDqKFQKP11fvEHuB4bJEetDYu9oJF3E0cx93wL8Zd8i/GHacFWd6O+8YdxhaPO9+BLxZxN/1f76oVdz6jBVnejvvGnXRppXHn8H4BGIxVtMETbHAcv3PHZ9DkvrnP1wfXAH27x/zjaF+Zu/S/9s9ji/70rls9U3fNZ/5EH5HPGohntAhoQbYqp2m+A5CDvEiPkOHPzHfP9DWYQ/P7gvwak7+itzCGPuK8fGGM8Dqv9817yzw6ht6ZMcrjcDlVeZYeZUn52lf5/YBwPZWv17yW14FW9qWlZ+zWjdaYy6yBPYjHd2Xsw7GnptffH5h9Ur2uFfhO2lsc73WDjmAjX5vIjeyN91mS31T5tXGxz0ZMH+4frOOeWt4V4dy+QOPx3xTkNAU5VeRFvkFfPrS2YBzSekTKbUxEgo0u7sJazP6y9W+70T93TscY0P0zGEdaqPJnWPRzyPCvgOdz8077Cu6PEaNJ93JF9RnxbcYrFGz02Dy0KxR4hQz/wvQ6fj9uoJ8PY1sMXxfwqGfI7EFbaW7RuZV8GwCtzP1A++AT6MHtxTOxS//0GR59JdUikinFI99LHf3euDvnkA14zkGZW+AbHqN4DgzZ2EvTS+ccfobHMaWKzzl8L/UYL910bZTOkDyfOyCz6LxF+K6A7wCG/EayMR66jIZ6RRa9sDYgL17zCP/a9FJtkHSXfE74noDvAqbO7EE/9CyybfbwWkf4NwX2SPoV5XJfwPcK7EFb+xvIRvu7Ftk1C77H7Cf8W7W0/4d5l+otnv11C4Dmut5iDvF6W5Qvum2yRlLM9VV+XXqMhjnVYXLW7eMNZuO6s4pLv48nyz+tac0pj3gLgI749+Ybz6QKbNv9TT3n4zSeD9N5OkqvrpJZ+ojx143WuOVAfjoeTmbbyWw8HQ3T4c4flz8b7UxnySgdXMf6c3udfOneB/NYN7o7wrslxBO/kOE/E3bxfDHv/G4Q5Wnc9wKcZ+lveAhjQbY6Jt054V0c4Ul2M8vrSLQW0LDG6NY23+gv5EV6hAz/zXzTmuD9Gc3vC/IbTP6K3sIYv4trCfiWgNfr85X4mR5tL/se40Ym449jXDeKHRd5tUip8Swdx/GTJL5O4tG6vPoF3z1SlykrAAA=", - "debug_symbols": "ldfbioMwEAbgd8m1FzOZHPsqy1Jsa4sgWqxdWErffaNUt2wCy38jRv0wcZI481Cn5nC/7Nv+PNzU7uOhuuFYT+3Qp9bjWanD2HZde9m/X1Y0H0Jcnr9d635u3qZ6nNROhCrV9Kf5jJM/t12jdpaen5WKBAuGhYaFwMLAwsLCwcLDIsACjjkT4YRxonEiODE4gSPPXB6LlZVYk5HyW0J8EUOUEYeT4gwz4ldi8rEEnBTnmDEbsRnRhBPGiS4TuxGdEcGJwYktf2TaPnJOHE48TgJOIkyEcMI40TgRnBic4NEXPPqCR1/w6AsefYNH3wi8wZryzu/XVSk+ZsTixOHE4yTgJMLEEk7Kq5Jk+yXlRONEcGJwYnHicFJelaxXwiEjAScRJo7+GUuBME40TgQnBs6UHJ6POTwfcx4nAScRJp5wwjjRGHmm1lc9tvWha17V7fneH9+K3en72vype6/jcGxO97GZK+Df4nceIAdfaQqpK/Occrbydsn451tpm+NASzqbmppipZlTD1IvfgA=", + "bytecode": "H4sIAAAAAAAA/+1ZzW7TQBDeje382PkTvEhMHVJurdT/v3dI00ZI3HgBfOPEjTsXkDggLtyQQOLNyLY7zZfxrJtQL2DEStHaO59nvpmd2V07Wt22/uKn7XVo+8D2GsYUjJm2Y/vRw1paoa6RL466BhwbNeAYVMhRQ5764hvWIKZRDTg2K55332tSqwYxbdeAY6cGHOOKc5M4Uo4mi1938eup2732bhAdMot3YB8yBW0KxiShmWQTxBjwpYohQD9s37F9A+QVLsRph9mtUv/2aLzVUautYv43+nHCKtZ/SfojP/pHLatnL1/qR1/IbsBw/JkAMPuA2XdgDgBz4MAcAubQgTkCzJEDcwyYYwfmBDAnDswpYE4dmDPAnDkw54A5d2AuAHPBMJQTfmomyzznXNZTxZcD8oVsN/3YHmtmT6nVFxbF7MfKa32nmtkjPjw+tP72CJMv+WgmC/OiHySLQEbza/aJXcDx3CIeNDc+9oJF3m17zrutP5h32b+Yd1wW5kU/Ns07zC2ed4GHWCzy7vL/elevvAuYLMyLfmyad9JHK4M7g+tzwGCuog9a8MFz/s49n0GzTWufzw/OAcZ2l8XH074y9xl/E5/HDv50bVorV3ctYPHEGFHM2ohnsg7IwnzVTmzvQ7CDuohHxPCn9n5g+yY8Q88PBftNZn+FtzCGMeK6AmGM8Kau9+x1Yn8mh97ZMarjaPmo0o4ebUn1OlTF/YCv1z7O3qaRH03BD7Ld8mN77b2C7MfK6951t1e0GB8eH1yLjKwtcB0KMs2u24KdtmCnjrooNhjLh9YH5iHNh+fzTNoRfPTxPYd/l6qaf+yHf+GsiTlg5uQ5GydZpIrnMIxzxPCvQOcLez1QxfxtMRmu/3x9xbU7EPAx0xWW6Grc41fM/CL8S9sbvz+swS+AsQbDS2dc5Bkyf/B5fo6V3vcpR0OQVbkfmBh8BB7c3yj/PfEZquKaUrYWBYyzFmTm/CDlK8+jrsBRl/jUE/BdwSeynYCsx2RSHXFemN+oi9ct4V/bXspviXujxNe+gO8BJmH+YBz6Dtsuf3i9Ev5NiT8Sv7J8HAj4fok/6OtgDdvof89hu+nA95n/hH+rlv5/t9d/25qBNcTXjLJ6MW2dOZJybqiK89JnMqypLrOjBTu4f+D6zGX0LO63PuM+2V7+eUhzTnXEWwhyxL+393guUeDbzi/ynE+m6XxrOp+Op1dX2Wz6iOk3jeY48WB/Nn56OcvG09F1am6f3Gdfev/FOjKN3qHxHRvxePZA/CfCLn6f7TX/RoL2DO5bCU47+hsdwliYr45J7974TYLwZDvOixxJloAMa9y0rr3HeKEu4hEx/Fd7T3OC3xHo+aFgv83sr/AWxvg3iUTAJwLezM8X0md79L3qd+Ebm0w/jnFulDs+6mpRUpPZdJKmz7L0OkvH99XVT8BUYUwxKAAA", + "debug_symbols": "ldfdioMwEAXgd8m1F5Nk8jN9lWUptrVFEC3WLiyl775Gqls2geXciFE/THKMOg91ag73y77tz8NN7T4eqhuO9dQO/dx6PCt1GNuuay/798OK0ibq5frbte5T8zbV46R21lKlmv6U9vTsz23XqJ2j52elooGFhQXDwsHCwyLAIsJCUCEECzhzgTMXOHOBMxc4c4EzFzhzTeWBOLsSxxkp3yXKizBRRiJOis8W27ASzsaiCSfFp4t5Iy4nBicWJ1wmbiMmIw4nHiehPMm0TXJOIk4EJoZwonFicGJxwjgJ8EI25VUZ1vRtkIwITCzhROPE4MTihHFSXpVkt1dfTjxOAk4iTgQmTDgpr0ptVqJjRgxOLE74n7EUiMOJx0nACf5FZoGJI5xonBicWJwwThxOPEaec+urHtv60DWv+ul8749v5dT0fW3+VFbXcTg2p/vYpBrrt7xKYWkfKx1l7kqaIe+q4Ja/sXTKSaU9L5/n1BSqtJi5B3MvfgA=", "file_map": { "50": { "source": "// An simple program demonstrating two calldata array inputs and a single return data array. As an arbitrary example,\n// the return data is computed as a linear combination of the calldata.\nfn main(\n mut x: [u32; 4],\n y: call_data(0) [u32; 3],\n z: call_data(1) [u32; 4],\n) -> return_data [u32; 4] {\n let mut result = [0; 4];\n for i in 0..3 {\n let idx = x[i];\n result[idx] = y[idx] + z[idx];\n }\n result[x[3]] = z[x[3]];\n result\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 71e7328a000..159f50f764e 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -34,8 +34,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zd3brmXHeabpe9GxDlZE/LvwrTQahu1yFQQIdsF2NdAo+N47LYn0hmsxMR7mQJcPBMniFyFqvJNKPnNk5v/+3X/7+7/9X//jr//wD//9H//5d3/1f/3v3/3xH//ub/7lD//4D9/+1f/+19//7m//6Q9//OMf/sdf/8f/9+8+/u0f7vzpj//n//k3//Bv//Kf/+Vv/ulffvdXfX7/u7//h//2u7+a+bb+73/449//7q/y419//4s/cO76yx959/n5D937X//v3//u3teOXh8fL569Xjx7v3j2efHsePHsfHD2nwb1dNBPB/N0cB8O1sfTwXo62E8H5+kgng6ePun19Emvp096PX3S6+mT3k+f9H76pPfTJ72fPun99Envp096P33S++mT3k+f9H76pM/TJ32ePunz9Emfp0/6PH3S5+mTPk+f9Hn6pM+nTzr2/csi8vxich9P4uP5ZD2f7OeT83wSzyf5fPLpk4/8edL5G34YEf3q6fPq6ffN0/Pj1dPXq6fvV08/r54er56er57+7LP6p0k/n8zzyX08qY/nk/V8sp9PzvPJp03l7r9MMtdveOqVr55er57er54+r55+3zy9P149fb16+n719PPq6Z9/VufjL5Na/V8/3p3PJ/V80s8n83xyH0/m4/lkPZ982lTtn/6OoqJ/w1Of8+rp8erp+erp9erp/erp8+rp983T78erp69XT//8s/rzpD9+y1+h73n19Hj19Hz19Hr19H719Hn19Pvi6fvzL7a+PP1Pk/V8sp9PzvNJPJ/k80k9n/TzyTyf3MeT9fzpr+dPfz1/+uv501/Pn/56/vTX86e/nj/99fzpr+dPfz9/+vv509/Pn/5+/vT386e/nz/9/fzp7+dPfz9/+vv50z/Pn/55/vTP86d/nj/98/zpn+dP/zx/+uf50z/Pn/55/vTj+dP//Nuk/pifJuc3vJWxP//i6Yedfl49PV49PV89vV49vV89fV49/b55+udfkv2w0599Vv802c8n5/kknk/y+aSeT/r5ZJ5P7uNJfTyfPH/69fzp1/OnX8+ffj1/+vX86dfzp1/Pn349f/r9/On386ffz59+P3/6/fzp9/On38+ffj9/+v386ffzpz/Pn/48f/rz/OnP86f/+TcJ/fOXz/NRv5jk80k9n/TzyTyf3MeTzx391yfr+eTTpz9r/zTZv+UHIp+L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nljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJ9bkn/urvKVife+J3NgWb57+vYoHzFThfgfMVOF+B8xU4X4HzFThfgfMVOF+B8xU4X4HzFThfgfMVOF+B8xU4X4HzFThfgfMVOF+B8xU4X4HzFThfgfMVOF+B8xU4X4HzFThfgfMVOF+B8xU4X4HzFThfgfMVOF+D8zU4X4PzNThfg/M1OF+D8zU4X4PzNThfg/M1OF+D8zU4X4PzNThfg/M1OF+D8zU4X4PzNThfg/M1OF+D8zU4X4PzNThfg/M1OF+D8zU4X4PzNThfg/M1OF+D8zU4X4PzNThfg/M1OF+D8zU4X4PzNThfg/M1OF+D8zU4X4PzNThfg/M1OF/De4MN7w02vDfY8N5gw3uDDe8NNnhigyc2eGKDJzZ4YoMnNnhigyc2eGKDJzZ4YoMnNnhigyc2eGKDJzZ4YoMnNnhigyc2eGKDJzZ4YoMnNnhigyc2eGKDJzZ4YoMnNnhigyc2eGKDJzZ4YoMnNnhigyc2eGKDJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjiwHuD87knfmdzn28+98TvbOD5gPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfBee74HwXnO+C811wvgvOd8H5LjjfBee74HwXnO+C811wvgvOd8H5LjjfBee74HwXnO+C811wvgvOd8H5LjjfBee74HwXnO+C811wvgvOd8H5LjjfBee74HwXnO+C811wvgvOd8H5LjjfBee74HwXnO+C811wvgvOd8H5LjjfBee74HwXnO+C811wvgvOd8H5LjjfBee78N7ghfcGL7w3eOG9wQvvDV54b/CCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkX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oKCDgg4KOijooKCDgg4aOmjooKGDhg4aOmjooKGDhg4aOmjoYKCDgQ4GOhjoYKCDgQ4GOhjoYKCDgQ4udHChgwsdXOjgQgcXOrjQwYUOLnQAnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnrjBEzd44gZP3OCJGzxxgydu8MQNnnjAEw944gFPPOCJBzzxgCce8MQDnnjAEw944gFPPOCJBzzxfO6Jv/brZH3bBGwSNvB8wPkOON8B5zvgfAec74DzHXC+A853wPkOON8B5zvgfAec74DzHXC+A853wPkOON8B5zvgfAec74DzHXC+A853wPkOON8B5zvgfAec74DzHXC+A853wPkOON8B5zvgfAec74DzHXC+A853wPkOON8B5zvgfAec74DzHXC+A853wPkOON8B5zvgfAec74DzHXC+A853wPkOON8B5zvgfAec74DzHXC+A853wPkOON8B5zvgfAec74DzHXC+A853wPkOON8B5zvgfAec74DzHXC+A853wPkCnC/A+QKcL8D5ApwvwPkCnC/A+QKcL8D5ApwvwPkC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", + "bytecode": "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", + "debug_symbols": "zd3brmXJeZ7pe+GxDlZE/LvQrTQagiTLBgFCMiS5gYahe+8UxSptuFYlxpM50PYBQZr1RZAa78xKPnNk5v/+3X/7u7/5X//jr37/9//9H/7pd3/5f/3v3/3hH/72r//59//w99/+1f/+l7/43d/84+//8Iff/4+/+o//37/7+Nd/uPPHv/6f/udf//2//st/+ue//sd//t1f9vmL3/3d3/+33/3lzLf1f//9H/7ud3+ZH//yF3/2F85df/or7z6//qV7/8v//Re/u/e1o9fHx4tnrxfP3i+efV48O148Ox+c/cdBPR3008E8HdyHg/XxdLCeDvbTwXk6iKeDp096PX3S6+mTXk+f9Hr6pPfTJ72fPun99Envp096P33S++mT3k+f9H76pPfTJ72fPunz9Emfp0/6PH3S5+mTPk+f9Hn6pM/TJ32ePunz6ZOOvH9aROcP/O3q3DdPj49XT1+vnr5fPf28enq8enq+enq9enq/evqzz+ofJ/fxJD+eT9bzyX4+Oc8n8XySzyefNpW7/zTJXD/w1LNfPX1ePf2+eXp9vHr6evX0/erp59XT49XT89XTP/2s1v7lZ0gV/SOn96unz6un3zdP749XT1+vnr5fPf28enq8enq+evrnn9VfJ/3xIz8SdL96+rx6+n3z9Pl49fT16un71dPPq6fHo9P/OMnnk3o+6eeTeT65jyf34/lkPZ/s55PzfPL86d/nT/8+f/r3+dO/z5/+ffz098fH88l6PtnPJ+f5JJ5P8vmknk/6+WSeT54//fX86a/nT389f/rr+dNfz5/+ev701/Onv54//fX86a/nT38/f/r7+dPfz5/+fv709/On/8V3Rh/zy+T8wLfM+4svmH7W6f3q6fPq6ffN07/4Uuxnnb5ePX2/evp59fR49fRnn9U/Tur5pJ9P5vnkPp7Ex/PJej7Zzyfn+SSeT54//Xj+9OP504/nTz+eP/18/vTz+dPP508/nz/9fP708/nTz+dPP58//Xz+9PP506/nT7+eP/16/vTr+dOv50+/nj/9ev706/nT//ybhFn7T5PZP/I3vM+/SfhZp3/+TcJPO329evp+9fTz6unx6un56un16un96umvflY//yZhTv5yevzAGyv7828Sftrp69XT96unn1dPj1dPz1dPr0en/3HSzyfzfHIfT+7H88l6PtnPJ+f5JJ5PPg8lf3n6U/UDoXz+VcZPO71fPX1ePf2+ePr5/GuXn3b6evX0Tz8qd8Uvk1X/JeLz+Zc5vz2J55N8Pqnnk34+meeT+3jy+Zc5vz1ZzyfPn/56/vTX86e/nj/99fzpr+dPfz1/+uv509/Pn/5+/vT386e/nz/9/fzp7+dPfz9/+vv509/Pn/5+/vTP86d/nj/98/zpn+dP/zx/+uf50z/Pn/55/vTP86d/nj/9eP704/nTj+dP//OvB+7+dZLxAz8R+fybhJ92er56er16er96+rx6+n3z9M+/S/lpp69XT9+vnv7qZzVf/azmq5/VfPWzms8+q3+czPPJfTypj+eT9Xyyn0/O80k8n+TzST2fPH/69fzp1/On38+ffj9/+v386ffzp9/Pn34/f/r9/On386ffz59+P3/68/zpz/OnP8+f/ufmf+vXH2Dn4I/Ff/6Xdvzy6+V6Pv7rD9uffz3w/8d/kPw/5T/Ip/2vj/3L8d/+6fmz59kyGhldGH3+5cP3RktGW0ZHRiGjlJEUcaWIK0VcKCI+PmS0ZLRldGQUMkoZlYxaRiMjKWJJEUuKWFLEkiKWFLGkiCVFLCliSRFLithSxJYithSxpYgtRWwpYksR+4sizr+P6gd+XWnsefn8++755+Pl89fL5++Xzz8vnx8vn58vn18vn//y5/e8/Pk9L39+4+XP7+ffB61v/++X89f6sx90P/9G6HujI6OQUcqoZNQyGhldGH3+pcf3RlJEShEpRaQUkVJEShEpRaQUkVJESRElRZQUUVJESRElRZQUUVJESRElRbQU0VJESxEtRbQU0VJESxEtRbQU0VLESBEjRYwUMVLESBEjRYwUMVLESBEjRVwp4koRV4q4UsQXGr7+XRtW/sBvwBZfwPnPO79ePr9fPn9ePv++en5+8X3Azzt/vXz+fvn88/L58fL5+fL59fL5/fL5X3x+p389//7XH3Tzi28/vjPaMjoyChmljEpGLSN6ThdGX3z78Z2RFLGliC1FbCliSxFH/jsd+e905L/Tof9OUvmRyo9UfqTykMpDKg8pIqSIkCJCiggp4gsn3Ofjl9HO/QN/K/uCFH/e+fny+fXy+f3y+fPy+ffd879A1Z93/nr5/P3y+S9/fr8A4LN+/UHlrP/62/jkFwD8nVHJqGU0Mrow+gKAvzNaMtoyOjKSIlqKaCmipYiWIlqKGClipIiRIkaKGClipIiRIkaKGClipIgrRVwp4koRV4q4UsSVIq4UcaWIK0VcKKI+PmS0ZLRldGQUMkoZlYxaRiMjKWJJEUuKWFLEkiKWFLGkiCVFLCliSRFLithSxJYithSxpYgtRWwpYksRW4rYUsSWIo4UcaSII0UcKeJIEUeKOFLEkSKOFHGkiJAiQooIKSKkiJAiQooIKSKkiJAiQopIKSKliJQiUopIKSKliJQiUopIKSKliJIiSoooKaKkCDHLErMsMcsSsywxyxKzLDHLErMsMcsSsywxyxKzLDHL+sosd/46uj/wC1HqK978aeffd8//Ck1/2vnr5fP3y+efl8+Pl8/Pl8+vl89/+fM7L39+5+XP733583tf/vx+Bef31x/UY+WPnH9ePj9ePj9fPr9ePr9fPn9ePv++en5/9YXETzt/PTz/j6MtoyOjkFHKqGTUMhoZXRitDxlJEUuKWFLEkiKWFLGkiCVFLCliSRFbithSxJYithSxpYgtRWwpYksRW4rYUsSRIo4UcaSII0UcKeJIEUeKOFLEkSKOFBFSREgRIUWEFBFSREgRIUWEFBFSREgRKUWkFJFSREoRKUWkFJFSREoRKUWkFFFSREkRJUWUFFFSREkRX3x3Ef3L7xS8cv3AH2nVX3zN8fPOn5fPv++e/8X3LD/v/PXy+fvl88/L58fL5+fL57/8+e2XP7/98ue3X/78fvGlVO796/kRP3L+evn8/fL55+Xz4+Xz8+Xz6+Xz++Xz5+Xz77vn35c/v/flz+8XX0rlr38i6cr6r28a9BffNH1nFDJKGZWMvgj9P/xA/5+//fvjaGR0n4/miy9PvjNaMvq8iNrnl1Ht+LPRkVHIKGVUMmoZjYwujL74RuQ7oyUjKeKLb0Qqf/1fk5XzZ6OQUcqoZNQyGhldGH3xjch3RktGW0ZSxJYithSxpYgtRWwpYksRR4o4UsSRIo4UcaSII0UcKeJIEUeKOFJESBEhRYQUEVJESBEhRYQUEVJESBEhRaQUkVJEShEpRaQUkVJEShEpRaQUkVJESRElRZQUUVJESRElRZQUUVJESRElRbQU0VJESxEtRbQU0VJESxEtRbQU0VLESBEjRYwUMVLESBEjRYwUMVLESBEjRVwp4koRV4q4UsSVIq4UcaWIK0VcKeJCEffjQ0ZLRltGR0Yho5RRyahlNDKSIpYUsaSIJUWIWV4xyytmecUsr5jlFbO8YpZXzPKKWV4xyytmecUsr5jlFbO8YpZXzPKKWV4xyytmecUsr5jlFbO8YpZXzPKKWV4xyytmecUsr5jlFbO8YpZXzPKKWV4xyytmecUsr5jlFbO8YpZXzPKKWV4xyytmecUsr5jlFbO8YpZXzPKKWV4xyytmecUsr5jl/cIse80vo54feMvxfsGbP+/8efn8++75X/jqzzt/vXz+fvn88/L58fL5+fL5Tz+/fxy1jEZGF0bzIaMloy2jI6OQUcpIihgpYqSIkSKuFHGliCtFXCniShFXirhSxJUirhRxoYj18fFBq0WrTatDq6BV0qpo1bQaWlEbi9pY1MaiNha1saiNRW0samNRG4vaWNTGpjY2tbGpjU1tbGpjUxub2tjUxqY2NrVxqI1DbRxq41Abh9o41MahNg61caiNQ20EtfGFRff99RdxzfmBX8T17YL99gXn7Qvi7Qvy7Qvq7Qv67Qvm7Qvuyxd88b3A3F9/wdvc+bOP5xdfDHxvtWl1aBW0SloVrZpWQ6srq6I2itooaqOojaI2itooaqOojaI2itpoaqOpjaY2mtpoaqOpjaY2mtpoaqOpjaE2htoYamOojaE2htoYamOojaE2htq41MalNi61camNS21cauNSG5fauNTGlTbWxwetFq02rQ6tglZJq6JV02poRW0samNRG4vaWNTGojYWtbGojUVtLGpjURub2tjUxqY2NrWxqY1NbWxqY1Mbm9rY1MahNg61caiNQ20cauNQG4faONTGoTYOtRHURlAbQW0EtRHURlAbQW0EtRHURlAb5KLrCxe9H7+ubv0I164vCPUnXnDeviDeviDfvqDevqDfvmDevuC+fMEXNP0TL3j7k/wFeN/++PWC+/FDF5y3L4i3L8i3L6i3L+i3L5i3L/j0k7w/Pn75xRHf/umf/33w828HvrtatNq0OrQKWiWtilZNq6EVtTHUxlAbQ20MtTHUxlAbQ20MtTHUxlAbl9q41MalNi61camNS21cauNSG5fauNLG/vig1aLVptWhVdAqaVW0aloNraiNRW0samNRG4vaWNTGojYWtbGojUVtLGpjUxub2tjUxqY2NrWxqY1NbWxqY1Mbm9o41MahNg61caiNQ20cauNQG4faONTGoTaC2ghqI6iNoDaC2ghqI6iNoDaC2ghq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eOIBTzzgiQc88YAnHvDEA554wBMPeOIBTzzgiQc88YAnHvDEA554wBMPeOIBTzzgiQc88YAnHvDEA554wBMPeOIBTzzgiQc88YAnHvDEA554wBMPeOIBTzzgiQc88YAnHvDEA554wBMPeOIBTzzgiQc88YAnHvDEA554wBMPeOIBTzzgiQc88YAnHvDEA554wBMPeOIBTzzgiQc88YAnHvDEA554wBMPeOIBTzzgiQc88YAnHvDEA554wBMPeOIBTzzgiQc88YAnHvDEA554wBMPeOIBTzzgiQc88YAnHvDEA554wBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATAzwxwBMDPDHAEwM8McATEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBEws8scATCzyxwBMLPLHAEws8scATCzyxwBMLPLHAEws8scATCzyxwBMLPLHAEws8scATCzyxwBPrc0/8zT9TsD73xO9sAjYJG3g+4HwFzlfgfAXOV+B8Bc5X4HwFzlfgfAXOV+B8Bc5X4HwFzlfgfAXOV+B8Bc5X4HwFzlfgfAXOV+B8Bc5X4HwFzlfgfAXOV+B8Bc5X4HwFzlfgfAXOV+B8Bc5X4HwFzlfg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PLHBExs8scETGzyxwRMbPLHBExs8scETO56/H9Kfe+J3Ngmbgg08H3C+BudrcL4G52twvgbna3C+BudrcL4G52twvgbna3C+BudrcL4G52twvgbna3C+BudrcL4G52twvgbna3C+BudrcL4G52twvgbna3C+BudrcL4G52twvgbna3C+BudrcL4G52twvgbna3C+BudrcL4G52twvgbna3C+BucbcL4B5xtwvgHnG3C+AecbcL4B5xtwvgHnG3C+AecbcL4B5xtwvgHnG3C+AecbcL4B5xtwvgHnG3C+AecbcL4B5xtwvgHnG3C+AecbcL4B5xtwvgHnG3C+AecbcL4B5xtwvgHnG3C+AecbcL6B9wYH3hsceG9w4L3BgfcGB94bHPDEAU8c8MQBTxzwxAFPHPDEAU8c8MQBTxzwxAFPHPDEAU8c8MQBTxzwxAFPHPDEAU8c8MQBTxzwxAFPHPDEAU8c8MQBTxzwxAFPHPDEAU8c8MQBTxzwxAFPHPDEAU8c8MQBTxzwxAFPHPDEAU8c8MQBTxzwxAFPHPDEAU8c8MQLnnjBEy944gVPvOCJFzzxgide8MT7uSf+5vsH93NP/O0NON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853nztffDx3vm+bBZsNmwObgE3CpmDTsBnYQAcLOljQwYIOFnSwoIMFHSzoYEEHCzpY0MGGDjZ0sKGDDR1s6GBDBxs62NDBhg42dHCggwMdHOjgQAcHOjjQwYEODnRwoIMDHQR0ENBBQAcBHQR0ENBBQAcBHQR0ENBBQgcJHSR0kNBBQgcJHSR0kNBBQgcJHRR0UNBBQQcFHRR0UNBBQQcFHRR0UNBBQwcNHTR00NBBQwcNHTR00NBBQwcNHQx0MNDBQAcDHQx0MNDBQAcDHQx0MNDBhQ4udHChgwsd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4oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCcOeOKAJw544oAnDnjigCde8MQLnnjBEy944gVPvOCJFzzxgide8MQLnnjBEy944gVPvOCJFzzxgide8MQLnnjBEy944gVPvOCJFzzxgide8MQLnnjBEy944gVPvOCJFzzxgide8MQLnnjBEy944gVPvOf571Nyz8Dm+e9TcuMDNvB8wPkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC++9z56uO5833bLNhs2BzYBGwSNgWbhs3ABjpY0MGCDhZ0sKCDBR0s6GBBBws6WNDBgg42dLChgw0dbOhgQwcbOtjQwYYONnSwoYMDHRzo4EAHBzo40MGBDg50cKCDAx0c6CCgg4AOAjoI6CCgg4AOAjoI6CCgg4AOEjpI6CChg4QOEjpI6CChg4QOEjpI6KCgg4IOCjoo6KCgg4IOCjoo6KCgg4IOGjpo6KChg4YOGjpo6KChg4YOGjpo6GCgg4EOBjoY6GCgg4EOBjoY6GCgg4EOLnRwoYMLHVzo4EIHFzq40MGFDi50AJ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOICT1zgiQs8cYEnLvDEBZ64wBMXeOJ6/uchf9s8/nVGtcH5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot+G9wQ3vDR54b/DAe4MHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcGeGKAJwZ4YoAnBnhigCcmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJyZ4YoInJnhigicmeGKCJ+bnnvibv9defu6J39kEbBI28HzA+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5CpyvwPkKnK/A+Qqcr8D5Ct4bLHhvsOC9wYL3BgveGyx4b7DAEws8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPLHBExs8scETGzyxwRMbPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzzxgide8MQLnnjBEy944gVPvOCJFzzxgifezz3xN399/f3cE7+z+fT5nPj4ZfTtn95fV/nxp1XQKmlVtGpaDa2urD5Xv++uFq02raiNTW1samNTG5va2NTGpjYOtXGojUNtHGrjUBuH2jjUxqE2DrVxqI2gNoLaCGojqI2gNoLaCGojqI2gNoLaSGojqY2kNpLaSGojqY2kNpLaSGojqY2iNoraKGqjqI2iNoraKGqjqI2iNoraaGqjqY2mNpraaGqjqY2mNpraaGqjqY2hNobaGGpjqI2hNobaGGpjqI2hNobauNTGpTYutXGpjUttXGrjUhuX2rjUxoU2+uPjg1aLVptWh1ZBq6RV0appNbSiNha1saiNRW0samNRG4vaWNTGojYWtbGojU1tbGpjUxub2tjUxqY2NrWxqY1NbWxq41Abh9o41MahNg61caiNQ20cauNQG4faCGojqI2gNoLaCGojqI2gNoLaCGojqI2kNpLaSGojqY2kNpLaSGojqY2kNpLaKGrjKxdd/76a/I+rv/izv/i3XgD4dsF++4Lz9gXx9gX59gX19gX99gXz9gX35Qu+oumfd8Hbn+SvwPvX0cn1Yxecty+Ity/Ity+oty/oty+Yty+4L1/wxRcJWfnrBf/5g/Zvq0WrTatDq6BV0qpo1bQaWl1ZXWrjUhuX2rjUxqU2LrVxqY1LbVxq40ob6+ODVotWm1aHVkGrpFXRqmk1tKI2FrWxqI1FbSxqY1Ebi9pY1MaiNha1saiNTW1samNTG5va2NTGpjY2tbGpjU1tbGrjUBuH2jjUxqE2DrVxqI1DbRxq41Abh9oIaiOojaA2gtoIaiOojaA2gtoIaiOojaQ2ktpIaiOpjaQ2ktpIaiOpjaQ2ktooaqOojaI2itooaqOojaI2itooaqOojaY2mtpoaqOpjaY2mtpoaqOpjaY2mtogF13kootcdJGLLnLRRS66yEUXuegiF13kootcdJGLLnLRRS66yEUXuegiF13kootcdJGLbnLRTS66yUU3uegmF93koptcdJOLbnLRTS66yUU3uegmF93koptcdJOLbnLRTS66yUU3uegmF93koptcdJOLbnLRTS66yUU3uegmF91fuei/f51fs//j6uHX+fsrQv15F6y3L9hvX3DeviDeviDfvqDevqDfvmDevuDtT/IX4F0zv1zw7achP3TBevuC/fYF5+0L4u0L8u0L6u0L+uULnv9+y982CzYbNgc2AZuETcGmYTOwuc83BR0UdFDQQUEHBR0UdFDQQUEHBR0UdNDQQUMHDR00dNDQQUMHDR00dNDQQUMHAx0MdDDQwUAHAx0MdDDQwUAHAx0MdHChgwsdXOjgQgcXOrjQwYUOLnRwoYPnv99yn+e/3/K3zYLNhs2BTcAmYVOwadgMbKCDBR0s6GBBBws6WNDBgg4WdLCggwUdLOhgQwcbOtjQwYYONnSwoYMNHWzoYEMHGzo40MGBDg50cKCDAx0c6OBABwc6ONDBgQ4COgjoIKCDgA4COgjoIKCDgA4COgjoADzxgCce8MQDnnjAEw944gFPPOCJBzzxgCce8MQDnnjAEw944gFPPOCJBzzxgCce8MQDnnjAEw944gFPPOCJBzzxgCce8MQDnnjAEw944gFPPJ974m/92T7fNhs2BzbwfMD5DjjfAec74HwHnO+A8x1wvgPOd8D5DjjfAec74HwHnC/A+QKcL8D5ApwvwPkCnC/A+QKcL8D5ApwvwPkCnC/A+QKcL8D5ApwvwPkCnC/A+QKcL8D5ApwvwPkCnC/A+QKcL8D5ApwvwPkCnC/A+QKcL8D5ApwvwPkCnC/A+QKcL8D5ApwvwPkCnC/A+QKcL8D5ApwvwPnic+f7zf9dEp8733c29/kG/C3A3wL8LcDfAvwtwN8C/C3A3wL8LcDfAvwtwN8C/C3A3wL8LcDfAvwtwN8C/C3A3wL8LcDfAvwtwN8C/C3A3wL8LcDfAvwt4H2+gPf5At7nC3ifL+B9vgDnC3C+AOcLcL4A5wtwvgDnC3C+AOcLcL4A5wtwvgDnC3C+BOdLcL4E50twvgTnS3C+BOdLcL4E50twvgTnS3C+BOdLcL4E50twvgTnS3C+BOdLcL4E50twvgTnS3C+BOdLcL4E50twvgTnS3C+BOdLcL4E50twvgTnS3C+BOdLcL4E50twvgTnS3C+BOdLcL4E50twvgTnS3ifL+F9voT3+RLe50t4ny/BExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExM8McETEzwxwRMTPDHBExPe58vPPfE7m4QNPB9wvgTnS3C+BOdLcL4E50twvgTnS3C+BOdLcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucrcL4C5ytwvgLnK3C+AucreG+w4L3BgvcGC94bLHhvsMATCzyxwBMLPLHAEws8scAT6z733vrcE7+zadg8/3UfDc7X4HwNztfgfA3O1+B8Dc7X4HwNztfgfA3O1+B8Dc7X4HwNztfgfA3O1+B8Dc7X4HwNztfgfA3O1+B8Dc7X4HwNztfgfA3O1+B8Dc7X4HwNztfgfA3O1+B8Dc7X4HwNztfgfA3O1+B8Dc7X4HwNztfgfA3O1+B8Dc7X4HwNztfgfA3O1+B8Dc7X4HwNztfgfA3O1+B8Dc7X9fz34+o6sAnYJGzg+YC/Nfhbg781+FuDvzX4W4O/Nfhbg781+FuDvzX4W4O/Nfhbg781+FuDvzX4W4O/Nfhbg781+FuDvzX4W4O/Nfhbw/t8De/zNbzP1/A+X8P7fAPv8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0434DzDTjfgPMNON+A8w0438D7fAPv8w28zzfwPt/A+3wD7/MNeOKAJw544oAnDnjigCcOeOL0c++dLtg0bJ6/vzPgfAPON+B8A8434HwDzjfgfAPON+B8A8434HwDzjfgfAPON+B8A8434HwDzjfgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74LzXXC+C853wfkuON8F57vgfBec74Lz3Xj+/s6NA5uATcIGng/42wV/u+BvF/ztgr9d8LcL/nbB3y742wV/u+BvF/ztgr9d8LcL/nbB3y742wV/u+BvF/ztgr9d8LcL/nbB3y742wV/u/A+34X3+S68z3fhfb4L7/NdeJ/vgvNdcL4LznfB+S443wXnu+B8F5zvgvNdcL4LznfB+S443wXnu+B8F5zvgvNdcL773Pnm47nzfdss2GzYHNgEbBI2BZuGzcAGOljQwYIOFnSwoIMFHSzoYEEHCzpY0MGCDjZ0sKGDDR1s6GBDBxs62NDBhg42dLChgwMdHOjgQAcHOjjQwYEODnRwoIMDHRzoIKCDgA4COgjoIKCDgA4COgjoIKCDgA4SOkjoIKGDhA4SOkjoIKGDhA4SOkjooKCDgg4KOijooKCDgg4KOijooKCDgg4aOmjooKGDhg4aOmjooKGDhg4aOmjoYKCDgQ4GOhjoYKCDgQ4GOhjoYKCDgQ4udHChgwsdXOjgQgcXOrjQwYUOLnQAnrjAExd44gJPXOCJCzxxgScu8MQFnrjAExd44gJPXOCJCzxxgScu8MQFnrjW4/f9v20aNgOb+3zzuSd+Z7NgA88HnG+B8y1wvgXOt8D5FjjfAudb4HwLnG+B8y1wvgXOt8D5FjjfAudb4HwLnG+B8y1wvgXOt8D5FjjfAudb4HwLnG+B8y1wvgXOt8D5FjjfAudb4HwLnG+B8y1wvgXOt8D5FjjfAudb4HwLnG+B8y1wvgXOt8D5FjjfAudb4HwLnG+B8y1wvgXOt8D5FjjfAudb4HwLnG+B8y1wvgXOt8D5FjjfAudb4HwLnG+B8y1wvgXOt8D5FjjfAudb4HwLnG+B8y1wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3Ot8H5NjjfBufb4HwbnG+D821wvg3vDW54b3DDe4Mb3hvc8N7ghvcGN7w3uOG9wQ2euMETN3jiBk/c4IkbPHGDJ27wxA2euMETN3jiBk/c4IkbPHGDJ27wxA2euMETN3jiBk/c4IkbPHGDJ27wxA2euMETN3jiBk/c4IkbPHGDJ27wxA2euMETN3jiBk/c4IkbPHGDJ27wxA2euMETN3jiBk/c4IkbPHGDJ27wxA2euMETN3jiBk/c4IkbPHGDJ27wxA2euMETN3jiBk/c4IkbPHGDJ27wxA2euMETN3jiBk/c4IkbPHGDJ27wxA2euMETN3jiBk884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxAOeeMATD3jiAU884IkHPPGAJx7wxABPDPDEAE8M8MQATwzwxABPDPDEAE8M8MQATwzwxABPDPDEAE8M8MQATwzwxABPDPDEAE8M8MQATwzwxABPDPDEAE8M8MQATwzwxABPDPDEAE8M8MQATwzwxABPDPDEAE8M8MQATwzwxABPDPDEAE8M8MQATwzwxABPDPDEAE8M8MQATwzwxPjcE3/z986ITNgUbBo2A5vnv09J1AdsFmzgcwrOF+B8Ac4X4HwBzhfgfAHOF+B8Ac4X4HwBzhfgfAHOF+B8Ac4X4HwBzhfgfAHOF+B8Ac4X4HwBzhfgfAHOF+B8Ac4X4HwBzhfgfAHOF+B8Ac4X4HwBzpfgfAnOl+B8Cc6X4HwJzpfgfAnOl+B8Cc6X4HwJzpfgfAnOl+B8Cc6X4HwJzpfgfAnOl+B8Cc6X4HwJzpfgfAnOl+B8Cc6X4HwJzpfgfAnOl+B8Cc6X4HwJzpfgfAnOl+B8Cc6X4HwJzpfgfAnOl+B8Cc6X4HwJzpfgfAnOl+B8Cc6X4HwJzpfw3mDCe4MJ7w0mvDeY8N5gwnuDCe8NJrw3mPDeYMJ7gwmemOCJCZ6Y4IkJnpjgiQmemOCJCZ6Y4IkJnpjgiQmemOCJCZ6Y4IkJnpjgiQmemOCJCZ6Y4IkJnpjgiQmemOCJCZ6Y4IkJnpjgiQmemOCJCZ6Y4IkJnpjgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkFnljgiQWeWOCJBZ5Y4IkNntjgiQ2e2OCJDZ7Y4IkNntjgiQ2e2OCJDZ7Y4IkNntjgiQ2e2Ov5rzNq+POQG/485IY/D7nhz0Nu+POQG5yvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcr8H5GpyvwfkanK/B+Rqcb8D5BpxvwPkGnG/A+Qacb8D5BpxvwPkGnG/A+Qacb8D5BpxvwPkG3hsceG9w4L3BgfcGB94bHHhvcOC9wYH3Bgc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPHHAEwc8ccATBzxxwBMHPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeMETL3jiBU+84IkXPPGCJ17wxAueeJ974jdO/IDNgs2GzYFNwCZhU7Bp2AxsoIMFHSzoYEEHCzpY0MGCDhZ0sKCDBR0s6GBDBxs62NDBhg42dLChgw0dbOhgQwcbOjjQwYEODnRwoIMDHRzo4EAHBzo40MGBDgI6COggoIOADgI6COggoIOADgI6COggoYOEDhI6+NwTf+v3zvi2CdgkbAo2DZuBzX2+efrnIf/Lt3/1//z1P/7+r//mD3/3T98W//pv/q+//9t//v0//P2f/uU//7//85d/52/+8fd/+MPv/8df/c9//Ie//bv/9r/+8e/+6g//8Lf/+u/97uNf/+GPP0ddZ+2/+PYP/e0/zh9/Arri9F98+4f77a5v9/1/", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_0.snap index fccdcd899c7..c85f37be207 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_0.snap @@ -34,8 +34,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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5fRq9xaQdzm92r0F5F1Or3ZvAXmX06vdW0De5fRq9xaQdzm92r0F5F1Or3ZvAXmX06vdWzjeNVCvZqBezUC9moF6Nbs43jVQr2agXs1AvZqBejUD9WoG6tUM1KsZqFczUK9moF7NQL2agXo1A/VqBurVDNSrGahXM1CvZqBezUC9moF6NQP1agbq1QzUqxmoVzNQr2agXs1AvZqBejUD9WoG6tUM1KsZqFczUK9moF7NQL2agXo1A/VqBurVDNSrGahXM1CvZqBezUC9moF6NQP1agbq1QzUqxmoVzNQr2agXs1AvZqBejUD9WoG6tUM1KsZqFczUK9moF7NQL2agXo1A/VqBurVDNSrGahXM1CvZqBezUC9moF6NQP1agbq1QzUqxmoVzNQr2agXs1AvZqBejUD9WoG6tUM1KsZqFczUK9moF7NQL2agXo1A/VqBurVDNSrGahXM1CvZqBezUC9moF6NQP1agbq1QzUqzmoV3NQr+agXs1BvZpfHO86qFdzUK/moF7NQb2ag3o1B/VqDurVHNSrOahXc1Cv5qBezUG9moN6NQf1ag7q1RzUqzmoV3NQr+agXs1BvZqDejUH9WoO6tUc1Ks5qFdzUK/moF7NQb2ag3o1B/VqDurVHNSrOahXc1Cv5qBezUG9moN6NQf1ag7q1RzUqzmoV3NQr+agXs1BvZqDejUH9WoO6tUc1Ks5qFdzUK/moF7NQb2ag3o1B/VqDurVHNSrOahXc1Cv5qBezUG9moN6NQf1ag7q1RzUqzmoV3NQr+agXs1BvZqDejUH9WoO6tUc1Ks5qFdzUK/moF7NQb2av7dXO/nlP/bM9dstDtoSoC0J2lKgLQ3ackBbBrTlhXe//udH2btc96pX+5QtBtrioC0B2pKgLQXa0qAt551bvu26V73ap2xZzJa4LtAWA21x0JaPvVtdX7f8n79m+PkqpauSrlq6OtLVSFerXL2oir53ZdKVS1cSGyaxYRIbJrFhEhsmsWESGy6x4RIbLrHhEhsuseESGy6x4RIbLrHhEhshsRESGyGxERIbIbEREhshsRESGyGxERIbKbGREhspsZESGymxkRIbKbGREhspsZESGyWxURIbJbFREhslsVESGyWxURIbJbFREhstsdESGy2x0RIbLbHREhstsdESGy2x0RIbR2LjSGwciY0jsXEkNo7ExpHYOBIbR2LjSGyMxMZIbIzExkhsjMTGSGyMxMZIbIzExkhsrMTGSmysxMZKbKzExkpsrMTGSmysxMYqbOR1SVcmXbl0FdJVSlclXbV0daSrka4kNqR30ZTeRVN6F03pXTSld9GU3kVTehdN6V00pXfRlN5FU3oXTeldNKV30ZTeRVN6F03pXTSld9GU3kVTehdN6V00pXfRlN5FU3oXTeldNKV30ZTeRVN6F03pXTSld9GU3kVTehdN6V00pXfRlN5F89W76N9/ktzjv776n/tGRr56bf2ULQ3ackBbBrRlOVtevY1/yhYDbXHQlgBtAXm3QN4tkHcL5N0CebdA3u23eveb34TLNtAWB20J0JYEbSnQlgZtOaAtH3u3Z75sOX69y3XL2fLiZ7qfs8VAWxy0JUBbErSlQFv6nVu+7boX3xb4nC0D2rKcLXOBthhjy9/uf/X//e4vf/jdP//x9/9xX/z4b/7nn/7lr3/4859++Zd//f///cu/889/+cMf//iHf/unf//Ln//l9//6n3/5/T/98c//8uO/98P14//46WeHcf+59h+iyu7fzZ9+LHj/7/7j/yHv/677v+9/Aw==", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index df49b185b15..2ee9c1dc5cd 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/debug_logs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -34,8 +34,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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Nqd2bU7t2pxd3xCSrm8ISdc3hKTrG0LS9Q0h6fqGkHR9Q0i6viEkXd8Qkq5vCEnXN4Sk6xtC0vUNIen6hpB0fUNIur4hJF3fEJKubwhJ1zeEpOsbQtL1DSHp+oaQdH1DSLq+ISRd3xCSrm8ISdc3hKTrG0LS9Q0h6fqGkHR9Q0i6viEk4DeEPvwbJAr4DaEHwrnN+UD4O81p8k14zAfC3cY34fbffvjLFlK/hdZvceq3sPotvH6LqN5C33vp5ZlbzPotVv0Wu34Lqd9C67c49VtY/RZev0W9u2e9u2e9u2e9u2e9u2e9u2e9u2e9u2e9u2e9u2e9u1e9u1e9u1e9u1e9u1e9u1e9u1e9u1e9u1e9u1e9u3e9u3e9u3e9u3e9u3e9u3e9u3e9u3e9u3e9u3e9u6Xe3VLvbql3t9S7W+rdLfXulnp3S727pd7dUu9urXe31rtb692t9e7Wendrvbu13t1a726td7fWu/vUu/vUu/vUu/vUu/vUu/vUu/vUu/vUu/vUu/vUu9vq3W317rZ6d9tT3O1ft4gff+X+0Q8/606HmnQVrl2Fn67Cratw7yo8mgr30VX4xAr/8MKV+uoqnNucD4Rzm/OB8NLm/LLFqd/C6rfw+i2ifIsY9VvM+i1W/Ra7fgup36Le3VHv7qh3d9S7O8rdfcao32LWb7Hqt9j1W0j9Flq/xanfwuq38Pot6t0969096909690969096909690969096909690969296t296t296t296t296t296t296t296t296t296t29692969296929692969296929692969296929690t9e6WendLvbul3t1S726pd7fUu1vq3S317pZ6d2u9u7Xe3Vrvbq13t9a7W+vdrfXu1np3a727td7dp97dp97dp97dz7izGufrxbk9hnz8w8+6xnGecRP2NcK1q/DTVbh1Fe5dhUdT4c+4Df0a4bOr8NVVeNfmfMZ98NcI79qc1rU5rWtzWtfmtK7N6V2b07s2p3dtTu/anM+4D/4a4V2b07s2p3dtTu/anN61OaNrc0bX5oyuzRldm/MZVMRrhHdtzujanNG1OaNrc0bT5rTRtDltNG1OG02b00bT5rTRtDltNG1OG02b00bT5rTRtDltdG3O2bU5Z9fmnF2bc3ZtzmfQfK8R3rU5Z9fmnF2bc3Ztztm1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aTkgLQbS4iAt8ZlaPs66d3i112h5J3fVv2kx/VjLlvF1h+ufxi9/+MsWq36LXb+F1G+h9Vuc+i2sfguv3yLKt3gHn3rqFvXujnp3R727o97dUe/uqHd31Ls76t0d5e62Meq3mPVbrPotdv0WUr+F1m9x6rew+i28fot6d896d896d896d896d896d896d896d896d896d896d696d696d696d696d696d696d696d696d696d696d+96d+96d+96d+96d+96d+96d+96d+96d+96d+96d0u9u6Xe3VLvbql3t9S7W+rdLfXulnp3S727pd7dWu9urXe31rtb692t9e7Wendrvbu13t1a726td/epd/epd/epd/epd/epd/epd/epd/epd/epd/epd7fVu9vq3W317rZ6d1u9u63e3Vbvbqt3t9W72+rd7fXurr+rZvV31az+rprV31Wz+rtqVn9Xzervqln9XTWrv6tm9XfVrP6umtXfVbP6u2pWf1fN6u+qWf1dNau/q2b1d9Ws/q6a199V8/q7al5/V83r76r5kPottH6LU7+F1W/h9VvUu7v+rprX31Xz+rtqXn9Xzevvqnn9XTWvv6vm9XfVvP6umtffVfP6u2r+lLtq859b+IMffhb050+5AfcS4burcOkqXLsKP12FW1fh3lV4NBX+lBubLxHetTl31+bcXZvzKTdhXyK8a3Purs25uzbn7tqcu2tzStfmlK7NKV2bU7o251Numb9EeNfmlK7NKV2bU7o2p3RtTu3anNq1ObVrc2rX5nwKwfES4V2bU7s2p3ZtTu3anNq1OU/X5jxdm/N0bc7TtTmfQke9RHjX5jxdm/N0bc7TtTlP1+a0rs1pXZvTujandW3Op5CHLxHetTmta3Na1+a0rs1pXZvTuzand21O79qc3rU5n0L1vkR41+b0rs3pXZvTuzand23O6Nqc0bU5o2tzRtfmfAox/xLhXZszujZndG3O6Nqc0bQ5YzRtzhhNmzNG0+aM0bQ5YzRtzhhNmzNG0+aM0bQ5YzRtzhhdm3N2bc7ZtTln1+acXZvzKS+9vER41+acXZtzdm3O2bU5Z9fmXF2bs+sbQtH1DaHo+oZQdH1DKLq+IRRd3xCKrm8IRdc3hKLrG0LR9Q2h6PqGUHR9Qyi6viEUXd8Qiq5vCEXXN4Si6xtC0fUNoej6hlB0fUMour4hFF3fEIqubwhF1zeEousbQtH1DaHo+oZQdH1DKLq+IRRd3xCKrm8IRdc3hKLrG0LR9Q2h6PqGUHR9Qyi6viEUXd8Qiq5vCEXXN4Si6xtC0fUNoej6hlB0fUMour4hFF3fEIqubwhF1zeEousbQtH1DaHo+oZQdH1DKLq+IRRd3xCKrm8IRdc3hKLrG0LR9Q2h6PqGUHR9Qyi6viEUXd8Qiq5vCEXXN4Si6xtC0fUNoej6hlB0fUMour4hFF3fEIqubwhF1zeEousbQtH1DaHo+oZQdH1DKLq+IRRd3xCKpm8I6Wj6htAlvGdzXsJ7NuclvGdzXsJ7NuclvGdzXsJ7NuclvGdzXsJ7NuclvGtzNn1D6BLetTmbviF0Ce/anE3fELqEd23Opm8IXcK7NmfTN4Qu4V2bs+kbQpfwrs3Z9A2hS3jX5mz6htAlvGtzNn1D6BLetTmbviF0Ce/anE3fELqEd23Opm8IXcK7NmfTN4Qu4V2bs+kbQpfwrs3Z9A2hS3jX5mz6htAlvGtzNn1D6BLetTmbviF0Ce/anE3fELqEd23Opm8IXcK7NmfTN4Qu4V2bs+kbQpfwrs3Z9A2hS3jX5mz6htAlvGtzNn1D6BLetTmbviF0Ce/anE3fELqEd23Opm8IXcK7NmfTN4Qu4V2bs+kbQpfwrs3Z9A2hS3jX5mz6htAlvGtzNn1D6BLetTmbviF0Ce/anE3fELqEd23Opm8IXcK5zWny9T/WfPxaOLc5HwjnNucD4dzmfCCc25wPhHOb84FwbnM+EM5tzgfCn9Gc38RsnZ9VQE95Q+glwmdX4aur8N1VuHQVrl2Fn67CDSv84wJ6yhtCLxHObc4Phc/Bbc4HwrnN+UA4tzkfCH9Cc+rRb8L/+x9rv2wh9Vto/Ranfgur38Lrt4jyLZ7x0sujLWb9Fqt+i3p3z3p3z3p3z3p3z3p3z3p3z3p3r3p3r3p3r3p3r3p3r3p3r3p3r3p3r3p3r3p3r3p373p373p373p373p373p373p373p373p373p373p3S727pd7dUu9uqXe31Ltb6t0t9e6WendLvbul3t1a726td7fWu1vr3a317tZ6d2u9u7Xe3Vrvbq1396l396l396l396l396l396l396l396l396l396l3t9W72+rdbfXutnp3W727rd7dVu9uq3e31bvb6t3t9e72end7vbu93t1e726vd7fXu9vr3e317vZ6d0e9u6Pe3VHv7qh3d9S7O+rdHfXujnp3R727o9zda4z6LWb9Fqt+i12/hdRvofVbnPotrH4Lr9+i3t31d9VW/V21VX9XbdXfVVv1d9VW/V21VX9XbdXfVVv1d9VW/V21VX9XbdXfVVv1d9VW/V21VX9XbdXfVVv1d9VW/V21VX9XbdXfVVv1d9VW/V21VX9XbdXfVVv1d9VW/V21VX9XbdXfVVv1d9VW/V21VX9XbdXfVVv1d9VW/V219ZS7av/k546vj3/4WVTuesoNuJcIP12FW1fh3lV4NBX+lPuKLxE+uwpfXYXvrsK7Nqd2bU7t2pzatTm1a3Nq1+Y83Ob88D2LdbjN+UA4tzkfCOc25wPh3OZ8IJzbnA+Ec5vzgXBucz4Q/oTmPP71h7et8VkFFE2FP+Oe/WuEz67CV1fhu6tw6Spcuwo/WOEfF9AzCI7XCOc25wPh3Ob8WLhzm/OBcG5zvi/8H9e/+n+//+v3v//DD3/627Xix3/zP/78x79//5c///wv//7///3rv/OHv37/ww/f/9vv/v2vf/njn/7lP/76p9/98Jc//vjvfTd+/Ief7jhe/z3s31z/4Nd/Jz/dSLz+eVz/j5jXXtd+/wU=", + "bytecode": "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", + "debug_symbols": "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p74hpFPfENKpbwjp1DeEdOobQjr1DSEFvyH07t8gUcFvCH0gnNucHwh/ozldvwtP+UB4+PVduP+PH/7rFm+99vOZW0j/Fqt/i92/hfZvYf1bnP4tvH+L6N+i393R7+7od3f0uzv63R397o5+d0e/u6Pf3dHv7uh3d/a7O/vdnf3uzn53Z7+7s9/d2e/u7Hd39rs7291t19W/hfRvsfq32P1baP8W1r/F6d/C+7eI/i363S397pZ+d0u/u6Xf3dLvbul3t/S7W/rdLf3uln53r353r353r353r353r353r353r353r353r353r3537353735373537353735373537353735373537353a7+7td/d2u9u7Xe39rtb+92t/e7Wfndrv7v1U9wd37bIv/zK/b0f/qw7HWbXVOEyVfiaKnxPFa5ThdtU4WeqcMcKf/fClVlMFc5tzveFH25zfiC8tTl/3mL1b7H7t9D+Lax/i9O/hfdvEf1bZPsWfvVv0e9u73e397vb+93t/e72fnd7v7u9393e7+7od3f0uzv63R397o5+d0e/u6Pf3dHv7uh3d/S7O/vdnf3uzn53Z7+7s9/d2e/u7Hd39rs7+92d7e4+19W/hfRvsfq32P1baP8W1r/F6d/C+7eI/i363S397pZ+d0u/u6Xf3dLvbul3t/S7W/rdLf3uln53r353r353r353r353r353r353r353r353r353r353735373537353735373537353735373537353f8ad1TzfLs7t69L3f/izrnGcz7gJ+xrhMlX4mip8TxWuU4XbVOFnqnCfKjymCp/anDa1OW1qc9rU5rSpzfkZ98FfI3xqc9rU5rSpzWlTm9OmNueZ2pxnanOeqc15pjbnZ9yIf43wqc15pjbnmdqcZ2pznqnN6VOb06c2p09tTp/anJ9Bm7xG+NTm9KnN6VOb06c2p09tzpjanDG1OWNqc8bU5vwMkus1wqc2Z0xtzpjanDG1OWNqc+bU5sypzZlTmzOnNudnUJKvET61OXNqc+bU5sypzZlDm9MvbnO+++6VX9zm/EA4tzk/EM5tzg+E/7835770fBeu/vc//PMW1r/F6d/C+7eI/i2yfYtPIJA/3EL6t1j9W+z+LfrdLf3uln53S7+7pd/d0u/u1e/u1e/u1e/u1e/u1e/u1e/u1e/u1e/u1e/u1e/u3e/u3e/u3e/u3e/u3e/u3e/u3e/u3e/u3e/u3e9u7Xe39rtb+92t/e7Wfndrv7u1393a727td7f2u9v63W397rZ+d1u/u63f3dbvbut3t/W72/rdbf3uPv3uPv3uPv3uPv3uPv3uPv3uPv3uPv3uPv3uPv3u9n53e7+7vd/d3u9u73e397vb+93t/e72fnd7v7uj393R7+7od3f0uzv63R397o5+d0e/u6Pf3dHv7ux3d/a7O/vdnf3uzn53Z7+7s9/d2e/u7Hd3trs7rs9wt3374S3X9f4Pf9blxbhkqvA1VfieKlynCrepws9U4T5VeEwVnkOFy9TmlKnNKVObU6Y256fcr32J8KnNKVObU6Y2p0xtTpnanGtqc66pzbmmNuea2pyfcnf9JcKnNuea2pxranOuqc25pjbnntqce2pz7qnNuac256dwIS8RPrU599Tm3FObc09tzj21OXVqc+rU5tSpzalTm/NTmKuXCJ/anDq1OXVqc+rU5tSpzWlTm9OmNqdNbU6b2pyfwjO+RPjU5rSpzWlTm9OmNqdNbc4ztTnP1OY8U5vzTG3OT2GFXyJ8anOeqc15pjbnmdqcZ2pz+tTm9KnN6VOb06c256dw+C8RPrU5fWpz+tTm9KnN6VObM6Y2Z0xtzpjanDG1OT/ljYuXCJ/anDG1OWNqc8bU5oypzZlTmzOnNmdObc6c2pyf8n7MS4RPbc6c2pw5tTlzanPm0ObMqW8I5dQ3hHLqG0I59Q2hvIY2Z059QyinviGUU98QSvAbQu/+TT4T/IbQ+8LBbwh9IJzbnB8Ib23On7fY/Vto/xbWv8Xp38L7t4j+LbJ9i943WX7eQvq36Hf36nf36nf36nf36nf36nf36nf36nf37nf37nf37nf37nf37nf37nf37nf37nf37nf37ne39rtb+92t/e7Wfndrv7u1393a727td7f2u1v73W397rZ+d1u/u63f3dbvbut3t/W72/rdbf3utn53n353n353n353n353n353n353n353n353n353n353e7+7vd/d3u9u73e397vb+93t/e72fnd7v7u9393R7+7od3f0uzv63R397o5+d0e/u6Pf3dHv7uh3d/a7O/vdnf3uzn53Z7+7s9/d2e/u7Hd39rs7u929r+vq30L6t1j9W+z+LbR/C+vf4vRv4f1bfIK7Rdf3LSLe/+FPurx4C8+hwj/jDuBrhMtU4Wuq8D1VuE4VblOFn6nCfarwqc0pU5tzTW3ONbU519TmXFOb8zPuAr9G+NTmXFObc01tzjW1OdfU5txTm3NPbc49tTn31Ob8jHv2rxE+tTn31ObcU5tzT23OPbU5dWpz6tTm1KnNqVOb8zMYltcIn9qcOrU5dWpz6tTm1KnNaVOb06Y2p01tTpvanJ/Bh71G+NTmtKnNaVOb06Y2p01tzjO1Oc/U5jxTm/NMbc7PYC9fI3xqc56pzXmmNueZ2pyH25zvvfa4L+c25wfCuc35gXBuc34gvLU5f95C+7ew/i1O/xbev0X0b5HtW8TVv4X0b7H6t+h3d/S7O/rdHf3ujn53R7+7o9/d2e/u7Hd39rs7+92d/e7Ofndnv7uz393Z7+5sd7dcV/8W0r/F6t9i92+h/VtY/xanfwvv3yL6t+h3t/S7W/rdLf3uln53S7+7pd/d0u9u6Xe39Ltb+t29+t29+t29+t29+t29+t29+t29+t29+t29+t29+t29+929+929+929+929+929+929+929+929+929+92t/e7Wfndrv7u1393a727td7f2u1v73a397tZ+d1u/u63f3dbvbut3t/W72/rdbf3utn53W7+7rd/dp9/dp9/dp9/dp9/dp9/dp9/dp9/dp9/dp9/dp9/d3u9u73e397u7/66a9N9Vk/67atJ/V03676pJ/1016b+rJv131aT/rpr031WT/rtq0n9XTfrvqkn/XTXpv6sm/XfVpP+umvTfVZP+u2rSf1dN+u+qSf9dNem/qyb9d9Wk/66a9N9Vk/67aqv/rtrqv6u2+u+qrf67auvS/i2sf4vTv4X3bxH9W/S7u/+u2uq/q7b676qt/rtqq/+u2uq/q7b676qt/rtq61PuqqV922Llev+HP4vXXZ9yA+4Vwj/lXt1LhMtU4Wuq8D1VuE4VblOFn6nCfarwqc25pjbnntqce2pz7qnNuac256fcBe4R/u7bImtzm/MD4dzm/EA4tzk/EM5tzg+Ec5vzfeFv3Ac/a38Tfpb+vZafV0lp1Sqt2qVVWlplpVWntMpLq6K0KiurrDQbb1wQPubfV9mvT5veuPP70apdWqWlVVZadUqrvLQqSquysuqNu6gfrSrNxinNxinNxinNxinNxinNxinNxinNxinN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/Vus/i363R397o5+d0e/u6Pf3dHv7uh3d/a7O/vdnf3uzn53Z7+7s9/d2e/u7Hd39rs7293t19W/hfRvsfq32P1baP8W1r/F6d/C+7eI/i363S397pZ+d0u/u6Xf3dLvbul3t/S7W/rdLf3uln53r353r353r353r353r353r353r353r353r353r3537353735373537353735373537353735373537353a7+7td/d2u9u7Xe39rtb+92t/e7Wfndrv7u1393W727rd7f1u9v63W397rZ+d1u/u63f3dbvbut39+l39+l39+l39+l39+l39+l39+l39+l39+l39+l3t/e72/vd7f3u7r+r5v131bz/rpr331Xz/rtq3n9Xzfvvqnn/XTXvv6vm/XfVvP+umvffVfP+u2ref1fN+++qef9dNe+/q+b9d9W8/66a999V8/67at5/V83776p5/10177+r5v131bz/rlr031WL/rtq0X9XLfrvqsWl/VtY/xanfwvv3yL6t+h3d/9dtei/qxb9d9Wi/65a9N9Vi/67atF/Vy3676pF/1216L+rFv131eJT7qrJ37aID374s2DY+JQbcC8RvqcK16nCbarwM1W4TxUeU4XnUOGfcmPzJcKnNuee2px7anN+yk3Ylwif2px7anPuqc25pzbnntqcOrU5dWpz6tTm1KnN+Sm3zF8ifGpz6tTm1KnNqVObU6c2p01tTpvanDa1OW1qc34KwfES4VOb06Y2p01tTpvanDa1Oc/U5jxTm/NMbc4ztTk/hY56ifCpzXmmNueZ2pxnanOeqc3pU5vTpzanT21On9qcn0IevkT41Ob0qc3pU5vTpzanT23OmNqcMbU5Y2pzxtTm/BSq9yXCpzZnTG3OmNqcMbU5Y2pz5tTmzKnNmVObM6c256cQ8y8RPrU5c2pz5tTmzKnNmUObM6+hzZnX0ObMa2hz5jW0OfMa2px5DW3OvIY2Z15DmzOvoc2Z19TmlKnNKVObU6Y2p0xtzk956eUlwqc2p0xtTpnanDK1OWVqc66pzTn1DaGc+oZQTn1DKKe+IZRT3xDKqW8I5dQ3hHLqG0I59Q2hnPqGUE59QyinviGUU98QyqlvCOXUN4Ry6htCOfUNoZz6hlBOfUMop74hlFPfEMqpbwjl1DeEcuobQjn1DaGc+oZQTn1DKKe+IZRT3xDKqW8I5dQ3hHLqG0I59Q2hnPqGUE59QyinviGUU98QyqlvCOXUN4Ry6htCOfUNoZz6hlBOfUMop74hlFPfEMqpbwjl1DeEcuobQjn1DaGc+oZQTn1DKKe+IZRT3xDKqW8I5dQ3hHLqG0I59Q2hnPqGUE59QyinviGUU98QyqlvCOXUN4Ry6htCOfUNoZz6hlBOfUMop74hlFPfEMqpbwjl1DeEcuobQjn1DaGc+oZQTn1DKKe+IZRT3xDKqW8I5dA3hOwa+obQLXxmc97CZzbnLXxmc97CZzbnLXxmc97CZzbnLXxmc97CZzbnLXxqcw59Q+gWPrU5h74hdAuf2pxD3xC6hU9tzqFvCN3Cpzbn0DeEbuFTm3PoG0K38KnNOfQNoVv41OYc+obQLXxqcw59Q+gWPrU5h74hdAuf2pxD3xC6hU9tzqFvCN3Cpzbn0DeEbuFTm3PoG0K38KnNOfQNoVv41OYc+obQLXxqcw59Q+gWPrU5h74hdAuf2pxD3xC6hU9tzqFvCN3Cpzbn0DeEbuFTm3PoG0K38KnNOfQNoVv41OYc+obQLXxqcw59Q+gWPrU5h74hdAuf2pxD3xC6hU9tzqFvCN3Cpzbn0DeEbuFTm3PoG0K38KnNOfQNoVv41OYc+obQLXxqcw59Q+gWPrU5h74hdAuf2pxD3xC6hU9tzqFvCN3Cuc3p+u0/1uP6tXBuc34gnNucHwjnNucHwrnN+YFwbnN+IJzbnB8I5zbnB8I/ozm/i9kmX1VAn/KG0EuEy1Tha6rwPVW4ThVuU4WfqcIdK/z9AvqUN4ReIpzbnO8Kl4vbnB8I5zbnB8K5zfmB8E9oTjv2Xfj//GPtz1to/xbWv8Xp38L7t4j+LbJ9i8946eWjLaR/i9W/Rb+7pd/d0u9u6Xe39Ltb+t0t/e5e/e5e/e5e/e5e/e5e/e5e/e5e/e5e/e5e/e5e/e7e/e7e/e7e/e7e/e7e/e7e/e7e/e7e/e7e/e7e/e7Wfndrv7u1393a727td7f2u1v73a397tZ+d2u/u63f3dbvbut3t/W72/rdbf3utn53W7+7rd/d1u/u0+/u0+/u0+/u0+/u0+/u0+/u0+/u0+/u0+/u0+9u73e397vb+93t/e72fnd7v7u9393e727vd7f3uzv63R397o5+d0e/u6Pf3dHv7uh3d/S7O/rdHf3uzn53Z7+7s9/d2e/u7Hd39rs7+92d/e7Ofndnu7vXdfVvIf1brP4tdv8W2r+F9W9x+rfw/i2if4t+d/ffVVv9d9VW/1211X9XbfXfVVv9d9VW/1211X9XbfXfVVv9d9VW/1211X9XbfXfVVv9d9VW/1211X9XbfXfVVv9d9VW/1211X9XbfXfVVv9d9VW/1211X9XbfXfVVv9d9VW/1211X9XbfXfVVv9d9VW/1211X9XbfXfVVv9d9VW/1211X9XbfXfVVv9d9VW/1211X9XbfXfVVv9d9XWp9xV+xtXemK9/8OfRauvT7kB9xLhOlW4TRV+pgr3qcJjqvAcKvxT7la+RLhMFT61Oc/U5vyUO6svET61Oc/U5jxTm/Nwm/Pdd17W4Tbn+8Kd25wfCOc25wfCuc35gXBuc34gnNucHwjnNucHwj+hOU98++Ht6/qiAvqMG/GvER5ThedQ4Z/BBLxGuEwVvqYK31OFK1b4+wX0GQTHa4Rzm/MD4dzm/EA4tzk/EM5tzreF//n+V//7n//423/+l9/95j/vFX/5N//r9//6p9/+4fe//Ms//Z//+Pbv/Msff/u73/323//pP/74h3/9zb/91x9/80+/+8O//uXf++n6yz/89e6vrVvW/Q/n/t/krzd173/uf/l/5L3Xvd//BQ==", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/derive/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/derive/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 220986ae4da..a0ad4105a58 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/derive/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/derive/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -23,8 +23,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "zd3dbttGEAXgd9G1L7iz87OTVymKwEmcwIDhBI5ToAjy7pV/KLrUUso5zgK+KepE34jSOWLIFS393H26+vDjy/vr289fv+/e/fVzd/P14+X99dfb/U8/f13sPtxd39xcf3n/8o9308N/xB5v//3b5e3Dj9/vL+/ud++KpFzsrm4/7f+3Trqf8Pn65mr3zqZff1/sxAkThGmESdzUiTCla6q2gwlZGyFMJYwSxgjjhAnCNML0e1DbYnJtdCJMIYwQphJGCWOEccIEYRphiB4Y0QMjemBED4zogfV7oDVmo17WxgjjhAnCNMIkbnwiTCGMEKYShuiBEz1wogdO9MCJHjjRgyB6EEQPguhBED0IogdB9CCIHgTRgyB6EEQP2kYPYjHtyBTCCGEqYZQwRhgnTBCmESZxk0QPkuhBEj1IogdJ9CCJHiTRgyR6kEQPst+DJj6bVuvKlGliUGGQMKgySBlkDHIGBYMag5hGFKYRhWlEYRpRmEYUphGFaURhGlGYRhSmEWWjEZEH1KY1kolBhUEbjVhODVvaEaoMUgYZg5xBwaDGoCTQxnLjGVQY1G9Eis4o7ajlGyuOZ5AyyBjkBOqvalmbno29OB4o9Yk4TgInDScJk/6C1mlScCI4qThRnODpG56+4ekbnr7h6TuevuPpO56+4+k7nr7j6TuevuPpO56+4+n3F6805wMdK/5yb3lxdNOW5fmmKcuOVeRpehk6XYZOr0On69DpNnS6j5zeX3aqas9E90d9y/jO9Ij6fNNoL2/5ONxeOXx/1nw4kpg01uO9P34mNepaxCs36M9tezuz7Wor0V+AqrY8Wnm5u7n4/Zs+Tq9Dp+vQ6TZ0ug+dHkOnt6HTc+B06a/n/bHpZeh0GTq9Dp0+7LWKboi9lQ3xt7Ih8VY2pL2VDck3siFleisbUt7IhvQXM5EDqP2uaD6AkrI6gBLBDlwfieHEcRI4aThJmPSXOk+TghPBScUJnn7F0694+hVPv+LpVzx9xdNXPH3F01c8fcXTVzx9xdNXPH3F01c8fZvAU2Wx8srd9+ntkaHT69DpOnS6DZ3uQ6fH0Olt6PQcOd2nodMLuJgk/XV49TIv5qnrtDZOmG4j1Kb5nVI1We95+kvxZ0ziZmMx/rQphBHCVMIoYYww/R6ozld0qTY9U+Z2qKaVsp4fY+c3IvdG5N6I3BuReyNyb0Tu/eX2M4Z4/Tfi9Z9Epv2rQP9cz5LIJYlcksgliVySyQXfL9dpIkwhjBBGCdN/ruOwuqEhy7+bJZ9QY1ASqL9ydQ4VBgmDKoOUQcYgZxDTiMI0ojCNEKYRgjbiAr4HGX4Pdfg96PB7sOH34MPvIUbfQ38t9NSVErW/FnqaCE4qThQnhhPHSeCk4SRhonj6iqevePqKp694+oqnr3j6iqevePqKp294+oanb3j6hqdvePqGp294+oanb3j6hqfvePqOp+94+o6n73j6jqfvePqOp+94+o6nH3j6gacfePqBpx94+oGnH3j6gacfePqBp9/w9BuefsPTb3j6DU+/4ek3PP2Gp9/w9BuefuLpJ55+4uknnn7i6SeefuLpJ55+4uknnL5OE0666cdhfThe/NrnTAQnFSeKE/jKBJ0aTuArE7RMOCk4EZxUnChOuq9KKT6/qSolyto4YYIwjTCJm/564xlTCCOEqWdNa2ujhDHCOGH6PZAy/9aaiExr0wiTuOkvyp0xhTBCmEoYJQyRj248b9UOxm1tiOdAiedAieegvz4losvjMVkbJ0wQphEmcWMTYQphhDCVMEoYogdG9MCIHhjRAyN64Bs9MF9e27o2hTBCmEoYJYwRxgkThGmESdwE0YMgehC/sT94+W/J8Ttvsn988201j+bXwfN18HwbPN8Hz4/B89vg+Tl2fiOOpVohjBCm/0kY+/OaZ2P7Q8616X9IxXLhmmmuz0n7C2UnjfUXPrz4vG1eQtemEkYJY4Tp9tjl8MlGLvXoOUjc9Jc/zphCGMHNxsUqpy52MzHCOGGCMI0w+AWMVifCFML0e13LvA/xKsv5/9OVL9a/jsMlc0F5hIJBjUFJIJ0YVBgkDOrnFId9vYce5dQ/ofUouaDjewoGNQYlgfontedQYZAwqP+pgxnzewQl22p90DY+yv6k2fgo+9OmEEYIUwmjhDHC9I+Np+lwPjOV9T5y45zutOkfw04lDkZsbRI3G+d0/9u2V/yKvG2c/5187Bvnf6dNJYwSz5cRxgc/x/2PN81c5q/f87HG7Aa3TjKmXBZSFzR/N4eg6Nf+p38u764vP9xcPXwx1cNf/rj9+OLrq+7//Xa1+iarb3dfP159+nF39fCdVsvXWT0e25baLorWvx8+snf/o+wf5H71d38/+/v6Dw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/derive/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/derive/execute__tests__force_brillig_true_inliner_0.snap index f380d6bcd81..3b2fd3a7a85 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/derive/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/derive/execute__tests__force_brillig_true_inliner_0.snap @@ -23,8 +23,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1bzW7TQBDeteMkjpMm9OfWCzeOTpw/DkiRaHkPN2klLgghHiAvwGsg8Qg8ABdeBS4gcUVg2Imnk/EmaWZoEIxUOd5dfzPz7ezsete1phTrrjWzhwDIzP2I3X2A6sOi3t2n+0k/Jnol8afpcBwz/gnan8UO0+rgp4CvxH/acDjPliU+9gX0Nn/+Jeh315TxoeU/9J+m/ycenyF2ni71+raQC4dvFLAvke2C+P3ExcFnTxxYMX2TjIsDOfzxTYz6VwF/Afg1HfwR4Ec6/A8Bv65j/xTwGzr4jwG/qYN/DfixDv6k4/BaphQYa6A7QeWCeSq3RJ8xt8eJIfpbxFbpNYMl+sAeyg/kCuCuzdjaY+poDmszetqMHg4rEMQKBbFqgliRIFZdEKshiNUUxIIcoTunTa5057TBgMs7gjlvZX9bB381p3VU8LMc8I90+nfFf1enf+eA39Phf4X/QIf/1Zx/rMP/AuaVE1MKnZNPUbncHNhfbDsng/4WsVVrTj4l9lB+6Jx8xtjaY+pojjxj9JwxejisUBArEcRqCGI1BbHagliS3HcO1C4riBUJYh0JYh1qrMaCWJIx0T1Qu3qCWDVBrEONCcnxWBfEOtS8+kAQC9Zx3F5jITN3TfcUwA4YW7n9BWgfMu25tU8xn0IcvXz1/MVrQ4Se4FwubyuiG9TUgHP0LCaqRsppPb6PN9SfM1jam/XcJqrkYY6vI7FPoL9TwQ93NYZfoENZy6wHtcYCnfMN20gHILZ5m4APd8TiNik0+jTw+I31dyt8/QO2rhIPxFeN4RXbFpj18YDHeETK3rhrMbl+Jf5x/OAy2peWsUd5fI5gvEVmXaCujsrg4A7q6KIV1zU9z3G50Jp1Cck95qLA/4Z00nbUDxx/4BN3yCPI75jjkNrVQGWUJ7pow3Wx57kW89y2/AIXu/KLYxR8gvEC3L91V+1D/mNiJ9ZFx/C7A7Bp33nPmPWcobMJ3p8e0pjBfnJjBnNAZVPsP7QlLm1H7eFin8vr0I72USEzd033kz71JWJsDEgdtH3vrgX3HypslY2nbKx7qJJN/qZ45cY1yH3GK44H33qO3tP8X8jF8nYdtP3ortprQi4Ph4QfiTzcY7DAd8XxP1fmb0hjCAtdT3JzHN6k2TU/Q1kR79Mt4l2P53Ie/M+zJs/8/PCv8rzNuzRuP3PXdC8Z5dTeyGNHRNp+IvYpvcuyeR10JaZ8X6ot5fVPpr/3GgoJlyUPtM+x/oi0/+Lu8bsb9mN2RztvJnn/Jstv8lG+WAznOeWpkADxJK0/n2TT+WA4n1yNsjwbb9SPP4KFuIIxhvdvfPM3fqfed/7Gaze6b1AnNszcfbqf9LmPKwXxB9y+D+whFD59R3qtKccOxHRVToxI+9CWmNb97pr1/gOOE1TfYuopft2BFDw9cb+5j5w09j+5jyVxPqSH/NwHbvhjB+CzS3zksBLEB9cfNE9D+46Hr44yX5z/eC6gh2Qdpn3bw1eyIxbmt06w2h6sIwYr8WDh548qsGpmPU7u4kdzBz86G/ygWLEHK9ngB93v5f4JCnOTVODj9i0Gn8vZSYVu7DceO9B/3NpvlXdMmSO5f9rQ+eh+ujrPwHnboj9Tob/OtA887WFc4nd0jiO6tzRE+f6RvX9Ogh05sQKcBAwWfrfwnX/ievrxB4jeOj8dGOJXwNiK9XL3EeMXjKWQea7gbWz5doVcLKvbYY7hGbqG7Hp0UzsN09Z3ToffL6TXzfPR+Go+HOXpdf9X32xaN/8A7S7Asro6AAA=", - "debug_symbols": "1Z3RTus4EIbfpddceMZje4ZXWR0dFShHlaqCCqy0Qn33TbtN2g1JeuLDwMwNIsj/zNfG49+JHfK+eFjdvf36ud4+Pr0sbv96X2ye7pev66dtc/S+v1nc7dabzfrXz8s/L8LhB+Rj+5fn5fZw+PK63L0ubgEFbxar7UPzawzURHhcb1aL2xT2Nx8aJw6ntomhawpx/+NmAUU3POuGF9XwGHTDg2541A0fdcOTbvikG163alG3alG3alG3aqNu1Ubdqo26VRt1qzbqVm3UrdqoW7VRt2qjbtVG3aol3aol3aol3aol3aol3aol3aol3aol3aqlP69aktyGhzzdlAVOTQVj1xRxTtMDtDiETsEjNHiERo/Q0SM0eYROHqGzR+jiEdqjIyaPjpg9OmL26IjZoyNmj46YPTpi9uiI2aMjZo+OmD06YvboiMWjIxaPjlg8OmLx6IjFoyMWj45YPDpi8eiIxaMjFo+OyB4dkT06Int0RPboiOzREdmjI7JHR2SPjsgeHZE9OqJ4dETx6Iji0RHFoyOKR0cUj44oHh1RPDqieHRE8eiIEDxaIgSPngjBoylC8OiKEDzaIgSPvgjBozFC8OiMEDxaIwSX3gguvRFceiO49EZw6Y3g0hvBpTeCS28El94ILr0RrHpjoXJqWjj0qdGqN05TW/XGaWqr3jhNPeyNFFsNUIZplJjo1DYW7JpCnNP0iEJ2UJIdlGwHpdhBYTsoYgZl5Mn8b0EBOyhoB8XOaBvtjLZx7mh7FOUaUakRcY1IKkQUakRQI8Ia0UjvLWcRX+sylE5tqXG2c9v/4pNy/KQcPyvHL8rxWTm+6MYfeQD98+KDcnxUjq9Yv3NRyA5KsoOS7aAUOyhsB0XMoORgBwXsoKAdlLmj7VFENaJUI8o1olIj4hrRcKUxtnfIgGOcPpHNDDa2pydT6J2ekScRPzEB/HmCFLhNkC5u850SoHaCqJ2AtBMk7QRZO0HRTsDaCUQ5AQftBJ9QydTdhCdiuuIq3N0sSQB9GLQEo1lfs09TtgRTLMGwJRgxBCPBEgxYgkFLMNESDFmC0Z7hiPYEROYOTkeRzBdhCDUiqBGNFE+RTnSxFN+KYo2IakQjnYa5E0m6ck5LaOcFVPCcAWSgcUZpcXJEuWx8xMm2cIotHLaFI6ZwRnb/fhsO2MJBWzjxi3EKdDiFPuKQLZxkCyfbwim2cNgWjpjCwWAL54tH5U9lR8fs0TE7OWZPjtmzY/bimJ0ds891v4NoZLOsYIvV3Fv5cGE/sq31ighrRLFGRBWi4W1rzfyvXdxsJju8/99NGxzeinZFwxUama8Z3lvUTALal8Q0nhr6muHPgzF1mpz6GpmfZ3jXxhUNVGhwWEPnz5Owr4kVGqrQpApNrtCUCg1XaEb6QcrnvkM9TQkVGqjQYIXmN/rBZS18HK6bIaUdrpsKnl5gbO7KdiwBYp+FDLGkr2WB0rFgf+wp2RBL+b5zNL0/C7CbY0BzA6HPzYb6lthh4WCnbzEYYkGf/Zy/dDxvlubO3P1Nkcg0f57FqUKT52uG9wJkyO0DvBlK3yuHl+yvaLBCEys0g99Bxu5iIGPsn5/h1d4rGq7QyGxNHF6+ndYMrzhMX05GGOmkQc4TbuldRUVIc0X75ujv5W69vNusTq+pf3zb3l+8tf71n+dV7wX2z7un+9XD2251eJX9xVvsD99N8/FvkODH4d8VHA4Jm0Nq8jS5/gU=", + "bytecode": "H4sIAAAAAAAA/+1bzY7jRBDutuMkdpJJ9meQECtu3JPJ794iMcsJIS5IXD3JjsQFIcQD5AV4DSQegQfgwqvABSRuHFhDl11T+ewkmyo2aLekkePu9ldVX1f/uNrjXSU+XFvuDCGQL8OPNNxHrD5+9bcO9+PzZJIKvZr4q/FskQL/FO2fpgHT2+CPCd+I/3En4Hyyq/C5L6S3++qvx34PXRUfVv5T/1n6/6TBZ4qdj3d2fVvIbcB3BtgvmO2K+JNeiIPfGuLAq+lbTlEc6OEv7lPWvwb4W8Jv2eDPCT+x4X9G+G0b+1eE37HBf074XRv8l4Sf2uAvBwEvc5XQWCPdPVauOE/lXuhz7uE4cUJ/JmzV3jN4oY/skfzQXEHc9YGtI1An57A+0NMHehBWpIgVK2K1FLESRay2IlZHEauriEVzhO2atryzXdNubtC8ozjnlfb3bfDLNW1ggj/NCf/Kpn9L/oc2/bsh/JEN/yX+Ixv+yzX/sQ3/W1pXnrhK5Jr8lJXrrYGT7bFrMunPhK1Wa/JTYY/kR67J18DWEaiTc+Q10HMN9CCsWBGrp4jVUcTqKmL1FbE0uR9cqF1eEStRxLpSxLrUWE0VsTRjYnihdo0UsVqKWJcaE5rjsa2Idanz6iNFLNrHoVxjIetwHZ8phB0BW1F+gdrHoD3a+xTrKcXRN99+9fV3Tog8wXmxe6hIJqilAc/Ys5yoliiX9fw+PVD/DGBZJ+tRElXzMKepI7lPpH9Qww+6Ooc36FSWuf2gttigI9+4jXIAcpuPCfj4RCyUpLDo06jBb65/WOPrf2BrOfFQfLUAr9y2yO2PBz7GE1H2fbgWi+sfwj/EDy+TfemBPcbjc07jLXH7QnVtVkYHd1QnN628rtvwHJoLvduXWNxzLgr8P5lO2U76weOPfEKHPIr8LhCH0q4OK5M8yU0br0sbnsvAc8fyS1ycyi+PUfKJxgtx/0O4Wh/yPxZ2cl1yDP94ATadu+45tz9n2CTBJ6tLGjPcTzRmOAdSDsX+c1/hynbSHhT7aF6ndrKPClmH6/g8mUhfEmBjJOqo7U/hWnD/c42tuvE0XdgeqkyX/6d4ReOa5E3GK4+Hpv2cvJfzfyG3u4d11PaXcLXeE6J5OBb8aMzDI4BFvhuO/40xfzMZQ1zkfhKtcTxJc+r8TGVFvH9+RLzb8Vytg+94tuQZrw9vK8/HvEvz9utwHZ8l81zamzTYkYi2vwr7jN5l4bxOunquel9q7fT1L1f/5hoKiXcVD7LPuf5EtP893PN3N+7H+jXtvF/mk/tpfp/P8+12tsklT4VEjCdt/flyutrczDbLu/k0ny4O6ucfwVK8ozGGPnC0yB3R/oznjrjONvOBt+e/C0lE2V/hinJHfC8ZgzK5x0C5DcSdfP/oGnNXjjnmR7eBO54XSgF3JZ7X464F7JFY3H4vOCsE5WR8zdW54/aNKbDrmPFg9JFo2ac9wEkGbI1Ee/67kESUjRT7tCnX17bhZ2L80fANytVS3q/w6T3/kDOeg4td/T4mEe0/8BXm++H30O3HPsVnj9V3Qb3E/5D18xfhN/ow0eLMgh82onMo+WEO+iiVxzrxOXT764LEyhgfqD/k3oraf9TA18CYL+Q/ny/lwfYAtO838JWdiIXW3SHQI7GuAFbWgMWfv6rBarn9OHkdP3on+DE44IfE6jRgZQf8kGc7dM/HC+cmq8Hn7bsAH613WY1u7jcfO9R/6H2NnuVzJPpHK5t/lFmV6yaftz37czX626B91NCexiXPqyGOZD74Uzbfr/2b5yQ6kROvwEkEsHg+oOmbBV4vP9gisXs3H9844VcEbOV60X0C/KKxFIPnCt4+87hdIbe7+nacY3qm7r0P6ZZ2OtC26Wyd5wS033U388XdZjbPxy8n//TNoXfdvwEXJykgbj4AAA==", + "debug_symbols": "1ZzdTttMEIbvJccc7Pzsz3ArnyrET4oiRQkK8EkV4t7rpLETGduptwzMnKC67LP7BO/43dibvC0elnevjzerzc/t8+L6v7fFent/+7Labpqjt/erxd1utV6vHm/O/3sR9j8gHdo/P91u9ofPL7e7l8U1oODVYrl5aP5JgZsefq7Wy8V1DO9XHxrHEo5tY4GuKdD7j6sFZN3ui273oto9Bt3uQbd71O2edLtn3e6jbve6VYu6VYu6VYu6VUu6VUu6VUu6VUu6VUu6VUu6VUu6VUu6VUu6VUu6Vcu6Vcu6Vcu6Vcu6Vcu6Vcu6Vcu6Vcu6Vcv/XrUsqe0e0nTTInBsKkhdU8Q5TffS4lA6Bo/S4FEaPUqTR2n2KB09SieP0tmjtMdEjB4TMXlMxOQxEZPHREweEzF5TMTkMRGTx0RMHhMxeUzE5DERs8dEzB4TMXtMxOwxEbPHRMweEzF7TMTsMRGzx0TMHhOxeEzE4jERi8dELB4TsXhMxOIxEYvHRCweE7F4TMTiMRHFYyKKx0QUj4koHhNRPCaieExE8ZiI4jERxWMiisdEhOAxEiF4zEQIHkMRgsdUhOAxFiF4zEUIHoMRgsdkhOAxGiG4zEZwmY3gMhvBZTaCy2wEl9kILrMRXGYjuMxGcJmNYDUbM+dj01xC3xqtZuO0tdVsnLa2mo3T1sPZyNQywAmmVSjysS1l7JoCzWl6UGE7KtGOSrKjku2oFDsqYkZl5JP536ICdlTQjoqdqy3ZudqOfOsA55NKuaTC8diWmyvmqe2f/pNy/1m5/6Lcv+j2P/LVA5/XPyj3j8r9k3L/rNy/cv2ycv2ycv2ycv2ycv1G5fqNyvUbles3KtbvXBW2oxLtqCQ7KtmOSrGjImZUUrCjAnZU0I7K3KvtAeIaKNZAqQbKNVCpgYYrrWB75xEK0fSJbN4XUnt6Eofe6Rn5hOcnDgD/PkAMpR0gnt0+PQ6A2gOQ9gCsPUDUHiBpD5C1ByjaA4jyACVoD/AJlczdww3mwhdSpXQ3oSJAXwYtyWjW1+zTlCzJZEsyxZKMGJKRYEkGLMmgJRmyJMOWZLRXOKK9AJG5F6cDJPMhDKEGghpopHiydNDZFocWohqIa6CRSVNKB0m8cE5zaNcFnPE0AshA44TS6iRCOW980Em2dLItnWJLR0zpjOyq/jYdsKWDtnToi3UydDqZP+qwLZ1oSyfZ0sm2dIotHTGlg8GWzhdflT/VHR27k2N3duweHbsnx+7ZsXtx7D43/fbQyCZkwVarubfy4Y39yHbhCxDWQFQDcQU0vG1t6tk2Du9Em0bKfERmI8NbwKYRmI/gfITmI4Mns1mXtw+dmzUx9JlYwaQKJlcwpYKR+czwzpgLDFQweJEppc9QBcMVTKxghudBc4ulZRBDn8kVTKlgZD4zvMPjAgMVDFYwVMFU/N3KyOuh2DEp9pkKt+Fv0rzAxApmZI7y6fVE7DO5gikVjMxnJFQwUMFgBTMyD2I6zR3uM1zBxAomVTB/MQ/Oa+HjMrRZKrXL0GZxMr1xonna1LkEoL5LMeQiX+sCuXPB3rWHQjDkAt93jqb3nQJ2752gWZj0vdHM3KJAhlzY0NyKhlyS03n+pddzEDl599+rUSiz11kUZD4DoYIZnPcJUvuFDwky95lYwaQKJs9nhh8uJOxuciSk/vkZfgJwgcEKhioYns8Mf5R3+jYZ0cgkDXJacJ+gP3eHiGQu9N4c/X+7W93erZfPDbP/5evm/mW13RwPX349tb+5263W69XjzdNue798eN0tb9bb+/3vFmH/4zDfm5d/hQw/9l9vsz9kbA65GacZ6zc=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 0129369ee6b..e4adc66a14e 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -61,14 +61,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "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", - "debug_symbols": "ZY7dCoMwDIXfJde9iC2dw1cRkapRCqWVWgdD+u5Lx35kuwk54SPnO2CiYV966+ewQdMe4MJokg2e05EFDNE6Z5f+fAYso1ZPfluNL3FLJiZoqkppAeQnXiVK/jBbR9BozOIflvryhpXCDyxl7jKnm4nWDI5eLvPux5Nauq/0Y7nGMNK0Ryq+X9ViekFRYyeg4ktba3FFruCaBw==", + "bytecode": "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", + "debug_symbols": "ZY5bCoMwEEX3Mt/5yANt41ZEJOoogZBIjIUi2XsnpQ9pf4Y5w2XuOWDCYV966+ewQdMe4MJokg2e6MgMhmids0t/PgMv46qf+W01vuCWTEzQCKEqBugnWiWX9GG2DqGpeGb/YVnV77BS/BOWMneZ6GaiNYPDl8u8+/Gklu4r/liuMYw47RGL71dVkWnN2YV3DARdWi2YrguIAhemNfVR5wM=", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_0.snap index 0129369ee6b..e4adc66a14e 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_0.snap @@ -61,14 +61,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "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", - "debug_symbols": "ZY7dCoMwDIXfJde9iC2dw1cRkapRCqWVWgdD+u5Lx35kuwk54SPnO2CiYV966+ewQdMe4MJokg2e05EFDNE6Z5f+fAYso1ZPfluNL3FLJiZoqkppAeQnXiVK/jBbR9BozOIflvryhpXCDyxl7jKnm4nWDI5eLvPux5Nauq/0Y7nGMNK0Ryq+X9ViekFRYyeg4ktba3FFruCaBw==", + "bytecode": "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", + "debug_symbols": "ZY5bCoMwEEX3Mt/5yANt41ZEJOoogZBIjIUi2XsnpQ9pf4Y5w2XuOWDCYV966+ewQdMe4MJokg2e6MgMhmids0t/PgMv46qf+W01vuCWTEzQCKEqBugnWiWX9GG2DqGpeGb/YVnV77BS/BOWMneZ6GaiNYPDl8u8+/Gklu4r/liuMYw47RGL71dVkWnN2YV3DARdWi2YrguIAhemNfVR5wM=", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 0129369ee6b..e4adc66a14e 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_nested_proof/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -61,14 +61,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "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", - "debug_symbols": "ZY7dCoMwDIXfJde9iC2dw1cRkapRCqWVWgdD+u5Lx35kuwk54SPnO2CiYV966+ewQdMe4MJokg2e05EFDNE6Z5f+fAYso1ZPfluNL3FLJiZoqkppAeQnXiVK/jBbR9BozOIflvryhpXCDyxl7jKnm4nWDI5eLvPux5Nauq/0Y7nGMNK0Ryq+X9ViekFRYyeg4ktba3FFruCaBw==", + "bytecode": "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", + "debug_symbols": "ZY5bCoMwEEX3Mt/5yANt41ZEJOoogZBIjIUi2XsnpQ9pf4Y5w2XuOWDCYV966+ewQdMe4MJokg2e6MgMhmids0t/PgMv46qf+W01vuCWTEzQCKEqBugnWiWX9GG2DqGpeGb/YVnV77BS/BOWMneZ6GaiNYPDl8u8+/Gklu4r/liuMYw47RGL71dVkWnN2YV3DARdWi2YrguIAhemNfVR5wM=", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index ef46b79608c..dfd37c4c2fb 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -61,14 +61,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "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", - "debug_symbols": "ZY5bCoMwEEX3Mt/5mGh94FZEJOoogZBIjIUi2XsnRVqpPwP3coZ7Dpho2Jde29lt0LQHGDeqoJ3ldEQBg9fG6KW/1oDpVPmH31ZlU9yC8gGa4iEFkJ2gKbHm/1kb4hajuKEyK8qTlXmOXzjLYhc5PZXXajB0msy7HS9i4bXSn+Pq3UjT7inZ/kSTZ4miwk6A5KatClEjT/DMGw==", + "bytecode": "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", + "debug_symbols": "ZY5BCoMwEEXvMussEm2j8SoiEnWUQEgkxkKR3L2TIq20m4H3+cN/B0w47Etv3Ow3aNoDrB91NN4RHYnBEIy1ZumvMfB8avXub6t2GbeoQ4TmfhMM0E3QSF7T/2wsUsoT+6uK4i7PrihL/ikXReoS0UMHoweLp8m8u/EiFp8r/jiuwY847QGz7Ve0JE/JWcU7BoKSVgmmZAaRoWJK0R5tvgA=", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_0.snap index ef46b79608c..dfd37c4c2fb 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_0.snap @@ -61,14 +61,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "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", - "debug_symbols": "ZY5bCoMwEEX3Mt/5mGh94FZEJOoogZBIjIUi2XsnRVqpPwP3coZ7Dpho2Jde29lt0LQHGDeqoJ3ldEQBg9fG6KW/1oDpVPmH31ZlU9yC8gGa4iEFkJ2gKbHm/1kb4hajuKEyK8qTlXmOXzjLYhc5PZXXajB0msy7HS9i4bXSn+Pq3UjT7inZ/kSTZ4miwk6A5KatClEjT/DMGw==", + "bytecode": "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", + "debug_symbols": "ZY5BCoMwEEXvMussEm2j8SoiEnWUQEgkxkKR3L2TIq20m4H3+cN/B0w47Etv3Ow3aNoDrB91NN4RHYnBEIy1ZumvMfB8avXub6t2GbeoQ4TmfhMM0E3QSF7T/2wsUsoT+6uK4i7PrihL/ikXReoS0UMHoweLp8m8u/EiFp8r/jiuwY847QGz7Ve0JE/JWcU7BoKSVgmmZAaRoWJK0R5tvgA=", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index ef46b79608c..dfd37c4c2fb 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/double_verify_proof/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -61,14 +61,18 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "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", - "debug_symbols": "ZY5bCoMwEEX3Mt/5mGh94FZEJOoogZBIjIUi2XsnRVqpPwP3coZ7Dpho2Jde29lt0LQHGDeqoJ3ldEQBg9fG6KW/1oDpVPmH31ZlU9yC8gGa4iEFkJ2gKbHm/1kb4hajuKEyK8qTlXmOXzjLYhc5PZXXajB0msy7HS9i4bXSn+Pq3UjT7inZ/kSTZ4miwk6A5KatClEjT/DMGw==", + "bytecode": "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", + "debug_symbols": "ZY5BCoMwEEXvMussEm2j8SoiEnWUQEgkxkKR3L2TIq20m4H3+cN/B0w47Etv3Ow3aNoDrB91NN4RHYnBEIy1ZumvMfB8avXub6t2GbeoQ4TmfhMM0E3QSF7T/2wsUsoT+6uK4i7PrihL/ikXReoS0UMHoweLp8m8u/EiFp8r/jiuwY847QGz7Ve0JE/JWcU7BoKSVgmmZAaRoWJK0R5tvgA=", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 5a0157c7802..b8712767cc8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -79,6 +79,10 @@ expression: artifact "error_kind": "string", "string": "ciphertext length mismatch" }, + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -89,8 +93,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndnbiiIxFAXQf6nnejiXJOfEXxmGxtayEUTFy8Ag/vtUNVNl04kttV+EaC0Tkx3M5dasu/frx9t2vzmcm8WvW7M7rJaX7WHfl273tnk/bXe77cfb17cbGl48fT5/Pi73Q/F8WZ4uzYIz5bbp9utmIRS0/4bNdtc1i0j3323jBhgHTJ5vMgGGASOAUcAEwMT5hqmKRFxGJF6ihCBDkCMoA4gJQYwgQZAiKCAISQQjiWAkEYwkgpFECJIIQRIhSCKknghlGpEyFyggKCIoAUjrv8nZRuTiBarX5EEnZFSgevYy+Yiy5AI5gjKAAiGIEVRNhFIcs6eUiuwFqyMba+qHORao2nvK0SZkxeCGDKBICGIEVWeuyvSfq6JFR0RFUEBQRFBCUD0RQSYUtMhedARlACVCUD0RKfOITKxAgiBFUEBQfZzMaUIeviOrd4TlqfdcUoEUqSkgqJ5y5/hoXhFYSwgyBDmCMoCcEFQfXH9MDY/F4LogSBEUEBQRlBBkwNSo74pfoQyg+r74FUKme31n/AopggKCIoIcWBvlPB8J1ceJcngsqEKBGEGCIEVQfZyYHotEtQJFBCUEGYIcQRlATPOX2MKMIEGQIiggKCIoIcgQ5AB6ckrw4z5XnpwSvEBPdtRxOhT0lAsUEBQRlBBU37u7PTb8XnaEIygDSAlBjCBBkM4/LhENCIoISggyBDmCMoCenOa8QDwX3fvSn+Vpu3zfdf9vgDbX/erLhdDl77H7djd0PB1W3fp66oZboscF0dBiiakVs74xQ2SMWqdhgTN8lL1l0qHEnw9SK1H6BvSN+Ac=", + "bytecode": "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", + "debug_symbols": "ndnfaiIxFMfxd5lrL845+XfiqyzLYltbBNFi7cJS+u47U3bG0mQp870Ron6cmPOLZpK34WF/9/r063B6PL8M2x9vw/F8v7sezqex9fa+Ge4uh+Px8PTr89ODTA+eP97/8rw7Tc2X6+5yHbZapW6G/elh2JrEMH7C4+G4H7ZJ3n9uBi/AODB1vakCjAJjwARgIjBpvVHpIjO3GZm3KBNUCHKCKkAqBClBRlAgKBJEEqEkEUoSoSQRShJhJBFGEmEkEdZPRFCZUVBtUCQoEZQBCv3v5Fpm5OYN6l/JY1hQkQb1s1fFZ1StNsgJqgBFIUgJ6iYiSJqzFyQ32Yulj8p8pbHMqUHd0QuayoJKU9xYAUpCkBLUnbnBlv/cYKEZiBQIigQlgjJB/UREW1AMTfaSE1QBykKQEmQEBYIiQYmgTBBJRCaJyP1E5KozKla+oiIEKUFGUL9OxWVBHhvUH4hSl9Fzy1+RK7iSG0H9lLumW/eaHxaPBCWCMkGFICeoX1y/TQ1PTXH798XfISXICAoERYISmBo1E1QIcoLAdDcRgpQgIygQlNevYU0KQf06SY23hW9sUAWovx/xHVKC+nVSuS3mQ2lQICgSlAjKBBWCfP2tkGkFyIQgJcgICgRFghJBmaC6fj/CghDUv3f3tGzeeq4NMoICQZGg/r6Rl9vGjLcDkQkqBDlBFaD/7OZ8g3T9tpZFIygQFAlKBGWCCkFOUF2L3sfW793lsLs77v+d1D2+nu4/Hdxd/zzvv5zhPV/O9/uH18t+Os27HeRNybJcNmOCxs5MhSyycZmWh9NL1TcqYWrpxxt1YzmMHRg78Rc=", "file_map": { "50": { "source": "// The code below is inspired by [compute_encrypted_log](https://github.com/AztecProtocol/aztec-packages/blob/b42756bc10175fea9eb60544759e9dbe41ae5e76/noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr#L111)\n// which resulted in a bytecode size blowup when compiled to ACIR, see https://github.com/noir-lang/noir/issues/6929\n// The issue was around `encrypted_bytes[offset + i]` generating large amounts of gates, as per the `flamegraph.sh` tool in aztec-packages.\n// The details around encryption and addresses have been stripped away, focusing on just copying bytes of equivalent size arrays.\n\n// Original values which resulted in huge bytecode even on this example (500K long SSA)\n// global PRIVATE_LOG_SIZE_IN_FIELDS: u32 = 18;\n// global ENCRYPTED_PAYLOAD_SIZE_IN_BYTES: u32 = (PRIVATE_LOG_SIZE_IN_FIELDS - 1) * 31;\n// global EPH_PK_SIZE: u32 = 32;\n// global HEADER_SIZE: u32 = 48;\n// global OVERHEAD_PADDING: u32 = 15;\n\n// Using the same formulas with smaller numbers; the effect is the same, but the SSA is more manageable.\nglobal PRIVATE_LOG_SIZE_IN_FIELDS: u32 = 4;\nglobal ENCRYPTED_PAYLOAD_SIZE_IN_BYTES: u32 = (PRIVATE_LOG_SIZE_IN_FIELDS - 1) * 5;\nglobal EPH_PK_SIZE: u32 = 3;\nglobal HEADER_SIZE: u32 = 2;\nglobal OVERHEAD_PADDING: u32 = 1;\n\n// Unused because encryption didn't play a role:\n// global OVERHEAD_SIZE: u32 = EPH_PK_SIZE + HEADER_SIZE + OVERHEAD_PADDING;\n// global PLAINTEXT_LENGTH_SIZE: u32 = 2;\n// global MAX_PRIVATE_LOG_PLAINTEXT_SIZE_IN_BYTES: u32 =\n// ENCRYPTED_PAYLOAD_SIZE_IN_BYTES - OVERHEAD_SIZE - PLAINTEXT_LENGTH_SIZE - 1 /* aes padding */;\n\nglobal BODY_SIZE: u32 =\n ENCRYPTED_PAYLOAD_SIZE_IN_BYTES - EPH_PK_SIZE - HEADER_SIZE - OVERHEAD_PADDING;\n\nfn main(\n eph_pk_bytes: [u8; EPH_PK_SIZE],\n incoming_header_ciphertext: [u8; HEADER_SIZE],\n incoming_body_ciphertext: [u8; BODY_SIZE],\n flag: bool,\n) -> pub [u8; ENCRYPTED_PAYLOAD_SIZE_IN_BYTES] {\n compute_encrypted_log(\n eph_pk_bytes,\n incoming_header_ciphertext,\n incoming_body_ciphertext,\n flag,\n )\n}\n\nfn compute_encrypted_log(\n eph_pk_bytes: [u8; EPH_PK_SIZE],\n incoming_header_ciphertext: [u8; HEADER_SIZE],\n incoming_body_ciphertext: [u8; BODY_SIZE],\n flag: bool,\n) -> [u8; M] {\n let mut encrypted_bytes = [0; M];\n let mut offset = 0;\n\n // NOTE: Adding a conditional variable can result in the array being fully copied, item by item,\n // in each iteration in the second loop that copies incoming_body_ciphertext into encrypted_bytes.\n // Depending on where we place the `flag` we either get the item-by-item copying (blowup),\n // or just a single array item gets read and a new array constructed in each iteration (no blowup).\n\n // If the `flag` is here then it blows up.\n if flag {\n // eph_pk\n for i in 0..EPH_PK_SIZE {\n encrypted_bytes[offset + i] = eph_pk_bytes[i];\n }\n offset += EPH_PK_SIZE;\n\n // If the `flag` is here then it blows up.\n // if flag {\n\n // incoming_header\n for i in 0..HEADER_SIZE {\n encrypted_bytes[offset + i] = incoming_header_ciphertext[i];\n }\n offset += HEADER_SIZE;\n\n // Padding.\n offset += OVERHEAD_PADDING;\n\n // If the `flag` is here then it does not blow up.\n //if flag {\n // incoming_body\n // Then we fill in the rest as the incoming body ciphertext\n let size = M - offset;\n\n // NOTE: This made the bytecode size blowup disappear in aztec packages,\n // but in this reproduction the size seems to be statically known regardless.\n // let size = M - 32 - HEADER_SIZE - OVERHEAD_PADDING;\n\n assert_eq(size, incoming_body_ciphertext.len(), \"ciphertext length mismatch\");\n for i in 0..size {\n encrypted_bytes[offset + i] = incoming_body_ciphertext[i];\n }\n }\n\n encrypted_bytes\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_0.snap index 66425a070c4..faae99140d5 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_0.snap @@ -79,6 +79,10 @@ expression: artifact "error_kind": "string", "string": "ciphertext length mismatch" }, + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -89,8 +93,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdrbattAEMbxd9G1LnZnDzPrVyklOIkSDMYOPhSK8btXMpWcdiG+yP5vDLIH/3TwNyujuXSvw/P5/Wmze9sfu9WPS7fdv6xPm/1u3Lpc++75sNluN+9Pn9/u3PRi+VZ//Fjvps3jaX04dStfXOm7YffarcTFMH7D22Y7dKvkrn1VLGIyF4v9U/yz70xpwGigwEBxNOBpQGgg0ECkgUQDdJILneRCJ7nQSfbO4YLHBcGFgAsN4hy8m4uD95WQcCHjgtKCb3AdzOtcbGKV0OAYLIZFUFcJDdpScTYXFymVUGhBHC54XPh+XwouzV0juFx1Dfl+XxrjMB9D8EErIeJCwoWMC4oL1uC3pHfBpUootBAcLnhcEFwIuBBxoUGmXYl3IVZCxgXFBcOFQvel6HDB44LgAr5ORzzTMeFCxgXFBXydjvg6nfB1OuHrdGqR6aSLoNX/uBRwIeJCwoUGmZalOEior7TiguFCoYXscKFBpqMsQgzV/+ksuBBwIeJCg0zn4mdBpbrXyBkXFBeMFrRBHtTcIlh1d68NrrSW5bdkkitB8WMwXGjQW82n+1mqOp85XPC4ILgQcCHiQoPE2b17W6oS12C84ZGguGC4UGihOFzwdPduMOTwSAi4EHEBX0UbDDo8EhQXDBcKLEiLOYEvn+1KizmBB0JsIKSl2HKphIQLGRcUFxo8Yze9P8W3+koXWvAOFzwuCC4EXGiR6a8mQsQnXMi4oLhguFBoocXczAPB44KgwnXc+rU+bNbP2+HvuPnbeffyafr89Ptj+G8Q/eOwfxlez4dhGkm/T6NPZ1uC9pJs3POpU6jrzU33M7ePJPUSbpvTWZMsveQ47sG4F38A", + "bytecode": "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", + "debug_symbols": "tdvdattAEIbhe9GxDnZnf2bWt1JKcBIlGIxt/FMoxvdeKVRy2oX4IPueBJQMeaTI36xEZq/d6/B8eX/a7N72p27149pt9y/r82a/G4+ut757Pm6228370+dvd276Yvmj/nRY76bD03l9PHcrX1zpu2H32q3ExTD+hrfNduhWyd36qljEZC4W+6f4Z9+Z0oDRQIGB4mjA04DQQKCBSAOJBugkFzrJhU5yoZPsncMFjwuCCwEXGsQ5eDcXB+8rIeFCxgWlBd/gPpjXudjEKqHBNVgMi6CuEhq0peJsLi5SKqHQgjhc8Ljw/b4UXJq7RnC56hry/b40xmG+huCDVkLEhYQLGRcUF6zBZ0nvgkuVUGghOFzwuCC4EHAh4kKDTLsS70KshIwLiguGC4XuS9HhgscFwQV8nY54pmPChYwLigv4Oh3xdTrh63TC1+nUItNJF0Gr97gUcCHiQsKFBpmWpThIqO+04oLhQqGF7HChQaajLEIM1ft0FlwIuBBxIeFCxgXFBcOFQgvqcAHPtOKZ1gaZzsXPgkr17K0RFxIuZFxokAc1twhWve1agzutZfksmeRKSPg1ZFxo0FvNp/tfqXoSaDDg8EgotNBgxOGR4HFBcKFB4uzevS1ViWsw5vBISLiQcUFxwXChwN1bGsw6PBI8LgguBFyIuJBwIeOC0oJv8D/2L2cdxHtcaDD7Y2kptlwqIeBCxIWECw1mf0zvUy1W32nFBcOFQgst5mYeCB4XWmT6qwkpkYALERcSLmRcUFwwXCi0EBwq3MajX+vjZv28Hf5uv3i77F4+7cY4/z4M/23MOBz3L8Pr5ThMWzTuuzOmM5WYesl5PPMpZep6c9Pz/cePQugl2HQ4dREZ24BoGs9gPIs/", "file_map": { "50": { "source": "// The code below is inspired by [compute_encrypted_log](https://github.com/AztecProtocol/aztec-packages/blob/b42756bc10175fea9eb60544759e9dbe41ae5e76/noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr#L111)\n// which resulted in a bytecode size blowup when compiled to ACIR, see https://github.com/noir-lang/noir/issues/6929\n// The issue was around `encrypted_bytes[offset + i]` generating large amounts of gates, as per the `flamegraph.sh` tool in aztec-packages.\n// The details around encryption and addresses have been stripped away, focusing on just copying bytes of equivalent size arrays.\n\n// Original values which resulted in huge bytecode even on this example (500K long SSA)\n// global PRIVATE_LOG_SIZE_IN_FIELDS: u32 = 18;\n// global ENCRYPTED_PAYLOAD_SIZE_IN_BYTES: u32 = (PRIVATE_LOG_SIZE_IN_FIELDS - 1) * 31;\n// global EPH_PK_SIZE: u32 = 32;\n// global HEADER_SIZE: u32 = 48;\n// global OVERHEAD_PADDING: u32 = 15;\n\n// Using the same formulas with smaller numbers; the effect is the same, but the SSA is more manageable.\nglobal PRIVATE_LOG_SIZE_IN_FIELDS: u32 = 4;\nglobal ENCRYPTED_PAYLOAD_SIZE_IN_BYTES: u32 = (PRIVATE_LOG_SIZE_IN_FIELDS - 1) * 5;\nglobal EPH_PK_SIZE: u32 = 3;\nglobal HEADER_SIZE: u32 = 2;\nglobal OVERHEAD_PADDING: u32 = 1;\n\n// Unused because encryption didn't play a role:\n// global OVERHEAD_SIZE: u32 = EPH_PK_SIZE + HEADER_SIZE + OVERHEAD_PADDING;\n// global PLAINTEXT_LENGTH_SIZE: u32 = 2;\n// global MAX_PRIVATE_LOG_PLAINTEXT_SIZE_IN_BYTES: u32 =\n// ENCRYPTED_PAYLOAD_SIZE_IN_BYTES - OVERHEAD_SIZE - PLAINTEXT_LENGTH_SIZE - 1 /* aes padding */;\n\nglobal BODY_SIZE: u32 =\n ENCRYPTED_PAYLOAD_SIZE_IN_BYTES - EPH_PK_SIZE - HEADER_SIZE - OVERHEAD_PADDING;\n\nfn main(\n eph_pk_bytes: [u8; EPH_PK_SIZE],\n incoming_header_ciphertext: [u8; HEADER_SIZE],\n incoming_body_ciphertext: [u8; BODY_SIZE],\n flag: bool,\n) -> pub [u8; ENCRYPTED_PAYLOAD_SIZE_IN_BYTES] {\n compute_encrypted_log(\n eph_pk_bytes,\n incoming_header_ciphertext,\n incoming_body_ciphertext,\n flag,\n )\n}\n\nfn compute_encrypted_log(\n eph_pk_bytes: [u8; EPH_PK_SIZE],\n incoming_header_ciphertext: [u8; HEADER_SIZE],\n incoming_body_ciphertext: [u8; BODY_SIZE],\n flag: bool,\n) -> [u8; M] {\n let mut encrypted_bytes = [0; M];\n let mut offset = 0;\n\n // NOTE: Adding a conditional variable can result in the array being fully copied, item by item,\n // in each iteration in the second loop that copies incoming_body_ciphertext into encrypted_bytes.\n // Depending on where we place the `flag` we either get the item-by-item copying (blowup),\n // or just a single array item gets read and a new array constructed in each iteration (no blowup).\n\n // If the `flag` is here then it blows up.\n if flag {\n // eph_pk\n for i in 0..EPH_PK_SIZE {\n encrypted_bytes[offset + i] = eph_pk_bytes[i];\n }\n offset += EPH_PK_SIZE;\n\n // If the `flag` is here then it blows up.\n // if flag {\n\n // incoming_header\n for i in 0..HEADER_SIZE {\n encrypted_bytes[offset + i] = incoming_header_ciphertext[i];\n }\n offset += HEADER_SIZE;\n\n // Padding.\n offset += OVERHEAD_PADDING;\n\n // If the `flag` is here then it does not blow up.\n //if flag {\n // incoming_body\n // Then we fill in the rest as the incoming body ciphertext\n let size = M - offset;\n\n // NOTE: This made the bytecode size blowup disappear in aztec packages,\n // but in this reproduction the size seems to be statically known regardless.\n // let size = M - 32 - HEADER_SIZE - OVERHEAD_PADDING;\n\n assert_eq(size, incoming_body_ciphertext.len(), \"ciphertext length mismatch\");\n for i in 0..size {\n encrypted_bytes[offset + i] = incoming_body_ciphertext[i];\n }\n }\n\n encrypted_bytes\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 66425a070c4..faae99140d5 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/encrypted_log_regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -79,6 +79,10 @@ expression: artifact "error_kind": "string", "string": "ciphertext length mismatch" }, + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -89,8 +93,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdrbattAEMbxd9G1LnZnDzPrVyklOIkSDMYOPhSK8btXMpWcdiG+yP5vDLIH/3TwNyujuXSvw/P5/Wmze9sfu9WPS7fdv6xPm/1u3Lpc++75sNluN+9Pn9/u3PRi+VZ//Fjvps3jaX04dStfXOm7YffarcTFMH7D22Y7dKvkrn1VLGIyF4v9U/yz70xpwGigwEBxNOBpQGgg0ECkgUQDdJILneRCJ7nQSfbO4YLHBcGFgAsN4hy8m4uD95WQcCHjgtKCb3AdzOtcbGKV0OAYLIZFUFcJDdpScTYXFymVUGhBHC54XPh+XwouzV0juFx1Dfl+XxrjMB9D8EErIeJCwoWMC4oL1uC3pHfBpUootBAcLnhcEFwIuBBxoUGmXYl3IVZCxgXFBcOFQvel6HDB44LgAr5ORzzTMeFCxgXFBXydjvg6nfB1OuHrdGqR6aSLoNX/uBRwIeJCwoUGmZalOEior7TiguFCoYXscKFBpqMsQgzV/+ksuBBwIeJCg0zn4mdBpbrXyBkXFBeMFrRBHtTcIlh1d68NrrSW5bdkkitB8WMwXGjQW82n+1mqOp85XPC4ILgQcCHiQoPE2b17W6oS12C84ZGguGC4UGihOFzwdPduMOTwSAi4EHEBX0UbDDo8EhQXDBcKLEiLOYEvn+1KizmBB0JsIKSl2HKphIQLGRcUFxo8Yze9P8W3+koXWvAOFzwuCC4EXGiR6a8mQsQnXMi4oLhguFBoocXczAPB44KgwnXc+rU+bNbP2+HvuPnbeffyafr89Ptj+G8Q/eOwfxlez4dhGkm/T6NPZ1uC9pJs3POpU6jrzU33M7ePJPUSbpvTWZMsveQ47sG4F38A", + "bytecode": "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", + "debug_symbols": "tdvdattAEIbhe9GxDnZnf2bWt1JKcBIlGIxt/FMoxvdeKVRy2oX4IPueBJQMeaTI36xEZq/d6/B8eX/a7N72p27149pt9y/r82a/G4+ut757Pm6228370+dvd276Yvmj/nRY76bD03l9PHcrX1zpu2H32q3ExTD+hrfNduhWyd36qljEZC4W+6f4Z9+Z0oDRQIGB4mjA04DQQKCBSAOJBugkFzrJhU5yoZPsncMFjwuCCwEXGsQ5eDcXB+8rIeFCxgWlBd/gPpjXudjEKqHBNVgMi6CuEhq0peJsLi5SKqHQgjhc8Ljw/b4UXJq7RnC56hry/b40xmG+huCDVkLEhYQLGRcUF6zBZ0nvgkuVUGghOFzwuCC4EHAh4kKDTLsS70KshIwLiguGC4XuS9HhgscFwQV8nY54pmPChYwLigv4Oh3xdTrh63TC1+nUItNJF0Gr97gUcCHiQsKFBpmWpThIqO+04oLhQqGF7HChQaajLEIM1ft0FlwIuBBxIeFCxgXFBcOFQgvqcAHPtOKZ1gaZzsXPgkr17K0RFxIuZFxokAc1twhWve1agzutZfksmeRKSPg1ZFxo0FvNp/tfqXoSaDDg8EgotNBgxOGR4HFBcKFB4uzevS1ViWsw5vBISLiQcUFxwXChwN1bGsw6PBI8LgguBFyIuJBwIeOC0oJv8D/2L2cdxHtcaDD7Y2kptlwqIeBCxIWECw1mf0zvUy1W32nFBcOFQgst5mYeCB4XWmT6qwkpkYALERcSLmRcUFwwXCi0EBwq3MajX+vjZv28Hf5uv3i77F4+7cY4/z4M/23MOBz3L8Pr5ThMWzTuuzOmM5WYesl5PPMpZep6c9Pz/cePQugl2HQ4dREZ24BoGs9gPIs/", "file_map": { "50": { "source": "// The code below is inspired by [compute_encrypted_log](https://github.com/AztecProtocol/aztec-packages/blob/b42756bc10175fea9eb60544759e9dbe41ae5e76/noir-projects/aztec-nr/aztec/src/encrypted_logs/payload.nr#L111)\n// which resulted in a bytecode size blowup when compiled to ACIR, see https://github.com/noir-lang/noir/issues/6929\n// The issue was around `encrypted_bytes[offset + i]` generating large amounts of gates, as per the `flamegraph.sh` tool in aztec-packages.\n// The details around encryption and addresses have been stripped away, focusing on just copying bytes of equivalent size arrays.\n\n// Original values which resulted in huge bytecode even on this example (500K long SSA)\n// global PRIVATE_LOG_SIZE_IN_FIELDS: u32 = 18;\n// global ENCRYPTED_PAYLOAD_SIZE_IN_BYTES: u32 = (PRIVATE_LOG_SIZE_IN_FIELDS - 1) * 31;\n// global EPH_PK_SIZE: u32 = 32;\n// global HEADER_SIZE: u32 = 48;\n// global OVERHEAD_PADDING: u32 = 15;\n\n// Using the same formulas with smaller numbers; the effect is the same, but the SSA is more manageable.\nglobal PRIVATE_LOG_SIZE_IN_FIELDS: u32 = 4;\nglobal ENCRYPTED_PAYLOAD_SIZE_IN_BYTES: u32 = (PRIVATE_LOG_SIZE_IN_FIELDS - 1) * 5;\nglobal EPH_PK_SIZE: u32 = 3;\nglobal HEADER_SIZE: u32 = 2;\nglobal OVERHEAD_PADDING: u32 = 1;\n\n// Unused because encryption didn't play a role:\n// global OVERHEAD_SIZE: u32 = EPH_PK_SIZE + HEADER_SIZE + OVERHEAD_PADDING;\n// global PLAINTEXT_LENGTH_SIZE: u32 = 2;\n// global MAX_PRIVATE_LOG_PLAINTEXT_SIZE_IN_BYTES: u32 =\n// ENCRYPTED_PAYLOAD_SIZE_IN_BYTES - OVERHEAD_SIZE - PLAINTEXT_LENGTH_SIZE - 1 /* aes padding */;\n\nglobal BODY_SIZE: u32 =\n ENCRYPTED_PAYLOAD_SIZE_IN_BYTES - EPH_PK_SIZE - HEADER_SIZE - OVERHEAD_PADDING;\n\nfn main(\n eph_pk_bytes: [u8; EPH_PK_SIZE],\n incoming_header_ciphertext: [u8; HEADER_SIZE],\n incoming_body_ciphertext: [u8; BODY_SIZE],\n flag: bool,\n) -> pub [u8; ENCRYPTED_PAYLOAD_SIZE_IN_BYTES] {\n compute_encrypted_log(\n eph_pk_bytes,\n incoming_header_ciphertext,\n incoming_body_ciphertext,\n flag,\n )\n}\n\nfn compute_encrypted_log(\n eph_pk_bytes: [u8; EPH_PK_SIZE],\n incoming_header_ciphertext: [u8; HEADER_SIZE],\n incoming_body_ciphertext: [u8; BODY_SIZE],\n flag: bool,\n) -> [u8; M] {\n let mut encrypted_bytes = [0; M];\n let mut offset = 0;\n\n // NOTE: Adding a conditional variable can result in the array being fully copied, item by item,\n // in each iteration in the second loop that copies incoming_body_ciphertext into encrypted_bytes.\n // Depending on where we place the `flag` we either get the item-by-item copying (blowup),\n // or just a single array item gets read and a new array constructed in each iteration (no blowup).\n\n // If the `flag` is here then it blows up.\n if flag {\n // eph_pk\n for i in 0..EPH_PK_SIZE {\n encrypted_bytes[offset + i] = eph_pk_bytes[i];\n }\n offset += EPH_PK_SIZE;\n\n // If the `flag` is here then it blows up.\n // if flag {\n\n // incoming_header\n for i in 0..HEADER_SIZE {\n encrypted_bytes[offset + i] = incoming_header_ciphertext[i];\n }\n offset += HEADER_SIZE;\n\n // Padding.\n offset += OVERHEAD_PADDING;\n\n // If the `flag` is here then it does not blow up.\n //if flag {\n // incoming_body\n // Then we fill in the rest as the incoming body ciphertext\n let size = M - offset;\n\n // NOTE: This made the bytecode size blowup disappear in aztec packages,\n // but in this reproduction the size seems to be statically known regardless.\n // let size = M - 32 - HEADER_SIZE - OVERHEAD_PADDING;\n\n assert_eq(size, incoming_body_ciphertext.len(), \"ciphertext length mismatch\");\n for i in 0..size {\n encrypted_bytes[offset + i] = incoming_body_ciphertext[i];\n }\n }\n\n encrypted_bytes\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index f5b3eb79823..d7e5332d1be 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdvRbts6DAbgd8l1LiRRpMi+ysEwpG06BAjSIm0PMBR59zlD7W4R44A/5psiLvLJSPjHlmj7Y/W4vX//8X13eHp+Xd3997HaPz9s3nbPh2Hr47Re3R93+/3ux/c//71K5z9Uf7//9WVzOG++vm2Ob6u7THm92h4eh1dKg3/a7berO06ndfdW4vL51prl663t9G29Il5ycFly8Lbk4Lrk4Lbg4DUtOXhecvCy5ODkDm7tU5T01+BnUcOCw0LCooWFhoVFBbuhK1lGUeqlyGFRwoKiQq7sg3gk+Zy8v5IlV/ZCdTJSL00FDPvG8vRxkl0aAUwDjALG4qYlwGTAFMAQYCpggBw0IAcNyEEDctCAHCiQAwVyoEAOFMiBAjlQIAcK5ECBHCiQAwVyYEAODMiBATkwIAcG5MCAHBiQAwNyYEAODMhBTglBGUEFQX6NCn2hWi5R9j+TaBqRGHUoI6ggiBBUEcQIEgQ1BCmCDEAFSUTxi9u+psGNUocIQRVBjCBBUEOQIsgARAlBGUF+cYtMMSqtR/5XTolGRDl3qCFIEeR/5UVtQqk7wvq9klsoI6ggiBBUEcQIEgQ1BCmAGCku12jLIDPHicRJixONEwsTSXGS46TECcVJvPoSr77Eqy/x6vstGcpjh4lETnA3NfvNm381ut/m+Wej50VHL4uOTouOXhcdnRcdXRYd3c07l/Fcwv0sy+9RzZMcJyVOKE5qnHCcSJy0ONE4iVff4tX3G1Ms47SXu0sC2e9LzROKkxonHCcSJy1ONE786k+XwyTzBSl+O2qe5DgpcUJxUuOE40TipMWJxkm8+jle/RyvfvGvxacynsZykh4VBPnXzoeOxYiGFVqHKoIYQYIg/zr6sNCYkHZfBF25t2Iq0/Cy2xNlBBUEEYIqghhBgiC/Tlym4nJtHVIEGYCu3G1zA2UEFQQRgvxEsNiE1DrECBIENQQpggxAnBCUEXTl554mRKX7PXFFECNIENQQpAgyAElCUEZQQRCSCEESIVcSUeuEuDuwiCCoIUgRZABqCUEZQciUoCFTgoZMCRoyJWjAhbLiN1aGtup0UpPW7clvrdxCBUGEIP8rb21clw4dqNIhRpAgqCFIEWQA8pstt1BGUEEQIQhJhCGJMCQRhiTCkEQYkAjyGzBDV246qVnpUQaQv35qdVxHttrd/u+vaayONxkba0c0TixM/NXMPAG6EFQLgghBFUGMIEFQQ5AiyAB0ZS1zAyGJYCQRjCSCkUQwkghGEsFIIhhJBCOJECQRgiTCX8vMHlf9lYylcQZqpSccPuL5a4v5vViY+OuKeZLjpIQ/vr+imCc1Tvy6TN1Za11g/AvA86TFya0TsUPiJ2KNn4j9Bc48iVdf49XXePU1/qv0lzXzJD4N0/g0TIPVPw1b/2+Ou839fvv5aPDT++HhjyeF336+bC8eGn45Pj9sH9+P2/Pjw19PDp9TREnWVNq3813owybzWtJ54xyXobGzJkrDPof9/gI=", + "bytecode": "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", + "debug_symbols": "tdvfauM6EAbwd8l1LiSNZkbqqxyWpX/SJRDSkrYHDiXvfpyldncj2eH7wDelbvMbk8zE8oztz83T7uHj18/98fnlbXP3z+fm8PJ4/75/OQ5bn+ft5uG0Pxz2v37++edNuPyQ/Pv1b6/3x8vm2/v96X1zFyVuN7vj0/BbkcE/7w+7zZ2G87Z5qWj6emmO9v1SP//YbkTXDG5rBvc1g5c1g9cVg+ewZvC4ZvC0ZnDpBq/+JVL4K/hFZFgoLAwWDosCi4oK7RZdijaKlK9FhEWChaDCZvYhOpJ4qby/Kstm9iJ5MpavTSaM9k2N09sJ9doYYZwwhTAVNx4IEwmTCCOEyYQh6sCJOnCiDpyoAyfqoBB1UIg6KEQdFKIOClEHhaiDQtRB6ddBkm+T07UphKm4qYEwkTCJMEKYTBgiPzH035CVMCKr0iBhUGaQMsgY5AwqDKoEioFBkUFMRcR+cv37FMslNEgZZAxyBhUGVQKlwKDIoMQgYVA/ucmmMkreov5HLkFGJDE2qBJIAoNmVoxSJxSaI6wkBgmDMoOUQcYgZ1BhUCVQDgxikpsNbUdjdpwUnFSY4A1/xDv+iLf8Ee/5o2acKE7w7CuefcWzr3j2rZt9ieP0QszO9KQuWlw1elo1uqwaPa8aXVeNbqtG91WjlzWj9wdUmsa1RNuzrP58apkITjJOFCeGE8dJwUmFSX8utUzw7Bc8+/2hlE4jfYvakIwTxYnhxHFScFJh0p9GLZOIk4QTPPsVz36Fs5/6c55hOjUeLoehTouMQf3rZkNDOKLhzLlBhUGVQP05zy3Uvxo7nOJMqDQfRH9kM/ROY5qGX9s9KYOMQc6gwqBKoBQY1M+Tpim5mr1BiUHCoMwgZZAxyBnUrwi1OqFSG1QJ1J8o3UKRQYlBwqDMIGXQzNc9TEhS832auzlnGVUCzd1Ms4wigxKDhEGZQcogYxBTEZmpiJnbXCTnCWlzYNHAoMigxCBhUGaQMog5JVDmlECZUwJlTgmMuEyS+pOcYUgyLWrm7Z6UQcYgZ1D/I3cfr60MHXVqUCVQ/zagWygyKDFIGJQZpAwyBjmDmIpwpiIKUxGFqYjCVERhKqI/gBmmDNOiVlOLFEfS7588j32k5+YW5n5PU/N4o2TV0pCEE8FJxonixHDiOCk4qTDpdzDLBM++4Nmf6V0WBz0y07vcQMogY5AzqDCoEmim4bmBIoMSg5iKyExFZKYi+r3L4nG037nUMJ5x1tQS/Cve7yUW99LvJJZJxoniBD/0Kn7oVfzQ2+8e6jSNrd4UTP9C+jKJOLl16O0QfOE1fOE1fOE1PPuGZ9/w7Bv+rXR84XV84XV84XUw++dh69/70/7+4bD7epzx+eP4+MfTje//ve6uHnR8Pb087p4+TrvLI4/fTztePpNUw1Zi/HG5a3bYVN1auGxc3rzENPwvD/sc9vs/", "file_map": { "50": { "source": "global len: u32 = 2450 * 2 - 240; // for just under 2^17 gates\nfn main(x: Field) {\n let ped_input = [x; len];\n let mut val = poseidon::poseidon2::Poseidon2::hash(ped_input, len);\n let z = foo(x);\n assert(val == z);\n}\n\n#[fold]\nfn foo(x: Field) -> Field {\n let ped_input = [x; len];\n let mut val = poseidon::poseidon2::Poseidon2::hash(ped_input, len);\n val\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_0.snap index 39d2d8ef52b..9619919d4f3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_0.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "3Z3RTuM8EIXfJde9yIztccyrrFaoQBdFqlpUyi/9Qrz7JlFT2Cax5VFUzfgGEepDviG2z4nrhs/qZff08frYHv4c36uHX5/V/vi8PbfHQ3f0+bWpnk7tft++Pv78cVX3X4wd2r+/bQ/94ft5ezpXD2BgU+0OL913jen0f9r9rnpw9ddm0tQ4vDS1QN9N/UxThDD+WsQ6xBs7DJe2ztQ/m/7eVMZphCaN0F4jdKMROiiEtrVGaNAIjRqhjUZojY5oNTqiFeuIwV/aErhbaLGOGIMW64gxaLGOGIF2Yh0xBi3WEWPQYh0xBi3WEWPQYh0xBi3WEWPQGh3RaXREp9ERnUZHJBmO2JPIsLmeRIZ39SQyDKknkeEyPYkM6+hJZPhBTyJjku9JZMzcPYmM6bgj8WLmWC9mjvX3nE/QfJNYvCW559jxQCOJ/3fFJatxj90IxQaiemQg39xiB5XYTa0TG3Rio1Rs783I4MPtTNIYndhWJ7bTiU06saW6ZAJbrEvGscW6ZBQ7iHXJOLZYl4xj63TJoNMlg06XDDpdMuh0yaDTJYNYlwz1uEEBAk6wxbpkFBvqeZu8rtJjneIGe2lqiO6xYDPznkJk5wjUUHqBWHqBpvQCbekFutILpNIL9KUX2JReYCi8QCg9yUAJSSay/QOghCQTLbCEJBMt0JZeYAlJJlpgCUkmWmAJSSZaYAlJJlpgCUkmViCWkGSiBZaeZLD0JIOlJxm02gocqNXFk4FaXeYYqNUFiYFaXToYqNVZfk9t1Pn4QK3OnAdqdY47UKuz0YFapTcald5ohM7X0W3sYIXOIetteQcrdMJZb+czWKGz05olCp3K1ixR6Ly3ZolCbyDW2xUFVujdxpolCrW6NUsUeh+zYolO6E3PmiUWkG5SJZaQbhIllpBuEiXa8kssId0kSiw/3bjy040rP9248tMNlZ9uqPx0QyWkm/jnOqiEdJMo0c6ViN8nQPuTe5C4fAnlS3y2xAsddKYex1G34Au3V8ALHUcJaqFDI0EtNMtjE67U9WSMeqHxPEEtNHEnqIWG6AS11De44tRCo26cuhGaXhPUQr0xQS3UGxPUQr0xQa3SZe76hJJ4uLjrU0cSKCgH5Z5PB0n0FSsHxclBITkoXg5KIwclSEHBupaDAnJQUA6KmCkO5z8E5+34+72liWS2pwfrLpLgbnet4PzHfOISyJdgvsTkS2y+xOVLKF/i8yVNviT/6pv8q7+wM7vGsV9CTW4iQo7IcESWI3IcEXFEniNqOKLAEC38g7yEiNMjLKdHWE6PmN96GJ1H57fyhXq8lQs4leQP8flNStGzzG/6iUswX2LyJflTr8ufel3+1Dv/pn6g8eoHP+kw82+SxyUhW0KpqXdGkm+8lG+8lG+8lH/1Kf/qU/7Vp/xRSfnGS/nG6/ON1+dffc+xKM+xqIUFdDDXHdNgp3iBIVpYPk6IgCOatyi4jmro1vwmooWFiesyYPft9EzEEXmOqOGIAkO0tLAYFwFHNH+dHF4vrrN+IjIckeWIHEdEHJHniBqOaL5HOLpulXDN7afIzMLiR0IEHBFyRIYjshyR44iII1oY7t9bWgw2E1FgiBYefJYQAUeEHJHhiCxH5Dgi4og8R8TpEcDpEQsPkDHWXkXOT0TAESFHZDgiyxE5jog4IkYkMNhwRIxIYEx2JPjqjv7bntrt03733mn6Fz8Oz+f2eLgcnv9/G195OrX7ffv6+HY6Pu9ePk67x/3xuX+tqi9ffhlDm+7v9rt/FGV3iN0tLQL2h32/MwQbQ6Y7a3fmvw==", "file_map": { "50": { "source": "global len: u32 = 2450 * 2 - 240; // for just under 2^17 gates\nfn main(x: Field) {\n let ped_input = [x; len];\n let mut val = poseidon::poseidon2::Poseidon2::hash(ped_input, len);\n let z = foo(x);\n assert(val == z);\n}\n\n#[fold]\nfn foo(x: Field) -> Field {\n let ped_input = [x; len];\n let mut val = poseidon::poseidon2::Poseidon2::hash(ped_input, len);\n val\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index de5233a8288..98826a0f832 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/fold_2_to_17/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "H4sIAAAAAAAA/+1bS2skVRS+le5OP/Loymt05R8QpDvpTMZdwLgQRQQR3PZkHuBWcCfU0o0ILhU3Irh1wIV/QBduBDcKLmRA3A0oCLM1N96T/urrr25Xm7qJo14IVV331Dnnnvc53cncbGXh2qbPTsAch+vocmvcIK6RZDS2DOZxuOmHzyuw32rwsH2i2yT+W6PJzb44X4P8H/QDzpTyMZwJ8I+6Ac+LxQw/n8WvjfAZbcje6Z39rbvZ/TDc9+mdFLpNKPvRjuB/Bc7m1wtF87TH+wcTw3+SAP/ZOlgLuvo+K+vX9O3g3CbndgI5n531MCN6zpXt3RH9gUvqE+OM6Bk/LJ8Vkk8njXwmGeFHfjpCPqbLVbFnuMzvO4AL4TtwRoTHe3sfnz0TrrnAmdH9qps/Dz4z+fpnT4d7jil+HYfr6JJrw83rnX0ghY7P1qSuDxj9gUvnkyPwAWVzbaEjZXP2bpO2cFW4WN9+HYfrUoI8819+tiF4Yrrobw3qtXasNfoDIaMUdtYlfqp0ZrLrCV5zsce20RN0eoLOk4TLbNRkg7LMKq5Gh58xHbRDzi/tBulgHFslOqsN0DG/Qrk1WSuqWNKjc/QbPMeAYI4bPgf2ZQOivZaG9kWvs55GRxf4N9Lgn5iesR8xG/B28TI893+b4TPWYPauX9ZbdAj+rWyG89XwbEgwrMPMzfoy9DWEH7gyPYN/PVxNfrlLIr/RNuB1RGuRbN+gsy6S7UlRPqvBvwKyfTM8U7Lt0t4Q9tq0h/Japb0t2OO+GeXRpJxNRjsBXxtkhDSNtxWCx3uUoT2bhqvXz4/Z7B3E6YAmPuO8MBT8bIj3MpLdThrZ1a6fjP7Azes5Rf20I+Q6FHI1+eym4eeiV90T/Cg9+2ebbl5nyJ/hwrhlMVzVKZu0h+9t0R7m65z2MH5izsP31Pkwhw3d1dQ36jx16rXE/Ubtvpb7jdR9reo3Yn1tX/Cq7CSj+76g0xd0rgpXrEfoi/euI3Ya/YFLapvjmFy7Qq4mO1Vj5WKP9bcp6GwKOk8SLu49UbeXjWX43lX1nl2i02mQDs4OuTdM1bMPiE5V/fwRPEe7rtubGPwvgPOTcG85EHnvVtDjuM/nYHqfhqvFrk16/zh8Hl1yqd7EaC2S7Wd01hacpU5vYvDfAM7Pw/1Q0M5oD+XIvYmaI9ke5wHn9PwhRW9issXeBGni99Ksd4xd3N99Ea6qN1k2v7YEP7FZT2IbrZ1fjf7AJc3341h+iX2PNkzDz0Vvkgt+lJ6xN0GdIX+GK9aboOxjuYdrCZUvVIzn3mQlcj5/z72J4k/FFe5TMI5VxSCOYV+Ha8rvlP1S8dporTkdGzvEfw/O0BJn5PMb/Lfh6uX1MNwrehyne4JXFYs5TmNc5LyKM4DY9wox30B7Z/tAv8hr4GpFaKvZUB6hrWZDzItz1f5rftoqZnsmm4t6BPaajNWezk/ZjA+Ok52iLBulR1Wjx2Sp9JgTPMpOxa8W7alZsopfHNtUjYr+krl5e1E+aLFM1WAtwMs1WN2cVEf+yjbRX4e0p/onZdPsyyrXIDzXyAb/KFwt5iaaRcqYu0VnwO8glB2fFOUzGHw3IPW6/M2VZaZ622Xn8qwH5Jv1YOfEvJBHzmDwj8PV+/7v4Pt+YQyy8ySOQRMVg4zXc/6L8rnVjBnh2Wd2BTzOeDnO4MyXZ1eqNkf9rRO8yXC1Ah77W4RfCfLwsvkjK/OHdr1NvCufXDYObgHPz1bkBsxRHq6flc89hHMt41/PgX+th/sm/Yu/L/s3fu+1B7bz//deSXPNf/57r39a3kCZ18kbSkd18wb3wipvqJjNcTn2vSDG7HXaw5htMQ5jdixn1a1d+4DXZrMq5nLPavyo+M/5AeH3If6/lFXT4/iPMZ7j/5bg0/Yw3nJ9pfSP9RXbi/I5tIlNoo22tFcDV8xWbwj4vQht5AvfZdpVcUH5vcnmOnrWUj4syrKJ+bFfdWSp9JgTPMpuWb/foT30J44JaKdmv+gvmZu3F+WD7PfKP7G2U3UY/2ZZ1X0oX/w9FMK/Bn5/P0Ivxe+duMZvOk9wT44xZ7cGrth8ZVHMYdoq5jAvTvBp7ym/x7rZrzbspfb7JvtEJUulx9zNx9dd2qv7OyDu3+r+Dgh7tPvk92qmVDffY7/Kv2VU8SQ2q2pihqv8nH1Z9dPGg8mpLXD7e55VGfzbQaape0E1q9qmM+C8TcWjk6J8BoN/H2LqOxRT1Xxv2VqK9YB8V8VUzAtbkTMY/LuB70WzqiuKQZPUtceieM61gKrxYnFA/TaQ/Xu1Ar4qd78HOuJZFcZBrnGUT6o4yPETbQvrnwekF7RxnFV9QPFS9Sp1/OtL8K8PE/hXn/bQv7DWRtk2HZ/YjjEGIU3jbcXN2yz6QIeefQy2w7MqzNWx/J27ebkanKoTMpJdollM7VmV0R+4pLlmHItJqq81+eyl4ediVqX6LaVnnFWp+RTiqjurus68gTKvkzcuM3vgWZXKG7G50rK1K8+qqmrXB+TzTdWu9j9OsV4wI35U/Of8gPBfQfz/LqumF/vOgeP/tuBT9W5cX9Wd98Z8Dm2CvytW86IYrpitPiXgb0RoI1/4LtOuigvK700219GzlvJhUZZNzI/9qiNLpcec4FF2y/o997roTxwT0E7NftFfMjdvL8oH2e+Vf2Jtl1KvR7f+qovOeQ34LXbwasM+wv8QEPD/z5qsj/8mn/eOpuN7B9N708PpnTuT0yn3l36ZDa0loD89Orh1uj85Pbp9eDA9uLmQ/kXPUcz20U/96obPVnsyvOHrEPzPEJ8fgg+ewwp657/piMBlFddzHOJZuyg/6xfz8K1iHt5oD4p5Hm1vDfYwhvi1Hj6jvBCX8dEh+EeQw/zqwTv2fi7o94h+iW/xDGMY42qJZwbv9fMr+Q2evela+Zwm4cdnzJvZTgq/Oj28eft0cjgd3R37j/tX7ddnpI9Op0fj8fOT8d3J+HAR/T8B1VEp5b1OAAA=", + "debug_symbols": "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", "file_map": { "50": { "source": "global len: u32 = 2450 * 2 - 240; // for just under 2^17 gates\nfn main(x: Field) {\n let ped_input = [x; len];\n let mut val = poseidon::poseidon2::Poseidon2::hash(ped_input, len);\n let z = foo(x);\n assert(val == z);\n}\n\n#[fold]\nfn foo(x: Field) -> Field {\n let ped_input = [x; len];\n let mut val = poseidon::poseidon2::Poseidon2::hash(ped_input, len);\n val\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/generics/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/generics/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 4a27aca95a6..9fda85e0a6f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/generics/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/generics/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -42,8 +42,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1aS24TQRDtmXg8HjtWIjgBNxj/YmdnCfNbcYaJg7kAB/AZ2IDEBjZwAcQFYMkGjoCE2LDgAkio4y77+bnGn7g7iVBKinpmqubVp6ure8qJzIwi92ep4sbYrJLIDN2Y70ctj1h5SDujQHYuBTky5SS8A3eR0fv28YFHhzPS6xN/kHeLTPHPo/2dDDAD4LcFvxIGP08dzuPpMr4hvU2zvHjxHeFhjj1xvJrjy/Vdd50RXoh5R5t8x+2uYn8Mvlm6P13wjEfdgj9y+CGwH4Sxfb7eH06DzMsc/1EY/HbDzPL4pcNrmuU1gzELvHbbEekzZnntGtJfN0FrVSsifWIPxyem2CWKrcfEszSazsajkrhayhRMn+tefKw6vAr4qPkRkzxeG/cOPrvnRptjr+Gdsrjis5hip9XxwDl50lR8FBJeSn4hrwY8zhPcy0fThRzTAd2jvxb/DeCynND/ECfOAaZNcXoHuCzHtt7Wv8vXv6pi67FZzQ/ZM7epf9UwPs7rn+Qm1j/Nj9is5nIKPiX0bOjGUPWvqbzH+ZqGid3W+Sr66ybo+mnxXG6Kq1Z7Uop5Dd6TM9iRElfej2phfJznq9REzFfNj9is1lDcdxJ69tSNWr5qccVnnK8VxZ7M6DV96Cc+hcxp3ayS8BqkG3mHwEP7mbS9RnyysfsAuCzH9mAeiW0Z+eE5TmccC6PYhbFIidcku+SaSYuT+GTj9AlwWY7twZwR244UG0QucP2br0XxB9ci67QUm9U5xTxN6NlziBOvRYzruj352OjrDeNzU3IsIx7m2K5rEXPsC+CyHNuDeSS2JcR74cbQvaw7ZKe2zwQ6+51q3ygcK8ybiHhYY3m/PQSs0XQhx6TNqzyz8/oVcFlOSOvL2b+hu8/3o5bWl/OI39bm2SN+Z5vzY6C9uhuRPmP086Pov6rzY0b2bDo/1hVbj035GuF9A/XUFT0aVuwRi/eDQD3mnWvKrjVf7La14TvgshzrxHkR/Q2wszJd8H3Foz+YnR8ufHH4iVn1C/UnJP/K3WPMZKzsYeekX7QmnWJS9Irz8+644H3IUgxx8q2/6HcG43Z33D/rdYrOyUb92L9G/RIznuOYeCL71o2he67avp4E8Of9DfQn8Jmpxz14JK0/xeeWVInrtvUHe42XPXOybSKv9cYsyW9ynBcf3XidZ1Stvpat29u8WLVnXV6IDdvmhch/duN15gXPfUR8YxZnGIwL94u1fug6rHgNVrQGC2N9oOjmXNkm31nXLnX9mxtvUl1f97sJj8boPaOyfrel0XRZT8WDHo6fpaEb8/2opfVARY9Wi/aNFWJJnzr0byeB+2sd7qV7m59WnvP/+GCc7PgDniNPzuj8bgp8lP8FmD/dtVZzZI4bwMd5S8ge/iZn+bLvw2qJ/VWyX+R/u9HOwV+yn/NK04fxQpvTEn1/QJ8ESDCxj6jtD+zzoSKPfamM/MHvmEN6D23H72rtXa5NDbBvHRby5L6q4Gi/B5a9p/Wca4RTKdGH98as30e3XU++vxXbg8HJafss7/bPx5Pzbueqv1XHvZOzcbdX5M9aF+Zs0v8PukEG0DksAAA=", - "debug_symbols": "ndrdbuIwEAXgd8k1F/aM7Rn3VVarFW1phYRoRduVVhXvvqELoZs4ROfcIAfxEZQz+fHgz+5xc//x/Gu7f3p56+5+fHa7l4f1+/Zl3299Hlfd/WG7222ff31/uwunFwlfn397Xe9Pm2/v68N7d+ceV91m/3gaSe+ftrtNd5fD8eeqkwgLgYXCIsEiw6LAwmDhsKioUDhzhTNXOHOFM1c4c21nXuUsaohjUWBhsHBYVFSkAIsIC4FFM/Ma7CJiGYsEiwyLAguDhcOioiIHWDQzr1YuwmwsBBYKiwSLDIsCC4OFw6KiogRYwJkXOPMCZ17gzAuceWlmHkNMZ9IP89gYYZwwFTcWCBMJI4RRwiTCZMIQdWBEHRhRB0bUgRN14DN1kGww2cdGCKOESYTJhCmEMcI4YeqisTAyNRAmEkYIo4RJhMmEKYQxwjhhiDqIITAoMkgYpAxKDJqpBq8X1I8nqDDIGOQMqgSKgUGRQcIgZVBiEFMRsV0ROYQLynGKjEHOoEqgdiNwCUUGCYOUQe2K8HDpEPVDmaDMoMIgY5AzqBKo3SZcQpFBwiBlEFMRylSEMhWhTEW024fRzK8oTVAlULuJuIQig4RByqBEoDw3YxxuGnVCDCeOkwqTIjhRnCScZJw0j1jKeibJJ4+E7UbLTdLus9wmESeCE8VJwknGScGJ4QRP3/D02x0M1UtZ6mTuHtsNjNsk46TgxHDiOKkwabcubpOIE8EJnn7F0293EySESzNbQtQr+mecMLVtog1G8v9G2s2EBROXf9u3/6KOq8ZlX6/dy2Tj74dvFRIKTgwn8C1cZmbZ7kNjw90nSBikDGrfyOsQZT+0CcoMKgwyBrVTqjIciKppgiqBZmbZC2jmQJShimqZoplTW3045dL471+Zmb3d3tPM7K26DqiGCVIGJQZlBhUGGYOcQZVAKSxfhCfhpsggYZAuItEJSgzKMyhf0eS6114U0qNwCxmDnDhzE3O654CiY7/1e33Yru93m/PawqeP/cO3pYbvf143o1WHr4eXh83jx2FzWn94XXr41YOOqaz61t3pYeRUadI/eUvO/X76ff0F", + "bytecode": "H4sIAAAAAAAA/+1azW4TMRD2bnabTdOqEX2RzX96IhKBwmNsE/IcERe4wAUkbjwB4sYTwI0rF3gEJMSFA0fk1tN++TK7TYhNf9SRKu/u2N98M/bYjt3InEnk/qwkrozNqkidsSvz7aTtESsPyTMKxHMpyJEpF9E13UOD2tvPNY8ON8iuT/xR3isain8e+XcbgBkAvyP4SRj8vO5wHi+W8Q3Z3TfLyYttRIdj7InTZU4vz4fuuUF4IfodOfmO26HCPwbfrDxYXOiMR9uCP3H4IbAfhuF+nu+PFkH65Rz/OAx+p2nOxvEzh7dvlnMGYxY4dzsR2TNmOXcN2d81QeeqdkT2hA/HJ6bYpQrXFumsTBb/Ja79fcW2Ic47YDsiXR107Gum+KOtxzV6R38txgvA5XoityFOPF5ZLovTK8Dlesz1LofD57DM+/uKHY55GsbHtWMu9ndN0DFwHvOU+HB8OOY7CtcW6azIWnhQElcDMd8J42MuPkrOJ+Cj5kdsVueIOviU0rf7rrQ5/wbalMUVv8UUu5rCR4tdQrGrB45dpsSuXhE7nENx3Unp27HxF7tE4dMw+pw+9hOfI8kH/q1nRXS7ZBt1TdAhfxZtrRGfbPkWcLke88FxJNwa5IfnOBUcC6PwwlikpNsjXvLMosVJfLJx+gC4XI/54JgRboHXh43HU0a6bcaT+GQxPwMu12M+2B/CLSXdzJWhzxTuEU9trgy0fxlp+2yOFeYX70mxX3m9bQLWZHFRj0XrV/lmeX0FXK4nop2P2L+xe8+3k7Z2PuIRv6P1s0f87hXuH3sR2TPmZu4fM4VrS9HxGMwUO5liR8OKPWLx3jXQWd/Gc8qmc77wtvjfAZfrsU3sF7HfhOdkcaH3FY/h6Gw/euqLw0/Nql9oP6X6z907zrVSJlvwnA+L9rxbzIt+MZv1pgWvQ1ZiiBOe46F94cwxjkkndV+6MvC8o66raQB/Xl8Tf3yPj2LYHU07venwpN8tuoONxseBWV3PYopTqP0Uz+/4+49tig/cb7g2pPTtnSu133+Y11XnQC2jz8EYn0DjaMDnISjaWSPv+crWJ5ZQ+3XmJvW1vrUi90qc0+9deZV5q61Nm+QU7+Fuak59dKWPnIoUPnc5tcqnKqeEw7o5JfU/ufI6re23OW++uDJU3jB/xMIxJfcUWqzTNbDiCqyoAgvHac2U9/Mm86zo/2Uv+M2V12n8V93XcWmMflZZduZvZbJYtpN4sMPxszJ2Zb6dtKvO3rU72m1jhVhytxT6/ijwHUuX7yi89U87z/n/ozBOtvwB31Env6u5bR30WP8XYP50z9qcI33cBL12Byft+D6C6/OZzi7wqFX4nlL93660fZBGy/x5XGn2MF7IuV5i7w/Yy6JlTDzr1dYH9nlPqY/3AMLngDhgW4073tVobXluagK/KizUyfuOgqPdiZa1ixV+GeEkJfbw3ZjqdXTdfPJ9ftAZjQZHnZO8N5xN57Ne97LzA9/2p/3BybTXL/Kn7VM6l9n/CxGZPpp1LQAA", + "debug_symbols": "ndrRbuIwEAXQf8kzD7bHnhn3V1arira0QkK0onSlVcW/b+hCQIkDuvelSqoepXiuQzzxd/eyevp6e1xvX98/u4df393m/Xm5X79v+7Pvw6J72q03m/Xb4/Wvu3D8kcLP339+LLfH08/9crfvHtzjolttX45Hqfev682qeyjh8HvRpQiLBAuBRYZFgYXCwpqippOoIY6Fw6KiQgIsIiwSLAQWGRbNmtdgZxF1LBQWBguHRUVFDrCIsEiwaNa8mp6F2VhkWBRYKCwMFg6LiorSrHkMMZ9If1jGJhImEUYIkwlTCKOEMcI4YSpulMiBEjlQIgdK5ECJHCiRAyVyoEQOlMiBEjkwIgdG5MCIHNhMDrINpvjYZMIUwihhjDBOmIobD4SJd42FsUmEEcJkwhTCKGGMME6YmRx4PZv+eGRqIEwkTCKMECYTphBGCWOEccIQOYihHYQSwhmVOEWRQYlBwqDMoMIgZZAxqB0ID+cORH+YJqgSKAYGRQYlBgmDMoMKg5RBxiAmEZFJRGISkZhEtNuF0cwvKE+QMCgzqDBIGWQMcgLJ3Kpl+NKoE+I4qTDJASeCk4yTghOFyVxnRS4rqXzV9flvhDCZMIUwShgjjBOm4qbdWclFTiT7+Dk9thsrt0nCieAk46TgRHFiOHGcVJgYXn3Dq2/4IBs+yIYPsuGDbPggOz7Ijg+y41Os3akQOd/OZdJDie1GxW1ScKI4MZw4TipM2i2K2yTiJOEEr37Fqz/TNag2PDNUj6PvpJmuwW1TYZNmmga3TSRMIowQJhOmOTv7oTm/lOs/sYyNEsbaJtpgUhkbJ0y9/79dvcM9LLDnpRThZ/MUM04KThQnM6toH7q07uMJneZW0bdRZNDMtBlK2R/aBAmDMoMKg9pVqmkYiCp5goxBTiCZGQi93EF0imamtvgw5bJOUCWuNLOWri4DqmGCIoMSg4RBmUGFQcogY5DfvwlPi1sJ1N4gcg/FuyjJBCUGyQwqFzS577VbGT0Kt1BhkBIztzDTvTiKDv3Zn+VuvXzarE57QF+/ts9XW0L3fz9Wo92hH7v359XL12513Cd62SL68y4gSlhEKceHxWP9U3+nSSr9dfpr/QM=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/generics/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/generics/execute__tests__force_brillig_true_inliner_0.snap index 71d0f75a5ef..7d75a5545be 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/generics/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/generics/execute__tests__force_brillig_true_inliner_0.snap @@ -42,8 +42,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81ZS47TQBAtO3Zix4kSARfgBnbsfGYXCdix4gR4EnIMNLBhwQXYgMQSCYkros50JZXnSk9QuocpKWrbVV3/qv4konuI7M9AYseYusA0azuW10HlkVcZUs8okJ4nTo7oPDDujx1zmG/wPY8G5yDXJ/9V2SxyxT6P+te54BmA/4z5J2H4lwPL5/XdKX8CuWM6LV45h3Eyx95YXGbx/DyxzznwCxF3qZNvvz1X9I+FbQZe3QWRXRXWl9/oCDJWqUO3FGhfQDzSQP56JvgSyNJyKwK9AsVxFoE8otP8R/8NKVzelnYBwFrqUdc/MfguUXSdAs4A5+RE8Sv6PFTPYVkc/0TYqNkRUzc3U2FTCt9e2tHUyA+wT/Or/Ia+O1ffIXNyrNiIsekHkn1pPbD8IQXtG4d66IM+6B+sh4Gi61TB8byJ4tcUfD4IY+OhHjLLT9aDZkcM9PKZ6FgP/K2yo1YPml/lN6yHVNEnV/Tx6J8bjinu5Qwwbgh2SVwhcFJ/hB68S5vM+FPwRTrUR+YR66b5ycDajuWVwLazn2Qv7Ss2pUC/Bj2lT0PvBdBHeRjZLeaLBFe+MG4kcFqvZNByiW26JpcKkM/0l8aa6d/aMbC/1VizrAl1/Yg9N9A65+y5ffCxgX/tue/sqPVcXFvxm6vn4j7gqfRcrJP/0XNd/QR1WNuxvA4qrKv3IDdQfNS6ykC2xEUebdZs88h/pvUkj/xrbQ3AuirCxK3R1gxtf83yhxR0LT7srwvQB/2D++uRouuU3GukxEk5I0WOxivzyCsHe2Q8ojMjy8FveC6U68LajuWVoJ1HM7Ah82hD7t+GakrdOGIccg82TKnbPx7p7F4G7h+H++aR7/hUZTkW+qLfzJ7oo/gucSkd60/OLQRe0n8WPD/ZZ0Or3UnhGoB3UlosJX1fyOo57EuB/osdTa7+ss+uOzOUJ32SOHzC9F+FvN/Ak+8AiNy9menHCr28R0jAHrnfHcM87Vxxbi72n4HQz8VL4vg9VvhoPfDcvFjRbwR8sjPy5LsBzBsDfI96ac0czuR3RzpffWG5uj/P7HW1/FPq7q2l/BTov9t3uc/gMblCz92yrXZ1u2vn7XbbbFrct5LwVxFAfrusV5tZs1nezuu2XjwoX/6vgj1n7y86zUEDeKeu/X/m4hU7eEUOXjxPnl2x/xnQzkchfT5brRY3s9uyWW43u21TP3bMN/PF7aaZt+WHaq/OQ/L/AmwWHBWdIAAA", - "debug_symbols": "tZrbbuJADIbfJddcjMczY5tXWa0qDqGKhABxWGmFePdNuhDSJKUaN76pmmq+/0O1PUTJXIt1uby8v1W7zf5UzH9di+1+tThX+119db3NiuWx2m6r97funwvX/ID0sf50WOyay9N5cTwXcxY/K8rdupiLg5rfVNuymEd3mw2WgoP7UgDpLv09K4Asw9kyXAzDvRsLF0qPcKI+AdmEzyYwmwjZRMwmUjZB2QRnE5JLYHbNMbvmmF1zzK45ZtccR2tez0d4DIiD2GeSgiEFwwpG8pngFAwoGK9gUMEEBaPog6Dog6Dog6Dog6Dog6jog/hFHwRqmcivv4xCxPvawK4f723j0TY+2MZH2/hkG0+28WwbL6bxydnG205tsp3aZDu16fupJfc6HvFxf42fP0kTH23jk2082cazbbyYxpOzjQfbeG8bj7bxtlNLtlNLuVPbMKRgWMFIPsNOwYCC8QoGFcwX3cXSPkdx/ZpyVDBJwZCCYQUj+Yw4BQMKxisYVDCKPhBFH8h4H/DzuR0732dIwbCCkXwGnNNAoIG8BkINFDRQ1EBJA5EGYg2k6QgY7wgifkLh9TcqMLd7NjMPDGBu8OYGNDeEnxvEPZ6w1r/SwBDNDcncQOYGnsDg20oLhoFBrA3emRumqHRq9yVJAwM6c8ME+5IwtgZxA4M3N6C5IZgborkhmRvI3MDmhp/vS961e6uv31f0DcGZG8Dc4Kc1eBwY0NwQpjDEp2FwNxPiFAb3ypDMDTSBAbk1hDQwsLlBrA3jLxk+D1GnAf8zqGDCOAP0LGHsM1HBpO8/W+efMHqqB59vagN182/1xZ/FsVost+X91NXmslt1DmGd/x7K3nmsw3G/KteXY9mczOocymo2U4h+BpE+biubyyQzIKg9tesf", + "bytecode": "H4sIAAAAAAAA/8VZSY7TQBQtJ3YSJ7Y6Ai7Bzo6doXeRGE7AAXAScgwU2LDgAmxAYscWCYnroequn7y8/LgNdtFfiqpcwx/eH+yqBOaeAvezFLq2Zy5J1qxdm7WjvENemU89A096noEcmOskc79dG9N+O9/v0OCY5HbJf5WVi1ixr0P9ixh4euA/E/6hH/7Z0PF5eTjnb0huas6TF/fIHMbYKzc3cvPSv3H9mPj58Dvq1DVuTxX9e2CbpRcHL7LzicPyizkR+iqq0S2itc/IH5EnvJ4AX0OytNgKSC9PfpwFJM+Y8/hn/MbGX9xm7gXAudQ3l/j0CLtQ0XVKc5YkJn3jmiqy2aeeYq2xT0X+2HitsUefRqQP48M+HSi6TpU52Xej4MqYD/zYmIkseZ+EYKNmR4/WY9+YU52SseeutXXvG9mn4YpjnA9aDGjYhYTd0DN2I3OJ3bAGuxHMSR+xk7HcdIddqOgTK/p0iM+t5AN/y1mSuTHZhXMTmEP9mfr0jDbZ9jvw5XWsD8aR6KbhZGnt2qwlie2Ck+YrlB/R+jXpiZj6/hYQWU3yMPakV0C6YB7GCpY9BSfpI74y9tq1vvPQk982nE9IMpeAbD47pGSzMc3zUGxqk4cJyZf1TfNE1r9x7WPmiedvqIrrqlGw1epqXRw09bXY9Le+RpxEN+38bGnt2qwd5Rwbb0nuY5yntLN10KHNmm0d8p9p78kO+RdabAeE3cSP30qt7mlnE5E/Nl5rzPFsMiF9GB8+mySKrlOj11nsJ4qcRJGj8Yo65DUie9AfwZVW5PAY3vugnpbWrs1aUt3ZJVXktrVh1L0N+dRcf8emitx/tWFqLusH2+frXtBz/TjeNydd+yfPshT0ZdzsGf49jONcZE75h3snMI/rPwLPD65v194ovuF3AN9faL7E9UOQ1a+xj+8bPrnWyv/p+pp+wRV5iMmgBhNZ/xnk/SKeeO6tq82yPlXW4/llQPbgHUNK+1B3vJ/R9nL9wf+O6njhnDz3FD5aDby2T7tfSohPdEUePlviuLEk96hNc+Z4Jj+c1nVVF5ar+7Prna6Of2Quv61RfkTrv7pn/M6QNmyh535Z5fui2lfzarcrtxV/txrAa+JBfrUsVttZuV1u5kVVLB6Uj/+rSIxzTbHk+385kSV+wrsIlik2cExjPkY09sO12l0Exo0W+3X3qYyVdq+B2EseaVhHDXj1angFNbxkX2j094Ls1c6WPuN1tlotbmebrFzutvtdWfzvfNnOF5ttOa+yd/mdOg/J/wN40yv52SEAAA==", + "debug_symbols": "tZrRTupAEIbfpddc7O7M7szwKicnBrUaEgIG8SQnxnc/hQOltiDp0P/GWNPv+4ydXYH2s3quHz9eH5brl817Nf/1Wa02T4vdcrNujj6/ZtXjdrlaLV8fuj+uwv5LLIfz398W6/3h+26x3VVztTSr6vVzNbcQG/5luaqreQ5fs8GpMcTjqTFa99TfsyoKUq5IuQHlKVySm5STXKRPxNFEGk3QaIJHE3k0UUYTF4euuR58uiAh5j6jDsbGMxQcTHQwycGQg2EHkx1McTCOOSDHHJBjDtgxB+yYA3bMAV+ZA5aWyXpr86NzgDsL9OBnsD+D/QXsF7BfwX7D+nMA++Pdfs50PJc19JZXTlg9YfWM1WesvmD1gtUrVm9QfQlYPXbVFuyqLdhVW26vWgl36DNWX7B6weoVqzeoXgJWH7H6dLee6PQ+nr6vwL2esHrG6jNWX7B6weoVqzeoXgNWH7F67KpV7KrVK6tWrf08MAyY7GCKgxEHow7GxjMWHEx0MMnBkINxzIE55sAuz4GeP3/WkPqMOBh1MDaeiSF4oOiBkgciD8QeKHug4oHEA6kH8kxEvDwRInqG+OcdO6q227uqDgoRXkjwAsELfH/BwunOTfOtDAoZXijwgsALOkEhtVfaiAcFQxdSgBemuNKl3ZesDAoU4IUJ9iVTagsWBoUELxC8wPBChhcKvCDwgsIL9+9LKbR7a2rug/YLHOCFCC+kaQuJBgWCF3iKQj4XBq9mOE9RCD8VCrwgExRI2wKXQUHhBUMXrty8MTn/69XO41z/GXIw7GCygykORhyMOhgbz1y+yfB9k6M+Ex1MusxEOS+x3GfIwfDt360zpOMeUPhqDv4stsvF46o+Pt358rF+6jzsufv7Vvee+3zbbp7q549tvX8CtPPw5/4PH3OaxSyHl/37Q5FZFGs6Tesf", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 4e8bf4b25b2..c3bf10a9ed7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -64,8 +64,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndjbiuMwDAbgd8l1Liz5JPVVlmXoIR0CpS09LCyl7z5JZ9KU2J3g/6bEhS/GlmLLvlWbZnX9/Gj328O5Wvy5VbvDenlpD/uudbvX1erU7nbt58fr35Xpf4jsA5yPy33fPl+Wp0u1EGPrqtlvuic23Qu27a6pFt7e/9YdCTlCxOHHdI8xQRFBgiAFEBsEEYJ8HgX3REET9GYi1D6R+gTlJ4KdHxB7niJrEEQIYgRZBDkE5ePE4RlcjjZBAUERQYKgfEZYSwOyLklYZxBECGIEWQQ5BHkE5TNCx89dJVlhXUSQIEgB5A2CCEH5jFAZspyNSb5cbxHkEOQRFBAUEaTArhEMgghB2SkXK0Pp4ZIRBV9OQjmJMySmRMqJFpNoykk2MuqHr05FpkSycWFSHXKNTRJM8QgKCIoIEgQpgNQgiBDECLIIQjJCkYxQICPY5HcJ9yyFXqs7/ib5RTiagUSXkFhOpJzoDFE7JWTKCZUTLie2nGSHH3lYrcIIzANwvg8aT1OSEFdOfDkJM8T7hMRyIuVEi8mbQ+GvBFgy2HoEIUuGBTYRfnMS0khjCUsj+jZvilEdCzcOU+OBfvKzYMzYD9mpiYARwOT3UUNxnAM/MfkzxowhwPD8eF7jU6eLUxyK3CjTSHog+u9OIr8aX2juXePf8tQuV7vm55Jwe92vX+4ML/+PzeT68Hg6rJvN9dT0F4njHWI/Rq910H4D78PWbWs1xUezjwiJqUm467Pr9ws=", + "bytecode": "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", + "debug_symbols": "ndjdiuowEAfwd+l1LzIz+Rpf5XBY/KhLQVSqHjiI777t7tZKEyn530gj/RGamSST3Ktds7l9frTH/elSrf7cq8Npu762p2Pfuj/qatO1h0P7+fH6d2WGHw3f71/O6+PQvFzX3bVaRSN11Rx3/ROb3u/bQ1OtnDz+1hUZkyNE7H9N/xgSRAhiBAmCLIIcgjSPvH0ir3NEbwZC5YnUJSg/EGzdiNhxgiyCHII8ggKCIoLycWL/DC4HmSM2CCIEMYLyGSFCIxKbJCxbBDkEeQQFBEUEKYAknxE6TXeNyQorhCBGkCDIIsghKJ8RGscsZ2OSmSsBQRFBCiBrEEQIEmDXsBZBDkHZIY8Sx9LDpl+kxcSZckILJKSEy4mUE1tOspFRN846jXFOfDYuTKpjrrFJgukVQMEgiBDECBIEWQQ5BHkEBQQhGRGQjIhIRsT8LmGfpdBrdcffRPOLcDAjCTYhVE64nMgCUUmILSeunPhyEkoJ5w9vgcfVyk/A/IB8HzSdpmJCYjnRYkJmgTiXEConXE6knNhyAiwZTMCSwWwQRAh6U2EHmkpYmtCPEcBYwDjAeMAEwETAaLkRID7vjiU6Fdbs5wYYg/z5oq/ap35I5kbLTf50sWDyk8FQmMbAzQ0DRgBjl7/nNT51unmE8RAS4jySFoi+9YAJhebRN/6tu3a9OTS/d7j723H7cqV7/X9uZre75+60bXa3rhnueacr3mHUndZehz15SA9ysSYvQ3OI/HD1SN73ffb9fgE=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_0.snap index 46f5a992463..dc186129e8c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_0.snap @@ -64,8 +64,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zZnbbqMwEIbfhWsuPDM+TV5ltapyIBUSIhFJVlpFefeFNkAKbCPcDvVNFEfz/fPHY2NsX5Ndtrm8vuTl/nBKVr+uSXHYrs/5oaxb11uabKq8KPLXl8efE9V8ANAbcDquy6Z9Oq+rc7LyitIkK3f1N1S1wD4vsmRl6PY7rRE7hQCgvTP1VzeCXAjkQyAOgFCFQBACmWnI6g6yPIL+0xFMHcRmBE13BGrTQmhwCJEKgSAEwhCIQiAdAk3XCW1XXHQ0gmwI5EIgHwJNjwgiaCHSHwZsOgpGYL4HIyoTHNzY0SouOxCXHYzLjlnWDrDrlNlDH/zuxi/thtuJhQrt0I3ovGoyGCWeAcQzoHgGEs8w/azmfvVmr54MJd09oh9XHXzTt9N1Zt+PPoVP9KF/k/B9qHrXB2F9/E59Y0b6JKyvhfWNsL4Vrq8T1vfC+izb/04J64OwvvD8dSRbX6eF9YXnr7PC+k5Y38vqe/X19depNtbp4frrQVgfhfXpO/WZRvpaWN8I61thfSerzwtvmT/fhfHSO2al+ucI0NANRuWGonKjl3YDrt8vm6EbE5UbG5Ub95Pj5vFkYxzrXHve7PzwDISjOpFhjshN3cVRuaH5lwmodAhkQqDJgeTJ3xmvcYTwbATUfASeIG6M4HyE5iN6PjJZGTbtawp7/wG51a0/6ypfb4rsfqm4v5TbhzvG899jNrhuPFaHbba7VFlz8djfOTZ/0HBquZmoTRkQfIpITbPpYkRdN22ds877Dw==", + "bytecode": "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", + "debug_symbols": "zZrbbqMwEIbfhWsu7LHHnsmrrFZVDqRCQiQiyUqrKO++QAOkwCrC7aS+iXA03+9fHhvjwzXZZZvL+1te7g+nZPXrmhSH7fqcH8q6dL2lyabKiyJ/f3v8O1HND/s2/nRcl03xdF5X52RFyqRJVu7qJ1A1v8+LLFmhuf1OE63UHKI1uDtTP/oJpEMgCIFMCGRDIAyBeB5ytoccjyH9n4Zg00OME2i+IcBiBwHCBLIhEIZALgTyIRCFQPN5AtcnF7wZQ6BCIB0CQQg03yOM0R1k7KcOm06CQTPfgwEUBge3dmxcdjAuOy4uO/61djT7XplJD8EfbigqNxyTG6OicqOjcgNRuTFRubFRuYnqfWNfPqa4m8hBgRu7ER1TbQ0gXoMRr8GK14DiNczPLDysFpjUk65k+0/Cx69caPVxPs9MQ+9T8ERfDysXGkLVh74R1rffqY840UdhfSes74X1STi/LKvvlLC+lm1/B8L6RlhfePw6FM6vE9YXHr+OhPVZVt8rYX34+vzrVRfr7Xj+9UZY3wrr43fqs5noO2F9L6xPwvosq09RrZfp1fuXSg3vEW3GbmxUbjAqN6/evFTaD+tlHLvxUbmhqNzwT/abx52Naaz33fmWp/EeCEe1I8M6KjcQlRsMOLxkFwL55RDMH2eToTtDFiaIXo7AcsQ8QfwUscsRXI645chsZhi7zxQm+oTc6tKfdZWvN0V2v8Owv5TbhysN57/HbHS74VgdttnuUmXNPYfhikPTjMip46aLNMkGrVLQ2BR1W3R1keo663r/AQ==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 46f5a992463..dc186129e8c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/global_consts/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -64,8 +64,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+2cO48jRRDH24+xZ8bn83LH+7m83zBe22sfB8dy590NyAjJfHvagAyJ9KSJSIiQiJCQiMiIIEPiC5CQIZGAxBfB/3PXulxTnvWy06zqdC2tZjxTU/Xr6pqe6sddzS3K4fyv5s+b4ojr2261kOyeP2bnK/0KdWWhGGsGGOsGGBsGGJsGGCMDjC0DjG0DjLEBxsQAY2qAsWOA8ZIBxq4BxssGGHsGGLcMMD5kgPGKAcarBhgfNsD4iAHGRw0wPmaA8XEDjE8YYHzSAONTBhifNsD4jAHGZw0wPlch4/8xF7ltwKfPG2B8wQDjiwYYXzLA+LIBxlcMML5qgPE1A4yvG2B8wwDjmwYY3zLA+LYBxncMML5rgDEzwNg3wLhjgHFggHFogHFkgHHXAOPYAOPEAOM1A4zvGWC8boDxfQOMHxhgvGGA8cMKGcHWcKulat49Az79yADjzYrbPXJh2/2WAZ9ODTDuG2A8MMB4GIDxXtln54Cuu0Wnig24eMmwgRQbNLEBEhsMsYEPG+SwAQ0bvLCBChuUtuZ/2GCDDSzYIIINGNjggA0EWKDHAjgWmLGAiwVSLEBigQ8LaFig2p7/YVEFixZYFMCkOya1MWmMSVlMemJSEZN2mBTDpBMmdTBpgkkJ1AqDagxaMSjEoAuDGgwakJQj6UVSiaQNSRGSDnzU8dHERwkv/NT7AwFx6JYfl735HzrZm65YqKH/8cfEH+vsfoUbrvuJsFul/kk2OU6U+lXIP0i8ziiI/uGE9LfC8Gdtr+cwX+rndWmxOKi5UO00HIet507WFXVzrC5kux3Gdr8m7Dm3fBf5PbKfupAxtfiHJ9we8Uj/0DvfJZl8yVMT95p5sR50L2L3qH3R/15ncjK2iIPaJkT/M8l2H8SdsxV38l4zL9bjrHHHY0vGXSOAL+bfpcBxlw0uLu6y4f0Ydw1xr5kX63HWuOM+kXHXDOCLedzNAsfd6ALjbvd+jLumuNfMi/U4a9zx2IqY3AE7/9ifh837Fvl5qO87ylWFn9tCaefupFC8NNg18iv5Oeby4l7C7jXzVTup/91kdrgu4oiEPI1pe/7YYs/Q81uK/Zawv8KtXJN+SRT5RJFHrN3w5xhL05jrVr7UV/WYC2UaRv+I9O8H0b+Tkf6DMPwztAHe4T+9vp4r9vnUBwTukzN692Kvj2Jf2iS2upDn5yiRuPaJP+L33+wZrtMxm/waxe+WK/aLrRLfnbwLCmsI3yWK7+IS3/E5lUTxHV371FXnu4bbzHcy7pLAvktd0XdJie9Sdo/Oue/o2m1Xne/+a9ylgX3XcUXfpSW+67B7dM59R9c+c9X5Tou70HNmiVLHinSfzCdeCsPel/k59xOOn4v2oD46cnruSt/4SMj/znR+4c+7QobsaEfnirk7imx/rmuar9qJK7TDdVFeELYP6187ra3usuv83dTainPKvuw3pjP35z2lbuTrsDlDf7Jp391eU58vBWc3CGeWXWF6nbDVU3zEv9mn5UQolB/KnOcrUb9Q31CtfmSryndZy6NcdfXoy76C2zrtHfuaXefPresPqW+QbfYr0/mNP6cY4eMu+Y5xrgp9ksn+necg2nyo7N+/FZyhcmAtBmNhm3gr9M9IW5PgcfEduy791BDPokzzVT+S/M9M5/dCJ69Xg/mWZChH6LkiK3+W/44U2Y64R7I/+GPIOcl1bSzHCbUwtndqwt46X9eEr+sKq5SNFFnpa5L90V28rzeJOxTK+ULF3U/CFyHWYNb5gmx1GK82JuFtzttXfhPlGEaLJd7Hy+9pS/iIy0rfkuwv/hh6bkfzX1vUM1J8weWpDytbA+b9LfksLrGZlth0rtheXUU+VTi0nLi7ga56ie3Liny3xDbn4s/y5yKFMxV2tX09saJLy50SoStW6sDjVLZxpNjkuZY25qJcWOOJBE96Dp6U8dzdoJ68X5RtmyjyscKtjRX4s/y5SJGV/SjJ/uGPFzlOKOsTN20TepbPT5zMiebV12k8WeTH91jzpW95WzthPxLyf/nf/L2j43n+M9Dj8ax/PJgdz0azO3eGRzPpexSKw04A+7PxYHK0Mzwa3x4NZoPdU+3/C6yqhxERWAAA", - "debug_symbols": "zZnbbqMwEIbfhWsuPDM+TV5ltapyIBUSIhFJVlpFefeFNkAKbCPcDvVNFEfz/fPHY2NsX5Ndtrm8vuTl/nBKVr+uSXHYrs/5oaxb11uabKq8KPLXl8efE9V8ANAbcDquy6Z9Oq+rc7LyitIkK3f1N1S1wD4vsmRl6PY7rRE7hQCgvTP1VzeCXAjkQyAOgFCFQBACmWnI6g6yPIL+0xFMHcRmBE13BGrTQmhwCJEKgSAEwhCIQiAdAk3XCW1XXHQ0gmwI5EIgHwJNjwgiaCHSHwZsOgpGYL4HIyoTHNzY0SouOxCXHYzLjlnWDrDrlNlDH/zuxi/thtuJhQrt0I3ovGoyGCWeAcQzoHgGEs8w/azmfvVmr54MJd09oh9XHXzTt9N1Zt+PPoVP9KF/k/B9qHrXB2F9/E59Y0b6JKyvhfWNsL4Vrq8T1vfC+izb/04J64OwvvD8dSRbX6eF9YXnr7PC+k5Y38vqe/X19depNtbp4frrQVgfhfXpO/WZRvpaWN8I61thfSerzwtvmT/fhfHSO2al+ucI0NANRuWGonKjl3YDrt8vm6EbE5UbG5Ub95Pj5vFkYxzrXHve7PzwDISjOpFhjshN3cVRuaH5lwmodAhkQqDJgeTJ3xmvcYTwbATUfASeIG6M4HyE5iN6PjJZGTbtawp7/wG51a0/6ypfb4rsfqm4v5TbhzvG899jNrhuPFaHbba7VFlz8djfOTZ/0HBquZmoTRkQfIpITbPpYkRdN22ds877Dw==", + "bytecode": "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", + "debug_symbols": "zZrbbqMwEIbfhWsu7LHHnsmrrFZVDqRCQiQiyUqrKO++QAOkwCrC7aS+iXA03+9fHhvjwzXZZZvL+1te7g+nZPXrmhSH7fqcH8q6dL2lyabKiyJ/f3v8O1HND/s2/nRcl03xdF5X52RFyqRJVu7qJ1A1v8+LLFmhuf1OE63UHKI1uDtTP/oJpEMgCIFMCGRDIAyBeB5ytoccjyH9n4Zg00OME2i+IcBiBwHCBLIhEIZALgTyIRCFQPN5AtcnF7wZQ6BCIB0CQQg03yOM0R1k7KcOm06CQTPfgwEUBge3dmxcdjAuOy4uO/61djT7XplJD8EfbigqNxyTG6OicqOjcgNRuTFRubFRuYnqfWNfPqa4m8hBgRu7ER1TbQ0gXoMRr8GK14DiNczPLDysFpjUk65k+0/Cx69caPVxPs9MQ+9T8ERfDysXGkLVh74R1rffqY840UdhfSes74X1STi/LKvvlLC+lm1/B8L6RlhfePw6FM6vE9YXHr+OhPVZVt8rYX34+vzrVRfr7Xj+9UZY3wrr43fqs5noO2F9L6xPwvosq09RrZfp1fuXSg3vEW3GbmxUbjAqN6/evFTaD+tlHLvxUbmhqNzwT/abx52Naaz33fmWp/EeCEe1I8M6KjcQlRsMOLxkFwL55RDMH2eToTtDFiaIXo7AcsQ8QfwUscsRXI645chsZhi7zxQm+oTc6tKfdZWvN0V2v8Owv5TbhysN57/HbHS74VgdttnuUmXNPYfhikPTjMip46aLNMkGrVLQ2BR1W3R1keo663r/AQ==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 24edd417821..8144ba2b463 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -40,8 +40,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/71ZTY7TTBCtOHESJ18m+eACrNlgO5lJYIGC+D0Be0+G7JCQuEB2LDgDEjs2SFyAA7DgBCBxFmhNV/zmuezJEDctRba7q1+/qu6qru505LJ0/M+VHtRx0bq1f6bHlaxFrLRj8GxUwurwyz8T/4ygvdui4onBpS38Vbq4n0hV5xb5zxOPGdI+ihkAPx14nOe7Ep91cWUiV50D+wx9u77fgj6uvABs7R/Sbn/mfRXYbtltqbeVrrnHuyBjp4r/xONLAOynwL1F/L2/Pwtjm2wsl2vwrlxdZ6HWgeLHYfDn6jO6GYnHZ510fPXTCOQ7NU8hDKGxRhI2tjXphvz1fUbybIM6rN4NsZKatnU7eu/ntNugN44/aeBq6cExNtDaXzAvLNoWQ536vLb1gRfqzaVL36iT8/UUxmQ55oPrXLm5mKFxqbe7Osba16dHlOWqTMq6Hj+Wql44fkzy9/z3iHRT+6//kud2WWTbebEtTouLi8WmuEX4rkRgJ4yt1vzfJNYg9szAerK7fE6lGmO1n65xXEtt7rW6ZjRP6knpqzhmDPqgPL6Ll8O6B/7p7Poa+rDvdI06tl1k8JlINdZoXuL4P6wZMxZ7n+mQHir/WErMR/59KlWf0/kdGxhP/dPZ4o1/1/lFe4aIxTqXInYsHpANBoY8r0G0QWxgBdZtpXM/lGrRNjx/IUcuVgxW3g7/LeCyHI+JdtLxLTupXGA77X1c7YQ+PjDsE5E82zimupdS2ulYH7dijmU7zh2QH+cHuAbas2ueHbIH4Pgjqdo1RL6ZEB/2f95bRmHss193Y4PP0ODzv5TrBucM+SnWHdIhzBynxYQ4YJkQJ55bLlaMUd6u33vAZTkeE/1kTLLsC1bMsfJq5F7nu6gD57vWeQ334LZzu2I5X23yxWZ5fjov5mfX5nZtj785PTvfLE6L9FXmPvOb5JZB79Wyy3sOnl+R9vYUK+/iuBvmzuDwuKvjj6S6PkPE3ev85d/k9Hnq4qj6N9rDyp+ZR484hslJ8lRjnJ7/kJO29aANc7Fv/t3Kv/mOI9Ddzn5vU3thToVjKrdIqv6IZ8GY6t6BvpxT8brnOs6prPPNpMF2dedgy9cP8UXkxHHJlbV/pseVzNK37o7pGB2azvLWvdCx48TGOGFjSJYGPpNsFT9MLpynYfPCbMu5s0h7e7d1x413Gh9AJ8z/8E4DY1Af2lH+k5SYH/27FVP5HGbd4U6lGt84Xuh31IAjUtW9Lk5ZMQzzrSnpy/zc7z/C5TXPsVz3pr4036PEJP/ZP916/1mDifOHvIY1mF8A8w1hnkhZmvYIrZ8a8icgo3ymxAH7WtzxLGP15TVyAvyasLBNv8cGjnXOYV2wH+ZFdesDYwrbUcc9dC5V/qt/WnNpzU3TXM4M+WmD/jjPM+qH3HFNcV3b8xUf0C+S6noaEU63Zjz8Rn0x7vD5NjKwMB7ruujvSrkW98xc5zzelZxVv96u5N0H3q4MoU3llGsShuv+/6CRx8f/gxLgo7pEJM/vMdX9kJI36ohzjnrz/29jaFP5LtQpR/WbPrSNdzfDGhLW4Ags5TUz5Ad/ycvC6hNWYmBhndrX+cN3xZP271zy1ersfn6eLpYXm+3FYn7dnctvJ2qXD/kmAAA=", - "debug_symbols": "tdnbjuIwDAbgd+k1F47tJA6vslqNmJnOCAkB4rDSCvHu2yKWVqRBk1/qDaLgD5fGiQu5NJ/t+/n7bb392h2b5a9Ls9l9rE7r3bY7ulwXzfthvdmsv9/GLzfUP4jc4o/71bY/PJ5Wh1OzVLdo2u1ns4y+01/rTdssPV1/LxrRynhfGR8q42NlvFXGp7p4pcr4yc+X5NJdSGJ6GJd64wkwDjAMGAGMAsYDJgAmAsYAA9RBKIyP0sNoeDbT85Gc3o1SlGcTgTwGmFRvIgHGAQa41rEwF8w/rjXxs1HAeMAEwETAGGBSvTECjAMMAwaoAwPqwIA6MKAODKgDA+rApnsveR7WqmeTCDAOMAwYAYwCxgMmAGb63ovYlXtJMsCkeuOIEOQQxAgSBGl983bkERQA5CaRV/nfI72Oe6RdF1lwHG54YpI4Dr5liLNnsNkzpLkzMM2ewc2egWfPILNn0Nkz+NkzzD6nefY5zbPPaa6d0z0SQpBDECNIEKQI8ggKAJr+d8Z1VR7uqn+eDa86jDHGBGNaYGYDS5Yxj7GAsTjNxA1MOGeGsQQxXzpJjQPT9MxCobg0+gdT44w5jDHGCsXlgzyYjy5jheLyPr5k4JUsDbcNJymWswSxSBhzGGOMCcYUY4VFQUbFJYkyFjAWMWY/Yfl3SxCzUpVEHeYbacZKVRLiS8YYE4wVqkRltJbk3dQ8xgLGIsYKVaI8uiSadVNLEEuEMfcD5rPvlko9gIc7BQ3ZqpykxOglU4x5qFGlgLFYz67d0Z/VYb1637T3DdOv8/ZjtH96+rtvn7ZS94fdR/t5PrT9puqwn9oPJBMt2Fl/On05KC809ge397rfEcyuy9nl/Qc=", + "bytecode": "H4sIAAAAAAAA/71ZTW7TQBR+ceIkTmgTygVYs8FO0iZlgYLaAtdI00aVOAKbXACJHRskLsABWHACkDgTjDov/vL52U0aDyNFY8+8+eb9zxunIfet4X+utWCMm47NfZ8e1rIasdKGwWelENaCP75PfB/BfLNGwRODl7rwZ+nkPJGizDXyP048Zkj9KGYA/LTjcd6tc3yWxbUj2Q4OXNP18/p8Amtcew/Yuj6k3v7ZfRZYb9kzKdeV+tzFOsjeqeJfenwJgH0FvNeIv4n3t2F0k/Xl3gdfyLafhfIDxY/D4I81ZvQwEo/PMun+GqcR0DdKeiEMob16Eja3VcmG/OvzkOhZB2VYrT2xkpK5eT1yb2zarJAb9z+q4NWSg3NsIN+fMF/YdC6GMY15nWsDXyg3tya9o0wu1lPYk+mYH/Rz5c3lDM1LrfX2HnM/nh7QprO8KGt6/FiKcuH+MdG/9O89kk31P38kn6vpIluNF6vF6eLmZrJcnBC+axHoCXOrZf99cg1iDw2sy/V9P5BijtV16uPoS3WeteozWie1JI9V3DMGeZAen8XT4dgr3zu93sIajp2mMca6iwx+jqSYa7Qucfy/LtkzFvucaZAcSn8hOeYb/zyQYsypffsGxpXvnS7u/LPaF/UZIherLUXsXNwhHXQMevZB1EFsYAWWbaa270qx6Rzev5BHblYOVr4d/gfAZTreE/Wk+1t64vOvY+CqDrswXp8OR9muNZPu35OgNt3UTF3ih32Y82MSRj+b/Ngz+OkY/DyVPIbQZsifYj0nGcLYOD3nWMB2RDyxbblZcaJ8u/4j4DId74lx0iNajgWMG11n1Yacx6wzBmXgms26c+A5Und9spiOZ8vRZDm9Ph0vxmcP1id17788PbteTk4X6W3mXkf71EdBvw1l93d1tq9IfbWPVTtw3g1z79097+r+PSn6Z4i8+1C8/J+6dJS6PKrxjfqwakDmo0U8hjmrRqnmOL3DcF3qWgvmsJ74AXQso+q77D5i+esu/uQa2w/vI3Pfp4e1bChFXy276x8iQ9WdyrqfH7pPbOwTNg6yNHANvQpcX6Zh67Nswz/WD7VgZ/n5gN/q8G75CWRyv75/x7sl5qs2zCP9F8kxP/tn624Z05z1LW0gxTOT84W+RxU4IkXZy/KUlcOwZhiQvMyf+z0hXPb5iOg1v7al+j4bE/1X3zt//12CifZDvrolmN8A844wjyVvTdnWkxhyDQz6Y6BRfgbEA661eMd63FrLPnIM/FVh4Zy+9w0cq1ZnWXAdnu1l/oE5hfWo++5qS6X/7nvLlpZtqmw5NOgHFfKjnYe0DnlHn+Kxuu0V77AukqI/9QinWbIfvqO8mHf4jhYZWJiP1S/a65yuxjNzpDaP1znPKl9rnfPdBr5d68Kc0imvSRheN9/lex4fv8snwI/KEhE9P8c09ktyvlFGtDnKzf+D9GFO6Zswpjxq3LRhrr/eD6tLWJ0DsJSvoUHfeSRfFlabsBIDC8dUvy4efiqe1P/dYDSbnZ2PrtPJ9Ga5upmMH/pu8BcBz6lNgSQAAA==", + "debug_symbols": "tdndquIwEAfwd+l1L5LMTCbxVZbl4NF6KIiKHwuL+O7bimt7TCOnf8iNGJ2f08aZpJBrtW4+L18f7W6zP1WLX9dqu18tz+1+142ut7r6PLbbbfv1Mf64Mv0L0T3+dFju+uHpvDyeqwXbump262qh0ulNu22qhZjb77oinhkvM+P9zHidGR9mxsd58Wxmxk/+PkUbH4KiM09jY2/EAMYCxk0bNk/D/tUQYBgwAhgPGAVMAEycbzzw//jpfjSWH4aN0qsB5sADc+CBOVADGAsYYK410wtBnnNt3KthwAhgPGAUMAEwcb4JBjB2uhfEDb2QGAcYAgwDRgDjAaOACYCZ3nuNs/m1KhrAWMA4wBBgGDACGD9/X4gKmDDfWDOJhOn/4is8XnzDrU6CdXjS0Ug6Dr5niKUzWFM8gy2ewRXPQMUzcPEMUjyDL55Bi2co3tO2eE+74j3tJqu1a0TvH6p/nzLBmMeYYixkWAgDiyFhEWJkMGanGdmBkUuZwxhBjHMXyTowjgnLFBerPBkHlzDBmMdYprjE05OJ2oRliktE3zHBZlJyf3cYLpJCyghjjDHBmMeYYixgLLMo0Ki4KJpX5g3GLMbcT1hyb54wlqsS5aHfDCcsVyVe3zKPMcVYpkqYRmvJ9633ziLE1GDMYixTJexGU8LJbqqEMcaY/IBJem+5PcANTwrsk1VZNcfMWxYwFqGNKhiM2fns1o3+LI/t8nPbPE54NpfdanTgc/57aF7Ofg7H/apZX45Nfwo0HAD16W3g2hnXX05/E+xq1vsTdDdwhrrvpMvZ5f0H", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_0.snap index f174a21874e..c8f82bcdaaa 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_0.snap @@ -26,10 +26,6 @@ expression: artifact "error_kind": "string", "string": "attempt to subtract with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -40,8 +36,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/71YzY7TMBCepnHTtOw2XV4A8QRO/7kVaTlxQeIFyLb0xAUOnHsACQmJZ6YBT/J1MskWaq+llRN7/M03v862R39Hz/2VI4Y1OXht62Z73cg9YtmewrPTCO3ALzenbo5gv+/R8FTh4gt/YxerlJo2e+Q/Tx1mSP8wZgB8mzic+2ONL20pxw2dFweeGbp9fr6FM+V4A9h8PqTfTnFfBvZb/pzafTV2fvgkbA3CJbeW8Q3gkz9bLceeGyIpcRyEsM3Ocq1H9cUa6h8Jrr7j3hP6mI/0TyT8k4Txj52eMDI6ry2Zaxgb5GEEx2EgjtwH+scmJ96LYY95lPMX9zxRbIwF/1A9sif8FVMdc9TJ3CJq1iM/k3vGtZdg73eBJ/NernGeZdTMe5bTeresXxPEd5fXL+sfkZ7LWy986vo1il+76jdQf6tyK1H4aHGewh7GTKvxF27u6t+XxEfzB/pvSz58YXMth42wwXi0YeDfBptRe2zYhsSDDRk1+/mgxT7f/TDsfZFX+GkY/gfGHwXBn1X8x4BP5P9/gmdh/F/5h+9mb9zhW/U2TGxzrjH8Luc6KOfXsM66y2Go7rt4dgj7KP8WMO/ds/aNkog9xDZiD+td9mp+jxScvpCNxLv2zXSj7PG5cQsnIzBlf5E1Gwn5iXsfkO5rPmuE/Ds3l7H40YKJ8UNeoxbM94D5U2BmVI+uu5jXp4p8BjLMZyI44FmN+wRwtbMyRzLg14Ul7z4ZZ8bpusu0/MC7qC0/sGdJP7LeS2PJ8h/crMVSi01XLO8U+Sm1249xvhPnkDvmlFzzHa/kgnMRNfPpRuDELfpkz9FqGX8DautX2I+59uPjudzWrdsrxnpT/yjK/4MaYQMJ/UbIf3bv+M3Ac3wFz8O6yA/z4lAsi/1+sSvuBD7ReV9mPw2O/v10GjPWaxx+n2o/sW9Qf/W737HpQ+aahuFaxXTk8DGmKfBhWyIhL5+NWPtGNW+0EXMY7Y6E/Bj2WL4Pa8yxuhdhb3z8N6yhwEquwGJemSKf/CcvDWsgsFIFC9fYv2Xf+Mp45L8mi/V8s5stduuH5byYrx6tSd/6Z5vN6tXswS7W+91hv5g/tf7dcvWwWywL+zH/Q+cx/b8BMVMiqT0bAAA=", - "debug_symbols": "1drdiuowEAfwd8l1LzLJTD58lcNhqVqXQqlS9cBBfPdNxbXddOnNkuzkRoyO//7EOok1N7Fvttf3t7Y/HM9i8+cmuuOuvrTHPoxu90psh7br2ve3+cNCjjdAj/rzqe7H4flSDxexQahE0+/FxlJ49aHtGrEhea8Whdo7epailOpVDP6bYkItn8WEaKZi902x9eA/EV7befHfSoApk23LZLsy2b5ItpJlsqFMtiqTrctkY5nsMmdJVeYsqcqcJVWyWXIM9wnDtUwZDinDVcpwnTIcU4ZTyvCfdRWUpF7hdhFuU4a7lOE+YTjKlOGQMlylDNcpw/GH4QqmcL0+DQEoY57V4/14bkFiZDGMLJaRxWW1ODdZvIstno+FJCMLMLKonBYNk0WrhUUzsiAfi8nadzXayYI+tmTtL2jpZUGnYovnY7GSkSVrfyGjXxayEFuy9hciu2Zh9D2yWdcv2k2fkXYLi2VkcYwsno/FSUYWYGRRjCx51y+zOUB7GVuQkYUYWczvWRbni2Vkydt3LU7rF4mxJW/fNXbF4iUjCzCyZO27qGfr3a9/kIwWzciCjCzEyJK176KanbsYXyPzlpHFMbL4X7NQfL6AzPuDWk0XVdHAAgN5MXIVozhh8vbe1eseIJEThrhg7mH0rx7aets1z72Yh2u/m23NvPw/NdEuzdNw3DX769CM+zVnWzXDmwpHqMJlysebHIfSVWG5MA4fz2oTnnXhqOHIHw==", + "bytecode": "H4sIAAAAAAAA/7VY247TQAx1rm3a7TYtP8AnTHpfiYdKgITED/CabakED3wBSJH4cRoYN6eOk5bdmZFWk4ztM8f22JltQP9GYP/qEcOaHLy2t7N53SgcYplA4dnrhGbw286ZnUOQRw4dzxQurvB3ZrXJqO2zQ/7LzGL6jA9jesA3A4vzoWrwpS/1mNB1caDN0Mr5+RFs6vERsNneZ9zOeV97jlvxhrpjNbZxOApfvXApjGH8BPDJna+Gc88NkZQ8pj58M4tC61GRWMP9R4Kr67wHYj/mI+MTivgM/MTHzM4YOV3XljxrmBvkkQiOQ08cuQ9EVZsTy2KQMY96/g56sv/IM+in1u8/g7w2Ij0feyd8mjMYCT63zmDiJz6mryYChc8MZBhH5MdYb+08obbPQcdM1M6PFg+M1Z5cxMIUueJXLHyIHfqQuPfB5NTuoYnwIXXgQ07t/pR0+Oe4hozfvlwYvz3VnBg/84K/uPAfAT6R+3vt2E/8L/F5oGY4wYb71sRPbguuMbxbch3UtfIE6yhLqOm7aDsAOeq/B8x39nlK7W9XKmSIHQuZvHeR8h724JCQoZ8SZ6LI2G4MnBJlH7Z7FLiyZkOhP7XvKemxZttE6H+ycy3/1YGJ+UNeWQfmZ8CsBGZOzej7FvP6TNHPQYf5TAUHtNW4TwFXs5VnJAd+fVgo4/dEwdG+ZdIX7d7Rdz6wZ8k48r735pL1v9hZy6WWm75czhX9GXX7j3meCzvkjmdKrrnOV3qHXUjt8/QgcLrul/iO/mIsub/f2485t3HV6Ln6Lmx3zQ97/H8UnzE5YpCj/jf7Lr/pXB/7F/I8bcvitCxP5bo8HleHci7wia77MscprdzH6TwWvG9i8SNq4sSxwf0vv11V7Rgy18wP10tORxYfc5oBH/YlFPryORFrP6nhjT5ibaDfodAfg4z1I1hjjpfvIsjG1f9hDQXW4BVYzCtX9Acv5KVhpQIrU7BwjeNb940fjEfua3Kx222eFs9mtT0eTsfV8lZNut7/sN48H1br0nwt/tK5tf8fOD70I4EZAAA=", + "debug_symbols": "1drdboIwFADgd+k1Fz0//fNVlmVBxYWEoEFdshjffWCcsLpws9Cd3hgrx8NHoKel6UVtq/X5/a1ud/ujWr1cVLPflKd63/aty7VQ665umvr9bfqz0sMHmFv88VC2Q/N4KruTWjEUqmq3auVM/+9d3VRqZfS1eAqk4M09lLXGRzCEX4INk74HG2Y7Bvtfgl2A8I0I5KbBr4UCmyfb5cn2ebJDlmzUebIhTzbmyaY82ZwnO89REvMcJTHPURL/NkqyNvhgux/sIXlYMDnpJZPDkslxyeS0ZHJeMrlZMrn9Y3KEMTnNd08AtPYePXyP+xw5QRYvyBLkWFgntXg/WoKPLSDIgoIsJMjCKS0Eo4XwyWIEWawci0lad4ndaOEQWWzS+sLOPCzsMbaAIAsKsiStL8bSw2IcxJak9cUYN2eR1I+Szl/Ij/eI/JMlyLE4LcgCgiwoyEKCLCzIknb+MhkDKOjYYgVZnCCL/z/L0/MS5Fh82rrreJy/aI4taeuudXMWFGQhQZakdZdpMt/9uXA8WIwgixVkcYIsSesu4+TZ5XiNzAc5lqAFWeDfLCZ+XkLa92kc11TZxu+NgdJa9JyFBVnS1t3ZNY9gBVmcFMu1b32UXV2um+q+O213bjeTzWqnz0MV7Vs7dPtNtT131bCDbbJ5rb8o0LYA5P4aQd+augBthubtKJr+qOvP2p/5Cw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index f174a21874e..c8f82bcdaaa 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hash_to_field/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -26,10 +26,6 @@ expression: artifact "error_kind": "string", "string": "attempt to subtract with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -40,8 +36,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/71YzY7TMBCepnHTtOw2XV4A8QRO/7kVaTlxQeIFyLb0xAUOnHsACQmJZ6YBT/J1MskWaq+llRN7/M03v862R39Hz/2VI4Y1OXht62Z73cg9YtmewrPTCO3ALzenbo5gv+/R8FTh4gt/YxerlJo2e+Q/Tx1mSP8wZgB8mzic+2ONL20pxw2dFweeGbp9fr6FM+V4A9h8PqTfTnFfBvZb/pzafTV2fvgkbA3CJbeW8Q3gkz9bLceeGyIpcRyEsM3Ocq1H9cUa6h8Jrr7j3hP6mI/0TyT8k4Txj52eMDI6ry2Zaxgb5GEEx2EgjtwH+scmJ96LYY95lPMX9zxRbIwF/1A9sif8FVMdc9TJ3CJq1iM/k3vGtZdg73eBJ/NernGeZdTMe5bTeresXxPEd5fXL+sfkZ7LWy986vo1il+76jdQf6tyK1H4aHGewh7GTKvxF27u6t+XxEfzB/pvSz58YXMth42wwXi0YeDfBptRe2zYhsSDDRk1+/mgxT7f/TDsfZFX+GkY/gfGHwXBn1X8x4BP5P9/gmdh/F/5h+9mb9zhW/U2TGxzrjH8Luc6KOfXsM66y2Go7rt4dgj7KP8WMO/ds/aNkog9xDZiD+td9mp+jxScvpCNxLv2zXSj7PG5cQsnIzBlf5E1Gwn5iXsfkO5rPmuE/Ds3l7H40YKJ8UNeoxbM94D5U2BmVI+uu5jXp4p8BjLMZyI44FmN+wRwtbMyRzLg14Ul7z4ZZ8bpusu0/MC7qC0/sGdJP7LeS2PJ8h/crMVSi01XLO8U+Sm1249xvhPnkDvmlFzzHa/kgnMRNfPpRuDELfpkz9FqGX8DautX2I+59uPjudzWrdsrxnpT/yjK/4MaYQMJ/UbIf3bv+M3Ac3wFz8O6yA/z4lAsi/1+sSvuBD7ReV9mPw2O/v10GjPWaxx+n2o/sW9Qf/W737HpQ+aahuFaxXTk8DGmKfBhWyIhL5+NWPtGNW+0EXMY7Y6E/Bj2WL4Pa8yxuhdhb3z8N6yhwEquwGJemSKf/CcvDWsgsFIFC9fYv2Xf+Mp45L8mi/V8s5stduuH5byYrx6tSd/6Z5vN6tXswS7W+91hv5g/tf7dcvWwWywL+zH/Q+cx/b8BMVMiqT0bAAA=", - "debug_symbols": "1drdiuowEAfwd8l1LzLJTD58lcNhqVqXQqlS9cBBfPdNxbXddOnNkuzkRoyO//7EOok1N7Fvttf3t7Y/HM9i8+cmuuOuvrTHPoxu90psh7br2ve3+cNCjjdAj/rzqe7H4flSDxexQahE0+/FxlJ49aHtGrEhea8Whdo7epailOpVDP6bYkItn8WEaKZi902x9eA/EV7befHfSoApk23LZLsy2b5ItpJlsqFMtiqTrctkY5nsMmdJVeYsqcqcJVWyWXIM9wnDtUwZDinDVcpwnTIcU4ZTyvCfdRWUpF7hdhFuU4a7lOE+YTjKlOGQMlylDNcpw/GH4QqmcL0+DQEoY57V4/14bkFiZDGMLJaRxWW1ODdZvIstno+FJCMLMLKonBYNk0WrhUUzsiAfi8nadzXayYI+tmTtL2jpZUGnYovnY7GSkSVrfyGjXxayEFuy9hciu2Zh9D2yWdcv2k2fkXYLi2VkcYwsno/FSUYWYGRRjCx51y+zOUB7GVuQkYUYWczvWRbni2Vkydt3LU7rF4mxJW/fNXbF4iUjCzCyZO27qGfr3a9/kIwWzciCjCzEyJK176KanbsYXyPzlpHFMbL4X7NQfL6AzPuDWk0XVdHAAgN5MXIVozhh8vbe1eseIJEThrhg7mH0rx7aets1z72Yh2u/m23NvPw/NdEuzdNw3DX769CM+zVnWzXDmwpHqMJlysebHIfSVWG5MA4fz2oTnnXhqOHIHw==", + "bytecode": "H4sIAAAAAAAA/7VY247TQAx1rm3a7TYtP8AnTHpfiYdKgITED/CabakED3wBSJH4cRoYN6eOk5bdmZFWk4ztM8f22JltQP9GYP/qEcOaHLy2t7N53SgcYplA4dnrhGbw286ZnUOQRw4dzxQurvB3ZrXJqO2zQ/7LzGL6jA9jesA3A4vzoWrwpS/1mNB1caDN0Mr5+RFs6vERsNneZ9zOeV97jlvxhrpjNbZxOApfvXApjGH8BPDJna+Gc88NkZQ8pj58M4tC61GRWMP9R4Kr67wHYj/mI+MTivgM/MTHzM4YOV3XljxrmBvkkQiOQ08cuQ9EVZsTy2KQMY96/g56sv/IM+in1u8/g7w2Ij0feyd8mjMYCT63zmDiJz6mryYChc8MZBhH5MdYb+08obbPQcdM1M6PFg+M1Z5cxMIUueJXLHyIHfqQuPfB5NTuoYnwIXXgQ07t/pR0+Oe4hozfvlwYvz3VnBg/84K/uPAfAT6R+3vt2E/8L/F5oGY4wYb71sRPbguuMbxbch3UtfIE6yhLqOm7aDsAOeq/B8x39nlK7W9XKmSIHQuZvHeR8h724JCQoZ8SZ6LI2G4MnBJlH7Z7FLiyZkOhP7XvKemxZttE6H+ycy3/1YGJ+UNeWQfmZ8CsBGZOzej7FvP6TNHPQYf5TAUHtNW4TwFXs5VnJAd+fVgo4/dEwdG+ZdIX7d7Rdz6wZ8k48r735pL1v9hZy6WWm75czhX9GXX7j3meCzvkjmdKrrnOV3qHXUjt8/QgcLrul/iO/mIsub/f2485t3HV6Ln6Lmx3zQ97/H8UnzE5YpCj/jf7Lr/pXB/7F/I8bcvitCxP5bo8HleHci7wia77MscprdzH6TwWvG9i8SNq4sSxwf0vv11V7Rgy18wP10tORxYfc5oBH/YlFPryORFrP6nhjT5ibaDfodAfg4z1I1hjjpfvIsjG1f9hDQXW4BVYzCtX9Acv5KVhpQIrU7BwjeNb940fjEfua3Kx222eFs9mtT0eTsfV8lZNut7/sN48H1br0nwt/tK5tf8fOD70I4EZAAA=", + "debug_symbols": "1drdboIwFADgd+k1Fz0//fNVlmVBxYWEoEFdshjffWCcsLpws9Cd3hgrx8NHoKel6UVtq/X5/a1ud/ujWr1cVLPflKd63/aty7VQ665umvr9bfqz0sMHmFv88VC2Q/N4KruTWjEUqmq3auVM/+9d3VRqZfS1eAqk4M09lLXGRzCEX4INk74HG2Y7Bvtfgl2A8I0I5KbBr4UCmyfb5cn2ebJDlmzUebIhTzbmyaY82ZwnO89REvMcJTHPURL/NkqyNvhgux/sIXlYMDnpJZPDkslxyeS0ZHJeMrlZMrn9Y3KEMTnNd08AtPYePXyP+xw5QRYvyBLkWFgntXg/WoKPLSDIgoIsJMjCKS0Eo4XwyWIEWawci0lad4ndaOEQWWzS+sLOPCzsMbaAIAsKsiStL8bSw2IcxJak9cUYN2eR1I+Szl/Ij/eI/JMlyLE4LcgCgiwoyEKCLCzIknb+MhkDKOjYYgVZnCCL/z/L0/MS5Fh82rrreJy/aI4taeuudXMWFGQhQZakdZdpMt/9uXA8WIwgixVkcYIsSesu4+TZ5XiNzAc5lqAFWeDfLCZ+XkLa92kc11TZxu+NgdJa9JyFBVnS1t3ZNY9gBVmcFMu1b32UXV2um+q+O213bjeTzWqnz0MV7Vs7dPtNtT131bCDbbJ5rb8o0LYA5P4aQd+augBthubtKJr+qOvP2p/5Cw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index a4ad8f5d349..ec03912903c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -243,8 +243,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+29C5hkSXUeeG/Wo+vR1ZVdPXTznh5YG++uLWVmZb1svNRC9yAeM4AAmeE1qicwMwwzzGgYBma4vMHIRpZtrS1ptbK0YGxLYLxgrbQr8xmt9VkCgfeTrLURoOUTrPCnlQTYYvEaeXdu1z15//zz3Lg3Kk9kZlXf+Lq/ysw495wTJ06cOHHiRNw4OiqLj/6Ps8/T2d8Y/p6N+ovUbWd/W8OVtiGuVige4xPAY+ME8Dh1AnicPgE8zpwAHmdPAI9nTgCPcyeAx/kTwOPCCeBxMQCP1wpO4inT6WSRGuPU2KXGJB2s6WBIlS3tzFRYi1FxkYZffOrR3/nsewPqDY19e57oWuLfbG2tzSvtM+R/dR7kHgD/3jzgDIC/dSbD8/4kx89tET2Io1D9tLkVuJ17S9S2CNoitKfD0N6PiV5E7YyI/kIUVKfaMdETflg+8nlJYJKcn5jqppPBdkjdTNLfjrSk9ugSwLFuNQDuKfD5ddnnsPp4ZDcC9kHrgqPN8tuZJOoVkdsU/CZyFTnPITzVzUPddNJPZyH7Pg10EJfwMUPwN2Xfl7O/s/CMPN9U6M8S/T6+ld9YLvMK/LwCn859j88+p3OezAXPSnJ8hn26LvivhMHfFfxXw+BfFfw3A/7IDn9L8D87DP89/N8H+KcD4H9Ohj+EbJ4LvBvi7/lZzwsj+x7+59vLpof7ljC8dwT/rfa893C/wB53b7y+MIxcer7zi+x57+H+fnvcPTv8YnvcG4L7JWFkvin4X2rP+67g/gF73HuC+6/Y494X3C8zx90+FNy3JXl/2gWFOz27/vIw+Hv25RXmsunsCO5XhuG9pzOvCoP/QPC/Ogj+1d68dHsY/D35/2AQ/N0e/zsZfjvd6fbs2G4Y3rcE/5497z2579vj7un8QRi59HT+MAj+tZ69fE0Q/Os9nXxtGPw9e/m6MPh7PtkdYfD31oB3hsHf88vuCoO/55u9Pgz+nn92dxj8Pbv2hjD4e3btnjD4ez7gvWHw9+zbG8Pg7/mC94XB37Of94fB37OfPxQE/0bP33wgDP6e/XxTGPw9+/lgGPw9+/nmDH8UAPdDYXjv2ea3hMHfs81vtZdND/fDYXjv2c1HwuDv2c232cumhzsJw3vPZr7dnvce7nfY4+7Zynea497sjdV3mePe6eniu+1x99Ym77HH3dPD99rj7s2r71NwtzdXO52N1a2N1tbmfqvd3d/rbHY6+7vd1l5rZ69zsNVtbx12O93Vvf293c3u5k77sHW4s7d1uHkN+bXkinRv8GMZPhk/Uzmp3v5mDL9JLHw50vf6ENd0Ca5bCBc+L88G3mdek33UmWiwSN0s0G5Q3RniSz5zmaLv2Ka0Hz4JeBkOP1fpI9nrsuijK4Treu6jJM7xMhx+rtJHsv9g0UfPIlxaH8kzMyW4XkK48Hl5dp6+G/f3OvcpFq1Pub/niC+smy+QDRdNF6S9Kf6faOR4GU5K4HyI1aVoUNciai/3P/Poai/mk2xP5XgZ7jS2d346x8tw3N44THs7Wv6VxoerTTG06e2nsE3/6hS26edmTl+bLp0pbxPmG00n9u3aeNT3FXqS6zUT6fZkGuoR/hPZ9wXiX2zP9jH5PNx41ENf3TncWdvZ3+/u7awQ/rQ0QE7ou49zPj7O3PnhbIJ26QLbepzzNVsvc/5ygSzSMk/tMJZTKyY+JTeQaQpvjWjQl5HPUQaHv/1K9jdt6y/M5c8gzgho4m+iO81oUK4Cp/nZccHfKNJ9aaaj9YM2jw9Lx+Xzav2BPrXk1rG8P5f9TUX9S5m8A691Nti/xaL5t9x388QX1i2QXLBuEeo4dxRL2RrplyuMbdfaQuqK1mzYfuxPlJfEKGYI/ovA56szQUl/sty2s++t4coOyx6LJvtpqjurtEvqlkguUVS9z+ZBFhIgq2KPsV8WqQ71UvjmMfV1oPtP5vufn1Zoz0e6Pmxn31tDldV2FXuD9BeioOO/zTZL+GH58Jp3XuG1SXVp4dySeYXOvEJHw3WfIa43GeK60xDXA4a4HjTEZdnGOwxx3WaI6xFDXG8xxPUaQ1z3GuJ6yBCXpX4lhrgs9eu1hrgsZW9pJyzl9XpDXPcb4ppUeVnar+tB9pNqJ+4yxGUpe0vfxFJeljpxtyEuyznNUl6Wvq+lb/JGQ1yTKvt7DHFZtvFhQ1xyVkTwyfpQ1uYY75mjOoE9iI/+zhP+ODJdj3e1eElGukd7MRDtmOiJrPE3pK/Fb4TvBaVumP2B/bVuu3u4tba7f7h6sL9xGBN+4ZV/w75N/59V4LW4gsh6KYysW9r9CGdBrmmZhrpFqpuBut5Z/ii/H2GecFrzX0X+SL+pwN+S5HA+fdlU6HA/D4Nr7pi4VqL+MYB2Yl7h8yTHzWOFTllOwSfnc7wMJ0XLB+LYOMcekTf5XnWvQ+DfGOd8PiNr8DzRH3efFcU8sV0WfYZ7lT6xceyLOarDPpsn3gSX1q9puTk5+jtD8G+DPntm1uCiveFAe57OPqwqb+HNd29Y2//lPUyU97IiC85hDLPPkO8Nu/aukLdGNKj/8jmKBve2/jroAu8N4779lPIbzwXTCj9aDkBc8Ffo8G9MR+sH117Qcelo+4yu/sD9b7aXAv93Qd6/NNfP+5TyfNrWn4j7aQudGaCNzz6LaAv8Bxs5zp/KcGq5nyJfLSfClbub/t/OvreGKkdnmrmvDfHva/YnprZxPqgN7c5aFX1E+gtRUBvTZp0Wflg+rr1Debap1LGOTEqcwjJ+YhVv0nR+UuT1Q4a4LGMxlnthlrEYy31uyzj+pMZZLXXCMgZpuUdnaXMmdf/Kcn90UuO/rzbE9UpDXPW+7fjkZblvez3MaZb7tnyvlficReszzvUU+JmMSNj4R2eD41RCA2nPB6IdEz2RN/6G9F3+/oJSN8x+xc7uYXt1p7O1drhz2N3b3PfVDYFfUOC1tYzIOszeUKer7VcsgFzTMg1181Q3A3XCo7ZfsRCI/yryR/ra2MR7UIcZ5ziGfXHJHgOu6WVshx3r/vFq3kfQZGkRr8b4qU+82jd+yjb2fCOny7ncsUJb+gdtlOGeXOVcbvltIRqUd4h4zBTxw/LheIy2D8CxzLRwLrd2Tlzb29Vw3WeI602GuO40xPWAIa4HDXFZtvEOQ1y3GeJ6xBDXWwxxvcYQ172GuB4yxGWpX4khLkv9eq0hLkvZW9oJS3m93hDX/Ya4JlVelvbrepD9pNqJuwxxWcre0jexlJelTtxtiMtyTrOUl6Xva+mbvNEQ16TK/h5DXJZtfNgQF+dyy/pQy+WeoTqB/esUG50mfNvZ99ZQJc/l1nKGhHagc92Vc7n5ThEtF0vL25gegteiXG7tzLcW6xR4Lc8jVuDDxqH1XG6MJ6VlGurOUN0M1AmPWmw0TB7PaquK/JF+U4G/JcnhfPqyqdDhfh4G18wxcUmcVcvRk3uaGP84Y62cpziv8B36HhTMG65yD0pMzwnemPBzrHhKoYn5hXX+7/WX//sPIBZf5/8Wt8cq//cTIO+rozkvsantNUvR7B73Hdo9lvciyQXr8AxVaJs4r9A5bTLUdFaKJkORhe/9Wg2lHa5c8Ji+F42JopyLz8CY+D4aE4HmH+/+5L22BaVdrv48zpx23D1ZztvAPhO+uQ/+D2VPdl5pQ/p/O/veGqp01fc+2+Hf2NTWqYb4N6qsUyftDEGg8eQ8Q6D5DL5nCFgHh8khaRjhSotlTrxlnt7rDHHV94/54bLMA7XMt7SSvWZTh+HrMLHDVd/XNr7xmBjimtSc+PruNz9crzfEVZ8hqGUf0ubwHlmcfeZz1HE0uH8msM/IKsLGIzqbVe4+DrT22IyJnsgaf0P6Wtxd+F4oqNs+Jq+dg0cXZp29w85h67B7uL4RE37hlX+rsibQ1jEi61D599oeGa7v0zINdbx/NgN1wqO2RzYfiP8q8kf6TQX+liSH8+nLZqSPAytcM8fEJXtk6ENLXf2OjkHZXA/v6Lg1a0j9jg53e3jdedx3dNwG8pZ7WJYLaKRlPhrsz3Hs802DjNgeufb5bnfol29eUazwo733SWSfjo+9KZ0m3mGDz/IdNgL/J1M5zsPsc5X7zWSMFukJ0xP4O0Buz1sopsd6Mm47xHpS1Q7dMyI9cfmtYcZYxzu3a1Lf2TGn8Kr5TQdJDsd1Pr5OWu43xPWgIa7bDHHdZYjLUl4PGeK6zxDXHYa4LPvxDYa4LOX1JkNcdxriesAQl+XYtmzjpOrqPYa4LOX1sCEuS3k9YojLUl6WdsJyDFmObUudODTEdT2MocQQl8S5y9Zsn6I1m6wvqq7ZBP5zsGb7NMXH4yinMaq4lnZmg+Mkc8RXBLxi0eJhApfiuHUhx8twUpYjXRaIT+SM6z3EwXEOgf8NWM/9d3DXM/dpI9L7tErsFfmoEkdH2XJ+IfbJPNVpcbblqLi/wsbmW7uc74dFy9/knFB8R8Ic1Z2DOpQJF03/MM7/4xX0T8vF4vdwSt23aPwGuh9rvcr9WIH2XNZjohdFepxggeSH/AjfC0rdMPtbm5v7h4cH+2vttb3Vzm57Kyb8wiv/xuNSezeDFnMQWYd5H0ZnVdvf4nd2TEMd3501A3XCYyp73t8KdL/XahX5I/2mAs/3Y1Xty6ZCB22FDy7X/Vg8VyCuhtIO9ivwWc2vwFhllTlIi5e55iBtztJi6to8MxeV08Zxw31pPV+eIV61vO/AexXeufPsW7Hdxjocpzxfog3CdnPR5kSRRcqzzxk7LeZdVeflWdz/SEnXe7t5nejQad7bvZQ1OG3radjbPWNIx2WHXT59mHyVXBfERqEuIM05aA/bNJxfZ+i3P+PQBd81/ZTCj8tvPm4faf0wqn3+KnutgdZ3A+9qQ13QzvM1osE5DP3sGfpt1aELo9iT35jWafruye9P5zj/YvbZ931k7Neg/eE5gueBtAS2CzvauT8prjsAXL6LFgdgm45xAGw3F23uFlmk8vv7HnEAtMnSJp7Tngu6++8XcnjkU/iKiY74TFpf8528qNeG/bnFfmqkyEFbz2t9zTYR+xrbxqUsdujz3r9Y4XWMPpXZO/q08VL1Hg5f2ePZW5/xos3DcdTPn5ablJabk6O/nEe+B+Pr20rc1nfNrK0rtblYftfiBlqfaDaZ+0ej7VozL3jyqsWytHeJavOOPDtp8wfPA2hTeD2F8wevmXH+8F0z4/zhcwfDpMiQbbZ2l8KkyZDHt+Dl8V017rABdoTjDmi3DPupq+X4aW3F9jGM/OYbd8B5kMeQFo/U3n8oOOajwT4Psb4QPrXcVOStEQ3Oa7jmH3jfo2N9gTKfUn5zrS9GtQbkuT02pIPP8Xyi9Ye2hmJ5/zjIW3LKw54Da61psR8pHP/T+o73C7AOYwgvSvrrcE5/aZLj4KKNbZGF77xy0mV4a9JfhzL8K0mOg0stw7yIrmkyFB2tZeiW4XuTHI5LmZz+o0c+C8sJ6zQ7H9N3tL/Il6xteM30abC/H88cwXHusWj9wuvcOaVdmm6L7ajaZ8d9Fz32Ba8zXOtczE+KCFdaeJ0r8J+HPvtE1mdFZyBrf/V0+6tfrv3VQjr4HOfmnGa/6AVJjoNLPafnxeWfvzjJcXCpZZgXl28Z2j8/rs90kuL4mp2TUhaP/4XFHC/DMT9oKzkGqN3vPGn5UqyjGMv23dPAvKfPnc3xMhzzg/rEcpr0u9vT8q4kh+NS5i8/aSnHy3DMj6Zr2r7biMZr8Fymp8zkcho2lylW+Al7d5H/vi/bM23ft6qOSZvSvy0PHdPu79XmtpO8l1VVhrif4mPPUJ9YToHsvlmOQVreneRwXMrs/pOG1DXtbM6IxmvPnokM0Z5pedGNaFD3Uf58nuVZDnvm+/6UGYWfSTuDxPZsifiSz1w0HcNzRs87l+NlOOYH9egs1WG/Ca7A8R9ve8ZxMZQv8s+lLG705uUcL8MxP7hOmFR7VjR3puU9SQ7Hpcye/ZaHnFBn2J5pa61R3fOk2TMtTuxrz/Yd9gz3MLV9TVdsi/sSn4tJdoH8jsr39wj9hUjv520bftrcl2Vy1cYI33uINghj/lw3pfzWcOB6kSEuiZNM2twWUx3ObagDXMrmtt/3sDdVztC+Bcbo/7fc/3ys4A8cX6s8roT+AvEaalxp9gp5dMWaWH+LYspF47fqncEvNsQlMcaTtH7TdAfbjwXb5DuuNH+H9xJ/BMZVo9n//BjG1cZpGVczCq+85kkLz1e+8SCse4EhrhcZ4nqxIa6XGuJi2xEoRuu9BuC9mGHejYUx2hkY3wzH/OD45vdfSd0/AtvxPRnuOg9hUH7XQx7CLznWUHUeQg5T5yEclXoPPS91HkI/baw7CXkIp0WGb05yOC5lcmpX8C1Oi5zemuRwXMrk9JEKcqqS1+LaJz8J+8C+ORm4D+yT16KdsTxJ+8Cu+3zqfeCctmsf+G1JDsfFch9Y0zVtH5jP65/UfeBzs7mcht0HRtmdxH1gX3uGsXKfvJbj7gMHim2MdR8YYxs+9uyk7wO/PcnhuIwqrwVlyHktJ3Uf+Hsd9sx3H1iL/84rz23byOaQ/RY73J22NsbZ5wxzV2j1fTahr90dG2I/wHV/Rlp4/J5VeG1SXVq+P8nhuG5K+a1RgIvH6LC4OJ85UH/vLSl8SdHmXde9E6gDXDQ7KW0aZv+a512+12U7+94aqnQ3tHmBx2Sg+4crv8tU6C9EQXWm7dJvlI/Lf5Nnm0od9+GSQmdJodNU6vgdR8PgetAQ122GuN5giOs+Q1yvM8Rl2Y8PTCiuOw1xWcr+etB7yzZa9qOlfr3GEJelvCz70dJOWNpCS723bONdhrgs23iPIS7L8fiwIa43GeK63RCXZT8+Yoir1gk/XPI+Lo67fDJbxIWN93bUtWUc9dNeCkQ7JnoiP/wN6bvWKAtK3TDvx+m0O6211sHuzsHB6ur6+o5vXwv8OQVeW3+JrJejILLeEB7x/TjnQK5pmYa6JaqbgTrhMY0J8PtxzgXiv4r8kb421vh+WIu+nFXgw/Zla/Vk92Vr1bcv5Z1CGLtZIF6xH7ZN+Oyshosfd+v4cV6Cxo/jyDbmO2uIi+PHge5y8N7T5bxdHJO+8WO8e+W45zT4/JPUfRb2puScRuB8qiB565oP9o4kh+OiyRnzqf7s+Rwvw0mZ0HuCxnqvBuqqzzl0tJmcT4V7nryvPkW8bmffW8MVbxmyHg6Tkya/DXMOnef2SZFTka6l5Z1JDselTE4+59A1XdPGMo/XQDJ0nqFAmpx/UPUMxZ8Y5h/ECj/h8g/aB5xnZIe7ux7O7+12wvm9m50x+r2Vz1GelryJH0hyOK4bZ96EJa4ZQ1whfftAuYamdxv4+vYW5yiLfPuLZ3Lcp+Uc5c9W8Mu1eb7KOcqY6FV954TAPzWTd+gzlyuANyJagWk7z8JU7U/h7do94x79qfXZUjSov3zeRugV3WHP/Snw30P9Gcj+qP3Jua/juDP/ODbsYtaYKv2p9RnbiziaiHfoBb/L8y+BrT4N7yWeMqSDMCOyc97337Kc+ZwX1qFfKv6l5oO8IslxcCmzq0+rMA61d/DNUB3n3MtnbL+WL58W2SuaIfjvJ7sa6EycalfZp5yUe6aL3quJcqyqB3gu419W0IPTNpaOM16+fMzxwmNCmx/Q92VfQ+APaUyEOrunjQmhVevB+PXgvloPzPTg+Ul/Hc6tvu9wsphbj6sjMdVp72pPy80ZPK9j3lHrlLlOnUTb8sFaD06FbWEZpmU7+9sarnQnzS/m/qmSF5AWuSNKi9/6vjca/emnXUf+NN8fhfLF86RcJmX+vJoc/WU7+I9rO2imIzzOUEd87xibJB35Z7WOXFc+0y3J0V/Wg89MkB6M4/6tqn2G92i99sLR5yp7ANhnVe7RioleUeyRfWCB/+069ngsH+s4vtKbK+iB631Gy5Gu9/IZ26HdQZUW1gOB/z3Sg0D5KaoecG7epNwJV3SHEsqRcx7S4jvP431x/9DDVmj3xfH4fmr2Id2T+yPqY+yD9P929r01VFnd0PKl7fDn9+RMK/IJu+/ZrnzOQegvREF9ll6+1yzxw/LhfC/tnrxmNDhvHCQ5HNdp80zDget+Q1y3GeJ6iyGu1xjiutcQ10OGuO40xGXZj3cZ4rLU1QcMcVnK6x5DXJY68bAhLit5yfNWuDhXHHGPKp9JW+8+N+mvQx/DN04ocNdyeCr4NSmPqxnB5WhQLuwHa+eMJm0tEVNd1bMfvj4krjO+e8z15jzVaffs8l5aJxNEYD1W1w3y2VJvAvlpXuNQ0xsch8g/l7L40S035HgZLrrOZPHKx+R4GY5lMQn2GXVZkwXHHDF+9bIkh+NSZrvf6iGnKeJnO/veGq6Y5813L5a36bh586f5/UMvyxTutLx/KFT+r9SJLvCZirQE9lV6uuCKDSNvjWjQpqCfw7GlQ4cuaPGIWYfsYoUfzTYO20daP/A4t6CDzxWdC5UxuZ19bw1XOuPcF/HJR9DsKMZWOZdkSZFlHA2Wsn2YqxVsviZDwz7qTlqMm/uoyp0daeF9brzXB2XHpSz+7dNHkyJD17tj2MZMmgwnxVawDKveaTJOW+F73wmvQ9FfYN/R5S9MSp8VxS+Oa1e43VzK+uz/OqZPz7ENqfsQxTa4n7ez760hixbbEFon/XxyJ7sArl5nDY551zrrE4HXWale8dn8YX2dnY3Vzb1Od29jd211Z3V9h/UaeQtCf29nf+OgfdDdWjtYbe2ul9HHceWyu1pOBvv0J2EeRf65lNnWd1QYxyfJL+PcjiXiWT5zKfO9fsTD3mn5GyHXvGmRMzFa/ENyWlL4f002R+Q1E+U2B599SZLXI/y/hfyTf5N9Ttvqel8f43jFfI7jixTn1+LEUod6yON1Ut6rw3qIawDej8G7X+eorgl1vver4ft4Pu2hv2h3sE3IO+oLjlvWF4H/A5j3vnBJx9kowHkl6YfX7kDS9mcF3vVeG6S/HA22n9d8Gm204VXuDXbxqt0bjH2wSLwif+eictrI6y3E67Inr00FHnV5iXhF/pqevF5Nymm7eD2vwDcdvGI75FltX31YG452jvOClwzpoA7xey+bhnRQpueIznlDOucBZpnorBjSQVwyx8pccwM8b5iL2Lt76DHRYJG6i0Cb9eYS1HFfPxbquH8eB3Wo/1y0uUZkkdr3L3nMNRegTto0Q3VPAD/h4nw/Pl7j8zvbsE5gHwf4/kz2WetvyZmpCqfNH9JmzV5Xsf04d/HcIn00q8AjvhmCf0rWlrSvvnKpv104TqQdTYXfc0BbZKO1f4V4kLo/B30gfmDYHPV2R7MPUjR9ZB8Ox/sS1T0G6ppUh2OV55JL1Fasw7Hqm6OF70f+aoXxeFzd1eb2M1SHcxzPszgvNamuaA5Oy1QSDbS1d0YC6uz0p9NOZfktkCXynJYZoMvz3ZQCz+N/RYHHeU7axzaIbTnLpzlG+cw75LOgtHfeIR/NPqK+8v2mmk7G9B1xoW8vtlaTJ55vSss01IWWJ8qM5Vn1bliXPLW4kibPonUh4kIZu+Q5zvGLPFaRp2uNoa1htHWm5pMvUx3Ow9wPSJffu4oxIfRfZI516T/GfbC/sA6fxXiSdcx3s7PbOjzs7rQO2wet/Y2WT8xXi4HFBX+l/UW4mwoujrWFiuk9Jzn6O2mx6JjqUMd571Dzx2OFTlmc2if+6lpTzynPHrevEBfrhHZPTdq3D9A41OJp+GxRPO2t4D+/mfxvbI8rR1p0DeO2GFudi3TaHwPabxuJ7257dzXrqOYnaLHZYXxwn/gr9gG3Cde7ms/E+iLwPwxrPo6/CkyjAOeVpB9emxe1cRJTGxAebQa/m8LV/jIfp0r81cWrZfy1jFeOv57z5FWL155z8Kr5G1V5vZqMltcFhdd55TlDG3O4pPAqRduP4X0cXKtx3A39F44dYMzB9159kUU6rucem+NlOG4Hjj9p0wzVfQTs/Mco7jZPz7jibgL7jxR8mn8lfquW2ytt0+Zg9Hc/VjDPRpE+z7K/q52fwvnbPMfhsHuw0dnaWd0/PNzrbG0dJ8cBffSY6lCGk5rjwLlBVff8J8GvHNVao8iv/FXSd9xzr+JXCvyvwxj9tewz+ofaHfCM4+kLOY7fIN/UlYejnf+aNL+S9RDnVN67P0l+Jfr6VfxKgf+iw68UmKp+pRYP1M6WVPFZkL7mV3IeskYb5xb2K8968qr5odo7apcV/jjWdraE1yp+pYvXMl/tLPHq8ivLeL2alNN28VqWg8C8ajkIIeM4qHdsTyzoaO/30vzYYeloeR2jyh+QOQB9IsN9wVX2w7Foe3/cn7j3x32Ae38st0tKW2OFB20OEFn4+v24RpE2zVDdNMzfT1/ox8d+v3Y2gP3+Mwq+sDml7Ta3N1JkgfrE8zquyXgth7rAuSfaPnDVPsV806UKfarNazHVabFZzW67zqmwDUWbs0x1RfY1LZOyh4Z2cQbols0nafHNK5O5TstbQnvA8sGYx6jlM+eQj7aOnnPIx5XXh36PtifGawXt7LEW+9PkiXeMpmUa6k7SHviSQwYoI1feXxwN9pvma03qHjjyWEWeLv9R80+1NYTmb3G8l+MoaH/TwmsIjCtNKTB896PAb2YMpvQuPrafP/S7WBcajnZp8Tecr11jsGocbRba+6uB4mh7m4ed9dW9rY2tjc7Oavm+sXkcr32wurV32G4/Sn1/d6M7avp7rdXWxsbB3lZn81E5bB6Mmv7h2trq5nr7sPso/e7+7v6o6bc7+3s7u+1ud6+739ld3TtO3gD6ZvJc2HOHnXas8DlVIJsoyu8fnQrCT37/6DTxw/LhvdQZhVdXXDNW6rR8FFeM9DkTisuyjbW8annV8qrlNUpctbxqedXymjx5ue5/4LVeWmSfOIS/vb+xtdne2Hh0sXG4tru31vHxt8WnDvQuc+/3/sRUp50z1/IWfPMPpL0p7Z35HC/DMa/au+I1v5v3J7iv0zKunGnhR2SA96s0FD45t+CjsJfwywvF9PhM3mm8p/GTEAcKeU+jZktSmF8siA1hDgE+W5Rz8ino0/9V6V9XXvOiQr9RQP9K0s+vFv/U9Fl+d8W+kb527o33aKrGXgV+wZNXy9yIMl4538A6P5h5dd3PUMbr1WS0vLr20VB3RJ/nlXYZ2qR9zlvC4pu3xPMM7ntxfhzue/neBSeyGCbHlWP1aCvkd+3eHrZVXwL79A3ayw6UR+mdozZFdbgHNE112r00VfsF8yh9/BhtTLCvhnxzH/wB9MG/c/gA4nNgX0XR4FzFNuVMAd1vAN0/8qTLepcWbY7i/ZOGwjPOvdb+/MHawc765k5793B3f2N9b2vU8fu1w93WRqezvnFweLj76GaKz3pC4DgvFXVX7stnmWqwbyPYMw7YtxPsnAP2XQQ774B9dwZblv8bL+b4UJ/RF3Pl//bgF3Oc09lnzP/VzgHyXNoooHkl6Yd37WULHoQPfTeSa6922ZNXy7uRlkt4Zf/rvCevZfcOcI4P8rfiySv7XyuevF5Q4FccvGI75NklhU5c8Ffo8G+8ftJ80tB5mHx/T4h7j7C/tTzJYelgnp30lfhTmEtnmBu4zrmZWLTczOPeocRye7zS1ljhQfO1RBa+PjDmKkqbZqjue8Dmf3SxH0bm0rsBpkUwMofuA0yHYGTufDnAdAlG5swXAsw6wchceTPAbIKBQdlq8+l7k/46gX16hiPs3V76ndBCa9LuFWPdxjHRpHZg0fQX7wd73DHzlS9SHc7vApfqw4Mj6cvJkeeNtTxredbyrOWp8FPLs1yeTx2RPGcI7qPgwzxEMg8T/2132S+MlDai381xXOwPPvuC/bFCdegzo8/PpSz+63MuRrsPRltvF63dRfYInxaODWBfa3ncfA+nwL9/MW+X5HFr/PHZUO1uDO3OxBWqK1oLpwVz+0Vu48jtxzXsDNBFnqNocO2fFu7HGxR41D2+LxDtnOs+xZUxymfRIR/X3pQmH9d9s3GUt127/4/jgNr+JI5R11kS4XEc8kSZsTyXHPJJi298ks86oTx97+NxyXOc49d1P2WoeK8mz/NUF0Od615jsf0YC3HpeNWzLwuAV2L11nsnrf1ue2vzYO/Rfwdrq532qPdu9je73dbO/tpet7P56D7S+nHOXqA85TnxiTDHyTAmsxUrfE4pshH6C9Fg/4Y4e6HlCk4rstT2VeVZ172SsVJXJVeoxnV6cWl3SYnOBc7X7OXLSax4WmkH8tYgePwcRYOx598Ef5vz5XzzcqcVfkLmUCJNl608Lh1tX1nLY2ObHCjnpacLPR8m0nPuzkB7EB4/p4X3D77i0AXtbuQzDtnFCj9LIBMpuF//NfIttNxJfLYod/LDZ3OcX89wVrkHFnWiil6FnYPXWtfbHPyDSQ43rO1+oyGu+w1xPWSI6z5DXA8a4rrNEJel7O8yxGXZxrcY4nqNIa57DXG9wRDXHYa4LPvxTkNclrK35MvSrlryNam28E2GuCx11ZKvuw1xTepcazkeJ9V+Wfaj5TxkOT9a2hxL2b/WEJdlGyfVRlvK/hFDXJZ2dVL9CUs/+tAQ16T6TJZ6nxjishxDlj6T5VphUv1VSzvxSkNckzqnWfpykxrreL0hLks/elLlZTlv32OIy9JOPGyIy9Lm1PP2+ObtVxEuianjfhDuEwguPr/yoWyfJOwe5tqqdudMHPXTngtEOyZ6Im/8Delrd+AI3wtK3VDnevcO1tYPtg53Vzvr+621/ZjwC6/8G+cElb3HqUGyDvPemO6hlneF9yGkZRrq5qhuBurwfS6XiP8w9+N3D6vIH+k3FXg+d1q1L5sKHe7nYXBNHRPXStQ/BtBOlN0zg3u1V5Jy+rFC36Xj9T0z9T0zvvfMzCvPGe6R72k5tFK0u0c4N0K7e4TPTGM/aPfMYLu5TNF3lIXvOVocf3wvidR9GnIxPjMSf6O1o+XdMu/Y/5yrhHrNeSDYd753w0h7U9n81xXkjDJjOys0RHZSON92SqGf/v0a5PqM/67vVjcmelGk+2mn5a5vzlOctLs5lyO9v9MSOPe4xbo+rbQDeWtEg/YExwnnh/2f2ZjS8ty0/p52yG5K4SdkLiLSdI3X49JBXM9Ojv4GvhNyk+cTLFKnvc+J7XwcDY7HRaU9sUJHs9fS3pSvZ3jMi6iH+E6YSZIh66p2d6s2V/r6FijDWyvI8LToGq4huNS61s8X1tW65q9ruAbkMipdw/nGUIbe91WzrnGsCOu0d4RVlaHAVdU1Lf+86N7pwL72mnYmQ4rW16yXOF5wjc5Fk5u0KW3vrofuaesYTabsozaobjv73hqysL9YdGe38NaIBvsU/cMZ+u3PL+VyYh8V5eOKm2g+KvelJrv6HGJhqc8h1rjGhus0n0N8vsPe1ecQ8yJr2NN8DvHlDl0YxTnEVy/105wFPrUYYNE5xKeey3HuZDhP4DnEzvU2B9fnEP1w1ecQ/XDV5xD9cNXnEP1w1ecQx8dXfQ5xfHzV5xBPh/2qzyGOT/b1OcTxyb4+h+iHqz6HOD69r88h+uGqzyGejjmtPofoh6s+h+iH63qIwViOoUm1hbU/MT5/wup85FOy/ZvA5yPXxng+ci0meiJv/A3pj/J85OZO96Dbbu0f7hzudtf212LCL7zyb5x/MxnnI9faJ/t85Fq7ivyRfn0+ctCeNaJBG5SWK0k5/Vih79Lx+nxkfT6yPh959H1Sz0c+A3JEvm8k/kZrV8shZ95RdzmHCvuH81OK3ofDRZOztNfnfKTIjO2s0BDZSal6PvLVkIM0/jzYdjsmelEUneocnDpHtMZV46pxjQPXac6zflM2X9Z51sXtScuzk6O/pznP+t0OXRhFnvX7C3w33zzrFy7nOH84w3kC86wr31VW51kP1tV51n646jzr8bWxzrP2w1XnWY+PrzrP2g9XnWd9OubaOs96fPNQnWc9vjbWedbjs6t1nvX42ljnWY/PZ6rzrP1w1XnW49PVOs/6dMzb18Na9AFDXJY2us7Zrn0TrrPK2X5BthcUOGd7fYw52+sx0RN5429If6Q5292D9fX9g8O1w9ZBe2urt4d5QnO2Oyc8Z7tTRf5Iv87ZHrRnjWjQBqXlSlJOP1bou3S8ztmuc7brnO2j75Oas30X5Js8MBJ/Y3Q521X6p2ofiCxSub25Yj63yJNtsNAQuUqpms/9fsh1moD33WzERC+KdB+uft9NjcsK12l+p8/fyOxG/U6f4vak5dnJ0d/Auatb/P4FLNr7F2KqQ1+Gbc5ZpT2xQkebk6S96d8fO+a7L9hPQb9c+J40+bIes6+IdehHzFKd5ucdR/Z/3+P9LCddR33fBVTraK2jo9ZR33cIjVpHce4zlO/I32Wl6a+vjgpcVR2t3z3U36a0vf9b/e6hXuF3D/2ew5dG+bjiW5ovzX2pyc7n3UP8N4r8/O60PDfpp6P5ymmf/yHFJUR/i84qXU3yeoT/FsSOvpF9LhufrvOI8px2XkuTgfyuxTX5PXjIG47JuQq4Gg7aZXFvpq3FvZmXGYVPPrM3q/Azo+DS1mdsk7T1eNW4lDyLesWxNaG/nX1veZaDTnuztd5Za3f3D9qH3dUVwo9yWAxAv7Ozu7HT2d3Z2t9abW+uldKfxDG/2MzxDjPmm80c57nss8WYL9ufqrJv57IR1+v+lIbLZc/K9nBYTq79Jmva9f7RYLu5lO0f/c6Q+0eTPP+IjbO2/1sbh3s7+1v7hxurhzuHOzs+9l+zfTHVoTw4FyRMLkVrh9d8WLQ1H+/BaTGLqvoobUrl9LxzOV6GY360NbWmq8KbJnvBMaq7L7T7DpAm331R9b6DZ2W6bnH3xRmFn9B3X7BdPGNIB9sjehE2t8q9p111XGBOVSdLqvK102epDvVJcGlzN8sp0PzZ4rkex8WiIotGNGhvcO6dod9e5hgXmh+Gv7nys3g+xueG1VetH7RY3rB0tBw5/i7yRP3cS/phzzpg9wl2yQH75gxWWyPh2uWA1i6zgFPbAy26W+WHYO3yWlq7oPxEbtoe8wLVncZ7le4xnFu0e5WagI9lJ3Ucb0wLriU1n0lwLkK7phQ+UH8Q/s2gHx8i/dB8IalDn579i/PUju3se2uo0u7ImBFfFIvUXQDa7C/dAHXnqO4xUIdy46LNYdLeVG2+4rHWwLXPBarDtY/wzf7Q34G+e2+zH0bs1d8GmPcTjPD4owDzASEcDeoV27K3Jv11AvvBDIfoA+qKpU3gNQnSYv7FHixD/YuSo7/avoU8l/72E83qOF+Q2ON8X2KP89bED2dYH6ndFj7OR4OFx73mm+C4Z38Cxz3v4+G4xzHHpSzG8MtzOV6Gk4I2lud1ocHzOscBNJuO/gKuwwUO4548htnPmXXA7hPsGQdsVT/noyQP3A+o4ucI/D8BG/bx7DPOnbzngZ/FnjYKaF5J+uG1GJ/rLExZjE/oHze+iH4tx2GXPHk9p8BjHGyReEX+zkXltJFXjm8ve/LaVOBxTuW1H/LX9OT1alJO28XreQW+6eAV2yHPhl4fsU1dMqSDOsTr9aYhHZQp+3jnDemgjyt9JXMkzkWGc2SX5zMs2nzG/XkR6rgPLkEdy+2xSltjhQdtjhRZ+J7jwLle2jRDdb8DNv+p5/thZM77I4D5Evm/Mtf9AcD8LsHIHPd1gPkK+VnLxJ/LRxbYr5Ffhe0N7SPj+gl5Ej8R5wD2kReU51KZfLNZHecLAuB8XwCct3riDLve8V//uvzgJarT/GDNbvBchHaDbQraDd+zRyLDtA1frRAX1nynmOrQV+F4F/YZ77lqe4LL0eC81qS6ojk8LXgeWXju7ZtAnZ3+dNppO74FsuS5dwbo8nw5pcCzj7OiwOM8yWeU0TbhnMPyaY5RPvMO+Wix9XmHfDTfGvV1keSj6WRM3xEXrg1w3XgNJsmfFx7HIU+UGcvTlQOSliry1HInNHny3r4rVyYtLnmOc/wij1Xk6VqjaGsgbZ2q+fTLVIf+BvcD0hWbjD6cS8erxkbmAO9HldhInaPQX7BNdY7C8XMUNjMdrnMU6hyFOkch/+0Wx7iocxRyGJ8chZ2kn6eiGPvLaF49bi7Ba8/nOF+Rfa5zCQZjRXuGc8BJyiW4C/Tjp0k/tLtNtDU0+wFNasd29r01VPHfb2T7jXEWjqVgnMU3l0Da65tLgGubFarT8gzYb/mr0HcPne+n5cp9ekfSXyewj2Q4pB+xj0PHN4XWpOkQx9VRh3zj6qgn3/DQExyHrCfYR5yPop070NYjgiOF/zHSgdPeD98+If2AtA3H4r62b8jt1t4vrNkp9re0syDc7ywDLlr/iSx8cjh+usCfEhpo99NSNYfjZeA38Hlu9K8M+6yr+Y5au7F9DCO/pXx/4nze1iJcQhNtNq9v0Sfh81coC8ER+Nx7i/039Bm1e4AaBI+fo2hwn/LjDp8RZa6dFWKfMVb4KbonAGFjQ3lxP0bRYF+F0enOVkz0omhwHYb0F6JBnTPUnbarH7WzgZqdkGe187A3Jzkc12n2yLXGYH04Lq60PNuIL8s2WuKq5VXLq5ZXLa9RttESVy2vWl61vGp5jbKNlrhOgry0e2I4lyDQ2t55z5i2hm5Eg/LFNvE9Y+ezwJXFPWO8B5GWJYfstPWl9F/RWvekxFC+6xFHRNlc7zGU/8KhjyFiKNpeWkx12n2Hk3bnKMdTMYY6zP2r3cfleBkuIllMSj5VlXs+tTg9jicumpww1+qZFeSk5ZRwrtWs8mys4NJ4Zf1HXDKXablHmGfwjJUcL8oL95Hx2RcmeT3CP2slx/nM7DPuXWvv/WEc/wJw3Jx91p7n8Yp6yOP1pN+v5dpTQRvLRdNfPPt6v4f+ot0pysFFfcFxy/oi8C8Fu/+FSzrORgHOK0k/vJYzi7ke7KdM2tlOF6+TdrbTxeukne108Wp5tjNUvmV9trM6He1sJ+cRWNBBXDLHylyDOUSGuRJrfN4Li3bei/Wm6nkv7p/HQZ1vjoXIIrXvX/LIv8W8DmnTDNW9G/yEZKUf3wI9w3kTWCew7wR8H8w+a/0td9hWhTvu+TaX7S96xwX20awCj/j4XOsPw1z8lUv97cJxIu3Q1v/ngPYHV4rbv0I8SN2PQh+IHxg2z9z/bCb7cKHPZk5RHY5VXHtz0cYj5sOP+mzmGarDOY7nWZyXJvtsZnutPpvpL59JOZvJ60ntLv/JOpupy3OUZzNFRsc9m4kyHv/ZTF2efWcEkv42+a4ztTWMxdlM7geke5bqMCaE/su/KIj7IK8Y9+F8SO38GcaTtFg+PmMYi1nXYmlSuF9Rllp8jvcqUI9/IMnhuGhzrrT32v7AhRwvwzGvuA5hnwPnfbx3C5/71+BLfWlFh/k35GOhflnuH2i5/jG1P6Z24J7MK5L+OoH9IvEfKA9Q5V9ooXyt71OflH0G3p+qGnf3ja3jHoRPbN0VLwlx3jYtHFvX9qNT2fwx2diyM3wcKxX4fw/j+VtKbF07/8Y4Di7kOL5N6zPXXphmG8d5/lfTNde7CDl+rvmAWtx9mPWVT2wd9y44tqzdq4jjlvWlB38h54Vj6wLTKMB5JemH13xynGfZ57F8J4xGW7vfQ+DPevKq+WfYB3zuVTur46KNvHJs/Zwnr1osHnWZ72nQfMmqvF5Nymm7eC3bB2BetX2AkPujqHfaPt6wdFCHeL932ZCOtrcyqhh+2Dvw2qscf8Oixd+4PzH+xn2A8TeWm3anYqzwoM0BIgvfexMxpsP3hkvdX4D5++BCPz6+b4D3vLFOYFsKvrB5Hf5nPnlex1gs72OgLvD+zzD3RWPOx5LHe19RhjHVae8H1uw2539p50i1WOwy1RXZ17RMShwL7eIM0C2bT9Liu7fLd1vh+EN7wPLBO2NHLR/XnWFl96BV8XtQX3mfR9PJmL4jLvTbXHE+vCcnLdNQd5Li0EsOGaCMXHvvcTTYb5qvNalxaOSxijxd/qPmn2prCM3f4pwXjqOg/U0LryFEdrKHyjD8bg2B34E118XH9vOHfhfrQsPRLow5YOxW5mvXGJxW2qjFEPEs+x87YrcnJQ/7Ax5rb+yX6z0P+wHQ31HkYS8peEYjy/ZaTPSiaHAdhPQXoqBjoHfWfLqinLU9GHnWFa+MlTptr8cV+3zOhOKybGMtr1petbxqeY0Sl7TRNYeyz5gW2W8qOj8X6D7GDS1fQoq2rx5TnXZmQ9t/9N1HlPb67rlr++raPMtxRs1fqHKWMf2/nX1vDVVWtzQfmn2pMLkX7YOY6EWR7ksJ/YVoUN4hfCltLGrngHn9is9qOTSPJDkc17nWthqulxviuscQ1xsMcd1niOsOQ1yWsr/dEJclX28yxPWgIa4HDHFNqq6+3hCXpU680hCXJV/3GuK60xDXpOqE5Xi82xDXpNrVVxvhEn/Fiq8k6celxdoaCi5fP+cswN7zxtfdfX9EhZ3HONIZu1DAwJMInyxoNKcU8eP3CyX1T1JwFQUWR5X8FyJBJS2yuJy0hNCY6rTN7ElNCA3xAoi0VE0IPX9DjhdlXjUhVOAv3ZDjvCH7rF1aJHorddqmBiaS4qKck8ul7rlA+/HZ50lLCGUdxQ1X1tGTlBCKh1u1jWnWF4F/2g05L5wQii+H0XBeSfrhtQRPbZzE1AaE115Os1yh/WUHmqpctuDi1fKyhTJeqySEungtSwhlXl0JoWW8Xk1Gy6v20tawL2ptHWqJSFI4qRL1VEvi4+Q0TGrjhEP0eYZ54apPwiGOP2kTJw8+C+z8c2/ox8cJh65D9gJ7s4LPleigOd7SNm0OxgSJ5xbMs1HknyCBCSHnwY6e5EB7Vf3CYPrPecxhvsF0LcFRcIh80a8LkVghfGJihXZpVSMalHlfch799irQGU6s8F04aok7mv7FZvLp7GvrDzv8qwfa+iOmtgW6AKIdEz3pB/wN6S9Eg2MqxOZF1QREzZ5z8ibO7bx5oc37iwodDdc9hrjuNMT1sCGuxBDXbUa4tLE+DK45I1yWbUyLpa6+xRDXawxx3WuI6yFDXJbjUcaQlvCHsZH3kc8mOo5rXXy26LDs1mNynB+g+EQgH837wlL20YougeJS5qN97vE5XoZjftCX4ANS6KPxQZPT6KP9eGAfTZMdJuszryFkt6DIbs4hO/S5+i6Zod9+xlB28wo/ZXbjw0Z2Ywnsxj8Yjd2YmLXd7z4hx8twzM9x13Yx1LHdQN5D6L60FXWfY1RRlOv+rCKnKBrUmf/ZofsoO1eMTLMbMcknprptE/l01117WGFtersbEz2RU0TtFfoLUdCx2Ft7aRchaTZLG598MZM2dnkuQzraoT0t1nV/YofrIUNc9xniusMQ122GuN5iiOs1hrjuNcRlqRN3GuKy7MdHDHHVOjE+nai6vvw6+Ylij6v6iQL/f8M+xh9knxcr4o2jwQuaBP6PAe9C5osG9o+8/c9pqptX2mWRxC/tTWn/hyfmeBmOecU5Vvh25T5MyrpVePNdt/5nh/+JSWNTym+uBLcGySeQ/m1qeTlStH0B2ePTdIzXi0WXt6Z1Wq7IcXTzTyvoJo5nthFCg20P88sJh4L36x5rX832CHwT1r7rZHsCjQ3vmBnbnrNKu7R8H1/bI+31tT04foTv05IXhW3jUpb75HMIC3WNcyjQJgouLV+E42qBXgDUs+3CJ9p2bT+uEQ32B+ZGcS7Ff5mNQ822a/uD2sXOWlxtgeQTSDe9XpCUFrbtVV6QlJZb6DnM0eE5AXN0UJ+4lOn0056U42U4KWhL2T4LDbRPaXHZ/VnA+2Eju/90sPu3kd0PFI+eWLuP+cYvr9C/LrvvsmfaxapsswKNyZ7NEj7RZmkX7DSiwf7AuYZzxp7vsFm+azwtFzmwbnrNp2lhm4X6xzYLcybZZmE+JtsstGfDvNixqs26LZDNep+SO6et2eOCv1Gkj2nWG81X5vWhBR18bkTrJedlSdoezBTVcd4I1mEMYCfJ4biUrYnurKBnp0VOe0kOx6VMTl+/juS0n+RwXMrkdPuTc7wMJ4XPgEWR7vcgrZcl/bCzDti3EewZB+zbCXbOAfsugp13wL47gy07Y/Qust/amRHXGSOBfx/4hu/NPuNZIe1MGPsXjQKaV5J+eO2chu+Lao57TkOj7bogcNmTV9flpUi/yksxl0t45TMl5z15LXvhFF8si/ytePJ6NSmn7eL1ggK/4uAV2yHPamuRuOCv0OHf2C/QXharrVuHpYM6xC9uDPHCS+xvPrtiQQfPwUhfyfyHFzgb5iD08h8uRoNF6ixenslye7zS1ljhQZsbRRa+Z37wgmxp0wzVfRxsfvtiP4zMpd8EmP/pMf0wMof+PsB8kmBk7vwSwPwCwcic+ZsA84sEI3PlrwHM/wJvSEXZavPpe5P+OoH9FMVBwrzUVX+xkNAKS9v/hbKs2zgmmtQOLJr+4othH3fMS/IvUh3O7wKX6sN/GklfTo48b6zlWcuzlmctT4WfWp7l8nzqiOTJe33ia6Uwf0oy57PV29n31lCl3WW/MFLaiH4336WC/cEvXMH+WKE69JnR5+ei9ZXIIu0rn5exaHvg2nq7aO0uskf4tHBsAPt6SoHhF7AL/NmLebvk5QEaf3xXhnZPgvay7BWqK1oLpwVfKCFyG8cLJXANOwN0kecoGlz7p4X78QYFHnWPXxSNds71Iu2VMcpn0SEf150rmny0eBqOmSWSj6aTMX1HXDhGXS8wwbyZtExDXWh59uViJP1tWnLIJy2+8Uk+o43y9L2bxSXPcY5f14vJQ8V7NXmep7oY6rgfkK7YfoyFuHS86n0iC4D3XbBfflJfuPKlCvszvP+a/uXcDS0/9zS/cOWZMOeP4oUrVV72q+UkT9r9g0V5vsw/l7L8iKUbc7wMF5EsAt3/4Z0bxbI4q8jCIjcKX4L4hApyEpqoM5wbpZ05jBVcVfYOENfNST8dHIO4T/oqsum4pzulPHslyesRfgfWbj+YfcZ9Uu18OuP4PcCxn33Wnufxqp3/DZz36pXXqelhlbxO1B0tDwptLBdNf0UWKc5bPPQX7Q62CXlHfcFxeyXJ6xH+PrD7fBejwDRKcLp8Q8y7YD+q7C5GPrOt7WW6aKMNr3IXo4vX0Hv8yCvvmy978mq5x1/G69WknLaL17KXozKv2A55VsvxGdaGu+7tXTKkgzrE+7lNQzooU45Xnjeko+VnhMwDSIvMsZMWF2a9sdi7R/3nUhZPPvCYazAeJW2aobqfBT/hpy7241ugZ1x3cgrs3wN8P5991vob79asAufKEdPstU88Ki1FOVmzkR6/4rirwP9DmIu/cqm/XThOXHGCc0D75y8Wt3+FeJC6fwx9IH5g4HsPO5p9kKLpI/twON6XqE572bo2VnkuuURtxTocq8Pcw/26CuPxuLqrze1nqA7nOJ5ncV5qUl3RHJwWjPfh2a60TEOdof60tXgfzp0zQJfnuykF3jcPUdqn5ai54vXNMcrH8oXjmn1EfXXFQ3k9qd13U3R2+hpMkj+P55bSMg11oeXpii+XxcyryFOLK2nyLFoXIi6UsUue4xy/yGMVebrWGNoaRltnaj75MtXhPMz9gHTPUh3GhNB/+b2CuA/yinEfjuXPKPxgPEk73xT6XTTSlrJ7zmTu5HzNPwQf5LsXi+mxf6fFkk/6XZD/wRGX973PMFb44f2OtGBc8jsXdZoYZ8JnryT97RD4/wx9+p+U/nW9L2ZRod8ooc/9EgG8ps8ue4l9xXtB2MfzUTlt7B9eNyx48uqaV5C+Fp9d9OSVY1LW711hXl2xvjJeryaj5XVW4VU7Vy36HDaXqrWvxamkaHFv13uGOCaOcSSOb6BP7HtHB+ZS3ecRp8B+4Tgr2gr5XdsDYlv1xMwXSb9/b/Z5ks56C22sQ5+F7yjQ9jiq9gvuST7o0S/amGDfDvnmPvivoA/+HMVCNJ8D+4r7fzr7z3blTAHt7wXaf2FI2mnR5in247R8A5x/NT8O5S6fw57R7VR+R4XQXyBejcdN757UBvFTZOOXov7xg8/ymf20sE/rmwuBdc+ZUFyWbazlVcurllctr1HiquVVy6uW1+TJS7vrNs4+B84r7sXlZC00rbQDeWsQPH5Oywz99kjm71vcdRsr/LjicpxLy31WFhsT2fNdOtvZ99aQxSV7Vw6jwH+A1lKyTpuKdF0UPAKvxZ21XGJe930A+vTXbuyXVZj1VHuTZVV0ZyLzLPAfBJ4/m/HM+hG6vwPH2Fe5X6NoUJ+QvnamIC74K7i4TmgtRIN2wbBtbVfbkH+2GRhfQRkU4Zr1xBX4XUO9Pp1xtBvpLyttnR4Nry22Q9OKXJG3RjQ4Hvr2M+m3n3XMJZp88Dfuy2mFn9D7fjIvhc7D5P4ONCa97oHX5KzFGLV4tdZ+lk2ktD/l6/MeuUNTCq/L0aAMhdfA9txbvlNUt6DIpKoM8T71r3rEs7V3iWn2iudYbS6fJh41XcbPHO9F+CJfEG2RRmPU70os88mKcgE+U3AmAWWrzQkCr+3LzzvozhFd9AVd82uRDmA7ZyP3HMfzwueBh6+QHKYVObj2a7V5RNNJbuNsAXzRHd6/pfAc2l4zz1V1Q+TciPT5nOF5XDJ+tvUxwaclHa9ov5DW9jHlsbe2vrvXXdtpHbTTrx2+y0vaKPTRXjQiXWcj+i6/ae/fwedDtO/Rpm3s7Wy021vd9kG3vebTPi1PQ/jm9XdaJKdIy+maoedQH2apTptXNR82pjrUv4ajDVMFbdD4bDj4nFL45DakRWI6cpYwLbNJXo95g2k5k32fBhoIj+tZhP827L1+B3ICr8Eq9FK4M48thosL/l7Dofw2nfT/Np8Mwk8lg/BCeyEZ5FHqFqFuhuiczb6jvBCX8DHD8HA/S1rm4Bl5vqnQnyP6fXwrv6EOMa4p5TeBv3aHUNaPvTMhQNt6LX2NJuHH35g30Z0qdpHjCfibZidwXPr4cCfZToj9DDEPdDY317c6u63uxv7e4X531WceYHk0FHnIs/ye2yiy0tHVDabFd4GW6UzV9s06ni3zT1x4Z6JB2cjeQcOB14Wr4cDVKMDFPpm2x3DcNmtrYx5/MwoNgdNyZNH/fkmS1yN8O7NFKS/tyznfacH5FdduaZlO+tu0nf3eGq5saXn5uMZAO452IYrccUeB1/I40XaxfeLcO8Sl7VdpefNst2cj3ZdnHRX4p0Mfuc7osf3U9Lho7X7cvYBnAW/dy0efA8f+1Xd2S9Hy/di2zSntcsWAYoWOZmOkvSn+jcs5XoZjXjW//ThzdyjbcTXJ6xH+JZNlO7q17Rgcn7cHtB2n+W6q14HcQtxNtaQ8Fxf8jaJq+xaufmAetrPvreHKmrbPE1EbeY8M63AM8p4Ojjd+X5h2709VOy1wKf7tyzlehpOinRMqGxO+6yi2SWiL0SaxHyfwb1NsMeNsRO64rWa7cW82LdNQZ5iToJ7H7DujlvS3yXVmStqK8K7zxSgj7R0mVWx31fOt+B6/tEwn/XS2s99bQxVdnn32LulvU9kZUJan64wvyqgZDcq6KMaNuFxn1rS5ULMxPBf+zYpzoStGEcqP/nGHHx0ox8D73fcx1Wk2WNsv9fWjpb3X+snjPnLUK747TdtLdfnY2hkZ3G8Ypc2/muT1CP/zJ9rmtzZqmx9ente7zf/nAW3+aV7/fKZe/1QpJ379c/flHC/DSfFZ/0g952pozzI/HJvX7AbmzjMtxOWzj8E2RvPd0sJrL4H/GoyVLxTkzDQKcFbJmdF0Xn4vy08W+pqt4rtLXHmxaWGbPOvJqyvehvRdeYKuPRXNZyuKmfKzvI+UlluTftiYYBsKrMZDXIH3Mv4YV1qen4yPP4aNokGbG+j8wlpM9KJocH5A+vV58LzU591qedXyquVVhquW1/HaeJrPn7ayS6Hr86d+sq9y/vQvP66/XaM6f/qXoU9Hc/60dciy8o2V/7fAc33+9KjU508HcdXnT49f2A5Znz99qWMuqc+f5jD1+dOjUp8/HZRJVRnW50/1sTSp508fJl9wVOdPH1Z8Qdf8GuL86duBh5Ny/vQ9njwjXy9MdB40HdbgedxwX/Cd2zHBp2VyYrs7WzHRiyLdV53U2G7YNf7OJvc78qOtnQL7DV1tj9MnvwX59vUhfyYbd9p8xfnMOOY4HuXrb2LdcyYUF7fRtT5C/Uh/+9uZXE9zLOsjExTLcq3dA8cxdqvaW6E/qthA2V40y1lbk/JaPy08xo4bN6hx1bhGhes0x4E+e4LjQEhz2Pirqz1pkbnD9U7swO+L6OlCL481yvsFaWLuMcLj57TM0G9fcOiCljt0xiG7WOFHyzkUuaa6/GVad2vnIvFZWYvxevBDj89xfoV8KW1O1WJWVfQqrG+wtlpFb0+Tb/CDSQ43rO1+oyGu+w1xPWSI6z5DXA8a4rrNEJel7O8yxGXZxrcY4nqNIa57DXG9wRDXHYa4LPvxTkNclrK35MvSrlryNam28E2GuCx11ZKvuw1xTepcazkeJ9V+Wfaj5TxkOT9a2hxL2b/WEJdlGyfVRlvK/hFDXJZ2dVL9CUs/+tAQ16T6TJZ6nxjishxDlj6T5VphUv1VSzvxSkNckzqnWfpykxrreL0hLks/elLlZTlvXw9r0QcMcVna6Em1q7VvMj7f5FWES7tnQ8tD4Xs0/sdsLyjsPu3auisPPey+4Np6TPRE3vgb0tfulhK+F5S6Ye7v3uwerK/vHxyuHbYO2ltbvT1M7S5P111C2t032p6TyHohjKw72v1CeJ9VWqahbo7qZqBOeExhLhH/84H4ryJ/pN9U4DnPt2pfNhU63M/D4Jo6Jq6VqH8MoJ1YjAbtWSMatEFpuZKU048V+i4dn1N40nIQ5qNy2mhf+S6RBU9eFxV4HHNzxCvyt+jJK+vboievZxX4RQev2I6znrxeTUbL66zC67zynGEewN6SwqsUqVsC2pz/cQ7q+C7AZahboLom1GG7uUzRd5RFKr85jzsNcfz1bDjV/XPIN/nMSPyN1i6f7YoU3lF3OR8L+4dzXXz7p2ofiCxSuf3k5Rwvw0lBebINFhoiVyl4DyDPCbOA98uQ6zQBecCVfbg6D/j6xnWac1G/mo31Ohe1uD1peXZy9Pc056J+y6ELo8hF/XbBvOObi/oLT8hx/scM5wnMRW1db/NTnYvqh6vORfXDVeei+uGqc1H9cNW5qOPjq85FHR9fdS7q6bBfdS7q+GRf56KOT/Z1LqofrjoXdXx6X+ei+uGqc1FPx5xW56L64apzUf1w3WOIy9JOPGyIq87TPB3ztlWe5j/N9kkC52mujjFPs/J9HuPI01zbO1hbP9g63F3trO+31vZjwi+88m+TmafZPTzZeZrdwyryR/p1nuagPavzNOs8zSJeryaj5XVW4bXO0+wvKIsQeZq/CbkYXxyJv9Ha4fvjI4V37H/OVUK95jwQ7Dsct1w0OUt7U9n84uUcL8NJQZmxnRUaIjspVXMxvw25PnUu5kCpczEnFNdpzsX8k2ys17mYxe1Jy7OTo7+nORdz6olHf8eVi3nmif00Z4FPbd4pysX87BNznAvZ5xOYi9m53uanOhfTD1edi+mHq87F9MNV52L64apzMcfHV52LOT6+6lzM02G/6lzM8cm+zsUcn+zrXEw/XHUu5vj0vs7F9MNV52KejjmtzsX0w1XnYvrhuh5iMJZjqL7Ls/YnuM4qR/Qz2Z5N4BzRtTHmiK7FRE/kjb8h/ZHe5bnTPei2W/uHO4e73bX9tZjwC6/822TmiK61T/hdnu0q8kf6dY7ooD2rc0TrHNEiXq8mo+V1VuG1zhHtLyiLEDmiX4cckW+OxN8Y3V2ew9zXWTVH9JsFuTpCQ2QnpWqO6BnIQfpY1E9D2lw1H0jgvwM4v3CpH6eWy+Ia61o7Of8nLcvEAz67RHQQbjHS82O1/Lmw+tpux0RP2hwR70J/oUAe2yb85PlHrj5IC+cfaT5Ck+rSwvEE35w3rHu5Ia57DHG9wRDXfYa47jDEZSn72w1xWfJ1lyEuS5240xDXvYa4JlW/qsRfGgouF23NFp6F3+954+vuvj+igoQFucbYBYKbou/TBQw2o/7y3ESny/Tx+4VIL0XwTQV30QSr8TEfDU4g45hgOdATyEFtu5RKCwK6glJaEIIn2OMGDtLyckNc9xjieoMhrvsMcd1hiMtS9rdPKF93GeKy1Ik7DXHda4hrUvVLJlgtACc27aQf3Hnxk47+WhzcmVX4ceFyOSdacHTWAb9QEb7UmUEFEORaQ9hBKHJm5PsM4ZknPNyQIqeH+cNnmW/GwaXsuSp4i5wjgXVFXlAJOPLyalDM7uWjz4GjbBvarp4UzWGJqW5eaRef7ub2c5mi79jelPZvXM7xMhzzig417waiPnJUFvWKo4U48AQH97126jWmOuxD3s0Lsxtme9LeNyItbUrl9HOPy/EyHPODhnSR6lAXhTdN9oJjVCeOtckKafKJ46qT1cOOycr3xPEZhZ/QJ455Z+SMIR1sj+hF2N1x965E1XGBu+LfPeZOzVmqQ30SXNpuH8sp0A5ab1wInzguFhVZNKJBe4O7bzP02486xoXmGOFvrh123pHD54bVV60fuG8t6GhZDvxd5In6uZP086Sd6E9t2n//pBwf2jn0d/DZopPnP/+kHOdPZ5+10+XSPm2XaIHqTuOtEx8xnAO0WyeagI9lJ3UNkl1a0nHs8m0E5yK0a0rhA/UH4T8O+vE10g9t51fqtJ150YEmtWM7+94aqrTbMmbOR4NF6laANtvvC1C3RHU3QB3KjYs210h7ff1o3CFfoTrMYBC+2W/5PPTdp57UT+ssPYN8vyPprxPYX8lwSD9iH1uOZeyjiGhNmg6dozrUoWVqB5YyPfmGh0+C45D1BPvoAtVpWT3aekRwpPC/Qzpw2vvh2yekH5C24VjcZ/4jpd1aJo9mp9jf0jKtuN9ZBly0/hNZpPSetpLjZTgpOLexPyU00O6nhbODtLkU/bQ6TpGXOk5xVKzjFP9vHaeo1J46TpHXXQ9xiuUnH/2t4xR2cYq9pB/WtZ7YJ9glB+ybM9iy+McTn5zjQ/vpG//480/Ocd6Yfa7jH4Pxj6c5xtBpjn+0QD9eSfqh+UJShz4x+xfnqR3bQmuo0u7wugiLti5ifwljHLyeegzU+cY/pL2+8Q8txqGtHYRv9odeAH333zy5H0bs1fMBZptghMfnAMwznxz18bxItLH9b0366wT25gyH6APqSug4yrlI51/swTLUvyg5+qutU+W59Lfvf3J1nC9I7HG+L7HHeWvihzOsj+QfD2HfBMc9+xM47nkdjuMexxwXbdzjaaiq6/BXFszrQoPn9arr8CfC/PUxoi+2u4qfM+uA3SfYMw7Yqn7OAcljDnBW8XME/nVgw16bfca5U8svkc9iTxsFNK8k/fDaaUQt+U3gy04jCv0qJyc12ujX8onUJU9ezynwGNtbJF6Rv3NROW3klU+kLnvy2lTgcU7ltR/y1/Tk9WpSTtvF63kFvungFdshz4ZeH7FNXTKkgzrE6/WmIR2UKft45w3poI8rfSVzJM5FhnNkl+czLNp8xv15Eeq4Dy5BHcvtsUpbY4UHbY4UWfieGMa5Xto0Q3U/Cjb/C+Tbypz3IYD5WwQjc93PAMyPEYzMcf8DwPwd8rOWiT+XjyywP0l+FbY3tI+M6yfkSfxEnAPYR15Qnktl8pEnV8f5ggA43xcA562eOMOud/zXvy4/mPf/NT9Ysxs8F6HdYJuCdsP3BLzIMG3DVy/leBlOiuY7xVSHvgrHu7DP+HYInCN5nsZ5rUl1RXN4WvDmG+G5t28CdYb6s5a241sgS557Z4Auz5dTCjz7OCsKPM6TfBtO0f42y6c5RvnMO+SjxdbnHfLRfGvU10WSj6aTMX1HXLg2wHXjNZgkf154HIc8UWYsT9dtOGmpIk/tlhdNnkuEy3VrUFpc8hzn+EUeq8jTtUbR1kDaOlXz6ZepDv0N7gekKzYZfTiXjleNjcwB3gMlNrJEfEbweV7h0zLWFRM9aR/+hvQXokGZGvqIvUPGDeKH5cNnb7T9oybVpeXmJIfjuinlNxeu5xji+j5DXJZtrOVVy6uWl00bxRfnuS4t89GgHbNcewstmZfKbl1tRIPzGM53fJZz/sajv9qetWbLGw7ZafPOkvKcxO6LzqVOAX6N7pXs+cBvknXKfkbhh2V78cb+dkkcaCrSdVHwCPysQhdzEfh87izRTWX7azf2yyqMP9LaY1n5nil+PPD82ewz60fo/g57MUxrlfs1igb1Celr+15xwV/BxXV8i1vot0iW7UWyzdDybly4qtxajbgC5xT1+tT19kykf5rzn77HMZdM+luH0yLzUujcWu7vQGNyU1vfS+HYlCZnjCuxTeIcDvnMZYq+Y3tTvj5/Y46X4aRouYacSzat8BrYnnvLd4rqFhSZVJWhtOlabLuCDHnsIG+aveI5VpvLp4lHTZfxM8dLEL7IF0RbpNHgsRSor1tVfTL0fxD+B8gXRNlrPgBfuDen0J130J0juugLuubXIh3Ads5G7jmO54WXAw9foZt6pxU5uG4c1+YRTSe5jbMF8JzXJPC3KzwHttdd5rmqbuAFU9p8zvA8Lhk/2/qY4NPC47UR6ToT0Xf5ba6Av7J7a7Sx1lToyZ1Mmj9xxoEzLsCJcFoMmnO0UcZ8OzHaTYkxVJEnrwPwN40X5N/H9ob2s6TNnDdqQQdxSSwo8EVwW9o+nxRtruc+QV+K4yZ8ZjWK+tvPsokARtqb/n2Ch4+A44Hzf0LkjaWFdaIo1/OvFcyjRbmeV5K8HuH/5o05zh/JPi9Hg2OE/UwcZ6JrmCOKczLmoWLdrwLtH6P4zDjO2Wm6xjqK+3Sso9o5Du18gq+Pi+f6bvHQX+wDbpPgRH3BcXslyesR/mfBH+C3DeCZOxdOgbd+EwmfrXK1v2x/vErur4tXy9zfMl7ZNzznyauWK3zOwau2V12V16vJaHnV8swCn6U5XFJ4lcK5QqinnFuLeqHlcnLeGearDZMjdp+HjcHxJ23iM0yfAjsvNl+e4XOj2jzP88anFXyaf8W+L64FpG3aHIyXt/9qwTwbRfo868qjkGdx/uZ+kme2s+8tz7LeXW9vbu5s7q3vHW5193Y5ZzUtMqYWA9A/2NrfWN3b3NjtHOxtdDfaZfS1tQ2v07AOfXq2DVVj7lreEcbJ0zINdZb7A2l7v3g55wN9hbTMJP11qJezWZ123mCK5IR+J8cBA63be7EhkSXGaLR4mLa2w/HL+ee/64ir++5vc3wM63As8JoVdU5wsB5rbUb95/27tGxnf1t+pc0/MN/aPjjvCU3KHTHD3ANzw005XoZjmigLPteMushzL+oMz704FmUu1c6ac5w2kOx7Y1FkXxQvZT3B+aAvv5R++45jLPruV7r2B117mYHWiD3ZLSqyW3DIDnV5UZFd77fLkZnsZhR+QsaTsL+G3ZfX6Ix6vxPHdej9Tj5DgjYNYzvNy/kz+FxRLkkM9Qj/5Ms5zgvZ58D5L957gayz2l6gNle47hNDmXPR5hGRRcrzX7wpx8tw3A7UCWnTYjTYD5cv5/i/QHsogWxYLx9DW69g33M81nUOA/VOO8+DufuT6FdousI6hrEN1rGq8T2UCZcyP+bFFfSP7YLgZZvieisp5vSLvbFeC3YPN3bWDzdaa5397kFnf2fka9Hd7tbG7tbeWmu/tdXeWvVZi8ZRv35otjctL0nyeoT/S5eP/mpxUm3vVuPJ5RNwXkJarN7Kynxi2xsKXV6nXbl89Del/frs82l7L4pmZ3zj+iKLlK+/dlOOl+G4Hdj33Ca+2ywt4ltwnyL8iy4f/U2/335ZxyntZx3mWDnnRzAM8yDwL7189Ddt08XswOuk5S6x3qBusN74zkFV9QZznrYv53gZTorWpw2iUdanWv6IFotjvdq7nPPK+SOB8pfXtfWPFG0tz306p7QrdB6byMKnT8W2WtvvN17OafxE9rm23/2F7ffaU3K8DMftCGG/33b56O+1vYXLOs7Q9vudl4/+1vY7L2X2++7LOV6Gk6L16ajs99+4nPNa2++jUma/q/ap2Fard9Px+EW7j7Lke98E/mcu521oX9ZxNiJ3fuoY99Z2fc/0l91TwHIti41wXmTR+xTxO+LCuc91RwLetZ2W6aSfznb2e2u4osqzb38u6W9T1be1u+Tv2pfT8rxd8kT9ZHsoz88q8JpvJPD/9PLRX7SH2r4h58Fqfleo/W8c9yj/onutP3U5b5OMe03vcO8qLdNJf5u2s99bw5V1Te+wL6vonbZnIvBa3Ex7h4Frn92ld655WNM7LZbDevfrl4/+lumda7+6SO+Yt6JYF+uPwP/vl3PevlBwrqFRgLPKuYYYfvONjQl9LS9iNiqnreX2uGi7eHXpKdJ3neVynUXgM+aIQ3Jz03ImAT6SHPYaHNYRDLZJcM1B3WIFXIsOXPMOXAsVcbloI6/ThP9s9n22AP88wS9l36cB/ozCzwzh//3LOZ3vXO6HEZz/DmD+MPss9ngGaHDfncM6BR73Jhle2prS/H8uH33u3aULdKz3qIr4Rl0Q+poM4oK/iAt/E1oLhMu4bW3LPnHhOlcRl8gT+zf9PH1TVp/BBerrDrdB5gNsJ9Lv3Y8Vhp+e7i0nbpkKfQvdE1qj0j2tbS7dQ3jWPQ3XckVcIk9N35bCyGCV7XpUIAOkj9/RruP8J8+yzV65qR+PJi+cw2Qu6uUhQ90C1Z2HurPE70oyyC/iWiZ+V4hfmXs1nW8q9M8RfaSl0ed5+bwCf16BT3VlkWQ6qzyL/SsyLTrHhzEzwRn43qJuFduA9Bci3W/ftuGn7Vq3oHw4bqbl72rnOJ+T5HBcp/nUjRHj0tYB8txJz4/+s9l4sciP1taNWt4aj6NAMeG1quNI6C9EQcd1m/uyTK4cx8BntTO7rPvHvQNoUnHJ82nR1rQst6r6KHtlWm6qnK2tEm8vuj9By09F3Bxb277p6G/oezm0u+n53Ee9X5PD4H7Nv31KjpfhpBx3T0a7W4HnT81+aXaYY3to23jvAfVezrPFhDOK3LFy7Rx42dktLYbuurNC8OO9LtymtPD4EviX33T0N/R5Cm188b6y6z6xtFxN+tsg8PdnbUhhX3VTv8w0e6nJk/XNdTbMtY+inQufc7RB4PczvjEGrO0hSHsC7yF0tT0Ey/vSy86i8z3dmC/ANkTzIVDmVfby5xT8PBe9AfrItYewQLxrZ940G8S2q+js6w/TmK1zinIYzCnymZcs7ATmwl/jLxnkaxzj1vK9EWXjXPzHZjTYl6zf2lzgM2bS8jyiV3TvvoyZothGqLNeVXJLsD0yP3AbeM8wLS8j2HkH7NsIdsEB+3aCXXTAvotgzzpg353Banl8GLf6uzflv2Odti+P8psh+F+6Kcf5k+QXcL9gnZb/z3MN8oJt5Pld4P8ezB28x6utAbVYksBr++/a+ULN52Z9En38sIO/Mwb8af67ZnvxjN+155O8DuNMaZlO+nFuZ7+3hiuqDdXuGKjSXk0+rrwp7D8tbwfzKFk+uF4dtXwaDvlY6zev/zTfrcpd8ljH+/xx1H+WLabPcpatKFeI7YDA/7Objv5q40y7mwd9F5ZT2TtHOR9Ce+co24FfcfDX9OSv7D2jbAe0d5TxenU28+lSffiXN/XDiN5/F+z+rxOMzHvfApjPEozMd18HmM8RjMxzXwaYf5V9ljb09jyjwXnivUl/ncD+VoZDfHuW13b2vTVk0dbj+G6zcLT936/N7wDFe5qWqR1YtPWBtCnVp8d5vAMUbcEK1aHeC9y1c6GZrl4v8ryxlmctz1qetTwVfmp5lsvzqSOSZ0x1whv6jGmR2Aqvqy+AD7aafa6yrkb/k9fVIjf0p/Fuy6tJPy8C/9iMflV/1bXuKPNX+V4qzV914XLRLntfLfvyyBf2/7Xnk7xunGtmlMFMUr29mnwuKPDamGxGg2Oy6ZDP+THKx7Vm9tVdTZ6oI7wuRtktU10MdUxH2/vEccp7LYJ7VoFHfDyu2zCuea9Fi6+iLdLii2gHJb54EuLAAj8HNDR4PgdSdjZP+kmeccWD35nBlsVtn0Hzy3Hjtg/A/PJMj/kF+4Tnl7KzOTy/CPyzHfOL79kc3ziYtjdTNc7L91JptF1ncxY9eS3bz50lXpE/3jOQsfEih+yt+Zsj/s4o/LlwuWhrfhbi7J0dUPiSZ8c4t29ocxfKgOcuV3s1+ZTd9c7x8KJ7xFg+Z8coH9fcruXhuvRH23/R9qi0OxPxflaWzzj1Z9ohnzJbVUU+2p6SJp/eOYRoUD4jOq/rrT9avotLf8rOePLeO8qOc1liqHPtp8g8iPspi8QXfsY5oMp+isA/5JgjBKZRgLPKex9wnmG5lr1LQehXee+DRhttJq/FRYff7rn+dbWnbP3Lc6Rrv0b05m+BL/eep+T4kRfN53xP0l8nsH91JDGhk7U/skR144jv4dh2xaMELtWHn5rQ+N5Jlyevp34axuBve6yniu6WRxmhvUbbwvZa4D/ksFcC0yjAyfbaOr63RO13xffK9sJ5PbXiyWtZvKt3TlTh70IFXC7aNyjwiJPnNeTrhgq4XLQfo8AjTo7BIl/y7KT5uiiDmaR6ezX5XFTgHwMw0vYmwbMdYfncMEb5uHxdbS3pGwdFv6tJ8kHdveCQzzj1Z8khH9+cnLI48VmHfJYd8lkao3xc+uMbq9F8eu3dcs2oeI44bhwd57rnFbRjNtLjVxxHF/jfOkYc/bcL4rjIq7ZPWDU+rMXdEZ/kkKfPfJF4Kbuji/0Ogf8O+EC/Sz6Q5Zm0snMB6XeMzQu9wO8zqHz+V+gvEK/G/PTO/7pi3FHUb3dZ5y3351z2QjsPkY71c9FgnyF/gkt7j6ymX/PU1pP6fp5vwjgf9v08Wu6z77lPjm+h3hed+8QxjDEsLQ85JlxF+128hnLF5dJSFPP5U7BlNzz16LNmk9iWaeeEtTONbMuKzgkXjRfcZ/TdC+E8B20vxIXLlXdfts/AtLV5n3mJouJxr/lJI7p7dE3zk/rGbNIvG9f+WFqqyFLrR23PhtcoOI5d78ZfpDocfzzGUU9Ff3G8aL4KngsVv+P/ByDMS01cKAUA", - "debug_symbols": "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wJ9eQDy9gKfX5Hp6Ta6n1+R+ek3up9fkfnpN7qfX5H56Te6n1+R+ek3up9fkvrkmf0d9H9m2ESQEDYKUICPICQqCkqAiiBQhpAghRQgpQkgRQooQUoSQIoQUIaQIIUUsLtrteKOUE5q+erXVayBUW/sJBUHTV6+kXqfNSrpOqAhqgOaD5SskBA2ClCAjyAkKgkgRSopQUoSRIowUYaQII0UYKcJIEUaKMFKEkSKMFOGkCCdFOCnCSRFOinBShJMinBThpAgnRQQpIkgRQYoIUkSQIoIUEaSIIEUEKSJIEUmKSFJEkiKSFJGkiCRFJCkiSRFJikhSRJEiihRRpIgiRRQpokgRRYooUkSRIooU0aSIJkU0KaJJEU2KaFJEkyKaFNGkiAZF+LYRJAQNgpQgI8gJCoKSoCKIFCGkCCFFCClCSBFCihBShJAihBQhpAghRQxSxCBFDFLEIEUMUsQgRQxSBJlZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZOplZ+mJmqfq6AVjtL9YJOUFBUBJUBPV9FIuZ5QUSggZBSpAR5AQFQUlQEUSKEFKEkCKEFCGkCCFFCClCSBFCilhdXvjVlYKxuPvoBRKCBkFKkBHkBAVBSVARRIpQUoSSIpQUoaQIJUUs7j7a1a+VcNvGCQVBSVAR1AAtfjHpAglBgyAlyAiab5a/vEI6FkPBC9QALYaCF0gIGgQpQUYQuJI95gO0fcjz+oLwPoX5fFfLu98rivmw7WcuYDy9AH16Afb0AvzpBcTTC8inF1BPL6AfXkA+vSbn02tyPr0m59Nrcj69JufTa3I+vSbn02tyPr0m59Nrcj29JtfTa3I9vSbX02tyPb0m19Nrcj29JtfTa3I9vSbX02tyP70m99Nrcj+9JvfTa3I/vSb302tyP70m9801+Tsqgvo+ym0jSAgaBClBRpATFAQlQUUQKUJIEUKKEFKEkCKEFCGk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", + "bytecode": "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", + "debug_symbols": "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EUqKUFKEkiKUFKGkCCVFKClCSRFKijBShJEijBRhpAgjRRgpwkgRRoowUoSRIpwU4aQIJ0U4KcJJEU6KcFKEkyKcFOGkiCBFBCkiSBFBighSRJAighQRpIggRQQpIkkRSYpIUkSSIpIUkaSIJEUkKSJJEUmKKFJEkSKKFFGkiCJFFCmiSBFFiihSRJEimhTRpIgmRTQpokkRTYpoUkSTIpoU0aSIIUUMKWJIEUOKGFLEkCKGFDGkiCFFDCgiycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyycwyFzNLs/etaG1xRElQEdQEDUCLmeUFEoKUICPICSJFNCmiSRFNimhSxJAihhQxpIghRQwpYkgRQ4oYUsSAImoDlyDXJgQpQUaQExQEJUFFUBMELkovIUUIKUJIEUKKEFKEkCIWz7mcnvdGuG16QEVQEzQALZ5zeYGEICXICHKCgiBw+XspuPy9bCNICFKCjCAnKAgC9zbU+QBNq95fEP368fOZmz+REmQEnb56/jr++YlcpQ4oCEqAFhOqed+cPvq5fVn1pxFgFBgDxoEJYBKYAqaBmfsmQQcJOkjQQYIOEnSQoIMEHSToIEEHCToo0EGBDgp0UKCDAh0U6KBABwU6KNBBgQ4adNCggwYdNOigQQcNOmjQweLWW3/vVrxWxtE0MHPfDFg/A9bPgPUzYP0MWD8DttMB2+nc305724ARYBQYA8aBCWASmAKmgQEdCOhAQAcCOhDQgYAOBHQgoAMBHQjoQEAHCjpQ0IGCDhR0oKADBR0o6EBBBwo6UNCBgQ4MdGCgAwMdGOjAQAcGOrD7+29tDcz9/bdefPnJ9+Z0/ZjugyQz+TyxMH8iJygIOl1FZjk76jqgIqgJGoDOx3BXSAhSgowgJygAOh9eyfaaNv1UP37+sNh+OoFOoTPoHLqALqEr6Bq6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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_0.snap index c73fd1a847c..da03d6e94af 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_0.snap @@ -177,10 +177,6 @@ expression: artifact } ] }, - "12442740014039576758": { - "error_kind": "string", - "string": "New HashMap should be empty." - }, "12632160011611521689": { "error_kind": "string", "string": "Got none value." @@ -235,8 +231,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+29C5CsyXUW+Fd1V99+VXf1nZeksUzIsY6FGIddVV39IhxWC907o5FkSZZsZmTJM9Pd1TUPzXvGY0ti16VdL4vBC17YWBZjjHYV8uLH2uxCCIuVHbYBOywjAQJHCAnkkLEBYfkBwgS2IUD/3DpVX331/Vn/33Wyqm7fyuiOqvoz/3NOnjx58uTJk5ml5Eba+PJ/qfd9ufdZgs/NZDhZ3nHvsz5ZajjCqseisXQT0Fi+CWhcugloXL4JaKzcBDSu3AQ0XrkJaFy9CWhcuwloXL8JaNyIQOPLCQfxlOh0sEiVcarsUmWSdta0M6TCljZmyqyNJDtZxe/5ihufa73fZch3VPaNNcLrCf+wfni4JurnSP/uGvA9AvyzNYAZAX79Sg/On+gO4HNdTA5KSax2Oohdz7Mq1S2Buhju5Ti42yXCl1A9E8K/nkSVqUaJ8Bk9zB/7XrUy3QE9Jcpb7o7Ww/Iq3eF6pCnVR3dBOZatMpT7Kvj+7t73uPJ4Q29EbIP6bYE627Mr3aSfjG9L8Mz4anxexfKUtwZ5y91hPOu938uAB2EZHRUq/5re7+3e5wq8Y+/XBP4Vwj9Et3jGfFkT5ddE+XTse1Xvezrm2Vjw+u4AnmOb7hv8a3Hgtwz+9Tjwdw3+vQA/8YNfN/j3xaG/D/8NAH85Avz7e/Bj8OaNQLsj/L6d9aY4vO/Df3Mc+E2D/41dd973Yb/FH3a/T701Dl/2DP7b/Gnvw/4mf9h9Xfl2f9gHBvsdcXjen1N8sz/tpwb7W/xhnxnsP+4Pu22wHwCe+zlXm339+GAc+H3evDMO/HOD/61R4O/29e+7uolz2+72+9O749B+YvC/LQr8Vp83D8WB32/bh6PA3+sY/EeiwN/v8+ckDvz++HoaB35/jD2LA79vd7fjwO+Ps+dx4PfH2k4c+H398Ggc+P3x9rE48I8M/uNx4PfH9CfiwO+PXe+JA78/tj8ZB35ffz4VB35ffz4dBf5BX789Ewd+X789Gwd+X789Fwd+X789Hwd+X7+9EAd+Xz+8GAd+Xz98ew9+EgH2S3Fo7+uG7/CnvQ/7O91hH/Zl/r3usE/68vI+f9h9W/n9/rBPUx9p6mP/3aVhWVHrBLiWYT6l7WR0DQfXVNL/yhhYbyZY+L69a775K5DnOb+39YjVZDSVxLMlUcZoS2H8Qa9AVZSzVKU6lpKBv9ryViBvvfd9W/CC+bQKeZ7+1hLRaesHjNNoK1N5/J706MZnT/c+U1iby4N3EGYCOPFZufdZS0b5auWq4r1Sxqfh4WeMR7VDNRmt66R4kIcoFygb2B4rAMv87xUq/97eZ8rv7R6/1wQORxk6qRINmCxvA3Bz221CHveXKtGMeVuQx8GRmFTfXgE+XV0ewOVylraTUR5eobx1UQ9rT6s/tifyy/Rvhcr/z0Dn36b2RL55rnUz7zEp3q9Q3raol+XViGb7zkm12Sbw4qdytBnLJdKt5NLo5j71FwDvTk8hqD7lZ5O1jlSfsrrFbf/dRh59hvjXBZ9jxDpsEj3MH4x1YN1h79ZEHrdhVeCpCjw1kcfz60lgPeMIq+0I62lHWM86wmo7wjpzhPWAI6wXHWE97wjrEUdYTzjCes4RVtsR1kuOsDzl68QRlifvPfWEJ786jrCecoQ1r/zy1F+3Au/nVU+cO8Ly5L2nbeLJL0+ZeNQRVtsRlie/PG1fT9vkPY6w2o6wPHn/uCOstiOsFxxhWYyQwbM5oM390Z+0QXlWdqd04zPyfLxVFfT3UPdxb0XCXSJ8xmt8hvirgh6je13kTRLb295rNVqdo73Tdmf3vH3QKRF8o5WfYSx6+r8tyiu/gvG6FofXdeMT7tHYBr6maRnytiivAnlGI+7RWCOY3vTn4T/ir4nyGHtcpC1riZYtL1gbF4R1NRnuA6gnIu9ZOq0S7ZiqyajOYr880sx+edY39p2T8uNafVPZvL0ygMvlLKl1RPa9rwhaS1Q271qKlf/K0oDOD5LfF3HMss2WKa8q6uXRZlbfor53bJdNysN1NpQ1rBe2ObbZvd0bnzxe3wNt9qHKMMwVqqM9t3S9B1PJG/uI18bAukawlHxuJ6OyxOu+qHdirPtam2Df2BC0lpNR2UN/fIWe7UE78Lqv4h0+C637sh6KtR7L676bjngQFvfRsshLZee1pQFc7DuVRO/7tP1xrNO+sDSA+cd6MFX8AcsoxgLw+MX69rj3uz5Rah2qPuAIv63sdj/4B/XZ2e3NvTyyifjXk1E9HGMNT9lNas5mvNsWtNZEHsugsum3BZ6ayGN/wSSwnnGE9agTLNWn5oFfqi9OQtcDTnSl6QlHWG1HWE86wuo4wnrWEZaX3KfJUybe4wjrOUdYnjrHsx09eX/iCKvtCMuzjt/qCOtBR1iedfTUOU85wppXuX/REdatMKa95AiL9xWHYqbTxDGdVv5HSjc+487xmwfs9zEciHs7Eu4S4TN+4zPEH7L310XeJOsGJ6edxu5J82ivc9JpnR22i8qGla+J8mouY7zeSaLwuqXWDWrA1zQtQ9425VUgz2hU6wZx1j2arTz8R/yqb74J6jBJP8c+XBSW+frVukFkf17hmG329SteWh62e9E4e6tvUb8xtgGvLeJc3+iu0HsfKQ3w7lSGcS3TO8o3y37lT5LOjrNvabDWuyr4E1eG8q/1Gv6qoMfoXhd5MdZ6N4hWfsY6W8UMhNZ6I62ry7XeKvA1TcuQt0F5qLONRqWz4/jzBmu9If4j/pooz2u9eduyJvDw+swksNYuCMv0v9o3VyI6ERb2NztjajsZ1bdcxytjYL2eYK0E6FodA+sdBAvft3e3k9H683pWpHXTvjyqfXNrgtYylWc9wHuAPgPjCa9nKd7hs9B6lpUL6f08elnhUe1QTUbrOikehGVrVvNm7zCf0d5bpzxl71ge2vDYnziNs4Xy7DmMvG9zLniIeoST4qHHvs2QvkJ9kKVPQnN8K/97oC9+iGJH5qVPXHTf5jzMAbCdsuYAlfIAL+/b5Niw497v+kSptRd3X+jBoToPwBH+gYo/sraJa1PmX7PmeNJI/am/Zq3mDMr+C8W+xo5PXHGEtekEK03trh+sU0dYzzrCajvCOnOE9YAjrBcdYT3pCKvtBEvp1EnoetiJrjQ97wjrEUdYTzjCes4RVtsR1kuOsB50hOXZt08cYXm2o6eO9uRXxxHWU46w5pVfnmPHrcB7T53D+9x47QPnUVcoz8o+1UMQ1x/RPMyz9rEZCXeJ8Bmv8RniV3sxeO2D92kcX5DW5vmXJ2bNs06zU++0OvsHJYJvtPKzPGsfah4TOTa5VXTtY5PyKpA3/bWPwXp1iP+IX8X989pH3rasCTzsy58E1voFYam1D9MTai2D1wUi+Tj76wKhPWBIWzkZ5Smus/B+ihfAx8TrAurMzWXBO7UuwD5TfK+U8Wl4+BnjUe3Ae7I88CAsWxdQPlfW8ZHOERtZs1Rn8SFtZSrP+pLP6vtAQBaKrhGVBD3j9gj9T+VhnLinfUm8y3uErPwvLw1g/qneC0XWELP2WTI+K/+9wLcfrmTjYzmZ9ZmoRluZyuN3rK89+/MBOVHrw/gsJCfsz8f3mHdx1mGbuWNIDP96ElX/N7gtx/FVrS+sEc9xvZPvI1kXeFR8iYL1lCOsZx1hPeAI69wRlie/nnOE9aQjrDNHWJ7t+JgjLE9+PeMIq+0I62lHWJ59u+0Ia15l9XFHWG1HWC84wvLk14uOsNqOsDz1hGcf8uzbnjLxsCOsW6EPveQIy/yu4+Zsn6c5Wz92Jck3Z7Py/w/M2X6tPIw7NA+IM4dq5j5DnH2msecBah4emgeo2NEa5aXp3u6gHOctiWflAKz75xSWZx0X/Frwa8GvBb+mCWvBrwW/FvyaP36pdakVei+0lnQZ1xUbPWN5sa548XXFy7L37LUBWbgZ955VHPEgLJYFjmVIU+Q9OLnP1VyH+mB5/J4ko+dqfmNAFor6K0qCnnH+im9aGsZ50TXm7wN/xTf3vm8LukynbBNs1ANqHOA9XqiTp6QXCt+LWKI8lAn2S1QFj0J7vEqChiX6jbxI+fdjOc5mZv2OdeIxrQ2y+zuB/ViObXDEfpxE0K5iP1T7ZJ0JazTbd06Kzxc9A3tJ0DpDO+hAje+W1D4+lnHseyzj60Qz5vG5EkmSn/e4h7SIjKuxs5QM10u1QZrM1q1Q+fdDn/gS9QnUg45t1lQ6XtXbkuKhlUvp/g85eHiz1ekHVy5fnd535fLV6RNr4+u0kYzaK+VE2yscl6tsKoRdJrrUWSGoxzgmFvUf2wIKN65V8JlXGwVpVbG9ykZVNhSfAc66+rj3uz5ZcrsPAccoZSetUR6ebVDUhjJeFD3nYV54yDYQ8pBtoHnhIfdvg8v9m881KAsa1TwH5+6z0Bts6ym9oXwgPH9CmNYfTP7i7Jeon7OsYFKywvJXgzyep+JZIsgTTkrGrL5Fz6VQd4arfmR0c5z4p3rERF6D31fzT6tP3DZv7pcIX5Lo9f8q8Q/pMbrXRd4k+6kOD9udznl7r7F3tts8bRyVCL7Rys+4z6p9eSqWwHgd6azVXbWfCs9LSdMy5FUprwJ5RqPaTxVpP9huHv4j/pooz7ZQ3rasCTyoR4rAsj1QSm/zOIKw8o5P9q6KGypq16p1m9D4pMYz5BPbtaEzlRTukF3rPZauEa1om/B5rfPiG2S7Nu+9bTyWevkGZ2GT2f4ma5s4Z7AWP0crZPfyfmG0ZTzPljNeFG0bdYZk3raxd/F+KuPFcndQzqttDg5vrK+8TGsPvq07cFqGfCz/+73CqA/scxKbonNw0ujsnnRO9k7a7dbZyVWCnwDv0n6dttPvkh2I9pGjPLfUWm8i6LOk5MuepXS/oyfEeWxl5C/PHVU/V35ugxF5raC/dmd04tod40ySwdpdRdQxSQZ2f98X3wOi1u6Q50viWWjtzsqlcuUt1ycHu4dnzdbZwene7snu/li5dsd/dtI+OG+ct472znfrp/tF+lVoD6k6x5btCDXnR315rXvjM7L/JrgfdV3Qw/tNX02yZmPSUqJjBgwO21OIV9kfPM99Ncj7h2rDvIpjVzUO2WasiDoifo61eA3Q/ENTobm4Lcj7fPPagjz/xjTO3vvhAjof+cxnxau9CCUBK0/sh7oPVsWYYPzC11FfUPdo4rt27jWvZe8uD2A2e9/Tuiq9wnfLW97fAhj7ve/q/RJ9t3YpC5qHxptkVHamFfek1s1H4pqoLfp+jETPMSvEBxVjUw3g3SS8qJe4Lkmiecu+AavnSkb5daLByr8eaPgs0bAm+IB05fE1rxakeTUHzW8QNEeWscPQmIXjLa+dmRxgH9kMlGfdzvCrVF6NL+jXYL1h5d8KPPxchuyVM2Be6w6XV34OtE8mXe9DnvCZsCEfS5ry+ONCtCrfKrYBr3kgfVvJeNyh/rRdkNaaKI8+gCrRivTVCtJ6vTsed4jWHVG+FqAV62HvxozpRblTfphJ8aAMZflmPPAgT/ns8i1HPChLvBa144gHYZmtZfNfnJOtEU58tipoxfd53vIdYB89vzwMl+13FYvH8L4d4H1gObt+b+wWK6f0pfFS6Sfuk0rfoK5mXWr8Wkn02Mbn4Vv5/16M38qfYPWoCXq3AfcHlrPrv0M0WN53QxuY/Rt5TthQ/cFSNRmVYZ5D3QZ5vF55O+TVKO8OyGMdcCfVFfPugryisY3Y1z6fY852UdlV4wPHY6NO53EF9XCN8rJ0Z5pwjdNojulzTveyp7z8beAl6/AK4M0aY9V5rdyfsTyuBdj4X0tGZRV1PvNna4b8WQvwJ7SWqPij9KOy/WtJtkyW6DfCQlsW1zteLtMdvD9LeRvaH9QdrtM4WzyPbY3zAOORsjF4HqTWcpHHIX4ajbPg59Deu+5wnYrOq5TNru6TUzZojfJwHOZ2QLyblIe+MLRf/laGvwtpRX8Xr/dVBD3oR/P29x82T+udTuuk3mmc19sH9SL+fuX7K2V8Wv2zYKv9ZexjjOXLvL974zNufFjxvTElykMZ570bk+yNsfoW9Tujrg/tZ5u0rRAWywSusaLf+VMZ+zbRf4Tvsv/Iyn8a7OdfJvsb62Nyq/bNmayhvxplrJxo3FuVAe7PZtSnnOg1U/s+D2tlSA/PT/5FgbUyriP2iay1Msa7QXiVT1qNsWqvI9tXKxnls9a+/lXAJ70q+IB05Ykvu1KQ5is5aP5iwCcdScYOua2z1itYd5ocYB/ZCJRnvc/w2SeLPGJZTRPrFCv/pYBPWq01hdaKY8fqqbXFEG6UQ/ajbBakVdl56uz8bUFf1vpBFq3cn6oFaR3nP2daQ/7zcbRe706X1jVBaznJlh3EtSZoUPG63EeuwNi3RffJ8zu8FoZ5/fPuBDxlc5otz3YitpmyS3AOYPBZrySJtj14DqDGGrRp3GN+Oq3zg+bRyW670zlrHh1dJOaH14oxD3nIMfrzYmtzrFze+I95sLWnNf/KsrW/muRdnVERsrWt/B+BPvqHe9/RZlZnSjCMvwIwvibH3QbcR292e3qP2mJa9rThnaU9fQQ03Cz29DcImhf2dDF7+jrwMIY9rfaYMQ+x/Czt6RCtnvb05hhauT/l3btn5dUaBNrJm0Qr0rddkNbr3fG4Q7SOi0dhWlU8SkwfJ8od2zAeeFScF+/N8cCjYnxix6zwfEetldpvLp+Id3juYuXPwW75Kw7znccEvLg2d6Ou4noshfZcqZgAjhXCmACOu8GYAGw7TuPs8crOAC6XsxS6T03pTV6/V/sBQ+d9KH/BNuVl9Ys04fqf0TyL9T/kaQXwZulPtd/Xyo+LqeP1P5S5UHxDdYb8WQ3wR9mi6sxJ1kFYXtl1ar2Z50hqL6mKO503efOMhwjFiCKPQjGPpWS03ZRtMa/xEEhjHn6G7CVljymfoLIv2LZTcwwVX8J9yeZpXIbPUrTyfwnmGFs7w/ShncGyUA7US/kdcbwO9cG8/kPcz21+Gm//4dlhp7m/e3Z0cHTQPNkdH0Pg7r9snO8enXUajS9jb58etKaNv7O3t3u43+i0mofNVvu0PW38jWb77OS00WqdtdrN092zeYzhYFlG/1KZ+JAko369vwH27M/l8N/nuc800nkGddZNWFe1T62cjOqyIXuAnv1t0EUx7zPF9Q309/50Dn8vvpvl7/270KY/K9o3FGdR5IzBa91hetUYrOQ5j/2F+FUcLsf55h3/Q2NriFaPc83y0so+Hu/zEJlWrEdRu+p6d7q0huZyKDsVwMcw2RfEsp6Id7Lib5Udwn0Xy38G+uNvTsV/UPzcxCXKQ7s7dEY3yjyncT6CIufWKRlQ63kGi/Xjv4Y2+JeBMc/GWGyrJNHtq84jZLy/CXh/oyDe0DiEOjnvGUQ/HclmPd87P9k/PGmcdk7bB/tnR9O22fY6p/WDZnP/4LzTOf2yAXuR82sincuyp2zCRNBnSfUZPG/9D8DWzIIVkoNqMtzfUXbVWewcY4CxCTHsPGXTVgQvysmoXhiaVzO83hdl5+H8T80Js2JolW7E90oZn4aHnzEe1Q4xY4JZLrLaA2XUbFnm9zbwe5v2yi0RvuPe7/pkaV/5VyypsYLbTsURKx/Y27rDeWhXfnN3AIOT6tv2LO/ZZ5eFh9/YHc5DHv7x7gAGpwUPB8lkTfHQZDQWDw0nPsN57desDN5B+DivxXd5Xmvl/9jKAObX9b7nuWsH25bnH/Y7S6e9mWix8i3QaTs9v+Us7QdlG5co74qol1onsf6YV17QJilixxe1SUrJcL3UmJgms58rVP510Ga399oM4+CWRJ3sfZxPKpm91h0ur/anIe9YDtU8G+vN+2BUDEIIt9obZ+XXCtI67gxdtiHVmTwh3EhrHl9IiNZx/gWOIwr5QsbRer07HneI1nFxREyriiOqCjyljM8kyWcTYhnup2uOeFCGphVXwzG/seJdNqBM+ntL5NlvLp+Id9j/YOXPYIz8yyvDcEN+cT5bn2Nj0H55V3c4z8r+ZcD9aO/7WjKqrxzHxMJ3MrBvS8U3qJga9jOhXwHbmZMaL40XRWNjkIds4yg7kfW11R/Lpynr/p2stdysuKmXYHy1tVxF3xLRjn2JdZyKax2n/9KE6/vGt1ms7w/dgQl4x+n7NBXdX2RjkYo/QX3K/ME7kKbNn0qAP8rXWQnwJ7RWgXaJutuVfR1LAlbe8yCMxnmLJ7kS4E+aitqkxiPFT16fqwhYyOMQP2fZf5HGPPz0sPEVP/lsGJ5jYp7aE4j2QEjGcdzhtYSSwInze+VLj+RXcT8LvogvHfnA+9vUnPYynwX/YwFfupIv1T9CZ8HHns+UCE/JEQ++x2sn7Gc/7v2uT5YK+4iYz1cCvFE+IjUPfEt3AIOT6ofGi6I+25udh7x2gDx8e3cAg9OCh4PEfm/kYdG1g6I8VGfShOY2rPMjzYkL32Wdta7A9HMaN7e9K8fcVo2p7PvBsQhjtVlOHHl4qGSNaWYbF/PUHvi8PMQ7kL7q6gAul2N6UJ6YT5HW6gvLWsh/+N7uoBwnxSerUwr/oQJ8UrIWOm8hcn/t22jGQ7TR1N78cjIq+0PnANKz3wnYaGpepubYyqapEH/m5cwJ1mdqX19eGcMYtf+ugIyhHLGPGdttXu/p43mNupslLw/xLN8i+kzNfyPr/cKyxmMV+vLf1x2U4zRO7z80oaypmOkp9dfgWRuror7lZFT2h/aZ0bOdKwM+beY4F1Sdecpxl1gu8jkRheNxWZ9ViS77zknJGN5H/r23DeByOaYH5YjXQrDdDFZk/09hfcZnoat11bw8RL/R3719AJfLMT0qtnze9FnW2Jmm93cH5TiN02e33zGAy+WYHpQZ1mdqrjWtfUdKn6l794rqs2ZAn2Fcy5J4FvJt5YkTjWx3tEqEL0lGdRbiX090Ox/70NPgthzHV9VHeB886iCMneK8JfGsHID1NkdY5ieZt7GtRHk4tqEMcBo3tu0W0DdqjZn76P3QR990x/D7JQE/sn8td78y/OtEa6x+pfQV0hjyNWXFA6UJfcpZ/VedNaBgvd0RlvkYb6b5m5IdrD8mrFPRfqXsHY6jfQj61Vtm368OLku/qgha1V4zHq+K+oMw7y2OsN7mCOvtjrC+2REW645IPtrCcwBei+H9y0mSX3egj/abLqg7+B5Py3sv6I4XerAXe/qG2zD9fivs6ftTgTnUYk/foAzPmSP5Z+Zi71jROAT069xKe8dCexiLxiHcqjwM7b+LvYcxtH8pz1nx8zJnYbsD5yxIP6dxc5aL+rn5zFWUBY5FV+PttNaNlV9SxdYU9Ut+LDCmFo3tU3HDVfHepGNdqB1m4fPKK6/ou3oHxCBnwbrouoza58Z84j553PtdnzCViE6UV3XeeTkZ1QND+yno2ScD8lrUdxq6F4L3SqlPw8PPsny0iJP1nwcetd6l/Cz3dW98pvrj01cG76T/Zqfn3bdt5f+/tQHMz/ZghvZmq1gcXgdScTHTWtc2WrLWtXmf3bqoB/LJnv2LgPyqvTCh8+cqgh417+A9B2quME5OvkBysgT1yyMnVv5dICdfDMgJ2zbK1zVv6xzMS1znKBofiGNFkRjL0LlZKL+8hh9pPDhTeo5pRj6xj0Ptb8vLQ6tT0ZgklCfm07yc3xba0/zt3UE5TuPi3x66YCxq6Jw+3NsVsb/2dbe6h0fFc5WTUdlH/vPe1+rqgE+bGXeKJsnoeGG40hS6X2It0Trl2Ic/bSUrllR/Y32Ge6yL6jOrU9EYS5SjLcrDdjPajIccP3Xc+12fLBXei86xg7gXHennpHhodSqqz9QZ4JH1fmFZ47EK7z75ju6gHKdxev+hCWVN7UOfUn/t6zOjPeteMT53AmUf612hZ18b0GfqDBZ8xvosFMeL7x378KbD/dwPdrOh+niJ6sTnTfjgzh/zYfjXE623j33o6a9Nh+6UShP7TWuC1hrlpembuoNynLcknpUzYHEfnRQW231x2tv33h+UAU5KT1qdisZ8oH4x2tYEDen/ce93faLUOlDjAvdJbD+/Nmoe5u2Thn89iaojGiH5Rv5wn9wRtIbu+SlRHuLZEXhqIu+prh+sZx1hPeAI6zFHWE86wjp1hOXZjk/PKay2IyxP3t8Kcu9Zx7YjLE/5esQRlie/PNvRU0946kJPufes47kjLM86Pu4Iq+0I6wVHWM84wnq3IyzPdnzREdZCJorBeqkHi/0uf7PnLFFzJsd5y5maW5aSYdw7kXCXCJ/xD58h/tAcZV3kTXJ/SLPRrO/Vz09Pzs93d/f3T4q2tZW/Ksqr+Zfx+rY4vD4wucLz9K4CX9O0DHk7lFeBPKPx5XVHov9qJPrz8B/xq77G55t6tKVae4/blvXdm7st67tF2/JqMtzXUR9ybF3iRmdzN57/uLXwHw9SVP9x+t3T57viCGtK8RUd5Re1pHjJ65HYJ4v6j3GdrYj/GPlstPFej1+CtSnbMzhva5ae6+PIyyKxzMhLXh/HNTm+9x51AsdnxN4fpOIzGGeaisZnfCawnok8XxLPQvEZ3M74XinjM0lG9a7Co9pBxT9OO35XrTmr+zWLrjn/eqCNisY/qvuAq+K9SdtItQPHZnvgUXffjovL/O3VwTvYj4rG774W4jL/XQ+muneJ43dD8qv69LT2S8Q6Z+/3A/JbdJ/wkqCn6Nnf1jbzdgYk68w1QXNJwFJjI+4vLjI2Ip/Y7kH+8jmaS1SP497v+mTJ9cxWpJ+T4qE9K3qeFbYVxz3NC59KlIf7nb6zOyjHaRyfbr/gXnY+b1Tpz8g87OtBkxN19x3SVk5G5Qr3QVfo2avXBnxiPcjjHj9jPRjSZ/jesQtvGud8XoAf7NY+62FH2E0+A80P9mGT+5W1B7ZFpD2kuc9j4fPDIsXiB88PUzHdat9A6Pywb+kOynHekngW2k9WSuYT1rIjrIojLJ5HRTozxPU846L7XvCskSLnsWD783kslvcNoPfxPJbQPq0S1UPNTfBdvnPu9TA3ebD3PTTHYHzlRI9Db+4Ol1dyFbqLSsVIq30m6p4z9lsq3Khrsu5vy0vruDsyee+l2gefEJ5yMirjdlZHQnnlZLROVjby3qrCZxSwL0Gdi61iYfk8ti3Bh7x9GPdk5TkfAvtGKRmVByX/obufKgD3t8kfgP1s0jt01b4p5ZfL008Qv/Kh8VincIfu0PW+l5b1Q+he2nH9nXVZtSCt4+4d3CBakb6tgrRe747HHaI1tJakaMV62LvT8uWyfvHAo/R2aM3xonjy7s+aFA+um1ShTCnRa2r2m8sn4h2+Q9fK/wmwKX5ibRgu+7axH9s5SnH3fhXfF8L+Nlzf5zNuMHaB14xuhzzuK3dAHsvdncko/7DNLamxDveGfj7HuSh57spVtrXSXUuUh/LKegT7He8PzNIxaZqXey5RN1QA7zidmibWwaG9J6jv1do46hLmD8Z+TJs/nvfUqrFf7flWZ7fwPEatXaq5geInnpuSpuXuMJ7j3vP6RKn4PbWrAf6kKQ8/1XqD4ifPtS7jPbVF7Whloyk7WtkcVcq7yD21P0FzFSXjqPPz3lP7BTpTJuSPQNsgjz/Cyn8EbIePF/BHoF2Rxx9RdI6vbH41r1Vz/GoyHjf2T54bVQvSWnS+oeJcEsKjfAx2PmhkH0Ph2CG2n3DsZFu7Juoa2htcEjR4+Rg+HsnH8Gk4F+tmvV/6pQv6WrlNsa/cCvdLfzawlqjGBTWu1ZLscSH2XL9EeEqOePA9Xjsuw3vHvc/6RKl5EjmOpPBZvdyGedf9bY0ttNaSt49j/MmP5+jjIVtAjWcl+h6KXUqT6VSOTfpSjwGxz0hE30JCuCLjLryuxrp1Q/CR/fxpwjVaTuPG0m+5cwCXyzGtyj+t+gHfrWLv/RewRa+s6zLl3vPY44SSCz5Lf5nqoe5W41iTFaI/Vnyyoh9tlCtERzkOHUG7pJpk6xYlU6wjMXakqIxbfVMZ/2s5ZFzd58e6TsUn4bh2X/fGJ8vE7XMgEws5mL0cvGYO5SDxw9uY5d02So5YxlB/s4zliWVNk8UB5JU/jG8pYo/xWjV+D81t0nRfd7g8ymuSjPLw3l55ltcGyWusOHglr7zP57LI1EXkpoje8pAbnvN+w0IOLoVuiRdLXG9dlrm4+WDV/KzoPoaic/HLIONp4vubkL94hianeRk/r3dvfLIefHihB91khPsZykjRO77mSUaeWsjILWUz2Tooy8H75kAO1JzcysUdrxt7JcKXJKNrCIh/PYkqsw1uT6OH+cP2mdqHy3ut02RzqJLIC8WMKFj3zykszzou+LXg14JfC35NE5bVUa2LL9N7OG6ZX4T3tDqPUYfKTrbEdjLSzHNVpFmtJRa1r62+RdcL0bbgM0LUWqLib/p/3Ptdnyg1m2yj/bc9pqS0fCTgm/ejYfdA2YOOdWwoGWKbL87e6Ebu89wuy97oh7qDcpy3JJ6VA7CecoT1gCOs5x1hPeII6wlHWM85wmo7wvJsx3NHWJ6y+rQjLE9+Pe4Iq+0I6wVHWF78UuPlJLDYjxVpLD5SawpTGivPLzpWRvIjBcdKZV8XHSv5bHePczHmrZ8/5gjrSUdYZ06wvHn/7jml6xknutL0rCMsz7FyXmW14wTLWyYe7M4nXZ52cNsR1jzKRJo8++OjTrDmVa+m6VudYKXfvWzENL1EdKl1HTXHt/J57ZxNgP3s848//WJCiQNe39jVhN2WQcCr6X1zUqpFuxJ8x9+3jcl/tYCVVnav5wCbt40Q7NhE5yU7NnEjRFHH5kU3QqAgr1MeGui8EcLea02H78HNL6r940x2ih9qxe2PbYzBrZxUG1udXj74/64BXC7H9Kh2VEEKRps6OI0nsijjnu1cIjoxWEFN0MrJKM9Dh9Vf631Rmx6VIsVnWQsyWE7JX8mNP822OojeD/7uuZLTEtWtCs8dHQmNEuGzdsBniH+daHWWxb4jQW2yR/6wI2FL0MqHO6WJHQlqc746DEbBetwRVtsR1guOsF5yhPWAEyzV1yeBteEEy7OOafKU1ecdYT3iCOsJR1jPOcJqO8KyPqTsWNbzcS47ya/nDf96MtrPYuh5dfiKGv/50BF8t0Z5aeK+o8aTqsBTE3h4cn1RWGl63ImuND3mCOtJR1hnTrC8ef/uOaXrvOsHy1Mm2o6wnnCENa/yZXp+W8DmucqsL7W6AvVhnmCd+DDR/yMwl7sieHclwLs1QY/aHGBz9nTu9wMbGicebIbvvrU7XA8r/7W1Acy/ujGMO7SgGyl4bz/v+Gz4p7Wgq9o0tKC7KmitUV6aODBTHeqnHLC3OiylW9hPFMsfaPUwn9CyqIfSLehDQh9ehZ79TUfdsiLoqYr3ShmfhoefMZ5pX8yXJtOH6gBg833OyzizDvUpMs78XEAWii78LAt6xo0zP0/jjLrQIzTOWPmrMM78Yg+mOpTS5CjUv/OMT3F8xHv1vOOT4Z/W+KRkITQ+KdmsUV6avq07KMd5S+JZOQDrPY6wnnKE9ZwjrCcdYT3rCOsBR1ievD93hOVZx+cdYT3iCOsJR1iPOcI6c4Tl2Y5tR1ievPeky1OvetI1r7rwGUdYnrLqSdejjrDmdaz17I/zqr8829FzHPIcH9uOsDx5f+IIqz2nsDx1tCfvX3SE5alX246wPPXXuSOshx1hzavN5Cn3LznC8uxDnjaT51xhXu1VTz3xoCOseR3TPG25efV1dBxhedrR88ovz3H7cUdYbUdYLzjC8tQ5i3F7duP2OwmWWhvE9TZbY+G1vz/ZC+6Nu261t8txZIYDcW9Fwl0ifMZvfIb4Q7HN6yJveQJa987O9/bPjzqnu839dn2vXSL4Ris/KwP+9F9drqnWY4zXtSQGr1sd4xNeaMiXlS5D3hblVSDPaEzX6+4i+rcj0Z+H/4hfxZ3yJXuTxLDe5wQL9UFRWFeT4T6AekJdNsQX9USK3ann0X1IW9G4iO/t6Ua1Fl70QLNVQY/i3SbxbtYxJRfl3f/myLvNnLzjWL9Z79ti3uHYuiF4Z89+wJF3al/buBiMD25qnHljMPptBDEYH9ocxr2I9VvE+s0rrMsc6/eTAd2yiPUbJNOH8xDrZ+Nf3lg/HC9x72aFnv18QBamEev3cRpnLhrr96XtAcxP9GCqCzKLxPPFGYP2mrfaGMTxfJPo5/c4wnrKEdZzjrCedIT1rCOsBxxhefL+3BGWZx2fd4T1iCOsJxxhPeYI68wRlmc7th1hefLeky5PvepJ17zqwmccYXnKqiddjzrCmtex1rM/zqv+8mxHz3HIc3xsO8Ly5P2JI6z2nMLy1NGevH/REZanXm07wvLUX+eOsB52hDWvNpOn3L/kCMuzD3naTJ5zhXm1Vz31xIOOsOZ1TPO05ebV19FxhOVpR88rvzzH7VvBB+PZh9qOsDx14cKemJ09wXGG5uvHtSi1vsPn/vwvveChuOune3vqzOJSMow7Uoxj7stzDX/obIR1kTdJnOHhSeu81ai3Oyed09Zee69E8I1WfsZxhpuifCjOsBqH1w0VZ7gJfE3TMuRtUF4F8uxZKpMcZxjnvN29Rh7+I34VA/zm7qBckbZUsO5zgoX6oCgsizPEtXbTE2o9l+O9Iq2R1kO6T100Xaby+D1JRnXjX+gJYFpXXodXFyRUBO9UvJeVMz2DdxPgOvxfrGqcuA6P7/I6vJX/HViH//4eTNVuphNVDF+JaI4VR8K8WXXEg2Mbxw1FihU5U2eZJ1THaqD+W4LmkoC1RL+xTmm9i5zVj7JapTzUAUbbPOgAFfMZ0gF5Yz7/3ynpAHxvUjkPtUOkc+rbah9JImjlemAZoy3l9Ut33PheVF55rwi2s+0N2Ba8YD7FsY8G8mp0orxWBS/KyagewL0AFXr2dwLyqmxEdYeAkle04fi9SeVVtQO3rQcerA/b+llj8CdoDFYx16Ex2Mr/ExiD/2FgDGa7Su1BuMx3o3w6IL8ed6OEYleVnWBtM0v9GbIFLG9b0HwRvXtRO6GI3p2lnaBidkN2Qt6Y3d+4ZHZCpPHvnGU5EfVJRD2wDPoFLmonbFMetnNve0xfXpEXzKc4e2MH8mp0oryq/a/lZFQP4N7TCj37zwF5LXrme2i+oPYVX1ReVTvEthPY7smyE65sDd6ZxE74KNgJ6z2YRe2EKuVdRjvhao8382onoJ4+7n02DnebzYPdo4P60WG73mi1z5qHzWb7tFU/q5+cNc+PWo2jTqvZ2j1rn50etg5PGp165+TsqHP4Mksb42TwlU4yeAoy+BU9mONwfyXhvqivaglwv6YHc43ed5bVPTW2JoCLkxqTjLZUJh5+xY3vecYk1FFs06Gu4vOwkRcGg2UvVp82OtVaE9JWTkb7F65JsNx9baBPo+woeeI+XRL0KBmedKxQ7cBt64EH37PykfflHiofbCJo5XpgGaOtaL9AnvBYj/JkY8l2Bi+SZHp7Q43OvHtD10Qd01ShZ68P9Iuie0OVTont018iPEuOeLAM2zYoJ5Os0VJq3iz3+yqdhDZ0mfImWWvAe4H/XI5+rnjo2EatyPbtKbcDJtUO3EbYDtxGODd+S3c4D+d3yDtOqo2MF0XbaF54yPqKfRSYN288nBddwTxkfybmzYuu2CYasD+F7OFt+o31V/PmaYxTabq3O0yril/A+uA8Dsu/v9cIaf6f3srG98bujU/lR+C4oNhnQq2Kuqr1/zKVx+/IC3v2PwRspKL+17KgZ9z8908WnP9e6w7Xw8r/OWjT7xHtq2R6KRmGZXl/lubPZXrnuPe7PmG6CnATwrUheFIewxOWlQTKl+EZx8Apv4/y0YTuowzhRpl5U3e4/HpBWlXsVSi+Sq1d5qU1TzxaiFa1brwRoBXrsVmQ1uvd6dJaEbSq+8iWAB/D5DUZlvUkyR6HeQwoC1pZn2D5D4OO+AXy1cWYz6XJxq+YMVppekP3xue8rb2WKA/tSfbh1SCvqK2J67KveOUALpdjWlHOeF02RtxGmlgmss4W+iiNk/2430Trg2vdQT6W/zjI/ccC6yShewRXk2HY9t7PAeyfCdhV90K9fiFj/F/u/bNevJKB+xcA99+bEHeS6HHWxi62afBdtGnUOugm0d+XSzzzKaOtcfyvCNxxz5INx2CpOAqOsfplqtdO7/lSomO5OO66JvDuBPDWCG8qtx+qDcNUZ8YiXvY3WD1XMspvEQ1W/p8CDZ8lGqrJKB+Knr+7UZDmjRw0f07QHFnGWtzWiieMH+UA+0gtUJ59IAx/h8ojj1hW03Stmwzx0Mr/OvDwcxmyVx4Dk9sxgfJqnGEeYnnkA8chI09qyXjcKIds1+8UpPWqKI9twLFQSN/VgrRyf7pakNbbRPmrAVqxHrcVpPV6d7q0bglaVYwM0qjkORHvoM2C5X8Pxm5kiHpH2YU8lv4nAU/Z4+bfUXEJ1mbKZrP3ED7rlTSF5r9s7+G7aO+F9psYTjyX+aL+AeXXsfLj/AN8hnVR/wCubefxD4Ro9fQPjLsTmvXIZkFalazgXI3XaENj/DhaWY+Mk1OmVdkc1QCtWA+eS8WKxWQf/bojHhV7FTtWj2PttxzxoJ7nPRPbIs9+c/lEvMNzNCv/38Ac52HS8/wO6pz7u8P0rYn3QrA2ArA2MmCV6BnWVekM9i89DHW9p/c98lpBh/0qmJRfhX30aKfwmcdoM3CsKto0KFecxsW5VHYGcLmcpVC8itLpJfrO+xVZ1nj8MdldATxYhm0QK/9Htwf12trJpo9966jPWKeiDuJY1Sx9mybcU25868fcQJ6fLDb20nr/dm1AB+vJCuAdN76kicejkN2MY18tGdVPqL+ZP9UZ8mclwJ+851mXklGZVuuFq8QfJZMl+o2w0I5Dm/blMt3B+xhblKZlyIvNz6E96t3hOq0G+JOmi66RKX6uEyx150nWHOHlMt3B+7Psv0hjHn56zClCewtULBu3A+p/0/1of4Rk/CK+36+keZu6U4J5kHfepuY2IR0wbk3P8OdZf1S4Q+NmtSCt4+YXfD+XGu9CuJFWnrdtF6R1nF+Nx2akr1aQ1uvd8bhDtCo/XC1AK9bD3lXjUynj0/Dws9DeEbY1Y82neE9SzREP8pTnuzuOeJRP1OYyyq9nv7l8It6xduB1gP8R5jIfoXkb39WCss7rUnH2/DWaPEfBpOYovNZ8O+Tx3OYOyKtR3p2Qx33lLshjuXuF4B+2uSU1XzIepmPl52F85nKWlG7ntV3UpewfUzZ1nr1zai1hnI5JE9o6RvMsbB3UDRXAO06npqno2gbvncM+GZrL1WbIn7UAf5QvUu0jDI39KK8bxJ+sGFr8jbDQdgnZ1rhHOU3LkBebn0N3nHWH6xTyaacpDz/R7mPbWu2LLiWj7Rby189b/w3NpYva0cpGU3a0sjm2KS/vvlj0O32E5ipKxvPOVVYA7isDcxWkhW2DpQDcCpX/KbAd/tF2Nr5KBr6suVGetZei8428ay8831C4sX/y3GirIK3jfF0cf4m6k+1AXCvkvvCN3Rufkc92C55loWID2SZTa8DKh812nrJ1S4IGZXfhmXA/nuPsDJR37357ZQr99tPQb38zYr/19hMU6bcK9zT7LdvMefptIupVzsgrJ6N14j4eaY9a4dhgniNl+eu5/3Mf38ngESfVx3GPWt4+/puR+jifn+bln+SzUU1fqNjSNF3rDpffGENHzD0QCjf6nfPolhCtnj7IcbRe706X1lVBq1oD5z0JLCOJeIf9RlZ+qddRU7nbpPjRSGcKFNY7HDOSd08Ctj0npVusvunnG3PsSUCecTsYDu6rodiyVYDL9xQXWY9iuKizPphx/3Es3TJuXhbSLTzPHddf89gCIVrH2QLcX9Uc8qK6JTatq4LW2Lrlq0C33DMd3VJ43sK6Ja/dgm3PyUu33BNJt/z8xjBcjMVaCrzL8VMNaN+31XSZ3dqg3g+9UuPN0j159nZO4hNiH3tR3YOxCNNeW0UfFe8RUHc5RD77MvfZzzzvyXv28+tAjngPfNF7IzYFPYp383YeJvMO9di24J09u9+Rd6FYbAVLncEdGsNCaxC1nOVTnKZHnn3+8adfTCjxoV+2WYArUqNyppCsLAcvc/DINsHhitQy6MjadFyi58wUE0xO497NCztNqOxZkSdJ8YHpCsD9gR7j0/r/7tLwO0xfmuIe/tBslAif1Q+fIf51otVZUfQv8CkLfiONll9NhmUC381zeMuSwLMk8ChY988pLM86Lvi14NeCXwt+TRPWgl8Lfi34NX/8sgkkT1rStEbv2ffj3u/6hMlwmcNwWdQDaStTefyepgo9+6uBCaSyRcsB3pUEPVXx3n3dG5/plIADAYy2497vesG039pvHB6eHJ7tn3WOWmenfMgb0h0D//lR+2D37PDgtHl+dtA6aIzDj/Oh2AehR94AuWsyEFrQQPy8WGr56tNgcZ7hWk9G5d6xbo1Q3UIHuoeCNRSslYKwIl9A1G/T0AI44lcbKZenQ2v0i1U/FtCVRQ/rVAECVfFekf6g8KgDzdQGvUnxIA+5vSP1yeBB/xworfisgvItj4Pv7DunJfqN9U3pOsmxILQt8PDG5GVB6ywvUlD8XaK8dcGTvDzEjekvFThEEPXOGsDP6nNGt7KpQpd3cNmlZNSfieVj2BqtvZODs5ODRuOo1ThvNfambeuc7e2fnn2ZiPp5I/3ZLGLrqMUu4xXbk2niw4LQFudNp9guHOSt+pEas0qUh+NHOcmuw1JGHRSd5QCdS4JOrkOabI6ykcBBc91BPm4ISNOV3u9lwIHljaYKlf8SLAj/Lm18qgh8abnlnexyRceb5e7ws7XuaPml7mh5w73eHaXR8jYgr0J4Nnu/kV8Iy+ioUPkSHDqRplV4x96vCfyrhH+IbvEMZYhhLYlnVj5tn9/vEdAP8gDc3rbzyzgJPj5j2kx2svTGzdhXTYfF0MXNw8P9o+ZpvXXQPuu0W7vTHgvq7Vbj6PD87Mt/53u7zca08bcPW636SXvvrNU8PN873y8yFoXmoZHn5Ed59B/in9Y8d1zAM/t31PyK561pYv/cRefAC1iXD9Zl9h3s9sazm9F3gDgn9dmF6pMm81Go8Zp1cqRA0+gX470uIAtFL8YrCXo4NiRNxtdUlq/vDOPETWhqjeQd3eF69IPOrw5gvoEOWVNjl/Jz5JGruGPwXv1WG4O/rTsoN6nufo8jrKccYT3nCOtJR1jPOsJ6wBGWJ+/PHWF51vF5R1iPOMJ6whHWY46wzhxhebZj2xGWJ+896fLUq550zasufMYRlqesetL1qCOseR1rPfvjvOovz3b0HIc8x8e2IyxP3p84wmrPKSxPHe3J+xcdYXnq1bYjLE/9de4I62FHWPNqM3nK/UuOsDz7kKfN5DlXmFd71VNPPOgIa17HNE9bbl59HR1HWJ529Lzyy3PcftwRVtsR1guOsDx1zmLcnt24/U6ChZfj8jpJKRmOncLyld46Sdw1zL3dUFxv3DWzvd0S4TN+4zPEXxX0GN3rIm+S2JC9s/O9/fOjzuluc79d32uXCL7Rys8w5qeU6MN41XpM3MP9Wh2LW1OHJ1veMuStUl4F8vDQvbuI/rVI9OfhP+KvifJ8gEzetqwJPNzOk8BauiCsq8lwH0A9sZGM6rNyMqqD0nStOx5/SeAPyfgsL5sM0ep52eQ4Wq93p0vriqC1nGS3B+JaETQoPcvr+XfCev4fmsqYVT/hvQKY1F4MjnfBA384lgAPJ8K257REv7G+Kd9uf9UALpezhDzjdjAc3Ff57JQlgT/9vA7xInMQs9jKO9YvYhanA+syx821en1qETeXXZ803dcdlGcdb7DQZuK5ipV/LfD7oVcO074k8KVt/DrSe2XCze/aWFqh8vfC+HOt9z0UT6bsoiTJNx6HLnREetXef943pOQ8tL+JbQ7kE9LFfLLyb4E2+sM0Nk3/8sd6S10AgvZUpTtc75CNmSZuq9CFNsizGpUvCVhlASt02COOw1xe9SMr/05oo8/WhulTB3AqHZWH9rz2RBnq8TqgjffV8PwlTZH38dZZn+MYovZblpNRPg5djknPzgNjCPJP8ZR1bknQo/RjKeMzSfLp9lA7MA3Hvd/1ydKeGgsTquNKoP7Yj2x8UPrgzZSHfRllnpOy061cCv+eHHa6Gk9Cup55v0TvHfd+1ydMoT6g+nHRPvC+QB9QegWfhfqA5S32VGWmxZ6qBayZwbrMc8O/tJgbjq1Pmmwsvsx7qv7vgCxMY0/Vj2b4/oruqXr2tgHMH88xB57TPVXNW20MXuypKgZrsaeqGKxzR1iLPVXFYC32VM2O9550LfZUFYO12FN1OcbaxZ6q2Y1Diz1Vs6ujJ6zFnqrLYU+cO8JaxGYXg7XYU1UM1mJP1eUY0xZ7qorBWuypKgbrVvDBePahtiOsxV6vy2FPeO31eqa3fhN5r9feDPd67ZUIn/EbnyH+ae71Ojxpnbca9XbnpHPa2mvvlQi+0crPOOZnPvZ67TVu7r1ee408/Ef8i71eo/qsnIzqoDRd647HXxL4QzIea68Xt+Fir9ds93p1Ic7ge6YyZl2uvV7GM26HNKm+mnev14+K2OzZxXE0ct+TvYilXMBawFrAWsC6OKzLHKv7k73xchGrm12fNN3XvfF5mWN1fz4gC9OI1f14hu1WNFb3f719APMTPZg3Yaxu7rN7FrG6o3mLWN1isBaxurOr4yJWtxisRazu7OhaxOoWg7WI1b0cY+0iVnd249AiVnd2dfSEtYjVvRz2xLkjrEVsTTFYi1jdYrAWsbqXY0xbxOoWg7WI1b0c+t6T9087wvLU0W1HWIu438thm3jF/X5fby0octzv/gzjfvdLhM/4jc8Q/1Tjflvn+/vt885ep37eODrqr2HepHG/zZs87reZh/+IfxH3O6rPysmoDkrTte54/CWBPyTjizseRuVtoyCtm6L8RoBWrMdmQVqvd6dL64qgtZxkyw7iWhE05IlR/jDEV/zs7dn0eJ65zbEeVv5HevjxzG2GWc6Aiefdpmn6Z3Q3GuqMbpQZHC/GyYfVFctXRXmUaT7nOitem2VI6VOMpX65THfwvtE4C356nnmu+I98Mh7VklFerxMsxc/QmeeGZ0WUR3gc1/XT0Ecueub5CuC2Ph+qx5Kox7gY+49D/NkcnFd8UCJ8SZJc6virRXzw7GFd5ljjfwZ6aBFrrOuTpvu6g/LIv6J3xvwr4HfeO2O+QLq9TLj53evdYdxW/rfARvwi2YhKd24InFnzLJ4PqNhkxWt7rmx4dXeIsmlXk/G4y/CMx3DvOSHfeYPvr1Ee1pFtc/b3KBoqibaRWAas/B8EbPM1qK+CGbLNrR6R7885ULYkzpMr3eE6hebEVlcsP26uxz4YtCVXCJYae1B2Qra50TgLfg6NF93hOinZV3sOQvwP2ebIa4ZVFrDUXIf5v5Lofso6uu/LuePG5zjbnO9SmsZ9RF+A/nsr3Ed0N7TF4j6izHTT30f0ycV9RP3EfaAe6ANKr+CzUB+wvCL3EV20TyCsN3aH8WTZvUd3DOAiP/LavVb+G+4YwPz63nclS0bjRhKe89l73jYuy3LIxlWwygHc42xWxq3WMZiWiqCT92Aqf3ZR/xa3P9Yh7xhq76Jcoe8vAfzHvd/1gum82Tis7zf3Gq32eaPT2r1K8JEPGxHwN09OD06apydH7aPdxuHeWPzz2OcfcOrz74Y+/62OfX7cemOeddiQjrhV1xsVrJA+GzdPYz6F1g+9cedZD+Sy7Cfi9sA8ntMrXZl3HZHHsiw9zfO05QAsLz39QCQ9fXTQOTtpH7U7B7udk87JyUX0JJa172ZnIg8d19FynyVo+NeTUX0XY+1D2aCKl6G5Lc+d0nRvd1CO8/LM9zDv/jmF5VnHBb8W/Frwa8GvacKyOs6D/8Vskrz+F7RhcK5SoWc/Etn/UhXv2ZyI7Q9lUxpMNSfI8kFkxV9d6974jBuzGz43aV3QwzbvR2meaHb1UjI6b0I4Vn5D4MV5AdvaG4Q3hf2h2jCv4sQH1zsl4ota80P8FSr/U0DzD02H5sLnl65QnmoLdX4p9m9OS/Qb65vy4rvvHsDlckwr8nmD8lbEuyUBS9Eaij8x3ap8++gz+SXqCxybwO++tTvIx/L/AHwmn+x9R79IKK7N8t5+5wDGp8jvos5nYz1QFjTjd5NblJ0YesnkFvWDOm+X+9pnqS36a7sAZ03AYT2GeKsBvJuEF/US1yVJNG/Zb2T1XMkov040WPlfEeum3L7IB6Qrz5nXqwVpXs1B868FaN4YQ/NbiWaM9WaZUeVZ9yJ81oFZ+n9NwGeZ/DdQx89lyEY5A+a17nB55SsLrf+P85UZfuUjzOOnw/Zgf2a1IK1bojz2vQ2iFenbSsbjDsn7dkFaa6L8NpSpEq1IX60grde743GHaN0R5WsBWrEe9m5oLx9/Gh5+xmOt8p2zjeGBB2Vok/DUHPEgT7cIz5YjHpSlbcKz44gHYZktZHM39Nny+iQ+WxW04vs8r7gK9kv1zmG4bF9j/1/KgFcDeF9xZ3b9bH0sbzmlL42XSj9xn1T6BnU161Lj10qi50vbVH8r/8peXVQsFcoFx9WVBWzkjar/DtFgeX8I2sDs07jzn0ZD9QdL1WRUhnmOcxvkVSnvdsirUd4dkMc64E6qK+bdBXnoF+E0bk71eYgl5HKWLiq7anzgWFvU6TyuoB6uUV6W7kyT2lccec/UnorLRB1eAbxZYyyW5/5/VZTfgTI2/teSUVlFnc/82Zohf9YC/FHzibUAf5R+RNt8g/ijZLJEvxEW2rKhOOBZyptnXPVWgAfII2VjVAnWuBjk2cdVa36G4qqLzquUzR6KU1e6T43D3A6Id5Py0FeF9ouNsSH5R38UxwOoGGv0c6n1+Bj7i9LEPrhYvj5bk4l8X8GR0pWWuN+jbCifLa9fKHu4JPAoG8LqW9Qvq+Jl1HrKpG2FsFgm1D6xtG2foH6g9tPju+y/sfLPgv36FNm/WB/eP4R9F8/OUPuLyonG/WHA/UJGfcqiPvh9HtaSkB6eH7yf6hVaS+I6Yp/IWktivBuEV/lsQ2frMD1Yz5WM8llrQ98l5mfcvsp3nSb2YYXG5bw0X8lB83cHaF4fQzP7YPEOwTw+XtbLCJ/1I9eBZQnhs0z+aajj5zJko5zkW+v0juvkPYxqbSyEW+2B476Xl9ZxZ2mwfxnpqxakleW9WpDWcf5lpjXkXx5H6/XudGldE7SWk2zZQVxrggYVR8x95AdhbPow+er4HV4vxDwr+38KeMomNFuX7ThsM2U3oI384YyxNEm0bcA2shoL0OZQMSO81oh5WAejed5sUT5TIG/8wDzYotOan2TZoh8lecP1+zy2qJX/KegjH+t9R5tSnUnBMOp3DWD8DNmzKq6J+8jNbm/+4ozszV+cA3vzEzehvfmpW8De/HRke1OducM8wfKztDdDtHram6Fzy9LE8r5VkFblw0Y7cpNoRfq2C9J6vTsed4jWcfEMTKuKZ4jpo0O5YxvDAw/KEMcXbjviUTEisWMeeD6g1trsN5dPxDts21v5/wi2idkYWe/kmQ/8gYAX1yZu1FVciCVeU0b5VGvKHGuCa8oct4Fryth2nMbZy5WdAVwuZ0np8RLlKT+z6vu8z1PNxdR8epvysvpFmnD9yGiexfoR8rQCeLP0J5YvGpPF60coc6H18eoM+bMa4E9oX7Xijxpr0e7i9XElkyX6jbBU3OK8yZvnenooxhB5FIqZKyWj7aZsi3ldT0ca8/AzZC8pe0z5zJR9wbadmmOo+ATuSzaP4jL2Ls8xvqY3hqb4tnaG6UM7g2WhHKiX8svheB3qg3n9a3iO2EeFf035Xqw+a0Snr5zVT0uEz+qHzxD/4jzcBawFrOnCusznB78DdPri/GBdnzSZLz60Fy7yekvQb63OhilTefyeJh7fTwKyoGLArgR4VxL0VIEnlnCN4zxjzM86OyprjeNrXjGA+VgPZp54G5SJPHIV1zbY280jt5fJNvi27qDcpLr7PY6wnnKE5Xnn5pOOsOb1PkpP3p87wvKso+dd7J53xHver+h5t+WZIyzPdmw7wprXuy3n9e7nedWFnnenesqqJ12POsKa17HWsz/Oq/7ybEfPcchzfGw7wprXe93bcwrLU0fP653nnnq17QjLU3+dO8Ja3AdeDJbnfeCefcjTZvKcK8yrveqpJx50hDWvY5qnLTevvo6OIyxPO3pe+eU5brcdYc3rXPRpR1ieOrrtCMtTry5sk9nZJu8kWHnvZuJ7RO7prQXFXafd2w+dbxZ3XXBvv0T4jN/4DPFXBT1G97rIm+SuhsPW+f5++7yz16mfN46O+muYKgYsFM8X2t+C5ePuHdprhmLSLG8Z8lYprwJ5RmNa5i6iP865VnvNPPxH/DVRnvc15G3LmsDD7TwJrKULwrqaDPcB1BN4h+4KvMc6KE3XuuPxlwT+kIyvCpou291B42hledsoSGvR+35CZ7iOo/V6d7q0rghay0m27CCuFUGDGhM4vuIY4ive/Ypseji+AuWV90Sqs1VwLM06W+V6D3/6m+9DVvtNEabJldLpVo+4ccb1UxVnjDKD48U4+bC6Yvlx+904HhfjtlmnKHsO+0MobttonAU/PfcVhPbRIY9U3Dafy6T4qc5BY1pXRHmEx3Fd74Q+EroPmWUhK4ba+nyoHkuiHhz/xXDPIf5sDu7rapQIX5Jou9rwL+7rGqT7HWG9wRGWZx0X/Frwa8Evnzpe5vun/gyMv4v7p26k+oTJ6Amd4YL0sE30/WTDTOv+qe8HWZjS/VNnJeJL0funfhBoXtw/NeDFK145gMvlmFZ15knM8y7SZLpV7cEx/ZCW/zHqC+Pun7rWHeRj+b8OfoGf6H0vev/UHa8cwPgb5Fu4Fe6f+hi1RX8unej5ptf9Ux8TeonrkiSat+wnuOj9Uz8j5qncvsiHebh/6u8JmiPLWCs0Zqkz7lmWsI9sBsqzbmf4WedvZt1vda2bDPHQyv994OHifqtsWqd5v9X17nD5WdxvFVpT5U/Dw894fERYNj6Wk1Fehs45Rb2g7jlgW/PXYFz8lVcMw2WbK8+dRL8K8H7rFdn1w/MU8pSb9E6ikK85TSz/xruVROsj5qeV/42APxPlgtcwywI28kbVn+14y/u30AZms4TsFAUb529pQn+5wYh8zklD+cuxzSrd4bqMa+OiOivrHJ40mVwq/mzOkD+he0CU3VH0HpDQPTVZc5cs3HnvqZmlvE1zvYvlDfnJa5Jqz3vec5+ms96l+Rm69yd07lCaivKT75vB8ja+Kt3M7YB4WW/jnBbHNNO7ofa6yD01Pwbji/nNIp8DVF9LRscOR/i7JcHLpQAfJj1PA3FN61wCVTcVI8ZyxTzIgpUndhFhRT4bpt+mofMYEP9lPsfmnp4uuBnPsUmT+eNiznlUe0fqk4cq9sISn0+o+Iw2EOskdfZrSeBR/lurb0rXSQ7/rTobhuOalgWtkfV5Yf4uUZ465z4vD61OKe6XCvjAlc9Q6SseY9Va3DLRqGQZv3McCZbPWiNjexDzkEa2mdC3rfRN1rlFbwMdZrFsyrbEPpym5e5wXY97z+uTpf2iZ2Aq+0uNmVZexVJif+GzgkKxvmoNWtl+Vt54mOWjZt+LlX8XtFHI98BxYGUBO5U77IcJ4Dru/a4XTOenraOD06OzvXq7ftQ42r1K8BOgJZbcJ0nY/lIyjTZTmpYhz9NWTOv7EbgTZsSu6A7noYyu9PJC8qjGCx4TIo25dbZ30MZSurGcjLYp9hneS/NcwMYqGgPC4yLm5e1HBoPlWNUZ5Z/ncmk67n3Wi6UGP2C6VawI2zozOHe2VSJ8xjd8hvjn9Wy50HiB/Zrjn4qeZxgbVp65WSRbcmRP1nISHo/V/oKhGGt69mdmODeLfCbnXt5+ZPjXk6j9usFtOY6vaq7AceC4Fsayr+Ln1TnyNwss1N0qVo775KzPeuVxJu9Zrx8M9Mmivq/lnLxjv1ik2LFgDM5agHdoiw/50OnZX3PkXUXQEzMuDNtrUh+vwjMPvrN1RzwIi+PplgQNKZ9/MmNdQp1jXAL87NP8xxAL9//TGjPWh/cVWR2y7F+rR4XK/0wPR+x4a56TIq41UT9H3KdqzdGSih3lPqnWCy0PY0FY9jH2hef8mJS/zcql+ua3ctxnqmSE9XJZ1CPk61R6pER5KG8hPcfzPexjtr5XSkb72BLBTpP5dVSd0c/CfeuXQYd/bjoxzf31mtVAnRg//sbyId+D2heu7uxiP7a6H8lowHh3hp0m1ilW/ldIp3B803Hvd33CpHQKx+eFbKk0Xe8O18HK/x7o4V8lPRzan4/85D6mYoFVjBW3A8ZEqXgIroOV/4KQ99ndV1VvKd8y6rRKd7jeoTiiNLEvctzdmRxXg/qZ47fU/D50v5LxcEWUZ3sAy//7gG8Z9W6VaFd9UuldjtVQ5xykeHZ6aw+R5zg35VhsvCg6FnvoCbyT/GX6uqN0zaLfTiteME1mZ3O8oJJvdTZGkT6TpjcRPhWbh30mpDOWBFyeS+C7OJeY5vrkO7qDfCz/qlcNaJmD9cmjxfrk6PrkV0MbzeP6ZKtzcLLfOajvNdut82b7pMj6ZIn4gPJbDvDGyn9djzdp3d8H8styUMr4TJLivhaWqZAvIE3Xuzc+eexN03Hvsz5RanSMHt57gPpklfixmlE2Td/eHS67Hij7HVR2I1D2vVR2M1D2fb2yxjccM457n/WJ0sm5imOx9k3b/OtpDNgCevP0YSv/fpDT1/a+K73OOl/ZGCGdH5r7WPlroE8+l7EnL0nCawxWPnTnLNKjfMcsU9aP7p8ifaF5dsg2m1Jsg7TNhtYAuvnrq/iT98y3GpVHXin+rM2QP5UAf8bFk+eRn1CcQ+j+ZBx7uM/z+Jem+4B21tVW/iHQK0++SsMsJVo/sH2C5zYtiTJMg5U/hf5qdwhHjj0+Un3BkoqHLFGeustezU95npm1t4STmmcaL1I+3UO2diJgqTYtE45xbWr0Z+2BNngsV88KmzNy/Mq+stssqdgQblNVr9hxs8aLIm1qdiqeo8D3f+P3Hvsz53Y8zlv57wqMozvJcL2QhjSxHrwqyu9AGfZ31iDvajJMn7Xhdwfou1qQvttEeZyH8DiPtN9G9Jms/F+gW7/nVQP4SMuKqO8OwTO5/CDA+95XDZfpn8sCZf4slTGd9QNQ5vuojOmu74cyfz6DdjVH4P25VvZ/J/8h8/a497s+YVI+f5QFpMnW+BXvk2S077AMvat741P5F+29lH8//KrscttzVI7zWB+kyWJqFO+QN1mwdgKwdjJglZLRdkuS7LbLW1+eY/0oyPwv0RyLz0rAPNS9PMdSuhfrlqV7/3pB3Ys+0qK6d5vqo3RvCFYI9zi9ynpf6VU1PzCcs5gfIA8q3fz1Vfy5XZS/DcpY29SoPMs78+fqDPmzFeBPUdlV/FR2Qy0Z5V2N8nBM4P6s1hiwn7JdjPqdyyM87te/GPDFroj3UReFaFV+Y+WbQrhfD7R4+VM/BTr062hPxbz5U628Or8Qy9s5UvZOlo80Td/ZKzvOL/gZalN1TlLIL2jl63cPYP7zAn5BFfNYot9IC86Tecyy8r8aGLMwrlLB5LO6lF8p5GcZd2YTr6+GzvNXuFF285zZFKLV48wmngt9McB7b/rYJ3tF0BfCHfI3bBek1etMqZff7w7ypuSfPVDjJ/KAx89QfRV/1HiL9h37GHFsDflnt2fIn5B/NnSWheJPaP0X+6Lao7YV4M8s5cdzvTt0dh72ZeXfD61/rMyQP57+/XHxAByXhT5Gjj8pQV5R/z7bJFb+NrAPXnO3hllK9Jhc1L/PNFj5u3p4p+jfL3xWcIny1Jl2yofP/n0cXybx738ypy+Y21T590Ntqvz76jw6lquvhjZd+PdvpHH+/bxtavMm9O8rWbXvGAORx79v5VvQhmwz4r1RCibb68pmDJ3JNi4W1/Bb/bHPsU/R2vyPBuqzXZC+cXYl28DKrkwIz4qoC9vzJof3gt4+vnsYHvvYcf75/u5wnpW91oOxJuiN7X9HO4n7E/LmDXcXK8dz4TcCzz7Q+67me0ab6ls8F75obP1bA7JoZcoZMLlvKdkNnc/nMScK4Ub9xePJTkFaY/umQ7jH+aZZBynfdAh36Jzb2wvSeocoj77gq0Qr0mfvKjvccM7CDkceVLr566v4c6cofweUYTv8TsgL+dFvnyF/Qmd2Kr9KSH5Uv1RjqvIDhNZhZik/ob1B4/RWHv6gztwM8CfkB6jOkD+eZ74q+w7nSFeJP2pMUfNcHpfznlfM9cjaV8Uxolb+u8T8Ra0trAP8D9w9nta86zAI9zNiHWZxtuywnOCnweI8w7U4WzZKvRdny8Kzvwj6Y3G27DCexdmyo/VfnC07ypO8PLyMZ8uabXmlC3C7g7Ivl+sO48QyabJ+Z7BWIW8jB6yNAKy1AKz1nLBCuJHWZYK/2fu9kgF/jcpXe7+XofwVQU+F4P8s+Is+dfdwGYP5d6DML9De7kp3gIPbbgvzRHnUmVze6pri/Efgt0vTNuDxHtuz6EZZMPyKB0XHDcO1TrBi2GuID+kp2iYhWFs5YRk/sX3T75+bTls3uQ7mh8R6Iv7+Xvg49PRlb7sb5qnh95A9wzUt2VN1C8kelmfZU7C2c8Iyfip5q8bhwS7r9SSDB4gff6Nex/HP3mWd/cW7h+EofuEYZmNR30cIeeuUtwN5m0Tv1e4ovQhrm+i9SvTa2KtkvibwbxF+xKXw87i8I8rviPKprPw68XRFvIvtazzl/fpqXmNzkRTPvyUfy7hzKa53B/lYvvoVA5j/ntaCQnGRKq5UxbktUR6uLfO5M7j+bvjMXo90F3buM2gN/3qibfhjH3r6PhPlM1N+DuPPtO5LRXrUfufU37uVjLYZ0of37Fq61r3xqeRrjeoaSRb6vhB1P7nab1wWdRu6j42erfT6msfZpyouORQfpc4q4bN7UO75PCB1vgXGXbB/CusWuhOb383ihfIXs6/pKuiyP9L7rnQS6zIV76Liv1mXZc3Vs/oL+gR43SB01hPWX63FV3PAmuRuXMat4qyZliTJ7vdq/WdKZ3DtqfUfzzsUx63/cH9Ud+Cqfsz9EfFy7C32P+7jKKe4tmL9RfmEMJ7R7I7/CtrsGIUbPwQA", - "debug_symbols": "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fyyjH6/4fTncapVDtcrhWuX0WuWMWuVIrXK0VjlWqxyvVU6trtxrdeVeqyv3Wl251+rKvVZX7rW6cq/VlXutrtxrdeVeqyuPWl151OrKo1ZXHrW68qjVlUetrjxqdeVRqyuPWl151OrKUqsrS62uLLW6stTqylKrK0utriy1urLU6spSqytLra6stbqy1urKWqsra62urLW6stbqylqrK2utrqy1urLW6spWqytbra5stbqy1erKVqsrW62ubLW6stXqylarK1utruy1urLX6speqyt7ra7stbqy1+rKXqsre62u7LW6stfqylGrK0etrhy1unLU6spRqytHra4ctbpy1OrKUasrR6muTK1UV6ZWqitTK9WVqZXqytRKdWVqpboytVJdmVqprkytVFemVqsrU62uTLW6MtXqylSrK1Otrky1ujLV6spUqytTra5ca28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29lGtvX1Ua28f1drbR7X29tH0vX28vth60005vVY5o1Y5UqscrVWO1SrHa5UTpcqZvrfvpByqVU6trhy1unLU6spRqytHra4ctbpy1OrKUaorcyvVlbmV6srcSnVlbqW6MrdSXZlbqa7MuXv7bhKWL+H5EpEukbtX7iZB+RKcL9HzJd7vGtSI9eerl59FtiIyQ0RniNgMEZ8hEhNELth/9XeI0AwRvkLE6CHy5SmGuy/3uL84+PEMvR9PUf/7X3orvX9u6eNzS5fPLV0/t3T73NL9c0uPjy29X9HXl6PHWnpj3Rw8+hW9gONxhPr6BWf/21Bwu38bim5fvg1tX8vW7uWz/XgLf75Wfxavn1y8fXLx/snFxwcXP9onF0+fXDx/cvH9k4sfn1z8Jx9hxycfYccnH2HHJx9hxycfYaXQEfZWUKGj5q2gQkfCW0GFjm63ggodsW4FFToK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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 37c22faf6c2..497d7d3b9ea 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hashmap/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -231,8 +231,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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s30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7DO9gWss30B62xfwDrbF7HO9kWss30R62xfxDrbFw1UVo6Xn+3z/vnJ+eG2dnIilpyEJSdjySlQci4/29eRY7HkOCw5HksOYcnBysoWKytbrKxssbKyxcrKDisrO6ys7LCyssPKyg4rKzusrOywsrLDysoOKytznO0zJb/kdC529nmt86+39gXbuvTwze6R4xjgTcrttMrdtMr9tMppWuVhWuVxWuVpWuV5WuXT1lBCqaFVDUpdrGpQal1Vg1K/qhqUmlTVoNSZqubq2pGeL8J22R9nA++2z/Xe0i4bpGmV51mVh6tzXnh+sAu0+9sNV+/rGLbq5PdqmPe1y71vNaVNTsq7rypiyUlYcjKWnAIlJxosORZLjsOS46+Vk8ImJz1+gNwu9q1rH/dgtmt/f9p2bZVO80oP80qPuNKtKfGpwpS0XUvf0tO80vO80su00pOZV7qdV7qbVzpwNe1JB66m1sRNunV2Jx24mvakQ1fTY+nQ1fRYOnQ1PZYOXU0PpWfoanosHbqaHkuHrqbH0qGr6bH0odW0LhHGL8HxdFN6Pb+TU+fiuH0BIZbXLdv057/2sZywvUl6nld6mVY6yynfm6TbeaW7eaX7eaXTvNLDvNLnraZl3mpa5q2mZdpqmsy01TSZaatpMtNW02SmrabJTFtNk5m2miYzbTVNZtpqmsy01TSZeaupnbea2nmrqZ23mtp5qynLFICbpM9bTe281dTOW03tvNXUzltN3bzV1M1bTd281dTBVNMqB6ZCVjkwVa/KgalkVQ5MdapyYCpOlXN1FXm4hefFyf0cEJG8wZJjseQ4LDkeSw5hyQlYciKWHKy8Q1fvrELPh5dCCXs5HksOYckJWHIilpyEJSdjySlQcoLBkmOx5FyclaMJTznRxLST47HkEJacgCUnYslJWHIylpwCJScaLDkWSw5WVo5YWTli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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index cc1f2844bc3..2c5c19f0045 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -40,8 +40,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_0.snap index b6127cbf29e..50a8497ce70 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_0.snap @@ -40,8 +40,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 6d60440b214..bcaa50fbb86 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/higher_order_functions/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -40,8 +40,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index a53b9040c6a..30efc7f3e56 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -47,7 +47,7 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+1azW7TQBCexD/5bRJRVQhx4YLEDW9sx47EARD948iBC0jIce07b+C34V14Dh6EbNlpxpO1S5XdtpY6UrRrz7fz83n2J0568E9m289L1e9tP45qpbyCuvRV+161wWGypLbCYBVFRbIsRCiyYLnepHEQxZtVKlIRp/HVMg3DIo3SZL1ZJ8FaRGEhyngdlspY31xcAeWhr+HBMcuDMGmrb5BTxxKnTsc4dQxy6lri1O0Yp65BTj1LnHpw+xp4aOw9g5ya5IHm3Hu0OYfLtmcTHCZG9ycf7NSoD92a975BTgeWOB10jNOBQU6HljgdgvXzpFFOhwY4LUopeWkxZ6Nr1BjsPPsxdGs+jQ1yOrHE6aRjnE4Mcjq1xOkUurVGTcHcGuWyfHViKO4Yz9ZUeo+X5+ApxqcYg8PEaIwYm5QZMDEd+AzMLTL4okJKXxMzlTHpI/bkz4cXP3//OqU4t0Xnt+iGLbppi27Wolu06I5bdCctuucNOuSsUO1ItX2iN/gCT4yYX5P20yDajKAuhuMPR8SmBfsrtO/asX/9ZVfKp6puH5hfh+F0YxBzSjCnDZgzgjlrwJwTzHkD5oJgLhowlwRzyTBHqk/XCswLubdR+9vajC0/2xv7vh37IfJGD12OJif0fwT1+kK9rgWo1yEwX2OwOu9EW240fqyNBcNzDppseXe09ZDPlHJNn+k1ptrp+kznEp3HdF61n6PcQ18TnG4OIi4gfcFsf652Y7CGLM/pzPJ+II5b+MAcBxXcCOoccg85R56GFM90I6Jzq7qfsbp2iR9qC+PwGP6tup6r1idjcPxC499n/mtxa+5RjrgtR3MP8bK236j+RH1kfX1V97Am3d3QO61j1BfWC53rJvf3BeyvRehrDvtrCY9rYCkunJN4XsYa4j59whfF0z6onOi9d6qV19/JGGoToP6DBxBfUhawP9d8xg/lDsDsuZjna3Id4XsxrQuZ00fGmUd41u0HPaKn+HNiE79kzNkYWp8TjY1L1UoufkCd/5Edfm72QaxFgPqfN0Djn15TPJ9DlANPY2uuGefe0Y/H8Pi912/Aoz2P4b+oVnK/UX3dmsJ5uO38gHX9v3WI9t1qhzP1vJN09/ID9z8P6uc8YP49hv+mrsckD2wP+XNGmWSiDLMyi7OrqyjPnjH7UrAeJxb8Z0mY5ssoTzZxmIWre/efx6tNHsVZUAh5ubxv/1vXSZ4lQqwjUUQivs3/Xxyexq4BJwAA", - "debug_symbols": "tZbbisIwEED/Jc99yEzu/sqySNUqhdJKrQuL+O+bLsZdY6Q4MC8l0+ac6SUzzUXsms35sG77/XASq4+L6IZtPbVDH6OLgN9Tp2Pdz9FpqsdJrACxEk2/iyOlrpXYt10jVkZeq6epCOhucxGU/j/5sxLIalesds1qN6x2y2p3rHbPag9LdpsBIEsEQkg5nlJAsaZ0sDfCICw8AZo0F9G6XI+8esWr17x6w6u3vHq3pH9aa8VqMT5VgMWlalEO7yvZhVwfWPUoefXAq0deveLV6yV93gmxWFvBwI0IweRE+T8kQaV2K+GxBmKwGduuaw/rh22KnA+m3Iq1S3cQh5j/Z4HAIIFRBEYTGENgLIFxBMYTmPA+YwnrwBLWgX3x3u41Eod5Wdny8xh5b/sGVL6fgvfzOCQwisBoAmMIDOFdO0dgPOH7EL6plwQGCAwSGPUuc43RVz229aZr5n48Xzz329SeYzh9H9OV1MCP47BtduexmVv5XxefkytXaZc2195WAdK+OfgKpIwJY9If", + "debug_symbols": "tZbbisIwEED/Jc99yEwu0/gryyJVqxRKlVoXFvHfN12Mu8ZAcWBeJLE5Z9pmZpqr2rWby2HdDfvjWa0+rqo/bpupOw5xdlXw+9f51Azz7Dw146RWgFipdtjFkTG3Su27vlUrp2/Vy1IEpPtaBGP/L/6sFIrajajditqdqN2L2knUXovaw5LdZwDoEoEQUoyXEFCsKRv8nXAIC0+ALq1F9JTrUVZvZPVWVu9k9V5WT0v6l1wrVourUwV4XKoWQ/jIZAq5PojqUcvqQVaPsnojq7dL+rwTYrG2goM7EYLLifJ3SINJ7VbDcw3EyWbs+r47rJ+OKXr+ceVWbCndQRxi/p0FBoMMxjAYW2YeexCH+bY5x2A8gyEGUzOY8D7jNYMBBsN4b778PE4/2r4Dk5+nGPdGyGAMg2HkKDFylBjvmhg5SjVjfxh7WmsGAwwGGYx5l7nF2Vczds2mb+d+PF+8DNvUnuN0+j6lK6mBn8bjtt1dxnZu5X9dfA5uqLKUDte1rwKkc3OoK9A6BoxBfwA=", "file_map": { "50": { "source": "use std::hint::black_box;\n\nfn main(a: u32, b: u32) {\n // This version unrolls into a number of additions\n assert_eq(loop_(5, a), b);\n // This version simplifies into a single `constraint 50 == b`\n assert_eq(loop_(5, 10), b);\n // This version should not simplify down to a single constraint,\n // it should treat 10 as opaque:\n assert_eq(loop_(5, black_box(10)), b);\n\n // Check array handling.\n let arr = [a, a, a, a, a];\n\n assert_eq(array_sum(arr), b);\n assert_eq(array_sum(black_box(arr)), b);\n\n assert_eq(slice_sum(arr.as_slice()), b);\n assert_eq(slice_sum(black_box(arr).as_slice()), b);\n\n // This doesn't work because by calling `black_box` on a slice the compiler\n // loses track of the length, and then cannot unroll the loop for ACIR.\n //assert_eq(slice_sum(black_box(arr.as_slice())), b);\n\n // But we can pass a blackboxed slice to Brillig.\n // Safety: testing context\n let s = unsafe { brillig_slice_sum(black_box(arr.as_slice())) };\n assert_eq(s, b);\n\n let mut d = b;\n // This gets completely eliminated:\n let mut c = 0;\n set_ref(&mut c, &mut d);\n assert_eq(c, b);\n\n // This way the constraint is preserved:\n let mut c = 0;\n set_ref(&mut c, &mut black_box(d));\n assert_eq(c, b);\n\n // A reference over the output of black box is not the original variable:\n let mut c = 0;\n set_ref(&mut black_box(c), &mut d);\n assert_eq(c, 0);\n\n // This would cause a causes a crash during SSA passes unless it's a Brillig runtime:\n // > Could not resolve some references to the array. All references must be resolved at compile time\n // The SSA cannot have Allocate by the time we start generating ACIR, but `black_box` prevents them\n // from being optimised away during SSA passes.\n // If we use `--force-brillig` then the it doesn't crash but the assertion fails because `mem2reg`\n // eliminates the storing to the reference.\n //let mut c = 0;\n //set_ref(black_box(&mut c), black_box(&mut d));\n //assert_eq(c, b);\n}\n\nfn loop_(n: u32, k: u32) -> u32 {\n let mut sum = 0;\n for _ in 0..n {\n sum = sum + k;\n }\n sum\n}\n\nfn array_sum(xs: [u32; N]) -> u32 {\n let mut sum = 0;\n for i in 0..N {\n sum = sum + xs[i];\n }\n sum\n}\n\nfn slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nunconstrained fn brillig_slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nfn set_ref(c: &mut u32, b: &mut u32) {\n *c = *b;\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_0.snap index a53b9040c6a..30efc7f3e56 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_0.snap @@ -47,7 +47,7 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+1azW7TQBCexD/5bRJRVQhx4YLEDW9sx47EARD948iBC0jIce07b+C34V14Dh6EbNlpxpO1S5XdtpY6UrRrz7fz83n2J0568E9m289L1e9tP45qpbyCuvRV+161wWGypLbCYBVFRbIsRCiyYLnepHEQxZtVKlIRp/HVMg3DIo3SZL1ZJ8FaRGEhyngdlspY31xcAeWhr+HBMcuDMGmrb5BTxxKnTsc4dQxy6lri1O0Yp65BTj1LnHpw+xp4aOw9g5ya5IHm3Hu0OYfLtmcTHCZG9ycf7NSoD92a975BTgeWOB10jNOBQU6HljgdgvXzpFFOhwY4LUopeWkxZ6Nr1BjsPPsxdGs+jQ1yOrHE6aRjnE4Mcjq1xOkUurVGTcHcGuWyfHViKO4Yz9ZUeo+X5+ApxqcYg8PEaIwYm5QZMDEd+AzMLTL4okJKXxMzlTHpI/bkz4cXP3//OqU4t0Xnt+iGLbppi27Wolu06I5bdCctuucNOuSsUO1ItX2iN/gCT4yYX5P20yDajKAuhuMPR8SmBfsrtO/asX/9ZVfKp6puH5hfh+F0YxBzSjCnDZgzgjlrwJwTzHkD5oJgLhowlwRzyTBHqk/XCswLubdR+9vajC0/2xv7vh37IfJGD12OJif0fwT1+kK9rgWo1yEwX2OwOu9EW240fqyNBcNzDppseXe09ZDPlHJNn+k1ptrp+kznEp3HdF61n6PcQ18TnG4OIi4gfcFsf652Y7CGLM/pzPJ+II5b+MAcBxXcCOoccg85R56GFM90I6Jzq7qfsbp2iR9qC+PwGP6tup6r1idjcPxC499n/mtxa+5RjrgtR3MP8bK236j+RH1kfX1V97Am3d3QO61j1BfWC53rJvf3BeyvRehrDvtrCY9rYCkunJN4XsYa4j59whfF0z6onOi9d6qV19/JGGoToP6DBxBfUhawP9d8xg/lDsDsuZjna3Id4XsxrQuZ00fGmUd41u0HPaKn+HNiE79kzNkYWp8TjY1L1UoufkCd/5Edfm72QaxFgPqfN0Djn15TPJ9DlANPY2uuGefe0Y/H8Pi912/Aoz2P4b+oVnK/UX3dmsJ5uO38gHX9v3WI9t1qhzP1vJN09/ID9z8P6uc8YP49hv+mrsckD2wP+XNGmWSiDLMyi7OrqyjPnjH7UrAeJxb8Z0mY5ssoTzZxmIWre/efx6tNHsVZUAh5ubxv/1vXSZ4lQqwjUUQivs3/Xxyexq4BJwAA", - "debug_symbols": "tZbbisIwEED/Jc99yEzu/sqySNUqhdJKrQuL+O+bLsZdY6Q4MC8l0+ac6SUzzUXsms35sG77/XASq4+L6IZtPbVDH6OLgN9Tp2Pdz9FpqsdJrACxEk2/iyOlrpXYt10jVkZeq6epCOhucxGU/j/5sxLIalesds1qN6x2y2p3rHbPag9LdpsBIEsEQkg5nlJAsaZ0sDfCICw8AZo0F9G6XI+8esWr17x6w6u3vHq3pH9aa8VqMT5VgMWlalEO7yvZhVwfWPUoefXAq0deveLV6yV93gmxWFvBwI0IweRE+T8kQaV2K+GxBmKwGduuaw/rh22KnA+m3Iq1S3cQh5j/Z4HAIIFRBEYTGENgLIFxBMYTmPA+YwnrwBLWgX3x3u41Eod5Wdny8xh5b/sGVL6fgvfzOCQwisBoAmMIDOFdO0dgPOH7EL6plwQGCAwSGPUuc43RVz229aZr5n48Xzz329SeYzh9H9OV1MCP47BtduexmVv5XxefkytXaZc2195WAdK+OfgKpIwJY9If", + "debug_symbols": "tZbbisIwEED/Jc99yEwu0/gryyJVqxRKlVoXFvHfN12Mu8ZAcWBeJLE5Z9pmZpqr2rWby2HdDfvjWa0+rqo/bpupOw5xdlXw+9f51Azz7Dw146RWgFipdtjFkTG3Su27vlUrp2/Vy1IEpPtaBGP/L/6sFIrajajditqdqN2L2knUXovaw5LdZwDoEoEQUoyXEFCsKRv8nXAIC0+ALq1F9JTrUVZvZPVWVu9k9V5WT0v6l1wrVourUwV4XKoWQ/jIZAq5PojqUcvqQVaPsnojq7dL+rwTYrG2goM7EYLLifJ3SINJ7VbDcw3EyWbs+r47rJ+OKXr+ceVWbCndQRxi/p0FBoMMxjAYW2YeexCH+bY5x2A8gyEGUzOY8D7jNYMBBsN4b778PE4/2r4Dk5+nGPdGyGAMg2HkKDFylBjvmhg5SjVjfxh7WmsGAwwGGYx5l7nF2Vczds2mb+d+PF+8DNvUnuN0+j6lK6mBn8bjtt1dxnZu5X9dfA5uqLKUDte1rwKkc3OoK9A6BoxBfwA=", "file_map": { "50": { "source": "use std::hint::black_box;\n\nfn main(a: u32, b: u32) {\n // This version unrolls into a number of additions\n assert_eq(loop_(5, a), b);\n // This version simplifies into a single `constraint 50 == b`\n assert_eq(loop_(5, 10), b);\n // This version should not simplify down to a single constraint,\n // it should treat 10 as opaque:\n assert_eq(loop_(5, black_box(10)), b);\n\n // Check array handling.\n let arr = [a, a, a, a, a];\n\n assert_eq(array_sum(arr), b);\n assert_eq(array_sum(black_box(arr)), b);\n\n assert_eq(slice_sum(arr.as_slice()), b);\n assert_eq(slice_sum(black_box(arr).as_slice()), b);\n\n // This doesn't work because by calling `black_box` on a slice the compiler\n // loses track of the length, and then cannot unroll the loop for ACIR.\n //assert_eq(slice_sum(black_box(arr.as_slice())), b);\n\n // But we can pass a blackboxed slice to Brillig.\n // Safety: testing context\n let s = unsafe { brillig_slice_sum(black_box(arr.as_slice())) };\n assert_eq(s, b);\n\n let mut d = b;\n // This gets completely eliminated:\n let mut c = 0;\n set_ref(&mut c, &mut d);\n assert_eq(c, b);\n\n // This way the constraint is preserved:\n let mut c = 0;\n set_ref(&mut c, &mut black_box(d));\n assert_eq(c, b);\n\n // A reference over the output of black box is not the original variable:\n let mut c = 0;\n set_ref(&mut black_box(c), &mut d);\n assert_eq(c, 0);\n\n // This would cause a causes a crash during SSA passes unless it's a Brillig runtime:\n // > Could not resolve some references to the array. All references must be resolved at compile time\n // The SSA cannot have Allocate by the time we start generating ACIR, but `black_box` prevents them\n // from being optimised away during SSA passes.\n // If we use `--force-brillig` then the it doesn't crash but the assertion fails because `mem2reg`\n // eliminates the storing to the reference.\n //let mut c = 0;\n //set_ref(black_box(&mut c), black_box(&mut d));\n //assert_eq(c, b);\n}\n\nfn loop_(n: u32, k: u32) -> u32 {\n let mut sum = 0;\n for _ in 0..n {\n sum = sum + k;\n }\n sum\n}\n\nfn array_sum(xs: [u32; N]) -> u32 {\n let mut sum = 0;\n for i in 0..N {\n sum = sum + xs[i];\n }\n sum\n}\n\nfn slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nunconstrained fn brillig_slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nfn set_ref(c: &mut u32, b: &mut u32) {\n *c = *b;\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index a53b9040c6a..30efc7f3e56 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -47,7 +47,7 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+1azW7TQBCexD/5bRJRVQhx4YLEDW9sx47EARD948iBC0jIce07b+C34V14Dh6EbNlpxpO1S5XdtpY6UrRrz7fz83n2J0568E9m289L1e9tP45qpbyCuvRV+161wWGypLbCYBVFRbIsRCiyYLnepHEQxZtVKlIRp/HVMg3DIo3SZL1ZJ8FaRGEhyngdlspY31xcAeWhr+HBMcuDMGmrb5BTxxKnTsc4dQxy6lri1O0Yp65BTj1LnHpw+xp4aOw9g5ya5IHm3Hu0OYfLtmcTHCZG9ycf7NSoD92a975BTgeWOB10jNOBQU6HljgdgvXzpFFOhwY4LUopeWkxZ6Nr1BjsPPsxdGs+jQ1yOrHE6aRjnE4Mcjq1xOkUurVGTcHcGuWyfHViKO4Yz9ZUeo+X5+ApxqcYg8PEaIwYm5QZMDEd+AzMLTL4okJKXxMzlTHpI/bkz4cXP3//OqU4t0Xnt+iGLbppi27Wolu06I5bdCctuucNOuSsUO1ItX2iN/gCT4yYX5P20yDajKAuhuMPR8SmBfsrtO/asX/9ZVfKp6puH5hfh+F0YxBzSjCnDZgzgjlrwJwTzHkD5oJgLhowlwRzyTBHqk/XCswLubdR+9vajC0/2xv7vh37IfJGD12OJif0fwT1+kK9rgWo1yEwX2OwOu9EW240fqyNBcNzDppseXe09ZDPlHJNn+k1ptrp+kznEp3HdF61n6PcQ18TnG4OIi4gfcFsf652Y7CGLM/pzPJ+II5b+MAcBxXcCOoccg85R56GFM90I6Jzq7qfsbp2iR9qC+PwGP6tup6r1idjcPxC499n/mtxa+5RjrgtR3MP8bK236j+RH1kfX1V97Am3d3QO61j1BfWC53rJvf3BeyvRehrDvtrCY9rYCkunJN4XsYa4j59whfF0z6onOi9d6qV19/JGGoToP6DBxBfUhawP9d8xg/lDsDsuZjna3Id4XsxrQuZ00fGmUd41u0HPaKn+HNiE79kzNkYWp8TjY1L1UoufkCd/5Edfm72QaxFgPqfN0Djn15TPJ9DlANPY2uuGefe0Y/H8Pi912/Aoz2P4b+oVnK/UX3dmsJ5uO38gHX9v3WI9t1qhzP1vJN09/ID9z8P6uc8YP49hv+mrsckD2wP+XNGmWSiDLMyi7OrqyjPnjH7UrAeJxb8Z0mY5ssoTzZxmIWre/efx6tNHsVZUAh5ubxv/1vXSZ4lQqwjUUQivs3/Xxyexq4BJwAA", - "debug_symbols": "tZbbisIwEED/Jc99yEzu/sqySNUqhdJKrQuL+O+bLsZdY6Q4MC8l0+ac6SUzzUXsms35sG77/XASq4+L6IZtPbVDH6OLgN9Tp2Pdz9FpqsdJrACxEk2/iyOlrpXYt10jVkZeq6epCOhucxGU/j/5sxLIalesds1qN6x2y2p3rHbPag9LdpsBIEsEQkg5nlJAsaZ0sDfCICw8AZo0F9G6XI+8esWr17x6w6u3vHq3pH9aa8VqMT5VgMWlalEO7yvZhVwfWPUoefXAq0deveLV6yV93gmxWFvBwI0IweRE+T8kQaV2K+GxBmKwGduuaw/rh22KnA+m3Iq1S3cQh5j/Z4HAIIFRBEYTGENgLIFxBMYTmPA+YwnrwBLWgX3x3u41Eod5Wdny8xh5b/sGVL6fgvfzOCQwisBoAmMIDOFdO0dgPOH7EL6plwQGCAwSGPUuc43RVz229aZr5n48Xzz329SeYzh9H9OV1MCP47BtduexmVv5XxefkytXaZc2195WAdK+OfgKpIwJY9If", + "debug_symbols": "tZbbisIwEED/Jc99yEwu0/gryyJVqxRKlVoXFvHfN12Mu8ZAcWBeJLE5Z9pmZpqr2rWby2HdDfvjWa0+rqo/bpupOw5xdlXw+9f51Azz7Dw146RWgFipdtjFkTG3Su27vlUrp2/Vy1IEpPtaBGP/L/6sFIrajajditqdqN2L2knUXovaw5LdZwDoEoEQUoyXEFCsKRv8nXAIC0+ALq1F9JTrUVZvZPVWVu9k9V5WT0v6l1wrVourUwV4XKoWQ/jIZAq5PojqUcvqQVaPsnojq7dL+rwTYrG2goM7EYLLifJ3SINJ7VbDcw3EyWbs+r47rJ+OKXr+ceVWbCndQRxi/p0FBoMMxjAYW2YeexCH+bY5x2A8gyEGUzOY8D7jNYMBBsN4b778PE4/2r4Dk5+nGPdGyGAMg2HkKDFylBjvmhg5SjVjfxh7WmsGAwwGGYx5l7nF2Vczds2mb+d+PF+8DNvUnuN0+j6lK6mBn8bjtt1dxnZu5X9dfA5uqLKUDte1rwKkc3OoK9A6BoxBfwA=", "file_map": { "50": { "source": "use std::hint::black_box;\n\nfn main(a: u32, b: u32) {\n // This version unrolls into a number of additions\n assert_eq(loop_(5, a), b);\n // This version simplifies into a single `constraint 50 == b`\n assert_eq(loop_(5, 10), b);\n // This version should not simplify down to a single constraint,\n // it should treat 10 as opaque:\n assert_eq(loop_(5, black_box(10)), b);\n\n // Check array handling.\n let arr = [a, a, a, a, a];\n\n assert_eq(array_sum(arr), b);\n assert_eq(array_sum(black_box(arr)), b);\n\n assert_eq(slice_sum(arr.as_slice()), b);\n assert_eq(slice_sum(black_box(arr).as_slice()), b);\n\n // This doesn't work because by calling `black_box` on a slice the compiler\n // loses track of the length, and then cannot unroll the loop for ACIR.\n //assert_eq(slice_sum(black_box(arr.as_slice())), b);\n\n // But we can pass a blackboxed slice to Brillig.\n // Safety: testing context\n let s = unsafe { brillig_slice_sum(black_box(arr.as_slice())) };\n assert_eq(s, b);\n\n let mut d = b;\n // This gets completely eliminated:\n let mut c = 0;\n set_ref(&mut c, &mut d);\n assert_eq(c, b);\n\n // This way the constraint is preserved:\n let mut c = 0;\n set_ref(&mut c, &mut black_box(d));\n assert_eq(c, b);\n\n // A reference over the output of black box is not the original variable:\n let mut c = 0;\n set_ref(&mut black_box(c), &mut d);\n assert_eq(c, 0);\n\n // This would cause a causes a crash during SSA passes unless it's a Brillig runtime:\n // > Could not resolve some references to the array. All references must be resolved at compile time\n // The SSA cannot have Allocate by the time we start generating ACIR, but `black_box` prevents them\n // from being optimised away during SSA passes.\n // If we use `--force-brillig` then the it doesn't crash but the assertion fails because `mem2reg`\n // eliminates the storing to the reference.\n //let mut c = 0;\n //set_ref(black_box(&mut c), black_box(&mut d));\n //assert_eq(c, b);\n}\n\nfn loop_(n: u32, k: u32) -> u32 {\n let mut sum = 0;\n for _ in 0..n {\n sum = sum + k;\n }\n sum\n}\n\nfn array_sum(xs: [u32; N]) -> u32 {\n let mut sum = 0;\n for i in 0..N {\n sum = sum + xs[i];\n }\n sum\n}\n\nfn slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nunconstrained fn brillig_slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nfn set_ref(c: &mut u32, b: &mut u32) {\n *c = *b;\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 2337f1a4544..ff052e1285a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1azYrjRhDutvVje1g8JIEccsohh0BYrLE1niEEBpLNDuS8h4UQovXuQA45BAK5GvImOeUR8gx5iDxALskpEPayq5mu8afPJVmy1SPtzjaYltTVVV9Xf13VUtuam2LdLy+Bqwdmu4jMhatnh5WkRV0znzitJ5wFJ1tTXqTtF3cxpv7542GLAx6T3Tb1n80W52NlfC3in49Bpwf9J6I/8KN/Fjs9j9dF/YbsDklO6yMylyBzSTIPTDEIoB5pQ65K/9Hr39Rsrj9w12PS54M/iKlt/7+v4B/A2PLy5dqPbdH/Feg3pv21/cgP/lv9X/vRnx45rv1tilzztBZT4X9otou0RfBMxi1tMeBCPnEZ0j2OKR/vv2CT5RgPxoqI7IvOwMmxvPA8JPmPXS3+DqFPm/x/D/QasuU5rmeex3aq8YXnLoZnzKUR4ZJrLhqXZExNuYTrirksOpFLKM9cEvmHrhZ/RzSuC3c/O7BoXIoqxjckXG8CDxA/lzZ5gHxjHuwbUz53dZcxhceHcp5zy6mWD4YKVrE/MV7jX8LzKXjYPwPyXahgPVbaLF2Hip1QsXPfdfUpHjH/uOyKOYHd6GU5tukj9zxxdd9zjydcSy2/sN8PyS+Cu+lcI7fRfll+Qfmy/JK5usu59rx2U9Ef+9E/t2Y7NmhzIPaZ2+wXrEVXme8mxmv+TarGhvg5RiOPOF5ruqKGujzzdV6Vm9DXHK80rNo4bIs+uU+67st7x0cN8gL6uc4eAOXL9gC/uroPewBLtu8AV2rJ3tBUc1bwjPzguY1HyL2h4oMR+Q7jly2pRRe3ia2J8brmkqqxVb0HINc5Vmi64oa6upzTqr3eSJG3ytgkdgzX27qkLYC2mNrC9bZP8v5f2KJ/+rAPzwvHYjyjQ39y2bVH3zcW87ztG4t/c3WXsXiq4A0Il69vU7x/KHvHEWwDxU8Ys0N69rur8/m6tEV9HCPL1tox+QTltLND5ipiZb96em8509aQIczjivFMoA3xc9HWl4wpt/1Ng/WF/mVsIl/3e4fI/+HqPu11WM6Y6nxtzDYXtdhy6LunZgd1yZlvX7/RVPF6n9zwYw3uTk35Grd0j9xF+bLvN3+62nOsULnb1vcMY+pxSvMjxyRtH6e90x2KDzGIzb7Fa+Z8W/G6a87/5eo+cF4w5kV46nM9oE3P//FpfObBfOP9rzH1+SZjqsu3I7PhfrA2rftjeXazD73G6/SHZhs72g9J/h93j+tQ6uAAnFfLLLmaZ1dZmj1/vlhlzNu8DMBP+N+gu4rd2hmytOX8+g/05j/xnfjYkm0L7Sj/0mx0/u+uq95djqBdO6OVfru+7Q9IPgYcmnxE+G/3MQ5kPkc/uWstBnAO1L5To68frW9q7b8KIWCVedA4op3/78sRjQdVMTXHNrEbvegP5Aj2lXcszh9Tu9H5wF1rHBGMyBHtPLKKI5oPmCMor+U/jZ9xDduINSyxHZnqcw3m54cV/KzznzrEh3PF/ERfBYB1AvbvOoZp88C52Ne7I89b2Z4phPEwT5BvPK+fgF/5G0jT/2cMFDy74v+nJTabxv+HsLY/q1jbGP9Zxwx88bO77vIMGf3J635XDBGfVcWQOnv1XXY4vsjeLyqRF30hyZ/XzH9l51yIb5/8hzzMS7wu6r2u4VkIeq9xozy1jaEtWBftTNy9rGvWJThCkn8MHL8eA/SR/seK/YjsF3Arz5CDrGuoPBP53KcXrlO+1tre+2bL+dnqZLFaPkvn2fy0l3vftzlvPOk4bzxtKW98B3nj2z3zxvfv8kZneeOHjvPGU7Av8WWq9Kn6Ro/vG23HyUWaLVfZMknOF8mLRZLuipNt21+lp89Wr0HMXiT57cku+68AwfU5ink7AAA=", - "debug_symbols": "ndvRSis7FAbgd+l1L7LWSrISX+Ww2VStm0KpUvXAQXz3k27sVCYZh/+/kYz4EcyfdjJrko/N4/7+/c/vw+np+XVz98/H5vj8sHs7PJ/a1cfndnN/PhyPhz+/v/96Ey4/VP7+/evL7nS5fH3bnd82d6K63exPj61l1vzT4bjf3KXw+Wu7UYWFwSLCIsEiw8JhUWBR10SeCQuwEFgoLIaZq9QvoSZzEWGRYJFh4bAosKioiAEWAgtdE3EuDBYRFgkWw8wt5y9hXudimLklv4oS5qLAoqIiBVgILBQWBosIi7Qm5t+iKcPCYVFgUVGRAywEFgoLg0WEBZx5hjPPcOYZzjzDmTucucOZO5y5w5n7MPOYr2uG6PM1gydYZFg4LAosKipKgIWsifldrSgsDBYRFsPMU7jenZPO7wZlnHm9iflKpjgsCiwqKmqAhcBCYWFrYr6+qhEWCRYZFsPMU7rOxJQ7UWBRUSEh4ERwojgxnEScJJxknDhOCk7w9AVPX/D0BU9f8PQFT1/w9AVPX/D0BU9fxunHG/E50YATwYnixHAScZJwknHiK8RDRwpOKkws4GScfr2uubNIR3SFaN+L4STiJOEk48RxUnBSYTIu2P1MBCd4+hFPP+LpRzz9iKcf8fQjnn7E0x+X7lK5EeuI4ERxYjiJOEk4yThxnJQ1kjtSYZIDTgQnw/SrXwvjtXY3i3Ed72cScZJwknHiOCk4qTAZl/NqvpFubTmu5/1MxuknmUjqiOEk4iThJOPEcVJwUmEyLuy1Z3r7Mq3ZrWHHtb01pAwyBkUGJQZlBo3f0oepWNSaPSoMqgQal/1aaWD6n6T/ch9X/taQMsgYFBmUGJQZ5AwazwiZHthas0cVRxoCg4RBC9s45PoN1praIWNQZFBi0MI2HqsTStIhZ1BhUCWQLGzpkXJD3UCIMEgZZAyKDEoMygxyBi3MiHxD3qNKIA0MEgaNZ4TVcEUx9MgYFBmUGDSeEeY+oa6Upgu7/VZQYVAl0MK2vxUkDFICLew3C1NOrdkjZZAxaGEjYJj2kbXlQYcW9umpT6jbfaZJiJ6SMj0ZgyKDEoMyg5xA4+qJftskqF2NTsf1kzVkDBoPhFqZkNUOjedeG9UJdS9D1IXoyRcGYtrEMezJGBQZlJiByAxyBhUGMeGOSwtraDzkZtPnyax0KDEoM8gZVBhUCTR+dl9DwiBlkDGImRF1IadkE0rzWpiFhdHz6ePeb8W2oExPxqDIoMSgzCBqyAuDKpGTMOGKMEgZZAyKBBqvljX6tYjRmtohY1BkUGJQZpAzqDCoEmjhCM0KEgYxM2LhnEucXgG2Zjf3xm+z9babtj2NzF+CWgpETwtPNStIGWQMigxihnzhqWYFOZMTFW4l0PiF9RoSBimDxtWcqLd6xODgn6Pos139uzsfdvfH/dcx2qf308O3U7Vv/73sZwdsX87PD/vH9/P+ctT2dsr2ModNfGvqvy5bR9ulWty2p6/L5WXkrL3dNZfWa+v5fw==", + "bytecode": "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", + "debug_symbols": "ndzdaus6EAXgd8l1LiSNNCP1VQ6bTX/STaC0pT8HDqXvfpRN7QRrHLPWTbFLP0xnOY40lv21ezjcff75fXx+fHnf3fzztXt6ub/9OL48972v7/3u7u349HT88/vy17tw+pHi379/f719Pu2+f9y+fexuYkr73eH5oW+JdP94fDrsbkr4/rXfpQQLgUWGRYGFwsJgUWHRtoQuhARYRFgkWLiZp9h+RJK4FBkWBRYKC4NFhUVDRQ6wiLBIWyIvhcAiw6LAws1cVH+EWFsKN3MpNokalqLCoqGiBFhEWCRYCCwyLMqWWF5Fi8LCYFFh0VChARYRFgkWAosMCzhzhTNXOHOFM1c4c4MzNzhzgzM3OHODMzc4c4MzNzhzgzM3OPMKZ17hzKubedZpDJdtOYarAosMiwILhYXBosKibYnlKKMFWERYJFgILDIsCiwUFgaLCgs48xgCTtzUS5jGryWFgfixtzOJAxGcZJwUnChODCcVJ22LLGciMQacRJwknAhOMk4KThQnhpOKEzz9hKfvd+dKmS4XRUeScCI4yTgpOFGcGE4qThpM/DbddYKnL3j6gqcvePqCpy94+oKnL3j6gqef8fQznn7G0/d7diWfiQ0k46TgRHFiOKk4aTDxW3fXSdwgNoz6/ObddSI4yTgpOFGcGE4qThpMNOAET1/x9P0+XmlTD0HjMOj1G3kXZJyM+J2860RxYjipOGkw8dt510nEScKJ4ARP3/D0DU/f8PQNT9/w9CuefsXT91t7pZ6JDERwknFScKI4MZxUnDSY+C2+S6IDiThJOBGcuOk3m268tjZ8Wfh9vutEcWI4qThpKEl+r+86iThx0296JnkgghM//RJnUgZScKI4MZxUnDSY+L2+6yTixF+YE6L8mL5pAxIGZQYVBimDjEGVQf4KrTD38frmgPze3xaKDPLPiN7gn1AcLu5pZYXeBsoMKgxSBhmDKoMagVaW7cV5wtY3RxQZlBgkDPLPiH5hm1C/YA2oMEgZZAxaWcIpbUZl+FKWRqAcGBQZtLKcM9YzGgqRhUGZQYVByiBjUGVQI1BZOSP0jGxEkUGJQcIg/4yQFiaUw4gKg5RBxiD/jBCzGQ2ttOR3EjeQ30vcQpFBiUHCoEwgv3vVB+pTTn1zRJlBhUEri8DDvE65Dw+WqK6s0U42o2F1c6rCHCkzRyoMUgYZgyqDGoH8JkW6WISehh5d8tsUW6jiSPwmQh/j1xlJG5B/RvSL6IyGm1QSlDnSSiHmNVDukSqDGoH8eftGIWJkUGKQMIgJ15+7byG/5CLz50mkLpE/Od5CkUF+yaXIjEoZkDAoM6gwSBlkDKoMagQSJqeVx8HE5o/7+KiPCFMIYQohTCFWHvTaQJFBTMkz89FYeejrek6ZCTcrg4xBlUGNQP5ouc9kpyZG30wDKgxSBvnVy/Otpb45/k+VQY1A/t34LRQZlBgkDMoMYnLy72an81r03nyQATGFqEwhKlOIlVnNBlIGUSVnPhors5rrOTUmXP929RZKDBIGZQb53Zyczv0I5xHuhqLvvvfv7dvx9u7p8POahsfP5/uLtzZ8/Pd6WLzA4fXt5f7w8Pl2OL3K4fwWh1NtpKS9aPp1ejSh7ybVfbJ42j1llEPc5yD9qP3I/wM=", "file_map": { "50": { "source": "use std::hint::black_box;\n\nfn main(a: u32, b: u32) {\n // This version unrolls into a number of additions\n assert_eq(loop_(5, a), b);\n // This version simplifies into a single `constraint 50 == b`\n assert_eq(loop_(5, 10), b);\n // This version should not simplify down to a single constraint,\n // it should treat 10 as opaque:\n assert_eq(loop_(5, black_box(10)), b);\n\n // Check array handling.\n let arr = [a, a, a, a, a];\n\n assert_eq(array_sum(arr), b);\n assert_eq(array_sum(black_box(arr)), b);\n\n assert_eq(slice_sum(arr.as_slice()), b);\n assert_eq(slice_sum(black_box(arr).as_slice()), b);\n\n // This doesn't work because by calling `black_box` on a slice the compiler\n // loses track of the length, and then cannot unroll the loop for ACIR.\n //assert_eq(slice_sum(black_box(arr.as_slice())), b);\n\n // But we can pass a blackboxed slice to Brillig.\n // Safety: testing context\n let s = unsafe { brillig_slice_sum(black_box(arr.as_slice())) };\n assert_eq(s, b);\n\n let mut d = b;\n // This gets completely eliminated:\n let mut c = 0;\n set_ref(&mut c, &mut d);\n assert_eq(c, b);\n\n // This way the constraint is preserved:\n let mut c = 0;\n set_ref(&mut c, &mut black_box(d));\n assert_eq(c, b);\n\n // A reference over the output of black box is not the original variable:\n let mut c = 0;\n set_ref(&mut black_box(c), &mut d);\n assert_eq(c, 0);\n\n // This would cause a causes a crash during SSA passes unless it's a Brillig runtime:\n // > Could not resolve some references to the array. All references must be resolved at compile time\n // The SSA cannot have Allocate by the time we start generating ACIR, but `black_box` prevents them\n // from being optimised away during SSA passes.\n // If we use `--force-brillig` then the it doesn't crash but the assertion fails because `mem2reg`\n // eliminates the storing to the reference.\n //let mut c = 0;\n //set_ref(black_box(&mut c), black_box(&mut d));\n //assert_eq(c, b);\n}\n\nfn loop_(n: u32, k: u32) -> u32 {\n let mut sum = 0;\n for _ in 0..n {\n sum = sum + k;\n }\n sum\n}\n\nfn array_sum(xs: [u32; N]) -> u32 {\n let mut sum = 0;\n for i in 0..N {\n sum = sum + xs[i];\n }\n sum\n}\n\nfn slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nunconstrained fn brillig_slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nfn set_ref(c: &mut u32, b: &mut u32) {\n *c = *b;\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_0.snap index 9144530994b..f5c7012ea93 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_0.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+VawW7bRhBdiqQkykjsNj300EsDFL21oiVaDooCKZqkvvYQoLeGUeICBfoPBPonPfUHeijQS7+hH9EPCHINkrV3rMen4YqSuKECLyCsxJ2deTP7dnZIKjLXLXIf2xLXD8x6E5mHrp/u1/IOdU1D4owC4awFOTLNTcZ+c18ymm8vxx06nJHdLvWfT+cPMsW/DvHPMtAZQP+p6E/C6J+OnJ4fqrp+Q3ZjktPmiMwFyFyQzB1TTwKoR8aQqzJ//O5zbFbfP3HfM9IXgj+Iqev431PwD8A3276vwtgW/Y9AvzHd7+3HYfDf6H8SRn9x5Lg2iOpcS8Nw4Uz4PzTrTcZGcE38lrEx4EI+cYvpN/pkdYyjlV6WYzyYl0ZkX3QmzibLC89Tkv/c9RLvIczpkv8fg15DtgLn3TKwbwuNL7x2Y7jGXMJzGWPATeOS+LQtl3BfMZdFJ3IJ5ZlLIv+V6yXeyNHQXBp5/EsI14fAA8TPrUseIN+YB7vmlG9c32dOYf9QLvTZop0HsYJV7E9M0PyX83oKHo7PgGI3VLCeKGMRfR8qdoaKnduu65Dy0b5nz2c9nz1PXX/oZ08gXOfa+cJx3+d8EdzbrjVyG+03nS8o33S+lK7vc60D791C9I/D6J9FZj03aGsg9pnbHBfsRVdT7CYm6Pmb+3xD/JyjkUecrzVdoy11BebrzHc2Yaw5X2lYNT+iDmNym3TdlvuO2RbnAsa5TQ2A8k01wO+uP4QaAMfeUw1QRGQvNn7OCp4sDJ6bfITci5UYZBQ7zF9RQy+6eExsTUzQPZf7fPPdByDXOVdousZb6upzTX21XqbIR4pvkjvial2XjCUwNqaxtFqPiZV5GtXjcwh1uG2ciyeAC+PJbVONvmsu5nXbNRf/4fo+c/GxgjclXKGeTXH90HSPI9gGSpwwZ6d07U/X27V+FtX1cY5s2msnFBOU094dMlcRa0rzdr1P8OGzTd7Pydr2kANv1lb2Kq4t2hyDP7y3J+BTStf+cr22ttueESMFzx2IiTSJq+Xm36ZuMwGcMc1FjqQk/8qsdP7jvvv2ZES62+Yckf/X9aHf42s5R2xp+2Zf/mu+a2u4rx2ND4FjWWj5wpCPnKNxrOnejZt2XopPdl8sW5yXx0aPBdrXuOt7ZyLy/7k+8LsJlbucu0NzSosjnzvaM1TfO51d8SEGrg0O4b8HGuf3eWaP/z3om/P/u/4QOC8YbROehtwPaDPw/57m2r4x5D/HHsea3oNx0/gmPrXl25FZryNeg45fnPD7ej6uPUvVaqqIfqO8dn5p+2pMY9r717Z2OLdKXTo0/uf8Kcm/cb0d/9XFXrtv4DgkCj7kx+Pquuc9hnOxFhU8SbWS62q9F+fXNf0V1moVB+Yz2k9JfuQUYI2P/jzcEefloswvZ+VlWZQvXsyXJecy22SP8X/oQp6XtvnyJN5P3I1WepE3be8nRP5etNL5kfuu3U8IxiMY1+oJ3x7X3jmLvOz/YYP8kPCL/KcOpLaXEmU+xwvxtd1LKWC9C/aZI6FrPt85a7HdJ45o95w4V55F8FnxJXDkCw9HBCNyxFfjaBzRYsAcQXnt3bbGz1EL21rd6uOnxi/m59cefsbKfF+ux7VifmKsMNff9/AzdA7T1oHrs76fFabgD/PE96zwW4jrs4ZcbMx6LhNbGLuBgmdT/v+uo/z/BPb2o5b5n3VcQCy4luzjvTzGk/f9phzCtaSWQ7RaMtnSTlPt2VRLir6U5H/05Jc2/21HfLucf8hD20ZVXe9VD9dS0HuFG+VpLIOxpKrbmbjfsq9Zl+BISf5n4PiVDzBH5p8o9odkv4ZbuYYcZF2xck3kbUx/cpPsXuu69i0Xs/Pl6Xy5eF7MytnZVrWv8F6739aeq2I90LUfy+Ls+XJelNOXuf15usmPru2/M71Ylos8fzDPX87zYpP9tzKxC9tBOgAA", - "debug_symbols": "tdvRaus4EAbgd8l1LjQzGo3UV1kOh7RND4GQlrRdWErffZWldoolx/zT9c3BPuQbg3/Zlqfyx+Zxf//+5/fh9PT8urn762NzfH7YvR2eT3Xv43O7uT8fjsfDn9/f/3sTLv8w/ff715fd6bL7+rY7v23uiHm72Z8e65ZI9U+H435zp+Hz13bDDAuBRYSFwiLBwmCRYVGWRJoICbAgWDAsupkzlS/BQlMRYaGwSLAwWGRYFFTEAAuCBS+JOBUCiwgLhUU3c0npS4iVqehmLmqDyGEqMiwKKjTAgmDBsBBYRFjokpjeRTXBwmCRYVFQkQIsCBYMC4FFhAWceYIzT3DmCc48wZkbnLnBmRucucGZWzfzmIY5Q7TpnMEUFgkWBosMi4KKHGBBS2L6VMsMC4FFhEU3cw3D01l5+jTI/czLVUxnMtlgkWFRUFECLAgWDAtZEtP5VYmwUFgkWHQzVx1GoqZGZFgUVFAIOCGcME4EJxEnipOEE8NJxgmePuHpE54+4ekTnj7h6ROePuHpE54+4elTP/14JTYlHHBCOGGcCE4iThQnCSe2QCw0JOOkwEQCTvrpl2HOnYgawguE26MITiJOFCcJJ4aTjJMCk37D7jYhnODpRzz9iKcf8fQjnn7E0494+hFPv9+603wl0hDCCeNEcBJxojhJODGc5CWSGlJgkgJOCCfd9IsNjfFSmodFv493m0ScKE4STgwnGScFJv12XklX0swt+/2826SfvtJI9DvZNj/laMNv6yY39WXl+nHl+rpy/bRyfVu5fl65flm3fr+B+j/Wp5Xrr3z95p+P//HhUzdLU//H4+fa8mWl5kndb6/W3ph8obrZvAv2O6xLiDyIPUg8KHqQelB/fUwYm651s0XmQdmD+iOiNjIHRM0kifvt1yVEHsQeJB4UPUg9KHlQf0TQ2Piomy3KHlQciIIHzSygouF2Vze5QexB4kHRg2YW0EkZkVKDkgeZB2UPmllMR/mKmhPBwYPIg9iDxIOiB6kHJQ+aGRHpiqxF2YOKA82tsLyN+iNCShhQDC1iDxIPih7UHxFiNqKmJc39Nu4SMg/KHlQcqN/OXULkQT9/8b41cecYV66vK9dPK9e3levnleuXdevrj1+8b774sdLK9Xnl+rJy/bhyfV23fr87XOfyw3OobjY3xX5/eAmZA9nMQvswrjevrz8NmlkHz+OFRM0qdTb1HCl5jmQelD2oOFAOHkQe1D/l3z4m4OZvedxffriEzIH67av6ApBHJM39uN9UqnP58SLkZtEEF/UcaeZEjIs9u0cyD8oeVPATISF4EHkQe5B4UPSg/ikXGa8nkdyg4kD9BswSIg9iDxIPih6kHpQ8yDzIMyJ4JieVEak2aObs2Xi5t59sCSfPkcyDsgcVB5LgQZ5TLuxB4shJPOHOfOi5gJIHmQdlB+qvcKl952s3oPPBq6Hos+79vTsfdvfH/dfH4E/vp4dv34a//fOyn3wm/nJ+ftg/vp/3lw/Gr9+KX/KWSFtR+nVZAF13WfOWk1x2L+NO6iNZUqxHrUf+Fw==", + "bytecode": "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", + "debug_symbols": "tdzfaus4EAbwd8l1LiSNZkbqqyyHQ/+kh0BIS9ouLKXvvspSO8Eax3zT9c3BPuQnt/qUVJrI/tw87R4+/vzeH59f3jZ3f31uDi+P9+/7l2M7+/zabh5O+8Nh/+f39X9vwvmfFP97/dvr/fF8+vZ+f3rf3MWUtpvd8akdETX/vD/sNnccvn5tNynBgmCRYcGwEFgoLAos6pKQiaAAiwiLBAsz8xTrt0gUpyLDgmEhsFBYFFhUVOQAiwiLtCTyVBAsMiwYFmbmJPItSOtUmJkT6yBKmIoCi4oKDrCIsEiwIFhkWPCSmH6KssBCYVFgUVEhARYRFgkWBIsMCzhzgTMXOHOBMxc4c4UzVzhzhTNXOHOFM1c4c4UzVzhzhTNXOPMCZ17gzIuZeZZhDpd1OocrBIsMC4aFwEJhUWBRl8R0llEDLCIsEiwIFhkWDAuBhcKiwALOPIaAEzN1DsP8lVPoiB17vZDYEcJJxgnjRHCiOCk4qUtkuhKJMeAk4iThhHCSccI4EZwoTgpO8PQTnr5dnWMePi5YepJwQjjJOGGcCE4UJwUnFSZ2me42wdMnPH3C0yc8fcLTJzx9wtMnPH3C0894+hlPP+Pp2zU7zheiHck4YZwIThQnBScVJnbp7jaJC0S7WZ9dvLtNCCcZJ4wTwYnipOCkwkQCTvD0BU/fruNxHWoIErtJr13IuyL9YsSu5N0mghPFScFJhYldzrtNIk4STggnePqKp694+oqnr3j6iqdf8PQLnr5d2uNyIdQRwknGCeNEcKI4KTipMLFLfNdEOhJxknBCODHTrzp88Vpr98fCrvPdJoITxUnBSUVJsmt9t0nEiZl+lQvJHSGc2OlzHAlfk2330pR1eG07TF37vHL7snL7+uP2xzdfO6xd+2Xl9uu67duVz/+x/bhy+2nl9mnl9vPK7a88/tOPx8/lC5PEsd/TaG+JC5G+UTvUDiUPIg/KHsQeJB6kHmTvjQxjPbwd9qg60MwOyQVkj4j2RdmAYjdJSjP7JBcQeVD2IPYg8SD1oOJB9oiIY+GjHXbILscuoehByYNmNkzH4eOuHXZTELssu4TYg8SDZjZPUx0Rd5PbXDyoOhAHD5rZSB3LBXUdwcmDyIOyB7EHiQepBxUPmhkRckH9lF6CB0UPSh5kjwiqYUA59Ch7EHuQeJA9Ikh1RF1JOtll3CVUHcgu5S6h6EHJg8iDfr7wvjlxV1m5/ZUXHrrywltXXniXlRfeZeWFd/nxwvv2wq/Qyu3nldvnlduXldvXddu3q8Ot3jX8HWqH3YeiXR9eQhVHFGZusgrj/Uxt+dOhmXug0vhGit1dUBTUc6XiuVJ1oBg8KHpQ8iByILtola5uVkvdd3lkV6KWUPIgexi1ZfiIqHbIHhFtBTCibjMLUXBciWY6YtwrbV4peRB5UPZ0BHuQeJB6kCvc6kAzt4q2H3tA7YfpUPYg9iC7y4lpRMwdUg8qHlQdyK5wLKHoQcmDyIM8OfFM7+n4du9vCSbxdIR4OkI8HSHZg9iDPF0unreGFE9OnnA1eFD0oORB5ED2DpdWd75UA4xHF1QUfbWzv+9P+/uHw+77YSPPH8fHq2ePvP/zups8huT19PK4e/o47c4PJLk8i+T8a5LKlor8Ot9g005Tmz2nyufTc3dTzVuq0q7arvwv", "file_map": { "50": { "source": "use std::hint::black_box;\n\nfn main(a: u32, b: u32) {\n // This version unrolls into a number of additions\n assert_eq(loop_(5, a), b);\n // This version simplifies into a single `constraint 50 == b`\n assert_eq(loop_(5, 10), b);\n // This version should not simplify down to a single constraint,\n // it should treat 10 as opaque:\n assert_eq(loop_(5, black_box(10)), b);\n\n // Check array handling.\n let arr = [a, a, a, a, a];\n\n assert_eq(array_sum(arr), b);\n assert_eq(array_sum(black_box(arr)), b);\n\n assert_eq(slice_sum(arr.as_slice()), b);\n assert_eq(slice_sum(black_box(arr).as_slice()), b);\n\n // This doesn't work because by calling `black_box` on a slice the compiler\n // loses track of the length, and then cannot unroll the loop for ACIR.\n //assert_eq(slice_sum(black_box(arr.as_slice())), b);\n\n // But we can pass a blackboxed slice to Brillig.\n // Safety: testing context\n let s = unsafe { brillig_slice_sum(black_box(arr.as_slice())) };\n assert_eq(s, b);\n\n let mut d = b;\n // This gets completely eliminated:\n let mut c = 0;\n set_ref(&mut c, &mut d);\n assert_eq(c, b);\n\n // This way the constraint is preserved:\n let mut c = 0;\n set_ref(&mut c, &mut black_box(d));\n assert_eq(c, b);\n\n // A reference over the output of black box is not the original variable:\n let mut c = 0;\n set_ref(&mut black_box(c), &mut d);\n assert_eq(c, 0);\n\n // This would cause a causes a crash during SSA passes unless it's a Brillig runtime:\n // > Could not resolve some references to the array. All references must be resolved at compile time\n // The SSA cannot have Allocate by the time we start generating ACIR, but `black_box` prevents them\n // from being optimised away during SSA passes.\n // If we use `--force-brillig` then the it doesn't crash but the assertion fails because `mem2reg`\n // eliminates the storing to the reference.\n //let mut c = 0;\n //set_ref(black_box(&mut c), black_box(&mut d));\n //assert_eq(c, b);\n}\n\nfn loop_(n: u32, k: u32) -> u32 {\n let mut sum = 0;\n for _ in 0..n {\n sum = sum + k;\n }\n sum\n}\n\nfn array_sum(xs: [u32; N]) -> u32 {\n let mut sum = 0;\n for i in 0..N {\n sum = sum + xs[i];\n }\n sum\n}\n\nfn slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nunconstrained fn brillig_slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nfn set_ref(c: &mut u32, b: &mut u32) {\n *c = *b;\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 52f1563acd3..1b140906b9c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/hint_black_box/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+VazYojVRQ+N0lVuvJDgiIo6EJQEEFJdZJOC6KDOM8guJGaTDdufIc8gAvBjQ/iQnDjyhdwI7hxI+LWhVudOPdMnfrqq5tUd91OD1MQbtW9557/v6obJ08v53/7a+DHntQvhXngx8XtrrxDXIuYfLpIfFaU7KT50rVP/E0G+/fT/Q4FzoBul/gvF6uLjMjXIf/LzOCMgP9c8Q/i4F8MPZ5Pd1X8AnT7AMf2KMxDA/MQYKZSTQIWj65ZX9X9Z09+Mynv5/4+A3wx/Mfy1LX+Xyb8K62xl/UdV65Zm4jnBffjfeKf0wZ4xZcA/CtG3+87jtPyMAjwkBIeLHwCPCj8awEemB6SljwkAT0o/Btyej28KYf1MGiQqwc4Ff5tP2ZAq2sff8ngFaAVN78tz9FOgwa9o44U/t17pKNIOaiYSrPPOKnnZOZjGHeHYg31rfDatTA/TwkPvQAPQ8KDhU+BB4VfBXhgekhb8pAG9KDwl3J6PXwoh/UwaJALc6nCP/BjRniNHU9Ki/UZ7m74unBAT6TabyGvI4ka+3mojln99EB3zOfnZK2p/lk6KaHzouPCnCxAx45KB+eUTuzaNZd6zGDtGsahvVb8Z3Hw51ODE2Xbj5+ZeSfl+3Iipe3t3qFZt/CvuxLn535uBjAst7O+xsI39fZf+FH1N5Io+qN5WGmF+o4pyII47CgS9v850UsKdJrse2XmLe/H2lfh58a+X/o5ta+VPwN6+tzU26N9Ff4rP57SvhmRKUbsj+PgX6LNRXiMKf3b5mxLayR1W8eo+0w2yz/GkPUj9FWGa9QSV2R/XWJcMblZjmK8Mjlchzp5kXCx74JtYofRsfs0p4dqauxcqTxpvrA5nflXT+r5Te9Fypyvc1/7cd8L5a7c0+TvWUB3rCYdqpXfCKfZthfqm1r5rZ9jdkM/1OdjeyGF/86P96EXsmu9u+Fr7YBeX8JxrPxM4vCzxDgR4XEyAd3dtFe0tEZS95sYdZfJFopHmwMwfzJc45a4TmlTq+sJyDYh8CznTxVmV8elawOzNoa1ZFfXyT6PrlwJd5f1KdQbRep3F6hzm0eZz/SkbjNrrwTmvvcjq09te4iM8HOoPv0gVZr22+sx9Unh/zE4f/T3M7LfwT2rT+ysFevTT36M/D5F61MG8tk17JsinYEvsJ9o0p/y1iN6srkV+42f/cj8EmO6Kf+wvknhWG0fwhrrR7v8Bhj6RjcDnljOOXVPPDTyYD4K9cS/+JHZdihV3eFcKOcMQT9Wd9KdfnI8q8Cc9qtUZeobPbCzHgd6Uvg/Dc7f/H0o5jGHWrtZ+KZzoN+lqr9YuYPlNKU1DfB7W/n+uKfyqe+Mpe4Df/lxHysfuyr/9+UbG+YLC2/zhdqB1eUxrNl9SUs6WH+010kb4BUf9kZ/+9GetbKcjXroE/5svOu5CMsjfcOr5pHn1d4qy4zIGbK3a0kHc+lN7f2vH5m9nTTrgf3/wPog2rtPeLe98CntHfLrtvZmvtOFvfF7003tPfGE29qbfbc71t6Z4VW/zc1ayGhpsjMBhZ8SePyOYGlbGadH0Gb6RdpN9lB8CcC/GrBH6HsE8+Nj7TEyvOq54jFnvMxH2X8zQjrE+La0mb5CtNm7dyg+WGxifLwVsEcoT3QVH3qO/+wdc1fCdZUPN5dP33f+53VX6sHWcAH6CcC/5xFYves4uAWf15siv14W18W6ePx4tS2wr9xf9n/JXdNfrYvNttjk+Qer/GqVr++afrFZXm7PV9vNo/WyWF4clF/nh7tyXe3YN3OJv9e8c2bhYS0za4Ndlf7IP+t7COJSPhKA/8gj0P/Op2aP7p8T+inQr/BN5mwOQlx9Mmd7kY3fFMOu2/XFo+0T51pc5fvH80N2/Q/JdZthqTQAAA==", - "debug_symbols": "tZzdTus6EIXfpddc2DMej82rHG1t8VO2KlUFFTjSEeLdT7pFWlSbRKvpukEN5Ptouzyuazv5WD2u79///N7snp5fV7f/fKy2zw93b5vn3XD08Xmzut9vttvNn9/ff70Khx/R/57/+nK3Oxy+vt3t31a3UeRmtd49Do9UB/5ps12vbi183jSnShT/Oleipu8n/7pZxcLVV6peAlcfuXrh6pWrT1y9cfWZq+dWrXCrVrhVq9yqVW7VKrdqdbZq8zmRYMJgIsNEtwIk1vGlt6+8wERFiRRgIsJEt4Fozl+Eej0nFCa6mauNDUtLWNIIk3H1mat3rr5w9ZWqt8DVR65euHrl6rlVa9yqNW7VGrdqjVu1xq3aPFu1ek5EmBCYUJhIMGEwkWHCYaLAREUJhzN3OHOHM3c4c4czdzhzhzN3OHOHM/du5imPo+bkeaZT+DbOFAln+hK4+sjVC1fvi/Vajno9H4DX5e+95aM++7l+9r1vnpDAhMJEgoluJVsYX7o1udVuJad6IuKSZlGdqy9UfQxxsX+qVceQFvunmnUMNudvZpBDxhHHkYIj3d7dbKwGyw0SA45EHBEcURxJOGI4knHEcaTgCJ6+4OkLnr7g6QuevuDpC56+4OkLnr7g6QuevuLp92eyLZ0Qn+mNVY9fKlVL4xeyX8n+RPYb2Z/Jfif7C9lfuf7+asAV/eT6Tcvbv+nRb9b4l7cfl6O/+XIQ01z78WYAnCqMWMCRiCP9vrSO+eUYG0RnkHb8359BnkYMRzKOOI4UHKkw0p85nUYijgiO4OlnPP2Mp5/x9DOefsbTz3j6jqffn0S1ckLm1venO+3+lOsV/Ur2J7LfyP5M9jvZX8j+yvX3Z62v6CfXb1ne/icHXWV5+5kcdJXZ9pMbpMJIDTgScaTbl1Yfp1BrbQZd/VnvaSThiOFIxhHHkYIjFUUkdNOv+YS0O3kjjvTTt3hEbKZSko/nDg+l8SvZn8h+I/sz2e9kfyH7K9ffX024oj+S/eT6jcvb5/HDZ3hYG//ifE8LoWLxfPeA/HB1Q4jj8GF46A0UL4HkEkgvgbp93rACMfbzwzJB83Hy07UAuRyhNv2fdvhPQ34JVC6B+nvstYYRSqGBNHJbtArZr2R/IvuN7Cf3WOpkf+H2iErucVMg+yPZL2S/kv3L52amvltLcrK/kP2V67dA9i+fm5ma2xATsl/J/kT2G9mfyf7lC8KT7TMHsj+S/UL2K9mfqAvOko3sz2S/k/2F7K9cf39t7WrbY6W/tgb5j5ulO9tjpb+2dkW/kf3LN29PbR8Wd7K/kP2V6//hipDr+SPZ32//17poQ4ot9k+2/5LJfif7y2L/dL6V6ydflSM1kv1C9ivR/zkc/Xu339zdb9dftzV6et89fLvL0dt/L+uzGx697J8f1o/v+/Xh1kenux4dnqeGcqOx/DpcajEcytDLaIiHw/j3rzIcpuG/Dv/5fw==", + "bytecode": "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", + "debug_symbols": "tZzbbts6EEX/xc9+4HA4HDK/clAUuTiFgSAJnOQARZB/r1xEtmGyErbl/VJYhdZK4s2hpJGoz9XD5u7j18/t8+PL2+rmv8/V08v97fv25XnY+vxar+5226en7a+fp/+9Cvt/xP/u//Z6+7zffHu/3b2vbiTG9Wrz/DB8Uh34x+3TZnVj4Wvd7Bol+ve+UTSd7vxjvZLC1VeqPgauXrj6yNUrV5+4euPqM1fPrdrIrdrIrVrlVq1yq1a5VauzVZvPiQQTBhMZJroVEKWOf3r7lxeYqCiRAkwITHQHiOb8TajXc0Jhopu52jiwtIQlgzAZV5+5eufqC1dfqXoLXL1w9ZGrV66eW7XGrVrjVq1xq9a4VWvcqs2zVavnhMBEhAmFiQQTBhMZJhwmCkxUlHA4c4czdzhzhzN3OHOHM3c4c4czdzhzhzMvcOYFzrzAmRc48wJnXuDMC5x56Wae8ngVkzzPTNIn5/0xhnN94eorVV8DV2+L9VoOej2/IKrLv3vLB332c/3sd3/+C0kIOCI4EnFEcSThiOFIxhHHkYIjePqCpy/d9C2Mw9KamhLpp1+PiCypWREl+xPZ74v9U5OO9O8/QP6pWUf6NyBO/c0NlxhxRHEk4YjhSMYRx5GCIxVGNOAInr7i6fcbzmbjTGW5RRKOGI5kHHEcKThSYaTfd55GBEcijuDpJzz9hKef8PQTnn7C0094+oanb3j6hqdvePqGp9/vS1o6Ij5zlFQ99MZUS+PPZL+T/WWx3/TgN2v8levvNyev6BeyP5L9SvYnst/IfvL49+Xjx+PB3164+dz48ebCxBVHEo4YjmQccRwpOFJhpAQcERzB0y94+v2GqtXxuJJFGsRmkPZ6ud9SnUYcRwqOVBjp9zOnEcGRiCOKIwlH8PQrnn7F0694+hVOP4aAI4IjEUf66ZcjMvf42OTJZOy3aq/oN7I/L/ZPnQzEfsf4iv5C9leuv9+4vqJfyP5I9ivZTx7/snz8TJ0Mxzg7fnKDCI5EHFEc6c6l1cdbDrVKgxiOZBxxHCk4UmGk3+WeRgRHuunXfETatRCKI/30TQ6IzVRK8nHf4WNs/Eb2Z7LfF/sPxTd8bGaSfmf+iv7K9fd7/lf0C9kfyX4l+xPZTx6ftjjf47MDg0wbf38hS5Dx9GH46A2kl0DpEsgugf6xTkXHeX64Dd0cTuwfi7VyOUDt7GflEqheAOVwCdRfBKU1jFAKLUSuyEyuyGxkfyb7yUfUTJ6xMvmI6oE7Izp5xvVI9ivZn8h+I/vJvRkn92YKuTdTyL2ZQu7NlOW9mcneRklkv5H9mex3sr9w/ZX7oEGskexXsj+R/Ub2L39QaHr8ONlfyP5K9WsIZL+Q/d3xf7XHyTXYYv9hgUHncXINmex3sr8s9k89bq+hcv0SyH4h+yPZr2T/7AKjRWvQVJavL5wc/1LI/sr1x+VLDCfzjUL2R7Jfyf5E9hvR/zVs/X+7297ePW2+35r3+PF8f/ISvfffr5uz9+m97l7uNw8fu83+zXrHl+rtv2dNYa0WfuzX9+03Y1mr6n5zP4pU07CZh586/OQ/", "file_map": { "50": { "source": "use std::hint::black_box;\n\nfn main(a: u32, b: u32) {\n // This version unrolls into a number of additions\n assert_eq(loop_(5, a), b);\n // This version simplifies into a single `constraint 50 == b`\n assert_eq(loop_(5, 10), b);\n // This version should not simplify down to a single constraint,\n // it should treat 10 as opaque:\n assert_eq(loop_(5, black_box(10)), b);\n\n // Check array handling.\n let arr = [a, a, a, a, a];\n\n assert_eq(array_sum(arr), b);\n assert_eq(array_sum(black_box(arr)), b);\n\n assert_eq(slice_sum(arr.as_slice()), b);\n assert_eq(slice_sum(black_box(arr).as_slice()), b);\n\n // This doesn't work because by calling `black_box` on a slice the compiler\n // loses track of the length, and then cannot unroll the loop for ACIR.\n //assert_eq(slice_sum(black_box(arr.as_slice())), b);\n\n // But we can pass a blackboxed slice to Brillig.\n // Safety: testing context\n let s = unsafe { brillig_slice_sum(black_box(arr.as_slice())) };\n assert_eq(s, b);\n\n let mut d = b;\n // This gets completely eliminated:\n let mut c = 0;\n set_ref(&mut c, &mut d);\n assert_eq(c, b);\n\n // This way the constraint is preserved:\n let mut c = 0;\n set_ref(&mut c, &mut black_box(d));\n assert_eq(c, b);\n\n // A reference over the output of black box is not the original variable:\n let mut c = 0;\n set_ref(&mut black_box(c), &mut d);\n assert_eq(c, 0);\n\n // This would cause a causes a crash during SSA passes unless it's a Brillig runtime:\n // > Could not resolve some references to the array. All references must be resolved at compile time\n // The SSA cannot have Allocate by the time we start generating ACIR, but `black_box` prevents them\n // from being optimised away during SSA passes.\n // If we use `--force-brillig` then the it doesn't crash but the assertion fails because `mem2reg`\n // eliminates the storing to the reference.\n //let mut c = 0;\n //set_ref(black_box(&mut c), black_box(&mut d));\n //assert_eq(c, b);\n}\n\nfn loop_(n: u32, k: u32) -> u32 {\n let mut sum = 0;\n for _ in 0..n {\n sum = sum + k;\n }\n sum\n}\n\nfn array_sum(xs: [u32; N]) -> u32 {\n let mut sum = 0;\n for i in 0..N {\n sum = sum + xs[i];\n }\n sum\n}\n\nfn slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nunconstrained fn brillig_slice_sum(xs: [u32]) -> u32 {\n let mut sum = 0;\n for x in xs {\n sum = sum + x;\n }\n sum\n}\n\nfn set_ref(c: &mut u32, b: &mut u32) {\n *c = *b;\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index ff67236f93a..24f6fd78821 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/import/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -24,18 +24,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/7VY23KcMAw1y97YZJu0/RGMAcNbZnp7af+gMx1j8Ef0aWf644WJnWjPamnSYM1knEUgHR3JQjgRj5L4v0nWfl2JSwn3PPg1f5vIBW3lMXEmkXCekZyI6xJ0f/yawfOTPl0w4Az8Lmm/ycs6Y+JbEL/KiM0I9otgfx3Hfr7zdj6fzu0L8HsU55uXPhN0tMa+eN3e68P/d/7/DOzFyDvFtDRvHxn8KxLbJJ9Oz3y80K/8l98bz+M34HETJ8465HYrLiXodsQ35QMlhd8U9xTTD2IX70OftEZ3oKN7ZQ+6DWM3cLgl15fsERwnKVyj/g8iak5lIi5zmopLflbA3Y7Bes/oaGxUR/3sGD+crZBL7LOC8tGoQbdS9o2q8lbXRevGytWVks7KyhrX69Y0bTcMtlNtmytXt5UubK1qV5rKYI+ltqXRrhqcMb12ajRWVKaVjVO5tU2vlVLOWtPpUW3b3MmyHxrZWVsVjWtbVfVcbZ1hf6McGT6xrveQm4V8ly+t6+D/IPhaeVgGz1Nd7wHPtXoL3GUM1ntGh3WdMX4yxg9na72grVBbd+J6b4w9RyD3axIH+gzxYG3SvG3gWuXX6fcv8gz2hJS5NtdfUuDnEIefLtTajbiUoLslvvGddiQ6+l5A4d6xIaaJu47YxfsQD62jW9DRvB1BR2vzHfgI2EN+ufkpEfyHIsa+vWLrq19jz4AfiF2M4UY887A+Le9fN497bpL09MwD5p/638D93/1vWvNhXb8Bp9NGOmXc+Grt+9Ia5EkAT9w8G6lPVdwcGARnXaxPFG6vBdxTTL+JXbwPfdIa3YKO6+foLzwfvjmwB2LM6HN9xS63T3EPh3t/+jXyPM3uO+SM25Mc14GjqQ6X3gdGq8YWpdVdpYyqX7UPMPf0uch75MVzXfB/EJd1GmOuWwOeRPBcRv4mVsEv9/20msETae4tcPaieLg56L3HjjXEvVsR957Yp7ElcWKbzT3O45OEGZjrbZGxPuVh80qsXA4iY52t4TmsXI28tufimWLKxI/9cA5beC4V1/u7YK4lM7iR/0ke/CqVGs/pei1d71Sl26KT41HCeJbgdN2UvavK8ThgkKVRRTvo8VSgGYbxNMLq2rW9rR3ysJqJ7X+5nfj7C4O89p51GQAA", - "debug_symbols": "1ZrdiqswEIDfxWsvMslkJumrHA6Lbe0iiC22PXAoffc13bXrWilrwDK5ESLzTT78mVGYS7Yt1+f3t6rZ7Y/Z6s8lq/eb4lTtm251uebZuq3qunp/G57OVDgA3eKPh6IJy+OpaE/Zyuk8K5tttgLgDt9VdZmtLFzzh0gANPdY9x0MfirYGtUHW/sj+G+eActRcXJUvBgVreSogBwVLUfFyFHBl6qAu6voBxUrR4XkqLAcFSdHxYtRMUqOCshR0XJUXlttHfXBZM3zYKOIv4INaBp7Y6LeNlFvStSbE/V2iXr7NL1RJeoNiXrrRL0T7ZeYaL/ERPslJtovUUi/DCpCWmBQEdLVOhUrpFEFFSG9J6gIaSdBRUiHCCpCin5QeWkdJ+vvKt6OVUiOCstRcXJUvBgVUnJUQI6KlqNi5KigHJXJagsWe4Tt0CUQNJvg2YSbTfi5BE/uYQih/+Ylh88vrVP9LXPDz2O+pfeLpndq2fSwbHq9bHqzbHpcNr1dNv3k+2uY+pJinIJRlXA8zVh+wky/X4z+CePnM15FMBDBTLqh9X2JQUL1zdBtmkGpGAhiIB0DmRgIYyAbA1EMxDGQi4F+8USYMQQqBoIYSMdAJgbCGMjGQBQDcQQ0PVxC2DM/flz5E8H5yORFINeXenLuAaFppJ9OYfW4C89Drt3qX9FWxbouv0bqdudmM5iwO/0/lKNhu0O735Tbc1uGsbvBxF143hlyptut6Bbe5p67Pbp9PgA=", + "bytecode": "H4sIAAAAAAAA/7VYzZKbMAw2IX8ku7Pb9kUwBowvbWa6+wad6ZkYfO21xzx6YWpvlC8K3W2wZjIOyEifPslGJhF/JfG/UZZ+XIhrCXMOfszvEzmjrTwmziQSzguSE3Fbgu63HzN4ftSnMwacgd857Td5WWdMfDPiVxmxGcF+Eewv49jPN97Oy+nSvgC/j+Jy8dJngo7W2KvXbb0+/H/y/zOwFyPvFNPcvH1h8C9IbKN8P535eKdf+S+/e8/jN+BxFSfOOuR2La4l6DbEN+UDJYVrinuM6ZXYxXnok9boBnR0rWxBt2LsBg7X5P6cewTHSQr3qP+diJpTmYjrnKbimp8FcLdhsD4zOhob1VE/G8YPZyvkEvdZQfloVK+NlF2jqtzoujBuqFxdKemsrGzrOm3axhz73h6VMblytal0YWtVu7KtWtxjqW3Zalf1rm077dRgrKhaIxuncmubTiulnLXtUQ9qa3Iny65v5NHaqmicMarquNq6wH6nPDJ8Yl1vITcz+S7fW9fB/07wtXKYB89bXW8Bz616C9xlDNZnRod1nTF+MsYPZ2s5o61QW9kNzAd/nd8nbeBrJ64l6PbEN+7LD0RH9zYU7j0RYhrz85PYxXmIh+ZsDzqagwfQ0TXzCD4C9pU45y/oaL/BHXYw9vUNW1/9GLuP+UzsYgx7ceZ9eZrfv27yPPhNT2ceMP/U/wrmv/jrHRPH8g6cTrfSqdYNr4euK22LPAngievJIvXsFdfLBMF+DesThVtrAfcY0y9iF+ehT1qja9Bx/Rr6C8+Hvhnf91z/tmDs4DW3TnENh7k//Bi5J2TXHXLGrUmO68AR1iFyT/1FrtF39wbB/05c10mM3mAJeBLBr+nI5yo11YMvJvBE6p2Kqd4pZfB88tixhrh3G+LeEvs0tiRObJO5x55ulCdxe2+JjPUtD6sPYuVyEBnrZA1PYeVq5KN7Hn6XSpn4cT+cwhaeS8Xt/VUw95IJ3Mj/KAc/SqWGbz2dlq5zqtKmOMrhODqcR52um7JzVTkcKXtZtqowvR5Olk3fDydaq2tnOls75GExEdv/cjvy9wcclIm7uRcAAA==", + "debug_symbols": "1ZrRiuowEIbfJddeZJLJJPFVDoelal0KpUrVhUV8923djdutWdkGKpMbITLf34/YziDNWWzK1en1pWq2u4NY/juLercujtWu6Vbny0Ks2qquq9eX4ddC9h9A1/rDvmj65eFYtEexdGohymYjlgC2w7dVXYqlgcvirhIA9a3WfReDjxUbLUOxMT+K/y8EWD4qjo+KZ6OiJB8V4KOi+KhoPir4VBVwNxV1p2L4qBAfFctHxfFR8WxUtOSjAnxUFB+V53ZbR6GYjH5crCXZr2INisbemKm3ydSbMvW2mXq7TL19nt4oM/WGTL1Vpt6ZzkvMdF5ipvMSM52X+NR5ScbfvL0Zqzg+Kp6NipF8VICPiuKjovmoIB8Vw0eF+KhEuy0YDIg1Q5eecJMJP5UgOZmAqYSNXkMTQphN5PDx1joZfjI3HGP2Gg/zxqt54/W88ThvvJk3nuaNt/PGR59fbSm0FO0kjLqE9XHG2N8ZF3++LPoHDCQwKoHRCUx039D40GKQUH4zdGX8dMbLBAYSGJXA6AQGExiTwFACYxOYP9wHesz46QxImQJBCqRSIJ0CYQpkUiBKgCC6EYSB+fHX1n4iejoS3QRyob+Tc3eIiSPh1bGV91ehacilW70VbVWs6vLrvMv21KwHx1+O7/tydBJm3+7W5ebUlv2ZmMFxmP7W7QYKuS62i/4A", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 8b9b9440a8e..437cd010a59 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -66,8 +66,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "1Z3fbuI4FIffhWsu7PPHx+6rrFYj2tIREqIVbVdaVX33TaZNBhEv6ESL95ebkZjmSz+C8wVI3HysHrf37z9/7A5Pz6+ruz8+Vvvnh83b7vnQPfr4XK/uj7v9fvfzx+l/r0L/j9Cv5V9fNof+4evb5vi2uouprFfbw+Pqjih0/NNuv13dafj8c70SdhPiJtRNJDdhbiK7ieIlNLiJWCXU/p0gN8FuQtxE9TUnDQNR7JxIbsLcRHYTxUuk4CaimyA3wW6i+ppzHAjmCaFuIrkJ8xJW/R0y7oOS9ZwwN5HdRPESObiJ6CbITbCbEDehXiKG6kuozN+Ispwjsbp9TQckB5og1c2laRiMajxB2I+IH6k+/ST5G0kpTJDqELZxxzKaPv3iRij4EXE/F1I/kvyIfyNzdD99Jj/CfkT8iPqR5EfMj/hHMvtHsvhysZ6+e8o0rD5mzePCsVQWpqDje8ZwMq66hX/JRCQZQpJhJBlBklEkmYQkY0gyGUmmAMkoUoEVqcCKVGBFKrAiFViRCqxIBVakAitSgRWpwKltgbuPHINMNJnIRCQZQpJhJBlBklEkmYQkY0gyGUmmAMkYUoENqcCGVGBDKrAhFdiQCmxIBTakAhtSgQ2pwBmpwBmpwBmpwBmpwBmpwBmpwLltgUlGGY50eWEOabjcpVs2TcxtseZ5seZlqeYlLNY8LtacFmvOizWXxZrrYs0Xewwtiz2GlsUeQ8tSj6EUlnoMpbDUYyiFpR5DuzNZTc2Z42jONJFpmwsuw4pJwnTLtC2AyLhlROO5TAxIMhFJhpBkGElGkGQUSSYhyRiSTEaSQSowIRWYkApMSAUmpAJT2wKrjTJp+k6P2hY4MY0yohOZhCRjSDIZSaYAyXBAkolIMoQkw0gygiSDVGBGKjAjFZiRCsxIBRakAgtSgQWpwIJUYEEqsCAVWJAK3HhyX7Lxq1cjnshkJJkCJNN4ct8VmYgkQ0gyjCQjSDKKJJOQZP7HAk++LNKMJOMrcI+k4Efa7rOXz4Q2ng7GJqNMnsookkxCkmm7z7Km3zKTgDSeDnZFpgDJNJ4OdkUmIskQkgwjyQiSTOMCy3g4Zp3KJCQZQ5LJSDIFSKbxdLArMhFJhpBkGElGkGSQCpyRCpyRCpyRCpyRClyQClyQClyQCtx4TpOE8Q8ZCZWJjCDJKJJMQpIxJJmMJFNwZLjxxJwrMhFJhpBkgArMAajA3Hqu0KXpORwSkowhyQDNouLGs6guyzSeRXVFJiLJEJIMI8kIkgxSgSNSgSNSgSNSgSNSgQmpwIRUYEIqMCEVmJAKTEgFJqQCE1KBCanA9ek53bf4419xyPlk7mD+gngOJHMgnQOlOZDNgfIcqMyA6tMbrkFxDjRnRMicESFzRoTMGREyZ0TInBEhc0aEzBkROmdE6JwRoXNGRP16A07jpGROWS6nqwvhkMTTCy/ta/3ltuuvXxXwH64/3nj9dOP1843XLzdev954/fX7pFoajsbdCDuflM/189Vs4117q1B9TzMpl6AyA6qfp70GRT8k9U+pSYYLXtPp2Un7QoobqX/iS3kYAinnCRLryPCGzML0t5AP+ewe/bU57jb3++337cOf3g8PJ3cTf/v7ZXt2Y/GX4/PD9vH9uO1vMf777uL9E2TVdTfuOpXenYuuJXL/ynSPKK859z/pF0xlbdI/6JeTKN1yqbPpjP4B", + "bytecode": "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", + "debug_symbols": "1Z3bTuM6FIbfpde9sNfJy7zK1taIQxlVQgUV2NIW4t0n7ZBQ4UyrhZTMnxukQP7VL4n9mTR1/ba629y8/vyx3d0/Pq+u/nlbPTzeXr9sH3fd1tv7enWz3z48bH/+OP31Kh1+aDru//x0vTtsPr9c719WV9nqerXZ3a2uiFKXv98+bFZXmt7/Xa80hxMUTnA4IeGEhhMWTpRwwsOJOprQ8seEpXAihxMUToxec9LUJ2r5mpBwQsMJCydKOOHhRI0mSgoncjgxes059wnmJsHhhIQTGk346BWUoQ+K62li3Z4kN+3Pknseds5+LO/Tlq+Tlq9p2vJ52vI0bXmetrxMW16nLW/Tlp+219Zpe22dttfmFOu2x0iORygcodE2rcwfEWVpIqNXumgf8URNZPT0qvWDgBb+GuEUj+R4ZPTwTfwjYpaayGg3LcOAVqg5fLZ4pIQjksPHIhSPcDwSP8ni8cOv4cj43df5SI5HKB7heETikXhL1nhL1pguWrVmp758dvVPtdYxDycd7tXSSbvqdj7COBJMBYIZvyv9WzAZCYaQYBgJRpBgFAnGkGCQDGxIBjYkAxckAxckAxckAxckAxckAxckAxckA5d5Ddzdo/YwXQtpYBwJpgLBeEKCyUgwhATDSDCCBKNIMIYEg2RgRzKwIxm4Ihm4Ihm4Ihm4Ihm4Ihm4Ihm4Ihm4Ihm4Ihm4AhmYEpCBKQEZmBKQgSnNa2CSAYYznd+Zk/UfM+v2tYZcFkuuiyW3xZKXxZL7YsnrUslzWix5Xiw5LZZ8sWNoXuwYmhc7hubFjqF5sWNoXuwYmhc7htK8PmfOAzlTAzOvLrj2hUlSe2bmNYDIcGZEcwNTkGAcCaYCwXBCgslIMIQEw0gwggSjSDBIBmYkAzOSgRnJwIJkYJnXwFoGGGv/05N5DWxMA4xoA8NIMIIEo0gwhgRTkGAcCaYCwWhCgslIMEgGViQDK5KBFcnAimRgRTKwIhlYkQxsSAY2JAMbkoENycAzT+6zMrz1WogbGEWCMSSYggTjSDAVCGbmyX0XYDISDCHBMBLMXzRw82ZRUSSYmIGPkfC31tDM08HOPwmdeToYFxlgvIUhJBhGgpm3z7LaJ0wjkJmng12AMSSYggTjSDAVCGbm6WAXYDISzMwGlmE4Zm1hGAlGkGAUCcaQYAoSjCPBVBwYnnk62AWYjAQDZGBOQAbmBGRgTkAG5gRkYE5ABuYEZGBOSAaeeU6TpOGLjIRqA5ORYAgJhpFgBAlGkWAMCaYgwTgSTAWCISQDE5KB554rdG56DhMjwQgSDNAsKp55FtUFmIIE40gwFQhm5llUF2AyEgySgRnJwIxkYEYyMCMZmJEMzEgGZiQDC5KBBcnAgmRgQTKwIBlYkAw8/lybbZg7yOZy/hU63p789PNR5Xf9PHF9mrg+T1xfJq6vE9e3ieuXieuPjrNcrO807Ck3naaOh4ZFbUdCMv78kovUc6H8nRB9J8TfCY2ePZP+c2l2+hCh/I7UcGT8uYN53wTMvYmMr0DnvTdLal+FYpH3buu/6/32+uZh87G69v3r7vZkse2X/582X9bdfto/3m7uXvebwwrcn4tvHw6QrazZvUM5sLP4ms0Ora3bom7j+JfDjqWsnQ4bh/2c164dS8fzCw==", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_0.snap index 865d0fc4405..14ec411914b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_0.snap @@ -66,8 +66,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1bzW7kxhFujuZHM5J2xruxV7taaWdtIEGAHPjf5G2B2IfYT8G/Rp4gAXII5pJbAOc9AgS55Jab38B33wz4NUzOssRvamqo0YpteWE3IPGnqqu+/rq6utkcOupdmdV/Tns+bo9TtV9I5217dB9WvAFtuTZxOgPibGydWOZ1ZIHXoTGefAAYx+rDiM/JB4Jz+oHgnFnCuU20CLoZqM1AaAJtqnYT8UTtF5L9qz2Zt9cjkA84sLw58zuk/cQNi7nQvgHxB/PW5syO/YTsn9qx7xLuzzedfWwL+b1orx3gkuqQbASyL1rZHDBb6N/YMj/BBeNEAQfke27Hd+gwf4rxqJj/hbIai57D/BEezg/FwQXpbHbxoGy82W8HySYgo/5tjq9Aj8fWjMlosdmUP212ZZj/vmQyXJx+tel8/w5w/L49pziwmcNwfA2dA54J+NFXU2abjg/i+wTuTYC/LT+oz2RzkI03u34W7fUY/KAtwjFh+r9tr5ftcQp1qP5K8D9l/ndwC/c4L3NBfy7oN/H0uj0/U12s/xF037bHO7rLu6s/G/tNfH5BeJTVHJnSmOFzbVNItgDfIyY7A9mUyc4ZZjrnRXrgwZzxFdjlehwr5s8F0yXsE7U/ZmZMRrq6Pdqey5+CXc6B5RyipXmS84rtnjAZzqE8BhYMM53zIsUAtfe+MSBxyG1SP49B5jAZ6X7eHm2uhw7FAPnCvDPeDO9fJ+82H5pCOX+i9vsF/U+Y/pftNfY5HR/ysGx05pkgM1mUlWVYZJynpoyAJyl/TtXwnNXFl54h1HD2PWm9w9ewlnLS0WtY8r9gWG2tYU8ZHs7PiPFjaY0ffKTerUt4bp4K3HAcM4ZxYQmjtI7H58KmjEFGOBqd0un0sI2kKx23voR7VFfii8cz1nurBuHBlZ4NuF9Lz1762HFE/hfKas66HUczhofzw9d6pwLWlSBz2Lk0Xk8FP7/aGs7WTzUv8fUV+raUd7NjxxPfW7E0T/burUj9Jq2Nqe5KkPH4WAh+FoIf27ZmP1Ncv7bx/drIc0ZT3rZHNwkqnXpemQSRm+rYT43rxjoKPFN4UZGZUqdZkuZVVeRBmrqBidNI+0UcxCasF+48J6BtL9MmqkyWldoEtTE/ylIvMYFbFEmpgyAwRZHluhYXqWu8sKwSLy+KyE9MmgZRKa2hdrA/sJD9M4mXKMyyJM50UORJFoSRH1VRnldlXIVBnnlemlRJ7JrIBGnk+nFitFeaMEq9vKzC7vnhXLDtu2lZmNz49b9Im9TE9aa5CcNSe1kRm8wk2q/dm0KHri7csMpj38tiP9FFVnh+THkGn5l5jn4C9x9jzUP+FwyrrRz9hOHh/PAcvRSwrgQZzxNLwc9S8CPZmg9oazGgrbMBbZ1baGNf/vJLk+Rp6FZRkrpVWHmB1pUbBTowWRWnmVfqKKxzVhBV9WBO3DyO4zTUYZ3f/KIsyr785VdFmSSlF6WxzosoyJOkHt9+5ZZenMSxV4/RIo+zrPDLwCRR5dfjU1eVyf3CS+vEyvPLwLHvzgXObbxHtZRLbnPkUuDeC4J6T73OiKY0QaRTP/fqKafOkkbHSViamvtSV16YBX5a6Xr2SKqqnrUKHZs6ucaGbK/sYPfI/kd27Idk/6nAjfuwcsv7MzvYI7L/Gzv2b98vf2zHvib7n9ixn/D3oJgjmuf0f8P95u95e037trzuOchR/79g8z/t+RLsUn3cYyXZS9WVvr040r8S9F+Czpj5fwGyK4afZP8H/P/rqX8MlpMe7K8E/ase7Ngu/t77OcheMNklyF5C275heF7eE/8Q3EttGw3Ytgu13za+ZkXOh5zHHOaPeMJ76H8hcGFjzdrXb03h/L8SsK4EGfbTofh+JfiRbFG/LgXbtKc4V/sxMOQ6h/M1hnZcCu0eqf14Qq4n7N637bHZ0/mr09VBm8jd8x7upgKeC6Gec+BIfvg97kfqh6Xabzd/14x9a6OPrlt72EdS3I6YPp43ZcLufdcepT6SxtFVD3enAp4Lod5D+0jqB/KDORjn/u/hPsY3zv1Y9wnIUf/G6Wz+0N5bqsNjRnqfRHo230/XRTfc/M2R+dm2bbPLiTQ/ov4x8zvmdlrDS/nvaQ8/Lx6RH+qbY/m5fAA/z3r4cZgM81Lf3IHjbut308lIzzKv2WPHHT0fSbzibyY5Pz9R3In8PL8nP9JceSw/H/fwM+/h55cSP5/08LNgMpyL+NpdWpfMBX+P8RsU8r9Q+znExpr82D6y/MyS9sXAZQ+eazt4YsJzI+CRxngzp07VfgwhXxiviPsG7NM93g/cd3NOe33SOofqSr9TuWR+pDX/WPAj7eNQXdzH6Vt3Oaz96FN6Fuzrh2uhveQbub5h9W5AhnqTA7bRtxJsHOpbun4NbeJ1lwfsUvvpt9loh67X7PoQZryeCHjXTEa6f2gTE421N1DH9u9F0RfiHan+54Kf27oe+4HPj2uQnQj6fAy8EfTXoEMcrdQ+h9fM1qVgC2MCx/xWZ9PJCONj8InzA+fzuqdNTeF8rgV95Ik4Wql9rl8zGeY38inlwSuG4a645u8XpTx40dPG14L+TQ/Wa6GNfb6lmOnjtw/rG0F/DTo3DCvie3OEb8T6hOl/ek+snwn6n4LOmmFFfFT3EXOVuJZfq67wsSXxs34APzxXfQay6x5+1urx+Onbgzh23XpMrsJYX6m7x6XkG8d4Xy5/zHjb2f/c7Lapb73XlPfNcyt1OHdIz47HzJuYr/laGWVUF/c9iffpptMb8jcHLeW3/J6o7jljvOnaQv6lbydJj7DO7WC9/W6HvqfE73bwe0Zqy4jp83P+feZfnA43tpHagffQPumfgYz08ftTwih9/3m2uZ+tU2Zr9gBbhGsl6M/eE5dka8ps3ee71D+3lZp3A0N/d5XpICn8sNB5FGRBfOd3V1L/Yc5sCvGG3whPhbZNmP7fna7NG8iHW13BX6P3dY+ec+C4tSHcG29270l9hP1N+uR7IWAkGcYC5vOmnLfXyBfaIhwTpv/P1gD1CY5Pqi/FIo5t7kvyf8xYPxP0m/75R1uJ4hbbPvSe3dYns4/3OLavYVz9CG5Vx1gJSwAA", - "debug_symbols": "7Z3bauM6FIbfxde50DpK6qsMm9JDpgRCUtJ0w6b03bcdak9m7Lrowp5fzNwEXOtXPyvVp2Atp2/N4/b+9el2d/h+fGluvr01++PD3Xl3PLRHb++b5v602+93T7fXP25C96J8af/yfHfoDl/Od6dzc0OeN8328NjcMIc2/3233zY3Ft7/2TQqxQktTlhxwosTsTiRihO5NGGhOEGTCYufJ7g4IcUJLU5MvudsoU/k+GvCixOxOJGKE7k04aE4QcUJLk5IcWLyPRfqEyKjhBUnvDgRSxNx8nfoMAc12XViMx6k5NaPUko0NKZ06T4u231atvu8aPcpLNs9Lds9L9u9LNu9Ltu9Ldv9srM2LTtr07KzNpXN2jaRQ3GCihOT0yWafCRS4PmLpsS9xilZ+nHReWqEgg2fooKH68YdiwCxKBCLAbE4EEsEYklALBmHhUJAgiEkGCD1UgByLwUg+VIAsi8FIP1SAPIvBSABU0AyMK1rYJLhQzBFHcEQEgwjwQgSjCLBGBKMI8FEJJiEBJOBYBjJwIxkYEYyMCMZmJEMzEgGZiQDM5KBGcnAjGRgQTKwIBlYkAwsSAaWdQ3MOsAI8XxjCd7v4rdtfURu1ZJ7teSxWvJULXmulVxDteRULTlXSy7Vkle7hmq1a6hWu4ZqtWuoVruGarVrqFW7hlq1a6hVu4ZatWuoVbuGWrVraJycoSY9uYlek18iZW/TJTK5Upv312xRRpFYHknFkekaXdf0EXEPo8i0GYYa78ijy5+upZ2PaHkklV9LLo5M12rOR8oH+ZNKwLnL/6RgbzYSyyOpPJJLI/xJLdlshMojXB6R8si6Vp8tEWGkGidGqnFipBonRqpxYqQaJyagKlMmoCpTJqAqUyagKlMmJAMj1TgxUo0TI9U4MVKNEyPVODFSjRMj1TgxUo0TI9U4MVKNEyPVOPHKlTwiNNw5Ef4VZuV6Fcl9x6zBRzDrzibVYWTUaAQjSDCKBGNIMI4EE5FgEhJMBoJZuULjCxhCgkEysCIZWJEMrEgGViQDr1xmYHGA8dFOE69cOeDCA4zaCCYDway8v/8FDCHBMBKMIMEoEowhwTgSTESCQTKwIRnYkQzsSAZ2JAM7koEdycCOZGBHMrAjGdiRDOxIBo4rGzgOt14jywiGkGAYCUaQYBQJxpBgHAkmIsEkJJgMBJN+o4FHN4sSIcGUGfgSkfLIunN2fic0rTtnJeoAk8YwCQkmA8HkdeesmP+AkfnG4sOtafGk841bzp74evrFiaau/YC4yXXTy3jQ3/H4aTz4zxuP1HfrKY3GQ/7A8Rhq88P470NxxyN6TyEpjLa2Vv6q6DLy4T+PTJI7MLnmOfJYLXmqljxXSi4rfx+26PARXkxGMIQEw0gwggSjSDCGBONIMBEJJiHBZCAYQjIwIRmYkAxMSAYmJAMTkoEJycCEZOCVnxXTMDxfqJxHMBkIZuVnxb6AISQYRoIRJBhFgjEkGEeCiUgwSAZmJAOv/H3Ys4/0CdLzhbLy84VfwAgSjCLBGBKMI8FEJJiEBJOBYBTJwIpkYEUysCIZWJEMrEgGViQDK5KBFcnAimRgQzKwIRnYkAxsMAZ+b4/+vTvt7u7325c20518PTycd8fDx+H5v+f+zP1pt9/vnm6fT8eH7ePraXu7Pz5055rw8fJNYtpIzu1Fdm9+t8fc7h13l9wecXsqdWe6hp43lxOXzQKJ1raLLU1L9D8=", + "bytecode": "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", + "debug_symbols": "7Z3baus4FIbfJde5kNZJUl9lM5QesksgJCVtB4bSdx8n1N6Z2nVYMNb8Ys9NwI1+8VmOPhlnKX1fPW7u355ut/ufh5fVzY/31e7wcPe6Pey7o/eP9er+uN3ttk+3l39ehdOLhnP7l+e7/enw5fXu+Lq6iVbWq83+cXVDFLr8z+1us7rR8PHHeqXRnSB3gt0JcSfUnTB3IrkT2Z0okwlN3yYsuBPRnSB3YvKak4Y+UdLXhLgT6k6YO5HciexOFG8iBXciuhOT15xjn2AeJdidEHdCvYk8eQVlmIOS9TKxHg9SNu1HKec4NI753H1etvuyaPclLNt9XLZ7WrZ7XrZ7WbZ7XbZ7W7b7ZWdtWXbWlmVnbQy+aXuORH+E/JHJKZOUPyM50PyJx0y9ymPW/OvEy9QoBR3upIKFy8ZnGEGCUSQYQ4JJSDAZCaYAwcSABBORYAgJBsnAEcnAEcnAEcnAEcnAEcnAEcnAhGRgqmvgyMP9cEwygiEkGEaCESQYRYIxJJiEBJORYAoQDAckGCQDM5KBGcnAjGRgRjIwIxmYkQzMSAZmJAMLkoEFycCCZGBBMrAgGVjqGphkgOFI8405WP+FftfWRuTWLHlqljw3S15aJdfQLHlslpyaJedmyaVZ8mbXUG12DdVm11Btdg3VZtdQa3YNtWbXUGt2DbVm11Brdg21ZtdQa3YNzZMzVLknV5ZL8nPEd5nOkcmVWq0/Z008imR/pLgj0+W6JvkzYhZGkWkzDOXeiUanP11WOx9Rf6R4z4WmizbnI9EfIX/EvKdP39TszUayP1LckW+q1GYj0R8hf4T9EfFHgGqcCKnGiZBqnAipxomQapwIqcaJCKjKlAioypQIqMqUKtc4XYFBMjBSjRMh1TgRUo0TIdU4EVKNEyHVOBFSjRMh1TgRUo0TIdU4EVKNE1Wu5GGOw5MTpq8wletVuPQdkwQbwdSdTSLDyIjGEYwgwSgSjCHBJCSYjARTgGAql3NcgYlIMIQEg2RgRTKwIhlYkQysSAauXGagaYCx0TdNVLlywJgGGNGvMJWLAa7ARCQYQoJhJBhBglEkGEOCSUgwGQkGycAJycAJycAJycAJycAJycAJycAJycAJycAJycAJycAZycC5soHT8Og1EY9gCAmGkWAECUaRYAwJJiHBZCSYAgRTAhLMf2jg0cOiQkgwPgOfI+KP1J2z89+ElrpzlpMMMHkMU3BgOAQkmLpzltV+wfB8Y7bh0TRblvnGHWdPfDn90kRTk35ATPmy6Xk86P/x+Md48O83Hrnv1nIejYf8huMx1OaH8edDcccjWU/BOcSR+QyYfPgnJJPkCZhcyhx5bpa8tEpe+Seu/03yyvcmMtzCs/IIhpBgGAlGkGAUCcaQYBISTEaCKUAwlfeKXYFBMjAhGZiQDExIBiYkAxOSgQnJwIRk4Mp7xSQM+wuFyleYynvFrsBEJBhCgmEkGEGCUSQYQ4JJSDAZCQbJwIJk4Mq/hz27pY+R9hdy5f2FV2AECUaRYAwJJiHBZCSYAgRTeX/hFRgkAyuSgRXJwIpkYEUysCIZWJEMrEgGViQDG5KBDcnAhmRgQzKwwRj4ozv68+64vbvfbV66zOnNt/3D6/aw/zx8/eu5f+f+uN3ttk+3z8fDw+bx7bi53R0eTu+twufLD862lpC6kzx9EtnSmrOeTrk7otwdnN45NUxpnel0cGqXed21+vjoeP4G", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 749cadd3567..135742d1351 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/merkle_insert/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -66,8 +66,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "H4sIAAAAAAAA/+1cS48jSRHOcrfdY/fLs7PDzk73dNvTMwNIHOr9gAODeEiAkJafUK7HhQs3bsh/gAMSBzgh7ZEDEhe4cOPGP9g7EgckfsNW9VTYn8PhdHlcOZ7Rbkkz9cjIiC+/jIzMyqi2pd4cJ9U/q7k+bs4DtX6QzOvmbO93OB3qsk3itDrEWes6MsxrzwCvXWM8+gAwHqsPwz/7HwjOwQeC88QQzvtAi6DrgVoPhNrRBmo1EPfV+kFlv+y9OQ+b+x6UdziwnCGz26X+2PazodC+DvF7w0bniRn9Mel/YEa/Tbh/NF/qx7aQ3fPm3gIuqQ6V9aDsx03ZEDAb6N/QMD/eOeNEAQdke2jGtm8xe4rxqJj9kTLqi47F7BEezg/5wTnJzFfxYNnxfL0dVNaHMurf+nwNcty3TlgZLTbr46fz1TKMfz9jZbg4/fl8afubgOPbzTX5gckYhuOr6xjwSMCPturjZL7kg/g+gmd94O+eH5RnZUMoO56v2hk198dgB3URjj6Tf9XcXzbnAdSh+mPB/oDZX8EtPOO8DAX5oSBf+9Ntc32qlr7+Q5B93Zy3dJezrT9r/bV/3jbGL5UcI5UyHsNs8qtRo4/6ldt8AHyhPF7XR589o9VPXf9lb1kHdSqwic+ob8ZqPY48YPyMzPDjkv5T0K+60++cC+3m89eZmba1nr/I/kgZncsX89cZw7PJL4ifczN4vIdq6XsDsDESuOE4ThnGC0MYpTmcMElzOOGo+fxWbynH51Rrw/nelvCMj1Xki/cXrkNfq054sKkNI6EN0hjusA+ituOI7I+U0Zi1GEenDA/nB9eB3Jep7lgowzl203g9E+x8ras7Xe9qXkJcfDwZirtp2/FE9kfK6Dy5GE/nDM+mfiPuLgSsY6GM+8eFYOdCsGNa1+l7iuvrNr5dG3nMqI/XzdmOvSJKHCePvcBOotBNStsOo8BzyswJsrTMoySNk1lRZDMvSWyvDJMgcrPQC0s/DVIeE1C3k0ZlUJRpmkelVylzgzRx4tKzsyzOI8/zyixLZ1FVnCV26fh5ETuzLAvcuEwSL8ilNdQK9j0P0n8p8RL4aRqHaeRlszj1/MANimA2K/Kw8L1Z6jhJXMShXQallwS2G8Zl5OSlHyTOLC/85fvDWNDt2kmelbPSrf4LojIpw2rDrPT9PHLSLCzTMo7cynyZRb4dZbZfzELXSUM3jrI0c9yQ4sxD0M1j9Efw/BBrHrI/YlhNxeiPGB7OD4/RjwSsY6GMx4lHgp1Hgh1J13mHui461HXZoa6xgTYaXsfbpt8nhwLPJvYqpFjjeF61L1VFljIvvSBK3JlThe4q2pRRGPt5WcWZPCocP/XcpIiqKBwXRRX9sygsqyAVlobjiTMU+r3LvQ7S/7HAjb3fseD9sRnsAen/hhn9ixzNJwI3bl7Gs8S3iyBO7MIvHC+KCjvwIq9MizBJnTwK/Got4AVFNUnG9iwMw8SP/Grd4GZ5tpi7n5jBHpH+TyXsRZbHce4ESRjNssCbxXE1L7uFnTthHIZO5fPZLEzTzM29Mg4Kt5pXo6IoZ27mJNWCiHQ/NYM95rkrjG31/snv4Xn9j/Zj+2o9r4Nxq8/kf2Utdf6heXbJZCy1vv8zYPosKBuyMpL9U3Mm7q6UEe5sjEOK2ZJyodaGs1Lt9rOwHuU2Ltl9fT1i7R8Yaj/3Cdy3HwhYe2q9vzFPyH3m8+Ys7dv3GXf8GedupNpxd8a4M53zuBK4G2q4Q1+ma+SOnv1FdcfdmYBnW9z4q5Jtto0bJP8P0Pm35pr6jb+fKuGe9B1DWY+Vkezfm7PJ7xHqQ4obZOsUMGH/6nIQJH8tyKO/EN9S3L1mnFDZv5pzzf8/NfWtFliONNifCfLXGuzYLqrLc/aIkecXUEf97N8Mz9WO+LvgXmqb1WHbztV620j/UK1z3uV7h8XsEU/4DO2PlNG522nTb/XB39WfCVjHQhn20yb/fibYkXRRv74Pcz21ue1cfy3wpdQyztCzL5qzqble+p7H2nAmO/wZtyP1w6VabzdfU2Dfmuijm0Yf9pHktz0mj9dKLfuInv2nOUt9JI2jaw13ZwKec6Hevn0k9QPZwRiMa5f/wXP0b1y7YN1LKEf5l9ZS5/+bZ5dq85iR8ugkt1hjQ1mX77B1n36vJ/Nz37b5KifS/IjybeZ3jO205yLFv481/AwPyM9gR34Ge/DzWMOPLi7p5g4cd/d258sykjPMa3pov6P9LInXTzT8vCO/E/np78iPNFe25eeJhp9PNfx8VfznqYafC1aGcxFfu0vrEsP7V62/vSP7I7UeQ0ysydv2keF3lkTnAwMNnhszeELCcyvgkcb4wwYn9yHkC/0Vcd+CfnrG+4Hbrq9pb0Na51BdaT9zwOxIa/4TwY60D0V1cR9Kt+6yWPvRpvQuqOuHG6G9ZBu5vmX1bqGMv0dKutG2EnRs6lu6n0CbeN3xBr3UfvoeHfXQ/ZTdb8KM930B75SVkSxtJNBYew51TO/RoS3E21P694L3bV2P/cDnR+y/I0Gej4HngvwUZIijsVrn8IbpGgi60CdwzN/LzJdlhPEQfOL8wPm80bSpPjifEv/IE3E0VutcT1gZxjeyKcXBa4Zhm1/zb0ekOPhQ08aJIH+rwXojtFFnW/IZHb86rNv8+5ZhnUDZ8xa2ESv/9uVuR6wvBPk7kJkyrIiP6h4wVolreeSMjy2Jn+ke/PBY9QLKbjT8TA/Ij24Pou26tU2sQl8fq+3jUrKNY1wXyw/pbyv7n/PVNunWe/XxtnFurDbHDundsc28ifGar5Wl7y2kfU+pD3X5x23+w3NgUpt4XuA31hLfr63N9QctsOjyd9vW8hy7NC4kfvnetpS3rLH/1lrF82xH/F1wL7Vt0GHbpPVSU2T63bl1/pHsjwQuTOx1tF0f8rU71h0LZTw3L/m3tK6XdFG/Srlrnn809a0V5wtzW1dCu3fNbf2ucQIptyXteQw13I0EPNLepLXhTHb4M25H6gdpzczzj9i3Jvpo0ujDPpL8tsfk8bo++uzZHzV9JI2jGw13ZwIeaQ2wbx9J/cDznPU15h//zOYC8m/cC8K6PP9I8l/A3Pk5mzulMSOtxUjuEO/VK98LzFc50X0vVB9t5neM7Tz/iP6qyz9eH5Cfqx352XUvE/l5rOFHF5d0c4funeqQ+bV36Xc8/4i86vKP78jvds6vSfwM9+DniYYfXf7xq+I/TzX88PwjzkV87S6tSwx/r9Q6/0j2R2o9hphYk7ftI8PvLInOB640eCZm8Czyj1MBjzTGMf+4Lc/IcU9BPz3j/aDb65DWOfx7Tel7WUutt2fX/CPVxb+f0a27LNZ+tLlrrmAitJdsI9dTVm8KZSjX36AbbStBx6a+pfvn0CZed7xBr5R/fM5k79j9RNDD7/sC3jtWRrL/bQITjTXcIzadf0RbiBfzNNJ7wfu2rsd+4PNj13v6fM8aOZwwXdJ3J233rAnj+5bPnWjaVB+cT4n/CcgQR2O1zjXfs8b4xvNkGAf5fvY2v+b5x6mA+ZA5PclndPyazunpbCNWnn98uSPWV4L8S5C5Y1gRH9U9YKwS1/LIGR9bEj93e/DDY9UrKJuoJS7Oz90B+dHtQbRdt7aJVejrunyZzjaOcV0sP6S/TQA353MqtAnl3zbOSd/mvGBlulyvNG9ivOZrZSzDv1OjfU+TvEfxm33qe6yNflrj8uMYylH+RUM07vPTeZ8f6y+j1Cm9tEyDNM/9LOVrwPqgPj41YD+NvDhz/SyaBV7qhVvtL95z5ku5DseHS3ZpHBypZT8dz5eYyL70u8Ikt9gPMoN14VP0W8PoU/hbv9SWHpPn1/y3i78L+Q5sI7UDn6F+kj+FMpLH32YmjNJvI5/Od9P1gOk62UMX4RoL8idviUvSNWC6dvnN5u80N/WYkPg7YroJN/5+9UDQ3Wfy3+8tbf4A5o17WcFeLfeZRs7acL7XITw7nq8+kzhCvkl+8RuJ83WMVIZ9gfNefZw198gX6iIcfSb/i6bt1Cc4Pqi+5As4trgtyX6bsXYqyNf98xM2l2Dbu97bvLfJ9OMzju0z8OsvAXB0CrylaQAA", + "debug_symbols": "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", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/multi_scalar_mul/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/multi_scalar_mul/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index f541e7e57df..62285dacad4 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/multi_scalar_mul/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/multi_scalar_mul/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -83,10 +83,6 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -97,8 +93,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndrRTiIxFMbxd5lrLnp62tNTX2VjDCoaEgIGcZON8d13WB00TAnb/w2hhF/KtB+dttP34XF1//Z8t94+7V6Hm1/vw2b3sDysd9ux9P6xGO73681m/Xz38+MhHF9y/ff915fl9lh8PSz3h+EmxboYVtvH8Z3l0T+tN6vhJoeP28VgoVtIt4jdQrtF6ha5W1i3KN3Ce4U3e9CKfYkiMyHdInYL7RapW+RuYd2idAvvFrVX1O4+r80rL6qT0HQumr9KrE5ESpQzIyEQJARp7wVJSP2kGbEaJlJFZ8T6SeknzZRV96nJQphfDOlRaf71x/plQmNXzJASlAjKBBlBhSAnqN1PoqfOFa3nKAaChKB2P4mXE6phhtqtF8OpphjLDDlBFSCNV5HGGcoEtRtCdRq7RVOeISeoApQCQUJQJEgJSgRlgowgkohEEpEuJMLqCRU/RzkQJARFgpSgRFAmyAgqBLUTkdLp7p7ybCxvLxivoPaa8RoSgiJB7X5K9o3MZqjdehZPyPJsLLcKUAkECUGRICUogZllyQQZQYUgJ4hMsZ0smpwsmjwSpASRRDhJhJNEOEmEk0Q4SUQliagKxr2aCCIjbHsHYpwphAllnd3UaiHICar9KF7Y7riChKBIkBKUCMoEGUGFICeIJEJIIoQkQkgihCRCSCIubMzkkk6o6gwZQQWgCGZhMQpBkSAlKBGUCTKCCkFOEJiXRyWJUJIIJYlQkggliVCSCCWJUNK57e2SFPK0/ZhC+f67i38iJ6gC1N4uuYaEoEiQEpQIygQZQSQRmSQik0QYSYSRRBhJhJFEtBf8FtK0Q2XhxzMAsU+UCTKCCkFOUAXowiP7K0gIigQpQSQRThLhJBEOEqGXnn3WcNqIDTXbjCljibHMmDFWGPP/YXXGKmIXJvdXmTAWGdN+9jGWfi/36+X9ZvV1GOzpbfvw42zY4c/L6uyY2Mt+97B6fNuvjgfGvs+KHasf99Gz3h6PBoyFoovix8KxGaLZIpqPNY61/gU=", + "bytecode": "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", + "debug_symbols": "tdrfSuNAFMfxd8l1L+bMmb++yiJSNUqhtFLrwiK++yariSWZbJ0v5EZMyYfTdH6Z9EznvXls79+e73aHp+Nrc/PrvdkfH7bn3fHQHb1/bJr7026/3z3fXb7cmP6Pz//Of33ZHvrD1/P2dG5unM2bpj08dv8F3/mn3b5tbrz5uN00wVQLqRa2Wmi1cNXCV4tQLWK1SLUiFUcwxPAlosyEVAtbLbRauGrhq0WoFrFapGqRa0WuHvNcvPKoOgh1U1F8VxLyQCRamRgxhiAhSGsvSIyrJ8WIZTOQLDojoZ7EelJMWU5p+MiMmV8MGVEp3vpdfRlQNxSXaDOfvYyPw/Rl4vfJkj4r6OoV3OoV/OoVwuoV4uoV0uoV8toVrFm9Qnk6FB3vbdE8vU2tJUgJKgdRUhxRNjNUHhdrxkrWxilSQ5AQ5K4itTMUCSp/EKrDo7t7L9NntzhDkBBkCVKCHEGeoEBQJCgRRBLhSSL8QiJCHlFMM2QJUoIcQZ6gQFAkKBGUASo38t1tNn65c342l5d7+WvIEqQEOYLK4+TCNwphiuJC32JHFPxsLo9CkCVICXIEeYICaCxiJCgRRPqeRDrZRDrZZAlSghxBniCSiEQSkUgiEklEJonIJBGZJCJ7MO+Vl4WuITLD5vI4eTED8jp7qC2sQf0X2YU1qCtICLIEKUGOIE9QICgSlAgiiRCSCCGJEJIIIYkQkgghiRCSiIXFJB/diLLOUCIoA2TBtzBrlSBHkCcoEBQJSgRlgNQQJASRRChJhJJEKEmEkkQoSYSSRDgyuOXePRg3NMfBXCw/SvhEkaBEUAao3LtfQ0KQJUgJcgR5gkgiAklEIIkIJBELbUN35rgGZLIPM2YZU8YcY56xwFj8CcszlhjLhOlCy3KVCWO2nn10R7+3p932ft9+bUN6ejs8XOxKOv95aScblF5Ox4f28e3U9luVvncp9WnrlvC83vY/SncHUTcx9Qf99ViXNtabrmJX9S8=", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/multi_scalar_mul/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/multi_scalar_mul/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index f541e7e57df..62285dacad4 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/multi_scalar_mul/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/multi_scalar_mul/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -83,10 +83,6 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -97,8 +93,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndrRTiIxFMbxd5lrLnp62tNTX2VjDCoaEgIGcZON8d13WB00TAnb/w2hhF/KtB+dttP34XF1//Z8t94+7V6Hm1/vw2b3sDysd9ux9P6xGO73681m/Xz38+MhHF9y/ff915fl9lh8PSz3h+EmxboYVtvH8Z3l0T+tN6vhJoeP28VgoVtIt4jdQrtF6ha5W1i3KN3Ce4U3e9CKfYkiMyHdInYL7RapW+RuYd2idAvvFrVX1O4+r80rL6qT0HQumr9KrE5ESpQzIyEQJARp7wVJSP2kGbEaJlJFZ8T6SeknzZRV96nJQphfDOlRaf71x/plQmNXzJASlAjKBBlBhSAnqN1PoqfOFa3nKAaChKB2P4mXE6phhtqtF8OpphjLDDlBFSCNV5HGGcoEtRtCdRq7RVOeISeoApQCQUJQJEgJSgRlgowgkohEEpEuJMLqCRU/RzkQJARFgpSgRFAmyAgqBLUTkdLp7p7ybCxvLxivoPaa8RoSgiJB7X5K9o3MZqjdehZPyPJsLLcKUAkECUGRICUogZllyQQZQYUgJ4hMsZ0smpwsmjwSpASRRDhJhJNEOEmEk0Q4SUQliagKxr2aCCIjbHsHYpwphAllnd3UaiHICar9KF7Y7riChKBIkBKUCMoEGUGFICeIJEJIIoQkQkgihCRCSCIubMzkkk6o6gwZQQWgCGZhMQpBkSAlKBGUCTKCCkFOEJiXRyWJUJIIJYlQkggliVCSCCWJUNK57e2SFPK0/ZhC+f67i38iJ6gC1N4uuYaEoEiQEpQIygQZQSQRmSQik0QYSYSRRBhJhJFEtBf8FtK0Q2XhxzMAsU+UCTKCCkFOUAXowiP7K0gIigQpQSQRThLhJBEOEqGXnn3WcNqIDTXbjCljibHMmDFWGPP/YXXGKmIXJvdXmTAWGdN+9jGWfi/36+X9ZvV1GOzpbfvw42zY4c/L6uyY2Mt+97B6fNuvjgfGvs+KHasf99Gz3h6PBoyFoovix8KxGaLZIpqPNY61/gU=", + "bytecode": "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", + "debug_symbols": "tdrfSuNAFMfxd8l1L+bMmb++yiJSNUqhtFLrwiK++yariSWZbJ0v5EZMyYfTdH6Z9EznvXls79+e73aHp+Nrc/PrvdkfH7bn3fHQHb1/bJr7026/3z3fXb7cmP6Pz//Of33ZHvrD1/P2dG5unM2bpj08dv8F3/mn3b5tbrz5uN00wVQLqRa2Wmi1cNXCV4tQLWK1SLUiFUcwxPAlosyEVAtbLbRauGrhq0WoFrFapGqRa0WuHvNcvPKoOgh1U1F8VxLyQCRamRgxhiAhSGsvSIyrJ8WIZTOQLDojoZ7EelJMWU5p+MiMmV8MGVEp3vpdfRlQNxSXaDOfvYyPw/Rl4vfJkj4r6OoV3OoV/OoVwuoV4uoV0uoV8toVrFm9Qnk6FB3vbdE8vU2tJUgJKgdRUhxRNjNUHhdrxkrWxilSQ5AQ5K4itTMUCSp/EKrDo7t7L9NntzhDkBBkCVKCHEGeoEBQJCgRRBLhSSL8QiJCHlFMM2QJUoIcQZ6gQFAkKBGUASo38t1tNn65c342l5d7+WvIEqQEOYLK4+TCNwphiuJC32JHFPxsLo9CkCVICXIEeYICaCxiJCgRRPqeRDrZRDrZZAlSghxBniCSiEQSkUgiEklEJonIJBGZJCJ7MO+Vl4WuITLD5vI4eTED8jp7qC2sQf0X2YU1qCtICLIEKUGOIE9QICgSlAgiiRCSCCGJEJIIIYkQkgghiRCSiIXFJB/diLLOUCIoA2TBtzBrlSBHkCcoEBQJSgRlgNQQJASRRChJhJJEKEmEkkQoSYSSRDgyuOXePRg3NMfBXCw/SvhEkaBEUAao3LtfQ0KQJUgJcgR5gkgiAklEIIkIJBELbUN35rgGZLIPM2YZU8YcY56xwFj8CcszlhjLhOlCy3KVCWO2nn10R7+3p932ft9+bUN6ejs8XOxKOv95aScblF5Ox4f28e3U9luVvncp9WnrlvC83vY/SncHUTcx9Qf99ViXNtabrmJX9S8=", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 1ab830e97d9..690e25a1d6b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -19,8 +19,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81XS47TQBBtx3YSTxgSwQ3YwNKJk0mWkQgH4AgmQyQWiA07JPAJODPpUVX88lz2hIkbpiSrf+VX//5ErqZI2sRdQQryW9pM2gGsx8dvK+P8OppnJLdP/E2+XGWGfT3qX2SCGYXBzxU/kP/zkeB8qGp8tEXljo/fBPovXZ0foezX+IW0/3WHzZo77yt3op7knvJ+1z/2YiIxeiN4t2Sjg35g/xYRyXOC71p8fuOC1tM8InmqD/tnQL6LDV1ntOZJcyUy1mJjrgtrV53rgDpHLa1zTf9acjDenAuBfF+wL5F0LQHZqCMTY6DePvffAS7zKU1cXeNJ1b/N602eq7xY8FNn25/AOvK/lfEN6a++2j5Rz8O6nB+K8lCuyvv75b58RfieBuAn3E+mrj2Hpq69XjLXjHGfe7nqoT5MXF1zLFPtQ37sO+njXC6t98WBbP/bOuf9Fv0TB/JPZtjYD/bdUutM89Y6R5MqiF2Fj8cXwdJ9ZAg2piDXfyNYiw1+zuuxwT9y57Z4mhE/+nrmmnvrkHTG2uM9OVBOXHw+69y/Op+teuo6n7vigfHm89nKhZEhx8LaCVbWosO2H59s1EbMQ0f24zuKfYNnhxVvtB8JbfKyfwEu87E+mEOqm3W/8LSVNr+O5inJ/khyQ70h+Oy0YmDd3Z5rbYd663fVNvrnKbXN53jftZ2G8cn61pDtyH48T/jMsOr+0tpWm66pbdWNa++ztP+z9vy9te97c7kuNvvFcr/+tCrK4u7Re/NU+sOqXsc7kqeRjPW+yvyKlxL/V+U9ft+kr/FLDXme72cHX9TSPmAYc0l1PpdVTf64avKr7JuqqaOuTWAN72+eXsgY/YVYqkdK/D9krDEZwz/6/8yQPyb5Z3obc1yHE4N/YvD7+HxXPGnR9r734geZhI9zrJvmDr8HA59jp3MD3y18J0T5+gbFNx+fDUMDa9CBhf/jv8ibdsgN/PZddNnFe99jdl3qI8aKDCxH/6XOjgf2dWzFg/f3PxUgg+4BGQAA", - "debug_symbols": "tdjdqtpAFIbhe8lxDmbWrPnzVkrZ+BM3gRAlaqGI997EpmrTyOYN9EQc/Z4ZzVoZyFyLXbW5fH7U7f5wKlbfrkVz2K7P9aHtR9dbWWy6umnqz4/XjwszvFh/z5+O63YYns7r7lysNJRF1e76N7HX+7qpipU3t+9lYQPMR5hPMJ9ZXgzMW5gXmHcwrzAP6yuwvjJbX69jPvhpPsF8ZnlnYN7CvLC8wvmVzu9gXmHew3yAedg/CvtHYf/42f6xLo3AqkyFxUKwcFgoFh6LgEXEImGRqQjzNY9/Nj0bp7tesFgIFg4LxcJjEbCIWCQs5mse9CHSRESDhcVCsHBYKBYei4BFxCJhgWuecM3TbM3F+FGICVMhWDgsFAuPRcAiYpGwyFTk+Zrnp5juJdliIVg4LBQLj0XAImKRsMhUWIOLbuVNL5rwMNY90W+TuZl/PvnCvNmFbHwY8VMjC4z7+re93F+38p9sjG6MxhSms+uCf+4XmLDAxAVXKy0w+X9eYX3T9vk5u/xlbv3gx7qr15umGk+K9pd2+3JwdP55rCZnSMfusK12l64aTpOeB0nD2rbfiK2E+y3YD52WLg8De/9OSmu0X7Nf9xc=", + "bytecode": "H4sIAAAAAAAA/9VXzY7TMBB2mp82LdAK3oALHNNNd9tjJcoDcOIcdtUbSBwQFw6RkODGI/Cs1MtM+/XLJHS3MbAjRXbs8Tc/Hs/YkTtQJG3iziAF+SltLu0A5uPdt5b/4jya5yS3T/xVsbjMDft61L/MBTMKg18ofiD/F0PBeV0f8NEWlTvafRPoP3GH+Ahlv+5fSPufddissfOqdnvqSe4+7jf9Y19MZI+eC95jstFBP7B/y4jkOcF3LT4fu6DnaR6RPNWH/TMg38WGrjOa86SxEhlzsTHWhbWpj3VAnaOW1rmmfy05uN8cC4F8X7IvkXQuAdmoIxNjoN4+9l8CLvMpTdzhjCd1/zYvV0Wh8mLBT51tfwLzyP9C/sekv/pqfU89t8tqvi2rbXVZ3dwsrqunhO9pAH7CfDJ17TE0de3nJXfNPe4zl6se6sPEHc4cy1T7kB/7Tvo4VkjrffGBbL/rOed8i/6JA/knN2zsB/tqoedM49aqo0kdxK7S78dHwdI8koGNKcj13xDmYoOf43pk8A/dsS2eZsSPvp65Zm7NSGc8e5yTA8XEyfVZx/5WfbbOU1d97toP3G+uz1YsDA05FtZGsPIWHdb9+GSlNmIcOrIf31HsG6wd1n6j/Uhok5f9HXCZj/XBGFLdrPuFp7W0xXk0T0n2G5Ib6g3BtRNlWbUyI71C5XuOcayHVn0euGYcY7ynNPZWWqseWvdrHONzlRn6dN17A5+5k/Oiyh+7oDE278pXll85Z+DarjrVVfNGhpyZMbepf7f/W17keot58a5vjfvmRfSz6sb3zPfS/su85e/8fb85qmW5ur5YXC/fXZZVefXHN8dU+ll9mMf7paeh/GtuY37FS4n/k/Luvs/S1/1LDXme71sHX9TS3mIYY0l9PJbXTf64bvKr7HHd1FHnJjCXkpxH8o/+QizVIyX+r/KvezKCNbp+ZsgfkfwjvY0xPocTg39i8Pv9+aJ40qLtfefiW5mEj2Osm8ZO21saY4Rr3EN9L/+Qto/3cmToE/j+tK+5maGrpc/U8E9GdnfVbwsL1+Na5E075ObGXI8+uuiyC32UnmDXqT5iLOs+5mhd6uz9wL7+W/vBtfEXmIftGnkbAAA=", + "debug_symbols": "tdjdqtpAFIbhe8lxDmbN7xpvpZSNP3ETEJWohSLeexObrTaNlHegJ+Lo98SYb1gHc602zery+dHut4dTtfh2rXaH9fLcHvb96nqrq1XX7nbt58frx5UZXiTc86fjcj8sT+dld64WPtZVs9/0b1Kvt+2uqRbB3L7XlUSYTzCvMJ9Z3hqYF5i3MO9g3sM87NfCfu1sv8GP+RimeYX5zPLOwLzAvGV5D6/v6fUdzHuYDzAfYR7uHw/3j4f7J8zuH3E6AvF2KgQLi4XDwmMRsIhYJCwUi0xFnO88fQ09SdOpFwULi4XDwmMRsIhYJCwUi/nOo38InYhksBAsLBYOC49FwCJikbBQLHDnijtX3LnizhV3rrhzxZ0r7lxx54o719nOrQmjsCZORDZYCBYWC4eFxyJgEbFIWMx3np9iOttzpkKM4UQ4sZw4TjwngZPISeIEly/uzY0l+RoSWeWJfptUYLTAZG68KTBSYGyBcQXmzVwy8dGpuKkJBSYWmDfTSdLD2DA1WmDyv+/tZQ7e6r+yKbkxmjROrh4M/+dBCowtMI4/reALTPivT/jNjMnPq9s/zK1f/Fh27XK1a8YT1u1lv345cD3/PDaTs9djd1g3m0vXDKewzwPYoV0RV4vz9xHZL52vXR4Wcv/O1CK2/83+d38B", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_false_inliner_0.snap index 1c79f212c85..a1acb0fe315 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_false_inliner_0.snap @@ -19,8 +19,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/8VXQW7CMBB0QgwEWoHae98QSCCcKg58oL20Uk8piENfwdNLVK8yGjaBKnZrCS3xJjs76x0njkwzImcT02NIkC9nU2dj8A/Ov627zvqNRUq4PuNvsqJIFX4e889TFzMKEz+T+IHqn41cnN2piY9cBHd8/k3h/51p+iMUf1m/kPwfOzhPHdfXFq7G+NUBYnuMvbyHuhngiZySMPXNI8IzkAf6BH9CufrebyLCk3y4PrIOUjur5DpXfBH9twqOVXC0WOKbGV1j9Qi8fhnzSIBHovCOFR7I19Lck7O1zt4pHvcMz3HtBko+4TS7Lrg3jII7hPn/0JXgT8zluoTQ1ZDyaet3qd1IyXWu+FhXIwVnpOBosX6jq1DvHa4X6ipWeMfmsp+w1pbmMmdD6ypQf5fcHzjENyZs9KWKL1JiDegaOdXxPyAu38f5YB9JbmlLDltns35jYQn7mXADrU/2QHwQS9OV/aO8eH9AXSEm6wr3B+w5S3M7Z33oSvtuSJV8PNZnw9rBoWnHkm+i+G7VlXDqoyvJjfv+xdnUBH3PqX0vWFPILzn5xy83P/1dj8GpqQPXGvEt3f/mrnEdxSY98jyW1eKYV8dqVR0Oxb7iOtUDz1W+8asy3+yXxb78XOVVvr6Kr53rQp85tLOA9u0xg3oYo+8V2ndW3BELn8dn8V7bgRv4nLHs4sU9co3XrTXiWNq7zNBz1rTv3fwe0NYDY9V9+A030yzdwRMAAA==", - "debug_symbols": "tdnNboJAFAXgd5k1i7nzc++Mr9I0DSoaEgIGsUljfPeCoUoJSTuSszFizvnAwSuLuap9sb0cP8r60JzV5u2qqmaXd2VT90fXW6a2bVlV5fFj+rHSwwvZe/58yuvh8Nzlbac2jjNV1Pv+jfTtQ1kVauP17T1T5BLzPjHPiXlJzIfEfEzLG52Yp8S8Scwn3l+zeH+9G/Psp/nsv8EB9iiYUbCg4ICCIwi2GgUTCjarYLJhTJIzc9riaIejPY5mHC04OuDoCKOdxtGEo1dOo/w8r0jmDyxncbTD0R5HM44WHB1wdITRfuU0snvQYU4TjjY42uJoh6M9jmYcLTg64OgIoxk3jYybRl43jUb7MWk0z2mLox2O9jiacbTg6ICjI4yWldMYn/T8sSuEow2Otjja4WiPoxlHC44OODrC6ICbxrg4MkZrflTIPjv3ik2vuPSKX66QPCrGzyqcXpG/L2zy37iwuCJ2jErgGR7Sv3VMrpDWL3QoealImxc6Fri+pBd/VhTjUze/Orf+4DNvy3xbFePuyuFS7yabLd3XqZjtu5zaZlfsL20x7MBMNl+GZQ8mCzJcyrCeIWRR9+foz/MN", + "bytecode": "H4sIAAAAAAAA/8VXS07rQBAcf4bg5D0RvbfnDE5scFaIBReADUisTFAOwAlydLCYVkpFxYA8AyNFHbvtrq6erplx5g4jC7Z0E4YFeQm2CjYHf/H2uw7X9bSxqgg3ZvxN3baV4Bcx/6YKMbM08WuLn6j+9SzEudkf4iMXwz19+y3g/x936I9U/G3+UvL/P8J5EbjeHeHqXFwdIHbE2Ou/UDcHPJFTmaa+TUZ4DvJAn+HPKdfY601GeJYP18fmwWrnRa5L4cvovxc4XuCoWOY7c1pjw0g8fzXzKIFHKXjnggfy9XTvPNhBZw8Uj3uG73HtCpFPOs1ettwbTuCewP3f0JXhz93HeUmhqxPK51i/W+1mItel8LGuZgJnJnBUrO/oKtW+w/VCXeWCd+4+9hPW2tO9OtjUukrU3x33Bw7znRI2+irhy0Ssgq6R0xD/EeLyc5wP9pHlVh3J4TrYetpYecK+ItxE81P/Iz6IpXTlfygvXh9QV4jJusL1AXvO072bYGPoSp0bKpFPxPpsWDs4lHY8+ebC91VdGacpurLcuO9vg61c0n1O9r1hLSC/ch8fv9u89/cwiv2hDlxrxPf0/H24xnk0W07Ic9f1q13T7/qL/vm53fZcp2Hgd1Vs/L5rNtt1u+2eLpq+ufwUH7/rbL0a2+d++3xdAAfu77Hz9VOwar3Cvhn7Blo69+k5KfX3mjpXqnzORH143Vdnx3wkFr6P7+KzfgQ38Zq0HuOl1qkxXl+tEcfKRCxH73l3fB/mPVTNB8YaNPwKEEkUCv0UAAA=", + "debug_symbols": "tdndiuowFAXgd8l1L7LztxNf5XAYqtahUKpUPXAQ331a6WgndJjZLetGjKz1tTbGXOSm9tX2+v5Wt4fjWW3+3FRz3JWX+tj2o9u9UNuubpr6/W36sdLDC9lH/nwq22F4vpTdRW1cKFTV7vs33LcPdVOpjdf3v4UiJ8x7YT4I8yzMR2E+yfJGC/MkzBthXji/ZnZ+vRvzwU/zxW+DA+xRcEDBjIIjCk4g2GoUTCjYrILJxjFJzuS0xdEOR3scHXA04+iIoxOMdhpHE45euRr5c78izjcsZ3G0w9EeRwcczTg64ugEo/3K1Rjck445TTja4GiLox2O9jg64GjG0RFHJxgdcKsx4FZjWLcajfZj0uiQ0xZHOxztcXTA0YyjI45OMJpXrsb0ovNtlwlHGxxtcbTD0R5HBxzNODri6ASjI241ptklQ4npc89LkV6dR8XKK05e8fJKkFdYXonyShJXSM/OudE6POeSbN6hBR2zoGPnO8TPjvF5xy3o+J/vbbJzzfz0me0Y5RhyPSz45rygExd0kvxpkV7QIeQTpm/+XNJLN186937wr+zqcttU4+nX4druJodhl/+nKjsXO3XHXbW/dtVwQjY5HBseRzRF5MetDINYJN1fo7/OBw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 1ab830e97d9..690e25a1d6b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -19,8 +19,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81XS47TQBBtx3YSTxgSwQ3YwNKJk0mWkQgH4AgmQyQWiA07JPAJODPpUVX88lz2hIkbpiSrf+VX//5ErqZI2sRdQQryW9pM2gGsx8dvK+P8OppnJLdP/E2+XGWGfT3qX2SCGYXBzxU/kP/zkeB8qGp8tEXljo/fBPovXZ0foezX+IW0/3WHzZo77yt3op7knvJ+1z/2YiIxeiN4t2Sjg35g/xYRyXOC71p8fuOC1tM8InmqD/tnQL6LDV1ntOZJcyUy1mJjrgtrV53rgDpHLa1zTf9acjDenAuBfF+wL5F0LQHZqCMTY6DePvffAS7zKU1cXeNJ1b/N602eq7xY8FNn25/AOvK/lfEN6a++2j5Rz8O6nB+K8lCuyvv75b58RfieBuAn3E+mrj2Hpq69XjLXjHGfe7nqoT5MXF1zLFPtQ37sO+njXC6t98WBbP/bOuf9Fv0TB/JPZtjYD/bdUutM89Y6R5MqiF2Fj8cXwdJ9ZAg2piDXfyNYiw1+zuuxwT9y57Z4mhE/+nrmmnvrkHTG2uM9OVBOXHw+69y/Op+teuo6n7vigfHm89nKhZEhx8LaCVbWosO2H59s1EbMQ0f24zuKfYNnhxVvtB8JbfKyfwEu87E+mEOqm3W/8LSVNr+O5inJ/khyQ70h+Oy0YmDd3Z5rbYd663fVNvrnKbXN53jftZ2G8cn61pDtyH48T/jMsOr+0tpWm66pbdWNa++ztP+z9vy9te97c7kuNvvFcr/+tCrK4u7Re/NU+sOqXsc7kqeRjPW+yvyKlxL/V+U9ft+kr/FLDXme72cHX9TSPmAYc0l1PpdVTf64avKr7JuqqaOuTWAN72+eXsgY/YVYqkdK/D9krDEZwz/6/8yQPyb5Z3obc1yHE4N/YvD7+HxXPGnR9r734geZhI9zrJvmDr8HA59jp3MD3y18J0T5+gbFNx+fDUMDa9CBhf/jv8ibdsgN/PZddNnFe99jdl3qI8aKDCxH/6XOjgf2dWzFg/f3PxUgg+4BGQAA", - "debug_symbols": "tdjdqtpAFIbhe8lxDmbWrPnzVkrZ+BM3gRAlaqGI997EpmrTyOYN9EQc/Z4ZzVoZyFyLXbW5fH7U7f5wKlbfrkVz2K7P9aHtR9dbWWy6umnqz4/XjwszvFh/z5+O63YYns7r7lysNJRF1e76N7HX+7qpipU3t+9lYQPMR5hPMJ9ZXgzMW5gXmHcwrzAP6yuwvjJbX69jPvhpPsF8ZnlnYN7CvLC8wvmVzu9gXmHew3yAedg/CvtHYf/42f6xLo3AqkyFxUKwcFgoFh6LgEXEImGRqQjzNY9/Nj0bp7tesFgIFg4LxcJjEbCIWCQs5mse9CHSRESDhcVCsHBYKBYei4BFxCJhgWuecM3TbM3F+FGICVMhWDgsFAuPRcAiYpGwyFTk+Zrnp5juJdliIVg4LBQLj0XAImKRsMhUWIOLbuVNL5rwMNY90W+TuZl/PvnCvNmFbHwY8VMjC4z7+re93F+38p9sjG6MxhSms+uCf+4XmLDAxAVXKy0w+X9eYX3T9vk5u/xlbv3gx7qr15umGk+K9pd2+3JwdP55rCZnSMfusK12l64aTpOeB0nD2rbfiK2E+y3YD52WLg8De/9OSmu0X7Nf9xc=", + "bytecode": "H4sIAAAAAAAA/9VXzY7TMBB2mp82LdAK3oALHNNNd9tjJcoDcOIcdtUbSBwQFw6RkODGI/Cs1MtM+/XLJHS3MbAjRXbs8Tc/Hs/YkTtQJG3iziAF+SltLu0A5uPdt5b/4jya5yS3T/xVsbjMDft61L/MBTMKg18ofiD/F0PBeV0f8NEWlTvafRPoP3GH+Ahlv+5fSPufddissfOqdnvqSe4+7jf9Y19MZI+eC95jstFBP7B/y4jkOcF3LT4fu6DnaR6RPNWH/TMg38WGrjOa86SxEhlzsTHWhbWpj3VAnaOW1rmmfy05uN8cC4F8X7IvkXQuAdmoIxNjoN4+9l8CLvMpTdzhjCd1/zYvV0Wh8mLBT51tfwLzyP9C/sekv/pqfU89t8tqvi2rbXVZ3dwsrqunhO9pAH7CfDJ17TE0de3nJXfNPe4zl6se6sPEHc4cy1T7kB/7Tvo4VkjrffGBbL/rOed8i/6JA/knN2zsB/tqoedM49aqo0kdxK7S78dHwdI8koGNKcj13xDmYoOf43pk8A/dsS2eZsSPvp65Zm7NSGc8e5yTA8XEyfVZx/5WfbbOU1d97toP3G+uz1YsDA05FtZGsPIWHdb9+GSlNmIcOrIf31HsG6wd1n6j/Uhok5f9HXCZj/XBGFLdrPuFp7W0xXk0T0n2G5Ib6g3BtRNlWbUyI71C5XuOcayHVn0euGYcY7ynNPZWWqseWvdrHONzlRn6dN17A5+5k/Oiyh+7oDE278pXll85Z+DarjrVVfNGhpyZMbepf7f/W17keot58a5vjfvmRfSz6sb3zPfS/su85e/8fb85qmW5ur5YXC/fXZZVefXHN8dU+ll9mMf7paeh/GtuY37FS4n/k/Luvs/S1/1LDXme71sHX9TS3mIYY0l9PJbXTf64bvKr7HHd1FHnJjCXkpxH8o/+QizVIyX+r/KvezKCNbp+ZsgfkfwjvY0xPocTg39i8Pv9+aJ40qLtfefiW5mEj2Osm8ZO21saY4Rr3EN9L/+Qto/3cmToE/j+tK+5maGrpc/U8E9GdnfVbwsL1+Na5E075ObGXI8+uuiyC32UnmDXqT5iLOs+5mhd6uz9wL7+W/vBtfEXmIftGnkbAAA=", + "debug_symbols": "tdjdqtpAFIbhe8lxDmbN7xpvpZSNP3ETEJWohSLeexObrTaNlHegJ+Lo98SYb1gHc602zery+dHut4dTtfh2rXaH9fLcHvb96nqrq1XX7nbt58frx5UZXiTc86fjcj8sT+dld64WPtZVs9/0b1Kvt+2uqRbB3L7XlUSYTzCvMJ9Z3hqYF5i3MO9g3sM87NfCfu1sv8GP+RimeYX5zPLOwLzAvGV5D6/v6fUdzHuYDzAfYR7uHw/3j4f7J8zuH3E6AvF2KgQLi4XDwmMRsIhYJCwUi0xFnO88fQ09SdOpFwULi4XDwmMRsIhYJCwUi/nOo38InYhksBAsLBYOC49FwCJikbBQLHDnijtX3LnizhV3rrhzxZ0r7lxx54o719nOrQmjsCZORDZYCBYWC4eFxyJgEbFIWMx3np9iOttzpkKM4UQ4sZw4TjwngZPISeIEly/uzY0l+RoSWeWJfptUYLTAZG68KTBSYGyBcQXmzVwy8dGpuKkJBSYWmDfTSdLD2DA1WmDyv+/tZQ7e6r+yKbkxmjROrh4M/+dBCowtMI4/reALTPivT/jNjMnPq9s/zK1f/Fh27XK1a8YT1u1lv345cD3/PDaTs9djd1g3m0vXDKewzwPYoV0RV4vz9xHZL52vXR4Wcv/O1CK2/83+d38B", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_true_inliner_0.snap index 1c79f212c85..a1acb0fe315 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/mutate_array_copy/execute__tests__force_brillig_true_inliner_0.snap @@ -19,8 +19,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/8VXQW7CMBB0QgwEWoHae98QSCCcKg58oL20Uk8piENfwdNLVK8yGjaBKnZrCS3xJjs76x0njkwzImcT02NIkC9nU2dj8A/Ov627zvqNRUq4PuNvsqJIFX4e889TFzMKEz+T+IHqn41cnN2piY9cBHd8/k3h/51p+iMUf1m/kPwfOzhPHdfXFq7G+NUBYnuMvbyHuhngiZySMPXNI8IzkAf6BH9CufrebyLCk3y4PrIOUjur5DpXfBH9twqOVXC0WOKbGV1j9Qi8fhnzSIBHovCOFR7I19Lck7O1zt4pHvcMz3HtBko+4TS7Lrg3jII7hPn/0JXgT8zluoTQ1ZDyaet3qd1IyXWu+FhXIwVnpOBosX6jq1DvHa4X6ipWeMfmsp+w1pbmMmdD6ypQf5fcHzjENyZs9KWKL1JiDegaOdXxPyAu38f5YB9JbmlLDltns35jYQn7mXADrU/2QHwQS9OV/aO8eH9AXSEm6wr3B+w5S3M7Z33oSvtuSJV8PNZnw9rBoWnHkm+i+G7VlXDqoyvJjfv+xdnUBH3PqX0vWFPILzn5xy83P/1dj8GpqQPXGvEt3f/mrnEdxSY98jyW1eKYV8dqVR0Oxb7iOtUDz1W+8asy3+yXxb78XOVVvr6Kr53rQp85tLOA9u0xg3oYo+8V2ndW3BELn8dn8V7bgRv4nLHs4sU9co3XrTXiWNq7zNBz1rTv3fwe0NYDY9V9+A030yzdwRMAAA==", - "debug_symbols": "tdnNboJAFAXgd5k1i7nzc++Mr9I0DSoaEgIGsUljfPeCoUoJSTuSszFizvnAwSuLuap9sb0cP8r60JzV5u2qqmaXd2VT90fXW6a2bVlV5fFj+rHSwwvZe/58yuvh8Nzlbac2jjNV1Pv+jfTtQ1kVauP17T1T5BLzPjHPiXlJzIfEfEzLG52Yp8S8Scwn3l+zeH+9G/Psp/nsv8EB9iiYUbCg4ICCIwi2GgUTCjarYLJhTJIzc9riaIejPY5mHC04OuDoCKOdxtGEo1dOo/w8r0jmDyxncbTD0R5HM44WHB1wdITRfuU0snvQYU4TjjY42uJoh6M9jmYcLTg64OgIoxk3jYybRl43jUb7MWk0z2mLox2O9jiacbTg6ICjI4yWldMYn/T8sSuEow2Otjja4WiPoxlHC44OODrC6ICbxrg4MkZrflTIPjv3ik2vuPSKX66QPCrGzyqcXpG/L2zy37iwuCJ2jErgGR7Sv3VMrpDWL3QoealImxc6Fri+pBd/VhTjUze/Orf+4DNvy3xbFePuyuFS7yabLd3XqZjtu5zaZlfsL20x7MBMNl+GZQ8mCzJcyrCeIWRR9+foz/MN", + "bytecode": "H4sIAAAAAAAA/8VXS07rQBAcf4bg5D0RvbfnDE5scFaIBReADUisTFAOwAlydLCYVkpFxYA8AyNFHbvtrq6erplx5g4jC7Z0E4YFeQm2CjYHf/H2uw7X9bSxqgg3ZvxN3baV4Bcx/6YKMbM08WuLn6j+9SzEudkf4iMXwz19+y3g/x936I9U/G3+UvL/P8J5EbjeHeHqXFwdIHbE2Ou/UDcHPJFTmaa+TUZ4DvJAn+HPKdfY601GeJYP18fmwWrnRa5L4cvovxc4XuCoWOY7c1pjw0g8fzXzKIFHKXjnggfy9XTvPNhBZw8Uj3uG73HtCpFPOs1ettwbTuCewP3f0JXhz93HeUmhqxPK51i/W+1mItel8LGuZgJnJnBUrO/oKtW+w/VCXeWCd+4+9hPW2tO9OtjUukrU3x33Bw7znRI2+irhy0Ssgq6R0xD/EeLyc5wP9pHlVh3J4TrYetpYecK+ItxE81P/Iz6IpXTlfygvXh9QV4jJusL1AXvO072bYGPoSp0bKpFPxPpsWDs4lHY8+ebC91VdGacpurLcuO9vg61c0n1O9r1hLSC/ch8fv9u89/cwiv2hDlxrxPf0/H24xnk0W07Ic9f1q13T7/qL/vm53fZcp2Hgd1Vs/L5rNtt1u+2eLpq+ufwUH7/rbL0a2+d++3xdAAfu77Hz9VOwar3Cvhn7Blo69+k5KfX3mjpXqnzORH143Vdnx3wkFr6P7+KzfgQ38Zq0HuOl1qkxXl+tEcfKRCxH73l3fB/mPVTNB8YaNPwKEEkUCv0UAAA=", + "debug_symbols": "tdndiuowFAXgd8l1L7LztxNf5XAYqtahUKpUPXAQ331a6WgndJjZLetGjKz1tTbGXOSm9tX2+v5Wt4fjWW3+3FRz3JWX+tj2o9u9UNuubpr6/W36sdLDC9lH/nwq22F4vpTdRW1cKFTV7vs33LcPdVOpjdf3v4UiJ8x7YT4I8yzMR2E+yfJGC/MkzBthXji/ZnZ+vRvzwU/zxW+DA+xRcEDBjIIjCk4g2GoUTCjYrILJxjFJzuS0xdEOR3scHXA04+iIoxOMdhpHE45euRr5c78izjcsZ3G0w9EeRwcczTg64ugEo/3K1Rjck445TTja4GiLox2O9jg64GjG0RFHJxgdcKsx4FZjWLcajfZj0uiQ0xZHOxztcXTA0YyjI45OMJpXrsb0ovNtlwlHGxxtcbTD0R5HBxzNODri6ASjI241ptklQ4npc89LkV6dR8XKK05e8fJKkFdYXonyShJXSM/OudE6POeSbN6hBR2zoGPnO8TPjvF5xy3o+J/vbbJzzfz0me0Y5RhyPSz45rygExd0kvxpkV7QIeQTpm/+XNJLN186937wr+zqcttU4+nX4druJodhl/+nKjsXO3XHXbW/dtVwQjY5HBseRzRF5MetDINYJN1fo7/OBw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 83f067d1c82..4f298519217 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -80,8 +80,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap index 83f067d1c82..4f298519217 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_0.snap @@ -80,8 +80,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "nd3bjlxVsoXhd/E1F2tGzIiYwau0thCnRpYsQBy2tIV4952mXWnEXCtXj/+mZQ5f23j8lZUVla76491333/z+w9fvf/x3z/9+u7Lf/3x7sNP33792/uffnz81R9/fvHum1/ef/jw/oev/v633x0f/2f0+Av8+vPXP378619/+/qX3959aTa+ePf9j999/FE+/g/+/f7D9+++jOPP//niQUwnrpOpk9BJ6qR0sk7J6CepjbRK7Dh0MnRiOnGdTJ2ETlInpZOlE339oa8/9PWHvv7Q1x/6+kNff+jrD339oa8/9PVNX9/09U1f3/T1TV/f9PVNX9/u1ve5kaWTlokfOhk6OV9/rjcSuRHXydRJ6CR1UjpZOmmZzEMnQyf6+lNff+rrT339qa8/9fXn+fr5fBOrsZGWSRw6GToxnbhOpk5CJ6mT0om+fujrp75+3r3tl23EdOI6mToJnaROSidLJy2TOnSir1/n668nad+I62TqJHSSOjlff+WTbM+UaumkZbIOnQydmE5cJ1MnoZPUib7+0tdf+vqtr9/6+q2v3/r6ra/f+vqtr9/6+q2v3/L6fhw6GToxnbhOpk5u1n/8x24kdVI6WTppmZzf+nzEGzHfyNCJ6cR1MnUSOkmdlE6WTlompq9v+vqmr2/6+qavb/r657c+9+ebmK+NlE6WTlom57e+12ToxHTiOpk6CZ3o67u+vuvru77+vHvb997I0InpxHUydRI6SZ2UTpZOWiahr39+6/N4kjw2YjpxnUydhE7O1w9/ku3J1fmt7zVZOmmZnN/6XpOhE9OJ62TqJHSir5/6+qmvn/r6pa9f+vqlr1/6+qWvX/r6pa9f+vqlr1/6+ktff+nrL339pa+/btffnvas0EnqpHSydHK+/rI30tt7sfNb32sydGI6cZ1MnYROUielk6UTef15HDoZOjGduE6mTk7Xf/zkn8jjX9hI6qR0snTSMjm/9b0mQyemE9fJ1Im+/tDXH/r6Q19/3LztP7r9J7FDJ0MnphPXydRJ6CR1UjpZOtHXd31919d3fX3X1z+/9T0CfyM2NxI6SZ2UTpZOWibnt77XZOjEdOI60def+vpTX3/q6099/amvH/r6oa8f+vqhrx/6+qGvH/r6oa8f+vqhr5/6+qmvn3fru23EdTJ1EjpJnZyvP98+//J4G9zI0knL5PzW95oMnZhOXCdTJ6GT1Im+funrl77+0tdf+vpLX//81vd4Y30jWRuZOgmdpE5KJ0snLZPzW99rMnRiOtHXb3391tdvff2+e9vfzrazl05aJXEcOhk6MZ24TqZOQiepk9LJ+fqfP+BduZGWycWt7yUZOjGduE6mTkInqZPSib7+0Nc3fX3T1zd9fdPXP7/1PWr9RB55bCR0kjopnSydtEzOb32vydCJ6cR1oq/v+vqur+/6+n7ztv941NpIy2QeOhk6MZ24TqZOQiepk9KJvv75rS/i7dlF5D8PEXF+64t6+1xSVG0kdJI6KZ0snbRMUv8dO7+PvSamE9fJ1Im+furrp75+6uunvn7p65e+funrl75+6euXvn7p658fu/KoTyTH2EjL5PzY9ZoMnZhOXCdTJ6GT1EnpRF9/6eu3vn7r67e+fuvrt75+6+u3vn7r67e+fsvr5zF0cj6lv/35/Zy2EdfJ1EnoJHVSOlk6aZmcX65ek6ETff2hrz/09Ye+/tDXH/r6Q19/6Oubvr7p65u+vunrm76+6eubvr7drR/HRpZOWiZ+6OR0/bK3j5Fr++pzeX65qp5vpGsjrpOpk9BJ6qR0snTSMjm/XL0mQyf6+lNff+rrn1+uhtebefxwR0lQEbQIaoDOb1h3aBBkBJ0/RtfzQWr7HEae38tePkid38tek6WT87fSeHupU8U/vwJCnt/LXpOhE9OJ62TqJHSSOtHXT33983vZS3J+L3tN9PfQ5/ey18R1MnUSOtHf9ktfv/T1S19/6esvff2Le1m+fWott1fh5MW97NVj8tIfxi/uZS/J+ZTH823/2J6dn9/LXpOWyfm97DUZOjGduE6mTkInqRN9/dbXb3n9On9x2KuS6+LE9pKYTlwnUyehk9RJ6WTppGUy9PWHvv7Q1x/6+kNff8jvkev8XlbPT3rV9mFCnd/LXpOWyfm97DUZOjGduE6mTkInqRN9fdPXN31919d3fX3X13d9fdfXd31919d3fX3X1/e79fufrySueehk6MR04jqZOgmdpE5KJ0sn+vrnV7I13siysZGhE9OJ62TqJHSSOimdLJ20TFJfP/X1U18/9fVTXz/19VNfP/X1U18/9fVLX7/09etu/Tg24jqZOgmdpE5KJ0snLZN16GToRF///HC38u2zKWv7jiB1frh7TUInqZPSydJJy+T8cPeaDJ2YTvT1W1+/9fVbX7/19Vtfv+X113HoZOjEdOI6mTo5X7/fXufXx7GR1EnpZOmkZXJ+uHtNhk5MJ66TqRN9/aGvP/T1h77+uHnb7+17dSw7dDJ0YjpxnUydhE5SJ6WTpRN9/fNbXz+/Yntv36xind/6XhPTietk6iR0kjopnSydtEymvv7U15/6+lNff+rrT339qa8/9fWnvv7U1w99/dDXP7/19fMbOnZsD0rnt77XZOokdJI6KZ0snbRMzm99r8nQib5+6uunvn7q6+fd235sH1lk6WTppGVSh06GTkwnrpOpk9CJvv75ra/z7SUBXdsT+PNb32vSMjm/9b0mQyemE9fJ1EnoJHWir7/09Ze+fuvrt75+6+u3vn7r67e+fuvrt75+6+uf3/q6nw9K22d4+/zW95oMnZhOXCdTJ6GT1Mnd+t0bWTppmYxDJ0MnphPXydRJ6CR1oq9/fusbRzz/zNARsaEG6Pzed4cGQUaQEzQJCoKSoCKIFGGkCCdFOCnCSRFOinBShJMinBThpAgnRTgpYpIiJilikiImKWKSIiYpYpIiJilikiImKSJIEUGKCFJEkCLOb4ZjPL8k/+OHY0NBUBJUBC2CGqDz++EdGgQZQU4QKSJJEUmKSFJEkiKSFFGkiCJFFCmiSBFFiihSRJEiihRRpIgiRSxSxCJFLFLEIkUsUsQiRSxSxCJFLFLEIkU0KaJJEU2KaFJEkyKaFNGkiCZFNCmiQRHjOA6kBlKGlCM1kQqkEqlCaiGF2hiojYHaGKiNgdoYqI2B2hiojYHaGKiNgdow1IahNgy1YagNQ20YasNQG4baMNSGoTYcteGoDUdtOGrDURuO2nDUxsVl00a/Kdu+z+NDLaSaqIvjpj2/rO9Dxa4GUoaUIzWRCqQSqUJqIdVEBWojUBuB2gjURqA2ArURqI1AbQRqI1AbidpI1EaiNhK1kfdteO0qkEqkCqmFVBNVB1IDKUPKkUJtFGqjUBuF2ijURqE2FmpjoTYWamOhNhZqY6E2Lk6h9vxqp48f2q4KqYVUE3VxDr1TAylDypG6b2P78rQPFUglUoXUQqqBGseB1EDKkHKkJlIXbeRntWJXiVQhtZBqoi7uondqIGVIOVITKdTGQG0M1MZAbQzUhqE27L6N7ZsLPJQh5UhNpAKpRKqQWkg1UX4ghdpw1IajNhy14agNR204asNRG47amKiNidqYqI2Lu6iP53NRH7ariVQglUgVUgupJurqm6fcqNs2fOzP9MKQcqQmUoFUIlVILaSaqDyQQm1c3EXdPqu5P7e5uIveqYlUIJVIFVILqSbq4i56pwZSqI1CbRRqo1Abhdoo1EbdtxH7++VqotaB1EDKkHKkJlKBVCJVSKE2FmqjURuN2mjURqM2GrXRqI1GbTRqo1EbTdqw476NWrsaSBlSjtREKpBKpAqphVQTNVAbF3dRb3tTcxy7MqQcqYlUIJVIFVILqSbq4i56p1Abhtow1IahNgy1YagN+y/a2N8qbSHVRPmB1EDKkHKkJlKBVCKF2nDUhqM2JmpjojYmamOiNiZqY6I2JmpjojYmamOiNgK1EaiNi7vodH8qj105UhOpQCqRKqQWUk1U3rfhuauBlCHlSE2kAqlEqpBaSDVRhdq4uIvOGE+VvStDypGaSAVSiVQhtZBqoi7uoncKtbFQGwu1sVAbC7WxUBvrvo3a71FrIdVE9YHUQMqQcqQmUoFUIoXaaNRGkzb8OJAaSBlS923sr0zzYyIVSCVS523E83uljxhzVwupJuriLnqnBlKGlCM1kQqkEinUxkBtDNSGoTYMtWGoDbtvw2xXE6lAKpEqpBZSTZQfSA2kDCnUhqM2HLXhqA1HbThqw1EbE7UxURsTtTFRGxO1cXEXDY+n2v9cm1/cRe9UIbWQaqIu7qJ3aiBlSN234WtXE6lAKpEqpBZSTVQeSA2kDCnUxsVdNOezw4xjV+dt5Ofbcm7fieih8lal7+q8jfK3L0z/+OHJf9dCqom6uIveqYGUIeVITaQCqUQKtVGojUJtXNxFb95SLu6id+q8jTWeX096+f4c4OIueqfO21jr+Svcv2/nQwVSp23YYW/Kjnmi6lzFeqrKXS3yc13cKm8eRS9ulXfKSRsXt8o7hR7nGz3OX9wq79RC6vxtOev5irus7dI+L26Vd2ogZUg5UhOpQCqRIm3MYyHVRI0DqYGUIeVITaQCqUQKtTFQGwO1YagNI88BphlSjtREKpBKpAqpRdTV1fHzI1ss29VA6uIjxPx8PVh7UVdXxxs1kQqk8lZ17KqQWkhdPAIc69nGsb//urg63qmBlCHlSE2kAqlEqpBaSKE2rq6Orzu8ujreKEPKkZpIBVLocSPQ40agx42rq+NrlaiNRG0kaiNRG4nepyR6n5KJVCG1kGqi6kBqIIWeH17cD7OfX+m6xsnPFUglUoXUQqqJurof3qiBlCHlSKE2FmpjoTYWamOhNhZqo1Ebjdpo1EajNvq+jf1r+M8OpBKpQmoh1UDFcSA1kDKkHKmJVCCVSBVSCynUxkBtDNTGQG0M1Ma4b8N7V4FUIlVILaSaKDuQGkgZUo4UauPiVlmfv0Nv5dpVIlVILaSaqIsL550aSBlSjtRECrXhqA1HbThqw1EbE7Ux79vYP0cf05BypCZSgVQiVUgtpJqoOJBCbQRqI1AbgdoI1EagNuK+jbU/j4qF1H0ba3tFa+SB1EDKkLpoo5+foVuH7+q8jbbnna1tf75xcT98/VqsuLgfrv78cx3b64ji4n54p85/51+/gisuXrV4pxypeav2m0NUIJVIFVILqSbq4up4U+/F1fFO3bex/8mFWI7URCqQSqQKqYVUE3VxdbwpqgdShpQjhR43Gj1uNHrcaPS40ehxo8njRh4HUgMpQ8qRmuA9UR6BVCJVSC2kmqhxIDWQIs/Z8uJ+uCw/P/s6+bkCqQTP9PLifninFlJ9q+b2p57z4n54pwZShpQjNZG6aCM+t5HHrhKp+zb271CWtpBqovxAaiBlSDlSqI2L++GdSqQKqYUUetyY6HFjoseNiR43JnrcmKiNidqYqI2J2pjofcpsouJAaiBlSDlSE6lACj0/vLgE9ny+orXz5Odqoi4ugXdqIGVIOVITqUAqkSqkUBuJ2ijURqE2CrVRqI1CbRRqo1Abhdqo+zZqfwZbTdQ6kBpIGVKO1EQqkEqkCinUxkJtNGqjURuN2mjURqM2GrXRqI1GbfR/0UbsqoGq476N/ZXwdQykDClH6rQNO55fWciOeewqkCJfmaGOQmoh1USd3ypv1UDKbtV+c6jzC+etmkhdtPHyK2nUSKQKqYVUE2UHUgMpQ8qRmkihNgy1YagNQ20YasNRG47acNSGozb8vo21dhVIJVKF1EKqiZoHUgMpQ8qRQm1M1MZEbUzUxkRtTNRGoDYCtRGojUBtBGojUBuB2gjURqA2ArWRqI1EbSRqI1EbiZ6LZiCVSBVSC6kmqg6kBlLo45RCH6cUaqNQG4XaKNRGoTYKfQy70MewC30MuwwpR2oiFUih+8bFV54cx1ONUbtaSDVR53fRWzWQMqQcqYlUIJVIoTYatdGkjXUcSA2kDClHaiIVSCVS921Y7Goh1USNA6mBlCHlSE2kAqlECrUxUBsDtWGoDUNtGGrDUBuG2jDUhqE2Lu6iYx5Ptb+Ca13cRe9UE3VxF71TAylDypGaSAVSiRRqw+8fN+beoTdR80BqIGVIOVITqUAqkSqkUBsTtRGojUBtBGojUBuB2gjURqA2Cv0eFvo9LPR7ePXKtHp+18v++59S/w+6erFY5/MDessNGfmZLo4bx+ef6e9/0OwTmgQFQReXjVGffyNiQ0XQIqjv/5v+vtMX27/7uDx++lcfV5x//t83yeDqZWGvkYnoz8df/O/Xv7z/+psP3//6IB//2e8/fvvb+59+/PSXv/3fz2//5Jtf3n/48P6Hr37+5advv//u91++/+rDT99+/Gfvjk//86+//kD/6JGPX87HJEfOLx6fpvr4i/vPP35c6cdK//g3xl9/4+O/sDIfv5LHr+b/AQ==", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 6d7c9835c1d..2edbe0d7d0d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_dynamic/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -80,8 +80,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 1627184d9a3..c9f5bd3d211 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "nd3RbhtHEkbhd9G1L6arq7qq8yqLhWE7TiBAsAPbWWAR5N2Xypq0wenh4Pw3hhTpC22eEjmqETV/Pf368f2fv799/vTb569Pv/zrr6eXzx/efXv+/Ony3l9/v3l6/+X55eX597c//+en7fWPlv98/tc/3n16fffrt3dfvj390oa9efr46dfXt/zif3t++fj0S2x///vNUyssJhW2YdGwMCw6Fo5FYDGwwM0NNzfcvOPmfd18jquY814YFh0LxyKwGFgkFoXFpMI3LHBzx80dN3fc3JfNza/CvO7FwCKxKCwmFbFh0bAwLDoWjgVuHrh54OaBm8e6eW1XUf1OjA2LhoVh0bFwLAKLgUViUVjg5ombJ26euHkum/d+Pcro/f4oIx2LwGJgkVgUFpOK2rBoWBgWuHnh5oWbF25e6+bj+kjdx/1RRhUWk4q5YdGwMCw6Fo5FYDGwwM0nbj5x87ZtnCyru10fq91sR4yTzolzEpwMTpKT4mRi0jZOeP3G6zdev/H6bV0//Eoid2RwkpwUJxOT9XLuMWmcGCedE+eE1zde33h94/WN1++8/npPF7fNXmTfEeOkc+KcBCeDk+SkOJmYrBd2jwmv77y+8/rO6zuv77y+8/rO6zuvH7x+8PrB6wevH7x+8PrB6wevH7x+8PqD1x+8/uD1B68/eP3B6w9ef/D6g9cfvH7y+snrrxd6Med3MrbdyeX1Ru8xcU6Ck8FJcrKuP/NGYkcmJuvF3mPSODFOOifOSXAyOElOeP3i9SevP3n9yetPXn/y+pPXn7z+5PUnrz9xfds2ThonxknnxDkJTgYnyUlxwuu3s/rNdqRxYpx0Tpb1h1231qPvf6wsOBmcJCfFycRkvet7TBonxknnhNc3Xt94feP1jdc3Xn+96xt++xLzuSONE+Okc+KcBCeDk+TkrP7l8+7JxMQ3ThonxknnxDkJTgYnyQmvv971jdvp2pHtnqx3fY9J48Q46Zys6w+/kd2hwnrX95gMTpKT4mRiMjZOGifGSeeE1x+8/uD1B68/eP3B6yevn7x+8vrJ6yevn7x+8vrJ6yevn7x+8frF6xevX7x+8fp1Wn93PFaDk+SkOFnXn/07yW33XLne9T0mjRPjpHPinAQng5PkpDjB9fu2cdI4MU46J87Jsn6265dYtrEjg5PkpDiZmKx3fY9J48Q4Oavfckeck+BkcJKcFCcTE9s4aZwYJ7z+eteX/UZ67UhwMjhJToqT9dd+bzeyf53rxknjxDjpnDgnwcngJDkpTnh95/Wd13de33l95/Wd13de33l95/Wd1w9eP3j94PWD1w9eP3j94PWD1w9eP3j9cVbfd8djo3FinHRO1vXH9dUcOXbPletd32MyOElOipOJyXrX95g0ToyTzgmvn7x+8vrJ6yevn7z+eteXdfsS272Auq93fY+JcdI5cU6Ck8FJcnJWv3a/DKcmJnPjpHFinHROnJPgZHCSnPD6E9f3beOkcWKcrOvP+k5qsx1xToKTwUlyUpxMTA52fQ9J48Q44fUbr994/cbrN16/8fqN1zde33h94/WN1zde33h94/WN1zde33j9zut3Xr/z+p3X72f127YjwcngJDlZ1i+7nhkp2/36tfWu7yFZ7/oek8aJcdI5cU6Ck8FJcsLrO68fvH7w+sHrB6+/3vWVX8+MlMeOBCeDk+SkOJmYrHd9j0nj5Kz+bnHno3PinAQng5PkpDiZmOTGSeOE11/v+ur2TWLtfvevr3d9j0lwMjhJToqTicl61/eYNE6ME16/eP3i9YvXL16/eP31rq/q+jrxmrvj5PWu7zFpnBgnnRPnJDgZnJzVn31HipNJSWwbJ40T46Rz4pwEJ4OT5GRZf27X58q5+yYx1ru+adezCdPuz/DGeqX2mDgnwcngJDkpTvidvF6pPSaNE+OE1zde33h94/WN1zde33j9zut3Xr/z+p3X77z+ej824/pcOUfuSHJSnExM1vuxx6RxYpx0TpyT4ITXd17feX3n9YPXD14/eP3g9YPXD14/eP3g9YOnXC+75rweXLVtdzoh1tuuE2OC6YJxwYRghmBSMCWYyU0Kc5DCHKQwBynMQQpzkMIcpDAHKcxBCnOQwhyUMAclzEEJc1DCHJQwByXMQQlzUMIc1Okc7L8brsnN3ATTBLO+8thWt8uCbdN3aH0xuK3XDe3257FeVZ3dUiqoFDQ5GuuVVWvtuk65vLm/zlRTkCmoK8gVFAoaCkoFlRJXmYj1j6ydoaYgU1BXkCsoFDQUlApSJqIpE2HKRJgyEaZMxMHlX7fbJuXyZu6Q8AQwDi4Ce4JSQaWgg7i31fjlzfvDgXFwQdgT1BRkCuoKcgWFgoaCUkGlIGUiXJkIVybi4KKxj6f84LqxJ8gVpDxGuPIY4cpjhCuPET4FFJuCmoKUiQhlIkKZiFAmIpSJCOXZfb29uxxN9tuRZd89E45NQU1BpqCuIFdQKGgoKBVUClImIpWJSGUiUpmIVCYilYlIZSJSmYhUJiKViUhlIkqZiDqYiNtFzC5v7pEpqCvIFRQKGgpKBZWCzici7n8ofMxNQU1BpqCuIFdQKGgoKBVUChImIo82ifkDVduhpiBTUFeQKygUNBSUCioFTQE1ZSKaMhFNmYimTERTJqIpE9GUiWjKRDRlIpoyEaZMhCkTYcpEmDIRB+tH227fqdk2dygUNBSUCioFTQEdrB9PUFPQ6UTY7uRi9q4gV1AoaCgoFVQKmgLyTUFNQcpEHKwf7fbCq2bddsgVFAoaCkoFlYKmgA7WjyeoKcgUpExEKBMRykSEMhGhTEQoExHKRAxlIoYyEUOZiKFMxFAmYigTMZSJONhZWuQNjd2D5cHO8gRNAR3sLE9QU5ApqCvIFXQ+EWN3DJtDQamgUtAUUG0KagoyBXUFuYKUiTjYWVrGDe1+n14e7CxPUCloCuhgZ3mCmoJMQV1BrqBQkDIRU5mIqUzEFCaitk1BTUGmoK4gV1AoaCgoFVQKUibiYGfZt9vJ+t7aDjUFmYK6glxBoaChoFTQ6UT03ZWJq00B2aagpiBTUFeQKygUNBSUClIm4mBn2W+X+byc87o/xK6DneUJagoyBXUFuYJCQUNBqaBSkDIRrkyEKxPhykS4MhGuTIQrE+HKRLgyEa5MhCsTEcpEhDIRoUzEwc6yx48Hy90Z/jrYWZ6gUNBQUCqoFDQFdLCzPEHnExFzh0xBXUGuoFDQUFAqqBQ0BZSbgpSJKOXeK+XeK+XeO9jmzLy9gmf+fN79H3OwzHlsmmBMMF0wLpgQzMBmbptgDu6DeR0E22zcmxBuZ/nvsW37cTs/v5ry/yYFU4KZa9Pyx30Qd2a9gDgxTTB2/u/5uc+b3efm7Tz5ZVt8/38X6h+sKR6bgObvyzv/effl+d37l49fL+T1Y39++vDt+fOn7+9+++8f14+8//L88vL8+9s/vnz+8PHXP798fPvy+cPrx5621z9e78HZ6s30fvm7/BOuLvdJZb2++9qkyt5U+eVWL7f8Pw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_0.snap index 1627184d9a3..c9f5bd3d211 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_0.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "nd3RbhtHEkbhd9G1L6arq7qq8yqLhWE7TiBAsAPbWWAR5N2Xypq0wenh4Pw3hhTpC22eEjmqETV/Pf368f2fv799/vTb569Pv/zrr6eXzx/efXv+/Ony3l9/v3l6/+X55eX597c//+en7fWPlv98/tc/3n16fffrt3dfvj390oa9efr46dfXt/zif3t++fj0S2x///vNUyssJhW2YdGwMCw6Fo5FYDGwwM0NNzfcvOPmfd18jquY814YFh0LxyKwGFgkFoXFpMI3LHBzx80dN3fc3JfNza/CvO7FwCKxKCwmFbFh0bAwLDoWjgVuHrh54OaBm8e6eW1XUf1OjA2LhoVh0bFwLAKLgUViUVjg5ombJ26euHkum/d+Pcro/f4oIx2LwGJgkVgUFpOK2rBoWBgWuHnh5oWbF25e6+bj+kjdx/1RRhUWk4q5YdGwMCw6Fo5FYDGwwM0nbj5x87ZtnCyru10fq91sR4yTzolzEpwMTpKT4mRi0jZOeP3G6zdev/H6bV0//Eoid2RwkpwUJxOT9XLuMWmcGCedE+eE1zde33h94/WN1++8/npPF7fNXmTfEeOkc+KcBCeDk+SkOJmYrBd2jwmv77y+8/rO6zuv77y+8/rO6zuvH7x+8PrB6wevH7x+8PrB6wevH7x+8PqD1x+8/uD1B68/eP3B6w9ef/D6g9cfvH7y+snrrxd6Med3MrbdyeX1Ru8xcU6Ck8FJcrKuP/NGYkcmJuvF3mPSODFOOifOSXAyOElOeP3i9SevP3n9yetPXn/y+pPXn7z+5PUnrz9xfds2ThonxknnxDkJTgYnyUlxwuu3s/rNdqRxYpx0Tpb1h1231qPvf6wsOBmcJCfFycRkvet7TBonxknnhNc3Xt94feP1jdc3Xn+96xt++xLzuSONE+Okc+KcBCeDk+TkrP7l8+7JxMQ3ThonxknnxDkJTgYnyQmvv971jdvp2pHtnqx3fY9J48Q46Zys6w+/kd2hwnrX95gMTpKT4mRiMjZOGifGSeeE1x+8/uD1B68/eP3B6yevn7x+8vrJ6yevn7x+8vrJ6yevn7x+8frF6xevX7x+8fp1Wn93PFaDk+SkOFnXn/07yW33XLne9T0mjRPjpHPinAQng5PkpDjB9fu2cdI4MU46J87Jsn6265dYtrEjg5PkpDiZmKx3fY9J48Q4Oavfckeck+BkcJKcFCcTE9s4aZwYJ7z+eteX/UZ67UhwMjhJToqT9dd+bzeyf53rxknjxDjpnDgnwcngJDkpTnh95/Wd13de33l95/Wd13de33l95/Wd1w9eP3j94PWD1w9eP3j94PWD1w9eP3j9cVbfd8djo3FinHRO1vXH9dUcOXbPletd32MyOElOipOJyXrX95g0ToyTzgmvn7x+8vrJ6yevn7z+eteXdfsS272Auq93fY+JcdI5cU6Ck8FJcnJWv3a/DKcmJnPjpHFinHROnJPgZHCSnPD6E9f3beOkcWKcrOvP+k5qsx1xToKTwUlyUpxMTA52fQ9J48Q44fUbr994/cbrN16/8fqN1zde33h94/WN1zde33h94/WN1zde33j9zut3Xr/z+p3X72f127YjwcngJDlZ1i+7nhkp2/36tfWu7yFZ7/oek8aJcdI5cU6Ck8FJcsLrO68fvH7w+sHrB6+/3vWVX8+MlMeOBCeDk+SkOJmYrHd9j0nj5Kz+bnHno3PinAQng5PkpDiZmOTGSeOE11/v+ur2TWLtfvevr3d9j0lwMjhJToqTicl61/eYNE6ME16/eP3i9YvXL16/eP31rq/q+jrxmrvj5PWu7zFpnBgnnRPnJDgZnJzVn31HipNJSWwbJ40T46Rz4pwEJ4OT5GRZf27X58q5+yYx1ru+adezCdPuz/DGeqX2mDgnwcngJDkpTvidvF6pPSaNE+OE1zde33h94/WN1zde33j9zut3Xr/z+p3X77z+ej824/pcOUfuSHJSnExM1vuxx6RxYpx0TpyT4ITXd17feX3n9YPXD14/eP3g9YPXD14/eP3g9YOnXC+75rweXLVtdzoh1tuuE2OC6YJxwYRghmBSMCWYyU0Kc5DCHKQwBynMQQpzkMIcpDAHKcxBCnOQwhyUMAclzEEJc1DCHJQwByXMQQlzUMIc1Okc7L8brsnN3ATTBLO+8thWt8uCbdN3aH0xuK3XDe3257FeVZ3dUiqoFDQ5GuuVVWvtuk65vLm/zlRTkCmoK8gVFAoaCkoFlRJXmYj1j6ydoaYgU1BXkCsoFDQUlApSJqIpE2HKRJgyEaZMxMHlX7fbJuXyZu6Q8AQwDi4Ce4JSQaWgg7i31fjlzfvDgXFwQdgT1BRkCuoKcgWFgoaCUkGlIGUiXJkIVybi4KKxj6f84LqxJ8gVpDxGuPIY4cpjhCuPET4FFJuCmoKUiQhlIkKZiFAmIpSJCOXZfb29uxxN9tuRZd89E45NQU1BpqCuIFdQKGgoKBVUClImIpWJSGUiUpmIVCYilYlIZSJSmYhUJiKViUhlIkqZiDqYiNtFzC5v7pEpqCvIFRQKGgpKBZWCzici7n8ofMxNQU1BpqCuIFdQKGgoKBVUChImIo82ifkDVduhpiBTUFeQKygUNBSUCioFTQE1ZSKaMhFNmYimTERTJqIpE9GUiWjKRDRlIpoyEaZMhCkTYcpEmDIRB+tH227fqdk2dygUNBSUCioFTQEdrB9PUFPQ6UTY7uRi9q4gV1AoaCgoFVQKmgLyTUFNQcpEHKwf7fbCq2bddsgVFAoaCkoFlYKmgA7WjyeoKcgUpExEKBMRykSEMhGhTEQoExHKRAxlIoYyEUOZiKFMxFAmYigTMZSJONhZWuQNjd2D5cHO8gRNAR3sLE9QU5ApqCvIFXQ+EWN3DJtDQamgUtAUUG0KagoyBXUFuYKUiTjYWVrGDe1+n14e7CxPUCloCuhgZ3mCmoJMQV1BrqBQkDIRU5mIqUzEFCaitk1BTUGmoK4gV1AoaCgoFVQKUibiYGfZt9vJ+t7aDjUFmYK6glxBoaChoFTQ6UT03ZWJq00B2aagpiBTUFeQKygUNBSUClIm4mBn2W+X+byc87o/xK6DneUJagoyBXUFuYJCQUNBqaBSkDIRrkyEKxPhykS4MhGuTIQrE+HKRLgyEa5MhCsTEcpEhDIRoUzEwc6yx48Hy90Z/jrYWZ6gUNBQUCqoFDQFdLCzPEHnExFzh0xBXUGuoFDQUFAqqBQ0BZSbgpSJKOXeK+XeK+XeO9jmzLy9gmf+fN79H3OwzHlsmmBMMF0wLpgQzMBmbptgDu6DeR0E22zcmxBuZ/nvsW37cTs/v5ry/yYFU4KZa9Pyx30Qd2a9gDgxTTB2/u/5uc+b3efm7Tz5ZVt8/38X6h+sKR6bgObvyzv/effl+d37l49fL+T1Y39++vDt+fOn7+9+++8f14+8//L88vL8+9s/vnz+8PHXP798fPvy+cPrx5621z9e78HZ6s30fvm7/BOuLvdJZb2++9qkyt5U+eVWL7f8Pw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index aa3dcb34c3e..5a3638faadd 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_array_in_slice/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -17,10 +17,6 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -31,8 +27,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 3481cb619ab..a4a9122b653 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_arrays_from_brillig/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -21,18 +21,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/91Y247TQAx1LpM0QdVW8IDEG7zw2mx6e1xpuyD4i9Cq35FHJD6CX2WHHVP31J1WaozUtVTlMjPn2CceO2lCL+aef0k4z8MxEceCDo3HHsJxep01A2JNrXxMbsDH9AZ8zG7Ax/wGfHQGPv41udm90z6p/EPzojg6bRzg73CswjEV4wM+/KYC3iHxV9PZtlLiG9D/thL6GuAvKoFpgD8tA87Xfo+PsXAeJGT2nJbGcS7GEBuJWJg7t+FeJsBHECcBf02mOdUkwMf+oD58PuY5/d6fBMby/jgOHnP9YRzeRs+/92Ie5lYq5n0S55/DuXE+bo339fRdJGa+V/b0z1i3TNxjXVnnkZwPY5UYy/tDnjpc54JHYrEfDuZ/DNd34ViINbx+ovAXwH/gt3IPdamU+ZUy3/fAD+H8De172WO/x7PoZWsb/HvGf7LBnzP+Fxv8hX8Gfg+v+ZmRac2fcV2RdY6Nx5zg1uo0WwbXWMu+C1ych5wyn5n/jk7XA+t3AOwHXAeQk31L6bhfSo0d3JsLnX4CHvZEvMcaTOhYu//Uv+eYK9J4rBDcWK8IYpQm/fb6/BK4OA85tY977Fs0nA4d+uvodM5iDjyCf3LfDZnLbwUuAZfsAXk/PP9y9bKXvHH/dXT8zCW/g/nfwnWtxHHNB+1u2TW7ttt18267nW061MlbKnSSdTqhw1pApO9V7qtcy7TviNi7p8RaA1YGOngz3vct+1REfJX87KvMbV6r9SKsX4VNHDOtr2nfH8xf2+raxHSV+qSgXan4OlHGsEeUCk+p8GhY2YBYDuLB/2i8VSd8eAjX0+usvTQXmL8m09xsYroWiq6s3UjxdaKMYS6MFJ6RwqNh4X8hRt+Gs5gmWq/VamQJccewvD31h1ipgjVWsDBvRzaaXJy3zF+T6T5qYvmk1QPWrlJ8nShjWHcqhadSeDQs3APn+jh//8X6+FhZh7lg9L1y8f9pfK+m471jkQvndI3VMF6r1R38Rr2mhhUDYuUDYg1Zp0uDGP078dDv5N2yXW3uZ5vlj3nbtYtX8U7Oa5yClUWw5Hp3AVasd2URrOIMFtY+7V0+hiVjRO0TBYuUdZqeFLmW8V5S613ERy0/Tl0nCq/23wSv8zn8BzBHi8itIAAA", - "debug_symbols": "ldjbiuowFIDhd+m1F0lWVg6+ymYzeKhDQapU3bAR331asTPShin/jRDxo+qfYF33al9vb58fTXs4Xar1n3t1PO021+bU9qv7Y1Vtu+Z4bD4/3p+uzPDgzfP1l/OmHZaX66a7VuuQ/Kqq2321jlZ6f2iOdbVW8/i7qrzFwmEhWHgsFIuARcQiYZGpUNxccXPFzRU3V9xci82jS6PwaSoCFhGLhEWmIhgsLBZuQYQ4FYKFx0KxCFTE4jUkupeQZKciYFHcV5JkFNlNRcKiuK8kjyfKm+mJSgYLi4XDQrDwWCgWAYuIRcICN8+4ecbNM26ei829jifKh+mJyh4LxSJgEbFIWGQqrDGcWE6K2dXpi6j4GRFOPCfF8iphJF5nJHASOUmcZEys4cRy4jgRTjwnvL4t19fvPRZme8xGThInGRNnOLGcOE6EE8+JcsLrO17f8fqO1xdeX3h94fWF1xdevzwhsXEkNsmMWE4cJ8KJXyCzfwS2PCb5nRQ3v80jcWb+xiIniZOMSXlW8kbs7OOXhyW/k4X6JbJQ37k8I8X6Tsb7MadxRpSTsPDGJuTRr/5tumazPdavceXh1u7eppfX/+d6Msg8d6ddvb919TDS/JlmDt+Jk5XI8zanX4S0is/F0MT2v9dWUn/F/qpf", + "bytecode": "H4sIAAAAAAAA/9VYwY7TMBAdJ3ESB1VbwQGJG1y4JjTbrgSHAgt8R0TV78hH8MGswUMm04kb0Yy0GalKHNvvzTxPxk4N/DX79DPhPgtXQ645jA37juFa32bNgli1lo9mBT4mK/AxXYGP2Qp8tAo+/jH6snunfVL5RfOiWJg2DPBXuLpwTUj/govfOMa7JP5D3Z6cEN+C/u8c0VcBf+8IpgJ+XQScH/2Az2PBPDCgtk4H5Tj3GxYbkFiQO9PhPhjGByxOYPwVqOZUYxgf+sP1wfsNjukHfwzry/rLOLDP9uM4vJVPv9dkHM+thIx7R+7fh3vlfDwpv9f1q0jM+Kzo4Z+hbil5hrqiziUdz/oc6cv6MU8V2hnhoVjoh2Xj34b2XbjmZA7O3wr8OeMf+S0847o4YbwTxvs98E24fwHDXva1H/A09rJHHfwPiP9NB/8e8b/r4O/9Gvh3+BOuGajW/BbrCq1zaNhnCbdUp9FS1ua17AvB5eM4J81n+0y1SAT/52rRE1w+jnOaiBZ0LzqGa32bddxfC9N12LKxH5l/SueF+iXBBcZF61jWL89/eKhr5MU9xMLlmlN+y8Z/Du1qIo7jf/p5PnTNededu/vudGp/dlwnbwnRidYaA+O1BBjOPHQ+7g13MH0Wjp2fKNYjw0qZDt6Uc2mHPuURXyk/+kprAc6Vagg/Q+c6cbRSbZbO0Mhf6eraxHSl+iRMu0LwdSv00byjfZSnEHgkrHRBLMvi4f8zeHMTPhxDu77NdnNzAfkrUM3NJqZrLuiK2pWCr1uhj+dCKfCUAo+Exb/nlb5v2pgm0l4r1ciCxR3D8obnYql249yNgMXzttTRZHbeIn8Fqu9RE8snqR6gdk7wdSv08brjBB4n8EhY/B24to/jN0xsH98I83guKJ3HZ/8nhM8quHx3NHLhmq6xGoZzpbrDv7NuqWH5gljZglhL1ulCIca1nIlxjhWw0ggWnW9nYMX2jjSClV/B4rVHOkvHsGiMXHsjYIEwT9ITIm0a75xaayM+Svkx1TYCr/TfAM7zOfwb978T8vEeAAA=", + "debug_symbols": "ldjbquIwFIDhd+m1F8laOfoqw7DxUDeFUqXqwCC++9SNndmkYcp/I0T8SMufYJtHc2z398+Pbjidr832x6Ppz4fdrTsP0+jx3DT7sev77vPj+9eNeX048/X762U3vIbX2268NduQ3KZph2OzjVYnf+r6ttl68/y5aZzFQrBQLBwWHouARayJKGkWLpUiYZGp8AYLi4VgoVi4FRFiKTwWAYuIRaIiVOfQKG+hyZYiYVFdV5p0FlkKEQ0W1XWled5RzpQ7KgoWioXDwmMRsIhYJCwyFclggZsn3Dzh5gk3T9Xmzs87yoVyR6WARcQiYZGpyAYLi4VgoVhUm3vxb+HVlcJjEbCoNvcaZuF8KRIWmQprDCeWE+FEOXGceE4CJ5GTenz/d4EFtyAZE2s4sZwIJ8qJ48RzEjiJnPD6ltcXXl94feH1hdcXXl94feH1pdrFxpnYVD6BWDWcWE6EE10hizcBq46TahebZyJmeWGBk8hJ4iSvELu4/frRzf/JSv0aWakvkhekWl90fhITHxfEceJXLqwgz2n0azd2u33fvo/FTvfh8O2U7Pb70hYHZpfxfGiP97F9HZ39OzV73aDoRvXr73QaBLMJfppimuYP", "file_map": { "50": { "source": "struct Header {\n params: [Field; 3],\n}\n\nstruct MyNote {\n plain: Field,\n array: [Field; 2],\n header: Header,\n}\n\nfn access_nested(notes: [MyNote; 2]) -> Field {\n notes[0].array[1] + notes[1].array[0] + notes[0].plain + notes[1].header.params[0]\n}\n\nunconstrained fn create_inside_brillig(values: [Field; 6]) -> [MyNote; 2] {\n let header = Header { params: [values[0], values[1], values[2]] };\n let note0 = MyNote { array: [values[0], values[1]], plain: values[2], header };\n let note1 = MyNote { array: [values[3], values[4]], plain: values[5], header };\n [note0, note1]\n}\n\nfn main(values: [Field; 6]) {\n // Safety: testing context\n let notes = unsafe { create_inside_brillig(values) };\n assert(access_nested(notes) == (2 + 4 + 3 + 1));\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index fe4e0d2b8e2..b92c9cebdfe 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -48,8 +48,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81ZPY/TQBBdJ94kji/KCSokOqCjcOLkErpIIBp+AaUvIQUlFaUlSipaKiQakJCQKBANHRL8LOK7mbuXl4mJFO+Jlay1d2fnvfnY9dobucvS2lyR3MfQ5qRd7x20VWUhdXZcGTWoKwvFMQrAMQTPViCerk2kOSkso/5InUiNSdVu0OiEcJvUP88ms8Swr0H+eQI6Q+qPw+jPuqLnSbmt3xGutj0tr335lMYo10CxnAT2xXhA9juwRbF9GOw8IjxHcXCE33dB824UEZ7yYf/oujBQmfKaT0R9cblrh/Z56NP49jbXHZCzcgv7cF3T3Kx03Ad9D+Q+cK7OEuLU9Ly9bfBHrKp0y2t/qK/a0KY+1xj0UJ76EuiLy22cvjzHgIO6lIcn+XvyPJS6A2N0/KmB3yH8Ld5GG/slMeQTQ76zue7KfSpXlUMfgTfPQV4vQq3bPD/V9xam2sTrF85tT20Ppa7s/Uz24fyvWxNO3f45G/i9ubN+RcC1ZfBR+Y48dwzbcKwn+Rz89YVs7ISxcaycu8CpbdjdIT496HMN+twTnzn45Cv5GfdlbbedJ85tx6i6+oY87h3V3iFxwLH8Dm/Q9qkjTt7g4akvIQ4J8W16zbgFep2BtS+XMBadPfY9ltqKtco4d1ise4Y8+lHlh253funYxMBeSJ0dVwrG8gaPLvWp7DPihzkcOtYJYSvfBn0zrtsHKn5cBrE5r3z8TXQN3G78PXGqy7OqcF5aaxaupfzew9iqr4fGuC74J2RO8FqKewbE7IH9vEbgOuyp7bnU1p6hV+M7xULfdQ0+A2Mc5lbAtfPg7zPF77vdOIfY3/QP9Kv6LjW4nhp96H/sQ5zUwKnTNXS7MeLcT8P46yr3T0RfbNiB3Fokj/dV8dT2Umor960Y9Wt8Z+1dmD/q6pLPqmL5Gsfiszdk/R47X0mt8RoQ9kKesyOL9f4a1NjGeXQSiFdEXDCPEJPzaGDYgf7VttdSh86jQ9cNttfCtvZkXcPeQ959ofa+dXFDTH73HRq3N1KHevfVxaFu/vf28EdZb8jy/FfZt1L/D/Mf37+cR4H+02YcU8wjxqxKy/Atxp59/07qJv67WHlRl5N1e18r76y9rxUbzjv+h4Ky/H2psu+lTvbYtpDn7Mhi5R3vX9g3yCvQ/6yrvFP/YN5Z/6daJI/36F9t+yC1lXf8vwzbnKv/36d9qQv7/TebX/qoKvrtqf8wuMTQj/Kf5BnfB1rHR/Bcz4rROi/WxbRYrSbLgnPMkZ+axi9m+Xw5nixn59O8yM9uHH88n589Gp9vTkVWy/Vqkt80/nJ6dr6cTIvsxeiCzr/wrfMI/J9RFT3TwDMPlMc1DuW/q+zm+iH3fAaGeJXc7xq5aE99ocNoi8vtNussBM+IVF6x++UuR+1Loc8Tzok8o79Ql/LwJP9LnjUmeK6j408N/B7hb/E22viMKDXkU0O+is9P1Sc12t70N/8FJunHNuamuVPl9V/u8V84NSQAAA==", - "debug_symbols": "ldjbiuJAFEbhd8l1LmrXcW9fZRgaD7EJiIqHgUF8905E6cYKHdZN09H1QfCXIHVrNt3q+vnR77eHc7P4c2t2h/Xy0h/2w9Xt3jarU7/b9Z8fP19u3Pgn5kd/Pi734+X5sjxdmkWWtun2m+GfPOhtv+uaRXL3v20TC+wV9sb65GAvsPewD7CPsE+wn9w3pVdf3vsCe4W9/doX99ZnB3uBvYd9gH2EfYJ9hv3kvlqevaX3XmFvrC/u997ee4G9h32AfYT95L7iXkCk+oQyFgULxcKoUIeFYOGxCFhELPDmijdXvLnizRVvbnhzw5sb3tzw5oY3N7y54c0Nb254c8Obi5sevbgXKVYR4cRzEjiJnCROMieFE50h6itimMjc+lp9YUQ48ZwETibX984/iRepSOIkc1I4UU4ME+84EU4m1/chvkgMFQmcRE4SJ5mTwolyYpgEx4lwwtcPs+vnikROZtevnskhc1I4UU6m18/5RUr1tIyOE+HEcxI4iZwkTjInZY5oRZQTwyTNra/VYzwJJ56TwEnkJHGSOSmcKCeGSebrZ7j+fbj6tzz1y9Wuex5rb6/79Y9T7sv/Y/d24H08Hdbd5nrqxqPv71Pv8W6laCtmw62MXxCf2pAeP3nHt3JoJevjN9Cj9K2UONzBcBdf", + "bytecode": "H4sIAAAAAAAA/81ZO4/TQBBeJ15fHHNKBBUSHVDROHFyCaKJBKLnJzgJKajoaSxR0UIDEhIFoqFDAomfRza3Q758nvjuOO+JlaLZx+zMN499eBOZ89LZ/iJfj6HP+H6pG+hzZeFpfr0yalFWHgpjFABjCJydQDhNl0BzUmhG/fY09RSTqtui0SnpbVP+PJ/MUsW+FvEXKcgMKT8OIz8/8XKeVYfyDemVvufV3pfPaY5gDRTLSWBfjE/JfgO2iG4bRncRkT5DcTCkv2+C5t0oIn2Ch/0j+8Kp8FR7PBGNxVXdDhmzMCbx7W1/d4FPyy0cw31NctPJeADyHvp64FydpYSp7XV7R8GPulw5qfb+EF91oU98LjHoIT+NpTAWV4d6+r4dgx6UJTgs8d/37YGnCcyR+UNFf0L6D3ArfeyXVOFPFf5k+7vn65n/uRz6IHPMzaxB3u+0vJI6rq3E1NcszrXE/8hTZ+MnsjHQvjcWzAlg6ip2W8JzAmOmRZ9bwpODTz6Tn3tmX7rmcD0acxijyOzvUsjfAx6xd0AYcC6fgS3aPjWEySo4YhoT3jnhw3tdm/vebZBrFF3HcgljYY/Y98RTLdbCY8zlYn2i8KMfhX9g6utL5qaK7oWn+fVKybqsgiOhMeF9Svgwh0PHuke6bfu+GTfdZSTX4iqIzYWz74uXdWrq8beEqSnPXOG81PYs3EuFf2jqsRVfD0z97pGAf1hmmznBdsRH7IjAfrYDfcD72AtPXfsXyYsU32l7wNDU1zvehXke5lbA9XTpbwzR3zf1OIe431z2HBXfpQrWoTLG/tfO31TR0yRrYOox4twPdfaJHX0vL1bsQGwd4se6K5b6lp5qua/FqNfgu0TBw/hRVkI+c0XzNc7FtjXH71Ns5ytPJV4Z6V74dn7Nop1fWYNtnEf9QLgiwoJ5hDo5jzLFDvSv9L32NHQeXfX+nTXoxrNPu39z3JrOvlD3oaa4sW/E/qvE7Y2noc6+pjg0rX9t/TCvVXh5/QvvW0//h/XflEeB3hX+5pH4B/OI3xJc6RA/1tG/0vfO09B5FCuymu6+Wt6hTbz+m/KO31CQl78vhfe9p6Hf9LW8E12ZCfsNM5uf59fOx9XeD/hmbEi/Jf6Pvo1nEdqx+Eecm1k52hTlppyW6/VkVbKfXOmAn9rWP57Pzx6Pl9vX4fVqs54UN61/NT1bribTMn852sG5SL/2LovfxK7I2y6+/SI/rhPk/yq82983X+f/AlCf4/vZwBcdoTsZSl9cHfZpb8L4Vi78ortf1THKWAZjlvTc8m30F8oSHJb4f/i2xATft2X+UNHfI/0HuJU+fivPFP5M4Xfx+S7yPEXb2/5u3Okk+djH2CR3QqyrclbMV+PJaracFmVxduG+8ge9a8rFvSEAAA==", + "debug_symbols": "ldjdaqNAGIfxe/HYg/l6Z97JrSxLMYkpgphgkoUl5N5XQ2SLSuQ5KbV9fmDzhynMozjW+/v3V9Odztdi9+tRtOdDdWvO3fD0eJbFvm/atvn++vnjwoxfvL7666XqxsfrrepvxS7asqi74/BNHPSpaetiJ+b5uyx8Zn0wsLewd7D3sA+wF9hH2CfYr+4rMvVp3mfWi4G9/dgnM+8d7D3sA+wF9hH2CfYK+9V9Nb37LLM+Gthb2LvPfZ73HvYB9gL7CPvVfa2ZgLWLT0ixyFQkg4XFwmHhsQhYCBYRC7x5wpsnvLnizRVvrnhzxZsr3lzx5oo3V7y54s0Vb57x5hlvntc3T2YSaX4mZo9FwEKwiFgkLBSLTIU1ZoOoWxDLydbsKgviOQmcCCer0zvj3sRZuyCJE+UkY2INJ5YTx4nnZHV958NEgl8Q4SRykjhRTjImznBiOXGceE74+m5z/bggkZPN9RdnslNOMibecLK+fowTSYvT0jtOPCeBE+EkcpI4UU7yFtE5Wb96+0wsJ1vr6+IYD56TwIkw8hye/lR9U+3b+n1terp3hx+3qLe/l3p2oXrpz4f6eO/r8Wr1/63q+MlbyaVVM7zK+Oc6Kb28/oWPvwqptOJeZ/qr9MOjDG8wvMU/", "file_map": { "50": { "source": "fn main(mut array: [Field; 2], i: u32) {\n assert_eq(array[i - 1], 5);\n assert_eq(array[i], 10);\n\n array[i] = 2;\n\n let array2 = [array, array];\n\n assert_eq(array2[0][0], 5);\n assert_eq(array2[0][i], 2);\n assert_eq(array2[i][0], 5);\n assert_eq(array2[i][i], 2);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_0.snap index fe4e0d2b8e2..b92c9cebdfe 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_0.snap @@ -48,8 +48,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81ZPY/TQBBdJ94kji/KCSokOqCjcOLkErpIIBp+AaUvIQUlFaUlSipaKiQakJCQKBANHRL8LOK7mbuXl4mJFO+Jlay1d2fnvfnY9dobucvS2lyR3MfQ5qRd7x20VWUhdXZcGTWoKwvFMQrAMQTPViCerk2kOSkso/5InUiNSdVu0OiEcJvUP88ms8Swr0H+eQI6Q+qPw+jPuqLnSbmt3xGutj0tr335lMYo10CxnAT2xXhA9juwRbF9GOw8IjxHcXCE33dB824UEZ7yYf/oujBQmfKaT0R9cblrh/Z56NP49jbXHZCzcgv7cF3T3Kx03Ad9D+Q+cK7OEuLU9Ly9bfBHrKp0y2t/qK/a0KY+1xj0UJ76EuiLy22cvjzHgIO6lIcn+XvyPJS6A2N0/KmB3yH8Ld5GG/slMeQTQ76zue7KfSpXlUMfgTfPQV4vQq3bPD/V9xam2sTrF85tT20Ppa7s/Uz24fyvWxNO3f45G/i9ubN+RcC1ZfBR+Y48dwzbcKwn+Rz89YVs7ISxcaycu8CpbdjdIT496HMN+twTnzn45Cv5GfdlbbedJ85tx6i6+oY87h3V3iFxwLH8Dm/Q9qkjTt7g4akvIQ4J8W16zbgFep2BtS+XMBadPfY9ltqKtco4d1ise4Y8+lHlh253funYxMBeSJ0dVwrG8gaPLvWp7DPihzkcOtYJYSvfBn0zrtsHKn5cBrE5r3z8TXQN3G78PXGqy7OqcF5aaxaupfzew9iqr4fGuC74J2RO8FqKewbE7IH9vEbgOuyp7bnU1p6hV+M7xULfdQ0+A2Mc5lbAtfPg7zPF77vdOIfY3/QP9Kv6LjW4nhp96H/sQ5zUwKnTNXS7MeLcT8P46yr3T0RfbNiB3Fokj/dV8dT2Umor960Y9Wt8Z+1dmD/q6pLPqmL5Gsfiszdk/R47X0mt8RoQ9kKesyOL9f4a1NjGeXQSiFdEXDCPEJPzaGDYgf7VttdSh86jQ9cNttfCtvZkXcPeQ959ofa+dXFDTH73HRq3N1KHevfVxaFu/vf28EdZb8jy/FfZt1L/D/Mf37+cR4H+02YcU8wjxqxKy/Atxp59/07qJv67WHlRl5N1e18r76y9rxUbzjv+h4Ky/H2psu+lTvbYtpDn7Mhi5R3vX9g3yCvQ/6yrvFP/YN5Z/6daJI/36F9t+yC1lXf8vwzbnKv/36d9qQv7/TebX/qoKvrtqf8wuMTQj/Kf5BnfB1rHR/Bcz4rROi/WxbRYrSbLgnPMkZ+axi9m+Xw5nixn59O8yM9uHH88n589Gp9vTkVWy/Vqkt80/nJ6dr6cTIvsxeiCzr/wrfMI/J9RFT3TwDMPlMc1DuW/q+zm+iH3fAaGeJXc7xq5aE99ocNoi8vtNussBM+IVF6x++UuR+1Loc8Tzok8o79Ql/LwJP9LnjUmeK6j408N/B7hb/E22viMKDXkU0O+is9P1Sc12t70N/8FJunHNuamuVPl9V/u8V84NSQAAA==", - "debug_symbols": "ldjbiuJAFEbhd8l1LmrXcW9fZRgaD7EJiIqHgUF8905E6cYKHdZN09H1QfCXIHVrNt3q+vnR77eHc7P4c2t2h/Xy0h/2w9Xt3jarU7/b9Z8fP19u3Pgn5kd/Pi734+X5sjxdmkWWtun2m+GfPOhtv+uaRXL3v20TC+wV9sb65GAvsPewD7CPsE+wn9w3pVdf3vsCe4W9/doX99ZnB3uBvYd9gH2EfYJ9hv3kvlqevaX3XmFvrC/u997ee4G9h32AfYT95L7iXkCk+oQyFgULxcKoUIeFYOGxCFhELPDmijdXvLnizRVvbnhzw5sb3tzw5oY3N7y54c0Nb254c8Obi5sevbgXKVYR4cRzEjiJnCROMieFE50h6itimMjc+lp9YUQ48ZwETibX984/iRepSOIkc1I4UU4ME+84EU4m1/chvkgMFQmcRE4SJ5mTwolyYpgEx4lwwtcPs+vnikROZtevnskhc1I4UU6m18/5RUr1tIyOE+HEcxI4iZwkTjInZY5oRZQTwyTNra/VYzwJJ56TwEnkJHGSOSmcKCeGSebrZ7j+fbj6tzz1y9Wuex5rb6/79Y9T7sv/Y/d24H08Hdbd5nrqxqPv71Pv8W6laCtmw62MXxCf2pAeP3nHt3JoJevjN9Cj9K2UONzBcBdf", + "bytecode": "H4sIAAAAAAAA/81ZO4/TQBBeJ15fHHNKBBUSHVDROHFyCaKJBKLnJzgJKajoaSxR0UIDEhIFoqFDAomfRza3Q758nvjuOO+JlaLZx+zMN499eBOZ89LZ/iJfj6HP+H6pG+hzZeFpfr0yalFWHgpjFABjCJydQDhNl0BzUmhG/fY09RSTqtui0SnpbVP+PJ/MUsW+FvEXKcgMKT8OIz8/8XKeVYfyDemVvufV3pfPaY5gDRTLSWBfjE/JfgO2iG4bRncRkT5DcTCkv2+C5t0oIn2Ch/0j+8Kp8FR7PBGNxVXdDhmzMCbx7W1/d4FPyy0cw31NctPJeADyHvp64FydpYSp7XV7R8GPulw5qfb+EF91oU98LjHoIT+NpTAWV4d6+r4dgx6UJTgs8d/37YGnCcyR+UNFf0L6D3ArfeyXVOFPFf5k+7vn65n/uRz6IHPMzaxB3u+0vJI6rq3E1NcszrXE/8hTZ+MnsjHQvjcWzAlg6ip2W8JzAmOmRZ9bwpODTz6Tn3tmX7rmcD0acxijyOzvUsjfAx6xd0AYcC6fgS3aPjWEySo4YhoT3jnhw3tdm/vebZBrFF3HcgljYY/Y98RTLdbCY8zlYn2i8KMfhX9g6utL5qaK7oWn+fVKybqsgiOhMeF9Svgwh0PHuke6bfu+GTfdZSTX4iqIzYWz74uXdWrq8beEqSnPXOG81PYs3EuFf2jqsRVfD0z97pGAf1hmmznBdsRH7IjAfrYDfcD72AtPXfsXyYsU32l7wNDU1zvehXke5lbA9XTpbwzR3zf1OIe431z2HBXfpQrWoTLG/tfO31TR0yRrYOox4twPdfaJHX0vL1bsQGwd4se6K5b6lp5qua/FqNfgu0TBw/hRVkI+c0XzNc7FtjXH71Ns5ytPJV4Z6V74dn7Nop1fWYNtnEf9QLgiwoJ5hDo5jzLFDvSv9L32NHQeXfX+nTXoxrNPu39z3JrOvlD3oaa4sW/E/qvE7Y2noc6+pjg0rX9t/TCvVXh5/QvvW0//h/XflEeB3hX+5pH4B/OI3xJc6RA/1tG/0vfO09B5FCuymu6+Wt6hTbz+m/KO31CQl78vhfe9p6Hf9LW8E12ZCfsNM5uf59fOx9XeD/hmbEi/Jf6Pvo1nEdqx+Eecm1k52hTlppyW6/VkVbKfXOmAn9rWP57Pzx6Pl9vX4fVqs54UN61/NT1bribTMn852sG5SL/2LovfxK7I2y6+/SI/rhPk/yq82983X+f/AlCf4/vZwBcdoTsZSl9cHfZpb8L4Vi78ortf1THKWAZjlvTc8m30F8oSHJb4f/i2xATft2X+UNHfI/0HuJU+fivPFP5M4Xfx+S7yPEXb2/5u3Okk+djH2CR3QqyrclbMV+PJaracFmVxduG+8ge9a8rFvSEAAA==", + "debug_symbols": "ldjdaqNAGIfxe/HYg/l6Z97JrSxLMYkpgphgkoUl5N5XQ2SLSuQ5KbV9fmDzhynMozjW+/v3V9Odztdi9+tRtOdDdWvO3fD0eJbFvm/atvn++vnjwoxfvL7666XqxsfrrepvxS7asqi74/BNHPSpaetiJ+b5uyx8Zn0wsLewd7D3sA+wF9hH2CfYr+4rMvVp3mfWi4G9/dgnM+8d7D3sA+wF9hH2CfYK+9V9Nb37LLM+Gthb2LvPfZ73HvYB9gL7CPvVfa2ZgLWLT0ixyFQkg4XFwmHhsQhYCBYRC7x5wpsnvLnizRVvrnhzxZsr3lzx5oo3V7y54s0Vb57x5hlvntc3T2YSaX4mZo9FwEKwiFgkLBSLTIU1ZoOoWxDLydbsKgviOQmcCCer0zvj3sRZuyCJE+UkY2INJ5YTx4nnZHV958NEgl8Q4SRykjhRTjImznBiOXGceE74+m5z/bggkZPN9RdnslNOMibecLK+fowTSYvT0jtOPCeBE+EkcpI4UU7yFtE5Wb96+0wsJ1vr6+IYD56TwIkw8hye/lR9U+3b+n1terp3hx+3qLe/l3p2oXrpz4f6eO/r8Wr1/63q+MlbyaVVM7zK+Oc6Kb28/oWPvwqptOJeZ/qr9MOjDG8wvMU/", "file_map": { "50": { "source": "fn main(mut array: [Field; 2], i: u32) {\n assert_eq(array[i - 1], 5);\n assert_eq(array[i], 10);\n\n array[i] = 2;\n\n let array2 = [array, array];\n\n assert_eq(array2[0][0], 5);\n assert_eq(array2[0][i], 2);\n assert_eq(array2[i][0], 5);\n assert_eq(array2[i][i], 2);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index fe4e0d2b8e2..b92c9cebdfe 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/nested_dyn_array_regression_5782/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -48,8 +48,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81ZPY/TQBBdJ94kji/KCSokOqCjcOLkErpIIBp+AaUvIQUlFaUlSipaKiQakJCQKBANHRL8LOK7mbuXl4mJFO+Jlay1d2fnvfnY9dobucvS2lyR3MfQ5qRd7x20VWUhdXZcGTWoKwvFMQrAMQTPViCerk2kOSkso/5InUiNSdVu0OiEcJvUP88ms8Swr0H+eQI6Q+qPw+jPuqLnSbmt3xGutj0tr335lMYo10CxnAT2xXhA9juwRbF9GOw8IjxHcXCE33dB824UEZ7yYf/oujBQmfKaT0R9cblrh/Z56NP49jbXHZCzcgv7cF3T3Kx03Ad9D+Q+cK7OEuLU9Ly9bfBHrKp0y2t/qK/a0KY+1xj0UJ76EuiLy22cvjzHgIO6lIcn+XvyPJS6A2N0/KmB3yH8Ld5GG/slMeQTQ76zue7KfSpXlUMfgTfPQV4vQq3bPD/V9xam2sTrF85tT20Ppa7s/Uz24fyvWxNO3f45G/i9ubN+RcC1ZfBR+Y48dwzbcKwn+Rz89YVs7ISxcaycu8CpbdjdIT496HMN+twTnzn45Cv5GfdlbbedJ85tx6i6+oY87h3V3iFxwLH8Dm/Q9qkjTt7g4akvIQ4J8W16zbgFep2BtS+XMBadPfY9ltqKtco4d1ise4Y8+lHlh253funYxMBeSJ0dVwrG8gaPLvWp7DPihzkcOtYJYSvfBn0zrtsHKn5cBrE5r3z8TXQN3G78PXGqy7OqcF5aaxaupfzew9iqr4fGuC74J2RO8FqKewbE7IH9vEbgOuyp7bnU1p6hV+M7xULfdQ0+A2Mc5lbAtfPg7zPF77vdOIfY3/QP9Kv6LjW4nhp96H/sQ5zUwKnTNXS7MeLcT8P46yr3T0RfbNiB3Fokj/dV8dT2Umor960Y9Wt8Z+1dmD/q6pLPqmL5Gsfiszdk/R47X0mt8RoQ9kKesyOL9f4a1NjGeXQSiFdEXDCPEJPzaGDYgf7VttdSh86jQ9cNttfCtvZkXcPeQ959ofa+dXFDTH73HRq3N1KHevfVxaFu/vf28EdZb8jy/FfZt1L/D/Mf37+cR4H+02YcU8wjxqxKy/Atxp59/07qJv67WHlRl5N1e18r76y9rxUbzjv+h4Ky/H2psu+lTvbYtpDn7Mhi5R3vX9g3yCvQ/6yrvFP/YN5Z/6daJI/36F9t+yC1lXf8vwzbnKv/36d9qQv7/TebX/qoKvrtqf8wuMTQj/Kf5BnfB1rHR/Bcz4rROi/WxbRYrSbLgnPMkZ+axi9m+Xw5nixn59O8yM9uHH88n589Gp9vTkVWy/Vqkt80/nJ6dr6cTIvsxeiCzr/wrfMI/J9RFT3TwDMPlMc1DuW/q+zm+iH3fAaGeJXc7xq5aE99ocNoi8vtNussBM+IVF6x++UuR+1Loc8Tzok8o79Ql/LwJP9LnjUmeK6j408N/B7hb/E22viMKDXkU0O+is9P1Sc12t70N/8FJunHNuamuVPl9V/u8V84NSQAAA==", - "debug_symbols": "ldjbiuJAFEbhd8l1LmrXcW9fZRgaD7EJiIqHgUF8905E6cYKHdZN09H1QfCXIHVrNt3q+vnR77eHc7P4c2t2h/Xy0h/2w9Xt3jarU7/b9Z8fP19u3Pgn5kd/Pi734+X5sjxdmkWWtun2m+GfPOhtv+uaRXL3v20TC+wV9sb65GAvsPewD7CPsE+wn9w3pVdf3vsCe4W9/doX99ZnB3uBvYd9gH2EfYJ9hv3kvlqevaX3XmFvrC/u997ee4G9h32AfYT95L7iXkCk+oQyFgULxcKoUIeFYOGxCFhELPDmijdXvLnizRVvbnhzw5sb3tzw5oY3N7y54c0Nb254c8Obi5sevbgXKVYR4cRzEjiJnCROMieFE50h6itimMjc+lp9YUQ48ZwETibX984/iRepSOIkc1I4UU4ME+84EU4m1/chvkgMFQmcRE4SJ5mTwolyYpgEx4lwwtcPs+vnikROZtevnskhc1I4UU6m18/5RUr1tIyOE+HEcxI4iZwkTjInZY5oRZQTwyTNra/VYzwJJ56TwEnkJHGSOSmcKCeGSebrZ7j+fbj6tzz1y9Wuex5rb6/79Y9T7sv/Y/d24H08Hdbd5nrqxqPv71Pv8W6laCtmw62MXxCf2pAeP3nHt3JoJevjN9Cj9K2UONzBcBdf", + "bytecode": "H4sIAAAAAAAA/81ZO4/TQBBeJ15fHHNKBBUSHVDROHFyCaKJBKLnJzgJKajoaSxR0UIDEhIFoqFDAomfRza3Q758nvjuOO+JlaLZx+zMN499eBOZ89LZ/iJfj6HP+H6pG+hzZeFpfr0yalFWHgpjFABjCJydQDhNl0BzUmhG/fY09RSTqtui0SnpbVP+PJ/MUsW+FvEXKcgMKT8OIz8/8XKeVYfyDemVvufV3pfPaY5gDRTLSWBfjE/JfgO2iG4bRncRkT5DcTCkv2+C5t0oIn2Ch/0j+8Kp8FR7PBGNxVXdDhmzMCbx7W1/d4FPyy0cw31NctPJeADyHvp64FydpYSp7XV7R8GPulw5qfb+EF91oU98LjHoIT+NpTAWV4d6+r4dgx6UJTgs8d/37YGnCcyR+UNFf0L6D3ArfeyXVOFPFf5k+7vn65n/uRz6IHPMzaxB3u+0vJI6rq3E1NcszrXE/8hTZ+MnsjHQvjcWzAlg6ip2W8JzAmOmRZ9bwpODTz6Tn3tmX7rmcD0acxijyOzvUsjfAx6xd0AYcC6fgS3aPjWEySo4YhoT3jnhw3tdm/vebZBrFF3HcgljYY/Y98RTLdbCY8zlYn2i8KMfhX9g6utL5qaK7oWn+fVKybqsgiOhMeF9Svgwh0PHuke6bfu+GTfdZSTX4iqIzYWz74uXdWrq8beEqSnPXOG81PYs3EuFf2jqsRVfD0z97pGAf1hmmznBdsRH7IjAfrYDfcD72AtPXfsXyYsU32l7wNDU1zvehXke5lbA9XTpbwzR3zf1OIe431z2HBXfpQrWoTLG/tfO31TR0yRrYOox4twPdfaJHX0vL1bsQGwd4se6K5b6lp5qua/FqNfgu0TBw/hRVkI+c0XzNc7FtjXH71Ns5ytPJV4Z6V74dn7Nop1fWYNtnEf9QLgiwoJ5hDo5jzLFDvSv9L32NHQeXfX+nTXoxrNPu39z3JrOvlD3oaa4sW/E/qvE7Y2noc6+pjg0rX9t/TCvVXh5/QvvW0//h/XflEeB3hX+5pH4B/OI3xJc6RA/1tG/0vfO09B5FCuymu6+Wt6hTbz+m/KO31CQl78vhfe9p6Hf9LW8E12ZCfsNM5uf59fOx9XeD/hmbEi/Jf6Pvo1nEdqx+Eecm1k52hTlppyW6/VkVbKfXOmAn9rWP57Pzx6Pl9vX4fVqs54UN61/NT1bribTMn852sG5SL/2LovfxK7I2y6+/SI/rhPk/yq82983X+f/AlCf4/vZwBcdoTsZSl9cHfZpb8L4Vi78ortf1THKWAZjlvTc8m30F8oSHJb4f/i2xATft2X+UNHfI/0HuJU+fivPFP5M4Xfx+S7yPEXb2/5u3Okk+djH2CR3QqyrclbMV+PJaracFmVxduG+8ge9a8rFvSEAAA==", + "debug_symbols": "ldjdaqNAGIfxe/HYg/l6Z97JrSxLMYkpgphgkoUl5N5XQ2SLSuQ5KbV9fmDzhynMozjW+/v3V9Odztdi9+tRtOdDdWvO3fD0eJbFvm/atvn++vnjwoxfvL7666XqxsfrrepvxS7asqi74/BNHPSpaetiJ+b5uyx8Zn0wsLewd7D3sA+wF9hH2CfYr+4rMvVp3mfWi4G9/dgnM+8d7D3sA+wF9hH2CfYK+9V9Nb37LLM+Gthb2LvPfZ73HvYB9gL7CPvVfa2ZgLWLT0ixyFQkg4XFwmHhsQhYCBYRC7x5wpsnvLnizRVvrnhzxZsr3lzx5oo3V7y54s0Vb57x5hlvntc3T2YSaX4mZo9FwEKwiFgkLBSLTIU1ZoOoWxDLydbsKgviOQmcCCer0zvj3sRZuyCJE+UkY2INJ5YTx4nnZHV958NEgl8Q4SRykjhRTjImznBiOXGceE74+m5z/bggkZPN9RdnslNOMibecLK+fowTSYvT0jtOPCeBE+EkcpI4UU7yFtE5Wb96+0wsJ1vr6+IYD56TwIkw8hye/lR9U+3b+n1terp3hx+3qLe/l3p2oXrpz4f6eO/r8Wr1/63q+MlbyaVVM7zK+Oc6Kb28/oWPvwqptOJeZ/qr9MOjDG8wvMU/", "file_map": { "50": { "source": "fn main(mut array: [Field; 2], i: u32) {\n assert_eq(array[i - 1], 5);\n assert_eq(array[i], 10);\n\n array[i] = 2;\n\n let array2 = [array, array];\n\n assert_eq(array2[0][0], 5);\n assert_eq(array2[0][i], 2);\n assert_eq(array2[i][0], 5);\n assert_eq(array2[i][i], 2);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index c22052246ff..9616ae85193 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -63,8 +63,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1cz48jRxWutt3+MR7PmE02y4ULdyR77ZnZvUSL2E3YsCBQJECROHgmu0cgNzjRJxSEuHPiguDGLRIH/gAUKf9CFEWKklvuySHK1Gw999efv+5p73RNpiOXZLXd9eq9V69evR/Vr5245+27558kfO+Faydc/f2XXbEZ7INwnV2tzRvENYvFY9ICHjst4LHbAh57LeAxbQGP/RbwOGgBj8MW8DhqAY97LeBx3AIe91vA46QFPB60gMfDFvA4bQGP32kBj7dawONLDfLoebM8Jxa/L7dAprcblqnx2A3fXzn/3HHP88z1DZxMJwD7wNsHtj5w9IGZD3x8YOEdt3eM3vF4w+4NpzdMfuP7jeUV1yuGF/ZtwF3KAAjxnaABo/C7QxN40JCQR0S3Sfz3ZscnI1dsDfO/GLniojaLf35s+Htx+J8NAp6fZUX8jujavdMsl+UpjEGYM4A5IxibT5z1Xj6NLK+7E1eUkZpbGof2IiF6KHPsM/p7LqZuPj/8QXrGD8unQ/IZxOFnZviHkfDbfEdivij/Ac13HIefleniHvDDurgfh/ZpXV00+nvEayxd3Heba4PyMV2cGEyW8zOivl62OQ/rS6HP1tfr3WswP+xDftA+mK5O3aauGN+R980q8r6Z7/bNuu32DfTF3jcTp2MN5/J1jhHXnsedd3dxyM2NQ5QOc18v25yH0mFbX9ThidO6ZXC/gO+/ARgcg3NIxBxi5h3n+ruMrL+LbdegS32XrUHk/b2Mm/fNFi+5ch0yfRhkbt26JE+UkclsiPDUN4K+Xlaksxd+94AO4jI+UoL/efh9GK59GGPjp4J+n+gX+Bb3UEaMqyvuGbw/T3kcvnv/YX7sR1mOr0mbbfgfxsG/MvyP4uBfGP7XAL9rDv/M8L8eh/81/h8H/DF4fxxHNutzsjfiyGaN/yfNy2aN+0kU3udLw//Tq/M+5xveLni/8nHAZ769l5O6rrhr+aJxVyQfXhl3oXw6JLu+4HVKfb7ZPk1EX1fc61wzronbnH9ScjU6fI/poO6YDFWsbzbS8/VbGIPjUqfjYPNvKcH/z+U436mgzfoeR7/mR3X13ehfV57RI37K8gyTTz+OfJZ1dFnp0UD0GS7Lq1F3EL4Pc0R4/G7j8d6fwnVKOH3jvTkQ88F7GL/9keam7PKL7kXWa+RRyRxxmZ8+FOP7xDPmfLiv/0w0DT+uDY41/5oS/D9cjvMvrsiX8huHbjP3MFlEzguP2UdgU/rLvmUo5GF9eP7IMSy2Lv3mHPMzoMlwzCuu+4DGYe6LNtW3HvQ1GUN4/n+YFHlEHUqJJ2XrEB51pGxfIA7zPexXUVbKF/I6J6LPx2pKr43+YQXN2M+m2L72XLP29V/h6n//KsnHXOYfjJZvU1duq5j/rtP68DArwmP9QNdtzoPheW3YDo1K+ElL5mb4WV7/CVf/+61E8+xctX83+D0Bj3waP4duc03xrPpifFbE7VxsmzA/UjYBZcg2QclH6VNd+bD+4bOOIeFKBC7UP/O7yoeX+V3Eq/xu/xKajEfFL8rmHAoeBzVwJRW0hwJ+UEEb+RpSn7JL1/2MHe3kUMip4zb1CfUzpXv/D1dlJ+vGncp31Vk3tCGmp5yDfRCuHvdH4bvSE/ONI7c5/9jPSq1ZHz574z2GzxUfZsU+jJ+2jcdsvhfPUMB2MRzzijo0dsVxaHsx3vWtB32x47HrtL0ccynbq+Ixo4l6WhXz4jlFTJme3MuLLW09U7epQ0g/JfhPw2+UhV2v8hLUs5PV/Nli9Wx1tHr77eXZ6hbh9w1jWTx3VM/A0QfZPY4f8WzKzkfNZkSqKThlu4CN7QLbUW5q7xvfXj7/3WLvo+z2qQ/t94T60GYcUB/uJXvOpXwr2+tIsl/7T5M9+k+kyXqCNhzXLaV7X4ZrE3mGsidKdtdUF7SW3b6Q3bhCdqjL+0J2dq+TNCc7FZsp/5GUXI0O36uKcVKiE+vce0B0Bg3SQbkNic6wQTpoM0ZEB89D8LzvFumEjcPcFsfyeZ/B/yDJcd5OijDG+x2A+X74HrM2+7zdV+dwjmSjbJSKM1kXcQ+y/kygj9f8AHiwZ5+4rtaUHzI4j/PDGn5IyTpGfcpNk3VdeZos/Lg7nRwvw/E8UF9tTmNXbx8hXd5HM9gjr9LeVHG1sgfsjxEe5c9nlBhX2NibGreptWedOYA+1plD6OP9OYU+lAm3y+LEuvvz1RIbbDTYBlsez7Ydx6JtV7VQmHf6ZvVUWG+F8KivCP8I9PV1mm8q6Hm4X1bAbesDe1nxnqrDwvo0gzfae9kmj9Y3hr6U6OyH3ygvxGV8pAT/Jq0J1pTZ+KmgPyT6Bb7FPa5PGwv4sYD36/MkDDJdxrk3/Wz7gibhx3vMm+nO2DWfK69OFvfO7i7PTk6PFqvF8aW5ctP0z46OT8+WR6vZ04uSoLu7XL3I84vY4F2uXmwcGzSdq/8+CHaXq2+fq/+hQdntcvUXo3OTc/V3S+LEslz9YZb3I/w/IWb7a1KEMd7/BjB/D993uXoOx62pXJ1lvcvVc5iblqv/G/bIe7Q3d7n6tzNXf6/EBhsNtsF1c/V3wfd/7IpjOoKfyO+C1a77X+eeLqq9WtdBd92mvFVdjJI3P3fGdeJ6YFWDqN4vuC5cqqaXa75j/V+LzcP2bM9pO9mF+SA8fncut6N2733QfY571Xp3K2TH+ufbRIzjfRTp/Zna7xPc5PeW0Zbj2Da+P3NVXDbet6q6YLbdl+mjxfkqB7A6JT7zqaotVvV0Ze9dqFpApMt1rJ+ECUeuA5vx+RfTQn7RJuE6PsqKczD4rwJSD/tZUpSZWmslzw71cX0i9iHfvA7rc1a3WXeo5mDwn4PdfIviFzzfxzpK33pZkc8H4f7sak3WlWEcnGbFeVfFvL5xjKz+LwTzEK4dw1g0JVzK/qHM3yBesfaM4RFfSvBfwBrNOkX+UK/3iHec+4D6uoKuqj3G+PKVgDDu+2GzE3UmY02dl7ItVTXaKh9lW4p6gDLgpvIAk4Xna1Ejr2zSTuB7chf8ZZt8fRP7tlDPnBXnWVXf6dx2ua1v5vvU/+qwfitfsM2e8a2qXt/WBvdMmd9V782yvVD1076xbzX479E+jfVukPKtfI4eKSbe+n07thG4f9hGqDpjZT+2tREmi21tBPsd7OuLeSj7wXlrIvhSe6BPfapGWuWcj7Miz5hfqxiL3ztNxLxiPC89f1R6crY6mc/vL+dPl/OjbZ6XqmcUeNZ+3CnKwOaLMRqOfZTl/Qj/ZifHeb9TlFOTulHlWyLH6UsV6yVEO9Izudr5tdG/rv+2Uz5P5ZeR//tv/b7+RPCjYm3/H84HbnPNkD/DpWJNpb/8n5Kx8kWWPeaE6t3IbZ9tPwlCauL5rHq2sq1955yhjn1HG4HvLqszhIRwKdvHY8tkgbaS30Mz/L8GW/k7spUqHlA2j22ligesryweQH3HOWB+yDGu2l8q/zTaqHOTGrgGFbQPBPykgjbyhWOZdpkNULmKySZyriLfGy7s2awom6ozA9/qyFKt45TgUXZqH/N+RLpj6sP9xzkO6qnpL+4XjmtwP2Jc8zWRhgaRcW4AAA==", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "20": { "source": "use crate::default::Default;\nuse crate::hash::Hasher;\n\ncomptime global RATE: u32 = 3;\n\npub(crate) struct Poseidon2 {\n cache: [Field; 3],\n state: [Field; 4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub(crate) fn hash(input: [Field; N], message_size: u32) -> Field {\n Poseidon2::hash_internal(input, message_size, message_size != N)\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2 {\n let mut result =\n Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal(\n input: [Field; N],\n in_len: u32,\n is_variable_length: bool,\n ) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\npub(crate) struct Poseidon2Hasher {\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv: Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_0.snap index 514f4c8c89d..fd625a17ca8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_0.snap @@ -63,8 +63,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1cvY8kRxWvnu+P7Z3ZvTsgBAT5zM3s7jlbibPhjMRHSmLPrb0REpEFCagTJFICRACZJciQEBIiJ0H8CUS2hIRE4tSJJV/t1Zv+9W9+3dd927V3LV1Jq+6pV/3eq9fvs6p6E/e8fe3ZXxLuB+HaC1fff98Vm429DNfV7dq6RVyrWDwmHeCx1wEe+x3gcdABHocd4HHUAR7HHeBx0gEepx3gcdYBHucd4PGoAzymHeDxuAM8LjrA47IDPJ50gMfTDvB4r0UePW9W58Ti934HZPqgZZkaj/1w/5Vnf191z+vMfQdOphcG+8TbJ7Y+cfSJmU98fGLhA7cPjD7weMfuHad3TN7wvWF5xfWK4YX9AHCXMgBC/HbQgGn43aMJXLYk5CnRbRP/o9X5duqKrWX+N1NXfKnt4l+fG/5BHP5X44Dn+1kRvyO61vdelsvyPXgGx7wPY96nMTafOO97+zSyvB6mrigjNbdhHNqbhOihzBFm9Gcupm4+X/xBesYPy6dH8hnH4Wdl+CeR8Nt8p2K+KP8xzXceh5+d6eIM+GFdPIpD+2ldXTT6M+I1li4eucN3g/IxXUxtTJbzMyXYIDuch8GGALP36/XuHZgfwpAf9A+mq0t3qCvGd2S72UW2m/Ubu9m3N3YDsNh2kzqdaziXv+cYee2j1dn1mzzk9c1DlA4zbJAdzkPpsL1f1OHUad2ycT+G+5/AGHwG55CIOcSsO57VTevI+rtp+g76BHvRO4hr37l8Iun05p4r1yHTh3Hm9q1P8kQZmcwmOJ5gU4ANsiKdWfg9ADqIy/gY0vgfhd+LcB3BM/b8UtAfEf0C36IPZcS4+qLPxvv1lCfh3scPi2PfyXJ8bfpsw/84Dv6d4X87Dv6N4X8H8Lv28K8M/3fj8L/H/72APwbvT+LIZr9O9m4c2dxssHn/+SQwbjFskIvqrvKL7cvmF5FiVWV+gfLB+OVhI8HrkmC+mT4mAtYXfb07xpW6w/knJVejw31MB3XHZMg5h2+X4bpq1nbcofJl8zN+zj8FflAOQ6dzSYsRQxr/mctx/izc18nV4+ju+qyuLRn9u8rVB8RPWa4+dYe21KJ8tnXsBPm1dzkWMMNltSnqDo4fwRxxPN7b89j3y3BdEk7f2O7HYj7YhznQz2luyue/rJ2zXiOPSuaIy2LdQjxvz8bcT/D6wbWcb+g3fl0yJ3z3PRpjcBz/H5fj/I0rn/eQYEpH2/Oj6y33RF6buzJ543qUNYOlYs6JGN+n38i3t6kfQq7D45gm2m9KMLTfY4Lh/uaCYLimZ3XQQszrjtZF9/sbJnur95gmHobG8fzehtT3h3D18vooyZ8piwcqt2Lfh+OU7CYku0jrunvZ7dcuYB5HFbJDXU6F7KzvY9ee7CaCn9i+f0x0xi3SQV2YEJ1Ji3RQblOiM22RDvoMXssui0N/g2fwubpxyMb/2+U4/x7uY66lrUr2YxzNW/kfjhVKz9C+WDeOAcbnULCpOGKy8Dh/0SCOoE7MXfE5XAvFfQrfBgS7DP2r27Wt5/+3SZFH1LEh0C3zNTiedUzleIjD6iiuP1FWqmbkWjsRsDnA1H7SqIJvtR82FzQs5mAst2df11xJ6T/bzQJgbDdLgLEfPAEYyoTbi3KzP9ewKfZ1hpd10uoItS9jz6IPrcqtjeYE6Cmaj7PieDxH1yccajzv9TPf0xJ+VM2J+Lmm/DRc/e9PE82zc9U1etV7QD6NnwXxwHHu5vksh2Gt59sAYG2ulShfiDJkX6jko2rsuvLhPADtZ0K4lF9VOl8nF0M+Da+qbccvoMnznYjxrNe+KXub1MCVVNBW72ZSQRv5mtagjXZgsuaa/vNw9b8vkiI9pGFxzeLFMfF5GX6vbteu2bdjU769aW1tfDetrVUdrPK+E4Jh3ndKMIx798L9wh3Kl89YYdyLUR/a/LA+XAgZ9tzh+7B734bUNw2CVfXhMTzXF31Vfue4QnZzkt0ysuxOhOyWFbLDXMTuUXbWd9Ki7OaCn1Q8l5RcjQ73MR2lw1Xn2l6WDurCnOjMW6SDcjsiOkct0kGfwet4GFOxtv4G6cT+DIrTtcTjLIfj+LeSHOe3wn3ks52NfT7rrMrnDXYKMNaNewBDmXNTccRk0bS2xvwB48gNnSyHWex9FbV1VT6p8sOqfFLVtHxO1DltYyOCYW1tNDFv4T1Mfz+Bcbx/umg4l6UYvxD8WhzC+L6PgS5mDF+vUsGrNWUvbEtoL2xLaC9sS/cBxr7xAcBQJtyUnZmcmtbbKeFl/8f19kjwiH41ph1ePMo/vjMfYH6b2wDgOP4HAQGvZ/jrbf4pxvXFbn292V3vznYffLC92p0Sft9wLUudz8H6y56LfDax9vkc65sRry3zsz9T0Cd+WD68Zqj2prle9o331pvut8TGpfaJ+fxErO8HbR5mMwMxD+St5w7jDZ4rGlLfLiiUys3V++5XyI71z7c6Z3MinXOrfTbndT5Hz/69y+fcbovLnvetal9CrbtV6aPVImqP1s7i+vjQdnzaXWweXT3cXl08PdvsNueN4pP5JHXOj+WM/UMxN15X+xXkDZhXtu3bToU8+SxGJN9wrmpSa6mYN+sdrnWy3k2JZ4ShDjVd/zNZeNr/hTyFx1lTOpIQbCTmodZsOX4r/6niANdB6FvHBEO7w3PeiNO56px44cr9wtzpbyWwdvVtHH7j9xg43vANafzvAgLP1+/p/QwFPT/uTxXjkpLrDQ7RN8iKfeo7Dfx+xcYb7Vl2yKPB5gAbEp2j8BvlhbiMjyGN/xh8mW/4zYk9vxT0J0S/wLfoQ31kXH3Rh2c3/xge2p/3ANpt5wY3NAk/9jFvpjtlsYHP9CKszvlataflG8cNG/8XihvsBy9dK7KScYP3lMYwB+Uv3s6Kc7Dx/wIb/muFPNmPojzZj1btiyHf/B7UGaNJxRxs/D8Cc7jn/Or2ffU6Ha7FoU35v6p1N9+aniXhb5lxvZRjo8rNUebvEq+4n6v2QQ0f51j/hHf0zV6RP9TrGfGOc+f42Rd01f70FHj+hGw2zncAqwu1PmtN5VQJwdQ+vsqpON9S59oSwYPKt0wWTfOtNvwEniW64S875OtV2C3u+7PdVp2/cK7Z+rpvVpep9XXWbxULmtiMb1VnOnAt/hOIu23XhFdn50+vtme71Ydr//Phy6xZog/Dfbb/JTku1COML/gsx5d9PdnLcf6fYmSbtUaVXUTOMbZVe72Rzx3WXrcy+nf1P0zqnvGM/C3A/psytU+i8gS/Z3TsDt+Z2qtWcVLpL59riZXrsuwxn0Wa/M0bzhPf25D6voA85KMS/+BcvXW6meCn6XoB5zt11gvQR1iNz+8L8SAu5ftUDFeyQF/JZ9T261jgK78e7pXPY1+p1pdUzcC+smx9CfUd54C5LcdnZV8qdzbaqHNpDVxV+9XqXFBaQRv54nNAKf0uOwtzQyvLYfhtk28DgLXp71WeVbDZrCibqnrHtzqyVO9RnX1KCYZ2zPaIdOcEQ/vj/Az1FM+Lm71wXoP2iHlN27nYszTs4mp3sV6/tV1/uF2fvSgX+xLXNk+82WQAAA==", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "20": { "source": "use crate::default::Default;\nuse crate::hash::Hasher;\n\ncomptime global RATE: u32 = 3;\n\npub(crate) struct Poseidon2 {\n cache: [Field; 3],\n state: [Field; 4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub(crate) fn hash(input: [Field; N], message_size: u32) -> Field {\n Poseidon2::hash_internal(input, message_size, message_size != N)\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2 {\n let mut result =\n Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal(\n input: [Field; N],\n in_len: u32,\n is_variable_length: bool,\n ) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\npub(crate) struct Poseidon2Hasher {\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv: Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index a201fb3d1e4..9d2ed2a3866 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/no_predicates_numeric_generic_poseidon/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -63,8 +63,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1dTWtkWRk+dVOVVFV3pW5S+eh0T/sPhKpOpdMDCoGZjLgRPxh0ZtxUZ6bBhWtBYbgIAy7dKAqijOBCRHAhCg4KLtwIbgT/wIAgogzML5ic7vOmnvvUUyc3k3uSXMiF5lad897367xf570n1S334rp3+q8VPrfDPQt3P77lypfBHoX7+HLXpEZc41Q8thrAY9YAHlcawGO7ATx2GsDjagN4XGsAj90G8NhrAI/9BvB4pwE83m0Aj4MG8LjeAB6HDeAxbwCPGw3gcbMBPI5q5NHzZvucVPxuNUCn2zXr1HhcCZ93Tv/tuhf7zLMBFCYLwL7w9oWtLxx9YeYLH19Y+MTtE6NPPD6w+8DpA5N3fO9Y3nC9YXhlbwPupQyAEv8aLKAXvmckwFFNSu4R3TrxPxkfPOu58lUz//s9V17UevFPHhv+dhr+x2sBz2tFGb8jujb2ZjHX5ZvwDMK8BTBvEYzJk2a9p6n19WjgyjpSsnXS0N5vET3UOc4Z/b5LaZsvmj9Iz/hh/WSkn7U0/IwNfzcRfpO3J+RF/a+RvHfS8DMzW+wDP2yLd9PQflrVFo1+n3hNZYt33eLaoH7MFgcGU8z56dFcu1iUw+Y6MGfr6+3uNZAP55AfjA9mq7lbtBXjO7HfzBL7zeTWb86uW7+BudR+M3C61nBuvs4p6trTunN2W4fc3DpE2TDPtYtFOZQN2/qiDQ+cti2D+wp8fh1g8BmUoSVkSLnvOLXfk8T2u3/RNVihufPWILF/n6Td9433R265DZk9rBXu7FohfaKOTGddhKe5Hsy1izKdfvjeBjqIy/joEPyXw/dhuK/CM/Z8LuivEv0S32IMdcS4VsSYwft+yhfDZ58/LI+9Uszx1RmzDf+rafDPDP9xGvz7Xkfex34GvSH0P1cfrbHFUIzpnN9WXRI5p1Xzm9Hvu6T59iy/rRI/rB+Mn7xfsGdzMYcxHueQzpqgc1W4Bm5R/taSu9HhMaaDttMhOjGbS7QHq2xzRv+qbE6tX8zmuoLXXMyxnXQFna6gc1W4eL39dRTu44tdMx4YCJ7YzrAvXuO6HlS1M6PfFzq6qt6AWjPeu+OzuZhj2+gLOmqf2yRc3DdJ3V/ldzZ140/V61B9JZcAf6Le0ZT3/LjWPp+9B+P+39leyen9sNW5HYL/bWuO8wdh7Pr6DZPKMeumv/dIE0Mn0yp5T9U5AzFnuNbDd7QdhO+CjAiPn+15HPtxuOcCJ8fEgVuUB8dwH/dDkk3VcFXsCPHmTts18qh0jnQslg3F8/Zsynei3j5UPwrjxs+XyIRrnxGMzSP8TyBuvB+Re5XmYjYaq8UHSfRVvRY3+ldViyt/iNXi64LXXMyx360LOuuCzlXhGrrl8aonnkvxztd6WG0hB/KWETx+dm7uMzb2+3D3PvDLbP7MReKfilNnfT3x3NGn0s1kyiMDIR/7aA7j17GPMfp9t7guKXw0J35YP+yjG4LXXMyxX20IOhuCTpNwmY0OBW7290Sxf8zriP6uapXMLdo52kCHxv4e7srf20J37YjuOoIfpbsh6S6RT47ZBlB3eUR3aAMbQnc29k9Xn+6Ggp+BeK615G50eIzpKBtOXaMOic6wRjqotzWis1EjHbSJHtFZVsd+COPor1XrWIO307oe57/D2FA8v0G4rI7FNc+EHFw3/zfcU8e2TcDriJY6K4G6/R/JmoEsvO/x13FRltXgN0G3H4WxoaDN8Qz12KE57Hex7d/2WOM91gzGuF+Rcn/l/6m9ger5bgRYXjPkz3Ch71kfTtkQ770T2cJZTrwL/K0ImhnIjPD42V8dHgsGpXKiOkui1lu9B4nlsRbNxc5lqXyhYvwddz7vyB/3VVqCd3XGBM9/+atNc0dhfHy5a+p5/VU254Nl6hRleVX9otbK4FXvEXFYb1etEa8fvgvl/YnSq18r5VNDomHrrXIE5xCE34Ec8dnwWdHjHIF5gHNEV/Bpc+iHnNNVjFLvrw1e7f/WCQZpYwzLK+CK2cSmgM8jtJEvfJZpL4u1yr/wXZS/2jBXZ45V/oU9DvYvtY6qlxLTpVrHnOBRdyp2VunZqNjJcVXVx+gvsTiKPhg7K4v9da7/qubuqn5h8DG/UHbLvoz2zr5sa9QWuFGPHYJ/OSjFaoURPJO6Ph+RDKovgWtxXJRlMPivQUz9HMXUWM8V9cMxFfnldUC+eR3sh3MwL2xGZDD4VwLf3s4+AN/3F8Ygk+c6cjz+KBDHIP4bTIZnn9kR8NsAYzrLCZ79h2Md6xzjAPv36hJ43Fsj/Jdgjf6SlflDv9si3jEOcvwcCroqDo6A5+8EPtS7ENzXvk7xMge5LuJf3wX/+kYC/zI5BySrzfvL4tMWjF/Hvtbo913SeDnheGL8cL7hfe12Gn6mMb8dCX5wX4trhvwZrti+Fm1oRLImsoUxxzTMR0gzB5lZNoyHHRr7FsQR3teqWkKtd+4W7c/gblreKL0zKMrybleUt2re4H24yhsqZnNcxpg9ojmM2X2aw5htMQ5jdixnZQKv6gsPAO+H4bPyF96zGj8q/nN+QPh3If7/qLWcHsd/jPEc/0eCT5tDH+P6Sq0/1ldsL7sCHm1inWijLe1WwBWz1XsCfjdCG/ni363Ype8qjiq/N91cx561FAOLsm5ifuyvKrpU65gTPOruon6/TXPoTxwT0E7NftFfYvEdfZD9Xvkn1naxc0YtwrHidK/l1aIMb3JmTteJDM+9dI5XwyX8qPN3iJ/r719A3vwg0zw7Fz+vGFsHVYurOjeWZ7H37q82zNV5bvSiPSKln8El9MN1COYB7iWpc4Qq18X6RioPGl51zm89QlPJq/TD566c0z2cYQVcrQjt83TNtJUtVvED1DW/F/5DYNDrcisr00MafL4R4x6fY9kkGY7C9/ElL5PVYjDW52pfmRE8fkZd2NifIc5wfX7RM0AdwY/SHb+zS9WHMzm2hO5GEd1hTVbqA9HY32rUXbei7tjurntfyLqrui/8xw2wu0T9gzPd7QjdbUd0hzXejtCdjf0rsd2lPgfE56d2aqSDOuwSnd0a6eDehs9P3auRDtb2fH5qIHh4ftapNR/HPFG1BjX4aTbH+Z+AU+Vl5BGfx73HupCD6f0/0LjO9zPn6fYj0u159f1xUZbV4HdAtx+TbpE2xzPU4w7NoVy7JM9tnzneZ1Z/y3BVfeY9wc+n7TMbrlifGW3opvWZ10Hmi9QTK0FJKide9G9XRoKf2Dl3lXu4Z4L5gt/3Yfzk81OKd+SPz09VPd9x9nst4d6GudQ98tLfFRZleVX9otaKcw3C4xpZvFHnO3j98PwUvjfdIv4xhg0B7r3wWfnZ7hK+l/1dJuYVhL8PeWOSLafHeQPl5rwxEnyq/jTneRW3Yv3p+wJ+D2C4D4W+f78CrpidPBDw9yO0kS98lmkvi79N6k+rdYz1p5Uu1TrmBI+6U/GUYy3GU+5Poz9xrEU7xf70pEJeQB/k/rTyT1UTjgTemG2qegR9km1zU8h3WV/GvOwEPNfsBv/5IIzVD2gHqWv2PZIh1ufx13FRlsHgvw4x9YhiquoTKX1yTFXv1lRs4XUw/8C8sB2RweC/APVP7EwV1nv+asNc6ryPcZNjUCw++4t95iUBj3GG48VLMLdJuFQNgevHZ6rwfFLsPBf3Wr8Ka8RnqjAOcozEOMjnrarWlXvA8/doXdDGca/7BsVLdd6vin+9C/71zQT+ZXIOSFab95fFJ8z517HXNfp9lzReTjieGD+cb3iv+yANP9OY3+4JfnCvi2uG/Bmu2F4XbWiPZE1kC2OOaZiPkOYWyMyyYTzs0Ni3I3tdVUuo9c7dov0Z3E3LG7GzuA8qyls1b/CZKpU3YucgVMzeozmM2fw+GGO2xTiM2bGcVbV2xbNa1itW/sJ7VuNHxX/ODwj/fYj/P82W0+P4r879qBqK6yv0Ma6v1PrH9joPBTzaxIhooy09rIArZqufEfAPI7SRL3yWaS+Lo8rvTTfXsWctxcCirJuYH/urii7VOuYEj7q7qN8/oDn0J44JaKdmv+gvsfiu+oGqtsO98Buwb/NXu5jD1bWuh0/m/2GW2ZTFDr7aMI/w7wc+sQa3+2X+I9tnh7PJs/3Zs9nB7O23pycz3l/6y2zoTgL6s8P9JyePpieHTw/2Z/uPz6Wvfnsb/dRfa+E7/r43whu+DsH/GuLzb2jv2BH0PNyfInCtJffnOMRYuyiP9YpFePw9dIM/+92uYpFHm7sDcxhD/HU3fEd9IS7jo0Pwf4Qc5i/8DXN7Phf0u0S/xLcYwxjGuFbEmMH79fkd+Q3KXvc+4zlNwo9jzJvZTgq/Ojl4/PRkejAbvzPxXx9dtV+fkj48mR1OJi9PJ+9MJwfn0f8E01uCuqV+AAA=", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "20": { "source": "use crate::default::Default;\nuse crate::hash::Hasher;\n\ncomptime global RATE: u32 = 3;\n\npub(crate) struct Poseidon2 {\n cache: [Field; 3],\n state: [Field; 4],\n cache_size: u32,\n squeeze_mode: bool, // 0 => absorb, 1 => squeeze\n}\n\nimpl Poseidon2 {\n #[no_predicates]\n pub(crate) fn hash(input: [Field; N], message_size: u32) -> Field {\n Poseidon2::hash_internal(input, message_size, message_size != N)\n }\n\n pub(crate) fn new(iv: Field) -> Poseidon2 {\n let mut result =\n Poseidon2 { cache: [0; 3], state: [0; 4], cache_size: 0, squeeze_mode: false };\n result.state[RATE] = iv;\n result\n }\n\n fn perform_duplex(&mut self) {\n // add the cache into sponge state\n for i in 0..RATE {\n // We effectively zero-pad the cache by only adding to the state\n // cache that is less than the specified `cache_size`\n if i < self.cache_size {\n self.state[i] += self.cache[i];\n }\n }\n self.state = crate::hash::poseidon2_permutation(self.state, 4);\n }\n\n fn absorb(&mut self, input: Field) {\n assert(!self.squeeze_mode);\n if self.cache_size == RATE {\n // If we're absorbing, and the cache is full, apply the sponge permutation to compress the cache\n self.perform_duplex();\n self.cache[0] = input;\n self.cache_size = 1;\n } else {\n // If we're absorbing, and the cache is not full, add the input into the cache\n self.cache[self.cache_size] = input;\n self.cache_size += 1;\n }\n }\n\n fn squeeze(&mut self) -> Field {\n assert(!self.squeeze_mode);\n // If we're in absorb mode, apply sponge permutation to compress the cache.\n self.perform_duplex();\n self.squeeze_mode = true;\n\n // Pop one item off the top of the permutation and return it.\n self.state[0]\n }\n\n fn hash_internal(\n input: [Field; N],\n in_len: u32,\n is_variable_length: bool,\n ) -> Field {\n let two_pow_64 = 18446744073709551616;\n let iv: Field = (in_len as Field) * two_pow_64;\n let mut sponge = Poseidon2::new(iv);\n for i in 0..input.len() {\n if i < in_len {\n sponge.absorb(input[i]);\n }\n }\n\n // In the case where the hash preimage is variable-length, we append `1` to the end of the input, to distinguish\n // from fixed-length hashes. (the combination of this additional field element + the hash IV ensures\n // fixed-length and variable-length hashes do not collide)\n if is_variable_length {\n sponge.absorb(1);\n }\n sponge.squeeze()\n }\n}\n\npub(crate) struct Poseidon2Hasher {\n _state: [Field],\n}\n\nimpl Hasher for Poseidon2Hasher {\n fn finish(self) -> Field {\n let iv: Field = (self._state.len() as Field) * 18446744073709551616; // iv = (self._state.len() << 64)\n let mut sponge = Poseidon2::new(iv);\n for i in 0..self._state.len() {\n sponge.absorb(self._state[i]);\n }\n sponge.squeeze()\n }\n\n fn write(&mut self, input: Field) {\n self._state = self._state.push_back(input);\n }\n}\n\nimpl Default for Poseidon2Hasher {\n fn default() -> Self {\n Poseidon2Hasher { _state: &[] }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index ab4f40dcf4d..4262e15af15 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -62,8 +62,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_0.snap index b87cc848a3a..a7bc5f7037d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_0.snap @@ -62,8 +62,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "1Z3RTttKEIbfJddc7OzM7sz2VaoKAaVVpAgqoEc6qvrux3CwG1grkev8YeYGYbLz5RPxvwPOZv1r8/X2+uf3y+3dt/vHzafPvza7+5urp+393XD06/fF5vphu9ttv1/u/3iTnr/k9jL+8cfV3fPh49PVw9PmE6V8sbm9+zp8J2mo/7bd3W4+leHbfigJj2PJdBpMbW5w4TQOLuXN4C8XG06OXMiRS3bkwo5cxJFLceRSHbmoIxdz5OJo3hVH8644mnfF0bwrjuZdcTTvypnnXbLJJXcu1ZGLOnIxRy7Nj0tJjlzIkUt25MKOXMSRi6N5tziad4ujebeced61Og6uhQ8P5lT1dTBTru/FW1DxmqKKU1TxHFWco4pLVPESVbxGFdeo4lE7Z43aOTVq59SonVOjdk6N2jk1aufUqJ1To3ZOjdo5NWrn1Kid087bOWtpk3grhwdLafI6WOqeBtUXcYoqnqOKc1RxiSpeoorXqOIaVdyiireg4i1K5+T34lE6ZycepXN24lE6ZycepXN24lE6Zyc+3znLJFN1X/y5QhdX2OKKtrSC0vz0aDSW7P2exhJaXpKXl/DyktkY5Ond01zt8NmU03SC5FTTu//BKBUwv4L5CuYbmN+wfEpgPoH5GcxnMB+cXwLnl8D5JXB+CZxfAuc3g/ObwfnN4PxmcH4zOL95dX6JyziWVDp+BfMVzDcwv2H5nMB8AvMzmM9gvoD54PwyOL8Mzi+D88vg/Ao4vwLOr4DzK+D8Cji/As6vgPMr4PwKOL8Czm8B57eA81tW5zfLxB/ehN/nL33Dngp7khFPMsWTTPUko55kzJNMcyRTV6eJmSYZzh1/9WnAbbzknyX1/qtfWZHJXwp1/IblawLzCczPYD6D+QLmFzC/gvkK5oPzq+D8Gji/Bs6vgfNr4PwaOL8Gzq+tzm/RiV/7/m6r81s5T2OldHwD8xuW3xKYT2B+BvMZzBcwv4D5FcwH57eB89uw+c0pgfkE5mcwn8F8AfMLmF/BfAXzDcwH55fA+SVwfgmcXwLnd/06parT9RnN3PELmF/BfAXzDcxvWP76dUpH+ATmZzCfwfzT5rd2/ALmz+fXxvXqnPI+/6VEl5fY8pK2uGR+zQ/TdP2dpSuh5SV5eQkvL5HlJbOniuTpowfMXUldXqJHSkS7ktlXX6b1eaL9Szn76ouNJSUfOe1PuGNonl+L8lEy5Ekme5JhTzLiSaZ4kqmeZPS8Mod2X8zza34+SqY5kinJkwx5ksmeZNiTjHiSKZ5kzjwDn2znmlw0rLmFNW9RzWsKa05hzXNYcw5rLmHNS1jzsD20nreHnm73nVwtrHmLaq4prDmFNc9hzTmsuYQ1L2HNa1jzKD2UO/MoPbQ3n+2hZVrdW1RP+hfXwevG88vOP0qGPMlkTzLsSUY8yRRPMtWTjHqSsfPKHLxubM2RTEueZMiTTPYkw55kxJNM8SRTPcmceQY+3bW1ZmHNW1BzTimsOYU1z2HNOay5hDU/b6c73XUeTjWsuYY1t7DmLao5pbDmFNY8hzXnsOYS1jxKD+XOPEoP7c2P9VBr++YvJba8pC0uyWl5yerP2R3cZ4zXf86OVSa+9XwB8wuYv/pzslzqHz53fAXzDcxvWP76/cCP8AnMz2A+g/nr8zt1geGpen4B8yuYr2C+gfkNy1+/H/gRPoH5GcxnMB+cXwHnV8D5FXB+BZxfAee3gPNbwPldvx+4pOl+NJJbx2cwX8D8AuZXMF/BfAPzG5ZfE5hPYD44vxWc3xPsE35oH2+uBcyvYL6C+QbmNyx//T7nR/gE5mcwn8F8cH4VnF8F51fB+VVwfhWcXwPn18D5NXB+DZxfA+fXwPk1cH4NnN/5NYHDn0XjmxJDh35zE6f+GWy6Fbztr1HRmaFVxmv5b9a+6P8q5kelnVVlumF6NXunIvPL8HAq46p5TdypkB+V+c0CtY7n+jCxv78ngcyvURtavB4qkvkiaYeKyt8U1b8p0qVFv4ejf64etlfXu9vHoeb5wZ93N0/b+7vXw6d/f4yPXD9sd7vt98sfD/c3t19/Ptxe7u5vnh/bpNcvn4XkQrh8eb75+3DILV1wezmkl0fpQoiHZx2e+T8=", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 93648a43728..8a1ba2f1f89 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_check/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -62,8 +62,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "7Z3bbts4EIbfxde5IDnDGTKvUiyCnBoYMJIghwUWQd99JW2kuJYqQ1B+d6bZmyCuOV8+s/45jk0qb5ub26vXu4vt/feH5835t7fN7uH68mX7cN/cevtxtrl62u5227uL/X/ehPZLqt3458fL+/bm88vl08vmPIZ0trm9v2m+49DUf9/ubjfnufl2PDQy9WNj0WFwrFODqWg/mErZH/zX2YaCIZdoyCUZciFDLmzIJRtyEUMuasilGHIxtO6yoXWXDa27bGjdZUPrLhtad9nQuptP+3zh+AGOdOhy2nnJRfrBkml+MAXpJ5FikkNx8SquXsWLV/HqVFyCV/HoVTx5FSev4uxV3GvnFK+dU7x2TvHaOcVr51SvnVO9dk712jnVa+dUr51TvXZO9do51UrnbF2sNMPWxUp/a1yKlZbVuljpQq2LlcbSuljpFa2LleW/dbGyorcup12kJdfBpeb5wZwrvw9m2dOI0omrV/HiVbw6Fa/Bq3j0Kp68ipNXcfYqnr2Ke+mcdCjupXOOxL10zpG4l855KB7DdOvMg43ovnlXEpeXpOUltLxkeokssS/Zm6u+JC8vkeUlurxkMgoplveSJGX+GZXC8CRJQcLBbwUxVCw/BjA/gvkJzCcwn8H8DOYLmK9gPji/EZzfBM5vAuc3gfObwPlN4PwmcH4TOL8JnN+0Or+Rcj82Ko/4FcunAOZHMD+B+QTmM5ifwXwB8xXMB+eXwPllcH4ZnF8G55fB+WVwfhmcXwbnl8H5ZXB+GZzfDM5vBuc3g/ObwfnN4Pzm1flNPPAppn3+0u0sMYslGbUkUyzJVEMyEizJREsyyZLM6mgTxUGG0oi/+jlJtX9LPnEY+evqpxnz4M85jvgRzE9gPoH5DOZnMF/AfAXzC5hfsfwCzm8B57eA81vA+S3g/BZwfgs4vwWc37I6v1kHvoz7e1mdX6E0jOV8yK8BzI9gfgLzCcxnMD+D+QLmK5hfwHxsflMIYH4E8xOYT2A+g/kZzBcwX8H8AuaD8xvB+Y3g/EZwfiM4vxGc3wjO7/p9UKLD+zOaaMRXML+A+RXLX78P6gg/gvkJzCcwn8H8DOZ/bn5lxFcwfzq/pd9TTiHt87uSurjkF7uVZkvi8pLJLFAc3n8nHpXQ8hJeXpKXl8jyksmnCqfheADRqKQsL6lHSvhw336a3uvCw/481tF/5fT2FS59SU5HnvYLT9hS6AfnfGQwyfCGEknh+cFlOCJS9rOnE0OF+yn86ZCv/jcf6f/5+Gk+6OvNx3CcRPYvsfk+H/wF56N30DB+fmS786HSk6mEwzek0/TGLiPmWefM1bA51znz4ta8ejWf3kDnwvzEr02G1/oxJx3JJEsyZEmGLclkSzJiSUYtyRRLMtWQjJx4uf60a8EliW7Nk1tzcmvObs2zW3Nxa65uzYtb8+rVXN32ULXSQzsZK22xk7HS6ToZK82rk7HSjzoZKy2mk7HSNToZK42gkznt2v5515JLJbg1j27Nk1tzcmvObs2zW3Nxa65uzYtbcy899PBalal66aFj88kemocPvrPq6V5ETR+p+V0yZEmGLclkSzJiSUYtyRRLMvWITKn7Mk0JTR8wmi+Jy0vS8hJaXrJ6M+/sxRJo/WEaUh74ZcxXML+A+esvJpHlg3/sPcnfsLGQ1p/nsf8Q4x/xEGe2Q9L6U002HuKvdzjS+oNVix7i7KZFWn8Ka5nM3D5EWn9ka5nM3GYxWn++6zNl1JJMsSSzvrMNr/Iar8MXbrT+mNkRfgTzE5hPYD6D+RnMFzBfwfwC5oPzS+D8Eji/BM4vgfNL4PwSOL8Ezu/6y21zGC6Xz6mO+AXMr1j++sttH+FHMD+B+QTmM5ifwXwB88H5ZXB+GXuZUVp/ue0j/AjmJzCfwHwG8zOYL2C+gvkFzAfnV8D5FXB+BZxfAedXwPkVcH4FnF8B51fA+QVf5psUnF8F51fB+dXT/hFkjh/gOPplUE/7h40zfxwczOOZUUsyxZLMaf+osPVrutD0FuovPB/x683H3Ie609u9//D5mPkEeHoTuY35mP+4eHoTuRHz2c+WSzZsPvsJZxG35urWvLg1P/Frk7lrT1ANlmSiJZlkSYYsybAlmWxJRizJqCWZYknG0ArMwdAKzMHQCszB0ArMwdAKzMHQCszB0ArMwcwK/KO59ffl0/byanf73NS0d77eX79sH+7fb77889jfc/W03e22dxePTw/XtzevT7cXu4fr9r5NeP/yjZsfxVSbB9nto28/M+bI7c3Y3Zubm9r81OYn/ws=", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index a4cef60dc3a..bfd5e008cd8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -52,18 +52,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/9VY227cOAyVL5NkZpLddvsjkmXd3grsrS/7Cfsgy9buHyywQIH5ib72WyujVofhcNyksR5CIJHHlMnDI1KWWbGv0qa/ClzPsmOXkue8X0b+MhEb2uIlcVavBGf9SnA2rwRnWwjno+KaQc8LN5PSsuuSg/u8jPtlrIF+Q2LFHvnd0r7lvdsT8W2IX+4Xmzdl7Kts/7aMfZ7t/nY624exZH2zjB9OZy4/gGdmeViuq/OUb3azrga635GuAbo/kA7m7J9IB/M8Y7pLf2/Z+frdcr1HGEvkG4xz6/V6R+CvQWyz/Ho68/FEv+J7fo8LjwPi8a5MnC6vLa7fWbLuAHxDPrA06DfEPY//Art4HvYJa+OAdLBGj8v1HsWxMU8ec8EIzEfgG+YlFoqnjPu5PFUEF1kHc+Ye6WrCbmEOFZU7DboH/R9Y0RoXFbvM/YZd8lMj7g4E1jeEDuYwzp2GuFev2Lrd0Fa1oa2cY3i/n+X9MnIrJ+OEGK1U3Bnduci5NkqKGIQKPo7GeeuGaQqDdI7LqJ0yXdBSx94rj9/90LbwJqopej+aKJOxTnknbJQ8BDsaKWUMwQ8mqYPjUfTjZMUQgupsdE6qkXrvP8L+QsH79yPbqvfeam9kGKyXverUpIZhGvXUy8EL4exkNY8qSqd4p200Yoy9cmIYp553uF6h7Y67McQhdumfMtFFzfvEZj8a4YOOPlrTJfcxmJ6bwPtp0J3wurMm+CA6Te13eJ+A+92GdWmeuk9k/wd2mZcl9okjwnOtTjJ39wTWN4QO1+M94eee8EPZutnQ1u2Gtu42tLUvEOPP7HIt8toW/vbgFcLSgjjweuZ48Prk61l26N5fyzivwf/IHq4xfO8p75HC54YBn6+gULWGz4sPQPeSc9lHYBfPw3hgHuGzF1y3B6SDdfIT8pGx7wgfDdLluX8vY+E14r8Au4xdvpcg3h3BQ3slNo/wl/reo/BnX0cQS3va3r+xX/eAWZrTmQecj9D/Ds3/Z/kN6zOPL2l8ReNFlD6mY9g49sFjnhjiifp2bdn2nCVRVF8iC/UdWRHYs1C1n3HPMX0CdvE87BPm6A3SwXPM7RV/+fncX4DP5d9UzxHbwb+pfWOHdHnuf8tY+t1H1R3mjKpJiuvM0ZyHW9dBOqTb0PXBDEp6qZ9VB1TfDb87C9VIT+V8c4Ubxs5n6aYMnm9n6RbhuXbuyPzsyuDR2e8NgadewVOoT9xnPHcEnobA83bBjnMI8kX1maGPBsVWlYltde1hvmX/+UxO7W2FsXYVu9xnn4KVWoPCWOVaDq9hpXLkuXtui3QNET/eD9ew5ecadn1/Z8S9agX3Wm9KSJl68qkrEscolXHdIFLbKXVKotG2H2PqkYxmEr2XnZtM6iDZaUqdq2B0TA0WHTEP9UpsP8rtzN8XEVV1Dt0fAAA=", - "debug_symbols": "1ZvtiuIwFIbvpb/7I8k5OUnmVpZl8KMOBVHxY2ER730bta6jwd0GKm/+DNPhPOnDaN9XITlW82Z6+PpsV4v1rvr4cayW69lk365X3dXxVFfTbbtctl+f93+uVPxh1Hl+t5ms4uVuP9nuqw9tdV01q3n3mw8dv2iXTfVh1al+HtVM/az27jasQ2rYkuqHrf02/LOujAZyMUAuBOTCQC4WyEWAXByQiwdyCTguBJS7BJS7BJS7BJS7BJS7BJS79Obc1f7mYp5cHJCLB3IJOC6sgFw0kIsBciEgFwZysUAuQLnLQLnLQLnLb85dL/2wWHo9TErcdZi0kQdxq0oV16WKm1LFqVRxLlXclioupYq7UsV9qeKlNqeU2pxSanNKqc0ppTanlNqcUmpzSqnNKaU2p5TanFJqc7pSm9OhNGd0QSnD6ILSb9EFpbKiC0oLRReUYokuKF0RXVDiP7q8N9HFhptLsA8uXgG5aCAXA+RCQC4M5GKBXATIxQG5eCCXZO4aZa+IYXXv0hFBDSb0YMIMJpJ5YGz/kdYE80jwYMIOJmQooVXyJiTcvztIPL9+xb0y11l//zneXdaXkdd3I6/vR14/jLu+ViOvr0de34y8fvJBJid94pFX+iHEujxMQ7cHLQmlnzTH4RUkOZDLgXwGlN4gzDbwFWK5i04tF8jlQD4HChlQehPrvyCdA5kciHIgzoFsDvQf7wh6glwO5HOgkAGxyoF0DmRyIMqBOANKb2ER7plv37Mv+ZrePPIaSf4TxPeJL94/IZRG+j22Tj3fhYchp+7q12TbTqbL5noAaXFYze7OI+1/b5qHo0mb7XrWzA/bJh5S+ns+6VzKwdda0Tl6uyttTK0Nd7fpbvUH", + "bytecode": "H4sIAAAAAAAA/9VYzXLjNgymJDuJ7aTd7b4IKf7fdqZ/+wI9tJeWosRrZ/oEPvfaFy41FWsEhtWkEQ/BTELJoIAPnwCIZMP+kV3+a8D1LHt2LWXO52XkbxOxoS1eE2fzTnC27wRn905w7irhfFZcM+j5xc2k7NhtKcH9tYyHZWyBfkNixQH53dK+48ofiPg2xC8Pi827OvZ1sX9fxz4vdr87X+zDWIq+W8Yv5wuXX8Azszwt181lyr92i64Fuu+RrgO6H5AO5uyPSAfzvGB6yH8f2eX603J9QBhr5BuMc+v39YnA34LYZvn2fOHjhX7Ff/k9LTz+gnh8qBOnL+8W1+8sRXcEviEfWDp0D3HP42/ALp6HfcLaOCIdrNHTcn1AcWzMU8BcMALzCfiGeYmF4qngfi1PDcFF0cGceUS6lrBbmUNN5U6HfoP+j6xqjYuGXed+x675aRF3RwLrB0IHcxjnTkf81q7Yut/QVrOhrZJjuN/P8nkZuZOT9UKMTmrurel94txYLUWKQseQRuuD88M0xUF6z2UyXts+GmmSCjrgbz+0LYJNekohjDbJbKzXwQuXJI/RjVZKmWIMg83q6HkSapycGGLUvUveSz1S3/1n2N8ouH8/s61VCM4EK+PgglS615Mehmk0k5JDEMK7yRmedJJe8964ZMWYlPZiGCfFe1yv0HbP/RjTkPr8T9vkk+Eqs6lGK0I0KSRn++w+Rau4jVxNg+lFML2zMUTRG6rf4T4B+92GdWlf2ieK/yO7zssafeKE8Nyqk8LdI4H1A6HD9fhI+Hkk/FC27ja0db+hrYcNbR0qxFh5nTXgNQIUKl/wmucJ6F67toBrsD+AXTwP44F5idcPMM+ekA7mzVfIR8G+J3x0SFfm/rSMld8R/wbYZey6b0O8e4KH3Y3Yfkb4a+1ZKPzF14ld6mZ33t6/dZwXv935wgPOR+h/j+b/utzDPl7GtxzeJBtEkiHlpcQ4qhgwTwzxRO2/dmx7zrJoam9dhKo16ttYhKr9gnuO6U9gF8/DPmGO3iEd/Bbf3/BXni97ZPhcuafOzbAdfE/1jT3Slbm/L2PlsyOy7jBnVE1SXBeOcB5SZzd4PVYpRxWVc9R6rPg/sus8qbEe2yE8DaNruvCzr4PHFL93BJ52BU+ls0ZV8DwQeDoCz8cFO84hyBd1Vgl9dCi2pk5sq+8e5lvx/zW73VsqY+0bdt3nXoKVegeVscq1HF7DSuXIa3veDuk6In7cD9ewlec6dru/MuK3ZgX32vmGkDKf6+addRqT1Nb3g8hHF3m3naxxakx5nz3aSaggez/ZfArhpimffkRrUt6km4R5aFdi+7/czvz9DUxqFlQhHgAA", + "debug_symbols": "1ZvRquIwEIbfpddeJJlkMvFVluVQtR4KpUrVhUV8962e1u1pg7sNVGZuxMp804/a/kMhuWa7YnP5/Cjr/eGUrX9cs+qwzc/loW6PrrdVtmnKqio/P4Y/Z+r+YdSj/nTM6/vh6Zw352ytnV5lRb1rv1Fo+X1ZFdnaqdtqWqot9LWa/LNYh1ixA9UXO/et+OcqM5qRi2HkAoxcLCMXx8gFGbl4Ri7EyCXwcQFGuQuMchcY5S4wyl1glLvAKHfhzbmr6eliJi6ekQsxcgl8XKxi5KIZuRhGLsDIxTJycYxcGOWuZZS7llHu2jfnLmFfjA5eF4NC3xWDNjgSd0qquJYqbqSKg1RxK1XcSRVHqeJeqjhJFZc6OVHq5ESpkxOlTk6UOjlR6uREqZMTpU5OlDo5UerkRKmT00udnP69kxNdeIoHN3YxjFyAkYtl5OIYuSAjF8/IhRi5BD4upBi5RHPXKNchxqqhy50wswmYTdjZRDQPjOtHjglmTOBsws8maC4RoucAtP3NAUj29R9OynS1NByz/tGelm0fFm2vlVq4v164v1m4Pyzc3y7cP/oUg8c+7oCUHiWYVhiHnk9ZFIo/Z96GVxClQCEB0ioFil4964LtIIuD3NT4BWEK5FMgSoFCAhRfDvwvSKdAJgWCFMimQP9xR8AEwhTIp0CUAoUECFQKpFMgkwJBChS9EGh75tsb+Ve+xtcNvUaiFwGpT3wkmiAmjvQL4LyangXmIbf26FfelPmmKrrdAftLvR1sFjj/PhajfQPH5rAtdpemuO8g+Lt54JG1Qa2Ca9u2rf8A", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_0.snap index 20170342c2d..26d5a120af9 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_0.snap @@ -52,18 +52,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/9VZzZLjJhDGP7Itz3jGm30RIUCI21blb+95AoRE5ZA8QS56g1ySqhxSueSWquQZI82qR+0W1riyIrtDlQeJbr7+aJoGMSv2oWy73wo99yVh0wI674Y6+7jCF8TKYvJcvRKe61fCc/NKeG4j8bxYXD3pfuJ6p2zZ9QKD+2eo06FeI/mCjuUpsbskfplJkwbGtyB/kQ6Yuzj4CvD3cfAzwP2qHfHxWEC+Ger37ejL96hPX07D82pUecYF2RrJviayDZJ9Q2Q4Zr8lMhznwOnQ/d6w8fnt8JwSjjHiDY9z6fl6G+C/RmPry5ft6I8b7fKX7N4NfvyZXfp+P5p65gQ+OMTxgVgRe4yNsYNlYP/Ioq4hviL2gA/1z5r4Lg1wPQdkK/KcBuykATshLBwrdK2+W8YfWWit/0+xof5rbMTa3+ZiA/vnc4iNzx0rtL+srtRgh7ZRO9fyaMSYyCKvgTxlU/8CNheiy/W15r72QmmTV7wQReGl10Upa6+krXXDpRW5aXTmedk0WgmnC29qV3jAPsbhzmGOd4F56dskaseyhI1xhfsekBzr/4gwNQvPO/ZbVopGG87rUqjM6CI3PsuKzjPcO66c9bU2tjRV07hKGJMJXxilc9c510urLGAnoTmx2qvG287zXnRgubKGl15kzpW1FkJ452ylO7Ez3YzIuil55ZzKS2+MUHXoDMrY8vG6D/mlCxhbFlYLV5VWSJWrRlVVUxeNFJXl3JRNWWReeWFUlhel17z2Uhle1Y2cj9U860LOVz7v/ijtjS8y2XlTdtFru1C0vtR5Z947LTPtMtlURc5tkZfaWcfzAmLpDmHTfegetS8Yx/rWfQjsHwnXWPvQPeFD/UP3oVOA6zkgw7kSy7CdU8BOCCtZEGu3INZ+Qaw0whgf2XQuYG5p/ll6T1sRLls0DmxzjcZD5weeGRvzNbR9N9R9Pv8V9aH5eu5sdWbTNbae8d0t547I3//y1jwC9o+Ea6w8siN8ruWRyPcXxdz5cj3DJ1Lel3PrOXQOfTP4ksYQ9hfOFZj3CeEzZGM3Yxuf3UIxT/Pl/gWsA8EKjYGRfknA7obIQPf7oY59D/YFwr2VPx7r9gr/Hwj/WN8UIf5gq1+Xc/kNnvH6nbu/uOUsEdqX8D5wT/rhuE7Icwgb22YBDIpDz4AnNCbaN72CC+OH+zW6zvv3B/J+jTN+TwJ8H4gMdH8aaoinR9QndjxhW5gv/F+BrgnIDc95qh1l9M5y20YZh+o5/IZ40HlI2ssx4fnbBPTpGngM6D8gHfDRmU19eEewQucYHBNHNI4nnXaUAcdP4U/8TUv9eTczJsam/gz5P3ReO7Opr09EhmOXflOEfI1jF/uaykL3ETH9rssP5+snrgM+5EVatkiO9X8Z3vG9DdQf8w9Iry33wvruiqOupbM0bzB2uQ8tbb+7eChdLp2ulLCieNE+rL9dO8rxOurLfniHbxiqj++csP7voNv9/hieISaTgL1e7+8ZvdWV+gkj0LZtL9vSdqq/aaf6YPvYTjmC7A7J8Brvy/3wjv2FsYBHQvT/Gt5hTg6oD/Q/B+wfiP0L3oE2nGMo1ibQhtf3n4A31HjsS39XPdkk+LiNcoPY6eP6X3meSZ1lIwAA", - "debug_symbols": "7ZvLiuMwEEX/xWsvJFXp1b8yDE0eTmMISchjYAj595E8UeKOQxpvzC26NyEKt+zjQrnXMta5Wjbz08d7u1ltD9Xbr3O13i5mx3a7SaPzpa7m+3a9bj/e+z9XKn+Y2OkPu9kmDw/H2f5YvWmr66rZLNO3EFP9ql031ZtVl3oo1UxFq4O/iXV8Jqbgi5hC6It/1xUpIBYNxGKAWAiIhYFYLBCLA2LxQCwBiAXIdxnIdxnIdxnIdxnIdxnIdxnId+2084W1KWLW9MgybV9scEXsLL0Wk3KliaSNewR3UsG9VPAgFTwKBXdKKriWCm6kgpNUcJYKLjU5ndTkdFKT00lNTic1Ob3U5PRSk9NLTU4vNTm91OT0UpPTS01Oj5KcmQUlDDMLSr4lloASWZkFJYUyC0qwZBaUrMgsKPafWVAcPbNMa9LOxhtLtK/FbCNfxexY3cWuA/dSwYNU8CgUPCqp4FoquJEKTlLBWSq4lQouJTnpEVxKcg7ApSTnAFxKcj6Ca/U0Oo2y1xrT+1sk8q5Ejy8x40tofMlTizS2PAkw0QxK7PgSN77Ejy+Zdka9fClC64nX4hyK2Fo3gNFIMAYJZuLlOKk7zBdiclwoyAV+LQ6qTMbQf3Tnn0gdF3P7tPL1//vBP/341A/7/foRymFd/72zaz/cN+xHYfBqOD88bj+8K0emoPTA+QIw+S3mn5JHYHKOL8iNEkuuxZIbseQT35vo+42S8QMYRoKxSDAOCcYjwQQkmAgEM/H+wy9gNBKMQYJBcmBCcmBCcmBCcmBCcmBCcmBCcmCGceBLGv2Z7dvZfN1cN9GvTptFb0/98e+uedhev9tvF83ytG/yRvv7Hvt8UekEtfaUL7IbJkzNoVs4dcNYJ5p01nTmfw==", + "bytecode": "H4sIAAAAAAAA/9VZS5LbNhCFPhyJ+syM44sABEEQO1fl52ME/OACuQB32SSLVDbZpSq5aMgJ22y1WrQqJmwPqjQg0c3XDw+NDzkr8V/Z9r8Vuh5KIq4L+Lwba/lpRS2IJWPyXL0SnutXwnPzSnhuI/G8mFwD6WHgBlG24naBzv0z1ulYr5F9QWFVSuIuiV/K3KVM/xbkr9MR8yEOvgH8XRx8CbjfdRM+7gvYN2P9vpu0fI+eGcp5vF5NLh9wwbZGtu+JbYNsPxAbztkfiQ3nOXDa9783Yrp+O16nhGOMfMP9XHq83jL816hvQ/m2m/S4M676WNzjqOMv4lL73RTqAyfQYB9HA70i8YSYcgfbIP5BRJ1DakXiAR+qz5polzJcnxnbilynTJyUicNh4Vyhc/XdMnpIbq5/ptww/zc3Yu1vc7mB9fkacuNrx+L2l9WNGuLQNhrn1joaMSdk5DmQpeJaX8BWWvdrfWNVaII21mWVKnRRhDzYosybYHLf2FblXmeutTKosm2t0bUtgmvqIgD2IQ53BWP8wIzL0JajdmxLxJRX+Nk9smP/FmFawY871k2WurVOqabURjpbZC5IWfTKqFArU/vQWOdLV7VtXWnnpA6FMzare3FD7o0H7IQbE2+DaYPvlQ+6B8uMd6oMWtZ12VitdahrX9neXLt+RPKmLVVV1yYrg3PaNNwZVIjl83XH6dInjC8Lb3VdlV7nJjOtqaq2KdpcV14pV7ZlIYMJ2hmZFWWwqgm5capq2nw+VzPZp1yoQtb/MTa4UMi8VzPvs9f3qehDabM+fKhtLm0t87YqMuWLrLS1r1VWQC4dETbdh06ofcE8tvfuQxD/QLjG2odOhA/Vh+5DZ4brM2PDayW24ThnJg6HlSyI9bAg1m5BrDRCH58EPxZCzO+ddG1aOPfye+cCxD+I6705xlxICJ9bcyHyO34BfHYMn/UMnzTieN1aK7iz1JtRG5pD3HcEyvuE8AWKkczExucPLufp+vHwEaw9weL6IMhzieDPiNgGvj+NdeQ8kt8g3Hv5475ub/BvCP9Y52KOP8Qa5uXc+gbXeP7OvYPfsx9yayvW60Sew2eJhFxz2Di2YDAoDj3HnFGf6LPpDVzoP3wjwjhw/0jub3HG91w+PRIb+P481pBPT+iZ2PmEY2G+8G2czk9YG0CjTTfZ6He3bRelH2bg8BviQcch6S77hMdvw/jTOfDE+D8iH9DoWVxreCRYawYL58QB9ePFp5tswPFL6In3G6rncaZPQlzryemPdaJnOaz1mdhw7tJ9jdMa5y7Wmtq4d+qYuttSSugLjDmsi7RskR37/zre428PUH/KP9GC9SpoH/rX9KbJa0/XDSGu96EX7brJjvN4KLvxfov6iP3xdwvs/zv49r8/xmvIiYSJN/j9PeO3ulG/YDBt2+6yLe2u/TfdtT/EPnTXHMF2RDY8x4ZyGu+xXhgLeCTE/6/xHsZkj56B55+Z+HsS/4I304bnOMXaMG14fv0JeGON+770e81LTIKP2yg3yJ0hr/8FLuRa+6khAAA=", + "debug_symbols": "7ZvfrqIwEMbfhWsu2s50pvVVNpsT/+AJiUGDusnG+O4LrlUOEDbckJmcvTHWfAO/jPX7KNJbtis218+Pstofz9nqxy07HLfrS3msmtHtnmebujwcys+P7seZaV9cfOjPp3XVDs+XdX3JVtbbPCuqXfMuxKZ+Xx6KbOXNPR9KLULS2sAvsY1jYgicxBBCV/wzz8AIYrGCWJwgFhDEgoJYvCAWEsTCgliCIBZBvouCfBcF+S4K8l0U5LsoyHdRkO/6ZecLWpfEaKHPsmxffKAkJg/TYjCUmgjWUR+ctIKzVvCgFTwqBSejFdxqBXdawUErOGoF15qcpDU5SWtyktbkJK3JyVqTk7UmJ2tNTtaanKw1OVlrcrLW5GQpydmyLBuG5OOLJfppMfqITzESmreYHuBRKXgwWsGtVnCnFRy0gqNWcK8VnLSCs1ZwLckJfXAtydkHj1qScwCuJTkH4KPJ6Yx/lrjOr6IBbytgdgXOrvCzK0bd0fl0ke6i61fw7IowuyLOrbBm2Zk0+WelNQvfZMCQxN7TAAYkwaAkmIUX+GDeMP8QA2GiAAo4LQ4mTcbQXVLziJQwmdqXFS//7Qf978eXfvD360dIh6Xu8yDPfoRv2I/EwGY4P6LcfjClI0Mwtu981ggmf8X8KLkVTI5xitypJQe15KiWfOFrE/u+UHI8gCFJMCwJJkiCiYJgnJEEYyXBOEkwIAkGJcFIcmAnyYGdJAd2khzYSXJgkOTAIMmBQYwD35vRr3VdrjeH4rm5dX+ttp29rpffp6K37fVUH7fF7loX7QbY997X9utu7kbmltxjddoOwecWTXOa5lR/AA==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 20170342c2d..26d5a120af9 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/pedersen_commitment/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -52,18 +52,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/9VZzZLjJhDGP7Itz3jGm30RIUCI21blb+95AoRE5ZA8QS56g1ySqhxSueSWquQZI82qR+0W1riyIrtDlQeJbr7+aJoGMSv2oWy73wo99yVh0wI674Y6+7jCF8TKYvJcvRKe61fCc/NKeG4j8bxYXD3pfuJ6p2zZ9QKD+2eo06FeI/mCjuUpsbskfplJkwbGtyB/kQ6Yuzj4CvD3cfAzwP2qHfHxWEC+Ger37ejL96hPX07D82pUecYF2RrJviayDZJ9Q2Q4Zr8lMhznwOnQ/d6w8fnt8JwSjjHiDY9z6fl6G+C/RmPry5ft6I8b7fKX7N4NfvyZXfp+P5p65gQ+OMTxgVgRe4yNsYNlYP/Ioq4hviL2gA/1z5r4Lg1wPQdkK/KcBuykATshLBwrdK2+W8YfWWit/0+xof5rbMTa3+ZiA/vnc4iNzx0rtL+srtRgh7ZRO9fyaMSYyCKvgTxlU/8CNheiy/W15r72QmmTV7wQReGl10Upa6+krXXDpRW5aXTmedk0WgmnC29qV3jAPsbhzmGOd4F56dskaseyhI1xhfsekBzr/4gwNQvPO/ZbVopGG87rUqjM6CI3PsuKzjPcO66c9bU2tjRV07hKGJMJXxilc9c510urLGAnoTmx2qvG287zXnRgubKGl15kzpW1FkJ452ylO7Ez3YzIuil55ZzKS2+MUHXoDMrY8vG6D/mlCxhbFlYLV5VWSJWrRlVVUxeNFJXl3JRNWWReeWFUlhel17z2Uhle1Y2cj9U860LOVz7v/ijtjS8y2XlTdtFru1C0vtR5Z947LTPtMtlURc5tkZfaWcfzAmLpDmHTfegetS8Yx/rWfQjsHwnXWPvQPeFD/UP3oVOA6zkgw7kSy7CdU8BOCCtZEGu3INZ+Qaw0whgf2XQuYG5p/ll6T1sRLls0DmxzjcZD5weeGRvzNbR9N9R9Pv8V9aH5eu5sdWbTNbae8d0t547I3//y1jwC9o+Ea6w8siN8ruWRyPcXxdz5cj3DJ1Lel3PrOXQOfTP4ksYQ9hfOFZj3CeEzZGM3Yxuf3UIxT/Pl/gWsA8EKjYGRfknA7obIQPf7oY59D/YFwr2VPx7r9gr/Hwj/WN8UIf5gq1+Xc/kNnvH6nbu/uOUsEdqX8D5wT/rhuE7Icwgb22YBDIpDz4AnNCbaN72CC+OH+zW6zvv3B/J+jTN+TwJ8H4gMdH8aaoinR9QndjxhW5gv/F+BrgnIDc95qh1l9M5y20YZh+o5/IZ40HlI2ssx4fnbBPTpGngM6D8gHfDRmU19eEewQucYHBNHNI4nnXaUAcdP4U/8TUv9eTczJsam/gz5P3ReO7Opr09EhmOXflOEfI1jF/uaykL3ETH9rssP5+snrgM+5EVatkiO9X8Z3vG9DdQf8w9Iry33wvruiqOupbM0bzB2uQ8tbb+7eChdLp2ulLCieNE+rL9dO8rxOurLfniHbxiqj++csP7voNv9/hieISaTgL1e7+8ZvdWV+gkj0LZtL9vSdqq/aaf6YPvYTjmC7A7J8Brvy/3wjv2FsYBHQvT/Gt5hTg6oD/Q/B+wfiP0L3oE2nGMo1ibQhtf3n4A31HjsS39XPdkk+LiNcoPY6eP6X3meSZ1lIwAA", - "debug_symbols": "7ZvLiuMwEEX/xWsvJFXp1b8yDE0eTmMISchjYAj595E8UeKOQxpvzC26NyEKt+zjQrnXMta5Wjbz08d7u1ltD9Xbr3O13i5mx3a7SaPzpa7m+3a9bj/e+z9XKn+Y2OkPu9kmDw/H2f5YvWmr66rZLNO3EFP9ql031ZtVl3oo1UxFq4O/iXV8Jqbgi5hC6It/1xUpIBYNxGKAWAiIhYFYLBCLA2LxQCwBiAXIdxnIdxnIdxnIdxnIdxnIdxnId+2084W1KWLW9MgybV9scEXsLL0Wk3KliaSNewR3UsG9VPAgFTwKBXdKKriWCm6kgpNUcJYKLjU5ndTkdFKT00lNTic1Ob3U5PRSk9NLTU4vNTm91OT0UpPTS01Oj5KcmQUlDDMLSr4lloASWZkFJYUyC0qwZBaUrMgsKPafWVAcPbNMa9LOxhtLtK/FbCNfxexY3cWuA/dSwYNU8CgUPCqp4FoquJEKTlLBWSq4lQouJTnpEVxKcg7ApSTnAFxKcj6Ca/U0Oo2y1xrT+1sk8q5Ejy8x40tofMlTizS2PAkw0QxK7PgSN77Ejy+Zdka9fClC64nX4hyK2Fo3gNFIMAYJZuLlOKk7zBdiclwoyAV+LQ6qTMbQf3Tnn0gdF3P7tPL1//vBP/341A/7/foRymFd/72zaz/cN+xHYfBqOD88bj+8K0emoPTA+QIw+S3mn5JHYHKOL8iNEkuuxZIbseQT35vo+42S8QMYRoKxSDAOCcYjwQQkmAgEM/H+wy9gNBKMQYJBcmBCcmBCcmBCcmBCcmBCcmBCcmCGceBLGv2Z7dvZfN1cN9GvTptFb0/98e+uedhev9tvF83ytG/yRvv7Hvt8UekEtfaUL7IbJkzNoVs4dcNYJ5p01nTmfw==", + "bytecode": "H4sIAAAAAAAA/9VZS5LbNhCFPhyJ+syM44sABEEQO1fl52ME/OACuQB32SSLVDbZpSq5aMgJ22y1WrQqJmwPqjQg0c3XDw+NDzkr8V/Z9r8Vuh5KIq4L+Lwba/lpRS2IJWPyXL0SnutXwnPzSnhuI/G8mFwD6WHgBlG24naBzv0z1ulYr5F9QWFVSuIuiV/K3KVM/xbkr9MR8yEOvgH8XRx8CbjfdRM+7gvYN2P9vpu0fI+eGcp5vF5NLh9wwbZGtu+JbYNsPxAbztkfiQ3nOXDa9783Yrp+O16nhGOMfMP9XHq83jL816hvQ/m2m/S4M676WNzjqOMv4lL73RTqAyfQYB9HA70i8YSYcgfbIP5BRJ1DakXiAR+qz5polzJcnxnbilynTJyUicNh4Vyhc/XdMnpIbq5/ptww/zc3Yu1vc7mB9fkacuNrx+L2l9WNGuLQNhrn1joaMSdk5DmQpeJaX8BWWvdrfWNVaII21mWVKnRRhDzYosybYHLf2FblXmeutTKosm2t0bUtgmvqIgD2IQ53BWP8wIzL0JajdmxLxJRX+Nk9smP/FmFawY871k2WurVOqabURjpbZC5IWfTKqFArU/vQWOdLV7VtXWnnpA6FMzare3FD7o0H7IQbE2+DaYPvlQ+6B8uMd6oMWtZ12VitdahrX9neXLt+RPKmLVVV1yYrg3PaNNwZVIjl83XH6dInjC8Lb3VdlV7nJjOtqaq2KdpcV14pV7ZlIYMJ2hmZFWWwqgm5capq2nw+VzPZp1yoQtb/MTa4UMi8VzPvs9f3qehDabM+fKhtLm0t87YqMuWLrLS1r1VWQC4dETbdh06ofcE8tvfuQxD/QLjG2odOhA/Vh+5DZ4brM2PDayW24ThnJg6HlSyI9bAg1m5BrDRCH58EPxZCzO+ddG1aOPfye+cCxD+I6705xlxICJ9bcyHyO34BfHYMn/UMnzTieN1aK7iz1JtRG5pD3HcEyvuE8AWKkczExucPLufp+vHwEaw9weL6IMhzieDPiNgGvj+NdeQ8kt8g3Hv5475ub/BvCP9Y52KOP8Qa5uXc+gbXeP7OvYPfsx9yayvW60Sew2eJhFxz2Di2YDAoDj3HnFGf6LPpDVzoP3wjwjhw/0jub3HG91w+PRIb+P481pBPT+iZ2PmEY2G+8G2czk9YG0CjTTfZ6He3bRelH2bg8BviQcch6S77hMdvw/jTOfDE+D8iH9DoWVxreCRYawYL58QB9ePFp5tswPFL6In3G6rncaZPQlzryemPdaJnOaz1mdhw7tJ9jdMa5y7Wmtq4d+qYuttSSugLjDmsi7RskR37/zre428PUH/KP9GC9SpoH/rX9KbJa0/XDSGu96EX7brJjvN4KLvxfov6iP3xdwvs/zv49r8/xmvIiYSJN/j9PeO3ulG/YDBt2+6yLe2u/TfdtT/EPnTXHMF2RDY8x4ZyGu+xXhgLeCTE/6/xHsZkj56B55+Z+HsS/4I304bnOMXaMG14fv0JeGON+770e81LTIKP2yg3yJ0hr/8FLuRa+6khAAA=", + "debug_symbols": "7ZvfrqIwEMbfhWsu2s50pvVVNpsT/+AJiUGDusnG+O4LrlUOEDbckJmcvTHWfAO/jPX7KNJbtis218+Pstofz9nqxy07HLfrS3msmtHtnmebujwcys+P7seZaV9cfOjPp3XVDs+XdX3JVtbbPCuqXfMuxKZ+Xx6KbOXNPR9KLULS2sAvsY1jYgicxBBCV/wzz8AIYrGCWJwgFhDEgoJYvCAWEsTCgliCIBZBvouCfBcF+S4K8l0U5LsoyHdRkO/6ZecLWpfEaKHPsmxffKAkJg/TYjCUmgjWUR+ctIKzVvCgFTwqBSejFdxqBXdawUErOGoF15qcpDU5SWtyktbkJK3JyVqTk7UmJ2tNTtaanKw1OVlrcrLW5GQpydmyLBuG5OOLJfppMfqITzESmreYHuBRKXgwWsGtVnCnFRy0gqNWcK8VnLSCs1ZwLckJfXAtydkHj1qScwCuJTkH4KPJ6Yx/lrjOr6IBbytgdgXOrvCzK0bd0fl0ke6i61fw7IowuyLOrbBm2Zk0+WelNQvfZMCQxN7TAAYkwaAkmIUX+GDeMP8QA2GiAAo4LQ4mTcbQXVLziJQwmdqXFS//7Qf978eXfvD360dIh6Xu8yDPfoRv2I/EwGY4P6LcfjClI0Mwtu981ggmf8X8KLkVTI5xitypJQe15KiWfOFrE/u+UHI8gCFJMCwJJkiCiYJgnJEEYyXBOEkwIAkGJcFIcmAnyYGdJAd2khzYSXJgkOTAIMmBQYwD35vRr3VdrjeH4rm5dX+ttp29rpffp6K37fVUH7fF7loX7QbY997X9utu7kbmltxjddoOwecWTXOa5lR/AA==", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 000f2774466..99c1643ffb0 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -72,8 +72,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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ZNhKpq1k2kqmrWTaSqatZNpKpq1k2kqmrWTaSpatZNlKlq1k2UqWrWTZSpatZNlKlq1k2Uq2rWTbSratZNtKtq1k20q2rWTbSratZNtKwlYStpKwlYStJGwlYSsJW0nYSsJWEraStJWkrSRtJWkrSVtJ2krSVpK2krSVpK2kbCVlKylbSdlKylZStpKylZStpGwlRSuJx8OyZlm3bFg2LVuWbcvCsrTMVtJsJc1WYvYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2H2GmavYfYaZq9h9hpmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9p9ppmr2n2mmavafaaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2WmavZfZaZq9l9lpmr2X2Wmav7WH4+uwadh27gd3EbmG3sQvsEjvcS8O9NNxLw7003EvDvTTcS8O9NNxLw7003EvHvXTcS8e9dNxLx7103EvHvXTcS8e9dNzLwL0M3MvAvQzcy8C9DNzLwL0M3MvAvQzcy8S9TNzLxL1M3MvEvUzcy8S9TNzLxL1M3MvCvSzcy8K9LNzLwr0s3MvCvSzcy8K9LNzLxr1s3MvGvWzcy8a9bNzLxr1s3MvGvWzcS+BeAvcSuJfAvQTuJXAvgXsJ3EvgXgL3kriXxL0k7iVxL4l7SdxL4l4S95K4l8S9FO6lcC+FeyncS+FeCvdSuJfCvRTuBX23oe829N2GvtvQd58PBLBb2G3sArvEDveCvtvQdxv6bkPfbei7DX23oe829N2GvtvQdxv6bkPfbei7DX23oe829N2GvtvQdxv6bkPfbei7DX23oe829N2GvtvQdxv6bkPfbei7DX23oe829N2GvtvQdxv6bkPfbei7DX23oe829N2GvtvQdxv6bkPfbei7DX23oe829N2GvtvQdxv6bkPfbei7DX23oe829N2GvtvQdxv6bkPfbei7DX23oe829N2GvtvQdxv6bkPfbei7DX23oe829N2GvtvQdxv6bkPfbei7DX23oe829N2GvtvQdxv6bkPfbei7DX23oe829N2GvtvQdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX23o+929N2OvtvRdzv6bkff7ei7HX13oO8O9N2BvjvQdwf67kDfHei7A313oO8O9N2BvjvQdwf67kDfHei7A313oO8O9N2BvjvQdwf67kDfHei7A313oO8O9N2BvjvQdwf67kDfHei7A313oO8O9N2BvjvQdwf67kDfHei7A313oO8O9N2BvjvQdwf67kDfHei7A313oO8O9N2BvjvQdwf67kDf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6s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1Ovdmpg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqYOdOtipg5062KmDnTrYqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutSpx0Od+lk2LjuXg8vJ5eJycxlcJpe8ocYbaryhxhtqvKHGG2q8ocYbaryhxhtqvKHOG+q8oc4b6ryhzhvqvKHOG+q8oc4b6ryhwRsavKHBGxq8ocEbGryhwRsavKHBGxq8ockbmryhyRuavKHJG5q8ockbmryhyRuavKHFG1q8ocUbWryhxRtavKHFG1q8ocUbWryhzRvavKHNG9q8oc0b2ryhzRvavKHNG9q8oeANBW8oeEPBGwreUPCGgjcUvKHgDQVvKHlDyRtK3lDyhpI3lLyh5A0lbyh5Q8kbKt5Q8YaKN1S8oeINFW+oeEPFGyreEDt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1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", + "bytecode": "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", + "debug_symbols": "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72X076fX5xsUj8Pp9dxe77Nu2bBsWrYs25alZUXZub3eZ7aSYSsZtpJhKxm2kmErGbaSYSsZtpJpK5m2kmkrmbaSaSuZtpJpK5m2kmkrmbaSZStZtpJlK1m2kmUrWbaSZStZtpJlK1m2km0r2baSbSvZtpJtK9m2km0r2baSbSvZtpK0laStJG0laStJW0naStJWkraStJWkraRsJWUrKVtJ2UrKVlK2krKVlK2kbCVFK9mPh2XNsrCsWzYsm5Yty7ZlaZmtpNlKmq2k2UqaraTZSpqtpNlKmq2k2UqarSRsJWErCVtJ2ErCVhK2krCVhK0kbCVhK+m2ErPXbfa6zV632es2e91mr9vsdZu9brPXbfa6zV632es2e91mr9vsdZu9brPXbfa6zV632es2e91mr9vsdZu9brPXbfa6zV632es2e91mr9vsdZu9brPXbfa6zV632es2e91mr9vsdZu9brPXbfa6zV632es2e91mr9vsdZu9brPXbfa6zV632es2e91mr9vsdZu9brPXbfa6zV632es2e91mr9vsdZu9brPXbfa6zV632es2e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHtNs9c0e02z1zR7TbPXNHsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7LbPXMnsts9cyey2z1zJ7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Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1Ovdmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqZOdOtmpk5062amTnTrZqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5262KmLnbrYqYudutipi5261Kn7Q536WTYug8vO5eBycrm43Fwml7yhxhtqvKHGG2q8ocYbaryhxhtqvKHGG2q8oeANBW8oeEPBGwreUPCGgjcUvKHgDQVvqPOGOm+o84Y6b6jzhjpvqPOGOm+o84Y6b2jwhgZvaPCGBm9o8IYGb2jwhgZvaPCGBm9o8oYmb2jyhiZvaPKGJm9o8oYmb2jyhiZvaPGGFm9o8YYWb2jxhhZvaPGGFm9o8YYWb2jzhjZvaPOGNm9o84Y2b2jzhjZvaPOGNm8oeUPJG0reUPKGkjeUvKHkDSVvKHlDyRsq3lDxhoo3VLyh4g0Vb6h4Q8UbKt4QO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwUwc7dbBTBzt1sFMHO3WwU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVOXOvV4qFM/y8ZlcNm5HFxOLheXm8vkkjfUeEONN9R4Q4031HhDjTfUeEONN9R4Q403FLyh4A0Fbyh4Q8EbCt5Q8IaCNxS8oeANdd5Q5w113lDnDXXeUOcNdd5Q5w113lDnDQ3e0OANDd7Q4A0N3tDgDQ3e0OAN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", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_0.snap index c708e1fbb8a..4253d85b99c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_0.snap @@ -68,8 +68,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+z9BaC1SXKeCVZLaklV3a2ubrFkMXNmfonCFjNLtmRUoizbkpmpzcwwZmZmZmZmZvbY3p2Fmd3Z3ec91eec27ezr1qj77ekHf9SV/11Ib48+UVGvPFGZMTLnnvpz9vxv5e94e9v8+jf+vpbPffGf64/+7o3/Nt84/7YE2WZZ7XGlz2DNT6Ldb7Viet82QM9eFbrfetvAe/+bb4FrPHl3wLW+LbPfcs4Q2/3jNb53Ns+WrSUX8r18jd872po9e+3e+5N/1w/6Ee/9qV/P//g5x/KfN1JG/H8o+eeKT+bcJP/3LNZ//H8G2S+/NnIz1f5b/ts5JurDnz26+/yH36W63Ov63g278mXZ/w53asefbbnHnyW67Pf7hnpyMsePe+5N8h/7tF+Xp//wnPPVKfsyx4977qex/tzPfOvuv7M6+/redmj773N69/0c1y/9/IH37u+37fnfx/04Oce69bLH33vIUD83DfIe/7B3jz33Ok62Z+xTvpvQp0M//+ok2/96Htv8/o3/RzfUJ18uCePdfIhcP2i199lmAfy0hv+/mzt50t+7uE5OdtPvONm/Q+fpT9v9/r7flz37a0ffO2659d38PYPf/7R955/8L23ef0bP+eFN/z32zx4zkNZ13W8/NHPf8wb/vvVb/j32z74nevvv7h5/ts+ev4brXvztcf78vzm55/f/Lz08EPf8PdXPHfHXp/6+ru8M9/pVf6nPVjL2bI//cHaT5R/w3Wf8Wz25ib/M5+N/OMq/7Oejfwg/ZH9+V9evMt/c/b1oQ+47uern3tT33f93Wfsm9x1Tc8/sdaHz7+u9e0ffO/6u4+xxXPP/Xfzsf7/qI99Fj7CfD0+9uEa3+rR3j2/WeuLz73pO/q0199/7s29v+c3z3lx85yHeveNlXXVi8d4Tn9e94Z/mzlLDcW1WmoJNg8TSo4jhri86c5a330pR7e2Ncdf8nB2+HQAE0eecT7WpTeSbZb1PrgjLGd97pIccrKxrG4bv59TM3n4gSuPeawQS1yL55YQZ47++Uef441k8/Pr8DnNXHsp0y5Xqgmsf9VsWjlMTy6zzpZqO2KfOZV15GJmX+lY4fnNXt5l+xGcmX6G1nyU8GJS6C2xF2Yu9ivEMOeo07H2XvNcOfc5q2vGlnSV/cJGths2jJLdKCWktOpxjBpics7buEY6fDtmjKm6VRY/mSf/nfjvadbI1t72+xXbdzlcOHL2vrZqo+1ISLn6oy9zRD+LjcauGI7IJyhx8FHa5E0frnvb4rjKfuVu3ZEP6tLQNrZebY4zHWXGIx498STFDTnxfVdaOsLo/ZhHXcaVEGY09Sr7VTvZeeU2WHXIR2+1+hQa23SU6A8zU++toKPBJu/NWKMk7HwOIbvs2nL99i7fYbcnpY80fD+yGT14VC7bWoexbqZZ57JzHNaPtGJJPCPxQlGdEAZ7dzh3w5ev3sjWmYhzWlcQyfEw0aI1vdY+fTTD+RaTPdZsMzt3eI7XdG3OhI6y/LsOvrjVk+RnXtXEI6Ev4TisWUc381h12mHissmGbFZoeXFoEd/rmGh3n80d5ir7NTvZvCCUu5dxlMYx4gC1uQ7bKrt/HLnZyhEM7Lm1vOk2ffPsUpyc2GKOG/fz2t1+o2rdzjJNLmEgKYwaD+tWrSnPkqw1sR/Hyi7yI6OvaNN03tnDHo6Xe5X9jrv9TqZgdlxJjd9Pva7iijPOhJZs6TYnb00xbEhKvGabfa6JpdQR+e9+syfvtFv34Nc8UhyH3floV3ftcLb4GFLJWJqBERjeJjTd9cxmoVbsC/vEW73xVe+8229/eH9EVCF6dhsZ3qU5QmEfOqcpxmzKaBGzxclKzlfn+Kh9YlL4n7vKfpedbFeX50iuEQafdbE9IXYXuknjGNiP3lqdUZqBZtdqfGu22FVHTcHbm36/626//WrjwEhldhCFwaTm6szAHSRUrHu2dSXehj9QKXcs/qubkjq7xkG46eC77WSHysvLrbWcMVqevXRdpkUP4kVkiege87eOabGsFw2aaGPg47jb2Xn33Z6sNGbC6bABtdbAMWZ1s+lkLFd7PubkJc8cPD/Gy+lu2VFMiBxT1278x3vs9ATjyct0FY/l8tHYkcOGmXGTdbK0Xh2G3K1VZmmOlR4h+5V8wg4FDOhV9nvu1m0xUmhqrBmDas10KfG12qyvmP4wD1xYL5HVWvyjwRD0wDI672DMcFv3t9qtu7ooN5VMOrBZbZjeQsD8Y1IT+3Hw3FKM54N0TvAMB7aQL7JTa+V5OzvvtXuX/BD/Z2032IqIkoMUMBQWG1qKxyVMPN7MHefJ+YyFo4RSWql9De2m3++92xMcfMKmHHiEaWrmhIQCOsAZp4WH8RxbvP0o7BBP1Wm19ei4POd9DzfZ77PbE+sLrw8XWMrCCB2c9xXSiDgKXhv7wVvzqwzHD2FNgD4eiGQKRoAdu3G377tddzec9OVxXmtGjuYA6KQ+j4NXgEJwXmPrHf3A9lpM4ay4E17MDCbVm798v91+rwSoYiex1DhudvzgXfEfzqyekll+oYwcqxFA493GmjpHHrcBYMFlXGW//27dYeFsiy0Ya4fNT5iPjGuwAT0YeKXGeT8q1j0Lus1ml+G/+BATxQ/xKvsDdus2oL7DZplkIKfBD8baB4a2BcdLOLBYIL+e5wB2xsRxLJhKlwGnoI+b7A/cycZwhmiSiWmAFA5ZoePAyV0QGQe9ddNz4E0Choqd3fbeOcfsNaAj3WR/0E5PgDHLYES1ObMeAzviA3YpAytQ/shBbwCMVn1dAcl+5MJ7sIIRR2pX2R+8W3ewI4VUe88cNwBTHrkCAJMzBx46Fsx5GNOHWCcnFMwbcuO9HO0oR+s3HfyQ7buMfQhmdnQLKOXxyhU9MAa0PRyoG/0nAMB9ghOLqakMe9SjRudxELcz/6G7PQn8ZKsL/13CrAArjqgVmOWMC4KmKMt04EEGP+HRmoxOxmnLkXq8+Z0P2+2JFg1cSxgtwz5HHmJc0E5PzIg55KAxudPX7n0+iFcs/pP/4Csx3HzDh+9k5wUmwUElrB8hidzmsuAJHEUkAsHcoTFujIQlXGEa73GdwRD8LADTbU8+YrffMbZwtIg/IMbAz8QYrOtSN18xirj+1gyoJfIY3BtwihfJycUeg6lvGOIjd7KHftJ3jk3yB6v1gI6Bh4iYOeMw7rzfAdbMPWML64ERwGkDXLxih5vf+aidbCIkQyigHfaldR3wgWxb2BLTwmoc+sirwH+MldAfJ1My2a/QY7nhwY/e7bd+biiqabMcMQ7sYQcfZ1Qbg4jf7Z7n4xw55qAeqaY+46r42XDX74/ZvkuA96yAv0ncBN5EgQk3ZyB2FEi2subRxw6yaoevuGa+CE6JwFs+3VW22e2J9wTFnHeQFEEqYg5sOIAPI8ZnBlzivxpWC6hpQUmYWGIAvpetXs7tzNuNbIOpwljadhyBVzP5C+AHbcGujugdcU8ktuE0xditqaCWwb5jPNeYMd/st9vJrgQdvBO8t5tuxQTA5JijY1E2FaRDRI7mEI/jaUClWT8AtK1E63yKq+xjJ7uxWueTa4X4NCwEdSJsC4LH/06gCHjW6ZDitY/hsTQDe4M3Az7zsq6y/e5dRp2/4nRucAKH7c7wsgBvCxdMjF+Xa84GTIrg7ML6AL0wQnP0ccSb7LB7l0vQGqqAaNXKZYEPHH5xiIuYzbQVicebzDX4j/gQxcMOBxBB6CPecGzcrRtCRCfMcmAK7ylFExuoMPuA0wHp2I5mNmKGFQyRGnYqRYgECBBn+b+r7LTbb7/60VaKAB1CRw5fSrh6IiXCYNnqLG8almLVQrRsiAjhZvhoRBkcgqvsvJPNby+Zq4U2B84IKhaTQb9B8gSFihhwF1GrjPjext5EzqfnfCr6usouO9nyhIAHYETWiyKQ4SjiLPDRQDIOIErBo/pgXwKImtUORCvqB/TebOzH7mQTbeABHUaIwB5HYoyiY2M5PUT0hJY40jgUN4NYLFZnDEMcpNCcJ95s7Mft3mXnfaMJcbQiEBWhGSBf2N0KdnCZF1udxwUNb5qFU+owIIV3DmdBkHjTwY/fycbwNGEH3pnTx8U3cJQNIQpghI3AQQQsNxAQ/4AZ4+zosOepEDfcdPATtu+yhGPizx3/IxQzQUClEuUTZBdwLAQZTBZxAyCzePRnNG9CJSLld+568okb2bg9yAU+KcwJAb2CEz787GJ7gvFAcyg7g89jd40HQkQoCswaYAnyY978/Cft1k2YlwWIeVU+KsqBI3G1ZA+86TA0LgKTMVhQBV3BcysRRI6nnp6jcdPB1+32G7DTHccQ57PkMInCoE2C0+fHn00IMD5Jblj1BHpr8Ck67Xgp4Mbdxn7ydr/ZbGgYXDnhQMZ1Q/WEJS4MzecE4pQ46ZhcgIZzsrW4PGI1zhjH6qaDn7JbN44eCAWFAZFhiYwvb4yvYM/rUGSbYTOd/F1kqwe7Q9RcI5sGYjY3HfzU3bvE0QY4AIWRvg64tcqGWtQXZg37u0Yd7DvhfiNO4F0f4tu6b2glxuIWX37aTjarBhAPAkhxSoFzPRCDR+bEdiAzmwY5g8UdsmJEmpV4jYPGi+Ls3mR/+m5PRpipYhkKUBjThqdCPucFbe+BcKGzHQT7gO6ZllTTENYSWJkBm3U/O5+xe5cEciNDE7A2YhhBv4J9RsHBsBm71wFBVZwvW2QD4KURLjTi52SJrW5+/jN364adzM5kB+tCKAmlxp4Ti3SAj9iGVQtAsfIGgLuEsGAh8Q+c3QxnZW7r/qzdulEyK3DXlrw6ceWEX1R4FZtQHExbJEbhvwAD6QBZOLgERfoFDb3j78/evUsc+oFOJ5FsRyIicwSAB68B/JRGG11hM7sEUztEm/IKshAiug2DcNPvz9nKxiyD0HwzeF6Ibd7h4Hzi3qR0qBpsD+rO8YYCAloEU7AuEUDaUdgb//25u/2eCn6lD9Bh4KniRgceBGJB36sQLswUaGheSHfIQmwNp3Mc2j3wxlX25+3WDUaASB8KjRtRPew8e0SoBkYj70CYiiaT1ijiT8XT6hBDbJPrwJfamz35/J1sDNzS5xOSAs0U8gu8fk8KxguaH9XqCxPgnMvh0SIoGliZBOfRHuDvL9jpiaw3kBoADtVCZO0v8R9uGU0mYMJxQhwoZsBZD+UDDAxYRKE6e75uevKFu/0G2cBVggMB9dA+KINVSM/JGIcsayPoAeZeOCR7iB0THcErDrB797j4i3brrlOADG8bIx+RvAI4BESWeAQRPu/XJDI75F0wsiuAN0KAPSDgh0yGwrrK/uLduqN844qAWXhXPDpuFjoPSARr3HFpXuSuYL1vkPUQW4ugbVS2EVOfbzr4Jbt1k5JqfPaFqUUVAQfwENDEeFGpD1gKNh1OVrZEoTCEMMExPDi8HOzybU++dLdu2MrGglFV4A0GCLcDMxobW+HA+CB54lmADqD+uJDeQMNgiRkv3vumJ1+2W7d+D1NoxBBhVvE8EEtsNFz6wHTgcrFXoNAD3InFKRFr1YwbFSYi3/3ll+9kc9qITGF5FY4RVpEOgdUjoPUED6USIRviD55ITgMaZMFFEF5ArcsHpZuf/9Yb2YAEDsFB7g9GDMiJjwNbE3XAG7DLwC0pECkI8LK2jqQmbyXxhhoxS5vXXO+3eSD7cZ78Kx58/by8dHBvaZ78+vwXHq31WeXJv+LReh7vz+M8+Vdu1vri5nuPc9tfuXnOV26es5P1difKevsTZT1/oqwXTpT1ihNlvfJEWa86UdY7nCjr1SfKevFEWa85UdZrT5T1jifKeqcTZb3zibLe5URZ73qirHc7Uda7nyjrPU6U9Z4nyvpWJ8p6rxNlvfeJst7nRFnve6Ks9ztR1vufKOsDTpT1gSfK+qATZX3wibI+5ERZH3qirA87UdaHnyjrI06U9ZEnyvqoE2V99ImyPuZEWeZEWfZEWe5EWceJsvyJssKJsuKJstKJsvKJssqJsj72RFkfd6Ksjz9R1iecKOsTT5T1SSfKet2Jsj75RFmfcqKsTz1R1qedKOvTT5T1GSfK+swTZX3WibI++0RZn3OirM89UdbnnSjr80+U9QUnyvrCE2V90YmyvvhEWV9yoqwvPVHWl50o68tPlHXNvzx1n4wcP8kvEreNhD1p0uZaMl1lsQdZN1JepKxIidlK3u0gDbPmaDFfLqDpxkZ76j6ZK2RTXZq6slO9bnkhtF9K88pQFYZSO2NYb3naGHNEV7xpfUzTRkr2qftkqo91lqRnjvVYx2GGan1j8PHIJoY+Yx+pkBzroR0pHIcjH+wnP1HJjdf0+M7gdc8e7tdDPv+b4r7l9fkvPFrryeu55ZFeeLSex/vzOI/0is1aX9x873Ee6RWb57xi85ydrLc7Udbj+5a7+3+6ReXtJCeM9ppOapL0Mtlwj+KSF+5Ft9F6WaONScY+jNijJ3U8dPXwuN+p2d3/IxfqbUFtu3GqTeP45URu/+DgIEDp+pHIQueeyNd74zidh7WRjLVdZHafuv9nUySrrhMY6jAuZFeTIa9vco1rlDJMSNOq9naSOm9R9XGDJHjPc7pi7fUdP7z/9/h8PMzffFOcj+vzX3i01md1Pt7h0Xoe78/j8/HqzVpf3Hzvcd7w1ZvnvHrznJ2sV5wo66pXT+pwK6Y1lXh1Xectl/uBaXQcRXZTda8m1oby6jKXTy0VW8vRkp9HTMfTd1itsSbZpRpJPEaLJR025BRjMSpyvNREe1WprbCajH6utfcQqlm5tFUf6+kbyS64jW50l9e4hgNUVd2aE+/hQjlWjd77ZA6TjD90P/FwuhKW7NA1nWletdnLx+fjYR7xm+J8XJ//wubdPovz8eKj9bw5Xbvu3Ws2a31x873HOv2azXNes3nOTtYrT5T1Do8+z0Md/uZuK1/5bNbzpK185WZfr3v34matL26+97heY6dzL26es5P1qhNlXfX8qT4FdsblTNWlFl0QwK7kQxWPIIlLPVR05sCU6X5Ccr24UHNNpcaYD7uCHU/dybdtAHVd9gmfntroqj8GWa+ccojF++yXdzG54M1RAR5GdZUGdJ6y8/GGhx++t8c6/Izsx1usw9fnv/DcMz1T9inf+XB/ntLh6+/udOUxHv7G6N2zOA9P6bAbgVAxu55NOnocsdW+iA7DDDEGXez36HFoppZJuGeLCS5VWwMe26DMT+uwSSPyAM7Jpczf1GaNrijxJV37nCZau4gRl8ovrSqvHU47D0LV1Mv/8MlvqsPPyic/xqzfGD/6/Imy3hIdtsRzrnqjG1J15jzzkaLulNmiCxqHKQccxLK9r8OrmUc9ZjgWzERI8AfmqXjROdstkZYn6FJJfulxHRPgG9YKIWUbkl8lm6HOHPkwus++jtT7vNyiGW9J3PXNTYefddy10+Gn4q5vClx5pg6/8Ojz/A+O6tlzVI9rUb8xvNKrT5T12J7tbA6o0WBYasOCLNtShMIJtTRC5dwOXezMJQUH/oPpXSYeuoIN72MS9qwd9qn43oboYX099tGoWVTwPU3oVrioI+oKXjLY0mMczY7Dwx4Zk6GHlx1tITo96e+d7qZ354Lum2EbcycGd7qMNxLPhaPC7QejpkMIrJW/zdVW4n9gkKf7SMV4YKvXsLnC361yZEe8zyodRIH6I3Wssqm5q6VNyisNr/6kuqeBtR6PMe9D2c4WuIeV3REs9J8ZPZZawCxr8oFyZJMx/R2AHWBClmtG17tC9974CrZ/bMff+F3Ww/Dx1Cir5Th81WWIytLMKFZNxsDx4zhiieNIs+mqW6ndiQ0/AGdP9pGyzjbR67UePAaQ5pJZLY0AgVn8HMC4mj2cI2zK1FU8a/hrg6Tkh3t/qo+ULbEF71ebTX0pXOcjgBJdLmwCKYY+Qsi8a4mtRxb/iONDPXWFGH/5VB8plw1QstrgExTsnLl01MuJz5SDdSKGZud/o/kGI5RGMWkSURm3Qrz3T9n1kbK2HzA9sZl8qMlQ5zEp4PJhhVidByd03bkki2CXb2Hwuv1k85duMt7vW237SOk2qGnsNSfogLuNrP8w82BXeptGV9RcJdNhylAbrDjKgH5S04yjlHvPpF0fqcMQtA3dX9MNrjWL6WyqNyaRqSm6g0+iA8baRDaYHz5ytyyaWPBAu8N6qo+UW0hqIfgSwOFqKuSMmkdUPkiu6g8Qazii7nUfuTXIcc69dLbVgHb6J/tIDeICFE5djWDzONfYDdS8FJ0dXRzDeB3hQCps3sDcrKHLc2bN2v29b9e772Srg5tVe6sZSoZXV6MAtwhwDzWBScNe0ldZD0rEJgF4x9cPY2cgPrZP9ZFSg53U1yUB4ENK3oRwuQTWJvS/DwQ4peuKWK/qk5Z4w6BFn9eatpR7z6RtHyk+GiHT4UuGgh8Lo+V0kVCfX22eZuMBTTcghU31mBa7OpIV9VS637/f9ZGycxoHIg2w+2xpsmTDgJ2h61J1L8ZP3qgdnpwFaboQUNcedRcOlIplj0/1kSIaiytzfno0Sc1UXMFeq/8SH8OntSI6wQtPHtuXIzxtLTzbqo8QGcDwVB8pm+3Ae8GW4E4Mmpgbto9j0yBLksP6H4oKB0ZqqplN9fy/I3WSjTo2taf6SGEm1W9o5nj46KtTZ6e0MIcWaheCmkfbPh1ETG+1qa0AOgv/y4+QRDH+qT5SNrSVbfLF8tKgizFWVllNkjGNs63uIweaiKmursVQ1D5u5KGrixgym5/qI0UKp7dhrY/4Md2mVKeJ2lyGGveYLBJF5EOlm+SloMWLx9K6hD3ohjfvn+ojZZZMtLrdRbl1Iu8QJwz4qjN09CceOE1CJDwRe6/eJHDyvHAzdJyNe6qPlMG5x8jGNd8h2qM6eqinocFqRKztAqfYIw0MIJqpHmeeUN+HwwIm7P1e9QduddCFVflwARE+W13eBbDMiHZjm4i7SPoe3dZVMYb4s2l53AGkbJjYe+/8bR8pkzo+x7HQ5kMp5AKnrrJHdaQkuaHTPgrJOQu5FnjzETwQD2DMdByi8FQfKUPigbw0EASEotzGUbte6YE/VltL3d4GihwF3o8UIA/NpD7Q/wSYW/d77Ls+UhwwbyLZyUkucWUIlRhwhB3kN72zxJxDjdPgVHxbPanLKBqLgem6Cnv389s+UiQV+bxzLudIqg8nfagVnpEcDwaVzySE6R1fKOxXwtI3tfThjYNo0pN9pFK3C13z7GpFS8ApeLOBKGNhQb0Al9F1eAxkA+9WgQhyrhXSCDe9nuojxdoy+yicpI4yo+q6M9lO9WDA11u1k+qV4J9kj9qy5gqQO/IsuvrO53yyjxT2Dk9uwCG6b9w4MMF21DcG9V5KTj1QOh+KdFNQHw7eIBBpmQpniz1+so8UgE88wVERUtTJFx8PiBx4RAArNnUcVd1c1aZGTXgx9TAaAIDBKXb1yT5SxAaceRAqx7oAi6OqPxogbhW1yGjsP2CTlR8Yxl6jZfmqsMBPg2baU32kgDE96/YzLgADDUlH0k9vaybAK7YcEk9ZbQtLCGgAfYIzOJW6VQ1En0/1kTICDtiFS48xXuFSN7em+EetTHDKBnBoYXK6w9EXWPHp8SbhyF4NeNZTfaRQbfbvwP8WfX6MniMXCIjV20P5p8NOWj6AVxOrCrpcYWi7OF68CPtUHykXvWvqEazfB+Ko+x0BFL45E44U3P+hboZ1qL2rE4wtl+6sZnK+SniyjxQHms92NLILeOMJp+WXQjbSs7GqyauVmQHLZ7aoe6e2qWg+EPyI6rz3VB8px/uPTh2i2I2GiwGsxiJnU5tU+VArRwwHVLC6gZZFqDmAcmDPOu195sOujxTBgp/YVKFAlu15DIY1Lk4h5giTWNjlAF4Q1jBwa6DcjKNYMsD5Pndo10eK0IwosoEUsFFEqf1ghwe4E4TIuwIycN5JhLDR6itagOekXRo0NGHAyvXJPlJY7gKShx4EEKISuAj8S7Yz2QpCCaVDhKvRhnLJBfM++FSOf6BWRD9P9pFKl/4oMXaAx0HuRh2YUoG0jHGMo+B5EeQlraqbAmpIOpsP6sj74OOe6iOlxk5uJABg8WrmjfE88I8k0GN0umBfcBKjuIIn864naMxBjginkdVO0j/VRwqowRloaqm4QAacGaJeQlT1TbBGTUIw6gk8vgZGVb3u2LkOjUB0C4B5so+UGoeBwvDrPsjcwgGgyAeI3PUR1a0O1LWcuAgoVwKuVpr3tqLbmPB7/5RtHynSFLLY8LC4AYuHiF2NaC89b+ZLjZSmGqNHQwpNrePIc7BXQPE23NGf6iMloIFTIPjN6Eji4xfC7HxwSIBr6qMpz+VVmqYmNew0MKITNqrPwrHcU32kLHIU5x4eb1Mw/Si5AwD6hor0gdPEJeE1DvXDTPVANxrBVVcuUTUOT/WRskT9nf3mWILvgacOowFm9gp7MdVeDZtcjSBXp5QlsYIBDEImYAH4kE/2kYqq6uAYxqRUZx9kK9XovWM71ESFDdNnyGrWC0cEKgmxjQhggpOf994sr9vJtqAjDlAqfGDiLtKhgG9wJc4LAl59b5saXUozvIoIk9CSL0SuTsbryT5SxJYT1uiSN/AlAUNAzbhNThGrNFgUNkGFjvgEFavwWkwBT1+6jtnjqT5STum0BQGh9uZsPuk1fAO6vDhKagrPFgHHyS50TpMKbrrao4It+Cqu6Kk+Uoa8QmoHoFTBFAECZs9mJ+RUQJdZkSvaGXA5sAn8GMdA/b0wXKQk7r1tt32k2DX1XArywE0NRi3uFq+P+ySXXVX3g6tOqDMxA/Etx3hdqAK8XLzjwV0fKaPWOkvtHNWTF4rwSAcqjUsJDk+MYqoBGcHg0kkQDSdrSUAboCOBdE/1kXJkvZ1HQ4Ij9DWQbnAQaAbR+lRndaXSG2JIboL5cWhWjVXU1n3hle+1RZ+53W9QvbqvEA5LzUDJWrwXjG3Eq3jhS/EdaqHm5Wp329S7CoJLLTbjk32k2EeoGEC1Qt11wHShjLCFkZ3Q89B8PhU8GWhriYxzar6Hcx7AjlCe7CPleHW44cWbtNFhOaIath7kq0TV4ibUSRRvZuCPm1Pnz8K3Ds7ToTD/qT5SEHKYEPxqPA61dYELIFCG5sKRxqFjcwhQwX8dxMXVqoMpoQSeKWJN7pzSro+UwyjgpdgCdVZOph9d+1yjI0g4nOqPwxoVJSFWvYBQtLzAR6gNTy3rqT5S5hjq/p4MJIdVz76CoRZGgPLB5hEaYq78gBVDnEA6hB+REaaYPcRtPNVHitx2Zhd4g5huOamOh0/gcdQB79YrxmNBVY9O5I31c0M9siCrQDSx3Psr7/pIEUuBYUAc6pqktl2wHLAHnqj+qLOBnEnKR0cosdTYkNivBMXd2DNeyT0G3PWRArW2hkUFvitEJ+jNoSs7r9EaiMSNwb0jnpWi2/iaoRagjri48l/2qT5Sis7hrAKfsQfiGdzkIT8MBQzAh9oAmkufo6ZUgDmLIykgeOUtKCv5p/pIaaLEwh+3S5cnYkynxl8xqp5dSAqsCDlO1kRvF84XYNHgeWFnp2Y7uCf7SMUBH2U1hgRtwQ3yWjsGnBiS1wo+YW/VI5Bnwq2AREFUqDiuonuAkXuqj5SrUBuYj35pIYh+FCHmrAaaBjtFcAB/l20Ll27RIHu0OncZSpxENU/3kUIZoG94oY2YG36mcQRZ2izKhWPJ1XfLYrGFewZm+9IF12FQVp8PemXv+kjhyAAIonAO0abkeSaIB4O+oEwLqSQjhBvVMFehJZEIpDr4FD0tWAn7VB8pNQID+gTthNogtpmSRuAQruK1nIqfUfJDfe2bqDfVoyb5bA6x4NvjXlFvtO4ZMEmeTSRubMBYaCP2gag6sTNkkMDB4AU00YtRhuPlMEWMuaZajPuZ/8qdbNgLEhNww1D0FvjT1RYexh1PxFdUWloutBtHyi1RoDoy6C1pMDEAV9nfdrcnQIZiLTR9AZ8sNe9f8F1ekyQIfaAZcfq4swIHjpE3c0JPwtjw2omKx01Pvt1u3S7jaUmDwIuKXGvV6fIFQSSBmVeH2B50oji0ntANk0L4gwHAkJEr9Ddb9e03st2E1IRlcCQ+iG1URwRtrpSaGH9bCWoItIX2CZ7FDxiYffJhUNgrp3vvuO+w2xOiG8uhJgiYmQAcmt0ZdvmYL3X1xjgOLHW/JKx8ZRGkOPAbXsVNRCVX2d9xtydsXzZAGlX/K+2pjulFjQDBCQNIBRnEwrMGfcBURTVm7BVSNgLzsZ1X2d9pJxsuAPSKB4Hr0dQiPFAlC9Y7HlidHBHjFbIlYjg4ArA3OQQ+FFDMpHu+4at2e4JW4QaJzfgNVLnPwKoEXCc+Em9KlsurjbGVseVMgakJOdcSTfFgFlPdrRtejVyqkWbD5YAiMFGDLJd1TVoJalhdV3MURpQBjVAF1oBjEIT+fubbTk+yZgKwTOcqemfUZ54wBlhPYIN2qnkmSW1luZsosM7aQf7icUSk3Px8360bjAyadOhcE32ne0WJnBbpQT78cihEUudiDvrFCEMjoIxOp1mg8WYHx27dM6mbtXyjV+oTvQETK7mIFyMdw9az+gJj2qEqOGBkNTwvFKACzXTPS83du1T3ZHIYYqz4BVgAJ7LR4gqKEWjGZjloHvDPAVbn3fqXRkOYg6Tuvb/y2skm9ifgmUDWOrWHaG66WFzbIfZS060UDJXabh8NS55JgolcwUvjDm+c6Vfv9kSAMumTz0tr+mL5qOoEqjr7ZlUCiI4TQWD7wEjqV8lnI69XlBbvN/v9nXfvcmAvhtV8NPY9wS5UrOzQtLK6CHuA7+rcqrlpE9iNZeQTEUV14CDM2M2efM123dDnlfjA6LBbEc+Q3porA4up5DpsHXQd6WnS/7xOLDDYHwyOH50P5hF8l51sYBj2w6oVrtOQNF3BI3vTiNlkkzo0ZNFYGBjxaS4TNNQRM6lQjcTGDbN91927hKMjN5IJ5IkJjNrqV5MypC/gAgS+DssziNEWgMcWEQlLXZhJR3KIj5uefLedbDZxKhli2A8MF6IArWA2Dj6MFTweRxLXC5Q1l0IOeY1GsodfAw7dZH/t7l0eQflEmDQIXot8I663KNsKP4USYrwhreoFHZGj7WTEwFaHhsbBt9z85dftZOOGsU74MRIvBH8EvUlzRvg9QhulBDTZBdhGCgikLltJbIIG+kpgcu+9/913e6LZaDDZBPQoBmxMAzsQ3BC1HlhAUvaDNAqap2oCbAh7Tq6OUMp3TFC62djvsdOTQWYPbgFnzO9AsFaITogZ4XGHsZEWggOJ+EEEU1krRf4gTaPIsd108Hvu9gSL5I0GGICXVB0CqD4usSUZY5v4AGyHKiIKBxgiC8qHF0GSxqmS4q6D32snW2NnOJGYcHF1cFJE6YCJrBkw5PAAoqBzVYXAWmtEC0mES/FBVQrlznF8763sobFWOsO2C29q+hlr7LloUopyVOAFIhSjVtQwSl18BBsJto+p3fDJ99ntNzaOF++AZaSKoa7wCUaDrnBjRZSK+pYTcxPXYnkWmIvPBTlhRC88yKF/353sgKkmQg1WKWgwO6k6kLgybEZVABARqk0leO+6EtsUw7MvAFJsBXt4lf39NrLhLQwMGxFww0tcwnpcBEqGMyQ/33Qdiy8KMg/LZ4HgIMmmJGZTBcBN9vffrZvsShR3QUwCOxhwbsmo1AGw4C6t9gEYXZx1Jw2D18ZMgSQajJD3MIVX2T9g9y7JMUFjKnMNw61WvKCrgwBNhblGjZU5+Oo3i2Mmnp+lqeCIFAXkBwmym5//gTvZOBZBVSgGZW4EueHD5GNwhhCQQByV32BWOET4JIzJDJqjoSkUrOUq+wft9kSV8Gxkv9RpkIBncfVyRxS004A72CjIdw+UJmJO6lJ8KYWql/Fb93j+B+/WTb5MbXPJtzjpA7gXhKYZZSyZl4mijKxLJFPjJDDEWMJ4CTnJLGF4rrJ/yE62EygRYsWloCRLrYqbw1Y3DBcRsOwHnq5rPJgKlcj2VELurERmuffH/6HP7XQQNILxxxSiDaOpBFqbPDTJaYhKJn6H3u3BaR4gCUFDSA/6107BXF1l/7DduoE4ZPkVfGnMF5RlUtBK6LZ4n6A44JpqOYhYSWBl7IxacLOMrnD87ot/+O5d6oPCD2TON4YK7LeOpvk1arpMSAZggaBy5GBwSyBkTZWAo0YRdRfd3t7l63d7onk2HHhhDpLOh2rjosYwYQ2TE0FYVY1WRfUNoBweavmooUQYX9iFq+wfsZONFhMg6CqvLvlyQMrljpHu+BzhUh9FTME/LhU+fEteCXBHlCKneZP9I3f7jecdgGDYOwiDsvgPtzQbsuFCNVlmYBR5lNww+wWw1YhOzu66FEvcdPBH7fZ76gMSqjuVYKrGhYPMsWOHbCWeHJhWAVtcmmbXgMiJ/mD3hHIx5DfZP3q3JxhSlR9BwxxwGhBeRFKQD3DTBxasQxewY8SASmOAFMPQvA2ZTDGG93X/mK3sA6p+5aL720ApXCDqgDIOXnFv2D9lR7rKZDVGFugKp6pe6+OCPG5n58du90RJI/hWEANYDabVgcKBl1PjbtwKBbyPNYUayJhjjJduGNTWdGdmzRuG+HHbdeO+OCj2UtSGCJj6hsUgvWITwQpkjVwuuJ4IlrzoVNgGs8ROARXvNVA/fqcnC28FveA0M5CwBl0hTmJvBucE+4KSqA0ELgPrGmGDimadcMzgQ3nLNxv7E3brnjJpeFUVVRVVJhy8Q9AHX8AFXTwQyBWga7sKl4PmlYA+LUcYi3vDED9xt+5MblR904E6Cp4koVwAT1XQZgmsgwaIHLDhWdlqqBv+jQ1TFWC9Yc2ftFs3QsBk4KgFf0lSoOOWRf2qRTsmAIoDnA3JFjMZJY6pdmbgJJwKhOJNT37yVnbRhA68Il6gpqA6A3Xu74DWOKua8hMAiV4bIwbeegZ6Et17EfntPgfnp+z2ZLCJ7C0MQ9H8G6fRfBEOSXlAXl1M0OHkqzVGiSQ9WWRN55NvAkP4ew3UT93Ixl8TOA20lowhZxx7FFR1VjAEvDQxQeLIBFgsEJxPhSUpxFG8H+KLW3z503aycdoEIlAvTqVCYLKuCctZc+hQaShHo/GDpLYrO6Ykp9FAB9wqlGm+8yc/fbvfEOclA0GmxiDmzsnxKkPEVFtAJgBj6YsQHjyUaE3Kr3opyJTk7/Nhf8ZONurgyWWYoSoWVToY1TbB/xDnDI1pig5KTwmDLo0GGeKeZdbJroR7jd/P3L9Lp3JVgGrrWZk08BLxAmwu+88Zrxpfqmml6nSB3okgkN478Qr3uVo/a7duFSNF/9LkOHSZaKlUVToa4VUoXRhIEqYqnCHjqLJ5WVy0VjOmyj1O+9m7dWuOKDCYnBcvRzNYlL1usARQ52CIDk8biPLhH7DpGkYbNbET5WlGrWuusn/Obt0NUlodOzL8jOoFiipjmqZTRAw7mYGk+Y1BM75hNi2hjso9VBc1iUNv3MzP3a47BNi16gmpsmZoFKUWRtJolgXvPqAmoAuGRlhP6ArcUScg15QdfuLOmf5PO9mqk1SITk5I9wtYCzkXgDPqvjSQuxBqqbZZ6VIjkg9oDyg4Bnuy7jnGn7eTjW1WOY6BiPIanecwQY4YUMQJVNuK3V3IjIosMBI5JKJ48nsaYdzuePDnb2SjqotTrnXghxeI/iDqs6pIAV/CR2JKOZtLs1k0pw9465oqrWFudH36KvsX7N4l5zsQ5EL+XOr0s7A4qQxIMJXw2XoZEYTvyOwETB8UBLE3OCX3lPw9L/ULd+s2IsuxbJzgKF85NG57JM0SFTvAuST+5WHqFjFUXVkTYWeFg+Qk3fX7F+1l894gWYn+0V3YUqNK9kODmAILJfNKDryTndeQ0qOo6ChhAFFVEgV3/uQX72TrUKvdEnEDKI899wrBi2hS3Lq/FBpEeD2M3iiaJqKLCTDyF7wUb3jwl+z05IikAyo5laxS2qIL7CVqol2DwbikL8tl7ktXaoTQVdmUEi7zeIF2N1v1S3eye3VGukEuvorNMXAzhFXKW7C5Vlc1yYKTH9UtDDSSFbS6YOPJy85yixt+2U5PqowcPI4T/YMP6PIBU9cdDs5qULcc+G9x4gPSE8IKy57JS3tIIHPnHn/5TjZYXQBQxbtkcauGDKJ+qAAwQoBHRUZOwx5Vvz8VufKKYfkxYLqJc5X9K3ay4Sk0eT2Lk0PJIfGqBm1DRXI8I8ki0miE2ukyxW9Zcm6k9Yh+sMS8nBtH/St3+z0KGuUPlSqJU4fQIQnG8cccEjhNDuhUurLCFV6KNtFNzs8AfYuavPmGX7WRzWZzeglsyHsp82BJ/1mUh39qYBfhzyEYYS4jNFFvcjX9woIPGACiz6vsX71b9xLlB+eouyLGa8ApZKGVoSNe0ih18kckuonSVHAP8Aniy0Ildgac3/Dgr9nJzhpOBcAjtoGRbYdeI7weJxr6mtR2lEkkyoE+nJd7NdArQ9Wmyizf52r92t2e5HWp05d1nSVhpptqPcHGQXN6M6+iK80tLlI1zipGzhoBz4lHHW968ut2euLhpbIgJYfByeVqeJzCK748VHZCzhUVtV1VSdkJFByXq/vxQrNfZf/63Z5ADAEIdB1Kw+DsRWlIkwZyIEWZR4CaCrYUuyjBSLabLCdMUUtKi9/05Dfs9gS6ROWSJFwLsZ5GPimjRbRGhNpLUxjOgWoiqxoqRfKAH+YcqYB23muGf+NONsYbK6WfdsrwdNhCIYbLAF2sFGkBmNmgKdlAZd0O4VORRliR01rvs35/026/1YVAIzknZk2z1VV2ZoXadNcJGw0qOTxujiAWeGs1IjKoTjGr1qrf/M5v3u03WSEyDViUyxjKpvlummg21VWpClIpaCF52e1UYQCuBIDL94kIsFo32b9lu+6hkWRTRNvSbQuINEwtOVIMEoE8sULBhKnMiBheBP/Es3JseTlklG568lt3+w1ogOPSnmjkVLjcvOhK8ym/Dzwhu+bIZsC/keUqoHV8HZS7azinsW4x4G/byTY6IAXL0C9lNjCxHj+e0bWpijWdTWAP6BX60y82IslrQPx5bP79Tupv3+23ZVsXlglqYOGEvDiupjpQDjtGkQ0QcYre46aB5JwXFQCr4RULuevg79itW7UmkOvossgp4kjdsuS4iKMhHYjhhvaFLU0O1u0gS5Kt5rtCp8ra3mT/zt26CftgWVQhi+sqnHueYzWeVSeqCl8BYLtySEPzpqHaQFkgA2ITQO7Nnvyu3bqHMvQ4MDhTDSScGs2qLpGDGDNBwaCMYkyw2XAdpMJS7prfm+H7SO7esM/v3q0bYzalW0RqliBa92g5cYRpEIsX7gjPDIpWmdnSnQaVP5JbgkBoq9x18Pfs1o11DsroAPzSVILY6BaFn5o5DctEMEkYS+hG1oCUWLDK7uIvWfShQoSr7N+7W7fmbsKSvFTOgxntym1EcwCPkUKOg/gJNlW36UAkmvxHsAhWgt4H6t/W/fs2svXmyLNrOPAlg6GOKlAQ8pO6wBOEbCfmVJyq5k+WcamdUYxe5ZOusn//9l2O1hLJT8J2SKpMGsn5Uoi3sYjQVUAoVVmyU7gmIk1dKyObgUnUjOp5W/cf2K2bc8tPgjVMFg/h56UMEq1TtbfK72DfmsoUCN6r0BQsxOXyDp7qQXz5B3f7zfsh2IDex0uRZyUET2HpGInlxPzjAoiXoU+TKPLcNAsvGEWZRHf9FgP+od26o+pg8Mjtgn0KhhaekAhiEtBzaJ0KQr1K1EnQYMKAK6pJ5byCNMI9N/qHd+smeYuVI6FPyoxl6qJv9OzHPAg2AX3kvnD9cJ0ET5cidKnLAHfGQeh52+8/slu3vyS0NLMbZ647rxg/jeUbupGZk7hR04j3pxo+qifqAud78mn8iL3PmP+jOz05lMohI9odkSXZUCmvETdrMN2ENXCeVdnkKYxOiKzLZh0zCHkqVugq+4/tZBvNmSSBik7B0iBM2SLCBIiDQ6kH7G9TMhEucKKWuO5JbASO6OoOcIsB//huT9C8xVFIl+G4SsGNrMLJpurXyiaRIeoKJ3QtLlwC86UxniSthlKHV9l/YrduCDNPMhBO3kKFEo+ARjQT22vmPNANcxvEeOgisw1IHiSSyF8BXzTk8Sr7T+7WHSfbgSVZhBlY56AsEYljA61J0hV6FGxrYgyKipyquYHLkBPJW5Uy3bD9n9rItpqBW8leN9XxQUioKMGpmBd0z0avhbM/VHAKImYDe4QwJxMDcYszLjeu4E/v1o0nAL9C3uEFoTNUjuhEDPqla+IHjKNuKHTdJ42Zw0rOFcvux6ETfd/vP7OT3TE4fVaIjc7+kVgUS12WzB4INuo0okHkDHQjkEQK2t6UhqhZY69vGOLP7t6lvYy6V3hJ8K8Jn1U14AUKi1OyoogMCxExLjVKUEwsPGEFwOOEO/c84J/brbso7ABxghsu5RXkO3XBBssEHCRLAmWjHhOiVANk6lCtChkK0T/qX3mV/ed36xb9R2AADKtwEbAkAT8GsVGUDcMRVwIs74WnigYJL913VdKqkYOEF7/K/gs72QcagvKRLyLM0WUo/QMG/GBbu6574HNrEAc7xIMp53hgUng2keK9Z8Zf3MkmRNf9sOIJjKIGkRqltvkQgmgtBgKTKP7BquBaRdsTEo/fIYEA1Lid+b+0k60ZokR2LBI0DwBpLUtNLmNDKzZXBKbNHniyyOeBf8jRYR/FnRKw3fDJX969S1wtETbnjhxPVnAZcC8gImmNGuhNUkdFtykwAFhwtRzAffJsEk0Er1fZf2Ujm9y4Id6eiZw2579L1XGMmIwYCx8hHJqg7jRd9biU5ahZC5qNeQVAHzc9+as72SRKALuHai0csaBqSZdKZHRVFdiv690Xeg/tCyAr0jQcWX6epR/ufk/gr+32W0y6bv4m3C3IbQieoZhNly4xKCiO1WxcCE9UFVII4vogJuUnyLCtm5//6zvZYF3cwAxiXGwmUcveq6bS6qZGVuSEpbpgXKylV9WEWjFbdUsZx/3O3t/YyeY8F11MBjKlonaviCHrR6ougmw1/RsQfak0wFSpM0ogoMqXG8JQCLcz/zd3+415a6qcGZhk3p2gOxYUpQvk6JxXFxtSi+plQ7yciLqbAiSS4Hy+da+V+1s72ZY8Jyebf5BqVAVlI6MoniPovoGNGvsdD8EhlWgOJcQPeAtS33w33TiOv72RbQZEFC+pgKtZKyl0VcnmpoR0UIm26p5AoLDpXpRgkMMHDxDKkcq438v4OzvZbgi0y834oBsUQFm8ISnXRJQdNFX80maeAwCcB2gluY6M2nCoQKJX2X93J9uyyaBf3iUsQzSKXzmfYkR5DUQP0ART9/iIQzmhLNer6NTCEkXQ0s0X/72dngAuA6AUmIDvSkRRUUGgu9zfszJhhB7q1SkrCAwqnF2CFa/0oEF9r7L//u5dsqJLC5xJ4EpYBmTSuOWsNC+WHJPEUSGZzLFEMwijStPdDc4S2YdibnryD3Z7EtT0BgslPUcUXN2RFa9DJqsBTFI93xwqcYFvy9BWyqx4UcFAvXDz8/9wJxszjDFWw2WNj84qZ+66Op45/CUAsNgzEuokMRHN4SXheqGwOK269n6V/Y92e4JdJY4abAVGNpLGbWq6LAUhgCT9r0ucL4W0k+yjOplgF1/qI2PJ/F5l/+PduglmIoki1bGptAJPS3aLd6s0GLyOR6E94LvpQjEHhzBZpcjisQkh+m2//8lOTyahrlfqsOkmJMFgV1kRZ/9Q3STH2oibKDDfqjVIyoeRcGsODriR8rzK/qfbdcOF6OJtgOyAbNAAcZwDaaQpJw0+a6oo9lFj1CevgVcKLVd4t7Bh91zGP9vJhrVY+D6nm+V+1ovPGo7T13Vxe8G3OQJtNfzgNZAGUw1T1jRwEDNruMr+57s9EcJ04s1VDxHU2oIkb1bFTJuabd5V6yhqk+SdWn0QBbEIUu0FOHGv8fsXO9msK/SuxRv9Bv4MIoqwV3eAldUJUcfUH3y7qBgHlhfACeqEIZv3Xgj/ciPb6qYmAFLoWJ0zvBwaEUcrXcG3GpJCPig845xaFROFIf+sK6HH8rc9+Ve7/QaBEMuR5VNVBQzVIlkLT8AnCboR3YKuCKtJJCGPOtCo+USF74O7JoN/Ozv/eqsnU11xONlFTcGEQfCeVikt8NOBssMwwxyr44kCTbUaIGaM1qvm4B5f/pudbFKAkFOqeZWWcx6XBZcRq4fZMvrTVGUGm5IVTQReQo6K5D0wRjmOq+x/u5Otiz8EGFgnpYus9kb00oH5cgfwGOh6Kae83Eoo83LZDogLPQGtaG578u92emLBxzgWQrSqcqG0lB5lcaB6XhsZOygBq1ZKUDiwTxx1fsWrdYuq52578u93egIWxj9wBi1ZViygquDB1fBJkGuEKSijByniHHGWBQdVM+hKKXAIv/u96P+wW7fhAAa1gEDNHdtjLkmRHAHeUbXecBtJ3VfUVUj2zKpS4kJ2gumOG676j7v9hvESqUSWT1c7oIchl6aKMsGyTmcSChnmAddOJpYUXn5D04mRSYbd6yH+0072uFyMTHpVuEByFCT4glr6AY0zLDMfaeiOHSwQhkUX446qu+UEROjBjSv4zzvZqrEDfInCLWK28S34XJCPuNJGBkOETIR/g9Xiu0Y3+HCeulTKx7v1U/2fH8h+2Rv+fX3uf3nw9dN6VsKrv+zR8557bt9D8/r8Fx6t9dT1POih+V8erefx/rzVG/593bv/ulnri5vvPe5r/V83z/mvm+fsZL1woqxXnCjrVSfKeocTZZ25968+UdaLJ8p6zYmyXnuirDP3/h1PlPVOJ8p65xNlvcuJss7c+3c9Uda7nSjr3U+U9R4nyjpz79/zRFnf6kRZ73WirPc+UdaZe/8+J8p63xNlvd+Jst7/RFln7v0HnCjrA0+U9UEnyvrgE2WdufcfcqKsDz1R1oedKOvDT5R15t5/xImyPvJEWR91oqyPPlHWmXv/MSfKMifKsifKcifKOnPvjxNl+RNlhRNlxRNlnbn36URZ+URZ5URZH3uirDP3/uNOlPXxJ8r6hBNlfeKJss7c+086UdbrTpT1ySfK+pQTZZ259596oqxPO1HWp58o6zNOlHXm3n/mibI+60RZn32irM85UdaZe/+5J8r6vBNlff6Jsr7gRFln7v0Xnijri06U9cUnyvqSE2WdufdfeqKsLztR1pefKOtbnyjrzL3/ihNlfeWJsr7tibK+3Ymyztz7b3+irO9woqzveKKs73SirDP3/qtOlFVPlNVOlNVPlHXm3o8TZc0TZa0TZX31ibLO3PvvfKKsrzlR1nc5UdZ3PVHWmXv/3U6U9bUnyvq6E2V99xNlnbn33+NEWd/zRFnf60RZ3/tEWWfu/fc5Udb3PVHW9ztR1vc/UdaZe/8DTpT1A0+U9YNOlPWDT5R15t7/kBNl/dATZf2wE2X98BNlnbn3rz9R1o84UdaPPFHWjzpR1pl7/6NPlPVjTpT1Y0+U9eNOlHXm3v/4E2X9hBNl/cQTZf2kE2Wdufc/+URZP+VEWT/1RFk/7URZZ+79Tz9R1s84UdbPPFHWzzpR1pl7/7NPlPVzTpT1c0+U9T+dKOvMvf95J8r6+SfK+gUnyvqFJ8o6c+9/0YmyfvGJsn7JibJ+6Ymyztz7X3airF9+oqxfcaKsX3mirDP3/ledKOtXnyjr15wo69eeKOvMvf91J8r69SfK+g0nyvqNJ8o6c+9/04myfvOJsn7LibJ+64myztz733airN9+oqzfcaKs33mirDP3/nedKOt3nyjr95wo6/eeKOvMvf99J8r6/SfK+gMnyvqDJ8o6c+//0Imy/vCJsv7IibL+6Imyztz7P3airD9+oqw/caKsP3mirDP3/k+dKOtPnyjrz5wo68+eKOvMvf9zJ8r68yfK+gsnyvqLJ8o6c+//0omy/vKJsv7KibL+6omyztz7v3airL9+oqy/caKsv3mirDP3/m+dKOtvnyjr75wo6++eKOvMvf97J8r6+yfK+gcnyvqHJ8o6c+//0Ymy/vGJsv7JibL+6Ymyztz7f3airH9+oqx/caKsf3mirDP3/l+dKOtfnyjr35wo69+eKOvMvf93J8r69yfK+g8nyvqPJ8o6c+//04my/vOJst7uRFlv/4a/v/q5N92/V77h789vnqvnvO4N/22+kX9e9mgtb/Pgczx85ts++DwPf/7h3/Xn5Y++9lfe5qV/67//txfvv/NQ5sO9e9sn9u6Vm/Xs9u75R3v39s94717Y7N3bP7F3D3u/Xv/+cO+uX/s7J+7d85v1vGrzey97M/++Pufx1x4/57EN0J9XP/emn/v6ves7etjD9lm8o2tf24fv6OEzX3jweR7+/MO/68/LH33tnz/xjl54tHePv/Z47162Wc9u7x7bhlc94717h83eveqJvXvY9/f694d7d/3avz9x7175Fu7dY9vwDs9471692bt3eGLvHvYmvv794d5dv/bfTty759/CvXusd69+xnv34mbvXv3E3r344HvXvz/cu+vX/tdvBnr34jPeu9ds9u7FJ/buYe/p698f7t3t+y8/b+92enf1SS9/8Huf+vqX/i3f8vKXv/Ez3+7BOt9687uf+fo3/hzXn//nL95lvv0bfmGHtfS/173hv8038s8Oj5wo/zZb5IVnI98+W18d7ON3//Bd6D29w6N3/6rn3vjdPv7dt3/0/evP/4IH7/41b/iFVz/3pn7timWerb2b6/q5H84tuP7ZzSh4uMbHf9760X8/XLf2439/8S738c89fuZDP3V9/m6frj/3zcUvXNf2DfUL7/OEbXu4X2+9+dpj2/YOm/XsMPLjvXtGWK5/fXb1gx6drXd4sEdviV29/vyPenC2PvRb4Nl6/tH3/tuD731jzt37v+Yu9/HPPV7PU+fuoc/876Q7T2LZh8+8ru0bimXTE+fu+Qe/99abrz117p5/9L2nzt3DfT3PZx7lcZzx3Gmy7zOinpG9Xc8Uq1o7vj5//7pvoL9//tH3rz//igc26VNf/ubf+3l75/PX99k+4yQs88defZf52Y/s7Y7zeca24mZvH57365/r9x7q08M1Pv6zs6nXdX9DscxDzHp9/m6frj/3Ld2mfpsTbeorNut5trbHmse68vDP9XsPY9ZXPvrew/lHD9f/+M+ZfvuhHl3X9urnvv49fMgh/PfSsVdu9ucbqmNf/YSOveLB77315mtPcQGvePS9Hbe/4/2v7+S/F6e829eHz3zM+7+l+/o9ntjXt330mR5+7fqsh3v3ss16Xr353mOdfNtvgr3bvctv6N79gCf27uGZfevN157SyZc9+vurN7Ie2tDPeP1L/97t9cPf3eGWhz/7Vo++d/3Z1z/CMc8q5n5oRx+v/1XPvekePj6Db/Vs1hVf9uh5zz33pvmph89/4bk33dsT13ObPflWj9bz5nRs5zPenP7pz6e9/v5z/0d8+P9ZZV33+eF7edmb+ff1OY+/9vg5D3X6sb4/I/3yXx9/83MexRNXW7rjbx6u8+WPfv63PIgnft6jeOLh3rzVo8/9cH9fd/3MswXv15wu2zBGTSsc05Xeay95jjQ0ubr52YZP/cjRr6O7NjQrftRcbnzzy3eyQ/AjaaRxaDlGt4xbo9U0+GJarVdbUp3NulmjT/bgW8ehae4pWJd7e+znHsp2Kx+tjOVCaa7F3PrQ7N8QL6N9Uwq+mDSW6WY1YvywgsmphzzCzN0N/zi2fCPZvSYz3cxD06urdd6n2vNhgvPBNh/tsmHl5m1NYa7DFhucySvUVkvMx2Ns81C27S2swq+0Gasmh9tm2CTHn2R78aV4W+JiT4ZzPQw/e7oM1z405rqWx3j0jfa7lm4aq4k1T2/HEc0wbkY+Shi2ldwPP1ZHYiyed5yDzTFNH6d1cdXjcTz1RuseI7Z6pMNOX4azbM4RZxl+2DnqYGNmW6WNUWZr0VSnmfbZ+BqPYlasj33gG+23r9PVyHsbwWlYeLW2JWtdbW3MeRhph0ktm4wa1cK/jzQMyln9PKZ5zIG80Z4MZzr7rWnc1rM6tlZCeFksuc5Ds9anjfyY8SWZGHtubs4SU7Yj3WS/Zid7Gg5Fyc6uWfwIvC3DquJRkeJ7tLGUctQ2R/BHTyi2xpLzd3xR8f7GDb12tyfFJ19bKqXZaY/i81yLd+r6TKWtOo4jDFOsNTYkwwvNuXanSeyms/Bxlf2Ou3UfuZSFUPaw+8bJb/NoepzvyOLAJx410fnq09QUdVcdH6xUHdpy05N32ukJmxudxnvb2jInvRbbwzoSOz49e1NKsCPU3mKzrS0Ocew84li8Yldu637nneyja/r6EZPNK42wTKkjB28PF6o9al+xoeEt8ppRqMXaTTSR82sWe347O++yfZe+WmMwgtmk5I1rllN+dFSumJaOEjWsPs9yrOq9z6nxyJAwmRyhNW7zw991KxvrE9bwvnaro2FbTGbUNa3vtQ0+RS2ouXGOb/eCnU2RLRvT8xJGvsp+t92eDJ1IPm0oKfMO2W1/cDSTT6aGyrlH0djrbF2poZUa13BH9iYkXum86eC779ZdC+8c5XV5+Izl4sWOMoLxGEIsXWH1oTfvnW08aHSOlevmwOTO2u+86nvsZK+0eh9uctx6nKP0ecTs1pFrdcVy7FE0tAKDGBKfDIVydfAzI9bm6u1cvudGtotY1cJaF7abbQ0rddR6cG4yJ3xMjmvBi1UO14hzhqNZvF5ZWEaNb7/K/la7dXPG8CsxYFF8jhpp3wquCzdQsxmt++gbyoT5qJhMtrhyBIJNPh7OmZtPe6/dulFbU0auCwvL3vpyBNOx3qZyEIcx9RidveYYLjSpl1Yjhyvjr8uBW7vKfu/durFqxfUY7fAuBcOqq5Gr0GE9Ojt7uFo7L2JZHuzlijt+GQfLw+rtXL7Pbt0hH5i6zkZGPGJqDtuPP59jtWYCJ8/1jHXBBPZiUGiO01EtSl99X+W23++7kW3nsTgukbNxjBiq8Ag+MoUj+YVn07GyGEcUnLOD93N98dpLZBmG37vKfr/dujELs7d24HlwQT3xIq0HtGAyQplCFg7QMmeeIBd8NqtFCzkSnl/wt3P5/rv9HssLc+CI+bOkeTgIIE50o/HJQyxx5FYkEVWyOOOAGtnEyedA3PDJB+xkO8yc/AHrYNcXimH78qgb0Cqif24tTopFIQV5ipxxj0frbXXgyc1+f+Buv1u1M/Cxu85ETLGPvJyZ2bkQlzkcRwkKmdPfhIT4Obxa4FsO0BH7zQ5+0Hbd7KDnWOYZcy8R04SfZS85dT2kyNP8HEcIpq6lwwS+wNwmDyRaM9z05IN3sg97JMth7nGw5IrC9Gq8SXLreXSDa+PcTmcvytN5ufjJ3PGoEa294dgP2ekJ7w7t8HplMQKPj1BW1I6MWXipGasYTdO5LAbgALbCR7hpMeqs5yb7Q3ey8YpucTBi4+x7dwB9qimp4+YCL2s0XyLHxxlAei/OHsusrF/gg/A7V9kftnuXAsY49xJj4LdtYtedd7WPgBtuJuONFy6vgi7AnMAhMH3i1DS2qN+x/Yfv9hsg6QgdOCxrHA7NS22GAFiNvTl/gLM4kUQQQNrM8pPxHmsLusW8jXbzOx+x2xPUOIQ1zQjA9xUiBw4vvCoK1FFA4EQcvNDRk5BMbXwY3pHjHxObc9OTj9ytu0deEVjbVpYY8a8gKl5nyKjZIW8E8lkoDN6pHWgIZrwDa/mMy+KPrrI/arfuiZ6hqY3t4H2GHCcHRGfRtRV4WneZr4aS5Y8ttpezkyaPNBjl4a6yP3q37krAkyO/PBrHeS1XACCoAFZkAFyik20NBgVJFXOAafCtc8hCHNbOm+yP2eqJXc7mo6CIB79I/AAgBNYaB0guM4KCTAMpczprsNUdE/8nxBWJuO7n0uxkz4okNi4MScLx2JU5ioEDb9fqCqBQHiyDCS1gZ7HBbDyuaWBU8k2/7W5PUCh3EOgR9qECvQOeDsCOS5PwEM3G3h14AcBfs16IKkn7LebK5rRust1WNp6VJdkJkPBZQQlIGBdZuwfIEdEk9gylyEUxHGEzYZ03shHEGXcbe+xkt8MS4nVHsEgEBca5oCGUHgyCHvDK0EUMMSpefbsEAeC1A0TEWS03HfQb2diJAsAsttS8gE9HkQ6jbqsAKqYbBocaMGB91RDaALbgshchnHD1vNnvsHuXa6ZFfAe2ycQdBe9mvY0ZK4dnTFVn0bJn/EzA3+OXotcB8myannWVHXeygTH4bD7ogVQcJe9yEMwDA/2YeYHpUfUgAzAMJm0SF3WOmZ2Y8HCP09JONoBhgS059eGQkR7g5crmYHKDAqAOnp9gkgH+IRgJxIc1NlEU4Jp4w2x5Jxt1Q0+AjzkKYVc+LrEmJ/tQqIavz0cHzpsD10QAwUaDvHufIEbi7tuelJ2eOI4DKNtAmRBlwwhUgj+Cjbyq9JgIqylkaIvwGy8yObaTU2UUG/dy0++P3ekJSy7+4FVhYftkW/E5xBL8e1lUYxneHBEPrxLPw7NBsZgXPpRNRJg3bP9xuz3pIc52RIdX6U7wZBCwcX4WVAdoHls4G3Gan2BpLBTxzoID4sv4EHPHsR+/25MJAlTsgq3A+rDzYyahkxYJCUFneAz0+WJUKgYmtZQOsTP81kOs+Qk72TisRUidAx740IEeUCacbBACfqLxzlLhnZbgcoUcUtDlYrbEo2h4uvm0T9ztd00Wxgc5TQa8pkwCdc2Il1NsbUcmiCPE4jCiIYHYZ3RMMsYYjTX9JvuTtnoCLCP0MKHwEifbg/4Rg7RciKjBWGhOQO2xDQ4QhC5ihXFCAKwZ0p0/ed12v2G9DjZbLqKzG+iJ5YW5IfDkoZkS2xVwnNgsNIhDhFXMNhWIJ4Krq+xP3skuYIHKm09rmRgI6wAVxAngS84/eAFTCtuEDcCjekw92AQeaELd6LPcZH/Kbr8TTrulhuDJYT6AkETZgHFHhMV2iDkKnHaISZ4lT8Je987TAlSQv535T93KZnFEUD2buPitJlNIIAxaTck28VaBs1+rnm7wIKgq6gNTBG9FEHuV/Wk72bbLN3rBeAWksAvgH84eLAwvLRF54zAIcvBPsLS4EvhYgoqmHwN1XWV/+k52mxmFGvoHSpBnFRV5uGJwnwPXVtFl38GBsJ4EGcI9RIyEKKwkz9u5/Iyd7A55JtKRoNjjXAxuXNFDJuKAmbJRpyhdNB345rAN+ITmRGxlgonbnnzmTk+mhWGMYhXB25hQDrYD0rYDQhLqOhr2C7R/yMAbAldQP56et8sL8sft7HzWbt28IYzmGgtMAhwB92DFiS5ZLdEVSgIIxX5DTRZYMYIFFM8doOUEIeludvCzN7Itpwb3yEHBG2C3iJ/YZmL8GgDdy4JvnYgOfAJhHzYTrhzixOAJAfn25os/Z7cneFvOHxw9EToQ68Asxga69M7Pi8+AgFH8ETjhRXEKjD3WIXhF6PH2Lj93J/swfHjCbeFs0AScYoFch3E0CzfuAPgliZkuvD/O04rEUxZM66GX0rzF3J+3k52JVPkjf86uyHQNPirUKTpcoDREvDtCQlTVKCDsIggVoHuOUr75y8/fvUsOObgaI4r3wWxDrVeWCJsL/42H5qUWfPrCoJUgLfEH75yfwg0l4PlV9hfs1o3thCcAZkeH4UQUjsXziUfjVBFZGWwAIUIjQAsZToVzJFYE0AFqajfZX7jVk0CUZ6BHJuBKHK71ItYykAoqBlIg4w+6qHCMAieREPbABojag6648RBftFs3KstnRQ8KpyjgEGU7gdj+wg1aPBF8OOGnPbJoCOLDgfkleCZpQ3rmKvuLd+sGveK2OWqoHfoFMiYicIFwZ6I+Th+CENYVeFs9GI8z2TyOFJw5eOkq+0u2654XnTKQHA48wlGXbe6CItBRxDkADDR8GDSfU1kFHDwEJDFchUO5yv7SnZ70Cd9SYXs9eA0yBYMCVcRzZKIDDo0DQhAYRSOh/uDOQmSbDGYIPuGmg1+2k+3JGxASG/wJ+OFoMMcF9i/BFRJTQzLjpjHYU0xCG9JrPIXyDRxfAu+r7C/f7YmRScVrk11QvoFIFjoFeIxWotbRoNqEY4X3bIgn2GGvRcvmkDRJt3V/6927JOgiooQRhr5FCwzuCyIPam1wQKuyMGKYMDZ5ye6AYDn06GTGEnG6rrK/zU42LpxfweN2BRoVzh+sD6/EF+wlGxWIgPE4gqOdZBWQGqNSQTFw7+bmG75iJxvoCKmAJzngz7BRkRCQvBznHgROwMY7lsUFZQQ9GMeHB8T6gJzxare4+Ct3sj0hHywo1OlBQk75RMElmEKAO8cHrlu4CHsKssNLEDbD5hh4bJISftxs7Lfd6QluoSpwD8vPBX0O7SjKjkVlHDAWly2JQvP4aRkS4oV1hEtuCarptiffbiebNRMsVmg8MpP1gsaOgr/SCRLdBpEKFMZe46FI6EABpUbyp5DiAZXfzvy338g2IHrg5MXmHeRfSjtIALAjkHikHkgtQDPD32B3wG8hQ1l7cbiHMq+QuFfZ32H7LgktydUkhz+c0miPT/CBkIzjwoktWXYgaaGrYikD8LBXnDGYiGdfZX/HnWyiI1wJ3AwmCvCNvUt+AHyqjgeIlS0GSRwT/E14WfpogDafmxmA6nv+8jvtZMP2zekD9HSRy0rkHERssE2OtwpB43m/nMUF9galiZIBprQhhbV33uerdvvt0QD2GCaC8AscBZtBmDNEJw94FVapNGgm4VAsCIhskGhyPGVFve8cdd3uCaFMBvReghAUAsvfVoMtgOUhnQaagDoVcUw8SUgfGkkI8kCebeTD3rBP28nGpZMOFwE9B+y3B/t0OTTloAcYjSPuDxaONXFKb5ehbCOJf8gZiIqr7L7bE+FLAHyc7F5XnoeEInqeKpkiXB07PcCWQBdyAYC60Hu9BG1drEq67cnYrdsNLBXBCGpL5pi8UybeIHwQ69NxpQYcL8uNYQVMwZaJ46hRAb0c6FX23MmGuICFQMlJMnp8g4vNoQVYFphM3toilNfxAj1jxSGzF0Z5Opi4oOThVfbaybYcAY619rwoGchLgodY0IwFpJOJgcH0Ea4a62ojqKg3RVIHhgH++yb7q3eyx4I9asFBRFUIf6h115Ttj5eDzidBVfhwhKzwLDyKvC+5iAPCBjO0br7hO29ko3ZLkR7Gagw0g6WD2zsaAq1y5IaLVBlJlSTSOwTgcBRoelTBAEHRVfbXbPXEYqbg5F7Cp1255uTQLnMcQBCyM8DBUpw0D4xOsAPiGXAtOPsJ/XGV/V1264YrIgEAAJlGFRsk0wB7ZOcshwhNjzAD6LeofFhpAltABHY7EGXCwLkbP/hdt3tyiYiJlqbIFjMB1eCexP6DrXCbgBP2Fhgknga0jAeGkBCGUzrsdq/huz2Q/bgG6msffP28GqgYXvboec89t6/5uz7/hUdrPXc995q/r320nsf787jm7+s2a31x873HdWZft3nO122es5P18hNlve2Jsp4/UdYrTpT1yhNlvepEWa8+UdaLJ8p6zYmyXnuirHc8UdY7nSjrnU+U9S4nynrXE2W924my3v1EWe9xoqz3PFHWtzpR1nudKOu9T5T1PifKet8TZb3fibLe/0RZH3CirA88UdYHnSjrg0+U9SEnyvrQE2V92ImyPvxEWR9xoqyPPFHWR50o66NPlPUxJ8oyJ8qyJ8pyJ8o6TpTlT5QVTpQVT5SVTpSVT5RVTpT1sSfK+rgTZX38ibI+4URZn3iirE86UdbrTpT1ySfK+pQTZX3qibI+7URZn36irM84UdZnnijrs06U9dknyvqcE2V97omyPu9EWZ9/oqwvOFHWF54o64tOlPXFJ8r6khNlfemJsr7sRFlffqKsb32irG9zoqyvOFHWV54o69ueKOvbnSjr258o6zucKOs7nijrO50o66tOlFVPlNVOlNVPlDVOlDVPlLVOlPXVJ8r6zifK+poTZX2XE2Vdc+RP9bFwwV6qeEsJxZpsdGPJ1GUPFZv5SyGmmyFVla2NtKKqJdZoXYVJuinwVB8Lp0txZdnhW+tdhfYHifludeV5NONMcMUcKpU2ZdZYeFiMtrnZku/5fg9638ciku23JU+7EJ7GrP5QyaYKhdIcIbRi21oxuDr40epXzT7lkszw5n5/ZNfHwvRjmWBqbCuwFUHVsTOEyeqrK9UefH9VH4Jpg/3zy9Y1Yg8rObvyYZ7qY6GOAPOovhp2dRS3SuplRJtjj/2YVXU/IXRnrFc1X5tupdxd793NI5RwzbM/7GPxskfv+Rn19XuL+xJdn//Co7WevJ5bjcKuf/HD/Xlco7Drp/zi5nuPaxR2fbFevXnOTtbLT5T1tifKev5EWW+uv6T+vO4N/9aFGs5NDLUvv5oagbRxNNstpyH1tKaLs5ZeHQYmzsNnjpnPcRbbVez/ZD+UbG3wMVjd953qHGBDLeXggLZcbWu1rII5yHP5VlKx6q8z3SzIxrjVJ/uhGJY4x4gu+tDSUYcuFbZsVMDZdHO11cPqgrn1ZiarfgtH8ikUP9QA58l+KGP24GccbaWAVVw1hVZTKU63a3Qf0032ZfbhnRoMzKGCPcydqbYe9zsgu34o1viydCU1xNiCXbUu3c2sYcSj6waHsZFPM0d2Zqgs2hzN2IUJdqkGX65n5mE/lMf25mHtwDeFvbk+/4VHa31W9uadHq3n8f48tjfvvFnri5vvPa6leefNc95585ydrFefKOvFE2W95kRZV31/0iaUA++q6sSadDFb1xOPMtuKuF7b1NWkhcPpanySS8f42Kli4JBietDzYWcTHI5ZDjpjE1YJyyCpp8PZw89VjyN3NYEYTV11msfw5Vhz8SuNpnL79JRN0C2S3GdRVa76WnSe43oBJRSVZfqDs6o7+YdR2W3EZKxSfXPucnnbtSdtQvcZHKIrLGWFsZxxLmQbzOGbLYCxfERfrV1+lJxXS11369bhRrYHj3p87h/KNpip2mNOc4XmdaHXGMxYUR+tyBfmOkCTUTesclQDDHWcKaVlB0rreT4+M9d3/fA9P6wJ+qawN9fnv/Dcm+rks7A37/JoPW/ujFz37l03a31x873HNuJdN895181zdrJePFHWa06U9doTZV31/SmbgL8dRj0mmjE9h8lxstbW7sKoPhFQxVAK0B9g0ghTVrQYButbjePoHMynbIKzOWfjrW4/twHSUUuirrs+unPeWmm6Y5d787oDPXr3s2eBCV1OImx50ia4nqYuEtfg/CTQyIROMm6t9mzK6k03grJahXjMApGWCVbdjyzWaJX+lE1wRDJ9+lxTOzBSLrikm6x++toKW2KydezQ6sRWvspO6jZfnWWNTHhVH5/7N5I9jnppMTHV/AFLmE1eOavHk2JLXRVrainSqjeerRteF2QsYHBaQbfHZ+b6rh++54e1ft8U9ub6/Beee1OdfBb25t0erefNnZHr3r37Zq0vbr732Ea8++Y57755zk7Wa06U9doTZb3TibKu+v5k7FBrPcJUo7AGV2FFhBxT1/lGIQIhynFqx3MUdTIqbRE8gCzMEn/SS0pP2gQ/RiMaGdXYZAfBji38cigAgb50l82achABwb2EpBaNZkStBd4FVGKftAlTfZAKv5BZnS4EG5sdXFNS9wV1tYhJLRuzjURrMQcwWXe6ZtnaIGR5yiaYtFhwTTKScQyT40rETmska3qAaxqgk6zGga3UjN1c/L/L9dJKkRjp8bl/4z0xCTrLevWv7JlQsw42Z3pwzZq+NAGzysPdaGqoyI+NTEy1dL1sRv/4zFzf9cP3/LCG95vC3lyf/8Jzb6qTz8LevMej9by5M3Ldu/fcrPXFzfce24j33DznPTfP2cl67Ymy3ulEWe9yoqyrvj+eM3H9vv58c435X/ts1vNkzP/azb5e9+5dNmt9cfO9x3dxdlj/XTbP2cl6xxNlvfOJst71RFlXu3DVw10/Z+uyroXmCdDLeVzCS0JxYtGJ4a5+eDW7Dr2qneSh3qAlLvVI6Or4V273F3c9gC0h/sq6CJknnKJu8jso+9jgGYCYNnews1fP0eKSejGosaIueaoLWopP+kRgNoRlzg4cm92xRq9xxdrUYByeEu9aiCm8T0DvqOZJqw0oVPUSULPuGw+47QGs1nokRVYkkJ/8PJRCMSmkdLSeo2vOtwvJcInCOymPOoZLIavPn7PxsV5f38fDd/GMcOlbbBOuz3/huTfVm2dhE3ax5E6Pr3v3bpu1vrj53uO8ww6Pv9vmOTtZrzxR1jueKOudTpR11fenbIKDH7NEmiL8CtxUAtrCph/k68hzXrpJNrjCSh6C/GYPLXgroHhUAxF/7x24tQlx9UluIIHzyHQ6+DqSnurkFUDMR1FvP4LPBtV1ub6u5uPWjFrUKA7r8zROxkpBHpjYItnIlLq6ezayBCUnwv9ifSG4xiwEVh/SJGruHG1yG3WmXp+yCfx2O5xPIFdsQD6mI1NCLoS07UGmpOSoDEmBbujC81gOuAoDKzmqGz33/xE7v6lNeFax8+PcwDcmrnzlibLe8URZZ8bOb4lNMOpaYJddkP2lmmEWZBRZ/yPaiGN3asLQIfJI9rkwU05OZQulKXnPj/en8pyW31XvNcg/l4dCZjKBi9QkASZ5PhIEK8LQzQ4b5UhHHNaoS5XaG9njSPMpe0Nys0HocdhDUdM8bJrNIR1L/e+a03AAdQEbYYU51GmnWHw5pikksYJP2ht7VHiE5DS+RK2hXRPd6HNSa0U7RQp2jKfa0IEVDKwbsGaCPrL6jc3xlvD339xswrPm73c24Sn+/i21CY/5+28uNuFMW/Us7MuTsUNpLVdgMpyXI+8FF10SSfGiRuNxcE4B5zXYpGbysEdA8gp+mGn245i9PGkTLIBbBwsf3lX1s4war/GgZXytQ31W/aUxylKn5wV3b4qeNFVH1dqTec7pQQWB5EI9sC8miZsnlEgw9vBlDVQvW5bVVjsvVy02zmqWTnAW4u7JmMd0+CyjlpmrEZaQjXTTkL6DE5wtE+yEMWEEuzr88DA2x8LlTRtyzH7mW83SQ3vzzd0mPCN+40mb8HB/vjlw7N9cbcKZdu+q70/GDi3g8GYe0ZNdX0TPtQUy2D2RHz+I+okPqqke95vHktZhKQATk8S6id1+PThBpQDdX+b+1CNPzg0xRMpeVDVZQTMs6XpShjhcEHkjZxYCbD/cefZPzocyo41xcBqPS0t3tZtSj7KYIDlcJieWY3CzGGe9mjRn+GuykeTrSfrl+aYzst9o3al21WZd+ukf/G5TXEDAtDx2Ua1xfcKE+lBXiO1SVDQL+MOwi6pWeEvqir652YRnXVe0swlP1RW9pTbhzFzZ/xlswlXf/0et7Zvq6LOqtX2cx/jG1KG+64my3vlEWe90oqzHfmvnW8yhkXHQyRkXUxLRqDtSAGKSoyUxnNQj1hbi2uaBmRqTkTNxLWRVTvztSbxprLqLE2hWyao+uXrovwPwz/cYfW0aUEnKVjBQbTKH4wHBjUtj2Cdrba36TONjl+1WDd3XpTtxT2pKy0fQ4IreUgv4RO+nJhblDJCFyp7wU3E8mS8vrVjSAywTTw3lV6o+ukp6yRIDcKfm2sALmnbpnB/U0jIQ/mYW39fT8wFZGNmBqGkIR1dve2fhDJKqXTwu0pfJFrflRNv1tbLjCwEioHinJMWTcXlNeZImD9CRuah7L4ss8qTeJkT2ixyHYzems1FDEzvwzt2PrNFUT/GAnO9xmV8zG0ntrHaja3YgQBV3oQ8ltbk0SSYKSgais/LZTCe/olKkJ3PxGsOgcVdDvKJVnZN653qYlmVrqCaSadC4OvRlki9ZpFFErxDPQDH6/ji38MZ7MhDol4u60lHIYDheFxvi+TcILUXNjqxsSy6p1aD5TZdBrc6pf3B/Ms8PCxM1SzKpb/tljBL0DdsTop+1R57XWX4hQIOLcfyQNQ2GiFPl1ar/Kns3H1ADwLp3iw1Q61ZO5nSQu4FwUoMEjPPu8EvFUk5EbHMVPVKwdtg28n0Owm4+oCX7xAbWRC7JE471TACpSXJlEkZ6rwkCSfzzUoE9FK/J8TKaI/lyPOijvZsPaHQNaKi3bePYTEwIzHCCMa7WaKjs1KywZaYhgTRrrDWofbK/3MHp/n7md/MBbZYyIBpCe0Wng6PytjpqimBsqPsgOA3sNJq61UtzmsdwdJgtjNttT3bzAS0JL9QXkwT3Po1jk4GleXh7eYsO62TrbOB4J2RcLfm0QqbAQIm3cJ+ZuJ0P6JOmiulcB2KEnorGJCIJFK/RhWQc7GpJXVqxUiMeuUKmFaPCVwKE29nZzQc0ROse5Cy+3R7epATHNhLbTMSgdswWI0B2QfNHSdRpblXK3ZJ+6JrKc6uRed+NbJfUCxqyr3TP2iNHiWRlhdEj8ccbVat4jiBAnkXwjglAajd9Nr65OFBX2e+32+9Zas9KPyynGV0R41Y0XalN5TATAUmx2MSKbdc4NBMhJBo5jIn5Dfce9O+/W/fgZKOnmiAws2vxiCOjzLNkn2JramMOEZFL1ESvFnkNGNoIl3IZA3KLxT5gJ9tCtIQIpUkQo8Os4u1L2+yKvhMlkQyC79FDLGnXqG76LmiqxlRP7xuvup0P2I062JsxSsNQ6MMGQj3cZ9dEIo63LrRlzJ9XD2/RSbwMXDGJIgzO7d7Lbj6g01SAMaaSVaOTdZ7WoOO1dlwlxt/gRp01mntRSUsFP+U9NT42ksK+3x/ZzgfEiMJLxabJJ+rTPSykOBTwHH0UmRQxwKSGpmayHYcPGIG18Kp8PfSbjd3NB7SYZU1rceFoenW8Rz4JkTMggYw6JtBcWvSSDW9pYfsOAkyrISDgCjtuXNuHbmWTqWdRZPQBEh2/qWmOzmGWSAVGq1lHWTf7UEdNPnSq0g3ktS4jTsfNVn3Ybk/4vpU5TZdhUCTl3VIFHkQ4eQMS8Ud2VXMiNG+gZs0EyXaIQuTRx32GyG4+oMPqgDU4lgOv2C0HaOYDvk39uKeqWSEj+4gBTJWxBYCpoVi8eM1YMrfZELv5gEYV+Qb9GM1emkyHC8Qi268pFCxMnfIxS9j5LN4hxMOjmNh1zjxI7Cp7Ox8wo1AYEDCVGuXraJAAJckZo0ZUwhDi6r0PukYJJHVYn+GjBku3I8NzXGV/1G5PEIZ6H7z8crRRWVDQrUlss2a8oSqQkhXHGSMoE+9R+KAAlKU+4/6u3x+90xM3j5SBjboBopFxEKa9LPY41CAQCkOSc9O4vpZs4J0ae4CBhDNwIDf7vZ0PiCPBR6Ffst6482yqmnWvA3ytOadQqZqei/PXmG3cwcIPq52+1MnedNDs9ht/W3vV9DQ16faasNI1weqYIIdS2FmNIcQHRYc34+U4nsVPLRWD32cPbucDavCFcko1O/ZEA3/B3hr2ze9bSCTdF55CU3bCgpEqHqBlaOwhbumeK9/OBxT5HMaKniSXDn7QPTerOyuQVIfS7/PShl8jT4grlrrnVzzoSkVJ9qvs7XzAWMl0JY0QAD8Nf4wCBuFtDQD3gTcLQq4cfBSVnF/U/OLIp3MAq4o/vcrezwdMejXH0Q9Nax6a6w3ZLvLOHkt5tYP3i/vFzuTCk1RzjmJqckHp4abfu/mA0PYRT27AyGwC/Nmhwb/sc9fAW7REFolsQa7AcOwrb6L2RdhWgQDtvt+7+YCcR7KNSXg+GhUpwdZDxU0NKylekQIZPnNokoWvGg+AGyI6AXIB2YkErrK38wFBelZFQ8BV9tJd5tZboZGp8Yk66XVyINHxFIgXgZ5ElShubjaQI7jK3s4HJIaqGqGOnQ8lsiUgTtQi8p+VrbAtvYS4tCXyaLh3Nnto9D3KevMNZbffsx4OKA+6PHRGcj5sB36T2ACuTfY1sme9EADhgBamGK/tihKoBIL19i638wEL527kKAoXy0bI2/BhJqaEgfVJKIBlRydb1ofBWyhoAEUY0kpkbK6yd/MBMYOolwGIYQAN+1tz0YQ5zXvsWMFE3LCOSy99DjvqN2UBDyCW0RCwm63azgdUhhsW+jAEJsR2em9LQ8jaPIzmuLKtUyHUZTK9I9bqrJegf2nW7N3Pb+cDjsUhnilyzorqcFAcXK4F3RJhL6wJ244OTdweoRmOW+BxcHxi5eze9GQ3H5BoAMDQpSS4SqAlie7SlqpwBqcSLE42HKhTMJMEElkXV7BXUaNeEgbzKns3H9Alc5DAN4AI4A6hmCZ8D2AO/he1YFcC/AMBvS4oh9whKppmQliNAcKoXGW/biPbZs5lLirRgRQw3hPsJtiUGC5RifXi7olTSDnAamjiY9WocU1Zcrbc6wg/ebcnXnElUfSYBKt9LDAIvEF1LRPR6lZeBrqAHjTQyyS7wFqoSURJU+v2yfmAJPY4NFMDn5YU+yA6YJet18AFjf8k6COWjYoxVdRfFlgpATU07YLY6yr7U3f7zTty6VJNr0GgZFvBPKU3gBm5lqguCwN/AHxQpGlmu3wBw9IAjg/miu/mA5IQRWAvSUMxnGarwKdUyJGoKaZNyCXPosufvEIMNvYX0FXMYVXqb296spsPaGVhDw3ZU56GCNwdmnHPIdQtiJGnhoY0jA3ORne8CVlAbMbDzWCp7jPLd/MBOWq8FOBqWxpBREB1KfxoVrqDuntiLMupxSZYlWmxzQq6a52hYQ1v697NB7RB3grUt6ou3lfdT7U58JkXIXYtC9XL8nmHBqpB7Q0N3lQZCaQPgdVV9nY+YMOogs0ITD0yx4QLg0MJ1fNUIuJW5lJfELaclwn0SZFglEijaMbu3Z589k42rIVmDXmjK/cdhg4rTka9AT5AFWCLQMzk1QeAH9GleQuIgcBRIV26Y/vdfEC4DPGh2HmYQDTF4/jhTjSlRM/kOClCJLrlUXhKzTklbMQvWT4tDOJV9m4+IJqK0dO8T/AvdFEnlCe1B4XpkYR6TNLnQcPeqoehIHloiRQPC9gcmvt8lb2bD4gWE0Bx7BIvzl8malbsIIHUutCGLI3gdhG6ZPY3KTNP2j8d0tPu7vNgPn+vJ03za6uC9MW/zFKFVNDdGVw88ExjlQz8TNVI2gmbYnTfGv8HzL3P9vmCjWwDHBbaxncpAsOAzoj6WcI2oklNyyIew1NAjRF3Tk3kImKFFUtDE8puerKdD4gnh4gg4NGITpwBNqqrEqvCuAGMxDcawnCo15p6q/gM4nvymBxVTZy7yv6inWwCa9y1XE7R0Ghypk5AmYBP86YyzwADHQMnDcXnNJhnicpWIBedv+33dj4gR24mnKpmWBETGE6PPFvUfGiOuCYmG5WmQIQIhuuqF9uBPdC+2Bv2+ZKtDmL7YQG6JsdCLBKqa8TZOBA6MeakuvUusU5SFvC3qkBdhYKHcovmZqt28wGtDSgxngVtgyudmqOuQtep0dERiw3sh5Q+4DiUYghDmz/hn2AWTCg3W7WbD2iOIa5A+W8O4lH1VnFW0B0ZtobTA7zFuENUa7SkBsvxVTID9ULfzJvs3XxAp0BXw96LpsYaAutF8IN28Io7r1ZBptO1V3y65jwn4mw4VU1mzGCBJ+cDOvUvsRg4AytDfCNiA2ukWuQRUT/1DoLpdkSfUAZ2ajwr9iflUpJaLF1l7+YDOsjn4sWGcpzhoe0lQAHNV+iGcvFihEJyQR2XjdEhOiH4Jx8QNd7pFjfs5gOStmgui0tLmnFNNA05WqBRu42XuX7wXktP0mgl4PHi646PQehfdTKvsr9ypyc4bY1Dg902uQdNmoc00Rhn0glEEROTENXyZWomFjE9kawDMPqK2cXgXGXv5gPKVDR+H3GeXcisVyMOoRiTgVwmZAbhgHx07a8QdIK0iLWiLhlig9JNv3fzAQGC0BdD7Zk4d0ZjtKY/sIMkCjC2kQBlEPoRCIPbiIcIdKroFkAd0d19ntduPqDCJiIoEAnwkjAeNAh+0jhwQqfLeD3OLYu1GCooTpy7mkM0LMogAKhPzgfUoFuSRYP3CbnrQcqk/nrU3W2/Do0eJZawFsZmguSGqPaOwQVjGBI+5mZPdvMBZUVE8R5yPLwvzqYqQrLuUTbM9VALia4pj9CzFh8N6zu7ilSb7MstltrNB4S3VEA/YFtx4dAuxLzQdxPcHAi3dfkGpddUuxpiQVEXXxOrSkhLyH17l1+1228fNZuZ43mwbg7fhIUgVCdLAOxZ8TLgloABCIPbEdzimMEGgTj54XudX93JbhrXx6oguIjrRTGRtSMJQ37DiHsjODb45ZGAg7hPvRUiZPKp5OHi/d5s2+0JkTmhBqoFSYhuRYIqOBqBLAImHIvT7FcNaZQFhjiR1SrKAJLNBO5eZfednjRdxIeAqUSoXdH2gvR1Iv856kB4/DMAjUweKU6NutbEPdJkHKGqDipX2bv5gCjFEuOIK1A7OejYAEN1YEeJ9rAD2jIDzroYAbw1Fhnr2qHJscLxbk+28wGJc4pmJk6yUEt3pADIEdQMEiTw7cqdQXtpUm/Eb8+mfIwr+mzBu/vc5d18QF2PIK47OIJ4ccIpQUFYE/g/1FpWuhBqoxpqxQSiOsjXFI4/xwKq6z7rcTcfECSymmbUqc0LZ5Nsblc4Bm8CltCsVNhoAgaLASRE1JVmQDiA0AkrrZt+7+YDKgohIHEae0cwzafg9+Bcof8xSkJojUi/ikcJ+M5L6ykMO/Elvp6vXWV/zVZPQL1wlrz9niATyRZzZKByoTGxspw/kpbzJcCGdW0RPvaQPSRZVo77vNHdfECNXCQHdHCMqxijA93uMLuKJDk7wi5gEmVcQc75Mj4RTjZYzYXlh26x63Y+4FB3QeX2SbhyICCn4hp4dnwlBIeIpQH3yUHCbukCTam8TU4aHGTv91mPX7tbd7icX+xHY2UG2h80D9eBrS3iX6QrVff68H1kt4lDoqaHct57V579Kvvrdu8ywfPBfaIURvlO1F39CJXR5nnwGLzAQwRFwt7A91kNZidbiDkhcAu3Pfnuuz0xOBD1exS/pStM8NN4XfCPol6Mt6jjoLGhpE/6wkKAxjmma9oDi3azVd9jJ5sYNHvlcFbVKSanBUkHXaj8E4o+xOv1fGgso8ZXkmWCveene+dv8bYn33O73wBJtNXwwRfEFUYU4A70RKUXrAo4f10KLsD5QRPQCagOnWD8W7N37vF77dZNQHdoJnERniUahfEAR0ARArYhGmAklGmFneAAwB0UAs2uebfEyce682zfe7duKHI1fgF7pCK6DWcSVLdNgssRdOpexzBwA5hIh6GHw9Yhhs7nZTp/w5rfZ7tujD7xwhIZAWWMcUNDooVa5GUdQ8Ni2Rt8mRVoRF26qFBBfmG6G9b8vjvZmnmMK4GHH8CqIhsHJ9oHOSkoA9BVvdwTFcRSFwX2L6GL6zKgut/vs3y/nezLvGVyTaL6efOqHSc8tspFK2KGzBPreaRD5arBS2i+NMrj2Zj2q+zvv9vvRSLLiLIjuyyJQIchnm6pJSgJtho13l1YP2Z5HZAaiWLBFZgud9vvH7BbN7iOU01uBxczUDaiVlXSKPMga+Q1IJr0dFMUBDhC/aHbiEOVUq/3df/AjWyy+IAClK2R8STVSLYINFEEh7B26qoaxPoSbyp4IzNIZEHiEOypYov7HOAftNsTEs4vQSQsUc7Kg+JpVWpCdEqWDkBFuirVVi5rHU0/2USsQNCMe/3JD97uN7SFyJ10KbGAIgVDKpxOvFNIbkHPiWEhMG9LA+f5GrptoPKPWu/9SH7ITjZGiB22XTFNEPSp4tVIKCUBBeIylJM8DXETdJVYQ4Axr7ioXCfe59L+0N1+q5ciZiiI8lW+FhrDwIS5Q0PmYemrZtzC+GjgsidWVjVamwY0zenKtz35YTs90V1QjqWq0yqvT9vCyyVNTD7GXl6aFnyQKQbSCYurJ4olIm4Emvc51z98Kxs9doO4zjSVWSElirVsJBmdJvcujf9eCQZ+iWPhLCiIDXwNQHb3Da/f7QmmDq0IJGsqArH+QZxETguWFpSTMEuE4HwHVE9wSRaFE0uoVYzyYDdu5kfsZKMd/Co+HrIPF2BVUUUOExI6wAV6xa1YVagxpUzZFKz8UgsncuiqAbrK/pG7PbGHbqyw1aQXeFG4co4K8B7XHjlGuN82idwOOFngHNQDcTcvxKtMrdxz6D9qJ1t3ZHtVrusgmQPzA4tBnh87onIrmAGiVJIiYumTU64TrI6VUPsvqKDbu/zRuz0hmcFhIOOHsYuKPDhs2N1K/hg4LG7z0CViDeM+Kh+KRAPAwqsaq457LdGP2cg2uh1EhtVocrXy2uwAiDaD84l08Axd1xZaA4SPgq0huengS3EahC7zfmfwx+72BC7RcuCMIZkDWoDVyOLn2Bk1FOQkEbonPpxVDkWlTIQomC9cIbZq3Hzxj9vJZkUNGHmoo/NSA2aCVCjdSCil+1J8VdccvCpggPhRRRlZyXFoUA7Pzcb++O26yThx1oi6MflNZVBLVzD8EVHmoKITlGbBDcGuwiaQKFa1q+pERa3c9uQn7GRjOXq1SxqCeSb7IPpHTR1Iu8L+qs7lUkFJAC5NVUdcXf+CW+dF2Bu2/4m7d0l+B6aOmAm7tNTDCMU1uqEF0QlTCz06l5iZqtvlpNYABUZxAzxbI9a8yv5JG9msGDe2MhkeMqpdvSgwIo2jzcnISjoKWcD/cBChxmDECuhxoZrWpOMeX/7knewDjcL34a2m8pZE3H4C5pOy+xgQJ0gP1Z0vMBHeDWjX1bYWQpxQ5rYnP2W3J1ilzpGBxovHgFXk1AXiDUJ1hZdQKrh7IyhFXJ4gBesxLVaCiJ5XNW9+56fuZPPGChFAcKrowTd4JTRR9mq1VTCZZH3FG8LgL0iapiLCqJxG14T0mz35aTs9Uedgq7Z7ytkSVJFTa4BKLK9RXYgzCijA6PCnCZyIgUhJpVgkOMyDGPCn7/abZM2BkQWDYPgVULND5O28qnrhufMMqppRXVeHKRUoqYSzeCK/CDpvevIztvutUjYxojVG1d4BLQ34AL9ClIxTBD8ZAjShT9WDHdB9gRCQ6JgEYrr5hp+5XTeATEVgEERkR6bwWST3AFWs29h8mHnAeuHpsGiBU485b9g35TQ4rbfalp+1W3dVuTHodKGJKiOKToeOWHUI5jtFteqZTPKc9w1b4JS5lnXBD8Z+s7E/e/cuiW2XDlnGQwF7gGZIbopNic0yx1uNHoktINaKEimDqGep+bLPJOxuPu3n7PZk6BYXZ9hOlFbMIMCB5EgXGSDWbXYAcloHtEZU+WbFmZpF6gqPke7n8ufu1o0tVuKCDCCoGNwLriGm5MAfs3FcCXAEVeDvIAbYPWI6pwI4zI36a99k/0+7/QaRKOIAkhFpW84NSBUyF7IxgwUv7awFeYCyKx7EueGSffNwWgt/dMMnP2+3J5ihoW7bnVg6cEySbiWQ1kGSALhiN0gxmAihOHCgN+WA+CCA6/EBR/3zd+tmzRp/ACtPFjVYGBQDURoIO3m5Hpsl6AIVONJkg2A5FNOxiXrpQMWr7F+wWzenPWMys5IAuEZwzdQFOfwbW7PU85uEEREg3AGuhnVXVfNDkokJSTf9/oXb/S6J0AwKoKpZHo4qQD2SAO2YXXYctgM/E+CckAgVd5AWIHwbJMCHiiWvsn/RVnbtEOvQ3CooUAU4mBBtFu0KCskq9FMrhamyNNQOutMdLEavCfL25ot/8W5PDKYhQl+q6oaNlX0D4gDcMn5CXQgFPy91Naq2hd7AsqH6Vaztutet/5LduqF3oPY95L9qs1CbpjsGIE3PGddtACccu0CapCGwjX5gH6vKMciN5Rs++aW7dbPX4Cls/VjIhYXyS8XYh67HQEqCjSEQyqpgWSgPqHxQBLlqdVVGeW7v8pdtZHN+J7FdEYc2SFLgdVSBorpd4R4A3WT1gEqodbg3ECPkXVbrF4BPv3NKv3z7LhfpF7ICImODwl6wHpoXVMw6LjfeSU0RQsRu1I+KsJM0PTH/wPWne43Ir9jtCby/arybCbCtsNtQSOQ/SFZB5fPmyI+AvC+tqxffEBmmqpR+eAITLM5V9q/cycYBKulVs5fJdhXiGMxThdmke9hHGA9IMXirUQ4nfFxEMhHZQrPe9uRX7WQTQBlVvqqTI/S/4QUSRnaYGV7tmLiWgG7iOo4g1wPpDmG6VObZlVW6yv7Vu3dp1ekyQpU4XR4mBQ+rRnTgh9rsYgBI48pGgXyI1/hA+OewsrUKCMfdnvya3bvE/9YBNxhUyUh4gDywByA2Kr0jbhfSjY9RFLsK2AJYomIBEBeu7yr71+7WnbPcpQopMsQOQRg8DRjFsj34yoSRJixHUSaOIqq9ADlHXWCBQlRTzKvsX7db93iJPSlasnr1qmzAaU4LZhDQDbdMiobtxheILsAFEVd21SqB8u719r9+9y5JYnndXyIhDeVApAnzq4bMSSnEy62soDS1EtuEwgF7AKc9ybkeC3LyJvs37NZN/FLEmqjDJ2sDnQF2MNDQvRASCWQYFAgjDBoLECRECNsHrON91pu//I27/e7AVQtN1HXBDpvSCAIhAouYFKemFIBuVcmRt1Apv1G/JjVk4XfiuOeOftNu3Rm7FHUTpgcVHWPveqvu0h1GlexwkRBq2NfOu2VjAGFEsh53mpyaW11l/+adbGVrL6lluAHxVeQZvKjXoBoGor6JYbRy65zSrhIamy7V0ZwwnOptT37LTvZBlAM6IZmYgI5qP0HArRCVQ9nFTMO6KW8Jrys4MGEPCGxVGrRUSn2V/Vt3skscJGjhNkm8sRFwY1lxZJCCH6I2VcQP5xTkI+AeIFVwJqrjulzZv8r+bbt3yZJI8OCeNE4JA5RabOpBnSAuce5Zl6LUOoA3OdRxZ9SirXYykuZ+f+e372QHqFgPQbOkgQoKONyhqfSkq0DODsx7JkAht9GAca5FIxJe0z84ord1/46dbA1IIlpvunmpioLLlSJy/ISckIAOZKj+B+m4XB4gB4npqQoMMW94pRu2/5072WC7JJsGJUbKKxzqyE2yDH4ECtlDaaiCHGBIVK+AjfOvMUkw22plfs/V/a6NbFhWeG3cAkdZjM+6RGX4ue5VgUKMwptVKQ5cXxhk/EmAQcoAL7qavNz0+3fv9ARMgGDyzWIuj0vNjNfNP9aJIchgNt0vutTPhXnIwR8EiBy4Cky/32P8Pbs9wbzFovJlp2tTwEs4MbJg5qWTLqxGkE9mBANrVYJGgoyUkh6je1a3vNTv3a078Nnwh7xy0ge64+FAeuAJ3WggkidAhPqBP+JMhkFSHMTbARAEyfigez7t9+322weQTIZpwARm1WJ6YDimXMXORJ261IkgzIxCfmiZDpyBMnVWNvIeA/7+3Z5ARACRbCwqoQAMFqKIA7qrQSYbwQo0afEWiUwI8mFBF9CW4AJzMwmhr7L/wG5PhGEhobAS0xOWqN6bAPtielkiVsCqAZiYsbxMIJVOhgmUPqPaUt+x5h/crTurgtV08jgsT5rmQPpVIQMULfCNaI/TQwisGhhese4KkJWoygmEu636Q9t1H7q7qCFkXcm+upSnz0YkNCYF8Zkf0L20DvlD8AZ1fUSS0NV3cO1NT/7wTrYajxGoQ+qQVLBQJMqkE/p65cnReNwoqWTVsIH0iZ5WhTkgI0ZgjCG7ncs/stMTEsCQi6o8I/rnFOERVLYB3tf8NBx6vGS7lHHgg6lyu+jaZHUH1Mv93ugf3a0bc2cjeFWn2+paMvwaqRY0oRGbNCyjgUeHuAeU1ypQe2gmiUYkwIffZP+x7bvE8GHgAHfwaYjHnhJDqAy2ahheEkUA7ucFtii+BmdJ4AV1g9vu9zrTP77bE94OK4q6f7FISeO7u24otpyUMJtwPNClTTffki6IY1qxaiJmcD75fofsT+xkk9c2wuoNHhqSCyAGRIVsILYn3szk6QDfyjwaTbyJE349qmapaxbD/ez8yZ1seKqgO4AiHrEdRJRKqxGrXjrkAf7gOVTURdY3e11ZJtmpMA1KjIj+hu3/1F5PiG6t7lmycgATJ0cHCHaTQLkuMXhdicgcdQuewI1txl+SjyRmu88L/NM72QQtvYixIJ+Pw40qdTxEqLFokhGXqD7FpsuX2FlIIY4qeFNpSM7rLU77M9v9FmgoQlC6vIVpkYFV8f1Csyf5v5J1tvA4mlAWRGLrtrqqt1GbW9zwZzeyDaZhkB3tmHulnQkg+dygQU483rGqJxCIp2IiZxRzf1zSTJxQmbN02+8/t5N9qZhpTheywMAWItI1yOlIRIWBHmKppgA0FhFi4wAJHDqwWcXh0KtX2X9+u98SlVU/WHlHZC5TkB8g/MY7TN3j5Jyi42TZyH7B5ZE8grmSkud4v/PxFzayiVp0mVL90dRMgNDDqtpvKUIdGREgfbJibLcmTNpYdb0HLYGL9So3vcr+i7s94VDkpPvLGCecJjJKEOlFMAFnh0Z4tUOt6ilQZ1BbtUwshy3RhcF7nvsv7WTDwB6O1zh11wqsgxJcBlBJ0wChfIohDBNBDJprArOCFTzAXroYa24Y+S/v9oSMdmEPCDfKpd9GnKCfoYuB5DRA+SpetBiDJrOjbpO40s4ROCBa+71+8K/s3qXNytVqdbwbyEZcFx+5qYTGodO6lATnrgtfhFqEs2qkqQojXCeI5bYnf3Un+wCwNRL7ZBFlQPAITpfTiNYISRpoBKhJlH3wcvGqHGG4ToBKwcfCt97O/F/b7clS41w+OMZuYLaV7YL5go4BBZEzLUpRL10RT2zGnOoNAhYIVmHGca8R+eu7d5lVVQ6Ha0gEqD0uFCDJZ5FtMN1d9ewikHQPtks1YX6h3kdRWwbR11fZf2MnG+8V2BIIYigRAA9qTTLYyOemS3Gb9hhiKkB+59oP9B8sCp0Ncun3mvi/udtvnCPBDu7AgWXIMAJVsabeog1grjgArMRXRPCQJZhXp6pFZSjYMPcA+/ytrWz4haibtCqgBx57mW8VEPLrSpxDeMh1YPg46qIOhNSJenASQrpX2X97J1tcJmlzDxj2SpOAj3Vr0TVdmTgi7AGATumSdMkEkKlq6HyGu2m65H2V/Xd2stVfobJaoLuUWhQJ1OwSw+gJuY8DzkoFw1C06vMMvBDZnnWhF8N8W/ff3cmGw8AyY7LxhT4Sbk4yoG0IcgJdL/xVwO/qanu18haqZOgQZOStSU5eZf+97bp147k19XVjy3Myqt7MAQ8DLYAY6f3CYRK8qcMkJFhURa0uUBI53/z839/JtnCsqriDVSRFpTuWloingESIJIIq6C4lvzqF6iCUZuaj4r87iprvPu0fbGSTg1MTODX0QJru8ZBGUI8CjFwywphryOzi5JPV5ClVBxzyIU15jdu5/Ic72Zgn5SGhGg6MqEreOe/osdoHkZu/JP+ILCDJob6hDBJ6nlV1OrTy27v8RxvZ8D6QpBOOEQ2H0gbGHlENJ4D66gCiJCi+mCRmUg9RcvfQhhjmeqmau9+l/cc72RwX9Jvcv8AY0YECTHXLgaDGv6ljAeQKRrGrIwqSccFWcbeuerf7vYx/spMNv7aU2iHpoCvDWWMDY+RgaioXx7OhMspIaDAAfo+3gRG49P0lXrvXQP3T3X57lVI6DT8kJzeh1CGsIIP4bbH26qIMGxQw4zJlAFOcHeACW9CVVrlh5H+2kc07LAUmasGEGc65CAJIGrAamYvk5XQc7tqqyan65vAzujcdNcQUXb/5+X++k40tAdRzzHSLpABYRcOI8z1AfkpaiaDPMExdN8KGuiQ6jZNoYjvvseu/2O13TR1dIJHRHNmhOfrqul4J1CenC+aC0CDnMjGPWBCI6qXZ0pDCMPDEKDfM9i93+61uJ0q4tpiGBjN6XcECjsWkrgKEq0PNaTMWTJQgMHnIiIXLBpJKv8r+V7t16wKwD1n8GYhzWl1wahMOBi+hG63q1wJBQY4J0hrz0FXzj6cfGJcHvvhf7/abDAJJI+xDUg4mv1TdO1A3GJRFiI1rZ5th09GbeKGmqxJIvAcijnss9W92e0IkjeseCZNHJjF0nCfGbibFfiubdSnmRH8OlS2AOFTGAG8FBeDwxzc7+G93suGnCV4mDAREVSElc5Sqm884uxY0SIS8BjBcN9OAVGqc3XH6UBXdEFfd9OTf7fYEsgE8CbyqKlPIyoGqLkftqpxu1JNebKoAxeRCAwF9qhqdsWeQlWQprrL//XbdSOYsNFXDL2IpuKpOwrnCcDS1l4hdPd9Ud6E7ZRM/jVI63nhVZHrb7/+wk83J0D1nNDcpywJykhaGqnmB+KHLIASrYegkufU3DlkibLDkYWq7Y4j/uNsT9TcJigdQckwLzliMT9BNedIhiqd4I1MdZgDql/zfoUCgAXUF6a6y/9NGNhkyhXsNPsCS4sGQWjUk4IwTKZH6UbmJWl+gluCrqIvMWUQLwSiv+37f9T/v1j0wn5FkKOcSI50BmGRJyGfBLllNVyFdDrZIAC4AZ1dZLnDt0ktrKQN5lf0/7/Y7ehXGEndA8IPqyQgvIxJNzhHgAjgsgrZBxFsWPYvJLSpOET683zv6LzvZRpfksZ/gOzVG81VkWlH8yJ5D4+lKIXkLjueArqrkRlO4qCFcFvjwKvu/7vZE/W4mBptzg7VvYGbbh5pE6P4CxE+FNQEZmki+C55AV0zZIC3C5wfzKv/b7l3CY5BuVR3CgLtKWb23VNgIU9fVsORQHjnJ+5CCHutS8SrHBlfGsm4xyf9ltydelL+uPVpdroGdwfrze2R8qipqljrcaCBemGI+Sb+y1epJqMx9ufeV+7/uZBNuwVnljhf06itDPMUGoA2Qd9g/Zekw1p7H4eCNbk1llFbMZw7luPmG/2W3J15Ro1/Y0UTmXTeBoHbTJTiDehSZShBIGkrAsOpCHGiIxyg3Q9xyk/1/261b2fmlsmkcwtD17yIu4NKXURwnIfFU7nFmaDGr4hlVc0An665+vOcE/u872YB4FbrmNpxudhGs6nox+DWr5QIRpCO+BteKV0kY8I6lNTVoiKhqmK6y/x8b2RaK1BKAAbJntGw0XGxRBxfIS05RU/NIvCfGXTf2dG2CLBBUOZlZ1QLfZP8/d7LBlyq+hUXSffEhouQQOCMNCIV5sEMNG0yqaumCblBD9hVN81MFQPe6sP91uyfqg4WhTRh/FcFqSoRGFwZ171xOXT40cBEwAtEkKs9qjD1A05Daizc7+L/t1r1U7XBouhSxNoEZgbqFQKlFaJKEiCZQkLpXikEfDj3HEsDb8jFByTf8/f96bqeDxon6N8Pq5hHoOxniWc3LwBIR0gKNVvMaL61MLqHzwshzVCEncZg3O/j/3u0JIWNHp0inWgCg7ewnAR75EIAQHtqQ8FkqNiErQX5XjSXVpw33BJJz97re/30nGyPFuSRrlnXjXAjluByfS38TdQDliBsib6PRkqQiefnQbMTpusVyr235/+z2u4hiE6d0kDBTtEHSWb0zrakad2tkU0h0Qd2pE2aAoyGM9pjDxLm625P/7042eVzOGoBaYaALoOJQAH5gm3yZCY7XDOrsR+IVQK98pthTjDuvhNdzlf3SPx7tCc7pAAomQkxLZkd3LwbZObAfeiwffUmBs0NgLGLCpuaglpevjitEXlfZL9vJVkVJJuRTpK5uWvw82K14zh3ojVDEyp1FuF3iNY0QVycTnKmuJhz5hiHeaiPbqtz6EH+me7psIxwGmFYwEyKWtGLXoHRyxpqdimEFqnsNGMUhya7d4p233u4J+X5VqZhLbTc6YRIWFLUGGmPAVJDH+9DxVZsp8hoa1M7/ZfXcu+fq3ma3btXxwW2AkdkJ/DC6EC4lHBroAOWpu6i44KYyBa+SMGwDb4a/q+rr5tNevls3VCUWjQ0lXatrYrqBcKju2JO8CB7XgnPAwJNbBHglvBLBZ1TXKyij+52Pt92tu7NYL/cA4YLSwMKoXDVcig+nyiynOhER5mNOcBRV6XDdpVCr3OJuturtNrKNGhcpQQxXTWC51FZCDrcMjB8mhjzJpSzAyR4oxZ5k7QlFVbKEmb3KfvvdnlQ1WCCfEqCiZlOzwIKDMGp3GYtuHEHmA/2abpUV1cd3UjwG9AnyMeYm+/ndngC/jRpssgbOMXQiSSSQK1mApob5sZLawdgCXtOlIxckylQVnsJ5XNFV9gs72bxEknS6hOm8mnFOVf9cvMJSo0Zig6XrTLjIqsYKqrPB3emC0ygPOKVX7PbE6UqV+lF63jw5EqiSA5ccxC1DLoMp4gSy6RJOwdAfRpfndVuJL6PwV9mv3L3L4LzGDoIYQOtkjA6WCN5W5R8JrwVOacSaQ4WrxWjuUllojgpSSDal27pftZONeSNXQZykBqWye5y5IYAFMZM4OlioBlaA81WjPCXygwoLdE/bp3tvw3fY7cnIKmjCcChjAejAlfFJVEeYleEirAKmwFEEdS5ZeOHSIYEbnA0h1p1TevVu3ZczSBbHxoZZ8iobh/WClK3KS4VLfTPqGHXpKKlv42Us8mXoOjTXbd0vbvVERd34h656FvTtIPccsuweaVtcW8GMX4qjGgBQvVCKrper2YKqMG7rfs1uT7BOum6gBk0BNqkt1SCqMwYYpKqBw9BYHBkSfhIUMzlawKGgy7AQiVfZr92tu1lFNVm/jZvRmRniW0GZim+iOy6mVUmYrlZUEKwdviOxM+pnfDs777hdN+TkwQkhO9fkDvl13DA5RpxX1igwewgdqpiY8J48JudzqhvfJN05b3bwnbZ64vSb7tJVxukOwuryAx41VqDt1Zo56fJ7UJljV3dKXzCQ6O0w9x5T77zbE9Sgq+XOUKJSrWuIVP1KaslkIZvQiKQeGuihOjwoM627N0pCknlvN1v1Llu/Q5TtdPEbWDpVUgD7SNg0mxIN6lwKileiVXUG4FdgeoiqaFOF27rn0951awfxherQMgilOZczq8ZJja0BtgLIA+KmY2BSARUuDVrjEPGfQUNV77W377a1JwQclywWJ+boSRfpcFWSihuakYwlYSpuZugCL+93iJcgfAN6oKI3fPLuu3cJERPJASiki0qxAK2CAsvFmeYVq/gZekW9urPKxRKsDIG90sa6VHDzae+x25OlxCHhEywPBiNkxXcaGgMt7uD/iKdIGmFM7AE/C3Oqxp4gFmVgscU3/X7P3bo9KUk58zEFZY1Vs1ShA3wxPB2ZlyaG1+nah+qdVdZqpZ4LT2LrjaP+Vrv97iqlEp3RRlILJQyH+iKSg8AlB6VR1HxCzRvkbxbEge7aVdkx4PXNVr3Xbk8qUAO3pUwRb1SFuwDiimUJapgNkaSTORS/LhA+P5hUaC2D1nUX/ir7vbd2kHRCN2q1AXQXJYDPKRghsYAwpqSi1HwYK5V07byiG3DDBDrKQvT7fan32e2Jmhzz7kWGwrl1zIVTmwyVXYAjVMVGAkJFvgsagoC+6coQZ3niMjFvV9nvu90TB1NVdQyK8rmX8tpV2d2LQzMEExmj4uAOo3LRwENiwKZO1UD9eHuX77fV78N7dbTETxIKgAvB8rocqmucHPgAE4uTx9GPAxTNEeq4YfXwJ+5x93uj779bt9FYhlLJ9gPaefdsYhKtyTnXMDLyVroQsy6NQzmyqiDJoprFpth7r6YP2MkGOODSkhqUEoSprdIlrLag5t5xW0YD3OB5gVtokiDFEiLNKiohCXSV/YG7PYEBJFotaiWl1rAGIHuQ+FML1dZV8wD7pRupOFDwNElH9S5bukpxyHlfZX/Q9lx2aavHBA5dEZii8YKaZWC3gu40GI1GYMucumK2S9sl5WBBLZjQ27o/eGtPugLdCTRQY17dNSBVrq5dM6htHzlicotBXcbBXpCguqEErnOCKljGq+wP2cpWyxcI3ZdaGCJYI6kWXtSTfVRJZof3Wmq4YHRdo2iShvrlwS5Zd+9/8qHbd1mS6v8v96JltxYsPpicuEYMBcEQIEcXpbFYYn3UiroDllSdCqC56eCHbXGV7hUoUQK4UpNETetS9uK4XCOrWVdJra5+qoZT7CdRkJreqgXIvHPUH76TTSQq2wDZrc4w/H5QUb+6zBsUHm7Zauavd+tQ/ySVsOL8MWC4PmUjr7I/YiMbZo5cFo5bBktcCpk+JR6g0ICqDm6ac89/WDWmvAyJGLgedYJWiVu7YeSP3J55NjWoMcsleTN0G2AFPgTuRnXOKuFAb9Q4vnrUw08N7GAlS5mSdLODH7XFbMQYGqGAjcVcGf19vNS5z8TKQ/VosttLyOhS3UuykDQVT4JhjTd88tG7/c7oEkwLrK7HjBDfqKxe7TPAK2RikB2UZmPrm3qhNGXzDwXheOd57wv6MTvZHBsyoVMXXhM+R2lJhVBiGFPlQ0DFwGDLuKu+vapzhuopFxiMaOPeo3sbux66LQe7xeuE1NYwd0w/2sMKoRGUhxEtZAmEk4rprAJ7d+g+L6/25hvs7l3y8E5AKivLSclqhNwqyQxlTPlE8ElyzXD5pBp6FwsB8Ma7EetAV9z22+3WrUMomM5BnxBcHGohHZUEYBRfqjT1Lsi7BXWJBwo5CyLEzFgZ+avsY+uLCSthQwTetSci5KtsKEGKasqjIBU4F82DBSkqTiYzz2PIkZH9ucn223ie35tq5590Ly+TD226VqLObkW0KZGTGtziS/0AxeH8kqZgGkA4Zubeo3u3J+AG5RSsQ6lt0z1lJfW77lUTwqs7GHQ3ZBC5Bc3KhacK2itCLCLue61F3MYkaiAKKCHfDm/Sq+4pd6/HZUGdqhG7ulhL/KZDCUsBW4F/gPao9s49pi0+IQHSdANBTaTw7pNAImkyMLYEh2k02lBFSpoWdCkeAziKd1d5R773j81b/dZ16CmYc5BA1+FE63QtEpIKvN/UG5hcB2RcV0967J+uLvNJl64+3Hxa2e0Jmqd0XAf04h7IEw1IHWUq5fo17Kg7NaNNhMuQiF65wBnVvKlYlV1fZX/s9sxz6GCM1f8riZq/dAkBkiXNVSKXAzFAfqfarksTmEjD8XVqsQbYP+68z8dt+RMC+Co2MaoFmYrrgNs4N4I+IcOkeRYkWbE7HPnFy7w0tcQW8OPuzq1//E62isfUwFntrmBdSaY1vLyGbqh1WlUCgPCTLWPZZJLgYFEppxt9Gvt6W/cnvBnuEQwZNe5KbVf56D4tFQdrQLWSD4SC4k2DsrmqI7Iq/td83INM/U0HP3G333hVoVPIl6TWUcQLurSE8SdsU5MitSDEfarvqAZVG/UCUUHAUVRucZP9SW9Gv4lb0DioY7aSgEbpL7XtckVdxlF1PU1tL9SlQ7XnB0EtkZzKUm8Y4nVbXpNkBZEa9qI29bvFVxVlGaqQLJoNG6EygFrIzWuQSyF/ruZO/CGOuWGIT97JBjuCYSpno6ApeDjReKThAddYabIvtuSsDgYq/PVVNxaw3SpCncve+7N9ytZWqf305GQe6pmiM032Bp5JFRVqjkJwFl9qb135f94isa1axBVl9e490T91J5sYQcMC8ILkGY558FmVBhGstLqCLYonwFKRN8Z4qz2rDBa4nldv7nODPm2rgxC7ED8kAAmpyQVc7ggl5b2T7r+RLEFJ4MpwkiTZgd0ACTBRF21W7r07P323bs6i7rFNgszFJhunmTZIAo8kXbSpupekbrX8beneWjYaeA6JVQ+s1VX2Z2x9MaEzb0W3f0EShoyiuXTrJkEnbrA3NZJr8jTgNVhgtfojDLzMSiWzcZX9mXsOj2Ca1BDZptI1Nmwq0YI2JvKfxBSk/iFAdDkz6JruoTKLmTShxOh+wlX2Z+1kl0tniArP5jVegxSsbtrggYuy9UQplwYAKpBAcVTPK6awsI0EGu4ez3/2lpuB0sV8a/Ls0sVA3O5QDR7nWtkWDfhQ01oypYpZdbVZV8XJq1TwZrtxj5+ztbGXjrwkDwnYDl+qGhZCCiiQdCoR1SRt6Fl7Kepa/HRIuivkddHqQT+8z93GrnBfS0dC7fMUDGDPh2hYNbbPlwS4qq18uIzVHpqjAzqVfYASuueiP2+3bjANeQlMByihqfwWaxvIxwFtMXWqis/9EkCJklDOVb1pYLnI02Gdb3vy+duYhBUvdTrDy6DCsA8gVqNLD1ktIeA8eHnHqGrHpf6DhzDPQcCoXNLd73zBlnskd61rkGkt8lNRV5pIO+KPjwmNgu1tSw2Ng5IOmmgeL3fYeLdkZdd9RvEX7vkqDceB4edVLpWaRY1mASZ4OCoF20Yp/gNICngRoLNTLTkriFkZ96vsL9qt22sklS5B4658V0WEqgZz5MXxeQ7d9NXUg0H0pJYD8NiV86t2VqRm77UWX7zFEHBeZPbxX5dr1LrsCizRXHVwT1M78KGWYcdB5kpDNXQdqSpaUR/p+/3LL9nJlq8d4EsHz6oJJACnoYTZIjBIurNPhlXzBIpKAMmmQ9+JHddkQtIQNz350q2NzZeEZ1abJpaUdUF5Ek2R6HXAQLALoQSIVh4aPYUfL7rIkSCUNTr6KvvLdu8SrSO/A1y3WWUaTZQGJ8Vcho1BeOPjRJAPdWkjqprq2a/SyCPrbs5NT758tyfKj8BKE7aDQsBqFbZA97XVO4e35QBCCuxhhFX6XfwlQatoYyglc+Oov/V2v6GhpkdLoBalW7o4ylYYzTAEJkIaDKW4A/4UPkKttQ8NocM585v3HOO32e0JMSCmGBhT1IhfJY/qGVtII4FXNS5MY6tQjxjVjpokFr4+1cvwMjvuuOortr5YDQKapqThR8gMD6PLqfjiBS3a1I7GY6ByHGoMHpVLU7GF1W3ENO9cwVdu9RtuQyMep0JB0a8xQkZ0vJAIdgg9FUdALcekzDImXrhTAwR1x+Y+p+nbbu1gnSqmHbr7TQaOQ6ExBZdmLap8Uk0rH80dkShHFCFkBweNn7WWQP+2J99uq4NuiSUmEgwq3oevT6pFmBrKlLtIQ3U0KJqgAwEeySvhRTDfkM64vtuefPstp5RI7qtJDsol+0eoDgJmJ1mai5ILAULSXPcXnd4pvIS6zwOYCHhv/vI77M4lmSZvhxrfQDFkTKl2mYNiRKJWdku7wr7gSHX5EDMg00MQoGFKd4z8HbfxPM4WX5bUNVsV2lMXt8niDF1QYX+Us2ziUvJSxTB5XogJUqe+qlHEzZ58py2OBdupIeAxdbHFKz8FK61WuurENjWCGEREVookt0pnA+/BXTq8E6rcec2v2upgr7KbrF19AQn/Ad+Es8PyupyyU0SbPne5fUJhKD6SNeLB4czIIt3WXbc+rehjquMyJ9AKkVg9wwyZPY0vRvsyuTvOACl/1ekiul+cCBzRvUf3Hg8SeKm1stpZmDguYZRGR0LFEELp5j7hfHGq80Ff3OVFqMlwrqJqr7L7ljMNulOFneXNKIBSw0e4CPLwMN+C++B6p/ZeUMAgAZ6HXkMkAFUg5m7rHlt+kOQFET3JQKOutCoZ5K2CubvRtUmII0DbJMcrRXc6VgAsVyG4oPjDTfbc8shsppLO2B6YL2dE6LLsCUZeon44k7qGiAnoGv1DlrZr7A9ZZjWZuuHvtd0TaORpVbihcc26X9mUnVSPJQhGgkk/LnVzZB/RU91Xs2qCUtQwrN/7KX31FkMMng4EJtpQiVWA6h5qBhBIOS815sfIBmITXZcgEzXUmqyoRURcOI57j+4tXwU3B52p2R6DKBWeX+1hQcIoBEqEhiubrFBQ0xg8uJntiAGd7PNBH6iv2eLvKsayTc25hK8jpU50jWPBk5EPRBONw9g2dc92+kZQQy+jhv1Rlyeusr/Lbk+ScvDk9Idct3hIXU1RgblqnwiCVLPFu63qC6fMOUhDeT0g+GVi5VX2d936YrGx0+pNiV7E16pDagZcQjAfgiXAcRXTkDJaag9M5qpmKBaosnnHVd9tu9+XbgqXG88DDCWbhYcITo0sjAp+HLwYMaJICGJwgA9IVv5I+er7ur92J3vqGjeIdWI244V94E3iFVTuCTmgBmokcTnlolYUUUIiQoBDJBxCF1fZX7f1adoNDYEyRRXJBG2QR0Q2alOkBvZsKxF8I+72pGg0Btapkay69RAp32LA7761g5qKozOj4XkwS4d6ti/Vx05N4AJ5E2pBE0A8kWS78BFJF6CWQtt7n+HvsY2lQGXqDKQTDXMC26t24vMQUjH+crFVHanVZziSW9NECPjZVYM6wtzvwXzPrT0BoLFST04ISHaBnmpSo07jh+RFoWcAOpxjIHRrKpMgcoA4UExww4Pfaye7Xq7Mh9oAyTBIsHhRt9t0OY3cCScd8wr5htuNE0pCrc9kgFDXJmb/Kvt7bzk8wF9GDZ3ynVgidEJDuADKalmkXnsrA8vVBZtoTbNAVIkPc6GRcO2GIb7PFiMDUFEvDF7QJQfipPhSPQ6Bqoo0VUSQk5Bd7BgYzCDuc6rB7wRH39b9fbd8bFI2bul2LvkXgE1qbahDhPCPruoC05KoFZH1wC41HMGqh7lI8d59w/fb8hDsJbR5gsHUZTyReIeFdyhiMsR9YDvUMpDNzUnpVpyC4C7AWSnNq+zvv8XIcMXCC2Edmg9JuA1DTOAEeCYLpRzPVKkEJxQ7z8FRTZGFwdY803SPG37AFttrKl3Q7Rc4cyCnmu4fsCZ4YBQ4Kh8TdOU9kz9TR0gYtwIyP9SsyN5rcn7g1saCSmHRpBn20tNVgwScbmBqTPlqWUNNFVF44hESV/hlzSJVg2pVKV5l/6Dtu9RVURL0GotzaFCLaeVyhQxWgqeh9jMq97U0D1RlyKAYwIoaB2Oqbvv9g7e+WEOUYBWtsBL5G1XutkvmTJerdXfRqiAqy5zoAjDZfHEfuq9FNviG2X7Ibt3B6ra/2IBOokSTHNhduA2rZkVEr0M5DZB/ATGqE03RaECj1ABhxH1O6g/drVvTFIwG12SVEJDASWRDdQMuku9bkJ5Esxp/fQzd3plJcIo3iQ8y2O9bvPPDdjrIS9JFoqb6o6BxT0glZ2uV44mH2p+T0NSgw6JsB2ZFbTRIDKgytd3x4A/fYuSoXHGS49V4EzAJuS/IqRgUqoGtvIBbUod6cb8aa4eJCbpCjxG44e/Xb+MGq15HZMs5KGS0htEws87hJwMFKIOZIkiY6hHKFulSd1KNsfIki7T7bd0/Yos1D/W7ISLDm2TN4C7xMhJD08NgvIs6sPIPYqyg17JUkIMjBOppgtjNDv7ILWc6NIuIgwz1ojCaBHaA5SI5QhyIN9ekJaMaU5c66qipLt6r+1TRbePbun/UFkMQcZPBVS0WvLyu0uieftbcVQ/9Uy/HluyIgWImgTZ4bI44HCdm+D7D70fvbRWpEd4PeFJ3B/sijldbvKyGzxFilDhyqroK5rRWDdZWYywjngK7crMnP2YnuyqzGhT2cq5V+qRaUjVfj7riq2tXalNEVBR1tRvfwB/cGWxVU9+Sq+wfu9sTGEUyOAd51qn6YQJCCEZwFfxiuNSHocnY3c6eoJZR9INmsjb8NibsduZ/3NbPF80EzOKklYUHvXEasYdAboXKmnxAEgbeWj21eeeaUgu7AU+j3qO3PfnxO9m6twkBzwLBD8SW6pAKA0b2zGgYNQniLr46XHocO43L5DTA/eAKcQ23PfkJuz3RJbKlkaDqomY1VgXTeYAkCPC85reonBgWRIMGdZ2KpBQBjNf/sO43W/UTt7YKlk714rqPUVRuqzlYkBFwswBZo/olXcdnvYR8BBlV19JVUidW7J7z+km7dQ+NhFAgTRACc6QkLBThEI2srgJKV8EpDc10NhpUn9RIPqlNFybr3sPhJ28xsvgoGQ3dEOcJum7OKYpGjo1MaG5qugJugacle8dZ1QXqoev15kEt/0/ZxmmoBTmVopYkmsOaxQeSHMcvZvXVJ3chX4rNzhqzri4FlWTJIZtQ7nP2fuqbsYOTbQRqvjSRgNxOE/o9NB1LtzxlV1XY4aV6KrrQRQgPYXkpyLrK/mk72aQmAVEQAQ4mRW0fEw5RN1Xg9RCmuVKDEFTNxLBrmEjeM3YhasgeOfGr7J++jQFxJQa8bVXRopw2usemW5ECyweYst5xQ8r+q4cDO6KCjqGMunrsX2X/jG2cJpgKxwMwIFhjHxssTBya6qeCs4h3lm9OGhZ6XK4dKY9loB9V43HDgz9za78JsMlj6bJPxmwQ5eAJEHNpeofpVRUQm6UGc/Kmun7ipLbESbHc69l+1tYOkmHRqEcVT2l0oc4lMR+AswOF4TrTGybEZKcrvRniTfMN1eWzznut88/e6TdRJd4cD0wgRkIO6MNBchoXiJrjHtRQmNxCM7pMqyHPAKALdzCgo+69Un/OPk4jBYTZl35xUiBh12XQi6a6q++UUrGajazyqgljqv59eFbsJea93mT/3K0v1hxbi9ciNze7+jW3BhZT5kX/hi4gbUbkpoNIhjrxJkTTqKkuiOXe/3u33wmyjIgvKlZQX281+VqafAuKU79vpykWxWv+FGaE5zuVvXV8dSRlfNOTn7f1DeyFkHZW4ZNTO5KuYVITF8wZIqyJTtcfoj4P3gCuHRO/INrIF6f7HbKfv7Wx9nL/EeM0dAG9HhciSHc5UQ4NJAEBKK4SboQWU6sbTZtUGpgsxw0P/oI9ZjMaKjhUFGo0cLmKQTcqkFf/N2XsVXInzbecp6nxTyBcuCfM5x1X/cItPkkc9qFhCoDLoGvjhB8EZfUy120c0ElgOmwl4eYiW6ILwSpMLRpfGW9xwy/anx0Q0qVKqxUNwoBLOYrYfEJCAgajEZKXm2Q+q3t7V6m46mqI/snc3WT/4q2N1bU+MMe8TAdNal9Q1ZBcvU+c+uARbUI3XTwYbzSpvH2pZ71u7bsbHvwle2yvgdGiZHVHcly6LUdN+0x8DgB94tte98nEL2tQhlrNKnloNVnppt+/dBunRYjFyxQB0SPqih5UJN0JHRzQBEChea5TbRu75lVWzUbi0CZdSw83PfllWz1R8yugmIlglKb2fVMtOHThJuNj5C1ZsvpOkBusIR8N8ketI3jd/n4H4ZdvbSxHBsJ16lUZ3fxjj/CFSRfysaEYkayaAKtGEzGCv5QX19ScpmndN67gV2zPvO5aai5xU1E2vJVX3qsOYlOnbgqXgQ7qMVI1UaxoPMcURwSZxfbd/OWv3Ok3JI4aa0EwGgIcoe+iqW84SmwIgI0spYeM1GvELvJVNcUtl8bemix7lf2rttxMTppdCpt9qWtSiKcgO6ralP0PqsPjPCWVBJCwA58T5nq1EStkIW76/at3+w37AFoNTTO3yAZBPMNDqC7qcncqLFlZ5doEt7u7NH+anEle9hQCusr+NVu/05JzldOsCvABlqicQ0y3ulXqMrGu7gD2x+V2WdOcPMwBvD3UyPGg59Gv3XKPRIlR91VYsihHSALeH7ECJ5GDSG44qXEJ+BAKmW8rIao+SRUer9/15Ndt+UHOmFFPoOOSGsH8eYGPrtkN2g+1nJCbLGomz9ZYJSAuyRpM43HTk1+/xbFdfVmaKt86Iaq6D6n3tlrewX+QDUyqy82XQEHDhhe5KvQpqjr3wb3/37C1sZhso3FMnYBNbJdsf9PtlKQOoCw0647Q1OVsEilwj6ATQyjvVUJ205PfuOXw8I+io3FrQW2CLGzSkjVCD7K/OCN1xeT0HuoyrJdzGRycxZvde0b/pq2t0t1F3QhH0ZpqidTlkZNPQKs8ngY9jUu78Xpc4iAed8iUVFUE3vMNv3mLNUECKPNRFXeoC3xXdN/U3xAMSO5EQzogTEE/qUJOQ7OTylCenRzsfRbHb9liH4h7+FLNoSy6t1zFFAclAi/X3nv1hMvYRs07EeepHqVYYmyNxk7c7Pdv3cpmuV6Fcros5zTO8Egay0FUqXElGogqwKwh0YROasVSNcbJW5nvuz35bfs9CZoO1HVbyehKQFYXxaKUpkNthsrT2XFVEandH9EC5ryzhSoSuc9s+e1bznSR+iDJz1aCnQZnBvYr6MILrJGaCUBKqU2EJq1Dg9haQORZYxkMpui27t+x5fA6QFVz9NRHT6kPWE6OvVFtBzkzNF/NEOCnNc8i6NqKmpRmjVXTB77K/p3bGLCoSTtsAXGNpmx6tUmCDZ+6pagT6nSLNOP01BHNYl+6pj46XR6393P5u7YYYgBsAN5Dt1PJxClURyM1hNqPRWIGQ6Ve/CA0zTbuWoLmuOiqHeDxKvt3b7kZflJzXshoGI351Lhuw7mxSkRx+nAP6uTS9XzRKLrulFXP2lRNdzs7v2fLFZAtIlnsveIPJRpHhmBEGbPMYsNaW9UsK/os6noDEeRLcppi0/I9nv+9W1s1+czQBbgEOHVNWCU4UX3EVAHX5WYWlsrpIiYJUnbdKlJWZ1zNRrrh79+3k80Rge2HsdQwgqQm/aJ+1HDZdgg7FbHo1phK2JSOgvdVu8SW1d3lQVz8+7fv8qXwfMmMZrHaaK+qVtW9EuwMVyePBx1ZNc4ChZ/K1KvuDUOxbuv+A1t8AumS1OZfea+l4Q1iHoDGGutDJEhGDUjFD0wVBMEfDpmxgJNnAfd1/8HdnthLDRLhn7qz5QZ/RUhGZCrImgAYRIAgVpKzqnYbKrEByugWvKYP3mdA/aEthlCxbuAABq+MHA4iqZOkLl1h8ZSLVwpa1VBFJS9VV47iCk7Bd7/nov/w1u+gDDgs7Ika4LGFgAYFxOppXS6EQ1WNFaFqB0NXsTii5XQTjljjFl/+kd261fyT0BGWKyoPona/0P+YKllATQ2sKigk3QIvpKO74BHgTVUYb8u9buaPbvVEYSsvjv+huFld1dEQXeQks4ojIoiEL54KhHmwBxYTaoXLrQWC0Jut+mNbXGU13rf7eChTP4+upAZGZLKdYhxJiPWk9kQYdhzrEGBRTa3aoJJHv8r+47s90RyqrAFBpEqwnKVAyGT1stdElBlQFTZBGW1dQU5HzmrqSXTHwY3z3pf/T2xxFd5Kkx0hXjRPQXeuONY9kOMj2AFX+qLGQfOlG+ikAgKaUqLXbSl/x1V/cnvmNVGUzLAucUcNH1EFTdfI26Fm8ZDLKJEuwIP+NMGY3BcJKThCPgTm5yr7T219w1DXOCgBFU+pM/FBVAyfQtSh64uheIARKYdDyYgJSe01bwReWGO57n1v//SWZ0u6I9A0ejpqsIRRZluksqZ7FF3HwKCqxZyaMsKT9amix65yRcjU29n5MzvZQN7Z1Ak5OEtks4ImG5FnHLDimjiqeH9pSChBrooQusrWL6NqfSv3es0/u/UNUK7w8Bw6UDJ0BzkvzgiwBKPeRaapRkY9oEik87NJvSmyBi9BMZv7PK8/t1u309QeIypTF9og9KA4pirlsUtq+y1QkoLiHHe5/aCSJhZzaaTc7/mGP79dtwHwqeh2XprEz7ow006UpBhv8XYTxSRMEfrvOrrQctapqYhmp19l/4Wdfiu9r7ZsA0qsYGXzUPUA1nxcGspp1DzaB2QNlzKz/197ZwImSVHs8eqZ6ZmdmZ3tmT1gvRXvA52ePkdEV0W8FU+8daZnWlHBA09EbbwAwQMRPEARBQHxQFEUb1FEue/7vm/hPXk+ePLei+jtmI6OjsquZv/NNrD1fftNb1XWLyOjIjMjMrOy2E8mrzBHDh71p00f4iR3TKk4w2+y5kr8wW9+izrLH0vlTYOo+yTHdf2urzTiUOWtoSiAIG+OQn2K0ch0FpbG7U/222/+iOEi5cCv8PAHIxf4a+jkBNHI8Xz9s5E8qV3iTeT4baBynvcCoaiBw+/me3WnuG0Vzb/TbB2FTTTjR6KTR8ZrTCo0BLzAL+VTqMmLq8nLImezWGE3mmZMeCayWq40v+F3qhtzl3hkg+dQeXtI6u7LFJXxZhQ0ZMMfmaTxAt7tljfJYq+KDJwsnb/UytP2zb7hNLe/pEpGY625An8IgQb7aWCaprOK/JbiYo5fAKnyrqkLvD1EjkNP0vZ0nlfk8a6gzX1bTvfsmz9RWOBl5byTSIG/YkyOPI0a8mps8rgWqhyH8zsl1MmQR1XkJdoU7lRn5+e5mxb2GX5cTPZEPQiNUlJASZN0i/UtL3mvPXLMaAiiWKJ5X1IZ9Qhl3pR//WdvcuxnzTbnd8707KTAX+OloYIitVq8OTq/QsJ7/ZB1VBYrvMX1IodyNIZFA7Y0DrH+zT16jmWaXmu+D3iWb4MLFAbw109465Fcjj8ZVCjwi0D8gRYKjvO8MKXIH/fhl4XIHnO8byo1L+SlNOf+z3bZvHq5yt9i4K2uadSuxFtKUKec5yXC5LLOUlNVmC/zdBWNf9NMzxzvnMXjbTQbtOT7nOPG87xQbr7EY3/8iUFe1DLDS1moXad+jtfh8EfpqT3hr1rMUlxI4SWxqQMh57zps53rjg/WXyCkWJ26dXqcvIE9b+eYrSu3XKq/8rWY551Yq7x3e5W/vE51dqbKu7o111qc5/v2vKaFX52hYG2eX9/mrY6qpXI5y9Poi/zBiSxv9lUfUs/Xx5to1p66Hx79WIrTzvfsm3dioWGAad5kj1/L4C+ZUf9W4feEstNkMDQQTPPyJDENk5VI2bMl7lizNETOr5QJ+wLXvsu8Dy3FOSQ6xfXVRV7yV+C3j6Z5WpCGVrL8qbwsL65aoAqb5Qeen+ZNZBfVuM+FHrvKnxGvllgumhOloJX8cN7ongao+GvCPAUwyxtzkIOxwLuV5/L8+UsaRSZ/utx8f/4iTyf8zY76bFmB60ee366kqSxe2Veam+VWnQOS+TmyI3rQPIxEjQlNevHGcGX1juTFbr3kL1aTK89O5hx/sYo3H+FddPmTGNRxkutTpmaLd6Qt1xfF836F1CpQq0VezFI/f4k7DrHAu2xRW0SOLA8y8MBgpb79apVmBHmQnopR5f0j+DtENMJKcTE9ivxMmSczlvzYS13fngbJF3jMNMfWzJ/xIz+vRCXgz9oXKvzRuyI5MPWvMRdo7rLCQTpNmvAmCaXm+Mllrj9IVY+dSFIKPcNF3omQF04X5nNZ/hY6L1fllzsL9V0VeQ0Q+eK8vQ+/3URdv7Av93RC5aKpxQUaXqWAij8DTPrmXWRneKS4zN9E4TmC0hw5VGVeVkVD1TPsHdGkDI/3CfsK1x+cneU9/XmyhbyqYoVsY44i4WnezI9fXuY9Z2hQid3NAvmfZWqkeFUURQLUpzTnMq50dVJfDMKff6jyl4V51+lCfYFEqcrLwvgDQTTBVuWvbhGsWN/zYZ47B6qts7ml2PUqt85nebuMCm8fRzM6VLGL/DpxnvBzhQINfVQL3L5XyF5ofp1aWX7Li0Zp+P3dGfI3hX2128bO8mcyqvztLXqU/H3papm/Ll/lLzPmyL/gbzVQYMsj1LzwiOyaRrSz/NYrBRRLz/Iav63iRQ88sMbrsfiNbjJu/mgur5Qu8HjPDH/7l1qSWRqqoHnG6jxv81zg5mCuOa55retD0PBXjpdjz9CA9gLpnsZFae6oymObZEDzFGLS5AA1NxUaEaTQhdx1MhGuorznaHP/b3fcp74Wiz8NTxWffFmyFfLJOZqnWdNZmj/K8/TuLL/DTw7oTKnC328q8BbDNC3YXNd7vccuF3kzvTI1/uX5Gf5w1AzXDOoaaI5hcZbQNDzLn8uholF1muchlDn+eOAiteAzze/P3+C2sTSTQ/7T+gW9hfp4G42xFfmTdWTw7NFS7ryyh5oDngOnsIKMlD95SO5Hc8//G912MMevVubK9dKX5uov6dHgFX9dc54XWvC7hfzdrGKOGnIKl3kAlLesXqTIVO1Ne5M7XpXlfSP5FS/+DBavCeR9Z+d4MIl6NSoHPQea5p7nR16lTm2RGq0czx7RJFOpMD/RYN+s2PJT8r0l1Tw/qJ/HhhxkhCmTX9Tg63M6/zEjK1Se6en6tiE6P5HH6meg8Vd0d2uqXdZJ59qAKpO+pvO51cnHY00AWRkgaxLImgKyVgFZq4GsNUDWZkAW0lY3B7LWAlkPArIeDGQ9BMh6KJD1MCDr4UAW0lYfAWQ9Esh6FJC1BZD1aCDrMUDWY4GsxwFZSFt9PJD1BCDriUDWk4CsJwNZTwGytgSyngpkIW31aUDWNJCVBbJmgKwckJUHsgpAVhHIQtpqCcgqA1mzQNbTgaytgKxnAFlbA1nPBLKQtvosIGsdkPVsIOs5QNZzgaxtgKznAVnbAllIW30+kPUCIOuFQNaLgKwXA1kvAbJeCmS9DMhC2urLgaztgKxXAFmvBLJeBWS9Gsh6DZD1WiALaavbA1mvA7JeD2S9Ach6I5D1JiDrzUDWW4AspK2+Fch6G5A1B2TNA1kVIGsByFoEsqpAFtJW3w5kvQPI2gHIeieQ9S4ga0cgaycg6z1AFtJW3wtkvQ/Iej+QtTOQ9QEg64NA1oeArA8DWUhb/QiQ9VEgaxcg62NA1q5A1seBrE8AWZ8EspC2WgOydgOyPgVkfRrI+gyQ9Vkg63NA1u5AFtJW9wCy9gSyPg9k7QVk7Q1kfQHI+iKQ9SUgC2mrXway9gGyvgJk7QtkfRXI2g/I2h/I+hqQhbTVrwNZ3wCyvglkHQBkHQhkfQvI+jaQdRCQhbTV7wBZBwNZ3wWyvgdkHQJkHQpkfR/IOgzIQtrq4UDWEUDWD4CsI4GsHwJZPwKyfgxk/QTIQtrqUUDWT4GsnwFZRwNZPweyfgFkHQNk/RLIQtrqr4CsY4GsXwNZvwGyfgtk/Q7I+j2Q9QcgC2mrfwSy/gRkHQdk/RnI+guQdTyQ9Vcg6wQgC2mrfwOy/g5knQhknQRknQxknQJknQpknQZkIW31dCDrDCDrTCDrLCDrbCDrHCDrXCDrPCALaavnA1kXAFkXAlkXAVkXA1mXAFmXAlmXAVlIW70cyLoCyLoSyLoKyLoayLoGyLoWyLoOyELa6vVA1g1A1o1A1k1A1s1A1i1A1q1A1j+ALKSt3gZk3Q5k/QeQ9Z9A1j+BrDuArP8Csv4FZCFt9b+BrDuBrLuArP8Bsv4NZN0NZP0vkPV/QBbSVqMUjpUCsgaArEEgawjISgNZw0DWCPI5RjjWMqBco0DWGJA1DmQtB7ImgKwVQFamT211EijXFJC1EshaBWStBrLWAFmbAVmb96mtrgXK9SAg68FA1kOArIcCWQ8Dsh4OZD2iT231kUC5HgVkbQFkPRrIegyQ9Vgg63FA1uP71FafAJTriUDWk4CsJwNZTwGytgSyngpkPa1PbXUaKFcWyJoBsnJAVh7IKgBZRSCr1Ke2WgbKNQtkPR3I2grIegaQtTWQ9Uwg61l9aqvrgHI9G8h6DpD1XCBrGyDreUDWtkDW8/vUVl8AlOuFQNaLgKwXA1kvAbJeCmS9DMh6eZ/a6nZAuV4BZL0SyHoVkPVqIOs1QNZrgazt+9RWXweU6/VA1huArDcCWW8Cst4MZL0FyHprn9rq24ByzQFZ80BWBchaALIWgawqkPX2PrXVdwDl2gHIeieQ9S4g691A1o5A1k5A1nv61FbfC5TrfUDW+4GsnYGsDwBZHwSyPgRkfbhPbfUjQLk+CmTtAmR9DMjaFcj6OJD1CSDrk31qqzWgXLsBWZ8Csj4NZH0GyPoskPU5IGv3PrXVPYBy7QlkfR7I2gvI2hvI+gKQ9UUg60t9aqtfBsq1D5D1FSBrXyDrq0DWfkDW/kDW1/rUVr8OlOsbQNY3gawDgKwDgaxvAVnfBrIO6lNb/Q5QroOBrO8CWd8Dsg4Bsg4Fsr4PZB3Wp7Z6OFCuI4CsHwBZRwJZPwSyfgRk/RjI+kmf2upRQLl+CmT9DMg6Gsj6OZD1CyDrGCDrl31qq78CynUskPVrIOs3QNZvgazfAVm/B7L+0Ke2+kegXH8Cso4Dsv4MZP0FyDoeyPorkHVCn9rq34By/R3IOhHIOgnIOhnIOgXIOhXIOq1PbfV0oFxnAFlnAllnAVlnA1nnAFnnAlnn9amtng+U6wIg60Ig6yIg62Ig6xIg61Ig67I+tdXLgXJdAWRdCWRdBWRdDWRdA2RdC2Rd16e2ej1QrhuArBuBrJuArHSEYw0DWaNA1njjWiZqt7eVjd+jUbs+OJ91jf9Pb+CRMjoaUuXQeQ6o8lidyu+ocY8+d+LE+r/L6N9dk626G4jadafPWd2tdOTxdLc8atXdcI91N+robjigO21D8lvrTs6dCdTdckeeCee+VMxfycees/no5yDpM1F7ueWaPKNxc21d4//TG3iIvhqqbHlGOs9RVR6dXv/mI23OXRJ4RqNGd/ac1d2gI4+nO9s2TPRYdxlHdxMB3WXUNfmtdSfnrgHqbmVC3dm2IdNj3U06ussEdDeprslvrTs5dwtQd8sT6s7a3WSPdTcVtetuMqC7KXVNfmvdybk7+sDupnqsu1VRu+6mArpbpa7Jb607OXd3j+1uQvHkeG5t/V/uU1MrWvNMKzkHnXtfUGsth6Q/INNkDjWYvfW1inlbNv47EjXlGDFlG45aZbf3LjPXJf2rVdnGGsyMSaP76p72wdnFBSn3LfrBNA65Fuev22PQ/F/LzfqYn2pybTqbp66fkr+nJ0nXL76KyNatr7J2RVNPtu5qH37QOWfr7qgjj+cDWt31xhfP5ju1Gw83dWtU6ShJuyHpt1Z161H3wbq13Fz7B6je7X4/qHeim6T1Tvdfy1U50+bcdJ/VuxRMd7nKqCMXsF7Pjjq6Bj772Z7GUDPZSqc+f9a0S2JvcX2+9Qkk/fErmsxnrIh/9jjdFQqdyvYsU7aRDmWz/oyk30WV7TmmzdX32za3R31NTsqt/WQ55NrqqLXsUZS8XRW5u/VntN8q+Xt6knT31viYPMe48TGRbcCk17+jqN0utgu0q1o/Xv9u21U73qz1M9IT/XRvRyvNtTXqmpbfHp6NSZm67bu1HVkbu/d12LQxaTu0jY04+hkw6fXvKGramJx7W8DG0uq+QeectTGvDnp9t6TzxrbtuGmv5wU8vYbmBZLqdYeAXm159bkoCo+bhuYFrE0ObgTdDQJ0974EuosS6s7rP1OODF4bum1t/V9P1/pefV/aSTtkrknajxo/RusH+bz0GJ6Vfzzyx/Osr9Eb/7S4FN/tGLUfcm0nlfeoKYs+vH5A5O7W19BxkeTv6UnS9diPD46deOOM3Y6d7BGoc92Oe3rzTl4/MB7DtPVW181xlacni4xrhGQfdmSw+h2OSa/HVXT6fZT+TlJ2pvtpPvSYzb6B2GjQudeO2Uj6I1X8sL+JH7SPcK+M2dyDOm39vveoa1p+e/RqzMbWdy1Dv43ZiGzdjtkcGqjv2uY8OwyN2YyYa96YjZdPSv2T/481fieNw+V5af3YPn/CKdu4UzZJv8JJP+HIIXlr/a9IkLenO5v3cEx64aVN+qOdtsgy0zHlSccwj1HMUw0z45Tr3eqc1emkkz7jlCsTtetR32t1Gqd/STNYa17T/TYfQ+oasB4XWV9nmP6gpV7WWnXj2ZtOb3Xp6V7ry9ZHT89eXV1u8hl38tH1V3xl2+fpe3Wfl3HksWWbcvLMOHkKS8+dy73STuv53405PzFprun5Cf3c7OH1dVImtrHruujr9Dy5yObVEdH1xqgjLWtDVL663KIXm97a0WonvWaITzZp0mtdee2U7o8GO8in2+1MjHxpRz6vTZb0Fwfa5DWODKE2eTMnvR5/E3kyUbuO9L22/Nbe5D7P3uQZbgx7a1lPU2vVjWc/Or3Vpad7zbD25unZa5MlT6+OpGL+igz2nPXhNGubWtRSnil1jxdzZoxc405Zue2/1cQ7cp+2e32vjXck/RPUHPXtMcwo8p+VjQ9F38ORv45Iy6jT3xGI93QZtlXl/5eRdarL8kv6EVX+uxL4vl5fq/shPvrFNwq1+54/EGr3vXZYM2w91G2u6Mqrh5MmH/3MUuqf/D8Ux2jfaNY8S22HSfq0e9omaTkkb62LNQlYOm/rl63ukpVx5LL91HBMeuGlTfqpRiIvJtpM3T/oyCXlkfSbGxlsGiuDpF+jZFi70teDbgu0XDbWk/RrFdP6AJJvpJg3p5rnrI2sddJvrtKIPJmo/Vnqe3VaGZfwbCCK2m3Z2p5wvHZK+/h8DKlrvW6nWtaQqnzjbFqn79b3kjowGbXbxWpzTbNXmXy89tPrq7wxcLlX92OhfiVJG+zV79UqHy+98KwvvGWgfnfyrydimNOBuuU941DdQvjXXtucJJ+Q7XlthLYv2y9omfW9Op97UuczDsf6ppap79PyJ7VpuVf7pqG5MMkzNI4XRcnGaCZMGp23J2Mob2+tic076XifpH9ewPa98btQbBny27Q8Xnui77Xlj9OV11focXs+htS1XvcV2h5tX9HJfrsdO5Xn79Wd0HifbYe9ebOUOmfrlbY7uVevS04yx9yTNYr3YIyu2zlmkXtD5pjtOuHQHPN99X24edWm3NtzzF4+qajddseMDF4+qai1TmSUjGIfepxBGPLc9fpnPT7yzkyrXN58sL43bj54NzU+sGPjd5I1/P1S/+x88Ias4dd1c3dQ3fTWD/RL3bRr+JPWzV0DdbPbNfzeOwWhutmpDxnpYn7X6x9D/Wkn30Tkl7y1rqcS5J1xWDbvuLEM4dnxvz0DsY43pqjLk45h7h3w97wYLuTvheZbtDzeOJeNC+Lme/V9/TaG2bLOqtaqG8/edPpuxjC9+uXp2at7Nv7w5nd1Hbf+ntcG6j7MWzNty+b1+d764pCM3pqxUDsdYoVsOrRuxMvbW6dhZYkcOfV7wvW8as1r+r0GPobUtV7bdMseKLXWcofW2PHRTfysdTkZtduqHQvTbNu+euvXU+pcKIaRe/U72SEfKqlN27Hk5U567cck0d1yR26vr7R1Xu7TfYW3ltKuHTvG6Ss8exU99dsam5AO+eh2/MbGH978RWiNjfd+k/Z/9mtc8MZHtI5t34DTcaEsMr4uaj/k2utV3lpGe3h+usjNz/LuySbXprN5at9G8g+NS/dWT00/XWKYuP0pdMyo0+vffKTNuVMDfrpnp/pc3Jy/TifXhh3deT6qfT8nZe4ZiJHl+bXOso86Mlj9xq2NtPP2kv48x3f2/DYdl19g4nLtl3s+nJTN7mlzu4rLLzZ+khfD9XYfmu7rtG2v3qCuafnt4dV3KRM/hy26iMu17dn6rmXQa9d6p8Pke/mIbANRe1sQ2svnpkB99/oxL5ZIsvZz2NGdl4+c0/Xerm9IO/kwf1vTj3lxtq3fumzdrvVY6cjhxZyrEuTt6c7mHRfHC8+uIbozEMfreU6vPOMxzH8H4ngvLt9enet2zYjIE1ozYtPK/z39b8Q1gflu1wR2WlvU7ZiIrY+enr26mmQMStdfG/NoW5Z7dZ/n1RdbVzvpwq4H0nYs94465cY938Xq0lhy1H7ItdtU3nYM+nZ1rdt12lKmbtdpa/u4LWq9byOsg3HrSIuvqvKNs3mdvhfrZj1fO85H9eTz5p6tfOkovIbOrtHaolGxvDbZW68RapM7rdewexaE1muE1l3JfZ696X0S+RhS13ptb/fWuis+rL2F1l3pNlH3Z17f5/0VGew568Np1ja1qKU8ev2NNw9p14/HxTt542d6cwqheEfS7zTZZJZimFHkPysbH3rrwrS9ahl1+q1U3QvFe3qd9tZG1lVdll/Sv1SVf13jdyje8/pa3Q/xoeuhnOu3dj/ki/PRjW/ER5L3c7x6uNLkg4pj1pk4Rtuh9Y3Qa0FtHOOtEwyxdN7WL1vTJWvKkcv2U3HrOIVn10hv79RXy9T9+GZOeST9WiODTWNlkPRvVDLYddr6nkFHLjtnK+nfEvABvHXXt6pz1kYe5KRfq9KIPJmo/Vnqe3VaGZfwbCCK2m3Z2p5wvHZK+/h8DKlrvW6ndNti2ynPpnX6bn0vG8Npu1hjrul2wq5p9drPpDGcHovY2vQ5Xr+SpA326vcalY+XXq+51ul3DtTvTv71ZAzzQ13616G6hfCvvbZ5OEE+Idvr9G6G7Re0zPbdjNUqj27rvLdWw/qmlqnv0/IntWm9TiZvbFrH4lbH3liIfr++27VAdm41FCuGxmE0y+Ydt27HxpaSfq+A7XvjmKHYstMYamjdjn3n167b8XTl9RXyfDZGX9GyPq7WqptOexFYXXq698YkvLpj1+2Exua9/SK89QaeT6v3F3ms8Wm9etXbuZTux+i6HYfTc07dzDFrnUv+np76bc5JZOt2zulw1abYOSfP3rw21ZtzWmGuJbVrOefFaoOBfFJR63iffY+dDz3OoN8fsf2THh85KmbePen4gKQ/QY0PHJ1gfKDf6p+dD9Zj5BtjPtjWzfvjfPBxgbrZ6/ngTn3IigTrlEL9Y6g/7XZ+V+s6yfxuaCyj0x4RcfO7pwVinXs6v3tmwN/rp/ldT/+ev6frJR9D6lqv/T3to6ZrrbpB7jHk1a+k87t23VNoLSIfoThK7tV9mDxbvV+XratjTp7efoCS3ltbPabS2DhK73ubZJ12yKY7rdO2eWu5Oq3T1nLqseJ6XrXmNdHNxrDpZUpma9Pec9Tpk+jSe45J1mlrm1pm8vH2m0waw+h9INONC73Ue6m8vo+vy9rgSxtujyF1Xae/s1H3tC7l79AGyFktzWWrubnqXGFuYSFfmbP7PvMhz3i8B/nPlXLlyky+Upov5OZyxY75sx3807RDeg5U7htVskURvB4t+WzynLTPZvOUMlg71PaatrxGHfV8Nm03g84567OlHHkmnPtSMX+jqFXHcfl4z0HyGVD36bho3Pgjcp/2cfS9Ni6S9JNTTeaKxu9MFF/+8Q7X7fONota4UA7b/nnvPXrvM0ne2lb0vfq+ASftkElr3+GMs7NOXOF4fZSuW3wMqWu97qN0eW0f5elcp7fPyOs7vPdzJk16q1drC569Sj/k1RGR0dYRzdV1RLd9nl5s29ej72Dkk7QPOv+xqKdtcTZUVz07sO+neX6Jtqltas10cfYWere51yzr4wjf+yv52HM2H2071k51n6Hb8pxpy/U3LLx+yrblkr6s2vJioC0XGcejsD51ntYvHIopy1amLCNOWYYCZZH061RZnmnaNP0cRG6tRy/Osu2P9+5gKM7y/Hm7R4XO24tfQqyBQN6dYrwhk7e3n0mIlQrk7b0zOR7IW8u13FzT90m6fvmWh/7WhU6vf/ORNue2C/ib4wHdSV58TDq6i/tWhmaNOSxJ32kvfWuvOj87HzCm8oizryhqr1dx9eD+HMd3qqui98moXe/23VbdZiWJ43W7Gtde63t1e/1AiQ93eIDEh+/tMj60759L+g+qfnjnTfHhfTk+LG6KD5tcXUf6JD4sJmkfdP6b4sMHJqtf4tYDu4xbbR8j6Q9WfcxBGyluPaTLuNWWRdIfocpyWMK49cBNcWubXJvi1vXMXsWtx26KW1vS9nncWtwUt7bGrdJeo+dV84W5UmWulM3O5rOL+Wzh3p7XrRSK8xUSYnoxy/+d6ZT/0jqTWvO6tk8+Rhr/lzbEphde2qQ/R/Vl55l1gmknP053bSBdKuZvneGcG6q1nhuttacfrLWnl7zHau0yyrVxdU3XHT6WN/6v9aVZIkfapL9K9eN8LFP3yP2TTv7LTP4tcjvndN21rEHnnKSv74Vk6o0uOzp2qOdp+PqclU1sx65XCMVkSW1J8rExXAQs82TU3malTb7atwPqe8b7rjmybDa203lI3qM9KdtMNskz1vmPGVl7YdvWZwjFcqKfsd7oZ5qrjdiebhu8bylbOZYZGXvzjeWZac93svuvDqlr+tvSD1nZKuNAb2TM9raOrteBbgf5EH+H7eZuE4PKs/Hiaa2HtEk/sLLJlAWvXjwt7ZQes13mXJf/228R6LTWz1tmdOjpVacXmxyOKeuIKaukX9Yon/f++Ji6Z9CRK445rph23XenvZu7jUNFnlAc6smu/Xt7zot3UiatjRvj2FamOP/e/n/AudfGWKMxMmmO16facmkZkowBDTr56PqH9ulnyuXi7Mz8dL60UKku5HOdfPql/WhrzXRIX0HyFd9vMGrqZKjWlGlY6Y0P7c9KuqVv/fRG1mnrE+v1vzoekLIMmPT2d9qc21K1GbqM2k50uZP43jomERm9OG281h1rmWGNbABL5PLikZF7KJfHGjYsL4bT53Q88IjGs+E68f936R00XYoDAA==", - "debug_symbols": "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6m7mXoao71N2i/o+dTd0L0V9n7obupeivk/dDd1LUd+n7obupajvU3dD91LU96m7oXsp6vvU3dC9hPo+AfV9Aur7BNT3CajvE1DfJ6C+T0B9n4D6PgH1fQLq+wTU9wmo7xNQ3yegvk9AfZ+A+j4B9X0C6vsE1PcJqO8TUN8noL5PQH2fgPo+AfV9Aur7BNT3CajvE1DfJ6C+T0B9n4D6PgH1fQLq+wTU9wmo7xNQ3yegvk9AfZ+A+j4B9X0C6vsE1PcJqO8TUN8noL5PQH2fgPo+AfV9Aur7BNT3CajvE1DfJ6C+T0B9n4D6PgH1fQLq+wTU9wmo7xNQ3yegvk9AfZ+A+j4B9X0C6vsE1PcJqO8TUN8noL5PQH2fgPo+AfV9Aur7BNT3Sajvk1DfJ6G+T0J9n9yYe5lQ3yehvk9CfZ+E+j4J9X0S6vsk1PdJqO+TUN8nob5PQn2fhPo+CfV9Eur7JNT3Sajvk1DfJ6G+T0J9n4T6Pgn1fRLq+yTU90mo75NQ3yehvk9CfZ+E+j4J9X0S6vsk1PdJqO+TUN8nob5PQn2fhPo+CfV9Eur7JNT3Sajvk1DfJ6G+T0J9n4T6Pgn1fRLq+yTU90mo75NQ3yehvk9CfZ+E+j4J9X0S6vsk1PdJqO+TUN8nob5PQn2fhPo+CfV9Eur7JNT3Sajvk1DfJ6G+T0J9n4T6Pgn1fRLq+yTU90mo75NQ3yehvk9CfZ+E+j4J9X0S6vsk1PdJqO+TUN8nob5PQn2fhPo+CfV9Eur7JNT3Sajvk1DfJ6G+T0J9n4T6Pgn1fXJB9xLq+wyo7zOgvs+A+j4D6vuMjbmXA+r7DKjvM6C+z4D6PgPq+wyo7zOgvs+A+j4D6vsMqO8zoL7PgPo+A+r7DKjvM6C+z4D6PgPq+wyo7zOgvs+A+j4D6vsMqO8zoL7PgPo+A+r7DKjvM6C+z4D6PgPq+wyo7zOgvs+A+j4D6vsMqO8zoL7PgPo+A+r7DKjvM6C+z4D6PgPq+wyo7zOgvs+A+j4D6vsMqO8zoL7PgPo+A+r7DKjvM6C+z4D6PgPq+wyo7zOgvs+A+j4D6vsMqO8zoL7PgPo+A+r7DKjvM6C+z4D6PgPq+wyo7zOgvs+A+j4D6vsMqO8zoL7PgPo+A+r7DKjvM6C+z4D6PgPq+wyo7zOgvs+A+j4D6vsMqO8zoL7PgPo+A+r7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TmfiyQurazqdiScvrK7pdCaevLC6ptOZePLC6ppOZ+LJC6trOp2JJy+srul0Jp68sLqm05l48sLqmk5n4skLq2s6nYknL6yu6XQmnrywuqbTmXjywuqaTmfiyQurazqdiScvrK7pdCaevLBg02mPJy8s2HTa48kLCzad9njywoJNpz2evLBg02mPJy8s2HTa48kLCzad9njywoJNpz2evLBg02mPJy8s2HTa48kLCzad9njywoJNpz2evLBg02mPJy8s2HTa48kLCzad9njywoJNpz2evLBg02mPJy8s2HTa48ELa2TTycimk5FNJyObTraBF9bIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6eRk08nJppOTTScnm06+gRfWyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunUyKZTI5tOjWw6NbLp1Dbwwjay6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTp1sOnWy6dTJplMnm059Ay9sJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sukUZNMpyKZTkE2nIJtOsYEXNsimU5BNpyCbTkE2nYJsOgXZdAqy6RRk0ynIplOQTacgm05BNp2CbDoF2XQKsukUZNMpyKZTkE2nIJtOQTadgmw6Bdl0CrLpFGTTKcimU5BNpyCbTkE2nYJsOgXZdAqy6RRk0ynIplOQTacgm05BNp2CbDoF2XQKsukUZNMpyKZTkE2nIJtOQTadgmw6Bdl0CrLpFGTTKcimU5BNpyCbTkE2nYJsOgXZdAqy6RRk0ynIplOQTacgm05BNp2CbDoF2XQKsukUZNMpyKZTkE2nIJtOQTadgmw6Bdl0CrLpFGTTKcimU5BNpyCbTkE2nYJsOgXZdAqy6RRk0ynIplOQTacgm05BNp2CbDoF2XQKsukUZNMpyKZTkE2nIJtOQTadgmw6Bdl0CrLplGTTKcmmU5JNpySbTrmBFzbJplOSTackm05JNp2SbDol2XRKsumUZNMpyaZTkk2nJJtOSTadkmw6Jdl0SrLplGTTKcmmU5JNpySbTkk2nZJsOiXZdEqy6ZRk0ynJplOSTackm05JNp2SbDol2XRKsumUZNMpyaZTkk2nJJtOSTadkmw6Jdl0SrLplGTTKcmmU5JNpySbTkk2nZJsOiXZdEqy6ZRk0ynJplOSTackm05JNp2SbDol2XRKsumUZNMpyaZTkk2nJJtOSTadkmw6Jdl0SrLplGTTKcmmU5JNpySbTkk2nZJsOiXZdEqy6ZRk0ynJplOSTackm05JNp2SbDol2XRKsumUZNMpyaZTkk2nJJtOSTadkmw6Jdl0SrLplGTTKcmmU5JNpySbTkk2nZJsOiXZdEqy6TTIptMgm06DbDoNsuk0NvDCDrLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOk2w6TbLpNMmm0ySbTnMDL+wkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6bTIptMim06LbDotsum0NvDCLrLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTAptObQObTns8d2H3eO7C7vHchd3juQu7x3MXdo/nLuwez13YPZ67sHs8eWHBptMeT15YsOm0x5MXFmw67fHkhQWbTns8eWHBptMeT15YsOm0x5MXFmw67fHkhQWbTns8eWHBptMeT15YsOm0x5MXFmw67fHkhQWbTns8eWHBptMeT15YsOm0x5MXFmw67fHkhQWbTns8eWHBptMeT15YsOm0x5MXFmw67fHkhQWbTns8eWHBptMeT15YsOm0x5MXFmw67fHkhQWbTns8eWHBptMeT15YsOm0x5MXFmw67fHkhQWbTns8eWHBptMeT15YsOm0x5MXFmw67fHkhQWbTns8eWHBptMeT15YsOm0x5MXFmw67fHkhQWbTns8eWHBptMeT15YsOm0x5MXFmw67fHkhQWbTns8eWHBptMeT15YsOm0x5MXFmw67fHkhQWbTns8eWHBptMeD15YI5tORjadjGw6Gdl0sg28sEY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyebTk42nZxsOjnZdPINvLBONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTadGNp0a2XRqZNOpkU2ntoEXtpFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl06mTTqZNNp042nTrZdOobeGE72XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTacgm05BNp2CbDoF2XSKDbywQTadgmw6Bdl0CrLpFGTTKcimU5BNpyCbTkE2nYJsOgXZdAqy6RRk0ynIplOQTacgm05BNp2CbDoF2XQKWdNp+Wxxb19m79sfdERvb388Pv2Jtz+cP32iqmv84Z+o6nJ/+CequvIf/omqPiP48E9U9dnDR3+isrbVh3+iqs9KPvwTVX0G8+GfqOqznQ//RPuv5RP9tTwzkjW+PvwT/bU8M5K1wz78E/21PDP62iaZ3T7RWVxMV+FGDXdqeKOGd2p4UMOTGj6o4ZMavqDhQV3OoC5nUJczqMv5tW2xjwunLmdQlzOoyxnU5QzqciZ1OZO6nEldzqQu59c2wz4unLqcSV3OpC5nUpczqcs5qMs5qMs5qMs5qMv5tS2wjwunLuegLuegLuegLuegLuekLuekLuekLueUPY8vu731vzwP4Uv2S2Wtt79x37bj3/jXplNOh7uFvzXYePA3rvql4rbGrWFbx3DVyS/DVSe/DFed/DJcdfKL8NxUJ78MVz2Pl+Gqk1+Gq14sl+G6y1mEQ5czN+hy5gZdztygy5kbdTmNupwmezp0v4f7PIbLfnP67WfT3fs4hst+czZ7+7PeehzDZb85i3CX/easwmWf1lbhsk9rq3DZp7VVuOx5vAqXfVpbhcs+ra3CZZezCqcup1OXs1GXs1GXs1GXs1GX82vfRf9h4bL3c3q/X7p1P15zyt4y1mx7C9//7o+XbrI3MLW9/C28tX4MV/1SaS3iFp4P/sZVT4dluOrpsAxXPR2W4aoXEmW46oVEGS57Hq/CVS8kynDVC4kqXPYGpjKcupyyNzCV4dTllL2BqQynLqfsDUytzbc/2/p2vHSTvYGpDNddziJcdzmfh8vewFSG6y5nEa67nEW47nIW4brLWYTrLmcRTl1O2RuYynDqcsrewFSFy97AVIZTl1P2BqYynLqck7qcsreMleHU5ZzU5ZzU5ZzU5VzU5RS5n/Nzi8YYfm7R2LfPLRqT9blFY4U+t2gMy+cWja343KJx+v/c8rFn9P6+5dMDjA++A/PBAzw8Q3q7PcD7HzTafjrGLxzTLhzTLxwj+3Ts+c8SDdmby5q1vIX3eQyXfTpWhcs+HSvCZW8uK8NlX8iowmVfyKjCZV/IqMI1nhVeCJd9IaMK113OIpy6nLJ3fpbh1OWUvfOzDKcup+ydn2W47HJ6vlFgzYcfw2WX09Pv4ccrINk7P5t7fxouu5xVuOxyVuGyy1mEy96H2Gzc7hiyacdw3efj63Ye960fw3XfWHx6j9Zoum8sFuG6bywW4bpvLBbhum8sPg+X/d2pZbjuj+QU4bo/klOE6/5IThEuu5xVOHU5ZX93ahlOXU7Z351ahlOXk0oPDGF6oAinLqfujfDFNafujfDFNafujfBVuO47EkW47Hn8/QtCD77GdW+Er8Jlz+NVuOx5vArXfUeiCO/UcMQ7Eo/Cdd+R2OY9/Pjmle6N8FW47jsSRbjue/nvJv9BuO6N8MVzFd0b4atw3ffyi3Ddn4IrwmWXswrXveYswqnXnLo3wlfh1GtO2duyC291yN6W7T3sFh4PwmVN4Spc9Tz+s/DMY7isxl+Fy2r8Vbisxl+Fy2r8Vbisxl+Ey96WXYbrLmcRrrucfbuFP/hpZpEbvi+E6y5nEa67nEW47nIW4brLWYTrLmcRLruc0W5XQNEP5/Gp+4uN4/47Ph6Gyy5nFS67nFW47HJW4brLueIePo7hustZhOsuZxGuu5yzPQ3XXc57eF92DNe95nwervuLjatw3WvOIlz3mrMI173mLMJ1l7MI113OIlx2OdPf3gPa//E4QLq/dbwKl13OKlx2OXPdrjmHb4dw3d+BnXH75szox3DZs8q8X+XPcTyr6P5G5ipc9qxShcueVYpw3d8PPO7Lub+NfAzvsn/j2y18f/J9DJc9qyy7NSyLY7jsWWXdftJzDz++ICR7X34ZLntWqcJln6sU4bL35ZfhsufxKlz22WEVLnuVX4WrLmfbbgPUtraO4bLn8eK5iuxd4tVzFdm7xKtw2bvEy3DZ8/j+Itst3NsxXPY8XoXLnsd/dul2fD4u+wvqy3DG6yoPwhmvqzwIZ7yucpx82fvyy3Dd5XweLntffhmuu5xFuO5yFuGM5XwQrruc9/eA5jy+lSJ7X34ZrrucRbjucr57WvsoHHHN+Sices0pe19+Ga67nEW47nIW4brLWYTrLmcRrrucRbjuchbhusv5PFz216VXP6+ie1/++58Qag/+xnV/QqgIlz2PV+Gy5/EqXPY8XoXr/qRnEa77k55FuO5Pes68h/sxXPcnPZ+H696XX4XrLmcRLruco91enhj9+K6b7n35Vbjsclbhusv57mv8Ubjuco72NFx3OYtw3eV8Gr507xL3u0zmPo/hsudxb+vWcLwRdeneJV6Fy57Hq3DZ8/j+3XlrWNsxXPY8XoXLnsercNnzeBUuewXkdyfLj/dzLt27xKtw3eUswhHL+Sicupy6d4lX4brLWYTrLmcRrrucRbjuchbhusv5PNx1l7MI113OIlz1PG5r3a7yt+14la97X/7mfgs//kK6pXtffhUuex6vwmXP41W47Hm8CG+y5/EqXPY8XoXLXgFV4bJXQFW46nKW4dTl1LUnqnDqcuraE1U4dTl17YkqXHY5bbu9JW7Hn/RcuvaEbf0evo7hsstp2/Y0XPc8HrcfQtjieLGsKyFs4/7NebydZulKCBa3cBt5DNc9qxThumeVIlz3rFKEd2q47PPxKlz2PF6Fyz4fr8Jln49X4bLLWYTrSghVOHU5dSWEKpy6nLoSQhVOXU5dCaEK170Cen7ppntffnHppntffhWu+45EEY54XeWI2C3d+/KrcN3zeBGuex4vwnWvgIpw3SugIlz3Cuh5uK6EsN0b9sc4husuZxGuu5xFuO57+ffJfxguu5zFcxVdCaEK130PqAjXfS+/CNd9L78Ip77rpishVOHUa05dCaEKVz2P27oJk7b8+IKQ7H35tm78q60ex3DV83gZrnoeL8NVz+N77bqF57+/dti3TfU8XoarnsfLcNXz+M++xh+Fq14BPf/m3MM7NVx3OYtw5nLu4czl3MOZy7mH6y7n83BZCaEM113OIvwXn8ftBnGZrfE+/PMD/PLzrd3/Zt7/dPDbA/zy86K32wM0Oz7AePUDzFc/wHrxA3zAfdjFA9irH+CXP4O8/QLF/bG24wO0Vz9Af/UDxKsfIF/9AOPVDzBf/QDrxQ/whftCb/i59e35A8zx9u7gnOP5jLWb59S3/nzGmm1vf7aZHa+jvnBX6H8+u+Utu89jdmdmBzM7mdmDmT2Z2QuZ/YX7QOWzjZmtupJFNnMlO3MlO3MlO3MlO3MlO3Mlu+hKer4VNB9+yA7RlfT0e/bx6iZEV9K9P80WXckqW3Qlq2zRlayyVc/btw/bbNohO1Wfb6/bedu3fswWPZPsr++8Zbf2IFv0TFJli55JqmzRM0mVLfp8u8oWfb5dZYuet6ts0efbVbbo8+0ie4iuZJXNXMnBXMnBXMnBXMnBXMnBXMnBXMnBXMmp+m7C82vJqfpuwvNryan6bkKRLXrerrJFz9vvX9559LUtet6uskXP21W26Hm7ylZ9N+F59lJ9N6HIBryb8Chb9d2E2w/U7dnHt5yW6rsJRbboSlbZqu+5vxv3R9mq77k/f06yVN+7KbJV33MvslV/Mu1ptm3Id8psU72WLLKR15K2Ia8lbRNdySpb87zt/f777ruvY7bmedv7/ZcN93iQrXnerrJN87z9s+zMY7bmebvM1jxvl9ma5+0yW/O8XWZrXt2U2ZpXN2W26koW2aor2W9saD/+RLGZ6ko+z3bVlSyyVVeyyFZdySJbdSWLbNWVLLJFVzJuEodHP563XXQlw+xptuhKVtmiK1lli65kkd1UV3LFPXscs1VXsshWXckiW3UlZ3uarbqS9+y+7Jitei1ZZKteSxbZqteSRbbqtWSRrXot+Txb1HAos1VXssgWXcn02y8mSz/OjajhUGaLrmSVLbqSuW7XkuO94vWWLXrezrh9S2Yc35cUvc/d5/3KfY7jmUT0PvcyW/RMUmWLnkmqbNFngOO+kmMevyVF73P3eSvwace/bdH73H3dLNv9H+OYLXomWbefutyzjy/viN7nXmaLnkmqbNHnJFW26JV7lS163q6yRZ8BVtmiV+5Ftup97tttbtrWjj/iJXrndfWcRPTO6+o5ieid12W26Hm7yhY9b8/b70fzefjtuXu26Hm7yhY9b//souz4fHuqXt0U2YTXSR5kE14neZBNeJ3kOO6i97mX2aorWWSrrmSRrbqSRbbqShbZhJU8Zove574/Ebm9dzPn8U0Q0fvcy2zVlSyyVVfy3RPXR9mqK/nu6uZRNvNaUvQ+9zJbdSWLbNWVLLJVV/Jptove515mq65kka26kkW26koW2aLn7ec/T+Kq97m//+md9uBvW/Wnd4ps0fN2ka16n3uVLXrerrJVf+qyyFb9qcsiu4tm335n9J7tx2zVn7osslVXsshWXckiW3QlR7u94DB6O2aLrmSRrXqfe5WtupLvvrYfZauu5GhPs1VXsshWXckiW/S87XfFy30es0XP297WLft4m6er3nldZKveeV1li563Pe9f22s7Zouet6ts0fN2lS163q6yRa9u/O5K+fF+SVe987rKVl3JIhuwko+ymSupeud1la26kkW26koW2aorWWSrrmSRrbqSRbbqShbZqiv5PFv097nbWrcr9207Xrmr3ue+ud+yj79ezVXvc6+yRc/bVbboebvKFj1vV9mi5+0qW/S8XWWLXt1U2aJXN0W2quFQZTNXUtVwqLKZK6lqOFTZzJVUNRyqbNGVtO325rU9+KlLVcPBtn7PXsds0ZW0bXuWPVTP23H7UYEtjpfAqqrANu7fkscbWFxVFbC4ZdvIY7bqmaTIVj2TFNmqZ5Ln2aqqQJUt+ny7yhY9b1fZos+3q+zOzBZdySqbuZKqqkCVzVxJVVWgyFZVBaps5kqqqgJVturVzfOLMtX73IuLMtX73Kts1XcTimzA6yRH6q2p3udeZauet4ts1fN2ka16dVNkd2a26tVNka26kvP++rb3Y7bqShbZqitZZKu+534f90fZqqrA8+ckTVUVqLJV37spslXfcy+yRVeyyka+U9ZUVYEqG3kt2VRVgSJb9D53Wzd90ZbnMVvzvG3rBqLa6nHM1jxvl9ma5+0yW/O8vbeuW3aOY7bmebvM1jxvl9ma5+2ffW0/yta8uqm+JUVVgTJbdSWLbOZKiqoCZTZzJUVVgTJbdSWLbNWVfJ79+H7Jlu3t3cyW3Y9H2aWj/NJR7dJR/dJRcemovHTUuHTUvHTUunJUXvraeHzbSA9/+07Y//H46ujj+wh6bm/P8Xra8f2Cxz8PXz7WenxUvx91vLO4Pf6NfuVRdukof3xU5u2o4y8UbuMLf/PLb0etdTyql3/z/uCx4sp/r3Hpv/LjH7Euj5qXjlpXjnr8873lUXbpKL90VLt01ONzVNxeetr/8cFR89JR68pRj39mrDzKLh3ll45ql47ql46KS0flpaMufW2sS18b68rXRt+2S0d94b/Xuq1erHE86spzgL5dWfNuX3j25dvtqOMZu1teOmpcKrz2eV15ltL9C89S+v2oeHCUXTrKLx31hWewEbejsh+P6peOiktH5aWjxqWj5qWj1pWj2nbpKLt0lF866tLXRjvxtXE8R7W4dFReOmqU3ymPjqrPG4+OunTe6Nulo+zSUX7pqHbpqH7pqLh01KXV65c25dJrDv3Saw790msO/dJrDv3Saw790msOPa79zV9a80uvOfRLrzn0vPS18ViKKF496HnlarR/6TWH54916TWHfuk1h/6l1xyKo9qFVyr6F15zeP5KRT/xmsODZ7CXXnPol15z6Jdec+iXXnPol15z6Jdec+iXXnPol15z6LNfOurKdWW/9JpDv/SaQ7/0mkO/9JpDv/SaQ7/0mkO/9JpDv/SaQ7/0mkO/9JpDv/SaQ1x6zSE2u3SUXzqqXTqqXzoqLh01L7wCE3blOUBYu3TUlddSwu3SUVeewYZf+ry8XzoqLrwqEl96zaE4alw66sprDnHpNYe49JpDXHrNIS695hCXXnOIM685PDgqLh2Vl44al4669LXRTnxtHM9Rfbt0lF06qn6t8tFR9Xnj0VGXzhuXXnOIS685xKXXHKLPS0ddufKNSz+JEZdeFYlLr4rE42fmc95+4+T+j/ff7mTzp6Pi0lF56ahx6aiH/5Xn8re/jfn+J2f2ox78NP7MG9w3px0fYr38IR5flXzsQ9jrH8Jf/xDt9Q/RX/8Q8fqHyNc/xHj9Q7z+u3u9/Ls7t+31D/GFr6j7zyWu4cejHv71rs3efpnR2kYcjrLtymPZF84/83Z6X6sdj/IvFPZboW/Ho9qlo/qlo+LSUXnpqHHpqHnpqPWFo/x+1PHr8PEb+uVRdukoL49qx8/Lv/C1cfvNs2vrx69D7+V3Su/Ho77wtdHn/fvrQeEXvjb6ePZd6ePK97JfOgP4+t8e9c/93/7v73789ne//+5Pf92P+fQ//v37P/zt2x++/+lf//b//vL2v/z+x2+/++7bP//2Lz/+8Ic//fHvP/7pt9/98IdP/9s320//57/3NynsN/tTM997Pn3x9Nz/+/WMtv/7p//Abfymj0//27/+cOvbb/b/E5/+Hz/9ad//dOt71972/wE=", + "bytecode": "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", + "debug_symbols": "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TlfiyQurazpdiScvrK7pdCWevLC6ptOVePLCgk2nHU9eWLDptOPJCws2nXY8eWHBptOOJy8s2HTa8eSFBZtOO568sGDTaceTFxZsOu148sKCTacdT15YsOm048kLCzaddjx5YcGm044nLyzYdNrx5IUFm047nrywYNNpx5MXFmw67XjywoJNpx1PXliw6bTjyQsLNp12PHlhwabTjicvLNh02vHkhQWbTjuevLBg02nHkxcWbDrtePLCgk2nHU9eWLDptOPJCws2nXY8eWHBptOOJy8s2HTa8eSFBZtOOx68sEY2nYxsOhnZdDKy6WQHeGGNbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05ONp2cbDo52XRysunkB3hhnWw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOjWw6NbLp1MimUyObTu0AL2wjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTIplMjm06NbDo1sunUyKZTI5tOjWw6NbLp1MimUyObTo1sOjWy6dTJplMnm06dbDp1sunUD/DCdrLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOnWw6dbLp1MmmUyebTp1sOnWy6dTJplMnm06dbDp1sunUyaZTJ5tOQTadgmw6Bdl0CrLpFAd4YYNsOgXZdAqy6RRk0ynIplOQTacgm05BNp2CbDoF2XQKsukUZNMpyKZTkE2nIJtOQTadgmw6Bdl0CrLpFGTTKcimU5BNpyCbTkE2nYJsOgXZdAqy6RRk0ynIplOQTacgm05BNp2CbDoF2XQKsukUZNMpyKZTkE2nIJtOQTadgmw6Bdl0CrLpFGTTKcimU5BNpyCbTkE2nYJsOgXZdAqy6RRk0ynIplOQTacgm05BNp2CbDoF2XQKsukUZNMpyKZTkE2nIJtOQTadgmw6Bdl0CrLpFGTTKcimU5BNpyCbTkE2nYJsOgXZdAqy6RRk0ynIplOQTacgm05BNp2CbDoF2XQKsukUZNMpyKZTkE2nIJtOQTadgmw6Bdl0CrLpFGTTKcimU5BNpyCbTkk2nZJsOiXZdEqy6ZQHeGGTbDol2XRKsumUZNMpyaZTkk2nJJtOSTadkmw6Jdl0SrLplGTTKcmmU5JNpySbTkk2nZJsOiXZdEqy6ZRk0ynJplOSTackm05JNp2SbDol2XRKsumUZNMpyaZTkk2nJJtOSTadkmw6Jdl0SrLplGTTKcmmU5JNpySbTkk2nZJsOiXZdEqy6ZRk0ynJplOSTackm05JNp2SbDol2XRKsumUZNMpyaZTkk2nJJtOSTadkmw6Jdl0SrLplGTTKcmmU5JNpySbTkk2nZJsOiXZdEqy6ZRk0ynJplOSTackm05JNp2SbDol2XRKsumUZNMpyaZTkk2nJJtOSTadkmw6Jdl0SrLplGTTKcmmU5JNpySbTkk2nZJsOiXZdEqy6ZRk0ynJplOSTackm06DbDoNsuk0yKbTIJtO4wAv7CCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMim0yCbToNsOg2y6TTIptMgm06DbDoNsuk0yKbTIJtOg2w6DbLpNMmm0ySbTpNsOk2y6TQP8MJOsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06TbDpNsuk0yabTJJtOk2w6TbLpNMmm0ySbTpNsOk2y6TTJptMkm06LbDotsum0yKbTIptO6wAv7CKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbLptMim0yKbTotsOi2y6bTIptMim06LbDotsum0yKbTIptOi2w6LbDp1A6w6bTjuQu747kLu+O5C7vjuQu747kLu+O5C7vjuQu747kLu+PJCws2nXY8eWHBptOOJy8s2HTa8eSFBZtOO568sGDTaceTFxZsOu148sKCTacdT15YsOm048kLCzaddjx5YcGm044nLyzYdNrx5IUFm047nrywYNNpx5MXFmw67XjywoJNpx1PXliw6bTjyQsLNp12PHlhwabTjicvLNh02vHkhQWbTjuevLBg02nHkxcWbDrtePLCgk2nHU9eWLDptOPJCws2nXY8eWHBptOOJy8s2HTa8eSFBZtOO568sGDTaceTFxZsOu148sKCTacdT15YsOm048kLCzaddjx5YcGm044nLyzYdNrx5IUFm047nrywYNNpx5MXFmw67XjywoJNpx1PXliw6bTjyQsLNp12PHlhwabTjicvLNh02vHkhQWbTjuevLBg02nHgxfWyKaTkU0nI5tORjad7AAvrJFNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycmmk5NNJyebTk42nfwAL6yTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk08nJppOTTScnm05ONp2cbDo52XRysunkZNPJyaaTk00nJ5tOTjadnGw6Odl0crLp5GTTycmmk5NNJyebTk42nZxsOjnZdHKy6eRk06mRTadGNp0a2XRqZNOpHeCFbWTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadOtl06mTTqZNNp042nfoBXthONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk0ylETKcvLRqD+aVFY/++tGjM2ZcWjXX60qIxNl9aNLbjS4vGFHxp+Tuf2e3RMouTY/T28Xljnw0fH5w/hS9o+N/bEPr1wo0a7tTwRg3v1PCghic1fFDDqctp1OV06nI6dTmdupxOXc6/twX064VTl9Opy+myy7ksPj7v8jyHyy5nFS67nEV4k13OKlx2Oatw2eWswmWXswqXXc4qnHoe77rfKutjOf04zsvZVSffLfyjwcaTr7jqt0oZrjr5Zbjq5FfhoTr5Zbjq5JfhqpNfhquex8vwTg1XvVh2W+PRcKxzuO5yFuG6y1mE6y5nEa67nK/DU3c5i3Dd5SzCdZezCJc9Hbp/hvs8h8v+cPrj11Xc+ziFD9kfzipc9oezCpf94azCZZ/WVuGdGi77tLYK1z2PF+GyT2urcNmntc0+PtZbj3O47HIW4VN2Oatw2eWswmWXswqXXc4qXHY5q3DZ5azCZZezCF+y3+P989Kt+/mac6kOULPjI3x/7U+Tn4fq6bDt8o/w1vo5XPVbpQxXPR2W4aqnwzJc9XRYhqteSJThqhcSZbjsebwIl72BqQxXvZBo+92SR3iel1P2BqYyXHc5i3Dd5SzCdZezCNddziJcdzmLcN3lLMJ1l/N1uOwNTGU4dTllb2Aqw6nLKXsDUxlOXU7ZG5hamx8f2/oR53Dd5SzCdZezCNddztfhsjcwleG6y1mE6y5nEa67nEW47nIW4b/ucvavw788QL77AZ4u0X7f6OMBvn4D6fjpmHnjmPW/P+b5X5MujpH94S3eI5K9pawMl/3hrcJln/ZW4bJPe6tw2ae9Vbjs094qnPqWuexNfGW47NNea/kI7/McrrucRbjuchbhustZhOsuZxGuu5xFuO5yFuG6y1mE6y7neLzXb9NO4bI3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qFtfeb/1lfdbX/nnclRxNdrbnSuO3satx5o3rkb7t67oXx/13GMpj7IbV779G68evL7y7b2+rvQnj3XnurL3W/+We946atw6at466s51Zb/wmsOzo+zWUX7rqDvXDj3GraPmraPuXFf2PG4dZbeO8ltHtVtH9VtHxa2jbn1v3HrNod96zaHfes2h33rNod96zaHfes2h33rNoX/rdYCXV/R93HoOMG89j/rW6wAvr837XHeOWreeH65b/7vWreeHq752iCdH9VtHxa2jbl1XrlvXlevWdeWt1xzi1msOces1h7j1mkPces0hbr3mELdec4hbrznEldccxvmoeeuodeeob73m8PKKPqw+bzw76s55I6zdOqrfOipuHZW3jhq3jpq3jrqzenHrNYd4/sx8zsdfMt3/+PlXw2z+dFS7dVS/dVTcOurpv+W5/OOrMb9+Z38f9eS3hWc+QMg57fwQ4/0PMd//EOvtD/H8eufXfQh7/0P4+x+ivf8h+vsfIt7/EO//6c73/3Tn+3+6xze+oz5/b2oNPx/19Mu7Dvv4I1nrGHE+at56rG+cf+bj9L5WOx31nIbYhf1R6Mf5KLt1lN86qt06qt86Km4dlbeOGt84yj+POn8fPr8lvDxq3TlqHeVR7fy/a33je+PxF43X0c/fh8vLn5Tez0d943ujz8+fryeF3/je6OPVT+WKOz/L69YZYI3/7VH/vf/T//3tn7//7e9++MNf9jE//pf/+cff//X7P/3xp//41//3Hx//ze/+/P0PP3z/7//yH3/+0+//8K//+ec//MsPf/r9j//dd8dP/+ef99Pg9Zv9pObYPT/+C92vtbbf/PgWwv7PP37R2/hNHz/+d3/74Ob9N/v/rB//Hz999LE/+vDdtdv+Pw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 33e3d9d28b0..4183d270bf3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/poseidon_bn254_hash_width_3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -68,8 +68,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+z9B8B22VXXDT+TQpiBJEOCRkJCEnrn7H12BYTQe68KKrsqdlSwa+y999577xXFiqIiduy911e/9/v83q/+/tfMda577tm5Gcx5ADUPTOaZu6yzr33WXuu//mvttZ549Myfl/HPE8/+/SX3/q2vv+jRc/9cf/bNz/57e9v+mBNlbY9rjU88hjU+jnW+6MR1PnFHDx7Xel/8P8G7f8n/BGt86f8Ea3yHR/9znKGXPaZ1PnqHe4uW8ku5Xvrs966GVv9+2aPn/7l+0P/66mf+/eSdn78r880nbcST9557pvy0ufbk4vOduP79yWdlvvTxyE9X+e/weORvVx34+Lfc5N/9LNfnXtfxmN6Te8yf07783md7dOezXJ/9ssekI0/ce96jZ+U/uref1+c/9eix6pR54t7zruu5vz/XM//y68+85baeJ+597yVvef7nuH7vpXe+d32/78g/73Pn5+7r1kvvfe8uQPzEZ+U9eWdvHj06XSfjY9ZJ962ok/5/RZ188b3vveQtz/8c31ydvLsn93XyLnD9tLfcZGx35Jln//6Y7We7yn9Mfnp79WL9d5+lPy97y20/rvv24jtfu+759R28492fv/e9J+987yVvee5znnr2v19y5zl3ZV3X8dJ7P/9hz/73K5/99zvc+Z3r7z+9eP473Hv+c9a9+Nr9fXly8fNPLn5eevj+z/79nZ79Rzr0dXew2F191Z83P/vv7W38c9Xpu+fvvi16xztfP9MOvlBbdH3+U48eq208bNE73lvP/f25a4ueeHTDynd/9+nF9+76k7vfu/ucJxfP+ZaS9Zjf97G/Ty3Wunrfr1ys9al7a33q8azVXtf0zt/EWp+6t9Z3uvO96+/exzmPHj3/jD2mz/GCz9j1+U89enz+anuBOqA/98/YOy/W+vTie/fPxer9vfPiOStZT54o66oXTz56/tl887P/3sbIxWdbSy7Zm9Q3n1PowYfptmaNcc3lvDdjarX8JXVruos7MKCnEcZ9XXqO7G0a57zd/bTGpSbJPkUT8mym8vsp1i1114EVIfXpQw5z8tzsw0jhiNPeaSWbn5+7S3Gk0nIeZtpcNs/6Z0lbzfvWok2ss8ZS99BGinnuKW+jzbhP/+RiL2+yXfd2G274Wl2Q8LxF32pkL7Yx2S8f/Bi9DMvaW0ljptTGKLZuJh9Y/uUL2bYb33OyPWcf4yz73osP0Vpnwuxxd3UfIcRiZ578ZBr8d+S/xzZ7MubY71cs32W3fk/JuVKLCaYhIabi9ja3PbiRTdjMDH4PfIIcOh+lDt70bpszNfSr7Feu1h34oDZ2bWNtxaQw4p5H2MPeIk8SLkyR79tc4+57a/vYy9xs9n6ErVxlP72SnWaqnVX7tLdaiou+sk17Dm7fRmytZnTUm+jc1mfPkZgieZ9ssnXadrzLd1ntSW49dtf2tPXmHSqXTCl9M3bEUcY0o+/G9ThDjjwj8kJRHe87e7dba66yX7WQrTMRxjA2I5LjsQWD1rRS2nBh69bVEM0+Rx3J2t1xvIatY0R0lOXfdPDVSz2JbqRZtrBH9MXvu9nm3raxzzJM38I00fi0TV/T5NAivpU+0O42qt23q+x3XcnmBaHcLfc9V44RB6iOuZta2P19T9UUjqBnz43hTdfhqmOXwuDE5m0/eKhvt9pvVK2ZkceWsu9I8r2E3dhZSkwjR2O20PZ9Jhv4kd5mMHFYZ81udsvLvcr+9qv9jlvG7NgcK78fW5nZZrvZzddocjMpOrPljQ2JkddskkslspTSA//dDnvymtW6O7/mkGI57NYFM5utuzXZBR9zwtJ0jEB3JqLptiU2C7ViX9gn3urBnX2H1X673bk9oArBsdvIcDaO7jP70DhNIaQt9xowW5ysaF2xlo/aBiaFf+xV9rutZNsyHUdydt/5rJPt8aFZ37bY9479aLWWEaQZaHYpm6vVZDNLL9E7c+j3a1f77WbtO0YqsYMoDCY1Fbt13EFExZpjW2fkbbgdlbL75L/almNj1zgIhw6++0q2L7y8VGtNCaPl2EvbZFr0IF5EkojmMH9zHwbLetGggTZ6Po49zs7rVnsyYx8Rp8MGlFI8x5jVjaqTMW1paR+DlzySd/wYL6fZaXrefOCY2nrEt69f6QnGk5dpCx7Lpr2yI7vxI+Emy2BprVgMuZ0zj1wtK919cjO6iB3yGNCr7PdYrdtgpNDUUBIG1WzDxsjXSjWuYPr92HFhLQdWa/CPG4ageZbReAd9+GPdb1itu9ggNxW3uGOzat9a9R7zj0mN7MfOc3PeHB+kcYKH37GFfJGdmjON4+y8cfUu+SH+z5i2YSsCSg5SwFAYbGjODpcw8HgjNZwn5zNkjhJKaaT2xddDv9+02hMcfMSm7HiEsZXECfEZdIAzjhMP4zi2ePue2SGeqtNqyt5weda55g/Z77naE+Myrw8XmPPECO2c9+ljDzgKXhv7wVtzM3fLD2FNgD4OiLRljAA7lq+y32u57rZx0qfDec0ROJodoBPb2HdeAQrBeQ21NfQD22swhaPgTngxw2+xHP7yvVf7PSOgip3EUuO42fGdd8V/2G22GLfpJsrIseoeNN5MKLFx5HEbABZcxlX2+6zW7SfONpuMsbbY/Ij5SLgG49GDjleqnPe9YN2ToNuoZm78Fx9ioPg+XGW/72rdG6hvN0kmGci54QdDaR1DW73lJexYLJBfS6MDO0PkOGZMpU2AU9DHIfv9VrIxnD5scQuxgxR2WaF9x8ldEBkHvbatJc+bBAxlM5pprXGO2WtARzxkv/9KT4Axc8OIanNG2Tt2xHnsUgJWoPyBg14BGLW4Mj2SXU+Z92AEI/ZYr7I/YLVub3r0sbSWOG4AptRTAQBGu+146JAx574P50MZnFAwr0+V97LXPe+1HTr4gct3GVoXzGzoFlDK4ZULerBtoO1uQd3oPwEA7hOcmLcSczd72UuwDgdxnPkPWu2J5ydrmfjv7EcBWHFEjcAsZ1wQNAZZph0P0vkJh9YkdDIMk/fYwuF3Pni1J1o0cC1itDb2OfCQzXrt9MCMbLscNCZ3uNKcSzvxisF/8h98JfjDN3zISnaaYBIcVMT6EZLIbU4DnsBRBCIQzB0aY3uPWMLpB+kiXKffCH4mgOnYkw9d7XcI1e814A+IMfAzIXhjm9TNFYwirr/WDdQSeAzuDTjFi+TkYo/B1AeG+LCV7K6fdI1jE93Oah2go+MhAmZusxh33m8Ha6aWsIVlxwjgtAEuTrHD4Xe2lWwipI1QQDvscm064B3ZJrMlW/WzcugDrwL/0WdEf6xMyWC/fAv5wINmtd/6ua6opo68h9Cxhw18nFBtDCJ+tzmej3PkmIN6pJr6jLPgZ/1Nv+3yXQK8RwH8DeIm8CYKTLg5PLGjQLKRNQ8uNJBV3V3BNfNFcEoA3vLprrL31Z44R1DMeQdJEaQiZseGA/gwYnxmwCX+q2K1gJoGlISJJQbge8no5Rxn3i1kb5gqjKWp++55NYO/AH7QFuxqD84S9wRiG05TCM1sBdTS2XeM5+wjpMN++5XsQtDBO8F722FniABMjjk6FmRTQTpE5GgO8TieBlSa9ANA20K0zqe4yg4r2ZXVWhdtzcSnfiKoEWEbEDz+dwBFwLNWhxSvvXeHpenYG7wZ8JmXdZUdV+8y6Pxlq3ODE9hNsxsvC/A2ccHE+GXaao3HpAjOTqwP0AsjNHrrezhkp9W7nILWUAVEq0YuC3xg8YtdXMSoW52BeLzKXIP/iA9RPOywBxH41sOBY/Nq3RAiOmGGA5N5TzFsoYIKk/M4HZCOaWhmJWaYfiNSw07FAJEAAWIN/3eV/eGr/Xaz7XXGANAhdOTwxYirJ1IiDJatTvKmfipWzUTLGxEh3AwfjSiDQ3CV/REr2fz2lLmaaLPnjKBiIW7oN0ieoFARA+4iaJUB31vZm8D5dJxPRV9X2R+5ki1PCHgARiS9KAIZjiLOAh8NJOMAohQ8qnX2xYOoWW1HtKJ+QO9hY7/jSjbRBh7QYoQI7HEk26boeDOcHiJ6QkscaeiKm0EsBqvT+0YcpNCcJx429qNW77LxvtGE0GsWiArQDJAv7G4BO9jEiy3W4YK626qBU2owIJl3DmdBkHjo4EevZGN4qrAD78zq4+IbOMobIQpghI3AQXgsNxAQ/4AZ4+zosKehENcfOvjm5bvMfh/4c8s/hGKbF1ApRPkE2RkcC0EGk0XcAMjMDv3p1W2+EJHyOzc9+ZiFbNwe5AKfFOaEgF7BCR9+NLE9nrz1hInAR/AeEOmAEAGKArMGWIL8GIef/9jVugnzkgAxr8oFRTlwJLbk5IA3DYbGBmAyBguqoCl4rjmAyPHUw3E0Dh38uNV+A3aa5RjifKYcJlEYtIm3+vz4swEBxidJFaseQW8VPkWnHS8F3LjZ2I9f7jebDQ2DKyccSLhuqB4/xYWh+ZxAnBInHZML0LBWthaXR6zGGeNYHTr4Cat14+iBUFAYEBmGyPjyxvgK9rx0RbYJNtPK3wW2urM7RM0lsGkg5u3QwU9cvUscrYcDUBjpSodbK2yoQX1h1rC/s5fOvhPuV+IE3vUuvq25ilZiLI748pNWslk1gLgTQIpT8pzrjhg8Mie2AZnZNMgZLG6XFSPSLMRrHDReFGf3kP3Jqz3pfsSCZchAYUwbngr5nBe0vXnChcZ2EOwDukecUs2NsJbAauuwWbez8ymrd0kg1xM0AWsjhhH0y9hnFBwMm7B7DRBUxPmyRcYDXirhQiV+jobY6vDzn7paN+xksluysC6EklBq7DmxSAP4iG2YJQMUC28AuEsICxYS/8DZTXBW27HuT1utGyUzAnd1yqsTVw74RYVXoQrFwbQFYhT+CzAQd5CFhUtQpJ/R0Bv+/vTVu8Sh7+h0FMm2RyIySwC48xrAT7HX3hQ2s0swtV20Ka8gCSGi2zAIh35/xlI2ZhmE5uqG54XY5h12zifuTUqHqsH2oO4cbyggoIXfMtYlAEgbCnvw35+52u+h4Ff6AB0Gnsq2N+CBJxZ0rQjhwkyBhsaFdIcsxNZwOvuu3QNvXGV/1mrdYASI9K7QuBLVw86zR4RqYDTyDoSpaDJpjSz+VDytDjHENrkOfKk57Mlnr2Rj4KY+n5AUaCaTX+D1O1IwTtB8L0ZfGADnlHeHFkHRwMpEOI96B39/zkpPZL2B1ABwqBYia3eJ/3DLaDIBE44T4kAxA866Kx+wwYAFFKqx5/PQk89d7TfIBq4SHAioh/ZBGYxCek5G32VZK0EPMPfCIZld7JjoCF6xh927xcWft1p3GQJkeNsQ+IjkFcAhILLII4jweb9bJLND3gUjOz14w3vYAwJ+yGQorKvsz1+tO8g3zgCYhXfFo+NmofOARLDGDZfmRO4K1rsKWQ+xNQnaemEbMfXp0MEvWK2blFTls09MLaoIOICHgCbGi0p9wFKw6XCysiUKhSGECY7hweHlYJePPfnC1bphKysLRlWBNxgg3A7MaKhshQXjg+SJZwE6gPr9QnoDDb0hZrx470NPvmi1bv0epnATQ4RZxfNALLHRcOkd04HLxV6BQndwJxYnB6xV3WwvMBHp5i+/eCWb00ZkCsurcIywinQIrB4BrSN4yIUIeSP+4InkNKBBJlwE4QXUunxQPPz8d1rIBiRwCHZyfzBiQE58HNiaqAPegF0GbkmBSEGAl7V1JDV5K5E3VIlZ6rjmer/zHdn38+Rfcufr5+WlvX2hefLr85+6t9bHlSf/knvrub8/9/PkX7pY69OL793PbX/p4jlfunjOStZTJ8p6pxNlvfOJsl5+oqxXnCjrlSfKevpEWe9yoqxXnSjr1SfKetcTZX27E2V9+xNlveZEWd/hRFnvdqKs154o691PlPW6E2W9/kRZ73GirDecKOuNJ8p604my3vNEWe91oqz3PlHW+5wo631PlPV+J8p6/xNlfcCJsj7wRFkfdKKsDz5R1oecKOtDT5T1YSfK2k6UZU6UZU+UtZ8oy50oy58oK5woK54oK50oK58o68NPlPURJ8r6yBNlfccTZX3UibI++kRZbz5R1secKOtjT5T1cSfK+vgTZX3CibI+8URZn3SirE8+UdannCjrU0+U9Wknyvr0E2V9xomyPvNEWZ91oqzPPlHW55wo63NPlPV5J8r6/BNlfcGJsr7wRFlfdKKsLz5R1jX/8tB9MnL8JL9I3FYS9qRJq61xayqL3cm6kfIiZUVKzBTybjtpmDl6DelyAU03NupD98lsJptq49CVneJ0ywuh7VKal7uqMJTa6d04w9N6Hz3Y7Lba+thqj9E8dJ9M9bHWkPRMoexz37euWt/gXdjTFnwbofWYSY41X/fo992SD3aDnyjkxku8f2fwumd39+sun/+tcd/y+vyn7q315PUceaSX31vP/f25n0d6xWKtTy++dz+P9IrFc16xeM5K1lMnyrp/33J1/0+3qJwZ5ITR3q2RmiS9TDbcobjkhVvWbbSWZ699kLH3PbTgSB13XT3cb3dqVvf/yIU6k1HbtlnVpnH8UiS3v3NwEKB0fY9koVOL5OvdZjmduzGBjLWZZHYfuv9nYiCrrhPoS9+sT7bEjbz+lkqYPee++TiMam8HqfMaVB/XSYK3NIbNxlzf8d37f/fPx938zbfG+bg+/6l7a31c5+Nd7q3n/v7cPx+vWqz16cX37ucNX7V4zqsWz1nJesWJsq569aAO17zVqhKvpuu8+XI/MPaGo0h2qO51C6WivLrM5WKN2ZS81+jGHuL+8B1Ws5ktmqkaSTxGDTnuxqcYQt5U5HipiXaqUpt+Vhn9VEpr3pdtplxnua+nz5GdcRtt013ezVYcoKrq5hh4D+vzPktwzsVt3+Lmdt1P3K2uhEXTdU1nbC9f7OX983E3j/itcT6uz39q8W4fx/l49b31vDVdu+7duy7W+vTie/d1+l0Xz3nXxXNWsl55oqx3ufd57urwt3Vb+crHs54HbeUrF/t63btXL9b69OJ79+s1Vjr36sVzVrKePlHWVc8f6lNgRph2K7rUogsC2JW0q+IRJHGphwp22zFlup8QbcvWl1RiLiGk3Uxv+kN38k3tQF2bXMSnx9qb6o9B1jPF5EN2LrnpbIjWu20vAI9NdZUb6Dwm68KBh+++t/s6/JjsxwvW4evzn3r0WM+Uech33t2fh3T4+rsrXbmPh98WvXsc5+EhHbbdEyom29IW9xZ6qKVNokM/fAheF/sdeuzrVvIg3DN58zYWUzwee0OZH9bhLfbAAzgnlzL/rVSz6YoSX9K1z7EFYyYx4lT5pVHltcVpp06oGlt+u09+vg4/Lp98H7O+LX70nU+U9UJ02BDP2eI23ZAqI6WR9hh0p8xkXdDYt7zDQUzT2tydmnmUffh9wkz4CH+wPRQvWmuaIdJyBF0qyc8tzH0AfP2c3sdkfHQzp62rM0faN91nn3tsbVxu0fQXEnd9W9Phxx13rXT4objrWwNXnqnDL7/3ed7OUT1+jup+Lerbwiu96kRZ9+3ZyuaAGjcMS6lYkGlqDFA4vuRKqJzqroudKUdvwX8wvXMLu65gw/tsEXtWd/NQfG98cLC+Dvu4qVmUdy0O6Fa4qD3oCl7csKV736vpu4M92rYEPTxNrxPR8UF/b3U3vVnrdd8M25gaMbjVZbweeS4cFW7fb2o6hMBS+NuYdUb+AYM83EcqhB1bPbtJBf5u5j1Z4n1WaSEK1B+pYZW3kppa2sQ0Y4eh9kb3NLDW/T7mvSvbmgz3MJPdvYH+23oLuWQwyxx8oBTYZEx/A2B7mJBp66brXb45t7kCtr9vx5/7Lsu+8fHUKKum0F3RZYjC0raejZqMgeP7vocc+h5H1VW3XJoVG74Dzh7sI2WsqaLXS9l5DCDNxm3W2D0EZnajA+NKcnCOsClDV/HMxl8rJCU/3NpDfaRMDtU7N+uo6kthGx8BlGhTZhNIMbTufeJdS2zZk/hHHB/qqSvE+MuH+kjZtAEli/EuQsGOkXJDvaz4TDlYK2JoNP7p1VUYodjzFgcR1WanD7f+Kas+Usa0HaYn1C3tajLUeEz0uHxYIVbnwAlNdy7JIpjpqu+8bjfY/KmbjLf7Vss+UroNulX2mhO0w90G1r9vY2dXWh2brqjZQqZjy11tsELPHfpJTTP2nG89k1Z9pPaNoK3r/ppucM2Rt8amum2LZGqy7uCT6ICx3gIbzA/vqRkWTSy4o91+PtRHyk4kVe9d9uBwNRWym5pHFD5IKuoPEIrfg+5176lWyHHOvXS2Fo92ugf7SHXiAhROXY1g8zjX2A3UPGedHV0cw3jtfkcqbF7H3Myuy3PbHKW5W9+u161kq4ObUXur4XOCV1ejADsJcHc1gYndXNJXSQ+KxCYeeMfX980MT3xsHuojpQY7sc1LAsD5GN3m/eUSWB3Q/84T4OSmK2KtqE9a5A2DFl2ac5icbz2Tln2k+GiETLvLCQq+T4yW1UVCfX61eRqVB1TdgBQ21WNqaOpIltVT6Xb/ftVHyoyxWRCph91nS6MhGwbs9E2Xqlve3OCNmu7IWZCm8x51bUF34UCpWPbwUB8porEwE+enhS2qmYrN2Gv1X+JjuDhnQCd44dFh+1KApy2ZZxv1ESID6B/qI2WS6Xgv2BLcyYYmport49hUyJJosf67osKOkRpqZlMc/29JnaRNHZvqQ32kMJPqNzRS2F1wxaqzU5yYQwO1C0HNo00bFiKm1VLVVgCdhf/lR0iibO6hPlLG15lMdNnw0qCLMVZGWU2SMZWzre4jO5qIqS62Bp/VPq6nrquLGDKTHuojRQqn1W6MC/gx3aZUp4lSbYIad5gsEkXkQ6Wb5KWgxbPD0tqIPWgbb9491EdqmzLR6nYX5NaJvH0YMOCzDN/Qn7DjNAmR8ETsvXqTwMnzwreu47zZh/pIbTj3ENi46hpEe1BHD/U03LAaAWs7wSlmjx0DiGaqx5kj1Hd+N4AJc7tX/X5LHbR+Fj6cR4RLRpd3ASwjoN3YJuIukr57M2UWjCH+bBgetwMpKyb21ht92Udqiw2fY1lodT5ncoFDV9mDOlKS3NBp75nknIFc87z5AB4IOzBmWA6Rf6iP1Ebigbw0EASEotzGXppe6Y4/VltL3d4GiuwZ3o8UIA9NpD7Q/wiYm7d77Ks+UhwwtwWyk4Nc4kwQKsHjCBvIbzhriDm7GqfBqbg6W1SXUTQWA9N0Ffbm55d9pEgq8nnHmNaSVO9W+lAKPCM5Hgwqn0kI01m+kNmviKWvaunDGwfRxAf7SMVmJrrm2NWCloBT8GYdUZuBBXUCXJuuw2MgK3i3CESQcy2QRrjp+VAfKdaW2EfhJHWU6UXXncl2qgcDvt6onVQrBP8ke9SWNRWA3J5G1tV3PueDfaSwd3jyDRyi+8aVA+NNQ32DV++laNUDpfGhSDd59eHgDQKR5lbgbLHHD/aRAvCJJ9gLQrI6+eLjAZEdjwhgxab2vaibq9rUqAkvph5GAwDQOcW2PNhHitiAMw9C5VhnYHFQ9UcFxM2sFhmV/QdssvIdw9hKMCxfFRb4adBMfaiPFDCmJd1+xgVgoCHpSPrpbY0IeMWWQ+Ipq21gCQENoE9wBqdSt6qB6OOhPlKbgAN24dJjjFc41c2tKv5RKxOc8gY4NDA5zeLoM6z4cHgTvyenBjzzoT5SqDb7t+N/sz4/Rs+SCwTE6u2h/MNiJw0fwKmJVQFdTt+1XRwvXoR5qI+UDc5W9QjW7wNx1P2OAArfnAhHMu5/VzfD0tXe1QrG5kt31m1wvrJ/sI8UB5rPtleyC3jjAaflpkI20rOhqMmrkZkByye2qDmrtqloPhB8D+q891AfKcv7D1YdotiNiosBrIYsZ1OqVHlXK0cMB1SwuoHmSajZgXJgzzJ4VQ/1kSJYcAObKhTIsh2PwbCGySnEHGESM7vswQvCGhvcGig34SimDHC6zUBa9ZEiNCOKrCAFbBRRatvZ4Q7uBCHyroAMnHcSIWy0+opm4DlplwoNTRgwU3mwjxSWO4PkoQcBhKgELgL/ksyIpoBQfG4Q4Wq0oVxyxrx3PpXlf1Arop8H+0jFS3+UEBrAYyd3ow5MMUNahtD7nvG8CHKSVtRNATUknc0HteR98HEP9ZFSYyfbIwAwOzXzxnju+EcS6CFYXbDPOImebcaTOdsiNGYnR4TTSGon6R7qIwXU4AxUtVScIAPODFEvIar6JphNTUIw6hE8PjtGVb3u2LkGjUB0C4B5sI+UGoeBwvDrzsvcwgGgyDuI3LYe1K0O1DWtuAgoVwKumqtzpqDbmPBb/5RlHynSFLLY8LC4AYOHCE2NaC89b8YzjZSGGqOHjRSaWseR52CvgOK127091EdKQAOnQPCb0JHIx8+E2WnnkADX1EdTnsupNE1NathpYEQjbFSfhX3ah/pIGeQozt0d3iZj+lFyCwB0FRVpHaeJS8Jr7OqHGcuOblSCq6ZcomocHuojZYj6G/vNsQTfA08tRgPM7BT2YqqdGjbZEkCuVilLYoUNMAiZgAXgQz7YRyqoqoNjGKJSna2TrVSj94btUBMVNkyfIalZLxwRqMSH2gOACU5+3HqzfNxKtgEdcYBi5gMTd5EOBXyDK3FeEPDqe1vV6FKa4VREGIWWXCZytTJeD/aRIrYcsEaXvIHLERgCasZtcopY5YZFYRNU6IhPULEKr2XL4OlL1zGzP9RHyiqdNiEg1N6czSe9hm9AlydHSU3h2SLgONmFxmlSwU1Te1SwBV/FFT3UR2ojrxDrDihVMEWAgNkzyQo5ZdBlUuSKdnpcDmwCP8YxUH8vDBcpiVtv22UfKXZNPZe8PHBVg1GDu8Xr4z7JZRfV/eCqI+pMzEB8yzGeF6oALxdueHDVR2pTa52pdo7qyQtFuMcdlcaleIsnRjHVgIxgcOokiIaTtSSg9dCRQLqH+khZst7WoSHeEvpukG5wEGgG0fpQZ3Wl0itiSG6C+XFoRo1V1NZ94pVvtUWfutxvUL26rxAOS81AyVq8E4ytxKt44UvxHWqh5uVqd1vVuwqCSy02w4N9pNhHqBhAtULducN0oYywhYGd0PPQfD4VPBloa4qMs2q+h3PuwA6fH+wjZXl1uOHJmzTBYjmCGrbu5KtE1eIm1EkUb7bBH1erzp+Zb+2cp11h/kN9pCDkMCH41bDvausCF0CgDM2FIw1dx2YXoIL/2omLi1EHU0IJPFPAmtw4pVUfKYtRwEuxBeqsHLe2N+1zCZYgYbeqP/azF5SEWPUCQtHyDB+hNjwlz4f6SG17V/f3uEFyGPXsyxhqYQQoH2weoSHmynVYMcQJpEP4ERlhitlD3MZDfaTIbSd2gTeI6ZaTanj4CB5HHfBurWA8JlR1b0TeWD/b1SMLsgpEE/Ktv/KqjxSxFBgGxKGuSWrbBcsBe+CI6vcyKsiZpHywhBJTjQ2J/bJX3I0945XcYsBVHylQa61YVOC7QnSC3uSbsvMarYFI3BjcO+JZKbqNr+lqAWqJiwv/ZR7qI6XoHM7K8xmbJ57BTe7yw1DAAHyoDaC59DloSgWYM1uSAoJXzoCyonuoj5QmSkz8cb10eSLGtGr8FYLq2YWkwIqQ42RN9HbhfAEWFZ4XdnZotoN9sI9U6PBRRmNI0BbcIK+1YcCJIXmt4BP2Vj0CeSbcCkgURIWK4yqaAxjZh/pI2QK1gflolxaC6EcWYk5qoLlhpwgO4O+Sqf7SLRpkj1anJkOJkyjbw32kUAboG15oJeaGn6kcQZY2snLhWHL13TJYbOGejtm+dMG1GJTZxp1e2as+UjgyAIIonF20KXmeAeLBoE8o00wqaRPCDWqYq9CSSARSHXyKnmashHmoj5QagQF9vHZCbRDriFEjcAhX8VpWxc8o+a6+9lXUm+pRo3w2h1jw7X6vqOese3hMkmMTiRsrMBbaiH0gqo7sDBkkcDB4AU10YpTheDlMAWOuqRb9dua/dCUb9oLEBNwwFL0B/jS1hYdxxxPxFZWW5gvtxpGyUxSojgx6SxpMDMBV9ndZ7QmQIRsDTZ/BJ1PN+yd8l9MkCUIfaEacPu4sw4Fj5LcxoCdhbHjtRMX90JPvulq3TXha0iDwoiLXarG6fEEQSWDm1CG2eZ0oDq0jdMOkEP5gADBk5ArdYau+20K2HZCasAyWxAexjeqIoM2VUhPjbwpBDYG20D7Bs/iBDWaffBgU9kzx1jvuy1Z7QnRjONQEASMRgEOz241d3sczXb0xjh1L3S4JK1dYBCkO/IZTcRNRyVV2We0J25c2II2q/5X2VMf0rEaA4IQOpIIMYuFJgz5gqoIaM7YCKRuA+djOq+y6kg0XAHrFg8D1aGoRHqiQBWsND6xOjohxCtkiMRwcAdibHAIfCii2xVu+oa32BK3CDRKb8RuochueVQm4Dnwk3pQsl1MbYyNjy5kCUxNyzima4s4spr5aN7waudRNmg2XA4rARHWyXMZWaSWoYTZdzVEYkTs0QhFYA45BELrbmR8rPUmaCcAyrS3o3aY+84QxwHoCG7RTzTNJaivLXUWBNdYO8hePIyLl8PNztW4wMmjSonNV9J3uFUVyWqQH+fDTohBRnYs56BcjDI2AMlqdZoHGww5+99W6R1Q3a/lGp9QnegMmVnIRL0Y6hq1n9RnGtEFVcMDIajheKEAFmumWl/oeq3ep7snkMMRY8QuwAFZko8EV5E2gGZtloXnAPztYnXfrnhkNse0kdW/9lb98JZvYn4BnAFnL0B6iufFicU2D2ItVt1IwVGq7vVcseSIJJnIFL407PDjT77naEwHKqE8+Lq3ps+GjqhOo6uyrUQkgOk4Ege0DI6lfJZ+NvF5WWrwd9vt7rd5lx150o/lo7HuEXShY2a5pZWUS9gDf1blVc9MGsBvLyCciimrAQZixw5587+W6oc8L8cGmw25EPEN6a64MLKaS67B10HWkp0n/8zqxwGB/MDh+dNyZR/B9VrKBYdgPo1a4VkPSdAWP7E0lZpNNatCQWWNhYMTHdpmgoY6YUYVqJDYOzPZ9V+8Sjo7cSCKQJybY1Fa/bDFB+gIuQOBzNzyDGG0CeEwWkTDVhZl0JId4P/Tk+61ks4lDyZCN/cBwIQrQCmbj4MNYweNxJHG9QNntUsghr1FJ9vBrwKFD9vdfvcvdK58IkwbBa5C/ievNyrbCT6GEGG9Iq3JBR+RoGxkxsNWuoXHwLYe//IqVbNww1gk/RuKF4I+gN2rOCL9HaKOUgCa7ANtIAYHUZSuJTdBAVwhMbr33f8BqTzQbDSabgB7FgI2pYAeCG6LWHQtIyr6TRkHzVE2ADWHPydURSrmGCYqHjf2BKz3pZPbgFnDG/A4Ea4HohJgRHrcYG2khOJCIH0QwlLVS5A/S3BQ51kMHf9BqT7BIbtMAA/CSqkMA1fsltiRjbCIfgO1QRUTmAENkQfnwIkjSWFVS3HTwK1eyNXaGE4kJF1cHJ0WUDphImgFDDg8gCjpXVQistUa0kES4FB8UpVBuHMdXLWV3jbXSGTZNeFPTz1hjS1mTUpSjAi8QoWxqRQ2j1MRHsJFg+xDrgU9+8Gq/sXG8eAssI1UMdYVP2DToCjeWRamobzkxN3EtlmeCufhckBOb6IU7OfQfspLtMdVEqN4oBQ1mJ1UHEleGbVMVAESEalMJ3puuxFbF8OwLgBRbwR5eZf/QhWx4iw2GjQi44iUuYT0uAiXDGZKfr7qOxRcFmbvhs0BwkGRTErOqAuCQ/cNW6ya7EsRdEJPADnqcW9xU6gBYsJdW+wCMJs66kYbBa2OmQBIVRsg5mMKr7B++epfkmKAxlbmG4VYrXtDVToCmwtxNjZU5+Oo3i2Mmnh+5quCIFAXkBwmyw8//iJVsHIugKhSDMjeC3PBh8jE4QwhIII7KbzArHCJ8EsZkeM3R0BQK1nKV/SNXe6JKeDayXeo0SMCzuHK5IwraqQmHgxUDMgCliZijuhRfSqHKZfzWLZ7/Uat1ky9T21zyLVb6AO4FoWlGGUvmZaIoPekSydA4CQwxljBcQk4ySxieq+wfvZJtBUqEWHEpKMlUq+JqsdUVw0UELPuBp2saD6ZCJbI9hZA7KZGZb/3x3/JopYOgEYw/phBt6FUl0NrkrklOXVQy8Tv0bvNW8wBJCG6E9KB/7RTM1VX2j1mtG4hDll/Bl8Z8QVlGBa2EbpP3CYoDrqmWg4iVBFbCzqgFN8toCsdvvvjHrt6lPij8QOJ8Y6jAfnOvml+jpsuEZAAWCCpLDga3BELWVAk4ahRRd9HN8S5/3GpPNM+GAy/MQdJ5V21c0BgmrGG0IgiLqtGKqL4OlMNDTRc0lAjjC7twlf3jV7LRYgIEXeXVJV8OSL7cMdIdn91f6qOIKfifS4UP35JXAtwRpchpHrJ/wmq/8bwdEAx7B2GQJ/9hp2ZDVlyoJst0jCKPkhtmvwC2GtHJ2Z2XYolDB3/iar+HPiChulUJpmpcOMgcO3bIFOLJjmkVsMWlaXYNiJzoD3ZPKBdDfsj+Sas9wZCq/AgaZofTgPAikoJ8gJvesWANuoAdIwZUGgOk6LvmbchkijG8rfsnL2XvUPUzZd3fBkrhAlEHlLHzilvF/ik70lQmqzGyQFc4VfVa7xfkcZydn7LcEyWN4FtBDGA1mFYLCgdeDo27sdNn8D7WFGogYY4xXrphUGrVnZk5DgzxU5frxn1xUMylqA0RMPUVi0F6xUSCFcgauVxwPREsedGhsA1miZ0CKt5qoH7aSk8m3gp6wWpmIGENukKcxN50zgn2BSVRGwhcBtY1wAZlzTrhmMGH8pYPG/vTV+seMml4VRVVZVUm7LxD0AdfwAVdPBDIFaBrmgqXveaVgD4NRxiLe2CIn7FadyI3qr7pQB0FT5KQL4CnKGgzBNZeA0R22PCkbDXUDf/GhqkKsBxY82eu1o0QMBk4asJfkhRouGVRv2rRjgmA4gBnQ7KFREaJY6qd6TgJqwKhcOjJz1rKzprQgVfEC5ToVWegzv0N0BpGUVN+AiDRa70Hz1tPQE+ieyciv97m4Pzs1Z50NpG9hWHImn9jNZovwCEpD8irCxE6nHy1xiiRpCeLrOl88k1gCHergfo5C9n4awKnjtaSMeSMY4+8qs4yhoCXJiZIHJkAiwGC86mwJJk4ivdDfHHElz93JRunTSAC9WJVKgQma5qwnDSHDpWGctw0fpDUdmHHlOTcNNABtwplmm78yc9b7jfEeU5AkKExiKlxcpzKEDHVBpAJwJj6IoQHDyVak/KrXgoyJbrbfNifv5KNOjhyGVtXFYsqHTbVNsH/EOd0jWkKFkpPCYMmjQYZ4p5l1smu+FuN3y9Yv0urclWAam1JmTTwEvECbC77zxkvGl+qaaXqdIHeiSCQ3lvxCre5Wr9wtW4VIwX3zOQ4dJloKRdVOm7Cq1C6MJAkTFU4Q8ZRZfOyuGitZkzlW5z2i1br1hxRYDA5L16OZrAoe11hCaDOwRANntYT5cM/YNM1jDZoYifKUze1rrnK/sWrdVdIaXXsSPAzqhfIqoypmk4RMOxkBqLmN3rN+IbZNIQ6KvdQXdQgDj24mV+yXLf3sGvFEVIlzdDISi30qNEsE969Q01AF3SNsB7QFbijRkCuKTv8xI0z/aUr2aqTVIhOTkj3C1gLOReAM+o+NZA7E2qptlnp0k0kH9AeULB39mTecoy/bCUb26xynA0iyml0nsUEWWJAESdQbTM0eyEzCrLASOSQiOLJ72mEcb3hwV++kI2qTk651oEfniD6najPqCIFfAkfiSnlbE7NZtGcPuCtraq0hrnR9emr7F+xepecb0+QC/lzqdNPwuKkMiDBVMJnymVEEL4jsRMwfVAQxN7glNRidLe81K9crXsTWY5l4wQH+cqucds9apao2AHOJfEvD1O3iK7qyhIJOwscJCfppt+/ai2b9wbJSvSP7sKWbqpk3zWIybNQMq/kwBvZeQ0p3bOKjiIGEFUlUXDjT371SrYOtdotETeA8thzpxA8iybFrbtLoUGA18Po9axpIrqYACN/wUvhwIO/ZqUneyAdUMipJJXSZl1gz0ET7SoMxiV9mS9zX5pSI4SuyqZkf5nHC7Q7bNWvXcluxW7SDXLxRWzOBjdDWKW8BZtrdFWTLDj5Ud3CQCNZQS0TNp687MhH3PDrVnpSZOTgcazoH3xAkw8Yuu6wc1a9uuXAf4sT75CeEFZY9kRe2kECbTfu8devZIPVBQBVvEsWt2jIIOqHCgAjBHhUZGQ17FH1+0ORK68Ylh8Dpps4V9m/YSUbnkKT15M4OZQcEq9o0DZUJMczkCwijUaoHS9T/KYh50Zaj+gHS8zLOTjq37ja757RKLerVEmcOoQOSTCOP+aQwGlwQIfSlQWu8FK0iW5yfjroW9Tk4Rt+00I2m83pJbAh76XMgyH9Z1Ae/lcDuwh/dsGI7TJCE/UmV9MuLHiHASD6vMr+zat1T1F+cI66K7I5DTiFLDQydMRLGqVO/ohEN1GaCu4BPl58mS/EzoDzAw/+lpXspOFUADxiGxjZuus1wutxoqGvSW0HmUSiHOjDcblXA73SVW2qzPJtrtZvXe1Jmpc6fVnXkSNmuqrWE2zsNac38Sqa0tziIlXjrGLkpBHwnHjU8dCT37bSEwcvlQQpOQxWLlfD4xRe8eWushNyrqioaapKSlagYL9c3Q8Xmv0q+7ev9gRiCECg61AaBmcuSkOa1JMDyco8AtRUsKXYRQlGst1kOWGKalRa/NCT37HaE+gSlUuScM3Eehr5pIwW0RoRastVYTgHqoqsqqgUyQN+mHOkAtpxqxn+nSvZGG+slH7aKsPTYAuFGC4DdLFSpAVgZr2mZAOVdTuET0UaYQZOa7nN+v1dq/1WFwKN5ByYNc1WV9mZEWrTXSdsNKhkd7g5gljgrdGISK86xaRaq3b4nd+92m+yQmQasCiXMZRV89000Wyoq1IRpFLQQvKymaHCAFwJAJfvExFgtQ7Zv2e57q6RZENE29RtC4g0TC05UgwSgTyxQsaEqcyIGF4E/8Czcmx5OWSUDj35vav9BjTAcWlPNHLKX25eNKX5lN8HnpBds2Qz4N/IcmXQOr4Oyt1WnFOfRwz4+1ayNx2QjGVolzIbmFiHH0/o2lDFms4msAf0Cv3pJhsR5TUg/hw2/3Yn9fev9tuwrRPLBDUwcUJOHFdVHSiHHaPIBog4Re9x00ByzosKgNXwioXcdPAPrNatWhPIdXRZ5BRxpG5ZclzE0ZAOxHBD+8KWRgvrtpMlSUbzXaFTZW0P2X9wtW7CPlgWVcjiujLnnucYjWfViSrCVwDYphxS17xpqDZQFsiA2ASQe9iTP7Rad1eGHgcGZ6qBhEOjWdUlshNjRigYlFGMCTYbroNUWExN83sTfB/J3QP7/OHVujFmQ7pFpGYIonWPlhNHmAaxeOGO8MygaJWZTd1pUPkjuSUIhDrzTQf/yGrdWGevjA7ALw4liDfdonBDM6dhmQgmCWMJ3cgakBLzRtld/CWL3lWIcJX9R1fr1txNWJJnynkwo025jbDtwGOkkOMgfoJN1W06EIkm/xEsgpWg94H6x7r/2EK23hx5dg0HvmQw1FEFCkJ+Uhd4vJDtwJyKU9X8ydwvtTOK0Yt80lX2H1++y15rJPlJ2A5JlUgjWZcz8TYWEboKCKUqS3YK10SkqWtlZDMwiZpRPY51f/Vq3ZxbfhKssSXxEG5cyiDROlV7q/wO9q2qTIHgvQhNwUJcLu/gqe7El39itd+8H4IN6H28FHlWQvDop46RWE7MPy6AeBn6NIoiT1Wz8PymKJPorh0x4J9crTuoDgaPXC/YJ2No4QmJIAYBPYfWqiDUqUSdBA0mDLiimlTOK0jD33KjX7NaN8lbrBwJfVJmLFMXfYNjP8ZOsAnoI/eF64frJHi6FKFLXTq4M3RCz2O//9Rq3e6S0NLMbpy57rxi/DSWr+tGZoriRrdKvD/U8FE9USc435FP40fMbcb8n17pya5UDhnRZoksyYZKeTdxsxumm7AGzrMomzyE0QmRddmsYQYhT8UKXWX/mZXsTXMmSaCiU7A0CFO2iDAB4mBX6gH7W5VMhAscqCWuexAbgSOaugMcMeCfXe0Jmjc5CvEyHFcpuJ5UOFlV/VrYJDJETeGErsX5S2A+NcaTpFVX6vAq+8+t1g1h5kgGwskbqFDiEdCIZmI7zZwHumFuvRgPXWQ2HsmdRBL5K+CLhjxeZf/51brDYDuwJJMwA+vslSUicbxBa5J0hR4F224heEVFVtXcwGXIieiMSpkObP+1C9lGM3AL2euqOj4ICRUlWBXzgu7Z6Dlx9rsKTkHEbGALEOZkYiBuccb54Ar+wmrdeALwK+QdXhA6Q+WIVsSgm7omvsM46oZC033SkDis5Fyx7K7vOtG3/f6LK9kNg9NGgdho7B+JRbHUecrsgWCDTiMaRM5ANwJJpKDtVWmIkjT2+sAQX7d6l+Yy6l7hJcG/JnwW1YBnKCxOyQwiMgxERL/UKEExsfCIFQCPE+7c8oB/abXurLADxAluuJRXkO/UBRssE3CQLAmUjXpMiFL1kKldtSpkKET/qH/lVfZfXq1b9B+BATCswEXAknj8GMRGVjYMR1wIsJwTnsoaJDx131VJq0oOEl78KvuvrGTvaAjKR76IMEeXofQ/MOA729p03QOfW7w42C4eTDnHHZPCs4kUbz0zvn4lmxBd98OyIzAKGkS6KbXNhxBEq8ETmATxD0YF1yraHpB4/A4JBKDGceb/6kq2ZogS2bFI0DwApNYkNbmMDS3YXBGYJjngySSfB/4hR4d9FHdKwHbgk29YvUtcLRE2544cT1Jw6XEvICJpjRroDVJHWbcpMABYcLUcwH3ybBJNBK9X2X9tIZvc+Ea8PSI5bc5/k6rjGDEZIWQ+gt81Qd1quup+KctRsxY0G/MKgN4PPfnrK9kkSgC7u2otLLGgakmnSmR0VRXYr+vdF3oP7fMgK9I0HFl+nqXv9nZP4G+s9ltMum7+RtwtyK0LnqGYVZcuMSgojtFsXAhPVBVSCOJ6JyblJ8iwzcPP/82VbLAubmB4MS4mkahl71VTaXRTIylywlJdMC7W0qlqQq2Yjbql9P12Z+9vrWRznrMuJgOZYla7V8SQ9SNVF0C2mv4NiL5UGmCq1BnFE1Clyw1hKITjzP/t1X5j3qoqZzommXcn6I4FRek8OTrr1MWG1KJ62RAvR6LuqgCJJDifb95q5f7OSrYhz8nJ5n9INaqCspJRFM/hdd/ABI39DrvgkEo0uxLiO7wFqW++Gw+O4xsXsrcOEcVLyuBq1koKXVWyqSoh7VWirbonEChsuhMl6OXwwQOEcqQybvcy/u5Ktu0C7XIzzusGBVAWb0jKNRJle00Vv7SZ5wAA5wFaUa4joTYcKpDoVfbfW8k2bDLol3cJyxA2xa+cTzGivAaiB2iCoXt8xKGcUJbrVHRqYIkCaOnwxX9/pSeASw8oBSbguyJRVFAQaC/394xMGKGHenXKCgKDMmeXYMUpPbihvlfZ/2D1LlnRpQXOIHAlLAMyadxyUpoXS45J4qiQTOZYohmEUbnq7gZniexD3g49+YerPfFqeoOFkp4jCq5uT4rXIZPVACaqnm90lbjAtyVoK2VWnKhgoJ4//Pw/WsnGDGOM1XBZ46OTypmbro4nDn/2ACz2jIQ6SUxEc3hJuF4oLE6rrr1fZf/j1Z5gV4mjOluBkQ2kcauaLktBCCBJ/+sS5zMh7SD7qE4m2MVn+sgYMr9X2f9ktW6CmUCiSHVsKq3A05Ld4t0qDQav41BoB/iuulDMwSFMVimyeGxCiHbs9z9d6ckg1HVKHVbdhCQYbCor4uzvqpvkWG/iJjLMt2oNovJhJNyqhQOupDyvsv/Zct1wIbp46yE7IBs0QBznQBppyEmDz6oqil3QGPXBa+CVQstl3i1s2C2X8c9XsmEtJr7P6ma5G+Xis7rl9DVd3J7wbZZAWw0/eA2kwVTDlDQNHMTMGq6y/8VqT4QwrXhz1UN4tbYgyZtUMVOHZps31TqK2iR5p1YfREEsglR7Bk7cavz+5Uo26/KtafGbfgN/BhFF2Ks7wMrq+KBj6na+nVWMA8sL4AR1wpCNWy+Ef7WQbXRTEwApdKzOGU4OjYij5qbgWw1JIR8UnnFOjYqJfJd/1pXQfbpjT/71ar9BIMRyZPlUVQFDNUnWwhPwSbxuRFevK8JqEknIow40aj5R4PvgrsngH2fn3yz1ZKgrDic7qymYMAje0yilBX7aUXYYZphjdTxRoKlWA8SMwTjVHNziy3+7kk0KEHJKNa/Scs7jNOAyYnU/akJ/qqrMYFOSognPS0hBkbwDxijHcZX971aydfGHAAPrpHSR0d6IXtoxX3YHHgNdL+WUl1sJeVwu2wFxoSegFbdjT/79Sk8M+BjHQohWVC4Up9KjLA5Uz2sjYwclYNRKCQoH9omjzq84tW5R9dyxJ/9hpSdgYfwDZ9CQZcUCqgoeXA2fBLlGmIIyOpAizhFnmXFQJYGulAKH8Lvdi/6Pq3VvHECvFhCouWV7tktSJAWAd1CtN9xGVPcVdRWSPTOqlLiQnWC6/cBV/2m13zBeIpXI8ulqB/Qw5NJQUSZY1upMQiHDPODaycSSwkvPNp3oiWTYrR7iP69k98vFyKhXhQskR0GCz6ulH9A4wTLzkbru2MECYVh0MW4vultOQIQeHFzBf1nJVo0d4EsUbhazjW/B54J8xJVWMhgiZAL8G6wW3910gw/nqUulfLyjn+r/cUf2E8/++/rc/3rn66f1rIRXf+Le8x49WvfQvD7/qXtrPXU9d3po/td767m/Py969t/Xvftvi7U+vfjek3f+fvd7d5/z3xbPWcl6+YmyXnGirKdPlPUuJ8o6c+9fdaKsV58o611PlPXtTpR15t5/+xNlveZEWd/hRFnvdqKsM/f+tSfKevcTZb3uRFmvP1HWmXv/HifKesOJst54oqw3nSjrzL1/zxNlvdeJst77RFnvc6KsM/f+fU+U9X4nynr/E2V9wImyztz7DzxR1gedKOuDT5T1ISfKOnPvP/REWR92oqztRFnmRFln7r09UdZ+oix3oix/oqwz9z6cKCueKCudKCufKOvMvf/wE2V9xImyPvJEWd/xRFln7v1HnSjro0+U9eYTZX3MibLO3PuPPVHWx50o6+NPlPUJJ8o6c+8/8URZn3SirE8+UdannCjrzL3/1BNlfdqJsj79RFmfcaKsM/f+M0+U9VknyvrsE2V9zomyztz7zz1R1uedKOvzT5T1BSfKOnPvv/BEWV90oqwvPlHWdzpR1pl7/yUnyvrSE2V9lxNlfdcTZZ2599/tRFlfdqKscqKseqKsM/e+nSirnyhrnChrnijrzL3/7ifK+h4nyvryE2V9zxNlnbn33+tEWd/7RFnf50RZ3/dEWWfu/fc7Udb3P1HWV5wo6wecKOvMvf+BJ8r6QSfK+soTZX3VibLO3PsffKKsH3KirB96oqwfdqKsM/f+h58o60ecKOtHnijrR50o68y9/9EnynrLibJ+zImyfuyJss7c+x93oqwff6Ksn3CirJ94oqwz9/4nnSjrJ58o66ecKOunnijrzL3/aSfK+uknyvoZJ8r6mSfKOnPvf9aJsn72ibJ+zomyfu6Jss7c+593oqyff6KsX3CirF94oqwz9/4XnSjrF58o65ecKOuXnijrzL3/ZSfK+uUnyvoVJ8r6lSfKOnPvf9WJsn71ibJ+zYmyfu2Jss7c+193oqxff6Ks33CirN94oqwz9/43nSjrN58o67ecKOu3nijrzL3/bSfK+u0nyvodJ8r6nSfKOnPvf9eJsn73ibJ+z4myfu+Jss7c+993oqzff6KsP3CirD94oqwz9/4PnSjrD58o64+cKOuPnijrzL3/YyfK+uMnyvrqE2X9iRNlnbn3f/JEWV9zoqw/daKsP32irDP3/s+cKOvPnijrz50o68+fKOvMvf/aE2X9hRNl/cUTZX3dibLO3Pu/dKKsv3yirL9yoqyvP1HWmXv/V0+U9Q0nyvprJ8r66yfKOnPv/8aJsv7mibL+1omy/vaJss7c+79zoqxvPFHW3z1R1t87UdaZe//3T5T1D06U9Q9PlPWPTpR15t7/4xNl/ZMTZf3TE2X9sxNlnbn3//xEWf/iRFn/8kRZ/+pEWWfu/b8+Uda/OVHWvz1R1r87UdaZe//vT5T1H06U9R9PlPWfTpR15t7/5xNl/ZcTZT11oqx3evbv1z6kT975vSfeyr+vz7n/tfvPuf8u9OeVb+UzPHp06xX7Tne+p+e8+dn/3t7GP9dnXfuevuTRbb/uPvOpO5/n7s/f/bv+vPTe177xJc/8+x355xte/dzP99Sj5+7d/a/d37snFut58tHz9+7M/Xly8XlPlL9fdeyli8/2Dvzzj17y3D17pzv7/OLF7778zvfv/vwfevVN5j99VuYrHz3/Pb/s3r6+4jHt6/XzPP2svLt6d/eZ17W96N7P3/373c97/dq/fkDv3unO77148bX7eveyxXpW5/KJR+fr3dOPR/7R7/5dHo/8Yw7A3Z6+5+nPbc7Aq+/If3Ti+lfn8vqudYb+y71zedXZl9752t3fffre968//6Y75/K/3TuXd/Xu6jde+ej5Z+T+mX3Xx7LntzN77WF898zefeZ1bS+69/N3/353L65f+78eOLOvuPN7L1587aEze/25ly9+723156v38E3Z9Cde+ug5n+36ey/Upl9//pV3dOclz/7CSneua/xfWXfe6dnP/7h0Z4Xf7u/dyx7P3rVvSp/e5aXrz/tC9en68//9VTeZ7/qAPl334KHz9Jj1yb2Q83r3+U89eqx45phx8K731vPWdO26d99usdanF997hzt/v38WXrz42ou+hWW9/NHzP//baltXduGbOgvvc9JZ+Po7Z+H9HzgL1zVev/fOd773LY2lr2t5a1j6urYXPXr+/t59by+997UPe8C2vvOd33vx4msP2dZ3vve9F2pbH524dy9frPlbxoZZ8z9qw975saznYRu2eqffXBt2F6u/rXbnZSfK+ra6rrfLerust8t6u6y3y3q7rLfL+t9b1pNvRfabn/3v7W36s+f7WPfRabJvXPDdz3Umjr7K//aPR/7Bxb/mscjfjnm83+HxyD9mlr7b45BvTP+muPIf80BM/sTid1927/vXn//oOzH5j3/2F15+73euMvTnMcfdL5iDuj7/qUfPP8OPI35b8Z139+d+/PaaxVqfXnzvPm/0msVzXrN4zreUrMf7vl36pvT85750/ZleaE7o+vO/4V1uMn/BPe7p7me7nxO6m2t7xb09eUy26+CerrblLvd095nXtb3o0fNt0fXvd/fi+rVf/gD39Ko7v/fixdceytVcf+7li9974q38+/qc+1+7/5zVe/imeMtfdxJv+fPu6M5vfEB3rmv8X1l3fsdj1p0Vb3k/13Z3X+9jucfij+/s63Wu6N19fbfF53jRvZ+/+3f9eem9r/3BE/f1ZYv1PO4z+ULztF99Up72y++cya95IJdw/0y+fLHmb6lcwiuflffWcgnXtb3o3s/f/fvdvbh+7Wsf0J27dWQvXnztId15+b3vrXIJr1x876ozj7nO68F9vfvMJ+981m/Ovn7DA/v65L3PdPdr12fd3bsnFut55eJ793XyyW+FvVu9y2/u3n3jA3v3xJ3fe/Hiaw/p5BP3/v7Khay7P/+Oz/59tdd3f/e+Lbr/sy+6973rz/6TZz/nk4+evz9nvq+7tvb++l/+6Pl7eP8MvujxrCu8EN9x9/lPPXr+3j6OeO1F99bz1nTsfqx793dX+nc/xnrZ4jmruPB/d1nXfb77Xp54K/++Puf+1+4/50X31qk/Tz56rPrlvil8839+M/HNE3e+f/fnv+gOvvnv9/DN3b150b3PfXd/33z9zKN65+YYNhnfe4nT78Pm1krLafTYU8q1ulG7i21Pwc292dqTKaGXlA8u8KUr2d67HvewG19TCHZudvZaYueL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", - "debug_symbols": "7d3djtvale3xd9nXueCa67tfpXEQJOl0YwMbSSMfBzgI9rsf2rSkclGbk2UvxeO/pJvAScqqMVkujklJ/OlfP/3Xn//4z//5/c9/+e+//v2n//jPf/30y1//9Id//PzXv6z/7V+//u6nP/7t519++fl/fv/2f/5p+fQfefn89X//3z/85dN//fs//vC3f/z0H2GJv/vpz3/5r/VPaVn//n///Muff/qPvP5x96W19S9fWvubL82//p/f/ZTDIx/cHvng8ZEPnh754PmRD14e+eD1kQ/eHvng/YEPXh75G1oe+Rtavvc3tKXLg7dc3z94fOSDp0c+eH7kg5dHPnh95IN/729oi+ny4Km8f/D+wAevyyMfPDzywe2RDx4f+eDpkQ+eH/ng5ZEPXh/54I/8Da3f/Rtal8uDt6/OLfsvjTV/+dLY3+RId77UqtXLOctqTPn25fFT7LYwYwdmbGPGjszYiRk7M2MXZuzKjN2YsZkt2Zkt2Zkt2Zkt2Zkt2Zkt2Zkt2Zkt2Zkt2Zkt2ZktGRZmTYaF2ZNhYRblGhCam1mVYWF2ZViYZRkWZluGhVmXYYH2ZYD2ZYD2ZYD2ZYD2ZYD2ZYD2ZYD2ZYD2ZYD2ZYD2pUH70qB9adC+NGhfGrQvDdqXBu1Lg/alQfvSoH0ZoX0ZoX0ZoX0ZoX0ZoX0ZoX0ZoX0ZoX0ZoX0ZoX2ZoH2ZoH2ZoH2ZoH2ZoH2ZoH2ZoH2ZoH2ZoH2ZoH2ZoX2ZoX2ZoX2ZoX353Te6/6jc0L7M0L7M0L7M0L7M0L4s0L4s0L4s0L4s0L78fnbiB+WG9mWB9mWB9mWB9mWB9mWF9mWF9mWF9mWF9uX3IzA/KDe0Lyu0Lyu0Lyu0L6GWT4BiPgGq+QQo5xOgnk+Agj4BKvoEKOkToKZPgKI+Aar6BCjrE6CuT4DCPgEq+wQo7ROgtk+A4j4BqvsEKO8ToL6PQX0fg/o+BvV9DOr72MLsS4P6Pgb1fQzq+xjU9zGo72NQ38egvo9BfR+D+j4G9X0M6vsY1PcxqO9jUN/HoL6PQX0fg/o+BvV9DOr7GNT3MajvY1Dfx6C+j0F9H4P6Pgb1fQzq+xjU9zGo72NQ38egvo9BfR+D+j4G9X0M6vsY1PcxqO9jUN/HoL6PQX0fg/o+BvV9DOr7GNT3MajvY1Dfx6C+j0F9H4P6Pgb1fQzq+xjU9zGo72NQ38egvo9BfR+D+j4G9X0M6vsY1PcxqO9jUN/HoL6PQX0fg/o+BvV9DOr7GNT3MajvY1Dfx6C+j0F9H4P6Pgb1fQzq+xjU9zGo72NQ38egvo9BfR+D+j4G9X0M6vsY1PcxqO9jUN/HoL6PQX0fg/o+BvV9DOr7GNT3MajvY1Dfx6C+T4T6PhHq+0So7xOhvk9cmH0Zob5PhPo+Eer7RKjvE6G+T4T6PhHq+0So7xOhvk+E+j4R6vtEqO8Tob5PhPo+Eer7RKjvE6G+T4T6PhHq+0So7xOhvk+E+j5R1vfJJV9zlxh2uVX70sut2pdOblnfx8ut2pdebtW+9HKr9qWXW7UvvdyqfenlVu1LLze0L2V9Hy83tC9lfR8vt2pftnTL3cM+t2pferlV+9LLrdqXXm7VvvRyq/all1u1L73cqn3p5VbtSye3rO/j5Yb2pazv4+WG9qWs7+PlFu3LFuyau4W+zy3al25u0b50c4v2pZtbtC+93Kq+j5tbtC/d3KJ96eYW7Us3t2hfurmhfanq+7i5oX2p6vu4uaF9qer7uLmhfanq+7i5oX2p6vu4uaF9qer7uLmhfanq+7i5oX2p6vu02Os1dypxl1u1L73cqn3p5VbtSy+3al96uVX70sut2pdebtW+9HKr9qWXW7Uvndyqvo+bG9qXqr6Pm1u1L8vtdcBW968Dqvo+bm7VvvRyq/all1u1L73cqn3p5Vbty+PcSdX3cXOr9qWXW7UvvdzMvkwLsy+Tqu/j5lbty9bjNXfPfZdbtS+93Kp96eVW7Usnt6rv4+ZW7Usvt2pferlV+9LLrdqXXm7VvvRyQ/tS1fdxc0P7UtX38XKr+j5ubmhfqvo+bm5oX6r6Pm5uaF+q+j5ubmhfqvo+bm5oX4r6PjmUePniHOqye95H1Pfxc2v2pZ9bsy/93Jp96efW7Es/t2Zf+rk1+9LPrdmXfm7NvnRzi/o+fm5oX4r6Pn5uaF+K+j5+bmhfivo+fm5oX4r6Pn5uaF+K+j5+bmhfivo+fm5oX4r6Pn5uaF+K+j5+bmhfivo+fm5oX4r6Pn5uaF+K+j5+bmhfivo+fm5oX4r6Pn5uaF+K+j5+bmhfivo+fm5oX4r6Pn5uaF+K+j5+bmhfivo+fm5oX4r6Pn5uaF+K+j5+bmhfivo+fm5oX4r6Pn5uaF+K+j5+bmhfivo+fm5oX4r6Pn5uaF+K+j5+bmhfivo+fm5oX4r6Pn5uaF+K+j5+bmZfZlHfx8/N7Mss6vv4uZl9mRdmX2ZR38fPzezLLOr7+LmZfZlFfR83t6jv4+eG9qWo7+PnhvalqO/j54b2pajv4+eG9qWo7+PnhvalqO/j54b2pajv4+eG9qWo7+PnhvalqO/j54b2pajv4+eG9iXU98lQ3ydDfZ8M9X0y1PfJUN8nQ32fDPV9MtT3yVDfJ0N9nwz1fTLU98lQ3ydDfZ8M9X0y1PfJUN8nQ32fDPV9MtT3yVDfJ0N9nwz1fTLU98lQ3ydDfZ8M9X0y1PfJUN8nQ32fDPV9MtT3yVDfJ0N9nwz1fTLU98lQ3ydDfZ8M9X0y1PfJUN8nQ32fDPV9MtT3yVDfJ0N9nwz1fTLU98lQ3ydDfZ8M9X0y1PfJUN8nQ32fDPV9MtT3yVDfJ0N9nwz1fTLU98lQ3ydDfZ8M9X0y1PfJUN8nQ32fDPV9MtT3yVDfp0B9nwL1fQrU9ylQ36cszL4sUN+nQH2fAvV9CtT3KVDfp0B9nwL1fQrU9ylQ36dAfZ8C9X0K1PcpUN+nQH2fAvV9CtT3KVDfp0B9nwL1fQrU9ylQ36dAfZ8C9X0K1PcpUN+nQH2fAvV9CtT3KVDfp0B9nwL1fQrU9ylQ36dAfZ8C9X0K1PcpUN+nQH2fAvV9CtT3KVDfp0B9nwL1fQrU9ylQ36dAfZ8C9X0K1PcpUN+nQH2fAvV9CtT3KVDfp0B9nwL1fQrU9ylQ36dAfZ8C9X0K1PcpUN+nQH2fAvV9CtT3KVDfp0B9nwL1fQrU9ylQ36dAfZ8C9X0K1PcpUN+nQH2fAvV9CtT3KVDfp0B9nwL1fQrU9ylQ36dAfZ8C9X0K1PcpUN+nQH2fAvV9CtT3KVDfp0B9nwL1fQrU9ylQ36dAfZ8C9X0q1PepUN+nQn2fCvV96sLsywr1fSrU96lQ36dCfZ8K9X0q1PepUN+nQn2fCvV9KtT3qVDfp0J9nwr1fSrU96lQ36dCfZ8K9X0q1PepUN+nQn2fCvV9KtT3qVDfp0J9nwr1fSrU96lQ36dCfZ8K9X0q1PepUN+nQn2fCvV9KtT3qVDfp0J9nwr1fSrU96lQ36dCfZ8K9X0q1PepUN+nQn2fCvV9KtT3qVDfp0J9nwr1fSrU96lQ36dCfZ8K9X0q1PepUN+nQn2fCvV9KtT3qVDfp0J9nwr1fSrU96lQ36dCfZ8K9X0q1PepUN+nQn2fCvV9KtT3qVDfp0J9nwr1fSrU96lQ36dCfZ8K9X0q1PepUN+nQn2fCvV9KtT3qVDfp0J9nwr1fSrU96lQ36dCfZ8K9X0q1PepUN+nQn2fCvV9KtT3qVDfp0F9nwb1fRrU92lQ36ctzL5sUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X061PfpUN+nQ32fDvV9+sLsyw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfJyxQ4GcNzmzMNTizMtfgzM5cgzNLcw3ObM01OLM21+DM3lyDM4tzDU5tTij1swanNicU+1mDU5sTyv2swanNCQV/1uDU5oSSP2twanNC0Z81OLU5oezPGpzanFD4Zw1ObU4o/bMGpzYnFP9Zg1ObE8r/rAGpzQkFgNaA1OaEEkBr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nQLZdApk0ymQTadANp0C2XQKZNMpkE2nQDadAtl0CmTTKZBNp0A2nQLZdApk0ymQTadANp0C2XQKZNMpkE2nQDadAtl0CmTTKZBNp0A2nQLZdApk08nIppORTScjm05GNp1sATeskU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNMpkk2nSDadItl0imTTKS7gho1k0ymSTadINp0i2XSKZNMpkk2nSDadItl0imTTKZJNp0g2nSLZdIpk0ymSTadINp0i2XSKZNMpkk2nSDadItl0imTTKZJNp0g2nSLZdIpk0ymSTadINp0i2XSKZNMpkk2nSDadItl0imTTKZJNp0g2nSLZdIpk0ymSTadINp0i2XSKZNMpkk2nSDadItl0imTTKZJNp0g2nSLZdIpk0ymSTadINp0i2XSKZNMpkk2nSDadItl0imTTKZJNp0g2nSLZdIpk0ymSTadINp0i2XSKZNMpkk2nSDadItl0imTTKZJNp0g2nSLZdIpk0ymSTadINp0i2XSKZNMpkk2nSDadItl0imTTKZJNp0g2nSLZdIpk0ymSTadINp0i2XSKZNMpkk2nSDadItl0imTTKZJNp0g2nRLZdEpk0ymRTadENp3SAm7YRDadEtl0SmTTKZFNp0Q2nRLZdEpk0ymRTadENp0S2XRKZNMpkU2nRDadEtl0SmTTKZFNp0Q2nRLZdEpk0ymRTadENp0S2XRKZNMpkU2nRDadEtl0SmTTKZFNp0Q2nRLZdEpk0ymRTadENp0S2XRKZNMpkU2nRDadEtl0SmTTKZFNp0Q2nRLZdEpk0ymRTadENp0S2XRKZNMpkU2nRDadEtl0SmTTKZFNp0Q2nRLZdEpk0ymRTadENp0S2XRKZNMpkU2nRDadEtl0SmTTKZFNp0Q2nRLZdEpk0ymRTadENp0S2XRKZNMpkU2nRDadEtl0SmTTKZFNp0Q2nRLZdEpk0ymRTadENp0S2XRKZNMpkU2nRDadEtl0SmTTKZFNp0Q2nRLZdEpk0ymRTadENp0S2XRKZNMpk02nTDadMtl0ymTTKS/ghs1k0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nQrZdCpk06mQTadCNp3KAm7YQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkk2nSjadKtl0qmTTqS7ghq1k06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nRrZdGpk06mRTadGNp3aAm7YRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpk02nTjadOtl06mTTqS/ghu1k06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNpw42neICNp3W8NyGXcNzG3YNz23YNTy3Ydfw3IZdw3Mbdg3Pbdg1PLdh1/DkhgWbTmt4csOCTac1PLlhwabTGp7csGDTaQ1Pbliw6bSGJzcs2HRaw5MbFmw6reHJDQs2ndbw5IYFm05reHLDgk2nNTy5YcGm0xqe3LBg02kNT25YsOm0hic3LNh0WsOTGxZsOq3hyQ0LNp3W8OSGBZtOa3hyw4JNpzU8uWHBptMantywYNNpDU9uWLDptIYnNyzYdFrDkxsWbDqt4ckNCzad1vDkhgWbTmt4csOCTac1PLlhwabTGp7csGDTaQ1Pbliw6bSGJzcs2HRaw5MbFmw6reHJDQs2ndbw5IYFm05reHLDgk2nNTy5YcGm0xqe3LBg02kNT25YsOm0hic3LNh0WsOTGxZsOq3hyQ0LNp3W8OSGBZtOa3hyw4JNpzU8uWHBptMantywYNNpDU9uWLDptIYHN2wgm06BbDoFsukUyKZTWMANG8imUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6Gdl0MrLpZGTTycimky3ghjWy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOkWy6RTJplMkm06RbDrFBdywkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTIptOiWw6JbLplMimU1rADZvIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOmWy6ZTJplMmm06ZbDrlBdywmWw6ZbLplMmmUyabTplsOmWy6ZTJplMmm06ZbDplsumUyaZTJptOmWw6ZbLplMmmUyabTplsOmWy6ZTJplMmm06ZbDplsumUyaZTJptOmWw6ZbLplMmmUyabTplsOmWy6ZTJplMmm06ZbDplsumUyaZTJptOmWw6ZbLplMmmUyabTplsOmWy6ZTJplMmm06ZbDplsumUyaZTJptOmWw6ZbLplMmm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", + "bytecode": "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", + "debug_symbols": "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36dCfZ8K9X0q1PepUN+nQn2fCvV9KtT3qVDfp0J9nwr1fSrU96lQ36dCfZ8K9X0q1PepUN+nQn2fCvV9KtT3qVDfp0J9nwr1fSrU96lQ36dCfZ8K9X0q1PepUN+nQn2fCvV9KtT3qVDfp0J9nwr1fSrU96lQ36dCfZ8K9X0q1PepUN+nQX2fBvV9GtT3aVDfpy3MvmxQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fRrU92lQ36dBfZ8G9X0a1PdpUN+nQX2fBvV9GtT3aVDfp0F9nwb1fTrU9+lQ36dDfZ8O9X36wuzLDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN+nQ32fDvV9OtT36VDfp0N9nw71fTrU9+lQ36dDfZ8O9X061PfpUN8nLFDgZw3ObMw1OLMy1+DMzlyDM0tzDc5szTU4szbX4MzeXIMzi3MNTm1OKPWzBqc2JxT7WYNTmxPK/azBqc0JBX/W4NTmhJI/a3Bqc0LRnzU4tTmh7M8anNqcUPhnDU5tTij9swanNicU/1mDU5sTyv+sAanN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dEpk0ymRTadENp0S2XRKZNMpkU2nRDadEtl0SmTTKZFNp0Q2nRLZdEpk0ymRTadENp0S2XRKZNMpkU2nRDadEtl0SmTTKZFNp0Q2nRLZdEpk0ymRTadENp0S2XRKZNMpkU2nRDadEtl0SmTTKZFNp0Q2nRLZdEpk0ymRTadENp0S2XRKZNMpkU2nRDadEtl0SmTTKZNNp0w2nTLZdMpk0ykv4IbNZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0y2XTKZNMpk02nTDadMtl0ymTTKZNNp0w2nTLZdMpk0ymTTadMNp0K2XQqZNOpkE2nQjadygJu2EI2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZBNp0I2nQrZdCpk06mQTadCNp0K2XQqZNOpkE2nQjadCtl0KmTTqZJNp0o2nSrZdKpk06ku4IatZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0q2XSqZNOpkk2nSjadKtl0qmTTqZJNp0o2nSrZdKpk06mSTadKNp0a2XRqZNOpkU2nRjad2gJu2EY2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZFNp0Y2nRrZdGpk06mRTadGNp0a2XRqZNOpkU2nRjadGtl0amTTqZNNp042nTrZdOpk06kv4IbtZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTadONp062XTqZNOpk02nTjadOtl06mTTqZNNp042nTrZdOpk06mTTacONp3iAjad1vDchl3Dcxt2Dc9t2DU8t2HX8NyGXcNzG3YNz23YNTy3Ydfw5IYFm05reHLDgk2nNTy5YcGm0xqe3LBg02kNT25YsOm0hic3LNh0WsOTGxZsOq3hyQ0LNp3W8OSGBZtOa3hyw4JNpzU8uWHBptMantywYNNpDU9uWLDptIYnNyzYdFrDkxsWbDqt4ckNCzad1vDkhgWbTmt4csOCTac1PLlhwabTGp7csGDTaQ1Pbliw6bSGJzcs2HRaw5MbFmw6reHJDQs2ndbw5IYFm05reHLDgk2nNTy5YcGm0xqe3LBg02kNT25YsOm0hic3LNh0WsOTGxZsOq3hyQ0LNp3W8OSGBZtOa3hyw4JNpzU8uWHBptMantywYNNpDU9uWLDptIYnNyzYdFrDkxsWbDqt4ckNCzad1vDkhgWbTmt4csOCTac1PLlhwabTGp7csGDTaQ1Pbliw6bSGBzdsIJtOgWw6BbLpFMimU1jADRvIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOgWy6RTIplMgm06BbDoFsukUyKZTIJtOgWw6BbLpFMimUyCbToFsOhnZdDKy6WRk08nIppMt4IY1sulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDoZ2XQysulkZNPJyKaTkU0nI5tORjadjGw6Gdl0MrLpZGTTycimk5FNJyObTkY2nYxsOhnZdDKy6WRk08nIppORTScjm05GNp2MbDpFsukUyaZTJJtOkWw6xQXcsJFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUySbTpFsOkWy6RTJplMkm06RbDpFsukUyaZTJJtOkWw6RbLpFMmmUyKbTolsOiWy6ZTIplNawA2byKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDolsumUyKZTIptOiWw6JbLplMimUyKbTolsOiWy6ZTIplMim06JbDplsumUyaZTJptOmWw65QXcsJlsOmWy6ZTJplMmm06ZbDplsumUyaZTJptOmWw6ZbLplMmmUyabTplsOmWy6ZTJplMmm06ZbDplsumUyaZTJptOmWw6ZbLplMmmUyabTplsOmWy6ZTJplMmm06ZbDplsumUyaZTJptOmWw6ZbLplMmmUyabTplsOmWy6ZTJplMmm06ZbDplsumUyaZTJptOmWw6ZbLplMmmUyabTplsOmWy6ZTJplMm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rQ8vtmgjeLFFD/Je7CQa+/oeJ9t+jlJTdW+82Kot6cQGtOSt2MyWNGZLRtWWdGKrtqQTW7UlndiqLenEVm1JJ7ZqSzqxVVvSiS163A5XrseWd9Du9otTtnPc9Y/blxdVkZz7ZkzXGW/8HFVFnaEzitbH0BlFu+a+GUu5zLj9gL+mCvvcN2O3y4y9b2cUbbG7ZizLuTvSjVsbmioZ9MUzhridUfQscuiMoqecQ2ecYc9xZswz7DnejDPsOd6MM+w53owz7DnejOkJZtTsx9D7RYRblhuxNSvPja3ZYl5sUV/Ija3ZNW5szfpwY2s2ghtb8yDvxtY8P3Vji55yLmaX2DHtV6r3riRVUWfojKKnnCNnVJVY7pnRu7ReRVfcu2Z0Vtwqeinv8zOeYqtenVsuDnnYfoBOq6oX3JZ0jb293ltVr6Ety17spnqMyhf1fcnbV0lUwZmlXn8lt59F2FQNGS+26tLlxFbdo5zYqquRE1v0ArsTW5VY8WKrHred2KJXtr3Yqher8yV2qI6pGPNlxvWP2y1X1TYZOqPqi/IjZ1Rd+0fOqHqOMHJG1ROKkTOqvig/bsauapsMnVH1RfmRM6q+KD9yxvn3nK5qYtw3Y79cec69bmec4bi6f3W9q1oKn5/xFHuGFXSfvO6qN3qP/Oenep/yyJ+j6k3NQ3+OM1SeN2N6ghmnOK7uktdd9UbsoTPOcGrvzThFP+6Snl31fvCRM6rePD50xin2HGfGKfYcZ8Yp9hxnxvQEM06x5zgzTrHnODNOsec4Mz7BniPrJ3zxjNvLibJ+wsgZp9tzbsw4xZ6zS5d3WT/hS6913JoxzX89R9ZPGDnjFHuOM+MUe44z4xO83iHrJwycUdZPGDnjFHuOM+MTvG6VVW8l2L1xo2fkrQRdVDlwYyNvJeiiysG7e6ls+84iUeXAja3aCE5s1YO8E1v1/NSJnZixVc8indiqLdmu98BubwbvsnCBE1u1JZ3Y+jfc3YpdkTfcdVnMwYmNvOGuV9GW9GKLtqQXG3lbelcFLrzYzHNJVeDCiS0LXIxDeHpTPcjfNeOui96baiOMnFG1PkbOiMOUbs2469t3WS/lrhl3ffsui6t8Kfx14/4XWYllHG7WZdmWgTPKGi8jZ5xhz/FmnGHP8WacYc/xZkxPMOMMe4434wx7jjejqrgezm/1DN0+3maeF1F1JPRYL7Hff3r7KbaquO7EVhXXndiq4nrql9ibt7+usTXrw42tKq47sTUP8u/+bd+Krfq5JM6vpOrnkjixVVtyP7aoIePGZrZkYLZkUG1JJ7ZqSzqxVVvy87F/Xf/b//3zLz/8+S8/fv/P9e/89n/++6e//uuHn3/69F//9f/+cf5//vLLDz/++MPf//SPX37+6/d/+/cv3//px5//+tv/993y6T/+Jy9W/5CX1NYn5Ld/e+t3TnX9czj9n6Gt/6fF3/6H8Pv/kPP6P+S65liz/H8=", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 448248e2519..2498fe2bb8a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -47,8 +47,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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zhvqvKHOG+q8oc4b6ryhzhvqvKHOGwreUPCGgjcUvKHgDQVvKHhDwRsK3lDwhgZvaPCGBm9o8IYGb2jwhgZvaPCGBm9o8IYmb2jyhiZvaPKGJm9o8oYmb2jyhiZvaPKGFm9o8YYWb2jxhhZvaPGGFm9o8YYWb2jxhjZvaPOGNm9o84Y2b2jzhjZvaPOGNm9o84aSN5S8oeQNJW8oeUPJG0reUPKGkjeUvKHiDRVvqHhDxRsq3lDxhoo3VLyh4g2xUzd26sZO3dipGzv182kHl5PLxeXmMrnkDbFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnp+7s1J2durNTd3bqzk7d2ak7O3Vnpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1ZqdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupSp+4Pdepn2bjsXAaXg8vJ5eJyc5lc8oYab6jxhhpvqPGGGm+o8YYab6jxhhpvqPGGOm+o84Y6b6jzhjpvqPOGOm+o84Y6b6jzhoI3FLyh4A0Fbyh4Q8EbCt5Q8IaCNxS8ocEbGryhwRsavKHBGxq8ocEbGryhwRsavKHJG5q8ockbmryhyRuavKHJG5q8ockbmryhxRtavKHFG1q8ocUbWryhxRtavKHFG1q8oc0b2ryhzRvavKHNG9q8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", + "bytecode": "H4sIAAAAAAAA/+29BbzlyHHvf2d3Z3ZnZ2G8YCcOMydqSS21gpt4bcd2mDnpbqnDzDxhTl6YmZmZmZmZGf6PXx7/vz/NSEej7Xt2Nu4bjz95J1nfO/ecU2q1qqt+9avuqnMnV18X+O/ctd9vu/bz3Obn7SfXv5b3Hrr2s3rmXqagrOqsxnju2WCMtzwbjPHWZ4Mx3vZsMMbzzwZjvHAGY5xfW4OkQUvxpVh6cJqYCyenv5abfMO7rv68eO3ft2zeL6ik5uLuuiXlu8rWFzP3V3D8zcXNHJ+B/P7iRuYZyK8WXXnGlYP8/b0senDu5KyeUxvO+D77u3f3drK5l+Xat53Ntd253fVOdvd5srv+nSdnqlPm3O56y3j287P8fvfymSuH8ZzbvXfblUfex/Le+SvX34ded/DfEzaf2+vWLZvPveDm95e69vvZ6uNVu3GGz6C6/8g9L3+7/crJ+lrm7dbN35Z5Xeb5ju3nd+9d3Lx325Xrr3PntX/ftrnOVtYyjvO7z7/AtX/fe+3nhc13lu9fzlz/wu76140787f9vFzMfP5i5vPyc0+89vulk4Mve9KVg7ySwHWR//BG/q1nIP/Jm3stLfspm7EXlL/6+aeezdys8l+9/Nyssp92NmO3i/ynlx+7ld7Lbg7X5J2xn20XW771Lctree/85to537i8bt39e+8/XmUjd/+5/TW3NuT8bi62n3/o2k+cgJ9M1w1jV6fKDL0ZKts3Y+ub2oYU3OhSrCsTp8bUfQw+VrHtfe+jMz62bj/e85lxnNu9t3zW7cZ3Rrikum8j92R3ra29vO1K+ev3rqqW6y6+6vzJI5/59vrnd59/5Wv/vvOU+3joXzjO1HuTGp+89ePYRr+fJ71u2cxTbn1tx1TwmYVFny+dPPJ1o2toGZvG/V7Xfn+sa+iu3Xtbe3L37r2t/t6ze29rC+7dvXdh897l3Xu3b9573O69Ozbv3bd7bxtv3r97b5mX5f2Tk8PzvLT5e8Hn2d1obLBc/86TM9WvNTa4tBvPfn5u2c3dXZmxXt69p9eCXc5l3rs187db/p+s+bXXQ70euvazeuZe7SJ7WbeFdWpadOSek0e+lvfu3Vx7r1uXd+Pavve4zXu37d7b2u3zu/fu37x3YffeA5v3bt+99+DmvTt27z1+897F3XtP2Lx35+6959i8d2n33nOeHF4Ltl3ee+Lmezk7srxyPmCNGfnvR+44yN1/7mQ3nu06X57ZWcbivOpzJ9c/++We9uNZrn/vySP91V5vtmN9NF++nYeHlnuagm3bNE21M3YcfZ9sM9VDjD4Obhr70bkhhHYKY9vHxnVtamIdRsBhN3o3mD2/cJ1sa9uxb7rG2OA64c86jcH3I3/sU4geOOqnYOrJd21vGt5qmlS7tremdvERXNpWdp1cE4Yx1XYIdehciGPfQnh0TcU4+962Q9WPqYpVCtCbNtnK9dG60U4u1mO7x6TXyY6+r6Z6cmOfmsGbum2FhxvolNaa0HYmGZtcaI3v7ZQaMxhbVy5ZH/zQuZVLPZ+RbWKwaeArYep8a6fBhIpJqnn1Jg7tMLRm6BJzMtZ1tGM7RSB7DK6ZYpr8sMi+kJtvP8QqMJrOu6k1Y9NVY1VPHbdiRxMGF5t2TBGJ3dDyjJ01ruuntptM3SW/jvv23LjHsQu+6RsztcNYGyan6aZhbEczjX5kYqaQhjCOwxRCV/na1hPPo/VdM1Sp84vsO3Lz3fqp9h3PbbS1icZ4Y0JvTO1DGKepqaQdVR9c5VAjP/Cz6ccK5fTt1EzVIvtibk7GuorMdxVsNC2jY2olhIfFkP3URM+jMB0fq9qhr7ouulBP09D1zox9tcfB18meKhbF4GqTpqEdLU+rYlRd45HSxs50wzA0PkyjbZvYo9iBsIvfwSdD29pjvrAe2r71oR+GYCbTDK2bUuKZ1nHqh5D82DR2rAZjKmP7igfqnCeO6ydTEbmN4yL7rty4GzcMCaHMYWwDKz9MTdDl2ogsFnzPpSZ03rf95Gu009fc2OC1aIdm72ev0xMmt6vb1HfGE1yOvR9MtKnpmfGpZW6GwZrR+hi6YEJILOIucokm8YjrYR33PTnZDboxpKbrjUv9aFM1+NHZ1hDKetP4mLqAhoeOx4xCJcZedVXH+q0Sc76unXuzz7L1BsrUWFf1fVvVwbDKm4jKDVXom6HjEUY3DU3ybdu6PnBJ22MyWUJpXPMbl7OysT42jW3ro9HSMKHrq9GnyRCVhZG78ANqXtU1b8cBO9t3TNk4tTyE0S2yH5ebk1Erkru1Q+94hsx227A0+7aviPtY9ygac+1MPXgbBt+lsW5cCwnAI51WHbwvN24/8MxR3tqNrcNy8WDHYbRViyHE0g2M3sbQtrUJXGiMLKs6Vg0md/KxWef7/pzs1KcYx3piucVuGgcIiM7VqXHe14Nh2aNoaAUG0fbcGQpV+5HPjJ0PtV/X5QMZ2XWHVR0Ya8J2M6029RG1Hlk3jhU+TizXAS/mWVxjN022CQavNyQsY8DKLLIfzI2bNYZf6SwWpXVdNdkuDLgu3IB31Rhi27UBZcJ8EHRjgCe4FFS+b7umrqvVpz0+N27UthpG5xMWlrlth8ZWEetdeRbiWFW+GSNzzTJMaFIcgu9YXA5/PTS4tUX2E3LjxqoNdew6M7Z1bytG7Su5Ci3WJjKzTe195EEkw4VbueKIX05iibxf1+Vz5MZtXYOpi0xkh0fsQ43tx59PYwqhsqy8OjqsCyYwDhUKzXJqvEHpfRvTsM73c2Zkm6lJLJeOtdGMHUQG6xEf2dumbxOeTcvKYBxRcNYO3q+Oicc+dAyj4nuL7Cfmxo1ZmGIIDZ4HFxR7HqRpAS2YDDtMQhY1oGWa3ARywWczWrSQJdHyhXZdl8+Vm+8xtcIcOGJeSZqHgwDidPUYuHPbDd3owiCJqJLBGVvUyPSsfBbEik+eOye7xszJHzAOZj2hGCamFnUDWnXoX50SK8WgkII8g5xx7JoQQ4rAk9V+P09uvoM3k+W2o9ZE13cRgrCuJlfXtktVA0cIlE2s/iAkxOfwapa3akBHF1c7+LzZcTODLcvSTZ2LQ4dpws8yl6y6aPuOq7XT2Fhb+ZS0mMAXmNu+BRKlya568nw52Y1pesNijt3IkD0KE33VVr3cuhtjhWtj3U61mZUn8nDxky7iUTu0dsWxz5/TE54d2tHqkXUd8LixQ+o0I+M08FAdVrGrgtblUAEcwFb4iHoyGHXGs8p+gZxsvGKdWBhdYO23dQP08dXQR9yc5WGNoR06lk9dAdLjUJsmVcnpC9wI31lkv2DuWQoY49yHrrN82/TMet3WPo4WNxwqhzdOuDwPugBzAofA9D2rJjBF8YDtXyg33wDJmtCBxZLGpkbz+jBZC1jtYqjbBpzFiiSCANI6ht9XbYu1Bd1i3saw+p0Xzs0JamxtmqrRAt+T7VhweOHkUaCIAgInupEHOsZeSMYHboZnVPM/EzZn1ZMXyY07djwisLbxDLHDv4KoeJzWoWaNvBHIJ6EweKfQoCGY8Qis5R6TwR8tsl80N+4JPUNTA9PB87Sum1ggWot1SJarxdrxVzs4+WOD7WXt9BOXrDDK45qrfbHcuD0Bj+v48hhYzinVAwAEFcCKjACXrpZttRUK0nvMAaahDZFFZrvRmGmV/eJZPTGpNq4ZUEQyA5H4AUAIrK1qQPIwdaCgKoCUWZ3eGl83E/5PiKsj4jqsy5fIyZ48kpg4O0oSjsckx1K0LHiTUlQAhfJgGSobLHYWG8zE45pGjIpb9fslc3OCQtUNgR5hHyoQI+CpAezU/UR4iGZj7xq8AOAvmFaIqpf2G8yVcX1aZb9UVjaelSGZCSDROgUlIGFcJEkRgBwRTc+coRRuUAxH2ExY11ayEcQZBxv70jnZoTGEeLEmWCSCAuPMaAilB4OgBzwydBFDjIr7NsxBgJI2ICLW6rDq4MtkZGMnBgDmYAbvEvCpGaTDqFsaABVTPVY4VIsBi6QFbBiBLbjsRAgnXD2t9vtlc88yTX0ivgPbOOKOAe9mWtM5rByesfdai4Y54zMWf49f6lotoJZJ07UW2S+Xkw2MwWdzow1ScZQ8y5FgHhjYjpNLYHpU3coAjBUmbSIuiiwzM2HC7SFOq3KyAQwJbMmqt42M9Ahe9kwOJtcqACLP1U9gkhH8QzBiiQ99F0RRgGu6FbOZnGzUDT0BPrpOCNtzu8SarOxGoRq+3jUROF81uCYCCCYa5B3jBGIk7l7npM7pSc1yAGVXUCZE2TACnuCPYMMlLz0mwgoKGUIi/MaLTCzbiVVVKTaOw6rfTU5PGPLQNjwqLGycmFZ8DrEEP5NBNcgVOkaOFOB+4tqgWMwLN2V6IswV27e5OYm2m0LT1XiVWAuejARsrJ8E1QGaxxZOgTitncDSWCjinQQHxJ/xIdUBx9rcnEwgQMUu2AqsDzM/Tr3QSegICUFneAz0eTYqZL+Q2PeN2Bm+tcWaXU42DisRUjuLB260oEcoE1Y2CAE/EXhm/cAzHWztPOSQgq66c4Z4FA3vV5/W5+bb9wbGBzlBBtyTNzRVmjq8nGJrMzqCOEIsFiMaYol9xohJxhijsVVcZbusngDLCD0qO/AQJ6YH/SMGCW4gogZjoTkWtcc21IAgdBErjBMCYE22P/AnQ3a+Yb0aJlsuIjIb6InhgdWjwFMLzdQzXRbHic1Cg1hEWEVn+gHiieBqkf3yOdkDWMDz5PuUqs4S1gEqiBPAl6x/8AKmFLYJG4BHbTH1YBN4oAnqRveyyn6F3Hz3OO3QBwRPLOYGCEmUDRivibCYDjFHltUOMcm15EmY6xi5moUKOuzje8WsbAZHBBVd1SW+FWQKCYRBq31vgngry9r3Xlev8CCoKuoDUwRvRRC7yH6lnGwT5RtbwXgFpLAL4B/WHiwMD60n8sZhEOTgn2BpcSXwsQQVQR8DdS2yXzknO0wOhRr1PyiBm7yoyKYeKtzniGvz6HIbwYGwngQZwj1EjIQojMRN67p8lZzsCHkm0pGguMW5VLhxRQ+OiANmynRaRf2s6cC3GtuATwi1iC1HMLHOyUM5PZkMDGMnVhG8jQllYddA2tBASEJddxXzBdpvZOArAldQP56ep8sDapt17bxqbtw8IYxmGhOYBDgC7sGKE10yWqIrlAQQiv2GmhxgxQgWULy6AS33EJL1agdfLSPbsGpwjywUvAF2i/iJaSbG9xbQnQz4thbRgU8g7MNmwpVDnFR4QkC+WX3xk3Jzgrdl/cHRE6EDsRrMYhdAl23dTrPPgIBR/GFZ4YPiFBh7rINtFaF367N8OCe7qbh5wm3hbNAEnOIAuQ7jWCXceA3AH3ox0wPPj/WUOuIpA6ZtoZf6aY25n5yT7YhUecmfMysyXSO3CnWKDg9QGiLea0JCVLVSQBhFECpAb1lKbvWXT8k9SxY5uBojivfBbEOte4YImwv/jYfmoQ749IRBG6y0pG145nwKN9QDzxfZT82NG9sJTwDM7moMJ6JwLC13PAZWFZFVhQ0gRAgEaNbBqbCOxIoAOkBNYZX96lk9sUR5FfTIBLgSh2taEWsOSAUVAyng8AdRVDhGgZVICNtgA0TtQVesPMTTcuNGZblX9GBgFVkcomwnELuduUGDJ4IPJ/w0jRMNQXw4Yn4JnknakJ5ZZD89N27QK26bpYbaWW0XGokIaku4M6E+tW6CELYe4G11YTzOxOSxpODMwUuL7Gdkxz3NOlVBctTgEZa6bHMUFIGOIs4BYKDhY4Xmsyq9gEMLAUkM5+FQFtmvkdOTOMG3eNjeFrwGmYJBgSriOjLRFofGAiEI7EQjof7gzoHItq8wQ/AJqw6+Zk52S96AkLjCn4AfmgBzPMD+9XCFxNSQzLhpDPYkJiGM0ms8hfINLF8C70X2a+XmpJJJxWuTXVC+gUgWOgV4jFai1l2FahOODTzniniCGW41aNkckib9Ou7Xzj1Lgi4iShhh6Fu0oMJ9QeRBrY0sUK8sjBgmjI1LsjsgWBY9OumwRKyuRfbr5GTjwvkKHjcq0PBw/mB9eCX+YOZslCUCxuMIjkaSVUBqjIoHxcC9V6tveN2cbKAjpAKepIE/w0Z1hIDk5Vj3IHACNp6xLC4ow+rCOD48INYH5IxXW+Pi18vJbgn5YEGhThsScsonCi7BFALcWT5w3cJF2FOQHV6CsBk2p4LHJinRjquNff2cnuAWvAJ3m9opQZ9DO4qyY1AOB4zFZUo6oXn8tAwJ8UJq7Jxbgmpa5+QNcrIZM8Gih8YjM+lnNNYM+CutINFtEKlAYew1HoqEDhRQH0j+DKR4QOXrmn/DjOwKRA+cnG1eQ/5lCA0JAGYEEo/UA6kFaGb4G+wO+M06KOtWHG6jzCsk7iL7jbLPktCSXE1f4w8naXSLT2gtIRnLhRU7ONmBXgNNHktpgYfR44zBRFx7kf3GOdlER7gSuBlMFOAbe9e3I8DHa3mAWJlikEQzgb8JL4c4BkBb60I1AqoP+cs3ycmG7Zum1kJPD3JZPTkHERtMU81ThaBpeb6sxQT2BqWJkgGmhFEKaw68z5vm5rtFA5hjmAjCL3AUbAZhzig6eYRXYZRKgzoSDoMBAZENEk2Op/So94GjfrPsnBDKOEDvHISgEFh+bQkNDpaHdBpoAupUxDHxJCG9DSQhyAO1TCM3u2KfN8/JxqWTDhcBPY2w3y3YJ8qhKQc9gtFY4m3DwLEmtdLbw6hsI4l/yBmIikX2W+TmRPgSAN9NzF5UnoeEInreezJFuDpmegRbAl3IBQDqbIx+DtqiWJV+nZO3zI27HrFUBCOoLZlj8k6OeIPwQaxPxJVW4HhZbgwrYAq2TByH7xTQy4Eust8qJxviAhYCJSfJ2OIb6i7UaAGWBSaTp5YI5bW8QM9YccjshFGeapg4q+ThIvutc7INS4BlrTkflAzkIcFDJGjGAaTjiIHB9B1cNdbVdKCiGBRJNRgG+O9V9tvkZI8J9ijYGiLKQ/hDrddB2f5uXujcCarCzRGywrNwKfK+5CIaCBvMUFp9g8/IRu2SIj2M1TiiGQwd3B7REGiVxgVcpLaReEkivUMADkeBpnfaMEBQtMgOWT0xmCk4uav4NCrX3NdoV9U0QBCyM8DBYaileWB0gh0QzwjXgrOfoD8W2TE3brgiEgAAkKnSjg2SaYA9snOGRYSmdzAD6LeofFhpAltABHbbEmXCwNUrPzhm52SOiImWJpEt1QSoBvf0zD/YCrcJOGFugUHiaUDLeGAICWE4pcPcsjdo2she9v4s102bv5fb49TZc7vrnZzk94Eu179zN9ay4znsA0278eznZ79X720zY72cee/c7ve3zVznbTPXycm6paCsWwvKuq2grPMFZV0oKOv2grLuKCjrYkFZdxaUdamgrLsKyrq7oKx7Csq6t6CsywVlPa6grPsKyrq/oKwHCsp6sKCsxxeU9YSCsp6joKznLCjriQVlPVdBWc9dUNbzFJT1vAVlPV9BWc9fUNYLFJT1ggVlvVBBWS9cUNaLFJT1ogVlvVhBWS9eUNZLFJT1kgVlvVRBWS9dUNbLFJT1sgVlvVxBWVVBWaagrLqgrKagrLagLFtQVldQVl9Qlisoaygo6+ULynqFgrJesaCsVyoo65ULynqVgrIeKijrVQvKerWCsp5UUNbDBWU9uaCspxSU9dSCsl69oKynFZT19IKynlFQ1msUlPWaBWW9VkFZr11Q1usUlPW6BWW9XkFZr19Q1hsUlPWGBWW9UUFZb1xQ1psUlPWmBWW9WUFZb15Q1lsUlPWWBWW9VUFZb11Q1tsUlOULygoFZcWCspYc+bE6FrU18y7eYbCDqZyKX4bKJ9Nos1k7b8SsJ9t7bVsb+9Rpt0QaQ9TGJJ0UOFbHotahuCGZsQ0hRm20b0jMR6Mjz2Oo6srWQ9Voq3Q1TL4buFjXmVBPoW+jO5yDvjUnO3Vk+83gJpMQ3o+Tbxtt2dRGoX4arQ2DCSl1tvYjH/Vt8q7t3dBXY1sdzo/k6lhUsUmVrXwXkmUqrHbHTtZOjN7XgzcN7yffWluFkflrk/Fp7KJNfW2Sa6pjdSxUEWBqfOsrZnUc6jT0cRg747rYxWby2vdjrSrLtdrNF6Y69S7WMcZ6auxg97Wxlme9fc63b/5ecE/ADdeqWq5/526shcez7lG4fTee/fzs9yjckRnr5cx753a/35G5zh2Z6+Rk3VJQ1q0FZd1WUNa+ruL2uTx07acO1LBuOutjalNQIZAwNsFEw2roY5+mupv8EH2NgemmpnUss9Z102CiNvsfrYfijLFtZ43O+06qHGCsH4aGBRqcNyH4IQ2YAzelNgz9YFRfZ6qnAdkYN3+0HkrFEKdx7OqutaFv/KhDhcFV2sAZdHI1+MbogLlpq6k3qrfQ9G1vh3ZsNvWEs/VQxinadurGkHqLVUy+t8H3w1DrdI3OY9YT8zLFsa1VYGAatWEPc1d545vDGZBcPRRTtUPSkVTbdcGa5H3S2Uxvx66JOsFRmY67mUZXV6O2RVdNqEzCBNe9t+2wr/u0POvtcz6jumE3bG+W69+5G+tZ2Zu7d+PZz8/e3tyTGevlzHtbu719b3udezLXycm6o6CsiwVl3VlQ1qLvR23C0OBdtTvR9zqYreOJzTCF1OF6TVBVk2CbWkfje7l0jI+ZtBnY9l2/qfmQswk1jlkO2mET0mBThaTYN7Vp2in5pnFRRSDGoKo6ocXwuc67oU39GLTdvj9mE3SKxMVp0K5c1bWIXKeOAyhh0LbMtmGt6kx+U2nbbYfJSINvQ13Ph7frcNQmxNaBQ3SEZUh2THVV19YZWzVtMANgzDVd641J7Tg4l0IfdbYuNfXoTMOl9ut+K7vCTPnYuX5KNrQ60FtVmLFBdbQ6/jClBjTZ6YSV61QAQxVnhiG4GpQWXbZW4N7ebPcEPSvszXL9O08eqZNnYW/u3Y3ntDWSq5e4fPdy5r29jbicuc7lzHVysi4WlHVnQVmXCspaa+mfnG4T8LdjpRoToaqisxPLyRjjY21H3/YEVJ0dBqA/wCQQpqTOYBhMG3w3NpGFecwm1MY5V7VGp5/DCNJRSaKosz46cx7CEHTGzsXQ6gz0GGM7RScwocNJhC1HbUId+0kHib2t24lAwxE6ybgFH101pBh0IsipVEiLWSDSqqxR9SODNUpDPGYTaiKZOLXO96HBSNW27nWStZ1aHwampHKmZoZSJLZqveykTvP5aUijI7zy+3V/neyx8XOJiUnFH7CErnLJOdV4Umypo2JBJUWCb6uWqRtbHZAxgMHJCLrt18zyrLfPebvX71lhb5br33nySJ08C3vzuN14TlsjuTqry3cvZ97b24j7Mte5L3OdnKw7C8q6VFDW3QVl7eurZmMH731jJxUKC3AVRkRIM+k43zgQgRDl1CrH0wyqZDSERPAAsqiS+JM49P1Rm9COYyAaGX1lejMS7JiBL9sBIBCTzrKZamiIgOBebK8SjdXYaSzwLqASc9QmTKqDNPAFx+h0ILgyroZr6lV9QVUtul4lG53piNY6Z8FksdYxyxBGQpZjNqHqEwP2vYxkN46V61JP7JTG3lTRwjWNoBOnwoFh8A67mfj/2vm5lCIx0n7dXz8nVQ+dZVrVr4yOUNOPTM7UgmvS1A5BwMxz8XoMKqjIx0ZHTJV0vGzq2v2aWZ719jlv9/A+K+zNcv07Tx6pk2dhb+7fjee0NZKrz7x893Lmvb2NeCBznQcy18nJulRQ1t0FZd1bUNa+jv7WJux19GaL+c+oPv/RmP9SZl5z9cz3Mf/2vf1ZnBzWvzdznZysuwrKuqegrMsFZS12YdHDXD1nUzsdC3UTQM+5cQ4vCcWJRScMt2/HVsWubfQqJ9moNujQJdVIiKr4N6znF3M1gA0hfnI6COkmOEWd5K+h7LsAzwDENC6CnVvVHB3qXrUYVFhRhzxVBa3vjvpEYDaEpXM1ONbVTRqj71LngwqMw1PiXQdiirbtgd6diielMEKhqpaAinWvPGC2BrBK65EUSR2B/MTnoRSGqrd934ToujrUbZhJhjkKj6Q8/DjWvXWq81ebbq/Xy/PYPoszwqU3bBOW69958ki9OQubkIslc3qc61WwfPdy5r1zu99zePxxmevkZF0oKOuugrLuLihr0fdjNqGGHzNEmiL8BripHmgLm96QryPPOVeTDHCFnjwE+c1og22NgGLjK4j4Q+3ArE3oUpzIDfTgPDKdNXwdSU9V8rIg5mZQbT+CzwDVNR9fV/FxU41+UKE4rM9xnIyVgjyoutCRjez7qOqegSzB4HrC/8G0A8E1ZsEyettPRM2RpU1uw0999MdsAt8OTd32IFdsgGummkwJuRDStg2ZksF1ypAM0A1ReB7LAVdRwUqOvh6ji/8vdn6kTTir2HmfG3hm4soLBWXdVVBWydj5RmxCpaoFJpkE2T/4aqwSZBRZ/6YzHY69VhGGCJFHsq+2U+/6WtsWhqDkPR+Px/Kchu+q9hrkX+1GhcxkAhOpSQJM8nwkCFIHQzdF2KiadERjKlWpUnkj0zT9dMzekNwMEHosdjuoaB42zTjbN0n170Kt5gCqAjbaZKdRlXYGgy/HNNlerOBRe2MaD4/Q12pfotLQdRDd2LpepRXNJFIwYjxVhg6sUMG6AWsm0IdTvbFpvBH+/mazCWfN3+dswjH+/kZtwp6/v1lsQklbdRb25WjsMITgPDAZzqsm7wUXPfQkxQcVGu9G1ing3FvTq5g87BGQ3IMfpn6KTTPF4ahNMABuLSx8eNSun1Sp8BoXSlXr/ag6q+1cGCWp0nOCu68GXWnSPqoQjuY5pxZUYEku+Ab7UvXi5gklehh7+LIAqpctcyqr7VLtDTbOqJeOrQ3E3dGYp4rwWZVKZqZAWEI2sp4q0ndwglNwBDt2nGAEoyr8cDEmx8DlTca6zrWTW/csbe3NzW4TzojfOGoTtvNzM3DsN6tNKGn3Fn0/GjsEi8Ob3Ni1ZNcT0bMPlgx27MmPN0T9xAe+8i3u141JWoelAExMJNarLppHwQnaChDbue+Pb9zEuiGG6F0rqpqsYDUa0vWkDHG4IPJAzsxa2H64c9ce7Q9VjWEcG1ZjM5d0V7kp1SjrekiO2pETc52tp6GqTasizQ7+mmwk+XqSfo67PJrn7NXl1tq5nn7Dd4PiAgKm1GIXVRq37TGhrfXJdmHeVDQN4I+KWdRuhRvZV3Sz2YSz3leUswnH9hXdqE0omSv7t2ATFn3/f3ttH6mjZ7XXdp/HeGb2oV4uKOuegrLuLihr77dyvqVq1DIOOtnhYoaeaLRuegvEJEdLYrhXjVgzENeGFpipNhnOEddCVrme347izcqoujiBppcs3/a1b/RvC/xrY9e1PqhBJSlbwUCVyRxrLmDrcS4Me3SvrVGdaXxsMtGooHuaqxPHXkVpuQU1roihDxaf2LaTOhY5B5CFyp7gp7rxaL58CIMhPcAw8dRQfoPXrWtLL1liAO6kvjbwglWYK+dblbS0hL+Owcd0vD8gAyM70KkbQhNV2742cAa9dru0uMh2mJjikGrRdjElV/MHCxEwtLWSFEfjct+7iTS5hY50g6r3MshBnrQ1PSLjLKfGsVdVZKJGdezAO8d2dGpNdYwHZH2Pc/+aKZDUdio3mqYIBPDiLnRTUpu5SDJRUF9BdHrurYrkV7QV6WguXm0Y1O5qFK9otM9JtXNbmJZkvPVVR6ZB7erQl4l8SSKNInqFeAaKsY373ML1czIisE11pyMdAxmMmsfFhLT8BKH1nXpHeqbFDX3wVv2b5katda36wfFonh8WplMvyV512+c2StA3TI/t2snHjutFhj8QoMHF1HzIVAGGiFXVqlT/IjvXH1ANwGJbJyZApVtZmVMNuWsJJ9VIoKrbummTNkvVImJD7dEjBWuNCaM79EHI9Qc0ZJ+YQN+TS2oJx6IjgFQnuWEijGxbdRDoxT8nbbCH4q1cN7fm6Nuh2dTRzvUHrHQMaFRt28CymTAhMMM9jLE3lZrKTuoVlqqpIoE0+c57q/LJ7XwGJ7aHNZ/rD2iclAHRENqpq7VwtL3Nj77vwNhQ91ZwGthZqetWHEKtfgxNhNnCuK1zkusPaEh4ob6YJLj3qaqZZGCpG1szP8Ua62T8FMDxtZCxN+TTBjIFFZR4sIeeidn+gG2vrmJa15YYIfaD2iQiCRSv1oVkHEwKvaq0YqXGrnEeMm2otPGVAGFdO7n+gBXRegtyFt9umrbqezi2sWeaiRhUjtlgBMguqP8oiTr1repdNKQforryrHtkcv0B6161oCH7htgy9o6lRLLSw+iR+OOJqlQ8SxAgzyB4xgQgPlZxCryZWFCL7Fx/QJ0viE7ph1SrR1eHcRvUXSlMymH2BCSDwSZ6bLvaoVUdhEQghzFhfu2hBn2uP2A9srLRU3UQmFwduqYbHco8Da7tuxBUxhwiwg2dOnqFjseAoe3gUuY2IGsslusPqEMjOicx1gQxWszavD2XzfboO1ESySD4Hl3EkHbtVE2/tuqqMamm98qrZvsDxkoV7KtxHAKGQjdrCfVwn1EdiVjeOtDmMH+taniLTuJh4IpJFGFw1nMvuf6AtboCjOOkZNUYyTpPpkLHvY+4Sox/hRutTaW+F560lG0neU+1j+1IYR/Oj2T7A2JE4aW6oM4nqtM9GkhxKOBpjOMgkyIGmNTQpJ5sTdNajEBKeFX+buNqY58/NyeYZXVrqW0T9Oh4jtwJkTMggYw6JrCaS/SSDQ99wvY1BJhGTUDAFWZcubYXyMomU8+gyOgDJCJ+U90c6xqzRCqwM+p15HSyD3VU58Nau3Qtea25xem42qoXzM0J7xuZ035uBkVSvk7agQcRTt6ARHzjaq8+Eeo34J16gjgzikLk0s2hh8gL5Z4lVgeswbIc8YrRsIAm18C3qR73pN2skJFx7CyYymELAFOjYvGhVY+lau0NkesPWGlHfoV+jMHMRabtDLHI9qsLBQNTpXzMEnbeiXewXdOimNh11jxIbJGd7Q/oUCgMCJhKhfK1NEiAkuTsOrWohCHE1bet1TFKIGmN9RnbTo2lQ+PgORbZ2f6ACEO9Gx7+0ITRMyCrU5PYZvV4Q1UgJT2Os+tAmXiPgRsFoCTVGW8P+v1iOT2pp6Z3wEadAFHLOAjTOCTm2HorEApD4lxQu77QG8szrUwDBhLOwIGs9jvbHxBHgo9Cv2S9ceeu8irWnRrwtfqcQqWqey7OX222cQcJP6xy+lIns+rgS+TmG3/ro1f3NBXpbtVhJaqDVTOBHIaBmVUbQnxQV+PNeDg11+JTSZvBD70Hs/0B1fhCOSXvauZEDX/B3mr2zfcNJJLOC09CU2aCBSNVPIKWobFHcUuHXHm2P6DIZzumriXJpYVvdc7N6MwKJFWj9Ps0l+FXyxPiiqTq+R4PmvpBSfZFdrY/YOfJdPVqIQB+GttmHMAgPK0RwN3gzayQKwsfRSXn16l/ccfd1QArjz9dZL/MSU4Hez2apomNujWP6usN2S7yzjRJebWG54v7xc64gStpzzmKqc4FQ7Srfuf6A0Lbd3jyCozMJMCfNWr8yzxHNbxFS2SRyBY4DwzHvvIkfEyEbR4IEA7znesPyHok29gLz3eVNinB1kPFTWpWMrSKFMjwVY06WbRe7QFwQ0QnQC4gO5HAIrvKyAZLOaNNQ8BV5rKe+9YboZFJ7RO10v3EgkTHe0u8CPQkqkRxXTCWHMEiO9sfkBjKq4U6dt4OHVMC4kQtOv7pmQoT+quIS1Mij4Z7Z7JHtb5HWVffUOfme/JNDZQHXTZaI841JgK/SWwA1ybmtWPO4kAAhANKmGK8dj0ogUog6Ndnme0POLDuRteJwsWyEfIGfFjV9T0Gtu2FAhh2V8uWxbHCWyhoAEVUpJXI2Cyyc/0BMYOoVwUQwwBWzK93gzrMqd9jxAr2xA2pmWvps9hRv0kWsAFiVWoCttqqbH9AZbhhoZuKwITYTs8tqQlZmJpKfVyZ1kkh1NyZvibWioyXoD+p1+zBz2f7A46JRTz1Hets0D4cFAeXa0C3RNgJa8K0o0MTbo/QDMct8DiyfDrP2l31JNcfkGgAwBClJLhKoCWJ7iEk7cIZWZVgcbLhQJ0BM0kg4XRwBXvVqdVLj8FcZOf6A9Z91ZDArwARwB1CMXX4HoE5+F/Uglmx8A8E9DqgbF2EqAjqCWHUBgijssjO9Qc0jnXpBm3RgRSo2pZgt4dN6ewclZhW3D1xCikHWA11fPRqNa4uS7UZDvsIs/0BW8WVRNHjRLAaxwQGgTfwdXBEtDqV54AuoAc19Kp6k8BaqEmHkvYhmqP9AUnssWgmNXxKUuyG6IBZNq0aLqj9J0EfsWynGFOb+ocEVuqBGup2Qey1yM72B+QZ1f28m16NQMm2gnmGGABm5Fo6VVkY8QfAB0Wa1RTmP2BYAsBx01c81x+QhCgC49CrKUat3irwKR5ypFMX0yDk4qZBhz95hBhs7C+ga6gao63+ZtWTXH9AIwvbqMme8jRE4HWjHvcsQp2CGN2kpiEBY4Oz0RlvQhYQW9XCzWCpDj3Lc/0BWWo8FOBqSGpBREA1b/wIRrqDurfEWIZVi00w2qbFNCvo9n6yAWu4jvuhnGwrbwXqS14H773OpxpnuedEiO2HhOo5+bxGDdWg9kY13tQ2EkgfAqtF9qvmnmXAqILNCExbZI4TXBgcivUtVyUiDsOUVBeEKedhAn36jmCUSGNQj92DPXm1nGxYC/UaaisduY8wdFhxMuoB8AGqAFtYYqZWdQD4iA7NG0AMBI420vUHbP+k3JwwAywR7DxMIJrS4vjhTtSlRNdkOSlCJLrlUnhK9TklbMQvGe4WBnGRnesPiKZi9NTvE/wLXRQJ5UntQWG2SEI9JtLnVs3efAtDQfLQECk2BrA5qu/zIjvXHxAtJoBi2fU8uHbuqOmxgwRSaaYNGRrBbSJ0ccxvr8w8af++kZ7G+tAP5il5PQnqX+sVpCd+VEk7pKzOzuDigWdqq1TBz3i1pJ1gUyqdt8b/AXMPvX2empFdAYeFtvFdisAwoFOH+hnCNqJJdcsiHsNTQI0Rd07qyEXECivWj+pQtupJtj8gnhwigoBHLTpxBtioqJ1YHsYNYCS+sSIMh3r1fQwen0F8Tx6TpaqOc4vsp+VkE1jjruVyBjWNJmdaCygT8KnflOMaYKBmxElD8dVqzJNEZSuQ6+p2ne9sf0CW3NTjVNXDipigYvXIs3XqD80SV8fkSltTIEIEw3XUi+nAHmhezIp9npHVQWw/LEBU51iIRUJ1tTgbG4ROGHNS3XqWWCcpC/hbu0BrDwUP5dZVq63K9Qc0xqLEeBa0Da50Uh91bXSd1Dq6w2ID+yGlGzgOpRjsqMmf4J9gFio7rLbqNXN60oziCpT/ZiE2Xk8VZwXd4WBrWD3AW4w7RLVaS6qxHH8lM+Bn+mZaZef6A9YKdNXsfVDX2IrAOhH8oB084sijVZBZ69grPl19nnvibDhVdWZ0YIGj/QFr1S8xGLgKVob4RsQG1kh7kccO9VPtIJjumugTysBMas+K/endMPQqsbTIfp2cbMjnoRUbynKGhzZzgAKa99ANw+zFCIXkgiIuG6NDdELwTz6gU3unNW7I9QckbRFqJy6tV49romnI0QEaNZpu7usH75V0JbVWAh4n/l5zG4T+Xitzkf16OT3BaasdGux25aJVp3lIE7VxJp1AFDFhEjqVfJnUE4uYnki2BjC2HrOLwVlk5/oDylQEvo+4lllwjFctDqEY+wpymZAZhAPy0bG/gaATpEWs1emQITaoX/U71x8QIAh9Mao8E+uuUhutqW2wgyQKMLYdAcpI6EcgDG4jHiLQ8aJbAHVEd4d+Xrn+gAqbiKBAJMBLwnjQIPhJ7cAJneb2eqxbBmswVFCcOHcVhwhYlJEAwB/tD6hGtySLRp4n5G4LUib1Fzud3W5To9ajxBLGwNhMILlRVHvE4IIxKhI+1WpPcv0BZUVE8TZyPDwv1qZ2hDidowyY61ElJKK6PELPGnw0rO8UtUk1yL6ssVSuPyC8pQL6EbYVFw7tQswLfTeBmy3htg7foPTqaudtN6Coib+JVSWkJeRen2WuPyB0lnozszwbxs3im2AhCNXJEgB7Ujc3uCVgAMLgdgS3WGawQSBOPnzY55ftDxjUro9RQXAR14tiImtHEob8RiXujeC4wi+PPXAQ96mnQoRMPpU8XHc4N/vmWR0kWekgv7SPEN3qCKrgaASyCJhwLLV6v6pJoywwxIms1qAMINlM4O4iO9cfEMyGqYeA8USoUdF2gvStRf6z1IHw+GcAGpk8Upxqda2Oe6TJWEJeFVQW2bn+gChFEuOIK1A5OehYC0PVYEeJ9rADmrIKnDUbAbw1FhnrGqHJscLdwZ5k+wMS5wzqmTiRhUo6IwVA7kDNIEEC36jcGbSXOvV2+O0pKB9TD7o329aHvsu5/oA6HkFc17AE8eKEU4KCsCbwf6i1rPRAqI1qqBQTiKohXzOw/FkWUF2HXo9vk5NNnjCoR53KvLA2yeZGhWPwJmAJ9UqFjSZgMBhAQkQdaQaEAwhrYaW06rfPzQlRCAFJrbZ3BNPcBd+Dc4X+xygJoQUifS8exeI759JTGHbiS3w9f1tkh6yegHrhLHn6sYdMJFvMkoHKhcbEyrL+SFpOVwEb1jV08LGN7CHJsqE59BuNGdlquUgOqGEZezFGDbodYXYVSbJ2hF3AJMq4gpzd3D4RTtYa9YXlQ2vsmu0POKq6oHL7JFxZEJBTXRrx7PhKCA4RSyPcJwsJu6UDNIPnabLS4CBjPPR6TLlx23n9Yj8CI6ug/UHzcB3Y2kH8i3TF61wfvo/sNnFIp+6hrPcYlWdfZL9t7ln28HxwnyhFpXwn6q56hMpocz14DB5gI4Kix97A9xk1ZidbiDkhcLPrnLxdbk4qHIjqPYrf0hEm+Gm8LvhHUS/GW9SxVdtQ0icxYSFA4yzTNJkGi7baqrfPySYGda1yOMlrFZPTgqSDLlT+CUUfxetF16gto9pXkmWCvefTMfJbt87JO2TnGyCJtlbceIK4wogC3IGeqHSCVQHnp3nDBTjfqgM6AVWjFYx/C+bAPb5jbtwEdI16Eg/Cs0SjMB7gCChCwDZEA4yEMq2wEywAuIOBQDOq3y1xcpMOPNs75cYNRa7CL2CPfhDdhjOx2rdNgqsm6NS5jrGCG8BE1hh6OGwtYuh8HmbdrljznbPjxugTLySREVDGGDc0pDNQizysZlSzWOYGX2YEGlGXKCpUkF+YbsWa75KTrZ7HuBJ4+BFYNcjGwYnGkZwUlAHoys/nRAWxVEWB+evRxTQ3qI6H8yzvmpM991sm1ySqnyevveOEx0a5aEXMkHliPZu+0XZV20qomwvlcW1M+yL73XLznUhkVaLsyC5LItBhFE+XVBKUBJvv1N5dWL9z8jogNRLFgiswXfU63++eGze4jlVNbgcXM6JsRK3aSaPMg6xRqwbRpKeDoiDAEeoP3UYcqpS6P4z7PTKyyeIDClC2QMaTVCPZItDEIDiEtVNVVSvWl3hTwRuZQSILEodgT222OPQBfs/cnJBwvgqRsETOKQ+Kp9VWE6JTsnQAKtJVvQ/DPNYx6JNBxAoEzXjYf/Je2fmGthC5089bLKBIwZAKp3ueKSS3oOeEYSEwD0kN5/kbul1B5TfeH+qRvHdONkaIGTZRMY0V9PHi1Ugo9QIKxGUoJ3ka4iboKrGGAGMe8aDtOt2hL+375OZbtRQxQ1aUr/K10BgVTFjdqMk8LL1Xj1sYHzVcbomVtRstTBVomtXl1jl535ye6Cwoy1K70zyPT9PCwyVNTD7GzA9NA27IFAPphMVVE8UQEQcCzUOf6/fLykaP65G4rgraZoWUTqxlIMlYq3NvUvvv1MPAJ3EsrAUFsZa/AcgOvuH9c3OCqUMrLMkaj0CsvxUn4foESwvK6TFLhOC8A6onuCSLwool1Boq5cFWbuYDcrLRDr6Kj4fswwUY7agihwkJbeECW8WtWFWoMaVMmRSsfFIJJ3Lo2gO0yP7A3JyYRidWmGrSCzwoXDlLBXiPa+9YRrjfMBG5NXCywDmoB+JuHkirbWrDIYf+QTnZOiMbvXJdDckcmB9YDPL82BFtt4IZIEolKSKWvq+V6wSrYyVU/gsqaH2WH5ybE5IZLAYyfhi7TpEHiw2768kfA4fFbTY6RKxm3I3npkg0ACxa7cby42Ev0YdkZFc6HUSGtVLnauW1mQEQrQPnE+ngGaKOLYQACB8HbA3JzRq+FKdB6DIdzgx+aG5O4BINC66qSOaAFmA1nPg5ZkYFBVlJhO49N2eUQ9FWJkIUzBeuEFs1rr74Sk42IwrAyEYVnZMKMBOkQul2hFI6L8Vfdcyh1Q4YIH6nTRlOyXFoUBbPamM/LDtuMk6sNaJuTH7QNqikIxht06HMVptOUJoENwS7CptAoli7XbVPVNTKOicfnpON5YjeJGkI5pnsg+gfFXUg7Qr7q30u8w5KAnBpqiri6vgX3DoPwqzY/iNyz5L8DkwdMRN2KamGEYpb6YQWRCdMLfTolMTMeJ0uJ7UGKKgUN8CzBWLNRfZHZmQzYtxYcmR4yKhG1aLAiASWNivDKekoZAH/w0KEGoMRG0CPCdU0Vd8c4suPyslu0Ch8H95qUt6SiLudAPO9svsYkFqQHqrbzTAR3g1oF1W2FkKcUGadk4/OzQlWKbJkoPG6ZoRVZNVZ4g1CdYWXUCq4+0pQiri8hxT0zWSwEkT0PKpp9Tsfk5PNExuIAGytHT34hlYJTZTdG00VTCZZX/GGMPgJkiZoE2GnnEZUh/TVnnxsTk9UOdio7J5ytgRV5NQCoBLLW2lfSF0poACjw5/24EQMRN9rKxYJjmoTA35cbr5J1jQYWTAIhl8BNTNE3q7Vrl54bjdZ7ZrRvq4IUypQ4gln8URtIuhc9eTjs/OtrWxiRH3Xae8d0LICH+BXiJJxiuCnigBN6FP7wRroPksISHRMArFffcMnZMcNINMmMAgisiOT8FlH7gGqWKexuZmpgfXC02HRLKsecx6wb8ppsFrXvS2fmBu313Zj0GlCE7WNqKu16IhVR8H8WlGtaiaTPOd5wxbUylzLuuAHu7ja2E/KPUti26RF5vBQwB6gGZKDYlNiM8fyVqFHYguItUGJlJGoJ6n4cutI2K0+7ZNzczLqFBdr2EworZhBgAPJkSgyQKzbFAHIfWqgNTpt3/Q40yqRusJj9Id1+Sm5cWOLlbggAwgqBveCa4gpWfDNFFiuBDiCKvB3EAPMHjFdrQ1wmBvV115l/7vcfINIFHEAyYi0DesGpAqZC9nowIJzOWtBHqBs6hriXDtn31o4rYQ/WvHJp+bmBDM0qtp2JJa2LJNepxJI6yBJAFyxG6QYTIRQHDiwrYYG4oMALnYbjvrTcuNmzGp/ACtPFtUaGJQKotQSdvJwW2yWoAtU4NhPTBAsh2I6JlEPHai4yP703LhZ7Q6T6ZQEwDWCayYdkMO/MTVJNb9JGBEBwh3gahi3125+SDIxIf2q35+Rne+hJzSDAvAqloejslCPJEAjZpcZh+3Az1g4JyRCxTWkBQjfRhLgozZLLrI/MyvbR4h1aG5tKNAOcDAh2izaFRTitNFPpRQmbUtD7aA764bB6DFB3q6++LNyc1JhGjroS+26YWJl34A4ADeHn1AVQsHPeV+NdttCb2DZUH0v1jYd9q1/dm7c0DtQ+y3kv/ZmoTZBZwxAmi1rXKcBauHYBNIkDYFtbEfso9d2DHJjbsUnn5MbN3MNnsLWjwm5sFBt0mbsRsdjICXBxhAIQ/JgWSgPqHxQBLlqVVVGedZn+bkZ2azfidhuEIc2kqTA62gHivbtCvcA6CZGD6iEWod7AzFC3jmVfgH4xAOn9HnZZ5lIv5AVEBlrFfaC9dA8q82s43zindQUIUQXK9WjIuwkTU/MP+L6+8Mekc/PzQm8v/Z4h8rCtsJuQyGR/yBZBZXPkyM/AvKeS1cn3hAZpl0psWkJTLA4i+wvyMnGASrp5V0rk117iGMwjxdmk+5hH2E8IMXgrcahqYWPB5FMRLbQrOucfGFONgFUpZ2vquQI/V/xAAkjI8wMj3accC0W3cR1NFauB9IdwjRpm2dUVmmR/UW5Z2lU6bKDKql1eJgUPKwa0UE7qswuBoA0rmwUyId4jRvCP9vkjFFAOB7syRfnniX+149wg1Y7GQkPkAf2AMR2Su+I24V04zYGxa4CtgCWTrEAiAvXt8j+kty4nZO71EYKB7FDEAZPA0YxTA++ssdIE5ajKBOOolN5AXKOOsAChaiimIvsL82Ne7zKngwasmr1attArT4tmEFAN9wyKRqmG18gugAXRFwZtVcJlHfYb/9luWdJEqvV+SUS0lAORJowvyrI3CuFOJ/KskpTK7FNKGyxB3DaEznXJkFOrrK/PDdu4pdBrIkqfDI20BlgBwMN3Qsh0YMMrQJhhEFjAYKECGH7gHU8T7/6y6/IzXcErhpooqgDdtiUQBAIETiISalVlALQrV1y5C20lb9SvSYVZOE73XjIHX1lbtwOu9TpJEy02nSMvYvB13N1GO1kh4uEUMO+Rp4tEwMII5Jtcad9reJWi+yvyslWtnZOLcMNiK8iz9CKerXaw0DUN2EYjdw6qzRqC43p593RrDCc6jonX52T3RDlgE5IJvZAR5WfIOBWiMqijGKmYd2Ut4TXFRyYYA8IbLU1KGkr9SL7a3Kyh24kQQu3SeKNiYAbc4ojrRS8EbWpTfxwTlY+Au4BUgVnon1c85H9RfbX5p4lQyLBg3tSOyUMUB+6oBrUPcQlzt3pUJRKB/AkR1XcGf2gqa5lJKvD+Z2vy8m2ULEtBE2SBiooYHHboK0nURvkzIh5dwQo5DYCMK4OXSUSXt0/WKLruL8+J1sNkojWg05eakfBfKSIHD8hJyRgDTJU/YO+mQ8PkIPE9HgFhpg3vNKK7b8hJxts18umQYmR8rKNKnKTLIMfgUJuoTS0gxxgSFSvgI31rzZJMNsqZX7I1X1jRjYsK7w2boGlLMYnzVEZfi622oFCjMKT1VYcuD47kvEnAQYpA7yIKvKy6vc35fQETIBg8s1iLpt5z0yrk3+ME0PgwGw6XzTvn7NTIwffECCy4Dww/XCO8Ztzc4J56wZtX651bAp4CSdGFqy6utKF1QjyyYxgYI22oJEgI6Wky+ic1ZqX+pbcuC33hj/kkZM+0BmPGqQHntCJBiJ5AkSoH/gj1qQdSYqDeCMAgiAZH3TIp31rbr5bC5JxMA2YQKe9mC0wHFOuzc5EnTrUiSDMjEJ+aJkInIEyrY1s5CEG/LbcnEBEAJFMN2gLBWBwIIpooLsCZHIlWIEmJZ4ikQlBPixoAtoSXGBuJkLoRfa35+ZEGBYSCisxtYQl2u9NgD2bXoaIFTAqACZmzKXKkkonwwRKnzqVpT5gze/IjdtpB2sVyeMwPGlaDdL3ChmgaIFvRHusHkJg7YHhEeusAFkJr5yAPdiq78yOu9HZRTUhi0r2+aQ8vatEQmNSEO/4gM6lRcgfgjeo66YjCe3bCK5d9eS7crJVeIxAHVKHpIKBIlEmndC3VZ4cjceNkkrWHjaQPtFT8jAHZMQIjDFk67r87pyekACGXNTOM6J/VhEeQds2wPvqn4ZD7+ZslzIO3Jh2bg86NunrBurlcG70e3LjxtyZDryq1W10LBl+jVQLmhCITQKWsYJHh7gHlHsvUNuoJ4laJMCHr7K/N/ssMXwYOMAdfBrisafEENoG69UMrxdFAO7nAYZOfA3OksAL6ga3HQ/7TL8vNyc8HUbU6fxFIiWN7446oRhcr4TZBMcDXRp08q3XAXFMK1ZNxAzOxx3OkH1/TjZ57UpYPcBDQ3IBxICokA3E9sSbjjwd4FuZx0odb7oJfr3TnqWoXgyHtfMDOdnwVFZnAEU8YjuIKJVWI1adK+QB/uA5tKmLrK9rdWSZZKfCNCgxIvoV2/9gXk+Ibo3OWTJyABMrRwsIdpNA2ScxeFGJSNfpFDyBG9OMvyQfScx26Bf4QznZBC1xEGNBPh+H22mrYyNCjUGTjJij+r4LOnyJnYUUYqmCN5WGZL2ucdoPZ+dboGEQgtLhLUyLDKw23yc0eyL/NzitLTyOOpRZkdg6ra7d26jNGjf8SEZ2hWkYyY5GzL3SzgSQ3DdokBWPd/SqCQTi8ZjIqRNz38xpJlaozFm/zveP5mTPO2ZCrQNZYGADEVkHyOmOiAoDPYqlmgSgsYgQGw1IoNGCddocDr26yP6x7HxLlNP+Qc8zInPZW/kBwm+8w6RznKxTdJwsG9kvuDySRzBXUnLXHc58/HhGNlGLDlOqPpqKCRB6GO32S4pQR4cIkD5ZMaZbHSZN53W8By2Bi2213XSR/RO5OWFRuF7nlzFOOE1kDFakF8EEnB0a0aocqldNAT9ZlVVzxHLYEh0YPOS5fzInGwa2qXmMk85agXVQgrkBlTQNEMpdjMIwHYhBfU1gVrCCDdhLB2OrFSP/VG5OyGgPzAHhxjDX2+gm0M+og4HkNED52rxoMAZBZkfVJnGlkSXQQLTGw/7Bn849S+OUq9XoeDaQjbgubjloC02NTutQEpy7DnwRahHOqpCmdhjhOkEs65z8TE52A2ALJPbJIsqA4BFqHU4jWiMkCaARoCZRdsPDxauyhOE6ASoDPha+dV3zP5ubk6TCudw4xm7EbCvbBfMFHQMKImc6KEWddES8ZzKmSbVBwALWKMxoDntEfi73LJ12lcPhViQCVB4XCpDks8g2mO6o/ewikHQONko1YX6h3sdBZRlEXy+yfz4nG+9lmRIIYigRAA9qTTK4ks/t581tmmOIKQv57Xxs0H+wKHQ2yCUe9sT/Qm6+cY4EO7iDGixDhhGoijVtDdoA5upGACvxFRE8ZAnmtdauRWUomLB6g31+MSsbfqHTSVptoAcetzLf2kDI15U4h/CQ68DwsdRFHQipE/XgJIR0F9m/lJMtLpO0eQsYbpUmAR/r1GIddGSi6WAPAHRKl/RzJoBMVUDnHdxN0CHvRfYv52SrvoJntEB3KbUoEqjZJIaxJeRuGjgrbRiGolWdZ+CFyHanA70Y5nXcv5KTDYeBZcZk4wvbjnBzIgMaRkFOoOvMX1n8ro62eyNvoZ0MEYKMvDXJyUX2r2bHrRPPIaiuG1Pu+kq7N53Fw0ALIEZ6n3CYBG+qMAkJ1mlHrQ5QEjmvfv7XcrINHKt23MEqkqLSGUtDxDOARIgkrHbQzVt+tQpVQaifHLeK/44oqjv4tF/PyCYHpyJwKuiBNJ3jIY2gGgUYub4SxkyjzC5OvjfqPKXdAY18SFBeY12Xv5GTjXlSHhKqocGIass76x09VvkgcvNz8o/IApIc6hvKoEfPnXadjhr5+ix/MyMb3geSdIJjRMOhtIGxTaeCE0B9VQBREhRfTBKzVw1RcvfQhhhmP++aO5yl/a2cbJYL+k3uX2CM6EABpqrlQFDj31SxAHIFoxhVEQXJuGCjuFtHvcPhXMZv52TDryWldkg66MiwU9vArmNhqisXyzOgMspIqDEAfo+ngRGY6/4Srx32QP1Obr5bbaWs1fyQnNwEpQ5hBRnEt8Xaq4oybJDFjMuUAUxxdoALbEFUWmXFyL+bkc0zHAaYqAQTVrHORRBA0oDVyFz0rZxOjbs2KnKqujl8RuemOzUxRddXP/97OdnYEkA9y0ynSAYAq2gYcb4NyE9JKxH0DoYp6kTYqCqJtdpJBLGdh9j193Pz7fuILpDICDXZoWmMKep4JVCfnC6YC0KDnMuEecSCQFQn9ZaGFIaBJ0ZZMdsf5OZb1U6UcA1dP6oxY6sjWMCxrldVAcLVUcVpHRZMlCAweZQRs/MEkkpfZP9hbtw6ANxaJ/4MxDkZHXAKExwMXkInWlWvBYKCHBOkNeYhas8/nn7EuGx88R/l5psMAkkj7EOvHIy7urt3RN1gUBIhNq6daYZNR2+6mZr2SiDxHIg4DrHUH+fmhEga1z32mDwyiTbiPDF2U6/YL7kqzZs50Z9G2xZAHNrGAG8FBVDjj1c7+Cc52fDTBC8TDARE1UBKphm8Tj7j7IJVIxHyGsBwnUwDUqlwdsTpQ1XEirhq1ZM/zc0JZAN4EnjltU3BKQeqfTkqV1XrRD3pxaAdoJhcaCCgj1ehM+YMspIsxSL7z7LjRjJrIWg3fCKWgquKJJw9DEdQeYkuquab9l3oTNmEn0Ypa564V2S6zvef52SzMnTOGc3tlWUBOUkLrVe/QPzQ3AjBqBk6SW79xiLrCRsMeRgfDhjiL3JzovomVvEASo5pwRmL8bE6KU86RPEUT2RShRmA+pz/axQIBKCuIN0i+y8zssmQKdwL8AGGFA+G1KggAWucSInUj7abqPQFagm+6nSQ2YloIRjlcR/Ou/5Vbtwj5rMjGcq6xEg7ACZZEvJZsEtG3VVIl4MtegAXgDNqWy5wba6llZSBXGT/dW6+u1YbY4k7IPhB9WSEUyUSTc4R4AI4HARtrYg3J3oWkztoc4rw4eHc0d/kZFc6JI/9BN+pMFrrRaYNih+Zc2g8HSkkb8HyHKGrPLnR3s5qCJcFPlxk/21uTlTvZsJgs26w9gHMbOKoIhE6vwDx42FNQIZVR74LnkBHTJkgDaJ1m36Vf5d7lvAYpFu1D2GEu+qdam9pYyNMXVTBkkZ55F7ehxT0mOYdr3JscGUMa41J/j43J60ofx17NDpcAzuD9ed7ZHy8dtQkVbhRQzw7ifkk/cpUqyahMvfDoa7cP+RkE27BWbmIF2xVV4Z4iglAGyDvsH/K0mGsWy6Hg690asqhtGI+nR2a1Tf8Y25OWkWNbcKO9mTedRIIarefgzOoR5GpBIGkoQQMvQ7EgYa4jHIzxC2r7H/KjVvZ+aRt0ziEUce/B3EBc11GcZyExJNyj5ODFjPaPKPdHNDJOqvfHXIC/19ONiBeG11dGGud7CJY1fFi8KtTyQUiyJr4GlwrXqXHgEcsbeWtmohqD9Mi+99nZBsoUkMABsieOsNEw8UOquACeckqCioeiffEuOvEno5NkAWCKiczq73Aq+z/kJMNvtTmW1gknRcfRZQ0AmekAaEwG2YoYINJVSUd0LUqyJ66KrSTNgAd9oX9x+ycqA4WhrbH+GsTrLpEqHWhVfXOVKvKhxouAkYgmkTlGbWxB2hWpPa61Q7+p9y4k3Y7NOouRaxNYEagbiBQ/CA0SUJEHShI3SvFoJtDz7EE8LbcJih5xd//+SSng1Ut6r8ajU4egb77inhW/TKwRIS0QKMUWrWXViaX0Dlh5FmqkJM4zNUO/pfcnBAyRnSKdKoBAJrIfBLgkQ8BCOGhKxI+SZtNyEqQ31VhSdVpwz2B5OrDvt7/mpONkWJdkjVzOnEuhNLMy2eub6IKoCzxisi7UmtJUpE8fGg24nSdYjnsbflvufkeRLGJU2pImCnaIOms2pmm8mp3W8mmkOiCulMlTAtHQxjdYg571tXBnvxzTjZ5XNYagFphYG1BxXYA+IFt3NwTHK9pVdmPxCuAXvlMsacYdx4Jj2eR/d9zc4JzaoCCPSGmIbOjsxcj2TmwH3osHz2nwJkhMBYxYVBxUMPDV8UVIq9F9v/IydaOEkfIp0hd1bT4PNhtaFl3oDdCESN31sHtEq+phbgqmeBMdTShcSuG+J+5OdF260b8mc7pMo1wGGBawUyIWNKKUY3SyRmrdyqGFajeqsEoDkl2bY13/ld2Tsj3a5dKNe/tRieqHguKWgONMWDakMfz0PJVmSnyGmrUzv851dw75Or+d27c2scHtwFGZibww+iCnbdwqKEDlKfOouKCg7YptNoShm3gyfC7dn2tPu3/5MYNVYlFY0JJ1+qYmE4gNNp33JK8sC2uBeeAgSe3CPDq8UoEn52qXkEZHc58/N/cuCODbeUeIFxQGlgYbVe18+bDSdssJ1UiIszHnOAovNLhOkuhUrlDvdqqq/9zvexKhYuUIIarJrBMKishhzuMGD9MDHmSeVtALXugFHsva08oqi1LmNlF9rmMbIy30XYW4tRumoKKBQ44iErlLrtBJ44g84F+QafKBu2Pj6R4KtAnyKeqVtm3ZGQTrreVCmwyBtYxdCJJJJArWYCggvmdJ7WDsQW89nNFLkiUSbvwFM7jihbZt+Zk8xBJ0ukQZt2qGOek3T+zV0gq1EhskHScCRfpVVhB+2xwdzrgNA4bTum23JzUOlKlepQtT54cCVRJg0u24pYhl8EU3QRk0yGcAUPfVDo8r9NK/BmFX2Sfzz1LW7dqOwhiAK2TMWoYInhbO/9IeCVwSiDWHLVxdajUd2lIaI42pJBs6tdxX8jJxryRqyBOUoFS2T3W3CiABTHTs3SwUAGsAOerQnlK5FttLNA57bY/1Da8PTcno9OGJgyHMhaADlwZd6J9hE4ZLsIqYAochVXlkoQXHiIkcICzIcQ6cEp35MY9r0GyOKYLmKVW28ZhvSBlvfJSdt7fjDp2OnTUq27j3BZ5broOzbWO+2JWT7SpG/8QtZ8FfWvIPVsnu0faFtc2YMbnzVEBAKhaKIOOl6vYgnZhrOO+MzcnWCcdN1CBJgubFJL2IKoyBhjEq4DDqLY4MiR8EhQzsbSAQ1aHYSESF9mXcuMORlGN07dxM1ozo/hWUKbim65uZtOqJExUKSoI1gjf0TMzqme8rp27suOGnGxYIWTngtwhX8cNk2PEeTm1AjON0KE2ExPek8dkfU6qxjeR7pxWO3h3Vk9qfbOeq8rUOoOQovxAixor0G5VmrnX4XerbY5R1SnbAQOJ3o7VocbUPbk5QQ2iSu6MSlSqdA2Rapt6lWQykE1oRK8aGuihKjwoM62zN0pCknkPq626Nye7IcqudfAbWDppSwHsI2HTFJRoUOVSULwSrdpnAH4FpttOO9q0wy0d8mmXs3YQX6gKLSOhNOtyctrjpMLWAFsB5BHiJmJg+gFUmNRojUXEP62aqh723j4ua08IOOYsFiumib0O0uGqJBU3NHVkLAlTcTOjDvDyfEfxEoRvQA9UdMUn9+WeJURMRw5AIV2nFAvQyiqwTKxpHrE2P0OvqFa303axHlaGwF5pYx0qWH3a/bk5SUocEj7B8mAwrFN8p6Yx0OI1/B/xFEkjjIlp4GdhTlXYE8SiDCy2eNXvB3LjbklJypmPk6BsZVQsVegAXwxPR+YliOGtdexD+521rdVIPROexPiVo34wN99RW6lEZ4SxVwklDIfqIpKDwCVbpVFUfELFG+RvEsSBztp52THg9WqrHp+bEw/UwG0pU8QT1cZdALHHslgVzIZI0socFb8mED4f7LXRWgYt6iz8IvsJWTtIOiFWKrUBdBclgM8ZMEJiAWFMSUWp+DBWqtexc49uwA0T6CgLEQ/npZ4jNycqcsyzFxkK5xYxF7XKZGjbBThCu9hIQGiTb4KGIKAPOjLEWp5wmZi3RfZzZuekhqnyWgaD8rnz9trkmd3ZoVUEEw6jUsMddspFAw+JAYMqVQP1u/VZPjGr303bqqIlfpJQAFwIltfhUB3jZMFbmFicPI5+bEDRLKGIG1YNf+Ke+nBu9Lly467UlmHwZPsB7Tx7JrEXrck6VzMy8lY6EJPmwqEsWe0gcaKaxaaYQ62m587JBjjg0noVKCUIU1mlOaw2oOYYcVuVGrjB8wK30CRBiiRE6rSphCTQIvt5cnMCA0i0OqiUlErDVgDZhsSfSqiGqD0PsF86kYoDBU+TdFTtsqSjFI2c9yL7ebPrMkpbW0zgqCMCk2g8q2IZ2C2rMw2VWiMwZbWqYoa57JJysKAWTOg67ufL2pOoQHcCGqgwr84akCpX1a7JqmwfOWJyi1ZVxsFekKA6oQSuqwVVsIyL7OfPylbJFwjdqyUMEayWVAkv2pJ91JbMCO+VVHCh0nGNQZ00VC8PdsnUh/onL5B9lkOv/f/zuWjZrQSLDyYnrhFDQTAEyNFBaSyWWB+Voo6AJe1OBdCsOviCWVylcwVKlACuVCRR3bqUvWjmY2Te6Sip0dFP7eEU+0kUpKK3KgEyHTjqF8rJJhKVbYDsVmUYvm+1qV9V5isUHm7ZqOdvW6dG9ZO0hRXnjwHD9Skbuch+4YxsmDlyWThuGSxxKWT6lHiAQgOq1nDTrHv+YVSYcm4SMeJ6VAlaW9zCipFfJLvmmVSrwixz8mbUaYBkuQncjfY5awsHeqPC8b5FPdpJDTsYSVKmpF/t4ItmMRsxhlooYGMxV5V+H69W7qs6z0V1abLbScho3t1LspA0FVeCYe1WfPJiufl26BJMC6xuixkhvtG2epXPAK+QiUG2VZqNqQ+qhRKUzW8UhOOdp0Nd0BfPyWbZkAmddOC1x+coLakQSgxj77kJqBgYbBl37W/3qpyh/ZQJDEa0cajRnY1dG52Wg93icUJqq5k7ph/tYYTQCMrDiBYyBMK9NtMZBfZ1o/O8PNrVN7xk7lly8UhAKivLSnEqhBw8yQxlTLkj+CS5Zrh8Ug0xioUAeOPdiHWgK9b5fqncuLUIBdNZ6BMEF4taSEdbAjCKV3eatrWVd7OqEg8Uqg2IEDNjZOQX2S+d9cWElbAhAu+aExHyXjaUIEV7yjtBKnAumgcLMmhzMpl5LkOOjOzPKvtlsvE835tUzr/XuTxHPjToWIkquw2iTYmcVOAWX9qOoDicX68umBUgHDNzqNGdmxNwg3IKpkapTdA5ZSX1o85VE8KrOhh0N2QQuQX1yoWnsporQiwi7sNei5fLxiQqIAooId8ObxK9zinHVpdzgjpeLXZ1sJb4TYsSlgK2Av8A7eHNgXussviEBEjQCQQVkcK7TwQSvToDY0twmJVaG2qTkroFzZvHAI7i3bW9wx3qx5qsfus49CSY05BA1+JE63QsEpIKvB9UG5hcB2RcVE167J+OLnOnSUcfVp9W5+YEzVM6LgJ6cQ/kiUZIHWUq5frV7CjWKkbbEy5DIrbKBU6dijcNRtuuF9lNds2z6GCMVf+rFzU/VwkBkvXqq0QuB2KA/I43UYcmMJEVy7dWiTXAfnPgfdosf0IA78UmdipBps11wG2cG0GfkGGvfhYkWbE7LPnEw5yLWmIL+Hh94NZtTrY2j6mAs8pdwbqSTAt4eTXdUOk0rwQA4SdTxrDJJMHBolK1TvSp7es67i4bA5IhmlS3jCzWBOCGGOyTNgerQbWSD4SC4k2tsrnaR2S0+V/9cRsy9asO9rn5xqsKnUK+9CodRbygQ0sYf8I2FSlSCULcp+qOqlF1pVog2hDQDNpuscp2p+g3cQsaB3XMVBLQKP2lsl31oCrjqLquprIXqtKhvecNQS2RnLalrhhiyM0Ja1HViLEXPqjeLb5qUJbBC8mi2bAR2gbgB3LzauQykD9XcSdexDErhnj5nGywIxjGszYGNAUPJxqPNDzgGitN9sUMzqmCgTb+tl4nFrDd2oQ6JXOoz/YKWVul8tMTK7NRzRStabI38EzaUaHiKARn3dXy1p7/5ykS26pE3KCs3qEm+ivmZBMjqFkAXpA8QzM13KvSIIKVRkewRfFYWCryxhhvlWeVwQLX8+irQ9+gV8rqIMQuxA8JQEJqcgHzGaFeee9e599IlqAkcGU4SZLswG6ABJgoijYbDrU7Xzk3btaizrFNBJmJSa5q9bRBEnik10Ebr3NJqlbLb0nn1lylhueQWL7BWi2yXyXriwmdeSo6/QuSqMgoVnO1bhJ04gZjUCG5IE8DXoMFVqk/wsC5VyqZjUX2Q3kOj2Ca1BDZpiGqbdikRAva2JP/JKYg9Q8BosOZVsd0G22zmHp1KKl0PmGR/ao52cNcGcLDs7Vqr0EKVidt8MCDsvVEKXMBAG2QQHG0n1dM4cA0EmjUh3j+1bLcDJQu5ludZ5MOBuJ2R+3BY10r26IGHypaS6ZUMauONuuoOHkVD94MK/f4pKyNnSvykjwkYGvawatgIaSAAslaW0TVSRt61sybuhKftr3OCrU6aLWph/dwNnaF+0paEiqfp2AAez6KhlVhezcnwLXbqrVzW+1RfXRAp7IPUEKHXPSTc+MG05CXwHSAEoK232JtLfk4oC2mTrviXZwDKFESyrmqNg0sF3k6rPM6J0/JxiSMOKnSGV4GFYZ9ALFWOvTgVBICzoOH14xe5bhUf7AR5mkIGJVLOvidp2a5R3LXOgbZp0R+qtORJtKO+ONmgkbB9oakgsZWSQd1NO/mM2w8W7Ky6dCj+NXzfJWa48Dw8yiTtpp1as0CTGjhqBRsV0rxN0BSwIsAnZlUktODmJVxX2Q/LTfuVi2pdAgad9VG7YjQrkHX8eC4n0YnfdX1YCR6UskBeGzP+lU5K1Kzh70WT89iCDgvMvv4r/kYtQ67AkvUVx3cE1QOfFTJsKYhc6WmGjqO5BWtqI704fzlM3Ky5WtH8GUNz6oOJACnUQmzRGDQ68w+GVb1Exi0BZBsOvSd2HF1JiQNserJa2RtrJsTnk5lmhiS0wHliWiKRG8NDAS7EEqAaOWh0VP48UEHOXoIZbWOXmS/Zu5ZonXkd4DrxmmbRhClwUqp5mZjEN74OBHko6q0EVVNqtmvrZGN09mcVU9eKzcnyo/AShO2g0LAah62QOe1VTuHp1UDhBTYwwhr6/fQzglaRRujUjIrR/3a2fmGhppatARqUbqlg6NMRaUehsBESINRKW6LP4WPUGntRk3ocM5885BjfJ3cnBADYoqBMYMK8WvLo2rGDqSRwKtqF6a2VahH16kcNUksfH3v5+ZlZjzgqtfN+mIVCAjqkoYfITM8Vjqcii9O0KJB5WhaDJTrRhUG75RL02YLo9OI/XTgCl4vq99wG2rxOCkUFP3adZARES8kgh1CT5sjoJa7XpllTLxwpxoI6ozNoU/T62ftoJ+0mXbU2W8ycCwKtSmYi7Vo55P2tHJrddMR5YgihOxgofFZYwj01zl5g6wO1kksMZGg1eZ9+PpeexEmNWVyUaShKhoM6qADAd6RV8KLYL4hnXF965y8YZZT6knuq0gOyiX7R6gOAmYmGVrdSS4ECElznV+s9UzhJVR9HsBEwLv6yzfKrUsyTa0ZVfgGisFhSjXLLJRKJKpntjQrzAuOVIcPMQMyPQQBaqZ0wMhvnI3ncbb4sl5Vs7VDe9LBbbI4ow6oMD/KWQZxKS5pxzB5XogJUqetV6GI1Z68SRbHgu1UELCZdLClVX4KVlqldFWJbVILYhARWSmS3No6a3kO9VzhnVDlwGu+aVYHo5fdZOyqC0j4D/gmnB0Nj6tWdopos3VRbp9QGIqPZI14cDgzskjruN8s69MG3aYqLrMCjRCJ0TWqUWZP7YvRPkfujjVAyl/7dBEdZycCR3So0Z3HgwReKq2schZVN85hlFpHQsUQQunkPuH8UGufD/pSzw9CRYadF1W7yH6LLGdqdaYKO8uTUQClgo9wEeThYb4F98H1tcp7QQGDBLgeeg2RAFSBmFvH/ZZZfpDkBRE9ycBKVWm1ZZCnCuaOlY5NQhwB2iZyvFL0WssKgFV7CC4ofrvKfqssj8xkKumM7YH5qisRugx7AiMnUT+sSR1DxAREtf4hSxvV9ocss4pMrfj7rbNzAo08GW3cULtmna8Myk6qxhIEI8FkO8775sg+oqc6r2ZUBGVQwbB4qKf0NlkMMXJ1IDDRhrZYWajuUcUALCnnpML8GFlLbKLjEmSiRpUmG1Qioks4jkON7ixfBTcHnaneHiNRKjy/ysOChFEIlAgNVzZZoaC6MbTgZqajs+hknDZ1oEIWf3sxlmFSn0v4OlLqRNc4FjwZ+UA0saoxtkHVs2u9YVXQq1LB/k6HJxbZMTcnvXLw5PRHuW7xkDqaog3m2vtEEKQ9Wzxbr7pwypyDNJTXA4LPHSsX2WPWF4uNnYyelOhFfK0qpDrAJQRzI1gCHNdmGlJGSeWByVx5B8UCVTYdcNWUne+5msJ84nkEQ8lm4SFsrUIWlTb81PBixIgiIYjBAT4gWfkj5asP40452ZOOcYNYJ8xmN7MPPEm8grZ7Qg6ogBpJXFa5qBVFlJCIEOAQCY3QxSL7bbM+TbOhJlDVoB3JBG2QR0Q2KlOkAvZMKxF8IO5uSdGoDWytQrKq1kOkvMaAb5e1g+qKozWj5nkwS41qtiftj53UgQvkTagFTQDxRJJt5iN6HYBKCm0PdYbfPhtLgcpUGUgrGuYEtlflxKdGSKVq54OtqkitOsMduTV1hICfTd6qIszhHMw7ZO0JAI2RtuSEgGQz9FSRGlUabySvE3oGoMM5WkK3oG0SRA4QB4oJVjz4jjnZfj4yb30AJMMgweJ1Ot2mw2nkTljpmFfIN9xuN0FJqPSZDBDqGsTsL7LfKcvhAf4calgr34klQifUhAugrJJFqrWXHLBcVbCJ1tQLRDvxYS7UEi6sGOKdsxgZgIp6YfCsDjkQJ3VX9+MQqGqTpjYRuF7IrosYGMwg7nNSgd8JHL2O+12yfGyvbFzS6VzyLwCbPoRRFSKEf3RUF5jWi1oRWQ/sUsERrLqdEineg2941ywPwVxCm/cwmDqMJxKvMfAOg5gMcR/YDpUMZHJdr3QrTkFwF+CslOYi+92yGBmuWHjBpkb9IQm3YYgJnADPZKGU45m0VYIVip1n4WhPkYHBVj/T/hA3vHsW26srndXpFzhzIKeK7jewJnhgFLhTPsbqyLsjf6aKkDBuA8i8UbEic9iT8x5ZGwsqhUWTZpi5pqsaCdQ6gak25Sk4NTVVRNESj5C4wi+rF6kKVGuX4iL7PbPPUkdFSdCrLU6jRi1VGOYjZLASXA21nzrlvpL6gWobMigGsKLCwZiqdb7fK+uL1UQJVtEIK5G/0c7dMGfOdLhaZxeNNkQ5mRMdACabL+5D57XIBq+Y7b1z47ZGp/3FBkQSJerkwOzCbRgVKyJ6HZXTAPkPIEZVohnUGrBSaoAw4tAn9X1y41Y3hUqNa5y2EJDA6cmG6gRcR74vQXoSzar9dTPq9M7UC07xJPFBFfZ7jXfeN6eDPCQdJAraf2TV7gmp5GyNcjxdo/LnJDTV6HBQtgOzojIaJAa0MzUc8OD7ZTFyp1xxL8er9iZgEnJfkFOdVagGtmoF3HpVqBf3q7Z2mBirI/QYgRV/v382bjCqdUS2nIVCRmus1MwssvjJQAHKYKYIEibVCGWKdKi71x5j5UkSafd13B+QxZqN6t0QkeFNnHpwD93cEkPdw2C8B1Vg5X+IsaweS9KGHBwhUE8dxFY7+IFZznRULyIWMtSLwmgS2BaWi+QIcSDeXJ2WKu0xrfuIOqqrS9uq+tSg08bruD8oiyGIuMngai8WvLyO0uicvlPf1Rb6x8/LluxIBcVMAm3ksq7D4dRihg89/D44b6tIjfB8wJM6OxgTcbzK4jkVfO4gRokjJ+2ugjn1Xo21VRirEk+BXVntyYfkZHtlVq3CXta1tj5pL6mKr3c64qtjVypTRFTU6Wg3voEX7gy2KqhuySL7Q3NzAqNIBqchzzpp/zABIQQjuAp+0c77w9Bk7G5kTlDLTvSDerIG/DYmbF3zV7J+flBPQCdOWll40BurEXsI5FaorM4HJGHgrVVTm2euLrWwG/A0qj26zsmH5WTr3CYEPAMEPxBbqkIqDBjZs0rNqEkQR/HVdq5xXKtdJqsB7gdXiGtY5+TDc3OiQ2RJLUFVRc2orQqmswFJEOC16t+i7cSwIGo0qONUJKUIYFr9h3VfbdVHZG0VLJ32i+s8xqDttuqDBRkBNwuQrbR/ScfxGS8hH0GG17F0bakTK3bIeX1kbtyjWkIokCYIgTlSEhaKcBSNrKoCSlfBKY3q6VypUX2vQvK9ynRhsg41HD4qi5HFR8lo6IQ4V9Bxc1ZRV8mxkQl1QUVXwC3wtGTvWKs6QD3qeH212cv/0dk4DbUgpzKoJIn6sDrxgSTH8YtOdfXJXciXYrOd2qyrSoEnWdLIJgyHPnsfc4odnJhGoObVjgTkdoLQb6PuWDrlKbuqjR2tVE+bLnQQooWwnDdkLbI/Nieb1CQgCiKghklR2cceh6iTKvB6CFNfqZEQVMXEsGuYSJ4zdqFTkz1y4ovsj8vGgLiSCrxttKNFOW10j0k3IgVSa2HKYsQNKfuvGg7MiDZ0jMqoq8b+Ivvjs3GaYCocD8CAYI15DLAw3aiuftpw1uGd5Zt7NQtt5mNHymNV0I/a47HiwU/I2m8CbPJYOuzjMBtEOXgCxMxF7zC92gXEZKnAnLypjp/UUlvipG447Gf7xKwdJMOiVo/aPKXWhVqXxHwAzggUhuvsr3WIcbWO9DqIN/U3VJVPPx32On9STr+JKvHmeGACMRJyQB8WUq12gag57kEFhckthEqHadXkGQA0cwcjdNShVuon5+M0UkCYfekXKwUSNs2NXtTVXXWnlIpVb2Rtr5pgTFW/D8+KvcS8+1X2p2R9sfrYGrwWubkpql5zCGAxZV70E7qAtBmRmxYiGeqeJyGaRkV1QSyH+t+5+e4hy4j4OsUKquutIl9JnW9Bcar3XauLxdCq/xRmhOvX2vYW8dUdKeNVTz416xuYCyFtp41PtcqRRDWTmnDBrCHCmq7W8YdO94M3gGvHxCeINvLF/eEM2adlbayZzz9inEYdQPfNTATpLCfKoYYkIADFVcKN0GIqdaNuk0oDk+VY8eCn5zFbpaaCozaFVmq47MWgV9ogr/pvythry50037CeJrV/AuHCPWE+D7jqM7L4pGexj2qmALi0OjZO+EFQ5ue+bmMDnQSmw1YSbiayJToQrI2pg9pXdmvc8Jn5tQNCmndphUGNMOBSmkFsPiEhAUOlFpLzSbLWqXp71FZx7ash+idzt8r+rKyN1bE+MMc0dwftVb7AqyC5ap/UqoNHtAndNHswnmiv7e1JNet1ar9e8eBn57G9GkaLktUZyXGuttyp22fPfQDoe95udZ5M/LIaZajUrJKHRp2VVv3+nGyc1kEszl0ERI+oKrrVJulI6FADTQAU6uc6qWxjVL9Kr95ILNpex9Ltqiefm9UTFb8CilUdGCWofN+kEhw6cOPwMfKWDFl1J8gNeuuaAPmj0hE87vZwBuHzsjaWJQPhOulRVTr5xxzhC3sdyMeGYkSc9gQYFZroOvCX8uLqmhPUrXvlCj4/u+Z11lJ9iYM2ZcNbtcp7+ZHYtFY1hbmhg2qMeHUUG9SeYxJHBJnF9K3+8gty+g2Jo8JaEIwVAY7Q96CubzhKbAiAjSxlCxmpx4hd5K8qijvMhb3VWXaR/YVZbsb16l0Kmz3va1KIpyC7025T5t9qHx7rqdeWABJ24HPC3FZlxAayEKt+f1FuvmEfQKs2qOcW2SCIZ3gI7Yuaz07ZJCurXJvgdqzn4k8Ta5KHPQkBLbK/OOt3Ql/XntWsHeAjWMKzDjHdqlapw8Q6ugPYH+fTZUF98jAH8PZQI82m5tGXZLlHosRO51UYsihHSAKeH7ECK5GFSG64V+ES8CEUMm8rIao6SR4eLx705Euz/CBrrFJNoGZOjWD+WoGPqN4Nmg+VnJCbHFRMnqkxSkDMyRpMY7PqyZdlcWxUXZagnW+REFXVh1R7WyXv4D/IBvbal+vmQEHNhhO5KvSp0+7czbn/L8/aWEx2pXZMkYBNbJdsf9DplF4VQBmo0xmhSYezSaTAPYJOKkL5VlvIVj35iiyHh38UHY1bsyoTZGCTkqwReuDa2RmpKiart1GVYT2cuXGwE292qBn9lVlbpbOLOhGOogXtJVKVR1Y+Aa3yeGr0NM7lxn0zx0FcrpEp8doReMg3fFUWa4IEUObGK+5QFfio6D6oviEYkNyJmnRAmIJ+eg85Dc1OKkN5dnKwh14cX53FPhD38KXqQzno3LIXU2yVCJyPvUffEi5jG9XvRJynapRiibE1ajux2u+vycpmuK02yumwXK12hk2vthxElWpXooaoAsxqEk3opFIsXm2cWiPzfbAnX5ufE6vuQFGnlSodCXCqojgopVmjNqO2pzPj2kWkcn9EC5jzyBRqk8ihZ8vXZTnTROqDJD9TCXYaWTOwX1YHXmCNVEwAUkplItRpHRrE+AFE7tSWocIUreP++iyHFwGq6qOnOnpKfcBysuwr7e0gZ4bmqxgC/LT6WVgdW1GRUqe2arrhRfY3ZGPAQUXaYQuIa9Rls1WZJNjwSacUtUJrnSJ1OD1VRDPYl6iuj7UOj5vDuvzGLIYYATYA71GnU8nEKVRHI9WEuh0TiRkMlWrxg9DU2zhqCOrjoqN2gMdF9jdluRk+qT4vZDQqtflUu+6KdWOUiGL14R5UySXq+qJRdNzJaT9r0G66de18c5YrIFtEsrhtFX8o0Tg6CEaU0cksBqy10Z5lRZ+Dqt5ABLVDX6uLTXCHeP5bsrZq4p6hC3AJcOrqsEpwov0RkzZwzSezsFS1DmKSIGXWjSJlVcZVb6QVf39rTjZLBLYfxlLNCHoV6Rf1o4LLJkLYaROLTo1pC5vSUfC+KpcYnKq7bOLib8s+y6vheZIZdWK10V7tWlX1SrAzXJ08HnSkVzsLFH5Spl773jAUaR33t2fxCaRLrzL/ynslNW8Q8wA0VlsfIkEyakAqPjBpQxD84SgzZnHyDOAw7u/IzYmZ9yAR/qk6mwvwV4RkRKaCrD0AgwgQxEpyVrvdRm2xAcroFLy6Dx56QH1nFkNos65lAdpWGTkcRK9Kkjp0hcVTLl4paO2GGrTlxevIUZdsreA7HnLR35X1OygDDgt7ogJ4TCGgQQGxaloPM+HgtceKUDWCob1YHNFyOglHrLHGl9+dG7eKfxI6wnJ1yoOo3C/0P6ZKFlBdA702FJJugRfS0k3wCPCm2hhvhsO+me/J6onCVh4c/6G4TlXV0RAd5CSziiMiiIQvnhQIc+EWWEyoZedTCwShq6363iyuMmrvG9uuUaZ+aqKSGhiRiekU40hCLPYqT4Rhx7GOAizaU6syqOTRF9nfl5sT9aFyahBEqgTLOQwQMk617NURZbKoCpOgjLaOIPeNcyrqSXTHwu2mQ13+78/iKryVOjtCvKifgs5csayjJcdHsAOubAcVDpqunkAnFWDRlKFrdVqqPeCqH8iueXUUJTOsQ9ydmo9oB01Uy9tRxeIhl1EiHYAH/amDMbkvElJwhNwE5meR/YNZ3zCqahyUgDZPqTJxQ1QMn0LUoeOLdmgBRqQcGiUjJkjqVv1G4IXVlutQ9/aHsjxbrzMCQa2nOzWWqJTZFqms7h6DjmNgUFViTkUZ4cnipE2PUdsVIVPXtfPDOdlA3imoErKtDZFNsupsRJ5xhBVXx1HF+0lNQglytQkhatv63Kq2DcNhv+aPZH0DlCs8PIsOlAzdQc6LNQIswahHkWnaI6MaUCTS+Wyv2hROjZegmKtDP68fzY27VteeSlSmDrRB6EFxTNopj11S2W+Bkt4qzqnn0w/a0sRg5kLK8ZBv+LHsuCsAnzbdTnOR+MknzHQtSlKMt3i7CcUkTBH6j1q60HKmVlER9U5fZP94Tr+V3ldZthFKbMDKulG7B7Dm41xQTq3m0T4gq523mQkngwobAB7+9IAhfiLLKXW1TrI2vRp+6xS1UbNUFQ3CfQJcr1Z9hXFIKg1FAAGaI9QnRkN1xpW3/8m8/VYTw4kr6AiPGkaO6oYOCII5DnPbSCW1exWR02kg16oWCFGDwu/Dubqfytoq8u9k6wibyPgxdBCZ9phEKOBRh/IJNbW5GpQF2OyiYDQZE2Uik4uHHn4/nY25ezEbyqGqPCTu3hGVqRgFlI2aTMIXqNqtimQJVaHgaLo6tSptf/ANP5P1lywyuNbGqhECZD/ENOmsTqcUp0YHQJKqpo4qD9Eo9GS2q1Y78lQV9FC35Wdz+q0WhVbbylVJxKqLMUAe1lC7sUFcY1IcrjMlOBkQVact2oQ7aQhBbnqR/XP5uBh9woPAUhJQkqSb5pKXqrUHMIOC6HryvkwZHsGpKP/VtjeNcNZwyO/8fE5PrLrxQhV0WC0VR9cREtX6QTviFFXielIoB4cFYQsPcfXkHs/RkV47nAf8hbwOjoQB6n6i0iNNo5ZB1uogkBq0EBy32pjSqbmPDguhj43qpmJeQCmH3P8vZmVr93JSLwaVuoa161VSAqfcaoswkHXAVNnglK6C/ybT41U5S3wb2aAV+/xSNp7XRrnQi/tTi0Ftaqm1lQW7jp/TPhw1pceeqKvFQFxIeIlsHAjg/IDZfjnLD84HCInVces8ThWwVzlHM0+u6+cjX1OrSqxJtduTOq+zZuukqm6HvRa/ksf22tOiozMEa0HHt1XqKPXOGaXRJzWcMCr2NVPq7cw3kbXH/Yj9WOO0X83ptyqxQANUKrKnYxnqZIZ/izonZCoUBiKYvDwjhibrmeyhl2M1UOQ6UrbI/rWsfjvVoSXOYejE9WnSlj+r00eV0oJQK0at8ow2V40sWKMH3lYqIjtteJ9fz8lOaiOeeo2LnChBKzhche4hqNRNWCmAQYU5ABijqpU3rdpfwiKDp93h/Pxv5OZEPTvmbJnV+mh1upJUlnb29X6QVVdAEjx6xIMWjYQxIemlwnBuc0byN7PrUh2rgfICmV4dq1R8RFV01RIDxwn0cZgtVaR186Z41SvEKmC1QDGrn/+tLA8xqsoWtgggK5JBxGCcy68mMoIi6bmNpPoR6kMEw0pczKNoa6dkxopjfzuL7SHJR3GmjbRZbfzAeT13oLb2NqrpXQeAmbsxW3KXUUE6SRMVSegP/MnvZPEgS08gkknhGU6qRKiN0zY0Rr3QtV1VhzvtXFVRe4DA4irvo9NNuP5F9u/m5oT7IrU4Qq8SUKkNMPOtKrK1mGKnnijKEfQeQOW0rQqquhY6Iikjvm+R/XtZPDgMqumvZAuoqovohicSrlTMT4eXVXMGUklw04I/HUZKu6KIBPAph1zG72fnZN4MovYPSZ2FVXXazhsk+qRtYWoQRIItqesWwrq55kOQc2C1Ds0au/5Bds0blcuIKh9HRoeF3ek4cYt4by3UR7Ky7xF9Ib+OldUpL1gand+twZuL7D/M2thBbTKSem/xKNVfOjl1l0/qzNiAL9SrgcBWDLU2HqHXMNpGp14JKNZn+Ud5W6VNDyLWtB9LJ7pRbjXN1U5pK76nVu9fLMkAVUGeMQWVebYyB/7Aa/5xFkNAfzXajl1DaI/MPbwouaMkbhMFCoSYJAcwNxFGkNAFuI6KaImq5uih/neW95n3Yqk1PAsfLIuugMkVzZM1HcgftUrvDjrDDwCt+6j+TVYlhkkLHvb1/mlOtutUTM9h/F2o1Tiq1srANZBjmAZEQ8+qXQ63xnIKolC8mgdOWPD60H/+z7I2lkwO+Onqhl47821wbJ1a1qHwQrRcXTt7MAfKgRNWoKRqeQj8ONT8//OsHWx0tLJx8933fj6kB3ml7ppBGy10tlB9s7oGQ064LAJUJasnItNNbdq/yPJVRnUjdcRLbbC0J1B1Z73IJLwa98FzIM0d9MgTTm3CaDXKHpFk6m24+5rsv9zIXn5drvtX5w5/v3X7PJ6ZF0p4bne9k2vyt3/bXv/O3ViLjqeq5pIN2+st49nPzy3Xfi5z99fnHjnWy5n3tve0fW97nb/OXCcn6/aCsu4oKOtiQVl3FpR1V0FZdxeUdU9BWfcWlFVSVy8XlPW4grLuKyjr/oKyHigo68GCsh5fUNYTCsoqqavPUVDWcxaU9cSCsp6roKznLijreQrKet6Csp6voKySuvr8BWW9QEFZL1hQ1gsVlPXCBWW9SEFZL1pQ1osVlFVSV1+8oKyXKCjrJQvKeqmCsl66oKyXKSjrZQvKermCskrqalVQlikoqy4oqykoqy0oyxaU1RWU1ReUVVJXXUFZQ0FZL19Q1isUlPWKBWW9UkFZr1xQ1qsUlFVSVx8qKOtVC8p6tYKynlRQ1sMFZT25oKynFJT11IKySurqqxeU9bSCsp5eUNYzCsp6jYKyXrOgrNcqKOu1C8oqqauvU1DW6xaU9XoFZb1+QVlvUFDWGxaU9UYFZb1xQVkldfVNCsp604Ky3qygrDcvKOstCsp6y4Ky3qqgrLcuKKukrr5NQVm+oKxQUFYsKGssKCsVlPW2BWW9XUFZJXX17QvKeoeCst6xoKx3KijrnQvKepeCst61oKx3KyirpK6+e0FZ71FQ1nsWlPVeBWW9d0FZ71NQ1vsWlPV+BWWV1NX3LyjrAwrK+sCCsj6ooKwPLijrQwrK+tCCsq4UlFVSVz+soKwPLyjrIwrK+siCsj6qoKyPLijrYwrK+tiCskrq6scVlPXxBWV9QkFZn1hQ1icVlPXJBWV9SkFZ/66grJK6+qkFZX1aQVmfXlDWZxSU9ZkFZX1WQVmfXVDW5xSUVVJXP7egrM8rKOvzC8r6goKyvrCgrC8qKOuLC8r6koKySurqlxaU9WUFZX15QVlfUVDWVxaU9VUFZX11QVlfU1BWSV392oKyvq6grK8vKOsbCsr6xoKyvqmgrG8uKOtbCsoqqavfWlDWtxWU9e0FZX1HQVnfWVDWdxWU9d0FZX1PQVkldfV7C8r6voKyvr+grB8oKOsHC8r6oYKyfrigrB8pKKukrv5oQVk/VlDWjxeU9RMFZf1kQVk/VVDWTxeU9TMFZZXU1Z8tKOvnCsr6+YKyfqGgrF8sKOuXCsr65YKyfqWgrJK6+qsFZf1aQVm/XlDWbxSU9ZsFZf1WQVm/XVDW7xSUVVJXf7egrN8rKOv3C8r6g4Ky/rCgrD8qKOuPC8r6k4KySurqnxaU9WcFZf15QVl/UVDWXxaU9VcFZf11QVl/U1BWSV3924Ky/q6grL8vKOsfCsr6x4Ky/qmgrP+voKx/X1BWSV39DwVl/ceCsv5TQVn/uaCs/1JQ1n8tKOu/FZT1zwVlldTV/15Q1v8oKOt/FpT1vwrK+t8FZf2fgrL+b0FZJ+fKySqpq+cKjuuWgrJuLSjrtoKyzheUdaGgrNsLyrrjJtXViwXHdWdBWZcKyrqroKy7C8q6p6CsewvKunyT6urjCo7rvoKy7i8o64GCsh4sKOvxBWU9oaCs57hJdfU5C47riQVlPVdBWc9dUNbzFJT1vAVlPV9BWc9/k+rqCxQc1wsWlPVCBWW9cEFZL1JQ1osWlPViBWW9+E2qqy9RcFwvWVDWSxWU9dIFZb1MQVkvW1DWyxWUVd2kumoKjqsuKKspKKstKMsWlNUVlNUXlOVuUl0dCo7r5QvKeoWCsl6xoKxXKijrlQvKepWCsh66SXX1VQuO69UKynpSQVkPF5T15IKynlJQ1lMLynr1m1RXn1ZwXE8vKOsZBWW9RkFZr1lQ1msVlPXaBWW9zk2qq69bcFyvV1DW6xeU9QYFZb1hQVlvVFDWGxeU9SY3qa6+acFxvVlBWW9eUNZbFJT1lgVlvVVBWW9dUNbb3KS66guOKxSUFQvKGgvKmgrKSgVlvW1BWW93k+rq2xcc1zsUlPWOBWW9U0FZ71xQ1rsUlPWuBWW9202qq+9ecFzvUVDWexaU9V4FZb13QVnvU1DW+xaU9X43qa6+f8FxfUBBWR9YUNYHFZT1wQVlfUhBWR9aUNaVm1RXP6zguD68oKyPKCjrIwvK+qiCsj66oKyPKSjrY29SXf24guP6+IKyPqGgrE8sKOuTCsr65IKyPqWgrH93k+rqpxYc16cVlPXpBWV9RkFZn1lQ1mcVlPXZBWV9zk2qq59bcFyfV1DW5xeU9QUFZX1hQVlfVFDWFxeU9SU3qa5+acFxfVlBWV9eUNZXFJT1lQVlfVVBWV9dUNbX3KS6+rUFx/V1BWV9fUFZ31BQ1jcWlPVNBWV9c0FZ33KT6uq3FhzXtxWU9e0FZX1HQVnfWVDWdxWU9d0FZX3PTaqr31twXN9XUNb3F5T1AwVl/WBBWT9UUNYPF5T1Izeprv5owXH9WEFZP15Q1k8UlPWTBWX9VEFZP11Q1s/cpLr6swXH9XMFZf18QVm/UFDWLxaU9UsFZf1yQVm/cpPq6q8WHNevFZT16wVl/UZBWb9ZUNZvFZT12wVl/c5Nqqu/W3Bcv1dQ1u8XlPUHBWX9YUFZf1RQ1h8XlPUnN6mu/mnBcf1ZQVl/XlDWXxSUtbxXQtatBWXdVlDW+WvvXTzJ69tD1/5dPXMvt8i/5UzkN3GRf/fJ9XNeRL6Zuruvyfyrzbwur7szc/70K9e/9zc7vdy+97cZnVve+7sjMv9+871p971/2Lx3affeP27eu7B775827/3l5vf969bdv7dzfwf/vd7Fg9z9505219yujWUOl/e2uv43u/fOb9772917t2/e+7vde3ds3vv73XsXN+/9w+69Ozfv/ePuvbs27/3T7r2tzt92cvr93X5y+j3cuXtvu05v3b23nc/zu/e2c3bHyenzctfuvQub95Y5unTtO8Pus/ecHF7nTvl5shvn8trbqnsy1z3t39vnc2n33r3Xfj9/8sj5u7h7b/nsz16bkMW2XN58p5ht4XXfRu7J7lp7vdx/bvvz5OTG5nQr68lXrv68d3fvWx046/tfnsfjrsm77eTgx7bXvHdzP9vPb3/X6/zub7927Tnqx/tfPHxnK/Nkc817j8zdXZnxXDx55NwVnJ9+0YGtLX34ytWfWpe/fcf193R5Mw+37r6bWwvL5//HHQeZv3ft90UvtmvrtHV4fvdZvRb9Or/77D9vrvVHu2ttbfCy/o+NY5n/S5v3zkI/l2e/1c/tNZex3XLySF1Zft/OxfK3vzyin9u5vDXzt9PW9vZzFzPjKTg/adHP7bpZXst723V8bvfedh3v8c99uzFv37t/897erz6weW/vAx/cvLfHP4/fvLf3x0/YvLf3nc+xeW/7DPavHG5anotkftBjwE3btbDMb85vLp/Tvf7zbq1tfcjynUub9y9n3l/e2z63vU24b/fv7TpZvrfo8/2Z753bvL/9+/nM9/R62pXD+9fJuTYw3fanXDrI3urIdiyXN3/bxyoPZj6/1bNlPPdm7uXBG5B115FrPz7z+a3Mu3fX3o5r+939tffjXL63yLv1yuG9ZW6WZ33b5r2C9qTTs/q0S4dx7PXp/JXr5yb3HLefv5G5zD3HyyePtAkP7t7brrO9zl/e/XuLUV79yvVyLt7A9/b+eru295jnwWsCteZf+9rvuTW9j/+3a/osfOgyt1sf+rjMvd9y8kjbsF3v53d/e67NOt/70O18Hlvnl3dzsv1cbu4u7Obu/jOeuwcyc3f/kbnb6vQDmblb/vZCBefuwg3O3e27uXvgjOfuwczcPXBk7ra29cHM3C1/e6mCc3f7Dc7dHbu5e/CM5+7xmbl78Mjcbe3l4zNzt/ytKTh3d9zg3N23m7vHn/HcPSEzd48/MndbjLn8vp275W+vUHDu7suM52JmPOXmx7g9bt6+lvee8+T6+9q+98TNe/uY4bl2Y96+99yb9/Yxw/Ns3tvHDM+7eW8fMzzf5r19zPD8m/f2McMLbN7bc0DbVy5mWJ7LY40Ztmthmd8cltnHEznOaIstjunedlxPvXL9eO7OXHPLaWz5xX38u33253afycXB53b/LX+/bfO37X0+6crVn3te402vfeiseYccL3jpyFyc2/1+bC5Ok3HxJD9Xy99vyczf9jnkuIZzJ+Xt6jIP22d3V2Y853efH3f6es9uLvZzsI8d7s5cNxdrn999ftzY66/ZxaHbZ5Ibwz53uNzLhVM+f+cp9/52mzF8/bU/XjzJP/eHrv27eqZeXXvseeX0bj/md96ttTPisLJrbRuP58Z4bvP+kpvb85zvvhv/nf+K48/p1XaMt23eX2x6Th9OTsqv363t3Y8vN9fL59/3JrC9+xycXsvzv3Ry/TM+2cz1Q//Csfm+cbFuYx9s45vO57DCYqdOy8nt82G5nycnN5Y/2s758pwWrL1dn3tu4Uxy89VBpxY7vMXa22vetbmfvd3e5izP7/720Uew9l27udv/7Ri3cNeRudtzC/ec8dzdm5m7e47M3TbXdW9m7pa/fXLBubtwg3O35xbOKC+3zt3lzNzde2Tuthj8cmbulr99VsG5u/0G526fU3tW53z3c3ejOd8vKjh3FzPj2edg9Hr4ytWf0tMv211z689yebx9/mL5/AddOsj8yiNYohxmq+r9PG2x8RYP7/OLZ7O3qzLnTrnfve6ehtUvnDL+u06un/Pl89+w0Z1v2uHks/FhXZvb57HEnxr/N58St2yx6LEYYPn8S2z06dt2eYGtvV98fG5fyPK5Z/d9Id97xEY81n0h92TGc7Y5FVPncmPLK5cj345x/8pxTMu4NT/fusnH7T+3v+ZWV/a5tC12vHdz7dPwxrmT6+3P9lkvY15s51ZGbj09fO1z0v2fPrKebs18d2+f11z4Zj393L/x9fSr/8bW057r3eaTnpm19ktnuNYebV380e65Lfd4o+ti+fxdm3Xxp6dgoe3fjvnxZS4vnPL5PVewfP4vM3zXrUe+v7c1W84zhxOXe7+Yee+haz+rZ+5Vn+zuacu/nmSuu39v+129ln0HOZt7bjcPubnayrr1yFgWGWfM2w1nGh/XJu73Yuu1xWX/4RQ7t8Vlt+/Gtn1/+fwH3nmQ+Z8vXj+/t2W+v9fVrU3J8f57nm0Z04VTPr8f5/L5/55ZUzk+bDtH/3M3R7ftZO91aI9dl88//2aO/s/O126/v/e1e3tycnLQy/18PnTt39Uz+drf69bXbq+5jO2Wk0c+py0/u5+L89fmIudrb9l879bM3/a+9lxmPBdP8rr3UJn5iftzE9tXLje4HeP+lfOny7gfK3bd6sp+T92zYJ5WPVp4w60e5bjzW3af3/5+cnLQo+VvDxzRo+383Jr5216Pjq2z82czP49Zj/a5+63f2OeST3b3v31t7+mxYratHi2fz2G25XPb/bhbX7K3c9s9MHsOdG/bH7r27+qZfC3jzO2N315zGdtj3Rv/Ykf0847N927N/O0YB7rfQ3VG+GTKnYlaXjkMvx3j/vVoe8cfi53b6spy/ZwOLp/L6d+/0hweze/keP/Hmt/pj+jYFvfdmvnbsX1ot5/yvb0N2NrW7TrJXW/LdZw2vi2+uGN3zW0slfv8Nt7bfv5VNnO0x31bnPLwlYP8V73z+mvfsZF9a+a7+1hy+bzf4L6Hr/1+78kjfeA+Z7bH3Q9d+3f1TL7297PVx+01l7HdcvLIZ7G1U/v7ffoRfdzOV24Oj+XMls/l5u6YL1k+9+zuS16/oC+5LTOem82X7LHOluPbjn//ejQ/80tn6Gdyen5u89/y7/2ez3OZe9vGnjm93mOtXF4wpwN7W7r9/F2ZcRw713js2jlbcsyO53K8ezv+9hk7vpd5/pT7ufsUme+0kbk/Y5XjfbfxyH5Oc/tHc7n0HMe+Pzdz2v6t7fdy55y261mv2zbvnfU5py03ev7K9XOT07ft5/dzmZv77XwtOnX55PR5PmYft2t02dd7bI/QHi9s5W7xQm7f/n6t3pcZz+XMeHJnFfdnAM7m3I5p93mB7St3FvVxu/e25wQeq71e7knze99dB7n7z+3HkzuzeLOdBbwuB7W57va+T05OHnG+TK/9GsmdHdzKePjK1Z+Xd5/fzlUuh7bHnsfGt7VLl08Z32k87SJvf6br047Y+Qc239nfc87OL5//zCN2Pnee9Zidf7TzrPuztMfOs96/+/eNnmdd9OJZocMlz7MeO5es18NXrv68fHL6POfs9nLN3Lo7d8rPZQz7v+3x81bWk6+cXHc/922+k8Mh+9oo92buVevlq3fx53at5HLQ+/hz+fx/28SfX3fno4/1XGasi68563OOufO1uXOO+3v8tt19LWtsmwfMnRPb6+Bp59zO7a774O66uXMROSy4XQd7LmS5lwuPMub9vX/XEW5jqx8LppD87zlFD25Ut5bP/9ZGt75/h3+2eGwfn2/nf4sb9NrauO3eCb1u27z3rPTTOfx2zE/n/OZWxsNXrv68fPJIf7Y/y3asFsVpPnz7mXszss/t/tvuCT538kh92J8tWz7/cxt9+JVrvz+aLv7CThdz9X+O6eLy+V/fXPuXM+PI3cfyt+1c7WPz7XvLd3O582Ox3/aec1zH9uzgL+zW0dYG7OOIkr52O6bl2ls9vJEaIPdl7jeHgW5EVm5P196+Xzjl84u8/ZntPzmCK/dnqffjWu5n+fwTdmPYf2Y/huXzf7EZwzedgkO3ur8d137f7PL5vz6CbbfnsG+EF3qOzOe356iX8dx78shnuf3u9rO5mg77Oi4P7P59f0ZOzkds42G9btu8d9Y+4rqaHpvrnqbT288/1phizz9u9eKBnaycf8rZopxPWcaYs1OL3C2GyNmKx+3Gc8xO5db3g5vr5D6/jQG3n/9fR9Z3bm3l9jzuZf7fI2sr98yOra3cWsw9x9zaesLuve3YL93AdR44Mq5HW/N7v7Ad837NP7C5xv4eHq2W0/0ZOfuYay9zv64eq+/d4u59zJXLT148InfLbWz3qP3RDeytPre7z+01t9zp/tkdw6LbMR2rJ3Ls2vdmZO2vfeGUz+9rPy2ff8K1m86t01wssr2fu0+R+cSNzP06zenHMX7nGK+2HU8Oo+392J53yM1/zq9t99XrddvmvbP2a9ed67ty/dw8Gnf9WGKfrU7lYp+9H3m0HMIxv7bnXXL5lO3Ziscax/7r7PM/cCXLHN5oLbLtnF/H3+3+Vm3W0TNbmycX41zMjKdg3qLJYbPllTvrsB3j/pXLTSzjfqx7lra6svdtOT09txvf9m9b3T0tB3lafY3T6ue+csYmP1osdmtmnKedbdqvv+1afvjKYcyvdgqPtvUH2++exgeEzRmOJ1/7Ped/9/tuntXnrfdnJW70vPUzjqzbnN3MYYrcvpt93dRj58IuZ7737G4P36CgPczl+282e7jfd7PF2o/1XNjWVv7Sv4Kt3NfuP81WPhoG+OYdBnhmcvmPFQ8dq1N8/w1cO2dL9tc+Da9vsff28+9wBK/n8lLb+7n7FJnvfASv5/D3Mbz+aLzmMp5jvOb+s8u/c/P/b3VPwVanju0pOGYft2v0GF7f7yfJ2c4tXsjtU9uv1bsz4zm2BynnN7fnMZazXrlaJPfcgKxjOv1o+5/2196Oa48Z93Yxty8up9Pbeip63bZ576x1+rq9sFeun5vcczxWfzw3l7nnmItb9s/xYkbWthbKMZ0+rf7KVu62/krpWlzRdiG21leT0T/rR6vFtea7rmzu+cr137n92r8X3LX//CLv/O7zn7XB55+zwwbnM9eb+bkjnzt3ys9ZRuZvt125/m8Xrzzy87deeeTnl2vfeeWRY1zeu7R5b6u7et117d/b+drKWsZxfvf5r9jYOb3u2Hxn+f7lzPXv2F3/unFn/rY/R3Yp8/lLmc/r+XzhtTGuZ2A31y5oL8wytgs7+du/7ce26M5Z1Ljr2s44513sYhraGB5tXZW+Pku6j743ZmjN1Br7r3392rluqEPV9mNMY9v8S2r8beOHx7qW93HW9jPndte5ZfO9h69c/Sn9+O4dBl2+t8W12+/ueYfl8z+wsWvft8Mm2/tZ19KjvL/8fYsVbt19/uTkkT7vQubz23Osy+ePnUU62X3v0c55b7/7aGd5H03uNg6d7+HK4b3VZl/7edvmvbPGJdeda9+NKTfnufNNy+dz+aUt93LsDOj5naxzGVlbfd3jkq1+7WuJ78d5cnL9Gsmt370e6HXG56e7G7EP2+vfefJIPSvtl05bqzk9WObuQmasey5OrydfOXzuNH27kLnOv3VZyzzv7U/u53Kd/d/219nq9H79bH3Zw1eu/tS4/nznY7a1RG7NfHfvY5bP/83Gx/zVER+zjPHSyfH53F5zn9M+7Xzs3+/uJVdr6dj52OXz/35zL/+0s7Xb57CMezuPuXPde7uYi9dyZ6CXz+dqzOdqy+TO5N15A7JuOXLtS5nPb2UeO5N36QZknTty7dwZvktHrr0d1/5c2/Z7/0p9/NY8wIIXTjtnf2lz/9vPb3/Xa19XcxGSywNcOjJ3y7X0upyZuxvhqHI9E5fPPxpHtdfX7fX2vNC+B2ROv05OHrmuTlsHOey2re2h121Xrh/rQ9f+Xj1zryx2u+7c+ua6p63VY3u5Hm2tLvN+7ExhzpfszxLnMGLu7OLeXm+/u7XXN4rd9j+X6+//dtrZcr2Wem3L2t/inILPus7VTDgpJ98cww/Lte84k3urzY08h+317zx5pE6dBcbNnanN8dlnW3ehrpQnyNVwupCZm/049nWGzqa/RV0dO6e9+qvNe8s49JlXu+v6Md5yNmM0Z7tGr87B1i7qtdguXfPF7jpcd/tscth4Ow97PPnSdx1kvuS133PYeLFTp9Wn2tvEfd2O7Wf3tXFy52f387r9/Jb7z93rhd29Lp+vN5hkf5ZgW1f01sy4TpNpNzL3edmcjzyWw3o0H7mM5xiezY19iz32f1uez96Pbj+7xzmnyd6PSa/Fp22/t/93Dj/dsfvsHaeMaStn71NvFB8ci+duzVxnu/5WXbxy+FxJX73M44K/bt2M6bYrh3Ff2Ixbr22+Y/ncmp88m7FWy1iX/MiylrbX3N7LLbvP738/v/vbG2xs3vYet89pe983kpvZ5qyWMebyeJeuPDZZd+xk3f5MyFrGlctX3f4vHFdO1oWdrFyOb/u3bb7oKdeejezQ/w+SOWrzjWECAA==", + "debug_symbols": "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eEPBGwreUPCGGm+o8YYab6jxhhpvqPGGGm+o8YYab6jxhpI3lLyh5A0lbyh5Q8kbSt5Q8oaSN5S8oc4b6ryhzhvqvKHOG+q8oc4b6ryhzhvqvKHBGxq8ocEbGryhwRsavKHBGxq8ocEbGryhyRuavKHJG5q8ockbmryhyRuavKHJG5q8ocUbWryhxRtavKHFG1q8ocUbWryhxRtavKHNG9q8oc0b2ryhzRvavKHNG9q8oc0b2ryh4g0Vb6h4Q8UbKt5Q8YaKN1S8oeINsVMHO3WwUwc7dbBTP592cDm4nFwuLjeXvCF26mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgpw526mCnDnbqYKcOdupgp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526mSnTnbqZKdOdupkp0526s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6fu7NSdnbqzU3d26s5O3dmpOzt1Z6ce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526mKnLnbqYqcudupipy526lKnbg916mcZXDYuk8vO5eBycrm43FzyhoI3FLyh4A0Fbyh4Q8EbCt5Q8IaCNxS8ocYbaryhxhtqvKHGG2q8ocYbaryhxhtqvKHkDSVvKHlDyRtK3lDyhpI3lLyh5A0lb6jzhjpvqPOGOm+o84Y6b6jzhjpvqPOGOm9o8IYGb2jwhgZvaPCGBm9o8IYGb2jwhgZvaPKGJm9o8oYmb2jyhiZvaPKGJm9o8oYmb2jx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", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_0.snap index 97ca9c58916..ae6c6749215 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_0.snap @@ -47,8 +47,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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PmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmHZPmXZPmXZPmXZPmXZPt1Qq6ws26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs26cs22cs22cs22cs22cs22cbapWNZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfuMZfsGy/YNlu0bLNs3WLZvbKhVHizbN1i2b7Bs32DZvsGyfYNl+wbL9g2W7Rss2zdYtm+wbN9g2b7Bsn2DZfsGy/YNlu0bLNs3WLZvsGzfYNm+wbJ9g2X7Bsv2DZbtGyzbN1i2b7Bs32DZvsGyfYNl+wbL9g2W7Rss2zdYtm+wbN9g2b7Bsn2DZfsGy/YNlu0bLNs3WLZvsGzfYNm+wbJ9g2X7Bsv2DZbtGyzbN1i2b7Bs32DZvsGyfYNl+wbL9g2W7Rss2zdYtm+wbN9g2b7Bsn2DZfsGy/YNlu0bLNs3WLZvsGzfYNm+wbJ9g2X7Bsv2DZbtGyzbN1i2b7Bs32DZvsGyfYNl+wbL9g2W7Rss2zdYtm+wbN9g2b7Bsn2DZfsGy/YNlu0bLNs3WLZvsGzfYNm+wbJ9g2X7Bsv2TZbtmyzbN1m2b7Js39xQqzxZtm+ybN9k2b7Jsn2TZfsmy/ZNlu2bLNs3WbZvsmzfZNm+ybJ9k2X7Jsv2TZbtmyzbN1m2b7Js32TZvsmyfZNl+ybL9k2W7Zss2zdZtm+ybN9k2b7Jsn2TZfsmy/ZNlu2bLNs3WbZvsmzfZNm+ybJ9k2X7Jsv2TZbtmyzbN1m2b7Js32TZvsmyfZNl+ybL9k2W7Zss2zdZtm+ybN9k2b7Jsn2TZfsmy/ZNlu2bLNs3WbZvsmzfZNm+ybJ9k2X7Jsv2TZbtmyzbN1m2b7Js32TZvsmyfZNl+ybL9k2W7Zss2zdZtm+ybN9k2b7Jsn2TZfsmy/ZNlu2bLNs3WbZvsmzfZNm+ybJ9k2X7Jsv2TZbtmyzbN1m2b7Js32TZvsmyfZNl+ybL9k2W7XOW7XOW7XOW7XOW7fMNtcrOsn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Osn3Bsn3Bsn3Bsn3Bsn2xoVY5WLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWLYvWbYvWbYvWbYvWbYvN9QqJ8v2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Jcv2Fcv2Fcv2Fcv2Fcv21YZa5WLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvmLZvkLZPt1Qtm/VIa3yqkNa5VWHtMqrDmmVVx3SKq86pFVedUirvOqQVnnVYa0yyvatOqxVRtm+VYe1yijbt+qwVhll+1Yd1iqjbN+qw1pllO1bdVirjLJ9qw5rlVG2b9VhrTLK9q06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", + "bytecode": "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", + "debug_symbols": "zd3bjiPnkbXhe+ljHWREfLHzrQx+GN5oDAGCZMjyDwwM3/t87VGz2s5kpyfUxXlPjJa7Frm6KrlIJvmw/vbhj9/+/q9/+u13P/znj3/58Jv/+NuH73/8w+9+/u7HH/Z//e3v33z4/U/fff/9d3/67ef/94fj4/8s/cfX/+XPv/vh43/+5eff/fTzh990fPPh2x/++OE3orrj//nd999++I0ff//m9JWW9cuXWvfbl/rFl8pxZK9PF3wcFcdbwP7+/775sIxUZpHKOKlMkMokqUyRyjSojB+kMkIqQ1pgJy2wkxbYSQvspAV20gI7aYGdtMBBWuAgLXCQFjhICxykBQ7SAgdpgYO0wEFa4CAtcJIWOEkLnKQFTtICJ2mBk7TASVrgJC1wkhY4SQtcpAUu0gIXaYGLtMBFWuAiLXCRFrhIC1ykBS7SAjdpgZu0wE1a4CYtcJMWuEkL3KQFbtICN2mBm7TA+/9EtSFtsBykEZaDtMJykGZYDtIOy0EaYjlISywHaYrlQG2xoLZYUFssqC0W1BYLaosFtcWC2mJBbbGgtlhQW6yoLVbUFitqixW1xYraYkVtsaK2WFFbrKgtVtQWG2qLDbXFhtpiQ22xobbYUFtsqC021BYbaosNtcULtcULtcUoPicoPycoQCcoQScoQicoQycoRCcoRScoRicoRycoSCcoSScoSicoSycoTCcoTScoTicoTycoUCcoUScoUicoUycoVCcoVScoVicoVycoWCcoWScoWicoWycoXCcoXScoXicoXycoYCcoYScoYicoYycoZCcoZScoZicoZycoaCcoaScoaicoaycobCcobScobicobycocCcocScocicocycodCcodScodicod6cod6cod6cod6cod6cHaYsV5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4U5e4M5e4M5e4M5e4M5e7sIG2xodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydodydvdTdia58tJF9Xu3UplBtmtTmpe7uvo2g2iiqjaHaLFQbR7UJVBvUFjtqix21xYHa4kBtcaC2OFBbHKgtDtQWB2qLX+ruJFrf2qTXqU2h2jSpzUvd3X0bQbVRVBtDtVmoNo5qE6g2qC1O1BYnaosLtcWF2uJCbXGhtrhQW1yoLS7UFr/U3ams49FG9fBTm0K1aVKbl7q7+zaCaqOoNoZqs1BtHNUmUG1QW9yoLW7SFq+DtMXrIG3xOkhbvA7SFq+DtMXrIG3xOkhbvF7q7tTr7ey1htupTaHaNKnNS93dfRtBtVFUG0O1Wag2jmoTqDaoLRbUFgtqixW1xYraYkVtsaK2WFFbrKgtVtQWv9Td2WH2aGPH54Ff2hSqTZPavNTd3bcRVBtFtTFUm4Vq46g2gWqD2mJDbbGhtnihtnihtnihtnihtnihtnihtnihtnihtnihtnihtthRW+yoLXbUFjtqix21xY7aYkdtsaO22FFb7KgtDtQWB2qLX+rubL/g/dZm5em830vd3X2bhWrjqDaBapOoNoVq06Q2L3V3920E1Qa1xYna4kRtcaK2OFFbnKgtTtQWJ2qLC7XFL3V3li5vbUry1EZRbQzVZqHaOKpNoNokqk2h2jSpzUvd3X0b1BY3aosbtcWN2uJGbXGjtrhRW9yoLW7SFvtL3d06Pvus1SWnz1r1l7q7+zaKamOoNgvVxlFtAtUmUW0K1aZJbQS1xYLaYkFtsaC2WFBbLKgtFtQWC2qLBbXFL3V3a1m9tdmPrf61zUvd3X0bQbVRVBtDtVmoNo5qE6g2iWpTqDaoLTbUFhtqiw21xYbaYkNtsaG22FBbbKgtfqm7W5n91qaWn9o0qc1L3d19G0G1UVQbQ7VZqDaOahOoNolqg9rihdpiR22xo7bYUVvsqC121BY7aosdtcWO2mJHbbGjtjhQWxyoLQ7UFgdqiwO1xYHa4kBtcaC2OFBbHKgtTtQWJ2qLX+nuVpY+2uz/6HMbQ7VZqDaOahOoNolqU6g2TWrzSnf3b7QRVBvUFhdqiwu1xYXa4kJtcaG2uFBbXKgtbtQWN2qLG7XFjdriRm1xo7a4UVvcqC1u1BY3aYvjIG1xHKQtjoO0xXGQtjgO0hbHQdriOEhbHAdpi+MgbXEcqC0W1BYLaosFtcWC2mJBbbGgtlhQWyyoLRbUFgtqixW1xYraYkVtsaK2WFFbrKgtVtQWK2qLFbXFitpiQ22xobbYUFtsqC021BYbaosNtcWG2mJDbbGhtnihtnihtnihtnihtnihtnihtnihtnihtnihtnihtthRW+yoLXbUFjtqix21xY7aYkdtsaO22FFb7KgtDtQWB2qLA7XFgdriQG1xoLY4UFscqC0O1BYHaosTtcWJ2mKUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUuwuUu0uUu0uUu0uUu0uUu8uDtMWJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneJcneFcneFcneFcneFcnd1kLa4UO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUO6uUe6uUe6uUe6uUe6uD9IWN8rdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdNcrdyYGCd7sOaY13HdIc7zqkPd51SIO865AWedchTfKuQ9rkXYc0yrsOa5VRBG/XYa0yCuHtOqxVRjG8XYe1yiiIt+uwVhlF8XYd1iqjMN6uw1plFMfbdVirjAJ5uw5rlVEkb9dhrTIK5e06rFVGsbxdh7XKKJi367BWGUXzdh3WKqNw3q7DWmUUz9t1WKuMAnq7DmuVUURv12GtMgrp7TqsVUYxvV2HtcooqLfrsFYZRfV2HdYqo7DersNaZRTX23VYq4wCe7sOa5VRZG/XYa0yCu3tOqxVRrG9XYe1yii4t+uwVhlF93Yd1iqj8N6uw1plFN/bdVirjAJ8uw5rlVGEb9dhrTIK8e06rFVGMb5dh7XKKMi367BWGUX5dh3WKqMw367DWmUU59t1WKuMAn27DmuVUaRv12GtMgr17TqsVUaxvl2Htcoo2LfrsFYZRft2HdQqC8v2Ccv2Ccv2Ccv27VeuWXVQqyws2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs2ycs26cs26cs26cs26cs26cHapWVZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuUZfuMZfuMZfuMZfuMZfvsQK2ysWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWyfsWzfYtm+xbJ9i2X7Fsv2rQO1yotl+xbL9i2W7Vss27dYtm+xbN9i2b7Fsn2LZfsWy/Ytlu1bLNu3WLZvsWzfYtm+xbJ9i2X7Fsv2LZbtWyzbt1i2b7Fs32LZvsWyfYtl+xbL9i2W7Vss27dYtm+xbN9i2b7Fsn2LZfsWy/Ytlu1bLNu3WLZvsWzfYtm+xbJ9i2X7Fsv2LZbtWyzbt1i2b7Fs32LZvsWyfYtl+xbL9i2W7Vss27dYtm+xbN9i2b7Fsn2LZfsWy/Ytlu1bLNu3WLZvsWzfYtm+xbJ9i2X7Fsv2LZbtWyzbt1i2b7Fs32LZvsWyfYtl+xbL9i2W7Vss27dYtm+xbN9i2b7Fsn2LZfsWy/Ytlu1bLNu3WLZvsWzfYtm+xbJ9i2X7Fsv2LZbtWyzbt1i2b7Fs32LZPmfZPmfZPmfZPmfZPj9Qq+ws2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2+cs2xcs2xcs2xcs2xcs2xcHapWDZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuCZfuSZfuSZfuSZfuSZfvyQK1ysmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsmxfsWxfsWxfsWxfsWxfHahVLpbtK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5btK5bta5bta5bta5bta5bt6wO1ys2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfc2yfY2yfXqgbN+uQ1rlXYe0yrsOaZV3HdIq7zqkVd51SKu865BWedchrfKuw1pllO3bdVirjLJ9uw5rlVG2b9dhrTLK9u06rFVG2b5dh7XKKNu367BWGWX7dh3WKqNs367DWmWU7dt1WKuMsn27DmuVUbZv12Gt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", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 4f426c2d893..42d1e66f9d4 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/poseidonsponge_x5_254/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -43,8 +43,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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ZLF9kcX2RRbbF1lsX2SxfZHF9kUW2xdZbF9ksX2RxfZFFtsXWWxfZLF9kcX2RRbbF1lsX2SxfZHF9kUW2xdZbF9ksX2RxfZFFtsXWWxfZLF9kcX2RRbbl1hsX2KxfYnF9iUW25cWVConFtuXWGxfYrF9icX2JRbbl1hsX2KxfYnF9iUW25dYbF9isX2JxfYlFtuXWGxfYrF9icX2JRbbl1hsX2KxfYnF9iUW25dYbF9isX2JxfYlFtuXWGxfYrF9icX2JRbbl1hsX2KxfYnF9iUW25dYbF9isX2JxfYlFtuXWGxfYrF9icX2JRbbl1hsX2KxfYnF9iUW25dYbF9isX2JxfYlFtuXWGxfYrF9icX2JRbbl1hsX2KxfYnF9iUW25dYbF9isX2JxfYlFtuXWGxfYrF9icX2JRbbl1hsX2KxfYnF9iUW25dYbF9isX2JxfYlFtuXWGxfYrF9icX2JRbbl1hsX2KxfYnF9iUW25dYbF9isX2JxfYlFtuXWGxfYrF9icX2JRbbl1hsX2KxfYnF9iUW25dYbF9isX2ZxfZlFtuXWWxfZrF9eUGlcmaxfZnF9mUW25dZbF9msX2ZxfZlFtuXWWxfZrF9mcX2ZRbbl1lsX2axfZnF9mUW25dZbF9msX2ZxfZlFtuXWWxfZrF9mcX2ZRbbl1lsX2axfZnF9mUW25dZbF9msX2ZxfZlFtuXWWxfZrF9mcX2ZRbbl1lsX2axfZnF9mUW25dZbF9msX2ZxfZlFtuXWWxfZrF9mcX2ZRbbl1lsX2axfZnF9mUW25dZbF9msX2ZxfZlFtuXWWxfZrF9mcX2ZRbbl1lsX2axfZnF9mUW25dZbF9msX2ZxfZlFtuXWWxfZrF9mcX2ZRbbl1lsX2axfZnF9mUW25dZbF9msX2ZxfZlFtuXWWxfZrF9mcX2ZRbbl1lsX2axfZnF9mUW25dZbF9msX2ZxfZlFtuXWWxfZrF9mcX2ZRbbV1hsX2GxfYXF9hUW21cWVCoXFttXWGxfYbF9hcX2FRbbV1hsX2GxfYXF9hUW21dYbF9hsX2FxfYVFttXWGxfYbF9hcX2FRbbV1hsX2GxfYXF9hUW21dYbF9hsX2FxfYVFttXWGxfYbF9hcX2FRbbV1hsX2GxfYXF9hUW21dYbF9hsX2FxfYVFttXWGxfYbF9hcX2FRbbV1hsX2GxfYXF9hUW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", + "bytecode": "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", + "debug_symbols": "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YvsSi+1LLLYvsdi+xGL7EovtSyy2L7HYvsRi+xKL7Ussti+x2L7EYvsSi+1LLLYvsdi+xGL7EovtSyy2L7HYvsRi+zKL7cssti+z2L7MYvvyhErlzGL7Movtyyy2L7PYvsxi+zKL7cssti+z2L7MYvsyi+3LLLYvs9i+zGL7Movtyyy2L7PYvsxi+zKL7cssti+z2L7MYvsyi+3LLLYvs9i+zGL7Movtyyy2L7PYvsxi+zKL7cssti+z2L7MYvsyi+3LLLYvs9i+zGL7Movtyyy2L7PYvsxi+zKL7cssti+z2L7MYvsyi+3LLLYvs9i+zGL7Movtyyy2L7PYvsxi+zKL7cssti+z2L7MYvsyi+3LLLYvs9i+zGL7Movtyyy2L7PYvsxi+zKL7cssti+z2L7MYvsyi+3LLLYvs9i+zGL7Movtyyy2L7PYvsxi+zKL7cssti+z2L7MYvsyi+3LLLYvs9i+zGL7Movtyyy2L7PYvsxi+zKL7cssti+z2L7MYvsyi+3LLLavsNi+wmL7CovtKyy2r0yoVC4stq+w2L7CYvsKi+0rLLavsNi+wmL7CovtKyy2r7DYvsJi+wqL7Ssstq+w2L7CYvsKi+0rLLavsNi+wmL7CovtKyy2r7DYvsJi+wqL7Ssstq+w2L7CYvsKi+0rLLavsNi+wmL7CovtKyy2r7DYvsJi+wqL7Ssstq+w2L7CYvsKi+0rLLavsNi+wmL7CovtKyy2r7DYvsJi+wqL7Ssstq+w2L7CYvsKi+0rLLavsNi+wmL7CovtKyy2r7DYvsJi+wqL7Ssstq+w2L7CYvsKi+0rLLavsNi+wmL7CovtKyy2r7DYvsJi+wqL7Ssstq+w2L7CYvsKi+0rLLavsNi+wmL7CovtKyy2r7DYvsJi+wqL7Ssstq+w2L7CYvsKi+0rLLavsNi+wmL7CovtKyy2r7DYvsJi+yqL7asstq+y2L7KYvvqhErlymL7Kovtqyy2r7LYvspi+yqL7asstq+y2L7KYvsqi+2rLLavsti+ymL7Kovtqyy2r7LYvspi+yqL7asstq+y2L7KYvsqi+2rLLavsti+ymL7Kovtqyy2r7LYvspi+yqL7asstq+y2L7KYvsqi+2rLLavsti+ymL7Kovtqyy2r7LYvspi+yqL7asstq+y2L7KYvsqi+2rLLavsti+ymL7Kovtqyy2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", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index bb1eb5aeaa6..c424a3b34fc 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/ram_blowup_regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -34,10 +34,6 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -48,8 +44,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/92dB5gkRRXHa3Zmdndmdm/m7ggHRzjuSEectDuzGDiO4zgVFbMoCrNJxYQBAxjmMGNCxZwIKoqiYMQIHIpZMaMYMIsBcxb1/Y+unTdvamZXtvvTv/XN+3q6u/rVr6qrq6qrul6lXORSO387XaZzqLP1O+bcpmhbXp6rxKirnBRjioBxiIAxTcCYIWDMEjAOEzCOEDCOEjDmCBjzBIwFAsYxAsZxAsYVBIxFAsYSAeNKAsZVBIyrCRh3IWDclYBxNwLG3QkY1xAw7kHAuCcB41oCxr0IGPcmYNyHgHFfAsZ1BIz7ETCuJ2DcQMC4PwHjAQSMBxIwHkTAeDAB40YCxkMIGA8lYDyMgPFwAsYjCBiPJGAsEzBWCBirBIw1AsY6AeMEAeMkAWODgLFJwDhFwHgUAePtCBhvT8B4BwLGOxIwHk3AuImA8RgCxs0EjMcSMG4hYDyOgHErAePxBIzbCBjvRMB4ZwLGuxAwnkDAeFcCxrsRMN6dgPFEAsZ7EDDek4DxXgSM9yZgvA8B430JGO9HwHh/AsaTCBgfQMD4QALGkwkYH0TA+GACxlMIGE8lYGwRME4TMM4QMM4SMM4RMM4TMD6EgPGhBIwPI2A8jYDx4QSMjyBgfCQB46MIGB9NwHg6AeNjCBgfS8D4OALGxxMwnkHA+AQCxicSMD6JgPHJBIxnEjCeRcD4FALGpxIwPo2A8ekEjG0Cxu0EjGcTMD6DgPGZBIzPImB8NgHjcwgYn0vA+DwCxnMIGJ9PwPgCAsYXEjC+iIDxxQSM5xIwvoSA8aUEjC8jYDyPgPHlBIyvIGB8JQHjqwgYX03A+BoCxtcSML6OgPH1BIxvIGB8IwHj+QSMFxAwXkjAeBEB45sIGN9MwPgWAsaLCRjfSsD4NgLGSwgY307A+A4CxksJGN9JwPguAsbLCBgvJ2B8NwHjewgY30vA+D4CxvcTMH6AgPEKAsYPEjB+iIDxwwSMHyFg/CgB48cIGK8kYLyKgPFqAsYdBIzXEDB+nIDxEwSM1xIwfpKA8VMEjJ8mYPwMAeNnCRg/R8D4eQLGLxAwfpGA8ToCxi8RMH6ZgPErBIxfJWD8GgHj1wkYv0HAeD0B4zcJGL9FwHgDAeO3CRi/Q8D4XQLG7xEw3kjA+H0Cxh8QMP6QgPFHBIw/JmD8CQHjTwkYf0bAeBMB488JGH9BwPhLAsZfETDeTMD4awLG3xAw/paA8XcEjL8nYPwDAeMfCRj/RMD4ZwLGvxAw/pWA8W8EjH8nYPwHAeMtBIz/JGD8V4yMnq0L1KW6jw2JpEUyIlmRYZERkVGRnEhepCAyJjIuskKkKFISWSmySmS1yC4iu4rsJrK7yBqRPUT2FFkrspfI3iL7iOwrsk5kP5H1IhtE9hc5QORAkYNEDhbZKHKIyKEih4kcLnKEyJFIHJGKSFWkJlIXmRCZFGmINEWmRI4SwSL3WEQei7RjEXS/yPgxIptFsMgzFlHGIsVYBBiL7GIRWywSi0VYscgpFhHFIp1YBBOLTJ4ogkUSsQghFvnDInpYpA6LwGGRNSxihkXCsAgXFrnCIlJYpAmLIGGRoVNFWiLTIljkBYuoYJESLAKCRTawiAUWicAiDFjkAIsIwEg/jODDyPzpIjCSDiPkMPINI9owUg0j0DCyDCPGMBIMI7wwcgsjsjDSCiOoMDLaFtkucrYIjDzCiCKMFMIIIIzswYgdjMTBCBuMnMGIGIx0wQgWjEydKwIjSTBCBCM/MKIDIzUwAgMjKzBiAiMhMMIBIxcwIgEjDTCCACMD54tcIHKhCCZ5YxI1JiljEjAm2WISKyaJYhImJjliEiEm6WESHCaZXSaCSVKYhIRJPphEg0kqmASCSRaYxIBJAvgIHx+54yNyfKSNj6DxkfFVIleL7BDBR574iBIfKeIjQHxkh4/Y8JEYPsLCR074iAgf6eAjGHxkcp0IPpLARwgY5McgOgapMQiMQVYMYmKQEINwGOTCIBIGaTAIgkGGG0XQSY5OaHTyohMVnZToBEQnGzqx0EmEThh0cqATAS/peAnGSyZe4vCShJcQNPLRiEYjFY1ANLLQiEEjAZUwKjlUIiikUQiikPGuX7kANx79yUX7Q+o8yoxN0X55ea6SM+HGqb9ZqU/lXLeLmb+Wc52yNHb9lXI5p3QmwF8eifRsa3f027j4fJByCd2ncr2ZaDwlHcdN3JyKiw87k0zYlZQJz5l4OhN+3iWYp8q38ujwPI9NH/9/3Ptpd3hS5lym3RsPfy7b7o4HHNoYa5Q/m7eGlL8N6v9Go3vb9l6mJJ9JKVOaCT+TldWu/3Po4zjSdgvOn0urYz7NfTqNav/mXE6dy7S7w8lH+xkVjtblObLG//povxhth9U1/vpSIPxhE34Xd+CYTiOrKx045v2jrbs2+o82rq8njm139MVdjsNtSUJ/uaP/OKXfufjr6a3J8C/oPz4R/dUy7jHKjzN8nnC9z1Uqvvgs1De6jLXlU9bFH9dqeen1zcIz6xKs/1R9kzU8Nn2GTPoMJ5M+5ZTRr3mGA+nj7+VI4JzXNRrtZ5Uu7X9YxVH71//99frYVLQtBXTavDvieuOjj+myr2billb+Un22zvXmI623FODy9zfJNhbuaah9t6Xdie/RKlx9//T90tf6eiBr/J/gOjo3R/+LzgXbxjreCbUV6qFyxrtxF86rznXfP+/SZt+2185Seq0/G6aul+1zFGrnFdzgfBzKb/bZ0/5HAmH4+6SfcX9tzvU+lzHepykfd/s+qtMlr8LWjNaF7pPnxvY8pdf6s2HqdNLh2zIr9Iz4utrmM7gt0TnoOMnoDZWV2YBeWxae4jo6TzY6Q3WLZt1qWEP5U5cTRRfODzrMXCDMUP3h/edVOCH/Xl/W+J+NtmC52OgsBBhCZb73PxbwXwgwF11vnhjrE7a+j7o/J2Pi4/2fpuJzSfQ/9I6pn024jDoXZ3sJ4VyqOGy6Ztvd8R6UhnA2zccD/nVa+viVjH+d/qG6tWDCCZWD+rmwz4DOn/5a/bwmme6NZmeQwt9zn4+sy6jz2v+Z0b7Oo36bWQbnfKNVma+15lsTrdnZ+kxrldEPp+st/V6xlH6mZNoC1SW3+9Mq3WxZmES7P214Ui6clkm3EZdaV/j/K12nvR5q02pd66JtqC1o45dUX27K8GVU/Gzd5VTcMoG4Odcpt/2xc6It8vs1Rp/Nc/3uccn15jn7fCT0HjoRaqd458/p+tj2LTkTR+00N9LnWqXX+rNh6rziw19KfwXcpmhbXqb7r/WP/wfl1v9q/3iS/TkouVAO+edGp5HuqwyVSTq//D+XSxdF26TKpcXeW+Nuf9QnWo2ZVqNSmapX5uqVicXaH3GHPzMxOT0jEOW5Cnari4Uf6uPX7Xg4P06gxxG0f68va/xf7v26W8f64ey4kg4P/nYM8Jfqs92pI3As0+4+Fhpf0OMu3r8PO9/uZfTnCupc1oQzFu3r9NK6PEfW+L8y2vf3RI+V+OtLgfBHTfhd3IFjtm4sBPwXAv5xf67w+qKtjnvc5fjOMI1+fcyy+byTxHPVatSaM9X6TGN6otaqTd6m94o4+mltfe5cfGk+qA940JjIbY1DNv44lEuuf51q24nLiUPJ9bY5s33iF/OzMe/1jySivzJn+1Njuz/qm5hcMmkzt9hYwvUqXMhCOeZ624n6Htp+vZtcR+cN0f9i4HqfP5LNE5WFdlqoHykViI9n1XlodMB1ul+y2CcuLrA/NIDBud42nU0/ryf0vKUMj74uswhP6B7b8F2A3etZrF0Z6oO17AWj196Pfv2/Oq/qvkvb9+793xxtdZ+t1xnq3wyVd/74ioB/3efpeYqGQV8b6rvW/bKha23+Gld8g3TZNLL3xOsJ5a9+1w0F+EaNnnTgumKAVddToTjbsrJf/7Qel9B+7LiE939LtAV3PhXWqfOZTlObzxbyUKqj0+azUL4ZlM+KAf8rlB/PU3S9ebBortNpGurTsXlJ+88bv3a/ENATaoPY8bl8IH5LHfPSY1G+Pou7vVttNienqtPlemN2Zn62XlusvftvwkNgB+XUAAA=", - "debug_symbols": "tdrbattAEAbgd9G1L3ZmdvaQVymlOIkSDMYOjlMoIe9eKVhq0E5k/qG+CVbQx2j1r/Zg67177O/fnn/tDk/H1+7ux3u3Pz5sz7vjYTh6/9h096fdfr97/vX1310Y/0T+PP/1ZXsYD1/P29O5u6tFN11/eBw/pcE/7fZ9d6fh4+emiwKLCAuFRYJFhkWBRUWFBlgQLODMFc5c4cwVzlzhzBXOXOHMFc48mXeXQpwIhSxLY7adOKTJsPLSmK0n4TgZSbQ0xWEqbnJwGHIYdhhxGDsfojlTinFpssMUh6lXjS77aAkOQw7DDiMOEx1GHeab55Tz/JxKWZpv8il1rlOX/a0yPh5UddS53h5tTHaY4jAVNxTsjs06h8qlReRB7EHiQdGD1IMc09Awm3lQ8aDqQBQ8iDyIPUg8KDoQmyhLuZicQ0MUJwknGScFJxUmEnBCOGGcCE7w9AVPX/D0BU9f8PQFTz/a6deJlGamp0g4YZwITiJOFCcJJ2YuqQa6mFQpz4gG35xcOE4r98KJv548VrC34P+1At28At+8gty8Qrx5Bb15hXTzChms8ImKB1UHSsGDyIPYg8SDogPZmxOO4WI4LhfXbG9N1gnhhHFi3rWhc04kc0MiThQnCSfm88N1IhJaUnBSYUJmW4SnTiYsDTGrKE1RasxLwmYf0zoNOSloQwgnjBO5Qig2JOJEbSIzqQ0xc9GSV0jGScGJPT7L1MdSXK5Y2d6vJE4rROBuae8kIk1VIjfd0t5JrJOEk4wTM5cYykxKQypM7J3EOqErRJq22DuJdSI2mbpljM04Zu8k4jxZWkRxYqevc5Sp6Zb2D4DrpODEHpPnR0ylaYu9AVknhBPGieAk4kRxYo/JVGbS5GKvm9dJwUm9QtqebK+YlfL3k7i9Xl6d9+3V8joRjHwMR7+3p932ft9f3kN4ejs8fHkt4fznpV+8ofByOj70j2+nfnxX4d9rCuM9oSwbqnG4lPFChh/fZPz8+W0tDXdn+J5/PBxvBae04VSGKxiu4i8=", + "bytecode": "H4sIAAAAAAAA/9WdB5gkRRXHa3Zmdndmdm/m7ggHRzjuSEfs2Z293cXAcRzHqaiYRVGY26BiwoABDHOYFRUjiqIcJowgmCOgKGZMGDBgJOecef+la+fNm5rZhev+4F/fvq93uqtf/aq6uqr6dderjItDZuZvJuSau5pb/8McWx1vo80L1QR1RWkxZggYewgYswSMOQLGPAFjLwFjHwFjPwFjgYCxSMBYImAcIGAcJGBcQMBYJmCsEDAuJGBcRMC4mIBxCwLGLQkYtyJg3JqAcQkB4zYEjNsSMC4lYNyOgHF7AsYdCBh3JGBcRsC4EwHjcgLGFQSMOxMw7kLAuCsB424EjLsTMK4kYNyDgHFPAsa9CBj3JmDch4BxXwLGiICxSsA4RMA4TMBYI2AcIWBcRcA4SsA4RsA4TsC4HwHjIwgYH0nA+CgCxkcTMO5PwLiagPEAAsY1BIwHEjCuJWA8iIBxHQHjwQSM6wkYH0PA+FgCxscRMB5CwPh4AsYnEDA+kYDxUALGJxEwPpmA8SkEjE8lYHwaAePTCRifQcD4TALGwwgYn0XA+GwCxsMJGJ9DwPhcAsYjCBiPJGCsEzBuIGCcIGCcJGCcImCcJmB8HgHj8wkYX0DAeBQB4wsJGF9EwPhiAsaXEDC+lIDxaALGlxEwvpyA8RUEjK8kYDyGgPFVBIyvJmB8DQHjawkYjyVgPI6A8XUEjK8nYHwDAeMbCRgbBIwbCRiPJ2B8EwHjmwkY30LA+FYCxrcRML6dgPEdBIzvJGB8FwHjCQSM7yZgfA8B43sJGE8kYHwfAeP7CRg/QMD4QQLGDxEwfpiA8SQCxo8QMH6UgPFkAsaPETB+nIDxFALGTxAwfpKA8VQCxk0EjKcRMH6KgPHTBIyfIWD8LAHj5wgYTydg/DwB4xcIGL9IwPglAsYvEzB+hYDxDALGMwkYv0rAeBYB49kEjF8jYPw6AeM3CBi/ScD4LQLGbxMwfoeA8bsEjN8jYPw+AeMPCBh/SMB4DgHjuQSM5xEw/oiA8ccEjOcTMP6EgPGnBIwXEDD+jIDx5wSMvyBg/CUB468IGH9NwPgbAsYLCRh/S8D4OwLG3xMw/oGA8Y8EjBcRMP6JgPHPBIx/IWD8KwHjxQSMfyNg/DsB4z8IGP9JwHgJAeO/CBj/TcD4HwLG/xIw/o+A8f8EjJcSMF5GwHg5AeMVBIxXEjBeRcB4NQHjNQSM1xIwXkfAeD0B4w0EjDcSMN5EwHgzAeMtBIy3EjDeRsB4OwHjHQSMdxIw3kXAeDcB4z0EjPcmyOjZWkBdpnVfj0hWJCeSF+kV6RPpFymIFEVKIgMigyILRMoiFZGFIotEFotsIbKlyFYiW4ssEdlGZFuRpSLbiWwvsoPIjiLLRHYSWS6yQmRnkV1EdhXZTWR3kZUie4jsKbKXyN4i+4jsi8IRqYoMiQyL1ERGRFaJjIqMiYyL7CeCRe6xiDwWacci6H6R8QNE1ohgkWcsooxFirEIMBbZxSK2WCQWi7BikVMsIopFOrEIJhaZPFQEiyRiEUIs8odF9LBIHRaBwyJrWMQMi4RhES4scoVFpLBIExZBwiJDR4rURTaIYJEXLKKCRUqwCAgW2cAiFlgkAoswYJEDLCIAJ/1wgg8n80eLwEk6nJDDyTecaMNJNZxAw8kynBjDSTCc8MLJLZzIwkkrnKDCyWhDZKPI8SJw8ggninBSCCeAcLIHJ3ZwEgcnbHByBidicNIFJ1hwMnWiCJwkwQkRnPzAiQ6c1MAJDJyswIkJnITACQecXMCJBJw0wAkCnAycKrJJ5DQRTPLGJGpMUsYkYEyyxSRWTBLFJExMcsQkQkzSwyQ4TDI7UwSTpDAJCZN8MIkGk1QwCQSTLDCJAZME8BE+PnLHR+T4SBsfQeMj43NEzhU5TwQfeeIjSnykiI8A8ZEdPmLDR2L4CAsfOeEjInykg49g8JHJhSL4SAIfIeAlP16i4yU1XgLjJSteYuIlIV7C4SUXXiLhJQ1eguAlwyUiMJLDCA0jL4yoMFLCCAgjG4xYMBLBCAMjB4wIeEjHQzAeMvEQh4ckPIRgkI9BNAapGARikIVBDAYJ6ITRyaETQSONRhCNjA+d2gUXn4tQiLc96jjajNXx72jzQrVg0k1S/1i1Nl5wrSFh/uGCa7alieuvRlFB6UyBP+qL9axvNPXbvPh6kHEpXaeoNpZqPqUcB03enMqLTzuXTtrVjEnPmXw6k37RpVinovt5dHqex5aP/3/Qx2k0eTLmWK7Rng9/LN9ozQcCxhhLVDxbt3pUvBXq/5VG9/qN7Uxp3pPSpoylfE9WF7vO96HPY1/DzQZ/LKv2+TL35dSv45tjBXUs12hNpxj/zql0tC7PkTfxl8e/y/G2V53jz68E0u816bdwB/bpMrK6soF9Pj7Gukvj/zHG9f3EgY2mvqTbcYS1aeiPmvoPUvqdS76fXpcO/6z+g1PRPxThGqP9OMbXCdd+X2WSy89sf6PbWNs+5V3yeR2K5t/fzN6zLsX+T/U3ecNjy6fHlE9vOuUTZYx+zdMbKB9/LfsCx7yu/vh3XunS8XtVHnV8/b8/X+8bj7eVgE5bd/tce370Pt32DZu8ZVW8TIetc+31SOutBLj89U1zjIVrGhrfrW0087u/SldfP3299Lm+H8ib+Ie4ps418f9l54JjY53vlMYKtVA748OgC9dV51qvnw9Z89uO145Tem08m6bul+19FBrnlVz3ehyqb/be0/H7Amn466TvcX9uwbXflwlep3Gfd/s8qsulqNLWjDaErpPnxvYEpdfGs2nqctLp2zYrdI/4vtrWM4S18THoOMzoDbWV+YBe2xYe4Zo6Dzc6Q32LZl1nWEP1U7cTZReuDzrNQiDNUP/h4xdVOqH4Xl/exJ+Mt2A5yegsBRhCbb6PPxCIXwowl117nRjokLa+jtqekzP58fGPUvk5Of4/9Iyp702EnDqW5HgJ6ZyiOGy55hut+e5Whgi2zAcD8XVZ+vxVTHxd/qG+tWTSCbWD+r6w94Cun/5cfb+mWe6jY82XFP6a+3pkQ04d1/GPjX/rOuq3uc3gnB6tV6eH69P1kfrkZG2ivsjoR9D9ln6umI+dKZ2xwNC8x/1ZVW62LUxj3J81PBkXLsu0x4jz7Sv8/wtdc7weGtNqXctMHh4u4z1rH3Em7zrY8d7ZSq+NZ9PU9cunP59nboTV8TbazPCQ2XgfwL33cLXxpmmTwN2He8n3YbqMtL0tdF/p+jLX80PS/UBtpD46UR+tVsdr1aladWSufiDp9CdGVm2YEIhoqjpTiHOlH7K16vEUgrfXanuuju/15U38TT6uu/+dLYK17+v0EO+sLvEyHbYzOgL7co3WfSE7r7Z/+/g+7WKjndEfK6ljeqyHMBD/1uWldXmOvIl/RvzbXxNts/bnVwLp95v0W7gD+2z7XgrELwXi4/qc7vXFW533pNuimTSNfr3Psvm602l8lYS9yvYJLsE8d7OFdbMNP9g85JPPQ1Rxndtln4feBPJQMbp0Oun2S9G019+Xiv7qlLUrJXZ91LcBhXTKZmoum+r5Kl39rBqyqepraO0bF7mmzgvi/8uB8339SLdOVGefE0LP06FxrmfVdai/y3naPlN2ncc79ndPFwbn2sdWofElQuh+yxgefV5uDp7QNbbpuwD7fMd1IVuUZS8ZvfZ6dLKD6bqqbTjWBunjXxxvte3K6wzZeULtnd+/IBBf2348T9kw6HNDNjxtnwqda+vXoOLrpsuWkb0mXk+ofnU6ryfA12/0ZAPnlQOsup8K5dm2lZ3sdNo+q+NY+6yPf0W8BfetHXTqeqbL1NYzH/9qpdPWs1C96VbPyoH4C1Qcz1N27XWwbM7TZRqyC9i6pOMXTVz7uxTQExqD2PcUxUD+5mv71zZ5358l/Rw3NDa2anxoQ1QbnZyYnqwNz/Ucdx8elUTk7dEAAA==", + "debug_symbols": "tdndbuIwEAXgd8k1F57xjH/6KqtVRVtaISGoKF1pVfXdN0EkW8VD0BmJG0QgnxznTLCNv7qXzdPn2+N2/3r46B5+fXW7w/P6tD3s+6Ov71X3dNzudtu3x58fd2F4ET6f//G+3g+HH6f18dQ91KKrbrN/Gd6l3r9ud5vuQcP371UnERYCC4VFgkWGRYFFRYUGWBAs4MwVzlzhzBXOXOHMFc5c4cwVzjyZd5eCjIRCjnNj9p04pNGw8tyYvafIMpqYaG6Kw1Tc5OAw5DDsMNFh7HyIpkxJZG6ywxSHqTeNzmu0BIchh2GHiQ4jDqMOc+U55Tw9p7HMzZV8Sp3aqfN6q4z/HlR1tHO7P9qY7DDFYSpuKNiFzTqFyqVF5EHsQdGDxIPUgxzDUD+aeVDxoOpAFDyIPIg9KHqQOBCbKMdyMTmHhihOEk4yTgpOKkxiwAnhxCybXEdSmhGFYsSJ4ERxknCScVJgImYuqQa6mFQpT4h635xcWMYZYuHEP08+t8B3byHevQW5ewt69xbS3VvId2+h3LsFewHAEi6GpZkc2PP/ZcI4iTgxq7bv9EhyMxbac/9lknCScWImz3UkMbSkwqQGnJh9iTxWZOT5fxpsz8WVxihVckPMGtM6lnIK2hDGScSJ3CAkDVGcJJvEidSGmLloyQuk4KTCxJ53pzjWWJLQEHuQ5rRABC5LMnMRGlsRbsqSEk4yTgpOzFwklInMZ0LMASeEE75BYtMXjjgRm4xlKcINsdOfRlaLJJzY6esUZWrK0l7SLJMKE3tJo9MjprHpi72kWSaMk4gTwYniJOHE/k2mMpE2l4KTChMJN0hbyfbCSSlfH8TtldDiuG8vbZaJYOS7P/qzPm7XT7vNZR/19XP//GNb9fT3fTPbYX0/Hp43L5/HzbDX+n+bdbiNpHlFufSXMlx7v3kQZZgnnb/q707/P+VwSOfv8oql9lfQX8U/", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index bec488a18d1..a5af0ab5914 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -16,14 +16,14 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+2ZS4/aMBDH7SU8El5Z2LZ8gb0HAoTeOCyH9lukS5F6qaqqUi+ttB+9jepJzHS2HPiPNtCMhPKw+c3D9sSZWFNJ5I6BO96Y52Xrjsl5MldkJyXwShxKr82h5bU5tG4cqrlD2ZFD9vId2hw5ZC7foWYN1d2hKm1bz6lTQk6/d8eQ3S9YLWAAQo+L5m+S5Tpk/oHtT0OPqcBfhGz8wPyk6zgPT8d8w/S2WD/+n0KG7tyav/tQm7+odq6t9/s3MtX52J2HjKcxN3yb0LGdCvaTrr7z9YH56sfewmzJPkjzCMdflPO0rcJfl/Z3dPhvid/V4X8kfk+HvyR+qMJPc+JHOvaXa7Gvw18Rf6DDfyT+UIWf7Sl/Up4kHcZUuWPs3cflsfncMn3GHOcpw/RHzFb0nsEyfWQPjw/lWopdLNgaC208B8eCnljQI7ECIKsNZHWArC6Q1QOykLEPa2pXBGQh50QfyBoAWXWdX/TckPaBhWzdMTlTLLPdt1XKnUXsKe98+frp8zfDxAdZz2C6vmFtgRcEv1/rGZ45wbcCq5BiAtKiDZ6O9Wzd/eQMyTZ/gllIy/HbpvLDl8Br9/u/c9f+IqZjcIadhyyfH9L8kK/y/X75mE8YvxD/ReSnO29e9v8pzcu+qcaO+uy8PjvGPacgQBu04pzW9/9QEPjOfG0KApI0BYET/AsvCGQr3YJAlioXBDLdgkBV0BjpxGcpFRWA/DI/xCr8RVmQudWxvxzfic74bog/VeGn5fy/0+GX4/tKJ/5lQey1qYSeq6T7jXcf9xxfrC3TZ4xcECP9EbMVva+2TB/Zw+PDC2IzwdZYaON7kJmgZybokVgBkNUGsjpAVhfI6gFZyNiHNbUrArKQ49gHspBzdQBkIeM1BLKQa6iueWIEZCFjj5xfSLvGQBYyf8U1tesWyEKuIeTaRq6hCZBV1+f2FMi6A7LoneMlP6ZI+261jyn3rN+pjynWM9QKOu+F/13CB5Uf7vqlP6j8AnIYlTqwMQAA", - "debug_symbols": "7dnLiuJAFMbxd8k6izqn7v0qw9B4STcBUfEyMIjvPkljOUNPiPxj06vsLK0vHvyV4aTqUq2b5fn9td2+7Y7Vy49LtdmtFqd2t+1Gl8p8vHXcL7b96HhaHE7Vi4ipq2a77l65cK2rt3bTVC/eXOv/pgYXb1NDcONTU5bb1Kz2PlX1+rOuZLAMr6WMHMevnZ0t1w5mehk6VIZKCajL49cWDb6UrEmnF2IHC/HhFrDy4PeQEMtcCfkJGPdsIdHlUkgMcXohfqgQZ8vqczmNX1vVliWi6mV6IeHpQny8FxL99ELiUCFeywL07sH603RfI5o1fNOCSt9a9Vetvvxs1TmXW6o1D/8zX3MX6QbLQ7vZtO+vn2/5l0oGl/HoLTriRMKJTBNqcEJwQnHC4oTDCY8T2FyxuWJzxeYWm1tsbrG5xeYWm1tsbrG5xeYWm1ts7rC5w+YOmzts7rC5w+YOmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsHrB5wOYBmwdsHgbN4/1pOSbzOeFxIrDE9eM5+zJ3cnMnN3dycyc3d3JzJzd3cnMnN3dyEzq50QQ2D9g8YPOAzQM2j9g8YvOIzSM2j9g8YvOIzSM2j9g8YvOEzRM2T9g8YfOEzRM2T9g8YfOEzRM2z9g8Y/OMzTM2z9g8Y/OMzTM2z9g8Y3MxhkeER5RHLI84HvE8wg/ZDN+bMXxzxnB94frC9YXrC9cXri94d04k8EiEO3rd6Nfi0C6Wm6Y/2+0/PG9X5ai3G55+78sn5TB4f9itmvX50PTHwv+cCPfAIdXR/t0o7N8SybWo676r+74/", + "debug_symbols": "7dnbiuJAEMbxd8m1F6nuqj74KssyeMgMAVHxsLCI777JkLjLbIj8dfAqd0b7i0X/2lB2X4p1tTx/vNXb992xmP+4FJvdanGqd9vm6lKUn28d94tte3U8LQ6nYi4SZkW1XTevzF1nxXu9qYq5ldfZf0OD5W5oiGF8aMrSDc3O34Y6d/05K2SwDEtdwJX+zr3FuqHJu8fLcENlOIl9GWbj9xbx/XSI2BPz4QcLCa4LeHdnPkSD9oVoemJG9NlCzMfbWro3fWOF2FAhqr4LWKnj93als9tqUv94IeHpQjTfCgnx8ULiUCHm+4BpulNIutG4lOKLFlR6adXftfrys1Vn638yLif/kqdIc7E81JtN/fH29ZF/KWRwGY8+oiNOJJzINOFKnBCccDjhcUJxwnACmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsrthcsblic8Xmis0Vmys2V2yu2FyxuWFzw+aGzQ2bGzY3bG7Y3LC5YXPD5gGbB2wesHnA5mHQPGrfjsZUfk0YTgSWuH7+z75MndzUyU2d3NTJTZ3c1MlNndzUyU2d3AOd3GgCmwdsHrB5wOYBm0dsHrF5xOYRm0dsHrF5xOYRm0dsHrF5wuYJmydsnrB5wuYJmydsnrB5wuYJm2dsnrF5xuYZm2dsnrF5xuYZm2dsnrG5lCWPCI84HvE8ojxiPMIP2Uq+N1PyzZmS6wvXF64vXF+4vnB9wbtzIoFHItzRa65+LQ71Yrmp2rPd9sPzdtUf9TaXp9/7/pP+MHh/2K2q9flQtcfC/5wIt8AhzaL/u1HYviWSZ+K0+a7m+/4A", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(refcount_1, 1, \"borrow_mut_two should create a fresh array with an RC of 1\");\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(\n refcount_1,\n 2,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_0.snap index bec488a18d1..a5af0ab5914 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_0.snap @@ -16,14 +16,14 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+2ZS4/aMBDH7SU8El5Z2LZ8gb0HAoTeOCyH9lukS5F6qaqqUi+ttB+9jepJzHS2HPiPNtCMhPKw+c3D9sSZWFNJ5I6BO96Y52Xrjsl5MldkJyXwShxKr82h5bU5tG4cqrlD2ZFD9vId2hw5ZC7foWYN1d2hKm1bz6lTQk6/d8eQ3S9YLWAAQo+L5m+S5Tpk/oHtT0OPqcBfhGz8wPyk6zgPT8d8w/S2WD/+n0KG7tyav/tQm7+odq6t9/s3MtX52J2HjKcxN3yb0LGdCvaTrr7z9YH56sfewmzJPkjzCMdflPO0rcJfl/Z3dPhvid/V4X8kfk+HvyR+qMJPc+JHOvaXa7Gvw18Rf6DDfyT+UIWf7Sl/Up4kHcZUuWPs3cflsfncMn3GHOcpw/RHzFb0nsEyfWQPjw/lWopdLNgaC208B8eCnljQI7ECIKsNZHWArC6Q1QOykLEPa2pXBGQh50QfyBoAWXWdX/TckPaBhWzdMTlTLLPdt1XKnUXsKe98+frp8zfDxAdZz2C6vmFtgRcEv1/rGZ45wbcCq5BiAtKiDZ6O9Wzd/eQMyTZ/gllIy/HbpvLDl8Br9/u/c9f+IqZjcIadhyyfH9L8kK/y/X75mE8YvxD/ReSnO29e9v8pzcu+qcaO+uy8PjvGPacgQBu04pzW9/9QEPjOfG0KApI0BYET/AsvCGQr3YJAlioXBDLdgkBV0BjpxGcpFRWA/DI/xCr8RVmQudWxvxzfic74bog/VeGn5fy/0+GX4/tKJ/5lQey1qYSeq6T7jXcf9xxfrC3TZ4xcECP9EbMVva+2TB/Zw+PDC2IzwdZYaON7kJmgZybokVgBkNUGsjpAVhfI6gFZyNiHNbUrArKQ49gHspBzdQBkIeM1BLKQa6iueWIEZCFjj5xfSLvGQBYyf8U1tesWyEKuIeTaRq6hCZBV1+f2FMi6A7LoneMlP6ZI+261jyn3rN+pjynWM9QKOu+F/13CB5Uf7vqlP6j8AnIYlTqwMQAA", - "debug_symbols": "7dnLiuJAFMbxd8k6izqn7v0qw9B4STcBUfEyMIjvPkljOUNPiPxj06vsLK0vHvyV4aTqUq2b5fn9td2+7Y7Vy49LtdmtFqd2t+1Gl8p8vHXcL7b96HhaHE7Vi4ipq2a77l65cK2rt3bTVC/eXOv/pgYXb1NDcONTU5bb1Kz2PlX1+rOuZLAMr6WMHMevnZ0t1w5mehk6VIZKCajL49cWDb6UrEmnF2IHC/HhFrDy4PeQEMtcCfkJGPdsIdHlUkgMcXohfqgQZ8vqczmNX1vVliWi6mV6IeHpQny8FxL99ELiUCFeywL07sH603RfI5o1fNOCSt9a9Vetvvxs1TmXW6o1D/8zX3MX6QbLQ7vZtO+vn2/5l0oGl/HoLTriRMKJTBNqcEJwQnHC4oTDCY8T2FyxuWJzxeYWm1tsbrG5xeYWm1tsbrG5xeYWm1ts7rC5w+YOmzts7rC5w+YOmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsHrB5wOYBmwdsHgbN4/1pOSbzOeFxIrDE9eM5+zJ3cnMnN3dycyc3d3JzJzd3cnMnN3dyEzq50QQ2D9g8YPOAzQM2j9g8YvOIzSM2j9g8YvOIzSM2j9g8YvOEzRM2T9g8YfOEzRM2T9g8YfOEzRM2z9g8Y/OMzTM2z9g8Y/OMzTM2z9g8Y3MxhkeER5RHLI84HvE8wg/ZDN+bMXxzxnB94frC9YXrC9cXri94d04k8EiEO3rd6Nfi0C6Wm6Y/2+0/PG9X5ai3G55+78sn5TB4f9itmvX50PTHwv+cCPfAIdXR/t0o7N8SybWo676r+74/", + "debug_symbols": "7dnbiuJAEMbxd8m1F6nuqj74KssyeMgMAVHxsLCI777JkLjLbIj8dfAqd0b7i0X/2lB2X4p1tTx/vNXb992xmP+4FJvdanGqd9vm6lKUn28d94tte3U8LQ6nYi4SZkW1XTevzF1nxXu9qYq5ldfZf0OD5W5oiGF8aMrSDc3O34Y6d/05K2SwDEtdwJX+zr3FuqHJu8fLcENlOIl9GWbj9xbx/XSI2BPz4QcLCa4LeHdnPkSD9oVoemJG9NlCzMfbWro3fWOF2FAhqr4LWKnj93als9tqUv94IeHpQjTfCgnx8ULiUCHm+4BpulNIutG4lOKLFlR6adXftfrys1Vn638yLif/kqdIc7E81JtN/fH29ZF/KWRwGY8+oiNOJJzINOFKnBCccDjhcUJxwnACmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsrthcsblic8Xmis0Vmys2V2yu2FyxuWFzw+aGzQ2bGzY3bG7Y3LC5YXPD5gGbB2wesHnA5mHQPGrfjsZUfk0YTgSWuH7+z75MndzUyU2d3NTJTZ3c1MlNndzUyU2d3AOd3GgCmwdsHrB5wOYBm0dsHrF5xOYRm0dsHrF5xOYRm0dsHrF5wuYJmydsnrB5wuYJmydsnrB5wuYJm2dsnrF5xuYZm2dsnrF5xuYZm2dsnrG5lCWPCI84HvE8ojxiPMIP2Uq+N1PyzZmS6wvXF64vXF+4vnB9wbtzIoFHItzRa65+LQ71Yrmp2rPd9sPzdtUf9TaXp9/7/pP+MHh/2K2q9flQtcfC/5wIt8AhzaL/u1HYviWSZ+K0+a7m+/4A", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(refcount_1, 1, \"borrow_mut_two should create a fresh array with an RC of 1\");\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(\n refcount_1,\n 2,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index bec488a18d1..a5af0ab5914 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -16,14 +16,14 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+2ZS4/aMBDH7SU8El5Z2LZ8gb0HAoTeOCyH9lukS5F6qaqqUi+ttB+9jepJzHS2HPiPNtCMhPKw+c3D9sSZWFNJ5I6BO96Y52Xrjsl5MldkJyXwShxKr82h5bU5tG4cqrlD2ZFD9vId2hw5ZC7foWYN1d2hKm1bz6lTQk6/d8eQ3S9YLWAAQo+L5m+S5Tpk/oHtT0OPqcBfhGz8wPyk6zgPT8d8w/S2WD/+n0KG7tyav/tQm7+odq6t9/s3MtX52J2HjKcxN3yb0LGdCvaTrr7z9YH56sfewmzJPkjzCMdflPO0rcJfl/Z3dPhvid/V4X8kfk+HvyR+qMJPc+JHOvaXa7Gvw18Rf6DDfyT+UIWf7Sl/Up4kHcZUuWPs3cflsfncMn3GHOcpw/RHzFb0nsEyfWQPjw/lWopdLNgaC208B8eCnljQI7ECIKsNZHWArC6Q1QOykLEPa2pXBGQh50QfyBoAWXWdX/TckPaBhWzdMTlTLLPdt1XKnUXsKe98+frp8zfDxAdZz2C6vmFtgRcEv1/rGZ45wbcCq5BiAtKiDZ6O9Wzd/eQMyTZ/gllIy/HbpvLDl8Br9/u/c9f+IqZjcIadhyyfH9L8kK/y/X75mE8YvxD/ReSnO29e9v8pzcu+qcaO+uy8PjvGPacgQBu04pzW9/9QEPjOfG0KApI0BYET/AsvCGQr3YJAlioXBDLdgkBV0BjpxGcpFRWA/DI/xCr8RVmQudWxvxzfic74bog/VeGn5fy/0+GX4/tKJ/5lQey1qYSeq6T7jXcf9xxfrC3TZ4xcECP9EbMVva+2TB/Zw+PDC2IzwdZYaON7kJmgZybokVgBkNUGsjpAVhfI6gFZyNiHNbUrArKQ49gHspBzdQBkIeM1BLKQa6iueWIEZCFjj5xfSLvGQBYyf8U1tesWyEKuIeTaRq6hCZBV1+f2FMi6A7LoneMlP6ZI+261jyn3rN+pjynWM9QKOu+F/13CB5Uf7vqlP6j8AnIYlTqwMQAA", - "debug_symbols": "7dnLiuJAFMbxd8k6izqn7v0qw9B4STcBUfEyMIjvPkljOUNPiPxj06vsLK0vHvyV4aTqUq2b5fn9td2+7Y7Vy49LtdmtFqd2t+1Gl8p8vHXcL7b96HhaHE7Vi4ipq2a77l65cK2rt3bTVC/eXOv/pgYXb1NDcONTU5bb1Kz2PlX1+rOuZLAMr6WMHMevnZ0t1w5mehk6VIZKCajL49cWDb6UrEmnF2IHC/HhFrDy4PeQEMtcCfkJGPdsIdHlUkgMcXohfqgQZ8vqczmNX1vVliWi6mV6IeHpQny8FxL99ELiUCFeywL07sH603RfI5o1fNOCSt9a9Vetvvxs1TmXW6o1D/8zX3MX6QbLQ7vZtO+vn2/5l0oGl/HoLTriRMKJTBNqcEJwQnHC4oTDCY8T2FyxuWJzxeYWm1tsbrG5xeYWm1tsbrG5xeYWm1ts7rC5w+YOmzts7rC5w+YOmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsHrB5wOYBmwdsHgbN4/1pOSbzOeFxIrDE9eM5+zJ3cnMnN3dycyc3d3JzJzd3cnMnN3dyEzq50QQ2D9g8YPOAzQM2j9g8YvOIzSM2j9g8YvOIzSM2j9g8YvOEzRM2T9g8YfOEzRM2T9g8YfOEzRM2z9g8Y/OMzTM2z9g8Y/OMzTM2z9g8Y3MxhkeER5RHLI84HvE8wg/ZDN+bMXxzxnB94frC9YXrC9cXri94d04k8EiEO3rd6Nfi0C6Wm6Y/2+0/PG9X5ai3G55+78sn5TB4f9itmvX50PTHwv+cCPfAIdXR/t0o7N8SybWo676r+74/", + "debug_symbols": "7dnbiuJAEMbxd8m1F6nuqj74KssyeMgMAVHxsLCI777JkLjLbIj8dfAqd0b7i0X/2lB2X4p1tTx/vNXb992xmP+4FJvdanGqd9vm6lKUn28d94tte3U8LQ6nYi4SZkW1XTevzF1nxXu9qYq5ldfZf0OD5W5oiGF8aMrSDc3O34Y6d/05K2SwDEtdwJX+zr3FuqHJu8fLcENlOIl9GWbj9xbx/XSI2BPz4QcLCa4LeHdnPkSD9oVoemJG9NlCzMfbWro3fWOF2FAhqr4LWKnj93als9tqUv94IeHpQjTfCgnx8ULiUCHm+4BpulNIutG4lOKLFlR6adXftfrys1Vn638yLif/kqdIc7E81JtN/fH29ZF/KWRwGY8+oiNOJJzINOFKnBCccDjhcUJxwnACmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsrthcsblic8Xmis0Vmys2V2yu2FyxuWFzw+aGzQ2bGzY3bG7Y3LC5YXPD5gGbB2wesHnA5mHQPGrfjsZUfk0YTgSWuH7+z75MndzUyU2d3NTJTZ3c1MlNndzUyU2d3AOd3GgCmwdsHrB5wOYBm0dsHrF5xOYRm0dsHrF5xOYRm0dsHrF5wuYJmydsnrB5wuYJmydsnrB5wuYJm2dsnrF5xuYZm2dsnrF5xuYZm2dsnrG5lCWPCI84HvE8ojxiPMIP2Uq+N1PyzZmS6wvXF64vXF+4vnB9wbtzIoFHItzRa65+LQ71Yrmp2rPd9sPzdtUf9TaXp9/7/pP+MHh/2K2q9flQtcfC/5wIt8AhzaL/u1HYviWSZ+K0+a7m+/4A", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(refcount_1, 1, \"borrow_mut_two should create a fresh array with an RC of 1\");\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(\n refcount_1,\n 2,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_true_inliner_0.snap index 606506ad5d0..f955aaf57f8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_0/execute__tests__force_brillig_true_inliner_0.snap @@ -9,6 +9,10 @@ expression: artifact "parameters": [], "return_type": null, "error_types": { + "2364549065372372629": { + "error_kind": "string", + "string": "after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut" + }, "4717959987348973079": { "error_kind": "string", "string": "the original should not be mutated by copy_mut, only borrow_mut_two" @@ -17,9 +21,9 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "6055981641117986912": { + "8222435832483736686": { "error_kind": "string", - "string": "borrow_mut_two should create a fresh array with an RC of 1" + "string": "There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)" }, "12049594436772143978": { "error_kind": "string", @@ -39,15 +43,15 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "3Z3dbhTJEoTfxddcVGbWX+6rrI4QsOzKkgWInyMdId79jC16zE7XzCjDFITrBu2s+0tnk9HRQfXPfL356+3rL/+8vH339/tPN3/8+fXm7v2bV59v3787fPr67cXN64+3d3e3/7z88X/fpPs/SnrY/tOHV+/uP376/Orj55s/Wnpx8/bdX4f/kAP99+3d25s/Svr2nxc3RYLba3B7C26fg9uX4PY1uH0Lbt+D23ts+xqcbw3OtwbnW8fz7d+3l2SnQI4CJQrUKNCiQI8CHgTacMyieSNyOSWGgxZJR6L+SLzYbVqTfd+05tMpN51Z3GYWzzOLl5nF68zibWbx/tTiuW3Fa768aXf5vqnr40Gk+tCHc/TRE0kfQtKHkvRhJH1kkj7GdtbK1ofXkyO9jz2q6JFoV9ppdWtH/LR4m1m8zyzuE4t7mllcZhbXmcXticVdN527ncYxzzOLl5nF68zibWbxPrO4TywuKU2tLlOr69TqNrV6nlq9TK3+5AM1b4nca8JDgKTG0khnacRJGpHE0oiwNKIsjQyNTXUL5pr76REvQ7dSkSPiO6TEkRpHWhzpccTDiKY4InFE44jFkfj0NT59jU9f49PX+PQ1Pn0bT9+3k6pJ3SHj6Zd6RNoO0ThicSTHkRJHahxpcaTHkeH0rWzTt6KnSE5xROKIxhGLIzmOlDhS40iLIz2OxKdf4tMfX9m06hviaYcMp5/TpuRsskOG08+2nfez98upQpNvCUQPh9Kufp5cv0yuXyfXb5Pr98n1fW798fXiSP2DWx3rd7+ysZVt0Vptd61YxhejpzVT0jFNFNn/zegvbabqcUy1oYv0wX+UVFt/F/P6u1jW38W6/i629Xexr7+LvvwutrT+Lsr6u7h+umnrp5u2frpp66ebtn66aeunm7Z+umnrp5u+frrp66ebvn666eunm75+uunrp5u+frrp66ebvn666eunG18/3fj66cbXTze+frrx9dONr59ufP104+unG18/3fjy6UbT8ulG0/LpRtPy6UbT8ulGU15/F5dPN5qWTzealk83mpZPN5rWTzeyfrqR9dONrJ9uZP10I+unG1k/3cj66UbWTzeyfrqR9dONrp9udP10o+unG10/3ej66UbXTze6frrR9dONrp9udP10Y+unG1s/3dj66cbWTze2frqx9dONrZ9ubP10Y+unG1s/3eT1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", + "bytecode": "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", + "debug_symbols": "3Z3vbhTHEsXfxZ/9oetvd+dVoisEhESWLIiAXOkqyrvfxWHWiad3R3VMQ7m/IIznV9S4Tp89O9M7/vPml3dv/vjt1d37Xz98uvnp5z9v7j+8ff357sP701d//nV78+bj3f393W+v/vnPN+XLH1Yejv/0++v3X7789Pn1x883P9Vye/Pu/S+nv9CJ/vXu/t3NT1b++s/tjVHweA4eL8HjNXi8BY/34PE1eHwLHt9jx3twvh6crwfn68H5enC+HpyvB+frwfl6cL4enG8NzreO59u+Hk+lPwU4CkgU0ChgUcCjQI0CLQr0INBKFIhOukUn3aKTbtFJt+ikW3TSbThpkm0BkT1dQW04aiI/E/xP4nZ3aCP7emgTflq8Tyzey8ziNLM4zywuM4vrzOI2s7g/s7iX/vVQN3lavM4s3mYW7xOLUylTq9PU6jy1ukyt/txl6nauXv1g0XX6emjnx0aY/27EsjTiWRqpWRppWRrpSRqhkqWRmLE9IBxHJI5oHLE44nGkxpEWR8ZKbdsouewQHmvK2hmR60I5jWkT1eln6bv6NLk+T64vk+vr5Po2ub5Prl8n12/PrF91W5C10656n1ldytTqNLU6T60uU6vr1Oo2tfpz12vtdXsPW2xXvU6t3qZW7zOra5lanaZW56nVZWp1nVrdplafulZ16lrVqWtVn7tWL16JC74TspKlEcrSCGdpRLI0olkasSyNxIztAalxpMWRHka8xBGKIxxHJI4MlcoiG2K6Q4aaYqpnZGfe4z0A15EaR1oc6WFkvB/gOkJxhOOIxBGNI/Hp1/j0a3z6NT79Gp9+i09/vE1AyuaWwrtLdOONAux8RnYLebxV4DqiccTiiMeRGkdaHOlhZHx/X2ybvljbIRRHOI5IHNE4YnHE40iNIy2O9CjCpcQRiiMcRySOaByxOOJxpMaRFkfi0x/fipO65WPpvkMojnAckTiiccTiiMeRGkdaHBlOX2lzfpX6FBnfNFPdcrKVf+Xk/bsjlaZbed294vP4ptk3rM+T68vk+jq5vk2u75Pr18n12zPrnxLaFnhPAWfnruPbZt+uvpTJ9WlyfZ5cXybX18n1bXJ9n1y/Tq4/ef3K5PWrk9evTl6/Onn96uT1q89ev130XL/R9YNP0XGLb6d8t8tvat+1mVMLWzMnn98145maqZmaaZma6d+1GfHzFcFTsHrajJXv2oy2/ng5v1w/+OJdnNgNHzZa/xR5/VOU9U9R1z9FW/8Uff1TrOufYlv/FPvyp+jrpxtfP934+unG1083vn668fXTja+fbnz9dOPrpxtfP93U9dNNXT/d1PXTTV0/3dT1001dP93U9dNNXT/d1PXTTV0/3bT1001bP9209dNNWz/dtPXTTVs/3bT1001bP9209dNNWz/d9PXTTV8/3fT1001fP9309dNNXz/d9PXTTV8/3fT1001fPt1IWT7dSFk+3UhZPt1IWT7dSNH1T3H5dCNl+XQjZfl0I2X5dCNl/XRD66cbWj/d0PrphtZPN7R+uqH10w2tn25o/XRD66cbWj/d8PrphtdPN7x+uuH1082znzX2Ak5x/XTD66cbXj/d8PrphtdPN7J+upH1042sn25k/XTz/Ccx5j/F9dONrJ9uJNET20RLpmYoUzOcqRnJ1IxmasYyNeOZmqmZmmmZmsnkwJbJgS2TA1smB7ZMDmyZHNgyObBlcmDL5MCWyYEtkwN7Jgf2TA7smRzYMzmwZ3Jgz+TAnsmBPZMDeyYH9kwOXDM5cM3kwDWTA9dMDlwzOXDN5MA1kwPXTA5cMzlwzeTALZMDt0wO3DI5cMvkwC2TA7dMDtwyOXDL5MAtkwO3TA7cMzlwz+TAPZMD90wO3DM5cM/kwD2TA/dMDtwzOXBP5MBaEjmwlkQOrCWRA2tJ5MBaEjmwlkQOrCWRA2tJ5MBaEjmwlkwOTJkcmDI5MGVyYMrkwJTJgSmTA1MmB6ZMDkyZHJgyOTBncmDO5MBrfAa26naOtZV/Hvpwikt8SuT6Ker6p7jEp0Sun+L3fTGxWs6n2GxnDC1TMz1RM9/545EHzUx8MXmo//zXh1bP9bvv6svk+jq5vk2u75Pr18n12+T6fW79b/BJsuv1n7t+ubBt/lBUwFeqh1Y4TyuSpxXN04rlacXztFLztNKe3YqeY2fx+s1i5/Wu+0vs+tkfMPsxXdOL7JpfZNfyIrvWF9m1vciuPWnXVy8TWH2RXWd9bbze9fC10WSrbtqeJvrx5+6uIxRHOI5IGBl/AMBtG4TX3Rua8Tb960iNI0M1Mfk5yVHbQeMN2Hw6dINYdhdAxhuljyBBIEUgQ6DhD5yFNymwmOyg8Y/8+u2F8Y7LI4gRSBBIEcgQyBGoIhA0px6HbLyz7AgiBGIEEgRSBDIEcgSqCNQQCFEEIYogRBGEKIIQRRCiCEIUQYgiCFEEIYogRBGMKIIRRTCiCEYUwYgiGFEEI4pgRBGMKIIRRQiiCEEUIYgiBFGEIIoQRBGCKEIQRQiiCEEUoYgiFFGEIopQRBGKKEIRRSiiCEUUoYgiFFGEIYowRBGGKMIQRRiiCEMUYYgiDFGEIYowRBGOKMIRRTiiCEcU4YgiHFGEI4pwRBGOKMIRRVREERVRREUUURFFVEQR44t0P+IhwDa++PdjWql5Wml5WulpWhk/m+PHtEJ5WuE8rUieVjRPK3nctuVx25bHbVset2153Lbncduex217Hrftedy253Hbnsdtex637Xnctudx257Gbb2kcVsvadzWSxq39ZLGbb2kcVsvadzWSxq39ZLGbb2kcVsvedyW8rgt5XFbyuO2lMdtKY/bUh63pTxuS3nclvK4LeVxW87jtpzHbTmP23Iet+U8bst53JbzuC3ncVvO47acx20lj9tKHreVPG4redxW8rit5HFbyeO2ksdtJY/bSh631Txuq3ncVvO4reZxW83jtprHbTWP22oet9U8bqt53NbyuK3lcVvL47aWx20tj9taHre1PG5redzW8rit5XFbz+O2nsdt/bu67bVnjbhLnlY0TyuWp5WoxT1AYzO6+lRXv/CBmOvQhQ/EHECEQEN5XF1n4w+pXEc8jtQ40uJIDyPjDztcRyiOcByROBKffotPv8Wn3+LTb/Hpt/j0e3z6PT79Hp9+j0+/x6ff49Pv8en3+PR7fPo9PP1aShyhOMJxROKIxhGLIx5HahxpcSQ+fYpPn+LTH2/2upZm6nhT1nVkOBcyOT/h2uxpWKjjDT1HUEOgDkDj7SxHECEQI5Ag0HCVUqmbgohoDxkCOQJVBGoI1AFofMv9CCIEGiuC+BHivoMEgRSBDIEcgSoCNQQaK4KknyH714MjY9cT6vgO4jesT5Pr8+T6Mrm+Tq5vk+v38Kvy+DbKdYTiSDxhWDxhjC/zX0csjngcqXFk7E/svklFiJ/60/iC8QE0vrR7BBECMQIJAikCGQI5AlUEQhThiCIqooiKKKIiiqiIIiqiiPF1R5Lzc8dJnHaQI1BFoIZAY0XI+ZnPJ+jpo7zr+ArkEUQIxAgkCKQIZAjkCDRWhPJZsCq79wTjK5JHUAeg8VXJI4gQiBFIEEgRyBDIEeiCItTOkOkOagjU41ArBYEIgRiBBIEUgQyBLiii8hna/X7FVioCXVCE6yPE+JuQVvrc+lQm16fJ9XlyfZlcXyfXt2D9B+jCxeXHNWf7NXfp4vJ1KHpxOXr6fW798CXraH2aXJ8n15fJ9XVu/Qs7QP1xn8npjvJTUV/Yq3kAKQIZAjkCVQRqCNQB6MKOugOIEAhRhCOKcEQRjijCEUU4oghHFOGIIiqiiIoooiKKqIgiLjyTuNL5V22d7vnsoLEi2tkiubW6gxyBKgI1BOoAdOEptwcQIRAjkCCQIhCiiIYooiGKaIgiGqKIjiiiI4q48HTLTlv24C67GH7hOZQHkCKQIZAjUEWghkA9DvULTws8gMaK6H7+xX+97SFGIEEgRaALijB+hGQHOQJVBGoI1AHowhPNDiBCIEYgQSBFIEQRhCiCEEUQoghCFMGIIsZv5KWcISl1Dw0VIVK2lStCvoMEgfQY6jvIEMgRaKgI0bK95opS3UENgfohxE9zeR9vUzuCCIHGv/69nDc/aPGdl4+3qR1BikCGQONf/U1tU4Qy7ZbGeJvaEdQQaKgIlbZdQVXl3TmN954dQYRAHIX+On3139cf716/uX/36cR8+eYf799+vvvw/uuXn//3+/adNx/v7u/vfnv1+8cPb9/98sfHd6/uP7z98r2b8vWPnxv322bl1MzDa6W63Wp9+PLL+XTV265++l9P//P/AQ==", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(refcount_1, 1, \"borrow_mut_two should create a fresh array with an RC of 1\");\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(\n refcount_1,\n 2,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 93c8d0ec902..d5f777e2618 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -16,14 +16,14 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+2ZS4/aMBDH7SU8El5Z2LZ8gb0HAoTeOCyH9lukS5F6qaqqUi+ttB+9jepJzHS2HPiPNtCMhPKw+c3D9sSZWFNJ5I6BO96Y52Xrjsl5MldkJyXwShxKr82h5bU5tG4cqrlD2ZFD9vId2hw5ZC7foWYN1d2hKm1bz6lTQk6/d8eQ3S9YLWAAQo+L5m+S5Tpk/oHtT0OPqcBfhGz8wPyk6zgPT8d8w/S2WD/+n0KG7tyav/tQm7+odq6t9/s3MtX52J2HjKcxN3yb0LGdCvaTrr7z9YH56sfewmzJPkjzCMdflPO0rcJfl/Z3dPhvid/V4X8kfk+HvyR+qMJPc+JHOvaXa7Gvw18Rf6DDfyT+UIWf7Sl/Up4kHcZUuWPs3cflsfncMn3GHOcpw/RHzFb0nsEyfWQPjw/lWopdLNgaC208B8eCnljQI7ECIKsNZHWArC6Q1QOykLEPa2pXBGQh50QfyBoAWXWdX/TckPaBhWzdMTlTLLPdt1XKnUXsKe98+frp8zfDxAdZz2C6vmFtgRcEv1/rGZ45wbcCq5BiAtKiDZ6O9Wzd/eQMyTZ/gllIy/HbpvLDl8Br9/u/c9f+IqZjcIadhyyfH9L8kK/y/X75mE8YvxD/ReSnO29e9v8pzcu+qcaO+uy8PjvGPacgQBu04pzW9/9QEPjOfG0KApI0BYET/AsvCGQr3YJAlioXBDLdgkBV0BjpxGcpFRWA/DI/xCr8RVmQudWxvxzfic74bog/VeGn5fy/0+GX4/tKJ/5lQey1qYSeq6T7jXcf9xxfrC3TZ4xcECP9EbMVva+2TB/Zw+PDC2IzwdZYaON7kJmgZybokVgBkNUGsjpAVhfI6gFZyNiHNbUrArKQ49gHspBzdQBkIeM1BLKQa6iueWIEZCFjj5xfSLvGQBYyf8U1tesWyEKuIeTaRq6hCZBV1+f2FMi6A7LoneMlP6ZI+261jyn3rN+pjynWM9QKOu+F/13CB5Uf7vqlP6j8AnIYlTqwMQAA", - "debug_symbols": "7dnLiuJAFMbxd8k6izqn7v0qw9B4STcBUfEyMIjvPkljOUNPiPxj06vsLK0vHvyV4aTqUq2b5fn9td2+7Y7Vy49LtdmtFqd2t+1Gl8p8vHXcL7b96HhaHE7Vi4ipq2a77l65cK2rt3bTVC/eXOv/pgYXb1NDcONTU5bb1Kz2PlX1+rOuZLAMr6WMHMevnZ0t1w5mehk6VIZKCajL49cWDb6UrEmnF2IHC/HhFrDy4PeQEMtcCfkJGPdsIdHlUkgMcXohfqgQZ8vqczmNX1vVliWi6mV6IeHpQny8FxL99ELiUCFeywL07sH603RfI5o1fNOCSt9a9Vetvvxs1TmXW6o1D/8zX3MX6QbLQ7vZtO+vn2/5l0oGl/HoLTriRMKJTBNqcEJwQnHC4oTDCY8T2FyxuWJzxeYWm1tsbrG5xeYWm1tsbrG5xeYWm1ts7rC5w+YOmzts7rC5w+YOmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsHrB5wOYBmwdsHgbN4/1pOSbzOeFxIrDE9eM5+zJ3cnMnN3dycyc3d3JzJzd3cnMnN3dyEzq50QQ2D9g8YPOAzQM2j9g8YvOIzSM2j9g8YvOIzSM2j9g8YvOEzRM2T9g8YfOEzRM2T9g8YfOEzRM2z9g8Y/OMzTM2z9g8Y/OMzTM2z9g8Y3MxhkeER5RHLI84HvE8wg/ZDN+bMXxzxnB94frC9YXrC9cXri94d04k8EiEO3rd6Nfi0C6Wm6Y/2+0/PG9X5ai3G55+78sn5TB4f9itmvX50PTHwv+cCPfAIdXR/t0o7N8SybWo676r+74/", + "debug_symbols": "7dnbiuJAEMbxd8m1F6nuqj74KssyeMgMAVHxsLCI777JkLjLbIj8dfAqd0b7i0X/2lB2X4p1tTx/vNXb992xmP+4FJvdanGqd9vm6lKUn28d94tte3U8LQ6nYi4SZkW1XTevzF1nxXu9qYq5ldfZf0OD5W5oiGF8aMrSDc3O34Y6d/05K2SwDEtdwJX+zr3FuqHJu8fLcENlOIl9GWbj9xbx/XSI2BPz4QcLCa4LeHdnPkSD9oVoemJG9NlCzMfbWro3fWOF2FAhqr4LWKnj93als9tqUv94IeHpQjTfCgnx8ULiUCHm+4BpulNIutG4lOKLFlR6adXftfrys1Vn638yLif/kqdIc7E81JtN/fH29ZF/KWRwGY8+oiNOJJzINOFKnBCccDjhcUJxwnACmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsrthcsblic8Xmis0Vmys2V2yu2FyxuWFzw+aGzQ2bGzY3bG7Y3LC5YXPD5gGbB2wesHnA5mHQPGrfjsZUfk0YTgSWuH7+z75MndzUyU2d3NTJTZ3c1MlNndzUyU2d3AOd3GgCmwdsHrB5wOYBm0dsHrF5xOYRm0dsHrF5xOYRm0dsHrF5wuYJmydsnrB5wuYJmydsnrB5wuYJm2dsnrF5xuYZm2dsnrF5xuYZm2dsnrG5lCWPCI84HvE8ojxiPMIP2Uq+N1PyzZmS6wvXF64vXF+4vnB9wbtzIoFHItzRa65+LQ71Yrmp2rPd9sPzdtUf9TaXp9/7/pP+MHh/2K2q9flQtcfC/5wIt8AhzaL/u1HYviWSZ+K0+a7m+/4A", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n\n // Difference from min & 0 inliner settings: we fail to remove an inc_rc here\n assert_eq(refcount_1, 2);\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n\n // `5` here is higher than in other inliner settings. This is likely due to references getting optimized out,\n // and mutations being optimized and removed so the original array ends up being aliased more.\n assert_eq(\n refcount_1,\n 5,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_0.snap index 93c8d0ec902..d5f777e2618 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_0.snap @@ -16,14 +16,14 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+2ZS4/aMBDH7SU8El5Z2LZ8gb0HAoTeOCyH9lukS5F6qaqqUi+ttB+9jepJzHS2HPiPNtCMhPKw+c3D9sSZWFNJ5I6BO96Y52Xrjsl5MldkJyXwShxKr82h5bU5tG4cqrlD2ZFD9vId2hw5ZC7foWYN1d2hKm1bz6lTQk6/d8eQ3S9YLWAAQo+L5m+S5Tpk/oHtT0OPqcBfhGz8wPyk6zgPT8d8w/S2WD/+n0KG7tyav/tQm7+odq6t9/s3MtX52J2HjKcxN3yb0LGdCvaTrr7z9YH56sfewmzJPkjzCMdflPO0rcJfl/Z3dPhvid/V4X8kfk+HvyR+qMJPc+JHOvaXa7Gvw18Rf6DDfyT+UIWf7Sl/Up4kHcZUuWPs3cflsfncMn3GHOcpw/RHzFb0nsEyfWQPjw/lWopdLNgaC208B8eCnljQI7ECIKsNZHWArC6Q1QOykLEPa2pXBGQh50QfyBoAWXWdX/TckPaBhWzdMTlTLLPdt1XKnUXsKe98+frp8zfDxAdZz2C6vmFtgRcEv1/rGZ45wbcCq5BiAtKiDZ6O9Wzd/eQMyTZ/gllIy/HbpvLDl8Br9/u/c9f+IqZjcIadhyyfH9L8kK/y/X75mE8YvxD/ReSnO29e9v8pzcu+qcaO+uy8PjvGPacgQBu04pzW9/9QEPjOfG0KApI0BYET/AsvCGQr3YJAlioXBDLdgkBV0BjpxGcpFRWA/DI/xCr8RVmQudWxvxzfic74bog/VeGn5fy/0+GX4/tKJ/5lQey1qYSeq6T7jXcf9xxfrC3TZ4xcECP9EbMVva+2TB/Zw+PDC2IzwdZYaON7kJmgZybokVgBkNUGsjpAVhfI6gFZyNiHNbUrArKQ49gHspBzdQBkIeM1BLKQa6iueWIEZCFjj5xfSLvGQBYyf8U1tesWyEKuIeTaRq6hCZBV1+f2FMi6A7LoneMlP6ZI+261jyn3rN+pjynWM9QKOu+F/13CB5Uf7vqlP6j8AnIYlTqwMQAA", - "debug_symbols": "7dnLiuJAFMbxd8k6izqn7v0qw9B4STcBUfEyMIjvPkljOUNPiPxj06vsLK0vHvyV4aTqUq2b5fn9td2+7Y7Vy49LtdmtFqd2t+1Gl8p8vHXcL7b96HhaHE7Vi4ipq2a77l65cK2rt3bTVC/eXOv/pgYXb1NDcONTU5bb1Kz2PlX1+rOuZLAMr6WMHMevnZ0t1w5mehk6VIZKCajL49cWDb6UrEmnF2IHC/HhFrDy4PeQEMtcCfkJGPdsIdHlUkgMcXohfqgQZ8vqczmNX1vVliWi6mV6IeHpQny8FxL99ELiUCFeywL07sH603RfI5o1fNOCSt9a9Vetvvxs1TmXW6o1D/8zX3MX6QbLQ7vZtO+vn2/5l0oGl/HoLTriRMKJTBNqcEJwQnHC4oTDCY8T2FyxuWJzxeYWm1tsbrG5xeYWm1tsbrG5xeYWm1ts7rC5w+YOmzts7rC5w+YOmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsHrB5wOYBmwdsHgbN4/1pOSbzOeFxIrDE9eM5+zJ3cnMnN3dycyc3d3JzJzd3cnMnN3dyEzq50QQ2D9g8YPOAzQM2j9g8YvOIzSM2j9g8YvOIzSM2j9g8YvOEzRM2T9g8YfOEzRM2T9g8YfOEzRM2z9g8Y/OMzTM2z9g8Y/OMzTM2z9g8Y3MxhkeER5RHLI84HvE8wg/ZDN+bMXxzxnB94frC9YXrC9cXri94d04k8EiEO3rd6Nfi0C6Wm6Y/2+0/PG9X5ai3G55+78sn5TB4f9itmvX50PTHwv+cCPfAIdXR/t0o7N8SybWo676r+74/", + "debug_symbols": "7dnbiuJAEMbxd8m1F6nuqj74KssyeMgMAVHxsLCI777JkLjLbIj8dfAqd0b7i0X/2lB2X4p1tTx/vNXb992xmP+4FJvdanGqd9vm6lKUn28d94tte3U8LQ6nYi4SZkW1XTevzF1nxXu9qYq5ldfZf0OD5W5oiGF8aMrSDc3O34Y6d/05K2SwDEtdwJX+zr3FuqHJu8fLcENlOIl9GWbj9xbx/XSI2BPz4QcLCa4LeHdnPkSD9oVoemJG9NlCzMfbWro3fWOF2FAhqr4LWKnj93als9tqUv94IeHpQjTfCgnx8ULiUCHm+4BpulNIutG4lOKLFlR6adXftfrys1Vn638yLif/kqdIc7E81JtN/fH29ZF/KWRwGY8+oiNOJJzINOFKnBCccDjhcUJxwnACmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsrthcsblic8Xmis0Vmys2V2yu2FyxuWFzw+aGzQ2bGzY3bG7Y3LC5YXPD5gGbB2wesHnA5mHQPGrfjsZUfk0YTgSWuH7+z75MndzUyU2d3NTJTZ3c1MlNndzUyU2d3AOd3GgCmwdsHrB5wOYBm0dsHrF5xOYRm0dsHrF5xOYRm0dsHrF5wuYJmydsnrB5wuYJmydsnrB5wuYJm2dsnrF5xuYZm2dsnrF5xuYZm2dsnrG5lCWPCI84HvE8ojxiPMIP2Uq+N1PyzZmS6wvXF64vXF+4vnB9wbtzIoFHItzRa65+LQ71Yrmp2rPd9sPzdtUf9TaXp9/7/pP+MHh/2K2q9flQtcfC/5wIt8AhzaL/u1HYviWSZ+K0+a7m+/4A", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n\n // Difference from min & 0 inliner settings: we fail to remove an inc_rc here\n assert_eq(refcount_1, 2);\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n\n // `5` here is higher than in other inliner settings. This is likely due to references getting optimized out,\n // and mutations being optimized and removed so the original array ends up being aliased more.\n assert_eq(\n refcount_1,\n 5,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 93c8d0ec902..d5f777e2618 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -16,14 +16,14 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+2ZS4/aMBDH7SU8El5Z2LZ8gb0HAoTeOCyH9lukS5F6qaqqUi+ttB+9jepJzHS2HPiPNtCMhPKw+c3D9sSZWFNJ5I6BO96Y52Xrjsl5MldkJyXwShxKr82h5bU5tG4cqrlD2ZFD9vId2hw5ZC7foWYN1d2hKm1bz6lTQk6/d8eQ3S9YLWAAQo+L5m+S5Tpk/oHtT0OPqcBfhGz8wPyk6zgPT8d8w/S2WD/+n0KG7tyav/tQm7+odq6t9/s3MtX52J2HjKcxN3yb0LGdCvaTrr7z9YH56sfewmzJPkjzCMdflPO0rcJfl/Z3dPhvid/V4X8kfk+HvyR+qMJPc+JHOvaXa7Gvw18Rf6DDfyT+UIWf7Sl/Up4kHcZUuWPs3cflsfncMn3GHOcpw/RHzFb0nsEyfWQPjw/lWopdLNgaC208B8eCnljQI7ECIKsNZHWArC6Q1QOykLEPa2pXBGQh50QfyBoAWXWdX/TckPaBhWzdMTlTLLPdt1XKnUXsKe98+frp8zfDxAdZz2C6vmFtgRcEv1/rGZ45wbcCq5BiAtKiDZ6O9Wzd/eQMyTZ/gllIy/HbpvLDl8Br9/u/c9f+IqZjcIadhyyfH9L8kK/y/X75mE8YvxD/ReSnO29e9v8pzcu+qcaO+uy8PjvGPacgQBu04pzW9/9QEPjOfG0KApI0BYET/AsvCGQr3YJAlioXBDLdgkBV0BjpxGcpFRWA/DI/xCr8RVmQudWxvxzfic74bog/VeGn5fy/0+GX4/tKJ/5lQey1qYSeq6T7jXcf9xxfrC3TZ4xcECP9EbMVva+2TB/Zw+PDC2IzwdZYaON7kJmgZybokVgBkNUGsjpAVhfI6gFZyNiHNbUrArKQ49gHspBzdQBkIeM1BLKQa6iueWIEZCFjj5xfSLvGQBYyf8U1tesWyEKuIeTaRq6hCZBV1+f2FMi6A7LoneMlP6ZI+261jyn3rN+pjynWM9QKOu+F/13CB5Uf7vqlP6j8AnIYlTqwMQAA", - "debug_symbols": "7dnLiuJAFMbxd8k6izqn7v0qw9B4STcBUfEyMIjvPkljOUNPiPxj06vsLK0vHvyV4aTqUq2b5fn9td2+7Y7Vy49LtdmtFqd2t+1Gl8p8vHXcL7b96HhaHE7Vi4ipq2a77l65cK2rt3bTVC/eXOv/pgYXb1NDcONTU5bb1Kz2PlX1+rOuZLAMr6WMHMevnZ0t1w5mehk6VIZKCajL49cWDb6UrEmnF2IHC/HhFrDy4PeQEMtcCfkJGPdsIdHlUkgMcXohfqgQZ8vqczmNX1vVliWi6mV6IeHpQny8FxL99ELiUCFeywL07sH603RfI5o1fNOCSt9a9Vetvvxs1TmXW6o1D/8zX3MX6QbLQ7vZtO+vn2/5l0oGl/HoLTriRMKJTBNqcEJwQnHC4oTDCY8T2FyxuWJzxeYWm1tsbrG5xeYWm1tsbrG5xeYWm1ts7rC5w+YOmzts7rC5w+YOmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsHrB5wOYBmwdsHgbN4/1pOSbzOeFxIrDE9eM5+zJ3cnMnN3dycyc3d3JzJzd3cnMnN3dyEzq50QQ2D9g8YPOAzQM2j9g8YvOIzSM2j9g8YvOIzSM2j9g8YvOEzRM2T9g8YfOEzRM2T9g8YfOEzRM2z9g8Y/OMzTM2z9g8Y/OMzTM2z9g8Y3MxhkeER5RHLI84HvE8wg/ZDN+bMXxzxnB94frC9YXrC9cXri94d04k8EiEO3rd6Nfi0C6Wm6Y/2+0/PG9X5ai3G55+78sn5TB4f9itmvX50PTHwv+cCPfAIdXR/t0o7N8SybWo676r+74/", + "debug_symbols": "7dnbiuJAEMbxd8m1F6nuqj74KssyeMgMAVHxsLCI777JkLjLbIj8dfAqd0b7i0X/2lB2X4p1tTx/vNXb992xmP+4FJvdanGqd9vm6lKUn28d94tte3U8LQ6nYi4SZkW1XTevzF1nxXu9qYq5ldfZf0OD5W5oiGF8aMrSDc3O34Y6d/05K2SwDEtdwJX+zr3FuqHJu8fLcENlOIl9GWbj9xbx/XSI2BPz4QcLCa4LeHdnPkSD9oVoemJG9NlCzMfbWro3fWOF2FAhqr4LWKnj93als9tqUv94IeHpQjTfCgnx8ULiUCHm+4BpulNIutG4lOKLFlR6adXftfrys1Vn638yLif/kqdIc7E81JtN/fH29ZF/KWRwGY8+oiNOJJzINOFKnBCccDjhcUJxwnACmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsrthcsblic8Xmis0Vmys2V2yu2FyxuWFzw+aGzQ2bGzY3bG7Y3LC5YXPD5gGbB2wesHnA5mHQPGrfjsZUfk0YTgSWuH7+z75MndzUyU2d3NTJTZ3c1MlNndzUyU2d3AOd3GgCmwdsHrB5wOYBm0dsHrF5xOYRm0dsHrF5xOYRm0dsHrF5wuYJmydsnrB5wuYJmydsnrB5wuYJm2dsnrF5xuYZm2dsnrF5xuYZm2dsnrG5lCWPCI84HvE8ojxiPMIP2Uq+N1PyzZmS6wvXF64vXF+4vnB9wbtzIoFHItzRa65+LQ71Yrmp2rPd9sPzdtUf9TaXp9/7/pP+MHh/2K2q9flQtcfC/5wIt8AhzaL/u1HYviWSZ+K0+a7m+/4A", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n\n // Difference from min & 0 inliner settings: we fail to remove an inc_rc here\n assert_eq(refcount_1, 2);\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n\n // `5` here is higher than in other inliner settings. This is likely due to references getting optimized out,\n // and mutations being optimized and removed so the original array ends up being aliased more.\n assert_eq(\n refcount_1,\n 5,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index ec597e69488..610179bd662 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_max/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -9,10 +9,18 @@ expression: artifact "parameters": [], "return_type": null, "error_types": { + "2364549065372372629": { + "error_kind": "string", + "string": "after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut" + }, "5019202896831570965": { "error_kind": "string", "string": "attempt to add with overflow" }, + "8222435832483736686": { + "error_kind": "string", + "string": "There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)" + }, "12049594436772143978": { "error_kind": "string", "string": "array ref-count underflow detected" @@ -27,15 +35,15 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n\n // Difference from min & 0 inliner settings: we fail to remove an inc_rc here\n assert_eq(refcount_1, 2);\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n\n // `5` here is higher than in other inliner settings. This is likely due to references getting optimized out,\n // and mutations being optimized and removed so the original array ends up being aliased more.\n assert_eq(\n refcount_1,\n 5,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index bec488a18d1..a5af0ab5914 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -16,14 +16,14 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+2ZS4/aMBDH7SU8El5Z2LZ8gb0HAoTeOCyH9lukS5F6qaqqUi+ttB+9jepJzHS2HPiPNtCMhPKw+c3D9sSZWFNJ5I6BO96Y52Xrjsl5MldkJyXwShxKr82h5bU5tG4cqrlD2ZFD9vId2hw5ZC7foWYN1d2hKm1bz6lTQk6/d8eQ3S9YLWAAQo+L5m+S5Tpk/oHtT0OPqcBfhGz8wPyk6zgPT8d8w/S2WD/+n0KG7tyav/tQm7+odq6t9/s3MtX52J2HjKcxN3yb0LGdCvaTrr7z9YH56sfewmzJPkjzCMdflPO0rcJfl/Z3dPhvid/V4X8kfk+HvyR+qMJPc+JHOvaXa7Gvw18Rf6DDfyT+UIWf7Sl/Up4kHcZUuWPs3cflsfncMn3GHOcpw/RHzFb0nsEyfWQPjw/lWopdLNgaC208B8eCnljQI7ECIKsNZHWArC6Q1QOykLEPa2pXBGQh50QfyBoAWXWdX/TckPaBhWzdMTlTLLPdt1XKnUXsKe98+frp8zfDxAdZz2C6vmFtgRcEv1/rGZ45wbcCq5BiAtKiDZ6O9Wzd/eQMyTZ/gllIy/HbpvLDl8Br9/u/c9f+IqZjcIadhyyfH9L8kK/y/X75mE8YvxD/ReSnO29e9v8pzcu+qcaO+uy8PjvGPacgQBu04pzW9/9QEPjOfG0KApI0BYET/AsvCGQr3YJAlioXBDLdgkBV0BjpxGcpFRWA/DI/xCr8RVmQudWxvxzfic74bog/VeGn5fy/0+GX4/tKJ/5lQey1qYSeq6T7jXcf9xxfrC3TZ4xcECP9EbMVva+2TB/Zw+PDC2IzwdZYaON7kJmgZybokVgBkNUGsjpAVhfI6gFZyNiHNbUrArKQ49gHspBzdQBkIeM1BLKQa6iueWIEZCFjj5xfSLvGQBYyf8U1tesWyEKuIeTaRq6hCZBV1+f2FMi6A7LoneMlP6ZI+261jyn3rN+pjynWM9QKOu+F/13CB5Uf7vqlP6j8AnIYlTqwMQAA", - "debug_symbols": "7dnLiuJAFMbxd8k6izqn7v0qw9B4STcBUfEyMIjvPkljOUNPiPxj06vsLK0vHvyV4aTqUq2b5fn9td2+7Y7Vy49LtdmtFqd2t+1Gl8p8vHXcL7b96HhaHE7Vi4ipq2a77l65cK2rt3bTVC/eXOv/pgYXb1NDcONTU5bb1Kz2PlX1+rOuZLAMr6WMHMevnZ0t1w5mehk6VIZKCajL49cWDb6UrEmnF2IHC/HhFrDy4PeQEMtcCfkJGPdsIdHlUkgMcXohfqgQZ8vqczmNX1vVliWi6mV6IeHpQny8FxL99ELiUCFeywL07sH603RfI5o1fNOCSt9a9Vetvvxs1TmXW6o1D/8zX3MX6QbLQ7vZtO+vn2/5l0oGl/HoLTriRMKJTBNqcEJwQnHC4oTDCY8T2FyxuWJzxeYWm1tsbrG5xeYWm1tsbrG5xeYWm1ts7rC5w+YOmzts7rC5w+YOmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsHrB5wOYBmwdsHgbN4/1pOSbzOeFxIrDE9eM5+zJ3cnMnN3dycyc3d3JzJzd3cnMnN3dyEzq50QQ2D9g8YPOAzQM2j9g8YvOIzSM2j9g8YvOIzSM2j9g8YvOEzRM2T9g8YfOEzRM2T9g8YfOEzRM2z9g8Y/OMzTM2z9g8Y/OMzTM2z9g8Y3MxhkeER5RHLI84HvE8wg/ZDN+bMXxzxnB94frC9YXrC9cXri94d04k8EiEO3rd6Nfi0C6Wm6Y/2+0/PG9X5ai3G55+78sn5TB4f9itmvX50PTHwv+cCPfAIdXR/t0o7N8SybWo676r+74/", + "debug_symbols": "7dnbiuJAEMbxd8m1F6nuqj74KssyeMgMAVHxsLCI777JkLjLbIj8dfAqd0b7i0X/2lB2X4p1tTx/vNXb992xmP+4FJvdanGqd9vm6lKUn28d94tte3U8LQ6nYi4SZkW1XTevzF1nxXu9qYq5ldfZf0OD5W5oiGF8aMrSDc3O34Y6d/05K2SwDEtdwJX+zr3FuqHJu8fLcENlOIl9GWbj9xbx/XSI2BPz4QcLCa4LeHdnPkSD9oVoemJG9NlCzMfbWro3fWOF2FAhqr4LWKnj93als9tqUv94IeHpQjTfCgnx8ULiUCHm+4BpulNIutG4lOKLFlR6adXftfrys1Vn638yLif/kqdIc7E81JtN/fH29ZF/KWRwGY8+oiNOJJzINOFKnBCccDjhcUJxwnACmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsrthcsblic8Xmis0Vmys2V2yu2FyxuWFzw+aGzQ2bGzY3bG7Y3LC5YXPD5gGbB2wesHnA5mHQPGrfjsZUfk0YTgSWuH7+z75MndzUyU2d3NTJTZ3c1MlNndzUyU2d3AOd3GgCmwdsHrB5wOYBm0dsHrF5xOYRm0dsHrF5xOYRm0dsHrF5wuYJmydsnrB5wuYJmydsnrB5wuYJm2dsnrF5xuYZm2dsnrF5xuYZm2dsnrG5lCWPCI84HvE8ojxiPMIP2Uq+N1PyzZmS6wvXF64vXF+4vnB9wbtzIoFHItzRa65+LQ71Yrmp2rPd9sPzdtUf9TaXp9/7/pP+MHh/2K2q9flQtcfC/5wIt8AhzaL/u1HYviWSZ+K0+a7m+/4A", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(refcount_1, 1, \"borrow_mut_two should create a fresh array with an RC of 1\");\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(\n refcount_1,\n 2,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_0.snap index bec488a18d1..a5af0ab5914 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_0.snap @@ -16,14 +16,14 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+2ZS4/aMBDH7SU8El5Z2LZ8gb0HAoTeOCyH9lukS5F6qaqqUi+ttB+9jepJzHS2HPiPNtCMhPKw+c3D9sSZWFNJ5I6BO96Y52Xrjsl5MldkJyXwShxKr82h5bU5tG4cqrlD2ZFD9vId2hw5ZC7foWYN1d2hKm1bz6lTQk6/d8eQ3S9YLWAAQo+L5m+S5Tpk/oHtT0OPqcBfhGz8wPyk6zgPT8d8w/S2WD/+n0KG7tyav/tQm7+odq6t9/s3MtX52J2HjKcxN3yb0LGdCvaTrr7z9YH56sfewmzJPkjzCMdflPO0rcJfl/Z3dPhvid/V4X8kfk+HvyR+qMJPc+JHOvaXa7Gvw18Rf6DDfyT+UIWf7Sl/Up4kHcZUuWPs3cflsfncMn3GHOcpw/RHzFb0nsEyfWQPjw/lWopdLNgaC208B8eCnljQI7ECIKsNZHWArC6Q1QOykLEPa2pXBGQh50QfyBoAWXWdX/TckPaBhWzdMTlTLLPdt1XKnUXsKe98+frp8zfDxAdZz2C6vmFtgRcEv1/rGZ45wbcCq5BiAtKiDZ6O9Wzd/eQMyTZ/gllIy/HbpvLDl8Br9/u/c9f+IqZjcIadhyyfH9L8kK/y/X75mE8YvxD/ReSnO29e9v8pzcu+qcaO+uy8PjvGPacgQBu04pzW9/9QEPjOfG0KApI0BYET/AsvCGQr3YJAlioXBDLdgkBV0BjpxGcpFRWA/DI/xCr8RVmQudWxvxzfic74bog/VeGn5fy/0+GX4/tKJ/5lQey1qYSeq6T7jXcf9xxfrC3TZ4xcECP9EbMVva+2TB/Zw+PDC2IzwdZYaON7kJmgZybokVgBkNUGsjpAVhfI6gFZyNiHNbUrArKQ49gHspBzdQBkIeM1BLKQa6iueWIEZCFjj5xfSLvGQBYyf8U1tesWyEKuIeTaRq6hCZBV1+f2FMi6A7LoneMlP6ZI+261jyn3rN+pjynWM9QKOu+F/13CB5Uf7vqlP6j8AnIYlTqwMQAA", - "debug_symbols": "7dnLiuJAFMbxd8k6izqn7v0qw9B4STcBUfEyMIjvPkljOUNPiPxj06vsLK0vHvyV4aTqUq2b5fn9td2+7Y7Vy49LtdmtFqd2t+1Gl8p8vHXcL7b96HhaHE7Vi4ipq2a77l65cK2rt3bTVC/eXOv/pgYXb1NDcONTU5bb1Kz2PlX1+rOuZLAMr6WMHMevnZ0t1w5mehk6VIZKCajL49cWDb6UrEmnF2IHC/HhFrDy4PeQEMtcCfkJGPdsIdHlUkgMcXohfqgQZ8vqczmNX1vVliWi6mV6IeHpQny8FxL99ELiUCFeywL07sH603RfI5o1fNOCSt9a9Vetvvxs1TmXW6o1D/8zX3MX6QbLQ7vZtO+vn2/5l0oGl/HoLTriRMKJTBNqcEJwQnHC4oTDCY8T2FyxuWJzxeYWm1tsbrG5xeYWm1tsbrG5xeYWm1ts7rC5w+YOmzts7rC5w+YOmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsHrB5wOYBmwdsHgbN4/1pOSbzOeFxIrDE9eM5+zJ3cnMnN3dycyc3d3JzJzd3cnMnN3dyEzq50QQ2D9g8YPOAzQM2j9g8YvOIzSM2j9g8YvOIzSM2j9g8YvOEzRM2T9g8YfOEzRM2T9g8YfOEzRM2z9g8Y/OMzTM2z9g8Y/OMzTM2z9g8Y3MxhkeER5RHLI84HvE8wg/ZDN+bMXxzxnB94frC9YXrC9cXri94d04k8EiEO3rd6Nfi0C6Wm6Y/2+0/PG9X5ai3G55+78sn5TB4f9itmvX50PTHwv+cCPfAIdXR/t0o7N8SybWo676r+74/", + "debug_symbols": "7dnbiuJAEMbxd8m1F6nuqj74KssyeMgMAVHxsLCI777JkLjLbIj8dfAqd0b7i0X/2lB2X4p1tTx/vNXb992xmP+4FJvdanGqd9vm6lKUn28d94tte3U8LQ6nYi4SZkW1XTevzF1nxXu9qYq5ldfZf0OD5W5oiGF8aMrSDc3O34Y6d/05K2SwDEtdwJX+zr3FuqHJu8fLcENlOIl9GWbj9xbx/XSI2BPz4QcLCa4LeHdnPkSD9oVoemJG9NlCzMfbWro3fWOF2FAhqr4LWKnj93als9tqUv94IeHpQjTfCgnx8ULiUCHm+4BpulNIutG4lOKLFlR6adXftfrys1Vn638yLif/kqdIc7E81JtN/fH29ZF/KWRwGY8+oiNOJJzINOFKnBCccDjhcUJxwnACmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsrthcsblic8Xmis0Vmys2V2yu2FyxuWFzw+aGzQ2bGzY3bG7Y3LC5YXPD5gGbB2wesHnA5mHQPGrfjsZUfk0YTgSWuH7+z75MndzUyU2d3NTJTZ3c1MlNndzUyU2d3AOd3GgCmwdsHrB5wOYBm0dsHrF5xOYRm0dsHrF5xOYRm0dsHrF5wuYJmydsnrB5wuYJmydsnrB5wuYJm2dsnrF5xuYZm2dsnrF5xuYZm2dsnrG5lCWPCI84HvE8ojxiPMIP2Uq+N1PyzZmS6wvXF64vXF+4vnB9wbtzIoFHItzRa65+LQ71Yrmp2rPd9sPzdtUf9TaXp9/7/pP+MHh/2K2q9flQtcfC/5wIt8AhzaL/u1HYviWSZ+K0+a7m+/4A", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(refcount_1, 1, \"borrow_mut_two should create a fresh array with an RC of 1\");\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(\n refcount_1,\n 2,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index bec488a18d1..a5af0ab5914 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -16,14 +16,14 @@ expression: artifact } }, "bytecode": "H4sIAAAAAAAA/+2ZS4/aMBDH7SU8El5Z2LZ8gb0HAoTeOCyH9lukS5F6qaqqUi+ttB+9jepJzHS2HPiPNtCMhPKw+c3D9sSZWFNJ5I6BO96Y52Xrjsl5MldkJyXwShxKr82h5bU5tG4cqrlD2ZFD9vId2hw5ZC7foWYN1d2hKm1bz6lTQk6/d8eQ3S9YLWAAQo+L5m+S5Tpk/oHtT0OPqcBfhGz8wPyk6zgPT8d8w/S2WD/+n0KG7tyav/tQm7+odq6t9/s3MtX52J2HjKcxN3yb0LGdCvaTrr7z9YH56sfewmzJPkjzCMdflPO0rcJfl/Z3dPhvid/V4X8kfk+HvyR+qMJPc+JHOvaXa7Gvw18Rf6DDfyT+UIWf7Sl/Up4kHcZUuWPs3cflsfncMn3GHOcpw/RHzFb0nsEyfWQPjw/lWopdLNgaC208B8eCnljQI7ECIKsNZHWArC6Q1QOykLEPa2pXBGQh50QfyBoAWXWdX/TckPaBhWzdMTlTLLPdt1XKnUXsKe98+frp8zfDxAdZz2C6vmFtgRcEv1/rGZ45wbcCq5BiAtKiDZ6O9Wzd/eQMyTZ/gllIy/HbpvLDl8Br9/u/c9f+IqZjcIadhyyfH9L8kK/y/X75mE8YvxD/ReSnO29e9v8pzcu+qcaO+uy8PjvGPacgQBu04pzW9/9QEPjOfG0KApI0BYET/AsvCGQr3YJAlioXBDLdgkBV0BjpxGcpFRWA/DI/xCr8RVmQudWxvxzfic74bog/VeGn5fy/0+GX4/tKJ/5lQey1qYSeq6T7jXcf9xxfrC3TZ4xcECP9EbMVva+2TB/Zw+PDC2IzwdZYaON7kJmgZybokVgBkNUGsjpAVhfI6gFZyNiHNbUrArKQ49gHspBzdQBkIeM1BLKQa6iueWIEZCFjj5xfSLvGQBYyf8U1tesWyEKuIeTaRq6hCZBV1+f2FMi6A7LoneMlP6ZI+261jyn3rN+pjynWM9QKOu+F/13CB5Uf7vqlP6j8AnIYlTqwMQAA", - "debug_symbols": "7dnLiuJAFMbxd8k6izqn7v0qw9B4STcBUfEyMIjvPkljOUNPiPxj06vsLK0vHvyV4aTqUq2b5fn9td2+7Y7Vy49LtdmtFqd2t+1Gl8p8vHXcL7b96HhaHE7Vi4ipq2a77l65cK2rt3bTVC/eXOv/pgYXb1NDcONTU5bb1Kz2PlX1+rOuZLAMr6WMHMevnZ0t1w5mehk6VIZKCajL49cWDb6UrEmnF2IHC/HhFrDy4PeQEMtcCfkJGPdsIdHlUkgMcXohfqgQZ8vqczmNX1vVliWi6mV6IeHpQny8FxL99ELiUCFeywL07sH603RfI5o1fNOCSt9a9Vetvvxs1TmXW6o1D/8zX3MX6QbLQ7vZtO+vn2/5l0oGl/HoLTriRMKJTBNqcEJwQnHC4oTDCY8T2FyxuWJzxeYWm1tsbrG5xeYWm1tsbrG5xeYWm1ts7rC5w+YOmzts7rC5w+YOmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsHrB5wOYBmwdsHgbN4/1pOSbzOeFxIrDE9eM5+zJ3cnMnN3dycyc3d3JzJzd3cnMnN3dyEzq50QQ2D9g8YPOAzQM2j9g8YvOIzSM2j9g8YvOIzSM2j9g8YvOEzRM2T9g8YfOEzRM2T9g8YfOEzRM2z9g8Y/OMzTM2z9g8Y/OMzTM2z9g8Y3MxhkeER5RHLI84HvE8wg/ZDN+bMXxzxnB94frC9YXrC9cXri94d04k8EiEO3rd6Nfi0C6Wm6Y/2+0/PG9X5ai3G55+78sn5TB4f9itmvX50PTHwv+cCPfAIdXR/t0o7N8SybWo676r+74/", + "debug_symbols": "7dnbiuJAEMbxd8m1F6nuqj74KssyeMgMAVHxsLCI777JkLjLbIj8dfAqd0b7i0X/2lB2X4p1tTx/vNXb992xmP+4FJvdanGqd9vm6lKUn28d94tte3U8LQ6nYi4SZkW1XTevzF1nxXu9qYq5ldfZf0OD5W5oiGF8aMrSDc3O34Y6d/05K2SwDEtdwJX+zr3FuqHJu8fLcENlOIl9GWbj9xbx/XSI2BPz4QcLCa4LeHdnPkSD9oVoemJG9NlCzMfbWro3fWOF2FAhqr4LWKnj93als9tqUv94IeHpQjTfCgnx8ULiUCHm+4BpulNIutG4lOKLFlR6adXftfrys1Vn638yLif/kqdIc7E81JtN/fH29ZF/KWRwGY8+oiNOJJzINOFKnBCccDjhcUJxwnACmzts7rC5w+Yem3ts7rG5x+Yem3ts7rG5x+Yem3tsrthcsblic8Xmis0Vmys2V2yu2FyxuWFzw+aGzQ2bGzY3bG7Y3LC5YXPD5gGbB2wesHnA5mHQPGrfjsZUfk0YTgSWuH7+z75MndzUyU2d3NTJTZ3c1MlNndzUyU2d3AOd3GgCmwdsHrB5wOYBm0dsHrF5xOYRm0dsHrF5xOYRm0dsHrF5wuYJmydsnrB5wuYJmydsnrB5wuYJm2dsnrF5xuYZm2dsnrF5xuYZm2dsnrG5lCWPCI84HvE8ojxiPMIP2Uq+N1PyzZmS6wvXF64vXF+4vnB9wbtzIoFHItzRa65+LQ71Yrmp2rPd9sPzdtUf9TaXp9/7/pP+MHh/2K2q9flQtcfC/5wIt8AhzaL/u1HYviWSZ+K0+a7m+/4A", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(refcount_1, 1, \"borrow_mut_two should create a fresh array with an RC of 1\");\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(\n refcount_1,\n 2,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index d572de6c9ec..e7c5221f8f7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_counts_inliner_min/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -9,6 +9,10 @@ expression: artifact "parameters": [], "return_type": null, "error_types": { + "2364549065372372629": { + "error_kind": "string", + "string": "after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut" + }, "4717959987348973079": { "error_kind": "string", "string": "the original should not be mutated by copy_mut, only borrow_mut_two" @@ -17,9 +21,9 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "6055981641117986912": { + "8222435832483736686": { "error_kind": "string", - "string": "borrow_mut_two should create a fresh array with an RC of 1" + "string": "There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)" }, "12049594436772143978": { "error_kind": "string", @@ -39,15 +43,15 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "tZ3Zbt64EoTfxde+YLPJXvIqg4MgiycwYNiBkxxgEOTdRzYiObCoX6ga88bIH+vrLFVa3Gqyfl59vvn448v72/u/H75dvfvr59Xdw6cP328f7pdPP39dX318vL27u/3y/s/fvipPX3p5Pv7b1w/3Tx+/ff/w+P3qnZfrq5v7z8svZKH/vr27uXrXy6//XV91AY+v4PEKHt/A4zt4vIHHO3h8gMcndryB+hqor4H6GqivgfoaqK+B+hqor4H6Gqivg/o6qK+P9Y3fx0vJ14CiQEOBjgKGAo4CgQIJAlFQQFAAVTpQpQNVOlClA1U6UKVjqLToegJJf30GxVBqEduI+orIAhMCExUmFCYaTHSYMJhwmAiYgDWXUnBEcKTiiOLIWPiQ30gte2SsfI8N0R1iOOI4EjiSMCIFRwRHKo4ojjQcwdUXXH3B1RdcfcHVr7j6dah+VV2R3nbIUP0qviF9hyiONBzpOGI44jgSOJIwogVHBEdw9RVXX3H1FVdfcfUVV1+H6mtZ72Jad3cxHatvdUN2J3IrOCI4UnFEcaThSMcRw5Gh+tpX9bXHDgkcSRgZt98uI4IjFUcURxqOdBwxHMHV77j6HVffcPUNV99w9Q1X33D1DVffcPUNV99w9Q1Xf9y6U+8rkrZDBEcqjiiONBzpOGI44jgSODJUv8l6S2rqr5FxQ6+19QG+l90D/LildxmpOKI40nCk44jhiONI4MhQ/a7rg2Jvu3N/3OK7jAiOVBxRFKnj1o31/I2Y2w4xHHEcOfjxzdYzuS6eeg2N2yp1OXSFqsoOqgykDNQYqDPQ+CcmrVsXT7vuoPF/udr2c5bG6/OnHvUyLkOVgZSBGgN1BjIGcgaidEoCOuhunECMI5RxhDKOUMYRyjhCGUco4whlHKGMIxrjiMY4ojGOaIwjGuOIxjiiMY5ojCMa44jGOKIzjuiMIzrjiM44ojOO6IwjOuOIzjiiM47ojCOMcYQxjjDGEcY4whhHGOMIYxxhjCOMcYQxjnDGEc44whlHOOMIZxzhjCOccYQzjnDGEc44IhhHBOOIYBwRjCOCcUQwjgjGEcE4IhhHBOOIZByRjCOScUQyjkjGEck4IhlHJOOIZByRhCO0FAYSBqoMpAzUGGjsiBZr/2x5YC1/Qte7gyPXzk/+8YZ1eQn+XN8m1/fJ9WNy/ZxbfzxA9ob1ZXL9Orm+Tq7fJtdHz69naHzS9G3cf/mJru+gYKAkoPHY2xk0FDJk7emH1h3ScKTjiOGI40jgSMLIuGl7GRleIKxs72d2Lwt03LC9jCiONBzpOGI44jgSODJU37aHBfPdKTZu0F5GBHo7B178xn3cN6uuU6u3qdX71Oo2tbrPrN4P1lPoWl6kv375q10YqDKQMlBjoM5AxkDOQMFA4+VzbV2T4vn6dbYeLIS9iAiOVBxRHGk40nHEcGS8nC7XO0eU3Z3jYIHsRSRh5GCZ7EVEcKTiiOJIw5GOI9jjLHh1dp9aPaZWz5nVo0ytLlOr16nVDxaJ6epi6btFHBrGQM5AwUBJQAfrg08gYaDKQONHm+Ky3dFlDzUG6gxkDOQMFAyUONQOFg+fQAcPu/UFqrmDKgMpAzUG6gxkDOQMhD7sYpfIdrDy+M3qS5lcXybXr5Pr6+T6bXL98cN4Wy/3HmWHJIzUgiOCIxVHFEcajnQcMRwZX5+qbfs2LO9cXl+fxt3lMygJaNxhPoOEgSoDKQM1BuoMZAzEOEIZRyjjiMY4ojGOaIwjGuOIcfNXdFtNJEuTaQd1BjIGcgY62AFpW0yyQLGDkoAOWrgnkDBQZSBloMZAnYHGjljuJSu0XHt2kDNQMFAS0LiJewYJA1UGUgZqDNQZ6MARrW/QbteYZs5AwUBJQF4YSBioMpAyUGOgA0d43aDYXcvdGOjAEdZeoP/Q52sek+vn3PpRJteXyfXr5Po6uX4D6z9DB83ll3Ou78+5o+byZQhtLqP//JhcP+fWh7vbaH2ZXL9Orq+T64+3WdBYT5/l56fd6TPuj59BwUCJQ33cHz+DhIEqAykDNQYaX+Zi25pTssYOMgZyBgoGSgI66GSfQMJAlYGUgRoDMY4QxhHCOEIYRwjjiMo4ojKOGHemJXV7QMnY5ygoAzUG6gxkDOQMFAyUBHTQo87Y7rS52wqqH/SoT6DKQMpAjYE6AxkDOQMFA41XLJSydlBq2b0y7wdbV5xAwkCVgZSBGgN1BjIGcgYar2Epddv5qTTln5H7wS4Xb1b/YEOMt6svk+vXyfV1cv02uf7B6dO21VzF/L/Ut8n1fXL9mFw/59Y/2L7k7erL5Ppj/9vLakPL16sN+8FWJSeQMZAzUDBQEtDBViUnkDBQZSBlIMYRzjjCGUc44whnHOGMI4JxRDCOCMYRwTgiGEcE44iDrUp8myuvrrvn+4OtSmJrk9YI30HBQElAB1uVnEDCQJWBlIEaA3UGMgZiHJGMI5JwhJXCQMJAlYGUgcaOSNn2kM3dSnI72KrkBDIGcgYKBkoCOtjT4wQSBqoMNHZE2rarcMYeagzUGcgY6MARvb5AuoOCgZKADnbMOIGEgSoDKQM1BuoMZAzEOKIyjqiMI5RxhDKOUMYR4x61lg3S4nto6AjVsp65qmI7qDOQnUO5g5yBgoHGoSKtrPdcbbK754571GeQnEK17KDKQMpAQ0e0si2AaMV21/Jxj/oMMgZyBhpPPyzvDleoyu7UaElA427yGURMP1ivDKQM1Aho3Ja71AmzcaftMlJxRHGk4UjHEcMRx5HAkYQRx9V3XH3H1XdcfcfVd1x9x9V3XH3H1Xdc/cDVD1z9wNUPXP3A1Q9c/cDVD1z9wNUPXP3E1U9c/cTVT1z9xNVPXP3E1U9c/cTVT1h9LwVHBEcqjiiONBzpOGI44jgSOIKrL7j6gqsvuPqCqy+4+oKrL7j6gqsvuPqCq19x9SuufsXVr7j6FVe/4upXXP2Kq19x9SuuvuLqK66+4uorrr7i6iuuvuLqK66+4uorrn7D1W+4+g1Xv+HqN1z9hqvfcPXHza9Le5N4CxyBt5nxXnAE16XjunRcl47r0vGzsuNnZcfPSrwL53gXzvEunONdOMe7cI534RzvwjnehXO8C+d4F87xLpzjXTjHu3COd+Ec78I53oVzvAvneBfO8S6c4104x7twjnfhHO/COd6Fc7wL53gXzvEunONdOMe7cI534RzvwnnCG795whu/hTiOBI7AzzBxMPBxMcI8KhEsHgdjGCdQZyBjIGegg8iwSxHmwQRWBxMjHUyMdDAx0sHESAcTIx1MjHQwMdLBxEgHEyMdTIx0MDHSwcRIBxMjHUyMdDAx0sHESAcTIx1MjHQwMdLBxEgHEyMdTIx0MDHSwcRIBxMjHUyMdDAx0sHESAcTIx1MjHQwMdLBxEgHEyMdTIx0MDHSwcRIBxMjHUyMdDAx0sHESAcTIx1MjHQwMdLBxEgHEyMdTIx0MDHSwcRIBxMjHUyMdDAx0sHESAcTIx1MjHQwMdLBxEgHEyMdTIx0MDHSwcRIBxMjHUyMdDAx0sHESAcTIx1MjHQwMdLJxEgnEyOdTIx0MjHSWRoDdQYyBnIGCgZiHCGMI4RxhDCOEMYRwjhCGEcI4wiZGwGeEpPrz40Az1om15fJ9evk+jq5fptcv0+ub5Pro+fXM0QEi6cWBhIGqgwEvwVKfCon8amcxKdyEp/KSXwqJ/GpnMSnchKfykl8KifxqZzEp3Ky4eo3XP2Gq99x9TuufsfVx2d/Ep/9SXz2J/HZn8RnfxKf/Ul89ifx2Z/EZ38Sn/1JfPYn8dmfxGd/Ep/9SXz2J/HZn8RnfxKf/Ul89ifx2Z/EZ38Sn/1JfPYn8dmfxGd/Ep/9SXz2J/HZn8RnfxKf/Ul89ifx2Z/EZ38Sn/1JfPYn8dmfxGd/Ep/9SXwFXuIr8BJfgZf4CrzEV+AlvgIv8RV4ia/AS3wFnhR8Cd7CCMFUglGCaQTTCcYIxgkmCIbwgRA+EMIHQvhACB+Me6aXZvoWBgyA/bV8+v+Hx9sPH+9uvi3E0zd/3H/6fvtw//vj93++rt/5+Hh7d3f75f3Xx4dPN59/PN68v3v49PS9q/L7y1+e7TqkP/9dlo+S/bqW8vTx6T96+fv59fIllz93+bP/BQ==", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", "path": "std/lib.nr" }, "50": { - "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n // Optimization: inc_rc isn't needed since there is only one array (`array`)\n // of the same type that `array` can be modified through\n assert_refcount(*array, rc_before_call + 0);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call + 1);\n array[0] = 4;\n println(array[0]);\n array\n}\n\n/// Borrow the same array mutably through both parameters, inc_rc is necessary here, although\n/// only one is needed to bring the rc from 1 to 2.\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call + 1);\n assert_refcount(*array2, rc_before_call + 1);\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1 + 0);\n assert_refcount(*array2, rc_before_call2 + 0);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], expected: u32) {\n let count = array_refcount(array);\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n borrow_mut_two(&mut array, &mut array, refcount_0);\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1);\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(refcount_1, 1, \"borrow_mut_two should create a fresh array with an RC of 1\");\n assert_eq(refcount_2, refcount_1);\n }\n}\n", + "source": "use std::mem::array_refcount;\n\nfn main() {\n let mut array = [0, 1, 2];\n assert_refcount(array, 1, true);\n\n borrow(array, array_refcount(array));\n borrow_mut(&mut array, array_refcount(array));\n let _ = copy_mut(array, array_refcount(array));\n\n borrow_mut_two(&mut array, &mut array, array_refcount(array));\n\n let mut u32_array = [0, 1, 2];\n let rc1 = array_refcount(array);\n let rc2 = array_refcount(u32_array);\n borrow_mut_two_separate(&mut array, &mut u32_array, rc1, rc2);\n\n // Safety: test\n regression_7297();\n}\n\nfn borrow(array: [Field; 3], rc_before_call: u32) {\n assert_refcount(array, rc_before_call, true);\n println(array[0]);\n}\n\nfn borrow_mut(array: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array, rc_before_call, true);\n array[0] = 3;\n println(array[0]);\n}\n\n// Returning a copy of the array, otherwise the SSA can end up optimizing away\n// the `array_set`, with the whole body just becoming basically `println(4);`.\nfn copy_mut(mut array: [Field; 3], rc_before_call: u32) -> [Field; 3] {\n assert_refcount(array, rc_before_call, true);\n array[0] = 4;\n println(array[0]);\n array\n}\n\nfn borrow_mut_two(array1: &mut [Field; 3], array2: &mut [Field; 3], rc_before_call: u32) {\n assert_refcount(*array1, rc_before_call, true);\n assert_refcount(*array2, rc_before_call + 1, true); // array should be copied from previous dereference\n array1[0] = 5;\n array2[0] = 6;\n println(array1[0]); // array1 & 2 alias, so this should also print 6\n println(array2[0]);\n}\n\n/// Borrow a different array: we should be able to reason that these types cannot be mutably\n/// aliased since they're different types so we don't need any inc_rc instructions.\nfn borrow_mut_two_separate(\n array1: &mut [Field; 3],\n array2: &mut [u32; 3],\n rc_before_call1: u32,\n rc_before_call2: u32,\n) {\n assert_refcount(*array1, rc_before_call1, true);\n assert_refcount(*array2, rc_before_call2, true);\n array1[0] = 7;\n array2[0] = 8;\n println(array1[0]);\n println(array2[0]);\n}\n\nfn assert_refcount(array: [T; 3], mut expected: u32, expect_copy: bool) {\n let count = array_refcount(array);\n\n if expect_copy {\n expected += 1;\n }\n\n // All ref counts are zero when running this as a constrained program\n if std::runtime::is_unconstrained() {\n if count != expected {\n // Brillig doesn't print the actual & expected arguments on assertion failure\n println(f\"actual = {count}, expected = {expected}\");\n }\n assert_eq(count, expected);\n } else {\n assert_eq(count, 0);\n }\n}\n\nfn regression_7297() {\n let mut array = [0, 1, 2];\n\n let refcount_0 = array_refcount(array);\n\n // This is currently copying the array due to the inc_rc in the array_refcount call above\n borrow_mut_two(&mut array, &mut array, refcount_0);\n\n let refcount_1 = array_refcount(array);\n let array_2 = copy_mut(array, refcount_1 + 1); // array was just copied on the previous line\n let refcount_2 = array_refcount(array);\n\n // Mutation of the original could occur if we double decremented the RC and then went back to 1 by accident.\n // For this to come out we have to run the test with `--inliner-aggressiveness -9223372036854775808`\n assert_eq(array[0], 6, \"the original should not be mutated by copy_mut, only borrow_mut_two\");\n assert_eq(array_2[0], 4, \"the copy should have the expected content\");\n\n if std::runtime::is_unconstrained() {\n // Double decrementing the RC could occur if we don't realize that array mutation made a copy,\n // which decreases the RC of the original and sets the new one to 1.\n // This assertion is redundant with the one following it, but it's here because `assert_eq` doesn't print\n // what actual values that cause it to fail, so this is a way to highlight the bug about the refcount of\n // still live arrays going to zero, without any doubt that it's just not 1, as it should be.\n assert(\n refcount_1 != 0,\n \"borrow_mut_two should create a fresh array and not decrease its RC\",\n );\n assert_eq(\n refcount_1,\n 2,\n \"There is 1 clone after `borrow_mut_two` and before `refcount_1` is defined (cloned before array_refcount call)\",\n );\n\n assert_eq(\n refcount_2,\n refcount_1 + 3,\n \"after refcount_1 we clone once in passing array to copy_mut, once to array_refcount after, and once within copy_mut\",\n );\n }\n}\n", "path": "" } }, diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/reference_only_used_as_alias/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/reference_only_used_as_alias/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 78e6d2ce2e6..1d96c82460d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/reference_only_used_as_alias/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/reference_only_used_as_alias/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -45,18 +45,14 @@ expression: artifact "error_kind": "string", "string": "push out of bounds" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+1awW7rRBQdJ3ZSOy+N6YMNEjtYsIsbpyliU6ktC95XmLQVS5Ys/RlsQOIvED/Ako9BQmKBoJM3tz4+vrHLy8yj1XsjRWPPvXPvmTN37oxjR+Z1Se5/kbuOXT12dQRtBtpsuXD18rBSeLS1DIUxegYYR88A4zgAxhA442eCMwmE00wItA0uO3mWmMTsLzLAE3eRuvsRyD0GQZGSX5/2z5flNlXG5xH/KjXtJOvZ/pnYT8LYX06dna/qxj6ORfzKhvKqbrh8VbcxCdZAcxmai3JuuhumjEV8T8L4XkfkDzlHmfjPTNC4KyLyJ3iYH8kLc9GpGzwRyeK6Ow6RJSCT+T26/30MehxbMckEiy1f123ZGGQSt9b+Z+Drc3cdOI63KeH1vaZfKvjRly3TuuFDuBlDWwL87fhBfZKlIIvrtp/M3cfgB20JjoT0P3X3C1dPoI/0zxX/E/Lfwq20MS+pop8q+jZ+P3HXM9Psk5d1Y8/nnIr9K8Di2/Z1GOyF5ceurx+cvcfk2VA5/rF59iEezdvJswnh6cuzvA9J39zoe5Rc78vnE8XP27K1MN35lnEH3nOXMg45A8XKOBDbiPTx2pjmQVzavnS1jf2foM+++U56uNPOZHOlH6+jaRDuiuKx60j8Zyboui54Lod4Fe6OFKw5yWy5qhs9lo2VtlGPrUuPtnzieqq23vP1nq93mS/ZIzGXS05LTTePhdgj5YwYK+NAbCPSx2tjmj1S2r51tbZHarl82sNdouDRuOPzRRqYu8x0uUt7uMtAJtfInbR9Z/xxFz+SO467LDB3M4W7rIe7GcjkGrmTtu+NP+60uJsr/aI9tfjhNvbDZzn0M/boR3t51PfM9qZ+/uuZ9k39oC3O9S/IVkS2rp2+rAWML+mb0r3ntXAqmI57sKJ/wToH2TFhjcJgvZ0rWKWIbAG+eb3khAtlH4CM4/IEZBxLL0HG5/8PQTYj2UcgQy65jOke+bX55Wewy3pS8D+kuG7kvuZmc/46p+7wOvuJ6WJH/wnp/+juMf9KfcgLt7tNVdytqrtqXd3clNvqhOzbMgKefPuvNqvz7Wm53XyzXlWrs0H/+F+WrDU8C0m/wOeLSuIUzwhSRIb5CjFy0WJYcNt+v4Bd1jM0XjzDXvgZ6+apcRmRDHM/55g5YUbZMcg4p2Ge5JyGeXJCMsyTnF8xtg+Jh1/BLutJ4bXC909tTnlucE55bnDcV3VbhnvfJckWPf1wTvFMyWVobn4DrKwnZV8ewzNmRDKMF4nxwHNYCg6ZQ9mzGE9KeHBejT88BT+D/W4a3v8k7kRnNIBZe3c6hfHYEtch+C0Ki+cvwIG4dnzX7THhM9VY0R8RB9r5GudGOMqNUc/QaGus2MK1LWd1jU+MD1viuu3nwrUvDyo6n613BHV7TJkyJu1Zs49/fga3JTddrmOyFSu2kOM+Pv/P+ESMzGc6MCbmU+Mfc5lwlJsu1wnZGnqH18fnw7tmV8cku3Dty4OKzidiZD6nA2NiPjX+tf+PctPlekK2tPWOZ8trwiq2J0bPt2IvIf0/XG11F1EbXwT9ORZGiu0Qzyfl/QPS2d1muT69KW9PbwafT7RvJjDWbJHvLvC7DNQXewnp/y26979/3DV/w4P+rN5xtF8v2lPvbChtcd1u077XwO9YRF98Z3UXo8hmIMN1YMsLd498oS3BkZD+zBmQOcFvT6R/rvg/Iv8t3Eobf8cyU/Rnir6dn9h1ejhjgW/f72h3Psk+tjE2iZ0g62pdbbbVpii+KIvbslgPrat/AdtXmM1xLwAA", - "debug_symbols": "tZrdaiJBEIXfZa7noquqf6rzKssSTDIJgmgwZmEJvvv2uGqCjhEPOTfiaH+HQb/TM7b90T0ND+8v9/Pl8+qtu/v10S1Wj7PNfLVsRx/bvntYzxeL+cv915e7MD5k2Y1/e50tx8O3zWy96e40hNp3w/JpfKq5JTzPF0N3l8K2Px9cgh4GF9Xj4Lz93XdZyflGzo/k/ETOz+T8Qs53cn7l5pdAzif3t5D7W8j9LeT+FnJ/C7m/hdzfQu5vIffXyf11cn+d3F8n99fJ/XVyf53cXyf318n9dXJ/K7m/ldzfSu5vJfe3kvtbyf2t5P5Wcn/rrf0dmXo7IyEgkCCQIpAhUESghEAZgQoCOQIhRghihCBGCGKEIEYIYoQgRghihCBGCGKEIEYoYoQiRihihCJGKGKEIkYoYoQiRihihCJGGGKEIUYYYoQhRtgFI8rxKh08nEEJgS4YUcMRqn4GFQRyBJo2ol3sDlCbsK7c28Tj2FRO82Mg5ws5X8n5Rs6P5PxEzs/k/ELOd3I+ub+J3N98a7920GRp2vzse6hNoHYGRQRKCJQRqCCQI1CdhqodoBjPLmPT/5FcgwSBFIEMgSICJQTKCFQQyBEIMcIRIxwxwhEjphdd27xyuFlrv7L1+4krZ9mPzS5n+U7Or9z86UXXH8wXcr6S842cH8n5iZyfyfnc/ur0Wuj3iNyOTFqaPcUjUz6h/J8xgIkAkwAmA8zkN5lrSAemajllHGDq7cz0+ucVRgBGAcYAJgJMApgMMIAHAngggAcKeKCABwp4oIAHCniggAcKeKCABwp4oIAHBnhggAcGeGCABwZ4YIAHBnhggAcGeGAXPIjHa1ZNp0wMACMAowBjABNvZLbt4M9sPZ89LIb9BuXn9+Xjl/3Km7+vw8nW5df16nF4el8P4ybmz/3L42epsfbtT/B2LuPZa+4tj3d541uStJdUxkPZjcy9Rm9n0M7iHw==", + "bytecode": "H4sIAAAAAAAA/+1ZzW7TQBBex3ZSJw0NcEPiBgdudkkI3CK15QBPEbX0GbiA9iUQL8CRh0FC4oC4cEMCiVegW3bqz58nTml3+yM6UrTxznjm229nZ712Yv5KfvRL/P/Mt6lvE+gz0Odk4dvyfFIF9FXGwphcA4y9a4AxjYAxBs7smuDMI+E0fQLtkstNniMmN6tFBvjbt4Vve6APmARVQXFD+n9aTvcLZXwB8T8uTLPIBvb/RPzncfyXA+/nua3941gkrmwoL23N5UvbxCRYI81lbC6mY9PeMGUsErsfJ/YsoXjIOeok/tBEzbsqoXiCh/mRujAWG1vjSUiX2fY4RJeDTuZ34+h3D+w4tzLSCRYnL2xTl4JO8tb5fwixHvn/kfN4vyC8odf0XQU/xnIysDUfwk0KfTnwd8wP2pOuAF1mm3GG/jqDOOhLcORk/8Bfb/m2D/fI/RMlfp/iN3ArfcxLodgXir3L3/v+/8jU++SOrf2FnFPxvwtYQvvei4O9cvy49fXa+ztNnY1V409bZ0/y0VxMnc0JT1ed5X1I7p0YfY+S/6vqeV+Jc1G+xqY9/ovZc6vqrHtupNzs3HNzhVfhbqBgnZDOya6t7ViXKn29Dl87AX2FxHVVfd3wdcPX/8wX71viX2slDvf9y36SBoyjvUzteoY5axzt3N21P541DvrivNkgXwn52vP2W6a998i9BV0H3ie3BdOwAyvGF6z4rmlIWJM4WJdjBauI6EYQu0+6TcKFujHoOC9vgY5zaQt0/CwxAd2AdLdBx+/tUFK6Rn7dnLwFv2wngmeqzNb6UHMzf1qWEk/Os7lpY8f4Odm/8ddDwi/zsTgjzsP5sjp8vDxczpYHB9P95R3y76QHPOHZSnId157cJ7mOc3eZuY4YWbQcEtzuvnfgl+0MjRdr2iLMWOdXjcuEdFg3eI2PCTPqsG5wTcG6wTUF6wbXMKwbXFMwt8+TD+/BL9uJ8Frh66s2pzw3OKc8NzjuXdvU3QLdDum2Ou7DOcUzL8u6ufkAWNlOZFUdw+eLhHSYL5Ljkedwys8esmcwnoLw4LyacHiqnPB8NDXvn4k7semtway9yx/AeJxkNga/VeXwfAEciOuYb9sc0wh0qWLfIw42FXucG+FoYlY/fyV0jb5wbcuzssYn5oeTzDbjLHx/eS7R+cTzGfOpPVNrZ70u/vF5SDiamDbXGfnKFF/IcRefl5mfiJH5LNaMifnU+MdaJhxNTJvrnHyte6fcxefJtw/fZqRb+P7yXKLziRiZz8GaMTGfGv+4p/C7c+S6T7609Y7PlnuEVXz3jV5vxV9O9p9862x/Eb4E7udc6Cm+3XoLfT6ZHh1QnhzOy9n2wfTV9sHa84n2DQ9zzYl8B8TvhGgv/nKy/yq2R79v/j9/U8Z4zu5nh12yoj32ofRlttmnfT9MbdteYg9tG6PoRqDDdeBk018jX+hLcORk/8Nfy5zgt1C5f6LE36D4DdxKH39XHSn2I8Xezc938edbHHvo7y3HMck/9jE2yZ0o62q2nO8v51X1bFq9mlazdevqDz2DRKsBKgAA", + "debug_symbols": "tZrbiuJAFEX/Jc95qOupc/yVYWi8xEYQFS8Dg/jvkzhqN53Ykk3vFzGm1qYweyUhqXO1aGan97fVZrk9VJNf52q9nU+Pq+2m3Tpf6mq2X63Xq/e3zz9XrvvI8Tr+sJtuus3Dcbo/VpPgnNVVs1l0X4O0CcvVuqkm2V3q/uDiwn1wCeExWC6/6yoncn4m5ws5v5DzlZxv3Hxx5HxPzg/kfLK/QvZXyP4K2V8h+ytkf4XsbyH7W8j+FrK/hexvIftbyP4Wsr+F7G8h+1vI/irZXyX7q2R/leyvkv1Vsr9K9lfJ/irZXyX7a2P97RgPMAFgIsAkgMkAIwBTAEYBxsYz3jkE8gj0pArl0VKnrgdFBHpSBnMPyLQHZQQSBBruQxt2h7wvL9xOj7G59PKVnG/cfO/I+Z6cH8j5kZyfyPmZnC/kfLK/nuxvGDv/KzQ4KR+z3iAfS+xBBkDRIZBHoIBAEYHSMGTxDqXUu4zFjECCQAWBFIEMgJJDII9AAYEiAiGNSEgjEtKIhDQiD/97Tu43a+2tSfj+xCXib2NFfS8/kvMTOT+T84WcX8j5Ss43bv7wS6kfzPfkfLK/wy91vkdkPDLYUtGcHkz5gOQ/owBj45nh1x4vGA8wg0dSzOU7Y6F8ZSLAJIDJACMAUwBGAcbGM8OPz18wHmCAHijQAwV6oEAPFOiBAj1QoAcK9MCAHhjQAwN6YEAPDOiBAT0woAcG9MCAHtj4HgTnAMYDTACYCDBPepAe1yzLPSYDjABMARgFGBvJXNqNP9P9ajpbN7cFesvTZv5pvd7x7675snRvt9/Om8Vp33SL+D7W73V9Cj7VIeZ2Lt0RDFJH6frZ7fLB1T50u64PQ9sHPnXwsZ1BO4t/", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/references/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/references/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 93f0cb14705..ac0749343d1 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/references/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/references/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -27,8 +27,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1az4oTTRDvSTLJRj9RlO+uB0HEw2STbFYEHXV3dd2LqKAIIjHLgiKILHhSCHjzICLiY3jRixcRfALfQBHfQPGq7XY5lV9qOp1M9xrDFoSeTlfX/+rq6Z5IZRCZtgJ9JeCkpk2KQcMjrUQU1AaE89I81E2/xMbLHpWtA1+f9BeTVq8u6OdR/mbd0AxpH6IZgH5SM3TW+hl91EXDHtPnMURz5n79/lPZ8//muQ5zQvg2oO2TA4L8JaabhrP9zB6++BLtpX4Qvf7k3LJ/2f/QXvFPe55on/NPu0O0z/unvUG0V73TbrSI9gXvtOeT3Worn18ZerQGlDJWA7nBWw1l4T+au08N5y7hhVw3fkFzjxpc2zjQGC/4XEYEpMHl1rZ7w+giHsFeZV9n0OapaZNi0FRgh9giRwy4h0E+bi+fa/B+RlcBL6kmFY1Hmw8C1eAWxhwHGosZb0k31FGBrBp0PL5ldBGPYK+gL+YmlzU1bVIM2gp0jQU5KjBGuC2Qrwr6p35kFOOxCrx34iTro784X6rjMeCeMi3ZMwYZU9NPCoLkyxh4T4MvNdA+cxJfvmN0EQ95loXxSdfSsiB/4HrRlmyHOuLaQM8Ikl1J7nFrO+qrhD7mgQbao2P+XDbtNOWIUmHzI9oenZsu8c7571JBY7oRqeGYLqth+1D+SXFOc/cJY7gHrwp8qgIfiRbZSaoNJGvomEU9KkyPWJC1JOjB9Y3hv55p9Rrwns3BXCgL/6HtpHUh8B6mQ/FRU8NAY3OMN+6368KY6/pJOmn6HxhdxEN5eByRbFIt0ZCaNikGDVxz7wPfGdxjLuDakecXglF7j4/m2ebjf02nzzOo05cZ1OnrDOr0fQKdlD99uoH371Z7Yd3iexepbhXZ2/9gdBGPYJpsoYHOlyVbjHuGyW0RRxldxJtGW4yKiyK2ODBjtiiSI4fGsEWgO7qxbREJMtr0LTF9Hzjou1tl++NK37/OncWt95vf8hr6sRqWnfOPAf+16e8C+cm/6YRybnS6jY1md6Pb7q6vt3pd3MdqKDE78bslel+U7oO4DXmf34ks97da6Ry/HIjnygQ8dd+33bud5mJvvtXr3Go3u82FseweqcG8Vip7b+Xzl/pbre29nuZI5xQlCy0+n8/lfdtdQOA93DzpJZ2LSD6X9OLvinm0ShZakUBLwbxYyf7gz9TnvGKBVt7dL+aH1JJO+F/eXZsGPB8OVC/GvvstUi8eOdQLlzWI+rEaziW698e720+mDf39kHRWYVv7bP2dGBuGUTHW34YYo9qKMfbNtNMcY9N23xTBmLRPd40Dvhd/7BAH0lkq1hKMA86X9jsYBxXzEPp7PCkO8urVjt+H5ZnU7/RNHPp9/47fB2DW/E7nSej3g1Po9+36foHm4Hctkoy4Hz9qkLQPjkT5vGid1XjHLHirAh7Veumek/pVkC8WeOOdZwN8XgP6qeknBUHyeQ3kx3fCSLBJ4G9Ik8B3gG381pbronkuRIP/15hNpPdJ9Dnh32ExeTwaxKG4XWU4JyzxSPvEUbKf9CT7GSbXafa8BnpQvKwwnCXH/FvJkVUp+9mGZIOaYINReb0GeS2dESB9aQ+PeU24FyGv8Ww4Nf2kIEh5PQfyUrzdYn66xOqcLaaugJ94XXOJKcK/xnhfZc/rOblxk+Fcd8gNjEk+/4ZjTN7M0VWp8WNSsuGomFyHmMQ1VrE+1sJI0Anj9TbE5N96r0Rf32e+ujuBrzfZ/HuOvt509MlmoHWK6sy45+Y8/5D3uf7gGOE+nBK/c12lcyQ6c3PBXc7B/Rf2q89ZvD5xiPc8elxmfKcg3GeM11PH3HhhwTvviLcq4NnWNe3Hn9bm8RshPAAA", - "debug_symbols": "tdvbbtw2EAbgd9lrX5Bz4JB5laIInMQJDBh24DgFCsPvXjq1uK5mNsI/QG8CbcDP2tVQFGdIPZ++3Hz6+e3j7f3Xhx+nD388n+4ePl8/3T7cz0/PL1enT4+3d3e33z6+/+9Tef2H9Ff7H9+v718//ni6fnw6faB+dbq5/3L6IGXqr7d3N6cPWl7+vDpRA9sb2L6D7QfWngvYvoLtKWqv/NZex749g+0FbK9g+wa2N7B9B9sPrL2E8R3y1r6WfcCkooBQwCgQFCgKGgrCMNeqmyDeiw6LgQotsKiwCMNNbbtWZLIXDAuBhcKiwcJg0WFxYfgemxi2E63AosKCYBHGnDu9CR5tLwQWCosGC4NFh0U8pNetl2jVnbACiwqL+MFN60mj+zHRGBYCC4VFg4XBosMijnk7P8f3ohdYVFgQLMKYm24jgzUnBBYKiwYLg0WHxUDFKLCosCBYxDFfsyUb+7FkCCwUFg0WBosOi4GKOdfESRx1O5PmCOGEcSI4UZw0nBhOOk4GTGrBCR79ike/htHvZXs2dCqOCE4UJw0nhpMw+p3aRoQdGTChgpOKE8JJHH3ZnhK9uQ5DghPFScOJ4SSOvm2T+t6HIwMmcS3u96TihHASR39sVYJRyRHBieKk4cRwEkZ/8Fb0HObJgMmFSt1vScUJ4YRxIjhRnMRVO+urbFfFGUuYnjADN3H57sDUhKGECTvBnEaWhcQNm3Ed7whpBrUMsgzqGTQSKK7szQkyLWRuqI6Le0eIMogzSDJIM6hl0IUe0Vc9fCqHegaNBLKSQTWDKIHigtN8rtuGuHWH4jPNZ9s6k3jEGRT3CLF1E4pVhyzzm3oCxQUMKmWbllOp7+bl/xpLmHhRolRbhnRvBmwormP897u9G/Nerp59ProlZNbb/q9X+JdTXPM4MJwwkrhamjDtf73Ccc8f4/zXaW/i6sUcTdZKqtG+ekVx/eIIUQbFw4bxGtVMhkOSQZpBLYMsg3oGjQSiCz2ineNkHtUMogziBLqwZ6b1bQI9Dz2qGUQZdGG9faW4ZK6+RXG+foQ0g1oGWQb1DBoJFOfuZMwL+Z1acfZ+hCiDOIPihWyz7UKwrxJTnPYeoDjvPUI1gyiDOIMkgzSDLmxqKFs9k3t1Y4RaBvUMGgkUJ6Tc19yDRzWHOIMkgzSDWgZZBvUMGgkUJ6Q8uCwk1aGaQZRBnEFhnKSsDiuF/a5ey6CeQSOB4s0jR6hmEGUQZ5DESHghFYc0g1oGWQLFGz6knvdXz3Ulh2oGUQbFcZpliA3NfNmh+OqRtIXEDSxxkUJY1pnY5RocVxyEV4FnHnoUXz059z1x4x7HlYQjxBkkGRT38kbbPEIa71dTOM7dRVpdZ2oexWcatOI0qDsUB3eoLKT73J3j5WStK/uch82hePPfrIFtaBZRHIr35s0Hw0LmflOc3imNLU7KxaMLL0esRS9ltyzAl96Q+D2SDNIEilMh5b6uHnfXYeOVPBVeaN66Dl3YQ1kXav7W0AubIm3FqfmvF0/m9bxJTq1Vh+LfZGuZTS04U7z3tJftftLudupyPC8/QiOB4iWpIxQPYVrXwKJuzZ3jia+0sVAbHsVzo/POlnnobsJ4Oip9vVMj3Y97pvj6CMczy1ZWetfKYIcsg3oGjQS6sHzT17hXR3G3Rr/wkl3Z1ubmoT9TnNXMyvk2mQ/G8njP7QGKZ2FHKM5qZnFjIfUozj5pleXZvyLC8d5Ynh15Q+yfT/GEioUWEtr3coknVKy0XmZQEofiTE3XBtZ52ByKL0Sr60K03dd7mZ/+un68vf50d/P2VufXn/ef373k+fT395vd+57fHx8+33z5+Xjz+ubn+aXPX1OfWb2+qjb+fN259/px0FUdMs8zz/UP", + "bytecode": "H4sIAAAAAAAA/+1azYpcRRSu2z13ejrJkKC40bWgu9t/6XGjV5KZZKIEZDYignY6TkCyiQgiA9ILBcGdCxERH8GNbtyI4M438A0U8Q0SklSmzvTX3z23+nbfqkmnmQNN3eo6df5P/SdmCokrN6huFJzclVk96ASklamC+kBwfnIfbVdvQHszoLJt4huS/k7WH7cV/QLK32s7mjHtIzQj0M9ajs5bkyl91sXCtqtjDEmfrce/C2b6/YL7blOfGL6NaPvseUX+Buhm4cpkao9QfIX21UkUvU5ybje87Ce098LT7grta+FpD4X29fC0D4X2fnDanb7QvhGcdjc7b47z+WdHT8aAxpTVTG5gaaGp/Cd9L5li7gpezHHjMfS2zezYhiBtOOGjjAxMA+W2tvsV6DKewEXjH2fY5rkrs3rQM2SH1CNHSrgvk3xor5Bj8HNA1xAvbU6qG48+H0Sag/sccwjSlgJvTTfW0ZCsFmw8/gZ0GU/goqIv5ybKmrsyqwcDQ7qmihwb1Ca4fZJvk/TPw8ioxuMm8T6Lk2md/YV8ZR5PCfcNV4o9U5Ixd/WsJmi+TIn3KvjSgqwzl/Hl70CX8ZhnU2lfdixtKvJHni8Gmu1YRx4b5JtBs6vIvejczvoapc55YEHW6Jw/B65cpRwxJm5+JKejc69KvCP/cyZqTHcSU4zppinaR/JPi3Ppe0lp4zX4psJnU+Gj0RI7aXODyBo7ZlmPDdAjVWRtKHqgvin9N3alHQP+gD6cC03lP7adNi5EXsMMJT5apgjStgW8eb3dVtqqjp+ik6X/J9BlPJYH40hk0+YSC7krs3rQ4TH3HvFdwzXmZR47yvwiMG/t8bf79vn4WdPp3zXU6b811On/NdTpwRI6mXD6jCKv37324nkL1y7avFVnbf8Q6DKewCrZwoKcL2u2WPQME22xnUzpMt4q2mJeXNSxxUtrZos6OfLqAraIdEe3sC0SRUafvg3Q94sK+p430/XxxiS8zsOd4/3NE3kd/dQUZUf+KeH/4urnSH7xb76knIfDUeewNzocDUa3b/fHI17HWmiAnfBuSfaL2n0Q2hDreCeyOzkutXP8ZiSee0vwtPXQdh8Nezvjbn88vDXojXqXl7J7lbP+wLl7sk+X+MR9urYvbhA+fhtTvBP4y5Uh9umab1l+pIW2vzo5LjVb83m9dvbS8NDC/tgX66mHb+T1b1f0anlshPw1vXj8bnlspNFKFFqG+qVG9wd+Sx15aedoZffmPLZopejE/5XFowU+W4801y58b67pxjoawMG59qsKc22V8VvqqSnmkryZ4Hvvf1wZ++2Vds7jmzd89bMYK8K8GPv6FGJM1iUcY/dducoxtmp3dQm1aXucqnGA+5hvKsSBdg7N8y3HAfKVtSLHwQX3EfstoxYHZfPVmd+L8izrd3lPyH5/8czvM7BufpezOPb7Kyvo99N6+yF9+E2QJiO/heg6JOsDOQDReMk4a/H6Hrx9BU/be7BNeE+VKrz5vvg18nmL6OeuntUEzee83+G3dYlik8jvb7PI96cDfqeMulieryez/7fAJtp+kn0u+J9ATL6ZzOJI3L4DOFc88SjrxHmy7wWS/QbItQ/fB6SHxMtNwHm7Yv7dLJHVGP/ZhmaDlmKDeXl9QHmtnREwfW0Nz3ktuO9SXvO5eu7qWU3Q8nqL5JV4+xj89B7Mc76Yep/8hPNalZgS/A+B9wfwfbckN+4Azq0KucExif0/qhiTd0p0NWbxmNRsOC8m71JM8hhroM5zYaLoxPF6j2Lyae0r2defg68+XcLXR9D/s4q+Pqrok6NI45TMM4veOWD+Me9rk9k2wf1yRfyOumrnSHLmVgV3twT3WViv/gDx+m2FeC+jhzLznkJwvwde31XMjR89eNcr4u0reL5xzfrxETAyE1tdPQAA", + "debug_symbols": "tdvbahw5EAbgd5lrX0hVJZXkV1lCcJJxMBjb+LCwGL/7yllLY7pq3PwFexN6gj73oSS1VFK/Hn4df7z8/n5zd33/dLj86/Vwe//z6vnm/m78en27OPx4vLm9vfn9/fN/H9L7P1T+lH96uLp7//n0fPX4fLikdnE43v06XEoa+vrm9ni4LOnt28WBKlhewfINLN+x8pzA8hksT175wh/lS9+WZ7C8gOULWL6C5RUs38DyHSsvbny7fJTPaRswySggFDAKBAUFBRUFbphzLlMQb0WDRUdFSbDIsHDDTXU+K1LZCoaFwKLAosJCYdFgcab77lN03YiaYJFhQbBwY86NPgT3uhUCiwKLCguFRYOF36XnWUtKLhuhCRYZFv6Lm9abpmz7RGVYCCwKLCosFBYNFn7M6+k9vhUtwSLDgmDhxlzL7Bm0GiGwKLCosFBYNFh0VPQEiwwLgoUf8zVa0r7tS7rAosCiwkJh0WDRUTHGmjjxo64nUg0hnDBOBCcFJxUnipOGkw6TnHCCRz/j0c9u9Fua74ZGyRDBScFJxYnixI1+ozqJsCEdJpRwknFCOPGjL/Mt0aqpMCQ4KTipOFGc+NHXOahvrRvSYeLn4r4mGSeEEz/6fWYJeiZDBCcFJxUnihM3+p1n0rOrJR0mZzJ1X5KME8IJ40RwUnDiZ+20rbRdFmM0YFrAdNz46bsdkwOGAsatBGMYmRYS0236ebw9VCKoRpBGUIugHkB+Zm8MkGkhNV21n9zbQxRBHEESQSWCagSdqRFt5cOHMqhFUA8gTRGUI4gCyE84jfe6TsS1GeSfabzb1pnEIo4gv0aIrkYomg3SyD21APITGLnruqfePl3ef0YDpgVMhw35eYwdkwOGAoYDxu26xm3OadO4et6aEjD+wlTKugyVrdGAafvX9umd9HbxavMFc8KsrW7/esfv3M997JgcMIQ/LT/9sWPk/3zCfqpkNNXTXydj/LavtFa6lbbZRfLzGDvIz2TsIb/5K6+3jko3iCKII0giqERQjSCNoDM1op7ipBb1AOIUQTmCziy7tznBGYcW9QDy5+x7yO+y6kpBkJr8IwlFEEeQRFCJoBpBGkF+jVDmhexOOn8Kv4P8OfweyhHkb2ZQnQ+CbRaf/CnvHmoR1APIn/LuoRxBFEEcQW574pZmvplbNn3Eub0tX6MaQRpA/kSU2xp7cM9qUI4giiCOIImgEkE1gjSC/JbbOS0k2aAeQP72lD2UI8iNk6RVYSWx3UVdIqhGkEZQi6AeQP6Wkj2UI4h8JLxQEYM4giSCSgT5ccqn/e9j3c+gjiP2syd7yI/TyGtMNDIfBvlPb4zOFhI1yG8aLOtMLPby/KfHKwE3Di3yn56c6p6Yfo/9TMIeyhFEEeTX8kpzHCGVySD/6UnN60zVIH+eK51WnDo1g/zg9iILle3cnc986JHX7HMcVoPER33W8jLSYQad2Z+pdSE193Tmu4nROCca1XOL/Old4bUoWdgs27A/vdtDFEEcQWc+OGnr6XEzFdZfyCvCC42ma5Afp5oXqrZplDMbY3XFqdrL8wfz5bSJsWjNBvn3pGsZtKhzJn//cUuzPZVmdlKzPy7fQxpBLYD8IbaUvDqWYvZEsD/wldoXqt0if2x02nk0Dk0j9Iej0tY3T9Jsv3dmgejL9Sv2R5Y1reldTd28Pv2R5R6qEaQB5I/3clv9Xu7JNA1/FDbG+HPtdBzaM/mzmrEGMgfzTl/uL2DtoRZB/qxmJGwWKlsk/toS00rLs/2ER/zFpfHamk1jHDaD/KcntJAQGeQ/iELrY5NC5vL8sdHoeGUhk8QQf5jDNa8HUTeX9zZ+/X31eHP14/b48dXt9cvdz08f4T7/83DcfI/78Hj/8/jr5fH4/mXu6aPcP5c8stcXWfu3952V7z87XeQu4zzjXP8C", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 8ac7300bf8b..0bf7e824dba 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -74,8 +74,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "td3fblNJEoDxd8k1F6e6q6u65lVGKwQMM4oUAeLPSivEu+8J4GMm3e0z9e3mBhHIz0ncX86xy237690fb19/+evl/bs/33+6++33r3cP79+8+nz//t3+0ddvL+5ef7x/eLj/6+Wv/3y3Pf7R4vvnf/rw6t3jh58+v/r4+e63UjZ7cff23R+Pfy22X8Kf9w9v735r27d/vbizDRgBpgBTgVFgGjAGjAPT56bGYdSfmsgb34ARYAowiw5cDuODUWAWHfj1e+vtqTFgFh10P0zUp6YDE3nTFx1Eu5i6yVMjwBRg5h3UrV5NPDUKTAPGgHFgOjCRN7EBI8AUYEAHAToI0EGADgJ0EKCDAB3Itggh9IJ06wMSggpBlSAlqBFkBDlBnaAASEgRQooQUoSQIoQUIaQIIUUIKUJIEUKKKIsbDb5d0XBgKUJQIagSpAQ1gowgJ6gTFABVUkSdF2F2nJ/MfECFoEqQEtQIMoKcoE5QAKQbQaQIJUUoKUJJEUqKUFKEkiKUFKGkiEaKaKSIRopopIhGimikiEaKaKSIRopopAgjRRgpwkgRRoowUoSRIowUYaQII0UYKcJJEU6KcFKEkyKcFOGkCCdFOCnCSRFOiuikiE6K6KSIToropIhOiuikiE6K6KSITooIUkSQIoIUEaSIIEUEKSJIEUGKCFJEgCLKthEkBBWCKkFKUCPICHKCOkGkCCFFCClCSBFCihBShJAihBSxmFl6KRfkqgPqBAVAi5nlCRKCCkGVICWoEWQEkSIKKaKQIiopopIiKimikiIqKWI+s6xbuexp2B8xrAMygpygTlAANJ9ZniEhqBBUCVKCSBFKilBShJIilBTRSBGNFNFIEY0U0UgRjRTRSBGNFNFIEY0UYaQII0UYKcJIEUaKMFKEkSKMFGGkCCNFOCnCSRFOinBShJMinBThpAgnRTgpwkkRnRTRSRGdFNFJEZ0U0UkRnRTRSRGdFNFJEUGKCFJEkCKCFBGkiCBFBCkiSBFBighQRN02goSgQlAlSAlazCPMD6R9QEaQE9QJCoAWM8sTJAQVgipBShApQhbHCOsH6jogJ6gTFACVjaD5MULKZUfnvigjKgRVgpSgRpARNC9C2tGe+DagTlAANJ9ZnqFFEXEZCu7NlAEVgipBSlAjyAiaF7HP0Q9UY0CdoABoMbM8QfMi9jnFgboMqBBUCVKCGkFGkBO0KOLYaL//bvuAAqDFzPIECUHzIur19t7+EwyoEqQENYKMICeoEzQvotpxCKv+9DnFdTGzPEFCUCFoXoRuxxWhMiIlqBFkBDlBnaAAaDGzPEFCUCGIFOGkCCdFOCnCSRFOinBSRCdFdFJEJ0V0UkQnRXRSRCdFdFJEJ0V0UkSQIoIUEedFlOEGVVSClKBGkBG0KKIeN+ZVh7t3i5nlCYo80sXM8gQJQYWgSpAS1AgygpygThApQkgRQooQUoSQIoQUIaQIIUUIKUJIEUKKKKSIQooopIhCiiikiPIPimgDMoKcoE7Qooh2PanZ07O7LmaWJ0gIKgRVgpSgRpAR5AR1gkgRSopQUoSSIpQUoaQIJUUoKUJJEUqKUFJEI0U0UkQjRTRSRCNFNFJEI0U0UkQ7L8JlQAGQbQQJQYWgRRH9evrsPiAlqBFkBDlBnaAAaDWzvI2EoEIQKcJJEX5exPA6j+pGkBPUCQqA+kaQEFQIqgQpQaSIToropIhOiuikiCBFBCkiSBFBighSRJAighQRpIggRQQoom0bQUJQIegfFBEDUoIaQUaQEzQvol0fDW9VBxQALWaWJ0gIKgRVgpSgRpAR5ASRIoQUUVZF6BW1AQlBhaBKkBLUCDKCnKBOUABUSRGVFFFJEZUUUUkRlRRRSRGVFFFJEZUUoaQIJUUoKUJJEUqKUFKEkiKUFLGYWe6n1VsoAFrMLE+QELQo4rrhtPlwy3IxszxBSlAjyAhygjpBAdBiZnmChCBShJEijBRhpAgjRRgpwkgRRopwUoSTIpwU4aQIJ0U4KcJJEU6KcFKEkyIWM8v9FHQLCUGFoArQYhYWF6PbNpCaJ5onLU8sTzxPep5Elth89rU/6nwhrQ9E8qTkSc0TzZOWJ5Ynnic9TyJNJL/6crb6w+++ScmTmieaJy1P5qt//Iq14T0sbD7Zuk16nkSazGdat4nkScmTmieaJy1P8qtf8qtf8qtf8qtf86tf86tf86s/n1y145VF27DVwuZzq9uknZHxvUenq7/fXz/I3x6HfzF8qvjlbT2ll+HS/VkvvT/rpcdzXvp8rrbfDPtJ9gPZQCRPSp5MG5Jtu5xAZCvjT2MEOUEdoPn0KfzyexGuA5leDXE8ZX76ZebXgtQDyfDMVptPXGRr1x/IhkWaT1zOkBBU5ui4Y7Sj4Tg0n7icISWoEbSotR+/r1uMaF6rbH4srgy3rGxR6/H2rzvS/+EoYvG8l+/bM1++PPPll+Tlf0eVICVoUa9f643xZzKCnKBOUADUN4KEoLI4Rsf1GD3cP5xPh86QEtQIWpx3TA/k4xXhBHWCAqD5jjaRdj2Xjndk5zvazlAhqIJTfShBjSBySyScoE5Q5JFvG0HTq9yOc4YNJ3qfj89uE8sTz5PpVW1Hp2YjiTSZj89uE8mTkic1TzRPWp5Ynnie5Fdf8qtf8qtf8qtf8qtf8qtf8qtf8qtf8qtf8qtf8qtf8qtf86tf86tf86tf86tf86tf86tf86tf86tf86tf86uv+dXX/OprfvU1v/qaX33Nr/587LWfdn6S/XgyEM+TnieRJvNtXbeJ5EnJk5on+XUxcutyMVErx65rGV+E0hcTtRM0v79RtB5oeFjTFxO1X79SG79SO0VWBzSv+vjufHjfNJ+Plvx44cW+lYFInpQ8qXkyvaJ7uYwGex1JOyM2EMsTz5OeJ9OjTT+OnH1Mcz7w6bod5G9h5sZ+Pp8M/d8uvTzrpddnvXRNXfp30vLE8mRR6kHqcATpPU8iTeaDqNtE8qTkSc2T6erH8dhZDI9g+Hz8dJtYnniezFc/jsf0hnG7z8dOt0ifD51uk/nq+3EAjW0gJU9qnmietDyxPPE86WkyH2zdJvMbUDcOsH0+P7pNLE/mo9rwy+YEiV9fivuH6cBE3sxHSCdGgCnAVGAUGLA+dXG9HZs1ylbsqQHXweINVrft+nV+Pdr+MApMA2b+/jab+PU6aE+NA9OBifOf59f1GW+Z7XfRLp/an57PuoLlVwGmADM/QpXteASviD81DkwHJvJmPus4MQJMAaYCMz9E1X7cZ9fhXQz6fIfTGTKC5inU4/18pqgTFAAtRj8nSAgqBM2DuL5i5f5XG5AS1AgygpygTlAAtNj2dIKEoEIQKcJJEU6KcFKEkyKcFOGkiMUGJW3bgYYRZ19sUDpB83Vqetykazbc51xsG7qNFhtfWhzfnkkbUCVICWoEzdtrfixuG15Yri82vpygTlDkUSw2vpwgIagQVAlSghpBRpAT1AkiRQgpQkgRQooQUoSQIoQUIaQIIUUIKUJIEYUUUUgRhRRRSBGFFFFIEYUUUUgRhRRRSBGVFFFJEZUUUUkRlRRRSRGVFFFJEZUUUUkRSopQUoSSIpQUoaQIJUUoKUJJEUqKUFJEI0U0UkQjRTRSRCNFNFJEI0U0UkQjRTRShJEijBRhpAgjRRgpwkgRi1mY1WO+Z8MmsljMwk5QJygAWszCTpAQVAiqBJF1WsyN7Po0JhueXh+LuZHXA3nbBiQEkSIWT82y4yWLxYZHxWPx1KwTJAQVghZFXJ8WOD63JhYTqhPUCDKQ0WJCdYI6QaBy2RYjqjMlSBWkKlKKlOfnvrvqSAVRsiElSBWkKlJK1GJm0I8XdJFx/9muDClHKr93Z0cBUN0IEoIKQZUgJagRRNYJ7OLYEbki5veWb27J2VEjyAjK7+TZUScoAJrfW85sALq5i2P/AiSEVgiqANli41gcV9p+wcOhyxSphpQh5Vn1bf/o368+3r96/fD2024e//PLuzef79+/+/nh5/98uPzP64/3Dw/3f7388PH9m7d/fPn49uXD+zeP/3e3/fzj9++vWSH7yXz/fh6v5FpfaP3+ve0ftP3W7v6g5+OH8uNztxf7H2X/Lvbv5L8=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_0.snap index 428103e214b..cc5a5f53cbb 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_0.snap @@ -74,8 +74,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index b5a9718669b..4942c10b0f3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -70,8 +70,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1dS48cVxWuR9fMVD/cPR7P2IkdPwAhBFHUPdPjGS8Qk0Bix5ZAiEiREIo8M3YLRUFEICHBqjdZAWIVRSwQO34AqwhYJShIiBVsUMQKIRaIFfwBXHad7q+//qq6rLm3p4d0Sa3quvfc75x7zrnnPupxw+DJsfroF+b/a3TO0pNg8jDag/zcPdnRc4jV9SVjeAZkjM6AjPEZkLHmQUYfciZnRM6VMyLnqic5gzUSOmuoWUPIHC0zYqag1aD4sIr+IH5yTvPrCPIdNqxeSnxd4u93+8epqJ9D+XfSYLLjcoy/b/grfvC75gtfGY7xsS7GNyY6LhMCzctA83IBzStA80oBzW2guV1Acwdo7hTQ3AWau0ATAc09oLlHNClgBoFzH+17tvFuK5geXFldjPeqH943Q+IXBGOdY57xrwde21MvJH4mD+vH4l3LaIZjeULKqw2n62F5CeSZfbMYfQPo2LcSyjNZsuPV4WReDHl3Ka8GeebTGe/nQY4X8v+effw4pbq4jmMbQn7klR2rw7E+TG8xpCWgv8f6QXrKSyGvNpzkU8+va8AHsUyOhOi/kF+38/MKlLHyHcF/hfhPyC3SWC+poE8Ffea/n8n/N4Lx2ODLwzGeO5v2uhmPzEe/Go9l4zjJ/sRtGemLMDjWeO7TdzkGJTPkNnnWIC9wJ0/X5DF74oQc+4U1kBfpb5GcdT96656n+iMv1Y+5nEi3SAcoR0r6cNwOelX7UONfD6b9xUcfmpI8rJ+I9OPHL3oj/60LeepCP2bLhsgzrGZ+jW0T6etQR6TH/1Ye0+7k547AZN9tBNP1wTSMyy9R3dA2YcHZcDktIhlRN2ZfFZN8+JjSQSjkaQfT9m6QrKhrh7Ghzz7TAB5l8pzzIs+4PbSF3tBPmb+NLSJIa5fQt+ia8TvEH8tjWaQpky8WZZuEo3Trsg9KhV4c4m+npDvHfX0vIR2+l5+zGPIt0neL6ohjEm772W8dsGJBY2UTor+fnzPa1/KAZHEM2885wD8i3oitYn+beBv9ADAfwv8/PCV+q0AXQQH9WoE8b4IM71aQYR1okgLM7+TnjOfr8SSmjalQzhDSIpJhQ9DjuMzkaQfT/rJBeVguLeATAR9sc3Wiv5BfY+xF3hx7t6j8QX7dPdExjr0XSUcoo+J/CerLGIp+k64Z/1KBftB30JY2h0uI/kf5GX1HrYmYLUdzCMhzORbO5PgmxQiT9bH8w8l6b0FeLOjZvy8KetS96awTTNuIbaLa1gbQcPy08isF9IaXEP07+TnDexvW7ZVMB/l190TH2M+3qH7c7pi/6Qv9fKuEfoOuGf8i5asYiXZgPzf6n4AOy/zcfOc0/BzXMdjPNyEvFvTs56pdoO5NZ51gdhvA2G08sf9SfTmOFawvT4m3L5/doHqzbMz/AuhQ+SXTr9M1418o0IvlF+niNNYUjH9d1MPHfE/FTNRPRLpTduiIPLaJGsdsCD4Ka3WJtcRaYi2xKmKpftJimsUxnD/auDDrGz8keawcjm+wLM8Bjf56PMb8CPBtnqvmayYvr29nx0F+7p7s2GZ9REJXpuOYrrP/uNZqaQ26rgusQGBhWZShLWTiezO+7nmwXLWgfG07EvVAfSSU9pf8nPnc92ltQK3vYxr7/px9Z5frZ3WLhBxc749JPlxH9H3PCnkV6Vmts7VL6sd+UoTVJiwsX7Ze7vKZKZO1NUPWBsmKemvNR9bR2n77KWVtCZ1XxUoIqyGw1JwwJJ14WqOu/EyP8a+LOvqYO5TpNTt47rAuZO2IPO4j1NruuuCjsFKHWE2HWFXWr6ticRxh/R3k192THQN1390hfs/zfcNj1fc4xD9KC2zrCH/f2hG2O45B6BenEYOMfz3wGhN7Ze0G9cMxSN076Yg8bkNqneS84KOwUodYDYdYTYdY5vPqGcqw4Gx8OI35oC06xAcx8X7luXCcjjbAeRyW5Xmc0W/APG49L9CmMihjQnmbeRnfz2OqcS8/D+SnXzjaV8/vucPfH6jntd3h3+z57dce3lRzVnf4gyO//eaDQ7/95v6O335zMFDjc4f4h6rvddi+Hvq9T7Mz8s8NL/j9Ufu64AW/t+353uuO32cY9kbvo1z0gr8/eobqkh//uWX4z/jR/2jc+2wwPnjcexnS3fWr25Xv2xn/OsnquJ8fjXsvkzysHx73XhGydkQejxGuCD5XBB+FlTjEWnGIlTrEqjvEajjEai5oHVsOsdoOsdYdYp13iLXhEOuCQ6xNh1hbDrEuOsS6tKByPeMQa3WJtcRaYjnBsrEWjs3CgrPx4TRes7lCch7k190THbf6JutzQlbjfRXST2NMbfzrJKtbecZj6qskD+uHx9TXhKwdkcc2vCb4XBN8FNbqEmuJtcRaYi2xllhLrCXW/zmW5eH6ro3JUroOA6fj1K66x4zPCr8fTtbXxoBF95ifg3ykD+Ae82/zAnaPGdeRTQdtoZNnSSd+xu7j52PNVvh87FUhaxRM2xZ9IKG0D/L6q+dj1Zo3prE/Kd2VzdFSIetpzHuMfz2YtrOPec+1ino13V0XsnZEHs97rgs+1wUfhRU5xEocYq04xEodYtUdYjUcYjUdYrmsY8shVtsh1rpDrPMOsTYcYl1wiLXpEGvLIdZFh1iXFlSuZxxirS6xllifYKyFeY42Cibqhs/JVpnjGP1/ozHmev6/LcpHVN7yNvOMRXiOlvNc8B4MBjvqOUtX+HuPGJjs+B3MSPCMqb4tD/Jkh8lzjvCZZwzyovxXwKeu5v/5u5Hsz9dL6GJBNy+bpDNsEi6YTUKyicn/WbDJ50jXRd8W+3wJXSjoOBbFICPak3HwPSlLx9hd9O7qC1Cn7hz8Au3A7xgwT57L2nw0Anqmwf+RwMe+hN+79hH7VH1rIE8k5Of+ZY/s4uv7/ap/YB0t43e1+P1FaFdfqhi/X6wYv19csPhdWzCb1MgmJv9tsMmrFeP3vRK6mqCbd/z+GtTp62c8fteIvmr8Pml8fX2B4ivX2QXvR01512fbxFiB3yIti5fq27o+fLRN+MyT47fJ/wa0q/sUA7CNjvZXePQ7KqGLBd28bFKfYZNowWzC82ST/9tgkzdJ140Cm7xVQhcJOo5VGL/V902Mvgk6tHQV7/kb7m9Dnb43B79AO/DeF8yT46v1Rxi/i/bPKOofMH6vBpP1XfFT3z7Lj/2D2iODx3I/JLt4+k697B/WKug0JHmyo2wvoDjQ/TPixqQDtl1UoA9XdtvvTu8lgvFL7SWi8njvgiK8ROCxziOBy/wwT21GivQ8Pn0nZ4DfLlfv986rj+B7fShPx4M8XbA5fzOHeYakQ5P/xxBPf1oS+/GbsT8roQsF3bxs0pxhk2jBbML9tsn/LtjkPdJ1q8AmPy+hiwQdx3jst9GevM53DnRo6Tg3a1KdjP4XUKdfzsEv0A6rhM88i+IR9tuMgfSz+hj+Hp+nOctx1X6b/c7of0V24fH4gQM5s0P126yjxIOOHh3brKMAdKT6n1ZQ3B+pPp/ljoUua0QTUjrGr6Lx8dP088ovghly8TghEPi1Cvhrgp797tfQj/M39H3MrWat1an57rxiFfcPzJPn3yb/+xBff1OyBmf4Gd3vSuhiQTcvmzRm2CRZMJvw96JM/g/AJr8nXTcLbPJRCV0i6Mr6cdUvGz1+w9PS1Xyd9yz6I9TpT3PwC7SD6seRJ/fjGL9UfOT5nIrLOIfjeGp52M/inJzjndH/mfTmaf9f2c/yGsJp358KSZ5Fu5dt8v8V/P5jaqNF96f+VkIXCrpFuT+VLJhNir7H93ewyT9K+jK0yT9L6BJBx7HB9/2pf0Gd/j0Hv0A7qPin7lsavbo/VbSGw7FUzZN4/dTyiu5P8VjI6P9DeqtRmQNHelPx1Xhl9iz7NiTHxyAYzxXUt5u47SI993tBUL6nQBnW5RLeao/XtIQ3ylUv4F0Lpv1J1WlFyJSIuqnnG4vue2I90IbWrsvWhPF5SKuveufJyvN7REU8Lf16fo3PViIGP1s5os8bhdpv8EYwXe8yX/uUoL8BNCZPm2TAsmofL9PTyAcgz+U7Vmofr4n3zYaz9aPeUayqH7Nvh+hRV+qdxmuEob5FUdVfrSy+o6j2H+C6le1lEAj6pqBX68Jqr+BmBax2CW+1l0GzhHfZ+qaVw7ik9hHmPJQpFXVTcakoJmI9qtrZyqrvHc/at4bv4xn9p+Fd1HsUS9ZLZA2CaRup70mrb+Ar/zhPeWXf9D8P/Nl3lL3x3aWYMFDnRm/vJxXts8v7RBr98xCXX4s1ZtW9q5f7p1bbP7Uv+kLVH5k/+e2Pzsb+qX6//zv2sU2Sk32e+W9BnZUfMf2sfSDZJ1WMLNu71Ohfquhjp7l3KY7b2cfUHmtqz0fWOdKX7QOJNuI9FtQ9RNXXqHmH2rNN3ftE3A/z/z5tsLf/ZD79WNYc33yKjxrkI/03cmL0VzvXTiDnYO+wN9g5HBzuHj540D8+5Plrdpi9Gx74b+/v37y1fdTt7z04Hjzo78yb//HuzaPj/u5h92HvsTiz+I+eixuO87FNZ8dqfm3fvmB6vNeK9G/A2Oo+xY1E8MvovltCFxacH2OItNpwMi0dTtPHw2l6410fTstoeQ3Iw3iTHc38GvWFWCZHQvRv5cRmkzUoY+U7gv8a8Z+QW6RhvGOsWKQZfWafh9Ruse4O151G3w5ZIXxMY9nMd3y0q0dNau/4cK/Xu9XvPez3dufdrg/3dvaPt/vHe0e7O4c7N2fGtf8BcpfKnRGbAAA=", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 64c55e6f085..2080474af3e 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -150,8 +150,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdzbTuNKEIXhd8l1Lrqrq6q7eZWt0YhDGEVCgDhsaQvx7tuZwQlDtyfyr+kbhBGfFtjLp0rit83N7ur1x/f9/e3D8+bin7fN3cP15cv+4X5aenvfbq6e9nd3+x/fP/94Ew5fPP/8/efHy/vD4vPL5dPL5iIl32529zebC41h8rf7u93mwsL7t+3Gy2pR14ocVou4WshqkVYLXS1stfDVYvU2z6u3eV69zcvqbV5Wb/PS3eYajyKVryKtFrpa2Grhq0VeLcpaUbsZYiV/EPHYmAJMXW9iCARFgoSgRJACFPv7mVv4QMlzaFAkSAhKBClBRpATlAkqBFWAhDRCSCOENEJII4Q0QvqNyNFmlLM1yAnKBBWCKkApEBQJEoL6jcjBT8gbpAQZQU5QJqgQVAHSQFAkSAhaaoT9CSlBRlB/lYd6PBpJbFpugaBIkBCUCFKCjCAnKBNUCCKNcNIIJ41w0gg/3witDVKCjCAnKBNUCKoA5UBQJOh8I3L8jLbNL8eay3xjEkJqEtLwBB2eYMMTfHhCHp5QhifU0Qn9UVKqNt97p+raoESQEmQEOUGZoEJQBagGgiJBpBGVNKKSRlTQCOnPsqY7nHnXmG5BrEGJICXICHKCMkGFoApQf6g33UKkGVlzSpf+UO8cEoISQUqQEeQEZYIKQRUgIY0Q0gghjRDSCCGNENKI/gBsOn8fd8JSUoMiQUJQIkgJMoKcoExQIagCpKQRShqhpBHaf+1NsszXsFJygwpBFaD+LOscigQJQYkgJcgIcoJII4w0wkgjnDTCSSOcNKI/LNKQ5zGvxlAatPAiu5xQe4ndHxZNSXpCzfVef1ikscQZiX6dQkt/WPQ5aTqMNKi7ylV8Pn3qNC1qkJxLStL8T/3JhgepH8iD/rbK23t2i8c3f9h039wk5OEJZXhCHZ3QfyPOX02IwxNkeEIanqDDE6yfYHpMqM1BrjhBmaBCUAWoBoIiQUJQIohcGldwaZz6b62aznphnrZO30c5Mv+lIlKCVEJKkbIFJemkkn9VjlRGqiBViYoBqYjUUjesnFQJX1VCSpEypBypjFRBqhIlAamIFOqGoG4I6oagbgjqhqBuyFI36ul46M3xUCpRKSAVkRKkElKKlCHlSGWkUDcS6oaibijqhqJuKOqGom4o6oaibijqhqJuKOqGoW4Y6oahbhjqhqFuGOqGoW4Y6oahbhjqRn+m9+ePSyTPBBWCwMdaUg4ERYKEoERQdzuZHwe207fNTWh/tncOFYD60yvzGo+oSoO6+6+VeEwqGhvkJCkvJKVjkrT/U39FlPTpzwsNqgD1Ry3nUCRICEoEKUFGkBOUCSKNqKARGgJBkSAhKBG00AjJC7t7b3br9TS7TU2CDU/w4Ql5eEIZnlBHJ8QwPCEOT5DhCWl4AjiFa8wEVYAWZlV1eh1pviauUvPv18S6MKs6pwwpRyojVZCqRC3Mqs6piJQghbqRUDfS+m68Twv/Xj7tL6/udh9PLLl9vb/+9ACTl/8ed1+eZfL49HC9u3l92h2eanJ6oMlhW6imrboerkgOS741/3b4uPy0MN0gVjssHNZ+rGUrIUz509/wPw==", + "bytecode": "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", + "debug_symbols": "tdvbais5EIXhd/G1LySVVKXKqwzDJgdnYwhJcJKBIeTdR97jQ8ZSj+mf3TfBbfyx3GF1t1V2f64eNncfP39snx9f3lY3f3yunl7ub9+3L89t6/NrvbrbbZ+etj9/fH96FfZ/1H69/u319nm/+fZ+u3tf3eSo69Xm+aE9ktr84/Zps7op4evP9UrrbOFzhYXZIs4WabaQuaLOF3m2KLOFzhazW1Jnt6TObonPbokPWyJawoGIWrg0CRgBJgNTgFFgDJhhA8RiORqzcml8vokhEBQJSgQJQZmgQtC4Dhb0jLRDRlAlyAGKgaBIUCJICMoEFYKmGlH+DxlBFaA03qfgp3NRil3LkxJkBFWCHCAJBEWCEkFCUCaINEJII4Q0Qkgj5Hojsl+iHAiKBCWChKBMUCFICTKAyvhf7sWOyDV3KBEkBGWCCkFKkBFUCXKANBBEGqGkEUoaoaQR4yV5LEEOqBWtOzTGq/JrSAjKBBWClCAjqAI0HlK0p+sR1SodygQVgpQgI6gS5ACNJxfXUCQoEUQa4aQRThrhpBFOGuGkEQ4akUIgKBKUCBKCxjPAYMflXW4zgQ5NjAHTGXWXmjRe8LekfEalQxMj4xqPKGXtULqWlLJ1aDwGTiqnSWXq9ylfS5LU7xO4AKToAKVAUCQoESQEZYIKQcNTmIbkB6Qh/+fQWHcvLm0Je3hxaZfjLsEWT6iLJ/jSCeMZym9NiIsnpMUTZPGEvHhCGSeUfErw7mIkSpARVAlygHIgKBKUCBKCwOe0NpcBqIwve+3548CnPY7pxPRfFZFKSAlSGakyoZKcleilUqQMqYqUE6UBqYjUVDdKPasaLpUglZEqSClShlRFyomygFRECnXDUDcMdcNQNwx1w1A3bKobfj4fanc+NCeqBqQiUgkpQSojVZBSpAwp1I2KuuGoG4664agbjrrhqBuOuuGoG4664agbTrohISAVkUpICVIZqYKUImVIVaRQN8Y/4ilq6bhGVrtc3Mj4RzzXUAVoPAgs6vGEPHVo2ItS4ymp5tghJUk2kSSnpNTv0/gfUeXb2wsdcoDGU6trKBKUCBKCMkGFICXICCKNENKITBqRSSMyaUQmjcgTjUg2cbiPZoLq55lgd8TmsniCLp5giyfUxRN86YQSFk+IiyekxRNk8QRyCS9GkAM0MR/ztpQ9ftbytjC4+Kw1MR+7pgpSipTNVl9t46/b3fb27mlzuIvs8eP5/ttNZe9/v24u7i973b3cbx4+dpv9nWbnm8z2B5+0b/3Fdf9u2lbWddk//vXFvem6xv3G/hCKauvWoZbf3sM/", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_0.snap index d6eed6a3b75..c7e65ce4d0d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_0.snap @@ -150,8 +150,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "7Z3dTuMwEIXfJde5sGfGf7zKaoUKFFSpalEpK60Q775J1SSQsM6ujNvY4xvUwjA65yRpPrfp5K16WN+9Pt1udo/7l+rmx1u13d+vjpv9rnn29l5Xd4fNdrt5uv3460q0P5Q71b88r3bt05fj6nCsbkjqulrvHppHaJv/f9xs19WNEu/1pBS1Euda1EbMFAvXF4NU/mKJ2p6LJdpPxT/rSotUhctUhUOqwjFV4ZSqcJWqcJ2qcLNc4UpgJ1yR8xdrAe5crAXNaFZNJudiJS3NFGsDXbE2OM7PlvyC8lswR6SQn1kwziSRX9n/ZvNzss/PwSg/u2C4W0h+Vvb7nyU5zm/BjPl/+Snq83MzmqUD21U3j53py/UpEyqZTDJZMBlfLZMFQ/fVMsmG578xk2wY/RszSZJ7GuEuSeBthS/4/Tu/8CQRrxWeJFu1wilV4UlSSis8SZRohV/vfD93upIW+zcercWZYlCia908lvD5dOUsD5uOhU0pBBOfkolPyMYn4OAT9dgnMvFJTHwqJj41E5/50JDfZz445PeZDw8pO/i0YuRT5sNDfp/58JAbeEhPeEjmw0N+n/nwkN8nMfGZDw/5febDQ36f+fCQ32c+POT3mQ8PeX1CPjzk98mEh4AJDwETHgJi4pMJDwETHgImPARMeAiY8BAy4SFkwkPIhIeQCQ8hMfHJhIeQCQ8hEx5CJjyETHiImPAQReShU3+I3B8j96fI/VXk/jpyfxO5v43cP/j1zEjV9Tdm/OV3qUTk/jJyf4jcHyP3p8j9VeT+OnL/4OPXCD301zPFTpmu2OmZr7WSMJ1yksJOlNvlKm/Our3yz8Un5W7JmdOgfLK3hI82ipi57b5ETkB6olwmkTmQmSiH5SoHjb0KmOzn4dONLpI5wnQ/Dz9rCPUX5af+KnJ/Hbl/mWkRNNNClqEq/zDUopOhLOAkwCS/63rZAPHDVJDJwseUsSqBAWYzV+VaAVIJMCzAbCa2XCvAbMa7XCvAMtsxMMAy3DEwwLISCQvQlpVIYIBlJRIYYFmJBAZYViKBAVIJMCzAshIJDLCsRAIDLCuR2QDBDAHKuc7aDZ1nrjH6zk9185mkmft29H/Gneb0T57Ho+8T/zSHobI8Hr3XP6Q5G5b58fjF1SBpjsrluB3918akOTmY+fH4xZVCaQ5Svux29N2dRLqycAsMsJB2QIDvzbNfq8Nmdbddn29J+vi6u/9wh9Lj7+f16Galz4f9/frh9bBub1s63LG0RWWQpga0zYZpX+BJ10q3G+n0JwE1CNM+bWEM0NVAslHQqPgD", + "bytecode": "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", + "debug_symbols": "7Z3dbptAEIXfhWsudmb/8ypVFTkJiSxZduQ4laoo715ABhxIFylrhHdmbyrTTEbnHCB8K8PwUTxVD+8v99v98+GtuPv1UewOj5vT9rCvtz4+y+LhuN3tti/3l/9diOYf7dv6t9fNvtl8O22Op+JOgSmLav9Uf5Ku/v3n7a4q7rT4LCel0mhxrpXGipli4ftiBB0uBi3kuRi08j8u/l0WRrBwCSxcIguXkoVLxcKlZuHSsHBpabg0Av252Ag1o1mD7PxpcGqm2Fjsio2V4/xczi8qPyK8tlZ+lggJrpZfPv5m8/PQ5+dxlJ8jQq8L5uegP/6cgnF+RLjYCK36/PyMZvDouur6s7d9uWkzUTmTSSZEmPuqmRAh9KtmQobnr5gJGUa/Yibrcc/sgtVJ1wl3Ts4UoxZd6/oz4FebXvCwCTxsIg+bkodNRcYmysGmNCObmodNw8Om5WHT8bBJh4JCNkHQwaCwTzoc5IcrpxlfOUHQAaGwTzokFPapmPikw0Jhn3RgKOyTDg2FfdLBobBPOjwU9Al0eCjskwkPARMeAiY8BIqJTyY8BEx4CJjwEDDhIWDCQ8iEh5AJDyETHkImPISKiU8mPIRMeAiZ8BAy4SFkwkOSCQ9JJjwkmfCQTJKHWuUqWeVJMkurPEkKaZUnyRWt8iRJoVWe5LW/Ua6SvJq3yqOvzxZ0J8ZaPemPC/eXC/dXC/fXC/c3C/e3C/d3C/eP/ptjhRn6m5lir21X7M3MY31K2E65AuHGyrW4XeU1RfbKvxa3yuGWM1eD8snRovGGM3fdQ7QKlZkol0lkjspOlKvbVY5G9ipwepzrJDKXOD3O468aQv9HedvfLtzfLdufytyotZ7pByojqRZ9qL+ToR1OuJ3KtKslA5QXUxHEJECVA4wLkMy8gLUCJDNcYK0A82SxyADzaLHIAPNsp7gA83Cx2ADzSiQywLwSiQwwr0QiA1Q5wLgA80okMsC8EokMMK9EIgPMK5HIAPNKZDZAtEOAMNfZ+KHzzD1z1/xW1+UFUSL7Mfwdt8vrsmTOx9A3/nn6dDLnY/D+BzpTsBmdj9/cDUJncjf1/Ri+N4bOtHFG5+M3dwrRmZC+ztsZwOWFW1yAPpN2RICf9dafzXG7edhV51dfPr/vHy/ehHn6+1qNXor5ejw8Vk/vx6p5PebwZsxm6YrClyhFvWMa4FKm1KbZSc2PwKsSvG82m12GEupKWSuoVfwD", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index d6eed6a3b75..c7e65ce4d0d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -150,8 +150,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "7Z3dTuMwEIXfJde5sGfGf7zKaoUKFFSpalEpK60Q775J1SSQsM6ujNvY4xvUwjA65yRpPrfp5K16WN+9Pt1udo/7l+rmx1u13d+vjpv9rnn29l5Xd4fNdrt5uv3460q0P5Q71b88r3bt05fj6nCsbkjqulrvHppHaJv/f9xs19WNEu/1pBS1Euda1EbMFAvXF4NU/mKJ2p6LJdpPxT/rSotUhctUhUOqwjFV4ZSqcJWqcJ2qcLNc4UpgJ1yR8xdrAe5crAXNaFZNJudiJS3NFGsDXbE2OM7PlvyC8lswR6SQn1kwziSRX9n/ZvNzss/PwSg/u2C4W0h+Vvb7nyU5zm/BjPl/+Snq83MzmqUD21U3j53py/UpEyqZTDJZMBlfLZMFQ/fVMsmG578xk2wY/RszSZJ7GuEuSeBthS/4/Tu/8CQRrxWeJFu1wilV4UlSSis8SZRohV/vfD93upIW+zcercWZYlCia908lvD5dOUsD5uOhU0pBBOfkolPyMYn4OAT9dgnMvFJTHwqJj41E5/50JDfZz445PeZDw8pO/i0YuRT5sNDfp/58JAbeEhPeEjmw0N+n/nwkN8nMfGZDw/5febDQ36f+fCQ32c+POT3mQ8PeX1CPjzk98mEh4AJDwETHgJi4pMJDwETHgImPARMeAiY8BAy4SFkwkPIhIeQCQ8hMfHJhIeQCQ8hEx5CJjyETHiImPAQReShU3+I3B8j96fI/VXk/jpyfxO5v43cP/j1zEjV9Tdm/OV3qUTk/jJyf4jcHyP3p8j9VeT+OnL/4OPXCD301zPFTpmu2OmZr7WSMJ1yksJOlNvlKm/Our3yz8Un5W7JmdOgfLK3hI82ipi57b5ETkB6olwmkTmQmSiH5SoHjb0KmOzn4dONLpI5wnQ/Dz9rCPUX5af+KnJ/Hbl/mWkRNNNClqEq/zDUopOhLOAkwCS/63rZAPHDVJDJwseUsSqBAWYzV+VaAVIJMCzAbCa2XCvAbMa7XCvAMtsxMMAy3DEwwLISCQvQlpVIYIBlJRIYYFmJBAZYViKBAVIJMCzAshIJDLCsRAIDLCuR2QDBDAHKuc7aDZ1nrjH6zk9185mkmft29H/Gneb0T57Ho+8T/zSHobI8Hr3XP6Q5G5b58fjF1SBpjsrluB3918akOTmY+fH4xZVCaQ5Svux29N2dRLqycAsMsJB2QIDvzbNfq8Nmdbddn29J+vi6u/9wh9Lj7+f16Galz4f9/frh9bBub1s63LG0RWWQpga0zYZpX+BJ10q3G+n0JwE1CNM+bWEM0NVAslHQqPgD", + "bytecode": "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", + "debug_symbols": "7Z3dbptAEIXfhWsudmb/8ypVFTkJiSxZduQ4laoo715ABhxIFylrhHdmbyrTTEbnHCB8K8PwUTxVD+8v99v98+GtuPv1UewOj5vT9rCvtz4+y+LhuN3tti/3l/9diOYf7dv6t9fNvtl8O22Op+JOgSmLav9Uf5Ku/v3n7a4q7rT4LCel0mhxrpXGipli4ftiBB0uBi3kuRi08j8u/l0WRrBwCSxcIguXkoVLxcKlZuHSsHBpabg0Av252Ag1o1mD7PxpcGqm2Fjsio2V4/xczi8qPyK8tlZ+lggJrpZfPv5m8/PQ5+dxlJ8jQq8L5uegP/6cgnF+RLjYCK36/PyMZvDouur6s7d9uWkzUTmTSSZEmPuqmRAh9KtmQobnr5gJGUa/Yibrcc/sgtVJ1wl3Ts4UoxZd6/oz4FebXvCwCTxsIg+bkodNRcYmysGmNCObmodNw8Om5WHT8bBJh4JCNkHQwaCwTzoc5IcrpxlfOUHQAaGwTzokFPapmPikw0Jhn3RgKOyTDg2FfdLBobBPOjwU9Al0eCjskwkPARMeAiY8BIqJTyY8BEx4CJjwEDDhIWDCQ8iEh5AJDyETHkImPISKiU8mPIRMeAiZ8BAy4SFkwkOSCQ9JJjwkmfCQTJKHWuUqWeVJMkurPEkKaZUnyRWt8iRJoVWe5LW/Ua6SvJq3yqOvzxZ0J8ZaPemPC/eXC/dXC/fXC/c3C/e3C/d3C/eP/ptjhRn6m5lir21X7M3MY31K2E65AuHGyrW4XeU1RfbKvxa3yuGWM1eD8snRovGGM3fdQ7QKlZkol0lkjspOlKvbVY5G9ipwepzrJDKXOD3O468aQv9HedvfLtzfLdufytyotZ7pByojqRZ9qL+ToR1OuJ3KtKslA5QXUxHEJECVA4wLkMy8gLUCJDNcYK0A82SxyADzaLHIAPNsp7gA83Cx2ADzSiQywLwSiQwwr0QiA1Q5wLgA80okMsC8EokMMK9EIgPMK5HIAPNKZDZAtEOAMNfZ+KHzzD1z1/xW1+UFUSL7Mfwdt8vrsmTOx9A3/nn6dDLnY/D+BzpTsBmdj9/cDUJncjf1/Ri+N4bOtHFG5+M3dwrRmZC+ztsZwOWFW1yAPpN2RICf9dafzXG7edhV51dfPr/vHy/ehHn6+1qNXor5ejw8Vk/vx6p5PebwZsxm6YrClyhFvWMa4FKm1KbZSc2PwKsSvG82m12GEupKWSuoVfwD", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 64c55e6f085..2080474af3e 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -150,8 +150,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdzbTuNKEIXhd8l1Lrqrq6q7eZWt0YhDGEVCgDhsaQvx7tuZwQlDtyfyr+kbhBGfFtjLp0rit83N7ur1x/f9/e3D8+bin7fN3cP15cv+4X5aenvfbq6e9nd3+x/fP/94Ew5fPP/8/efHy/vD4vPL5dPL5iIl32529zebC41h8rf7u93mwsL7t+3Gy2pR14ocVou4WshqkVYLXS1stfDVYvU2z6u3eV69zcvqbV5Wb/PS3eYajyKVryKtFrpa2Grhq0VeLcpaUbsZYiV/EPHYmAJMXW9iCARFgoSgRJACFPv7mVv4QMlzaFAkSAhKBClBRpATlAkqBFWAhDRCSCOENEJII4Q0QvqNyNFmlLM1yAnKBBWCKkApEBQJEoL6jcjBT8gbpAQZQU5QJqgQVAHSQFAkSAhaaoT9CSlBRlB/lYd6PBpJbFpugaBIkBCUCFKCjCAnKBNUCCKNcNIIJ41w0gg/3witDVKCjCAnKBNUCKoA5UBQJOh8I3L8jLbNL8eay3xjEkJqEtLwBB2eYMMTfHhCHp5QhifU0Qn9UVKqNt97p+raoESQEmQEOUGZoEJQBagGgiJBpBGVNKKSRlTQCOnPsqY7nHnXmG5BrEGJICXICHKCMkGFoApQf6g33UKkGVlzSpf+UO8cEoISQUqQEeQEZYIKQRUgIY0Q0gghjRDSCCGNENKI/gBsOn8fd8JSUoMiQUJQIkgJMoKcoExQIagCpKQRShqhpBHaf+1NsszXsFJygwpBFaD+LOscigQJQYkgJcgIcoJII4w0wkgjnDTCSSOcNKI/LNKQ5zGvxlAatPAiu5xQe4ndHxZNSXpCzfVef1ikscQZiX6dQkt/WPQ5aTqMNKi7ylV8Pn3qNC1qkJxLStL8T/3JhgepH8iD/rbK23t2i8c3f9h039wk5OEJZXhCHZ3QfyPOX02IwxNkeEIanqDDE6yfYHpMqM1BrjhBmaBCUAWoBoIiQUJQIohcGldwaZz6b62aznphnrZO30c5Mv+lIlKCVEJKkbIFJemkkn9VjlRGqiBViYoBqYjUUjesnFQJX1VCSpEypBypjFRBqhIlAamIFOqGoG4I6oagbgjqhqBuyFI36ul46M3xUCpRKSAVkRKkElKKlCHlSGWkUDcS6oaibijqhqJuKOqGom4o6oaibijqhqJuKOqGoW4Y6oahbhjqhqFuGOqGoW4Y6oahbhjqRn+m9+ePSyTPBBWCwMdaUg4ERYKEoERQdzuZHwe207fNTWh/tncOFYD60yvzGo+oSoO6+6+VeEwqGhvkJCkvJKVjkrT/U39FlPTpzwsNqgD1Ry3nUCRICEoEKUFGkBOUCSKNqKARGgJBkSAhKBG00AjJC7t7b3br9TS7TU2CDU/w4Ql5eEIZnlBHJ8QwPCEOT5DhCWl4AjiFa8wEVYAWZlV1eh1pviauUvPv18S6MKs6pwwpRyojVZCqRC3Mqs6piJQghbqRUDfS+m68Twv/Xj7tL6/udh9PLLl9vb/+9ACTl/8ed1+eZfL49HC9u3l92h2eanJ6oMlhW6imrboerkgOS741/3b4uPy0MN0gVjssHNZ+rGUrIUz509/wPw==", + "bytecode": "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", + "debug_symbols": "tdvbais5EIXhd/G1LySVVKXKqwzDJgdnYwhJcJKBIeTdR97jQ8ZSj+mf3TfBbfyx3GF1t1V2f64eNncfP39snx9f3lY3f3yunl7ub9+3L89t6/NrvbrbbZ+etj9/fH96FfZ/1H69/u319nm/+fZ+u3tf3eSo69Xm+aE9ktr84/Zps7op4evP9UrrbOFzhYXZIs4WabaQuaLOF3m2KLOFzhazW1Jnt6TObonPbokPWyJawoGIWrg0CRgBJgNTgFFgDJhhA8RiORqzcml8vokhEBQJSgQJQZmgQtC4Dhb0jLRDRlAlyAGKgaBIUCJICMoEFYKmGlH+DxlBFaA03qfgp3NRil3LkxJkBFWCHCAJBEWCEkFCUCaINEJII4Q0Qkgj5Hojsl+iHAiKBCWChKBMUCFICTKAyvhf7sWOyDV3KBEkBGWCCkFKkBFUCXKANBBEGqGkEUoaoaQR4yV5LEEOqBWtOzTGq/JrSAjKBBWClCAjqAI0HlK0p+sR1SodygQVgpQgI6gS5ACNJxfXUCQoEUQa4aQRThrhpBFOGuGkEQ4akUIgKBKUCBKCxjPAYMflXW4zgQ5NjAHTGXWXmjRe8LekfEalQxMj4xqPKGXtULqWlLJ1aDwGTiqnSWXq9ylfS5LU7xO4AKToAKVAUCQoESQEZYIKQcNTmIbkB6Qh/+fQWHcvLm0Je3hxaZfjLsEWT6iLJ/jSCeMZym9NiIsnpMUTZPGEvHhCGSeUfErw7mIkSpARVAlygHIgKBKUCBKCwOe0NpcBqIwve+3548CnPY7pxPRfFZFKSAlSGakyoZKcleilUqQMqYqUE6UBqYjUVDdKPasaLpUglZEqSClShlRFyomygFRECnXDUDcMdcNQNwx1w1A3bKobfj4fanc+NCeqBqQiUgkpQSojVZBSpAwp1I2KuuGoG4664agbjrrhqBuOuuGoG4664agbTrohISAVkUpICVIZqYKUImVIVaRQN8Y/4ilq6bhGVrtc3Mj4RzzXUAVoPAgs6vGEPHVo2ItS4ymp5tghJUk2kSSnpNTv0/gfUeXb2wsdcoDGU6trKBKUCBKCMkGFICXICCKNENKITBqRSSMyaUQmjcgTjUg2cbiPZoLq55lgd8TmsniCLp5giyfUxRN86YQSFk+IiyekxRNk8QRyCS9GkAM0MR/ztpQ9ftbytjC4+Kw1MR+7pgpSipTNVl9t46/b3fb27mlzuIvs8eP5/ttNZe9/v24u7i973b3cbx4+dpv9nWbnm8z2B5+0b/3Fdf9u2lbWddk//vXFvem6xv3G/hCKauvWoZbf3sM/", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_0.snap index d6eed6a3b75..c7e65ce4d0d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_0.snap @@ -150,8 +150,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "7Z3dTuMwEIXfJde5sGfGf7zKaoUKFFSpalEpK60Q775J1SSQsM6ujNvY4xvUwjA65yRpPrfp5K16WN+9Pt1udo/7l+rmx1u13d+vjpv9rnn29l5Xd4fNdrt5uv3460q0P5Q71b88r3bt05fj6nCsbkjqulrvHppHaJv/f9xs19WNEu/1pBS1Euda1EbMFAvXF4NU/mKJ2p6LJdpPxT/rSotUhctUhUOqwjFV4ZSqcJWqcJ2qcLNc4UpgJ1yR8xdrAe5crAXNaFZNJudiJS3NFGsDXbE2OM7PlvyC8lswR6SQn1kwziSRX9n/ZvNzss/PwSg/u2C4W0h+Vvb7nyU5zm/BjPl/+Snq83MzmqUD21U3j53py/UpEyqZTDJZMBlfLZMFQ/fVMsmG578xk2wY/RszSZJ7GuEuSeBthS/4/Tu/8CQRrxWeJFu1wilV4UlSSis8SZRohV/vfD93upIW+zcercWZYlCia908lvD5dOUsD5uOhU0pBBOfkolPyMYn4OAT9dgnMvFJTHwqJj41E5/50JDfZz445PeZDw8pO/i0YuRT5sNDfp/58JAbeEhPeEjmw0N+n/nwkN8nMfGZDw/5febDQ36f+fCQ32c+POT3mQ8PeX1CPjzk98mEh4AJDwETHgJi4pMJDwETHgImPARMeAiY8BAy4SFkwkPIhIeQCQ8hMfHJhIeQCQ8hEx5CJjyETHiImPAQReShU3+I3B8j96fI/VXk/jpyfxO5v43cP/j1zEjV9Tdm/OV3qUTk/jJyf4jcHyP3p8j9VeT+OnL/4OPXCD301zPFTpmu2OmZr7WSMJ1yksJOlNvlKm/Our3yz8Un5W7JmdOgfLK3hI82ipi57b5ETkB6olwmkTmQmSiH5SoHjb0KmOzn4dONLpI5wnQ/Dz9rCPUX5af+KnJ/Hbl/mWkRNNNClqEq/zDUopOhLOAkwCS/63rZAPHDVJDJwseUsSqBAWYzV+VaAVIJMCzAbCa2XCvAbMa7XCvAMtsxMMAy3DEwwLISCQvQlpVIYIBlJRIYYFmJBAZYViKBAVIJMCzAshIJDLCsRAIDLCuR2QDBDAHKuc7aDZ1nrjH6zk9185mkmft29H/Gneb0T57Ho+8T/zSHobI8Hr3XP6Q5G5b58fjF1SBpjsrluB3918akOTmY+fH4xZVCaQ5Svux29N2dRLqycAsMsJB2QIDvzbNfq8Nmdbddn29J+vi6u/9wh9Lj7+f16Galz4f9/frh9bBub1s63LG0RWWQpga0zYZpX+BJ10q3G+n0JwE1CNM+bWEM0NVAslHQqPgD", + "bytecode": "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", + "debug_symbols": "7Z3dbptAEIXfhWsudmb/8ypVFTkJiSxZduQ4laoo715ABhxIFylrhHdmbyrTTEbnHCB8K8PwUTxVD+8v99v98+GtuPv1UewOj5vT9rCvtz4+y+LhuN3tti/3l/9diOYf7dv6t9fNvtl8O22Op+JOgSmLav9Uf5Ku/v3n7a4q7rT4LCel0mhxrpXGipli4ftiBB0uBi3kuRi08j8u/l0WRrBwCSxcIguXkoVLxcKlZuHSsHBpabg0Av252Ag1o1mD7PxpcGqm2Fjsio2V4/xczi8qPyK8tlZ+lggJrpZfPv5m8/PQ5+dxlJ8jQq8L5uegP/6cgnF+RLjYCK36/PyMZvDouur6s7d9uWkzUTmTSSZEmPuqmRAh9KtmQobnr5gJGUa/Yibrcc/sgtVJ1wl3Ts4UoxZd6/oz4FebXvCwCTxsIg+bkodNRcYmysGmNCObmodNw8Om5WHT8bBJh4JCNkHQwaCwTzoc5IcrpxlfOUHQAaGwTzokFPapmPikw0Jhn3RgKOyTDg2FfdLBobBPOjwU9Al0eCjskwkPARMeAiY8BIqJTyY8BEx4CJjwEDDhIWDCQ8iEh5AJDyETHkImPISKiU8mPIRMeAiZ8BAy4SFkwkOSCQ9JJjwkmfCQTJKHWuUqWeVJMkurPEkKaZUnyRWt8iRJoVWe5LW/Ua6SvJq3yqOvzxZ0J8ZaPemPC/eXC/dXC/fXC/c3C/e3C/d3C/eP/ptjhRn6m5lir21X7M3MY31K2E65AuHGyrW4XeU1RfbKvxa3yuGWM1eD8snRovGGM3fdQ7QKlZkol0lkjspOlKvbVY5G9ipwepzrJDKXOD3O468aQv9HedvfLtzfLdufytyotZ7pByojqRZ9qL+ToR1OuJ3KtKslA5QXUxHEJECVA4wLkMy8gLUCJDNcYK0A82SxyADzaLHIAPNsp7gA83Cx2ADzSiQywLwSiQwwr0QiA1Q5wLgA80okMsC8EokMMK9EIgPMK5HIAPNKZDZAtEOAMNfZ+KHzzD1z1/xW1+UFUSL7Mfwdt8vrsmTOx9A3/nn6dDLnY/D+BzpTsBmdj9/cDUJncjf1/Ri+N4bOtHFG5+M3dwrRmZC+ztsZwOWFW1yAPpN2RICf9dafzXG7edhV51dfPr/vHy/ehHn6+1qNXor5ejw8Vk/vx6p5PebwZsxm6YrClyhFvWMa4FKm1KbZSc2PwKsSvG82m12GEupKWSuoVfwD", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index d6eed6a3b75..c7e65ce4d0d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_11294/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -150,8 +150,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "7Z3dTuMwEIXfJde5sGfGf7zKaoUKFFSpalEpK60Q775J1SSQsM6ujNvY4xvUwjA65yRpPrfp5K16WN+9Pt1udo/7l+rmx1u13d+vjpv9rnn29l5Xd4fNdrt5uv3460q0P5Q71b88r3bt05fj6nCsbkjqulrvHppHaJv/f9xs19WNEu/1pBS1Euda1EbMFAvXF4NU/mKJ2p6LJdpPxT/rSotUhctUhUOqwjFV4ZSqcJWqcJ2qcLNc4UpgJ1yR8xdrAe5crAXNaFZNJudiJS3NFGsDXbE2OM7PlvyC8lswR6SQn1kwziSRX9n/ZvNzss/PwSg/u2C4W0h+Vvb7nyU5zm/BjPl/+Snq83MzmqUD21U3j53py/UpEyqZTDJZMBlfLZMFQ/fVMsmG578xk2wY/RszSZJ7GuEuSeBthS/4/Tu/8CQRrxWeJFu1wilV4UlSSis8SZRohV/vfD93upIW+zcercWZYlCia908lvD5dOUsD5uOhU0pBBOfkolPyMYn4OAT9dgnMvFJTHwqJj41E5/50JDfZz445PeZDw8pO/i0YuRT5sNDfp/58JAbeEhPeEjmw0N+n/nwkN8nMfGZDw/5febDQ36f+fCQ32c+POT3mQ8PeX1CPjzk98mEh4AJDwETHgJi4pMJDwETHgImPARMeAiY8BAy4SFkwkPIhIeQCQ8hMfHJhIeQCQ8hEx5CJjyETHiImPAQReShU3+I3B8j96fI/VXk/jpyfxO5v43cP/j1zEjV9Tdm/OV3qUTk/jJyf4jcHyP3p8j9VeT+OnL/4OPXCD301zPFTpmu2OmZr7WSMJ1yksJOlNvlKm/Our3yz8Un5W7JmdOgfLK3hI82ipi57b5ETkB6olwmkTmQmSiH5SoHjb0KmOzn4dONLpI5wnQ/Dz9rCPUX5af+KnJ/Hbl/mWkRNNNClqEq/zDUopOhLOAkwCS/63rZAPHDVJDJwseUsSqBAWYzV+VaAVIJMCzAbCa2XCvAbMa7XCvAMtsxMMAy3DEwwLISCQvQlpVIYIBlJRIYYFmJBAZYViKBAVIJMCzAshIJDLCsRAIDLCuR2QDBDAHKuc7aDZ1nrjH6zk9185mkmft29H/Gneb0T57Ho+8T/zSHobI8Hr3XP6Q5G5b58fjF1SBpjsrluB3918akOTmY+fH4xZVCaQ5Svux29N2dRLqycAsMsJB2QIDvzbNfq8Nmdbddn29J+vi6u/9wh9Lj7+f16Galz4f9/frh9bBub1s63LG0RWWQpga0zYZpX+BJ10q3G+n0JwE1CNM+bWEM0NVAslHQqPgD", + "bytecode": "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", + "debug_symbols": "7Z3dbptAEIXfhWsudmb/8ypVFTkJiSxZduQ4laoo715ABhxIFylrhHdmbyrTTEbnHCB8K8PwUTxVD+8v99v98+GtuPv1UewOj5vT9rCvtz4+y+LhuN3tti/3l/9diOYf7dv6t9fNvtl8O22Op+JOgSmLav9Uf5Ku/v3n7a4q7rT4LCel0mhxrpXGipli4ftiBB0uBi3kuRi08j8u/l0WRrBwCSxcIguXkoVLxcKlZuHSsHBpabg0Av252Ag1o1mD7PxpcGqm2Fjsio2V4/xczi8qPyK8tlZ+lggJrpZfPv5m8/PQ5+dxlJ8jQq8L5uegP/6cgnF+RLjYCK36/PyMZvDouur6s7d9uWkzUTmTSSZEmPuqmRAh9KtmQobnr5gJGUa/Yibrcc/sgtVJ1wl3Ts4UoxZd6/oz4FebXvCwCTxsIg+bkodNRcYmysGmNCObmodNw8Om5WHT8bBJh4JCNkHQwaCwTzoc5IcrpxlfOUHQAaGwTzokFPapmPikw0Jhn3RgKOyTDg2FfdLBobBPOjwU9Al0eCjskwkPARMeAiY8BIqJTyY8BEx4CJjwEDDhIWDCQ8iEh5AJDyETHkImPISKiU8mPIRMeAiZ8BAy4SFkwkOSCQ9JJjwkmfCQTJKHWuUqWeVJMkurPEkKaZUnyRWt8iRJoVWe5LW/Ua6SvJq3yqOvzxZ0J8ZaPemPC/eXC/dXC/fXC/c3C/e3C/d3C/eP/ptjhRn6m5lir21X7M3MY31K2E65AuHGyrW4XeU1RfbKvxa3yuGWM1eD8snRovGGM3fdQ7QKlZkol0lkjspOlKvbVY5G9ipwepzrJDKXOD3O468aQv9HedvfLtzfLdufytyotZ7pByojqRZ9qL+ToR1OuJ3KtKslA5QXUxHEJECVA4wLkMy8gLUCJDNcYK0A82SxyADzaLHIAPNsp7gA83Cx2ADzSiQywLwSiQwwr0QiA1Q5wLgA80okMsC8EokMMK9EIgPMK5HIAPNKZDZAtEOAMNfZ+KHzzD1z1/xW1+UFUSL7Mfwdt8vrsmTOx9A3/nn6dDLnY/D+BzpTsBmdj9/cDUJncjf1/Ri+N4bOtHFG5+M3dwrRmZC+ztsZwOWFW1yAPpN2RICf9dafzXG7edhV51dfPr/vHy/ehHn6+1qNXor5ejw8Vk/vx6p5PebwZsxm6YrClyhFvWMa4FKm1KbZSc2PwKsSvG82m12GEupKWSuoVfwD", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4088/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4088/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 10d6d12662e..24aa7af815c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4088/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4088/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -26,18 +26,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/7VW206EMBAttERRN2s0vugX+NalIDwpD/5IZcN37Ke7TTphPAwmuu0kmwKdnp4zt2yhFiviauBdCT5jXO1ldkiIZUWivxn5fMS1jmvJ9nVCsTXcmxJ/sG1XC/oS8nd1xMwZH8LMgG+vIs7nacFHLcF28Z3XEJ25Pv/u1PK8i881nMmR24yxt48Cf7rrNmp9Aq2ZuLid+pkPbrTHhxTnjIYYnHfQ9MJw0U8x/dRb5pRecz9YS/fpiF8pWb9h+9z/Ob7fAH+K1fhPnnPvD7Pzs+/88dhO/gHwg23VCeWqZL50LnOvN1JNaCE2msUt52wr1LqmtVrHp4TYGYHrvdrugb3a7uPc87UAXoZp1ALXUtBBz8Eq+PYa11BjDeBhnvFbCbErBT45Z/jZWswpN9qr2N2cI5o01woWn47hoh9Z6NfU88L3bpiaduq/Oufd25/mRe7/F1ifFMetftmrde0a4Mp1jWl4WuRRqe0eqsD3HfiZPLG0mFd+V8jrN/kenlZZDAAA", - "debug_symbols": "tdbLaoUwFAXQf8nYQRJzEuOvlHLxES8BUfFRKOK/1xRLrVcKe5CJGMnaJ0okZ2W1K5fnw3dNP7H8bWVtXxWz77t9tG4JK0fftv75OD9mPFyE+p4/DUUXhtNcjDPLlU0T5rqa5cRp941vXbjf3hMmCBYaFgYWGSwsKuR9Da4OoeQfkbxMlcYcU1POr+E2YnjKY4aLmOEyZngaM1zFDCcoPAgNCwOLDBYWFYrDQsBCwuJ+J6XyR5C6CgULgoWGhYFFhgq6ffPf3S7t9esSwULDwvwvXv9BymBhUaE5LAQmtn30UYy+KFt3dAvN0lWn5mH+HNyljxjGvnL1MrrQUZyaibBaKRKpw/kaFkI8IbnX2Ot8AQ==", + "bytecode": "H4sIAAAAAAAA/71UzU7DMAx2m0wQoAKBuMAbcPJop+3YAy8SMfU59ugQyabGdTmMeJaqNIrz5fv818BsDa1R7cHwGWnF/9m2IhaaRP8y9hloTbS24jxUFJvUuzXxDzjskqGvIv8+EaZnfBjTAR+vCOfjNONrLcU62ssa4jvX398dzP8d/Sd1xyO3jrHHJ4M/v3VLWp+VVicufQe/8yGNz+SQkpy1aQzJu2h6FbjaD4R+7q14qq95f0Dk9wLhb8DWH8W59H+h/Y3iz7Eaz+Q57fN26vOUd/l4HD7zo8IvtlYnnKtW+PI9515/t2oiGLEJIm6es62BZU0HWManVbGLBtcHWO8BzzmEZ/SmjKc2qzfZr9TRm8DVfmwXnk0/eYxKx9rsvIdlnUfFVeoZ6/BEzWNj8GjUGfv2il/0iSXqWSLfKnn9Ao3o9y+dCgAA", + "debug_symbols": "tdXRioUgEAbgd/G6C9Mxs1dZloOVHQSxsFpYondfXVq27cTCXHgTjcz3C4rMRnrTrs+H9cM4k+ZtI27s9GJHH6ttL0gbrHP2+TgvE5o+JXz3z5P2qZwXHRbSgOIFMb4njaAi+sE6k/7394KUAi0qtJBoUaOFwgp2vweFQwD7I4qXVibl0copvYarjOGc5gwvc4aznOE8ZzjkDL9/hJz9hAu4igotJFrUaKGwAiha3N7y7+kydX3oAGgh0KL6X7zeOUi0qNFCYYWgOLHH6kMHq1tnjuk0rL47DavlczKXuTWFsTP9GkyaYKfhlfZmZcGqGBujvwA=", "file_map": { "50": { "source": "trait Serialize {\n fn serialize(self) -> [Field; N];\n}\n\nstruct ValueNote {\n value: Field,\n}\n\nimpl Serialize<1> for ValueNote {\n fn serialize(self) -> [Field; 1] {\n [self.value]\n }\n}\n\nfn check(serialized_note: [Field; N]) {\n assert(serialized_note[0] == 0);\n}\n\nfn oopsie(note: Note)\nwhere\n Note: Serialize,\n{\n let serialized_note = Note::serialize(note);\n\n check(serialized_note)\n}\n\nfn main(mut note: ValueNote) {\n oopsie(note);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index e61fadec584..69b62a62254 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -50,8 +50,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VbyW4jNxCllpbULcmWZ7Kvzh90a7FkIIcBxuPZd8/mWdtSnA9IDjnkoEP+JadckmuAID8QIECA/E5SNkt+qmbJBtycAQkY7CZfVz0Wi8UibVfMcdn8/6din+u2rppiYcwlW6fnK1mJstKKHYdPvpUS+friWA2AYy0AjvUAOEYBcGwEwLEZAMdWABzjADgmAXBsB8CxEwDHbgAc1wLguB4Ax14AHDcC4HghAI4XA+D4XgAc3w+A4wcBcPwwAI4fBcDx4wA4fhIAx08D4PhZABw/D4DjFwFw/DIAjpseOB6Vr+CZSNMFHV2A0QUTXeDQBQldQNABnw7QdEClAyAdsOgAQwcESsApwaUEkhI0SoAowaANnDZI2oAowFMApQBFAYAWGDkwOQhNwKbRCxvzX1vHtq5Cf4mXdlks9JYpf5JujWLH+ErkP4hBZvny+xnLr/vhnzatnJ35snwj9NYETn6D310BzBUFswuYXQVzFTBXFcw1wFxTMNcBc13B3ADMDQVzEzA3FcwtwNxSMLcBc1vB3AHMHQVzFzB3Fcw9wNxTMPcBc1/BPADMAwXzEDAPFcweYPYUzCPAPFIwjwHzWME8AcwTBfMUME8VzDPAPFMw+4DZVzDPAfNcwbwAzAsF8xIwLxXMK8C8UjCvAfNawbwBzBsFkwMmVzAHgDlQMFPATBXMDDAzgenCM5cdi+E46mMfm6TDkd843U+7wg4Gxsm6Iz+6s4rQZ8zyHmGE/sT43BOPf/mK+piPtA/PdZcx8xM+sq8+L46D+yLo4/mlHG0bcC7fYtwOPO/aZ54zn3mPL3+nctHBH3VRac7NorA9atDGdmU7txAv+mLoq8+X9ST2vQ56UBbziAT+sn1ft3UDvuHvew79DaF/ibejTdolduBjB57OA1/bZzoHcC57eb4s75Kt0/OVo182kY/+wpxMMaZVStOXHbK8BtiiYop+JfU3wU5ShgsfiXcpvynGW/Ey3nQRw5mfMcUYjuN4FzGc9SfG5352EsMbgo+0T1XYp+nHPqn0LeTTdNiH57Ll6GNZvF4jkIV46cd4FsZzayTa9m3dc8iUvtsyxfFgG8aaPTE2nJuKUrNc2VYVHF3r0298GW65fKbE9bw4m7f8yO+z/NiL/H7K8hM//EcyZ0X/JH+Yifa2fY9MMe9HP4kE/nuQ+a19XjfF9cA+6PlOZTFuzE+5yLWFHLkP/VXmDlhq4l3mp7+BXImTfNDOzC0Sfd/Z2mfuSuWC4Im62qboL4iRZyDs69j3hoKX/sf4H2xNNv1LkWkcvFyxp+vggPiO4MD4H1dw6Ir30zisOTg0V9iB8XPg8LciU+MgY+Qi5zbFvcrFgfE/OTh0BYZlUGFf7UF7ib66fZb9EPUngmvJfBZ5VU/wkfapCtttOLj2HH04p9iHejYcelyyohJlxSXKqpQoq1OirG6JstZKlMX5A/uSjMtUeB2iPd7F+Yb1J6bozz7WYcdhV9c6ZPt0/fCZyDiNfNoOPhvm5FyCc4b8WNamrdcd+PbbGV8qx1eH8aHODoxTrgO0jdz7frY17Tv/wDfaHGObXDuu/d51TpKx1pXvoI/zHu7K6fhbzLs5ZtbnJ7iy5mQ8OZ6TI5tY+ZEp5qyoPxL4X+07nk+4Ps8/ZRyO8+xwkB/mo3w2G05zmW9S4TmTd2Kr7nDOEoNQds8hi+/2/N7pp6nn+6bU733N8R90Sx9nW9GYfod27MO7mFVnHsb/CTL/sM+usyXPYRv6I0c/f4f3OzUhj0pV4BMHHnOemuCGuXRyBlnVFbrbDnyyQjfyaiu669CGXGUe13Jwihxjk2tJysXvcBxnjZ8u3yo7Lg1H+Xiaj7Nse5h9M8xGp8WlsvX3J5Ot7f5BOhzPpoez4eBt68/Hg8m0P5yOD0aDfLB1alz+D4lNKle1OgAA", - "debug_symbols": "ndjbjqJAFEDRf+GZhzp1PeWvTCYdL9ghMWpQJ5kY/32gp0EDmM7mpdMYliVuyhR1L3bV5vb5UR/3p0ux+nUvDqft+lqfju3R/VEWm6Y+HOrPj9eXC9P9SfJ1/uW8PnaHl+u6uRYrtWVRHXftP9rqfX2oilUwj99lkSw838HzPTw/zJ0v0gMRNxYRi4SFYpGpUIOFYGGxcFh4LHBzxc0VN1fcXHHzjJtn3Dzj5mLmP5aLPXE6IbP3iR2IDXFCZm8UmwaS7YQETiIniRPlJGMihhPhxHLiOOH1ZX7Wh9TflnFKEifKScbEzk+x7HuS84QIJ5YTx8l8SiN9SjOZ+zZwEjlJnMxPZKM9mf5a2oyJM5wIJ/MTWcJAJpfvHCeek8BJ5CRxopxkTLzhRDjh9T2v73l9z+t7Xt/z+p7X97x+4PUDrx94/cCXcMFzEjiJnCROlJOMSTScCCeWE14/8vqR14+8fuT1I68fef3E6ytf8ytf8ytf8795Ps5JhpWiyhN9mTdPrzkP4xgbx8YtGOfNitQ8x3ldLv03YYGJC8y7RWl6fgdhbHSBydhYY36+ntc+5bSLNcOTgpU0fn/ev31lgXHQPNqDP+umXm8O1fce6/523L5suV7/nqvR7uu5OW2r3a2pun3Y5xZsN3b76BdTV6H7QiW5UpJ2h931W5NLK9KO2Y77Dw==", + "bytecode": "H4sIAAAAAAAA/9VbyW4jNxBlS2rJakm2PJN9df6gW4slAzkMMB7Pvns2z9qWonxAcsghBx3yK7kk59wCBPmBAAEC5HeSslnyU3VRNuDmDEjAYDf5uuqxWCwWaSgyx2Xr/7/IPtdsXTHFwphLtk7PV7ISZaWRHYdPvlGJfH1xrATAsRoAx1oAHOMAONYD4NgIgONaABybAXBMAuDYCoBjOwCOnQA4rgfAcSMAjt0AOG4GwPFCABwvBsDxvQA4vh8Axw8C4PhhABw/CoDjxwFw/CQAjp8GwPGzADh+HgDHLwLg+GUAHLc8cDwqX8EzkaYLOroAowsmusChCxK6gKADPh2g6YBKB0A6YNEBhg4IlIBTgksJJCVolABRgkEbOG2QtAFRgKcASgGKAgAtMHJgchCagC3jLmzMf23dtHUF+ku8tMuaQm+Z8sfp9rCpjK9E/v0myCxffi9j+TU//NOGlbM7X5ZvhN6qwMlv8LsrgLniwOwBZs+BuQqYqw7MNcBcc2CuA+a6A3MDMDccmJuAuenA3ALMLQfmNmBuOzB3AHPHgbkLmLsOzD3A3HNg7gPmvgPzADAPHJiHgHnowOwDZt+BeQSYRw7MY8A8dmCeAOaJA/MUME8dmGeAeebAHADmwIF5DpjnDswLwLxwYF4C5qUD8wowrxyY14B57cC8AcwbByYHTO7AHALm0IGZAGbiwEwBMxWYDjxz2bUYjqM+9rFxOhj6jdO9tCPsYGCcrDv2ozuLhD5jlvcII/QnxueeePzPV9THfKR9eK47jJmf8JF9tXlxHNwXQx/PL+VoO4DTfItxu/C8Z595znzmPb78ncpFhT/qotKYm0Vhe1Shje3Kdl5DvOhrQl9tvqwnse810IOymEcs8Jft+4at6/ANf99V9NeF/iXeSpu0S1PBNxU8nQe+ts90DuBc9vJ8Wd4lW6fnK0f/bCIf/Zk5mWJMi0rTl81YXh1sEZmiX0n9DbCTlKHhY/Eu5TfEeCMv400XMZz5GVOM4TiOdxHDWX9ifO5nJzG8LvhI+1SEfRp+7JNK30I+DcU+PJdrSh/L4vUagyzESz/GszCeW2PRdmDrriJT+u6aKY4H2zDW7Iux4dxEjprlyraK4KitT7/xZbCt+UyJ63lxNl/zI7/H8pte5PdSlp/44T+UOSv6J/nDVLS37Htsink/+kks8N+DzG/t84Yprgf2Qc93KotxY37KRa4t5Mh96K8yd8BSFe8yP/0V5Eqc5IN2Zm6x6PvO1j5zVyoXBE/U1TJFf0GMPANhX9u+1x146X+M/8HWZNO/HDKNwkuLPR2FA+LbggPjf1zBoSPeT+OwrnBorLAD4+fA4W+HTBcHGSMXObcp7lUaB8b/pHDoCAzLoMK+2oX2En115yz7IepPBNeS+Szyqq7gI+1TEbbbVLh2lT6cU+xDPZuKHk1WXKKsZomyohJltUuU1SlR1nqJsjh/YF+ScZkKr0O0x7s437D+xBT92cc6bCt21dYh26fjh89Yxmnk01L4bJqTcwnOGfJjWVu21nJ9GS+0PRvnifchLS/hbzF35HVfm5vS7TYaH/+Y5MhWVn5sinkX6o8F/hf7jjk21+f5YcFslGezfj7Lh/l0OpjkMmeiwnMp73VW3UOcZR2h7K4ii++nOAeXcZ6K3/uOtHCe57tBqTOG8SAen405yUO47Tdbk13/EePT7qXjFbaLFD5+7/TT1Pd9inY2LjO+avGBbUXz+7tjTvAuRos7scD/CTL/sM/a2ZL9v2V0v5d3HHi/UxXyqFQEPlHwmPNUBTf08eQMsiordLcUfLJCN/JqOXTXoA25yjyurnCKlbHJOCTlutYl+gD76ll9q+yYPhjmo0k+yrKdQfbNIBueFtPL1t8bj7d3eofpYDSdzKaD/tvWn4/640lvMBkdDvt5f/vUPe0/CS3SyrU6AAA=", + "debug_symbols": "ndjbquIwFMbxd+l1L7Jyjq8yDBsPdVOQKlUHBvHdp509rdLDbP65ESP5GdsvkdX1KA7V7v75UTfH87XY/HgUp/N+e6vPTTd6PMti19anU/358f5xofqXIH/nXy/bph9eb9v2VmyiLouqOXRvYqeP9akqNk49f5ZF0HC+gfMtnO+W5osMQMRMhcciYBGxSFREhYVgobEwWFgscOYRZx5x5hFnHnHmCWeecOYJZy5q+WcZPxATZ2Rxn+iRaOdnZHGj6DCSpGfEceI5CZxEThImojgRTjQnhhOeviyfeheGbennJHASOUmY6OUjluxAUpoR4URzYjhZjlLJEKWanX3tOPGcBE6WD7KKA5n/W+qEiVGcCCfLB1ncSGaXbwwnlhPHieckcBI5SZhYxYlwwtO3PH3L07c8fcvTtzx9y9O3PH3H03c8fcfTd7yEc5YTx4nnJHASOUmYeMWJcKIxCbzqC7zqC7zqW+kIpCBjRRLlhb6MzzAhw8QMk7hZ6Q3830iG0Rkm4x6sPMWmNO4Dpf3UmIx1VipT9VrnvWz6Mi7D+AyzVpyG1z1wUxMzTMJGK/X99bznU85z0Wp8YtASpt/P8+8+yTAGmmc3+LVt6+3uVP3rtR7vzf6t9Xr7fakmXdhLe95Xh3tb9f3YVyu2X7t7BPShT6G/oeJdKUH1w/76tUqlFunW7Nb9Aw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_0.snap index 701e9db400c..0d97f32fdff 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_0.snap @@ -50,8 +50,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9WbyW7jRhCGm7IoiVpsaSb76rwBqcWSgRwMxJ5992yenZaic4AckqMuOeSQQw55l5xySYAAAfJOMzXusn8VqzUzMNuDbkBosvmx6u+tupuGI3OUNl/9IntdtXnFFBMzOzZPT5eyEm2lka2HT71RiXp9aawEoHEtAI3VADTGAWisBaCxHoDGRgAakwA0NgPQ2ApAYzsAjZ0ANK4HoHEjAI3dADT2AtB4LgCN5wPQ+EEAGj8MQONHAWj8OACNnwSg8dMANH4WgMbPA9D4RQAavwxA41cBaPw6AI2bHjS+Tt/ANYmmD3T0AYw+MNEHHPpAQh8g6IBPB2g6oNIBkA5YdIChAwJtwGmDSxtI2qDRBog2GLSA0wJJCxAFeAqgFKAoANAEowFMA4Q6YNO4Ezfm/zZPbF6B5yV+tMsS4bdM+5N0a5Qo9StR/yABm+Xb72dsv+pHf1q3dnYXy/aN8LsmOPkOvrcHzJ6DuQDMBQdzEZiLDuYSMJcczGVgLjuYK8BccTBXgbnqYK4Bc83BXAfmuoO5AcwNB3MTmJsO5hYwtxzMbWBuO5g7wNxxMPvA7DuYu8DcdTD3gLnnYO4Dc9/BPADmgYN5CMxDB3MAzIGDeQTMIwfzGJjHDuYJME8czFNgnjqYZ8A8czDPgXnuYF4A88LB5MDkDuYQmEMHMwVm6mBmwMwE04FrTruW4TjqYx2bpMOR3zjdTzuiHQzUk33HfnxnkfBnzPIaYYT/pvG5Jh798RX9sR7ZPtzXHWYWJ3rks+qiWA9+FsMz7l/ao20Dp40t5nbhes9ec5/53Pf4Gu+Uziv60Rel+sIcJ26PNSjjduV2biAvniXwrLpY9tO091Xwg7ZYRyz47+z9hs1r8A6/31X814T/Jd1KmWyXROEThafzwLf2umV/NIb+4ndMMebQb8fep6dK2Zzt1UBrZIr9Lv3XoR7ShsbH4l7ar4v6Rl7qmx7HWNZnTDHGYj3eR4xl/03jc705ibE1oUe2T0W0T91P+6RybKGeutI+3JcN5Rnb4rNhDLaQl+MYz6p4roxF2YHNu4pNOXYbplgfLMNYsC/qhn0TOXK2K8sqQqM2P/3Gl+GWNmZKnM/HZ+eGH/t9tp94sd9P2X7Tj/6R3FPi+KTxMBXlLXsfm+K+HMdJLPhfwObcXm8o78u5q8Xhdx3f2t6Y0o7N09OlrGuKcyQWvv2sGWnqO+Zq86fMNUae17CtKP8ByvEZxmttnxAL/mew+aO93jDufUwsnv1klvvT1576HNg1wlcLNK/aS3GsMGb1mUjOaeRlvMH2wljXegtblRW+2wrfWuEbdbUdvqumuL5rddK+a9eUumnzW8Z7bY+Efcjz513HO7Ynl8kzPj5rgy2Nl/Gb+V9tTjr/cdjUdGlrd0fRgHxbaGD+txUaOuL+TRrWFQ31Fe3A/O+g4V+HTZcGucc4PlNCWWOFBub/UDR0BMM2KHFM6kJ5iTFpOxL+jNHPJey/KbSWvWZEwh/rke1TEW3XU7R2lWcy/vQUPz3Fj2YrLtFWUqKtqERb7RJtdUq0tV6iLV47eCzJuEyJ5yG2x/v4PsD+m6Y4nn3MQ20N1+Yht0/Hj56JjNOop6Xo6ZmTcz32GepjW5s231D41tnUL5X1q0L90Gcb6innAbaNXPv+tDmtO//BO64+xjI5d7T1XvvOsGr/yGU4xnkN186t/C6eWzlmVhcnXFl9Mp4c9cnrNrH2Y7O81zbCfyz4v+097k05P80/Hc3HeTYf5PN8lM9mw2kuzxWU8FxRtv/hKB9P83GWbQ+z74fZ6Kz99yeTre3+YTocz6bz2XBw1v7z8WAy7Q+n48PRIB9svbH9XwJgQvETfTkAAA==", - "debug_symbols": "tZjdquIwFIXfJde9yM7Pzo6vMgyHqvVQKFWqDgziu0/rmdbSBjkLT27ESL7Vmm+npPum9tX2+vlRt4fjWW1+3VRz3JWX+tj2o9u9UNuubpr682P+s9LDR9CP+edT2Q7D86XsLmojplBVu++/SE8f6qZSG6/vvwsVCJxvwPkWnO9S84lGgMguCQ8TDBMBJgQmIkqIhgmCCQMTFiZg5wI7F9i5wM4Fdi6w8wg7j7DzmL4ryyNhl7uWdLJMzIQYzyskWScmTEg0c6T4/tRHusua7rOmc850Mm+mUww0VkIUek7+ivdvx8dprja8jMfW5oEEHBEYMTrrshp6tya0fi7rfMt/xZu88TZv/NubXVN41pxfxvu88Zw3Pvzo2s83ZKKIjXZjERsKy1uRrM8GE7PGW503Pn1u8qNa4tUzxzoc8TjCOJI+O8WpNmJcIYIjEUacxpH0k1fTpHJ1tHEGRyyOOBxJP8m0jMjqLEiOcSTgiOBIereTn5DV3/caRwhHDI5YHHE44nGEcSTgiOAIbp9x+4zbZ9w+4/YZt8+4fcbtM26fcfuM2083xl6+oaZ7Y68R/D043SF7jTgc8TjCOBJwRHAkwojg9gW3L7h9we0Lbl9w+4LbF9D+vR/9Kbu63DbV/8b24druZn3uy99TtWh5n7rjrtpfu2pofj/73sMy9idSDsONDLIp6oKiH4b0GMaiPxr11+yv+w8=", + "bytecode": "H4sIAAAAAAAA/9WbyW4bRxCGeygOd0qUnX1V3mC4iRSQg4BI3nd5k/cRGd5zC5BD+AI55JBDDnmVXBIgQIC8U1xWl/SzWEXb0LSNboDomZ5vqv7eqrtHUOKO09bLX+Kvyz4vueXEzK7Ps7OlboG2ssTXI6TepEC9oTSWItC4FoHGcgQa0wg0ViLQWI1AYy0CjfUINDYi0NiMQGMrAo3tCDSuR6BxIwKNnQg0bkag8VwEGs9HoPGDCDR+GIHGjyLQ+HEEGj+JQOOnEWj8LAKNn0eg8YsINH4ZgcavItD4dQQatwJofJW+gWsSTR/o6AMYfWCiDzj0gYQ+QNABnw7QdEClAyAdsOgAQwcE2oDTBpc2kLRBow0QbTBoAacFkhYgCvAUQClAUQCgCUYDmAYIdcCWsxM35n8+r/u8BM8L/GjXrQu/RdofZ9vDulK/AvX362CzePu9Ltsvh9GfVb2dvfmifSf8rglOvoPv7QOzbzAXgLlgMBeBuWgwl4C5ZDCXgblsMFeAuWIwV4G5ajDXgLlmMNeBuW4wN4C5YTA3gblpMLeAuWUwt4G5bTB3gLljMAfAHBjMXWDuGsw9YO4ZzH1g7hvMA2AeGMxDYB4azCEwhwbzCJhHBvMYmMcG8wSYJwbzFJinBvMMmGcG8xyY5wbzApgXBpMDkxvMETBHBjMBZmIwU2CmgmnDNac9z3AcDbGOjbPBMGyc7mVt0Q4O6sm+0zC+u4nw59ziGuGE/4YLuSYe//EV/bEe2T7c121m5qd65LPyfLke/CyFZ9y/tEfbAU4bW8ztwfW+v+Y+C7nvCTXeKZ1X9KMvStW5O0ncHmtQxu3K7VxDXjyrw7PyfNFPw9+XwQ/aYh2p4L/z9xs+r8A7/H5H8V8R/hd0K2WyXeoKX1d4Og9866+b/kdj6E9+xy3HHPrt+vvsTKk7Y3sV0Jq45X6X/qtQD2lD41NxL+1XRX2TIPXNTmIs63NuOcZiPd5HjGX/DRdyvTmNsRWhR7ZPSbRPNUz7ZHJsoZ6q0j7clzXlGdvis2EKtpCX4xjPqniuTEXZoc87ik05dmtuuT5YhrHgQNQN+yYxcrYry0pCozY/w8aXwbY2Zgqczydn51oY+z22Xw9iv5ex/UYY/UO5p8TxSeNhIsqb/j51y/tyHCep4H8BmzN/vaG8L+euFoffdnxre2NKuz7Pzpa6Hbc8R1JRR7lmoK4w8TLLZHzhvZEVL0tuea5gHEpF2Q8+p/u/4R1rzcAyGXu0MRB2vc0yLTYUuV5psaHI9VmedbGtKP/R6BNc6/DdGjxHfg42f/LXG87eA6bi2c9usT9DnUfOgV0nfDWdPhflusZx1rnV50kZD5GXsRrbC+dd8w1slVb4bil8c4Vv1NUyfJehDLXKOlUVTRWlblpslGu9FiuwD3n+vO14x/bkMvl9BJ+1wJbGy7WP+V99TvPnH8Ompktri7aiAfmW0MD8bys0tMX96zSsKxqqK9qB+d9Bw7+GTUuD3J+dnMehrLZCA/N/KBragmEblDgmdaC8wJi0kwh/zulnOvbfEFqLXjMS4Y/1yPYpibbbVLR2lGcy/mwqfjYVP5qttEBb9QJtJQXaahVoq12grfUCbfHawWNJxmVKPA+xPd7HtxX233DL4znEPNTWcG0ecvu0w+gZyziNepqKnk13el7APkN9bGvL59p3hlV7oATqyfe8DmnnVn4Xz60878tzV3i7jcbHZ6xXbeXtp25xv+iE/1Twf/l73F9xfpZ/OpqN8u6sn8/yYT6dDia53BtTwr1x0f7zUX886Q0mo6NhP+9vv3P/g2E+muSjbndn0P1+0B2+a/+98Xh7p3eUDUbTyWw66L/O//+pPoSEfTkAAA==", + "debug_symbols": "tZnfrqIwEMbfhWsuOv03ra+y2Zyg4gkJQYO6ycb47lvcAxJozPnimRtjyfw+Sr9pKdNbsa+318+Ppjscz8Xm161oj7vq0hy71Lrdy2LbN23bfH7MLxdq+GH1iD+fqm5oni9Vfyk2QZdF3e3Tn5DoQ9PWxcap+++yYALjNRhvwHibiycaASKzJBxMeJhgmAgwEVEiKJggmNAwYWAC9jzAngfY8wB7HmDPA+x5hD2PsOcx3yvjR8IsZy2pbJroCdHOr5BsnmiekKjnSPn90Ie6FVV3oupeVJ3fVKfINGZCDPQM/i8fZOWjqDwpWXmSldey8kZW3orKa1lr9fuDE6dYpf1SHhucB+JwxOOI7HzX7853rdRzWOevuoe8UbLyJCuv35YnfuacW8obWXkrK+9+dOznEzKTxFrZMYk18bIrXnRtMCwrH0TlbX5/6kZrya/WHKtxxOCIxZH8d0mcciPGFeJxhHEk4Eh+5VU0Wbna0juFI4QjGkfyK5kKI7L6BiJnccThiMeR/GwnNyHrxw84EmHEKxwhHNE4YnDE4ojDEY8juPsed9/j7jPuPuPuM+4+4+4z7j7j7jPuPuPu5wuRLysz+UrkSyRfinyNEI7gVaZ8NfI1YnHE4YjHEcaQe2r9qfqm2rb118HB4drtZucIl7+nenGkcOqPu3p/7evhcOF5rjAMY9r5eB46MphNUZUU3dAcjEwbuzLtgdM9033/AQ==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 701e9db400c..0d97f32fdff 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_4449/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -50,8 +50,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9WbyW7jRhCGm7IoiVpsaSb76rwBqcWSgRwMxJ5992yenZaic4AckqMuOeSQQw55l5xySYAAAfJOMzXusn8VqzUzMNuDbkBosvmx6u+tupuGI3OUNl/9IntdtXnFFBMzOzZPT5eyEm2lka2HT71RiXp9aawEoHEtAI3VADTGAWisBaCxHoDGRgAakwA0NgPQ2ApAYzsAjZ0ANK4HoHEjAI3dADT2AtB4LgCN5wPQ+EEAGj8MQONHAWj8OACNnwSg8dMANH4WgMbPA9D4RQAavwxA41cBaPw6AI2bHjS+Tt/ANYmmD3T0AYw+MNEHHPpAQh8g6IBPB2g6oNIBkA5YdIChAwJtwGmDSxtI2qDRBog2GLSA0wJJCxAFeAqgFKAoANAEowFMA4Q6YNO4Ezfm/zZPbF6B5yV+tMsS4bdM+5N0a5Qo9StR/yABm+Xb72dsv+pHf1q3dnYXy/aN8LsmOPkOvrcHzJ6DuQDMBQdzEZiLDuYSMJcczGVgLjuYK8BccTBXgbnqYK4Bc83BXAfmuoO5AcwNB3MTmJsO5hYwtxzMbWBuO5g7wNxxMPvA7DuYu8DcdTD3gLnnYO4Dc9/BPADmgYN5CMxDB3MAzIGDeQTMIwfzGJjHDuYJME8czFNgnjqYZ8A8czDPgXnuYF4A88LB5MDkDuYQmEMHMwVm6mBmwMwE04FrTruW4TjqYx2bpMOR3zjdTzuiHQzUk33HfnxnkfBnzPIaYYT/pvG5Jh798RX9sR7ZPtzXHWYWJ3rks+qiWA9+FsMz7l/ao20Dp40t5nbhes9ec5/53Pf4Gu+Uziv60Rel+sIcJ26PNSjjduV2biAvniXwrLpY9tO091Xwg7ZYRyz47+z9hs1r8A6/31X814T/Jd1KmWyXROEThafzwLf2umV/NIb+4ndMMebQb8fep6dK2Zzt1UBrZIr9Lv3XoR7ShsbH4l7ar4v6Rl7qmx7HWNZnTDHGYj3eR4xl/03jc705ibE1oUe2T0W0T91P+6RybKGeutI+3JcN5Rnb4rNhDLaQl+MYz6p4roxF2YHNu4pNOXYbplgfLMNYsC/qhn0TOXK2K8sqQqM2P/3Gl+GWNmZKnM/HZ+eGH/t9tp94sd9P2X7Tj/6R3FPi+KTxMBXlLXsfm+K+HMdJLPhfwObcXm8o78u5q8Xhdx3f2t6Y0o7N09OlrGuKcyQWvv2sGWnqO+Zq86fMNUae17CtKP8ByvEZxmttnxAL/mew+aO93jDufUwsnv1klvvT1576HNg1wlcLNK/aS3GsMGb1mUjOaeRlvMH2wljXegtblRW+2wrfWuEbdbUdvqumuL5rddK+a9eUumnzW8Z7bY+Efcjz513HO7Ynl8kzPj5rgy2Nl/Gb+V9tTjr/cdjUdGlrd0fRgHxbaGD+txUaOuL+TRrWFQ31Fe3A/O+g4V+HTZcGucc4PlNCWWOFBub/UDR0BMM2KHFM6kJ5iTFpOxL+jNHPJey/KbSWvWZEwh/rke1TEW3XU7R2lWcy/vQUPz3Fj2YrLtFWUqKtqERb7RJtdUq0tV6iLV47eCzJuEyJ5yG2x/v4PsD+m6Y4nn3MQ20N1+Yht0/Hj56JjNOop6Xo6ZmTcz32GepjW5s231D41tnUL5X1q0L90Gcb6innAbaNXPv+tDmtO//BO64+xjI5d7T1XvvOsGr/yGU4xnkN186t/C6eWzlmVhcnXFl9Mp4c9cnrNrH2Y7O81zbCfyz4v+097k05P80/Hc3HeTYf5PN8lM9mw2kuzxWU8FxRtv/hKB9P83GWbQ+z74fZ6Kz99yeTre3+YTocz6bz2XBw1v7z8WAy7Q+n48PRIB9svbH9XwJgQvETfTkAAA==", - "debug_symbols": "tZjdquIwFIXfJde9yM7Pzo6vMgyHqvVQKFWqDgziu0/rmdbSBjkLT27ESL7Vmm+npPum9tX2+vlRt4fjWW1+3VRz3JWX+tj2o9u9UNuubpr682P+s9LDR9CP+edT2Q7D86XsLmojplBVu++/SE8f6qZSG6/vvwsVCJxvwPkWnO9S84lGgMguCQ8TDBMBJgQmIkqIhgmCCQMTFiZg5wI7F9i5wM4Fdi6w8wg7j7DzmL4ryyNhl7uWdLJMzIQYzyskWScmTEg0c6T4/tRHusua7rOmc850Mm+mUww0VkIUek7+ivdvx8dprja8jMfW5oEEHBEYMTrrshp6tya0fi7rfMt/xZu88TZv/NubXVN41pxfxvu88Zw3Pvzo2s83ZKKIjXZjERsKy1uRrM8GE7PGW503Pn1u8qNa4tUzxzoc8TjCOJI+O8WpNmJcIYIjEUacxpH0k1fTpHJ1tHEGRyyOOBxJP8m0jMjqLEiOcSTgiOBIereTn5DV3/caRwhHDI5YHHE44nGEcSTgiOAIbp9x+4zbZ9w+4/YZt8+4fcbtM26fcfuM2083xl6+oaZ7Y68R/D043SF7jTgc8TjCOBJwRHAkwojg9gW3L7h9we0Lbl9w+4LbF9D+vR/9Kbu63DbV/8b24druZn3uy99TtWh5n7rjrtpfu2pofj/73sMy9idSDsONDLIp6oKiH4b0GMaiPxr11+yv+w8=", + "bytecode": "H4sIAAAAAAAA/9WbyW4bRxCGeygOd0qUnX1V3mC4iRSQg4BI3nd5k/cRGd5zC5BD+AI55JBDDnmVXBIgQIC8U1xWl/SzWEXb0LSNboDomZ5vqv7eqrtHUOKO09bLX+Kvyz4vueXEzK7Ps7OlboG2ssTXI6TepEC9oTSWItC4FoHGcgQa0wg0ViLQWI1AYy0CjfUINDYi0NiMQGMrAo3tCDSuR6BxIwKNnQg0bkag8VwEGs9HoPGDCDR+GIHGjyLQ+HEEGj+JQOOnEWj8LAKNn0eg8YsINH4ZgcavItD4dQQatwJofJW+gWsSTR/o6AMYfWCiDzj0gYQ+QNABnw7QdEClAyAdsOgAQwcE2oDTBpc2kLRBow0QbTBoAacFkhYgCvAUQClAUQCgCUYDmAYIdcCWsxM35n8+r/u8BM8L/GjXrQu/RdofZ9vDulK/AvX362CzePu9Ltsvh9GfVb2dvfmifSf8rglOvoPv7QOzbzAXgLlgMBeBuWgwl4C5ZDCXgblsMFeAuWIwV4G5ajDXgLlmMNeBuW4wN4C5YTA3gblpMLeAuWUwt4G5bTB3gLljMAfAHBjMXWDuGsw9YO4ZzH1g7hvMA2AeGMxDYB4azCEwhwbzCJhHBvMYmMcG8wSYJwbzFJinBvMMmGcG8xyY5wbzApgXBpMDkxvMETBHBjMBZmIwU2CmgmnDNac9z3AcDbGOjbPBMGyc7mVt0Q4O6sm+0zC+u4nw59ziGuGE/4YLuSYe//EV/bEe2T7c121m5qd65LPyfLke/CyFZ9y/tEfbAU4bW8ztwfW+v+Y+C7nvCTXeKZ1X9KMvStW5O0ncHmtQxu3K7VxDXjyrw7PyfNFPw9+XwQ/aYh2p4L/z9xs+r8A7/H5H8V8R/hd0K2WyXeoKX1d4Og9866+b/kdj6E9+xy3HHPrt+vvsTKk7Y3sV0Jq45X6X/qtQD2lD41NxL+1XRX2TIPXNTmIs63NuOcZiPd5HjGX/DRdyvTmNsRWhR7ZPSbRPNUz7ZHJsoZ6q0j7clzXlGdvis2EKtpCX4xjPqniuTEXZoc87ik05dmtuuT5YhrHgQNQN+yYxcrYry0pCozY/w8aXwbY2Zgqczydn51oY+z22Xw9iv5ex/UYY/UO5p8TxSeNhIsqb/j51y/tyHCep4H8BmzN/vaG8L+euFoffdnxre2NKuz7Pzpa6Hbc8R1JRR7lmoK4w8TLLZHzhvZEVL0tuea5gHEpF2Q8+p/u/4R1rzcAyGXu0MRB2vc0yLTYUuV5psaHI9VmedbGtKP/R6BNc6/DdGjxHfg42f/LXG87eA6bi2c9usT9DnUfOgV0nfDWdPhflusZx1rnV50kZD5GXsRrbC+dd8w1slVb4bil8c4Vv1NUyfJehDLXKOlUVTRWlblpslGu9FiuwD3n+vO14x/bkMvl9BJ+1wJbGy7WP+V99TvPnH8Ompktri7aiAfmW0MD8bys0tMX96zSsKxqqK9qB+d9Bw7+GTUuD3J+dnMehrLZCA/N/KBragmEblDgmdaC8wJi0kwh/zulnOvbfEFqLXjMS4Y/1yPYpibbbVLR2lGcy/mwqfjYVP5qttEBb9QJtJQXaahVoq12grfUCbfHawWNJxmVKPA+xPd7HtxX233DL4znEPNTWcG0ecvu0w+gZyziNepqKnk13el7APkN9bGvL59p3hlV7oATqyfe8DmnnVn4Xz60878tzV3i7jcbHZ6xXbeXtp25xv+iE/1Twf/l73F9xfpZ/OpqN8u6sn8/yYT6dDia53BtTwr1x0f7zUX886Q0mo6NhP+9vv3P/g2E+muSjbndn0P1+0B2+a/+98Xh7p3eUDUbTyWw66L/O//+pPoSEfTkAAA==", + "debug_symbols": "tZnfrqIwEMbfhWsuOv03ra+y2Zyg4gkJQYO6ycb47lvcAxJozPnimRtjyfw+Sr9pKdNbsa+318+Ppjscz8Xm161oj7vq0hy71Lrdy2LbN23bfH7MLxdq+GH1iD+fqm5oni9Vfyk2QZdF3e3Tn5DoQ9PWxcap+++yYALjNRhvwHibiycaASKzJBxMeJhgmAgwEVEiKJggmNAwYWAC9jzAngfY8wB7HmDPA+x5hD2PsOcx3yvjR8IsZy2pbJroCdHOr5BsnmiekKjnSPn90Ie6FVV3oupeVJ3fVKfINGZCDPQM/i8fZOWjqDwpWXmSldey8kZW3orKa1lr9fuDE6dYpf1SHhucB+JwxOOI7HzX7853rdRzWOevuoe8UbLyJCuv35YnfuacW8obWXkrK+9+dOznEzKTxFrZMYk18bIrXnRtMCwrH0TlbX5/6kZrya/WHKtxxOCIxZH8d0mcciPGFeJxhHEk4Eh+5VU0Wbna0juFI4QjGkfyK5kKI7L6BiJnccThiMeR/GwnNyHrxw84EmHEKxwhHNE4YnDE4ojDEY8juPsed9/j7jPuPuPuM+4+4+4z7j7j7jPuPuPu5wuRLysz+UrkSyRfinyNEI7gVaZ8NfI1YnHE4YjHEcaQe2r9qfqm2rb118HB4drtZucIl7+nenGkcOqPu3p/7evhcOF5rjAMY9r5eB46MphNUZUU3dAcjEwbuzLtgdM9033/AQ==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index eeb1d87e644..3d319347222 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -71,8 +71,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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O7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTO3Zqx07t2KkdO7Vjp3bs1I6d2rFTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vgpw7s1IGdOrBTB3bqwE4d2KkDO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTJ3bqxE6d2KkTO3Vip07s1ImdOrFTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vhpy7s1IWdurBTF3bqwk5d2KkLO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTN3bqxk7d2KkbO3Vjp27s1I2durFTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KkHO/Vgpx7s1IOderBTD3bqwU492KmHOrUe1KkfpeBScWm4dFwGLhOXhcvGJd6Q4A0J3pDgDQnekOANCd6Q4A0J3pDgDQnekOINKd6Q4g0p3pDiDSnekOINKd6Q4g0p3pDhDRnekOENGd6Q4Q0Z3pDhDRnekOENGd6Q4w053pDjDTnekOMNOd6Q4w053pDjDTneUOANBd5Q4A0F3lDgDQXeUOANBd5Q4A0F3lDiDSXeUOINJd5Q4g0l3lDiDSXeUOINJd5Q4Q0V3lDhDRXeUOENFd5Q4Q0V3lDhDRXeUOMNNd5Q4w013lDjDTXeUOMNNd5Q4w013tDgDQ3e0OANDd7Q4A0N3tDgDQ3e0OANYacW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asFOLdipBTu1YKcW7NSCnVqwUwt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1YqdW7NSKnVqxUyt2asVOrdipFTu1Yqc27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asNObdipDTu1Yac27NSGndqwUxt2asdO7dipHTu1Y6d27NSOndqxUzt2asdO7dipHTu1Y6d27NSOndqxUzt2asdO7dipHTu1Y6d27NSOndqxUzt2asdO7dipHTu1Y6d27NSOndqxUzt2asdO7dip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", + "bytecode": "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", + "debug_symbols": "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Jzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WyUyc7dbJTJzt1slMnO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzt1sVMXO3WxUxc7dbFTFzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwUw926sFOPdipBzv1YKce7NSDnXqwU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1ZKee7NSTnXqyU0926slOPdmpJzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxUy926sVOvdipFzv1Yqde7NSLnXqxU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1OvdmpNzv1Zqfe7NSbnXqzU2926s1Ovdmptzp1PNSpn2XjMrjsXCaXxeXgcnK5uOQNNd5Q4w013lDjDTXeUOMNNd5Q4w013lDjDQVvKHhDwRsK3lDwhoI3FLyh4A0Fbyh4Q5031HlDnTfUeUOdN9R5Q5031HlDnTfUeUPJG0reUPKGkjeUvKHkDSVvKHlDyRtK3lDxhoo3VLyh4g0Vb6h4Q8UbKt5Q8YaKNzR4Q4M3NHhDgzc0eEODNzR4Q4M3NHhDgzc0eUOTNzR5Q5M3NHlDkzc0eUOTNzR5Q5M3tHhDize0eEOLN7R4Q4s3tHhDize0eEOLN7R5Q5s3tHlDmze0eUObN7R5Q5s3tHlD7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZO3dipGzt1Y6du7NSNnbqxUzd26sZOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTh3s1MFOHezUwU4d7NTBTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUnZ26s1N3durOTt3ZqTs7dWen7uzUyU6d7NTJTp3s1MlOnezUyU6d7NTJTp3s1MlOnezUyU6d7NTJTp3s1MlOnezUyU6d7NTJTp3s1MlOnezUyU6d7NTJTp3s1MlOnezUyU6d7NTJTp3s1MlOnezUyU6d7NTJTp3s1MlOnezUyU6d7NTJTp3s1MlOnezUyU6d7NTJTp3s1MlOnezUyU6d7NTJTp3s1MlOnezUyU6d7NR57tQ7Vq/PcLd2DLuGqWFpODScGi4NN4bnPv2PhE1DXc7U5UxdztTl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", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_0.snap index 9f22bfb9645..fd748b5b84b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_0.snap @@ -71,8 +71,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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BwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBwXmBxXmBxXmBxXmBxXmB3Vh9bPC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDC/KDB/KDB/KDB/KDB/KAtrH42mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB80mB90mB90mB90mB90mB/0hdXPDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvODDvOD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", + "bytecode": "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", + "debug_symbols": "5d3djiPHkfbxe9GxDio+MiPCt7J4YfhDawgQJEOWX2Bh+N432zNNtlDFLnWom/sfzslCs+bTjOwuPkwW+WP965u/fvfnf/7tj9//+N8//eObP/zXv7754ae//OmX73/6cf3rX//+9ps///z9Dz98/7c/vvx/f7M9/R/Z5n8C//j7n358+vc/fvnTz7988wfz+Pab737869N/5foB//39D99984ex/fv/fbsi8fZIvj1Sb47I9vaIvD2ib4/Y2yP+9sh4e+Ttf315+19f3v7Xl7f/9fXwrz82/RwZ6i8j3+5uKv58U922129q4/mmLvN60zi4qUrJ84/VrV6/8dB6nta2lzf9zwLl0Reoj75Ae/QF+qMvcDz6AuejLzAefYH56AusB1+gPfpOxh5hJ1PPe9EpY7fAR9jJvLrAR9jJvLpAf/QFPsJO5tUFPsJO5tUFPsJO5tUFPsJO5tUFPsJO5rUF+iPsZF5d4KPvZPzRdzL+6DsZ90df4PFORp8jY9bJ1JHPp5XrxU3H0e9i26L8863XP3K++I3Yp3Ema5xgjZOscQo1zthY4whrHGWNY6xxnDUOq5UHq5UHq5UHq5UHq5Unq5Unq5Unq5Unq5Unq5Unq5Unq5Unq5Unq5Unq5WD1crBauVgtXKwWjlYrRysVg5WKwerlYPVysFq5WS1crJaOVmtnKxWTlYrJ6uVk9XKyWrlZLVyslq5WK1crFYuVisXq5WL1crFauVitXKxWrlYrVyoVl7vprPGQbWybqhW1g3VyrqhWlk3VCvrhmpl3VCtrBuqlXVjtbKwWllYrSysVhZWKwurlYXVysJqZWG1srBaWVitrKxWVlYrK6uVldXKymplZbWyslpZWa2srFZWVisbq5WN1crGamVjtbKxWtlYrWysVjZWKxurlY3Vys5qZWe1srNa2Vmt7KxWZtk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Zdk+Y9k+Y9k+Y9k+Y9k+21CtbCzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzbZyzb5yzb5yzb5yzb5yzb5xuqlZ1l+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+5xl+/y+tk/U4zKOmNhuHGGNo6xxjDWOs8YZrHEma5xgjZOscQo1zmS18mS18mS18mS18mS18mS18mS18mS18mS18mS18n1tn8zS6zgxcjeOsMZR1jjGGsdZ4wzWOJM1TrDGSdY4hRonWa2crFZOVisnq5WT1crJauVktXKyWjlZrZysVr6v7VPx7TKO6jZ24whrHGWNY6xxnDXOYI0zWeMEa5xkjVOkccaGauWxoVp5bKhWHhuqlceGauWxoVp5bKhWHhuqlceGauWxsVr5vrZPR15Pc+scthtHWOMoaxxjjeOscQZrnMkaJ1jjJGucQo2jrFZWVisrq5WV1crKamVltbKyWllZraysVlZWK9/X9tlmdhnHtpeBz+MIaxxljWOscZw1zmCNM1njBGucZI1TqHGc1crOamVntbKzWtlZreysVnZWKzurlZ3Vys5q5cFq5cFq5cFq5cFq5cFq5cFq5cFq5cFq5cFq5cFq5clq5clq5clq5clq5clq5fvaPvPtem7QPHbnBu9r+87HCdY4yRqnUOPc1/adjyOscZQ1jrHGcdY4rFYOVisHq5WD1crBauVktXKyWjlZrZysVr6v7bMYch0nJXbjDNY4kzVOsMZJ1jiFGue+tu98HGGNo6xxjDUOq5WL1crFauVitXKxWrlQrTw3VCvPDdXKc0O18ryv7fPtxbfAuuy+BXZuzhpnsMaZrHGCNU6yxinUOPe1fefjCGscZY3DamVhtbKwWllYrSysVhZWKwurlZXVyspq5fvaPnfL6zhjs904xhrHWeMM1jiTNU6wxknWOIUa576273wcYY3DamVjtbKxWtlYrWysVjZWKxurlY3Vys5q5fvaPo+o6zjpYzeOssYx1jjOGmewxpmscYI1TrLGKdQ497V95+OwWnmwWnmwWnmwWnmwWnmwWnmwWnmwWnmwWnmyWnmyWnmyWnmyWnmyWnmyWnmyWnmyWnmyWnmyWjlYrRysVg5WKwerlYPVyne1fR6pl3HWP2o/zmSNE6xxkjVOoca5q+37DeMIaxxljWOscZw1DquVk9XKyWrlZLVyslq5WK1crFYuVisXq5WL1crFauVitXKxWrlYrVyoVo4N1cqxoVo5NlQrx4Zq5dhQrRwbqpVjQ7VybKhWjg3VyrGxWllYrSysVhZWKwurlYXVysJqZWG1srBaWVitLKxWVlYrK6uVldXKymplZbWyslpZWa2srFZWVisrq5WN1crGamVjtbKxWtlYrWysVjZWKxurlY3VysZqZWe1srNa2Vmt7KxWdlYrO6uVndXKzmplZ7Wys1p5sFp5sFp5sFp5sFp5sFp5sFp5sFp5sFp5sFp5sFp5slp5slp5slp5slp5slp5slp5slp5slp5slp5slo5WK0crFYOVisHq5WD1cos2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs2xcs25cs25cs25cs25cs25cbqpWTZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuSZfuKZfuKZfuKZfuKZftqQ7VysWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWxfsWyfbCzct+ZB9fKaB1XMax5UM695UNW85kF185oHVc5rHlQ7r3lQ9bzmgfUzi/mteWD9zIJ+ax5YP7Oo35oH1s8s7LfmgfUzi/uteWD9zAJ/ax5YP7PI35oH1s8s9LfmgfUzi/2teWD9zIJ/ax5YP7Po35oH1s8s/LfmgfUzi/+teWD9zAKAax5YP7MI4JoH1s8sBLjmgfUziwGueWD9zIKAax5YP7Mo4JoH1s8sDLjmgfUziwOueWD9zAKBax5YP7NI4JoH1s8sFLjmgfUziwWueWD9zIKBax5YP7No4JoH1s8sHLjmgfUziweueWD9zAKCax5YP7OI4JoH1s8sJLjmgfUziwmueWD9zIKCax5YP7Oo4JoH1s8sLLjmgfUziwuueWD9zAKDax5YP7PI4JoH1s8sNLjmgfUziw2ueWD9zIKDax5YP7Po4JoH1s8sPLjmgfUziw+ueVj9LDA/KDA/KDA/KDA/uN7whs3D6meB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGB+UGF+UGF+UGF+UGF+UHdWP2sMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD+oMD9oMD9oMD9oMD9oMD9oG6ufDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHDeYHHeYHHeYHHeYHHeYHfWP1s8P8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8oMP8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", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 03d6361706b..d6c50dd4efc 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_5252/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -67,8 +67,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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5cJK5cJK5deyfbGkcJdTQ/lazmvZPl9OYMkRlpzIkqMsOYklJ7PkFJacypLDSmVjpbKxUtlYqWysVDZWKhsrlY2VysZK5deyfbo8TIHV0EyBTa9l+zw5+bVsny8nsOQIS05kyVGWnMSSk1lyCksOKpXzwkrlwErlwErlwErlwErlwErlwErlwErl17J9qrHe5aQlNnIqS46h5LyW7fPlBJYcYcmJLDnKkpNYcjJLDiuVhZXKwkrlyErlyErlyErlyErlyErlyErl17J9Word5VRNjZzCklNZcgwl57Vsny8nsOQIS05kyVGWnMSSw0plZaWyslJZWamcWKmcWKmcWKmcWKmcWKmcWKmcWKmcWKmcWKmcWKmcWamcWamcWamcWamcWamcWamcWamcWamcWamcWan8UrZPS5VdzvoPa+UElhxhyYksOcqSk1hyMktOYcmpLDmGklNZqVxZqVxZqVxZqVxZqVxZqVxZqVxZqVxZqVxZqWysVDZWKhsrlY2VysZKZWOlsrFS2VipbKxUNlQqlwWVymVBpXJZUKlcFlQqlwWVymVBpXJZUKlcFlQqlwWVymVhpXJgpXJgpXJgpXJgpXJgpXJgpXJgpXJgpXJgpXJgpbKwUllYqSysVBZWKgsrlYWVysJKZWGlsrBSWVipHFmpHFmpHFmpHFmpHFmpHFmpHFmpHFmpHFmpHFmprKxUVlYqKyuVlZXKykplZaWyslJZWamsrFRWVionVionVionVionVionVionVionVionVionVionVipnVipnVipnVipnVipnVipnVipnVipnVipnVipnViqz2L7CYvsKi+0rLLavsNi+wmL7CovtKyy2r7DYvsJi+wqL7Ssstq+w2L7CYvsKi+0rLLavsNi+wmL7CovtKyy2r7DYvsJi+wqL7Ssstq+w2L7CYvsKi+0rLLavsNi+wmL7Kovtqyy2r7LYvspi++qCSuXKYvsqi+2rLLavsti+ymL7Kovtqyy2r7LYvspi+yqL7asstq+y2L7KYvsqi+2rLLavsti+ymL7Kovtqyy2r7LYvspi+yqL7asstq+y2L7KYvsqi+2rLLavsti+ymL7Kovtqyy2r7LYvspi+yqL7asstq+y2L7KYvsqi+2rLLavsti+ymL7Kovtqyy2r7LYvspi+yqL7asstq+y2L7KYvsqi+2rLLavsti+ymL7Kovtqyy2r7LYvspi+yqL7asstq+y2L7KYvsqi+2rLLavsti+ymL7Kovtqyy2r7LYvspi+yqL7asstq+y2L7KYvsqi+2rLLavsti+ymL7Kovtqyy2r7LYvspi+yqL7asstq+y2L7KYvsqi+2rLLavsti+ymL7Kovtqyy2r7LYvspi+yqL7assts9YbJ+x2D5jsX3GYvtsQaWysdg+Y7F9xmL7jMX2GYvtMxbbZyy2z1hsn7HYPmOxfcZi+4zF9hmL7TMW22csts9YbJ+x2D5jsX3GYvuMxfYZi+0zFttnLLbPWGyfsdg+Y7F9xmL7jMX2GYvtMxbbZyy2z1hsn7HYPmOxfcZi+4zF9hmL7TMW22csts9YbJ+x2D5jsX3GYvuMxfYZi+0zFttnLLbPWGyfsdg+Y7F9xmL7jMX2GYvtMxbbZyy2z1hsn7HYPmOxfcZi+4zF9hmL7TMW22csts9YbJ+x2D5jsX3GYvuMxfYZi+0zFttnLLbPWGyfsdg+Y7F9xmL7jMX2GYvtMxbbZyy2z1hsn7HYPmOxfcZi+4zF9hmL7TMW22csts9YbJ+x2D5jsX3GYvuMxfYZi+0zFttnLLYvLCy4b9WDyuVVDyqYVz2oZF71oKJ51YPK5lUPKpxXPah0XvWg4nnVA8tnFua36oHlMwv0W/XA8pmF+q16YPnMgv1WPbB8ZuF+qx5YPrOAv1UPLJ9ZyN+qB5bPLOhv1QPLZxb2t+qB5TML/Fv1wPKZhf6temD5zIL/Vj2wfGbhf6seWD6zAMBVDyyfWQjgqgeWzywIcNUDy2cWBrjqgeUzCwRc9cDymYUCrnpg+cyCAVc9sHxm4YCrHlg+s4DAVQ8sn1lI4KoHls8sKHDVA8tnFha46oHlMwsMXPXA8pmFBq56YPnMggNXPbB8ZuGBqx5YPrMAwVUPLJ9ZiOCqB5bPLEhw1QPLZxYmuOqB5TMLFFz1wPKZhQquemD5zIIFVz2wfGbhgqseWD6zgMFVDyyfWcjgqgeWzyxocNUDy2cWNrjqgeUzCxxc9cDymYUOrnpg+cyCB1c9sHxm4YOrHlY+Bxg/GGD8YIDxgwHGD64XvGF6WPkcYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMC4wcFxg8KjB8UGD8oCyufBcYPCowfFBg/KDB+UGD8oMD4QYHxgwLjBwXGDwqMHxQYPygwflBg/KDA+EGB8YMC4wcFxg8KjB8UGD8oMH5QYPygwPhBgfGDAuMHBcYPCowfFBg/KDB+UGD8oMD4QYHxgwLjBwXGDwqMHxQYPygwflBg/KDA+EGB8YMC4wcFxg8KjB8UGD8oMH5QYPygwPhBgfGDAuMHBcYPCowfFBg/KDB+UGD8oMD4QYHxgwLjBwXGDwqMHxQYPygwflBg/KDA+EGB8YMC4wcFxg8KjB8UGD8oMH5QYPygwPhBgfGDAuMHBcYPCowfFBg/KDB+UGD8oMD4QYHxgwLjBwXGDwqMHxQYPygwflBg/KDA+EGB8YMC4wcFxg8KjB8UGD8oMH5QYPygwPhBgfGDEcYPRhg/GGH8YITxg3Fh5XOE8YMRxg9GGD8YYfxghPGDEcYPRhg/GGH8YITxgxHGD0YYPxhh/GCE8YMRxg9GGD8YYfxghPGDEcYPRhg/GGH8YITxgxHGD0YYPxhh/GCE8YMRxg9GGD8YYfxghPGDEcYPRhg/GGH8YITxgxHGD0YYPxhh/GCE8YMRxg9GGD8YYfxghPGDEcYPRhg/GGH8YITxgxHGD0YYPxhh/GCE8YMRxg9GGD8YYfxghPGDEcYPRhg/GGH8YITxgxHGD0YYPxhh/GCE8YMRxg9GGD8YYfxghPGDEcYPRhg/GGH8YITxgxHGD0YYPxhh/GCE8YMRxg9GGD8YYfxghPGDEcYPRhg/GGH8YITxgxHGD0YYPxhh/GCE8YMRxg9GGD8YYfxghPGDEcYPRhg/GGH8YITxgxHGD0YYP6gwflBh/KDC+EGF8YO6sPJZYfygwvhBhfGDCuMHFcYPKowfVBg/qDB+UGH8oML4QYXxgwrjBxXGDyqMH1QYP6gwflBh/KDC+EGF8YMK4wcVxg8qjB9UGD+oMH5QYfygwvhBhfGDCuMHFcYPKowfVBg/qDB+UGH8oML4QYXxgwrjBxXGDyqMH1QYP6gwflBh/KDC+EGF8YMK4wcVxg8qjB9UGD+oMH5QYfygwvhBhfGDCuMHFcYPKowfVBg/qDB+UGH8oML4QYXxgwrjBxXGDyqMH1QYP6gwflBh/KDC+EGF8YMK4wcVxg8qjB9UGD+oMH5QYfygwvhBhfGDCuMHFcYPKowfVBg/qDB+UGH8oML4QYXxgwrjBxXGDyqMH1QYP6gwflBh/KDC+EGF8YMK4wcVxg8qjB9UGD+YYPxggvGDCcYPJhg/mBZWPicYP5hg/GCC8YMJxg8mGD+YYPxggvGDCcYPJhg/mGD8YILxgwnGDyYYP5hg/GCC8YMJxg8mGD+YYPxggvGDCcYPJhg/mGD8YILxgwnGDyYYP5hg/GCC8YMJxg8mGD+YYPxggvGDCcYPJhg/mGD8YILxgwnGDyYYP5hg/GCC8YMJxg8mGD+YYPxggvGDCcYPJhg/mGD8YILxgwnGDyYYP5hg/GCC8YMJxg8mGD+YYPxggvGDCcYPJhg/mGD8YILxgwnGDyYYP5hg/GCC8YMJxg8mGD+YYPxggvGDCcYPJhg/mGD8YILxgwnGDyYYP5hg/GCC8YMJxg8mGD+YYPxggvGDCcYPJhg/mGD8YILxgwnGDyYYP5hg/GCC8YMJxg8mGD+YYPxggvGDCcYPJhg/mGD8YILxgxnGD2YYP5hh/GCG8YN5YeVzhvGDGcYPZhg/mGH8YIbxgxnGD2YYP5hh/GCG8YMZxg9mGD+YYfxghvGDGcYPZhg/mGH8YIbxgxnGD2YYP5hh/GCG8YMZxg9mGD+YYfxghvGDGcYPZhg/mGH8YIbxgxnGD2YYP5hh/GCG8YMZxg9mGD+YYfxghvGDGcYPZhg/mGH8YIbxgxnGD2YYP5hh/GCG8YMZxg9mGD+YYfxghvGDGcYPZhg/mGH8YIbxgxnGD2YYP5hh/GCG8YMZxg9mGD+YYfxghvGDGcYPZhg/mGH8YIbxgxnGD2YYP5hh/GCG8YMZxg9mGD+YYfxghvGDGcYPZhg/mGH8YIbxgxnGD2YYP5hh/GCG8YMZxg9mGD+YYfxghvGDGcYPZhg/mGH8YIbxgxnGD2YYP5hh/GCG8YMZxg9mGD9YYPxggfGDBcYPFhg/WBZWPhcYP1hg/GCB8YMFxg8WGD9YYPxggfGDBcYPFhg/WGD8YIHxgwXGDxYYP1hg/GCB8YMFxg8WGD9YYPxggfGDBcYPFhg/WGD8YIHxgwXGDxYYP1hg/GCB8YMFxg8WGD9YYPxggfGDBcYPFhg/WGD8YIHxgwXGDxYYP1hg/GCB8YMFxg8WGD9YYPxggfGDBcYPFhg/WGD8YIHxgwXGDxYYP1hg/GCB8YMFxg8WGD9YYPxggfGDBcYPFhg/WGD8YIHxgwXGDxYYP1hg/GCB8YMFxg8WGD9YYPxggfGDBcYPFhg/WGD8YIHxgwXGDxYYP1hg/GCB8YMFxg8WGD9YYPxggfGDBcYPFhg/WGD8YIHxgwXGDxYYP1hg/GCB8YMFxg8WGD9YYPxggfGDBcYPFhg/WGD8YIHxgxXGD1YYP1hh/GCF8YN1YeVzhfGDFcYPVhg/WGH8YIXxgxXGD1YYP1hh/GCF8YMVxg9WGD9YYfxghfGDFcYPVhg/WGH8YIXxgxXGD1YYP1hh/GCF8YMVxg9WGD9YYfxghfGDFcYPVhg/WGH8YIXxgxXGD1YYP1hh/GCF8YMVxg9WGD9YYfxghfGDFcYPVhg/WGH8YIXxgxXGD1YYP1hh/GCF8YMVxg9WGD9YYfxghfGDFcYPVhg/WGH8YIXxgxXGD1YYP1hh/GCF8YMVxg9WGD9YYfxghfGDFcYPVhg/WGH8YIXxgxXGD1YYP1hh/GCF8YMVxg9WGD9YYfxghfGDFcYPVhg/WGH8YIXxgxXGD1YYP1hh/GCF8YMVxg9WGD9YYfxghfGDFcYPVhg/WGH8YIXxgxXGD1YYP1hh/GCF8YMVxg9WGD9oMH7QYPygwfhBg/GDtrDy2WD8oMH4QYPxgwbjBw3GDxqMHzQYP2gwftBg/KDB+EGD8YMG4wcNxg8ajB80GD9oMH7QYPygwfhBg/GDBuMHDcYPGowfNBg/aDB+0GD8oMH4QYPxgwbjBw3GDxqMHzQYP2gwftBg/KDB+EGD8YMG4wcNxg8ajB80GD9oMH7QYPygwfhBg/GDBuMHDcYPGowfNBg/aDB+0GD8oMH4QYPxgwbjBw3GDxqMHzQYP2gwftBg/KDB+EGD8YMG4wcNxg8ajB80GD9oMH7QYPygwfhBg/GDBuMHDcYPGowfNBg/aDB+0GD8oMH4QYPxgwbjBw3GDxqMHzQYP2gwftBg/KDB+EGD8YMG4wcNxg8ajB80GD9oMH7QYPygwfhBg/GDBuMHDcYPGowfNBY/KAuLH1z1oPJ51YPK51UPKp9XPah8XvWg8nnVg8rnVQ8qn1c9qHxe9cDymcUPrnpg+cziB1c9sHxm8YOrHlg+s/jBVQ8sn1n84KoHls8sfnDVA8tnFj+46oHlM4sfXPXA8pnFD656YPnM4gdXPbB8ZvGDqx5YPrP4wVUPLJ9Z/OCqB5bPLH5w1QPLZxY/uOqB5TOLH1z1wPKZxQ+uemD5zOIHVz2wfGbxg6seWD6z+MFVDyyfWfzgqgeWzyx+cNUDy2cWP7jqgeUzix9c9cDymcUPrnpg+cziB1c9sHxm8YOrHlg+s/jBVQ8sn1n84KoHls8sfnDVA8tnFj+46oHlM4sfXPXA8pnFD656YPnM4gdXPbB8ZvGDqx5YPrP4wVUPLJ9Z/OCqB5bPLH5w1QPLZxY/uOqB5TOLH1z1wPKZxQ+uemD5zOIHVz2wfGbxg6seWD6z+MFVDyyfWfzgqoeVzwHGDwYYPxhg/GCA8YNhYeVzgPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8YYPxggPGDAcYPBhg/GGD8YIDxgwHGDwYYPxhg/GCA8YMBxg8GGD8oMH5QYPygwPhBgfGDsrDyWWD8oMD4QYHxgwLjBwXGDwqMHxQYPygwflBg/KDA+EGB8YMC4wcFxg8KjB8UGD8oMH5QYPygwPhBgfGDAuMHBcYPCowfFBg/KDB+UGD8oMD4QfnN/KAu8stLdYmPeraPl2/78fHbfrx+249P3/bj87f9+PJtP75+24+3b/rxvxlDcz7+2/7V6rf9q9Vv+1er3/avVr/tX20HwCrcPj44BUIlxdtrpZT7i/PBi9dScfvgNRjT+YtjKjeT64/x8cWby3IJl/USLu0KLjuAayO4DJdwKZdwGS/hUqkuNe0uNefzF1eT/MuLqz0sSahHn1xzun1yreHxxduSpPeSfL0k2K7q+y0JtgX7fkuC7de+35Jgm7vvtiQZ2wl+vyXBto3fb0mwPeb3WxJsQ/r9lkTfS/L1kry712ZJ3t1rsyTv7rVZknf32izJu3v9eknKu3ttluTdvTZL8u5emyV5d6/Nkuh7Sb5eknf32izJu3ttluTdvTZL8u5emyV5d69fL0l9d6/Nkry712ZJ3t1rsyTv7rVZEn0vyddL8u5emyV5d6/Nkry712ZJ3t1rsyTv7vXrJbF399osybt7bZbk3b02S/LuXpsl0feSfL0k7+61WZJ399osybt7bZbk3b02S/LuXr9akri8u9dmSd7da7Mk7+61WZJ399osib6X5OsleXevzZK8u9dmSd7da7Mk7+61WZJ39/r1koR399osybt7bZbk3b02S/LuXpsl0feSfL0k7+61WZJ399osybt7bZbk3b02S/LuXr9eEnl3r82SvLvXZkne3WuzJO/utVkSfS/J10vyyu412nJ7rQY9dxljvX1w1CU5Lz4flRYlX8JluYTLegmXdgWXcbmEy3AJl3IFl8dDN2O5PWwg1g8ut/cc5rLeLdjBew7//jXcewpp3nM8ns15T/jEew6/adVbV6Ipt++Jn3iPfuI96fm1Ph4f4/z/Oc7nfcB5Ej3/bQ96e6ksi/OHkfax6eFBSTlq94LtjaQsdv7ilOP+t6mPL/3i8FfGpczkMEzvUKZ3GKd3qNM7TNM7zNM7LBM4tFuvmkNqHdbpHc7Q05w6rDP0NOcOZ+hpzh3O0NOcO5yhpzl3qNM7HK6n2WQP16hssofrPjbZw7UUm+zh+oQvsm244r/JHq6ib7KHK9Ob7OFq7yZ7uIK6yR6zStqYVdLGrJI2ZpW0IaukLkNWSV2GrJK6DFkldRmySuoyZJXUZcgqqcuQVVKXIaukLkNWSV3GrJJhzCoZxqySYcwqGaC5LfEuW6WVDU2SEm435EiJy6dfvHmExs4zHkPOt7uaQi618SjQjOrqERpoXT1C06+rR2hUPuWxlNsdEqGYnL+47HqL5nY5Jojgp5bD9EapWDr47ZghrfstR5wh2Dsuxww14JnlCIvcVIQlp3ZBZigYXRcEelz1/RZE3wvycUGu1n+4CwI9vPt+CwI9Fvx+C3K1HtVdkKt1qd6C6NX6VHdB3p3qVwvy7lS/WpB3p/rVguh7QT4uyLtT/WpB3p3qVwsyd6e6eZy7+dw8zt1PfvGY5m4RN48zdH223CZcBJMDjzM0cp7H3z5Qrf7y0mjOgJOwBNGyp3yI4WEUSfxFj8L0JJieDNNTYHoqTI+x9OQFpie8VE+2e5cZyuN1t5segemJMD0K05NgejJMT4HpqTA9L81nCbrfMbRueB/ntv2ipywwPQGmR2B6IkyPwvQkmJ4M0/PSfJZU7/2Y5NT2Y6XC9BhLT11gegJMj8D0RJgehel5aT7HJe6nius/Ht9w05NhegpMT4XpMZYeW2B6AkyPwPS8NJ+jLvc8jFraPDSF6UkwPRmmp8D0VJgeQ+lJywLT89p8LvsjcdZ/1FBaPQLTE2F6FKYnwfRkmJ4C01Nhel6az7qY7no05KXRExaYngDTIzA9EaZHYXoSTE+G6XlpPqvGetezNhetngrTYyw9ssD0BJgegemJMD0K0/PafC77M83Wf1RNrZ4M01NgeipMj7H0xAWmJ8D0CEzPb81n3W8H18d4S798vH7bj0/f9uPzt/348m0/vn7bj7dv+vG6fNuPf+HjW0PS/SpQSs3jR5MKSEsEaVGQlgTSkkFaCkhLBWkxjpa0gLSAcje98uHWS9K9HKXUaokgLQrSUl6ppdy11Pb3Jb/ywfZit/F464+51fLSx8/nXcv6tlaLgrSkV2p54oH1Jy/ehOdRhZdRhddRhdugwssyqvAwqnAZVXgcVbiOKnzUylmoOR4s3HqVYNL2cJWaKhL2aRwSSj5/cVxD5nYinUrbNVdqBPV1Sc2rvi6p4dbXJTUJ+7qkbjj6uqTuTvq6pJbAri6NWi+D2e2gUZblQPiAsbkJ5yah3TR8fErX4e9VjreBYTE/Phvr5pKbhD1dcpOwp0tuEvZ0ST0B6ukyL9Tjor4uubvAni65u8CeLrm7wJ4u9RIur9D75GWKeqlJbg24fphK+4vLMEXGat5n2WoOsXU5YMZuwgeMzU34gEm4CR8w3DbhA+7VNuEDbr824QNWiE34gJukL8JlwH3PJhyb4yJ34VJb4dhUkWi7cC2tcGyqxLA/jz5q+vdvOfjNgo2gri6xedXTZcSGW1eX2A1HV5fYDUdXl9iq1tWlXsIldt/T1SW2nenq8hK9j05SL20/hlyvRLYu58hY57BVB8zYTfiAsbkJHzAJN+EDhtsmfMC92iZ8wO3XF+FpwAqxCR9wk7QJH3DfswnH5rjeD+hU2pPFRE2VGMPtxTFG78VOr5eoEdTVZabmVV+X1HDr65KahH1dUncnfV3qJVxSS2Bfl9h6GfaJ9Guv0h4EYEnbk69nE85NwpR24bn8thMMLJbb1yU3CXu65CZhT5fUE6C+LqnHRX1dcneBPV1yd4EdXVbuLrCnS24709PlJXofLBb+lEvvVnksSvycS+dW+Tpgxn4RbgPG5iZ8wCTchA8YbpvwAfdqm3AdVfiAFWITPuAmaRM+4L5nE84ts/X2wVGX33jzEpZT7+myYDn1vi65BbynS2617+mS2xr0dKmXcMltOnq65HYoPV1y25meLq/Q+xTszIEnXZ7euF2wBPxzLs+P/goWlz9xuQkfMDY34QMm4SZ8wHDbhA+4V/siHIvLu8IHrBCb8AE3SZvwAfc9m/ABy+wmfNTKiR0J4QoftXJipzy4wketnNhZDK7wUSsnZGLCpoVRDDctjPq2aWGUrE0LowptWhiFZdPCqBWbFkb8f9ECmRawaRmwZz06GpL9vv8soXU5x5GtcwCGZYy7fpdYILnvdznHJU7P5RyXOD2Xk2Ss3l2mA5dzXOL0XM5xidNzOUm9vN/elXPb+4DnFfR0OcftXY5L8LyCni4n6X0cl5P0Po7LSXofx6VewuUkvY/jcpLex3F5id6HO3vi8y7bG5/yhL1P67JM2PscuJyk93nYeR25nO/c58jlJc59wBNKerqcpPdxXE7S+zguL3GdBDyhpKfLSXqfc5fgCSU9XV7imlfl1st+szvKLBNK9O6yfeZVqVNM9HJdTjHRy3U5x7SZlPPusrT3FYw4bebIpcnu0qxxOeJomoNPfpwcdHCPyIhzbByX7XykMuLQm0+4nGKaqetSL+Fyjt7HczlH7+O5nKP38VxeYdJeAY8A6ueycsfGnM9br9xJMOG+ow9af9P2vy7YEtjVJbYEdnWJLYFdXWJLYFeX3MdU9HSJLYE9XQbs9r+rS+z2v6tLbjvT0+Uleh/uCKBnXDqXPip3es1TLp1tBnfUza+73IQPGJub8AGTcBM+YLhtwnVU4QNuvzbhA1aITfiAm6RN+ID7nk04tsxKvvUHUUrbBXFH3UiWu/D2gI476kZET4VjK6cnHFs5PeHYyukJ5+Z42QdGhNrcDFAh41aOhN/H9srSbpf0Ck+nrnqFp1NXvcLTqSt4mlBPl1d4OnVV7l0MPV1y72Lo6ZJ7F0NPl9y7GDq6BE/56unyEr0PeDLUUy5PHz9RwdOEnnHpXMIBTxP6VZeb8AFj84tw8MwfR/iA4bYJH3CvtgkfcPu1CR+wQmzCB9wkbcIH3Pdswgcss1+Eg2dePNUfnM6treA5CR27IDBb3/O7nGOn6XyXYLa+p8s5dpqey0ky9nRuba1znLJ7LvUSLiepl6dz+Cp4TkJPl5OcADkuJ+l9HJeT9D7nLsFzEnq6nKT3cVxO0vs4LifpfRyXegmXl+h9wHMSPu2yvfoFnpPQ0+WEvc+By0l6n9MZxLbMd+5z5PIK5z7GnXnR1eUkvY/jUi/h8grXSYw7IKOryyvc+WPcARldXV7hmpeBhyqcUi4GnpNwSrlYwFY1TzgXJXaEY2vPI4J29DuOLSeecGyF8IRzUeJz4dwhHJ7wIVDiI+FDoMRHwrko8VLvwttehTuEwxOOrZyecO4QjoeSfyScC2+f9yrgIRyOcO6sq3Ph3CEcnnDu+CpHOHfP6Qgfdc/JHcLhCR91zxmnGCLrDDi0OMeAw/PnARl4oEpPl1MMkXVdTjFE1nm2k3Gnrzzn8vTZTsadvvLp8apy8F1OMUDfGSJr3OkrXV1OMUDfdTlH7+O5vMJwZ+NOX+nqco7ex3M5R+/juZyj9/FcUuul6K5h/bFt2rDDcURT2IWnA+HUquYKpxaqD8JzPn9xrXYTvP54/+sJdXOJHY7T1yW1UPV1qVO4tP0OpvVHaV0OkYSeS1vC7cW2lNS65MamLrvLdqq8ZW5sngsv3CR0hHPDzRFObaxd4dRe2RXOrRCOcOppnqS49+1Jcyscu+FIewE6Fo4ts55wbOX0hGMrpyMcOwBK1NJdeHtVCzvTyRXOrZyOcG7lrPFUOLdy3oWrtdfBsPORXOHcozpHOHeD6gjn7jkd4dw957lw7PggVzi3cjrCsZUzy+0yx/pjW4Cwc3tc4djK6QnHVs68nwNLkaUVjs3xnPY/zpy+vi8yLthZGz8/1u4mvDY3jq3CsaniCcemiiccmyqecGx3WO6Vs9T2jzNge5W67MJraFc8YFPFwo04/BkTb4VjU8V2/u1nTLwVjk0VTzg2VTzh2F7FE47d5XvCsTnuCcd2h55w7C7fEc4dMrDsBSgu0Vrh2Bx3ehUs8u71Kljk3RWOzXFPODbHa9gvpVSJrXBsjnvCsTn+YevW9uNY5N0VPsa5yoHwMc5VDoSPca7Slnws8u4K51ZORzi3cjrCuZXTEc6tnI7wMSpnKxw7CmBtUPZrQLUurXBu5XSEcyunI5xbOR/a2iPh3Mr5sAM6Ej7qnhMLv7vCuZXTEc6tnI5wbuU8F44FyV3h3MrpCOdWTkc4t3I6wrE57tyvwoWyH+8Qigcrzr1DyBGOzXFHOJez9oRjc9wTzr3T0xHOvdPTEa5Y4TXfhUsrnHunpyOcWzkd4dzK6QjHVs4S9+OJou1VNy6X7wjncvmecG7lfPgdPxLOrZwlngrnVk5HOLdyOsKnGMZyPnJmdTnEDCvfZd3HB5nF1uUUA6/sfk+bLQ9wzM0lGFbv6XKKgVeuSy4G39Mll5nv6RJbAru65NL4PV1y0f3nXMrdZWhdzjKI7tzlFL2P63KW3ufuMrZ/l+BxA0+53Pfdtmjbx4JnE3x2QKRq63KS3kfr7rIc/MZO0vtoubtMrUudf6Tp6nKW3ufc5Sy9z5nLwJ3UEO+z6qKm8xfHLLdPju0zZFaX2L/L51yePct+dYntY7t+l9g+tut3ie1je7rkjqLo6nKSjNW7y3TgEtvHdnWJ7WO7upykXqa0u8zausT2sV1dYvvYri4n6X0cl5P0Po7LSXqfc5fYYSJ9XU7S+zguJ+l9HJeT9D6OS72Eywl7n9K6nLD3OXA5Ye9z4HKS3udh53Xkcr5znwOX3AE8Pc99uNN6urqcpPdxXE7S+zgu9RIuJ+l9HJeT9D6Oy0l6H8flJa55cWf0yK5h/bG2wrElUKLtwrXtw7gzejzh2ELlCcfWHsn333FbWuHYcuIJx1YITzg29D3h2D2s3O+cEmtvLeHO6PGEcyunI3yIynkkfNTKmUatnIlbOR3h3MrpCOdWTkc4t3I6wrmV81w4dyqSJ5xbOR3h2BwP9+FCstj5izXJbSzB+mN7mZI70Oc5l3p3efRdYitEV5fYctLVJbb2POcy591l+/DDwB1C9JxLk92lWeOSO7HoKZd5uVUSPQIquOONPu0yxNYldqfZ1SV2W9rVpV7C5Ry9j+dyjt7HczlH7+O5nKP38VzO0fs4LrEjmYLZPsluWQ6EY0vgIrILj86LvWvl3ClLXV1iS2BXl9gS2NUltgR2dYktgV1dYktgT5fcKUtdXWK3/11dYrf/XV1eovfhTuZ5xqV36cOmyFhnm7F28OO53IQPGJub8AGTcBM+YLhtwnVU4QNuvzbhA1aITfiAm6RN+ID7nk049zRv2Z9KEtqH7Ql3dlZY9C7cWuHc643Lciqcm+Npfw7MkkornJsq5f7H2T7RWLjzbkLaha+XsJz9TNpdrj+2PTB33k1Pl9x5N11dcsOtp0vuzRQ9XXJvpujpElvVurrk3kzR0yX3ZoqeLrk3U/R0eYnehzsj5TmXtp9YJ2sbcO5cjadcnp/LC3euxq+73IQPGJub8AGTcBM+YLhtwgfcq30RrgNuvzbhA1aITfiAm6RN+ID7nk34HC3T+QMwhAv792wmuJx61+9yjm2p913OsS31XM6xLfVcTpKxpw/AEC6I39Mll9rv6nKSenk60FvyHEfynss5juQ9l3oJl5P0Po7LSXofx+UkvY/jcpLex3E5Se9z7hI826Gny0v0PuDZDp922V5EAs926OlSL+Fykt7n9GEmAp7t8NkTkSOXlzj3Ac926Olykt7n3GWdpPdxXF7iOgl2Tkdfl5P0Po5LvYTLS1zzAg+COIdFwLMdzmER8LgGRzgXJXaEc2vPA8kl7V2n3DkJnnBuhXCEc0PfEc7dwzrCudtSRzh3p+kI51bOeidy21EjETyEwxHOrZyOcO4QjnvJPxTOHcJx2qvEBVs5PeHcIRyOcO4QDkf4oLh8BA/hcIQPuueM3CEcnvBB95wRPISj3/C3GKYYfOs8KyWGSQb5OS6nGHzrupxi8K3z3JvIHdXynMvT595E7qiWT4+ebNmbyB3V0nHAZuSOaunqcorBt65LvYTLOXofz+UcvY/nco7ex3M5R+/jubzCQOrVJva5N+F2S2kwya1wagkMFssuXFMrnFrVXOHUQuUKp9aeVa3twttbbSN23o0rnFohXOHU0P/wO34gHDvvxvvjxM67cYVzK6cjfNTKqaNWTh21ciq3cjrCuZXTEc6tnOfCIWOaNi2MaN60MNJ208II0E0LIxM3LYyY27QwkmvTwgijTQujM/+ipecgIZFHLdvHh2/78cfpuMjxx2/vOUwxvS+THbxHP/Ge9In35E+8p3ziPfUT77Hn33M8qsF5zyuTfSm3mz11qe2R4kthb0/LK5M9xLq/NrW38rwUnPa0VJAW42h5KSrsaQkv1SJ3Le3NAy/Fbj0tEaTllbkb9iEbGvKBlgTSkkFaynf6fTnSUkG/u8bRYgtICyh3DZS7Bsrdl4KhnpYE0vLS3C333D24df2lRKan5ZW5K3LffsdGi76U4pO038Ys5cNlw6ePPfSlFF9X4XFU4Tqq8DSq8Dyq8DKq8DqqcBtU+Espvq7CR62cgZrjzl2WGqip0vOpjBqoEdTXJTWvuroUarj1dUlNwr4uqRuOvi6pu5O+LqklsK9Lar0MZrcXy7K0wuOAsbkJ5yah3TSILOb8Xp2P19TITcKeLrlJ2NMlNwl7uqSeAPV1ST0u6uuSuwvs6ZK7C+zpkrsL7OhSue1MT5eX6H1eiv18M5fOCCzVKTLWwc1VB8zYTfiAsflFeBowCTfhA4bbJnzAvdomfMDt1yZ8wAqxCR9wk7QJH3DfswnH5rjIXbjURnjGpopE24W3kxI1Y1MlhtsHS/xItD5/8JuxEdTVJTavurrEhltXl9gNR1eX2A1HV5fYqtbTZcFuZbq6xO57urrEtjNdXV6i9ymT1EvbjyGTtX1smSNjncPWOmDGbsIHjM1N+IBJuAkfMNw24Tqq8AG3X5vwASvEJnzATdImfMB9zxfhhs1xvR/QqbQni0ZNlZ8f23Qr+dGbF+31ekaNoL4uqXnV1yU13Pq6pCZhX5fU3UlPl2mh7k76uqSWwL4usfUyLDcNa69SWuEDxuYmnJuE+wSfn0fz/aYTjITFcru6xDK8fV1yk7CnS+oJUF+X1OOivi6xVa2rS+4usKdL7i6wp0tuO9PT5SV6HywW/pRL51b5hEWJn3N5fqt8kgEzdhM+YGxuwgdMwk34gOG2CR9wr/ZFOBaXd4UPWCE24QNukjbhA+57NuHcMltvH/zzpMF//6ZjSCyn3tcltyb3dMkt4D1dcqt9T5fc1qCjSyyn3tclt+no6ZLbofR0yW1nerrUS7icpF6e3ridsAT8cy6doz8sLn/ichM+YGxuwgdMwk34gOG2CR9wr7YJH3D7tQkfsEJswgfcJG3CB9z3fBGeByyzm/BRKyd2JIQrfNTKiZ3y4AoftXJiZzG4wketnJCJCZsWRjH8ogUyfWDTwihZmxZGFdq0MArLpoVRKzYtjPjftDASfdPy0pC2/RGFYrnVYhwtWEL6ySMz2XmILKF1Ocfxp3MwaJMcf55/l1hsuO93OcclJs/lHJeYPJeTZKzeXaYDl3PcXuO5nOP2Gs/lJPXyfttbzu3d5WBevKfLOW6vOXeZwbx4T5eT9D6Oy0l6H8flJL2P41Iv4XKS3sdxOUnv47i8Qu+TwRMiPu2ytC4n7H1al+AJET1dTtL7POy8jlzOd+5z5PIK5z4ZPCGip8tJeh/H5SS9j+PyCtdJMnhCRE+Xk/Q+5y7lCrf8Z/C0j54uufWy30yTPOK0jyOXenfZPgssjzga5BMup5io5LqcYqKSppx3lyW0LqeYJqnJZHdp1rgccZzJwSc/TlRq7xHJI84+cVy2c6PyiINSPuFyimmSrku9hMs5eh/P5Ry9j+dyjt7HczlH7+O5nKP3cVxyx3acz6HP3Ekc4b6jD1p/2/afO4mjq0tsCezqElsCu7rElsCuLrElsKtLbAns6ZI7IaerS+z2v6tLbjvT0+Uleh/u2JhnXHqXPrgTT55y6WwzuONRft3lJnzA2NyED5iEm/ABw20TrqMKH3D7tQkfsEJswgfcJG3CB9z3bMKxZVby7cVRStsFQQavHAqXu/D2gA4ypeVIuOipcGzl9IRjK6cnHFs5PeHcHC/7wIhQ25sBKrcfv48zlqXdLtUrPB04V+5dDD1dcu9i6OkSG25dXXLvYujpknsXQ0+XAz7i+xMuuXcx9HTJvYuho0vwlK+eLi/R+4AnQz3l8vSxHBk8TegZl84lHPA0oV91uQkfMDZ/Fl7AM38c4QOG2yZ8wL3aJnzA7dcmfMAKsQkfcJO0CR9w37MJH7DMfhEOnnnxVH9wOre2gOck9OuCCpit7/ldzrHTdL5LMFvf0+UcO03P5SQZezq3tsgcp+yeS72Ey0nq5ekcvgKek9DT5SQnQI7LSXofx+Ukvc+5S/CchJ4uJ+l9HJeT9D6Oy0l6H8elXsLlJXof8JyET7ssrcsJe58DlxP2PgcuJ+l9TmcQF53v3OfI5SXOfbgzL7q6nKT3cVzqJVxe4joJd0BGV5dXuPOncAdkdHV5iWte4KEKp5RLAc9JOKVcSsJWNU84FyV2hGNrzyOCdvQ7ji0nnnBshfCEc1Hic+HcIRye8CFQ4iPhQ6DER8K5KPFS78LbXoU7hMMTjq2cnnDuEI6Hkn8knAtvn/cq4CEcjnDurKtz4dwhHJ5w7vgqRzh3z+kIH3XPyR3C4Qkfdc9Zphgi6ww4LGWOAYfnzwMq4IEqPV1OMUTWdTnFEFnn2U6FO33lOZenz3Yq3Okrnx6vesDecKevdBwiW7jTV7q6nGKAvutyjt7Hc3mF4c6FO32lq8s5eh/P5Ry9j+dyjt7Hc0mtl6K7hvXHtmnDDscRTWEXng6EU6uaK5xaqD4Iz/n8xbXaTfD64/2vJ9QvLit2OE5fl9RC1delTuHS9juY1h+ldTlEEnoubQm3F9tSUuuSG5u67C7bqfJ14cbmufDATUJHODfcHOHUxtoVTu2VXeHcCuEIp57mra/d+/akuRWO3XCkvQAdC8eWWU84tnJ6wrGV0xGOHQAlaukuvLTCuZXTEc6tnI5wbuWs8VQ4t3LehauFVji2cnrCuUd1jnDuBtURzt1zOsK5e85z4djxQa5wbuV0hGMrZ5bbZY71x7YAYef2uMKxldMTjq2ceT8HliJLKxyb43l/8fpjc19kxc7akHrf5df2xrGKHZ/hCsemiiccmyqecGx3WO6Vs9T2jzNhe5W67MLXw/BWODZVLNyIw/XH1ArHport/NsqvD0Qwg4ZcIVjU8UTju1VPOHYXb4nHJvjnnBsd+gJx+7yHeHcIQPLXoDiEq0Vjs1xp1fBIu9er4JF3l3h2Bz3hGNzfL3ovQuX2ArH5rgnHJvjH7ZubT+ORd5d4WOcqxwIH+Nc5UD4GOcqbcnHIu+ucG7ldIRzK6cjnFs5HeHcyukIH6NytsKxowDWBmW/BrSqbIVzK6cjnFs5HeHcyvnQ1h4J51bOhx3QkfBR95xY+N0Vzq2cjnBu5XSEcyvnuXAsSO4K51ZORzi3cjrCuZXTEY7Nced+FS6U/XiHUDxYce4dQo5wbI6fCzcuZ+0Jx+a4J5x7p6cjnHunpyNcscJrvguXVjj3Tk9HOLdyOsK5ldMRjq2cJe7HE0VjKxxbOR3hXC7fE86tnA+/40fCuZWzxFPh3MrpCOdWTkf4FMNYnJEzxkXKn3NZ9/FBZrF1OcXAK7vf07ZuAZbGJRhW7+lyioFXrksuBt/TJZeZ7+kSWwK7uuTS+D1dctH951zK3WVoXc4yiO7c5RS9j+tylt7n7jK2f5fgcQNPudz33euRY9vHgmcTfHZApGrrcpLeR+vushz8xk7S+2i5u0ytS73ASFPjzlPo6nKW3ufUJXdSQ7zPqouazl8cs+wPSz94hoxxhww85/L0WfbGnUjQ9bvE9rFdv0tsH9vTJXcURVeXk2Ss3l2mA5fYPrarS2wf29XlJPUypd1l1tYlto/t6hLbx3Z1OUnv47icpPdxXE7S+5y7xA4T6etykt7HcTlJ7+O4nKT3cVzqJVxO2PuU1uWEvc+Bywl7nwOXk/Q+DzuvI5fznfscuOQO4Ol57sOd1tPV5SS9j+Nykt7HcamXcDlJ7+O4nKT3cVxO0vs4Li9xzYs7o0d2DeuPtRWOLYESbRfePgzLuDN6POHYQuUJx9YeyfffcVta4dhy4gnHVghPODb0PeHYPazc75yS9plSxp3R4wnnVk5H+BCV80j4qJXTRq2cxq2cjnBu5XSEcyunI5xbOR3h3Mp5JlwX7lQkTzi3cjrCsTke7sOFZLHzF2uS/ZOTaOsSG/rPudS7y6PvElshurrElpOuLrG15zmXOe8um4cfri6xheo5lya7S7PGJXdi0VMu83KrJNoCFatLbAn8tMsQW5fYnWZXl9htaVeXegmXc/Q+nss5eh/P5Ry9j+dyjt7HczlH7+O4xI5kCuvZ683lshwIx5bAdU134VHPX3x+rXx1iS2BXV1iS2BXl9gS2NUltgR2dYktgV1dYktgT5fcKUtdXWK3/11dYrf/XV1eovfhTuZ5xqV36SNOkbHeNkMHzNhN+ICxuQkfMAk34QOG2yZcRxU+4PZrEz5ghdiED7hJ2oQPuO/ZhHNP85b9qSQhtJftuLOzwqJ34e1VVe44rLAsp8K5OZ7258Asqb0ngTscZyn3P87micarcO4FhbQLDyU7+5m0u1x/bHtg7rybni658266uuSGW0+X3Jsperrk3kzR0yW2qnV1yb2ZoqdL7s0UPV1yb6bo6fISvQ93RspzLm0/sU7WNuDcuRpPuXTO5blzNX7d5SZ8wNjchA+YhJvwAcNtEz7gXu2L8Drg9msTPmCF2IQPuEnahA+479mEz9EynT4AQxcu7N+zmeBy6l2/yzm2pd53Oce21HM5x7bUczlJxp49AGN1OceR/LnLwKX2u7qcpF6eDfReXc5xJO+5nONI3nOpl3A5Se/juJyk93FcTtL7OC4n6X0cl5P0PucuwbMderq8RO8Dnu3waZeldTlh73PgUi/hcpLe5+xhJqvL+c59jlxe4dwngGc79HQ5Se9z7lIm6X0cl1e4ThKwczr6upyk93Fc6iVcXuGaVwAPgjiFRQJ4tsMpLBLA4xoc4VyU2BHOrT0PJJfEVji3nDjCuRXCEc4NfUc4dw/rCOduSx3h3J2mI5xbOeudyG1HjQTwEA5HOLdyOsK5QzjuJf9QOHcIx3mvAh7C4QjnDuFwhHOHcDjCB8XlA3gIhyN81D0ndwiHJ3zUPSd4CEe/4W8hTTH41nlWSkiTDPJzXE4x+NZ1OcXgW+e5N4E7quU5l6fPvQncUS2fHj3ZsjeBO6ql44DNwB3V0tXlFINvXZd6CZdz9D6eyzl6H8/lHL2P53KO3sdzeYWB1KFwn3sTbreUBpPcCqeWwGCx7MI1tcKpVc0VTi1UrnBq7VnV2i784FZb7LwbVzi1QrjCqaH/4Xf8QDh23o33x4mdd+MK51ZOR/iolbOOWjnrqJWzciunI5xbOR3h3Mp5LvxXxjQtt63Kh8s+R8KD3nc1i+Nxv3F53abdX1qONksl7Lf/lricv3htuG4LsnYCcv7isust+kHEthxyseWw5fbr8WG3dluO9F6Ox+XI7+V4XI7yXo7H5ajv5XhcDrvacujt5MtS/Xo55FemWF12Oa7WdzjLcbm+I99EWEntcsT3cjwuh76X43E5LteV3rPjaDku15WeR+nlutLz5bhcV3q+HO+u9HE5wrsr/bAc7670w3Jcris9X47LdaXny6Hv5Xhcjgt3pUfL8e5KPyzHuw17XA6BFtq43BxKfHya9U02tCB6sqGFy5MNLTBSbZe9OH8G4X7XZ1hyu3kXaNXo6hFaCp7yGOJtqkYIehBo0FOHrh6hNayrR+j5QE+PEbrpf87jfkQcQm0zJ0JL3lMeo+337kQ7+B5nqI+exxnqo+dxhvroeZyhPnoeZ6iPnscZ6qPjUWeoj2l/pGP4MAjh5hG6Ae/qEbpb7+pxhj7H86gX8DhDn+N5nKHP8TzO0OekvNN2qVrrcYY+x/M4Q5/jeExT9DmOxyn6HMfjFH2O43GKPsfxqBfwOMUeeR/OEaLU8xef8maSZ4inZ5bj/LJwniHJOi7HFIfY/ZZjhnx8Zjm8C6t5isPxngsyxUl6zwWZ4ti954Jcrf9wF2SKA/2OC1Jm2BV3XZCr9ajuglytS3UX5Gp9qrsg+l6Qjwvy7lS/WpB3p/rVgrw71a8W5N2pfrUg707144LUKTpV1X1BUns9tU7RfDoep+gnHY9TtIiOR72AxykaOcfjFL2Z4/EC9+PWC9yPWy9wP65N0ec4HofrATbZV9vXn1/Opw4I/XYXbM9GQAp1BOT3WY5IHQH5vZbjcve+nC/H5e59OV+O970vH5ZD38vxuBxX6zuc5bhc33E2IDRSR0B+r+W42pUEZzku15WejY+N1BGQ3ylKqSMgv9dyvO/I/rAc7670w3Loezkel+PdlX5Yjst1pefLcbmu9Hw5LteVni/HhbvSg+WQd1f6YTnebdhtOf69/uv//uFvP/7hjz/9+e/rO37+j//8y5/+8eNf//LLP//x//739l/++Lcff/rpx//5/f/+7a9/+vN//fNvf/79T3/908//7Yfll//znxqj/k5jSutC/9zd1fw7y+vPYfuPktb/GJef/4fw5X9Y95br/9FVx6rl/wM=", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index b43b2aee8e5..ffce1c00fe3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1azY7cRBAuj8fzs8NqVkGcEQfu4xl7ZxdxCEoIi0CCI1dnkuUNOIIP8BBckHgWblyReAdu3JCIFGV70zX+/Lnsncm4EyWakka2u8v183VVdbt7Iqko8tehHEAq5Bt/M/XPA+iPb373/fPiMEqnpLdP+ReL7HJq+Nej/auplxmFkb9Q+YHwX4y9nC/LSj76ononN78Z3N+TKj5C+a/jF9L/9zt81th5UIYbW0cPvXwJIPtzsL1H+du8fRQGm638L/rHZiv7KoztmcsTlyM/SRVHTocW5p715adeZiJNioy22OBR25zdv/j7U4NPoI/zZkR9mLNj6ouhb+Lv59LESeUrhgn09ZmLEfkw9PJZp9o2IH68F/8Otn3kr87X38g/nLBjo01xPJMm5sp3arwXtVxVD7exHmsceNz70GPVXo6hPvTwHOJoKs147DGuztUPjA0hH8egm8dzAn08Brh2Qt+YrHzXNif/d5DLfGyrNe6B5+h8l/FG/ScSdE2WRtKMzVia+HAsx4atZ9Tn6GFZ8XFfbLS9zbK05mPsaA7MpR23wHNq53zAOtXXfeaDK3+15oN9cbXqmoUd5+soMHZjA7uRtGOHdVDvETtt+1b6w45rRBt2HHfjwNhNDOzG0o4dzhN6j9hp23fSH3Zd8+kkDD6XPPchad8J+SVwFfIRCe121z9ALvOxTowV1T+X9hgLjNM2jhQnjCNrTTGQ5poCMU6o7XupcOI44nm6bV7kecGqUYHWZXvH0SHrq33iCGOF46gLpynpvu+fFwdSRLZgHLFORwNpYncCfibU9gPgFKKWB96fWzI+aOuA/HFkjSW+i7yJNH3W/ZCEeH/0V4fjX/5+JpD/Zf/+ry9exsetz2AX5wPqT4j/Z/+M8aLX4QF2Xq+L9HpVXBd58eRJtinukXxHA8AJ92uO3zpbOn7r9CjL+tZ5TfPdto7rt8vQ8ANtGxA/3jtKqO1Xf7XquBU72LbPfpCFq7VXpHv2Lrf7ri3FenWxWWab9eN8VazO96otb3IvmPeiEGtrL4qx57WqSN1nJWs9hPvLf4Nc5lM64nTESemIU91mkXA4cb16l+esPwGbEHNW4LViZp35KHE8so1MVuzg2f8/IJf5lILMtfliubpYZvkyW+Vpcfkqc22gM8O9z3Y45zGvOeetb+tdx039dfI/iCq5zMe2Yt6o3YFz/LXVTfSN6a79mw93wLCtbnbt2YQ+u1BMdz27wDzB8Uio7V/AJsSejbXWj1quInZ+7LLHaH036P9ZXMz9R+/oe7rHwe/q/0l4b+aZVDL/9/cz4LHO/y2brH2JB2Dvc7I3Mey15ike3ziqZEZRXbd1TodYzcWuuWjXqMMuR4yj8o89k4u7VVSXiedFsTRjmNcvE4PfqtVzadYgfVfrge5loc6Q+26ubjobzmlsamdm5e7+WvhMDX5rvjqT5nw1oj4cf8Y4MfRgLLTFPr6LsW/VYOt/LFacDqjPOqtkP9hnR7pH2/V/HesMLaE+C7eu/13NevK/K09xvNry9GMjT61cUbveRK7UzubLut9WLUH+fWsJj2vb9xzHmYX5I7IVazDzozz+9lnAGH0d1e2zYqvrzDfEun+Tnz/eZHmxeJq6x+Vd6/654lBW/Rhrjsb+WddDzI/zIfJ/AvPhpxTPiaHP8X3VwRe1XG9lGG3Dst42LZv8cdnkV90nZdNG7ZtBH+aBo/f8M+KFstSOhPivvAAdkwm8o++fGfonpL9mt9HGZ7Izg39m8Lvx+cy/pHGLvvd9fnKrk+RjG9umsRMir25Sar0p1ml6maVPszS/K69eAMXBhQthMgAA", - "debug_symbols": "ndvhTuJAFAXgd+lvfsydOzP3Xl9lszGoaEgIGtRNNsZ337KRaugUcs4fYw2fQM8ppe3tx/CwuXt/ut3uH59fh5tfH8Pu+X79tn3ej0sfn6vh7rDd7bZPtz//PKTjD4n/j399We+Pi69v68PbcCMt59Ww2T8cfy06/ofH7W4z3NT0+Xs15EQYIUwmjBKmEKYSphHGCOOEIXqgRA+U6IESPVCiB0r0QIkeKNEDJXqgRA+U6EEhelCIHhSiB4XoQVnoQYnJRD43lTCNMEYYJ0zgpibCCGH6PbAoJ2NRz40SphCmEqYRxgjjhAnctEQYIQzRg0b0oBE9aEQPGtGDRvSgET1oRA+M6IERPTCiB0b0wIgeGNEDI3pgRA+M6IERPXCiB070wIkeONEDJ3rgRA+c6IETPXCiB070IPo9iJxOJqqfGyFMJowSphCmEqYRxgjjhAncSEoMEgZlBimDCoO6bcgp6RfKqcxRY5AxyBkUBJLEIGFQZpAyqDCIaYQwjRCmEcI0QphG5IVGtHpCY5QzJAzKDNLrqM5QYVAlUP9UVsunvXPT2Tvqn8m6TBpODCeOk4BJ/yTWZSI4yThRnODpFzz9gqdf8PQLnn7B0694+hVPv+LpVzz9iqffP5MSE4k2J4qTgpOKk4YTw4njJGDSP4NymQhO8PQNT9/w9A1P3/D0DU/f8PQNT9/x9B1P3/H0HU/f8fQdT9/x9B1P3/H0HU8/8PQDTz/w9ANPPxrxHTaMQc6gwFFOiUHCoMwgZVB3KxXV6Wqctvk0SGVQY5AxyBkUBOofu1uVL2PNZ6ThxHDiOAmY9I/YLxPBScaJ4qS7Idh0Ms/Gx52TipOGE8OJ4yRg0h8GukwEJ/0PqFL8tF2WEjNUGdQYZAxyBgWBFgZ1riBhUGaQMohpxMIUTfm+elVmV6/ywqhK1QlVnX2QLMyQVJleXpXZy1sYuriMFqYuriBhUGZQP9xaZEJltsoXJi+uoMqgRoS7MHxxBTmDgkAL8xdXENPyhQmMK0gZVBiE7wEN3wM6vgdcmHJIbfqambzNUGaQMqgwyBkUBFqYJ7iCmFUezCrvHyfn6WMoz48g+hMFl0nFScOJ4cRxEijRhaNwP210YwozIjjJOFGcFJxUjHyOS3/Wh+36brf5ujfk8X1//+NWkbe/L5uzu0ZeDs/3m4f3w+Z4/8j3rSPHNa+SVqry+3jdf1yUbCvRfFw8ruTxFMMqi47POj7zPw==", + "bytecode": "H4sIAAAAAAAA/+1ZzW7TQBBeu3Z+mlYJ9EXsxG7SW6US4MJDuGkrwVP4AZC4cUXiHTghgYSEOPAEnDlxR0LigOi2O82XzxM3Id7SSh0pWnt3dv52Zjw7CcwcAjdGZgMQInvuoeveQ1jfOv8duvdkM0i7xLdJ+pMkm3QV/RqUf9R1NAM/9BOh78n+SdvReVrO6aMuwrdz/uvB8wMz9w9f+sv5+dR/r0Zn8Z2j0t/ZWngE9I1pPramfuS/ov/Y0fch+xM/smfWl60fn8BZox80qEuyS35lgE8XdPOgZx4QP0O8DPHfNl7jLQ2In8jD9pFnsV2kyDpQ1gJ6jhQ+kcLnLtIS26AtgyWjMdVz1/ggDp9B2CAfpCX5lc+6CT6a3STmYlhr0Mf3RY+WqYKstYk3rnVgjc8A6yXUjWGL3lFfS/8F0GU8lrUub3FcHrr3ZDNYOW8J/5vKW1rc1uWtWJF1oKxxfogVPrHC5y7S6hu9ZsS1LWWfZ59LWMfIVHMzyhYqOqItYpqbutHG30vST/se4hzbdVXbYS3rMedd2a6l2C42y23XgrWWYjuZe2aasx3nCLRPy499xpz3EeryfqDga7ld5LY0XgFdxmOe6CudW2oL7VvgwxbhzdtiGBA/0Yn1Fv4S421FVkP7YlO1s9zVYsKdudHSeuOee2Zeb0Rl8/qPJ5d540JnkIvPFPnHhP/cvW+D/jJGG8h5Ni7Ss1FxVuTFyUk2Kx4SfQsh2Em7S/qqjbi2QODaE89Yqz25XumQzMasHneir6XxFugynsC9ne7tJHBvp0WZjfFnJ5uvms6XxXg0mQ2z2fg4HxWj/bXypXzT8Psr+zz3x67qVrEh1q1aHR2aqo/hnTCmuddu1OpWvDfW3SW1mp/rek/33kzryQhod1yUkUHzXfx/4R3QZTwBL76bJ8PRZJjlw2yUp8XBv3zrb0sviXPOqr2kdXMO9pK+AV3GY1kxbkRu3z3wm8rb6/bjZM7S+A50GU+Afc93/5ftgLlpWl6O1m7vaY/sk1qe98p/OnwH+WjmND+45x7gXNd7E5l2ia6FI5D3E8kbK/JquZb7OV9A3s9mkTfm4wjwxFZ9o+cNlKtVI5cFtqPgf3Wj9ZVfRBPvgnX9O8HX7qVavumbahzJXvFpubMhT5/3Sxv7VobfIAfbIC5X11ezT1fB13LuwFRzbovW8PzZxlrfFX1hme/jXvR9rf7S/ivR/DSkNe6NGEUP1tmC9CK0+oZ75aGiT53dNDsI715D+tfFKZ7Xsjj94UaMUy1WRK7/ESsLPdlyUW8tlyD+urmEz3XZnYj9TLP5lGTFHFzXl+b6/acbrSyDYFE+zbfqesw+atdZvn88y/IiOU3t6/C62rUvdijn6+hrFtruXe5CjI/fQ8T/I7hATPw5VvhZvH4NXrBkvKChzEXl4ly3rOJvlVV84b1dVmWUtR6sYRxY2HHvaC+kJXLEhL/jCMiZdGCP7B8o/DvEf0FuZY7/S+gp+D0F355P7DaJ36LuTf+/esGT6OMcyya+4yOuzkNqPCvGaXqQpadZml8XV38BGKLzzYkpAAA=", + "debug_symbols": "tdpdauMwFAXgvfg5D7o/upK6lWEY0jYdAiEtaTswlO597KFxS6y2nAN+CXHwJwffI8VS9DLc7q6ff//aH+/uH4erHy/D4f5m+7S/P45HL6+b4fq0Pxz2v399/HhI04vU/+c/PmyP0+Hj0/b0NFxJqG6G3fF2eus2tnC3P+yGq5xeN4uTQ/3t3DD9eOrPzSBt1eY1rdu8rNu8rtu8rdu8r9t8Xrf5WLf5sm7z6/ZaXbfX2rq91tbttYb22skYYZwwmTBBmEKYSpiGG0+E+SQy3mbTLnPgShgjjBMmEyYIUwhTCdPPQWnnbjq+zRcmJ8IIYZQwRhgnTCZMEKYQphKGyEEQOQgiB0HkIIgcBJGDIHIQRA6CyEEQOQgiB4XIQSFyUIgcFCIHhchBIXJQiBwUIgeFyEHp56BpOpuW64WpiTBCGCWMEcYJkwnTzYGmZG9Gky9MIUwlTMNNS4QRwihhrG8in43I5TNSc8JkwsT35rKftkKYihtJ3Qu1eTrXYrFClSpOGkwk4URwojgxnDhOMk4CJ3j1Ba++4NVXvPqKV1/x6itefcWrr3j1Fa++4tVXvPqKV9/w6htefcOrb3j1Da++4dU3vPqGV9/w6rsTP0qeGRQMKgxifmi9ESgnBgmD+g/fZvMik4UtkDHIGZQZFAwqBOovS5Qsb6ZEXRDHScZJ4KTgpOKkwaS/HvE1EZx0O0KZJ3pl+v/jghhOHCcZJ4GTgpOKkwaTT1YH3Ou5X7q3BTIGOYP6w4a/L8b4YjFG+rPjcVidUbZFQPvT1nHUn79elsXXaw1H44ybQcIgZVC/uNllRp4XyBmUGRR4cbU/Hf8OVQY1AklikDBIGWQMcgbBY54KPOZpfxb8Nenf7BTz40uqsUDKIGOQM6gyqBHok40W3yDmlhtzy/vTT52HIV08mWp/+vk1yTgJnBScVJw0mPS3Q2g9dzptSyI4UZwYThwnGSOv49Gf7Wm/vT7s3jZP3j0fbz7spXz6+7C72Fb5cLq/2d0+n3bTBsv3vZXTndecNlpkemiZDiWljaQ8HU43WXLbSMh41fHK/wA=", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests_inner(&mut self) {\n self.public_call_requests.push(self.next_counter());\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push via a method call\n self.append_public_call_requests_inner();\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.l2_to_l1_msgs = sort_by(output_composer.l2_to_l1_msgs);\n output_composer.public_call_requests = sort_by(output_composer.public_call_requests);\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_0.snap index ed7028460d5..10c2bf36408 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_0.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1ZvW7TUBS+juMkjls1gmdgtxO7abdKUJAYGdnctJV4A0YzsrOwgMTGhgRCQmLgCZCQGBALGxJIvAO95Z76y5cTNyW+QCWOFF3b99zz893zY98EpqbAjV2zBomQH26M3diB+fDkt+fu0/Uoi0lvm/J30nwaK/61aP8kdjIDP/JTke8J/7Tv5Nyqavnoi+gdnPwSuB6ZOj58+S/759P/qw0+S+xcr/ztraUbIN+Y9nNr34/9Z/Jv+pGfJy7WHpv5WJP9aRGrdBPsNxALqLdrvPhZBKTPgB04J/qHZGvb+xqQPrGH8ZF9EOwixdaRMoe5jHOoJ1L0XEZZW0aPHUuxsq7N+iJ+9Jy8ruIH2tYhfrw2bg0+u+ZGm6NPYc2y2Ok2YBcq9mwq64IlozGLOaPp0fahKfd/Vw/Kkv4henot6sG9wr5l7/uwbs+N6XqUiQ+B4p+1ZQL2YJxFpo4DXCu9IyL+B6aWue2uNd1coz3VxJVrtDwbGn/vRSnU6JDsYXyaarSs/V+jF2V3aS5U1nl+L0jZR6zfWh3rKD4iFpxjt92o1W8trrTeP1KwCxuw43z9272PsVu1990x7WEXrIgdx13PM3YDBbueWY7dAObkGrGTZ3dNe9hpcRcr9rSIz67UUj5bsCRzQ/LLwGjIRyS0247PQC7zsU6MFdG/ZZbHmGeczuJIcMI4Qp1iW4f4GeOInt0zNU4cR9ynl/VF7f2Ta5Snd4oLxxHGOpMWRyHgc5E4wljhOGrCKSbde+4+XZMCsgXjiHVa6phF7IbgZ0TP7gNOPmq55zPCMeODtvL7kiVtL3Et8kYKb5/mhLdyo8XxvbtOQJ/2zSlzXINwDveYv53Y7lixU/tW4vo8BJ+4Rlni7xThf2hqnz+4a8mxsKp1iO9ntbCa93fPPU/Xo8La8RHsWIj9at7vBOZChZ/jZ0PhT4BHMBsRP+8NYoKyEPP9ap5f1veM3kfwWxP5H7nR8n4n+/A9ekhzoSK7yfZAsV2rqRH4Id/LPuNiuvOrhp7aWtUYcc9A/RHxP3H3mDcydtew83haZseT8rgsysPDfFZeIfmWJAYTD/rL6WRnNs5n04NiUk62z9WP59Gr9MTL+m343I2+eqLPMzfUKXrwPwPJTZt/L2iNYId9ANdyHxD+V6aW+dJdJ0Y/w8TzstekXzsvw/3smHn9wv8W9L9Z4pNZ4hPXKu0cBLHS+jlj32vwwxLjKPzv3Ij9VGT2FT+0sx7hHyj8fcW3LbP4fiBr/7VejhhwL2/yV8MnVvixn3J+ae9hWu71SY/WKzEWOP4w3rFXSq603gOKdDzZGefFOJ8UWbn7p3vQrNg+mOVFmR5l9nZ8nv4twaSq5zE+LfXdvfQF5sc6gvyfhPfk99ldSw5Eij7L962B76I1vVvNP4urRf6wWuQX3cNq0UaZS2AOc8fShrtHvFCW2BER/1d3L3sygDWyfqToH5D+ObuVZ/ztnyj8icJv9+eLyHMj+t72fxKnOkk+PmPbJHZ85NVJSk1n5TTLdvPsKM+K8/LqJ55VNIdNJQAA", - "debug_symbols": "1ZvdTuMwEIXfJde5sMf2eIZXWa1QgYAqVS0qZaVV1XffZNWEbt0f9WwHJTeoAX9zJsnnGBKyrV6ap8+3x/nydfVRPfzYVovV82wzXy3bre2urp7W88Vi/vZ4+O3KdV98/jv+43227DY/NrP1pnrwTFRXzfKl+xhDW+F1vmiqh+R2dTGYKe7HcqDDoT/ryotteTUtT862vLctT7blg235aFs+2ZZn2/K2s5ZsZy3ZztpgO2vDrbO2YwhgAsBEgEkAwwCTAUYARm9nogMYwIMIeBABDyLgQQQ8iIAHEfAgnTnWUQdG6fKUltTXl1SUP324svZXgfZjOmYSwDDAZIARgNHbGXYA4wGGACYADOABAx4w4AEDHjDgAQMeZMCDDHiQAQ8y4EEGPMiABxnwIAMeZMCDDHgggAcCeCCABwJ4IIAHAngggAcCeCCABwJ4oIAHCnigpz1Qcj2jSY6ZADARYBLAMMBkgBGA0dsZ7xwCeQQiBAoIFBEoIRAj0EkfyLmwh8jFEhIEUgDyDoE8AhECBQSKCJQQiBEIMcIjRnjECEKMIMQIOmMEpx5qpSmggEARgdJ1KBUQI1BGIP3vv8F1uK2mfGVoTn4/NLNcGTpcD3P383+7PnczcORd+0l2TSPtul1JhxaccNF3mGjf8Vv7Pnfqb+87TbRvnmjfeaR9U+ynAnEoupZJdq1T7Dq6SXbtJ9k1TbLrMMmux7pCkvRDScuux7o+Xu56rKvj5a5HuzZe7Hq0a+PFrke7Nl7qOhmujV39Mw8qQxjqB77y7yrtdU76wTFqkRDNE5J5ApsnZPMEMU9Q64Qzj3rvmeDNE8g8wXxO53vMh69na7F4tublDkcp+WEfki/2Qe5w1Uhh2IcUiju+Iub7oNYJ6swTvHnCPVwaftFvPxa2ajBPiOYJ5vNB2TwhmyeIeYIaJ5Bz5gnePIHME4Jpwq7d+jVbz2dPi2b/nszr5/L54LWZze/35ugNmvf16rl5+Vw33bs0X6/RdOeTPNUUQmdQt9nm1T5Jt9mdi/bpWk1O2tQ2+Q8=", + "bytecode": "H4sIAAAAAAAA/+VYT2vUQBSfNMnuZlPpoh9DkGQ36W5vRa2Cn8J024J3L140ePMmKILgwU8gCB7EizdBwe/kTp1f89u3b9PKZqrFgTCZmTfv996b92eSwDQtcH1kNmhg8tP1ieu3aD1cPPtunG3W8kTgdsl/lhXTRNGvQ/knieMZ+OGfgb8n+2d9x+d+3fBnXYA7WDwpvY9M4x++9Mf5+dT/RovO8J07tb+zte0u8Tem+9g68CP/Gf97fvgXqfO1J2bZ13A+Hdoqu0byG/IFxo2MFz3LQOAZkoPXgD8UsnZ9roHAgzzSPjgH2C5WZB0paxzLvMY4sYJzFXnBNmzLYE0PHDkncaQfMk7YIQ7zQg6UZ90FjmY3xFyP9u27Ptus5dAhUPSzeDdJHvugRsam8QPei/wXC/rKNDxvuXcNW+YZT3F94TyDuaHxerc5yzOhkEfapy3PYO//nmd2FN6RWAuVfZ5rWyZ1jEhHLY9tKTqyLWIxd9v19p7wjPas8yutfo0U24UttpPxGnu2XV+xXdxiuz6t4Z1th7kHpjvbafkjUeTp0D4z5IOBWW1YS4RehnojdOTGclv+z4mvpJOY7CvJP2qLLUV+H7YILt8W40DgQSepN/AR4wNFViP2xQptT6yB9qFpbPbBvaeEx/pHLbLIXMTnKO9hQzFOFDm1OjKkdx7znYd9S955QP/INDp/dO/wk7BuMKA75IvqZX333Xy2WSutHJ9IDmmjuF7WO6W1UKGXtXtboU+JBjYbCXotN/UVXmzzg3qZHvt7Cj3ziwX9Y9db2h9CPq7JQ7EWKrzbZA8U2bW80Cc9cPf26RfT2e/aeipr3dhI5j3GjwX9UzfmuEEfbSDnybTKTybVSVVWR0fFvLou+NsGH0w94FfTyWw+LubTw3JSTXbPxef/Mxe5K13Ve+YL1/u6K/n8fmdM4PA/NMSmjb+XYg9sx3WA98o6APrXpuH5yr2nRv8fwt/ebwR+rODzecq6DPp3hP92jU5mjU4yV2nfVGyrHbPqS9L2vRY9bJN2BP1713M9bcu52ncj6AcKfdsdpEdr2KvVcmD+jVq+9H1TX1xfzT7afZHrqYyvtrtVW63UvvfZF6T/sb9jL8dK5zWgzMaT2bgox8WkzKu9y65B83L3cF6UVXac2+H4PPwd2KRu1tk/beu7MeqCpOc8wvSfQbt4vrh3xECs4Fm67y10f5rTo3p5LqlX6cN6lR7Yw3pVRqyltMaxY9u2G7O9mBfkiAX9NzfGmQxoD/aPFPyBwF+SW5mT36+pQp8q9PZ8voKf61n3rv9vnmIK/jwnZYPv+IirRUhN59U0z/eK/LjIy/Pi6hfKQsZLXSAAAA==", + "debug_symbols": "1ZrdjtowEIXfJddceMb22N5XqaoVP2GFhADxU6lCvHsTRLI0gaCcMlVys4oXf3NOwhnZgM/ZIp+dvj5Xm+X2kH38OGfr7Xx6XG03xeh8mWSz/Wq9Xn193v87M+UfCtf5h910Uw4Px+n+mH2QME+yfLMoL50tKixX6zz78OYyaU0Wdre5Yvl+6s9JRlG3fFItz0a3POmWZ93yVre80y3vdcuLbnndrmXdrmXdrrW6XWv7dm3JMMBYgHEA4wFGACYATASY1J9xT561SzWTuDsy0Vf1o2+Vf/y4QqpSVlz6JhMAJgJM6s94AzAEMAwwFmAcwHiAAXLggRx4IAceyIEAORAgBwLkQIAcCJADAXIgQA4EyIEAORAgBwHIQQByEIAcBCAHAchBAHIQHucgsamY5GOTCQATASb1Z6IBGAIYBpiHOWBj7I1h41qMAxgPMAIwAWAiwKT+TDKPGfEVQ9TcVicCGAYY+5pp9mlyAOMBJvzzNjTVn1ySvJgaPN2mBokvptadFcrX/zYdx2g6jdA0GTNQ12SktmCitHzTSH3zf/X97K3v79uO1LcbqW8/UN/sqlZgsS3XMkrXYZSu4yhdpzG6JjNK1zRK10NdITlWUzm1XQ91fex2PdTVsdv1YNfGTteDXRs7XQ92bex0rbg2lvUt9f8kTpYRyCKQQyCPQIJAAYEiAj3ebVhb58DKi99tyblYTXYuNRWcUVcgdQX3BoXvL6Vd60tp8m94Sp7qe/DUuocnv9H1U7D1PXgbWwqifg9BXSGqKyRtBXlHluoNaHHZSquQugKrK6j3gzh1Ba+uIOoKQV0hqiskbYVg1BVIVeFSjH5N96vpbJ3fDsguT5v53XnZ4+9d3jg6u9tv5/nitM/LQ7Tf52fLZ0HF7pYNlc6vQ6YJsVy3tuUwuAkFKVQL5T8=", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests_inner(&mut self) {\n self.public_call_requests.push(self.next_counter());\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push via a method call\n self.append_public_call_requests_inner();\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.l2_to_l1_msgs = sort_by(output_composer.l2_to_l1_msgs);\n output_composer.public_call_requests = sort_by(output_composer.public_call_requests);\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 6eac05f4754..5fa54aa8f43 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/91aP4/TSBQfr+0k3sRxdPcJ7hvEib1Zui2uuvLK67yBlU666sqrjHTVtYeQkCj4BAgJiYJPQElPQwMSEhIFoqFiZ5mHf/vyi+OwnhUw0mrG8968P795b/5lA9OUwNWRuUIRISPXSNz3AdDD878T9z2/WskTpbdP+cfzokiIfz3av0yczMCP/LnI94T/fOjk/Fo38tEX0Ts6/xtDe2Ka+PDlv8yfT/9/bvF57Hx9qXwVuunRjhR8M2AL6o38YFAGSp8BO5Am+g+VrX2vCYHSJ/ZofGQeBLuY2DojNIwlpKGemOj5HmVlhseOLQkZ12duiR8DJy8ifqBtB4of28aNwb5fXG1z9DWM2RY7UQt2IbEnJeOCLbUxmznD9LB5aMv9ffXInA6UnhP3Pb9iYXgNlB/DHvyYKVkB8XHkx8cvew6eHXqSnYvsQ+V73/LHfrDJZY5xPmX+bb2Efszz2DR5iGNHQEf+ZyDzyLW77JGe1rLOe6Tov649ku0RbXvkkNjalmuB2czpkPR1ydtvVVZGZEeKxvbWhMj0sX/KWTsiPqJtB4of28Y0OSZ9v7ma7Z/7nj0OiD0MO332mHjGLiXYTVqwS4EmbcRO+n43/WEXmm7Y6bhLPWM3NZvYpS3YTYEmbcRO+v4w/WH3tXE39YxdRrCbtmCXAU3aiJ30nZr+sGNxl5JxVz3DsXlg5wg5s9g9/0/ox/Wu6zlC+B+CzL9cu0t8fK9r+t+u9r0uIU2vS77vkww7Npf7YveP2Y5dSLALW7DT71W29HnPY3Okz3rbcus29CN2+57R74DMf107I+N1fHg6E8+1PxgfofJZsNSxg/mg/f3P1Sw+9Lzpvrb4CFqwixR2nt5BF21rBJtL9q6k9wwZFxPeRNGE939XW4zfuLaNXfbGh/fOu0ov2y/iFtuE/z7IvKf4d2EjOcbyLwa5t107M3yvQZ2THX7o3BT+B6629LdKZkr8YHcm4Z8SfnYOzMzmeitjhT+sG5rolFiIgNbn3d1i8A7s0BjEdXd/GT4Z4Z8qHltmih+xYut5qmSwuy7Ggo4/pMlYzBX2JoA59UjpZ7E4VDxCR/4nIPNxB5+65hT6JOdFFoM679MdfuicEv6nrmY5xWIGzxr7xsxQ+YOxIGNZTuHvcrZEQPOdU5fufHV3fxk+M8KfKR5jmryZAS1VNJx/nZcTogdjQccf0mQs5gq7W+i3JP3mgTScZ/2OPlXfyJson4dmu8/yjfGPNun4F/7nrsb4ZzEovv/oMajXbhaDgcIEZSHmY8Uv4wem/d1Kr1EvXG2xiYPL9uH5a6psZ3e9NtsDYvuuc4/8NuAzLlbHn+8BF7bWDUZ45zJKf6z4X7lv/RuNYHjylXaerar8bFmdVWV182axrn5S8m3B/z3oW3+1Wh6vF8V6dVouq+XR9esv54vl8aIoF8WyzKsb161/XR6drouymt/K7edil37J9UHd0HGds2XovuWuqflFXqz43wvv+d8H1/5yLqk39Vm+KNjOF2ypL2SQvqi+3JfUm/xhvckvug/rTRuFNgYarsG2TNw34oWyxI5Y8QdOgMzJCMbI+BnRP1L6L9lN+nAP0LJC0if8dn4+ijxXo+99//Z3oVPJxz5tm8SOj7w6T6nVulrl+Y0iv1Xk5a68+gQg6rkVtSgAAA==", - "debug_symbols": "1ZzRaupAEIbfJdde7M7Ozs72VQ6l2NYWQbRYe+BQ+u4nkSYVo5H8sOnkppi63/oZ/52JJOazel49frw+rLcvu/fq7s9ntdk9LQ/r3bbe+vxaVI/79Wazfn04/Xflmj8+HMe/vy23zeb7Ybk/VHdeiBbVavvcPORQz/Cy3qyqu+i+Fr3BQvw9VgKdDr1fVJ7LTh/LTi9lp09lp9ey0+ei05MrO70vOz2Vnb7sqqWyq5bKrloqu2pp7KptGAWYPJ4JDmA8wBDABIBhgIkAIwAD5CAAOQhADhjIAQM5YCAHDOSAgRzEK++Hc8dkGi4DGtv5Nfamv6yUcls56ofxnIkAIwCTAEYBJo9nxAGMBxgCmAAwQA4EyIEAORAgBwLkQIAcJCAHCchBAnKQgBwkIAcJyEECcpCAHCQgBwnIgQI5UCAHCuRAgRwokAMFcqBADhTIgQI5UCAHGchBBnKQL+cgk2uZHHX4sMCH0B1DBLnxVcIzazuYOZ/bBFM2bMommrIRUzbJlI2assmWbLxztnS8LR1T5di7yWvOT6/iXq/ybuzCOkIZgLxDII9AhEABgRiBIgJdbA7kXPiGyPGEKb58YuH3dNSWTjalc/lEx+/peFs6ZEsn2NJhWzrRlo6tqkyT153BY4swdmUdoYBAjEARgQSBEgIpAmUAYodAV6q4xBaqj8N6ECFQQCC+DfUCyxGBBIDi1C05+q5wRN8rHHHqphNDVzhi6GUriq29k2zpqC2dbEpHJl9Z7Dsd7i108bZ0yJaOrbojbEsn2tIRWzrJlo7a0smmdJKzpeNt6Ux95me4haapT28M7x0lU3tHgy0dtqUTbelMvrIGj3c02dJRWzq26k52tnS8LR2ypRNs6bAtnWhLR2zpJEs6dOVyjjGXlefu1yVZbgxNsS3JSW68ydTtkNQ8f2btZ2lNs7QORq29k07BqfS8eabecVLvax/9eG+ZqXeaqbca9abuuJuk9yvAK1dzGbf2bpbWfpbWNEvrMEtrnqW11Q5J2g6l3Le22h+Hra12x2Frs71x0NpsbxyyJrO9cdC6YG+8/6q3/i736+XjZvV9y5qXj+3TyR1sDv/eVmc3s3nb755Wzx/7VXNbm5872jR7l+rv+yTuvrkavtmsX5goN5v++GxYUIj1q9av/B8=", + "bytecode": "H4sIAAAAAAAA/9VZP4vUQBRPNpv9m90N+jEE2ewm7l4nYmUnWNnl9u4aRRAsLFOJIFj4CSztbWwUBMFCbOwEBT+KO+c893e/vGQDlzm9gTDJvDfv3/zem5ld39s13/Zd7xxNhPyy/dD2HaAH2+em/Z6fryVD0tum/PU8TYeKfy3avxxamb4b+XOR7yj+876Vc7vYyUdfRO9g+4zhPfJ2+HDlv6yfS/+v1vg8tr6+I1+F7rVoxwR888AW1Nt1E4PMJ30e2IE00T8iW9uuCT7pE3s4PrIOErtQsTVWaIglpKGeUNFzGWVJbDCWfkUveniM9TAOUU/Qgp6h4k+bOR97ZfyG5EevBT9ikuUrPvbd+Pi3bg7ArpZkJyKb9+625Y/cxCaRNcb1lPU3a3UNxs0j+17o7fIQ5/aBjvyvQeZ1+96kzvfc+N24zov+i6rzPbJnX50fK7bGCo3r6VjRM1b0XEZZM0V2l2h1dQhltllrxUc5L3YVH9G2DvHju2khjd2yvalzH2BOFa5wjOPaUezRYhdQ7CLHsZsosYtqYjcBmrxj7GTsjtde7ALFHtd7KZ89UKbsHYb/LozjvKb1XPifgcx79n3mlf3n3HJUz+dcPxAfWpw6XjnvsM7w/nXf9ho+sD7X1Wwtt1ycGTUc8r5RhY8cxnFeU3wI/0OQeWTfZ8p8qcuO77YLn/R5Ff7wHhIotno0L1R4B0QT3ge2N/SP9t1gbKL4j+ewR6S3B/IDZS7bJvxPQOZj4se7vBYbwYmGoQ7IFQzV7Recr1V+VJ0nn9rexPETyYwUP7R6zXsK8keKbzOvXDNkrvRBsaOJTrkbdIHW5lnWxOAz2MExCIvm/mrxmSr8E+IxLSZ+jJVWkyKSoe2zaAvjTzujYK5MFJ2YU89Jv4ZFxqvQkf8lyHxB/Nre0DSnApAr+7aGwR7pjPb4wTkl/K9sr+WUhhntXN4UMwH5g1iQuVpOic5/kVNnzo9Fc3+1+MwU/inxmBYTP8ZKOwdyXmr3KcQC4w9pMhdzRcMf3634DoA0tI/PwlP6Rt5Bjc8cN/lG/KNNjH/hf2N7xP//hkGMEWOwDlOmMQZjhb8OZzHQmuAMYz4ifpnfq+DHWoz8b21vYvOT7MPfYqdE03BdZ3vTGo05Ir+VucTFav3nrnNqa7GLEe4zHukPif+9/cY1kb57DjtPVnlyssxP8iw/Oko3+RWSbxr+n9S2/ny1XG8W6WZ1mC3z5Y2L15/NF8v1Is0W6TJL8oOL1r/Jbhxu0iyfHyfmc7FPv+R6r9jRsc6Z1rffcp9mfrwfIv8X4d0+X+275HCo6DN8P2r4/Ir+VIYy1i3Ojg2LMn9QlPlF96go2yi0MdCwBpsW2W+MF8oSO0Li/26/ZU0GMEfmx4r+Aek/Y7cyhnsAywqUMbzXfRN5tkff2/4t/FQnyccxtk2w4yKvtim12uSrJDlIk+M0yfbl1W/fO68iiSIAAA==", + "debug_symbols": "1ZvRbuIwEEX/Jc958IzHY7u/sqoq2qYVEoKK0pVWFf++CSIpIhCUoRNNXhAG37kHc21HUfxdvFbPX+9Py/Xb5rN4+PNdrDYvi91ys65b3/uyeN4uV6vl+9Ppx4VrXsAf+n9+LNZN83O32O6KB2DEsqjWr81b8nWFt+WqKh6C25e9zox07MseT7s+lgWQbvmgW551y0fd8km3fFYtj063POiWR93yurMWdWct6s5a1J21OHbWNpok0OTxGu8EGhBoUKDxAg0JNEGg4fEauvJ7KHeajMMxS6Gtn0Kv/GWkmNtk1m/DuSYKNEmgyeM1wQk0INCgQOMFGhJogkAjyEEQ5CAIchAEOWBBDliQAxbkgAU5YEEOWJADFuSABTngyznI6FpNDml4WUPH4dgZAXoGWdkgOm0D0DZAbQOvbUDaBkHbgO82AO+7awHPNy45gSi1nYnyOU00RZMs0SSYmuZn/aTe+pkuJh+d823WHN0VzBS0DVjbIGobJG2DrGyQnbYBaBvg3Qa/uEZkb4qGTNHEqWmG1k9wY6N/EF2J82lCezcwHUpEXiKi26L+QASJiAUicBMnIECXxwC5hzP1ZA2+C2TwvWwB2xqdaAsn2cLJpnBw8plF0OFQb6Ij2MJBWzi21h0kWzjBFg7bwom2cJItnGwKxztbOGALZ+o7X8NbqM9T4wyODqGp0SFvC4ds4QRbOJPPrMHrHYq2cJItHFvrTnC2cMAWDtrC8bZwyBZOsIXDtnCiKZwrz2uMecwpd0/TZb7RNYZ2SY5840fGbkBi8/0ZNcySGmdJ7Y1S1zfDOwSXuMdNM+UOk3Jf++vHc/NMueNMuZNRbuyuu5F9jzrPkTq6WVLDLKlxltR+ltQ0S2qrOySmtivmPrXV/XGY2uruOExtdm8cpDa7Nw5RJ7N74yC14t74uK9bfxfb5eJ5VR2P6L59rV9OTuzu/n1UZ4d3P7abl+r1a1s1x3h/TvA2ows5l4iu4T40E5WQctOEw7e+rG8a1K61838=", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests_inner(&mut self) {\n self.public_call_requests.push(self.next_counter());\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push via a method call\n self.append_public_call_requests_inner();\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.l2_to_l1_msgs = sort_by(output_composer.l2_to_l1_msgs);\n output_composer.public_call_requests = sort_by(output_composer.public_call_requests);\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index b43b2aee8e5..ffce1c00fe3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1azY7cRBAuj8fzs8NqVkGcEQfu4xl7ZxdxCEoIi0CCI1dnkuUNOIIP8BBckHgWblyReAdu3JCIFGV70zX+/Lnsncm4EyWakka2u8v183VVdbt7Iqko8tehHEAq5Bt/M/XPA+iPb373/fPiMEqnpLdP+ReL7HJq+Nej/auplxmFkb9Q+YHwX4y9nC/LSj76ononN78Z3N+TKj5C+a/jF9L/9zt81th5UIYbW0cPvXwJIPtzsL1H+du8fRQGm638L/rHZiv7KoztmcsTlyM/SRVHTocW5p715adeZiJNioy22OBR25zdv/j7U4NPoI/zZkR9mLNj6ouhb+Lv59LESeUrhgn09ZmLEfkw9PJZp9o2IH68F/8Otn3kr87X38g/nLBjo01xPJMm5sp3arwXtVxVD7exHmsceNz70GPVXo6hPvTwHOJoKs147DGuztUPjA0hH8egm8dzAn08Brh2Qt+YrHzXNif/d5DLfGyrNe6B5+h8l/FG/ScSdE2WRtKMzVia+HAsx4atZ9Tn6GFZ8XFfbLS9zbK05mPsaA7MpR23wHNq53zAOtXXfeaDK3+15oN9cbXqmoUd5+soMHZjA7uRtGOHdVDvETtt+1b6w45rRBt2HHfjwNhNDOzG0o4dzhN6j9hp23fSH3Zd8+kkDD6XPPchad8J+SVwFfIRCe121z9ALvOxTowV1T+X9hgLjNM2jhQnjCNrTTGQ5poCMU6o7XupcOI44nm6bV7kecGqUYHWZXvH0SHrq33iCGOF46gLpynpvu+fFwdSRLZgHLFORwNpYncCfibU9gPgFKKWB96fWzI+aOuA/HFkjSW+i7yJNH3W/ZCEeH/0V4fjX/5+JpD/Zf/+ry9exsetz2AX5wPqT4j/Z/+M8aLX4QF2Xq+L9HpVXBd58eRJtinukXxHA8AJ92uO3zpbOn7r9CjL+tZ5TfPdto7rt8vQ8ANtGxA/3jtKqO1Xf7XquBU72LbPfpCFq7VXpHv2Lrf7ri3FenWxWWab9eN8VazO96otb3IvmPeiEGtrL4qx57WqSN1nJWs9hPvLf4Nc5lM64nTESemIU91mkXA4cb16l+esPwGbEHNW4LViZp35KHE8so1MVuzg2f8/IJf5lILMtfliubpYZvkyW+Vpcfkqc22gM8O9z3Y45zGvOeetb+tdx039dfI/iCq5zMe2Yt6o3YFz/LXVTfSN6a79mw93wLCtbnbt2YQ+u1BMdz27wDzB8Uio7V/AJsSejbXWj1quInZ+7LLHaH036P9ZXMz9R+/oe7rHwe/q/0l4b+aZVDL/9/cz4LHO/y2brH2JB2Dvc7I3Mey15ike3ziqZEZRXbd1TodYzcWuuWjXqMMuR4yj8o89k4u7VVSXiedFsTRjmNcvE4PfqtVzadYgfVfrge5loc6Q+26ubjobzmlsamdm5e7+WvhMDX5rvjqT5nw1oj4cf8Y4MfRgLLTFPr6LsW/VYOt/LFacDqjPOqtkP9hnR7pH2/V/HesMLaE+C7eu/13NevK/K09xvNry9GMjT61cUbveRK7UzubLut9WLUH+fWsJj2vb9xzHmYX5I7IVazDzozz+9lnAGH0d1e2zYqvrzDfEun+Tnz/eZHmxeJq6x+Vd6/654lBW/Rhrjsb+WddDzI/zIfJ/AvPhpxTPiaHP8X3VwRe1XG9lGG3Dst42LZv8cdnkV90nZdNG7ZtBH+aBo/f8M+KFstSOhPivvAAdkwm8o++fGfonpL9mt9HGZ7Izg39m8Lvx+cy/pHGLvvd9fnKrk+RjG9umsRMir25Sar0p1ml6maVPszS/K69eAMXBhQthMgAA", - "debug_symbols": "ndvhTuJAFAXgd+lvfsydOzP3Xl9lszGoaEgIGtRNNsZ337KRaugUcs4fYw2fQM8ppe3tx/CwuXt/ut3uH59fh5tfH8Pu+X79tn3ej0sfn6vh7rDd7bZPtz//PKTjD4n/j399We+Pi69v68PbcCMt59Ww2T8cfy06/ofH7W4z3NT0+Xs15EQYIUwmjBKmEKYSphHGCOOEIXqgRA+U6IESPVCiB0r0QIkeKNEDJXqgRA+U6EEhelCIHhSiB4XoQVnoQYnJRD43lTCNMEYYJ0zgpibCCGH6PbAoJ2NRz40SphCmEqYRxgjjhAnctEQYIQzRg0b0oBE9aEQPGtGDRvSgET1oRA+M6IERPTCiB0b0wIgeGNEDI3pgRA+M6IERPXCiB070wIkeONEDJ3rgRA+c6IETPXCiB070IPo9iJxOJqqfGyFMJowSphCmEqYRxgjjhAncSEoMEgZlBimDCoO6bcgp6RfKqcxRY5AxyBkUBJLEIGFQZpAyqDCIaYQwjRCmEcI0QphG5IVGtHpCY5QzJAzKDNLrqM5QYVAlUP9UVsunvXPT2Tvqn8m6TBpODCeOk4BJ/yTWZSI4yThRnODpFzz9gqdf8PQLnn7B0694+hVPv+LpVzz9iqffP5MSE4k2J4qTgpOKk4YTw4njJGDSP4NymQhO8PQNT9/w9A1P3/D0DU/f8PQNT9/x9B1P3/H0HU/f8fQdT9/x9B1P3/H0HU8/8PQDTz/w9ANPPxrxHTaMQc6gwFFOiUHCoMwgZVB3KxXV6Wqctvk0SGVQY5AxyBkUBOofu1uVL2PNZ6ThxHDiOAmY9I/YLxPBScaJ4qS7Idh0Ms/Gx52TipOGE8OJ4yRg0h8GukwEJ/0PqFL8tF2WEjNUGdQYZAxyBgWBFgZ1riBhUGaQMohpxMIUTfm+elVmV6/ywqhK1QlVnX2QLMyQVJleXpXZy1sYuriMFqYuriBhUGZQP9xaZEJltsoXJi+uoMqgRoS7MHxxBTmDgkAL8xdXENPyhQmMK0gZVBiE7wEN3wM6vgdcmHJIbfqambzNUGaQMqgwyBkUBFqYJ7iCmFUezCrvHyfn6WMoz48g+hMFl0nFScOJ4cRxEijRhaNwP210YwozIjjJOFGcFJxUjHyOS3/Wh+36brf5ujfk8X1//+NWkbe/L5uzu0ZeDs/3m4f3w+Z4/8j3rSPHNa+SVqry+3jdf1yUbCvRfFw8ruTxFMMqi47POj7zPw==", + "bytecode": "H4sIAAAAAAAA/+1ZzW7TQBBeu3Z+mlYJ9EXsxG7SW6US4MJDuGkrwVP4AZC4cUXiHTghgYSEOPAEnDlxR0LigOi2O82XzxM3Id7SSh0pWnt3dv52Zjw7CcwcAjdGZgMQInvuoeveQ1jfOv8duvdkM0i7xLdJ+pMkm3QV/RqUf9R1NAM/9BOh78n+SdvReVrO6aMuwrdz/uvB8wMz9w9f+sv5+dR/r0Zn8Z2j0t/ZWngE9I1pPramfuS/ov/Y0fch+xM/smfWl60fn8BZox80qEuyS35lgE8XdPOgZx4QP0O8DPHfNl7jLQ2In8jD9pFnsV2kyDpQ1gJ6jhQ+kcLnLtIS26AtgyWjMdVz1/ggDp9B2CAfpCX5lc+6CT6a3STmYlhr0Mf3RY+WqYKstYk3rnVgjc8A6yXUjWGL3lFfS/8F0GU8lrUub3FcHrr3ZDNYOW8J/5vKW1rc1uWtWJF1oKxxfogVPrHC5y7S6hu9ZsS1LWWfZ59LWMfIVHMzyhYqOqItYpqbutHG30vST/se4hzbdVXbYS3rMedd2a6l2C42y23XgrWWYjuZe2aasx3nCLRPy499xpz3EeryfqDga7ld5LY0XgFdxmOe6CudW2oL7VvgwxbhzdtiGBA/0Yn1Fv4S421FVkP7YlO1s9zVYsKdudHSeuOee2Zeb0Rl8/qPJ5d540JnkIvPFPnHhP/cvW+D/jJGG8h5Ni7Ss1FxVuTFyUk2Kx4SfQsh2Em7S/qqjbi2QODaE89Yqz25XumQzMasHneir6XxFugynsC9ne7tJHBvp0WZjfFnJ5uvms6XxXg0mQ2z2fg4HxWj/bXypXzT8Psr+zz3x67qVrEh1q1aHR2aqo/hnTCmuddu1OpWvDfW3SW1mp/rek/33kzryQhod1yUkUHzXfx/4R3QZTwBL76bJ8PRZJjlw2yUp8XBv3zrb0sviXPOqr2kdXMO9pK+AV3GY1kxbkRu3z3wm8rb6/bjZM7S+A50GU+Afc93/5ftgLlpWl6O1m7vaY/sk1qe98p/OnwH+WjmND+45x7gXNd7E5l2ia6FI5D3E8kbK/JquZb7OV9A3s9mkTfm4wjwxFZ9o+cNlKtVI5cFtqPgf3Wj9ZVfRBPvgnX9O8HX7qVavumbahzJXvFpubMhT5/3Sxv7VobfIAfbIC5X11ezT1fB13LuwFRzbovW8PzZxlrfFX1hme/jXvR9rf7S/ivR/DSkNe6NGEUP1tmC9CK0+oZ75aGiT53dNDsI715D+tfFKZ7Xsjj94UaMUy1WRK7/ESsLPdlyUW8tlyD+urmEz3XZnYj9TLP5lGTFHFzXl+b6/acbrSyDYFE+zbfqesw+atdZvn88y/IiOU3t6/C62rUvdijn6+hrFtruXe5CjI/fQ8T/I7hATPw5VvhZvH4NXrBkvKChzEXl4ly3rOJvlVV84b1dVmWUtR6sYRxY2HHvaC+kJXLEhL/jCMiZdGCP7B8o/DvEf0FuZY7/S+gp+D0F355P7DaJ36LuTf+/esGT6OMcyya+4yOuzkNqPCvGaXqQpadZml8XV38BGKLzzYkpAAA=", + "debug_symbols": "tdpdauMwFAXgvfg5D7o/upK6lWEY0jYdAiEtaTswlO597KFxS6y2nAN+CXHwJwffI8VS9DLc7q6ff//aH+/uH4erHy/D4f5m+7S/P45HL6+b4fq0Pxz2v399/HhI04vU/+c/PmyP0+Hj0/b0NFxJqG6G3fF2eus2tnC3P+yGq5xeN4uTQ/3t3DD9eOrPzSBt1eY1rdu8rNu8rtu8rdu8r9t8Xrf5WLf5sm7z6/ZaXbfX2rq91tbttYb22skYYZwwmTBBmEKYSpiGG0+E+SQy3mbTLnPgShgjjBMmEyYIUwhTCdPPQWnnbjq+zRcmJ8IIYZQwRhgnTCZMEKYQphKGyEEQOQgiB0HkIIgcBJGDIHIQRA6CyEEQOQgiB4XIQSFyUIgcFCIHhchBIXJQiBwUIgeFyEHp56BpOpuW64WpiTBCGCWMEcYJkwnTzYGmZG9Gky9MIUwlTMNNS4QRwihhrG8in43I5TNSc8JkwsT35rKftkKYihtJ3Qu1eTrXYrFClSpOGkwk4URwojgxnDhOMk4CJ3j1Ba++4NVXvPqKV1/x6itefcWrr3j1Fa++4tVXvPqKV9/w6htefcOrb3j1Da++4dU3vPqGV9/w6rsTP0qeGRQMKgxifmi9ESgnBgmD+g/fZvMik4UtkDHIGZQZFAwqBOovS5Qsb6ZEXRDHScZJ4KTgpOKkwaS/HvE1EZx0O0KZJ3pl+v/jghhOHCcZJ4GTgpOKkwaTT1YH3Ou5X7q3BTIGOYP6w4a/L8b4YjFG+rPjcVidUbZFQPvT1nHUn79elsXXaw1H44ybQcIgZVC/uNllRp4XyBmUGRR4cbU/Hf8OVQY1AklikDBIGWQMcgbBY54KPOZpfxb8Nenf7BTz40uqsUDKIGOQM6gyqBHok40W3yDmlhtzy/vTT52HIV08mWp/+vk1yTgJnBScVJw0mPS3Q2g9dzptSyI4UZwYThwnGSOv49Gf7Wm/vT7s3jZP3j0fbz7spXz6+7C72Fb5cLq/2d0+n3bTBsv3vZXTndecNlpkemiZDiWljaQ8HU43WXLbSMh41fHK/wA=", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests_inner(&mut self) {\n self.public_call_requests.push(self.next_counter());\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push via a method call\n self.append_public_call_requests_inner();\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.l2_to_l1_msgs = sort_by(output_composer.l2_to_l1_msgs);\n output_composer.public_call_requests = sort_by(output_composer.public_call_requests);\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_0.snap index ed7028460d5..10c2bf36408 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_0.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1ZvW7TUBS+juMkjls1gmdgtxO7abdKUJAYGdnctJV4A0YzsrOwgMTGhgRCQmLgCZCQGBALGxJIvAO95Z76y5cTNyW+QCWOFF3b99zz893zY98EpqbAjV2zBomQH26M3diB+fDkt+fu0/Uoi0lvm/J30nwaK/61aP8kdjIDP/JTke8J/7Tv5Nyqavnoi+gdnPwSuB6ZOj58+S/759P/qw0+S+xcr/ztraUbIN+Y9nNr34/9Z/Jv+pGfJy7WHpv5WJP9aRGrdBPsNxALqLdrvPhZBKTPgB04J/qHZGvb+xqQPrGH8ZF9EOwixdaRMoe5jHOoJ1L0XEZZW0aPHUuxsq7N+iJ+9Jy8ruIH2tYhfrw2bg0+u+ZGm6NPYc2y2Ok2YBcq9mwq64IlozGLOaPp0fahKfd/Vw/Kkv4henot6sG9wr5l7/uwbs+N6XqUiQ+B4p+1ZQL2YJxFpo4DXCu9IyL+B6aWue2uNd1coz3VxJVrtDwbGn/vRSnU6JDsYXyaarSs/V+jF2V3aS5U1nl+L0jZR6zfWh3rKD4iFpxjt92o1W8trrTeP1KwCxuw43z9272PsVu1990x7WEXrIgdx13PM3YDBbueWY7dAObkGrGTZ3dNe9hpcRcr9rSIz67UUj5bsCRzQ/LLwGjIRyS0247PQC7zsU6MFdG/ZZbHmGeczuJIcMI4Qp1iW4f4GeOInt0zNU4cR9ynl/VF7f2Ta5Snd4oLxxHGOpMWRyHgc5E4wljhOGrCKSbde+4+XZMCsgXjiHVa6phF7IbgZ0TP7gNOPmq55zPCMeODtvL7kiVtL3Et8kYKb5/mhLdyo8XxvbtOQJ/2zSlzXINwDveYv53Y7lixU/tW4vo8BJ+4Rlni7xThf2hqnz+4a8mxsKp1iO9ntbCa93fPPU/Xo8La8RHsWIj9at7vBOZChZ/jZ0PhT4BHMBsRP+8NYoKyEPP9ap5f1veM3kfwWxP5H7nR8n4n+/A9ekhzoSK7yfZAsV2rqRH4Id/LPuNiuvOrhp7aWtUYcc9A/RHxP3H3mDcydtew83haZseT8rgsysPDfFZeIfmWJAYTD/rL6WRnNs5n04NiUk62z9WP59Gr9MTL+m343I2+eqLPMzfUKXrwPwPJTZt/L2iNYId9ANdyHxD+V6aW+dJdJ0Y/w8TzstekXzsvw/3smHn9wv8W9L9Z4pNZ4hPXKu0cBLHS+jlj32vwwxLjKPzv3Ij9VGT2FT+0sx7hHyj8fcW3LbP4fiBr/7VejhhwL2/yV8MnVvixn3J+ae9hWu71SY/WKzEWOP4w3rFXSq603gOKdDzZGefFOJ8UWbn7p3vQrNg+mOVFmR5l9nZ8nv4twaSq5zE+LfXdvfQF5sc6gvyfhPfk99ldSw5Eij7L962B76I1vVvNP4urRf6wWuQX3cNq0UaZS2AOc8fShrtHvFCW2BER/1d3L3sygDWyfqToH5D+ObuVZ/ztnyj8icJv9+eLyHMj+t72fxKnOkk+PmPbJHZ85NVJSk1n5TTLdvPsKM+K8/LqJ55VNIdNJQAA", - "debug_symbols": "1ZvdTuMwEIXfJde5sMf2eIZXWa1QgYAqVS0qZaVV1XffZNWEbt0f9WwHJTeoAX9zJsnnGBKyrV6ap8+3x/nydfVRPfzYVovV82wzXy3bre2urp7W88Vi/vZ4+O3KdV98/jv+43227DY/NrP1pnrwTFRXzfKl+xhDW+F1vmiqh+R2dTGYKe7HcqDDoT/ryotteTUtT862vLctT7blg235aFs+2ZZn2/K2s5ZsZy3ZztpgO2vDrbO2YwhgAsBEgEkAwwCTAUYARm9nogMYwIMIeBABDyLgQQQ8iIAHEfAgnTnWUQdG6fKUltTXl1SUP324svZXgfZjOmYSwDDAZIARgNHbGXYA4wGGACYADOABAx4w4AEDHjDgAQMeZMCDDHiQAQ8y4EEGPMiABxnwIAMeZMCDDHgggAcCeCCABwJ4IIAHAngggAcCeCCABwJ4oIAHCnigpz1Qcj2jSY6ZADARYBLAMMBkgBGA0dsZ7xwCeQQiBAoIFBEoIRAj0EkfyLmwh8jFEhIEUgDyDoE8AhECBQSKCJQQiBEIMcIjRnjECEKMIMQIOmMEpx5qpSmggEARgdJ1KBUQI1BGIP3vv8F1uK2mfGVoTn4/NLNcGTpcD3P383+7PnczcORd+0l2TSPtul1JhxaccNF3mGjf8Vv7Pnfqb+87TbRvnmjfeaR9U+ynAnEoupZJdq1T7Dq6SXbtJ9k1TbLrMMmux7pCkvRDScuux7o+Xu56rKvj5a5HuzZe7Hq0a+PFrke7Nl7qOhmujV39Mw8qQxjqB77y7yrtdU76wTFqkRDNE5J5ApsnZPMEMU9Q64Qzj3rvmeDNE8g8wXxO53vMh69na7F4tublDkcp+WEfki/2Qe5w1Uhh2IcUiju+Iub7oNYJ6swTvHnCPVwaftFvPxa2ajBPiOYJ5vNB2TwhmyeIeYIaJ5Bz5gnePIHME4Jpwq7d+jVbz2dPi2b/nszr5/L54LWZze/35ugNmvf16rl5+Vw33bs0X6/RdOeTPNUUQmdQt9nm1T5Jt9mdi/bpWk1O2tQ2+Q8=", + "bytecode": "H4sIAAAAAAAA/+VYT2vUQBSfNMnuZlPpoh9DkGQ36W5vRa2Cn8J024J3L140ePMmKILgwU8gCB7EizdBwe/kTp1f89u3b9PKZqrFgTCZmTfv996b92eSwDQtcH1kNmhg8tP1ieu3aD1cPPtunG3W8kTgdsl/lhXTRNGvQ/knieMZ+OGfgb8n+2d9x+d+3fBnXYA7WDwpvY9M4x++9Mf5+dT/RovO8J07tb+zte0u8Tem+9g68CP/Gf97fvgXqfO1J2bZ13A+Hdoqu0byG/IFxo2MFz3LQOAZkoPXgD8UsnZ9roHAgzzSPjgH2C5WZB0paxzLvMY4sYJzFXnBNmzLYE0PHDkncaQfMk7YIQ7zQg6UZ90FjmY3xFyP9u27Ptus5dAhUPSzeDdJHvugRsam8QPei/wXC/rKNDxvuXcNW+YZT3F94TyDuaHxerc5yzOhkEfapy3PYO//nmd2FN6RWAuVfZ5rWyZ1jEhHLY9tKTqyLWIxd9v19p7wjPas8yutfo0U24UttpPxGnu2XV+xXdxiuz6t4Z1th7kHpjvbafkjUeTp0D4z5IOBWW1YS4RehnojdOTGclv+z4mvpJOY7CvJP2qLLUV+H7YILt8W40DgQSepN/AR4wNFViP2xQptT6yB9qFpbPbBvaeEx/pHLbLIXMTnKO9hQzFOFDm1OjKkdx7znYd9S955QP/INDp/dO/wk7BuMKA75IvqZX333Xy2WSutHJ9IDmmjuF7WO6W1UKGXtXtboU+JBjYbCXotN/UVXmzzg3qZHvt7Cj3ziwX9Y9db2h9CPq7JQ7EWKrzbZA8U2bW80Cc9cPf26RfT2e/aeipr3dhI5j3GjwX9UzfmuEEfbSDnybTKTybVSVVWR0fFvLou+NsGH0w94FfTyWw+LubTw3JSTXbPxef/Mxe5K13Ve+YL1/u6K/n8fmdM4PA/NMSmjb+XYg9sx3WA98o6APrXpuH5yr2nRv8fwt/ebwR+rODzecq6DPp3hP92jU5mjU4yV2nfVGyrHbPqS9L2vRY9bJN2BP1713M9bcu52ncj6AcKfdsdpEdr2KvVcmD+jVq+9H1TX1xfzT7afZHrqYyvtrtVW63UvvfZF6T/sb9jL8dK5zWgzMaT2bgox8WkzKu9y65B83L3cF6UVXac2+H4PPwd2KRu1tk/beu7MeqCpOc8wvSfQbt4vrh3xECs4Fm67y10f5rTo3p5LqlX6cN6lR7Yw3pVRqyltMaxY9u2G7O9mBfkiAX9NzfGmQxoD/aPFPyBwF+SW5mT36+pQp8q9PZ8voKf61n3rv9vnmIK/jwnZYPv+IirRUhN59U0z/eK/LjIy/Pi6hfKQsZLXSAAAA==", + "debug_symbols": "1ZrdjtowEIXfJddceMb22N5XqaoVP2GFhADxU6lCvHsTRLI0gaCcMlVys4oXf3NOwhnZgM/ZIp+dvj5Xm+X2kH38OGfr7Xx6XG03xeh8mWSz/Wq9Xn193v87M+UfCtf5h910Uw4Px+n+mH2QME+yfLMoL50tKixX6zz78OYyaU0Wdre5Yvl+6s9JRlG3fFItz0a3POmWZ93yVre80y3vdcuLbnndrmXdrmXdrrW6XWv7dm3JMMBYgHEA4wFGACYATASY1J9xT561SzWTuDsy0Vf1o2+Vf/y4QqpSVlz6JhMAJgJM6s94AzAEMAwwFmAcwHiAAXLggRx4IAceyIEAORAgBwLkQIAcCJADAXIgQA4EyIEAORAgBwHIQQByEIAcBCAHAchBAHIQHucgsamY5GOTCQATASb1Z6IBGAIYBpiHOWBj7I1h41qMAxgPMAIwAWAiwKT+TDKPGfEVQ9TcVicCGAYY+5pp9mlyAOMBJvzzNjTVn1ySvJgaPN2mBokvptadFcrX/zYdx2g6jdA0GTNQ12SktmCitHzTSH3zf/X97K3v79uO1LcbqW8/UN/sqlZgsS3XMkrXYZSu4yhdpzG6JjNK1zRK10NdITlWUzm1XQ91fex2PdTVsdv1YNfGTteDXRs7XQ92bex0rbg2lvUt9f8kTpYRyCKQQyCPQIJAAYEiAj3ebVhb58DKi99tyblYTXYuNRWcUVcgdQX3BoXvL6Vd60tp8m94Sp7qe/DUuocnv9H1U7D1PXgbWwqifg9BXSGqKyRtBXlHluoNaHHZSquQugKrK6j3gzh1Ba+uIOoKQV0hqiskbYVg1BVIVeFSjH5N96vpbJ3fDsguT5v53XnZ4+9d3jg6u9tv5/nitM/LQ7Tf52fLZ0HF7pYNlc6vQ6YJsVy3tuUwuAkFKVQL5T8=", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests_inner(&mut self) {\n self.public_call_requests.push(self.next_counter());\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push via a method call\n self.append_public_call_requests_inner();\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.l2_to_l1_msgs = sort_by(output_composer.l2_to_l1_msgs);\n output_composer.public_call_requests = sort_by(output_composer.public_call_requests);\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 6eac05f4754..5fa54aa8f43 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_1/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/91aP4/TSBQfr+0k3sRxdPcJ7hvEib1Zui2uuvLK67yBlU666sqrjHTVtYeQkCj4BAgJiYJPQElPQwMSEhIFoqFiZ5mHf/vyi+OwnhUw0mrG8968P795b/5lA9OUwNWRuUIRISPXSNz3AdDD878T9z2/WskTpbdP+cfzokiIfz3av0yczMCP/LnI94T/fOjk/Fo38tEX0Ts6/xtDe2Ka+PDlv8yfT/9/bvF57Hx9qXwVuunRjhR8M2AL6o38YFAGSp8BO5Am+g+VrX2vCYHSJ/ZofGQeBLuY2DojNIwlpKGemOj5HmVlhseOLQkZ12duiR8DJy8ifqBtB4of28aNwb5fXG1z9DWM2RY7UQt2IbEnJeOCLbUxmznD9LB5aMv9ffXInA6UnhP3Pb9iYXgNlB/DHvyYKVkB8XHkx8cvew6eHXqSnYvsQ+V73/LHfrDJZY5xPmX+bb2Efszz2DR5iGNHQEf+ZyDzyLW77JGe1rLOe6Tov649ku0RbXvkkNjalmuB2czpkPR1ydtvVVZGZEeKxvbWhMj0sX/KWTsiPqJtB4of28Y0OSZ9v7ma7Z/7nj0OiD0MO332mHjGLiXYTVqwS4EmbcRO+n43/WEXmm7Y6bhLPWM3NZvYpS3YTYEmbcRO+v4w/WH3tXE39YxdRrCbtmCXAU3aiJ30nZr+sGNxl5JxVz3DsXlg5wg5s9g9/0/ox/Wu6zlC+B+CzL9cu0t8fK9r+t+u9r0uIU2vS77vkww7Npf7YveP2Y5dSLALW7DT71W29HnPY3Okz3rbcus29CN2+57R74DMf107I+N1fHg6E8+1PxgfofJZsNSxg/mg/f3P1Sw+9Lzpvrb4CFqwixR2nt5BF21rBJtL9q6k9wwZFxPeRNGE939XW4zfuLaNXfbGh/fOu0ov2y/iFtuE/z7IvKf4d2EjOcbyLwa5t107M3yvQZ2THX7o3BT+B6629LdKZkr8YHcm4Z8SfnYOzMzmeitjhT+sG5rolFiIgNbn3d1i8A7s0BjEdXd/GT4Z4Z8qHltmih+xYut5qmSwuy7Ggo4/pMlYzBX2JoA59UjpZ7E4VDxCR/4nIPNxB5+65hT6JOdFFoM679MdfuicEv6nrmY5xWIGzxr7xsxQ+YOxIGNZTuHvcrZEQPOdU5fufHV3fxk+M8KfKR5jmryZAS1VNJx/nZcTogdjQccf0mQs5gq7W+i3JP3mgTScZ/2OPlXfyJson4dmu8/yjfGPNun4F/7nrsb4ZzEovv/oMajXbhaDgcIEZSHmY8Uv4wem/d1Kr1EvXG2xiYPL9uH5a6psZ3e9NtsDYvuuc4/8NuAzLlbHn+8BF7bWDUZ45zJKf6z4X7lv/RuNYHjylXaerar8bFmdVWV182axrn5S8m3B/z3oW3+1Wh6vF8V6dVouq+XR9esv54vl8aIoF8WyzKsb161/XR6drouymt/K7edil37J9UHd0HGds2XovuWuqflFXqz43wvv+d8H1/5yLqk39Vm+KNjOF2ypL2SQvqi+3JfUm/xhvckvug/rTRuFNgYarsG2TNw34oWyxI5Y8QdOgMzJCMbI+BnRP1L6L9lN+nAP0LJC0if8dn4+ijxXo+99//Z3oVPJxz5tm8SOj7w6T6nVulrl+Y0iv1Xk5a68+gQg6rkVtSgAAA==", - "debug_symbols": "1ZzRaupAEIbfJdde7M7Ozs72VQ6l2NYWQbRYe+BQ+u4nkSYVo5H8sOnkppi63/oZ/52JJOazel49frw+rLcvu/fq7s9ntdk9LQ/r3bbe+vxaVI/79Wazfn04/Xflmj8+HMe/vy23zeb7Ybk/VHdeiBbVavvcPORQz/Cy3qyqu+i+Fr3BQvw9VgKdDr1fVJ7LTh/LTi9lp09lp9ey0+ei05MrO70vOz2Vnb7sqqWyq5bKrloqu2pp7KptGAWYPJ4JDmA8wBDABIBhgIkAIwAD5CAAOQhADhjIAQM5YCAHDOSAgRzEK++Hc8dkGi4DGtv5Nfamv6yUcls56ofxnIkAIwCTAEYBJo9nxAGMBxgCmAAwQA4EyIEAORAgBwLkQIAcJCAHCchBAnKQgBwkIAcJyEECcpCAHCQgBwnIgQI5UCAHCuRAgRwokAMFcqBADhTIgQI5UCAHGchBBnKQL+cgk2uZHHX4sMCH0B1DBLnxVcIzazuYOZ/bBFM2bMommrIRUzbJlI2assmWbLxztnS8LR1T5di7yWvOT6/iXq/ybuzCOkIZgLxDII9AhEABgRiBIgJdbA7kXPiGyPGEKb58YuH3dNSWTjalc/lEx+/peFs6ZEsn2NJhWzrRlo6tqkyT153BY4swdmUdoYBAjEARgQSBEgIpAmUAYodAV6q4xBaqj8N6ECFQQCC+DfUCyxGBBIDi1C05+q5wRN8rHHHqphNDVzhi6GUriq29k2zpqC2dbEpHJl9Z7Dsd7i108bZ0yJaOrbojbEsn2tIRWzrJlo7a0smmdJKzpeNt6Ux95me4haapT28M7x0lU3tHgy0dtqUTbelMvrIGj3c02dJRWzq26k52tnS8LR2ypRNs6bAtnWhLR2zpJEs6dOVyjjGXlefu1yVZbgxNsS3JSW68ydTtkNQ8f2btZ2lNs7QORq29k07BqfS8eabecVLvax/9eG+ZqXeaqbca9abuuJuk9yvAK1dzGbf2bpbWfpbWNEvrMEtrnqW11Q5J2g6l3Le22h+Hra12x2Frs71x0NpsbxyyJrO9cdC6YG+8/6q3/i736+XjZvV9y5qXj+3TyR1sDv/eVmc3s3nb755Wzx/7VXNbm5872jR7l+rv+yTuvrkavtmsX5goN5v++GxYUIj1q9av/B8=", + "bytecode": "H4sIAAAAAAAA/9VZP4vUQBRPNpv9m90N+jEE2ewm7l4nYmUnWNnl9u4aRRAsLFOJIFj4CSztbWwUBMFCbOwEBT+KO+c893e/vGQDlzm9gTDJvDfv3/zem5ld39s13/Zd7xxNhPyy/dD2HaAH2+em/Z6fryVD0tum/PU8TYeKfy3avxxamb4b+XOR7yj+876Vc7vYyUdfRO9g+4zhPfJ2+HDlv6yfS/+v1vg8tr6+I1+F7rVoxwR888AW1Nt1E4PMJ30e2IE00T8iW9uuCT7pE3s4PrIOErtQsTVWaIglpKGeUNFzGWVJbDCWfkUveniM9TAOUU/Qgp6h4k+bOR97ZfyG5EevBT9ikuUrPvbd+Pi3bg7ArpZkJyKb9+625Y/cxCaRNcb1lPU3a3UNxs0j+17o7fIQ5/aBjvyvQeZ1+96kzvfc+N24zov+i6rzPbJnX50fK7bGCo3r6VjRM1b0XEZZM0V2l2h1dQhltllrxUc5L3YVH9G2DvHju2khjd2yvalzH2BOFa5wjOPaUezRYhdQ7CLHsZsosYtqYjcBmrxj7GTsjtde7ALFHtd7KZ89UKbsHYb/LozjvKb1XPifgcx79n3mlf3n3HJUz+dcPxAfWpw6XjnvsM7w/nXf9ho+sD7X1Wwtt1ycGTUc8r5RhY8cxnFeU3wI/0OQeWTfZ8p8qcuO77YLn/R5Ff7wHhIotno0L1R4B0QT3ge2N/SP9t1gbKL4j+ewR6S3B/IDZS7bJvxPQOZj4se7vBYbwYmGoQ7IFQzV7Recr1V+VJ0nn9rexPETyYwUP7R6zXsK8keKbzOvXDNkrvRBsaOJTrkbdIHW5lnWxOAz2MExCIvm/mrxmSr8E+IxLSZ+jJVWkyKSoe2zaAvjTzujYK5MFJ2YU89Jv4ZFxqvQkf8lyHxB/Nre0DSnApAr+7aGwR7pjPb4wTkl/K9sr+WUhhntXN4UMwH5g1iQuVpOic5/kVNnzo9Fc3+1+MwU/inxmBYTP8ZKOwdyXmr3KcQC4w9pMhdzRcMf3634DoA0tI/PwlP6Rt5Bjc8cN/lG/KNNjH/hf2N7xP//hkGMEWOwDlOmMQZjhb8OZzHQmuAMYz4ifpnfq+DHWoz8b21vYvOT7MPfYqdE03BdZ3vTGo05Ir+VucTFav3nrnNqa7GLEe4zHukPif+9/cY1kb57DjtPVnlyssxP8iw/Oko3+RWSbxr+n9S2/ny1XG8W6WZ1mC3z5Y2L15/NF8v1Is0W6TJL8oOL1r/Jbhxu0iyfHyfmc7FPv+R6r9jRsc6Z1rffcp9mfrwfIv8X4d0+X+275HCo6DN8P2r4/Ir+VIYy1i3Ojg2LMn9QlPlF96go2yi0MdCwBpsW2W+MF8oSO0Li/26/ZU0GMEfmx4r+Aek/Y7cyhnsAywqUMbzXfRN5tkff2/4t/FQnyccxtk2w4yKvtim12uSrJDlIk+M0yfbl1W/fO68iiSIAAA==", + "debug_symbols": "1ZvRbuIwEEX/Jc958IzHY7u/sqoq2qYVEoKK0pVWFf++CSIpIhCUoRNNXhAG37kHc21HUfxdvFbPX+9Py/Xb5rN4+PNdrDYvi91ys65b3/uyeN4uV6vl+9Ppx4VrXsAf+n9+LNZN83O32O6KB2DEsqjWr81b8nWFt+WqKh6C25e9zox07MseT7s+lgWQbvmgW551y0fd8km3fFYtj063POiWR93yurMWdWct6s5a1J21OHbWNpok0OTxGu8EGhBoUKDxAg0JNEGg4fEauvJ7KHeajMMxS6Gtn0Kv/GWkmNtk1m/DuSYKNEmgyeM1wQk0INCgQOMFGhJogkAjyEEQ5CAIchAEOWBBDliQAxbkgAU5YEEOWJADFuSABTngyznI6FpNDml4WUPH4dgZAXoGWdkgOm0D0DZAbQOvbUDaBkHbgO82AO+7awHPNy45gSi1nYnyOU00RZMs0SSYmuZn/aTe+pkuJh+d823WHN0VzBS0DVjbIGobJG2DrGyQnbYBaBvg3Qa/uEZkb4qGTNHEqWmG1k9wY6N/EF2J82lCezcwHUpEXiKi26L+QASJiAUicBMnIECXxwC5hzP1ZA2+C2TwvWwB2xqdaAsn2cLJpnBw8plF0OFQb6Ij2MJBWzi21h0kWzjBFg7bwom2cJItnGwKxztbOGALZ+o7X8NbqM9T4wyODqGp0SFvC4ds4QRbOJPPrMHrHYq2cJItHFvrTnC2cMAWDtrC8bZwyBZOsIXDtnCiKZwrz2uMecwpd0/TZb7RNYZ2SY5840fGbkBi8/0ZNcySGmdJ7Y1S1zfDOwSXuMdNM+UOk3Jf++vHc/NMueNMuZNRbuyuu5F9jzrPkTq6WVLDLKlxltR+ltQ0S2qrOySmtivmPrXV/XGY2uruOExtdm8cpDa7Nw5RJ7N74yC14t74uK9bfxfb5eJ5VR2P6L59rV9OTuzu/n1UZ4d3P7abl+r1a1s1x3h/TvA2ows5l4iu4T40E5WQctOEw7e+rG8a1K61838=", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests_inner(&mut self) {\n self.public_call_requests.push(self.next_counter());\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push via a method call\n self.append_public_call_requests_inner();\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.l2_to_l1_msgs = sort_by(output_composer.l2_to_l1_msgs);\n output_composer.public_call_requests = sort_by(output_composer.public_call_requests);\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 858aa9a801c..40a9d25889d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1avY7bRhBeiqQonSLc4VIFSICkSheIEnnSpQgCxHEcIEXKtLTs65ImeQCWaQIECBA/hB/B7+DGgGtX7g24c+Pb84746eOQlk67/oMHEEjuzs7fzu7MzioyDUTumZgDQIj84l7G7nsA/fHl73v3PTsM8jHx9Ul/NSvOx4p+HuVfjB3NKAz9mdAPZP9Z5uj8XDf0URfhO7r8TeD91DT+EUp/mb+Q+n/ao7P4zg91uLm1cMPRNwFo/wiye6S/Wbc3w9hmQ/8n/7bZ0L4VRvbCrhO7Rv4wjR9ZHrIxe+ZXTh3N1LQhUtpiBUdks3L/5d6nCp6BPl43Q+rDNZtRXwx9I/d+bNp2EvpiwxT6fK7FiHRIHH3mKbINCB/fjRuDbV+5p9X1H9IPA3astIkdT0zb5oI3VcZFHU/hw23MR5sHnncffLS9l33IBx+OIRbGpu2PHv3qTPRA3zCkYwa8eT5H0MdzgLkT6sagrXdps/T/BbqMx7Jq8x44Rpe7zDfyPzJBc7I8Mm3fjE3bPuzLsSLrCfVZuFE3eNwXK23vMy3Z89F3ZA0cm267BY6pvfGAeYqu+8SDW+6pxYN97arta5rteL0OA9suU2w3NN22w31Q3tF20var8Wc73iO6bMd+lwW23UixXWa6bYdxQt7RdtL2m/FnO83vpsq4qONpzG5xW/PhN5WHyHyjfT3O9znHcgTpOyLe2DeBPk1v1t8Ajuhkn/eBLuMZskWguDpn3xe52deEv7ZORyS74Kam7ZdytkwJ93ewyyP3PjHNHCW1f/2Xq1dr/0pnkIvnDfmnhP+n+0Z/kWdygJwXyyq/WFQXVVnduVOsq1Oib2EAdsKz78e8cQMf80aPtLS8kf0q0JluE6MlD0wUPVC2AeHju4WU2v52Ty1Ga76DbfucrTW7auduqX/ate17b6mWi9V6XqyXt8tFtTi71t6SKLLaPPM/oGV/sl/KvspjpR6YEv4909D8H2QJnEcvuT6AcN36QF9OESl8tLxB9LW8HwNdxmNZsY4mcn8oNkTdGF5nwydAl/EMyZYSXfZhqcfz2sCxuDZwPfWdGbXaLOfI78ocHuLPz4Eu4zFPzZ81Gwre+37ufgB2OvTsyHV87IsU22lnzr460T5+G+gsv2LfRND2F5SRQfNbkfsQvxX+mp3Yb992zYPvXnateTw0jZ0OvXvR7oL6akma3wqNIPlUOZsvVvOinBeLMq/O98mn+u7fjhX9B9Sn7THyndE31kblHN53v9VnR61OxPeNkcLbl/4R0cX8EuM155eC/9Q9rSxJ1MhtQc72KFfIOsQllFaODOTg+Urrbb1xbmMFn+2k1XdwnfO8dsX2rriDNr9JsooNhwo+0uMz2TP3tLJ8EW3Lp/lWX420y+8+xLPsC7BbiLNs4BpSoZ0xBbR4ijIyaDEc/1/1Ja19o9AKETPW5dntdVFWs7u5/Zy/LmYcu/dhDbrV22My9y3+xPhCLyX8iSNg19GU7JEq/Cze5z14UcfziobSltTbbeO6jR/XbXzhfVS3ZZS+CfThHmrhE/eN9kJaIkdK+J85AjInIxgj408U/iPivyW30sb/L5go+BMF387PqRskfou6+66vXvEk+tjGsonvhFhXl0tqua6WeX5e5HeLvLxOLtZ3fxv67lt8bde7b9wHMQZzPe1rp0io+9s3fQeJMUvyDetb30TbY2Qc5oc4lvNDwZ/DnpiDv3LsNh10uSaEemK9tCR5tXqpFoN5fr8FeVfRNm/t/I620vJstv2wRy4LXXn2d+B3Cemq5bDow/vmsCKPdjaSsVqOj2duCwn0hc7xt2o/9e76avYZK/iYx/P6wjoI59DauY59FPmgL3T5Po5F338J2IdHfVExAAA=", - "debug_symbols": "ndvRSuNAFIDhd8l1LzJzZs4546ssi1StUihVqi4s4rtvu5gqTdJw/ptlI362dH6amUny0T1s7t6fbrf7x+fX7ubXR7d7vl+/bZ/3x6OPz1V3d9judtun258/7vrTP6n9//3Xl/X+dPj6tj68dTfJrF91m/3D6b8tHf/C43a36W5q//l71eUemARMBkaAKcBUYBQYA8aBAR0I6EBABwI6ENCBgA4EdCCgAwEdCOhAQAcFdFBABwV0UEAHZaaDZoPx0l+aCowCY8A4MC1uag9MAma6g1byYFqRSyPAFGAqMAqMAePAtLjRHpgEDOhAQQcKOlDQgYIOFHSgoAMFHRjowEAHBjow0IGBDgx0YKADAx0Y6MBABw46cNCBgw4cdOCgAwcdOOjAQQcOOnDQQQMdNNBBAx000EEDHTTQQZvsIPeiXyb3djmHbQaMA9PiJvU9QYmgTJBMozasGXISG6FCUCVIF9Foypx6I8gBSpOvpLl8GZU8Ih4nLUymt62ukxQnOU4kTkqc1DjROImPfo6Pfo6PvsRHX+KjL/HRl/joS3z0JT76Eh99iY/+9IaG5eEL2vLoC3B6z8DLsGXgWkYkx4nESYmTGicaJxYnHictTKa3CjwNo+9FRyTFSY4TiZMSJzVONE4sTjxMLIPJgglB0/Pu7HWYQ0safc/MLMQXkBJkBDlBDaCZ1fgCSgRlgoQgUoSTIpwU4aQIJ0U4KaKRIhopopEiZpbmUs+XcMRHJ5aZtfkCqgQpQUaQE9TiKE8v0JdQIigTJAQVgipBSpAR5ASRIlJ4ppKTxonFyeRH0GzYT2veRqSFyfTewXWS4qTGicaJxUn8Q87xD3l6iZ5LGuaCKiOS4iTHicRJiZMaJxon0xuBfp5wtzHxOGlhMn0XyXWS4iTHCTkHFHIOKOQcUMg5oJBzQCWzgkpmBZXMCmZu8Sh+vpWkpvFtfIWgSpASZAQ5QDMrh9r0jNrlTlyeWTksoERQJkgIKgRVgpQgI8gJAkXIzHxev69v6uj6psxMmNW/kesITb891fPbUx29vVQIqgQpQUaQz3x67YxGJzWZue/7Opq58XsBJTC4M7d+LyAhqBBUCSKVz9z/vYCcoBZFn8ejP+vDdn2323w9aPD4vr//8dzB29+XzcUjCC+H5/vNw/thc3oY4fs5hFNZx9nqKnv5fbryfDxMqV+lVE+Hp4RySqvj5fDjqx5f+R8=", + "bytecode": "H4sIAAAAAAAA/91ZzY7jRBBuJ3Z+WU2AC4/hJPYkcxsJhuUZ4II3swMPgYSPvAMPgMSZE3ckblyROCAu3JBA4oTEaqdnuyafP3/xzGzcK82WFLXbXV1/XVVdriRuD0kYU3cEGJEPwsM0zAewPrz+nYd5fhwsp8S3T/rbvNhOhX49yr+eBppJHPq50Y9k/3wc6HxS7+mjLsZ3cv2bw/O7bu8fsfS384up//sdOpvvfFjHO1sPHwF95/qPrYs48t/S/zjQjyH70ziyF96XvR9/BmeNftCjLvkT8isHfKagWwQ9y4T4OeLliP/MRY23ZUL8TB62jz2b7VIh60KsJfScCj6p4PMYaZlt0JbJgdG59rkrPojDZzDokQ/SsvzKZ90HH2U3i7kM1nr08VPTY+TaYGtj4o1rE1jjM8B6CXVjGNIc9fX0K6DLeCxrV97iuDwP8/w4uHfeMv5vKm+puO3KW5mQdSHWOD9kgk8m+DxGWidO14y4NhT7Ivtczjqmrp2bUbaB0BFtkdG7izD6+PuK9FP3Ib5juyrbvQ33wWPP04mgdVcu/hroMp4jW0TKb6uu+E6EnipOM5Ld9mWu7Zf2zZAR7qdgl+/C89zt77207l//zfZV7N/oDHLxuSH/jPA/D/MZ6G9jeoScV5tqebWurqqyurwsdtV7RN/DAOyE3zSqnrJay/v8JdDC8zPdee9T0B3xv3R7ml+ALOazI+DTo89uOEYRVIwmtIa1FOe2Gcns3P1j2/T1vL8HuozHsmKeM7nfFhuibgx32fAHoMt4jmRT+Qt9+KJuypgKGTE2+o7narPe7lbFbvOsXFfr0wfFc1dtdCL04VzN96iHyP51W1OZf2FNNRK2H7j2vYu+mdG7b8KoaqqH1qrqLps6XQec92OfLccYgoqxh+aiMdjnZ6DLeMwTfcX4q9ozozWsT8wX+/Rbw4t8Lrd+a+eCfjsW+g9cO1fimWb07tsw9uG3KodNhTw92ueMfRNB5f+H9ipM7mP81vh3fTMpvzUacxch/5f5ar1dFeWqWJfL6ux18r/qaalY4TjiHO9gPqY5fhNZra7syD0NZUeVX43fE0Fz1LP+CdHF+hbjiutbw/8xjF6WX0FuD1b/c27ykMJan70xL8dvIAefV1Y39cazHQp8ttNE4Kuct3A6xyAt1ddAm1+QrGbDkcBHehnh/xRGL8s/JJ/yLeWvRvuQ33X1KCL9f5OzXfAeUr2ZgWvHCNa/bLdfwG58D2F/p6vXqew8IPtE6lsU6hvXQN0JKCODuofw/+9/gS7jGcS4M3bl6bNdUVb586Wfru66M07C86gG3ermnnGYmz8xvtHLCP93w73+/RGezR6Z4Ofx/u7ASw6MNzTEu7RuvpvWbfxh3cY33rO6LaOtzWENc6iHd8Ic7YW0TI6M8P8KczuTCeyx/QvBf0L8G3KLd9x/nAv8ucD35/On0Qsj6t73fyg3PIk+vmPZzHdixNV1SG121Wa5PCuWz4tl+Tq9tVi99oT4YN61O9Pb5z/aY/uwxsG9XOMY/gu3p/l/eJ679r3sDtA1mbie84A9xyRpyqt6juoe4Z7jKNnTTJMmb/UNirbq6od01Yqo06FacRaQsFbsqsPUd91967CE9MH63vaqOhW/ET2ksBa7Tm30cur766vsMxX46j+ZBeGrOlB9m7CPIh/0hUO+3/BXt/f9lzm8pGi1KQAA", + "debug_symbols": "tdrRauMwEAXQf/GzH6SRNDPqryxLSVu3BEJS0nRhKf33jZc6LZEUMxf0UurgowT7yh6N/TE8TQ/vL/fb/fPhbbj79THsDo+b0/awP299fI7Dw3G7221f7n9+PLj5j9f/+7+9bvbz5ttpczwNd17EjcO0f5r/zf48wvN2Nw13yX2Oxc5M8WtfDvRz19/j4HPX4cn1Hd73HZ76Dh/6Dh/7Dp/6Ds99h5e+w/edtdR31oa+szb0nbXBOmtnEwATAZMAw4ARwChgst1EB5hGZLIsRqO7NgSYAJgImAQYBowARgFTz0GOtJgcw5VJDjAeMASYAJgImAQYBowARgED5ICBHDCQAwZywEAOGMgBAzlgIAcM5ICBHDCQAwFyIEAOBMiBADkQIAcC5ECAHEg1B+QCfxlycn0PFgVMtht1gPGAIcAEwMS6yUu9Qz7ItUmAYcDIqinu9aqAyXbjXTUIQsuxFpKCVI+1xqV0UY4FSXbCdiJ2onaSzcQ7O/F2QnZSnWrql7OvkQsS7STZCduJ2InaSTaTen/uNvF2AlwxPCGXjOAQ5BFECAoIighKCGIECYLqNSVpWmqW4ItWdaPZcBs1ug0ryCOIEBQQFBGUEMQIEgQhiYhIIhKSiIQkIiGJSEgiEpKIhCQiIYlotB9CurT8ghYFQKP/sIIygBodiBXkEUQICgiKCEoAEntBUF+C3yb2crC+AM+yrIuz5oIkO2E7ETOpL3BvE7KTYCf2g6z2g9xY20a/1BgcCiJ2onaSzSQ7O/F2QnZSr071UsjlkkQ7SXbCdiJ2olZCDrgHkCMEBQRFBCUEMYIEQYqgelUQ9fJIK/nrth3VOyNryCOIEBQQFAHUWDmkzBeUpUCMIAFQo57n7/43F/1vahTMrN9IuUD1n8d8+XnMxc9rlHwrKCAoIighiBtHL19QebFsPHtaQYqgDJzcxuOnFeQRRAgKCEJS3ngGtYIYQWJFn+etP5vjdvOwm75enXx+3z/+eJPy9Pd1unqp8vV4eJye3o/T/Hrl95uV8/kmn0eKbr79z5vZj5nnjfm0epbxnK7zd56/9x8=", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push directly, not through a method call\n self.public_call_requests.push(self.next_counter());\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\nimpl PrivateKernelCircuitPublicInputsComposer {\n pub unconstrained fn sort_ordered_values(&mut self) {\n self.l2_to_l1_msgs = sort_by(self.l2_to_l1_msgs);\n self.public_call_requests = sort_by(self.public_call_requests);\n }\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.sort_ordered_values();\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_0.snap index 7398d2852da..5a77b8c7b61 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_0.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1ZvW7TUBS+juMkjls1gmdgtxO7abdKUJAYGdnctJV4A0YzsrOwgMTGhgRCQmLgCZCQGBALGxJIvAO95Z76y5cTNyW+QCWOFF3b99zz893zY98EpqbAjV2zBomQH26M3diB+fDkt+fu0/Uoi0lvm/J30nwaK/61aP8kdjIDP/JTke8J/7Tv5Nyqavnoi+gdnPwSuB6ZOj58+S/759P/qw0+S+xcr/ztraUbIN+Y9nNr34/9Z/Jv+pGfJy7WHpv5WJP9aRGrdBPsNxALqLdrvPhZBKTPgB04J/qHZGvb+xqQPrGH8ZF9EOwixdaRMoe5jHOoJ1L0XEZZW0aPHUuxsq7N+iJ+9Jy8ruIH2tYhfrw2bg0+u+ZGm6NPYc2y2Ok2YBcq9mwq64IlozGLOaPp0fahKfd/Vw/Kkv4henot6sG9wr5l7/uwbs+N6XqUiQ+B4p+1ZQL2YJxFpo4DXCu9IyL+B6aWue2uNd1coz3VxJVrtDwbGn/vRSnU6JDsYXyaarSs/V+jF2V3aS5U1nl+L0jZR6zfWh3rKD4iFpxjt92o1W8trrTeP1KwCxuw43z9272PsVu1990x7WEXrIgdx13PM3YDBbueWY7dAObkGrGTZ3dNe9hpcRcr9rSIz67UUj5bsCRzQ/LLwGjIRyS0247PQC7zsU6MFdG/ZZbHmGeczuJIcMI4Qp1iW4f4GeOInt0zNU4cR9ynl/VF7f2Ta5Snd4oLxxHGOpMWRyHgc5E4wljhOGrCKSbde+4+XZMCsgXjiHVa6phF7IbgZ0TP7gNOPmq55zPCMeODtvL7kiVtL3Et8kYKb5/mhLdyo8XxvbtOQJ/2zSlzXINwDveYv53Y7lixU/tW4vo8BJ+4Rlni7xThf2hqnz+4a8mxsKp1iO9ntbCa93fPPU/Xo8La8RHsWIj9at7vBOZChZ/jZ0PhT4BHMBsRP+8NYoKyEPP9ap5f1veM3kfwWxP5H7nR8n4n+/A9ekhzoSK7yfZAsV2rqRH4Id/LPuNiuvOrhp7aWtUYcc9A/RHxP3H3mDcydtew83haZseT8rgsysPDfFZeIfmWJAYTD/rL6WRnNs5n04NiUk62z9WP59Gr9MTL+m343I2+eqLPMzfUKXrwPwPJTZt/L2iNYId9ANdyHxD+V6aW+dJdJ0Y/w8TzstekXzsvw/3smHn9wv8W9L9Z4pNZ4hPXKu0cBLHS+jlj32vwwxLjKPzv3Ij9VGT2FT+0sx7hHyj8fcW3LbP4fiBr/7VejhhwL2/yV8MnVvixn3J+ae9hWu71SY/WKzEWOP4w3rFXSq603gOKdDzZGefFOJ8UWbn7p3vQrNg+mOVFmR5l9nZ8nv4twaSq5zE+LfXdvfQF5sc6gvyfhPfk99ldSw5Eij7L962B76I1vVvNP4urRf6wWuQX3cNq0UaZS2AOc8fShrtHvFCW2BER/1d3L3sygDWyfqToH5D+ObuVZ/ztnyj8icJv9+eLyHMj+t72fxKnOkk+PmPbJHZ85NVJSk1n5TTLdvPsKM+K8/LqJ55VNIdNJQAA", - "debug_symbols": "zZvdTuMwEIXfJde5sMf2/PAqqxUqEFClqkWlrLRCvPs2iBS2IVt1yOn6BpHKZ76T5Iyb1PJLc9fdPD9cL9f3m6fm6sdLs9rcLnbLzXp/9PLaNjfb5Wq1fLj+/HET+j9R3sY/PS7W/eHTbrHdNVdRJLRNt77r/7W4r3C/XHXNVQmv7WgwU34fy4k+D/3ZNlGx5Q1angK2fMSWJ2z5hC2fseULtjxjy2O7lrBdS9iuTdiuTed2ba8hhyY5NNmhKQ4NOzTi0KhDY+drcnBoHDnIjhxkRw6yIwfZkYPsyEF25KBMXGuTQaM5/Lulhfh9rJAcl//6clmmobzldKwpDg07NOLQqENj52s4ODTRoSGHJjk0jhywIwfsyAE7csCOHLAjB+LIgThyII4ciCMH4siBOHIgjhyIIwfiyIE4cqCOHKgjB+rIgTpyoI4cqCMH6siBOnKgjhyoIwfmyIE5cmBf5oBCGr7qKciJJ/1IWgZAisfP+pbQgIwGFDSA0QBBAxQNMDAghgAnRDiB4IQEJ2Q4ocAJDCfM0NGpHF4Xk+YRQeEEQxNigBMinEBwQoITMpxQ4ASGE+A9HeE9HeE9TfCeJnhP00RP2yCimGQkSh5R9ojKSdHfPxW+idgjEo/Ivv1LpuZhrHI+MTQOt10zH1uZWif5H1ZiPVboklZMhtdbUxtZSfVYyd+3MnXVz7VS6rHC9ViRS1qhHIc5jtPIitZjxaqxkkM9VmI9VqgeK6keKxedbUkPDyw2tlLqscL1WJF6rGg9VqwaKwU42/b1J1aXsx7ql3jqNasYHwbb6D1mYi16TkKBExhOEDhB4QRDEybW5+ckRDiB4AR4T8sM/cAfC6I8WhCNOsNVYj6cA/PoHHSGWYP14xx0NLeqws/B0AQLcEKEE+bIktqBMP6WtgQnZDgB3g/GcILACQonGJhAIcAJEU4gOCFBCa/7o1+L7XJxs+reNzfdP69vP+112v1+7I62PT1uN7fd3fO26zdAfex96u8nRWoppT5B/WEsqY1F+8P+XlDgloLuqXvyHw==", + "bytecode": "H4sIAAAAAAAA/+VYwW7TQBBd13ESx0WJ4DOQkJ3YTXqrgILEH3B001Zw5M7BXEDixg0JhITEgS9AQuKAuHBDAon/IVt26peXidsq3qKKlay1vbPzZt7O7KwdmLoFru+YDZoo+e362PVbMB4urj33nG7Wsphw29Q/S/NprPjXov2T2OkM/OhPRb8n/tOe03O/qvWjL4LbX1wJ3I9MHR++/Jf18+n/jQafJXbuVP7W1ra7oN+Y9nNr34/9p/rv+dGfJy7WnpnlWJP1aZGr9BrYbyAWELdjvPhZBIRnwA4cE/wB2dr2ugaEJ/YwP7IOwl2k2DpSxjCXcQxxIgXnKuoSbpDLYE0vOPyOcTgOESdsEQd1yR7Ia90Gjsab5FwX5u25Pt2sZeJDoPhn8W6CPfaSGhmZOg5wrux/Eck/NrXOW+5ew+Z9xlNen3ufkXcD4/Vsc7rPhGQP89O0z8jc/32fGSq6OzQWKvM817aUfeyAj9o+tqX4iFxE9O626+054QXMWRdXWv0aKdyFDdxxvkaeuesp3EUN3PVgTO6RO3n3wLTHnbZ/xIo9LfIzk/2gb1abjMXkl4HekI/Y0G6r/yXoZTnGxFgR/KFiA+egJ55O40h4wjhCTLFti+SZ44jePTQ1TxxHXGvW7e1aDnKe9f3ws8uxgk3GBoCNNnLT4kjsvmgcYawMLoeLcUB44hP7LfgS17Fiq6F5kSLbpTGRfWRqzj65+wTwMG65zjE36+zkMyzbrdmp1WCMDXzG8yLmD58XRf6JqX3+7O4lTsKqxhDfxb5OtezvnnufbtYKa8cXsIM5iqplvxMYCxV5zu1tRT4BGeFsRPLavt5TdCHn+9WyvMzvKvKoj2P2qeut7C+yD88zAxoLFd1NtgeK7dq+0AM/5LvFZ1xMZ3/ryYmtVc0R73uIH5H8c/eMeSN9ZwM7j6dldjwpj8uiPDzM5+V10m+bxGDiAb+cTmbzcT6fHhSTcrJzJj7+2zrPOfOqntFfud7XOdPnvw/EFBz8/yi5afPvNc0R7rAO4FyuAyL/1tQ637j7xOj/kvC/xTvCjxR8XE+uyyL/AfDfr/HJrPGJ9yrtexS5GprVWGLuuw1+2MY8ivxH12M9bdpztW9uke8r8k1nkC6MyVytlgvmv6jlS9+G1fn91fiJFXmsp5xfTWerplqp/SvBWOD4w3iXuZgrrdeAIh1PZuO8GOeTIit3L7sGzYudg3lelOlRZh/HZ+EPhZOqHsf4tK3nnqUusDzuIyj/VWQX1zd3LzkQKXhW7meD3EX39E61/C6uVuXDalVesAfVqo0ylsAY5o5t2+4Z+UJdYkdE8j/cs6xJH+bI/JGC3yf8JbuVd/z9mijyiSJv1+e76HM9+t72v+ETTNKP79g2iR0febVIqem8nGbZbp4d5VlxVl79ATXZqYiZIQAA", + "debug_symbols": "zZrRbuIwEEX/Jc95sMf2eKa/slpVtE0rJAQVpSutqv77JogAS0hRBi7yS9WA75wbM+PYsb+ql+bp8+1xvnxdfVQPv76qxep5tpmvlu3V13ddPa3ni8X87fH448p1f3zetv94ny27y4/NbL2pHnzOrq6a5Uv3r/o2wut80VQPyX3Xg8ZMcdeWAx03/V1XXrDhFRqeHDa8x4YnbPiADR+x4RM2PGPDY6uWsFVL2KoN2KoNU6u205BBEwyaaNAkg4YNmmzQiEGj0zVxpK819xqJ7ueUycS7tpnyafjz3aWR+vAaw6kmGzRi0Oh0TXIGjTdoyKAJBk00aJJBY8iDZMiDZMiDZMgDNuQBG/KADXnAhjxgQx6wIQ/YkAdsyAM+mwfkQj9UkcsXnoTktB83yf8/BnYABQOyQwM8GkBoQEADIhqQ0AC+GuBJUl9owZ/OCXNGAwQNUDBAHBrg0QBCAwIaENGAhAagK1nQlSzoShZ0JSu6kvUGlRzSfrkXJJ4CCA0IaEBEAxIawGhARgNGKvloJhJO3wSoTtd45ywif1E0mCd5RxZRsIjS1W9cJPZtheOFpr7/0SXywAqXYyWXY0XuaUVzv4xV0YEVLcaKd9dbGev1qVZ8OVaoHCvhnlYo+n6M4zCwEsuxksqxwuVYyeVYkXKsaDFW6K6jLcl+wqJDK74cK1SOlVCOlViOlVSOFeBo28Uf2Wz9cd3UrgYsIm8RkUUULKJoESWLiC2i84+6KPs8SP7SYjgp7xvrYL05svd8S4KiCSP7zZMIfNiQ48GGnE836CXm/T0wD+5hZH91GkEO9yCDmh/ZJb3lPSQ4geGEDCfcIpdE94Th04MVTTi/v3tTArweMsEJAU6IcEKCExhOyHCCwAkKJXy3V39m6/nsadHsDp+/fi6fj86ib/6+NyfH0t/Xq+fm5XPddAfUD2fTu7HBi9Ttq+TO+faStPYhbtep22+pbmewLbUl/wM=", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push directly, not through a method call\n self.public_call_requests.push(self.next_counter());\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\nimpl PrivateKernelCircuitPublicInputsComposer {\n pub unconstrained fn sort_ordered_values(&mut self) {\n self.l2_to_l1_msgs = sort_by(self.l2_to_l1_msgs);\n self.public_call_requests = sort_by(self.public_call_requests);\n }\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.sort_ordered_values();\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 0519819f51d..abba641434e 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/91aP4/TSBQfr+0k3sRxdPcJ7hvEib1Zui2uuvLK67yBlU666sqrjHTVtYeQkCj4BAgJiYJPQElPQwMSEhIFoqFiZ5mHf/vyi+OwnhUw0mrG8968P795b/5lA9OUwNWRuUIRISPXSNz3AdDD878T9z2/WskTpbdP+cfzokiIfz3av0yczMCP/LnI94T/fOjk/Fo38tEX0Ts6/xtDe2Ka+PDlv8yfT/9/bvF57Hx9qXwVuunRjhR8M2AL6o38YFAGSp8BO5Am+g+VrX2vCYHSJ/ZofGQeBLuY2DojNIwlpKGemOj5HmVlhseOLQkZ12duiR8DJy8ifqBtB4of28aNwb5fXG1z9DWM2RY7UQt2IbEnJeOCLbUxmznD9LB5aMv9ffXInA6UnhP3Pb9iYXgNlB/DHvyYKVkB8XHkx8cvew6eHXqSnYvsQ+V73/LHfrDJZY5xPmX+bb2Efszz2DR5iGNHQEf+ZyDzyLW77JGe1rLOe6Tov649ku0RbXvkkNjalmuB2czpkPR1ydtvVVZGZEeKxvbWhMj0sX/KWTsiPqJtB4of28Y0OSZ9v7ma7Z/7nj0OiD0MO332mHjGLiXYTVqwS4EmbcRO+n43/WEXmm7Y6bhLPWM3NZvYpS3YTYEmbcRO+v4w/WH3tXE39YxdRrCbtmCXAU3aiJ30nZr+sGNxl5JxVz3DsXlg5wg5s9g9/0/ox/Wu6zlC+B+CzL9cu0t8fK9r+t+u9r0uIU2vS77vkww7Npf7YveP2Y5dSLALW7DT71W29HnPY3Okz3rbcus29CN2+57R74DMf107I+N1fHg6E8+1PxgfofJZsNSxg/mg/f3P1Sw+9Lzpvrb4CFqwixR2nt5BF21rBJtL9q6k9wwZFxPeRNGE939XW4zfuLaNXfbGh/fOu0ov2y/iFtuE/z7IvKf4d2EjOcbyLwa5t107M3yvQZ2THX7o3BT+B6629LdKZkr8YHcm4Z8SfnYOzMzmeitjhT+sG5rolFiIgNbn3d1i8A7s0BjEdXd/GT4Z4Z8qHltmih+xYut5qmSwuy7Ggo4/pMlYzBX2JoA59UjpZ7E4VDxCR/4nIPNxB5+65hT6JOdFFoM679MdfuicEv6nrmY5xWIGzxr7xsxQ+YOxIGNZTuHvcrZEQPOdU5fufHV3fxk+M8KfKR5jmryZAS1VNJx/nZcTogdjQccf0mQs5gq7W+i3JP3mgTScZ/2OPlXfyJson4dmu8/yjfGPNun4F/7nrsb4ZzEovv/oMajXbhaDgcIEZSHmY8Uv4wem/d1Kr1EvXG2xiYPL9uH5a6psZ3e9NtsDYvuuc4/8NuAzLlbHn+8BF7bWDUZ45zJKf6z4X7lv/RuNYHjylXaerar8bFmdVWV182axrn5S8m3B/z3oW3+1Wh6vF8V6dVouq+XR9esv54vl8aIoF8WyzKsb161/XR6drouymt/K7edil37J9UHd0HGds2XovuWuqflFXqz43wvv+d8H1/5yLqk39Vm+KNjOF2ypL2SQvqi+3JfUm/xhvckvug/rTRuFNgYarsG2TNw34oWyxI5Y8QdOgMzJCMbI+BnRP1L6L9lN+nAP0LJC0if8dn4+ijxXo+99//Z3oVPJxz5tm8SOj7w6T6nVulrl+Y0iv1Xk5a68+gQg6rkVtSgAAA==", - "debug_symbols": "1ZxhTxsxDIb/y33uh8RJHJu/MiFU4ECVqhaVMmlC/Pf1TlxhPUhUM1fOl2m35bWfRe/ZzhTutbvvb18eb1abh+1zd/XrtVtv75b71XZzeHp9W3S3u9V6vXq8+fzHnRt+8WFc//y03AyPz/vlbt9d+Zzdous398Nv2R8iPKzWfXeV3Ntithghvq/FAJ+XXi86H3XDJ93wqBs+64Yn3fCsGh6cbnivGx50w+u+taD71oLuWwu6by2c+9YOGhJo+HxNcAKNF2hAoAkCTRRokkCDAo3AB0HggyDwQRT4IAp8EAU+iAIfRIEP0jf/Hs6ThqIrl4EM+L42Qz4N/zUSR5jCcwynmiTQoECTBRoSaPh8DTqBxgs0INAEgUbgAxT4AAU+QIEPUOADFPggC3yQBT7IAh9kgQ+ywAdZ4IMs8EEW+CALfJAFPiCBD0jgAxL4gAQ+IIEPSOADEviABD4ggQ9I4AMW+IAFPuAvfQAuTK0eXK6cDjxQmhIED5XFkY4DR/K1yInxuJhPRw4O7aLHdtFTu+jYLnpuF53aRedm0b1zDbP7htnbbajema7t+DHH4GyO8U61zIwZWDuDd+oZvHoGUM8Q1DNE9QxJPcN/GHZCOv6HYqB4uTrkc8Ps1DA7t8sOrmF23zA7NMweGmaPDbOnhtkb7qtgur6X5/ugWmfGDEE9Q1TPkNQzoHqGrJ6B1DOwdoZ47rwzir4ZNHjKBIfdn4lAIgoSUayK/r2jMIqSRIQCUTI9YiIeSz/ibGuT6VEH6aP0E87YTbfcyr6bPspW2E0fZSvstkedIjvarjPER3aejWlo+ihbYTd9lK2wN1zf0fRRtsJu+ihbYbfdV8vstvtqmd12Xy2z2+6rRfZsvK8W2Y331SK76Xs35Vksm74CUt53Mn0VobzvZPpyX4U9Nsxu+wpImd12nSnO72T6gl+F3fQNvwp7w/WdTV/xq7CbvuJXYbfdV8vstvtqmd12Xy2z2+6rZXbjfbXIbryvFtjBuR//yC7FaS1h5cRHftoSinMUbwcF7KCES6JwnszCxDOUaAcl/Rzlu10/FwXtoGQ7KHRJFIh+KrUYZihsBsU7OyjeDgrYQQl2UKIdlItWW6DjBRmeo6AdlGwHheygsBkUcHZQFKvt9dvh6fdyt1rervv3rw8+vGzuPn2McP/nqT/5LuHTbnvX37/s+uELhR8fJxy2DAIvAN1wtBkfIS4AeHj049+GBYR0yHrI/Bc=", + "bytecode": "H4sIAAAAAAAA/9VZP4vUQBRPNpv9m90N+jEE2ewm7l4nYmUnWNnl9u4aRRAsLFOJIFj4CSztbWwUBMFCbOwEBT+KO+c893e/vGQDlzm9gTDJvDfv3/zem5ld39s13/Zd7xxNhPyy/dD2HaAH2+em/Z6fryVD0tum/PU8TYeKfy3avxxamb4b+XOR7yj+876Vc7vYyUdfRO9g+4zhPfJ2+HDlv6yfS/+v1vg8tr6+I1+F7rVoxwR888AW1Nt1E4PMJ30e2IE00T8iW9uuCT7pE3s4PrIOErtQsTVWaIglpKGeUNFzGWVJbDCWfkUveniM9TAOUU/Qgp6h4k+bOR97ZfyG5EevBT9ikuUrPvbd+Pi3bg7ArpZkJyKb9+625Y/cxCaRNcb1lPU3a3UNxs0j+17o7fIQ5/aBjvyvQeZ1+96kzvfc+N24zov+i6rzPbJnX50fK7bGCo3r6VjRM1b0XEZZM0V2l2h1dQhltllrxUc5L3YVH9G2DvHju2khjd2yvalzH2BOFa5wjOPaUezRYhdQ7CLHsZsosYtqYjcBmrxj7GTsjtde7ALFHtd7KZ89UKbsHYb/LozjvKb1XPifgcx79n3mlf3n3HJUz+dcPxAfWpw6XjnvsM7w/nXf9ho+sD7X1Wwtt1ycGTUc8r5RhY8cxnFeU3wI/0OQeWTfZ8p8qcuO77YLn/R5Ff7wHhIotno0L1R4B0QT3ge2N/SP9t1gbKL4j+ewR6S3B/IDZS7bJvxPQOZj4se7vBYbwYmGoQ7IFQzV7Recr1V+VJ0nn9rexPETyYwUP7R6zXsK8keKbzOvXDNkrvRBsaOJTrkbdIHW5lnWxOAz2MExCIvm/mrxmSr8E+IxLSZ+jJVWkyKSoe2zaAvjTzujYK5MFJ2YU89Jv4ZFxqvQkf8lyHxB/Nre0DSnApAr+7aGwR7pjPb4wTkl/K9sr+WUhhntXN4UMwH5g1iQuVpOic5/kVNnzo9Fc3+1+MwU/inxmBYTP8ZKOwdyXmr3KcQC4w9pMhdzRcMf3634DoA0tI/PwlP6Rt5Bjc8cN/lG/KNNjH/hf2N7xP//hkGMEWOwDlOmMQZjhb8OZzHQmuAMYz4ifpnfq+DHWoz8b21vYvOT7MPfYqdE03BdZ3vTGo05Ir+VucTFav3nrnNqa7GLEe4zHukPif+9/cY1kb57DjtPVnlyssxP8iw/Oko3+RWSbxr+n9S2/ny1XG8W6WZ1mC3z5Y2L15/NF8v1Is0W6TJL8oOL1r/Jbhxu0iyfHyfmc7FPv+R6r9jRsc6Z1rffcp9mfrwfIv8X4d0+X+275HCo6DN8P2r4/Ir+VIYy1i3Ojg2LMn9QlPlF96go2yi0MdCwBpsW2W+MF8oSO0Li/26/ZU0GMEfmx4r+Aek/Y7cyhnsAywqUMbzXfRN5tkff2/4t/FQnyccxtk2w4yKvtim12uSrJDlIk+M0yfbl1W/fO68iiSIAAA==", + "debug_symbols": "1ZzRbuIwEEX/Jc95sMf22NNfWVUVbdMKCUFF6Uqrqv++BDWUJcVRZmt0/YIw+E4O1vWMgyO/N4/d/dvz3XL9tHltbn69N6vNw2K33Kz3rfePtrnfLler5fPd6ceN6V+sO/R/fVms++brbrHdNTc2RtM23fqxfyt2H+Fpueqam2A+2lFnJv/Zlx2ddr1tG+vLhg9lw3PZ8LFs+FQ2vBQNT6ZseFs2PJUNX3bWUtlZS2VnLZWdtTR31vaapNDIfI0zCo1VaEihcQqNV2iCQsPzNf7C75E4aJI3eZtF4s++keJ5+O+RxNMQXrw710SFJik0Ml8TjEJjFRpSaJxC4xWaoNAofBAUPggKHwSFD1jhA1b4gBU+YIUPWOEDVviAFT5ghQ/4Wx+QcUOqIhMnqqelFIYLOEsTnV04JlmX/DmNINFEA0VjoWgIisZB0XgomgBFw1em8em4QAt2KnIQPnaW8yVajPWip2rRk0VG56/ayqPamn4gD1yeTHNnXgpQNAxFE6FoEhSNINGIgaKxUDR0ZZqfy/Li6kX39aJHZPRsbbVmbiI4iC7MVxl+A1kXRyLSiJxG5CdF//7HeBAFjYgVImug7cJHpzOPhtZCJxhOX1ZPPGLniscdO8Xk2VPF7FIvO2HnmSRHdhmVJbIVs0OvHyfYK87vBL2CnGAPFbNj19U8O3ZdzbNj19U8O3ZdzbI78LqaZQevq1l26D2P/FrMCTR7dtw91Tvu3lXM7itmDxWzY+eZ7PrdQ2+uTrBD765OsFec34OpmB17WzvPjl1X8+zYdTXPjl1X8+zYdTXPDl5Xs+zgdTXHfuHZ4TmP3Cc/9E08cceX7DAkyY9RLA4K4aC4a6JIHMwiSUYoHgcl/D/KpVGfi8I4KBEHJV0ThbwdUi2Plt8sMCjR4KBYHBTCQXE4KB4H5arZltLxAZnxvXRkHJSIg5JwUAQGJRkclILZ9vZj3/q92C4X96vu83SKp7f1w8lhFbs/L93ZuRUv281D9/i27foTLL4Or+iHzIq0RKbnPjSTb22SvmkP37rWSthfdX/lvw==", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push directly, not through a method call\n self.public_call_requests.push(self.next_counter());\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\nimpl PrivateKernelCircuitPublicInputsComposer {\n pub unconstrained fn sort_ordered_values(&mut self) {\n self.l2_to_l1_msgs = sort_by(self.l2_to_l1_msgs);\n self.public_call_requests = sort_by(self.public_call_requests);\n }\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.sort_ordered_values();\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 858aa9a801c..40a9d25889d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1avY7bRhBeiqQonSLc4VIFSICkSheIEnnSpQgCxHEcIEXKtLTs65ImeQCWaQIECBA/hB/B7+DGgGtX7g24c+Pb84746eOQlk67/oMHEEjuzs7fzu7MzioyDUTumZgDQIj84l7G7nsA/fHl73v3PTsM8jHx9Ul/NSvOx4p+HuVfjB3NKAz9mdAPZP9Z5uj8XDf0URfhO7r8TeD91DT+EUp/mb+Q+n/ao7P4zg91uLm1cMPRNwFo/wiye6S/Wbc3w9hmQ/8n/7bZ0L4VRvbCrhO7Rv4wjR9ZHrIxe+ZXTh3N1LQhUtpiBUdks3L/5d6nCp6BPl43Q+rDNZtRXwx9I/d+bNp2EvpiwxT6fK7FiHRIHH3mKbINCB/fjRuDbV+5p9X1H9IPA3astIkdT0zb5oI3VcZFHU/hw23MR5sHnncffLS9l33IBx+OIRbGpu2PHv3qTPRA3zCkYwa8eT5H0MdzgLkT6sagrXdps/T/BbqMx7Jq8x44Rpe7zDfyPzJBc7I8Mm3fjE3bPuzLsSLrCfVZuFE3eNwXK23vMy3Z89F3ZA0cm267BY6pvfGAeYqu+8SDW+6pxYN97arta5rteL0OA9suU2w3NN22w31Q3tF20var8Wc73iO6bMd+lwW23UixXWa6bYdxQt7RdtL2m/FnO83vpsq4qONpzG5xW/PhN5WHyHyjfT3O9znHcgTpOyLe2DeBPk1v1t8Ajuhkn/eBLuMZskWguDpn3xe52deEv7ZORyS74Kam7ZdytkwJ93ewyyP3PjHNHCW1f/2Xq1dr/0pnkIvnDfmnhP+n+0Z/kWdygJwXyyq/WFQXVVnduVOsq1Oib2EAdsKz78e8cQMf80aPtLS8kf0q0JluE6MlD0wUPVC2AeHju4WU2v52Ty1Ga76DbfucrTW7auduqX/ate17b6mWi9V6XqyXt8tFtTi71t6SKLLaPPM/oGV/sl/KvspjpR6YEv4909D8H2QJnEcvuT6AcN36QF9OESl8tLxB9LW8HwNdxmNZsY4mcn8oNkTdGF5nwydAl/EMyZYSXfZhqcfz2sCxuDZwPfWdGbXaLOfI78ocHuLPz4Eu4zFPzZ81Gwre+37ufgB2OvTsyHV87IsU22lnzr460T5+G+gsv2LfRND2F5SRQfNbkfsQvxX+mp3Yb992zYPvXnateTw0jZ0OvXvR7oL6akma3wqNIPlUOZsvVvOinBeLMq/O98mn+u7fjhX9B9Sn7THyndE31kblHN53v9VnR61OxPeNkcLbl/4R0cX8EuM155eC/9Q9rSxJ1MhtQc72KFfIOsQllFaODOTg+Urrbb1xbmMFn+2k1XdwnfO8dsX2rriDNr9JsooNhwo+0uMz2TP3tLJ8EW3Lp/lWX420y+8+xLPsC7BbiLNs4BpSoZ0xBbR4ijIyaDEc/1/1Ja19o9AKETPW5dntdVFWs7u5/Zy/LmYcu/dhDbrV22My9y3+xPhCLyX8iSNg19GU7JEq/Cze5z14UcfziobSltTbbeO6jR/XbXzhfVS3ZZS+CfThHmrhE/eN9kJaIkdK+J85AjInIxgj408U/iPivyW30sb/L5go+BMF387PqRskfou6+66vXvEk+tjGsonvhFhXl0tqua6WeX5e5HeLvLxOLtZ3fxv67lt8bde7b9wHMQZzPe1rp0io+9s3fQeJMUvyDetb30TbY2Qc5oc4lvNDwZ/DnpiDv3LsNh10uSaEemK9tCR5tXqpFoN5fr8FeVfRNm/t/I620vJstv2wRy4LXXn2d+B3Cemq5bDow/vmsCKPdjaSsVqOj2duCwn0hc7xt2o/9e76avYZK/iYx/P6wjoI59DauY59FPmgL3T5Po5F338J2IdHfVExAAA=", - "debug_symbols": "ndvRSuNAFIDhd8l1LzJzZs4546ssi1StUihVqi4s4rtvu5gqTdJw/ptlI362dH6amUny0T1s7t6fbrf7x+fX7ubXR7d7vl+/bZ/3x6OPz1V3d9judtun258/7vrTP6n9//3Xl/X+dPj6tj68dTfJrF91m/3D6b8tHf/C43a36W5q//l71eUemARMBkaAKcBUYBQYA8aBAR0I6EBABwI6ENCBgA4EdCCgAwEdCOhAQAcFdFBABwV0UEAHZaaDZoPx0l+aCowCY8A4MC1uag9MAma6g1byYFqRSyPAFGAqMAqMAePAtLjRHpgEDOhAQQcKOlDQgYIOFHSgoAMFHRjowEAHBjow0IGBDgx0YKADAx0Y6MBABw46cNCBgw4cdOCgAwcdOOjAQQcOOnDQQQMdNNBBAx000EEDHTTQQZvsIPeiXyb3djmHbQaMA9PiJvU9QYmgTJBMozasGXISG6FCUCVIF9Foypx6I8gBSpOvpLl8GZU8Ih4nLUymt62ukxQnOU4kTkqc1DjROImPfo6Pfo6PvsRHX+KjL/HRl/joS3z0JT76Eh99iY/+9IaG5eEL2vLoC3B6z8DLsGXgWkYkx4nESYmTGicaJxYnHictTKa3CjwNo+9FRyTFSY4TiZMSJzVONE4sTjxMLIPJgglB0/Pu7HWYQ0safc/MLMQXkBJkBDlBDaCZ1fgCSgRlgoQgUoSTIpwU4aQIJ0U4KaKRIhopopEiZpbmUs+XcMRHJ5aZtfkCqgQpQUaQE9TiKE8v0JdQIigTJAQVgipBSpAR5ASRIlJ4ppKTxonFyeRH0GzYT2veRqSFyfTewXWS4qTGicaJxUn8Q87xD3l6iZ5LGuaCKiOS4iTHicRJiZMaJxon0xuBfp5wtzHxOGlhMn0XyXWS4iTHCTkHFHIOKOQcUMg5oJBzQCWzgkpmBZXMCmZu8Sh+vpWkpvFtfIWgSpASZAQ5QDMrh9r0jNrlTlyeWTksoERQJkgIKgRVgpQgI8gJAkXIzHxev69v6uj6psxMmNW/kesITb891fPbUx29vVQIqgQpQUaQz3x67YxGJzWZue/7Opq58XsBJTC4M7d+LyAhqBBUCSKVz9z/vYCcoBZFn8ejP+vDdn2323w9aPD4vr//8dzB29+XzcUjCC+H5/vNw/thc3oY4fs5hFNZx9nqKnv5fbryfDxMqV+lVE+Hp4RySqvj5fDjqx5f+R8=", + "bytecode": "H4sIAAAAAAAA/91ZzY7jRBBuJ3Z+WU2AC4/hJPYkcxsJhuUZ4II3swMPgYSPvAMPgMSZE3ckblyROCAu3JBA4oTEaqdnuyafP3/xzGzcK82WFLXbXV1/XVVdriRuD0kYU3cEGJEPwsM0zAewPrz+nYd5fhwsp8S3T/rbvNhOhX49yr+eBppJHPq50Y9k/3wc6HxS7+mjLsZ3cv2bw/O7bu8fsfS384up//sdOpvvfFjHO1sPHwF95/qPrYs48t/S/zjQjyH70ziyF96XvR9/BmeNftCjLvkT8isHfKagWwQ9y4T4OeLliP/MRY23ZUL8TB62jz2b7VIh60KsJfScCj6p4PMYaZlt0JbJgdG59rkrPojDZzDokQ/SsvzKZ90HH2U3i7kM1nr08VPTY+TaYGtj4o1rE1jjM8B6CXVjGNIc9fX0K6DLeCxrV97iuDwP8/w4uHfeMv5vKm+puO3KW5mQdSHWOD9kgk8m+DxGWidO14y4NhT7Ivtczjqmrp2bUbaB0BFtkdG7izD6+PuK9FP3Ib5juyrbvQ33wWPP04mgdVcu/hroMp4jW0TKb6uu+E6EnipOM5Ld9mWu7Zf2zZAR7qdgl+/C89zt77207l//zfZV7N/oDHLxuSH/jPA/D/MZ6G9jeoScV5tqebWurqqyurwsdtV7RN/DAOyE3zSqnrJay/v8JdDC8zPdee9T0B3xv3R7ml+ALOazI+DTo89uOEYRVIwmtIa1FOe2Gcns3P1j2/T1vL8HuozHsmKeM7nfFhuibgx32fAHoMt4jmRT+Qt9+KJuypgKGTE2+o7narPe7lbFbvOsXFfr0wfFc1dtdCL04VzN96iHyP51W1OZf2FNNRK2H7j2vYu+mdG7b8KoaqqH1qrqLps6XQec92OfLccYgoqxh+aiMdjnZ6DLeMwTfcX4q9ozozWsT8wX+/Rbw4t8Lrd+a+eCfjsW+g9cO1fimWb07tsw9uG3KodNhTw92ueMfRNB5f+H9ipM7mP81vh3fTMpvzUacxch/5f5ar1dFeWqWJfL6ux18r/qaalY4TjiHO9gPqY5fhNZra7syD0NZUeVX43fE0Fz1LP+CdHF+hbjiutbw/8xjF6WX0FuD1b/c27ykMJan70xL8dvIAefV1Y39cazHQp8ttNE4Kuct3A6xyAt1ddAm1+QrGbDkcBHehnh/xRGL8s/JJ/yLeWvRvuQ33X1KCL9f5OzXfAeUr2ZgWvHCNa/bLdfwG58D2F/p6vXqew8IPtE6lsU6hvXQN0JKCODuofw/+9/gS7jGcS4M3bl6bNdUVb586Wfru66M07C86gG3ermnnGYmz8xvtHLCP93w73+/RGezR6Z4Ofx/u7ASw6MNzTEu7RuvpvWbfxh3cY33rO6LaOtzWENc6iHd8Ic7YW0TI6M8P8KczuTCeyx/QvBf0L8G3KLd9x/nAv8ucD35/On0Qsj6t73fyg3PIk+vmPZzHdixNV1SG121Wa5PCuWz4tl+Tq9tVi99oT4YN61O9Pb5z/aY/uwxsG9XOMY/gu3p/l/eJ679r3sDtA1mbie84A9xyRpyqt6juoe4Z7jKNnTTJMmb/UNirbq6od01Yqo06FacRaQsFbsqsPUd91967CE9MH63vaqOhW/ET2ksBa7Tm30cur766vsMxX46j+ZBeGrOlB9m7CPIh/0hUO+3/BXt/f9lzm8pGi1KQAA", + "debug_symbols": "tdrRauMwEAXQf/GzH6SRNDPqryxLSVu3BEJS0nRhKf33jZc6LZEUMxf0UurgowT7yh6N/TE8TQ/vL/fb/fPhbbj79THsDo+b0/awP299fI7Dw3G7221f7n9+PLj5j9f/+7+9bvbz5ttpczwNd17EjcO0f5r/zf48wvN2Nw13yX2Oxc5M8WtfDvRz19/j4HPX4cn1Hd73HZ76Dh/6Dh/7Dp/6Ds99h5e+w/edtdR31oa+szb0nbXBOmtnEwATAZMAw4ARwChgst1EB5hGZLIsRqO7NgSYAJgImAQYBowARgFTz0GOtJgcw5VJDjAeMASYAJgImAQYBowARgED5ICBHDCQAwZywEAOGMgBAzlgIAcM5ICBHDCQAwFyIEAOBMiBADkQIAcC5ECAHEg1B+QCfxlycn0PFgVMtht1gPGAIcAEwMS6yUu9Qz7ItUmAYcDIqinu9aqAyXbjXTUIQsuxFpKCVI+1xqV0UY4FSXbCdiJ2onaSzcQ7O/F2QnZSnWrql7OvkQsS7STZCduJ2InaSTaTen/uNvF2AlwxPCGXjOAQ5BFECAoIighKCGIECYLqNSVpWmqW4ItWdaPZcBs1ug0ryCOIEBQQFBGUEMQIEgQhiYhIIhKSiIQkIiGJSEgiEpKIhCQiIYlotB9CurT8ghYFQKP/sIIygBodiBXkEUQICgiKCEoAEntBUF+C3yb2crC+AM+yrIuz5oIkO2E7ETOpL3BvE7KTYCf2g6z2g9xY20a/1BgcCiJ2onaSzSQ7O/F2QnZSr071UsjlkkQ7SXbCdiJ2olZCDrgHkCMEBQRFBCUEMYIEQYqgelUQ9fJIK/nrth3VOyNryCOIEBQQFAHUWDmkzBeUpUCMIAFQo57n7/43F/1vahTMrN9IuUD1n8d8+XnMxc9rlHwrKCAoIighiBtHL19QebFsPHtaQYqgDJzcxuOnFeQRRAgKCEJS3ngGtYIYQWJFn+etP5vjdvOwm75enXx+3z/+eJPy9Pd1unqp8vV4eJye3o/T/Hrl95uV8/kmn0eKbr79z5vZj5nnjfm0epbxnK7zd56/9x8=", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push directly, not through a method call\n self.public_call_requests.push(self.next_counter());\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\nimpl PrivateKernelCircuitPublicInputsComposer {\n pub unconstrained fn sort_ordered_values(&mut self) {\n self.l2_to_l1_msgs = sort_by(self.l2_to_l1_msgs);\n self.public_call_requests = sort_by(self.public_call_requests);\n }\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.sort_ordered_values();\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_0.snap index 7398d2852da..5a77b8c7b61 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_0.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1ZvW7TUBS+juMkjls1gmdgtxO7abdKUJAYGdnctJV4A0YzsrOwgMTGhgRCQmLgCZCQGBALGxJIvAO95Z76y5cTNyW+QCWOFF3b99zz893zY98EpqbAjV2zBomQH26M3diB+fDkt+fu0/Uoi0lvm/J30nwaK/61aP8kdjIDP/JTke8J/7Tv5Nyqavnoi+gdnPwSuB6ZOj58+S/759P/qw0+S+xcr/ztraUbIN+Y9nNr34/9Z/Jv+pGfJy7WHpv5WJP9aRGrdBPsNxALqLdrvPhZBKTPgB04J/qHZGvb+xqQPrGH8ZF9EOwixdaRMoe5jHOoJ1L0XEZZW0aPHUuxsq7N+iJ+9Jy8ruIH2tYhfrw2bg0+u+ZGm6NPYc2y2Ok2YBcq9mwq64IlozGLOaPp0fahKfd/Vw/Kkv4henot6sG9wr5l7/uwbs+N6XqUiQ+B4p+1ZQL2YJxFpo4DXCu9IyL+B6aWue2uNd1coz3VxJVrtDwbGn/vRSnU6JDsYXyaarSs/V+jF2V3aS5U1nl+L0jZR6zfWh3rKD4iFpxjt92o1W8trrTeP1KwCxuw43z9272PsVu1990x7WEXrIgdx13PM3YDBbueWY7dAObkGrGTZ3dNe9hpcRcr9rSIz67UUj5bsCRzQ/LLwGjIRyS0247PQC7zsU6MFdG/ZZbHmGeczuJIcMI4Qp1iW4f4GeOInt0zNU4cR9ynl/VF7f2Ta5Snd4oLxxHGOpMWRyHgc5E4wljhOGrCKSbde+4+XZMCsgXjiHVa6phF7IbgZ0TP7gNOPmq55zPCMeODtvL7kiVtL3Et8kYKb5/mhLdyo8XxvbtOQJ/2zSlzXINwDveYv53Y7lixU/tW4vo8BJ+4Rlni7xThf2hqnz+4a8mxsKp1iO9ntbCa93fPPU/Xo8La8RHsWIj9at7vBOZChZ/jZ0PhT4BHMBsRP+8NYoKyEPP9ap5f1veM3kfwWxP5H7nR8n4n+/A9ekhzoSK7yfZAsV2rqRH4Id/LPuNiuvOrhp7aWtUYcc9A/RHxP3H3mDcydtew83haZseT8rgsysPDfFZeIfmWJAYTD/rL6WRnNs5n04NiUk62z9WP59Gr9MTL+m343I2+eqLPMzfUKXrwPwPJTZt/L2iNYId9ANdyHxD+V6aW+dJdJ0Y/w8TzstekXzsvw/3smHn9wv8W9L9Z4pNZ4hPXKu0cBLHS+jlj32vwwxLjKPzv3Ij9VGT2FT+0sx7hHyj8fcW3LbP4fiBr/7VejhhwL2/yV8MnVvixn3J+ae9hWu71SY/WKzEWOP4w3rFXSq603gOKdDzZGefFOJ8UWbn7p3vQrNg+mOVFmR5l9nZ8nv4twaSq5zE+LfXdvfQF5sc6gvyfhPfk99ldSw5Eij7L962B76I1vVvNP4urRf6wWuQX3cNq0UaZS2AOc8fShrtHvFCW2BER/1d3L3sygDWyfqToH5D+ObuVZ/ztnyj8icJv9+eLyHMj+t72fxKnOkk+PmPbJHZ85NVJSk1n5TTLdvPsKM+K8/LqJ55VNIdNJQAA", - "debug_symbols": "zZvdTuMwEIXfJde5sMf2/PAqqxUqEFClqkWlrLRCvPs2iBS2IVt1yOn6BpHKZ76T5Iyb1PJLc9fdPD9cL9f3m6fm6sdLs9rcLnbLzXp/9PLaNjfb5Wq1fLj+/HET+j9R3sY/PS7W/eHTbrHdNVdRJLRNt77r/7W4r3C/XHXNVQmv7WgwU34fy4k+D/3ZNlGx5Q1angK2fMSWJ2z5hC2fseULtjxjy2O7lrBdS9iuTdiuTed2ba8hhyY5NNmhKQ4NOzTi0KhDY+drcnBoHDnIjhxkRw6yIwfZkYPsyEF25KBMXGuTQaM5/Lulhfh9rJAcl//6clmmobzldKwpDg07NOLQqENj52s4ODTRoSGHJjk0jhywIwfsyAE7csCOHLAjB+LIgThyII4ciCMH4siBOHIgjhyIIwfiyIE4cqCOHKgjB+rIgTpyoI4cqCMH6siBOnKgjhyoIwfmyIE5cmBf5oBCGr7qKciJJ/1IWgZAisfP+pbQgIwGFDSA0QBBAxQNMDAghgAnRDiB4IQEJ2Q4ocAJDCfM0NGpHF4Xk+YRQeEEQxNigBMinEBwQoITMpxQ4ASGE+A9HeE9HeE9TfCeJnhP00RP2yCimGQkSh5R9ojKSdHfPxW+idgjEo/Ivv1LpuZhrHI+MTQOt10zH1uZWif5H1ZiPVboklZMhtdbUxtZSfVYyd+3MnXVz7VS6rHC9ViRS1qhHIc5jtPIitZjxaqxkkM9VmI9VqgeK6keKxedbUkPDyw2tlLqscL1WJF6rGg9VqwaKwU42/b1J1aXsx7ql3jqNasYHwbb6D1mYi16TkKBExhOEDhB4QRDEybW5+ckRDiB4AR4T8sM/cAfC6I8WhCNOsNVYj6cA/PoHHSGWYP14xx0NLeqws/B0AQLcEKEE+bIktqBMP6WtgQnZDgB3g/GcILACQonGJhAIcAJEU4gOCFBCa/7o1+L7XJxs+reNzfdP69vP+112v1+7I62PT1uN7fd3fO26zdAfex96u8nRWoppT5B/WEsqY1F+8P+XlDgloLuqXvyHw==", + "bytecode": "H4sIAAAAAAAA/+VYwW7TQBBd13ESx0WJ4DOQkJ3YTXqrgILEH3B001Zw5M7BXEDixg0JhITEgS9AQuKAuHBDAon/IVt26peXidsq3qKKlay1vbPzZt7O7KwdmLoFru+YDZoo+e362PVbMB4urj33nG7Wsphw29Q/S/NprPjXov2T2OkM/OhPRb8n/tOe03O/qvWjL4LbX1wJ3I9MHR++/Jf18+n/jQafJXbuVP7W1ra7oN+Y9nNr34/9p/rv+dGfJy7WnpnlWJP1aZGr9BrYbyAWELdjvPhZBIRnwA4cE/wB2dr2ugaEJ/YwP7IOwl2k2DpSxjCXcQxxIgXnKuoSbpDLYE0vOPyOcTgOESdsEQd1yR7Ia90Gjsab5FwX5u25Pt2sZeJDoPhn8W6CPfaSGhmZOg5wrux/Eck/NrXOW+5ew+Z9xlNen3ufkXcD4/Vsc7rPhGQP89O0z8jc/32fGSq6OzQWKvM817aUfeyAj9o+tqX4iFxE9O626+054QXMWRdXWv0aKdyFDdxxvkaeuesp3EUN3PVgTO6RO3n3wLTHnbZ/xIo9LfIzk/2gb1abjMXkl4HekI/Y0G6r/yXoZTnGxFgR/KFiA+egJ55O40h4wjhCTLFti+SZ44jePTQ1TxxHXGvW7e1aDnKe9f3ws8uxgk3GBoCNNnLT4kjsvmgcYawMLoeLcUB44hP7LfgS17Fiq6F5kSLbpTGRfWRqzj65+wTwMG65zjE36+zkMyzbrdmp1WCMDXzG8yLmD58XRf6JqX3+7O4lTsKqxhDfxb5OtezvnnufbtYKa8cXsIM5iqplvxMYCxV5zu1tRT4BGeFsRPLavt5TdCHn+9WyvMzvKvKoj2P2qeut7C+yD88zAxoLFd1NtgeK7dq+0AM/5LvFZ1xMZ3/ryYmtVc0R73uIH5H8c/eMeSN9ZwM7j6dldjwpj8uiPDzM5+V10m+bxGDiAb+cTmbzcT6fHhSTcrJzJj7+2zrPOfOqntFfud7XOdPnvw/EFBz8/yi5afPvNc0R7rAO4FyuAyL/1tQ637j7xOj/kvC/xTvCjxR8XE+uyyL/AfDfr/HJrPGJ9yrtexS5GprVWGLuuw1+2MY8ivxH12M9bdpztW9uke8r8k1nkC6MyVytlgvmv6jlS9+G1fn91fiJFXmsp5xfTWerplqp/SvBWOD4w3iXuZgrrdeAIh1PZuO8GOeTIit3L7sGzYudg3lelOlRZh/HZ+EPhZOqHsf4tK3nnqUusDzuIyj/VWQX1zd3LzkQKXhW7meD3EX39E61/C6uVuXDalVesAfVqo0ylsAY5o5t2+4Z+UJdYkdE8j/cs6xJH+bI/JGC3yf8JbuVd/z9mijyiSJv1+e76HM9+t72v+ETTNKP79g2iR0febVIqem8nGbZbp4d5VlxVl79ATXZqYiZIQAA", + "debug_symbols": "zZrRbuIwEEX/Jc95sMf2eKa/slpVtE0rJAQVpSutqv77JogAS0hRBi7yS9WA75wbM+PYsb+ql+bp8+1xvnxdfVQPv76qxep5tpmvlu3V13ddPa3ni8X87fH448p1f3zetv94ny27y4/NbL2pHnzOrq6a5Uv3r/o2wut80VQPyX3Xg8ZMcdeWAx03/V1XXrDhFRqeHDa8x4YnbPiADR+x4RM2PGPDY6uWsFVL2KoN2KoNU6u205BBEwyaaNAkg4YNmmzQiEGj0zVxpK819xqJ7ueUycS7tpnyafjz3aWR+vAaw6kmGzRi0Oh0TXIGjTdoyKAJBk00aJJBY8iDZMiDZMiDZMgDNuQBG/KADXnAhjxgQx6wIQ/YkAdsyAM+mwfkQj9UkcsXnoTktB83yf8/BnYABQOyQwM8GkBoQEADIhqQ0AC+GuBJUl9owZ/OCXNGAwQNUDBAHBrg0QBCAwIaENGAhAagK1nQlSzoShZ0JSu6kvUGlRzSfrkXJJ4CCA0IaEBEAxIawGhARgNGKvloJhJO3wSoTtd45ywif1E0mCd5RxZRsIjS1W9cJPZtheOFpr7/0SXywAqXYyWXY0XuaUVzv4xV0YEVLcaKd9dbGev1qVZ8OVaoHCvhnlYo+n6M4zCwEsuxksqxwuVYyeVYkXKsaDFW6K6jLcl+wqJDK74cK1SOlVCOlViOlVSOFeBo28Uf2Wz9cd3UrgYsIm8RkUUULKJoESWLiC2i84+6KPs8SP7SYjgp7xvrYL05svd8S4KiCSP7zZMIfNiQ48GGnE836CXm/T0wD+5hZH91GkEO9yCDmh/ZJb3lPSQ4geGEDCfcIpdE94Th04MVTTi/v3tTArweMsEJAU6IcEKCExhOyHCCwAkKJXy3V39m6/nsadHsDp+/fi6fj86ib/6+NyfH0t/Xq+fm5XPddAfUD2fTu7HBi9Ttq+TO+faStPYhbtep22+pbmewLbUl/wM=", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push directly, not through a method call\n self.public_call_requests.push(self.next_counter());\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\nimpl PrivateKernelCircuitPublicInputsComposer {\n pub unconstrained fn sort_ordered_values(&mut self) {\n self.l2_to_l1_msgs = sort_by(self.l2_to_l1_msgs);\n self.public_call_requests = sort_by(self.public_call_requests);\n }\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.sort_ordered_values();\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 0519819f51d..abba641434e 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_2/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -31,8 +31,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/91aP4/TSBQfr+0k3sRxdPcJ7hvEib1Zui2uuvLK67yBlU666sqrjHTVtYeQkCj4BAgJiYJPQElPQwMSEhIFoqFiZ5mHf/vyi+OwnhUw0mrG8968P795b/5lA9OUwNWRuUIRISPXSNz3AdDD878T9z2/WskTpbdP+cfzokiIfz3av0yczMCP/LnI94T/fOjk/Fo38tEX0Ts6/xtDe2Ka+PDlv8yfT/9/bvF57Hx9qXwVuunRjhR8M2AL6o38YFAGSp8BO5Am+g+VrX2vCYHSJ/ZofGQeBLuY2DojNIwlpKGemOj5HmVlhseOLQkZ12duiR8DJy8ifqBtB4of28aNwb5fXG1z9DWM2RY7UQt2IbEnJeOCLbUxmznD9LB5aMv9ffXInA6UnhP3Pb9iYXgNlB/DHvyYKVkB8XHkx8cvew6eHXqSnYvsQ+V73/LHfrDJZY5xPmX+bb2Efszz2DR5iGNHQEf+ZyDzyLW77JGe1rLOe6Tov649ku0RbXvkkNjalmuB2czpkPR1ydtvVVZGZEeKxvbWhMj0sX/KWTsiPqJtB4of28Y0OSZ9v7ma7Z/7nj0OiD0MO332mHjGLiXYTVqwS4EmbcRO+n43/WEXmm7Y6bhLPWM3NZvYpS3YTYEmbcRO+v4w/WH3tXE39YxdRrCbtmCXAU3aiJ30nZr+sGNxl5JxVz3DsXlg5wg5s9g9/0/ox/Wu6zlC+B+CzL9cu0t8fK9r+t+u9r0uIU2vS77vkww7Npf7YveP2Y5dSLALW7DT71W29HnPY3Okz3rbcus29CN2+57R74DMf107I+N1fHg6E8+1PxgfofJZsNSxg/mg/f3P1Sw+9Lzpvrb4CFqwixR2nt5BF21rBJtL9q6k9wwZFxPeRNGE939XW4zfuLaNXfbGh/fOu0ov2y/iFtuE/z7IvKf4d2EjOcbyLwa5t107M3yvQZ2THX7o3BT+B6629LdKZkr8YHcm4Z8SfnYOzMzmeitjhT+sG5rolFiIgNbn3d1i8A7s0BjEdXd/GT4Z4Z8qHltmih+xYut5qmSwuy7Ggo4/pMlYzBX2JoA59UjpZ7E4VDxCR/4nIPNxB5+65hT6JOdFFoM679MdfuicEv6nrmY5xWIGzxr7xsxQ+YOxIGNZTuHvcrZEQPOdU5fufHV3fxk+M8KfKR5jmryZAS1VNJx/nZcTogdjQccf0mQs5gq7W+i3JP3mgTScZ/2OPlXfyJson4dmu8/yjfGPNun4F/7nrsb4ZzEovv/oMajXbhaDgcIEZSHmY8Uv4wem/d1Kr1EvXG2xiYPL9uH5a6psZ3e9NtsDYvuuc4/8NuAzLlbHn+8BF7bWDUZ45zJKf6z4X7lv/RuNYHjylXaerar8bFmdVWV182axrn5S8m3B/z3oW3+1Wh6vF8V6dVouq+XR9esv54vl8aIoF8WyzKsb161/XR6drouymt/K7edil37J9UHd0HGds2XovuWuqflFXqz43wvv+d8H1/5yLqk39Vm+KNjOF2ypL2SQvqi+3JfUm/xhvckvug/rTRuFNgYarsG2TNw34oWyxI5Y8QdOgMzJCMbI+BnRP1L6L9lN+nAP0LJC0if8dn4+ijxXo+99//Z3oVPJxz5tm8SOj7w6T6nVulrl+Y0iv1Xk5a68+gQg6rkVtSgAAA==", - "debug_symbols": "1ZxhTxsxDIb/y33uh8RJHJu/MiFU4ECVqhaVMmlC/Pf1TlxhPUhUM1fOl2m35bWfRe/ZzhTutbvvb18eb1abh+1zd/XrtVtv75b71XZzeHp9W3S3u9V6vXq8+fzHnRt+8WFc//y03AyPz/vlbt9d+Zzdous398Nv2R8iPKzWfXeV3Ntithghvq/FAJ+XXi86H3XDJ93wqBs+64Yn3fCsGh6cbnivGx50w+u+taD71oLuWwu6by2c+9YOGhJo+HxNcAKNF2hAoAkCTRRokkCDAo3AB0HggyDwQRT4IAp8EAU+iAIfRIEP0jf/Hs6ThqIrl4EM+L42Qz4N/zUSR5jCcwynmiTQoECTBRoSaPh8DTqBxgs0INAEgUbgAxT4AAU+QIEPUOADFPggC3yQBT7IAh9kgQ+ywAdZ4IMs8EEW+CALfJAFPiCBD0jgAxL4gAQ+IIEPSOADEviABD4ggQ9I4AMW+IAFPuAvfQAuTK0eXK6cDjxQmhIED5XFkY4DR/K1yInxuJhPRw4O7aLHdtFTu+jYLnpuF53aRedm0b1zDbP7htnbbajema7t+DHH4GyO8U61zIwZWDuDd+oZvHoGUM8Q1DNE9QxJPcN/GHZCOv6HYqB4uTrkc8Ps1DA7t8sOrmF23zA7NMweGmaPDbOnhtkb7qtgur6X5/ugWmfGDEE9Q1TPkNQzoHqGrJ6B1DOwdoZ47rwzir4ZNHjKBIfdn4lAIgoSUayK/r2jMIqSRIQCUTI9YiIeSz/ibGuT6VEH6aP0E87YTbfcyr6bPspW2E0fZSvstkedIjvarjPER3aejWlo+ihbYTd9lK2wN1zf0fRRtsJu+ihbYbfdV8vstvtqmd12Xy2z2+6rRfZsvK8W2Y331SK76Xs35Vksm74CUt53Mn0VobzvZPpyX4U9Nsxu+wpImd12nSnO72T6gl+F3fQNvwp7w/WdTV/xq7CbvuJXYbfdV8vstvtqmd12Xy2z2+6rZXbjfbXIbryvFtjBuR//yC7FaS1h5cRHftoSinMUbwcF7KCES6JwnszCxDOUaAcl/Rzlu10/FwXtoGQ7KHRJFIh+KrUYZihsBsU7OyjeDgrYQQl2UKIdlItWW6DjBRmeo6AdlGwHheygsBkUcHZQFKvt9dvh6fdyt1rervv3rw8+vGzuPn2McP/nqT/5LuHTbnvX37/s+uELhR8fJxy2DAIvAN1wtBkfIS4AeHj049+GBYR0yHrI/Bc=", + "bytecode": "H4sIAAAAAAAA/9VZP4vUQBRPNpv9m90N+jEE2ewm7l4nYmUnWNnl9u4aRRAsLFOJIFj4CSztbWwUBMFCbOwEBT+KO+c893e/vGQDlzm9gTDJvDfv3/zem5ld39s13/Zd7xxNhPyy/dD2HaAH2+em/Z6fryVD0tum/PU8TYeKfy3avxxamb4b+XOR7yj+876Vc7vYyUdfRO9g+4zhPfJ2+HDlv6yfS/+v1vg8tr6+I1+F7rVoxwR888AW1Nt1E4PMJ30e2IE00T8iW9uuCT7pE3s4PrIOErtQsTVWaIglpKGeUNFzGWVJbDCWfkUveniM9TAOUU/Qgp6h4k+bOR97ZfyG5EevBT9ikuUrPvbd+Pi3bg7ArpZkJyKb9+625Y/cxCaRNcb1lPU3a3UNxs0j+17o7fIQ5/aBjvyvQeZ1+96kzvfc+N24zov+i6rzPbJnX50fK7bGCo3r6VjRM1b0XEZZM0V2l2h1dQhltllrxUc5L3YVH9G2DvHju2khjd2yvalzH2BOFa5wjOPaUezRYhdQ7CLHsZsosYtqYjcBmrxj7GTsjtde7ALFHtd7KZ89UKbsHYb/LozjvKb1XPifgcx79n3mlf3n3HJUz+dcPxAfWpw6XjnvsM7w/nXf9ho+sD7X1Wwtt1ycGTUc8r5RhY8cxnFeU3wI/0OQeWTfZ8p8qcuO77YLn/R5Ff7wHhIotno0L1R4B0QT3ge2N/SP9t1gbKL4j+ewR6S3B/IDZS7bJvxPQOZj4se7vBYbwYmGoQ7IFQzV7Recr1V+VJ0nn9rexPETyYwUP7R6zXsK8keKbzOvXDNkrvRBsaOJTrkbdIHW5lnWxOAz2MExCIvm/mrxmSr8E+IxLSZ+jJVWkyKSoe2zaAvjTzujYK5MFJ2YU89Jv4ZFxqvQkf8lyHxB/Nre0DSnApAr+7aGwR7pjPb4wTkl/K9sr+WUhhntXN4UMwH5g1iQuVpOic5/kVNnzo9Fc3+1+MwU/inxmBYTP8ZKOwdyXmr3KcQC4w9pMhdzRcMf3634DoA0tI/PwlP6Rt5Bjc8cN/lG/KNNjH/hf2N7xP//hkGMEWOwDlOmMQZjhb8OZzHQmuAMYz4ifpnfq+DHWoz8b21vYvOT7MPfYqdE03BdZ3vTGo05Ir+VucTFav3nrnNqa7GLEe4zHukPif+9/cY1kb57DjtPVnlyssxP8iw/Oko3+RWSbxr+n9S2/ny1XG8W6WZ1mC3z5Y2L15/NF8v1Is0W6TJL8oOL1r/Jbhxu0iyfHyfmc7FPv+R6r9jRsc6Z1rffcp9mfrwfIv8X4d0+X+275HCo6DN8P2r4/Ir+VIYy1i3Ojg2LMn9QlPlF96go2yi0MdCwBpsW2W+MF8oSO0Li/26/ZU0GMEfmx4r+Aek/Y7cyhnsAywqUMbzXfRN5tkff2/4t/FQnyccxtk2w4yKvtim12uSrJDlIk+M0yfbl1W/fO68iiSIAAA==", + "debug_symbols": "1ZzRbuIwEEX/Jc95sMf22NNfWVUVbdMKCUFF6Uqrqv++BDWUJcVRZmt0/YIw+E4O1vWMgyO/N4/d/dvz3XL9tHltbn69N6vNw2K33Kz3rfePtrnfLler5fPd6ceN6V+sO/R/fVms++brbrHdNTc2RtM23fqxfyt2H+Fpueqam2A+2lFnJv/Zlx2ddr1tG+vLhg9lw3PZ8LFs+FQ2vBQNT6ZseFs2PJUNX3bWUtlZS2VnLZWdtTR31vaapNDIfI0zCo1VaEihcQqNV2iCQsPzNf7C75E4aJI3eZtF4s++keJ5+O+RxNMQXrw710SFJik0Ml8TjEJjFRpSaJxC4xWaoNAofBAUPggKHwSFD1jhA1b4gBU+YIUPWOEDVviAFT5ghQ/4Wx+QcUOqIhMnqqelFIYLOEsTnV04JlmX/DmNINFEA0VjoWgIisZB0XgomgBFw1em8em4QAt2KnIQPnaW8yVajPWip2rRk0VG56/ayqPamn4gD1yeTHNnXgpQNAxFE6FoEhSNINGIgaKxUDR0ZZqfy/Li6kX39aJHZPRsbbVmbiI4iC7MVxl+A1kXRyLSiJxG5CdF//7HeBAFjYgVImug7cJHpzOPhtZCJxhOX1ZPPGLniscdO8Xk2VPF7FIvO2HnmSRHdhmVJbIVs0OvHyfYK87vBL2CnGAPFbNj19U8O3ZdzbNj19U8O3ZdzbI78LqaZQevq1l26D2P/FrMCTR7dtw91Tvu3lXM7itmDxWzY+eZ7PrdQ2+uTrBD765OsFec34OpmB17WzvPjl1X8+zYdTXPjl1X8+zYdTXPDl5Xs+zgdTXHfuHZ4TmP3Cc/9E08cceX7DAkyY9RLA4K4aC4a6JIHMwiSUYoHgcl/D/KpVGfi8I4KBEHJV0ThbwdUi2Plt8sMCjR4KBYHBTCQXE4KB4H5arZltLxAZnxvXRkHJSIg5JwUAQGJRkclILZ9vZj3/q92C4X96vu83SKp7f1w8lhFbs/L93ZuRUv281D9/i27foTLL4Or+iHzIq0RKbnPjSTb22SvmkP37rWSthfdX/lvw==", "file_map": { "50": { "source": "use std::mem::zeroed;\n\npub struct BoundedVec4 {\n storage: [Field; 4],\n len: u32,\n}\n\nimpl BoundedVec4 {\n pub fn new() -> Self {\n BoundedVec4 { storage: [0; 4], len: 0 }\n }\n\n pub fn push(&mut self, elem: Field) {\n self.storage[self.len] = elem;\n self.len += 1;\n }\n}\n\npub struct PrivateKernelCircuitPublicInputs {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\npub struct FixtureBuilder {\n pub public_call_requests: BoundedVec4,\n pub counter: Field,\n}\n\nimpl FixtureBuilder {\n pub fn new() -> Self {\n FixtureBuilder { public_call_requests: zeroed(), counter: 0 }\n }\n\n pub fn append_public_call_requests(&mut self) {\n for _ in 0..4 {\n // Note that here we push directly, not through a method call\n self.public_call_requests.push(self.next_counter());\n }\n }\n\n fn next_counter(&mut self) -> Field {\n let counter = self.counter;\n self.counter += 1;\n counter\n }\n}\n\npub struct PrivateKernelCircuitPublicInputsComposer {\n pub l2_to_l1_msgs: [Field; 4],\n pub public_call_requests: [Field; 4],\n}\n\nimpl PrivateKernelCircuitPublicInputsComposer {\n pub unconstrained fn sort_ordered_values(&mut self) {\n self.l2_to_l1_msgs = sort_by(self.l2_to_l1_msgs);\n self.public_call_requests = sort_by(self.public_call_requests);\n }\n}\n\npub unconstrained fn sort_by(array: [Field; 4]) -> [Field; 4] {\n let result = array;\n get_sorting_index(array);\n result\n}\n\nunconstrained fn get_sorting_index(array: [Field; 4]) {\n let _ = [0; 4];\n let mut a = array;\n for i in 1..4 {\n for j in 0..i {\n a[i] = a[j];\n }\n }\n}\n\nunconstrained fn main() {\n let mut previous_kernel = FixtureBuilder::new();\n previous_kernel.append_public_call_requests();\n\n let mut output_composer = PrivateKernelCircuitPublicInputsComposer {\n l2_to_l1_msgs: [0; 4],\n public_call_requests: previous_kernel.public_call_requests.storage,\n };\n output_composer.sort_ordered_values();\n\n assert_eq(previous_kernel.public_call_requests.storage[1], 1, \"equality\");\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index cbba360d442..0673e93f3c5 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_0.snap index 91bbd147eaf..7f64de9c803 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_0.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 91bbd147eaf..e14312496f8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index cbba360d442..0673e93f3c5 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "td3Rbty2EoDhd/G1LzgznBmyr1IUgZO4gQHDDhznAAdB3r1y6lXaFWlh/0Y3gTfOFxq7v7QWxZW+XX28ff/107u7hz8fv1z99vu3q/vHDzfPd48Py6Nv36+v3j/d3d/ffXr3z7++Ki9/SP/x7798vnl4efjl+ebp+eo3r5bXV7cPH1++9L78D3/e3d8uD8r3P66vtAAjwCgwBkwFxoEJYBKYBgzowEAHBjow0IGBDgx0YKADAx0Y6MBABwY6qKCDCjqooIMKOqiggwo6qKCDCjqo4w68rsZ7Ozf9cuMFGAFGgTFgKjAOTACTwIAOHHQQoIMYdxCymkg9NwqMAVN3TbNz48AEMAnMuIPo5WSyxrnpl5sswAgwCowBU4FxYAKYBAZ0kOMO0utq4vz9pxVgBBgFxoCpwDgwAUwC04ABHXTQQZ900Nb9W6vn++uuwNiu8fP9aK/AODBxuZEyHEgkTkgkfYOCoCSoEdQBkkKQEKQEGUGVIFKEkCKEFCGkCCFFKClCSRFKilBShJIilBShpAglRSgpQkkRRoowUoSRIowUYaQII0UYKcJIEUaKGE9lqGm8ouXL8187ZDxfoFbrijbHiTKeMNhDTlAQlAQ1gjpA42mDPSQEKUGkiCBFjI/PteYabM3coA7Q+Ah9DwlBSpARVAlygoKgJIgUkaSIRopopIhGimikiEaKaKSI8VGxerET8lLP0fhwVV36irRtkBFUCXKCgqDxprFMFp9QlNigRlC/HGkpBAlBSlC9vD0tkxfXZEVVNgi8uFqSoEZQB0gKQUKQEmQEVYLa5ZNNOllF8jaaLCPZQUKQEmQEVYKcoCAoCSJFKCnCSBFGijBShJEijBRhpAgjRRgpwkgRRooYLy2xovqKrMS/Dvivt/u7In7a35WamxHk8BH08BHs8BHq4SP44SPE4SPk4SO0w0foR4/gh2/Tfvg2PV6CZMuJmdMIuv29eTynuIcqQU5QEJQENYI6QOM5xT0kBJEighQRpIggRQQpIkgRQYoIUkSSIpIUkaSIJEUkKSJJEUmKSFJEkiKSFNFIEY0UMZ7ytOX9akVtM68znvLcQ5UgJygISoIaQR2g8UKlPSQEkSImM7K6trfMXWzam8zI7qAkqBHUL0c2mZHdQUKQEmQEVYKcoCBoXMRy8vaEpJcNagR1gCbTuDtICFKCjKBKkAM0nkdYTpefznlJRGxQJcgJCoKSoEZQB2h8MLyHhCAliBThpAgnRTgpwkkRTopwUsT4mLAu0yavaPmybVAlyAkKgpKgRlAHaHxMuIeEICWIFJGkiCRFJCkiSRFJikhSRCNFNFJEI0U0UkQjRTRSRCNFNFJEI0U0UkQnRXRQRC3g6LMWIUgJMoIqQU5QEJQENYLAfEQVUoSQIoQUIaSI8VHN8r5wOh287K/+dTp4e47Gf57Q8WLbEfzwEeLwEfLwEdrhI/SjRxivJPqlI8iFI/xASpARVAlygoKgJKgR1AGyQhApwkgRRoowUoSRIowUYaQII0WMlx0tv5mdFkFa7/qf9g2TNUq/cgQ5fAQ9fAQ7fIR6+Ah++Ahx4Qg/UBLUCOoAeSFICKqXT3pXd4KCoCSoEQTOndTJ5++ir8vFUzbBTj5/t4OUICOoEuQEBUFJUCOoA5TkKU/ylI8nHqOtlwaJlj/PRcbfJoBJYIbPd/RyWiAYXfPc9MvNeM5xxwgwCowBU4FxYAKYBAZ00EAHHXTQQQcddNBBB33SwfoZ6Oi+MQ5MAJPANGD6xcbHs7OyHOS8GrHNr0A+np3dQ5UgJygISoIaQR2gyQWGdpAQRIoQUoSQIoQUIaQIIUUIKUJIEUqKUFKEkiImFxiq6yexxDU2qBLkBAVBSVAjqAM0ucDQDhKAJhdjfnPawSdXY95BSpARVAlygoKgJGj8GUqpp4/rL3vG3KAO0OSyzDtICFKCjCDyOjl5nSYXTd5BHaAgW26QLTfIlhtky51cOvntF3dy7eQdFAQlQWTLDbLlTtY7pZ+uA7LMZ+x9jjGLrvMuqmeHGJO1Ub9ugMk6ql84gBw9gB49gB09QD16AD96gDh6gDx6gKO35Hb0ltyP3pL7pVvyD6QEGUGVICcoCEqCGkH9chSlECQEKUFGUCVo/Do1WVGT84uRxniGaZks9xXF9oYaQtD4iWhmK6plg4KgJKgR1AHSQpAQpASR12k8hbOc18gV9bpBTlAQlAS1fbSpXDtAVggSgiZFRF/RZj1tmBFUCXKCgqAkqBHUAaqFILJbrkqQEVQJcoKCoCSoAeTkPXdyxzCN9ShfY7MLm9wybAcFQeNJCCunYJcp5827xmTex+pP5Ns7WY1/PFvfn5YvNz/e5N5PO0gJMoIqQeMX1zxWFJunfHIDqB2UBDXw4k7uAfU2mtwEagcJQUoQqXxyI6gd5AQFQJP7Lb29j5jccGkHKUEO9kYdtJelEAT2EVmCjNTBSFIIEoKUILt8b5RSCXKCgqAkqBHUAZpcT3kHgT1sqhJkBFWCnCCy5U6up7yDGkFkv2dkv2ekCCNFGCnCSBFGijBSBDnoSnLQleSgKycHXbLeWaCqnK1DzMkx19umXW7Gqwd2jAEzfLbfXAOe7sAEMJevS05vwFy+LjmjACPAKDAGzLiDt9bkZjgwAUwC04C5dF3y9+XB/26e7m7e399+WcjL974+fHi+e3x4ffj8/8+n77x/uru/v/v07vPT44fbj1+fbt/dP354+d5Vef3jd5O8Nmt/vNzdc3m4bLdS7OXRSzie9dozlkGXgf8C", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_0.snap index 91bbd147eaf..7f64de9c803 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_0.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 91bbd147eaf..e14312496f8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6674_3/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "H4sIAAAAAAAA/+1azYojVRS+laTy0+kkle4Z8AkEVybppNMNLmYxmwFBGPQB0ulpEGbnWshG3LhxQHAhIigIgoIgCC7dCa7cCe50IQgufAK72numvnz56qaGVHUYtSBU6p5T5/+ce+pURS47In9uuB0OI/Kt/9Px1zWA169/9/z1aLdj3CG+ZdI/G02nHaFfifKfdDzNqBr6I6Nfkf1HLU/n/iqjj7oY3/b1rwv/D10WH1Xpb/6rUv/jgM5dr+t70bquBnclytED3RzIgnwb1dhgFhE/B3IgzPgfkKxl14SI+Jk8bB/zg9kuFrImAoaxhDDkEws+zyOtimNn1BNycdw2q+F9XjRujf+BsFMVcdskefL8ZrZrCVkTAeP4aAk+LcFH0WqUSOt/ufYvl8USxl6UczY+vMZ8mkJmjtky+KA+deJTL5EP4rDd2iXyaQNOTHziEvnEAX06JfCx+n0AOGXWy4RkRV7Gu1sN76d95SHpX5ZuRr9XjfwT8zP61GIgzdsHsJ7++v46dlmNwXu7AEf8iyij+apfGxAOxrzpPahG7zOTe+iyoy7kGZCsCcCGObZpAK2kgG1eJ52H1eg8OgK6rEOPZEK8jtClRLlOi9QT5H/gNv1URf+VkDxsH97LhkLWRMB431YxOBR8/uu0zM7ol133Poxp823HVRpfs201901YR1vk1VysyYj/BtTcx35N1dwWwTjPEYZ+aRMM60tMsGOA2T4d6g9VT9cnGPqX8w17pyHBsN85Ihj2EMekQ13I0hE0y6zZEdkI9xbm6bz92KbYy8e09rY/p/Z6EmX3IE3nwnOTxOl8ybPdkGxX0XP9U9u1hO2aLt92GHMtYTtbe8eVZzve89OjyCyvVY3tCs/yjP9tzfJaBe3Kzy94r8p13q86gk9H8Hkeaf3bnr2txqCuXJ+PSL57/nq042F+sb0CawzyxPdfiI//0yOmtU/8WdWYZ42FvpBnWy/ymVvnGYOcRZ7/DP/FKKP5OfEO1beK9tXC9c3431Z9U7P6UH1rCllDfRX3E8inKfg8j7QGgjb3HPvu12qgD+sR6te+82dVD2rCdrWA7YYFbVcn2+27X2PbFe3Xvnfl2a4u5OmJ+6Kcs3PF9jvlB1Wzbd6Z2ukHWMf7itZswz+Emv2jXyuSWxXVyBHXSIwP5Y+a28w7rK+8R/3kz1XlVtXxwbO8vPj4GdZ3iY/fgOYv/v9A3N/O4edy+PHMVeVARPdhLNQCshv+r/5cdcyqmavx6oJMFoO1HJv0SO/Qu2H0d0/oh/3d70S3BfZSuRUBHPH/BJp/EP42f7OsylYYtwO3WffznpPy9OC4MPy//DmN2Q8iTbOWQ5N9pObH6n2s4asZKc7iOqQ/9vPDArzV+7EQ75CsRwJfzb/Vs5nda/aqrzKY8TT8BsBKzMvz1L8fRpkcbLN4td0+yQ724V4d60Q/YJ9kj/ZpBezTF/o+a6xjPPP3K2g7nh8j7RbxCc2LttVJuxfr5LZ62qeaoZ6XQ/XU8O9EGc0h0SyrnlqfOCDeqp42t+jB9dTwX/DMVT1VvlHfN3H9RXw1dxqQDHivyinjWXFOzZ41p0L6KvuoHOwQTnqoeRDnWyinQjOKbTll9xbNFYzdBOCI/xLkykP/X8U0zwSrfo59Gk9OP8diz8e+Qt9zj/Iy5NSTHBs6F84pFQNoK75W/UhE/02+pivmP8OfgT5fRZpm5MJ9ruEfCRkOhI4x4Z8HZFBxiXLlzTxfCdQ+1R+obwsM/1jgq/myint+j6neiah3uPUcGeIcGdgOhn8f7PA11L8bXVabOuyjDq/N4Ffret8BWF3gs6/uCvw7gMPvnO8CLC8HkRbanONf5aB6L885+Br46JtoXT6s/8cke15tf5iTQ6hHJPRQPQvStfcR6nuEhOij3hHwV7GHM6z0aACsxNg73XfsmR1U7HFcYq0/Jhqqfy/qT7sXv3VRz7RNguG3gPv6ZqWIX1Re3gWdFb7Riwn/cSAvsZfgb2MwZwcEw5zl72Y6QqaIeBSt/4b/lqj/TLOWQ9NydY85K5+FzaY3+q7WdVKzF8TnnFWxpL5LS9ymX5hW6JtFzssbnFUGMxn3YU/sfdieoVmBc8XsGfo2E+3JdW4gaIX2X6Odt/8avZjw3w3kOc7PORZiQZtzC2WPhOyqRvdBjwf+f5VxMT/757npRtZVZiOcdTjiHxP++54A+sTOjR3kvJovxlcni6vFbHF5OV0ueKafHhaD3Qr4L+YnZ8vJdDm/mJ0sTk5vnf9ydnqxnM4Wo0fj9HKyjb/FYXOVwbHOpEfLX9uzMeMbvZjwP/IE0rj8GGrIDa7gl+J9GcCLcs43NMRaY7W+1llt4tdXm/jG+2C1KaPBugDDGpgeh/4a7YW0TI6Y8L/wBMwnbbjH7k8E/zbxX5NbrGENZlp1sWb4qX8+pbxF3Uvcd8YmW5Po4xrLZrFTRV5Nzs5OzycXo+n8cnl1OT257byeXhe206v5aDa5nD6aXN56XbkuKfPlYj4en0/Hj6bj2Tb+fwMrAGU3pUIAAA==", + "debug_symbols": "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", "file_map": { "6": { "source": "use crate::{cmp::Eq, convert::From, runtime::is_unconstrained, static_assert};\n\n/// A `BoundedVec` is a growable storage similar to a `Vec` except that it\n/// is bounded with a maximum possible length. Unlike `Vec`, `BoundedVec` is not implemented\n/// via slices and thus is not subject to the same restrictions slices are (notably, nested\n/// slices - and thus nested vectors as well - are disallowed).\n///\n/// Since a BoundedVec is backed by a normal array under the hood, growing the BoundedVec by\n/// pushing an additional element is also more efficient - the length only needs to be increased\n/// by one.\n///\n/// For these reasons `BoundedVec` should generally be preferred over `Vec` when there\n/// is a reasonable maximum bound that can be placed on the vector.\n///\n/// Example:\n///\n/// ```noir\n/// let mut vector: BoundedVec = BoundedVec::new();\n/// for i in 0..5 {\n/// vector.push(i);\n/// }\n/// assert(vector.len() == 5);\n/// assert(vector.max_len() == 10);\n/// ```\npub struct BoundedVec {\n storage: [T; MaxLen],\n len: u32,\n}\n\nimpl BoundedVec {\n /// Creates a new, empty vector of length zero.\n ///\n /// Since this container is backed by an array internally, it still needs an initial value\n /// to give each element. To resolve this, each element is zeroed internally. This value\n /// is guaranteed to be inaccessible unless `get_unchecked` is used.\n ///\n /// Example:\n ///\n /// ```noir\n /// let empty_vector: BoundedVec = BoundedVec::new();\n /// assert(empty_vector.len() == 0);\n /// ```\n ///\n /// Note that whenever calling `new` the maximum length of the vector should always be specified\n /// via a type signature:\n ///\n /// ```noir\n /// fn good() -> BoundedVec {\n /// // Ok! MaxLen is specified with a type annotation\n /// let v1: BoundedVec = BoundedVec::new();\n /// let v2 = BoundedVec::new();\n ///\n /// // Ok! MaxLen is known from the type of `good`'s return value\n /// v2\n /// }\n ///\n /// fn bad() {\n /// // Error: Type annotation needed\n /// // The compiler can't infer `MaxLen` from the following code:\n /// let mut v3 = BoundedVec::new();\n /// v3.push(5);\n /// }\n /// ```\n ///\n /// This defaulting of `MaxLen` (and numeric generics in general) to zero may change in future noir versions\n /// but for now make sure to use type annotations when using bounded vectors. Otherwise, you will receive a\n /// constraint failure at runtime when the vec is pushed to.\n pub fn new() -> Self {\n let zeroed = crate::mem::zeroed();\n BoundedVec { storage: [zeroed; MaxLen], len: 0 }\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this\n /// will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// let last = v.get(v.len() - 1);\n /// assert(first != last);\n /// }\n /// ```\n pub fn get(self, index: u32) -> T {\n assert(index < self.len, \"Attempted to read past end of BoundedVec\");\n self.get_unchecked(index)\n }\n\n /// Retrieves an element from the vector at the given index, starting from zero, without\n /// performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element,\n /// it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn sum_of_first_three(v: BoundedVec) -> u32 {\n /// // Always ensure the length is larger than the largest\n /// // index passed to get_unchecked\n /// assert(v.len() > 2);\n /// let first = v.get_unchecked(0);\n /// let second = v.get_unchecked(1);\n /// let third = v.get_unchecked(2);\n /// first + second + third\n /// }\n /// ```\n pub fn get_unchecked(self, index: u32) -> T {\n self.storage[index]\n }\n\n /// Writes an element to the vector at the given index, starting from zero.\n ///\n /// If the given index is equal to or greater than the length of the vector, this will issue a constraint failure.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn foo(v: BoundedVec) {\n /// let first = v.get(0);\n /// assert(first != 42);\n /// v.set(0, 42);\n /// let new_first = v.get(0);\n /// assert(new_first == 42);\n /// }\n /// ```\n pub fn set(&mut self, index: u32, value: T) {\n assert(index < self.len, \"Attempted to write past end of BoundedVec\");\n self.set_unchecked(index, value)\n }\n\n /// Writes an element to the vector at the given index, starting from zero, without performing a bounds check.\n ///\n /// Since this function does not perform a bounds check on length before accessing the element, it is unsafe! Use at your own risk!\n ///\n /// Example:\n ///\n /// ```noir\n /// fn set_unchecked_example() {\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([1, 2]);\n ///\n /// // Here we're safely writing within the valid range of `vec`\n /// // `vec` now has the value [42, 2]\n /// vec.set_unchecked(0, 42);\n ///\n /// // We can then safely read this value back out of `vec`.\n /// // Notice that we use the checked version of `get` which would prevent reading unsafe values.\n /// assert_eq(vec.get(0), 42);\n ///\n /// // We've now written past the end of `vec`.\n /// // As this index is still within the maximum potential length of `v`,\n /// // it won't cause a constraint failure.\n /// vec.set_unchecked(2, 42);\n /// println(vec);\n ///\n /// // This will write past the end of the maximum potential length of `vec`,\n /// // it will then trigger a constraint failure.\n /// vec.set_unchecked(5, 42);\n /// println(vec);\n /// }\n /// ```\n pub fn set_unchecked(&mut self, index: u32, value: T) {\n self.storage[index] = value;\n }\n\n /// Pushes an element to the end of the vector. This increases the length\n /// of the vector by one.\n ///\n /// Panics if the new length of the vector will be greater than the max length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// v.push(1);\n /// v.push(2);\n ///\n /// // Panics with failed assertion \"push out of bounds\"\n /// v.push(3);\n /// ```\n pub fn push(&mut self, elem: T) {\n assert(self.len < MaxLen, \"push out of bounds\");\n\n self.storage[self.len] = elem;\n self.len += 1;\n }\n\n /// Returns the current length of this vector\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// assert(v.len() == 0);\n ///\n /// v.push(100);\n /// assert(v.len() == 1);\n ///\n /// v.push(200);\n /// v.push(300);\n /// v.push(400);\n /// assert(v.len() == 4);\n ///\n /// let _ = v.pop();\n /// let _ = v.pop();\n /// assert(v.len() == 2);\n /// ```\n pub fn len(self) -> u32 {\n self.len\n }\n\n /// Returns the maximum length of this vector. This is always\n /// equal to the `MaxLen` parameter this vector was initialized with.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.max_len() == 5);\n /// v.push(10);\n /// assert(v.max_len() == 5);\n /// ```\n pub fn max_len(_self: BoundedVec) -> u32 {\n MaxLen\n }\n\n /// Returns the internal array within this vector.\n ///\n /// Since arrays in Noir are immutable, mutating the returned storage array will not mutate\n /// the storage held internally by this vector.\n ///\n /// Note that uninitialized elements may be zeroed out!\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n ///\n /// assert(v.storage() == [0, 0, 0, 0, 0]);\n ///\n /// v.push(57);\n /// assert(v.storage() == [57, 0, 0, 0, 0]);\n /// ```\n pub fn storage(self) -> [T; MaxLen] {\n self.storage\n }\n\n /// Pushes each element from the given array to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_array([2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_array(&mut self, array: [T; Len]) {\n let new_len = self.len + array.len();\n assert(new_len <= MaxLen, \"extend_from_array out of bounds\");\n for i in 0..array.len() {\n self.storage[self.len + i] = array[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the given slice to this vector.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut vec: BoundedVec = BoundedVec::new();\n /// vec.extend_from_slice(&[2, 4]);\n ///\n /// assert(vec.len == 2);\n /// assert(vec.get(0) == 2);\n /// assert(vec.get(1) == 4);\n /// ```\n pub fn extend_from_slice(&mut self, slice: [T]) {\n let new_len = self.len + slice.len();\n assert(new_len <= MaxLen, \"extend_from_slice out of bounds\");\n for i in 0..slice.len() {\n self.storage[self.len + i] = slice[i];\n }\n self.len = new_len;\n }\n\n /// Pushes each element from the other vector to this vector. The length of\n /// the other vector is left unchanged.\n ///\n /// Panics if pushing each element would cause the length of this vector\n /// to exceed the maximum length.\n ///\n /// ```noir\n /// let mut v1: BoundedVec = BoundedVec::new();\n /// let mut v2: BoundedVec = BoundedVec::new();\n ///\n /// v2.extend_from_array([1, 2, 3]);\n /// v1.extend_from_bounded_vec(v2);\n ///\n /// assert(v1.storage() == [1, 2, 3, 0, 0]);\n /// assert(v2.storage() == [1, 2, 3, 0, 0, 0, 0]);\n /// ```\n pub fn extend_from_bounded_vec(&mut self, vec: BoundedVec) {\n let append_len = vec.len();\n let new_len = self.len + append_len;\n assert(new_len <= MaxLen, \"extend_from_bounded_vec out of bounds\");\n\n if is_unconstrained() {\n for i in 0..append_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n } else {\n let mut exceeded_len = false;\n for i in 0..Len {\n exceeded_len |= i == append_len;\n if !exceeded_len {\n self.storage[self.len + i] = vec.get_unchecked(i);\n }\n }\n }\n self.len = new_len;\n }\n\n /// Creates a new vector, populating it with values derived from an array input.\n /// The maximum length of the vector is determined based on the type signature.\n ///\n /// Example:\n ///\n /// ```noir\n /// let bounded_vec: BoundedVec = BoundedVec::from_array([1, 2, 3])\n /// ```\n pub fn from_array(array: [T; Len]) -> Self {\n static_assert(Len <= MaxLen, \"from array out of bounds\");\n let mut vec: BoundedVec = BoundedVec::new();\n vec.extend_from_array(array);\n vec\n }\n\n /// Pops the element at the end of the vector. This will decrease the length\n /// of the vector by one.\n ///\n /// Panics if the vector is empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.push(1);\n /// v.push(2);\n ///\n /// let two = v.pop();\n /// let one = v.pop();\n ///\n /// assert(two == 2);\n /// assert(one == 1);\n ///\n /// // error: cannot pop from an empty vector\n /// let _ = v.pop();\n /// ```\n pub fn pop(&mut self) -> T {\n assert(self.len > 0);\n self.len -= 1;\n\n let elem = self.storage[self.len];\n self.storage[self.len] = crate::mem::zeroed();\n elem\n }\n\n /// Returns true if the given predicate returns true for any element\n /// in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let mut v: BoundedVec = BoundedVec::new();\n /// v.extend_from_array([2, 4, 6]);\n ///\n /// let all_even = !v.any(|elem: u32| elem % 2 != 0);\n /// assert(all_even);\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n if is_unconstrained() {\n for i in 0..self.len {\n ret |= predicate(self.storage[i]);\n }\n } else {\n let mut ret = false;\n let mut exceeded_len = false;\n for i in 0..MaxLen {\n exceeded_len |= i == self.len;\n if !exceeded_len {\n ret |= predicate(self.storage[i]);\n }\n }\n }\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.map(|value| value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Creates a new vector of equal size by calling a closure on each element\n /// in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let result = vec.mapi(|i, value| i + value * 2);\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> BoundedVec {\n let mut ret = BoundedVec::new();\n ret.len = self.len();\n\n if is_unconstrained() {\n for i in 0..self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n ret.storage[i] = f(i, self.get_unchecked(i));\n }\n }\n }\n\n ret\n }\n\n /// Calls a closure on each element in this vector.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_each(|value| result.push(value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 4, 6, 8]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Calls a closure on each element in this vector, along with its index.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n /// let mut result = BoundedVec::::new();\n /// vec.for_eachi(|i, value| result.push(i + value * 2));\n ///\n /// let expected = BoundedVec::from_array([2, 5, 8, 11]);\n /// assert_eq(result, expected);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n if is_unconstrained() {\n for i in 0..self.len() {\n f(i, self.get_unchecked(i));\n }\n } else {\n for i in 0..MaxLen {\n if i < self.len() {\n f(i, self.get_unchecked(i));\n }\n }\n }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function will zero out any elements at or past index `len` of `array`.\n /// This incurs an extra runtime cost of O(MaxLen). If you are sure your array is\n /// zeroed after that index, you can use `from_parts_unchecked` to remove the extra loop.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n /// ```\n pub fn from_parts(mut array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n let zeroed = crate::mem::zeroed();\n\n if is_unconstrained() {\n for i in len..MaxLen {\n array[i] = zeroed;\n }\n } else {\n for i in 0..MaxLen {\n if i >= len {\n array[i] = zeroed;\n }\n }\n }\n\n BoundedVec { storage: array, len }\n }\n\n /// Creates a new BoundedVec from the given array and length.\n /// The given length must be less than or equal to the length of the array.\n ///\n /// This function is unsafe because it expects all elements past the `len` index\n /// of `array` to be zeroed, but does not check for this internally. Use `from_parts`\n /// for a safe version of this function which does zero out any indices past the\n /// given length. Invalidating this assumption can notably cause `BoundedVec::eq`\n /// to give incorrect results since it will check even elements past `len`.\n ///\n /// Example:\n ///\n /// ```noir\n /// let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n /// assert_eq(vec.len(), 3);\n ///\n /// // invalid use!\n /// let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n /// let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n ///\n /// // both vecs have length 3 so we'd expect them to be equal, but this\n /// // fails because elements past the length are still checked in eq\n /// assert_eq(vec1, vec2); // fails\n /// ```\n pub fn from_parts_unchecked(array: [T; MaxLen], len: u32) -> Self {\n assert(len <= MaxLen);\n BoundedVec { storage: array, len }\n }\n}\n\nimpl Eq for BoundedVec\nwhere\n T: Eq,\n{\n fn eq(self, other: BoundedVec) -> bool {\n // TODO: https://github.com/noir-lang/noir/issues/4837\n //\n // We make the assumption that the user has used the proper interface for working with `BoundedVec`s\n // rather than directly manipulating the internal fields as this can result in an inconsistent internal state.\n if self.len == other.len {\n self.storage == other.storage\n } else {\n false\n }\n }\n}\n\nimpl From<[T; Len]> for BoundedVec {\n fn from(array: [T; Len]) -> BoundedVec {\n BoundedVec::from_array(array)\n }\n}\n\nmod bounded_vec_tests {\n\n mod get {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test(should_fail_with = \"Attempted to read past end of BoundedVec\")]\n fn panics_when_reading_elements_past_end_of_vec() {\n let vec: BoundedVec = BoundedVec::new();\n\n crate::println(vec.get(0));\n }\n }\n\n mod set {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn set_updates_values_properly() {\n let mut vec = BoundedVec::from_array([0, 0, 0, 0, 0]);\n\n vec.set(0, 42);\n assert_eq(vec.storage, [42, 0, 0, 0, 0]);\n\n vec.set(1, 43);\n assert_eq(vec.storage, [42, 43, 0, 0, 0]);\n\n vec.set(2, 44);\n assert_eq(vec.storage, [42, 43, 44, 0, 0]);\n\n vec.set(1, 10);\n assert_eq(vec.storage, [42, 10, 44, 0, 0]);\n\n vec.set(0, 0);\n assert_eq(vec.storage, [0, 10, 44, 0, 0]);\n }\n\n #[test(should_fail_with = \"Attempted to write past end of BoundedVec\")]\n fn panics_when_writing_elements_past_end_of_vec() {\n let mut vec: BoundedVec = BoundedVec::new();\n vec.set(0, 42);\n\n // Need to use println to avoid DIE removing the write operation.\n crate::println(vec.get(0));\n }\n }\n\n mod map {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-map-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| value * 2);\n // docs:end:bounded-vec-map-example\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.map(|value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.map(|value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod mapi {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn applies_function_correctly() {\n // docs:start:bounded-vec-mapi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| i + value * 2);\n // docs:end:bounded-vec-mapi-example\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = vec.mapi(|i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = vec.mapi(|_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_each {\n use crate::collections::bounded_vec::BoundedVec;\n\n // map in terms of for_each\n fn for_each_map(\n input: BoundedVec,\n f: fn[Env](T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_each(|x| output_ref.push(f(x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-each-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_each(|value| { *acc_ref += value; });\n // docs:end:bounded-vec-for-each-example\n assert_eq(acc, 6);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| value * 2);\n let expected = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_each_map(vec, |value| (value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 4, 6, 8]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_each_map(vec, |value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod for_eachi {\n use crate::collections::bounded_vec::BoundedVec;\n\n // mapi in terms of for_eachi\n fn for_eachi_mapi(\n input: BoundedVec,\n f: fn[Env](u32, T) -> U,\n ) -> BoundedVec {\n let mut output = BoundedVec::::new();\n let output_ref = &mut output;\n input.for_eachi(|i, x| output_ref.push(f(i, x)));\n output\n }\n\n #[test]\n fn smoke_test() {\n let mut acc = 0;\n let acc_ref = &mut acc;\n // docs:start:bounded-vec-for-eachi-example\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3]);\n vec.for_eachi(|i, value| { *acc_ref += i * value; });\n // docs:end:bounded-vec-for-eachi-example\n\n // 0 * 1 + 1 * 2 + 2 * 3\n assert_eq(acc, 8);\n }\n\n #[test]\n fn applies_function_correctly() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| i + value * 2);\n let expected = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn applies_function_that_changes_return_type() {\n let vec: BoundedVec = BoundedVec::from_array([1, 2, 3, 4]);\n let result = for_eachi_mapi(vec, |i, value| (i + value * 2) as Field);\n let expected: BoundedVec = BoundedVec::from_array([2, 5, 8, 11]);\n\n assert_eq(result, expected);\n }\n\n #[test]\n fn does_not_apply_function_past_len() {\n let vec: BoundedVec = BoundedVec::from_array([0, 1]);\n let result = for_eachi_mapi(vec, |_, value| if value == 0 { 5 } else { value });\n let expected = BoundedVec::from_array([5, 1]);\n\n assert_eq(result, expected);\n assert_eq(result.get_unchecked(2), 0);\n }\n }\n\n mod from_array {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty() {\n let empty_array: [Field; 0] = [];\n let bounded_vec = BoundedVec::from_array([]);\n\n assert_eq(bounded_vec.max_len(), 0);\n assert_eq(bounded_vec.len(), 0);\n assert_eq(bounded_vec.storage(), empty_array);\n }\n\n #[test]\n fn equal_len() {\n let array = [1, 2, 3];\n let bounded_vec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 3);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.storage(), array);\n }\n\n #[test]\n fn max_len_greater_then_array_len() {\n let array = [1, 2, 3];\n let bounded_vec: BoundedVec = BoundedVec::from_array(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 3);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n assert_eq(bounded_vec.get(2), 3);\n }\n\n #[test(should_fail_with = \"from array out of bounds\")]\n fn max_len_lower_then_array_len() {\n let _: BoundedVec = BoundedVec::from_array([0; 3]);\n }\n }\n\n mod trait_from {\n use crate::collections::bounded_vec::BoundedVec;\n use crate::convert::From;\n\n #[test]\n fn simple() {\n let array = [1, 2];\n let bounded_vec: BoundedVec = BoundedVec::from(array);\n\n assert_eq(bounded_vec.max_len(), 10);\n assert_eq(bounded_vec.len(), 2);\n assert_eq(bounded_vec.get(0), 1);\n assert_eq(bounded_vec.get(1), 2);\n }\n }\n\n mod trait_eq {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn empty_equality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n\n assert_eq(bounded_vec1, bounded_vec2);\n }\n\n #[test]\n fn inequality() {\n let mut bounded_vec1: BoundedVec = BoundedVec::new();\n let mut bounded_vec2: BoundedVec = BoundedVec::new();\n bounded_vec1.push(1);\n bounded_vec2.push(2);\n\n assert(bounded_vec1 != bounded_vec2);\n }\n }\n\n mod from_parts {\n use crate::collections::bounded_vec::BoundedVec;\n\n #[test]\n fn from_parts() {\n // docs:start:from-parts\n let vec: BoundedVec = BoundedVec::from_parts([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // Any elements past the given length are zeroed out, so these\n // two BoundedVecs will be completely equal\n let vec1: BoundedVec = BoundedVec::from_parts([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts([1, 2, 3, 2], 3);\n assert_eq(vec1, vec2);\n // docs:end:from-parts\n }\n\n #[test]\n fn from_parts_unchecked() {\n // docs:start:from-parts-unchecked\n let vec: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 0], 3);\n assert_eq(vec.len(), 3);\n\n // invalid use!\n let vec1: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 1], 3);\n let vec2: BoundedVec = BoundedVec::from_parts_unchecked([1, 2, 3, 2], 3);\n\n // both vecs have length 3 so we'd expect them to be equal, but this\n // fails because elements past the length are still checked in eq\n assert(vec1 != vec2);\n // docs:end:from-parts-unchecked\n }\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6734/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6734/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 01b5300717e..5e067d9f1f7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6734/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6734/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -19,9 +19,13 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/7VW4U6DMBC+QnFjZNHoE/gCCgKDHyYa9UUqC8/Bo7vGXnr5rMsy2ktIgbt9993XL3SKfCi3aloRDPLh1tKtmcjnp+vdPdfroimhb0z8se66MjBfRP5t6TBVGvya8RPpX28cztfi8eUs3Hd7uipxvyfvj1Tz8/6lnP/hzMzsnc/F5yhe76ZyWj47vD1wIeBFkMsD75j7jpL6slGgFfNR//BJvY+Mr9Pg97w3Bf0Nzt2I3gpyG5GTGmDk8Cxnsl7pBS7WIR/pD+Z2G+DAv02sYc29WENN3jM6oE8G9ah/Ae8ehU6vMF/Ip/Id39/R+e8B8omozwF9JCPkoxxyW5iZ6HKP8UwW403gYh3ykT5ibgXkntya+qy8B56yV0X+e66X+P2H8dffNvLF64Bay/4F1HfueReYQ6/gOQ+mmVszm94cj91kUCcbmdApdCbJOdaeSbImxZmkgQ/yz2A29CPrEHsfzNCO00s3Dd99a9rDVfsga/l/ia39AetjzVsJDAAA", - "debug_symbols": "ldXRCoMgFAbgd/G6C/Wk1V5ljGFlQxALq8GI3n06dhExGP9NeKKPA/3Cv7Hetuvj7sIwzuxy3ZgfO7O4MaRp2wvWRue9e9yPrxnPD1F/vp8nE/I4LyYu7KI0L5gNfTrVKvnBeZvOfL8VTDSokBwWAhYSFgSLEhYKFhoWFSzgzCWcOcGZE5w5wZkTnDnBmdPfzJuz0LCoYFHDokFFyWEhYCFhQbAoYQFnrn7uIC2+gnR9FgoWGhYVJvY0PU10pvX2WzXDGrpD8yyvyZ5KaIpjZ/s12lxHhybKt6esCiVzyeSLkX6flmlH2vMG", + "bytecode": "H4sIAAAAAAAA/81WUU7DMAx1m5Stq6YhOAEXgJa2az+QQALxwS1Cp56jR2cVsWI9QsXURMJSlTbO7OfnJ2cJOUvsqmmFcZAPu+Z2TYVfnZ8X+12usyqHvCHj92XT5J76AuKvcxsziRO/5PiR+C83Ns7b5OLLWjjv9vwU4n1PTh+x6uf+xaz/dqFm1s7r5HwULndVWC4fbLw9YCHAReBTnj3GvqOouqwS4IrxJL/gid1Hjq/jxG+5Nxn9NPZdidwJ+DbCJzlAU/Ata5q10oq4eA7xSH0wtoMHA/82Mocl52IONTnNaA8/KZxH/jPYuxM8PUF9Pp3KPX6/puV5gHgC8nNEHUnz6UiBbws1E/1dY1zTHONZxMVziEfqiLFl4Lu3a+y78gZwylwFuXmup/D5u/5b37OpyfGAXMv8GZxv7PfOU4degXPsTDXWZjStOZ2awSBPs6WCJ9+dJOtYeyfJMzHuJA14EH8KtaEemYfQfTBd3Q+PzdB9trWpjxf14eDh7r/NbSVquGRuv9vVN7dl35Z66ZvbOB8lz/yfbub5C1wxKZ1FDQAA", + "debug_symbols": "ldbbaoQwFAXQf8mzD7mY2/xKKUPUOARClKiFIv57k2FKRQbKfpEccXEiO5Czk8F32+Me0jgt5Paxkzj1bg1TKtV+NKTLIcbwuJ9fE1ofzDy/X2aXarmsLq/kJhVtiE9DWRlZ/BiiL2t6fDaEWVRwCgsGCw4LAYsWFhIWChYaFnDmHM5cwJkLOHMBZy7gzAWcufg3c3sVChYaFgYWFhUthQWDBYeFgEULCzhz+baHUOwlhDJXIWGhYKFRod7+B7P6lzBr2J95EokThRONE4MTCxNNccJAcpTiy+XguuhfI8C4pf40Eazfs78MB3Oeej9s2dcx4TQh1P22upG8Xv51J+VYK156lD4/", "file_map": { + "5": { + "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", + "path": "std/cmp.nr" + }, "50": { "source": "// https://github.com/noir-lang/noir/issues/6734\n\npub fn sub_array_extended(\n src: [Field; SRC_LEN],\n offset: u32,\n) -> [Field; DST_LEN] {\n let available_elements_to_copy = SRC_LEN - offset;\n let elements_to_copy = if DST_LEN > available_elements_to_copy {\n available_elements_to_copy\n } else {\n DST_LEN\n };\n\n let mut dst: [Field; DST_LEN] = std::mem::zeroed();\n for i in 0..elements_to_copy {\n dst[i] = src[i + offset];\n }\n\n dst\n}\n\nunconstrained fn main() {\n assert_eq(sub_array_extended([], 0), []);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6734/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6734/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 01b5300717e..5e067d9f1f7 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_6734/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_6734/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -19,9 +19,13 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/7VW4U6DMBC+QnFjZNHoE/gCCgKDHyYa9UUqC8/Bo7vGXnr5rMsy2ktIgbt9993XL3SKfCi3aloRDPLh1tKtmcjnp+vdPdfroimhb0z8se66MjBfRP5t6TBVGvya8RPpX28cztfi8eUs3Hd7uipxvyfvj1Tz8/6lnP/hzMzsnc/F5yhe76ZyWj47vD1wIeBFkMsD75j7jpL6slGgFfNR//BJvY+Mr9Pg97w3Bf0Nzt2I3gpyG5GTGmDk8Cxnsl7pBS7WIR/pD+Z2G+DAv02sYc29WENN3jM6oE8G9ah/Ae8ehU6vMF/Ip/Id39/R+e8B8omozwF9JCPkoxxyW5iZ6HKP8UwW403gYh3ykT5ibgXkntya+qy8B56yV0X+e66X+P2H8dffNvLF64Bay/4F1HfueReYQ6/gOQ+mmVszm94cj91kUCcbmdApdCbJOdaeSbImxZmkgQ/yz2A29CPrEHsfzNCO00s3Dd99a9rDVfsga/l/ia39AetjzVsJDAAA", - "debug_symbols": "ldXRCoMgFAbgd/G6C/Wk1V5ljGFlQxALq8GI3n06dhExGP9NeKKPA/3Cv7Hetuvj7sIwzuxy3ZgfO7O4MaRp2wvWRue9e9yPrxnPD1F/vp8nE/I4LyYu7KI0L5gNfTrVKvnBeZvOfL8VTDSokBwWAhYSFgSLEhYKFhoWFSzgzCWcOcGZE5w5wZkTnDnBmdPfzJuz0LCoYFHDokFFyWEhYCFhQbAoYQFnrn7uIC2+gnR9FgoWGhYVJvY0PU10pvX2WzXDGrpD8yyvyZ5KaIpjZ/s12lxHhybKt6esCiVzyeSLkX6flmlH2vMG", + "bytecode": "H4sIAAAAAAAA/81WUU7DMAx1m5Stq6YhOAEXgJa2az+QQALxwS1Cp56jR2cVsWI9QsXURMJSlTbO7OfnJ2cJOUvsqmmFcZAPu+Z2TYVfnZ8X+12usyqHvCHj92XT5J76AuKvcxsziRO/5PiR+C83Ns7b5OLLWjjv9vwU4n1PTh+x6uf+xaz/dqFm1s7r5HwULndVWC4fbLw9YCHAReBTnj3GvqOouqwS4IrxJL/gid1Hjq/jxG+5Nxn9NPZdidwJ+DbCJzlAU/Ata5q10oq4eA7xSH0wtoMHA/82Mocl52IONTnNaA8/KZxH/jPYuxM8PUF9Pp3KPX6/puV5gHgC8nNEHUnz6UiBbws1E/1dY1zTHONZxMVziEfqiLFl4Lu3a+y78gZwylwFuXmup/D5u/5b37OpyfGAXMv8GZxv7PfOU4degXPsTDXWZjStOZ2awSBPs6WCJ9+dJOtYeyfJMzHuJA14EH8KtaEemYfQfTBd3Q+PzdB9trWpjxf14eDh7r/NbSVquGRuv9vVN7dl35Z66ZvbOB8lz/yfbub5C1wxKZ1FDQAA", + "debug_symbols": "ldbbaoQwFAXQf8mzD7mY2/xKKUPUOARClKiFIv57k2FKRQbKfpEccXEiO5Czk8F32+Me0jgt5Paxkzj1bg1TKtV+NKTLIcbwuJ9fE1ofzDy/X2aXarmsLq/kJhVtiE9DWRlZ/BiiL2t6fDaEWVRwCgsGCw4LAYsWFhIWChYaFnDmHM5cwJkLOHMBZy7gzAWcufg3c3sVChYaFgYWFhUthQWDBYeFgEULCzhz+baHUOwlhDJXIWGhYKFRod7+B7P6lzBr2J95EokThRONE4MTCxNNccJAcpTiy+XguuhfI8C4pf40Eazfs78MB3Oeej9s2dcx4TQh1P22upG8Xv51J+VYK156lD4/", "file_map": { + "5": { + "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", + "path": "std/cmp.nr" + }, "50": { "source": "// https://github.com/noir-lang/noir/issues/6734\n\npub fn sub_array_extended(\n src: [Field; SRC_LEN],\n offset: u32,\n) -> [Field; DST_LEN] {\n let available_elements_to_copy = SRC_LEN - offset;\n let elements_to_copy = if DST_LEN > available_elements_to_copy {\n available_elements_to_copy\n } else {\n DST_LEN\n };\n\n let mut dst: [Field; DST_LEN] = std::mem::zeroed();\n for i in 0..elements_to_copy {\n dst[i] = src[i + offset];\n }\n\n dst\n}\n\nunconstrained fn main() {\n assert_eq(sub_array_extended([], 0), []);\n}\n", "path": "" diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index ab703faa50b..01d91245b6a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -26,6 +26,10 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -36,8 +40,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/8VXy07DMBB0iN00LaUVfATXpA+oBIeC6AFx5oZAoaXf4U+nVr1ksrXTAjZYivxaz8yu106SiF1J7GOKtPWJ2C9ks7B18btSBsQqYupMIulsBDkR/kJzb7bO2XoznwZ0OGe8IfHnxfQqd/gXUP8kB8wI+GPCl3Hwi8ziPOgmvmC8NLbUdSyXbM1ANA844tIc5iGt726fM1G3h7adM7wYuYGaQsf2wqGfuPrW11vmawrxCaWD51BA7JKwO3Fi+JX/3Tj4E9qfDGKTOnwifspjBfaJpyYsPkdcPYYV+m5t8w31U06OmD2PgQ8r+yZW7piLsaedFr+Rf9CideTRGiomksUk0j0/5jFRoPXkSD0inJ5SMT2Xtjbn7N62BxRTXWtQYLcEO36/Sd304z9yDWOH/MfcN205Q3sR8/2IvqkDvhH/UOznk/obrdNj94FrxfsA16KtaPGLzymPn74YiHAxKBLGJz3aE6aV7G+YzljfnOfMf+Tqi/qfQ+rw/NfzXZxMoXtFieZ3l2D8itnf2X7P48fihzo311W5mVSbalat19NVxeNkCn4/huZfza7eV9NZVXyUpjs+xE/f6UrX83hXm9KxfaMrddjjuUH7R+pvnyfbpveB1Pt8xu7VjlH+dEFL6HepKRnqYHqQf+iwp3ZkrZM2rZlDqyvGiadGLBzLdHMs1/v2GKeMcffQns31YU4ynlPbx1xDLNKhmP2L7dM+dWENrR85+HHPOJeLH+9gjpU6xsje5PYz4dla6hor5D8DniNzxj8BxchzSrkTAAA=", - "debug_symbols": "lZbdioMwEEbfJddeJDMmRl9lWYo/sQRExZ+FRXz3TRZpixXKdyOOnIPIEZ1NNK5a7zfft8Msiq9NdENdLn7ow7Ttiagm33X+fnu9LGQ8KPPPz2PZx3FeymkRhZGJcH0TTlSwW985UWi5fydCZSBvQT7HeJIgr0CeQJ5BPgV5DfJgXwL7EtiXwL4M9mWwL4N9GezLYF8G+zLYl8G+DPbl67724LP8xKcS5BXIE8gzyKcgr0H+si9JdQgk7dnIYMPCxmVlUg9DnQ0tYUPBBn14jneDPxjEZyOFDQ0bBjYy2LCYsYfpp5x8WXXuWCrata9fdozld3SndWOchto16+Ti4vHcOWImkyd5Gv/38b0InxOj4xCTG5MYG+4X7vkH", + "bytecode": "H4sIAAAAAAAA/8VXy27bMBCkbNKy7Lo22o/oVbLkx7FAk0ML9FD03IMi1wX6Ffr0hgi3Go0oJUHIhIBAkVzOzC5XJJWoh5K4xxbt6pkaFrH57Or8ZaUIiJXH1JlE0tkLcqLGi4z9dXVG8+34PKDDGfGGxD/n1THz+BdQf5kBZgT8veDrOPh56nBu2j6+Il7pu227WN7SnI3qf+CIK2OYhzJ/ef+8V9371r1nhBcjN1BT6Nh+9OgXrrXz9YZ8nUN8QungHAqIXQj2Ik4M/+f/Mg5+KeuTQmzmHp+EX/LYgH0yUgsWjwnXirBC761TvqF+yckd2XMMxrDSZ2JlnrEYa7qY8Bv5NxNadyNaQ8VEU0wi7fN7jokBrbMn6lHh9BSG9Hxytf3Ovrn3jcS07TQYsPsOdry/6bbvx1vkGsYO+Z+y30zljKzFVg3PF16/WGeb8Mp6aOXPJ9E2U8PvD/cgQ32Vq+06/yG8RA1jh30cO+3RE/Nu8Zy84LXE+CxeR2s1lZNTWjFfcS6vx5hfijjMiJ9jMVAqfD4Ln/boQ35D9l9IZ6QzPf9A/iPXWnX/a7oNz386P8TJFtmTjerfWRXxG7L/6torjx/6BTqvp7q4lvW1PtSXS9XUHCdb8O4dmr85HO+a6lDnvwvb3D/GL/84pu3G8ZyzZeHasreyveAZsv8h7fvnp3uXs1S3Qz5rd3V9kj9L0BL6HmJLijpID/JvPfbyHllrOaU19Wj1xTgZqREL+9K235e1Q3uMU0rcK7SnsTWMaeJ559qYa4glOgzZX1xb1mkJc2T+zsOPa8ZcPn68UzDW3NMn9ja3fwmeq3XbYYX838LvKMYeU5/Kc7OvmtPdoazL46N73D8aXvLgdRUAAA==", + "debug_symbols": "lZbLioQwEEX/JWsXSZVJ1F8ZhsZHbAKi4mNgEP99kkG6G1to7kYsPQfR46I20bhqvd983w6zKL420Q11ufihD9O2J6KafNf5++31spDxoMw/P49lH8d5KadFFEYmwvVNOFHBbn3nRKHl/p0IZUE+A/kc40mCvAJ5AnkG+RTkNciDfQnsS2BfAvsy2JfBvgz2ZbAvg30Z7MtgXwb7MtiXr/tmB2/zE59KkFcgTyDPIJ+CvAZ5A/IW5DOQB/tqsK8G+2qwrwb76su+JNUhkMzOhoYNAxuXlUk9DPVmZLCRo4aRH97j3VAfDOKzQbDBsJHChoYNgxl7mH7KyZdV546lrl37+mXHW35Hd1r3xmmoXbNOLi5+z50vfkJrEyUpLlwxWvj/Lcch9lCSwz0dHhke+wc=", "file_map": { "50": { "source": "fn main(value: Field, index: u32) {\n let mut args = &[0, 1];\n args[index] = value;\n // Safety: n/a\n unsafe { store(args) };\n // Dummy test to remove the 'underconstraint bug'\n assert(args[0] + args[1] != 0);\n}\n\npub unconstrained fn store(_: [Field]) {}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_0.snap index ab703faa50b..01d91245b6a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_0.snap @@ -26,6 +26,10 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -36,8 +40,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/8VXy07DMBB0iN00LaUVfATXpA+oBIeC6AFx5oZAoaXf4U+nVr1ksrXTAjZYivxaz8yu106SiF1J7GOKtPWJ2C9ks7B18btSBsQqYupMIulsBDkR/kJzb7bO2XoznwZ0OGe8IfHnxfQqd/gXUP8kB8wI+GPCl3Hwi8ziPOgmvmC8NLbUdSyXbM1ANA844tIc5iGt726fM1G3h7adM7wYuYGaQsf2wqGfuPrW11vmawrxCaWD51BA7JKwO3Fi+JX/3Tj4E9qfDGKTOnwifspjBfaJpyYsPkdcPYYV+m5t8w31U06OmD2PgQ8r+yZW7piLsaedFr+Rf9CideTRGiomksUk0j0/5jFRoPXkSD0inJ5SMT2Xtjbn7N62BxRTXWtQYLcEO36/Sd304z9yDWOH/MfcN205Q3sR8/2IvqkDvhH/UOznk/obrdNj94FrxfsA16KtaPGLzymPn74YiHAxKBLGJz3aE6aV7G+YzljfnOfMf+Tqi/qfQ+rw/NfzXZxMoXtFieZ3l2D8itnf2X7P48fihzo311W5mVSbalat19NVxeNkCn4/huZfza7eV9NZVXyUpjs+xE/f6UrX83hXm9KxfaMrddjjuUH7R+pvnyfbpveB1Pt8xu7VjlH+dEFL6HepKRnqYHqQf+iwp3ZkrZM2rZlDqyvGiadGLBzLdHMs1/v2GKeMcffQns31YU4ynlPbx1xDLNKhmP2L7dM+dWENrR85+HHPOJeLH+9gjpU6xsje5PYz4dla6hor5D8DniNzxj8BxchzSrkTAAA=", - "debug_symbols": "lZbdioMwEEbfJddeJDMmRl9lWYo/sQRExZ+FRXz3TRZpixXKdyOOnIPIEZ1NNK5a7zfft8Msiq9NdENdLn7ow7Ttiagm33X+fnu9LGQ8KPPPz2PZx3FeymkRhZGJcH0TTlSwW985UWi5fydCZSBvQT7HeJIgr0CeQJ5BPgV5DfJgXwL7EtiXwL4M9mWwL4N9GezLYF8G+zLYl8G+DPbl67724LP8xKcS5BXIE8gzyKcgr0H+si9JdQgk7dnIYMPCxmVlUg9DnQ0tYUPBBn14jneDPxjEZyOFDQ0bBjYy2LCYsYfpp5x8WXXuWCrata9fdozld3SndWOchto16+Ti4vHcOWImkyd5Gv/38b0InxOj4xCTG5MYG+4X7vkH", + "bytecode": "H4sIAAAAAAAA/8VXy27bMBCkbNKy7Lo22o/oVbLkx7FAk0ML9FD03IMi1wX6Ffr0hgi3Go0oJUHIhIBAkVzOzC5XJJWoh5K4xxbt6pkaFrH57Or8ZaUIiJXH1JlE0tkLcqLGi4z9dXVG8+34PKDDGfGGxD/n1THz+BdQf5kBZgT8veDrOPh56nBu2j6+Il7pu227WN7SnI3qf+CIK2OYhzJ/ef+8V9371r1nhBcjN1BT6Nh+9OgXrrXz9YZ8nUN8QungHAqIXQj2Ik4M/+f/Mg5+KeuTQmzmHp+EX/LYgH0yUgsWjwnXirBC761TvqF+yckd2XMMxrDSZ2JlnrEYa7qY8Bv5NxNadyNaQ8VEU0wi7fN7jokBrbMn6lHh9BSG9Hxytf3Ovrn3jcS07TQYsPsOdry/6bbvx1vkGsYO+Z+y30zljKzFVg3PF16/WGeb8Mp6aOXPJ9E2U8PvD/cgQ32Vq+06/yG8RA1jh30cO+3RE/Nu8Zy84LXE+CxeR2s1lZNTWjFfcS6vx5hfijjMiJ9jMVAqfD4Ln/boQ35D9l9IZ6QzPf9A/iPXWnX/a7oNz386P8TJFtmTjerfWRXxG7L/6torjx/6BTqvp7q4lvW1PtSXS9XUHCdb8O4dmr85HO+a6lDnvwvb3D/GL/84pu3G8ZyzZeHasreyveAZsv8h7fvnp3uXs1S3Qz5rd3V9kj9L0BL6HmJLijpID/JvPfbyHllrOaU19Wj1xTgZqREL+9K235e1Q3uMU0rcK7SnsTWMaeJ559qYa4glOgzZX1xb1mkJc2T+zsOPa8ZcPn68UzDW3NMn9ja3fwmeq3XbYYX838LvKMYeU5/Kc7OvmtPdoazL46N73D8aXvLgdRUAAA==", + "debug_symbols": "lZbLioQwEEX/JWsXSZVJ1F8ZhsZHbAKi4mNgEP99kkG6G1to7kYsPQfR46I20bhqvd983w6zKL420Q11ufihD9O2J6KafNf5++31spDxoMw/P49lH8d5KadFFEYmwvVNOFHBbn3nRKHl/p0IZUE+A/kc40mCvAJ5AnkG+RTkNciDfQnsS2BfAvsy2JfBvgz2ZbAvg30Z7MtgXwb7MtiXr/tmB2/zE59KkFcgTyDPIJ+CvAZ5A/IW5DOQB/tqsK8G+2qwrwb76su+JNUhkMzOhoYNAxuXlUk9DPVmZLCRo4aRH97j3VAfDOKzQbDBsJHChoYNgxl7mH7KyZdV546lrl37+mXHW35Hd1r3xmmoXbNOLi5+z50vfkJrEyUpLlwxWvj/Lcch9lCSwz0dHhke+wc=", "file_map": { "50": { "source": "fn main(value: Field, index: u32) {\n let mut args = &[0, 1];\n args[index] = value;\n // Safety: n/a\n unsafe { store(args) };\n // Dummy test to remove the 'underconstraint bug'\n assert(args[0] + args[1] != 0);\n}\n\npub unconstrained fn store(_: [Field]) {}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index ab703faa50b..01d91245b6a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7062/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -26,6 +26,10 @@ expression: artifact ], "return_type": null, "error_types": { + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -36,8 +40,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/8VXy07DMBB0iN00LaUVfATXpA+oBIeC6AFx5oZAoaXf4U+nVr1ksrXTAjZYivxaz8yu106SiF1J7GOKtPWJ2C9ks7B18btSBsQqYupMIulsBDkR/kJzb7bO2XoznwZ0OGe8IfHnxfQqd/gXUP8kB8wI+GPCl3Hwi8ziPOgmvmC8NLbUdSyXbM1ANA844tIc5iGt726fM1G3h7adM7wYuYGaQsf2wqGfuPrW11vmawrxCaWD51BA7JKwO3Fi+JX/3Tj4E9qfDGKTOnwifspjBfaJpyYsPkdcPYYV+m5t8w31U06OmD2PgQ8r+yZW7piLsaedFr+Rf9CideTRGiomksUk0j0/5jFRoPXkSD0inJ5SMT2Xtjbn7N62BxRTXWtQYLcEO36/Sd304z9yDWOH/MfcN205Q3sR8/2IvqkDvhH/UOznk/obrdNj94FrxfsA16KtaPGLzymPn74YiHAxKBLGJz3aE6aV7G+YzljfnOfMf+Tqi/qfQ+rw/NfzXZxMoXtFieZ3l2D8itnf2X7P48fihzo311W5mVSbalat19NVxeNkCn4/huZfza7eV9NZVXyUpjs+xE/f6UrX83hXm9KxfaMrddjjuUH7R+pvnyfbpveB1Pt8xu7VjlH+dEFL6HepKRnqYHqQf+iwp3ZkrZM2rZlDqyvGiadGLBzLdHMs1/v2GKeMcffQns31YU4ynlPbx1xDLNKhmP2L7dM+dWENrR85+HHPOJeLH+9gjpU6xsje5PYz4dla6hor5D8DniNzxj8BxchzSrkTAAA=", - "debug_symbols": "lZbdioMwEEbfJddeJDMmRl9lWYo/sQRExZ+FRXz3TRZpixXKdyOOnIPIEZ1NNK5a7zfft8Msiq9NdENdLn7ow7Ttiagm33X+fnu9LGQ8KPPPz2PZx3FeymkRhZGJcH0TTlSwW985UWi5fydCZSBvQT7HeJIgr0CeQJ5BPgV5DfJgXwL7EtiXwL4M9mWwL4N9GezLYF8G+zLYl8G+DPbl67724LP8xKcS5BXIE8gzyKcgr0H+si9JdQgk7dnIYMPCxmVlUg9DnQ0tYUPBBn14jneDPxjEZyOFDQ0bBjYy2LCYsYfpp5x8WXXuWCrata9fdozld3SndWOchto16+Ti4vHcOWImkyd5Gv/38b0InxOj4xCTG5MYG+4X7vkH", + "bytecode": "H4sIAAAAAAAA/8VXy27bMBCkbNKy7Lo22o/oVbLkx7FAk0ML9FD03IMi1wX6Ffr0hgi3Go0oJUHIhIBAkVzOzC5XJJWoh5K4xxbt6pkaFrH57Or8ZaUIiJXH1JlE0tkLcqLGi4z9dXVG8+34PKDDGfGGxD/n1THz+BdQf5kBZgT8veDrOPh56nBu2j6+Il7pu227WN7SnI3qf+CIK2OYhzJ/ef+8V9371r1nhBcjN1BT6Nh+9OgXrrXz9YZ8nUN8QungHAqIXQj2Ik4M/+f/Mg5+KeuTQmzmHp+EX/LYgH0yUgsWjwnXirBC761TvqF+yckd2XMMxrDSZ2JlnrEYa7qY8Bv5NxNadyNaQ8VEU0wi7fN7jokBrbMn6lHh9BSG9Hxytf3Ovrn3jcS07TQYsPsOdry/6bbvx1vkGsYO+Z+y30zljKzFVg3PF16/WGeb8Mp6aOXPJ9E2U8PvD/cgQ32Vq+06/yG8RA1jh30cO+3RE/Nu8Zy84LXE+CxeR2s1lZNTWjFfcS6vx5hfijjMiJ9jMVAqfD4Ln/boQ35D9l9IZ6QzPf9A/iPXWnX/a7oNz386P8TJFtmTjerfWRXxG7L/6torjx/6BTqvp7q4lvW1PtSXS9XUHCdb8O4dmr85HO+a6lDnvwvb3D/GL/84pu3G8ZyzZeHasreyveAZsv8h7fvnp3uXs1S3Qz5rd3V9kj9L0BL6HmJLijpID/JvPfbyHllrOaU19Wj1xTgZqREL+9K235e1Q3uMU0rcK7SnsTWMaeJ559qYa4glOgzZX1xb1mkJc2T+zsOPa8ZcPn68UzDW3NMn9ja3fwmeq3XbYYX838LvKMYeU5/Kc7OvmtPdoazL46N73D8aXvLgdRUAAA==", + "debug_symbols": "lZbLioQwEEX/JWsXSZVJ1F8ZhsZHbAKi4mNgEP99kkG6G1to7kYsPQfR46I20bhqvd983w6zKL420Q11ufihD9O2J6KafNf5++31spDxoMw/P49lH8d5KadFFEYmwvVNOFHBbn3nRKHl/p0IZUE+A/kc40mCvAJ5AnkG+RTkNciDfQnsS2BfAvsy2JfBvgz2ZbAvg30Z7MtgXwb7MtiXr/tmB2/zE59KkFcgTyDPIJ+CvAZ5A/IW5DOQB/tqsK8G+2qwrwb76su+JNUhkMzOhoYNAxuXlUk9DPVmZLCRo4aRH97j3VAfDOKzQbDBsJHChoYNgxl7mH7KyZdV546lrl37+mXHW35Hd1r3xmmoXbNOLi5+z50vfkJrEyUpLlwxWvj/Lcch9lCSwz0dHhke+wc=", "file_map": { "50": { "source": "fn main(value: Field, index: u32) {\n let mut args = &[0, 1];\n args[index] = value;\n // Safety: n/a\n unsafe { store(args) };\n // Dummy test to remove the 'underconstraint bug'\n assert(args[0] + args[1] != 0);\n}\n\npub unconstrained fn store(_: [Field]) {}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index d996310afa0..05092ec022a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -22,10 +22,6 @@ expression: artifact "visibility": "public" }, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "12161114527103510886": { "error_kind": "string", "string": "completeness violation" @@ -36,8 +32,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/71YTY/TMBB12mSbZIEtcOXOCcnpN7ceAIkL4h+g0G7/AQckDpE4IC7ckODfUhcPeX2ZdHepvZYix+Pxm5nn8UeSmL8l8Y8rKci4iGzta3teqQJi2UTx82QQ2oDfvi58PYD+YcDAC8WXUPgrO1sUphtzQP+nhceMyY9gRsC3I4/zqmnxORZXHprjxYFjct8v749gjCuvAVvGx+RtP+/zyLxVT00/V5eehw8UaxrHl7nMTWa6RfouTHcOtD1hSG3028V0DbisxzaRe7F/ZXQuXCkojtC5npAvqcdnm+LbwHS5u4A4M5I9A54+wxjENGATZZJHY9PlLiV+UsJeB+KHc0VsoO0RyMPNzaTScnJIMrRfmu7chFzfCdkTf5ifAfGTx+HnX+7mij+5wo/MZaH0CVbp2xlgoX4OMaI+vst4lL3w9VjB5NwtlHhQJvw6zp9TbLh+kp5acFnG6w39kvktTNQcs5HXlI2bk7aSeRgo3Ll6DnLcYzHfcOwI+lH/PWCu/DvbFgytNuZ0DvBdwYTjyI5N/z0h8nm30PZzQ/yNFL+kD/PmrncGiclhfAFc1mN/cB1yPkjfG1+7uN76dz4bXVn72p5XKm0OU8UH7W7D+YkY2n5olHZm+nMoI913vna8N/6d7+58VxW/tTvQqX0a553jKhV9PAdEX2zjHluC34fxTdsnPgpW2hzHtPZye1aZVI6/r+AHc5A1t49X4+dS0S8Vfsakz1whJ4iF9nLCwrktKEYcJ7i4l8fkfblqf17InMtZwSWFftTf+jZyaSDu9X/6uVvW1W5a7+p5vd3ONvUTwjfAXd/3X5R/BFV7j+AfVkHwbftdgPOQUGxxzrDbfxeI/ZJ8DX3nObXmtP0w7h1yYh+bdl0jH9o6Zj8kX65M//kQ+f+W5XMQv8l5zxReOdfxzOe7widfa9/knFMsO/VNLno3na2h96F6OV1tJrPN8uN8Wk8Xd9qH2L8L05839x7XajPb7UO6nm1X1y8Xi5viupIYmrYf7wmujHxbcor1BS8j/W+iu3++m5aPg27Ttef0fp3QS3rqA4YiS5tjWdF09YdNV19sl03XR+m7hD68w7jywLeRL8QSPzLS/+nbMic5jJHxY8V+TvaP/FZkuB8w1lCR4b+DH4Lna4w99PlwsEn4KGPfJHdcXv8Ba1ShFIkaAAA=", - "debug_symbols": "tdjfaoMwFAbwd/Hai5yTc/KnrzLGsK0dgthi28Eoffep1Na5wPgEb4pp8+NovkRrbtm+3F4/P6rmcDxnm7dbVh93xaU6Nl3rds+zbVvVdfX5Mf06M/0H6dD/fCqavnm+FO0l27C4PCubfXfkqPOHqi6zjZr7e56Rg4WHRYBFRAUbWBAsGBYWFgILOHOGM2c4c4YzZzhzm8zcGnoIa3guCBYMCwsLgYXCwsHCwyLAIqJC4MwFzlzgzAXOXODMBc5c4MwFzlzTV85xFHa+ajV5VkLhIYTiXHhYBFhEVLjkTBT3FH4+Vo5gwbCwsBBYKCwcLDwqfDIP5fH5oezngmBhYZEcXZXxOlTn88onR1e9jCLYuXCw8KgIBl3nIX3f1fHKrf9Tg2FhYZG+7z7/ZVjVuVBYOFh4WARYRFREAwuCBaOCTJK4+HxKuUivZUjhnv/pHFjGqR7Y8bTzUMGuXkFWr6CrV3CrV/CrVwirV4hrVyCzegUCKwyIlyC7BMkSpEuQW4L8EhQWoPRWQLRhDDeK+WcmWBtej/Q46ewTnTmG15vB5NUg2bmbp14fvbvjGH6d/b1rfRVtVWzr8rHNdbg2u8mu1+X7VM42wE7tcVfur23Zb4W9dsH69UCWclIeVmDXjJqTMcPA9j9yyMmarmhX+Ac=", + "bytecode": "H4sIAAAAAAAA/7VYTY/TMBB12qRpUmAL/ABOHJGc7ceWCyoSIP4BFzhE263EAYkD4sIlQoLfzbp4lNeXSbq7tUeqnHjGzzPPY0/cxPyXxP+cpNDHIn1b39rzpAqIZRPFz8EgtAF/fVv4dgT6ccDAC8WXUPgbu1wXphtzQP8XhceMyY9gRsC3ucd517T4HIuTx+Z4c+CYqdfL8xMY4+Q9YMv4mLzdrvsqMm/Vc9PP1czz8IliTeP4spK1yUxXRDcx3TXQzoQxvaPfLqYvgMt2PCdyPxngIgnHhdW44JxDLsKtw2Wl8TqmPpy/JF9D52hC84k/zM+I+Mnj8GMTwkd/coUfWcupohMsOd8zwEL7HGJEe3yW8dj30rdzBZNzd2q68WCf8Ot8f0GxpWCX9LSCy30j8hH9kvUtTNQcs5H3lI2bk7aSdRgp3LmYXkE/6jDfcOwE9Gj/ETCtf+a5BUNrjRnOAa53JhxHdm76a13k/Fpz/UIRXa74pZ0d9617EpPD+Aq4bMf+4D4U3zLSvfGti+utf+ba6GTrW3ueVNoapooPF0oMnJ+IoZ2HRnnPTH8OZWT7wbeO92/+mb8/+XtL/M6U+LhWGNPuXVx3jqtU7LF+iL3MjblWgt+H8U2rw7PZSdocx7T1/fYsuaycP9/Bj07Na+4er8bPTLEvFX7mZK/ty0zBwvlywsK1LSjGU2d5TN6vNu0FXNZcagVLCnq0/+zfkUsDcW8f6Of+qq72i3pfr+rdbnldPyN8A9z13WGi3HOr9juC/3QJgm/bewGuQ0Kxxalhd78XyPwl+Rq4plZDe047D2N/4z017b5GPrR9zH5IvpyqD5jLrJ8MzH0KN/QerTfXy/1qUd8sd5ub1+v1qT16ITE0rR5rjZPcv6cYc9PFy8j+h9je/n6alo+DbdOdz9n9GbBLetoDhtKXNsd9RdO1Hzdde5m7bLo+im4GOqyDTh75d+QLscSPjOx/+3dZkymMkfFzZf4pzX/kt9KH+4Kxxkof3j9/CZ5vMfbQZ8xhTsLHPvZNcsfl9T8HrCcEkRcAAA==", + "debug_symbols": "tdfNauswEAXgd/HaC41GI2nyKpdLcRKnGIwTnKRQQt69cokTVxWUs/AmWGE+jq2Rf3Sr9u32+v7WDYfjudr8u1X9cddcuuOQRrd7XW3Hru+797fl35WZfki+68+nZpiG50szXqqNdb6u2mGfjjwlf+j6ttqIuf+vK/KwCLCIsFBUWAMLgoUtCTb0EGxsLhgWDhYCCw+LAIsIC0UFG1gQLOCeM9xzhnvOcM8Z7jnDPWe45wz33JWv3OosOL9rXfGsHMWHcKS5UFSIgQXBorgSnX+KkM+VMCwcLAQWHhYBFhEWigpf7IfY+f0hNuSCYSGwKM6uuPk6RPJ15YuzK8HNInIuIiwUFcGi93koP3dlvnIOvzIcLAQW5efu8yuDRXIRYBFhoaiIBhYECwsLhoVDhRaF1+dLyiu97kKK9/pXcbRuXunRerssngJk7QC/dkBYOyCuHaArB5AxqyfQ6gl29YTiUlWOM1Jn/khgjq+XhC6KQ6HYanx9ay4+NovFRCbIozoda/xx9vc0+mjGrtn27WOjfrgOu8W+/fJ5arMt/Gk87tr9dWynzfxrHz+tFSJbE/P3rKRhDLXaaTB1OYXXRJQyU+4X", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_0.snap index ba8a699673a..f34df709f1c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_0.snap @@ -22,10 +22,6 @@ expression: artifact "visibility": "public" }, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "12161114527103510886": { "error_kind": "string", "string": "completeness violation" @@ -36,8 +32,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/71YPZPTQAxVEu/FdjhioKenYp1vqMLMUTD8AxowyaVgaOiYgcI/neydhJ9lJRwT7+3MzXp3pSfpSSs7N6D7MeC/MBLY00P2tjz7y0bZI5YfGH6eDcJS+M1zxvMQzkc9Bp4ZvvSFv/GLVUbdmHv0f54xZkx+BDMCvh8zzk3d4OtYwrim9uVAnZTP5fkp6ITxHrBFPyZvx7wvI/NWvqDTXE2Yh08q1ii+lN4LvgN86i9WL7mXhkhGHq9ixOZnpdWjRmoP7efK177zPlD2xB/Nz1DxM47Dj392xCiofbd0rWFu0A+pl6mhkyj/XRT/719W6GMCfDojnqERE+bCqb2XPIf7+AV0EJPAJu5JDguyawr5GSnsbU/8XBsx6rsXqbYefPfEfk4xe0Fz98bKH82PvntpHH7+1m5q+JMa/EguM+NMsHJeO8BC+RRiRHl8Fn3ce81zYWDq2s2MeHBP+A2cv1Kx4f0ZnJiJunWEuAWd7mFx3zfNuzRWv45bk76UPAwN7sK8hn3ssVhvqDuGc5T/CJhv+VnbFgxrJjpfA7qvUn8c+YJOf7vJOoH4rDuCnIjsO9C5UXEk/cdRWnEkhg9T6r6/dI6GKr5ErelM/BaPTsl+4DnU/Y6f9W8K1J+A39Z3wLleZX2H6f6K8tgLRV5sY5/Jwe87/bo5Ex8FK6nbPm953180ZmXg7wB+aA5c/fB4LX4mhnxu8FMoec0VcoJYaC9VWJjbTMWIeoKL/Swm7+tN808Vybmjds8gZd8p+c+8Ri5lTi7w87CuysO8OlTLar9f7KrnCp+Au0kE+9V6vtnNFrv11+W8mq8e3/5mtzgcTd8u9pvbN6vVv+xP+fmqbs7xHocx5rX8FtHygueU/DeRPf5952fpFc6wF+R+nZH733dnUrf3srorP6q78mI7r7s+ytkEzrDHhPGE18gXYokfTsn/5LXkJAUd0S8M+6my3/Lb2MPeobFGxh5+3/4QPJ4x9r5/29zZVPi4p32T2gl1/Qf128dAwRYAAA==", - "debug_symbols": "zZhRq6MwEIX/S559yCQzSaZ/ZVkutrUXQWyx7cJS+t9XF20lN9zLefNFHDkfOebEDOZhjs3+/vnR9qfz1ex+PUx3PtS39tyP1eNZmf3Qdl37+bF+bOx0Ifmvv17qfiqvt3q4mZ3jUJmmP453gUb+1HaN2Yl9Vl+kQS3N2qAUX2JKBXFyzLM4ueDW4t+VobAhL3FDXtKGvOh2vDi7IS+0IS9uQ178hrww5GUiBCYCTESYSDChKOEtTBBMFNepf+XtrcsJDxMMEwITASYiTCSYUJRgCxMEE3DmDGfOcOYMZ85w5gxnznDmDGcu5Td3uhA+/2ql6IopzQST5oSiRLAwQTBRXIkcXkR033cm9WlpNsr2h87kfXpPqa7EsSB2mt6JrSIriolslFk93mvKul4oJixu2ZfFxXxmAkwkmCiuCeFl9kXyvGJxTUhcMpDkc4JgwsEE/P3E8s4hy5v7+GWMCBMJJso7x6t7e5GMSBYmCCYcTHiYYJgQmAgwETHiOVZ/6qGt910z//Sf7v1hdQZw+3tpsuOAy3A+NMf70EwHA+8zgSlYsq4i50cnNJVqK5WpmCJUrcjSOOQ47D8=", + "bytecode": "H4sIAAAAAAAA/81Y247TMBCdNHHTpMAG+AKeeMTpbbsSD4uAH+AFJB5QtN28IcEf5NOplxn1ZDLNghojLFW+jc+cOR473k3od0n4F0oGY7rI2C3X/rJST4jlE4PnaBDWgp9cF1zPYD6dMPDC4DIV/t5vdgUNY56Q/7pgzJj6CGYEfJ8zzofuhK9jCeUp9Q8HrlnwvLSfwZpQPgK2rI+p23Hft5F1q1/Sea2WrMMnFWsULrX3gu8An6aL1cvey4VIxj7OY8TmV7V1R6VqDP2XiuvU+54of8JH6zNT+uRx9PHPjxgV9c+WzjXcG+ThFEdck9D0+eNAn/89f1wUPuP5g/r8q/xJFD7yyQ19ZC8XxpxgyTfXARba5xAj2mNb1uPYa64rA1Pn7oKG8eCY6Bu4v1KxpWCXnKmJhnmEuJXBS5+3SDnmI58pHzcnfS37MDO0CzG9gXGcw3zDtXOYR/v3gLnitvYtGFZNNJ4D+l6l6TTyFZ1/f0g/g/isM4KaiO0NrHmr4simj6O24sgMDlc0/K7rPZqp+DLVp5H4LR2dsn3HdbhHvnBbv4v1O1B4O2Ne35dE428JsS8Ne7xDxV584z1ZAu+H9d1pDu+nULKuz/mWx/1FZVUHPl+Bx+De7/48XkufpWFfGvpUyl5rhZogFvrLFRbubaFifOw+i6n79f70jwHZc0f9O4OUf6fsP3MftZQ6u4Bne93U7bppm21zOGzumhcKn0C7ZQT/zf5u027Xzf3msL+/2e0e83/F7Xl3msdzFErO/cArNewFzyn7b2J7/DXclrPqDH/B7seI3d9+u7KuP1Z0Q/u0G9qL77IbcpS5JczhGQ/lCfdRL8QSHk7Zf+e+7MkC1sj6yvC/UP57vI0xPLsaKzXG8H3ZCh7XGPvUf1s8+FT4OKa5Se6EvP4FDihehwUVAAA=", + "debug_symbols": "zZdRq6MwEIX/S559SGYyyaR/ZVkutrUXQWyx7cJS+t/XLNqKN9zLefOlmHI+c8wZB+dhjs3+/vnR9qfz1ex+PUx3PtS39tyPq8ezMvuh7br282P5t7H5x8l//fVS93l5vdXDzezIh8o0/XG8Cm7kT23XmJ3YZ/VFGpJ1kzYkF19ipwWxkveTWCnQUvy7Mi5syEvckBfdkJe0HS9kN+TFbcgLbcgLb8iLL3nh1/3Z0tJLJgQmAkxEmFCYSCjBFiYcTBBMMEzAmTOcOcOZM5w5w5kznLmHM/dw5r785JRmgt2KkKIr73QivEtrwsEEwQTDRLESfXgRkb7vhIl1bm7J2x86IbO+jzQtxLEgpqTvxBaRFcXO2SiTerxOuuqyUkxYaO74QnF9MooSwcJEsSbEz6cvss4rFGtC4pyBKK8JhgkPE/D7E8qdQ+Yn5/hlj4QS0cJEuXO8vgtYZE0QTDBMeJgQmAgwEWFCYSJhxHNc/amHtt53zTRknu79YTFz3v5emtX4eRnOh+Z4H5o8iL5n0Fw8yVXOUR4w8kqp0pgXuUpUq2THDcdN/wE=", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index ba8a699673a..f34df709f1c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_7128/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -22,10 +22,6 @@ expression: artifact "visibility": "public" }, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "12161114527103510886": { "error_kind": "string", "string": "completeness violation" @@ -36,8 +32,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/71YPZPTQAxVEu/FdjhioKenYp1vqMLMUTD8AxowyaVgaOiYgcI/neydhJ9lJRwT7+3MzXp3pSfpSSs7N6D7MeC/MBLY00P2tjz7y0bZI5YfGH6eDcJS+M1zxvMQzkc9Bp4ZvvSFv/GLVUbdmHv0f54xZkx+BDMCvh8zzk3d4OtYwrim9uVAnZTP5fkp6ITxHrBFPyZvx7wvI/NWvqDTXE2Yh08q1ii+lN4LvgN86i9WL7mXhkhGHq9ixOZnpdWjRmoP7efK177zPlD2xB/Nz1DxM47Dj392xCiofbd0rWFu0A+pl6mhkyj/XRT/719W6GMCfDojnqERE+bCqb2XPIf7+AV0EJPAJu5JDguyawr5GSnsbU/8XBsx6rsXqbYefPfEfk4xe0Fz98bKH82PvntpHH7+1m5q+JMa/EguM+NMsHJeO8BC+RRiRHl8Fn3ce81zYWDq2s2MeHBP+A2cv1Kx4f0ZnJiJunWEuAWd7mFx3zfNuzRWv45bk76UPAwN7sK8hn3ssVhvqDuGc5T/CJhv+VnbFgxrJjpfA7qvUn8c+YJOf7vJOoH4rDuCnIjsO9C5UXEk/cdRWnEkhg9T6r6/dI6GKr5ErelM/BaPTsl+4DnU/Y6f9W8K1J+A39Z3wLleZX2H6f6K8tgLRV5sY5/Jwe87/bo5Ex8FK6nbPm953180ZmXg7wB+aA5c/fB4LX4mhnxu8FMoec0VcoJYaC9VWJjbTMWIeoKL/Swm7+tN808Vybmjds8gZd8p+c+8Ri5lTi7w87CuysO8OlTLar9f7KrnCp+Au0kE+9V6vtnNFrv11+W8mq8e3/5mtzgcTd8u9pvbN6vVv+xP+fmqbs7xHocx5rX8FtHygueU/DeRPf5952fpFc6wF+R+nZH733dnUrf3srorP6q78mI7r7s+ytkEzrDHhPGE18gXYokfTsn/5LXkJAUd0S8M+6my3/Lb2MPeobFGxh5+3/4QPJ4x9r5/29zZVPi4p32T2gl1/Qf128dAwRYAAA==", - "debug_symbols": "zZhRq6MwEIX/S559yCQzSaZ/ZVkutrUXQWyx7cJS+t9XF20lN9zLefNFHDkfOebEDOZhjs3+/vnR9qfz1ex+PUx3PtS39tyP1eNZmf3Qdl37+bF+bOx0Ifmvv17qfiqvt3q4mZ3jUJmmP453gUb+1HaN2Yl9Vl+kQS3N2qAUX2JKBXFyzLM4ueDW4t+VobAhL3FDXtKGvOh2vDi7IS+0IS9uQ178hrww5GUiBCYCTESYSDChKOEtTBBMFNepf+XtrcsJDxMMEwITASYiTCSYUJRgCxMEE3DmDGfOcOYMZ85w5gxnznDmDGcu5Td3uhA+/2ql6IopzQST5oSiRLAwQTBRXIkcXkR033cm9WlpNsr2h87kfXpPqa7EsSB2mt6JrSIriolslFk93mvKul4oJixu2ZfFxXxmAkwkmCiuCeFl9kXyvGJxTUhcMpDkc4JgwsEE/P3E8s4hy5v7+GWMCBMJJso7x6t7e5GMSBYmCCYcTHiYYJgQmAgwETHiOVZ/6qGt910z//Sf7v1hdQZw+3tpsuOAy3A+NMf70EwHA+8zgSlYsq4i50cnNJVqK5WpmCJUrcjSOOQ47D8=", + "bytecode": "H4sIAAAAAAAA/81Y247TMBCdNHHTpMAG+AKeeMTpbbsSD4uAH+AFJB5QtN28IcEf5NOplxn1ZDLNghojLFW+jc+cOR473k3od0n4F0oGY7rI2C3X/rJST4jlE4PnaBDWgp9cF1zPYD6dMPDC4DIV/t5vdgUNY56Q/7pgzJj6CGYEfJ8zzofuhK9jCeUp9Q8HrlnwvLSfwZpQPgK2rI+p23Hft5F1q1/Sea2WrMMnFWsULrX3gu8An6aL1cvey4VIxj7OY8TmV7V1R6VqDP2XiuvU+54of8JH6zNT+uRx9PHPjxgV9c+WzjXcG+ThFEdck9D0+eNAn/89f1wUPuP5g/r8q/xJFD7yyQ19ZC8XxpxgyTfXARba5xAj2mNb1uPYa64rA1Pn7oKG8eCY6Bu4v1KxpWCXnKmJhnmEuJXBS5+3SDnmI58pHzcnfS37MDO0CzG9gXGcw3zDtXOYR/v3gLnitvYtGFZNNJ4D+l6l6TTyFZ1/f0g/g/isM4KaiO0NrHmr4simj6O24sgMDlc0/K7rPZqp+DLVp5H4LR2dsn3HdbhHvnBbv4v1O1B4O2Ne35dE428JsS8Ne7xDxV584z1ZAu+H9d1pDu+nULKuz/mWx/1FZVUHPl+Bx+De7/48XkufpWFfGvpUyl5rhZogFvrLFRbubaFifOw+i6n79f70jwHZc0f9O4OUf6fsP3MftZQ6u4Bne93U7bppm21zOGzumhcKn0C7ZQT/zf5u027Xzf3msL+/2e0e83/F7Xl3msdzFErO/cArNewFzyn7b2J7/DXclrPqDH/B7seI3d9+u7KuP1Z0Q/u0G9qL77IbcpS5JczhGQ/lCfdRL8QSHk7Zf+e+7MkC1sj6yvC/UP57vI0xPLsaKzXG8H3ZCh7XGPvUf1s8+FT4OKa5Se6EvP4FDihehwUVAAA=", + "debug_symbols": "zZdRq6MwEIX/S559SGYyyaR/ZVkutrUXQWyx7cJS+t/XLNqKN9zLefOlmHI+c8wZB+dhjs3+/vnR9qfz1ex+PUx3PtS39tyPq8ezMvuh7br282P5t7H5x8l//fVS93l5vdXDzezIh8o0/XG8Cm7kT23XmJ3YZ/VFGpJ1kzYkF19ipwWxkveTWCnQUvy7Mi5syEvckBfdkJe0HS9kN+TFbcgLbcgLb8iLL3nh1/3Z0tJLJgQmAkxEmFCYSCjBFiYcTBBMMEzAmTOcOcOZM5w5w5kznLmHM/dw5r785JRmgt2KkKIr73QivEtrwsEEwQTDRLESfXgRkb7vhIl1bm7J2x86IbO+jzQtxLEgpqTvxBaRFcXO2SiTerxOuuqyUkxYaO74QnF9MooSwcJEsSbEz6cvss4rFGtC4pyBKK8JhgkPE/D7E8qdQ+Yn5/hlj4QS0cJEuXO8vgtYZE0QTDBMeJgQmAgwEWFCYSJhxHNc/amHtt53zTRknu79YTFz3v5emtX4eRnOh+Z4H5o8iL5n0Fw8yVXOUR4w8kqp0pgXuUpUq2THDcdN/wE=", "file_map": { "17": { "source": "use crate::field::field_less_than;\nuse crate::runtime::is_unconstrained;\n\n// The low and high decomposition of the field modulus\nglobal PLO: Field = 53438638232309528389504892708671455233;\nglobal PHI: Field = 64323764613183177041862057485226039389;\n\npub(crate) global TWO_POW_128: Field = 0x100000000000000000000000000000000;\n\n// Decomposes a single field into two 16 byte fields.\nfn compute_decomposition(x: Field) -> (Field, Field) {\n // Here's we're taking advantage of truncating 128 bit limbs from the input field\n // and then subtracting them from the input such the field division is equivalent to integer division.\n let low = (x as u128) as Field;\n let high = (x - low) / TWO_POW_128;\n\n (low, high)\n}\n\npub(crate) unconstrained fn decompose_hint(x: Field) -> (Field, Field) {\n compute_decomposition(x)\n}\n\nunconstrained fn lte_hint(x: Field, y: Field) -> bool {\n if x == y {\n true\n } else {\n field_less_than(x, y)\n }\n}\n\n// Assert that (alo > blo && ahi >= bhi) || (alo <= blo && ahi > bhi)\nfn assert_gt_limbs(a: (Field, Field), b: (Field, Field)) {\n let (alo, ahi) = a;\n let (blo, bhi) = b;\n // Safety: borrow is enforced to be boolean due to its type.\n // if borrow is 0, it asserts that (alo > blo && ahi >= bhi)\n // if borrow is 1, it asserts that (alo <= blo && ahi > bhi)\n unsafe {\n let borrow = lte_hint(alo, blo);\n\n let rlo = alo - blo - 1 + (borrow as Field) * TWO_POW_128;\n let rhi = ahi - bhi - (borrow as Field);\n\n rlo.assert_max_bit_size::<128>();\n rhi.assert_max_bit_size::<128>();\n }\n}\n\n/// Decompose a single field into two 16 byte fields.\npub fn decompose(x: Field) -> (Field, Field) {\n if is_unconstrained() {\n compute_decomposition(x)\n } else {\n // Safety: decomposition is properly checked below\n unsafe {\n // Take hints of the decomposition\n let (xlo, xhi) = decompose_hint(x);\n\n // Range check the limbs\n xlo.assert_max_bit_size::<128>();\n xhi.assert_max_bit_size::<128>();\n\n // Check that the decomposition is correct\n assert_eq(x, xlo + TWO_POW_128 * xhi);\n\n // Assert that the decomposition of P is greater than the decomposition of x\n assert_gt_limbs((PLO, PHI), (xlo, xhi));\n (xlo, xhi)\n }\n }\n}\n\npub fn assert_gt(a: Field, b: Field) {\n if is_unconstrained() {\n assert(\n // Safety: already unconstrained\n unsafe { field_less_than(b, a) },\n );\n } else {\n // Decompose a and b\n let a_limbs = decompose(a);\n let b_limbs = decompose(b);\n\n // Assert that a_limbs is greater than b_limbs\n assert_gt_limbs(a_limbs, b_limbs)\n }\n}\n\npub fn assert_lt(a: Field, b: Field) {\n assert_gt(b, a);\n}\n\npub fn gt(a: Field, b: Field) -> bool {\n if is_unconstrained() {\n // Safety: unsafe in unconstrained\n unsafe {\n field_less_than(b, a)\n }\n } else if a == b {\n false\n } else {\n // Safety: Take a hint of the comparison and verify it\n unsafe {\n if field_less_than(a, b) {\n assert_gt(b, a);\n false\n } else {\n assert_gt(a, b);\n true\n }\n }\n }\n}\n\npub fn lt(a: Field, b: Field) -> bool {\n gt(b, a)\n}\n\nmod tests {\n // TODO: Allow imports from \"super\"\n use crate::field::bn254::{assert_gt, decompose, gt, lte_hint, PHI, PLO, TWO_POW_128};\n\n #[test]\n fn check_decompose() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_decompose_unconstrained() {\n assert_eq(decompose(TWO_POW_128), (0, 1));\n assert_eq(decompose(TWO_POW_128 + 0x1234567890), (0x1234567890, 1));\n assert_eq(decompose(0x1234567890), (0x1234567890, 0));\n }\n\n #[test]\n unconstrained fn check_lte_hint() {\n assert(lte_hint(0, 1));\n assert(lte_hint(0, 0x100));\n assert(lte_hint(0x100, TWO_POW_128 - 1));\n assert(!lte_hint(0 - 1, 0));\n\n assert(lte_hint(0, 0));\n assert(lte_hint(0x100, 0x100));\n assert(lte_hint(0 - 1, 0 - 1));\n }\n\n #[test]\n fn check_assert_gt() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n unconstrained fn check_assert_gt_unconstrained() {\n assert_gt(1, 0);\n assert_gt(0x100, 0);\n assert_gt((0 - 1), (0 - 2));\n assert_gt(TWO_POW_128, 0);\n assert_gt(0 - 1, 0);\n }\n\n #[test]\n fn check_gt() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n unconstrained fn check_gt_unconstrained() {\n assert(gt(1, 0));\n assert(gt(0x100, 0));\n assert(gt((0 - 1), (0 - 2)));\n assert(gt(TWO_POW_128, 0));\n assert(!gt(0, 0));\n assert(!gt(0, 0x100));\n assert(gt(0 - 1, 0 - 2));\n assert(!gt(0 - 2, 0 - 1));\n }\n\n #[test]\n fn check_plo_phi() {\n assert_eq(PLO + PHI * TWO_POW_128, 0);\n let p_bytes = crate::field::modulus_le_bytes();\n let mut p_low: Field = 0;\n let mut p_high: Field = 0;\n\n let mut offset = 1;\n for i in 0..16 {\n p_low += (p_bytes[i] as Field) * offset;\n p_high += (p_bytes[i + 16] as Field) * offset;\n offset *= 256;\n }\n assert_eq(p_low, PLO);\n assert_eq(p_high, PHI);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 108810ba5c3..9843ddd1a3d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -21,10 +21,6 @@ expression: artifact "error_kind": "string", "string": "attempt to multiply with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -39,8 +35,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1aUYvrVBA+aZNu272XLd5HEcQXwaekSdMWRBZu9V4veEUQLggK2aT9D4IP+TeC+AN8F3wSfBB8EnwU8U+4Z29m8/XrJO1uT9YVd6AkOWfON3PmzEzOnNQzNXnV1TdHkIB8Ud2Mquce9Pcvf+fVc3gcRSOS6xJ/ESbZSJmfQ/3jUYXpdYMfCn5H9g9PKpwXZY2PcxG5w8vfKdw/MbV/dDV/Wb8u5/+kZc7iO0/L7tbW0grw/Q7wPwR8Y9zH7kfd2Oca/1k3+DPBf94Nfir4H3eCH+c2Hm0sflXhabF4lD9lm3STr7Mom2cX0yLXYvEo/HUe5lmYh1mRr+PZcgQ2coK/mBXxZp7n08ubdTwdAaYT/KKYTfMky+JNsV7GqeAHrvCB0s06e1xhDkxNHq39ienC18K5R/IMrZMh+WPS1XVu8Eie6MP2EV8V2w0VXSdKn0f3Q0XOUJGjYfUcYvUdYvkOsQJHWJZW5etrx3urufgE+pCQ5i/oy0x9eka9LUYBuMwn5Dx/b1Muc+op8rXc+2/kD2kbm073fdf5o0/6sH04f/iKrhOjxxPe+4ocX5EzUfpW5QPWbbA69unksSJbSPowL6IvM2n5Q9ps/vgGcJmPZaLvifwzo7+LLHVsp5DX1Df1mvYV+/SMvk8TCqjtU7DTjzQ/jOW2+J6YXduxrTSfRPtLnaLZ2m/A8qsf67Uq9bm+qq7aXtPlmr0BuMbo7/h99nh+A3t4N7SH8H9J9vDv0B4i69TUZwV+6V7+fPE6hq7sDHbgnIHyA+LPq+dxwzzOb6nnZp5FmzjbZLOsKJI8YztZ6oGdtHr1vuRnT9FdaF9+/glwmY9lYhwE99QWx7yr/gZc5mOZ/7d31ddgpy7eVRxjj0l3Y3Zt2VHOPHjPL/LHptO1jdreW33FzlpcyNgJ9VlalTUf9/WVtt4DlnMsLc95DVeRw21NtQX6ySFx1dHe7OC4Evl3FVfa+rXF1UDRdUJ9llZlzcd9bWd+D1jusDgXCr52FTnc1hS/Wlzhe0++v1m9voUxOE72wzxWapCA+L83NeZ31f0Z4BrS8RT6+0q/jNPOozUbSLt2Topn+D3SDWNmSH04juurUYscTa+xwj9q0QvPSceEhXL8lnmwroMGfsELiP+H6mrxZpXRZQ8qdRCuX5c1m83TVo8F6MGxFZTb89Z8QYvTtjXVvjtMzO76nRDWvnNQ+carxa7oqNU3goux67oGzebxIp8m+fxiFmdxeqMatO09ftu8hliSu/bltZ8BF+P30Lwm/L+YGvOvBkzUEb+ts38FgKXp8Ix0EP5fq6u180tPx8R5+S3zEv7fAPMzwtTeb205t+2bIepzZnZ9neNmAPORcauy5sH5Iv8f1dU+/06YWn2ixaIWbz7gsk+JTXqmXn/8b4KM7fps0SO9scbWaq2A+P+keZ2ArXj92e9xDVAu+oTYhNdM5Fof/LwSwDGPsjEGtb2FjOGcxDlZmxfqybF1KL/Mq2f0eov5OX/wfAYgv2ktvZbx7G/9hrF4z+dIBu7vax3mdaNPax2m5cOHOuy/h+WyDhsZ/d13Xj2Hx9HOf3TGRt/P+y36eM70Sa7fO7JHxm9JmGMG1C/8jyoj2udX3raO2n4N94FN+7UzwJR9jVazYE6z5ENf1zXL1nk26aT5tPadnm2P/PwfMUvaf4z4/1pt7xdPweT/eSI/7ptusn5vwvq9JLtpezaL/9YBvqN9+2DZ73g15tvV/aFnGL7S37amWk3H8T1o4Od4Ev53wXYzT8dEm6BevB7C/96B8YQ5x5Jfbs/vvGoPjyM1nnCvyfHUdh5k6aZnAGKzicK/Krf72uocVzWJ+L7rM4Bkls3zbB5FyyRaJ9Fs3xnAmehUwrzK7TEn1bPUCcwveAHxvw9x+QH5YKDIs3yftPB5DdcrDKXNL7fbRuUuf7/c5RfZ43JXR+k7hT70XUuPqme0F2KJHgHxv4DcZWkIY2T8RJE/JPlbeitt6JOM1VfahN+uz1PyW5y76z38lUzCxzbWTXzn1LiPq+likS6nF2EyL/JNkcT74sq1/HyWXuSXwR2uoyt17lp+mqTRYpEt8jTfLJP84s7nv0w3yzi+iOJlsV5G6T75/wDFb3E8ETgAAA==", - "debug_symbols": "ndvfSis7FIDxd+m1F8layUriqxw2G//UTaFUqXrgIL77mW6cViaZyrduxFF/DO0XrbOa+dg8bu/f//zeHZ6eXze3/3xs9s8Pd2+758N09PF5s7k/7vb73Z/f37+8CacPEv7+/OvL3eF0+Pp2d3zb3EZpN5vt4XH6TMPkn3b77eY2h89fNxuJWAgWikXCImNhWBQsKhaNCsXNFTdX3Fxxc8XNFTdX3Fxxc8XNFTdPuHnCzdO4ebJZWFkKxSJhkbEwLAoWw+YS45eQKEvRqMgBi4iFYKFYJCwyFoZFwQI3z7i54eaGmxtubri54eaGm9u4eTqLsvyttYJFxaJRUQIWEQvBQrFIWGQscPOCmxfcvODmFTev4+ZNvoSGuBSChf4kbCkSFhkLw2LYXCXMQtpSVCzaD0LTQrSARcRCqIhheJJ0JilJR4QT5SRxkjkxTgonw/WV6pm01pGGSQycRE6EE+UkcZI5MU4KJ7x+5PWF1xdeX3j98ajG4vwH3KJ2xDgpnFROGibjec11EjkRTpSTxAmvr7y+8vrK6yuvn3j9xOsnXj/x+onXH49vLOeZZOuIcVI4qZw0TMYznOskciKcKCeJE14/8/qZ18+8fub1jdc3Xt94feP1jdcfj1uszCNoq8sRdBzPQqzN18UldNcv49HG9bMMH34JZT5LzB1JnGROjJPhk1xinYnGjlROGibjEce3xzIgkRPhRDlJeFmO5xzXiXFSOKmcNEwa/0UeTzuuE+Fk+FiqzPWr1AWREDiJnAzXWD2/CVVT6ciwfi3ztVitsSOVk4bJeBBxnUROhBPlZNzFzl2qdCRzYpyM67eZtG6+K+MRQZP5Rbwl7YhykjjJnBgnhZPKScNEeZfxiOA64SlX9k8Em1/4p2Fo95dsZQvFNDaeUezezJOVXRQ/oOZAK3sppkH4BbUORQ8SDxpvqpguvs8o5Q4lD8oeZB5UPKh6UHOgHDwoepB4kGdFZM+KyJ4VkT0rIntWRPasiOxZEeZZEeZZEbayIuoFdRN1MfWg5EHZg8yDigdVD2oOVIIHrayI89Rk8v2mU/Eg9aDkQdmDzIOKB1UPWtmQeX5LN07/ACxRDR4UPUg8KHvQyl7WrGfUX4g0zxPRVp4Iu6D+WqyJB6kHJQ9aecprviDrkHlQ8SBX3MaRhuBB0YPEg9SDkgdlDzKKPqejf++Ou7v7/fbrnpGn98PDt1tI3v572S7uJnk5Pj9sH9+P29N9JZdbSk7pdHpLT1V/nbahTIct3bR2OjgVUk3T92w653Te/wE=", + "bytecode": "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", + "debug_symbols": "ndrfSuNAFMfxd8l1L+b8mTNnfJVlWarWpVCqVF1YxHffdDGpZCYtv3MjRv0Qmu/UtifzMTzu7t9//9ofn55fh7sfH8Ph+WH7tn8+jkcfn5vh/rQ/HPa/f33/8ZDOXzj9//vXl+3xfPj6tj29DXfEdTPsjo/jd5JG/7Q/7Ia7nD5/bgYmWDAsBBYKiwwLg0WBhcOiokLg5gI3F7i5wM0Fbi5wc4GbC9xc4OYCN1e4ucLNtd9cbRJWlkJgobDIsDBYFFh0mzPRl2DipaioyAkWBAuGhcBCYZFhYbAosICbZ7i5wc0Nbm5wc4ObG9zc4ObWb66zKMtnrRVYOCwqKkqCBcGCYdFvXvlLSKKlUFjkW8KWwmBRYOGw6DYXTpPguhCeYEE3hOhSMCwEFoqK2j2HzkJ1+TyvCosMC4NFgYXDoqKCUndhqc+k1oYQThgnghPFScaJ4aTbxWj6D2EkS0IJJ4QTxongRHGScWI4KThxnOD1Ga/PeH3G6zNen/H6jNdnvD7j9Rmv35/XWM4Tyct3B9Qf2FwnhBPGieBEcZJxYjgpOHGc4PUVr694fcXrK15f8fqK11e8vuL1Fa/fn69YmWZq5qkh/StWpw9eJWlDDD9L9+GXVKazUG6I46TCpD/PuE66F7mQT0SoIYwTwYneeCwdknFiOCk4cXhZ9gcbV0l/snGdEE4YJ4IT/IncH29cJwaT/ijBearv7A0hnDBOug/f56m6a2lId1l6mT6LuTcr2StMasIJ4YRxIjhRnPS72NzFm6lCfzxynRSc9OvXidRmgMj92UXl6UW8qjREcZJxYjgpOHGcVJj0ZxfXCd6lP7u4TvCU/RHBOASaXvgpFW9Q/w7vOAabEDV3J7g/JriBVvZz3EC0guiCaoM4giSCtI9UZ6S5QTmCLIJKBHkE1QBa2e1xA1EEcQRJBEVWhERWhERWhERWhERWhERWhEZWhEZWhEZWxMqmEPILaibqvLIv5AbKEWQRVCLII6gGUE4RRBG0siLmqcno2516EkEaQTmCLIJKBHkE1QCylf1i863DcYzfvJk2iiCOIIkgi6CVrXZZZtR8EOESuRBl5ULYBXmLJII0gnIErVxyzxdkDSoR5BEUiespgiiCOIIkgjSCcgRZBBUUfY5Hf7an/fb+sPvaBP/0fnz4tif+7e/LbrE9/uX0/LB7fD/tzhvlL3vkz725ykZIf55v3o+HbptK54NzVqE8/q6M5xzP+w8=", "file_map": { "50": { "source": "fn main() {\n let numerator =\n [790096867046896348, 1063071665130103641, 602707730209562162, 996751591622961462, 28650, 0];\n unsafe { __udiv_mod(numerator) };\n\n let denominator = [12, 0, 0, 0, 0, 0];\n let result = unsafe { __validate_gt_remainder(denominator) };\n assert(result[4] == 0);\n assert(result[5] == 0);\n}\n\nunconstrained fn __udiv_mod(remainder_u60: [u64; 6]) {\n let bit_difference = get_msb(remainder_u60);\n let accumulator_u60: [u64; 6] = shl(bit_difference);\n}\n\nunconstrained fn __validate_gt_remainder(a_u60: [u64; 6]) -> [u64; 6] {\n let mut addend_u60: [u64; 6] = [0; 6];\n let mut result_u60: [u64; 6] = [0; 6];\n\n for i in 0..6 {\n result_u60[i] = a_u60[i] + addend_u60[i];\n }\n\n result_u60\n}\n\nunconstrained fn get_msb(val: [u64; 6]) -> u32 {\n let mut count = 0;\n for i in 0..6 {\n let v = val[(6 - 1) - i];\n if (v > 0) {\n count = 60 * ((6 - 1) - i);\n break;\n }\n }\n count\n}\n\nunconstrained fn shl(shift: u32) -> [u64; 6] {\n let num_shifted_limbs = shift / 60;\n let limb_shift = (shift % 60) as u8;\n\n let mut result = [0; 6];\n result[num_shifted_limbs] = (1 << limb_shift);\n\n for i in 1..(6 - num_shifted_limbs) {\n result[i + num_shifted_limbs] = 0;\n }\n result\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_0.snap index 95d8d3bdba4..e38a5592806 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_0.snap @@ -21,10 +21,6 @@ expression: artifact "error_kind": "string", "string": "attempt to multiply with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -39,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zZzRauMwEEX/Jc950MxIGk1/ZVmWtE2XQEhL2i4spf++TqmdYpuUITvmvpQ66N4cMr5jJ5L1trrf3r7+/rU7PDw+r25+vK32j3ebl93joTt6e1+vbo+7/X73+9fXl1fp9IfkY/zz0+ZwOnx+2RxfVjfEtl5tD/fdf5I6/cNuv13dlPT+c72i7FYUt6K6FepWNLfCvApObgW5FexWuGvO7pqzu+bsrjm7a87umrO75uKuubhrLu6ai7vm4q65uGsu8zXPtVdU/apYT4ZmTp9Dc+bLQxvr59DGbcyhIBwNhMMwOPKSdRlcW9YRR0kLcmg/tDUacxAIB4NwCAhHBuEoIBwVhGPJ/lGH/tF4zNFAOAyDoy7ZT613tTQ+P+qC/cO49BxZxhwVhENBOBoIh2FwaALhIBAOBuEA6R+aQThA+phe3cfawGF2eSil2nrbpONvMNoWJKHEvS3R+JqrhkLSEgwJLUpCZxIbkzAMicCQ5CVJch5IchmTFBiSCkOiMCQNhsRQSCzBkBAMCcOQCAwJTI81mB5rMD3WYHqswfRYg+mxlGCabHcfhYMC02YpLdpn2xnFbIKScVAKDkrFQVEclIaDYjAolHBQCAdl0W5byoDS0gRFcFAyDkrBQak4KIqD0nBQDAaFl+y2PPzsT5xpgkI4KIyDIjgoFQdlyQRxkQFlssaBJCxBH+4U6s6h7hLqnkPdS6h7DXXXUPfZ6yhTP8PDNI2IuSU5+SXkl7BfIn5J9kuKX1L9EvVL/NXP/uoXf/WLv/rFX/3ir37xV7/4qz+/FLO7cvYS/SbzlfoJ9EoycddQ9xbqbpHu80sc/5s7hbpzqLuEuudQ9xLqHprVGprVGprVGppVDc2qhmZVQ7OqoVnV0KxqaFb16qwOP7/UUifuGureQt0t0r2lUHcKdedQdwl1z6HuJdQ9NKstNKstNKstNKsWmlULzaqFZtVCs2qhWbXQrNrV57v2z5vXyawGp6vPGeuHasoTd9858yERvyT7JcUvqX6J+iXNLzG3ZH7lAFt/eyeTBwN5fob/soS/k9SJRPyS7JcUv2S2+jJMvQjbRKJ+SftGIpOIzc+QXpTMz2RelpBfIpF9i6/t6Jr6XRaUysS9hLrXUHcNdb/2aqTUPxymMukYbJHukkLd6f997jPuHOouoe451L1E3sFIDXXXUPcW6m6R7jmFuofe9WYOdZdQd5iVK5yXXBHH9YzSpigNB8VgUErCQVl0RVwrZ5TJN4XCOCiCg5JRlqFxKTgoFQdFcVAaDgrM6kmuCQeFcFAYA+W9O/qzOe42t/vt5x7DD6+Huy9bDr/8fdqOdh9+Oj7ebe9fj9vTPsTnLYhPheYma0n55+mJo9NhLWvWdDo8ffas1B1K967dO/8D", + "bytecode": "H4sIAAAAAAAA/+1azY7jRBBuJ/YkTpxJBOKGBBIPgB07TnxihTghXsLxzw2JB0DIPBgSN07wANy5IHHnsqsdZ7vGXyrVjmfTHs1hWhp17K7+6qerqsvd46iuObp31Q2NQL7SP3z9PIHx6cPfG/0c3tYin/G1iX8Ik8QX9LMof+xrTGcc/JDwR7J/ONM43zUdPupCfOcPf0v4HajOP8bSn9ZvTP0/7dF5qXX9n+mKsri3yJLXaV1UeZTv8+O2LHzQzwp+VYRFHhZhXhZVvMt8wLSCf9iVcb0viu3DjyreEr5nC78sd9siyfO4LqssTgn/zhY+tLSucsKfjYDftpXGnKuuOcy3MB9a9PO9w/gpde5nivFfMFlt532H8SN5uH0o1sh2C0HWjTCGMYpjyGch8JGwphaxXItYnkWsO4tYFD+0ZhOY5xh64sPf0VwpN9rcBzZK3meQtzsO71TKmxbxd1LeVMpuDTde7oof98XFOPaJyE95DaO0zb6G9+0f1UGe6mID57owjvRbwPzBgOkAJo9v/B0AliSDx2Qg+lT3bY59Z8BEvZY9ehF9BpiOc465Ul3ry+9Efy/Qr4CG5FkzGXAu5+1p2fneHjB9iP5b3be2/YZhLgX50O7ko5JPLQGX+xTRTQDXF+b6gt428yDJQmvkgjyBII/H6L9net2DraY9NuFrhnxxXX3Gd8X4tnK4moGU04k3xuCa6SDNmQh6zAW5eCwNpSc9cP2DHnopXyD+CvibfMnpmc9zuYQzF3Tg8U329g1yv9HP4W1tcH1L/J+rvpXyRV99K8XYRhjDPIZjyCcQ+Lxi2cOiNcM1dgw98eHveH2LfCx+e0Y8zyxUtydKeUaSx7EmTxLy/cEDHphj+B5N9D/qvo2lmXMuI+4RtLb8zAYxif4nwKQ65jGPNt38OdiobS6M2cxpLZ8FyIGynuRvzvWWfBrph9RauN48BnAfXrExzOt8r+I5FtfAEeSi+VjbDlm/n3WPta1Uhy0A/xcDb1NtPzfw/gcwf9W/rZ8XnreCdKPvOqUu99uR9rfB+y3xXzBZx9pv50webh++30r1zEYYM/ko8pFiTcKavWJ9FFbfedJL9fex7s36/H0i2PWp/v7qoy/H36XvqSH+KPGRvnGHxNVLu5cYO66k9euLK6n+kWoj7ifS9+FS4POKZQ9LqqVvjSupVrh2rvwbvMd5Q8+Vif4vwPxd/14L83ldTrIo1X+GvFZyzElYruq+K5F+xmQn+j90P/IdSPgJ4CqB1xB7uE+wh/NEexD9n8weY913SfYgXkuDjqYzSLSXVGsTvfR9ys8iFfBG3QM2hvOkc0gTH0mua3cOXK6+Owfk4/bowWW9M9Dzc3ai/1v3re5fagGlswo8XzrJBGNjn1VgPHnNud6SLyD9xGAnpOe2bNtGXa4fP0fltQxiTAQ+GCN99zs0F3P7WuDJfT64wtNkC9Pdn+le61/do89wTNx7+FmkhPkfYPadmeG5YttcGBvbD9F3uB/2xX7buO3XAj3mALLZhtFjzpdqE55vpPpzqB/i+Rmdb41p9/3hw73hSVaNT37EmwvjSP9WP+MdP/W3nJnV+zyq47zOd3lZJkXO97224f/72ea/PRzSbHsMk31Z1GUSPzf/Ypcei2SXh1V0Eue5+adJGh0O+aFIizpLiuOz65+ldRbHxyjOyiqL0mv8KV7vmm4c81jbZvqZ7qg5PdbxSH+vAdq43LBc6Qn8WroveugcQ3/CEN65zfk7v7mknzaX9I93Rs2ljDS2hDHMsW0L9DPaC7FIDo/Rf64BaE3mMIfmbwT+c8b/TG7hHeZ4jjUV3uE+/5meRH6Luts+lzjxZPj4jstGvjNGXD2klH2R76MoS6IqiXbX4uo9dop8V6kwAAA=", + "debug_symbols": "zZzRauNADEX/xc95GGk0Gk1/ZVmWtE2XQEhL2i4spf++zlInxTYpIpW5LyET5l4fIl85scd+6+43t6+/f233D4/P3c2Pt273eLd+2T7u+9Hb+6q7PWx3u+3vX58/7tLxhfL/+c9P6/1x+PyyPrx0N8Rt1W329/27nHr9w3a36W5Kev+56kjciuJWqFtR3QpzK5pXwcmtILeC3Qp3zdldc3bXnN01Z3fN2V1zdtc8u2ue3TXP7ppnd82zu+bZXfM8X3PRQaH1s2I1mSqcPqaK8OWpxvVjqrGNOSoIh4FwNAwOWbIuJ1eTOuIoaUGOOkw1ozEHgXAwCEcG4RAQjgLCoSAcS/YPPfUP4zGHgXA0DA5dsp+2wbWl8f6hC/aPxmXgkDzmUBCOCsJhIBwNg6MmEA4C4WAQDpD+UQWEA6SP1av7mJ04Wrs8lZLaYJvq+B9MtQVJKPFgSzQ+5taGQmIJhoQWJaEzSRuTMAxJhiGRJUlETiRSxiQFhkRhSCoMicGQNBSSlmBICIaEYUgyDAlMj20wPbbB9NgG02MbTI9tMD2WEkyT7X9H4aDAtFlKi/ZZO6O0NkERHJSCg6I4KBUHxXBQGgwKJRwUwkFZtNuWckKxNEHJOCiCg1JwUBQHpeKgGA5Kg0HhJbstn077EwtNUAgHhXFQMg6K4qDMJohpOM3Mk2sANL9g87KE/BL2S7JfIn5J8UvUL6l+ifkl/uqLv/rir774qy/+6ou/+uKvvvirP7+Os4/vIKlfNAil4SqeUp64W6h7i3SfX1n6be4U6s6h7jnUXULdS6i7hrqHZrWEZrWEZlVDs6qhWdXQrGpoVjU0qxqaVQ3Nql6d1dN/QC06cbdQ9xbpXlOoO4W6c6h7DnWXUPcS6q6h7qFZraFZraFZtdCsWmhWLTSrFppVC82qhWbVQrNqV+/vdbjpVaenVtvV+0wbptYkE/f5faYNPyPy5C4Yml8EdFlSvpJMvtT5ZTWXJdUvMb9kttr5dJ4x8/iqG8+v/LgsoS8kWSYS9kuyXyJ+iQbmg9O1R8qahluKK5WJu4W6t0h3SqHu1x4pKw13QtRME3cOdc+h7vJ93/uMewl111D3GupugUdKphbpzinUnULdOdQ9h7pLqHsJdddQ9yVXF1y8TMt50dUFekaxKQrhoDAOSsZBkSVRrJxRdIJScFAUB2XJtVxc8hmFJyiGg9JgUCThoBAOCuOgZBwUwUEpGCjv/ejP+rBd3+42Hw/UfHjd3316vubL36fN6FGbT4fHu83962FzfOjm+XmbxySy6oqt/jwurz8OxVb91o/DYzi4SD/Ufqv9lv8B", "file_map": { "50": { "source": "fn main() {\n let numerator =\n [790096867046896348, 1063071665130103641, 602707730209562162, 996751591622961462, 28650, 0];\n unsafe { __udiv_mod(numerator) };\n\n let denominator = [12, 0, 0, 0, 0, 0];\n let result = unsafe { __validate_gt_remainder(denominator) };\n assert(result[4] == 0);\n assert(result[5] == 0);\n}\n\nunconstrained fn __udiv_mod(remainder_u60: [u64; 6]) {\n let bit_difference = get_msb(remainder_u60);\n let accumulator_u60: [u64; 6] = shl(bit_difference);\n}\n\nunconstrained fn __validate_gt_remainder(a_u60: [u64; 6]) -> [u64; 6] {\n let mut addend_u60: [u64; 6] = [0; 6];\n let mut result_u60: [u64; 6] = [0; 6];\n\n for i in 0..6 {\n result_u60[i] = a_u60[i] + addend_u60[i];\n }\n\n result_u60\n}\n\nunconstrained fn get_msb(val: [u64; 6]) -> u32 {\n let mut count = 0;\n for i in 0..6 {\n let v = val[(6 - 1) - i];\n if (v > 0) {\n count = 60 * ((6 - 1) - i);\n break;\n }\n }\n count\n}\n\nunconstrained fn shl(shift: u32) -> [u64; 6] {\n let num_shifted_limbs = shift / 60;\n let limb_shift = (shift % 60) as u8;\n\n let mut result = [0; 6];\n result[num_shifted_limbs] = (1 << limb_shift);\n\n for i in 1..(6 - num_shifted_limbs) {\n result[i + num_shifted_limbs] = 0;\n }\n result\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 95d8d3bdba4..e38a5592806 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_bignum/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -21,10 +21,6 @@ expression: artifact "error_kind": "string", "string": "attempt to multiply with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -39,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zZzRauMwEEX/Jc950MxIGk1/ZVmWtE2XQEhL2i4spf++TqmdYpuUITvmvpQ66N4cMr5jJ5L1trrf3r7+/rU7PDw+r25+vK32j3ebl93joTt6e1+vbo+7/X73+9fXl1fp9IfkY/zz0+ZwOnx+2RxfVjfEtl5tD/fdf5I6/cNuv13dlPT+c72i7FYUt6K6FepWNLfCvApObgW5FexWuGvO7pqzu+bsrjm7a87umrO75uKuubhrLu6ai7vm4q65uGsu8zXPtVdU/apYT4ZmTp9Dc+bLQxvr59DGbcyhIBwNhMMwOPKSdRlcW9YRR0kLcmg/tDUacxAIB4NwCAhHBuEoIBwVhGPJ/lGH/tF4zNFAOAyDoy7ZT613tTQ+P+qC/cO49BxZxhwVhENBOBoIh2FwaALhIBAOBuEA6R+aQThA+phe3cfawGF2eSil2nrbpONvMNoWJKHEvS3R+JqrhkLSEgwJLUpCZxIbkzAMicCQ5CVJch5IchmTFBiSCkOiMCQNhsRQSCzBkBAMCcOQCAwJTI81mB5rMD3WYHqswfRYg+mxlGCabHcfhYMC02YpLdpn2xnFbIKScVAKDkrFQVEclIaDYjAolHBQCAdl0W5byoDS0gRFcFAyDkrBQak4KIqD0nBQDAaFl+y2PPzsT5xpgkI4KIyDIjgoFQdlyQRxkQFlssaBJCxBH+4U6s6h7hLqnkPdS6h7DXXXUPfZ6yhTP8PDNI2IuSU5+SXkl7BfIn5J9kuKX1L9EvVL/NXP/uoXf/WLv/rFX/3ir37xV7/4qz+/FLO7cvYS/SbzlfoJ9EoycddQ9xbqbpHu80sc/5s7hbpzqLuEuudQ9xLqHprVGprVGprVGppVDc2qhmZVQ7OqoVnV0KxqaFb16qwOP7/UUifuGureQt0t0r2lUHcKdedQdwl1z6HuJdQ9NKstNKstNKstNKsWmlULzaqFZtVCs2qhWbXQrNrV57v2z5vXyawGp6vPGeuHasoTd9858yERvyT7JcUvqX6J+iXNLzG3ZH7lAFt/eyeTBwN5fob/soS/k9SJRPyS7JcUv2S2+jJMvQjbRKJ+SftGIpOIzc+QXpTMz2RelpBfIpF9i6/t6Jr6XRaUysS9hLrXUHcNdb/2aqTUPxymMukYbJHukkLd6f997jPuHOouoe451L1E3sFIDXXXUPcW6m6R7jmFuofe9WYOdZdQd5iVK5yXXBHH9YzSpigNB8VgUErCQVl0RVwrZ5TJN4XCOCiCg5JRlqFxKTgoFQdFcVAaDgrM6kmuCQeFcFAYA+W9O/qzOe42t/vt5x7DD6+Huy9bDr/8fdqOdh9+Oj7ebe9fj9vTPsTnLYhPheYma0n55+mJo9NhLWvWdDo8ffas1B1K967dO/8D", + "bytecode": "H4sIAAAAAAAA/+1azY7jRBBuJ/YkTpxJBOKGBBIPgB07TnxihTghXsLxzw2JB0DIPBgSN07wANy5IHHnsqsdZ7vGXyrVjmfTHs1hWhp17K7+6qerqsvd46iuObp31Q2NQL7SP3z9PIHx6cPfG/0c3tYin/G1iX8Ik8QX9LMof+xrTGcc/JDwR7J/ONM43zUdPupCfOcPf0v4HajOP8bSn9ZvTP0/7dF5qXX9n+mKsri3yJLXaV1UeZTv8+O2LHzQzwp+VYRFHhZhXhZVvMt8wLSCf9iVcb0viu3DjyreEr5nC78sd9siyfO4LqssTgn/zhY+tLSucsKfjYDftpXGnKuuOcy3MB9a9PO9w/gpde5nivFfMFlt532H8SN5uH0o1sh2C0HWjTCGMYpjyGch8JGwphaxXItYnkWsO4tYFD+0ZhOY5xh64sPf0VwpN9rcBzZK3meQtzsO71TKmxbxd1LeVMpuDTde7oof98XFOPaJyE95DaO0zb6G9+0f1UGe6mID57owjvRbwPzBgOkAJo9v/B0AliSDx2Qg+lT3bY59Z8BEvZY9ehF9BpiOc465Ul3ry+9Efy/Qr4CG5FkzGXAu5+1p2fneHjB9iP5b3be2/YZhLgX50O7ko5JPLQGX+xTRTQDXF+b6gt428yDJQmvkgjyBII/H6L9net2DraY9NuFrhnxxXX3Gd8X4tnK4moGU04k3xuCa6SDNmQh6zAW5eCwNpSc9cP2DHnopXyD+CvibfMnpmc9zuYQzF3Tg8U329g1yv9HP4W1tcH1L/J+rvpXyRV99K8XYRhjDPIZjyCcQ+Lxi2cOiNcM1dgw98eHveH2LfCx+e0Y8zyxUtydKeUaSx7EmTxLy/cEDHphj+B5N9D/qvo2lmXMuI+4RtLb8zAYxif4nwKQ65jGPNt38OdiobS6M2cxpLZ8FyIGynuRvzvWWfBrph9RauN48BnAfXrExzOt8r+I5FtfAEeSi+VjbDlm/n3WPta1Uhy0A/xcDb1NtPzfw/gcwf9W/rZ8XnreCdKPvOqUu99uR9rfB+y3xXzBZx9pv50webh++30r1zEYYM/ko8pFiTcKavWJ9FFbfedJL9fex7s36/H0i2PWp/v7qoy/H36XvqSH+KPGRvnGHxNVLu5cYO66k9euLK6n+kWoj7ifS9+FS4POKZQ9LqqVvjSupVrh2rvwbvMd5Q8+Vif4vwPxd/14L83ldTrIo1X+GvFZyzElYruq+K5F+xmQn+j90P/IdSPgJ4CqB1xB7uE+wh/NEexD9n8weY913SfYgXkuDjqYzSLSXVGsTvfR9ys8iFfBG3QM2hvOkc0gTH0mua3cOXK6+Owfk4/bowWW9M9Dzc3ai/1v3re5fagGlswo8XzrJBGNjn1VgPHnNud6SLyD9xGAnpOe2bNtGXa4fP0fltQxiTAQ+GCN99zs0F3P7WuDJfT64wtNkC9Pdn+le61/do89wTNx7+FmkhPkfYPadmeG5YttcGBvbD9F3uB/2xX7buO3XAj3mALLZhtFjzpdqE55vpPpzqB/i+Rmdb41p9/3hw73hSVaNT37EmwvjSP9WP+MdP/W3nJnV+zyq47zOd3lZJkXO97224f/72ea/PRzSbHsMk31Z1GUSPzf/Ypcei2SXh1V0Eue5+adJGh0O+aFIizpLiuOz65+ldRbHxyjOyiqL0mv8KV7vmm4c81jbZvqZ7qg5PdbxSH+vAdq43LBc6Qn8WroveugcQ3/CEN65zfk7v7mknzaX9I93Rs2ljDS2hDHMsW0L9DPaC7FIDo/Rf64BaE3mMIfmbwT+c8b/TG7hHeZ4jjUV3uE+/5meRH6Luts+lzjxZPj4jstGvjNGXD2klH2R76MoS6IqiXbX4uo9dop8V6kwAAA=", + "debug_symbols": "zZzRauNADEX/xc95GGk0Gk1/ZVmWtE2XQEhL2i4spf++zlInxTYpIpW5LyET5l4fIl85scd+6+43t6+/f233D4/P3c2Pt273eLd+2T7u+9Hb+6q7PWx3u+3vX58/7tLxhfL/+c9P6/1x+PyyPrx0N8Rt1W329/27nHr9w3a36W5Kev+56kjciuJWqFtR3QpzK5pXwcmtILeC3Qp3zdldc3bXnN01Z3fN2V1zdtc8u2ue3TXP7ppnd82zu+bZXfM8X3PRQaH1s2I1mSqcPqaK8OWpxvVjqrGNOSoIh4FwNAwOWbIuJ1eTOuIoaUGOOkw1ozEHgXAwCEcG4RAQjgLCoSAcS/YPPfUP4zGHgXA0DA5dsp+2wbWl8f6hC/aPxmXgkDzmUBCOCsJhIBwNg6MmEA4C4WAQDpD+UQWEA6SP1av7mJ04Wrs8lZLaYJvq+B9MtQVJKPFgSzQ+5taGQmIJhoQWJaEzSRuTMAxJhiGRJUlETiRSxiQFhkRhSCoMicGQNBSSlmBICIaEYUgyDAlMj20wPbbB9NgG02MbTI9tMD2WEkyT7X9H4aDAtFlKi/ZZO6O0NkERHJSCg6I4KBUHxXBQGgwKJRwUwkFZtNuWckKxNEHJOCiCg1JwUBQHpeKgGA5Kg0HhJbstn077EwtNUAgHhXFQMg6K4qDMJohpOM3Mk2sANL9g87KE/BL2S7JfIn5J8UvUL6l+ifkl/uqLv/rir774qy/+6ou/+uKvvvirP7+Os4/vIKlfNAil4SqeUp64W6h7i3SfX1n6be4U6s6h7jnUXULdS6i7hrqHZrWEZrWEZlVDs6qhWdXQrGpoVjU0qxqaVQ3Nql6d1dN/QC06cbdQ9xbpXlOoO4W6c6h7DnWXUPcS6q6h7qFZraFZraFZtdCsWmhWLTSrFppVC82qhWbVQrNqV+/vdbjpVaenVtvV+0wbptYkE/f5faYNPyPy5C4Yml8EdFlSvpJMvtT5ZTWXJdUvMb9kttr5dJ4x8/iqG8+v/LgsoS8kWSYS9kuyXyJ+iQbmg9O1R8qahluKK5WJu4W6t0h3SqHu1x4pKw13QtRME3cOdc+h7vJ93/uMewl111D3GupugUdKphbpzinUnULdOdQ9h7pLqHsJdddQ9yVXF1y8TMt50dUFekaxKQrhoDAOSsZBkSVRrJxRdIJScFAUB2XJtVxc8hmFJyiGg9JgUCThoBAOCuOgZBwUwUEpGCjv/ejP+rBd3+42Hw/UfHjd3316vubL36fN6FGbT4fHu83962FzfOjm+XmbxySy6oqt/jwurz8OxVb91o/DYzi4SD/Ufqv9lv8B", "file_map": { "50": { "source": "fn main() {\n let numerator =\n [790096867046896348, 1063071665130103641, 602707730209562162, 996751591622961462, 28650, 0];\n unsafe { __udiv_mod(numerator) };\n\n let denominator = [12, 0, 0, 0, 0, 0];\n let result = unsafe { __validate_gt_remainder(denominator) };\n assert(result[4] == 0);\n assert(result[5] == 0);\n}\n\nunconstrained fn __udiv_mod(remainder_u60: [u64; 6]) {\n let bit_difference = get_msb(remainder_u60);\n let accumulator_u60: [u64; 6] = shl(bit_difference);\n}\n\nunconstrained fn __validate_gt_remainder(a_u60: [u64; 6]) -> [u64; 6] {\n let mut addend_u60: [u64; 6] = [0; 6];\n let mut result_u60: [u64; 6] = [0; 6];\n\n for i in 0..6 {\n result_u60[i] = a_u60[i] + addend_u60[i];\n }\n\n result_u60\n}\n\nunconstrained fn get_msb(val: [u64; 6]) -> u32 {\n let mut count = 0;\n for i in 0..6 {\n let v = val[(6 - 1) - i];\n if (v > 0) {\n count = 60 * ((6 - 1) - i);\n break;\n }\n }\n count\n}\n\nunconstrained fn shl(shift: u32) -> [u64; 6] {\n let num_shifted_limbs = shift / 60;\n let limb_shift = (shift % 60) as u8;\n\n let mut result = [0; 6];\n result[num_shifted_limbs] = (1 << limb_shift);\n\n for i in 1..(6 - num_shifted_limbs) {\n result[i + num_shifted_limbs] = 0;\n }\n result\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index e8cf3451d2d..d161b40992c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -49,8 +49,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1aPY8jRRDt8fR4POP1evZuN0AiA3J7x97dCG0AOSEZmvOxBKRERCORQQISOSIghh9ARIaQCBAxGYKfwdW5a/2mXDP2ct13aulaWvX0VHXVq9fVH9PexGzLxbO/xD1bV6dmv7DOrasXL1aWHm0tQuJMPOIkW+eBeR0F4NU3xjQCjDYCjFkEGMcRYMwjwDiJAGMRAcYyAozTCDCeRIBxFgHG0wgwziPAWEWA8SwCjI8iwPg4AoznEWC8CIDxebkAwPRBQgd+OlDTgZUOhHTgogMNHRhoQ6YNjzYUWrBpQaQFhyY0TRhKSBrwc9P9WNUKy/51deHqEcg9fnwsC+HXp/2bxboplPg84q8LZ9MGsb+8YvtZGPyL3Nl5r93Zx1jY78y1MXe4D8tGIHvfyQrA7H98V4H5Wa5mghMDHLDvcRjf60T4M4JHI/yXJmQubi9y0B/jkfxwHsxYp+3iQZlt9+NgWQYyHl9a894APZlbFvTehud33DOPWcj1BueC7/n6WMGPvqjkrbkvzE0K75hX5nmC+kJWgMy2XT+la1vwg7YYRyb033LtuavH0If7V4r/sfDfwa28k7wUin6h6FMevumep+6Pcugr7mOCzvsVjy9eJqdmf+6NBJ5JEDyLmvHkpsuf5ID987zMQD/pqdmWlLGv0gTd/5ZDsWUK15XQlxz02cofaOtVjilyPRGxTRT9VIlNW/snQmZBlgsZrv3MCa79c7O/9jPusPNz+yMEYrZGnw8pcCLHGXnPxLt3Id5voI/keoj/yujzhspM6feQ+Yl+CiW2EGuhlnfanNLyDvOCim1DYN1eMH8LOBLwSQX3XZKVIOO9rRIy3N/nZn+/LyC2gOvkYM5nCtaH5vwHrtZyHr8rUuWdzPlCwVOZ/fVCchfqzCa5y5Q4MMc1PMYfnqXk/kOz4/43gSHMvN7tP1OzK6kyfuyfcx/nBfbFdqboJkLGuh+JeE/CxLt4BHaN8JUKTInZ/z5JD8Sv2SiFjaLn/a2fGJtExJUdwC3xGG9YrlaZwPKZq2l//kRwZgd453eZEhP2m4Ac9T91Nc4tbY8qQO930JNrnW273AU649QybuQL1yV59tXuBnB/YM4qpX8pZLhW47fZF6bLAd493PqJvzEKdpkfVsSp3Zv5yqPPXf06j/znkXauSgUeewC/3Ke0OymJIevxhTLW/dLVYe+b9X2KfU1N2DP09c32rPSc43bHg/bPdBbkqP+1a+N+g3Hc/k+cd9fN8q5u7pp18/TpatNInqiMgCff/pvr+mZzudpcP1nXTX110D/frXXuAttunynKhA7aY1t4tzY9wtZ0wFYxYKs80taQb8Rqhf0T1x732C+E/sy18Z4zV/Bkwv53ZufnJ6HDNr8HnR9Yxrrtzoccu1OUKfr43SP1OVby+aN7x/N6Dn587wN9uDEX2L/GQdJToy18x75KYctzbEufYzJk6/RIW8wnji89/8xyVwca60sZA/9+jXGif8ZThcFzn3tz8K1xyv595B77elm5p8U2lHuoL3NPszU/0hbzqeXbLAwHtVzXTQ8H6B/bqI82rNA/FfipDP3epPGIPtEelUrRLwf0uY1nJLRRghz1f2V8rj6DPtxfG9uzHrxJj/8+PlBfyyvKnV/cM89F/I2QxyjEOWuzvnqyWa2bxcdLal4ee84a2qsZO54ftLmZCf0/uP3s70/T5cO2+/5I7x/37v47ELCEWOMP/dbM/rXzKD8HxloPYc0VrBrHD13/87b7TvvtGXnKhe/OGVjIcA+1wg/PDcw1tMU45Fn1b9fWzvrcv1L845hJX5r/Y87u2lmfcvsvtudq2+5s+dxTcR7RHP8P51zql+k1AAA=", - "debug_symbols": "ldjbiuowFIDhd+l1L3JYayXxVTabwUMdCqJSdcNGfPdpxc4MbUH+G2nUD9L8TS9yr3bN5vb50R73p0u1+nOvDqft+tqejv3o/qirTdceDu3nx++vKzd8xPz8/+W8Pg7Dy3XdXatVjFJXzXHXX0nu/b49NNVK3eNvXcVChTgsPBYBi4iFYKFYGBYJC9xccHPFzRU3V9xccXPFzRU3V9xccXPFzRU3N9zccHPDzQ03N9zccHNbbp78KIpMRcIiY1GoSA4Lj0XAImIhWCgWuHnCzRNunnDzjJtn3Dzj5nmxuYT0EhKmezALFoqFYZGwWGwuXr5FmYpCRXFY+DdC/FQELCIWgsVic1N9CUtuKgyLhEV+J3QqChXeLS5vsvFRTLNpeSecKCfGyeISJwkjMZmRzEnBxDtOPCeBk8iJcLK8WUoZiQ8zkjhZTuntm5QZKZgEx4nnZDGl5R8SZyRyIpwoJ8ZJ4iRzUjCJfFfG5V2Zxyc5uzmJnMgb4m1GlBPjJDHy6Ef/1l273hya18nW/nbc/jrouv4/N5Mzr3N32ja7W9cMp18/B1/DygdndYi+n8qwqEHrqP31cOtech1ceL7Sh2EstRd5vhaev2o/TP18+jl9AQ==", + "bytecode": "H4sIAAAAAAAA/+1aPY/bRhBdSkvxQ9aJZ98VAdIl6aWTdHflFUmfLmVAy7kqVdo0RNIkQPogRerkB6RKZxhwYbh2Z9g/xR7fzulxOKRke9fGAl7gsFzOcN7b2dnZIXWJuWmnr/8Sd21dPzbdxjpXrl+8X1t6tLUIyTPxyJNsnQT26yiAX31zHEfA0UbAMY2A4yQCjlkEHPMIOBYRcCwj4DiNgOOdCDjOIuB4FAHHeQQcqwg4HkfA8W4EHO9FwPEkAo6nATi+aadAmF5IqOCngpoKVioIqeCigoYKBjqQ6cCjA4USNiVESji0oWnDUEDSgp+Y9suq1lj20vWF60cg9/jysSwErk/7l4tNXSjz88h/VTibNoj95TnbT8PwX2TOztfNzj7OhXFnboyxw8+wbASyb5ysAM7+13cd2D/L9Uz4xIAPGHsSBnuTCDwj/GgEfmlCxuLNhxzEYz7SPxwHM9Zp2nxQZpvuPFiWgozXl3LeZ6AnY8uC3pdw/ZW75jULmW9wL/jer/cU/ohFLWvMbWPfjOEe+5X9nKO+kBUgs00bp3RjCzhoi3mkQv8LN567fgLP8POVgj8R+C3eyj3pl0LRLxR9isPP3fXU/VEM/crPmKD7fs3rix+Tx6a790aCTx6Ez2LFfDLT9p/0AePzvkxBP+np2ZaUMVZpgp5/y6G5pYqvK6EvfdBnK3tLWx9zTdHXuZhbruiPlblpuT8XMguyTMgw97NPhnI/62q9Md0YQ65z011H9kFhumvkM59Lv3Iu7YuLkemuC65JKu5duZ7Gv8Mzfee4ll8q040LGaehc2F+IFct7nAtqdkmBNebD8x/AI8EMKnhuUuyEmR8tlVChud7ZUyn3ilgbiHrjkT4MjW7dUDMfICP8ejrVPD51vWE/0hwCHR23OZQXMexWBfE1/IMPovj1OhnC8pY9zsx32mY+S7ugl0jsMamG7eyxh7vmb9mQ+aVsPlmUSdiXuke3pKP8cblfJ0KLj+6nrC+Fz6zA36XZ33a81wOctTfuh73lpZnC9B7DHqYB6jZpu27j1HjaDlr6KzBs5h9VinPT4QMczW+X/xs2j7A9+crP/OvjcJdxocV88R4kDXP+8bRT67/FEf+42hu9PMf+dg9/OU5pX1XkRzSHiyUse4vrg/7zVQ/pxhrasLWgReXN7XSGx83Oz9o/xBmQY76v7kxnoM4j6t35Hl9US+vV/V1vakfPFhva+knaiPwk2/8+mJ1uT1bby/ub1b16nwvPn8fan3PatrPTFEmdNAe28LvQ9MDbE0HbBUDtsoDbQ1hI1cr7N9x40mP/ULoz9wYv9VlCp9U2P/T7HD+FTps8y/Q+ZtlrNvsMOTaHaFM0cf3HqnPcyXMf9w93tdzwPF9DvTxxlhgfM0HSU+PtvAeY5XClue5LX2uyZCtowNtsT9xfen6P5a7PtBan8k58G+wOE/EZz5VGD63sTcHbM2njO8j9hjrQ8WeNreh2EN9GXuarfmBttifWrzNwvhgJfO66fEB4uMY9dGGFfpHgj+1od9MND8iJtqjVin65YA+j7FGQhslyFH/IfNz/TE8w89ra3vcwzfpwe/zB+prcUWx87+75r2Iv3PxGoWos7ab8/vb9aZe/LCk4dmhddbQWc3csX7Q9mYq9J/w+PXfU9P2h226eKT3wt27fQ8ELiFy/L7fSxlfq0f5OjDX1RDXTOGq+fht83/WtO9pv5+inzKB3aqBhQzPUCtweG9grKEt5iFr1edurNX6/Hyl4OOaSSwN/5DaXav1KbafsT3X22Zny+eZivuI9vgrkOi18K00AAA=", + "debug_symbols": "ldjbiuowFIDhd+l1L3JaK4mvstkMHupQKFWqbtiI7z6t2JmhDch/I430g5A/6UXu1aHZ3T4/2v54ulSbP/eqO+231/bUj6P7o652Q9t17efH778rM/349Hz/ct720/By3Q7XauN9qKumP4xPIY3+2HZNtRHz+FtXPlMRDBYWC4eFxyJgIVgoFhEL3Dzg5oKbC24uuLng5oKbC24uuLng5oKbC26uuLni5oqbK26uuLni5lpuHu0scliKiEXCIlMRDRYWC4eFxyJgUWweXHyJ4JbNo2IRsUhYZCpSsXmw4VvkpbBYOCz8GxHsUgQsBAvFothcRV5Co1mKhEWmIpt3QpbCYlFc3ajzTozrWSkWEYuERXF1Y3Cz0OW3xBrDieXEceI5CZwIJ8pJ+ZzkPBPrViRjYssprX6TvCKWE8eJ56SYUtMP8SsinCgnkZPEScbEGU4sJ/xUuvKpTPNOTmZNhBN9Q6yuSOQkcZIZeYyjf9uh3e665nWJcrz1+193Ktf/52ZxvXIeTvvmcBua6aLl545lOqo2p9o5P05lSuek9jI+Twtsg6ltDs+vzTT0trZen9vvOYzjMI/zGef0BQ==", "file_map": { "50": { "source": "// Reference https://github.com/noir-lang/noir/issues/4395#issuecomment-2018948631\n// for context.\n// We were not accurately accounting for situations where the slice capacity tracker\n// was expecting a capacity from slice intrinsic results.\nfn main(expected: pub Field, first: Field, input: [Field; 20]) {\n let mut hasher_slice = input.as_slice();\n hasher_slice = hasher_slice.push_front(first);\n assert(hasher_slice[0] == expected);\n // We need a conditional based upon witnesses\n // to force a store of the slice.\n // If this successfully compiles it means we have stored\n // the results of the slice intrinsics used above.\n if expected as u32 > 10 {\n hasher_slice[expected - 10] = 100;\n } else {\n hasher_slice[expected] = 100;\n }\n assert(hasher_slice[0] == expected);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_0.snap index e8cf3451d2d..d161b40992c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_0.snap @@ -49,8 +49,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1aPY8jRRDt8fR4POP1evZuN0AiA3J7x97dCG0AOSEZmvOxBKRERCORQQISOSIghh9ARIaQCBAxGYKfwdW5a/2mXDP2ct13aulaWvX0VHXVq9fVH9PexGzLxbO/xD1bV6dmv7DOrasXL1aWHm0tQuJMPOIkW+eBeR0F4NU3xjQCjDYCjFkEGMcRYMwjwDiJAGMRAcYyAozTCDCeRIBxFgHG0wgwziPAWEWA8SwCjI8iwPg4AoznEWC8CIDxebkAwPRBQgd+OlDTgZUOhHTgogMNHRhoQ6YNjzYUWrBpQaQFhyY0TRhKSBrwc9P9WNUKy/51deHqEcg9fnwsC+HXp/2bxboplPg84q8LZ9MGsb+8YvtZGPyL3Nl5r93Zx1jY78y1MXe4D8tGIHvfyQrA7H98V4H5Wa5mghMDHLDvcRjf60T4M4JHI/yXJmQubi9y0B/jkfxwHsxYp+3iQZlt9+NgWQYyHl9a894APZlbFvTehud33DOPWcj1BueC7/n6WMGPvqjkrbkvzE0K75hX5nmC+kJWgMy2XT+la1vwg7YYRyb033LtuavH0If7V4r/sfDfwa28k7wUin6h6FMevumep+6Pcugr7mOCzvsVjy9eJqdmf+6NBJ5JEDyLmvHkpsuf5ID987zMQD/pqdmWlLGv0gTd/5ZDsWUK15XQlxz02cofaOtVjilyPRGxTRT9VIlNW/snQmZBlgsZrv3MCa79c7O/9jPusPNz+yMEYrZGnw8pcCLHGXnPxLt3Id5voI/keoj/yujzhspM6feQ+Yl+CiW2EGuhlnfanNLyDvOCim1DYN1eMH8LOBLwSQX3XZKVIOO9rRIy3N/nZn+/LyC2gOvkYM5nCtaH5vwHrtZyHr8rUuWdzPlCwVOZ/fVCchfqzCa5y5Q4MMc1PMYfnqXk/kOz4/43gSHMvN7tP1OzK6kyfuyfcx/nBfbFdqboJkLGuh+JeE/CxLt4BHaN8JUKTInZ/z5JD8Sv2SiFjaLn/a2fGJtExJUdwC3xGG9YrlaZwPKZq2l//kRwZgd453eZEhP2m4Ac9T91Nc4tbY8qQO930JNrnW273AU649QybuQL1yV59tXuBnB/YM4qpX8pZLhW47fZF6bLAd493PqJvzEKdpkfVsSp3Zv5yqPPXf06j/znkXauSgUeewC/3Ke0OymJIevxhTLW/dLVYe+b9X2KfU1N2DP09c32rPSc43bHg/bPdBbkqP+1a+N+g3Hc/k+cd9fN8q5u7pp18/TpatNInqiMgCff/pvr+mZzudpcP1nXTX110D/frXXuAttunynKhA7aY1t4tzY9wtZ0wFYxYKs80taQb8Rqhf0T1x732C+E/sy18Z4zV/Bkwv53ZufnJ6HDNr8HnR9Yxrrtzoccu1OUKfr43SP1OVby+aN7x/N6Dn587wN9uDEX2L/GQdJToy18x75KYctzbEufYzJk6/RIW8wnji89/8xyVwca60sZA/9+jXGif8ZThcFzn3tz8K1xyv595B77elm5p8U2lHuoL3NPszU/0hbzqeXbLAwHtVzXTQ8H6B/bqI82rNA/FfipDP3epPGIPtEelUrRLwf0uY1nJLRRghz1f2V8rj6DPtxfG9uzHrxJj/8+PlBfyyvKnV/cM89F/I2QxyjEOWuzvnqyWa2bxcdLal4ee84a2qsZO54ftLmZCf0/uP3s70/T5cO2+/5I7x/37v47ELCEWOMP/dbM/rXzKD8HxloPYc0VrBrHD13/87b7TvvtGXnKhe/OGVjIcA+1wg/PDcw1tMU45Fn1b9fWzvrcv1L845hJX5r/Y87u2lmfcvsvtudq2+5s+dxTcR7RHP8P51zql+k1AAA=", - "debug_symbols": "ldjbiuowFIDhd+l1L3JYayXxVTabwUMdCqJSdcNGfPdpxc4MbUH+G2nUD9L8TS9yr3bN5vb50R73p0u1+nOvDqft+tqejv3o/qirTdceDu3nx++vKzd8xPz8/+W8Pg7Dy3XdXatVjFJXzXHXX0nu/b49NNVK3eNvXcVChTgsPBYBi4iFYKFYGBYJC9xccHPFzRU3V9xccXPFzRU3V9xccXPFzRU3N9zccHPDzQ03N9zccHNbbp78KIpMRcIiY1GoSA4Lj0XAImIhWCgWuHnCzRNunnDzjJtn3Dzj5nmxuYT0EhKmezALFoqFYZGwWGwuXr5FmYpCRXFY+DdC/FQELCIWgsVic1N9CUtuKgyLhEV+J3QqChXeLS5vsvFRTLNpeSecKCfGyeISJwkjMZmRzEnBxDtOPCeBk8iJcLK8WUoZiQ8zkjhZTuntm5QZKZgEx4nnZDGl5R8SZyRyIpwoJ8ZJ4iRzUjCJfFfG5V2Zxyc5uzmJnMgb4m1GlBPjJDHy6Ef/1l273hya18nW/nbc/jrouv4/N5Mzr3N32ja7W9cMp18/B1/DygdndYi+n8qwqEHrqP31cOtech1ceL7Sh2EstRd5vhaev2o/TP18+jl9AQ==", + "bytecode": "H4sIAAAAAAAA/+1aPY/bRhBdSkvxQ9aJZ98VAdIl6aWTdHflFUmfLmVAy7kqVdo0RNIkQPogRerkB6RKZxhwYbh2Z9g/xR7fzulxOKRke9fGAl7gsFzOcN7b2dnZIXWJuWmnr/8Sd21dPzbdxjpXrl+8X1t6tLUIyTPxyJNsnQT26yiAX31zHEfA0UbAMY2A4yQCjlkEHPMIOBYRcCwj4DiNgOOdCDjOIuB4FAHHeQQcqwg4HkfA8W4EHO9FwPEkAo6nATi+aadAmF5IqOCngpoKVioIqeCigoYKBjqQ6cCjA4USNiVESji0oWnDUEDSgp+Y9suq1lj20vWF60cg9/jysSwErk/7l4tNXSjz88h/VTibNoj95TnbT8PwX2TOztfNzj7OhXFnboyxw8+wbASyb5ysAM7+13cd2D/L9Uz4xIAPGHsSBnuTCDwj/GgEfmlCxuLNhxzEYz7SPxwHM9Zp2nxQZpvuPFiWgozXl3LeZ6AnY8uC3pdw/ZW75jULmW9wL/jer/cU/ohFLWvMbWPfjOEe+5X9nKO+kBUgs00bp3RjCzhoi3mkQv8LN567fgLP8POVgj8R+C3eyj3pl0LRLxR9isPP3fXU/VEM/crPmKD7fs3rix+Tx6a790aCTx6Ez2LFfDLT9p/0AePzvkxBP+np2ZaUMVZpgp5/y6G5pYqvK6EvfdBnK3tLWx9zTdHXuZhbruiPlblpuT8XMguyTMgw97NPhnI/62q9Md0YQ65z011H9kFhumvkM59Lv3Iu7YuLkemuC65JKu5duZ7Gv8Mzfee4ll8q040LGaehc2F+IFct7nAtqdkmBNebD8x/AI8EMKnhuUuyEmR8tlVChud7ZUyn3ilgbiHrjkT4MjW7dUDMfICP8ejrVPD51vWE/0hwCHR23OZQXMexWBfE1/IMPovj1OhnC8pY9zsx32mY+S7ugl0jsMamG7eyxh7vmb9mQ+aVsPlmUSdiXuke3pKP8cblfJ0KLj+6nrC+Fz6zA36XZ33a81wOctTfuh73lpZnC9B7DHqYB6jZpu27j1HjaDlr6KzBs5h9VinPT4QMczW+X/xs2j7A9+crP/OvjcJdxocV88R4kDXP+8bRT67/FEf+42hu9PMf+dg9/OU5pX1XkRzSHiyUse4vrg/7zVQ/pxhrasLWgReXN7XSGx83Oz9o/xBmQY76v7kxnoM4j6t35Hl9US+vV/V1vakfPFhva+knaiPwk2/8+mJ1uT1bby/ub1b16nwvPn8fan3PatrPTFEmdNAe28LvQ9MDbE0HbBUDtsoDbQ1hI1cr7N9x40mP/ULoz9wYv9VlCp9U2P/T7HD+FTps8y/Q+ZtlrNvsMOTaHaFM0cf3HqnPcyXMf9w93tdzwPF9DvTxxlhgfM0HSU+PtvAeY5XClue5LX2uyZCtowNtsT9xfen6P5a7PtBan8k58G+wOE/EZz5VGD63sTcHbM2njO8j9hjrQ8WeNreh2EN9GXuarfmBttifWrzNwvhgJfO66fEB4uMY9dGGFfpHgj+1od9MND8iJtqjVin65YA+j7FGQhslyFH/IfNz/TE8w89ra3vcwzfpwe/zB+prcUWx87+75r2Iv3PxGoWos7ab8/vb9aZe/LCk4dmhddbQWc3csX7Q9mYq9J/w+PXfU9P2h226eKT3wt27fQ8ELiFy/L7fSxlfq0f5OjDX1RDXTOGq+fht83/WtO9pv5+inzKB3aqBhQzPUCtweG9grKEt5iFr1edurNX6/Hyl4OOaSSwN/5DaXav1KbafsT3X22Zny+eZivuI9vgrkOi18K00AAA=", + "debug_symbols": "ldjbiuowFIDhd+l1L3JaK4mvstkMHupQKFWqbtiI7z6t2JmhDch/I430g5A/6UXu1aHZ3T4/2v54ulSbP/eqO+231/bUj6P7o652Q9t17efH778rM/349Hz/ct720/By3Q7XauN9qKumP4xPIY3+2HZNtRHz+FtXPlMRDBYWC4eFxyJgIVgoFhEL3Dzg5oKbC24uuLng5oKbC24uuLng5oKbC26uuLni5oqbK26uuLni5lpuHu0scliKiEXCIlMRDRYWC4eFxyJgUWweXHyJ4JbNo2IRsUhYZCpSsXmw4VvkpbBYOCz8GxHsUgQsBAvFothcRV5Co1mKhEWmIpt3QpbCYlFc3ajzTozrWSkWEYuERXF1Y3Cz0OW3xBrDieXEceI5CZwIJ8pJ+ZzkPBPrViRjYssprX6TvCKWE8eJ56SYUtMP8SsinCgnkZPEScbEGU4sJ/xUuvKpTPNOTmZNhBN9Q6yuSOQkcZIZeYyjf9uh3e665nWJcrz1+193Ktf/52ZxvXIeTvvmcBua6aLl545lOqo2p9o5P05lSuek9jI+Twtsg6ltDs+vzTT0trZen9vvOYzjMI/zGef0BQ==", "file_map": { "50": { "source": "// Reference https://github.com/noir-lang/noir/issues/4395#issuecomment-2018948631\n// for context.\n// We were not accurately accounting for situations where the slice capacity tracker\n// was expecting a capacity from slice intrinsic results.\nfn main(expected: pub Field, first: Field, input: [Field; 20]) {\n let mut hasher_slice = input.as_slice();\n hasher_slice = hasher_slice.push_front(first);\n assert(hasher_slice[0] == expected);\n // We need a conditional based upon witnesses\n // to force a store of the slice.\n // If this successfully compiles it means we have stored\n // the results of the slice intrinsics used above.\n if expected as u32 > 10 {\n hasher_slice[expected - 10] = 100;\n } else {\n hasher_slice[expected] = 100;\n }\n assert(hasher_slice[0] == expected);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index e8cf3451d2d..d161b40992c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_capacity_tracker/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -49,8 +49,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1aPY8jRRDt8fR4POP1evZuN0AiA3J7x97dCG0AOSEZmvOxBKRERCORQQISOSIghh9ARIaQCBAxGYKfwdW5a/2mXDP2ct13aulaWvX0VHXVq9fVH9PexGzLxbO/xD1bV6dmv7DOrasXL1aWHm0tQuJMPOIkW+eBeR0F4NU3xjQCjDYCjFkEGMcRYMwjwDiJAGMRAcYyAozTCDCeRIBxFgHG0wgwziPAWEWA8SwCjI8iwPg4AoznEWC8CIDxebkAwPRBQgd+OlDTgZUOhHTgogMNHRhoQ6YNjzYUWrBpQaQFhyY0TRhKSBrwc9P9WNUKy/51deHqEcg9fnwsC+HXp/2bxboplPg84q8LZ9MGsb+8YvtZGPyL3Nl5r93Zx1jY78y1MXe4D8tGIHvfyQrA7H98V4H5Wa5mghMDHLDvcRjf60T4M4JHI/yXJmQubi9y0B/jkfxwHsxYp+3iQZlt9+NgWQYyHl9a894APZlbFvTehud33DOPWcj1BueC7/n6WMGPvqjkrbkvzE0K75hX5nmC+kJWgMy2XT+la1vwg7YYRyb033LtuavH0If7V4r/sfDfwa28k7wUin6h6FMevumep+6Pcugr7mOCzvsVjy9eJqdmf+6NBJ5JEDyLmvHkpsuf5ID987zMQD/pqdmWlLGv0gTd/5ZDsWUK15XQlxz02cofaOtVjilyPRGxTRT9VIlNW/snQmZBlgsZrv3MCa79c7O/9jPusPNz+yMEYrZGnw8pcCLHGXnPxLt3Id5voI/keoj/yujzhspM6feQ+Yl+CiW2EGuhlnfanNLyDvOCim1DYN1eMH8LOBLwSQX3XZKVIOO9rRIy3N/nZn+/LyC2gOvkYM5nCtaH5vwHrtZyHr8rUuWdzPlCwVOZ/fVCchfqzCa5y5Q4MMc1PMYfnqXk/kOz4/43gSHMvN7tP1OzK6kyfuyfcx/nBfbFdqboJkLGuh+JeE/CxLt4BHaN8JUKTInZ/z5JD8Sv2SiFjaLn/a2fGJtExJUdwC3xGG9YrlaZwPKZq2l//kRwZgd453eZEhP2m4Ac9T91Nc4tbY8qQO930JNrnW273AU649QybuQL1yV59tXuBnB/YM4qpX8pZLhW47fZF6bLAd493PqJvzEKdpkfVsSp3Zv5yqPPXf06j/znkXauSgUeewC/3Ke0OymJIevxhTLW/dLVYe+b9X2KfU1N2DP09c32rPSc43bHg/bPdBbkqP+1a+N+g3Hc/k+cd9fN8q5u7pp18/TpatNInqiMgCff/pvr+mZzudpcP1nXTX110D/frXXuAttunynKhA7aY1t4tzY9wtZ0wFYxYKs80taQb8Rqhf0T1x732C+E/sy18Z4zV/Bkwv53ZufnJ6HDNr8HnR9Yxrrtzoccu1OUKfr43SP1OVby+aN7x/N6Dn587wN9uDEX2L/GQdJToy18x75KYctzbEufYzJk6/RIW8wnji89/8xyVwca60sZA/9+jXGif8ZThcFzn3tz8K1xyv595B77elm5p8U2lHuoL3NPszU/0hbzqeXbLAwHtVzXTQ8H6B/bqI82rNA/FfipDP3epPGIPtEelUrRLwf0uY1nJLRRghz1f2V8rj6DPtxfG9uzHrxJj/8+PlBfyyvKnV/cM89F/I2QxyjEOWuzvnqyWa2bxcdLal4ee84a2qsZO54ftLmZCf0/uP3s70/T5cO2+/5I7x/37v47ELCEWOMP/dbM/rXzKD8HxloPYc0VrBrHD13/87b7TvvtGXnKhe/OGVjIcA+1wg/PDcw1tMU45Fn1b9fWzvrcv1L845hJX5r/Y87u2lmfcvsvtudq2+5s+dxTcR7RHP8P51zql+k1AAA=", - "debug_symbols": "ldjbiuowFIDhd+l1L3JYayXxVTabwUMdCqJSdcNGfPdpxc4MbUH+G2nUD9L8TS9yr3bN5vb50R73p0u1+nOvDqft+tqejv3o/qirTdceDu3nx++vKzd8xPz8/+W8Pg7Dy3XdXatVjFJXzXHXX0nu/b49NNVK3eNvXcVChTgsPBYBi4iFYKFYGBYJC9xccHPFzRU3V9xccXPFzRU3V9xccXPFzRU3N9zccHPDzQ03N9zccHNbbp78KIpMRcIiY1GoSA4Lj0XAImIhWCgWuHnCzRNunnDzjJtn3Dzj5nmxuYT0EhKmezALFoqFYZGwWGwuXr5FmYpCRXFY+DdC/FQELCIWgsVic1N9CUtuKgyLhEV+J3QqChXeLS5vsvFRTLNpeSecKCfGyeISJwkjMZmRzEnBxDtOPCeBk8iJcLK8WUoZiQ8zkjhZTuntm5QZKZgEx4nnZDGl5R8SZyRyIpwoJ8ZJ4iRzUjCJfFfG5V2Zxyc5uzmJnMgb4m1GlBPjJDHy6Ef/1l273hya18nW/nbc/jrouv4/N5Mzr3N32ja7W9cMp18/B1/DygdndYi+n8qwqEHrqP31cOtech1ceL7Sh2EstRd5vhaev2o/TP18+jl9AQ==", + "bytecode": "H4sIAAAAAAAA/+1aPY/bRhBdSkvxQ9aJZ98VAdIl6aWTdHflFUmfLmVAy7kqVdo0RNIkQPogRerkB6RKZxhwYbh2Z9g/xR7fzulxOKRke9fGAl7gsFzOcN7b2dnZIXWJuWmnr/8Sd21dPzbdxjpXrl+8X1t6tLUIyTPxyJNsnQT26yiAX31zHEfA0UbAMY2A4yQCjlkEHPMIOBYRcCwj4DiNgOOdCDjOIuB4FAHHeQQcqwg4HkfA8W4EHO9FwPEkAo6nATi+aadAmF5IqOCngpoKVioIqeCigoYKBjqQ6cCjA4USNiVESji0oWnDUEDSgp+Y9suq1lj20vWF60cg9/jysSwErk/7l4tNXSjz88h/VTibNoj95TnbT8PwX2TOztfNzj7OhXFnboyxw8+wbASyb5ysAM7+13cd2D/L9Uz4xIAPGHsSBnuTCDwj/GgEfmlCxuLNhxzEYz7SPxwHM9Zp2nxQZpvuPFiWgozXl3LeZ6AnY8uC3pdw/ZW75jULmW9wL/jer/cU/ohFLWvMbWPfjOEe+5X9nKO+kBUgs00bp3RjCzhoi3mkQv8LN567fgLP8POVgj8R+C3eyj3pl0LRLxR9isPP3fXU/VEM/crPmKD7fs3rix+Tx6a790aCTx6Ez2LFfDLT9p/0AePzvkxBP+np2ZaUMVZpgp5/y6G5pYqvK6EvfdBnK3tLWx9zTdHXuZhbruiPlblpuT8XMguyTMgw97NPhnI/62q9Md0YQ65z011H9kFhumvkM59Lv3Iu7YuLkemuC65JKu5duZ7Gv8Mzfee4ll8q040LGaehc2F+IFct7nAtqdkmBNebD8x/AI8EMKnhuUuyEmR8tlVChud7ZUyn3ilgbiHrjkT4MjW7dUDMfICP8ejrVPD51vWE/0hwCHR23OZQXMexWBfE1/IMPovj1OhnC8pY9zsx32mY+S7ugl0jsMamG7eyxh7vmb9mQ+aVsPlmUSdiXuke3pKP8cblfJ0KLj+6nrC+Fz6zA36XZ33a81wOctTfuh73lpZnC9B7DHqYB6jZpu27j1HjaDlr6KzBs5h9VinPT4QMczW+X/xs2j7A9+crP/OvjcJdxocV88R4kDXP+8bRT67/FEf+42hu9PMf+dg9/OU5pX1XkRzSHiyUse4vrg/7zVQ/pxhrasLWgReXN7XSGx83Oz9o/xBmQY76v7kxnoM4j6t35Hl9US+vV/V1vakfPFhva+knaiPwk2/8+mJ1uT1bby/ub1b16nwvPn8fan3PatrPTFEmdNAe28LvQ9MDbE0HbBUDtsoDbQ1hI1cr7N9x40mP/ULoz9wYv9VlCp9U2P/T7HD+FTps8y/Q+ZtlrNvsMOTaHaFM0cf3HqnPcyXMf9w93tdzwPF9DvTxxlhgfM0HSU+PtvAeY5XClue5LX2uyZCtowNtsT9xfen6P5a7PtBan8k58G+wOE/EZz5VGD63sTcHbM2njO8j9hjrQ8WeNreh2EN9GXuarfmBttifWrzNwvhgJfO66fEB4uMY9dGGFfpHgj+1od9MND8iJtqjVin65YA+j7FGQhslyFH/IfNz/TE8w89ra3vcwzfpwe/zB+prcUWx87+75r2Iv3PxGoWos7ab8/vb9aZe/LCk4dmhddbQWc3csX7Q9mYq9J/w+PXfU9P2h226eKT3wt27fQ8ELiFy/L7fSxlfq0f5OjDX1RDXTOGq+fht83/WtO9pv5+inzKB3aqBhQzPUCtweG9grKEt5iFr1edurNX6/Hyl4OOaSSwN/5DaXav1KbafsT3X22Zny+eZivuI9vgrkOi18K00AAA=", + "debug_symbols": "ldjbiuowFIDhd+l1L3JaK4mvstkMHupQKFWqbtiI7z6t2JmhDch/I430g5A/6UXu1aHZ3T4/2v54ulSbP/eqO+231/bUj6P7o652Q9t17efH778rM/349Hz/ct720/By3Q7XauN9qKumP4xPIY3+2HZNtRHz+FtXPlMRDBYWC4eFxyJgIVgoFhEL3Dzg5oKbC24uuLng5oKbC24uuLng5oKbC26uuLni5oqbK26uuLni5lpuHu0scliKiEXCIlMRDRYWC4eFxyJgUWweXHyJ4JbNo2IRsUhYZCpSsXmw4VvkpbBYOCz8GxHsUgQsBAvFothcRV5Co1mKhEWmIpt3QpbCYlFc3ajzTozrWSkWEYuERXF1Y3Cz0OW3xBrDieXEceI5CZwIJ8pJ+ZzkPBPrViRjYssprX6TvCKWE8eJ56SYUtMP8SsinCgnkZPEScbEGU4sJ/xUuvKpTPNOTmZNhBN9Q6yuSOQkcZIZeYyjf9uh3e665nWJcrz1+193Ktf/52ZxvXIeTvvmcBua6aLl545lOqo2p9o5P05lSuek9jI+Twtsg6ltDs+vzTT0trZen9vvOYzjMI/zGef0BQ==", "file_map": { "50": { "source": "// Reference https://github.com/noir-lang/noir/issues/4395#issuecomment-2018948631\n// for context.\n// We were not accurately accounting for situations where the slice capacity tracker\n// was expecting a capacity from slice intrinsic results.\nfn main(expected: pub Field, first: Field, input: [Field; 20]) {\n let mut hasher_slice = input.as_slice();\n hasher_slice = hasher_slice.push_front(first);\n assert(hasher_slice[0] == expected);\n // We need a conditional based upon witnesses\n // to force a store of the slice.\n // If this successfully compiles it means we have stored\n // the results of the slice intrinsics used above.\n if expected as u32 > 10 {\n hasher_slice[expected - 10] = 100;\n } else {\n hasher_slice[expected] = 100;\n }\n assert(hasher_slice[0] == expected);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 3a51f9d9449..4a74e650a51 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -30,10 +30,6 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -44,8 +40,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VYTY/TMBCdbJK2aalawRmJG3BLN23aCxJC7AcSR05IHNwslTggLtyQID+dendGfZlMA6uNV6qlaGL7ZeZ5PB7bieiupPsn4veE5RnLiPuxCPYty/xhZdGjrjwUx+gEOJ6dAMf4BDgmATiG4JkG4kkDRdoHlp847xidDKwB/mGZscRk0mMALDJlt0/9m3zpMmN8PfIvMtAZQH8p+pMw+vMh63lfN/WTshsrnPWNYC4Ac3EEcwmYyyOYK8BcHcFcA+ZaYcR3gWJrGXhuVlNqzgfBWMR2GsZ2GSl7RM24IGV/TEHXwSKi9kEmprZ/JE9NBVMf+ESqL6nb45C+FPpkfkf75zngrNjCPuHiy4f6oOMV6HvN74Fj1WWKU9955JnBH235MqwP/hBfxdAmPpc5GCFe9WXQl9RNO2OuJ2AHdQmPVOFfcn3GcgDfyPdzw/5A2W/wNtq0XzIDnxl4v6e/4PcJPz6GvnBbV774n/WMtubUXs+Cm1E77z1SXsrFlpxvZI61TbwEIR7fiQ4XJ2krWHq/Vmp8CTV9p9u07yKDT2zw0WtS69acLR16Dwq8NxUyviH4sYtX6L0yVXzesPRcPiq/pR2+j1R7St3xlRljJur3goB83rH08blTHALldte1l8r5OqmD2C79OL+xrikZ61dxGkJfbODRRxH7UeOHgJE5nys8+tvKlWIT429G9jwhH+t8g/hE6YoNrmHjodzpfIg5ODb8kyr8J8Uz1F7xFPRqH1lzofewQGfZ/L7+O6N27sR9R/v3M0trD7PyHZ5Tu/Yw6ZtQ2HW/3tz5yBfJOZKHdUmgH/Fbro+Bv8iH/Bzard1iV7idW7mbm2XldIyR8lPf9t262FTny2q9XRWuKB/dfrUqt9Vy5fKvC189/5d96yyN+4gvch7H8zriMY8g/rtg988Pftf3N7Tncb87cNEReavDaEvqZpt1jsf7jeDF9rhuc5S+CfThHufLE66jv1CX8EgV/hfXZU7wTiLfzw37I2W/wdto0/ebiYGfGHg/Pz9FH0sce9//E25tKv3YprlJ7Pi4/gvwuqvAeRkAAA==", - "debug_symbols": "ldXbaoQwEAbgd8l1LnIwJuOrlLJ4iEtAVDwUivjuTUq3uwRh+W8ko35kyAT+g3W+2e+3MPbTyqqPgw1TW29hGmN1nJw1SxiGcL+9vmYiPYz+/X+d6zGV61YvG6tkoTnzYxdXRkffh8GzyojzkzNTwMLAonwnbC4sKkp5Kax9CEu5ULDQsChgYWBxfbql+xdFLiwsHCwIFVbAQsJCwULDooAFPEF7PUF6CCVULhws6J3Ib6ITsJCwULDQsChgYWBRwsLCwsECnjnBMydw5mesvuol1M3g/wKw38f2JQ+379ln0TgvU+u7ffEpJJ/5mJqVwnCpythJuhiKuKa4lukTaU4uFalFIi6FjNvHFn4A", + "bytecode": "H4sIAAAAAAAA/9VYTY/TMBC1G6dtWqqt4IzEDbgltOmuOO1hv5DgAhIHxMV0qZDgR/inUy8z5GUy6e5CfKilyLHnZeZ5ZjKZ1po/I99flu4dzSOaLclxMPac5vL/RjWgrjIVR3sEHEdHwDE7Ao4uAccUPPNEPM1YkI6JFQMXHSOLgXbAXzQXNGMxGTABqkLYHVL/Wbn2hXK+AfmvCtCZQP+G9bs0+ssJ6bkIbf1G2M0ETnuGMZeAuezBXAHmqgdzDZjrHswNYG4Ehn2XKLfWiWNTL0w7HgbOwrbzNLY3Vtgzpp0XRtifmaTvQWVNt5HJTNc/XKcWjAkNHytkLnTPwbIcZBzf6f56Djgtt1DGXOJ4Fxodr0Dfa7pPnKu+EJyGriPPFP5oK45JaPzBvspgj33OMZgiXsgKkLnQtjOjtQM7qIt55AL/ktYnNI/hGX5+qdgfC/st3sqe9Euh4AsFH7/pL+h+TlfMoQ+0d6hePOR9RltL032fLTwna4/MK8ZgbdTeXdQh62ji+rriM3GvlN/DK3W9zwWfmua4vniE763Yf+i5xiAzZtgmF/m8pTnm7ifBIVF98oe+B9wjupDE9iae8zPpWghf38VHcJqALFPw6CNLfpT4CWA45kuBR39r7zvbxPw7Mf3fPWu69SdT8E7oGim6Un4P9yHZSa4OuEr/GtP8wcL494Jnqv78KeiV/pubtLl7elaWf2t+aPyA8TXCfi7wH2k96znH+T/y3J36arfyO1/729v11ks/xTECPw1tf1tvvm3XtS+/V3H55j77Wk+BtSgO7kuwb0E81nPEf2Hs/vpK97KPRXsR9/MA7rE9gwvtPa2fwT6P8Wx7FrocWTYHGdbJOJ7QGv2FuphHLvA/aM0xwd6Mn18q9qfCfou3sif7vLmCnyv4GB/P+mjGsw/9u+rOptCPe5Ib507M698ci+qXgRYAAA==", + "debug_symbols": "ldTdioQgGAbge/HYA/PfbmVZhn5sEKLCamGJ7n112dkZJBjek/CrHrJPfQ/S+3a/38I0zCupPw4yzl2zhXlK1XFS0sYwjuF+e71NWL5I9fv+ujRTLtetiRupKyko8VOfRkokP4TRk1qx85MSqWFhYGHfCVMKhwolLoUxD2FcKSQsFCw0LAwsrrur7b+QpXCo0AwWFSw4LAQsJCwULDQs4BXU1yvoHoIzXgjDYFG9E+VONBwWAhYSFgoTZ6q+mhiadvR/gTvsU/eSv9v34osoXuLc+X6PPofyM49z062mFTNpIvlfuaPCpXGVn6RDbXkucqetoFalj6cJ/AA=", "file_map": { "50": { "source": "fn main(mut x: [u32; 5], idx: Field) {\n // We should not hit out of bounds here as we have a predicate\n // that should not be hit\n if idx as u32 < 3 {\n x[idx] = 10;\n }\n assert(x[4] == 111);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_0.snap index 3a51f9d9449..4a74e650a51 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_0.snap @@ -30,10 +30,6 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -44,8 +40,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VYTY/TMBCdbJK2aalawRmJG3BLN23aCxJC7AcSR05IHNwslTggLtyQID+dendGfZlMA6uNV6qlaGL7ZeZ5PB7bieiupPsn4veE5RnLiPuxCPYty/xhZdGjrjwUx+gEOJ6dAMf4BDgmATiG4JkG4kkDRdoHlp847xidDKwB/mGZscRk0mMALDJlt0/9m3zpMmN8PfIvMtAZQH8p+pMw+vMh63lfN/WTshsrnPWNYC4Ac3EEcwmYyyOYK8BcHcFcA+ZaYcR3gWJrGXhuVlNqzgfBWMR2GsZ2GSl7RM24IGV/TEHXwSKi9kEmprZ/JE9NBVMf+ESqL6nb45C+FPpkfkf75zngrNjCPuHiy4f6oOMV6HvN74Fj1WWKU9955JnBH235MqwP/hBfxdAmPpc5GCFe9WXQl9RNO2OuJ2AHdQmPVOFfcn3GcgDfyPdzw/5A2W/wNtq0XzIDnxl4v6e/4PcJPz6GvnBbV774n/WMtubUXs+Cm1E77z1SXsrFlpxvZI61TbwEIR7fiQ4XJ2krWHq/Vmp8CTV9p9u07yKDT2zw0WtS69acLR16Dwq8NxUyviH4sYtX6L0yVXzesPRcPiq/pR2+j1R7St3xlRljJur3goB83rH08blTHALldte1l8r5OqmD2C79OL+xrikZ61dxGkJfbODRRxH7UeOHgJE5nys8+tvKlWIT429G9jwhH+t8g/hE6YoNrmHjodzpfIg5ODb8kyr8J8Uz1F7xFPRqH1lzofewQGfZ/L7+O6N27sR9R/v3M0trD7PyHZ5Tu/Yw6ZtQ2HW/3tz5yBfJOZKHdUmgH/Fbro+Bv8iH/Bzard1iV7idW7mbm2XldIyR8lPf9t262FTny2q9XRWuKB/dfrUqt9Vy5fKvC189/5d96yyN+4gvch7H8zriMY8g/rtg988Pftf3N7Tncb87cNEReavDaEvqZpt1jsf7jeDF9rhuc5S+CfThHufLE66jv1CX8EgV/hfXZU7wTiLfzw37I2W/wdto0/ebiYGfGHg/Pz9FH0sce9//E25tKv3YprlJ7Pi4/gvwuqvAeRkAAA==", - "debug_symbols": "ldXbaoQwEAbgd8l1LnIwJuOrlLJ4iEtAVDwUivjuTUq3uwRh+W8ko35kyAT+g3W+2e+3MPbTyqqPgw1TW29hGmN1nJw1SxiGcL+9vmYiPYz+/X+d6zGV61YvG6tkoTnzYxdXRkffh8GzyojzkzNTwMLAonwnbC4sKkp5Kax9CEu5ULDQsChgYWBxfbql+xdFLiwsHCwIFVbAQsJCwULDooAFPEF7PUF6CCVULhws6J3Ib6ITsJCwULDQsChgYWBRwsLCwsECnjnBMydw5mesvuol1M3g/wKw38f2JQ+379ln0TgvU+u7ffEpJJ/5mJqVwnCpythJuhiKuKa4lukTaU4uFalFIi6FjNvHFn4A", + "bytecode": "H4sIAAAAAAAA/9VYTY/TMBC1G6dtWqqt4IzEDbgltOmuOO1hv5DgAhIHxMV0qZDgR/inUy8z5GUy6e5CfKilyLHnZeZ5ZjKZ1po/I99flu4dzSOaLclxMPac5vL/RjWgrjIVR3sEHEdHwDE7Ao4uAccUPPNEPM1YkI6JFQMXHSOLgXbAXzQXNGMxGTABqkLYHVL/Wbn2hXK+AfmvCtCZQP+G9bs0+ssJ6bkIbf1G2M0ETnuGMZeAuezBXAHmqgdzDZjrHswNYG4Ehn2XKLfWiWNTL0w7HgbOwrbzNLY3Vtgzpp0XRtifmaTvQWVNt5HJTNc/XKcWjAkNHytkLnTPwbIcZBzf6f56Djgtt1DGXOJ4Fxodr0Dfa7pPnKu+EJyGriPPFP5oK45JaPzBvspgj33OMZgiXsgKkLnQtjOjtQM7qIt55AL/ktYnNI/hGX5+qdgfC/st3sqe9Euh4AsFH7/pL+h+TlfMoQ+0d6hePOR9RltL032fLTwna4/MK8ZgbdTeXdQh62ji+rriM3GvlN/DK3W9zwWfmua4vniE763Yf+i5xiAzZtgmF/m8pTnm7ifBIVF98oe+B9wjupDE9iae8zPpWghf38VHcJqALFPw6CNLfpT4CWA45kuBR39r7zvbxPw7Mf3fPWu69SdT8E7oGim6Un4P9yHZSa4OuEr/GtP8wcL494Jnqv78KeiV/pubtLl7elaWf2t+aPyA8TXCfi7wH2k96znH+T/y3J36arfyO1/729v11ks/xTECPw1tf1tvvm3XtS+/V3H55j77Wk+BtSgO7kuwb0E81nPEf2Hs/vpK97KPRXsR9/MA7rE9gwvtPa2fwT6P8Wx7FrocWTYHGdbJOJ7QGv2FuphHLvA/aM0xwd6Mn18q9qfCfou3sif7vLmCnyv4GB/P+mjGsw/9u+rOptCPe5Ib507M698ci+qXgRYAAA==", + "debug_symbols": "ldTdioQgGAbge/HYA/PfbmVZhn5sEKLCamGJ7n112dkZJBjek/CrHrJPfQ/S+3a/38I0zCupPw4yzl2zhXlK1XFS0sYwjuF+e71NWL5I9fv+ujRTLtetiRupKyko8VOfRkokP4TRk1qx85MSqWFhYGHfCVMKhwolLoUxD2FcKSQsFCw0LAwsrrur7b+QpXCo0AwWFSw4LAQsJCwULDQs4BXU1yvoHoIzXgjDYFG9E+VONBwWAhYSFgoTZ6q+mhiadvR/gTvsU/eSv9v34osoXuLc+X6PPofyM49z062mFTNpIvlfuaPCpXGVn6RDbXkucqetoFalj6cJ/AA=", "file_map": { "50": { "source": "fn main(mut x: [u32; 5], idx: Field) {\n // We should not hit out of bounds here as we have a predicate\n // that should not be hit\n if idx as u32 < 3 {\n x[idx] = 10;\n }\n assert(x[4] == 111);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 3a51f9d9449..4a74e650a51 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_mem_op_predicate/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -30,10 +30,6 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -44,8 +40,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VYTY/TMBCdbJK2aalawRmJG3BLN23aCxJC7AcSR05IHNwslTggLtyQID+dendGfZlMA6uNV6qlaGL7ZeZ5PB7bieiupPsn4veE5RnLiPuxCPYty/xhZdGjrjwUx+gEOJ6dAMf4BDgmATiG4JkG4kkDRdoHlp847xidDKwB/mGZscRk0mMALDJlt0/9m3zpMmN8PfIvMtAZQH8p+pMw+vMh63lfN/WTshsrnPWNYC4Ac3EEcwmYyyOYK8BcHcFcA+ZaYcR3gWJrGXhuVlNqzgfBWMR2GsZ2GSl7RM24IGV/TEHXwSKi9kEmprZ/JE9NBVMf+ESqL6nb45C+FPpkfkf75zngrNjCPuHiy4f6oOMV6HvN74Fj1WWKU9955JnBH235MqwP/hBfxdAmPpc5GCFe9WXQl9RNO2OuJ2AHdQmPVOFfcn3GcgDfyPdzw/5A2W/wNtq0XzIDnxl4v6e/4PcJPz6GvnBbV774n/WMtubUXs+Cm1E77z1SXsrFlpxvZI61TbwEIR7fiQ4XJ2krWHq/Vmp8CTV9p9u07yKDT2zw0WtS69acLR16Dwq8NxUyviH4sYtX6L0yVXzesPRcPiq/pR2+j1R7St3xlRljJur3goB83rH08blTHALldte1l8r5OqmD2C79OL+xrikZ61dxGkJfbODRRxH7UeOHgJE5nys8+tvKlWIT429G9jwhH+t8g/hE6YoNrmHjodzpfIg5ODb8kyr8J8Uz1F7xFPRqH1lzofewQGfZ/L7+O6N27sR9R/v3M0trD7PyHZ5Tu/Yw6ZtQ2HW/3tz5yBfJOZKHdUmgH/Fbro+Bv8iH/Bzard1iV7idW7mbm2XldIyR8lPf9t262FTny2q9XRWuKB/dfrUqt9Vy5fKvC189/5d96yyN+4gvch7H8zriMY8g/rtg988Pftf3N7Tncb87cNEReavDaEvqZpt1jsf7jeDF9rhuc5S+CfThHufLE66jv1CX8EgV/hfXZU7wTiLfzw37I2W/wdto0/ebiYGfGHg/Pz9FH0sce9//E25tKv3YprlJ7Pi4/gvwuqvAeRkAAA==", - "debug_symbols": "ldXbaoQwEAbgd8l1LnIwJuOrlLJ4iEtAVDwUivjuTUq3uwRh+W8ko35kyAT+g3W+2e+3MPbTyqqPgw1TW29hGmN1nJw1SxiGcL+9vmYiPYz+/X+d6zGV61YvG6tkoTnzYxdXRkffh8GzyojzkzNTwMLAonwnbC4sKkp5Kax9CEu5ULDQsChgYWBxfbql+xdFLiwsHCwIFVbAQsJCwULDooAFPEF7PUF6CCVULhws6J3Ib6ITsJCwULDQsChgYWBRwsLCwsECnjnBMydw5mesvuol1M3g/wKw38f2JQ+379ln0TgvU+u7ffEpJJ/5mJqVwnCpythJuhiKuKa4lukTaU4uFalFIi6FjNvHFn4A", + "bytecode": "H4sIAAAAAAAA/9VYTY/TMBC1G6dtWqqt4IzEDbgltOmuOO1hv5DgAhIHxMV0qZDgR/inUy8z5GUy6e5CfKilyLHnZeZ5ZjKZ1po/I99flu4dzSOaLclxMPac5vL/RjWgrjIVR3sEHEdHwDE7Ao4uAccUPPNEPM1YkI6JFQMXHSOLgXbAXzQXNGMxGTABqkLYHVL/Wbn2hXK+AfmvCtCZQP+G9bs0+ssJ6bkIbf1G2M0ETnuGMZeAuezBXAHmqgdzDZjrHswNYG4Ehn2XKLfWiWNTL0w7HgbOwrbzNLY3Vtgzpp0XRtifmaTvQWVNt5HJTNc/XKcWjAkNHytkLnTPwbIcZBzf6f56Djgtt1DGXOJ4Fxodr0Dfa7pPnKu+EJyGriPPFP5oK45JaPzBvspgj33OMZgiXsgKkLnQtjOjtQM7qIt55AL/ktYnNI/hGX5+qdgfC/st3sqe9Euh4AsFH7/pL+h+TlfMoQ+0d6hePOR9RltL032fLTwna4/MK8ZgbdTeXdQh62ji+rriM3GvlN/DK3W9zwWfmua4vniE763Yf+i5xiAzZtgmF/m8pTnm7ifBIVF98oe+B9wjupDE9iae8zPpWghf38VHcJqALFPw6CNLfpT4CWA45kuBR39r7zvbxPw7Mf3fPWu69SdT8E7oGim6Un4P9yHZSa4OuEr/GtP8wcL494Jnqv78KeiV/pubtLl7elaWf2t+aPyA8TXCfi7wH2k96znH+T/y3J36arfyO1/729v11ks/xTECPw1tf1tvvm3XtS+/V3H55j77Wk+BtSgO7kuwb0E81nPEf2Hs/vpK97KPRXsR9/MA7rE9gwvtPa2fwT6P8Wx7FrocWTYHGdbJOJ7QGv2FuphHLvA/aM0xwd6Mn18q9qfCfou3sif7vLmCnyv4GB/P+mjGsw/9u+rOptCPe5Ib507M698ci+qXgRYAAA==", + "debug_symbols": "ldTdioQgGAbge/HYA/PfbmVZhn5sEKLCamGJ7n112dkZJBjek/CrHrJPfQ/S+3a/38I0zCupPw4yzl2zhXlK1XFS0sYwjuF+e71NWL5I9fv+ujRTLtetiRupKyko8VOfRkokP4TRk1qx85MSqWFhYGHfCVMKhwolLoUxD2FcKSQsFCw0LAwsrrur7b+QpXCo0AwWFSw4LAQsJCwULDQs4BXU1yvoHoIzXgjDYFG9E+VONBwWAhYSFgoTZ6q+mhiadvR/gTvsU/eSv9v34osoXuLc+X6PPofyM49z062mFTNpIvlfuaPCpXGVn6RDbXkucqetoFalj6cJ/AA=", "file_map": { "50": { "source": "fn main(mut x: [u32; 5], idx: Field) {\n // We should not hit out of bounds here as we have a predicate\n // that should not be hit\n if idx as u32 < 3 {\n x[idx] = 10;\n }\n assert(x[4] == 111);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/regression_unsafe_no_predicates/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/regression_unsafe_no_predicates/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index f4140451b89..139be1dbef6 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/regression_unsafe_no_predicates/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/regression_unsafe_no_predicates/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -36,8 +36,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/71WwU7CQBCdlhYsxEAwfoS3QsES9YCKXE286qVC+I5+umzYDa+PMSLsMkmzhZ2+N/N2OtNIdhbZy1hi11gOzfnM7ZqfZyOPWHnIOKNAcTZEjuR3c3tfds3oebPf8phwRrw+8Wf5pMyU/DzGX2SAGQB/7PCTMPh5x+K81U18Id4W+fEz+NwSfJbgY+xamk0Acdwe1qp7/mp79WV/P7T3GeGFqB+Mybf+N0r8MeRm7LWWhs6+uB3+og6S26hnz+rJ4qWU361d29vr0d5rNRDRWYd61yLiE+IS4u9K0NoY8Xvl4mF9YtIuUWIdKHsX0nXCcaG5vRS4UU+2Fv3GuE2tvQAu+zEnnqnj7ytasE6henFEsSSyP2/tTGM51C6FPFP67w50eqf8tBrD/9yZDETvt6hPoDqacq2gub02cPN70aGcRU6rsQ/AZT8hDk1X9FvUu7Uvei9BLPxwjuSwD7g5oc0sY3O75mca56b1FORPyf9BmnGmlPPcU5xDyh+5cOb0ZD9rk9p/LOVsp5mxVr3XhOsM+VPyf7a/u0pOyRlxbspqtCmqTTWt1uvJqmLNjMWgE85znzWufRdeaD4Vp879EN+c+R9zXzuX/8591B/3kCdReAbKnus5PfFfm1VZzFbjyar8nhZVcX9SbWq5Yc9c1LtVm/vJEVjH1jljab0cubl3Ov9Pu4b+FtF6p+MyWv8AI64yvNERAAA=", - "debug_symbols": "tZfbaoQwEIbfJdde5DA5+SqlLK7GRRAVD4Uivnu1rFuJQhmWuRFG5vsmgfwXM7Mi3KfHrWrKdmDpx8zqNs/Gqm3Wal4Sdu+ruq4et+NvxrePdL/9Q5c1WzmMWT+y1IiEhaZgqfUrXVZ1YKnmS3JqlADPTqndsfUzYdKTqRWnUws6taRTKzo10Kk1ndrQqS2dmi6Nii6NQJdGoEsj0KUR3kyjMbva81gNdGpNpzZ0akundnRqT6bWb6bR72rFIVYLOvVlGl+AOAMKCwAW0FjAYAGLBMwlAHInQMmYcGji8mmC0DshVURYjiYEmpBoQqEJQBMaTRg0YbGEu7y5lntOtfQxAWji8uZavQhlY8KgCfvPqc6EQxMeS3iOI5a1+sr6KrvX4bmOlVOTH7az8bsL0aLW9W0eiqkP28r2t62JbbbhidHrQcQWIusTJ9YZ65wf", + "bytecode": "H4sIAAAAAAAA/71XbW7bMAyl/JHWLQYPHXaBncCukzo/iy0rsAG7wP55CXIOH30VIiLPz0ybNlIJBLItinx8eqYVJwdz4eetCGMmc1OfxzA2l1kbMVaTEqdLhHNCspPTpnO7MFa03s/nEQuuKG/M+Otm2VdGfRHxdxXETBD/XuMXaeI3VyHOz3EaXyhvTn68Btc9gc8T+Hj7JNMmgHF0DrWq66+ff7Ucr+/CdUXxUugHMcXm/4uBP4PavP0YZcJzrNwafzMmqa29DXu1CfFKqu9rGBe+xnBtacDRXqd61xzlE8ollP9Gkmqj5fdK8TA/GXFXGFg/G3NaUy0vazAh540jXAXUmBtYM6MOvfZW0rNvYfQ6/E3xeJ/5WUbcZQaexP15pXtaytx0bgG5ESNbTveI2/PzB+KyH+dErWj+Wk5rrKI6UulIsaCOSqPeTObcLaDOkp61wBPrCPWXG89YR87Ak1hHD6wVNJ27gtzcU66pZpH3aewvxGU/oRwWr+i3GQ9jLXPtswZ1XQH32EP1G2t97709hrG50Kx+J3K6/3I/+y5TnKjfmO/THdWPufB7fSvHc0oxxsfSrw+cecvHIyesM8xfkv+vcH9j1FRcgHPfD+2+G/bDatjtltuBOfOWAU+x8w99t97eL7f9v1U3dA+v5sez2Etni3PfMV1rnek/6MzWWb3onDObS4OnPZfX957Z+Azy1m8PzmnPO6UNKzb2zE1YX8t8j4szYsXs5Zibe6f6b8OY+j+11Ts1l+f6P1HFY9INEwAA", + "debug_symbols": "tZjRioMwEEX/Jc8+mMlMYvyVZVlsa4sgWqxdWEr/fXWp3ZLKLkO5L0JkzklguCHMxezqzfnw0XT7/mTKt4tp+201Nn03rS7XzGyGpm2bw8fjb5PPHyp+6k/HqpuXp7EaRlN6m5m625kyxIneN21tSsmv2VNh9LdCm/Nj5XtmKKLMLoeZLcxMMLODmRlmFpjZv2Qm5lslSZGqA05d4NQRpuYcp7Y4NeHUDqdmnFpwalwaGZdGxqWRcWkUXBrlxTT65b6mmKdqwqkdTs04teDUHqcOOPWLabw/FtzTY0EiTO1X0/jHw8VbLUBawGkB1gKiBMJqb5kWgh2lRNQSxWon2MpCkEsJqyZITTg1wWpC1IRXE0FNFFoirvZDaMmpUEwJUhOr/RB3J1xICVYT8s+pngmvJoKaKHTEdVp9VkNTbdr6Nl7Yn7vtw7Rh/DrWyeDhOPTbence6nkE8Tt9sHM2fZEFNx3Ezm0OnAU/7THt8w0=", "file_map": { "50": { "source": "fn main(x: u8, nest: bool) {\n if nest {\n let foo = unsafe_assert([x]);\n assert(foo != 0);\n }\n}\n\n#[no_predicates]\npub fn unsafe_assert(msg: [u8; N]) -> u8 {\n // Safety: testing context\n let block = unsafe { get_block(msg) };\n verify_block(msg, block);\n block[0]\n}\n\nunconstrained fn get_block(msg: [u8; N]) -> [u8; 2] {\n let mut block: [u8; 2] = [0; 2];\n block[0] = msg[0];\n block\n}\n\nfn verify_block(msg: [u8; N], block: [u8; 2]) {\n assert_eq(block[0], msg[0]);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/side_effects_constrain_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/side_effects_constrain_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index a604d4a3f4e..7fb949503a8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/side_effects_constrain_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/side_effects_constrain_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -29,8 +29,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81YzY7TMBB2mnjbJEJdwStw4pRu0qYX0CJ4CuDi7dIjEuIF8ugowtN8fB1lu1uPtL7Yydjf/Hj8ZZzMTS2LfUHPTplzH/vmurZJiNU4N2PwnGyIfRn7BcjzhM6WpDcl/r7ptqXiX0L72zJiWsZHMA3wm2XE+TpM+OyLg17m8ZpR/iaOMb9kzirKZbyO45LWWOy/4f407xT7F+Db2L4Mk8yl072pYyx/UCxFfzpdu47zMCH2aY+K9Ng7yUkP2BnF68aZ5EaXkT7n/j/HjvRXZGtqLslIn9jD8ZH8kdgtFVtvFRmeMZShnqWiR8PKE2JJXq0VO8Vva57NyJYC/ECdC/AH5/P58PTufexHPniANcwHufKOY+cVe4x5NHB8PNiqcSv7/yH2Y35+iuO1O48v73dh40/DZw33m3XKHjAX4Tn19E4qO22/kaNz5d3cfucUHyNu7JlbsIlsBbo9yUpFlilYOT2jTyP+T8DleWwP5pHY5kn2MfbG8Wvekp2oC88A5wSeK+ZrzZ/PgPmdfMMY3Sfyy66GOa+lE2LfSY4gR7/2OsOI+2brDIzPS+uMjMbX1AYWNYvxt/JU02J8pWmxZO5EXp37saFxp/j0XO7EPRPbPMm+xd76zqZxp+hCnqvd9J0phvS29Pt/dcLY8mGKCccd9XuaH+JzpfhUXGHnsQ+bYxuOYRseH7tD4Jg5iFltoD/07f5w1x36h20b2t2T+vEePMfFl3AlYt8qWHKflzw1uq81xt+N07+rpQ3+RqubJFajT7/gPcqwRsG1NyDH+X8A83ccr90578ge1iD3ilzW4b9DvouMjb8dlTIf69ScbEMeri7AWszorpX51YxutAvX4jqv2FmS3pVij1ew+BwxLq5DH3D/JU8vzau/l/W8cMkXAAA=", - "debug_symbols": "ndjRioJAFMbxd5lrL+bMcebM9CrLElYWgliYLSzRu69WpsxOxOdNYPhjzH/qOFe1KzeXw7pq9sezWn1dVX3cFl11bPqt6y1Tm7aq6+qwnn+t9PBB7r7/+VQ0w+a5K9pOrULIVNns1Iq06fm+qku1svr2nSkSFHgUBBAYjQJCgUEBoyBHgUUBWtqgpQ1a2qClGS3NaGlGSzNamtHSjJZmtDSjpTlZmhyNwkksAiryZAmjx6MyFB9VzrDIYWFh4WAhsPCwCKiwyWuPvH0JjgXBwsCCYZHDwsLCwUJg4WERUOHg5i591Xo9Cu9ikTy7bPKnYGNj4WAhsPCwCKgQDQuChYEFwyKHBdxc4OYCNxe4uaSb60nE/3avYUGwMLBgWOSwsLBwsBBYeFjAzfv5E04YJ3ASovT9PchrWhY8Tehh0k/cENx4i9fzgR7GLhjnzbxJT+PMnz4PIwuMX2DezJ5IpnNgI5N+S/1gaIExn3/PvE/2b18Rfu4qPi5pFtRPv9t+MBY0t37jp2irYlOXz1WP/aXZzhZBut9TGa2HnNrjttxd2nJYGZktigypgsmC3GMPGz4jrftB+oH+AA==", + "bytecode": "H4sIAAAAAAAA/81YS27bMBClLDG2JBQ22ht01aUcyZa7C9CeoO2mBbpQHbi7AkUvoKMXQjjWy/NEcWJOEG5Ia8g3Hw4fh07c2JLQZ/TbKXNuQl9d1tYRsSrnJgyekvWhz0M/A3ka0dmc9MbE31XNJlf8i2h/nQdMy/gIpgF+NQ84n/sRn31x0Ms8XjPI34Qx5pfMWQS5jJdhnNMai/033J/qnWL/DHwb2qd+lLl4utdliOU3iqXoj6dr23AeRsQ+7lEWH3srOekBO6F4XTmT3GgS0ufc/XPsSH9BtsbmkoT0iT0cH8kfid1csXWlyPCMoQz1zBU9GlYaEUvyypgLuoRs92Crxg+e5r8P/RDjbRgvlXh48iez8afifMnAH9Ype8DnCXPN07cPoR847AesYZ5JlW+833xmMD5G57vl84FNZAvQ7UmWK7JEwUrpN/o04P8EXJ7H9mAeiW2ch5vQG8evekt2oi48A1PnijlH8+cjYH4l3zBGN5H8sruHT+vBiNjXkiN4D7/2u9KI+ybvSozPc+/KhMaX3G8W967xXXmsyzC+0rRYMncir049zjXuFJ+eyp24Z2KbJ9mX0Fu/OzTuFF3Ic6Ub75msj29Lu7urE4aW9mNMOO6o39P87+F3ofiUXWDnoe3Wh7o7dJvu9rbZdxwzBzErDfR3bb3bXzf79tem7urto/rxLTfFxedwJWKvFCx5k0p9ifXHC3F+xXyF9SXq9OAP8wLymqdvv0Ov1Zf43pl6A63c6dnn+tvovXasI+Y2+Mf/rhY2+Gut5pRYDfv754E9wfoO1zLnyvx/gPk3jJfudN8k/0un531G9uB/h/yOGxrfu4UyH2v8lGzDHC/OwJpN6C6V+cWEbrQL1+I6r9iZk94rxR6vYDEHMe5DZ1J7r5ybV/8BQKCk68kXAAA=", + "debug_symbols": "ndjtioJAFMbxe5nPfjjnzOvpVpYlrCwEsbBaWKJ7X3sXM5ZnvgQT/hj1rzjMyayqxXEzr9v1dm9mXyfTbJflod62/eh0Lsyiq5um3syHfxu6/HC4Hr/fle1luD+U3cHMVAtTtSszY5Ker+umMjNP5+/CcERBQoGCQAgFjAJBgUWBQ4FHAVpa0NKClha0tJ0szYEfIsSxYFhMlhB6nJXw21l5WARYRFgkWCgqHMGCYTH57nHyT2HHwsLCwcLDIsAiwiLBQlHhCRYMC7i5n35rEz1ECmMxeXetuLuw4sciwUJREQgWDAuBhYWFg4WHRYAF3DzAzQPcPMLN43Rzeonx0x4FFhYWDhYeFgEWERYJFoqKRLCAmyvcQ+EeCvfQ6a+axueSTBO/zJUknChMmCjDcIaRDGMzjMMNZ9wD/nBuGh4fXxo+BTfjM+b5sGqm1zzDdcHNxAyTMsyHtTPH1z3wIyOUYTjDyP/XM+xTvB0bo70fGtO4pGTUF5dhPGjO/eCn7Opy0VT3fZD1sV0OtkUOv7tqtEOy67bLanXsqsteyWCb5JIquSLpNXY/UCpU+jn6ef4A", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/side_effects_constrain_array/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/side_effects_constrain_array/execute__tests__force_brillig_true_inliner_0.snap index a604d4a3f4e..7fb949503a8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/side_effects_constrain_array/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/side_effects_constrain_array/execute__tests__force_brillig_true_inliner_0.snap @@ -29,8 +29,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81YzY7TMBB2mnjbJEJdwStw4pRu0qYX0CJ4CuDi7dIjEuIF8ugowtN8fB1lu1uPtL7Yydjf/Hj8ZZzMTS2LfUHPTplzH/vmurZJiNU4N2PwnGyIfRn7BcjzhM6WpDcl/r7ptqXiX0L72zJiWsZHMA3wm2XE+TpM+OyLg17m8ZpR/iaOMb9kzirKZbyO45LWWOy/4f407xT7F+Db2L4Mk8yl072pYyx/UCxFfzpdu47zMCH2aY+K9Ng7yUkP2BnF68aZ5EaXkT7n/j/HjvRXZGtqLslIn9jD8ZH8kdgtFVtvFRmeMZShnqWiR8PKE2JJXq0VO8Vva57NyJYC/ECdC/AH5/P58PTufexHPniANcwHufKOY+cVe4x5NHB8PNiqcSv7/yH2Y35+iuO1O48v73dh40/DZw33m3XKHjAX4Tn19E4qO22/kaNz5d3cfucUHyNu7JlbsIlsBbo9yUpFlilYOT2jTyP+T8DleWwP5pHY5kn2MfbG8Wvekp2oC88A5wSeK+ZrzZ/PgPmdfMMY3Sfyy66GOa+lE2LfSY4gR7/2OsOI+2brDIzPS+uMjMbX1AYWNYvxt/JU02J8pWmxZO5EXp37saFxp/j0XO7EPRPbPMm+xd76zqZxp+hCnqvd9J0phvS29Pt/dcLY8mGKCccd9XuaH+JzpfhUXGHnsQ+bYxuOYRseH7tD4Jg5iFltoD/07f5w1x36h20b2t2T+vEePMfFl3AlYt8qWHKflzw1uq81xt+N07+rpQ3+RqubJFajT7/gPcqwRsG1NyDH+X8A83ccr90578ge1iD3ilzW4b9DvouMjb8dlTIf69ScbEMeri7AWszorpX51YxutAvX4jqv2FmS3pVij1ew+BwxLq5DH3D/JU8vzau/l/W8cMkXAAA=", - "debug_symbols": "ndjRioJAFMbxd5lrL+bMcebM9CrLElYWgliYLSzRu69WpsxOxOdNYPhjzH/qOFe1KzeXw7pq9sezWn1dVX3cFl11bPqt6y1Tm7aq6+qwnn+t9PBB7r7/+VQ0w+a5K9pOrULIVNns1Iq06fm+qku1svr2nSkSFHgUBBAYjQJCgUEBoyBHgUUBWtqgpQ1a2qClGS3NaGlGSzNamtHSjJZmtDSjpTlZmhyNwkksAiryZAmjx6MyFB9VzrDIYWFh4WAhsPCwCKiwyWuPvH0JjgXBwsCCYZHDwsLCwUJg4WERUOHg5i591Xo9Cu9ikTy7bPKnYGNj4WAhsPCwCKgQDQuChYEFwyKHBdxc4OYCNxe4uaSb60nE/3avYUGwMLBgWOSwsLBwsBBYeFjAzfv5E04YJ3ASovT9PchrWhY8Tehh0k/cENx4i9fzgR7GLhjnzbxJT+PMnz4PIwuMX2DezJ5IpnNgI5N+S/1gaIExn3/PvE/2b18Rfu4qPi5pFtRPv9t+MBY0t37jp2irYlOXz1WP/aXZzhZBut9TGa2HnNrjttxd2nJYGZktigypgsmC3GMPGz4jrftB+oH+AA==", + "bytecode": "H4sIAAAAAAAA/81YS27bMBClLDG2JBQ22ht01aUcyZa7C9CeoO2mBbpQHbi7AkUvoKMXQjjWy/NEcWJOEG5Ia8g3Hw4fh07c2JLQZ/TbKXNuQl9d1tYRsSrnJgyekvWhz0M/A3ka0dmc9MbE31XNJlf8i2h/nQdMy/gIpgF+NQ84n/sRn31x0Ms8XjPI34Qx5pfMWQS5jJdhnNMai/033J/qnWL/DHwb2qd+lLl4utdliOU3iqXoj6dr23AeRsQ+7lEWH3srOekBO6F4XTmT3GgS0ufc/XPsSH9BtsbmkoT0iT0cH8kfid1csXWlyPCMoQz1zBU9GlYaEUvyypgLuoRs92Crxg+e5r8P/RDjbRgvlXh48iez8afifMnAH9Ype8DnCXPN07cPoR847AesYZ5JlW+833xmMD5G57vl84FNZAvQ7UmWK7JEwUrpN/o04P8EXJ7H9mAeiW2ch5vQG8evekt2oi48A1PnijlH8+cjYH4l3zBGN5H8sruHT+vBiNjXkiN4D7/2u9KI+ybvSozPc+/KhMaX3G8W967xXXmsyzC+0rRYMncir049zjXuFJ+eyp24Z2KbJ9mX0Fu/OzTuFF3Ic6Ub75msj29Lu7urE4aW9mNMOO6o39P87+F3ofiUXWDnoe3Wh7o7dJvu9rbZdxwzBzErDfR3bb3bXzf79tem7urto/rxLTfFxedwJWKvFCx5k0p9ifXHC3F+xXyF9SXq9OAP8wLymqdvv0Ov1Zf43pl6A63c6dnn+tvovXasI+Y2+Mf/rhY2+Gut5pRYDfv754E9wfoO1zLnyvx/gPk3jJfudN8k/0un531G9uB/h/yOGxrfu4UyH2v8lGzDHC/OwJpN6C6V+cWEbrQL1+I6r9iZk94rxR6vYDEHMe5DZ1J7r5ybV/8BQKCk68kXAAA=", + "debug_symbols": "ndjtioJAFMbxe5nPfjjnzOvpVpYlrCwEsbBaWKJ7X3sXM5ZnvgQT/hj1rzjMyayqxXEzr9v1dm9mXyfTbJflod62/eh0Lsyiq5um3syHfxu6/HC4Hr/fle1luD+U3cHMVAtTtSszY5Ker+umMjNP5+/CcERBQoGCQAgFjAJBgUWBQ4FHAVpa0NKClha0tJ0szYEfIsSxYFhMlhB6nJXw21l5WARYRFgkWCgqHMGCYTH57nHyT2HHwsLCwcLDIsAiwiLBQlHhCRYMC7i5n35rEz1ECmMxeXetuLuw4sciwUJREQgWDAuBhYWFg4WHRYAF3DzAzQPcPMLN43Rzeonx0x4FFhYWDhYeFgEWERYJFoqKRLCAmyvcQ+EeCvfQ6a+axueSTBO/zJUknChMmCjDcIaRDGMzjMMNZ9wD/nBuGh4fXxo+BTfjM+b5sGqm1zzDdcHNxAyTMsyHtTPH1z3wIyOUYTjDyP/XM+xTvB0bo70fGtO4pGTUF5dhPGjO/eCn7Opy0VT3fZD1sV0OtkUOv7tqtEOy67bLanXsqsteyWCb5JIquSLpNXY/UCpU+jn6ef4A", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/simple_2d_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/simple_2d_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index e536095b60d..8028aa363e5 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/simple_2d_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/simple_2d_array/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -49,8 +49,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1ZvY7TQBAe/2xy9hElghex41wSCtAhAgUlFSW+nFJTU7mEBiRegFeFvewkX8YTJ6d4ipNupWhs7+588/Otd9aJaNvc/18UrtMgE2o3HnMbZHFZK3vUVVjaGfVoZwQxtrI3Nohr3zYmT8DG9AnY6MhmDdFAENSTKgnkdXS8sYN/g8yCjKG/x+SXmcDtU/+ymN1lin892l9lQWdqo3/O+p2N/mIY9Hxo9vrRF8YdhfsIYslzuC+Gvo+hLwObDfK7MI7PdCRiQhADxh7YYFeRwCMRRxL4OZlysYwEHtsj4xOL+FzZ2FOw/sxIP/ubK/5iHq6Evy9s7Nlx8RrskVwc2WCfzUXGz4WtVlwcUTs3GB/mIo9Lmr09uehLm7YfLB30cX593ivwD/vQHnw/MFcn1OYK2228bqbG66Z8Xje79rxuoM963XCeMb4pYL6F63fhOgMbiGzqT6yN+t6jXin2I5Zvw4YOYvsg4RnniHN2heNFXwZ9aXOIk4f7FHBQF9vhxPg34X4c5ADm8PyJgj8Q+Ad2K89kXDJlfKaM9zych2vPNebi+2avz+JMtLLRP/U++DXwE+KBNTTHA9cS+jum4+eEMbXrcR5nXC/v6jU+06Skv0vYtliMx2ui/Yc1fvYpSB+73zDnWOzwGXNp0hE7aT/qwvpa5sEdsR/v3REszc/PQVrX7y9BLwmsMbXfa5JHVmfiLh5p8Xssj74EqfEognmJ8qyLR5G4PsWjVbOVWqwlj1Lhi7bfODH2a5AZteNjzaOhwMYY9oRbad89ZF1pdBY/u65k/JxM65BdXZkKe2R8sK6UnOC5E6XvHG4PFZwuXRrv5bcLo/x1vmO0Nf3Yd8y3IPt4x8SKPV15wJph1Wxl1ztmLObhOOt3B2PxvoN5kJgcGxyP17458ex7kFoekhOxk3mIFHuM9+jXvE7ld3TfuC8HbLm+r4XPRIdcQ/+xoU9e/gG9cpy0B3nEtmnnPN9ugywua6UT2D8ErtX5T9v7GAvPKmnTP/5iuV0/vvE50ZH+53MK/Tj+V7hHDrG85A+8zaIuN1W9qW/q+/vZupZxIhGnvvHrRbVcT2frxd1NVVfzk/jaeUzbS3G+PAdo3z14jnY+iTt0aecTee/OwD3lw6o534dTtYXUFSm6iPSaVdt75H6Ja9gpunwe/wFqG1VRlSEAAA==", - "debug_symbols": "tdjtaoMwFAbge8lvf+Tk5LO3MsawrS2C2GLtYBTvfbGrq0sD8gr7Ix7J49crJJ6b2Ffb6/Gjbg+ni9i83URz2pV9fWpjdRsKse3qpqmPH/PDQo4ba+/jL+eyHctLX3a92BDpQlTtPu4pH/2hbiqxMXJ4L4R1sPCwCKhwEhYECwULhoWGhYHFUuZMqXCwWMqcbSoCKryEBcEin7mRk7A6FQwLDQsDCwsLBwsPi4CKIJeESwXBYilzp1LBsNCwMLDIZq5IPYQiToWDhYdFQAVJiRPCicIJ40TjxOAkHz3TRNi9EIcTj5MAE5I4IZwonDBO8ulzmIh5iZIMTixOHE48TgJMlMQJ4UThhHGiFz6YDDE4sThxOPE4CTBhiRPCicIJ4wRPn/H0dT5KKe1k5Hy6+DF+hcmHKcn9GmUSY+QKQ8v3Nlu0D8XLWOf4MdR5m55d4U9ueIXRK57crDD2X99W/pcghOfZ1R8zxOKz7Opy21SPVsTh2u5mnYn+61wlTYpzd9pV+2tXje2KZ6difOuGCkv3ZUQsiF1BWt3nlbHUHEsTrxmv+w0=", + "bytecode": "H4sIAAAAAAAA/+1ZTW/TQBAdx3ZSu0SJ4I8kcduUA6iIwIEjJ464rXrmzMlHuIDEjV/A34QlO8nL88RJVc+hUleKxvbuznvzsevZOJF1y//9knidRZlKu+mYqyhnD2vzHnXNPHkmPfJMwMdefAcOfu2bY/oIOGaPgGMuPmtIhpSgIanSmLy57G9q4J8oiygH0N9j8OcF4fap/3J2dl0Y9vXIvyqizsxH/4Xqz330z0ZRz7tmqx9tUdxxvE/AlzpH+wbQ9z72FcDZIb5LZ/8sxuQTAR8o9tAHu0oIT8iPQviluObiPCE85cP+GZB/Tnz4zFR/4aRf7S0NezEOJ2TvMx8+m1w8BT6ci2Mf7KNzUfFL4uqVi2Npxwb9o7mo49Jmy6ekvqxp26Eyhz6Nb4h7BfZhH/LB/UFzdSrtXFHezutm4bxu5k/rZtOe1g30ea8bjTP6NwPM13D9Jl4XwEHEp/7E2qjvd9QLgz9ihTZqZMe3/yU80xhpzE5wPPUV0Jc1uzhlvM8AB3Upj5zGv4r3kyiHMEfnTw38IeHv8DaesV8KY3xhjA95eBGvQ65pLr5ttvo8zkQrH/2LYENYA9/BH1hDqz9wLaG9E9l/TphIux7Xcc718qZe0zNNJvZeotwGNB6vRbZ/rOmzD1EG3/2EOft8h880l6YdvmP+qAvra45Dvoc/3ud7sCw7P0bpXb8/B71CWBNp72ucR15n4q48svx33zz6FKWVRwnMS41nXXmU0PWhPFo1a2n5mvMoI1us901OYz9HWUjbP955NCJs9GFPuJX1vwfXlU5n8aPrSsUvxbUO2dSVGfFh/2BdyTmhc6dG3zG5PTJwunRZec//XTjFr3OPsdb0ffeYL1H2sccMDD5dccCaYdWsZdceM6F5OM5771Asfe9gHBhTfYPj8Tq0nJ59jdKKQ3rAdxyHxODj/I5+qeuU/0cPTftKwOb1fUo2i+zmGtqPDW0K8hfo5XHMB/NIuVnnvNCuopw9rM1zwv5GuF7nP+vdp1h4Vsma/vGXl+v1E5qeE3OxPz5n0I/jf8R7zCGVD/mAd7es53dVfVef17e3Zzc1+0nIT33j18vq8mZxdrO8Pq/q6uIgPp7HjtkPvd9LGqd97yXeD7EuxnMPnzt+R+m1HzJ/1IW+5zNUavDXOdb3jkGHLpzP32H1Pj8C95ANq+Z4G/IDNrCuxNAlNM+yIaFrrF/0+dDQFdbAX+IyjLrRIgAA", + "debug_symbols": "tdjfiqswEAbwd8m1F5lMkkn6KofDYlu7CGKLbQ8cSt99tVt33TQgX2BvxJH8/PcpxrmpfbO9vr+1/eF4Vps/N9Udd/WlPfZjdbtXaju0Xde+vy03Kz0tvH+MP5/qfirPl3q4qA2RrVTT78c1E0Z/aLtGbZy+/62UF1gEWERUiIYFwcLAgmFhYeFgsZY5UyoEFmuZs09FREXQsCBY5DN3ehbepoJhYWHhYOFhIbAIsIioiHpNSCoIFmuZi0kFw8LCwsEim7kh8xSGOBUCiwCLiArSGieEE4MTxonFicNJPnqmmbC8EMFJwEmECWmcEE4MThgn+fQ5zsS9REkOJx4ngpOAkwgTo3FCODE4YZzYlQcmQxxOPE4EJwEnESascUI4MThhnODpM56+zU/bosyGYlhM1j9NKDARN04XGCowpsBwgbEFJh+p1n7OVC8/55/GF5j8K61JvoxxqQkFJq6f2+Kn6l69jBXh51AJPtm71/iVeyowBr9yzwXG/urdyv8ixPi9d/PD3MfiXz209bZrnq2iw7XfLTpHl/+nJmkinYbjrtlfh2ZqJ313kqa74ajy9JjmjQWxVGTN47s/lZbH0o3HHI/7AQ==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/simple_radix/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/simple_radix/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index ff7dc371a90..15eef60547a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/simple_radix/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/simple_radix/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -17,18 +17,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/91XTU/CQBCd0hZY0IB69uZND/3CcvRgPHjwF2hihfA7+tOlusNOHgOo7GriJqS73embN2/2Y4jItcg+ExiTYnNnn9lxLfeIlalE9zW2ebVPY589MR97DNaAX5/486yaGSU+j/xLYzFD6sOYAfCzgcW5bx0+xtK1UzuWa4i/Ga5/J+T6p7Zv4JsQuQ2ofXah8GdfYxvrDcQaKE8V688HkWw8lwrfkjO2GMaSdxdTIXDRDn1K7VPQIkTe1y2PFC1ihQ/7n9B2bpI9XMkf1wy5JqAJck3B/hJ4pmE0zc4hfi2fgdZ2EYE/Ij2f7H8CGh3iSv645pifq/+fn9JnfiL4TtokYEPk9gPbX/9OzKre7GtMri5KWv/+6/nnufGhc+t0wHNb+k/BPrfjkRJHcgTPVd3kq7JZNbNmuawWDerUtT+6IwtD2+uI/OHneOdJH4H3f6Xd57GSW/Y/orB16VfOBBJ91qcfhk95tsaYkl53kJIbyQNrgUEgjlxP8R6VnHguEXPMo9tDj7Y/od01aegzUatlYtpdy/Roez/Kmg3v0gcR7wvg4brHd6zBlHbXgfgfRtrJM73fUgj9is2d1ro4WLekdbGwf14TQzHHdszVhOG6uX9GFl/eP0bw4Vh6YI/9FN49k+MtY5RrScbdA/uxmGP7WLxjjhM77ou5cfs9rCFgDY7AYl5TxX7wQ14aVh+wjIIl37G+3bn4xHjkv35o6nK+KKpF/TYrm/L2YP3wDuFt6cONEwAA", - "debug_symbols": "ndbbioMwEAbgd8m1FzlOEl9lWYptYxFExcPCIr77JoulEgSZuRGi/8cI/sis7Bnuy+vWdHU/sfJrZW3/qOam7+Jp3Qp2H5u2bV63423G00Xo//w0VF06TnM1zqy0vmChe7LSi6jrpg2sNHz7LpgwyDwg8xaZd8i8x+UlR+bFWV5w2IEQKhcSLRRa6CvhcmHQAtDCooVDi9PvLZR8C+UzoThaCLSQF0LrXCi00Ghh0OL8mxv3FmByYdHCoYW/EJZnQnO0EGghscKczpAOzE6kc5//T6x+MpJgFMFogjEEAwRjCcYRjMcb4ARD6AEQegCEHgChB0DoARB6AIQeAKEHQOiBJfTAonuwxdNPNTbVvQ37Klgv3eOwGc6/Q8iWxGHsH+G5jCGti4dNMQ63uvAybVHp7bUutE+H9MSrwps4L878Aw==", + "bytecode": "H4sIAAAAAAAA/91WQU7DMBDcJG5SN1Qt8ARunJymVXvgwIETvCKi6jvydJqyi1cTqwJic8BS5TjezM7MZt1k5EfGs4E1BWKeeXbTRhMRywWJXhsS88az5TlX+0VEsRbyxsQ/uO3OBvRF5N9axkzpj2AmwHcV47z0Hh+1DGPJa/0OyTPz8++G/PWSry08k6K2Cb139wH+kqtmrRvQmqhOG8HHgygSfrMEfTqH5J6l0bbNIB+BjwT5F5S25zLIJ3zQnxz8KdPwaW/PGGsK9xIFaqN5GOBYJeIoPV/0Y06yZ9Se8Bh66AAcU5wXTtVVPCEa11XnX9HYZ3OFK8Xj6pCrAU+Q6wziH4Bnot51d6Bf50p9Jn6nT3X+FY3P0GtcKR7XBuvz+P/r08asTwbP6RgDMUS+HyS++RvNQb8lV03+e9r08fPvD5/nxsXn3vsg+fUwal/H73m9COgwE3ie9l1zartTt+uOx+17hz4NIw/4VPbxfXJ8dlz0M35B3ifxRueX/7B5P/ZQuNo0XL9qumB8XVOr+IiWHOLxegb3Xsnz1hr1u6t15xBfqz2JL9Q94bjidan26v5nWHPAqiZgCa91IL76Ja8QVglYNoCl74m/w3fck+Cdfx+jC3g5mRAAAA==", + "debug_symbols": "tdbLaoUwEAbgd8naRe4XX6WUg0fjISAqXgpFfPcmxUMlFWQWsxEi8/2zMIOzkcY/19cj9O0wk/JjI91QV0sY+nja9oI8p9B14fU4vyY0PZj8rZ/Hqk/HeammhZTGFcT3DSkdi7oNnSelonvxr5BbrY5Sbu1fMbP7Z0GYwgzXmOEGM9xihjvEcE4xwxlmOMcMF5jhmBPKMSeUY04ov5xQRvVBGBPn+CQsWDioEPRO2FwwsOBgIcBCgsXlTWKCv4VwudBgYcDC3ggpc+GgQlKwYGBx/c2VfQutciHAQoKFuhGG5kKDhQELCxN7PH1VU6ienT/2pXbt69P6tHyPPtukxmmofbNOPu1Up3Uqtla6MDL9idO9ULRQKraIbX4A", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 0d170268de8..84951673c90 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -75,8 +75,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_0.snap index 4d4f237f896..f217a1667b4 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_0.snap @@ -75,8 +75,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 12dbfa93cea..11a59df3c14 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/simple_shield/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -75,8 +75,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "16": { "source": "use crate::cmp::Eq;\nuse crate::hash::Hash;\nuse crate::ops::arith::{Add, Neg, Sub};\n\n/// A point on the embedded elliptic curve\n/// By definition, the base field of the embedded curve is the scalar field of the proof system curve, i.e the Noir Field.\n/// x and y denotes the Weierstrass coordinates of the point, if is_infinite is false.\npub struct EmbeddedCurvePoint {\n pub x: Field,\n pub y: Field,\n pub is_infinite: bool,\n}\n\nimpl EmbeddedCurvePoint {\n /// Elliptic curve point doubling operation\n /// returns the doubled point of a point P, i.e P+P\n pub fn double(self) -> EmbeddedCurvePoint {\n embedded_curve_add(self, self)\n }\n\n /// Returns the null element of the curve; 'the point at infinity'\n pub fn point_at_infinity() -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true }\n }\n\n /// Returns the curve's generator point.\n pub fn generator() -> EmbeddedCurvePoint {\n // Generator point for the grumpkin curve (y^2 = x^3 - 17)\n EmbeddedCurvePoint {\n x: 1,\n y: 17631683881184975370165255887551781615748388533673675138860, // sqrt(-16)\n is_infinite: false,\n }\n }\n}\n\nimpl Add for EmbeddedCurvePoint {\n /// Adds two points P+Q, using the curve addition formula, and also handles point at infinity\n fn add(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n embedded_curve_add(self, other)\n }\n}\n\nimpl Sub for EmbeddedCurvePoint {\n /// Points subtraction operation, using addition and negation\n fn sub(self, other: EmbeddedCurvePoint) -> EmbeddedCurvePoint {\n self + other.neg()\n }\n}\n\nimpl Neg for EmbeddedCurvePoint {\n /// Negates a point P, i.e returns -P, by negating the y coordinate.\n /// If the point is at infinity, then the result is also at infinity.\n fn neg(self) -> EmbeddedCurvePoint {\n EmbeddedCurvePoint { x: self.x, y: -self.y, is_infinite: self.is_infinite }\n }\n}\n\nimpl Eq for EmbeddedCurvePoint {\n /// Checks whether two points are equal\n fn eq(self: Self, b: EmbeddedCurvePoint) -> bool {\n (self.is_infinite & b.is_infinite)\n | ((self.is_infinite == b.is_infinite) & (self.x == b.x) & (self.y == b.y))\n }\n}\n\nimpl Hash for EmbeddedCurvePoint {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n if self.is_infinite {\n self.is_infinite.hash(state);\n } else {\n self.x.hash(state);\n self.y.hash(state);\n }\n }\n}\n\n/// Scalar for the embedded curve represented as low and high limbs\n/// By definition, the scalar field of the embedded curve is base field of the proving system curve.\n/// It may not fit into a Field element, so it is represented with two Field elements; its low and high limbs.\npub struct EmbeddedCurveScalar {\n pub lo: Field,\n pub hi: Field,\n}\n\nimpl EmbeddedCurveScalar {\n pub fn new(lo: Field, hi: Field) -> Self {\n EmbeddedCurveScalar { lo, hi }\n }\n\n #[field(bn254)]\n pub fn from_field(scalar: Field) -> EmbeddedCurveScalar {\n let (a, b) = crate::field::bn254::decompose(scalar);\n EmbeddedCurveScalar { lo: a, hi: b }\n }\n\n //Bytes to scalar: take the first (after the specified offset) 16 bytes of the input as the lo value, and the next 16 bytes as the hi value\n #[field(bn254)]\n pub(crate) fn from_bytes(bytes: [u8; 64], offset: u32) -> EmbeddedCurveScalar {\n let mut v = 1;\n let mut lo = 0 as Field;\n let mut hi = 0 as Field;\n for i in 0..16 {\n lo = lo + (bytes[offset + 31 - i] as Field) * v;\n hi = hi + (bytes[offset + 15 - i] as Field) * v;\n v = v * 256;\n }\n let sig_s = crate::embedded_curve_ops::EmbeddedCurveScalar { lo, hi };\n sig_s\n }\n}\n\nimpl Eq for EmbeddedCurveScalar {\n fn eq(self, other: Self) -> bool {\n (other.hi == self.hi) & (other.lo == self.lo)\n }\n}\n\nimpl Hash for EmbeddedCurveScalar {\n fn hash(self, state: &mut H)\n where\n H: crate::hash::Hasher,\n {\n self.hi.hash(state);\n self.lo.hash(state);\n }\n}\n\n// Computes a multi scalar multiplication over the embedded curve.\n// For bn254, We have Grumpkin and Baby JubJub.\n// For bls12-381, we have JubJub and Bandersnatch.\n//\n// The embedded curve being used is decided by the\n// underlying proof system.\n// docs:start:multi_scalar_mul\npub fn multi_scalar_mul(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> EmbeddedCurvePoint\n// docs:end:multi_scalar_mul\n{\n multi_scalar_mul_array_return(points, scalars)[0]\n}\n\n#[foreign(multi_scalar_mul)]\npub(crate) fn multi_scalar_mul_array_return(\n points: [EmbeddedCurvePoint; N],\n scalars: [EmbeddedCurveScalar; N],\n) -> [EmbeddedCurvePoint; 1] {}\n\n// docs:start:fixed_base_scalar_mul\npub fn fixed_base_scalar_mul(scalar: EmbeddedCurveScalar) -> EmbeddedCurvePoint\n// docs:end:fixed_base_scalar_mul\n{\n multi_scalar_mul([EmbeddedCurvePoint::generator()], [scalar])\n}\n\n/// This function only assumes that the points are on the curve\n/// It handles corner cases around the infinity point causing some overhead compared to embedded_curve_add_not_nul and embedded_curve_add_unsafe\n// docs:start:embedded_curve_add\npub fn embedded_curve_add(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n // docs:end:embedded_curve_add\n if crate::runtime::is_unconstrained() {\n // `embedded_curve_add_unsafe` requires the inputs not to be the infinity point, so we check it here.\n // This is because `embedded_curve_add_unsafe` uses the `embedded_curve_add` opcode.\n // For efficiency, the backend does not check the inputs for the infinity point, but it assumes that they are not the infinity point\n // so that it can apply the ec addition formula directly.\n if point1.is_infinite {\n point2\n } else if point2.is_infinite {\n point1\n } else {\n embedded_curve_add_unsafe(point1, point2)\n }\n } else {\n // In a constrained context, we also need to check the inputs are not the infinity point because we also use `embedded_curve_add_unsafe`\n // However we also need to identify the case where the two inputs are the same, because then\n // the addition formula does not work and we need to use the doubling formula instead.\n // In unconstrained context, we can check directly if the input values are the same when solving the opcode, so it is not an issue.\n\n // x_coordinates_match is true if both abscissae are the same\n let x_coordinates_match = point1.x == point2.x;\n // y_coordinates_match is true if both ordinates are the same\n let y_coordinates_match = point1.y == point2.y;\n // double_predicate is true if both abscissae and ordinates are the same\n let double_predicate = (x_coordinates_match & y_coordinates_match);\n // If the abscissae are the same, but not the ordinates, then one point is the opposite of the other\n let infinity_predicate = (x_coordinates_match & !y_coordinates_match);\n let point1_1 = EmbeddedCurvePoint {\n x: point1.x + (x_coordinates_match as Field),\n y: point1.y,\n is_infinite: x_coordinates_match,\n };\n // point1_1 is guaranteed to have a different abscissa than point2:\n // - if x_coordinates_match is 0, that means point1.x != point2.x, and point1_1.x = point1.x + 0\n // - if x_coordinates_match is 1, that means point1.x = point2.x, but point1_1.x = point1.x + 1 in this case\n // Because the abscissa is different, the addition formula is guaranteed to succeed, so we can safely use `embedded_curve_add_unsafe`\n // Note that this computation may be garbage: if x_coordinates_match is 1, or if one of the input is the point at infinity.\n let mut result = embedded_curve_add_unsafe(point1_1, point2);\n\n // `embedded_curve_add_unsafe` is doing a doubling if the input is the same variable, because in this case it is guaranteed (at 'compile time') that the input is the same.\n let double = embedded_curve_add_unsafe(point1, point1);\n // `embedded_curve_add_unsafe` would not perform doubling, even if the inputs point1 and point2 are the same, because it cannot know this without adding some logic (and some constraints)\n // However we did this logic when we computed `double_predicate`, so we set the result to 2*point1 if point1 and point2 are the same\n result = if double_predicate { double } else { result };\n\n // Same logic as above for unconstrained context, we set the proper result when one of the inputs is the infinity point\n if point1.is_infinite {\n result = point2;\n }\n if point2.is_infinite {\n result = point1;\n }\n\n // Finally, we set the is_infinity flag of the result:\n // Opposite points should sum into the infinity point, however, if one of them is point at infinity, their coordinates are not meaningful\n // so we should not use the fact that the inputs are opposite in this case:\n let mut result_is_infinity =\n infinity_predicate & (!point1.is_infinite & !point2.is_infinite);\n // However, if both of them are at infinity, then the result is also at infinity\n result.is_infinite = result_is_infinity | (point1.is_infinite & point2.is_infinite);\n result\n }\n}\n\n#[foreign(embedded_curve_add)]\nfn embedded_curve_add_array_return(\n _point1: EmbeddedCurvePoint,\n _point2: EmbeddedCurvePoint,\n) -> [EmbeddedCurvePoint; 1] {}\n\n/// This function assumes that:\n/// The points are on the curve, and\n/// The points don't share an x-coordinate, and\n/// Neither point is the infinity point.\n/// If it is used with correct input, the function ensures the correct non-zero result is returned.\n/// Except for points on the curve, the other assumptions are checked by the function. It will cause assertion failure if they are not respected.\npub fn embedded_curve_add_not_nul(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n assert(point1.x != point2.x);\n assert(!point1.is_infinite);\n assert(!point2.is_infinite);\n embedded_curve_add_unsafe(point1, point2)\n}\n\n/// Unsafe ec addition\n/// If the inputs are the same, it will perform a doubling, but only if point1 and point2 are the same variable.\n/// If they have the same value but are different variables, the result will be incorrect because in this case\n/// it assumes (but does not check) that the points' x-coordinates are not equal.\n/// It also assumes neither point is the infinity point.\npub fn embedded_curve_add_unsafe(\n point1: EmbeddedCurvePoint,\n point2: EmbeddedCurvePoint,\n) -> EmbeddedCurvePoint {\n embedded_curve_add_array_return(point1, point2)[0]\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_coercion/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_coercion/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 1d726eb654c..e173c3a46bf 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_coercion/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_coercion/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -38,8 +38,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdzbSiNBGEXhd+nrXHTV3lX1l68yDEPUKIEQJerAIL77JBIP0zYZFpgbsSW7E10o6U/o5+F6dfl0+2u9vbl7GC5+PA+bu6vl4/puuz96flkMl7v1ZrO+/fX5y8N4+JDa6+Mf7pfbw+HD43L3OFzkKIthtb3ef9Zjv79Zb1bDRRlffi6GFHjR6SKPeJHwIuOF8MJ4UfCi4gVunnHzjJsLNxduLtxcuLlwc+Hmws2Fm2u2uUYfF0qeLjpdeMSLhBcZL4QXxouCFxUvGl7MN3e8Ldyni04XZcSL+eZ6/z72D5ssMl4IL/yfRc3TRcGLihcNL+abt/FtEW266HRRR7xIeJHpos0+R3r//UhjnS4yXggvjBcFLypeNLwIvOh0ESNe4OaBmwduHrh54OaBmwduHrh54OYdN++zr6q5HRctPv625/y66HSRxvmXFW9/fvKYJi8rjYlPMp+IT8wnhU8qnzQ+CT7peJJ4/cTrJ14/8fqJ10+8fuL156/YbR0nLl8n4hPzSeGTyieNT4JPOp7MX7mfniQ+4fXF64vXF68vXl+8vnh98frm9c3rm9c3r29e37y+eX3z+vPX8o56nJTxn6v/xZeHRk/Hh/as6dud+ev+7zr7vBF829nTWc+ez3p2nfXsPuvZy1nPXs949jz/Duf0pPJJ45Pgk44n8/+QOT1JfJL5RHxiPuH1M6+fef3M62deX7y+eH3x+uL1xeuL1xevL15fvL54ffP65vXN65vXN69vXt+8vnl98/rm9QuvX3j9wusXXr/w+oXXL7x+4fULr194/crrV16/8vqV16+8fuX1K69fef3K61dev/H6jddvvH7j9Ruv33j9xus3Xr/x+o3XD14/eP3g9YPXD14/eP3g9YPXD14/eP3O63dev/P6ndfvvH7n9Tuv33n9zut3XF/jyCeJTzKfiE/MJ4VPKp80Pgk+4fUTr594/cTrJ14/8frc+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sStT9z6xK1P3PrErU/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6zK3P3PrMrc/c+sytz9z6PG99p26g4XnrOz0xnxQ+qXzS+ATepORlf/R7uVsvLzer410eb562V59u+vj45341uf/j/e7uanX9tFsd7gT5cRPIw48xlVjkpJ+H+1/sD6sXtR8ODu27F73un3H/rH8B", + "bytecode": "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", + "debug_symbols": "tdzbSiNbFIXhd8l1LmrOMdbJV9k0TdTYBEKUqBs24rvvpIl9qC66+aFzI5ZkVIi/Ufwu1tvqfnv7+uXz7vDw+Ly6+edttX+827zsHg+nq7f39er2uNvvd18+//jl1XT+EO3r45+fNofz5fPL5viyusle1qvt4f702ein/cNuv13dlOn903oVHS8GXeSEF4EXiRfCC+NFwYuKF7h54uaJm2uxuSZfFgrPF4EXiRfCC+NFwYuKFw0vOl4MuvByc/ePhcd8EXiReLHcXN9ex+lhs4XxouBF/cOi5nzR8KLjxaCLsty8TR+L3uaLwIvEC+GF6aIuPkd8e3/EVOcL40XBi4oXDS86Xgy6aBNeBF4kXuDmDTdvi9+r5nZZtP79d0nmedEnvAi8SLwQXhgvCl5UvGh40fFi+f3RP3775BSzn5Ix4UXgReKF8MJ4UfCi4kWji5gWX7qty8Tl14n5pPBJ5ZPGJ51PBp7ExCfBJ8knvH7w+sHrB68fvH7w+sHrJ6+fvH7y+snrJ6+fvH7y+snrJ6+/DAru9TIp00//XK5/eWgfcXnoSM3+msYyPvy1u8dV755Xvbuuendf9e7lqnevV717u+bdx+K76XeTnCY+CT5JPhGfmE8Kn1Q+aXzS+YTXD14/eP3g9YPXD14/eP3g9YPXD14/eP3k9ZPXT14/ef3k9ZPXT14/ef3k9ZPXF68vXl+8vnh98fri9cXri9cXry9e37y+eX3z+ub1zeub1zevb17fvL55/cLrF16/8PqF1y+8fuH1C69feP3C6xdev/L6ldevvH7l9SuvX3n9yutXXr/y+pXXb7x+4/Ubr994/cbrN16/8fqN12+8fuP1O6/fef3O63dev/P6ndfvvH7n9Tuv33n9wesPXn/w+oPXH7z+4PUHrz94/cHrc+sTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrE7c+cesTtz5x6xO3PnHrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z6zO3PnPrM7c+c+sztz5z63PDZ0C4NT7pfIKP/jA/+8P88A/T0z/eT1f/bo67ze1+ezm07uH1cPfDGXYv/z1tZ8fZPR0f77b3r8ft+WC772fanX8kwrmO0T6dTw04XZa6rnG+OL+S0FiH4/Scp+f9Hw==", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index c01d2b56795..fda6602deca 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1dDaxtR1WefX7u/3v3vtdWogGNNBCl2pz3zvuDYHJjL639o5X2ta8JEF7v6zNY/xAVRWN3TYwomhJRQgVBSROisZiIBZsUo1ZINNZKohgrKqAxFSskCmpDFDq3e53z7e+sWWf2OXvO2fe+M8nNuXvP2mvWrLVmrTVrZvbO3LBkxW+Hrp0Cs1389qYrx2rE1VMJtYrAfHz1+d/ix7Wgvl1jZ1ep3Trxn+mdPL+q9K9G+vurBc6U/BGcCfD3lgs8d+VD/NwXXw4V16hD8szKc38bbvj/lcX/q/RMCtkm5H3vMoX+FvTNl2vyNG0L/p0Cv0uA+1VAe434B2P62jS8GeC/rn7eDHB/Vxrajwv+6+unfYD7hjS09wX/jWnwnxD8N9XPmwHum9PQflLwv7p+2ge4b0lD+ynBf2sa/KcF/3enwX9G8L8mDf6XC/7b0uAfxCi3F/hdAtxn68d9UXDfUTvuY4Pxemf9uAf6fq5+3Pesu+djoKuHqEdiFI6j0I9xrMewYhtTxlbPlRMS73XcaJG6rtI/qVsK9IdLm66xT56PJwAvw0lZd8N4rJOX290u7vemKKfP9HrSXrvA33WjtGP7XYLvF9drRL/weHtCOi+ePn/sYv/8xfMnz1+4cGL3/FHC70sL+IS6KTqEcqw7hvU4l9Pg74uuLEFf20qfpH1Np7PAr+DiOmlrjXDVHeNafUP6RbZbbnTcIQ9CuJYq4lp1+vjerqffA5l2jX5j+4cU+Coy1fqNuGR+x3atjnaQhx3qT1uhwcNfD8/gc2KP+FmJd7sE/2duiPOm4v9NN2qvu1SnyYBl1omkReBfU/wm1q0e20ZsK3Ge5aSmp1I03RJeSR3aUNaVFajLqA7zaxiDcNH8sNzz+D8DeBlOyoKH5cI8fG02xMtwUhY8LBfm4ZMRPOTnuF1fJOZOHAOd0ngqhXnqC/Mbecr8Rp4yv9eoP87F81t44dt+X2uIl+GkHDSdnUQvX9oe4mU4KcwnX7aL3950pW/FQYn96qmY+AfbX3NJx5wZOyN/eM66rNC65UbH6E4+hOO6tnKvZeC6rkZc19eEi8fytHRxziKRnahka1EX6rYF3zeBLbgUbebDCz7tlXF8+v8Fn/bK2Pi6O8TLcFIWfHLuXy9BPtU9D/nA0hAvw0lZ8LBcmIfvXR7iZTgpPmet5Z44L6XFbm2lLzwnxP7gM1qOVeiUnD62m3L94blyzPfhDStDOjz+NaCxm5fr1qFuqajbojrkjcbjNeibFh9u19O3Xka0YP5Q09GWG5Wr/L/HC7r3d8Wvv373yvAZlnNMfn1NoYfzxqhTWq4XcYRoQD2VfTScG8ZnMTeMazx15sc3lb7gfqgm6MgS0FxFR/6t+NV0pOq6SUuhh5/T/AL3sRt4Lgv04YvQh/cUN0UunA/aLq5705W+ZUORD6zzawr8qsK3TTcqR3wWn2N++CJzzy7B/o+bCX/UNYc16reW42Od0NZ5NB/N6zxfKX4Pgk7E+CrndJ1AGys5F9aJdjYT/pg6ocUYwrO9fCzFANivTj4T+vsxcdM08t1S4Hfych36Wmlzv/Y7ta27rAF6HfJtvuA+4ZBv+7qiAu1YjDx8kf2qGn/x2XH83cnLdQL7wgbwV9Mrji/aY/pvjcmYGAVx3Ua8EvirCuK9zr+4+F+zeSI/zeZhbNwpnlkN0LtdXPemK4Oxr+XB2wF+sf5Y8eqWC+ubZvOkTf/89oR8xL50imeEj6xH28V1b7rSj+ULr21qeoq8Zj4iPO61Z1vN+iSxgSbbKrEZr59IPcKfVmyalWOo6v9TjwVrb1rsWNDmQ9pYEBla/h/HgrWXKSQ3X/DsREhuO4Yv0vatoX7JHn4rp8XXWgwr/OC9VDeQL5rHXiqLv3h2JMTfmw3+jsuVyBmGTWqDn8XnugTrC/NXYG8j/iba/6nyV9rS+sZ5mEQ55x7LQdvrh7S1FD6hHFj2d4HsOQ+TUZ9YZlYeRuB4D/QiPzass/Jj9xhy2S/5sXsVu7LIj5XrBPbN2Uz4M/f82FsOkE6kzo/d1wCdWOTHFvmxum3dAw3Q65Bv8yUmP/bLih2LkYcvqfNj726QL5lXfswXPD8c4uMHC+K9zr+v+H+RH5suP/bYhHxc5MdG9WmW+bEPKzZtkR+bLj8mY2HS/FhM/uaPDF80q/zNTl6uE9hPkC9a5G/qzd/8Bch+v+Vv6jzjq+1LZBknsj899gkoY2xzGWhmn4L+geO5pwwZVz0n0lLo0fxdKBeEcZT2XBbow2cUGyVyWae2tovr3nRl4Be0+Q7yYZ3oX1fg1xS+bbpROeKz+BzzwxeeHwns09lM+KPazHXqN/YtFG9gH7XnWCcE/hlDJzbS9LlvyRh1YoPo31DgUS7S3003qi/4LD7H/PCFc0EC+6VsJvxRdULaqpoLwn518pnQ348dw5PKd0uB38nLdRzXYZ22L3m/8sSyg+N03rKDA9jWTPhj6nzI7/li5YkEfqXogxabW/LwhfNElp+x+LuTl+sE9nAD+KvpVShPFOq/NV7ZV2nxC+LifVQC/40Fr/z4vZzO6KM9FPk1LU9kzQO5fbxGePT/Mvar5okse4g5pHsm5DHS0SmemVWcOS4nFBNnot4yjxHeyj9YPEb+8HhgPQmtS52AsfAyQ07SVtWxkDrXN24sxOT6rLGA8PI+xTrGgqO2Odfii7wPleV5O8js9EJmpsxuz8u4tLYzuGedVxQaB7mBPAmf1POKmAfo5uU6tAN8XhHr5D2mWg4Nz2Jqfnu7nr6Ze22sHFrsXpsbIUYL5dCci8uhabkQK0esjX3GkSn9Rp2UPY6cl72N4rtUe6G0+E7a8v26i+yXwAk/cD3kzkBfzlFfUuma1pe20hdtPPAZaaSxrr2arzfmE7PK9Yt9ZP9zgWQ0j1w/+st5yeh7DRlZ67W+sIw0n8XXWuzGMhLYHyIZpcqJazLiOYa2JoJ6xnZN4H+kAXYtdszJO9hjxhzHdciLswFevLVBvGBf6YvI0Jemxkml9bW8XIdjjuMkrJN3smt2hfeDzXtPstBWNU76OSNOQp3XxgHHSewbsC52jhTaNxGyJ2Jb2W89QGOI97VsF9e9KYs2hrqBPjinx3ryzQXNnuCz43z4HQFe/GoDfPhBXq9/T8RcI3PNXK8/yOctPmjIZb+ct3hYiTsX5y3KdQL7SGsm/KntvIW2bsHxtNbPRw2d2G/7Lvi8xaT7LvisocD+cWsm/DH3XVRdY8d+dfKZ0N+PHcOTyldb79jJy3UYN0mb+7Xflq0bp9eWrRPYTzZAr0O+zRf89l/It/21kVOx5OHLzfnzvzG+xOLvTl6uE9inGsBfTa9C6+ih/ltjMiZGQVx49oL5GpNLE/yfh3WrzxrrVoP9Fm7URgpuXzrFM4nnNwNboc3nUH48hx23zsXnChB+Jy/XafPovf0L7SF/9trJh3CT8jH1/gUtb4p8rPOcS8zauiOcMevnArte8N/T8OUKa7ts3wX2f2GMZIZshfaqa7upvyc2Tuc5z6jpAo4j61sCsj4+7gyT8NFaQ2A/0CmeiV2bQV3ivL+WP3ROt5XW+r/ArhVA816buXyhn6Z+WvtFUD8vn0A/X9Bg/XxRA/TzIOcdrwTZzzLvyLqh/Tpn5x21NQPOSXaVOpFZqncy8XhHmWnfcmy5UXtR2qND93qGzLrEO75nyaxLz1nnfhh3yL5p33lhfUK71FZwyZwhhq6M7seeRxIaXgUx2CvaZRjB+UrFXibWKfN7nFpeOaNrhNdkZu17cE73H2i/d/JyncDutGfCH/M9aHv7c9plvlTVj0FOYiH7Ednz/ENgb22A7KvmTa14ch7y1WRSVb5bCjzPZbV1dxw3VnzHMUrVfVGvqxh/ooxSv2dwdxF/lmipO/5845ziT9ShLPDrXFz8qfFB26cndan3k7B9QJlpe41bbtS+oK3o0r0fM2SmjdeOwTtN37VYuUW8subPIRyhNVS2W4yL40+Lrozuh3DK2gOPh1+A+DOn+FNw/swU83UeI5rP0Xi6qfSX945wjhJSmCPxocD+PNnXeeyx8n38dYoPq8pP4H9pH8omlD/+lQbIxsoHJt4TesqL7w8oPkS+dYkmTb4IP6l8txR4jt/QB0k7qNeajrDfGkc/r5dauT4cPwiLtLMuPtSgWEuLJZoSawltVWOt3zb8tubHNN3V/LbULXJ99ef6PnrAc32+4J6ASd49FJvLkf9XKsJXfbeR9PGfIJZ7PJBL/PginzTiH0L5pCcakE/ifShPXuLy4zHoC/t3GT+fUnhVZ34u9V4TjX/Io5i9Jtp53i3l+S7VhfJz/15TXvtzCzs0ol87eblOYD/fADuEsk+Zm/1ig3OzX17kZku01J2b/cqccrOp5gsZtdOtsR1t7nGQz0WtF4xNfS6KfTr+r/lUzeeuKPhZbzG+ayu4OAe8atBl+WLr/ZdCw7GCt/76ik4ZRnC+APjP/jr1vjdNvijDmH1vKAd+R2ZbweXcqJwQ1pedvFwnsN/UmQl/os7CtxVeZHBP+GjFxfM4C19aD8rLdZOehUc+LUHfmmAX2WfG2sVvM+wi+5RxPlM721n1nDzGi9d1y/iq2ieBP7GwPSNjmXMWAvvKBtieOufY85CvJpOq8tXs0fV5GZfWdqxtFhqb9j43PHvFthnr5L1ATXif2+DchIubz+C5NOwT73O/tUbbbOWL0W5qdpXtiMCfVexq1e+sIM2d4pl5nn9F3lQ9/8pjF+H5XYxsl3g8X0vw0s6SG+oWwrCMBP4NIKO/DJw3DeXeQjh3DX86j3d/o8ymffe39b775QA/fAm9p+xe8qfzPLNsrfn5ckugDz9IfWjK9xsFTrMr2K9OPhP6+7E+PuYdIjgO2a4gvMxRNP4sGfzJXLP4o8m8Dv6cy8t9Q73Yrqdfd4f65Uvse+Ok/7OIxz5JuoDvGJgkHkO+avEYv9cilf1gH4F2jnXKl5YbtZPoX7p07+01xmPavJVx4drHNfkQhv2QwL9D8cuW30S535A//6vJb9w3GhCWYwaBfRf5kHl+A0PqtFyKL/x+PYH/NerDPNbRMjdqxzR5Wu/r5DXFUHzvyznihcD+RgPyBKsKvTW1uxvisy+iH75YNh3tni+dPAmPVJtuzbFxPLNN55jRF+09VSyDVHGt0CFjGMes9p2Ulhsd8xjHd+nehwybrr0LDu9Zc+zQe/xDNp3HoMB/2LDp2twG5c42HWniuc1GoH32Rwj7KNmAQ/BMahtwiOgbjDGnz23EHnL/PtYgv6TpG8qT35mq5Q35mu22L+cCvHi8Qbxg3+qLyNAXy+6ibfKlkyfpx57dXVkd0sFyYLt7COrE7m4q/Rc47VugHEunGnMih8PCQzfUSWxTaGsRPP6/xwu691eG3bX26kpbvmixNK+BcKyMdi+Us/kUjQPsU+pxgG0hTSG7dmugD081fCxrMZTQupmG1j7rtHN6vlva18afPDvveO/bye6UYpy8TL/m91Prdka8RP3FNjluQ9lvYp/o3tM1xm0bCj18zeNL2sI6gf0Cjb1E+qyOvU2iT+pic74C/58N2oOSUdv+F/c08Hs3cQ9BW4HB8xQI/9/GWom23yoDGtgOC/yzxloJ78naLq5705VjPA5azt4vwX10rnr+kr+t24E6tovdPE2/PXtvJLuo7fWROrQvy0XdllJn7QPieXAimZrzYE2mVefBq8Vem1mvNfuCYzOUizoM9FWdB/M5UC1W4WstF8bfmhDYywvammTvkb8yhi3+vmAK/lrf8qjCX56XCuyLGsjf2Hhc4L+Z+tCE/HfIn/LeA82fIkzIn74EdKouf/otip4m5ukxHgfoT5m3Wh+FHuyX4EH6j6ShfzDv2Ro2ra6jHiH6NfgtgJG+y7jHsSJwVn5GixVwfuJLyljhHRQr4Bjg/AzKdgVoZB7Oyudbe39jff4ravT5fJYQ62LeEcH8Z1+G+uXLdXm5TmC/k+xsojOWUd8FHOcrQnOvaxvQB9x/bZ2H0/Yh81lb7bxXZvBB4G8mPnRnyIdQH5wb3ePpS5XvI+I+duYFx0ACexvxYnF2cFQOmi2MPTt4V4QtzFycLVycHdR1Y7+eHXyjoRsH4eygL/hOk5UKdGVu1KZpz2X0/2pF+LVIeJ4v/GYhO3/9o90yjND8FmNOsd/OBwlPUp0Puq87E/6YeWHOt99/icuPx6AvoW/DvU3hVZ3nrRLlP829w8ij0L4bhEeZCL+1teSYPXcZ3NuP5620Oa/2LaEmnbfS/LwVA8b6+fcmzoFXnQ8LDg/zkYizsJY/FPiHFr5uxIbt5OU6gf2dBvi6S/ksLNtm7SysNfcZ9+2hj9SU3xCaY/MbAv9YA/QrRna+1LWf/PYAL/6kQbxgW+9L7Dr4PP18indeoN437Z0XQltVP/+k4edR57VxwH5eW+OpapNCcXzInvDamMD/bQNyhBYfUT+tNWN8lmMd5sUdAV78wyJfWqKl7nzpPy/ypdHtXGr50v9a5EtLeDScqfKf8v96JDzHYVcV//ifr1K+dJAbKWBmuKfRzP+gjkya/4k5U7Mc4JkvnC8d5ESWZsIf1Q/x3mXRofVLXH6aLeJ8qYyfowqvqs7J5/kuCo1/Vd9FgTLhOTk+HzO/z+CeNY/CuYYvnTwJn9R5VMm35eU65CfPo7DOypfy/qFU58hZB0LfehDaWm5U3qXzbHTvpTA2ZrV/aJnqtP1DnqztpTI+bb9hjD+8euHrRmzYTl6uE9hTDfB1ddrmechXk0lV+Wr2aNJ8Ke79lTEVky/FfnC+VDvTiLYh9B6qa0m/5rm3z5KdL1a+dNzaBPIilC+9iXgxj3ypc7rtxPwN52cE9haYZ+xW0KuYPLxz1eON/b4+W+WM0n5dn319jfFG3euzCx0elkl1+Gxe5tNB1OEfTqzDjKvqOaUfb5CP1cZC7LmzKmuSZ4kXAvvTDeIF64Yvse+hmuX7UKqsSU7q27QcdWoZiQy0uTS2ye9DiZ1Lv92wC1Xfh7Kk0DPtmuS4Mxz8fiWBfyeNoaad4UD9lJx+zBkO/D4V8+KOAC8ebAAvYtYkU62VZkQL6pKmly2FT7gu16V774/wrZmrf00y1VphRu0s1diOtu6o2VfWjf1qX3+3Rvuq7Vnka54Lo45refXQOqG27qe970Hkg+923C5+e1OV/nHOw3wW5u4fXSr3V+h9tIZ1E+RtJy/3M/W6ibZWjOMiZt0E9VZkpq2b8Ds3tba1sdy0WK/0LYu8XIfnkDnWw/PK1t6ZNejbLPyUlqe0/BTqR2k+TPeeqHEOqL3X2sK1ouDS9Ah57UsH6uaZS4jVI7Gnmy7sQxLbEvP8PrYptLWUfljn9z9t6JG110XaQt5Z6whaTGLNNfy91nL5GYyXLT/GMfO/GOtviWKR6PU3nqOP8xnS3003akvwWX4OYX2RtZyq/hRxdIpn5ulPsf91+tM69yEIjU3bhxD7XQa2g+gjeB9Can+qfSfL8qex38n6vxntQ9By/5odxH0IYgc1/vOcXFt3uNR12Bd5J8ZB1uEjhYCbpsNMg7ZX2BfO/wn81xdAqWMt69tRzIsq69QvLOj3vLmaYhp8vk188MUak6i3vnTyJHxRx2RpX39erpv0nBD6XLQ3rEuzGpNWzih2TH6rMSar5oxi97C1qQ7HpOBAXbTWlCf1K22lHwfRr/B6M/KwaX5FaKuqw99h6DDbr5DsNb/CelrVr7CdPQt29hqys5kbpVMba02zs8hL1lG0wayjKHfJDWpjGfd7sA2e1Z4Ize5X3RNxq6Gj2pod3mMd1fLtVfMYgsPfO1shfse2eV0aad4ufntTlf6uZcMzhUdN2zNUx/zWyhezDU+9ZyjVd6DvaejcYNWN8rxGvg6+q6mtF2t7n3g9+Ado7pHqnEXM9/q6QGNM/lPg3wSyb8L7WrS42rJD2n72TRfWN+ZfV4Hl708K7E8sz4Q/E79PA+0d7zXR9t6M44Uvoe8z3rdPeIG6H8OL0DjxhffxCezPNsAOJLaVu7PktTYGBfYXDz6vL8ya16G9Zu9sAK8P8n6yByPirswt9pOx7l0K+8l+q8bc4LT7yXh/ybOQS/nQsk4H40IdxhxNTLwt8L+nxKpV16gxRuoUz8zzrDzqStWz8jyHQvhX52Vc08zh55njKo2RvFxXxxx+Ffo2C3sxbi2BfUnsHP4TNc7htXmjhSs2V4q89qUDdfPcOxj7vXLe66Dt10x9Nj0jukLfaWO/g/3A/vL7SP6mRr8Ts2cm9h10Av/3FJOm+i68FpPyPtqM2ka6kR/z3v/I35Cuuv9xU+k/f5tJk/UqwaYaC4PvPLmhLmGbQluL4PH/PV7QvaeNsaD5Zrxn7X/kfQNr1L5mc9jef4HGQarvdGvjgL8fbsk+1fi0ZL+u8Laq7L+UWPbT7H1dj7DLmUKPFSvvx/cg4fiIWZ9J7ZO12E6LparGdktFR5q4/1B0MWb9EscBr1+sRPajaWdSpp2f+GLtP+T5Seo1eE2Htbl5VR3+hhp1WBtT1vu6NB1mHJnSb9TJ0PsMXkxrZvtt/+FLCvo9b06PkQvywZemzvWsfTF17D/kfTH7Ncd43BiTVed6bYWeafbFnK7gV7R9MZnSdpP3rvAcrep7LTQ9XSE+ZQqf9vv7bq6t0a+w7jjlmvMRvvAaucDeRL4hlZ2o8n4XHAddhRfzfldqlVyFNkfQzmMiHPa7q8DymofA3kmynOdaKK498npXqnd+ZEQLjmNtLbml8Klk0+je64xxzOu7eE/a8kVb7xK4dTf8vvNyPnwW9XwPDusIBtsSXCtQtx6Ba93AtWrgWovEZbWNtHYI/0ZxvRTAv0rwh4rrDsAvK/R0Cf+9EG/+1EoZRnB+P8C8idb5utAGy+4w1inwqCcML331bf4kjHVfNqGdutcFQ3SjLkj7Gg+ywC/iwnvS1hrhqtuW1ykTC9fhSFzCT5Sv//9ts5H1ce5Dy+njTNofnD9OQ89A9zZzm6fSfh26J23NSve0vlm6h/CsexquzUhcwk9N3w6l4UGf7boL8ADbx2u06+j/5Fm22e9aKePR+IU+THyR6NUW1K1R3RGo2yB6j+aj9CKuTaL3KNErvlfT+S2l/cPUPraltc9++YgCf0SB97ryAPF0SXkW5Ss89bEO5qHk1/Nou7juVSznT/fP7B4/sXv67pP98/1T5zlORdpTtL978tTduydOnu/dc8xfHh/XvsjViheEn6g7mn3oEvwHwH88RPFJR2lv7z1WNO5XgJYUfqYU4xI92L4WE8v/iWntW7QuK7RqPK7qg5bz8r1VpW3k0zK1XYrDqQ79eIfakXGKuoa4hA6Olx8hO4UxvDy/pbSPMuO2tPZj5g/afGNvD2BB42DtANqu06/jOMIxXrKL0LYvIj/k+5LSjy7BPwZj/A8j5iAe7gkDrqqedvLyvXF6KvBV9RRjMF8m1dM/3wd6+jjpaer4c4nw4z2m7QnQ67p95/EzZ069/PjdvROnL+xevHCiH+s7F3mS+eVJPg325z8CeZJ/BJjPzSFP8swiT3Kg8yTPgH49u8iTOIunizxJGNckeZJn90meBOERR4fgDxP9vqCfYb+k8RHbjMlDrBnwct11et5iDeoRfqkQiPhizF1w3gT7cCRAb+bi8iabCrymV153vkq+EGMukdG6G50jOBcXy2hzZcHFc2WG7+RlXKW4nnCJDDB2WFXokjGyQW1vF/d705V+bMwn7XeJ/iMFgV42V8D67h5sHu7/uDHJtkTLhfk2ryranKctwbEu7dfhK6StWfmKOmRi4dqoiKup/kGLwbR572AvPdStUx3aRc5/i11FG6H51C7Bv4zsOPoWeX5LaZ/7Gevvq+bL/bi9EuyGjGGeWyMejb+xeSJt3hjrA9YicK0ZuFYMXKuRuDLlecv/zNNnIP3Sfh22UNqalS3U+mbZQoRnOcfmQCxc85Qp9pttlGY7Ua87BK/Zzg2lv5rtZH1C28JzlUlt5w37wHZeU9CI9g/tTEysZdk/lF+MvDcMXGsGrvVIXLG6hjbBF5HJkrN1jXUTdUabx3Gu7g7wZd+zWoYRnOcA5rUUJ1u+S9MjLc+szcswn3mR4uR55FRQFzingn2aNqeylKZvx+qUSR05FeEnytf//+bZyPo49wHzeTjOpH2h50gaevqWLdXyFXXonrQ1K93T+mbpnjW/iPU5Gi7hp6Zvh9PwoM923QV4EMqHhfY9ybNss++neYnGL21fgLa3ied9R6GOY4fL8lF6tVxcl+Dvp9hF0/ktpX3Mv3FbWvvsl48q8EcVeK8rbyWeavbP2muh5fMOGfCazBAHxwxsm3yx4tmjCrzFq8sUepBGxOfL5Qr8pgEv15j7RRyhPXMPkO5cAc/I81tKH64I0JsF2g/xA+EvU+D39ldC3DuP/K7oyqWU330Q4or3V4hbx9lo9i0I34T8H9KK84hHGuDrcE4i7dcRy0hbs4pl6tARC9ehiriapm9WzsSKO2adb/79fZAzeRjs2CMUg2i6Y8Ug43SNY4pxOS/Gr62HLleE3zTo0eI7TWZWrCp16Ks57ha/j/qEuISOLsH/KemTFh9psQjOc7ktKy61YrNQLPIxiEW+BpUZ24a9hwEA", - "debug_symbols": "nd3brh23lYXhd9G1L4qcJzKvEjQM23ECAYYd2E4DjSDv3iVDu1asybkp/jfGXlE+HRZHnUaxWP/+8Lcfv//XP779+PPff/ntw1/++u8PP/3yw3e/f/zl5/vTv//zzYfvf/34008f//Htf//PH65P/xH/4///2z+/+/nTx99+/+7X3z/8pVn75sOPP//t009++79//OnHD3+x6z//880HibUYb8LlSzGWol+P0C/FPBV6HYt2LPqxkGOhp8KO/ww7/zPsWPixiGNxnCs7zpUf58qPc+XHufLjMffjMffjMffjMffjMffjMffjMY/jMY/leHT3z6J7fCmW31Ufb0Ku9qWIY7H8rkT6m9DxpZinYlzHoh2L5fYh9vzLp30p5FjosbBj4ccijsU4FvNUzOtYLMdcr7ezDNX+pejHQo6FHgs7Fn4s4liMYzFPRbuWg676dtpnlybSzkk/J3JO9JzYOfFzEudknJPl6Ju/7YEtHa1aW46+teshI5F2Tvo5kXOi58TOiZ+TOCfjnKxHP/Qz8evLK777zOectHPSz4mcEz0ndk78nCxH358N2XUmMs7JPCZynZN2Tvo5kXOi58TOiZ+T89GX89GX89HX89HX89HX89Ffdyve3o5ibunAty5X3id2TvycxDkZ52QeE1uPvr8dX3xm0s5JPydyTvSc2DnxcxLnZDn68ZzAh0gi85isy6/3STsn/ZzIOdFzYudkOfoh841EJnFOxjmZx2Rdg71P2jnp50TOyXr0442Mls7Hws6Jn5M4J+OczGOyLvbeJ+2cLEd/9LdD0shDue723id6Tuyc+DmJczLOyTwm64rvfbIc/fGM/uyWSD8nck70nNg58XMS52Sck3lK+rq4e+92Rl8Xd++TdUl/PTcCWk9ET++B9HVx9z7xcxLnZJyTeUzWxd37pJ2Tfk7knJyPfjsf/XY++u189Nv56Lfz0e/no9/PR3/dj90ng8+UkJCMnKAgaBA0AVo3ZTvUCOoECUFKEEmEkEQISYSQRBRzkq4mb+jqCRXTkjaoEdQJkj3yhJQgI8gJCoIGQRMguwgqEqHPlJQrzZro1gkSgpQg2yKThJygIGgQVCTCXyjdkOvFFLMNagR1goQgJcgIcoKKRAx70EyDW0w926AJUDEBbYPaHqUvIjpBQpAStE5Eex2o79vZCTlBQdAoUH9QvxKaAK3buD+jdBm/7uN2qBMkBK0Tcd9wfZCmlA8jyAmKPUqBncXUUX9rW+7b/KkImY2gTpAQpAQZQU5QEFRshPM5arS0N5LrIqgR1AkSgpQgI6gY3P4aJ0nPgVzF4MqzW74vEhIaBE2A2kVQsbl3eX0RllAnSAhSgowgJygIGgB1sC+XdX3W7vS/oTvTCXWChCAt0PVCacst+r0N8i1q6UGxot/boEHQBKjo90SeGEnehRX93gZ1gopE9HihlPKi39sg2yK9EnKCgqBB0ASo6Pc2qBHUCRKClCCSCCWJ0GL2+vW2WzaXtN9bt2471AjqBAlBSpAR5AQFQYMgkggniXCSCCeJKFo3lefBbJWZkBJkBDlBsUWaDmpF67ZBE6CiddugRlAnSAhSgopEvB7xV8+rAjhBQdAgaG5RfHl7TIrWbYMaQZ2gIhHxQiN9EUXrtkFGkBMUBA2CJkBFv7dB60TY9ZzMW0uDW/R7GyQEKUG2R/mLcIKCoEHQOhEmzxW1pQO1FqXgBjWCikTI9UIjISFItyj15VqUghvkBAVBRSLslQhvCU2AilJwg9oeeULrcfLxXD95ehRfi6pug5ygIGgQNAEq+r0NagStN0K/Xmsmpb2RFlXdBhlBTlAQNAiaABVVnetrnKwnVAzus7JF88UST50gIUgJKhKh7fVFpJ1lUdVtUBA0CJoA6UVQI6gTRPblResW/e058/vHjJygIGg/zzLNdVOdABmYeavWCOoECUFKkBHkBAVBgyAwF1udJMJJItatm/enxfaeWmxdt2475AQFQYOgCdC6dduhRlAnSAgiiQiSiCCJCJKIIIkIkoh166ZD3pAOTYeadeu2Q50gIUi3yPIXYQQ5QUHQIGgCNC+CGkFFIlwfFOmyoVh5boOUICPI9yiVTcUqdBs0CJrnyIrV6MZ4odkTagR1goQgJcgIcoKCoEHQOhHzuWF6b9spEevWbYcaQZ0g2aKevoh1v7dDRpATtE7E1P6g1MPaut/boQlQLxLxlOw3SgtE90ZQ36OZkBCkBBlBRSLslYj0SL/1IGgQNLcoHQltXdXZ3aN/RqY55euqboeUICPICQqCBkEToHVVt0PFRjjkScRsCQlBSpAR5AQFQYOgCZBdBK0nXl3tmUN1pfrRiglyr0c4LT+WasUEuQ1ygoKgQdAEqJggt0GNoE5QMbjzWfi4XfmlFOuvvD/Toe4f05Fw3YXt0ARo3YXtUCOoEyQErcepxzO4faQtd92F7ZATFAQNgiZA4yKoEdQJEoJIIgZJxCCJGCQRgyRikERMkoh1F2byOqESuRLqBAlBSlCxwHrEcwDI5xEzCBoEzXPkFxgnvzpBxTjF8xIASUv8+aUEGUHrwZVnPbkb5Vc1BUFji0b+9iZAxTsUNqgRBC5ZvSlBxSXr8/64+8eMnKAgqLhkVXuhlL3iBQnvo+IVCX9CM6FGUCdICCoSEfKgkZER5AQFQetEvCYGm6ULSV+XTRu0noH2J5TmEvh6BtoOdYKEoHUi7JlVd18Jp42wqLU2yAkKggZBE6Ci1tqgRlAnSAgiiVCSCCWJUJIIJYlQkggjiSi6MHtW9L37nrQ3Kh5L3SAhSAn6isdS097oax5LzQg8lurksVQnj6U6eSzVyWOpTh5LdReClCAjyAkiiXCSiHVV16/nRly/0o04X1d1OyQEKUFGkBMUBA2CJkDrqm6HSCIGScQgiRgkEaN6XdpzpRYL5AQFQYOguUWWXzx8EdQI6gQJQUqQEeQEFYnw565QhCc0CJrnKK6LoLZFI736uSgFN0gIUoKKRIwXmvmLcIKCoEHQBKgoBTeoEdQJWidiPKtV3/eN0uAWTeIGGUFOUOxR/iIGQROgokncoHUihj418dD0CvqiSdwgIahIxOsO/8jvoi+axA3yLUrlbRRN4gYNgiZARZM4/JWItDhIFE3iBnWCZI9SYIsXsTZ7K6TvHzMqXpM537J31/Ca0CBoAlS8KnWDGkGdICFICSo2wudZ1vvWtyUUBA2CJkBFVbdBjaBOkBC03i3PZw6VX3lwi7eVXs+N7fuWatqFebFpPC/7um90Xgk1gjpBQpASZAQ5QUHQBKh4hPP9fXnxCOcGFYOr84XSyUfxCOcG6RalZj6KRzg3yAkKgtaD+5pE61dPX8S61tqhRlAnSAhSgowgJ4icsYziUdtnxWDPy6vHvAjaP3ydVgyO2QkCD1/HuqHaISPICQqCBkHg4etxXQQ1gjpBQpAStL7b0J/HUnte/X0U7/TcoAlQ8V7PDWoEdYKEICXICHKCSCKK5czuk/HPqM1LEpoAFcuZbVDbo5HQegmcac/6e9MyEoKcoCCouE/4TIfqV1oEc/QJkFwENYL6HnlCQpASZAQFCKwMgiZAxSJjsz9LtM10QjWKRcY2qBMkBOkezYSMICcoCBpgH1GsTPY+KlYm26BGENktG9ktFyuTbZARFGAfYcW+/Fkt4P4xHQltAuQXQV8x5yNthN4JAnM+hitBRpATFAQNgsAsoBEXQY2gThBJBJkXNorZWvas/NJtprPlYrbWBk2AitlaG9QI6gQJQUqQEeQEkUSsu7Denje39Zbm+I51F7ZB6y5sh9oepePTugvr7XmJQG8jIyHICQqCiubjeTa852fDx5znaF4XQW2L0uFzXp0gIUgJ8vPszaLW2qBBULER2rO551sUs6i1NqgR1PcoEhKClCAjCGzuswVBg6AJUL8IagR1goQgA5t7/4rOMqW8B0GgxZ4dtNhTLoIaQZ0gIUgJMoKcoCCIJEJIIopVvPrzvLv2mTaNYhWvDVKCjCAnKAgaBE2AilW8NqgRRBKxrrXuvepzxqLWElKCjCDfo3TUKLowjWd70pG2p6IL26DiivpZBr/nZ8Nn0YW93mDUzS0hAX+9oqHaINv+m9K06lk0VBsUBA2CyDgVDdUGNYI6QUKQEmT7wGbkBAVBg6AJNsJBttyqC3sfFYl49eVmV0JCkBJkBDlBQdAgaAJU1FrvH5+KWmuDhKCvOACkq5ppBDlBQRA5UBcF2ruoXUWDtlMNKbDx3qrYeuf1qopbVoaUI/UVZXbPaiAFbnC0q11INaQ6UoKUImVIOVKB1EAKZaOjbBQr1sdzM17z27FupUgZUo5UIDWQmkSte7Ktakh1pFA2BGVDUDYEZaOoy/x5ur17erjxVgOpSdR6ytmf1Mj/rvWcM23PFZO2NBPsVh0pQ8qRWm/Lze1RabXRWw2kJlFFc7ZTba9GVh0pQUqRKrIxn7d03bcZs3KkAqmB1CTKL6QaUh0pQUqRQtlwlA1H2XCUDUfZCJSNQNkoSrjNMaVo4XbKkFqfmft8e7Cux5XPYIsibqcGUpOooov7b7UYr6KM26mOlCC1zka8ppCszr6KQm6nHKlAaiA1iSpmqO3UOhvxHJd7jNzAFGXeTglSipQh5UgFUgOpCVQrOr2dakh1pAQpRcqQWmfjvlH0pmaasHCrQGogtc7GfE2pyG+9a61oAneqIdWREqQUKUNqmQ25u/TPSu6KMatAaiA1iVo3gVvVkOpIFdmY+lKelSJlSDlSsVU957CYm7dTk6hidt5OFdnQ1yhb/jakIyVIKVK2Vs91ilyxUI5UIDWQmkTphVRDqsjGbI+aMytBSpEypBypQGogtc7GvQW9qWb5PGrdcG5VQ6ojJUgpUoaUIxVIDaRQNhxlw1E2HGXDUTYcZcOLbDxr6cmiM2/uSAVSRTaivVTeb/gkKq6tGvn8MBpSHSlBap2N/tx5lN4W34Yh5UgFUutsdHkS1XXxbUyi1r3on1SaZn2rhlRHSpAqsvFKVM+zqtowpBypQGogNYmaF1INqY6UIIWyMVE2JsrGRNmYKBuTZKOve1F5vRz1/tGyakh1pNbZkGu8lGelSNlW5Sv6vu5FtyqQGkitsyGvK3rJV/S9XUg1pDpSRTbilaiRv42mSNlejawcqUBqILXOhsrbDGRRzd980YvuVEOqIyVIKVKGlCMVSA2kUDYEZUNQNgRlQ1A2il5Un7tmovmuWS960Z1ypAKpIhvPMvdi6S0xt5pEFb3oTjWk1tkwf644LL0A+VaClCJlSDlSgdRAahJV9KI71ZBC2TCUDUPZMJQNQ9kwlI2iF/XXuah3zWoSVfSiO9WQWmfDn2eyxD0fHYpedKcUKUNqnY24nlGO3GL1ohfdqYHUJKroRX34o678bRS96E51pAQpRcqQcqQCqYHUJGqgbAyUjYGyMVA2BsrGQNkYKBsDZWOgbAyUjYmyUfSioa99lOar7KIX3SlBSgvVXirvRYtedKd8qyx3ekUvulMDqQmUFL1oxHxUvpKSohfdqY5UkY2Ql2pZKVK2V5GVIxVIDaTW2RjXc72c34/apOhFd6oh1ZFaZ2OM5/xwpDWhbqVIGVKO1Dobw58tZSzSW/SiOzWJKnrRnWpIdaQEKUXKkHKkUDY6ykZH2RCUDUHZEJQNQdkQlA1B2RCUDUHZEJQNQdlQlA1F2SieUr/G86R/u/L5RrGI5E4pUoYUeSJeqifiN2ogNYky8oyqWEeqWCpUXqtJ2kIpUoaUI7VfLjTfGxUbSIEFQ5v4hVRDqiMlSClShpQjFUgNpFA2AmWjeLHvfcHwWfnIV/RSvNl3pwwpRyqQGkhNooqXAu9UQ6ojhbIxUDYGysZA2Vi3jirPnSy9o5rVQGoStW4d/6QWbc+6dVTtb9fLqrJQHan1fl6fJ0BV87O3sm4dVZ91D9RaPhddN4Hbv+FAau7/XenMQddN4FY1pDpSZLz0UqQMKUcqkBpIzW1682ok2i6kGlIdKQFbpTZFypAqsjGeayKdnlUgNZCaRPULqYZUR2qdDeuv8UqvWbmVImVIOVKB1EBqElWsV7lTDamOFMqGoGwIyoagbAjKhqBsCMpGsfLk++eHWnR6OyVIrUdZ5mtvk++ba9Hp7ZQjFUiNrVocv4pOb6OKVS53qiFFrgK0aAJ3SpEypBypQGogNYkqmsCdQvt5R/v5otN7zRe9vy/JypBypAKpYj//6sw9zz/UotPbqKLT+2/VLauGVEdKkFpnw5/5NncO8r533R9ulSMVSA2kJlHr/nCrGlIdKUEKZWOgbAyUjYGyMVA2BsrGRNko+kN/5kfd+768jyr6w50SpBSp/Vr3i33UdKTIexB0DqTIexDsupBqSHWkBClFypBypAIpkg1b94dhT9sTnp9tt3V/uFWClCJlSDlSgdRAahK17g+3CmWjo2x0lI2OsrHuD13a2x1wl/wkl637w60KpMZezazW95flWbXj/jGrdX+4Vev7y/c9gjelPX/z6/7Q77bkUX5lZehv6EjF/t+V96LrTm+rJlHr2X1bhcZLO1KClCJlSDlSsU2vLdRAahJlF1KNbJWGtmUTpIpsPOt93b+BZWVIOVKB1EBqEuUXUkU24jVeU7LqSAlSipQh5UgFUgOpSVRcSKFsBMpGoGwEykagbATKRqBsFDMJN+eHxUzCnWpIrUdZnqdNXfKTklbMJNwpRcqQ8q1aHL9GIDWQmkRNdBUwG1IdKUFKkUJXHBNdccxAagDlF9nP+9WQWo/y3Za8KZOFEqQUKUNqPcr22r7ug3BWgdTYqjwr2NfzD3dqPf9wqxpSRTae1RLcFolqhpQjtR6v+2/+prxHVgOpSdS609uqhlRHSpBSpAwpRwplo6NsdJQNQdkQlA1B2RCUDUGjLGiUiybQ7aV8oQZSk6iiCdyphlRHSpBSpAwpRwplQ1E2FGXDUDYMZaNoAn28rSvicbWsBClFypBaZyPaS8ni2wikxlZpPkspmsCNKprAnWpIrbMRNh8VmpUgpUgZUo5UIDWQmkQVTeBONaRQNgJlI1A2AmUjUDYCZSNQNor+MObredj8/JcX/eFONaQ6Ul/xJHLeR33Nk8gLRZ5EdvQkso9AaiBFnlL3eSHVkOpICVKKFMrGRNlYz+4bfbw1MKPn5/Vi3QRuVUOqIyVIKVKGlCMVSA2kUDYaykZD2WgoG+uZhPfG+nR6M6/bE+uZhD6fd5rcPy7+LENqElV0eju13otOl5dqWXWkBClFypBypAKp9RH29dbmez87s5pEFZ3eTjWkOlKClCJlSDlSgRTKhqBsKMqGomwoysa6CbwP8tej8uyjWDeBW2VIOVKB1EBqErVuAreqIdWRQtkwlA1D2TCUDUPZMJQNQ9lwNMqORtnRKHsxys/azvc57pWVIeVIBVJjrzSrYpSfWR/3j3nfGxdSDamOlCClSBlS62y05x7ifSUTWQVSA6lJ1LrT26qGVEdKkFKkDCmUjYGyMVA2BsrGRNmYKBsTZWOiUZ5olGcxyvbsN1p+T1bMQGogNYEa14VUQ6ojJUgpUoaUIxVIDaRQNhrKRkPZaCgbxTPF7Vnd/W7iZlaKlCHlSK2z0dtzttxb2keN4jnf13rmd6fWsmpIdaQEKUXKkHKkAqmB1CRKUDYEZUNQNgRlQ1A2BGVDUDYEjbKgUdZilOOl5kI1pDpSgpQiZUg5UoHUQGoSZSgbhrJhKBuGsmEoG4ayYSgbRTsn8pzbSH5H/FjP09uqhlRHSpBSpAwpRyqQGkihbATKRqBsBMpGoGwEykagbAQa5UCjXLRzr+f17vuFWRXt3E41pDpSgpQiZUg5UoHUQAplY6JsTJSNibIxUTYmysZE2ZgoG0Wnp89Ka/c98iurgdQEahad3k41pDpSgpQitc6GyjNjQbVn5UgFUgOpuVfpjXKz6PR2qiHVkSqy4U8/r0OzUqRsq/Ld21l0ejsVSA2kinUCr+ebt7zC1azWCdyotlWS01utE7hRgpQiVawh+cwyDfOc3qI/3KlAamxVfvpjFv3hRhX94U41pL5iDcmceRGkFCmyvugURyqQGkiR9UWnXkg1pDpSgpQihbKhKBvrJvC+3PyMZl57eq57wI1pwHRgBBgFxoBxYAKYAQzIgYMcOMiBgxwUzWJcz9YQLR83irYvXvdMFs9ez6Lt26mB1CSqaPvuO0AvJVk1pDpSgpQiZUg5UkU27KUinx0UHeFOTaKKjnCnGlIdKUFKkTKkHCmUjYGyMVA2JsrGRNkoOsLXE9sx8nvSZtER7pQiZUg5UoHUQGqeq34VHeFONaQ6UoKUImVIOVLrbIz+nAOM1PbdaiA1iSo6wp1aZ+O+H/WoaVl1pAQpRcqQcqQCqYHUJKroCHcKZaOjbHSUjY6y0VE2io5wPqvgx33hmFUgNZCaRBUd4U41pDpSgpQiZUihbAjKhqBsCMrGuu0b917osxr315xVR0qQUqQMKUcqkBpITaKKbnGnUDYMZcNQNgxlw1A2DGXDUDYMjbKjUS66w8vGo0Ky6kgJUoqUIeVIBVIDqUlUXEihbATKRqBsBMpGoGwEykagbESRjfn2pNFoi2vYmESNC6mG1Dob7Vndf7Se91Hr/nA0lUfZyMqRCqQGUpOodX+4VQ2pjpQgpUihbEyUjYmyMVE2JslGuy6kGlKClCJVjPJ8a79HT+sb3cqRCqQGUpOoYi3AnWpIdaQEKUUKZaOhbDSUjYay0VA2erFOZNdH5auA1htSHSlBap2N/jqP6tGzMqQcqUBqIDWJkgspsIborTpSgpQiZUg5UoHUQGoSpRdSKBt6nI3/3J/+97tfP373/U8//nabT7/4r59/+P3jLz9//vj7//3z7Ve+//XjTz99/Me3//z1lx9+/Nu/fv3x259++eHTr324Pv/nr71L/6Z3k09/nz8+X35/lnZ//hSm+++o3/T7Lu792f74dYtv7l/+9OufAnDvoeb9Ocb9Of743O7fT/TT5/HH57h/XTXuz5+Go396l26367o//3H0Vv/GPv1mfxyU799dP/1t/P533v/W/wc=", + "bytecode": "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", + "debug_symbols": "nd3bruS2tYXhd+lrX4jkPOZVgo3ASZygAcMOHGcDG0HefasNl8ppci6a/42xKp2vDzWHVKohifr3p79+9+d//f1Pn3/424///PSHP/770/c//uXbnz//+MP96t//+ebTn3/6/P33n//+p9/+z5+uL/8Z9sv//5//+PaHLy//+fO3P/386Q9N2zefvvvhr19+stv/7fP33336g17/+Z9vPg1fi3gJG1+LWIp+PUK+Fnkq5DoW7Vj0YzGOhZwKPf4z9PzP0GNhx8KPxXGu9DhXdpwrO86VHefKjmduxzO345nb8czteOZ2PHM7nrkfz9yX8+hmv4pu/rVYvlc9XmJc7WvhxyKORZ6KuI5FOxb9WIxjIcdCj8Vy5mP0l5D4WvixiGORpyKvY9GORT8W41jIsdBjcTzzPJ55rmeuTxJTvxZ5Ktp1nZN2Tvo5GedEzomeEzsnfk7inJxPv51Pv51Pv51Pv51Pv51Pvy2nL9frW5JIn4idEz8ncU7ymPTrnLRz0s/JOCdyTs6n38+n38+n38+n38+nP86nP86nP9bTl1etoJdMZJwTOSd6Tuyc+DmJc5LHZF2sfEzaOTmfvpxPX86nL+fTl/Ppy/n05Xz6spy+2uvIUqdvqU2X09d2PSQm0s5JPyfjnMg50XNi58TPSZyTPCZ2Pn07n76dT9/Op2/n07fz6dv59NcdmLr8SuyyicQ5yWOyrsE+Ju2c9HMyzomck+X07dnBmuRE7Jz4OYlzksdkXex9TNo56edknBM5J+fTj/Ppx/n043z6cT79PJ/+uuOz9jq6MJ0OSNYl38dknBM5J3pO7Jz4OYlzkqekr7u+j0k7J/2cjHMi50TPyXr69vrct5yJn5M4J3lM1l3fx6Sdk35OxjmRc6Ln5Hz67Xz67Xz67Xz6/Xz6/Xz6667Pn4LIx5jIOCdyTvSc2DnxcxLnJI/Juuv7mLRzcj79cT79cT79cT79cT79cT79ddfnI1/EZ5LHZN31fUzaOennZJwTOSd6Tuyc+Dk5n76cT1/Pp6/n09fz6ev59Nddn/uLRLOJ6Dmxc+LnJM5JHpN11/cxaeekn5NxTs6nb+fTt/Pp2/n07Xz6dj79ddcX/fWVJ+ZNbN31fUz6ORnnRM6JnhM7J35O4pwspx/P9LN/fXlDX3d9H5N2Tvo5GedEzomeEzsnfk7Wl2N+cFlpXxd3H5N2Tvo5GedEzomeEzsnfk7inKwv07qeCwHb1xdRjOv4atxxtXPSz8k4J3JO9JzYOfFzEufk+FLssa6h7pNyz605PmbkBAVBCdC6jtqhRtD6LoyrjRe6+owGQUKQEmR7NN3ftS6ndigISoDWFdUONYI6QYOgIhHy3HJyTVd9j6EEGUFOUGyRTncKFjf+fYyKe/82qBFUJMLeaLrAYxQ3AW6QEKQEGUFOUBCUAGmRiNAH5TRcbQR1ggZBskfzG6EEGUFO0DoR7f1B3VpOKAEq7uPcoFag/qB+TagTNPZIJyQEKUFG0DoRbTyJaDKlvLi/c4MSoOIuz/9CU2C9uPHWXt/i293yTEgIUoKMICcoCEqA4iKo2Ajz+dRo894oBkFCkBJkBDlBQVAx3P6e05jXeSiGO57d8n2KbUKNoE7QIKjY3Pt4vxHTzjKVICPICQqC8hzJdRHUCAL7clm3Uu3ukV7o7ocmpAQZQV6g641iQkFQblH7+jNX1peW7VAjqBO0TsT9nf5BY15GRghSgopEdH+jKeVFv7dBsUVyTSgBKvq9DWoELeekdr02d7UxbU/r1m2HjCAnKAhKgIrWTcazUJSMnFAjqBM0CJItknlFJyXICHKCgqAESC6CGkFFIt5LjonZhAZBQpASZFvkbUJOUBCUABWtm/gbxfRGFK3bBnWCBkFCkBJkBDlB60To9Rx8aJuHmwAVrdsGNYL6Hk1vRNG6bZAQpAQVazOO5xuAzh/UReu2QUFQkYhxvdH0taFo3TaobdHU74l3ggZBQlCRCH0nwqaUF/3eBjlBsUdTYNcXhTWL57jcprV1pKjqNmgQJAQpQUaQExQAFa2bXe81XOe9UdG6bVAnaBAkBClBRlAxXHnPSfuEiuE+S1U1mxeQLVq3D5EWrdsGNYKKREh7vxFjQoMgIUgJMoKcoCAoAWpgX65F6+b9tc7C/eOMBkFC0Hq4v70ubLo2R3/HVXULBK6qU3JVnZKr6pRcVafra92sP62b9al103XrtkNKkBHkBAVBCdC6dduh9fJbMV7oPhCaNo1i+bUNGgQJQbpFOr8RRpATFAQlQMVybBvUCOoEFYkweZD3CQlBSpAR5HvkEwqCEiC9CCoSEW+U0xuhnaBBkBCkBBlBTlAQlACtW7f7W9/rBM/9XW5KxLp126FO0CBItqjPb4QSZAQ5QetEpPQHTb2Rrlu3DfKLoCIRTyl4o/khHp2gsUc5ISFICTKCikToOxHTLV/qQVACFNcWzZ+E69btPrx47Y3ug4YZCUFKkBHkBAVBCdC6qtuhRlCxEcZ4EpHTd8IUgpQgI8gJCoLyHNl1EdQIWq+yebXnmo9rqkts3YXp+xYZnW/7sXUXtkNOUBCUAK0vW9uhRlAnaBBUDDefBaTbNT/aav2W9+fyjfvHnFACtG6odqgR1AkaBAlBSpAR5ASRRHSSiEESMUgiBknEKBLhz0bYY9rDDiFICTKCnKAgKAGSi6BGUCeIJEJIIoQkQkgihCRCSCKEJKJ4XMF4H/iOcU2oEdQJGgQVq9C7Px/U8/Fe9RSCj5ETFAAZmZORORUPFxj+PPRiTEsoWfF4gQ0SgtbDHc+6MDeaH7NpBPkWxfzuBUEJUPGwgQ3q599zzQdBRYnxPCf5/nFGSpARVJQYom80Zc+DoNyj6dgoLoIaQZ2gQZAQpAQZQU5QEEQSkSQRVa3l40Exo07QIEgIUoKMICcoCMpz5NdFUCOoE7ROxPsC7vvsqE5ICNItmq7N8aJ12yAnKAhKgIrWbYMaQZ2gQZAQRBLRSCJakYjnKtX7fHmfUBCUABWl4AY1gjpBgyAhSAkygkgiOklEJ4kYJBGDJGKQRAySiKIU1GelWNXpylsvSsENMoKcoN9xo/K0NxoJUFEKfnh3sxel4AZ1ggZB60VKr+cChH5NFyD4uqrboSAoAVpXdTvUCKqeMPh8o/YFGgQJQUqQbdH0kCpXJygISoDsIqgR1AkaBBWJsOcsq7tNSAkygpyg2KKYdsvV80c/RNUTSD9GjaAiEfFGOb0R1XNIP0ZCkBJkBDlBQVACVDSJ8ayuqzGtguxFk7hBnaBBkOzR/EYoQUaQE7RORMhT54dMhzlFk/gxKprEDSoS8b5iJqYrZrxoEjdobNFUsnvRJG6QEmQEFYmwdyKmxUG8aBI3KM9RFE3ifyGbUPH8Un0V0vePM5I1ylf2rE/XUEX1dNGPkRHkBAVBCVDxnNENagQVG+FzL6vG9JU1iqpug5QgI8gJCoISoKKq26D1bjmfaxLtmodb3GF6PRcg2BVjQsWm8TxcxVq7JhQEJUDFfZ8b1AjqBA2ChCAjyMG+fARBxXAl3+jrg4+Qi6C2RVOTGNIJGgQJQevhvi9Kt6vPb4QTFAQlQOtaa4caQZ2gQRA5YtHidvxnhVObl4MOdYL2t+NPK5yGJkAGbsePdUO1Q52gQdC6W+7P7cN9XgU51r3RDgVB6+Ut7oOHX1HLa/p0LxYZ26BGUN+jmNB6wZPUZ72w1BkJQU5QEFScA3hON/drWrQv4iKoEdQJGns0HRKs25wdUoKMoACBjQQoL4LWG2H2Z0mpnD8AikXGNmgQJATpHuWEjCAnKAjK831EFouMbVAjqBM0CBKClCAjKM73EVk8evJ6Vgu4f/z6kzDbRVAjqNiX//YksExoECR7lBNSgowgcIY/18VM12dFka7pE2oEdYLWc2rPkzx6m675yHUFtENKkO3RtD2ty6benkWae4sZBUDrCmiHOkHrOb3vkezzPZK5roB2SAmyLZo39+EEBUEJkDSQPekEDYKKjVCfzX2ugFKUICPI92jaGxWXQ21QAlRcDrVBZHNXsrnrIEgIUoKMILJbVrJbXvdGm8193Rv9d10ypXzdG+3QOC9m0oQgJcgIWq/H0p/7CaXn9JYXy2RtUCNoPSeRZw8rOh18rHujHRKCdI+mlK+vN+riz5wkpjmtG6odWm+E+ixf2+d7G7JoqN4r2ne1rxvfLHqjj/96RW+0QbL9N02X2WTRG22QEeQEkTlFApQXQY2gTtAgSPaBnZESZAQ5QQE2wgRbbruuC6kiE+9GQvWaVUdqICVIKVKGlCMVRBW104efVLdqSHWkfsenQZ+VIKVIGVLgk/tWgVQSVVRdO4W25aK30ueRyfePbVaClCJl+zpunnLRXe1UnFd/t0qixoVUQ2o5L/GnTpf5uQm3UqQMKUcqkEqi1pc/3V+XnmMh83kvWpRfO9WRGlsVi3/XOhvtOcaTNp0bvJUiFUglUcX68s30UdO6RrdqSHWkBlKyVzErRcqQcqQCqSTKLqQaUh2pgRTKhqFsFOvNt3yes3EX77NypAKpJKoo03aqIdWRGkgJUkY+U4p2bKcCqfXRl+Xr0tDu13xEVFzCtVMNqY7U2KrFvIo6bqcUKUNqnQ1/n6RbHX0VldxOJVFFKbdTDamO1EBKkFKkDCmUjUTZSJKNdl1INaSKbDyfy92ntSVvNZASpBQpQ8qRCqTW2bjPL71UTqfuWis6vZ1qSK2zke+Ti/NzUG41kBKkFClDypEKpJKootPbqYYUykZH2egoGx1lo6NsrJvAcZ9n+VWNu36eVSCVRK2bwK1qSHWkBlJFNlLeymalSBlSjlRsVZ9zWFw7t1FF67hTDamO1EBKkFKkDClHCmVDUDa02G/Ie6ucz+s1bUh1pAZSslZPDzAuXyhFypBypAKpJMoupIpsZHtU5qw6UgMpQUqRMqQcqUAqifILKZQNR9lwlA1H2XCUjXUvOu5jnpe6d8+zcqQCqSRq3YtuVUOqIzWQWmfj/biXsTjH0da96FYZUkU2vL3VnMMIpHKrYj6ezwuphlRHaiAlSClShpQjFUiRbPTrQmqdjf5ciTF6y1l1pAZSgtQ6G308e4Aui3fDkPKtmi6Uv1UglUSte9Gtakh1pAZSgpQiZUihbDSUjVZk470H6PNVi71fSDWkOlIDKUFKkTKk1tl4P5bu/nHe2xS96E4lUUUvOq54K5tVQ6pv1dzA9KIX3SlBSpEypBypQCqJkguphhTKhqBsSJGNd2M25sasiyJlSDlSRTb8vQeIxbuRRBW96H+pmFVDqiM1kBKkFClDypEKpJIoQ9kwlI2iF5XxuiNjiMxbStGL7pQgpUgZUo5UIJVEFb3oTjWkUDYcZcNRNhxlw1E2il5Unqt0hsxX6fSiF92pJKroRXeqIdWRGkgJUoqUIYWyESgbRS8qz0LeQ/v8zbfoRXeqIdWRWmdD7flGrzG3WEUvulOKlCHlSAVSCdQoetGdWmfD3t8drMusOlIDKUFKkTKkHKlAKokqetGdQtloKBtFL2rPPcXDzGYlSClShtQ6G349W6XPrf4oetGdSqKKXnSnimyEPeqa342iF92pgZQgpUgZUo5UIJVEFb3oTqFsDJSNgbJR9KIu78xPD6q6lSJlSBX7jedZimN+5uWtAqncKp0681H0ojvVkOpIrbPhz3N4x+KOjFH0ojulSBXZ8PFWbVaOVOyVzyqJKnrRnWpIdaQGUoKUImVIOVIoG4qyUfSicT3fl+cnQN6qIdWRGkgJUoqUIeVIBVJJlKNsOMpG0YtGPMfzkfP3lKIX3SlBSpEqsmHPJ1EsPh2KXnSnAqkkquhFd6oh1ZEaSAlSihTKRqBsBMpGoGwkykaibCTKRqJsJMpGomwkykaibCTKRpJsyHUhtV5l5Ypn5a52XbPqSA2kBClFypBypAKpJGrdi24VykZD2WjFCjwfrkgm6150qxQpQ4qssySNrLMk/UKqIdWRGkgJUoqUIeVIrbPRx3u9eF2oJGpcSDWk1tn47Tr487U9sm44t0q2av7uIMU6nDtlSDlRxaOB7y94vyqLueGU4tnAO9WRGkgJUorUel7jOVN8z0Zn5UgFUrlVc5sqxTqc9z75pe7NfVYNqfW2LM8KIff75bNab8vyrGN2/23mY9Fibczd39CRiv2/a96zFWtjblSxNuZONaTQvIq1MXdKkFKkDClHKrbpvRYqiSrWxtyphlQnW6WjbblYG3OnimzEc4wtabMypBypQCqJiguphlRHaiAlSKFsBMpGoGwEykagbKybwPvj+r19yXxUuW4Ct6ojNZASpBQpQ8qRCqB03eltjg+16PR2qiO1nvLId3rn61K06PR2SpEypHyr5s8vLTq9nUqiik5vp8i3AC06vZ0aSAlSipQh5UgFUklUJ/t57R2pgZQgpUgZUo4U2s8Xnd5GjQupIhvv/bzGmFVHaiAlSClShpQjFUglUXIhhbIhKBtSZOPdmdt8PbYWz9bZKd2qrrMypBypQCqJKvrDnWpIdaQGUoIUyoaibBRdpT3X997t2HwsWnSVO5VEFV3lTjWkOlIDKUFKkTKkUDYMZcNQNhxlw1E2HGXDUTaKrtKe63vvRnj+TCm6yp0ypByp/bP8FvsoT6KKrvLjJwBq0VXuVEdqILWcl+vTzrnNax/puj/cqkAqiVr3h1vVkFqfXx7tdQbcxnynpK77w60SpHSv5u1r3R/aeFYJu39cKEdqmY17x/ZKr0lfvPO5VhKPsqk9sKuDv6FdAynZ/7varBQpQ8qRIvOyK4laN4Fb1ZDqSA2kZJteXShFypBypIJslQ1ty/1CqsjGs17l/RvorDpSAylBSpEypBypQCqJGhdSKBsDZWOgbAyUjYGyMYps+Hv7yjErRyqQSqKK6w93qiHVkRpICVIGjg9NHKlAaj3l8dx9f+d7Tu+6CdyqhlRHamzV4vNLBSlFypAi3wJMA6kkyi6kGlLoG4ehbxwmSClSaD9vaD9vaD/vaD/vaD/vaD/vaD/vaD/vihQ6Blh3evfO9dlv3KdPZxVIJVHrTm+rGlIdqYGUIKVIGVIoG4GyEUU23p9f9+mCSeWFVNuq+S4JK/rDnRpICVJFNp7Vme7P4PmdLzq9nUqg/LqQakh1pAZSgpQiZUg5Uuts3P3bS90Fw6ySqKI/3KmGVEdqICVIKVKGFJpyQ1PuaModTbmjKXc05Y6m3NGUO5py0QTuVJENfStbqCSqaAJ3qiHVkRpICVKKlCHlSKFsDJQNQdkQlA1B2SiawPuI/aXuA5lZCVKKlCHlSAVSSVTRH+5UQ6ojhbKhKBtFf3gfUTxqzOkt+sOd8q2S+aiy6A93Kokq+sOdakh1pAZSgpQiZUihbBjKRtE63pl5lE/X23jROu5UQ6ojNZASpBQpQ8qRCqRQNgJlI1A2AmUjUDYCZSNQNorW0fO9Xsq8PoAXreNOBVJJVP6OVXHmfVQ2pMiqOJ4DKUFKkVrOK3q8Gs7o8/3mvm4dNyrWreNWNaQ6UgOp9bxSnk4v53Wxomgd83nm3f3j4s8yoopOb6caUustJW28VZvVQEqQUqQMKUcqkEqiiiZwpxpSKBsdZaOjbHSUjY6yUTSBma/t6z5Pk7MKpJKoogncqYZUR2ogJUgpUoYUysZA2RgoG4KyISgb6ybwPkl4PWq+GjPWTeBWCVKKlCHlSAVSSdS6CdwqNGVFU1Y0ZS2m/Dyb4D7nes3KkHKkAqncq+l7ZVgx5ecquPvHeVted3pb1ZEaSAlSipQh5UgFUkmUo2w4yoajbDjKhqNsrDs9b885X2/zOd9Yd3pb5UgFUknUutPbqoZUR2oghaYcaMqBphxoyoGmnGjKiaacaMqJprxu57aqyIY++402P0c10pBypAKpBCqvC6mGVEdqICVIKVKGlCMVSKFsNJSNhrLRimw8TyfxljmrgZQgpUits9Hb8+2mN59VErXuD7eqIdWRGkgJUooUmte6P/T38zi8a5tVIJVEjQuphlRHaiAlSClSaMoDTXmgKQuasqApC5qyoCkLmrKgKRdN4E4V2fC3yoUKpJKoogncqYZUR2ogJUgpUut5jedJrz7m50ll0eltVNHp7VRDqiM1kBKkFKn1tjzGcyw6ZD4WLTq9nQqkkqii09uphlRHaiAlSKEpO5qyoyk7mnKgKQeacqApB5pyoCkXnd5OFdl4t8QjFsqRCqSSqKLT26mGVEdqICVIKVIoG4mykSgbCbLRr+tCqiHVkRpIrbMhz0qhLv2alSJlSDlSgVQSVXR6O9WQWmdDxnOFiUif1UBKkFKkbK9iVo5UIJVEFf3hTjWkOlIDKUFKkULZ6CgbRX8o9pz/kpBZJVFFf/hblfMeoOgPd6ojNZASpBQpQ8qRCqSSKEHZEJSNonXU69lStM9HDkXruFOyVWP+dChax50ypBypQCqJKlrHnWpIdaQGUigbirJRXLWoz10trjZ/OhRXLe5UIJVb5fNnStFw7lRDqiNVZOO36+rP+6ii4dwpRQo8B+FWjlQglUStW8fw1+2VOT3r4jYDGAFGgTFgHJj1jPx63m1vc86LztDf57zmtQ5u1ZEaSAlS623qPoP3VmNWhpQjFUglUUVnuFMNqY7UQEqQQtlIlI1E2UiUjSTZaEVn6PpWfs2qIdWRGkgJUoqUIeVIBVJJVEPZaCgbDWWjoWw0lI2iM3yvkOAxPbf6VoaUIxVIJVFFZ7hTDamO1EBKkELZ6CgbHWWjo2x0lI2iM4z+HLPF3K63ojPcqY7UQEqQUqQMKUcqkEqiBGVDUDaKzjDind7UWQ2kBClFypBypAKpJKroDHeqIYWyoSgbirKhKBuKsqEoG4qyoSgbhrJhKBuGsmEoG4ayUXSG+TxFzlN9VoaUIxVIJVHFVZE71ZEaSAlSaMqOpuxoyo6m7GjK66si42qvWjTuk7qzakh1pAZSgpQiZUg5UkFUoiknmnKiKSeacqIpJ5pyoiknmnKyKSdQvVi98D53+Sgfs2pIdaQGUoKUImVIOVKBVBLVUDYaykZD2WgoGw1lo6FsNJSNVmQjX3fORps7ot4CqSSqX0its9Gep3dF6/M+at0fbpUiZUg5UoFUErXuD7cKzWvdH8bdAj1KY1YDKUFKkTKkHKlAKomSCyk0ZUFTlmLK+Tq7FH1aX/FWipQh5UgFUkmUXkg1pDpSAymUDUXZUJQNRdlQlA0t1jDv8qjFtwC7kGpIdaSKNczfx1Hd+6wEKUXKkHKkAqkkysH69rdqSHWkjte3/8/96n+//enzt3/+/rt/3ubLL/7rh7/8/PnHH359+fP//eP1K3/+6fP333/++5/+8dOPf/nur//66bs/ff/jX7782qfr1//88T40uL65P7Pbl7/PL6+H3K8179dfInj/HfV+Pa77tf7y63G/lvHl17/E5v748G/uPbTdr/2X13L/fuJfXn8Z9f1LX37d9X6dv7x2++bekuJ+/cu3NLFv9Msf/suXr/t371/+NnL/O+9/6/8D", "file_map": { "50": { "source": "fn main(x: Field) {\n // The parameters to this function must come directly from witness values (inputs to main).\n regression_dynamic_slice_index(x - 1, x - 4);\n}\n\nfn regression_dynamic_slice_index(x: Field, y: Field) {\n let mut slice = &[];\n for i in 0..5 {\n slice = slice.push_back(i as Field);\n }\n assert(slice.len() == 5);\n\n dynamic_slice_index_set_if(slice, x, y);\n dynamic_slice_index_set_else(slice, x, y);\n dynamic_slice_index_set_nested_if_else_else(slice, x, y);\n dynamic_slice_index_set_nested_if_else_if(slice, x, y + 1);\n dynamic_slice_index_if(slice, x);\n dynamic_array_index_if([0, 1, 2, 3, 4], x);\n dynamic_slice_index_else(slice, x);\n\n dynamic_slice_merge_if(slice, x);\n dynamic_slice_merge_else(slice, x);\n dynamic_slice_merge_two_ifs(slice, x);\n dynamic_slice_merge_mutate_between_ifs(slice, x, y);\n dynamic_slice_merge_push_then_pop(slice, x, y);\n}\n\nfn dynamic_slice_index_set_if(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 1);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[1] == 0);\n if x as u32 < 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice[x - 1] = slice[x];\n } else {\n slice[x] = 0;\n }\n assert(slice[3] == 2);\n assert(slice[4] == 2);\n}\n\nfn dynamic_slice_index_set_else(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 1);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[1] == 0);\n if x as u32 > 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice[x - 1] = slice[x];\n } else {\n slice[x] = 0;\n }\n assert(slice[4] == 0);\n}\n// This tests the case of missing a store instruction in the else branch\n// of merging slices\nfn dynamic_slice_index_if(mut slice: [Field], x: Field) {\n if x as u32 < 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n } else {\n assert(slice[x] == 0);\n }\n assert(slice[4] == 2);\n}\n\nfn dynamic_array_index_if(mut array: [Field; 5], x: Field) {\n if x as u32 < 10 {\n assert(array[x] == 4);\n array[x] = array[x] - 2;\n } else {\n assert(array[x] == 0);\n }\n assert(array[4] == 2);\n}\n// This tests the case of missing a store instruction in the then branch\n// of merging slices\nfn dynamic_slice_index_else(mut slice: [Field], x: Field) {\n if x as u32 > 10 {\n assert(slice[x] == 0);\n } else {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n }\n assert(slice[4] == 2);\n}\n\nfn dynamic_slice_merge_if(mut slice: [Field], x: Field) {\n if x as u32 < 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n\n slice = slice.push_back(10);\n // Having an array set here checks whether we appropriately\n // handle a slice length that is not yet resolving to a constant\n // during flattening\n slice[x] = 10;\n assert(slice[slice.len() - 1] == 10);\n assert(slice.len() == 6);\n\n slice[x] = 20;\n slice[x] = slice[x] + 10;\n\n slice = slice.push_front(11);\n assert(slice[0] == 11);\n assert(slice.len() == 7);\n assert(slice[5] == 30);\n\n slice = slice.push_front(12);\n assert(slice[0] == 12);\n assert(slice.len() == 8);\n assert(slice[6] == 30);\n\n let (popped_slice, last_elem) = slice.pop_back();\n assert(last_elem == 10);\n assert(popped_slice.len() == 7);\n\n let (first_elem, rest_of_slice) = popped_slice.pop_front();\n assert(first_elem == 12);\n assert(rest_of_slice.len() == 6);\n\n slice = rest_of_slice.insert(x as u32 - 2, 20);\n assert(slice[2] == 20);\n assert(slice[6] == 30);\n assert(slice.len() == 7);\n\n let (removed_slice, removed_elem) = slice.remove(x as u32 - 1);\n // The deconstructed tuple assigns to the slice but is not seen outside of the if statement\n // without a direct assignment\n slice = removed_slice;\n\n assert(removed_elem == 1);\n assert(slice.len() == 6);\n } else {\n assert(slice[x] == 0);\n slice = slice.push_back(20);\n }\n\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 30);\n}\n\nfn dynamic_slice_merge_else(mut slice: [Field], x: Field) {\n if x as u32 > 10 {\n assert(slice[x] == 0);\n slice[x] = 2;\n } else {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice = slice.push_back(10);\n }\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 10);\n\n slice = slice.push_back(20);\n assert(slice.len() == 7);\n assert(slice[slice.len() - 1] == 20);\n}\n\nfn dynamic_slice_index_set_nested_if_else_else(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 1);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[1] == 0);\n if x as u32 < 10 {\n slice[x] = slice[x] - 2;\n if y != 1 {\n slice[x] = slice[x] + 20;\n } else {\n if x == 5 {\n // We should not hit this case\n assert(slice[x] == 22);\n } else {\n slice[x] = 10;\n slice = slice.push_back(15);\n assert(slice.len() == 6);\n }\n assert(slice[4] == 10);\n }\n } else {\n slice[x] = 0;\n }\n assert(slice[4] == 10);\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 15);\n\n slice = slice.push_back(20);\n assert(slice.len() == 7);\n assert(slice[slice.len() - 1] == 20);\n}\n\nfn dynamic_slice_index_set_nested_if_else_if(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 2);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[2] == 0);\n if x as u32 < 10 {\n slice[x] = slice[x] - 2;\n // TODO: this panics as we have a load for the slice in flattening\n if y == 1 {\n slice[x] = slice[x] + 20;\n } else {\n if x == 4 {\n slice[x] = 5;\n }\n assert(slice[4] == 5);\n }\n } else {\n slice[x] = 0;\n }\n assert(slice[4] == 5);\n}\n\nfn dynamic_slice_merge_two_ifs(mut slice: [Field], x: Field) {\n if x as u32 > 10 {\n assert(slice[x] == 0);\n slice[x] = 2;\n } else {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice = slice.push_back(10);\n }\n\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 10);\n\n if x == 20 {\n slice = slice.push_back(20);\n }\n\n slice = slice.push_back(15);\n\n assert(slice.len() == 7);\n assert(slice[slice.len() - 1] == 15);\n\n slice = slice.push_back(20);\n assert(slice.len() == 8);\n assert(slice[slice.len() - 1] == 20);\n}\n\nfn dynamic_slice_merge_mutate_between_ifs(mut slice: [Field], x: Field, y: Field) {\n if x != y {\n slice[x] = 50;\n slice = slice.push_back(y);\n slice = slice.push_back(x);\n } else {\n slice[x] = slice[x] - 2;\n slice = slice.push_back(x);\n }\n\n slice = slice.push_back(30);\n assert(slice.len() == 8);\n\n if x == 20 {\n slice = slice.push_back(20);\n }\n\n slice = slice.push_back(15);\n\n if x != 20 {\n slice = slice.push_back(50);\n }\n\n slice = slice.push_back(60);\n assert(slice.len() == 11);\n assert(slice[x] == 50);\n assert(slice[slice.len() - 4] == 30);\n assert(slice[slice.len() - 3] == 15);\n assert(slice[slice.len() - 2] == 50);\n assert(slice[slice.len() - 1] == 60);\n}\n\nfn dynamic_slice_merge_push_then_pop(mut slice: [Field], x: Field, y: Field) {\n if x != y {\n slice[x] = 5;\n slice = slice.push_back(y);\n slice = slice.push_back(x);\n assert(slice.len() == 7);\n\n let (popped_slice, elem) = slice.pop_back();\n assert(slice.len() == 7);\n assert(elem == x);\n slice = popped_slice;\n } else {\n slice = slice.push_back(x);\n }\n\n slice = slice.push_back(30);\n assert(slice.len() == 7);\n\n if x == 20 {\n slice = slice.push_back(20);\n }\n\n let (slice, elem) = slice.pop_back();\n assert(elem == 30);\n\n let (_, elem) = slice.pop_back();\n assert(elem == y);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_0.snap index f0ae528f8fa..9bfc89425f8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_0.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zd3fjuPGlYDxd5lrX1Sd/5VXCRaB7TjBAIYd2M4CiyDvvpqxRRlTDXOzah59N0a3R13zc1v8RFI81L8+/PW7b/759798/OFvP/784U9//teH73/89utfPv74w+27f/37qw/f/PTx++8//v0vv//XH8anf0z7/Pif//H1D5++/fmXr3/65cOfps+vPnz3w18/fRW3n//bx++/+/AnH//+r68+TP+PfyLe/om6/0Tolz+R//FP1Js/IeP4Cfv9T3z1f3/op8XXhYvLuHLxeeXicuXieuXiduXifuXiceXieeXiV26hcuUWqlduoXrlFqpXbqF65RaqV26heuUWqlduofbss0UifnuoRH65+LO/c6n74jrml4v7lYs/+ztXlfviVl8unlcuXlcuvi5c3J+tovrxP3T5ySaR89j1S/3y/75PjEQwEsVIDCNxjCQwksRICiNZFElgGhuYxgamsYFpbGAaG52NHVPvyw7ZJIGRJEZSGMl6leTLs5M5MJKJkQhGohiJYSSOkQRG0tpYO5Yd23FxFkayKJIaGMl8kcS/fMeqBCNRjMQwktbGxkMS2zM2MJLESAojWRTJGhjJxEgEI1GMpLWx5YdkfdnY5RhJYCSJkdSrJNszdlEkcwwOZXIonZmd8/6e5O2rsVGUQzEOxV9F8Y0SHEpyKMWhdNZ26tGVads1nXNwKJNDkVdRtvBP5VA6N2aJdV9WMjdKcSgLQ5HBoUwORTgU5VCMQ2ndX1nHsnPfzZbkUIpDWRiKDg5lcijCobQmTh5d0W2kSFsTp8clO2LbeJY6hxIcSnIorTuUoo+n7XZ0qAtDscGhTA5FOBTlUIxDcQ6Fc8xsnYnTcSyrY9tJsIWhtM7YnFDmiyhzOwHWOmVzQlEOxTiUzsSp5EHZE9c6aXNCSQ6lXkSx7a2p1mGbP6a0TtucUCaHIhyKcijGoTiHEhxKciic2ganttfN3XxefV66+rNNtHG/XZKZ/PFDPcb9wMlDtwOnpwdk3pFiHIpzKMGhJIdSHMrCUJ6ek3lHyuRQOLUtTm2LU9tqrO3trPJxp0HTtVGCQ0kOpTiU9SKKbW/BrsGhTA5FOBTlUIxDcQ6ltbaP279abO+Rr+RQikNZFIqM8SJKzo0yORThUJRDaa1tPii1P22dQwkOJTmU4lAWhjIHhzI5lM7a+jiuvfG5JW4qh2IcinMo8SrK/rRNDqU4lIWhSGdtXeOgbOfiRCaHIhxKa211PCi1UYxD8RdRtqFWkeBQkkMpDqW1tv6o7X4mQTu7EnVcxBDbhQCiyqEYh+IcSnAoyaEUh7IwFOvcdYrx+DCzfYfShENRDsU4FOdQgkNJDqU1cfboistGaU3ccd3ijPjyDTvxwaFMDkU4lNba2nw8bbc9fjcOxTmU4FCSQykOZWEoMTgUzjFzdCYuxe7LpuwU41CcQ+lM3O8/TWj7VAeJ5FDqRZTtM5YkFoaSg0OZHIpwKMqhGIfiHEpwKMmhcGqbnNpeNx/0efV56epPN9HuvxofJw8NOUZPQ7bRU3l+iuf9KMahOIcSHEpyKMWhLAzl+Sme96NMDoVT28Wp7eLUdnFquzi1XY21tdI7xcq2syCrOJRFoegYHMp8EcXHRhEORTkU41CcQwkOJTmU1tqGHZSUjbIwlDk4lMmhyKsouVGUQzEOxTmU1trWg7L2p21yKMWhLAxFBocyORThUJRDMQ6ls7bruBGUrbnVVoJDSQ6lOJT1IopsT1sdHMrkUIRD6aztMjko2/CZqnEozqG01vaYr71RbKMkh1KvoqyNsjAUGxzK5FAanytu874X57bX1haG4oNDmRyKcCjKoRiH4hxKcCitL4elR23X3CgLQ4nBoUwORTgU5VCMQ3EOJTiUxoMPH/O4E/rYRmc0O3edho3HY2ujTA5FOBTlUIxDcQ4lOJTkUApDqdbEreOxc2ynejqv43c57oR++3I7k9B5Hf8ZxTmU4FCSQykOZWEondfxu+SROKltL67zOv4zinAoyqEYh+IcSnAoyaEUh7IoFBuY2trA1NYGprY2MLW1gamtDUxtbWBqa53X8bs+3m5QHRulOJSFoXRex39G6UzczDwO37fzttZ58fwZxTgU51A4XZmcrszWrqQclPzyCjCTwaFMDqUzcbc3wh4U2yjKodiLKLVtQZ1XrJ9RgkNJDgVzMZop5mI009aL0fw4WWq+U4RDUQ6lM3Fm/qBsr0HqHEq8irI2SnIoxaEsDMVaa5t6UGqnTA5FOBTlUDpr+/j8Pfftsisz51CCQ8kXUbYbV1rroMUJZWEorYMWJ5TO2vrxcSnuse3FtQ5anFCUQzEOxTmU4FCSQykOZWEoMTgUTm2DU9vg1DY4tQ1ObYNT2+DUNji1jdba5jEJ49un/FjrJMwJZXIowqF01jaOO4147AcfrZMwJxTnUOJVlNwoyaEUh7IwlNahnBPK5FCEQ1EOxTgU51A4tS1Oba8bVfq8+rpy9acHim472MevZvvNPD0j5PO4pDfqjx8q47iLkYztLkb29IzQO1KUQzEOxTmU4FCSQykOZVEo/vSM0DtSMLX1gamtD0xtby+/fRTP46Oub1/uFOdQgkNJDqVeRHHbKAtDmYNDmRyKcCjKoRiH4hxKa23jOPTMjI2SHEpxKAtDkfEiSs2NMjkU4VCUQ2mtbT0oa3/aOocSHEpyKMWhLAxFB4cyOZTO2tY8Lv8t2RKnyqEYh+IcSryKsj9tk0MpDmVhKNZZ27JjkLgsN8rkUIRDUQ6ltbaPG8vWdmNZN+dQ4kWUbXrXLTmU4lAWhuKNtY3p9+nd25db+F07KevelZDt4gt341CcQwkOJTmU4lAWhhKDQ2nddapjwqG2q9Y9lEMxDsU5lOBQkkMpDmVhKNl5oLqOj5KIsScuO3edxnHXxRi17VBm607CkGOHco6NkhxKcSgLQ6nBoUwORTgU5VCcQwnMMXMlh9KaOFsPynZasBaGssaLKNt4ta/JoQiHohxKZ+IenwQZQ/anbXAoyaEUh7IolOgctDijTA5FOBSjnIuLzumGENWDojslOJTOxInkg+IbpTiU9SKKfbnHH53TDWeUyaEIh6IcinEozqEEh5IcSnEonNoKp7bXTTd8Xl0uXf3pJqYde5Xxxw8Viftjb7/QbQ/0+RmE96M4hxIcSnIoxaEsDOX5GYT3o0wORTgUTm21sbZz+bHs8u01SJNDKQ6lsyvjuHO+jPnlZEbY4FAmhyIcir6KEhvFOBTnUIJD6UxcLT8SN7bE2cJQfHSGX+Kg7Cd6fXIowqEoh2KvoqyN4hxKcCjJoXB2KH1hKDE4lMmhCIeiHIpxKM6hJGaHMjrPxQ2Tg2K6URaGkoNDaT1m/v09NLddpxQORV9F2XYS0jgU51CCQ0kOpTiUhaHU4FAmhyIcCqe2xant0/MqcXw6RLyxely6el66el26+rpy9afHOf549Xnp6nLp6nrp6nbp6pduq+vSbXVduq2uS7fVdeW2mmNcuvrT2+o8Zgz95KHidbzf7ys3inAoyqEYh+IcSnAoyaEUh7IwlKenHt6Rwqnt7OyK6P0jA25fbq9B0zmU4FDyRZTtRGTO4lAWhiKDQ+ncdZp+dGWf/k5RDsU4FH8VZQu/BIeSHEpxKJ2Jm1kHpb584zR1cCiTQxEORTkU41CcQwkOhbMXp617cb+fMtlemW1wKPNVlO01yIRDUQ7FOBTnUIJDSQ6lOJSFofjgUDi1dU5t/bLafl7dLl396SbG/aG3d2r/+KEmcb9swmTtlOBQkkMpDmVhKE+PGrwjZXIowqEoh2IcCqe20VhbsePaOrHaXj9jYSg5OJTGrojP4yyIb5/LlykcinIoxqH4iyg6N0pwKMmhFIfSWVv3Y8bMY6PU4FAmhyIcir6K4hultbaPyTv/9IgvKM6hBIeSHEpxKAtDWYNDmRxKZ+LMjsTZ9jEquYxD8VcdB23v8K3gUJJDKQ4Fc/heA3P4XmNyKMKhYPbiarTuxa1xUNbcKMGhJIfSuhf3+wv/ZaMsDGWOV1G2jXlODkU4FOVQjENxDiU4lORQikNZGIpwaiuc2spltf28ul66+rNNzHG/SjdV//ihlsct1iy3M/H19IDLO1KCQ0kOpTiUhaE8PeDyjpTJoQiHohwKp7bKqa1yaquc2mpnbefxHrnN7V7gZcKhKIfSuTHP8IOSulGcQwkOJTmUehWlNsrCUHxwKJNDaa3tun/oo8nczq66cijGoTiHEhxKcijFoSwMJQaHMjkUTm2DU9vg1DY4tQ1ObYNT2+DUNhsTJxHHdeVR2+F7Tg5FOilr3Sk5trdKUjkU41CcQ4kXUd7YmJNDKQ5lYSjVWduU4wLdN06W1uRQhENRDsU4FOdQgkPprG0eJ8Aka2yU4lAWhrIGhzI5FOFQlEMxDsU5lOBQOLVdnNouTG3XwNR2DUxt1+is7cqDsra7jK2hHIpxKJ21XY/bwK3tVqRrBIeSHEpxKAtDmYNDmRxKY211jPuyOqZvFOVQjENxDiU4lORQikNpre2yB+XLuxksGRzK5FCEQ9EXUWR7DeqcDzqjOIcSHEprbe2RON+ftsWhLAylcz7ojDI7Kcc1CTpypwiHohyKcSjOoQSHkhxKa23XPChrbZSFodjgUCaHIhyKcijGoXTWduqxQzl9O8ffOcB1RkkOpTiUhaF0DnCdUSaHIhyKcijGoXBq65zaOqe2zqmtc2obnNpGa20zD8o2LrtCOBTlUFprm/NB2fZtwzmU4FDyRZTa3pqK4lAWhpKDQ+msrRx3pVGZ29O2c5bsjKIcinEonbUVPV6DxPanbXAo+SKKz41SHMrCUDpnyc4orbV9hF+2+8OvEg5FORTjUJxDCQ4lOZTiUBaGsgaHwqnt4tR2cWq7OLVdnNouTm07Z8lU53FaUPeLXDtnyc4oi0KZo3OYTHXUwxK7ZYIs8iLLdhnlzaIgi4EsDrJ0Rlcfl1Kqv/HcTZClQJbFsczW7ubjNaD25+6cIIu8ylK7RUEWA1kcZOnsrun9YwrV7I1tOkGWAlkWx9I5YHZqmSCLgCwKshjI4iALqLsC6q6Auiug7iqou62zZnbctUZtu2vNzSIgi4IsBrK0dncd5xlc5m4JkCVBlgJZOrvrcVww4LU2S+vQ2ZllgiwCsijIYiCLgywBsiTIUiALqLsO6q6Duuug7jqouw7qbusMWjzeVwux3RIgS4IsBbJ0djfsOLaP2I/tWwfRziwTZBGQpbO7OY7W5dxb1zqMdmZxkCVAltbuVhyW8cZzt0CWxbG0jqSdWSbIIiCLgiwGsjjIEiALqLsJ6m6Culug7haouwXqboG6W6DuFqi7BepugbrbOqSW9jgOsP1av9YptRNL65jamWW2WubDsh+rtQ6qnVn0RRbf52xaR9XOLA6yBMjS2d3MdVjeuOakdVztzLIwltk6r5apD8vcLRNkkVdZcrcoyGIgi4Msnd2tcVxfV/LGczdBlgJZFsfSOq9Wdbx/VMt2ywRZBGRRkKWzuxXHPkO98drYOq92ZgmQJUGWAlkWx9I6r3ZmmSCLgCwKsoC6K6DuCqi7AuqugLoroO4qqLsK6q6Cuqug7iqouwrqroK6q6DuKqi7nfNqdns3/LfH2u1k7mbpnFc7tUyQRUCWxu7a7cjwsOh+nqFzXu3U4iBLgCzVaVn398pNpuyWxbF0zoiZaBwWf8MyQRYBWRRk6WydxMOy33drds6InVriRZY3znt3zoidWgpkWRxLDJBlgiwCsijIYiCLgyyg7gaou9fNiP26/Lp0+ecnufR+tiHz5DcZJXdK1H4F53x+kusdLQKyKMhiIIuDLAGyJMhSIMviWArU3QJ1t0DdLVB3q7G7ZnK/2stM9zPClSBLgSyr0xJ2WHI/e7QGyDJBFgFZ9FWW/QrxZSCLgywBsrR2d90faz7esBTIsjAWGQNkmS+yzLlbWrtbxzuUtmK3KMhiIIuDLAGyJMhSIEtnd10efbHtLKzMAbJMkEVAFgVZDGRxkCVAlgRZCmQBdVdA3RVQdwXUXQF1V0DdFVB3pbN1etwR3HS/64ZIgSydrdP12N/d744lOkCWCbIIyKIvsrxxzkMNZHGQJUAWzntZopz3skQXx2IDZJkgi4AsCrIYyOIgC+h42kDH09Z6PP3Y3/XarscUHyDLBFkEZGk9nn5MlcX+aRniBrL4iyziuyVAlgRZCmTp7G4cd4O18P24MQbIMkEWAVkUZDGQxUGWAFkSZCmQBdTdBHU3Qd1NUHcT1N0EdTdB3c3W7h53m7bYP1FWMkGWAlkWx9I5f2Q5Dku+cRzQOX90apEXWXR/b6Jz/ujUYiCLgywBsiTIUiDL4ljWAFkmyALq7gJ197q5rF+X92uXf7qOx+cD1YyTh/pxtXrG3PeQn5+eekdLgSwLY9Hnp6fe0TJBFgFZFGQxkMVBFk53dXC6q4PTXR2g7s7G7obmcacLzbVbFGQxkKWxL7eTjfe90rD988F0BsiSIEuBLOtVlr0vMkCWCbIIyNLZXbM6LP6GxUAWB1kCZMkXWWLsltbuah4W892yOBYdIMsEWQRkUZDFQJbW7uajL0t3S4AsCbIUyLI4FhsgywRZBGRRkMVAFlB3DdRdA3XXQN01UHcd1F0Hdddbz6nOOM5jyn4e0w1k6WzdrSCHxff9XQ+QJUGWAlnWiyxvnPOIAbJMkEVAFtB7WWEgi4MsAbIkyFIgy+JYEvReeU6QBXQ8nQaydLbO5/F65PqGJUCWBFkKZOlsnT/2Xzz2bboGyDJfZMn9OKAEZFGQxUCW1u7WcZ7B33gNqAJZFseyOvsS8353rAjJ3TJBFgFZFGQxkMVBlgBZEmQpkGVhLDY43bXB6a4NTndtcLprg9NdG5zu2uB01wandTZArWudbQl/WOINywRZBGRRkMVAFgdZAmRJkKVAlsWxCKi7AuqugLoroO4KqLutMz9RfrfkmLslQJYEWQpk6exuzodF9+du68zPmWW+yGK6WwRkUZDFQJbO7qavw5K2WwJkSZClQJbFsbTO/JxZJsgiIIuCLAaygLproO4aqLsG6q6Buuug7jqou97a3XVcG1pjPw5onT86sxjI4iBLZ3dLHpY3jgNa54/OLPUqy9oti2NpnT86s0yQRUAWBVkMZHGQJUCWBFlA3Q1Qd6+bP/p1+Xnt8s/WsY7PuK2ze6uX1P0K8ZL1hkVBFgNZHGQJkCVBlgJZFsfy9MTSe1omyALqboG6W6DuFqi71djdWHZMCS2X3ZKdlrTDkvvvZU2QRUAW7bSEPiz71RjLQBYHWQJkSZClQJaFsfgYnZZ170uOsXbLBFkEZFGQxUAWB1kCZEmQpUCWxbFMUHcnqLsT1N0J6u4EdXc2djeHjsOy30HeZ4AsCbIUyLI4FhkgywRZBGRRkMVAFlB3BdRdAXVXQN0VUHcV1F0FdVdBrVNQ67S1dSWHZY3dEiBLgiwFsqxXWWyzWGvrjjv23r7cj9VsgiwCsijIYiCLgywBsnR2dx53O8q53+3IrUCWxbH4AFkmyCIgi4IsBrI4yBIgC6i7Duqug7oboO4GqLsB6m6Auhug1gWoddHaOj/2d2fEbimQZXEsOUCWCbIIyKIgi4EsDrIEyALqboK6m6DuFqi7BepugbpboO5Wa3dLD8vazx2WgywBsiTHsjr7InqfhUrx/Zr8zvmjU4uALAqyGMjiIEuALAmyFMiyMJYYnO7G4HQ3Bqe7MTjdjcHpbgxOd2NwuhuD07oYoNbN1tblw7LesEyQRUAWBVkMZHGQJUCWBFkKZFkci4C6K6DuCqi7AuqugLoroO4KqLutsy2qx7lmte1cc7TOtpxZJsgiIIuCLAayOMgSIEuCLAWygLproO4aqLsG6q6Bumug7hqouwZqnYFa1zrboo/5I63d0jrbcmaZIIuALAqyGMjiIEuALAmyFMgC6m6Auhug7gaouwHqboC6G6DuBqi7rXM2No7rDk3GbimQZXEsrXM2Z5YJsgjIoiCLgSyd3TU97tVpJrslQJYEWQpkWa+y1GZpnbM5s0yQRUCW1u7GMbNsZbvFQBZ/kWW/H1m0ztmcWRJkKZCls7s+jm3aZT8maZ0/OrPMF1l0f21snT86syjIYiBLZ3f9+Byx9NhfG1vnj84sCbLUiyy5v063zh/9sSVb54/OLBNkae1u1d0Sc+wWBVkMZPFXWWK3BMiSIEuBLItjaZ2FOrNMkEVAFgVZDGQBdXeCunvdLNSvy9e1yz9dx1y/PXSJ/z8f+lny/LzSu0kmRiIYiWIkhpE4RhIYSWIkhZFgGquYxiqmsYpprDb2JPNx14bU3C0BsiTIUp0W8Ydl33fTxbHYAFkmyCIgi4IsBrK0dtcfltzPblqALAmyFMiyOBYfIMsEWQRkUZDFQBZQdx3UXQd110HddVB3o7W765jsqLGfgY4JsgjIoiCLgSwOsgTIkiBLgSyLY0lQdxPU3QR1N0HdTVB3s7O7Jcd5zNqnbzIDZEmQpUCWzu5WPZ67a39vogbIMkEWAVkUZDGQxUGWAFkSZCmQBdTdBeruAnV3gbq7QN1dnd1ddlwZuXx/r3w5yBIgS4IsBbIsjKXGAFkmyCIgi4IsnO7W4HS3Bqe7NTjdrdF5TeiY98fetplt6rHmAFkmyCIgi4IsBrI4yBIgS4IsBbKAuiug7gqouwLqroC6K6DuCqi7AmqdgFrXOnc0vA7LPmdarZNHZ5YJsgjIoiCLgSwOsgTIkiBLgSyg7hqouwbqroG6a6DuGqi7BuqutXZ33Ze9nZuL3ZIgS4Esi2PpnD+6nZDTw+K1WxRkMZDFQZYAWRJkKZBlcSyd80enlgmygLoboO4GqLsB6m6Auhug7gaouwlqXYJal62tW/d52Nv7Vmu3KMhiIIuDLAGyJMhSIMviWGqALBNkAXW3QN0tUHcL1N0Cdbdz5qdE7LC88f5058zPqWVxLJ0zP6eWzu7K4xy8pOwWAVkUZDGQxUGWAFkSZGntbuVhWfv7JGthLGsMkGWCLAKyKMhiIIuDLAGyJMjC6e4aoO4+PfMjcb+PikTuy8u1yz9bJB33D2jRKfvyz0ZG6q7XMffl/drl49rl89rl69rl16XLPz1ecrL8vHZ5uXZ5vXb5a7dauXarlWu3Wrl2q5Vrt1q5dqvVa7davW6r/fftu//++qePX3/z/Xc/337i0x/+84dvf/n44w+/ffvL//zj/iff/PTx++8//v0v//jpx2+/++s/f/ruL9//+O2nP/swfvvHn2VIfSXD1g3+KQZzWXw1V87b9/b5+5Tbn0vevvfPj3f9Sub49P2nJ7BM89v3abfv8/P347betE/f1+fv8/bnYnr7/tP/09uXdvt+xadf1Pj8F6jd/kL9BPi8j3L7G8btb3S5/bfe/nv/Fw==", + "bytecode": "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", + "debug_symbols": "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QLkboNxNUO4e7bOxNtc1m7TVIiCLgiwGsjjIEiBLgiwFspzMXdO5F7DZep/kaJ/NlaWDLAKy6KsstVoMZHGQJUCWBFkKZBkcy2ggSwdZBGQB5e4A5e7R/iMLmZay1RIgS77Isu7XnEf7j64sA2Opo/1HV5YOsgjIoiCLgSwOsgTIwsndapzcraO9UN7mmMFlmVOto71QV5b+IovKahGQRUEWA1kcZAmQJUGWAlkGxyINZAHlroBy9+izmNxmX5ZHrRYDWRxkiRdZ0lZLgiwFsgyO5WiPmFfdLdHX64CjPWJXFgFZ9FWW9ZrkaI/YlcVBlgBZtuXuz+Vrb/mn0zHHv986xP+fb/0ieb6P690kHSMRjEQxEsNI8pwk87FLTGqulgJZBsfi7aRF/GFZs9Y7yCIgi4IsBrI4yBIgS4IsBbIMjiVAuRug3A1Q7gYodwOUu3E0d/1hyXU2IgJkSZClQJbBsWQDWTrIIiCLgiwGsoByN0G5m6DcTVDuJih362jujtmpWm2dka4OsgjIoiCLgSwOsgTIkiBLgSyDYxmg3B2g3B2g3B2g3B2g3B0nc7dk3ieptZu4RoAsCbIUyDIwltEayNJBFgFZFGQxkIWTu6Nxcne0o7lbj+/G4aulQJbBsfQGsnSQRUAWBVkMZHGQJUAWUO52UO52UO4KKHcFlLsCyl0B5a6AcldAuSug3BVQ7goodwWUu3oyd4fNTo/huVo6yCIgi4IsBrI4yJIgS4Esg2MxUNYZKOsMlHUGyjoDZZ0dzLpq/f7eamqrJUCWBFkKZBkcy8kesUtLB1kEZFGQBZR1Dso6B2Wdg7LOQVkXoKwLUNYFKOsClHUn+7IuLUdz12ta1n0zRgTIkiBLgSyDY8kGsnSQRUAWBVkMZAHlboJyN0G5m6DcTVDuFih3C5S7dTR3x71s9XUd/CgFWQxkcZDlZL70ntMi63XAyf6jK8vJ/qNLSwdZBGRRkMVAFgdZTo7ruum0eK2WBFkKZBkUi7TWQJYOsgjIoiCLgSyYrLtZMFl3sxzNunHfz6OkjdUyOJbeQJYOsgjIoiCLgSwOsgTIkiALKHc7KHcFlLsCyl0B5e7Jnp8SsWlZ7k/fLAayOMgSIMvJ3JXHHLykrJYCWQbHcrLn59LSQRYBWRRkOZq7NecxZcRqcZAlQJYEWZ7NOon7PioSuZR/uo3nonzfW172lte95W1ved9bPvaWz73la2/5Z89abfcHoWlfv0SebgKRuuu19bV831te9pbXveVtb3nfWz72ls+95Wtv+bGt/L9ur/77mx8/ffPH7779++0Tn3/5j+//9NOnH77/98uf/udv99/88cdP33336a9/+NuPP/zp2z//48dv//DdD3/6/LsP7d//+b10j4/SMz/DP79uaR9vcw7j9tq+/L612+/db6/9y+vqH0X08+vPh4BI6ke5pcztdX55rbd6twHr7fXnf+Tbrz7/Pvvt9fjyOuWjmNjt9Zcpfmlx+x8tPgO+zLPfMHX7E6vd/q63v+//Ag==", "file_map": { "50": { "source": "fn main(x: Field) {\n // The parameters to this function must come directly from witness values (inputs to main).\n regression_dynamic_slice_index(x - 1, x - 4);\n}\n\nfn regression_dynamic_slice_index(x: Field, y: Field) {\n let mut slice = &[];\n for i in 0..5 {\n slice = slice.push_back(i as Field);\n }\n assert(slice.len() == 5);\n\n dynamic_slice_index_set_if(slice, x, y);\n dynamic_slice_index_set_else(slice, x, y);\n dynamic_slice_index_set_nested_if_else_else(slice, x, y);\n dynamic_slice_index_set_nested_if_else_if(slice, x, y + 1);\n dynamic_slice_index_if(slice, x);\n dynamic_array_index_if([0, 1, 2, 3, 4], x);\n dynamic_slice_index_else(slice, x);\n\n dynamic_slice_merge_if(slice, x);\n dynamic_slice_merge_else(slice, x);\n dynamic_slice_merge_two_ifs(slice, x);\n dynamic_slice_merge_mutate_between_ifs(slice, x, y);\n dynamic_slice_merge_push_then_pop(slice, x, y);\n}\n\nfn dynamic_slice_index_set_if(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 1);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[1] == 0);\n if x as u32 < 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice[x - 1] = slice[x];\n } else {\n slice[x] = 0;\n }\n assert(slice[3] == 2);\n assert(slice[4] == 2);\n}\n\nfn dynamic_slice_index_set_else(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 1);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[1] == 0);\n if x as u32 > 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice[x - 1] = slice[x];\n } else {\n slice[x] = 0;\n }\n assert(slice[4] == 0);\n}\n// This tests the case of missing a store instruction in the else branch\n// of merging slices\nfn dynamic_slice_index_if(mut slice: [Field], x: Field) {\n if x as u32 < 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n } else {\n assert(slice[x] == 0);\n }\n assert(slice[4] == 2);\n}\n\nfn dynamic_array_index_if(mut array: [Field; 5], x: Field) {\n if x as u32 < 10 {\n assert(array[x] == 4);\n array[x] = array[x] - 2;\n } else {\n assert(array[x] == 0);\n }\n assert(array[4] == 2);\n}\n// This tests the case of missing a store instruction in the then branch\n// of merging slices\nfn dynamic_slice_index_else(mut slice: [Field], x: Field) {\n if x as u32 > 10 {\n assert(slice[x] == 0);\n } else {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n }\n assert(slice[4] == 2);\n}\n\nfn dynamic_slice_merge_if(mut slice: [Field], x: Field) {\n if x as u32 < 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n\n slice = slice.push_back(10);\n // Having an array set here checks whether we appropriately\n // handle a slice length that is not yet resolving to a constant\n // during flattening\n slice[x] = 10;\n assert(slice[slice.len() - 1] == 10);\n assert(slice.len() == 6);\n\n slice[x] = 20;\n slice[x] = slice[x] + 10;\n\n slice = slice.push_front(11);\n assert(slice[0] == 11);\n assert(slice.len() == 7);\n assert(slice[5] == 30);\n\n slice = slice.push_front(12);\n assert(slice[0] == 12);\n assert(slice.len() == 8);\n assert(slice[6] == 30);\n\n let (popped_slice, last_elem) = slice.pop_back();\n assert(last_elem == 10);\n assert(popped_slice.len() == 7);\n\n let (first_elem, rest_of_slice) = popped_slice.pop_front();\n assert(first_elem == 12);\n assert(rest_of_slice.len() == 6);\n\n slice = rest_of_slice.insert(x as u32 - 2, 20);\n assert(slice[2] == 20);\n assert(slice[6] == 30);\n assert(slice.len() == 7);\n\n let (removed_slice, removed_elem) = slice.remove(x as u32 - 1);\n // The deconstructed tuple assigns to the slice but is not seen outside of the if statement\n // without a direct assignment\n slice = removed_slice;\n\n assert(removed_elem == 1);\n assert(slice.len() == 6);\n } else {\n assert(slice[x] == 0);\n slice = slice.push_back(20);\n }\n\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 30);\n}\n\nfn dynamic_slice_merge_else(mut slice: [Field], x: Field) {\n if x as u32 > 10 {\n assert(slice[x] == 0);\n slice[x] = 2;\n } else {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice = slice.push_back(10);\n }\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 10);\n\n slice = slice.push_back(20);\n assert(slice.len() == 7);\n assert(slice[slice.len() - 1] == 20);\n}\n\nfn dynamic_slice_index_set_nested_if_else_else(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 1);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[1] == 0);\n if x as u32 < 10 {\n slice[x] = slice[x] - 2;\n if y != 1 {\n slice[x] = slice[x] + 20;\n } else {\n if x == 5 {\n // We should not hit this case\n assert(slice[x] == 22);\n } else {\n slice[x] = 10;\n slice = slice.push_back(15);\n assert(slice.len() == 6);\n }\n assert(slice[4] == 10);\n }\n } else {\n slice[x] = 0;\n }\n assert(slice[4] == 10);\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 15);\n\n slice = slice.push_back(20);\n assert(slice.len() == 7);\n assert(slice[slice.len() - 1] == 20);\n}\n\nfn dynamic_slice_index_set_nested_if_else_if(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 2);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[2] == 0);\n if x as u32 < 10 {\n slice[x] = slice[x] - 2;\n // TODO: this panics as we have a load for the slice in flattening\n if y == 1 {\n slice[x] = slice[x] + 20;\n } else {\n if x == 4 {\n slice[x] = 5;\n }\n assert(slice[4] == 5);\n }\n } else {\n slice[x] = 0;\n }\n assert(slice[4] == 5);\n}\n\nfn dynamic_slice_merge_two_ifs(mut slice: [Field], x: Field) {\n if x as u32 > 10 {\n assert(slice[x] == 0);\n slice[x] = 2;\n } else {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice = slice.push_back(10);\n }\n\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 10);\n\n if x == 20 {\n slice = slice.push_back(20);\n }\n\n slice = slice.push_back(15);\n\n assert(slice.len() == 7);\n assert(slice[slice.len() - 1] == 15);\n\n slice = slice.push_back(20);\n assert(slice.len() == 8);\n assert(slice[slice.len() - 1] == 20);\n}\n\nfn dynamic_slice_merge_mutate_between_ifs(mut slice: [Field], x: Field, y: Field) {\n if x != y {\n slice[x] = 50;\n slice = slice.push_back(y);\n slice = slice.push_back(x);\n } else {\n slice[x] = slice[x] - 2;\n slice = slice.push_back(x);\n }\n\n slice = slice.push_back(30);\n assert(slice.len() == 8);\n\n if x == 20 {\n slice = slice.push_back(20);\n }\n\n slice = slice.push_back(15);\n\n if x != 20 {\n slice = slice.push_back(50);\n }\n\n slice = slice.push_back(60);\n assert(slice.len() == 11);\n assert(slice[x] == 50);\n assert(slice[slice.len() - 4] == 30);\n assert(slice[slice.len() - 3] == 15);\n assert(slice[slice.len() - 2] == 50);\n assert(slice[slice.len() - 1] == 60);\n}\n\nfn dynamic_slice_merge_push_then_pop(mut slice: [Field], x: Field, y: Field) {\n if x != y {\n slice[x] = 5;\n slice = slice.push_back(y);\n slice = slice.push_back(x);\n assert(slice.len() == 7);\n\n let (popped_slice, elem) = slice.pop_back();\n assert(slice.len() == 7);\n assert(elem == x);\n slice = popped_slice;\n } else {\n slice = slice.push_back(x);\n }\n\n slice = slice.push_back(30);\n assert(slice.len() == 7);\n\n if x == 20 {\n slice = slice.push_back(20);\n }\n\n let (slice, elem) = slice.pop_back();\n assert(elem == 30);\n\n let (_, elem) = slice.pop_back();\n assert(elem == y);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index f0ae528f8fa..9bfc89425f8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_dynamic_index/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -35,8 +35,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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QLkboNxNUO4e7bOxNtc1m7TVIiCLgiwGsjjIEiBLgiwFspzMXdO5F7DZep/kaJ/NlaWDLAKy6KsstVoMZHGQJUCWBFkKZBkcy2ggSwdZBGQB5e4A5e7R/iMLmZay1RIgS77Isu7XnEf7j64sA2Opo/1HV5YOsgjIoiCLgSwOsgTIwsndapzcraO9UN7mmMFlmVOto71QV5b+IovKahGQRUEWA1kcZAmQJUGWAlkGxyINZAHlroBy9+izmNxmX5ZHrRYDWRxkiRdZ0lZLgiwFsgyO5WiPmFfdLdHX64CjPWJXFgFZ9FWW9ZrkaI/YlcVBlgBZtuXuz+Vrb/mn0zHHv986xP+fb/0ieb6P690kHSMRjEQxEsNI8pwk87FLTGqulgJZBsfi7aRF/GFZs9Y7yCIgi4IsBrI4yBIgS4IsBbIMjiVAuRug3A1Q7gYodwOUu3E0d/1hyXU2IgJkSZClQJbBsWQDWTrIIiCLgiwGsoByN0G5m6DcTVDuJih362jujtmpWm2dka4OsgjIoiCLgSwOsgTIkiBLgSyDYxmg3B2g3B2g3B2g3B2g3B0nc7dk3ieptZu4RoAsCbIUyDIwltEayNJBFgFZFGQxkIWTu6Nxcne0o7lbj+/G4aulQJbBsfQGsnSQRUAWBVkMZHGQJUAWUO52UO52UO4KKHcFlLsCyl0B5a6AcldAuSug3BVQ7goodwWUu3oyd4fNTo/huVo6yCIgi4IsBrI4yJIgS4Esg2MxUNYZKOsMlHUGyjoDZZ0dzLpq/f7eamqrJUCWBFkKZBkcy8kesUtLB1kEZFGQBZR1Dso6B2Wdg7LOQVkXoKwLUNYFKOsClHUn+7IuLUdz12ta1n0zRgTIkiBLgSyDY8kGsnSQRUAWBVkMZAHlboJyN0G5m6DcTVDuFih3C5S7dTR3x71s9XUd/CgFWQxkcZDlZL70ntMi63XAyf6jK8vJ/qNLSwdZBGRRkMVAFgdZTo7ruum0eK2WBFkKZBkUi7TWQJYOsgjIoiCLgSyYrLtZMFl3sxzNunHfz6OkjdUyOJbeQJYOsgjIoiCLgSwOsgTIkiALKHc7KHcFlLsCyl0B5e7Jnp8SsWlZ7k/fLAayOMgSIMvJ3JXHHLykrJYCWQbHcrLn59LSQRYBWRRkOZq7NecxZcRqcZAlQJYEWZ7NOon7PioSuZR/uo3nonzfW172lte95W1ved9bPvaWz73la2/5Z89abfcHoWlfv0SebgKRuuu19bV831te9pbXveVtb3nfWz72ls+95Wtv+bGt/L9ur/77mx8/ffPH7779++0Tn3/5j+//9NOnH77/98uf/udv99/88cdP33336a9/+NuPP/zp2z//48dv//DdD3/6/LsP7d//+b10j4/SMz/DP79uaR9vcw7j9tq+/L612+/db6/9y+vqH0X08+vPh4BI6ke5pcztdX55rbd6twHr7fXnf+Tbrz7/Pvvt9fjyOuWjmNjt9Zcpfmlx+x8tPgO+zLPfMHX7E6vd/q63v+//Ag==", "file_map": { "50": { "source": "fn main(x: Field) {\n // The parameters to this function must come directly from witness values (inputs to main).\n regression_dynamic_slice_index(x - 1, x - 4);\n}\n\nfn regression_dynamic_slice_index(x: Field, y: Field) {\n let mut slice = &[];\n for i in 0..5 {\n slice = slice.push_back(i as Field);\n }\n assert(slice.len() == 5);\n\n dynamic_slice_index_set_if(slice, x, y);\n dynamic_slice_index_set_else(slice, x, y);\n dynamic_slice_index_set_nested_if_else_else(slice, x, y);\n dynamic_slice_index_set_nested_if_else_if(slice, x, y + 1);\n dynamic_slice_index_if(slice, x);\n dynamic_array_index_if([0, 1, 2, 3, 4], x);\n dynamic_slice_index_else(slice, x);\n\n dynamic_slice_merge_if(slice, x);\n dynamic_slice_merge_else(slice, x);\n dynamic_slice_merge_two_ifs(slice, x);\n dynamic_slice_merge_mutate_between_ifs(slice, x, y);\n dynamic_slice_merge_push_then_pop(slice, x, y);\n}\n\nfn dynamic_slice_index_set_if(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 1);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[1] == 0);\n if x as u32 < 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice[x - 1] = slice[x];\n } else {\n slice[x] = 0;\n }\n assert(slice[3] == 2);\n assert(slice[4] == 2);\n}\n\nfn dynamic_slice_index_set_else(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 1);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[1] == 0);\n if x as u32 > 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice[x - 1] = slice[x];\n } else {\n slice[x] = 0;\n }\n assert(slice[4] == 0);\n}\n// This tests the case of missing a store instruction in the else branch\n// of merging slices\nfn dynamic_slice_index_if(mut slice: [Field], x: Field) {\n if x as u32 < 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n } else {\n assert(slice[x] == 0);\n }\n assert(slice[4] == 2);\n}\n\nfn dynamic_array_index_if(mut array: [Field; 5], x: Field) {\n if x as u32 < 10 {\n assert(array[x] == 4);\n array[x] = array[x] - 2;\n } else {\n assert(array[x] == 0);\n }\n assert(array[4] == 2);\n}\n// This tests the case of missing a store instruction in the then branch\n// of merging slices\nfn dynamic_slice_index_else(mut slice: [Field], x: Field) {\n if x as u32 > 10 {\n assert(slice[x] == 0);\n } else {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n }\n assert(slice[4] == 2);\n}\n\nfn dynamic_slice_merge_if(mut slice: [Field], x: Field) {\n if x as u32 < 10 {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n\n slice = slice.push_back(10);\n // Having an array set here checks whether we appropriately\n // handle a slice length that is not yet resolving to a constant\n // during flattening\n slice[x] = 10;\n assert(slice[slice.len() - 1] == 10);\n assert(slice.len() == 6);\n\n slice[x] = 20;\n slice[x] = slice[x] + 10;\n\n slice = slice.push_front(11);\n assert(slice[0] == 11);\n assert(slice.len() == 7);\n assert(slice[5] == 30);\n\n slice = slice.push_front(12);\n assert(slice[0] == 12);\n assert(slice.len() == 8);\n assert(slice[6] == 30);\n\n let (popped_slice, last_elem) = slice.pop_back();\n assert(last_elem == 10);\n assert(popped_slice.len() == 7);\n\n let (first_elem, rest_of_slice) = popped_slice.pop_front();\n assert(first_elem == 12);\n assert(rest_of_slice.len() == 6);\n\n slice = rest_of_slice.insert(x as u32 - 2, 20);\n assert(slice[2] == 20);\n assert(slice[6] == 30);\n assert(slice.len() == 7);\n\n let (removed_slice, removed_elem) = slice.remove(x as u32 - 1);\n // The deconstructed tuple assigns to the slice but is not seen outside of the if statement\n // without a direct assignment\n slice = removed_slice;\n\n assert(removed_elem == 1);\n assert(slice.len() == 6);\n } else {\n assert(slice[x] == 0);\n slice = slice.push_back(20);\n }\n\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 30);\n}\n\nfn dynamic_slice_merge_else(mut slice: [Field], x: Field) {\n if x as u32 > 10 {\n assert(slice[x] == 0);\n slice[x] = 2;\n } else {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice = slice.push_back(10);\n }\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 10);\n\n slice = slice.push_back(20);\n assert(slice.len() == 7);\n assert(slice[slice.len() - 1] == 20);\n}\n\nfn dynamic_slice_index_set_nested_if_else_else(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 1);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[1] == 0);\n if x as u32 < 10 {\n slice[x] = slice[x] - 2;\n if y != 1 {\n slice[x] = slice[x] + 20;\n } else {\n if x == 5 {\n // We should not hit this case\n assert(slice[x] == 22);\n } else {\n slice[x] = 10;\n slice = slice.push_back(15);\n assert(slice.len() == 6);\n }\n assert(slice[4] == 10);\n }\n } else {\n slice[x] = 0;\n }\n assert(slice[4] == 10);\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 15);\n\n slice = slice.push_back(20);\n assert(slice.len() == 7);\n assert(slice[slice.len() - 1] == 20);\n}\n\nfn dynamic_slice_index_set_nested_if_else_if(mut slice: [Field], x: Field, y: Field) {\n assert(slice[x] == 4);\n assert(slice[y] == 2);\n slice[y] = 0;\n assert(slice[x] == 4);\n assert(slice[2] == 0);\n if x as u32 < 10 {\n slice[x] = slice[x] - 2;\n // TODO: this panics as we have a load for the slice in flattening\n if y == 1 {\n slice[x] = slice[x] + 20;\n } else {\n if x == 4 {\n slice[x] = 5;\n }\n assert(slice[4] == 5);\n }\n } else {\n slice[x] = 0;\n }\n assert(slice[4] == 5);\n}\n\nfn dynamic_slice_merge_two_ifs(mut slice: [Field], x: Field) {\n if x as u32 > 10 {\n assert(slice[x] == 0);\n slice[x] = 2;\n } else {\n assert(slice[x] == 4);\n slice[x] = slice[x] - 2;\n slice = slice.push_back(10);\n }\n\n assert(slice.len() == 6);\n assert(slice[slice.len() - 1] == 10);\n\n if x == 20 {\n slice = slice.push_back(20);\n }\n\n slice = slice.push_back(15);\n\n assert(slice.len() == 7);\n assert(slice[slice.len() - 1] == 15);\n\n slice = slice.push_back(20);\n assert(slice.len() == 8);\n assert(slice[slice.len() - 1] == 20);\n}\n\nfn dynamic_slice_merge_mutate_between_ifs(mut slice: [Field], x: Field, y: Field) {\n if x != y {\n slice[x] = 50;\n slice = slice.push_back(y);\n slice = slice.push_back(x);\n } else {\n slice[x] = slice[x] - 2;\n slice = slice.push_back(x);\n }\n\n slice = slice.push_back(30);\n assert(slice.len() == 8);\n\n if x == 20 {\n slice = slice.push_back(20);\n }\n\n slice = slice.push_back(15);\n\n if x != 20 {\n slice = slice.push_back(50);\n }\n\n slice = slice.push_back(60);\n assert(slice.len() == 11);\n assert(slice[x] == 50);\n assert(slice[slice.len() - 4] == 30);\n assert(slice[slice.len() - 3] == 15);\n assert(slice[slice.len() - 2] == 50);\n assert(slice[slice.len() - 1] == 60);\n}\n\nfn dynamic_slice_merge_push_then_pop(mut slice: [Field], x: Field, y: Field) {\n if x != y {\n slice[x] = 5;\n slice = slice.push_back(y);\n slice = slice.push_back(x);\n assert(slice.len() == 7);\n\n let (popped_slice, elem) = slice.pop_back();\n assert(slice.len() == 7);\n assert(elem == x);\n slice = popped_slice;\n } else {\n slice = slice.push_back(x);\n }\n\n slice = slice.push_back(30);\n assert(slice.len() == 7);\n\n if x == 20 {\n slice = slice.push_back(20);\n }\n\n let (slice, elem) = slice.pop_back();\n assert(elem == 30);\n\n let (_, elem) = slice.pop_back();\n assert(elem == y);\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index e548c44a5b1..e395b5a174a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -50,8 +50,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndrfauJAFIDxd8m1F3POmX+nr7IsxbZpEUSLtQtL6btvsqvdYgblm5vSiD8c8o2aGfMxPI0P7y/3m93z/m24+/ExbPeP6+Nmv5uOPj5Xw8Nhs91uXu6/PzyE+U8Jf5//9rrezYdvx/XhONxZ1NUw7p7m/+rknzfbcbhL4fPnaijWFMVPIga7FLElktpJpOlpFyJhUZvC81l4uRRORW2eq5ziSeSaL4VgoVgYFhGLhEXGomBRsXAqHDd33Nxxc8fNHTd33NzbzfX8yZDT5SeDFywqFk6FhMCJcKKcGCeRk8RJ5qRwUjnh9YXXF15feH3h9YXXF15feH3hKYWn1GbKGtKJVC0LIpwoJ8ZJ5CRxkjkpnNQbxGRBHBMLnAgnykmkF91iiZPMSeGkcuKYxMCJcKKcGCfN+jGcL6yihQVJnGROCieVE8ckBU6EE+XEOOH1E6+feP3E6ydeP/H6OdANB8nCiXJinEROEieZk8JJ5cQxKbx+4fULr8/3waTw+oXXL7x+4fULr194/crrV16/vTmiWk9EzRckcZI5KZxUTpwSbe+QXCfCiXJinEROEieZE1xf23sX0/fhefZP33PxC8X8D1kbxfyFclig2INqz/C8A2nPiWiv/W8h7UHWg2IPSj0od8Rt7wPcQrUHeQey0IOkB2kP6nkTWs+b0FIP6pkR1jMjrGdGWM+MiD0zIvbMiNgzI2LPjGiv4aWed6Nk8auNttfw14lj0l7DXyfCiXJinEROEieZE16/vbrWr+1LFVkQfo3VXsRef5XMSeGkcuKYFH6S24vY64RfLheessDL5c/p6Nf6sFk/bMfT7SjP77vHb3enHH+/jhc3qrwe9o/j0/thnG9Z+X+3yjxatZXZNJB5GFrDdJDmRcx8hqXGlVSfD+ezJx5W4jqNYBrFHw==", + "bytecode": "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", + "debug_symbols": "ndrdaiJBEIbhe5ljD7q6qv9yK0sIJpkEQTQYs7CE3PvOBM2Gsdfw1onY4oMz/ZXOdNnvw+N4//Z8t9k97V+Hm1/vw3b/sD5u9rtp9P6xGu4Pm+1283z3/eUhzA+pfr7/9WW9m4evx/XhONyoxdUw7h7nZ3XyT5vtONyk8HG7GlKjIgcsBIuIhWJhWCQqCp6r0j+P0k7Cgi6FYZGwyFgULCoWjYoasBAsIhbdzFPUk0jT2xbCsOjmkVo+i1aWomLRqGgBC8EiYqFYGBYJi4xFN/Oc7CRyzUtRsWhUSAicCCeRE+XEOEmcZE4KJ5UTnr7w9IWnLzx96acfz7/bOekFMU4SJ5mTwknlpGESAyfCSeSEpx95+pGnH3mUkUcZu1HWkE6kxuXFRTRwIpxETpQT4yRxkjkpPxCVC1I5aZhY4EQ4was6MeMkcZI5KZxUTvB6XlLgRDiJnPD0E08/8fQTTz/x9HkzR3g3R3g7R/r9HAvnmyvTcEEiJ8qJcZI4yZwUTionDZN+g+o64ekXnn7h6ReefuHpF54+74UJb4YJ74YJb4cJ74cJb4hJVU6Mk8RJ5oSnX3n6laffcPqx3yGJsZ5I1HZBjJPESeakcFI56eYyXULPszxdGu0LWf5E/R7JT0g8KHqQepB5UPKg7EGenOJ/Zs/yF8rhAqkHFc/hVQ/yTIR6ClY9BaueglVPwaqnYNVTsOopWPVUhHoqQj0VYZ6KME9FmKcizPMlNPOg5EHZg4oHVQ9qDpSCB4kHeX6W+2v66R7xbC7+MYj9Nf11UjnpTnb8aptNF/4l6a/prxPhJHKinBgniZPMCc+lvw6+ev9Y+OkXfvqFn35/UXudVE74JFde/P1F7dVcKo+ywsXTxzT6vT5s1vfb8bTz6+lt9/BtI9jxz8u42BP2ctg/jI9vh3HeHfZvY9j80VFXqtOBzBUVa1up2e38H+40lKYraXUeyuewrWKQ6Qimo/gL", "file_map": { "46": { "source": "use crate::append::Append;\n\nimpl [T] {\n /// Returns the length of the slice.\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Push a new element to the end of the slice, returning a\n /// new slice with a length one greater than the\n /// original unmodified slice.\n #[builtin(slice_push_back)]\n pub fn push_back(self, elem: T) -> Self {}\n\n /// Push a new element to the front of the slice, returning a\n /// new slice with a length one greater than the\n /// original unmodified slice.\n #[builtin(slice_push_front)]\n pub fn push_front(self, elem: T) -> Self {}\n\n /// Remove the last element of the slice, returning the\n /// popped slice and the element in a tuple\n #[builtin(slice_pop_back)]\n pub fn pop_back(self) -> (Self, T) {}\n\n /// Remove the first element of the slice, returning the\n /// element and the popped slice in a tuple\n #[builtin(slice_pop_front)]\n pub fn pop_front(self) -> (T, Self) {}\n\n /// Insert an element at a specified index, shifting all elements\n /// after it to the right\n #[builtin(slice_insert)]\n pub fn insert(self, index: u32, elem: T) -> Self {}\n\n /// Remove an element at a specified index, shifting all elements\n /// after it to the left, returning the altered slice and\n /// the removed element\n #[builtin(slice_remove)]\n pub fn remove(self, index: u32) -> (Self, T) {}\n\n /// Append each element of the `other` slice to the end of `self`.\n /// This returns a new slice and leaves both input slices unchanged.\n pub fn append(mut self, other: Self) -> Self {\n for elem in other {\n self = self.push_back(elem);\n }\n self\n }\n\n pub fn as_array(self) -> [T; N] {\n assert(self.len() == N);\n\n let mut array = [crate::mem::zeroed(); N];\n for i in 0..N {\n array[i] = self[i];\n }\n array\n }\n\n // Apply a function to each element of the slice, returning a new slice\n // containing the mapped elements.\n pub fn map(self, f: fn[Env](T) -> U) -> [U] {\n let mut ret = &[];\n for elem in self {\n ret = ret.push_back(f(elem));\n }\n ret\n }\n\n // Apply a function to each element of the slice with its index, returning a\n // new slice containing the mapped elements.\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U] {\n let mut ret = &[];\n let mut index = 0;\n for elem in self {\n ret = ret.push_back(f(index, elem));\n index += 1;\n }\n ret\n }\n\n // Apply a function to each element of the slice\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for elem in self {\n f(elem);\n }\n }\n\n // Apply a function to each element of the slice with its index\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n let mut index = 0;\n for elem in self {\n f(index, elem);\n index += 1;\n }\n }\n\n // Apply a function to each element of the slice and an accumulator value,\n // returning the final accumulated value. This function is also sometimes\n // called `foldl`, `fold_left`, `reduce`, or `inject`.\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n // Apply a function to each element of the slice and an accumulator value,\n // returning the final accumulated value. Unlike fold, reduce uses the first\n // element of the given slice as its starting accumulator value.\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n // Returns a new slice containing only elements for which the given predicate\n // returns true.\n pub fn filter(self, predicate: fn[Env](T) -> bool) -> Self {\n let mut ret = &[];\n for elem in self {\n if predicate(elem) {\n ret = ret.push_back(elem);\n }\n }\n ret\n }\n\n // Flatten each element in the slice into one value, separated by `separator`.\n pub fn join(self, separator: T) -> T\n where\n T: Append,\n {\n let mut ret = T::empty();\n\n if self.len() != 0 {\n ret = self[0];\n\n for i in 1..self.len() {\n ret = ret.append(separator).append(self[i]);\n }\n }\n\n ret\n }\n\n // Returns true if all elements in the slice satisfy the predicate\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n // Returns true if any element in the slice satisfies the predicate\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq(&[].map(|x| x + 1), &[]);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq(&[].mapi(|i, x| i * x + 1), &[]);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_slice: [Field] = &[];\n empty_slice.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_slice: [Field] = &[];\n empty_slice.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = &[1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, &[2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = &[1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, &[2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = &[1, 2, 3];\n let mut b = &[];\n let b_ref = &mut b;\n a.for_each(|a| { *b_ref = b_ref.push_back(a * 2); });\n assert_eq(b, &[2, 4, 6]);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = &[1, 2, 3];\n let mut b = &[];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { *b_ref = b_ref.push_back(i + a * 2); });\n assert_eq(b, &[2, 5, 8]);\n }\n\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_0.snap index 5db366305ed..d1aecb69cd4 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_0.snap @@ -50,8 +50,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "tdrdattAEIbhe9GxD3Zmfye3UkpxEiUYjB0cp1BC7r1Sa6eptTi8G/YkRGGfYdE3UsSwr8P9ePvy+GOze9g/DzffXoft/m593Ox309Xr22q4PWy2283jj49/Htz8I9mf9c9P6918+XxcH47DjQ+6Gsbd/fxbmfzDZjsON9G9fV8NWasi20kE5y+Fr4mo/iTitOxCBCxKVVg6C8uXwqgoriZSDCeRSroUgoVi4bEIWEQsEhYZi4KFUWE4c8OZG87ccOaGMzecudUz1/ObIcXLN4NlLAoWRoU4x4lwopx4TgInkZPESeakcMLTF56+8PSFpy88feHpC09fePrCoxQepVajLC6eSNH//sevFkulnJfK4nUnKl2ra9fqvmv10LV67Fo9da2eu1YvXatbz+q+67Pqv9rv+r5URRbVv9ozquVc3dui+mc945cbKpwYJsFxIpx0jS6ErtVj1+qpa/XctXrpWt16Vo+u5+MepWt17Vo90nGSxMRJ5qRwgkdjkhwnwoly4jkJnFTTD+48MgjeLUjiJHNSODFMsuNEOFFOPCeBE55+5ulnnn7m6WeefuHp18fD10bpUpQTz0ngJHKSOMmcFE4Mk/qc+Drh6RtP33j6xtM3nr7x9I2nbzx9w+mrc5wIJzh9rQ/zrn3CaX2Yd51kTgonhkl9/nedCCfKieckcMLTV56+8vSVp++ruUyfz+funz6LwzsK6S8KdRTSO0pugWILsobt1ecnn6GWGxG0BfkWFFpQbEGpBeWGcOuzis+QNaDoWpC0IG1BvgW1PISx5SGMqQW1dERs6YjY0hGppSNSS0eklo5ILR2RcEe8TVc/14fN+nY7ns40Pbzs7j4ccTr+ehovTjs9HfZ34/3LYZzPPf078jTvWP3K+2kr80Y0u5XXOH/6zfd6nvypuPlyvovT+G+69NMOpl38Bg==", + "bytecode": "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", + "debug_symbols": "tdrRThsxEIXhd9nrXNhjz9jmVaqqChBQpCigECpViHfvbptQmt1S/YN8g1i032B8Zs3K8ctwu7l+vv+23d89PA1XX16G3cPN+rh92I9XL6+r4fqw3e2299/e/3gI0xctv+5/elzvp8un4/pwHK5SltWw2d9O39XR3213m+FKw+vX1aAVi0aFBSwiFoJFwiJjgeeqLP8dpZ1EDulSJCwyFoqFYVGwqFg0KmrAImKxmLlKOgkdb7sQCYvF2dVmZ9HKpahYNCpawCJiIVgkLDIWioVhsZi5aT4Jq3YpKhaNihgCJ5ET4SRxkjlRToyTwknlhKcfefqRpx95+nE5fTmv26ZpRjInyolxUjipnDRMJHASORFOePrC0xeevvAohUcpi1HWoCdS5a9/LqvZrbGeb43zRyuFrtVj1+ryyerydqvEOKueulbPXatr1+rWtXrpWr12rd56Vs9d+z1/umeknqunNqv+v55J8wEVTionDRMNnHSNTrsuVdp1qdKuS5V2Xaq061KlXZcqbT0fdwtdq8eu1TPdGYymnBgnhZPKCd4YjSVwEjkRThInPP3C0y88/cLTLzz9wtOvPP3K01/eic3hvG2QU5iRxEnmRDkxTgonlZOGyfI+8cckcsLTbzz9xtNvPP3G0288/YY/gYkNfwQjIXASORFOEieZE+XEOCmcVE54+pGnH3n6y5t5H73CyfJm3sfEOCmcVE4aJsubeuNr83mWo0l+Q9l+o+hB4kHJg7IHqQeZBxUHyp6c8j9mL9sbsjBD2YOqZ3jNgdQzEeppWPU0rHoaVj0Nq56GVU/Dqqdh1dMR6ukI83SEeTrCPB1hno4wz0No6kHmQcWDqgc1ByrBg6IHiQfhZfl1vPq+PmzX17vN6fjg3fP+5t1pwuOPx83FwcLHw8PN5vb5sJmOGP45XTj9ckmrlMahTF0m4wtVSnl6q5+mTWJeSWzT5TQhImElIuMIxlH8BA==", "file_map": { "46": { "source": "use crate::append::Append;\n\nimpl [T] {\n /// Returns the length of the slice.\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Push a new element to the end of the slice, returning a\n /// new slice with a length one greater than the\n /// original unmodified slice.\n #[builtin(slice_push_back)]\n pub fn push_back(self, elem: T) -> Self {}\n\n /// Push a new element to the front of the slice, returning a\n /// new slice with a length one greater than the\n /// original unmodified slice.\n #[builtin(slice_push_front)]\n pub fn push_front(self, elem: T) -> Self {}\n\n /// Remove the last element of the slice, returning the\n /// popped slice and the element in a tuple\n #[builtin(slice_pop_back)]\n pub fn pop_back(self) -> (Self, T) {}\n\n /// Remove the first element of the slice, returning the\n /// element and the popped slice in a tuple\n #[builtin(slice_pop_front)]\n pub fn pop_front(self) -> (T, Self) {}\n\n /// Insert an element at a specified index, shifting all elements\n /// after it to the right\n #[builtin(slice_insert)]\n pub fn insert(self, index: u32, elem: T) -> Self {}\n\n /// Remove an element at a specified index, shifting all elements\n /// after it to the left, returning the altered slice and\n /// the removed element\n #[builtin(slice_remove)]\n pub fn remove(self, index: u32) -> (Self, T) {}\n\n /// Append each element of the `other` slice to the end of `self`.\n /// This returns a new slice and leaves both input slices unchanged.\n pub fn append(mut self, other: Self) -> Self {\n for elem in other {\n self = self.push_back(elem);\n }\n self\n }\n\n pub fn as_array(self) -> [T; N] {\n assert(self.len() == N);\n\n let mut array = [crate::mem::zeroed(); N];\n for i in 0..N {\n array[i] = self[i];\n }\n array\n }\n\n // Apply a function to each element of the slice, returning a new slice\n // containing the mapped elements.\n pub fn map(self, f: fn[Env](T) -> U) -> [U] {\n let mut ret = &[];\n for elem in self {\n ret = ret.push_back(f(elem));\n }\n ret\n }\n\n // Apply a function to each element of the slice with its index, returning a\n // new slice containing the mapped elements.\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U] {\n let mut ret = &[];\n let mut index = 0;\n for elem in self {\n ret = ret.push_back(f(index, elem));\n index += 1;\n }\n ret\n }\n\n // Apply a function to each element of the slice\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for elem in self {\n f(elem);\n }\n }\n\n // Apply a function to each element of the slice with its index\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n let mut index = 0;\n for elem in self {\n f(index, elem);\n index += 1;\n }\n }\n\n // Apply a function to each element of the slice and an accumulator value,\n // returning the final accumulated value. This function is also sometimes\n // called `foldl`, `fold_left`, `reduce`, or `inject`.\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n // Apply a function to each element of the slice and an accumulator value,\n // returning the final accumulated value. Unlike fold, reduce uses the first\n // element of the given slice as its starting accumulator value.\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n // Returns a new slice containing only elements for which the given predicate\n // returns true.\n pub fn filter(self, predicate: fn[Env](T) -> bool) -> Self {\n let mut ret = &[];\n for elem in self {\n if predicate(elem) {\n ret = ret.push_back(elem);\n }\n }\n ret\n }\n\n // Flatten each element in the slice into one value, separated by `separator`.\n pub fn join(self, separator: T) -> T\n where\n T: Append,\n {\n let mut ret = T::empty();\n\n if self.len() != 0 {\n ret = self[0];\n\n for i in 1..self.len() {\n ret = ret.append(separator).append(self[i]);\n }\n }\n\n ret\n }\n\n // Returns true if all elements in the slice satisfy the predicate\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n // Returns true if any element in the slice satisfies the predicate\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq(&[].map(|x| x + 1), &[]);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq(&[].mapi(|i, x| i * x + 1), &[]);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_slice: [Field] = &[];\n empty_slice.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_slice: [Field] = &[];\n empty_slice.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = &[1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, &[2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = &[1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, &[2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = &[1, 2, 3];\n let mut b = &[];\n let b_ref = &mut b;\n a.for_each(|a| { *b_ref = b_ref.push_back(a * 2); });\n assert_eq(b, &[2, 4, 6]);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = &[1, 2, 3];\n let mut b = &[];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { *b_ref = b_ref.push_back(i + a * 2); });\n assert_eq(b, &[2, 5, 8]);\n }\n\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index aa275fc0383..11289d1e665 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_loop/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -50,8 +50,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/9VavY7bRhBeUqQoiqLIuxQB0iV5AfIkna4JcIWBVHmDNLSca9KkT0MgVYLUeYu8Qbo0CZA+SJHafgB3buy1d3QfP44oHsy1cQscluQMZ7753ZF0gXm34jd/gbuO3B7APjfdJbRbt1fvt+oJZVW+MAaPAGP4CDDOHgHG6BFgjD1gfLuw2C1om1Q2aNYpsTm9xMDEXaTuPgT6hMGvU9I7pfybatukin0T4t+k4F8P8q9TkOlBfpU4OU/ae/lsi+RBYLzFaevZzuucbDNgi+iO/OjeB6TPkJ2G9C+N15yqA9IneNg/cp0LT3uPJyBa1PbtEFrcdu2wa/Hm71Pg49wKge8LuP7SXXvOx8ZzXVefDNh87MGtOS7x2wyeiV/FzwvkJ1oKtKjt6lm6+wj0oCzBERP/5+6+cPsc3pH3S0X/nPR3cCvP2C+pwp8q/PYM/MxdZ+7P5tCf8o7xWveVyJ/7kb+R/MHzfKbYJPpz061BoWu7MXqPOuaA8dqv6yHbEL/EuiR+9sEpWfEDZaUKzUdMowG7UX+u8D8kpmi3Z9uq0vTjwnbw3Krt5+wojV53dhWm70ueAxJP9ouuhZMn/VbTKfYgP17bFdOzr9xu7/8m+7BmxtQRn6voH081f5ylF37kX4n81I/8mmdMzG+bi08oJgnEcWb0eUPoyP8byPzaXRemHzfuWZ5mmV2g4NXs4TrD2p0ISxUTlm/AVz+Qr0LFV1p/mJMNCeB+6NyMtWRXRLTbafxQ2xr6B3D0ekfbpS2BJvNZSTSMmebDBdjmsU8c+6jgwj6KOgVbqNiB9sb07Fu3a30U4zwU+9L0e1k4QlaiyNLyCH1tVwQ033nU8V3bpWVA4zzKyH67CtM//5Zgm8fz4JhHggvzCHUKtlCxA+2N6dn3btfySOshWuy1GkyIhvPU0AwkMrReiHXDvXDos4SveY3zY+hc+9jzWgD2cO4MzWs/ul3LD/ZdcMZ3/FkH/cPxuJ3GP2fnnZYwxeCHMfOO8P8CMn9y11pezMlu7K+3k9hc705hRRwh0YT3Z8Ln63uHS5BrSFem+PdXt9s8jIIuRk+9dzPUB9EvqJ/rSatF8X1BNuK72pnDfWxB98grMrW+xXi17xww5+X8fmgt4ZmkyWUcmYJD6yfyfKXw47kn+sWXeD6tRuhOFB8M6R7Cmiv8iCEjrKg7JxrayOcgypyPwJApmLVZTuR+jFluDRjjtksrgMazXAH2S+y1XFiDbexfH2e1+BLP6kzBGpp+TDHvYnr2u9u1sxrn4ZnyjM/qtYJnSFauyNLyCH1tVwQ033nU8V3bpY3NI+4pWKdYI+gTX3kkvsQ8yhWsoenHtFNT9OwPt0/xmWCl4NHmwSXRsHetRmAYe17Ju/hdl89c3N+8i9dbrE6+zJa8IqAj/1/uHutQ9vf5B5K7fVPfbZq7Ztc8e7Y9NDyTGfBd5kF/s9/cHK62h/3T3abZXJ/VL3XY+c2x7b6TIY14UJ7Iwt/wshGysgFZ6YCs5UhZQ7oRa0TyV+5+fkJ+Svy5u8ffUxMFT0zy/zX3el4Qj8j8D3j+F5rwtvc6OHZrpCn82FuYX2y1Op+7Z1LXBeiZ+vPBKdyYC6Jf80FwYkdZ+Ex0LUnW1OfnlDEZkrUeKUv8ifG11y+F7nZPsb5iG+QzDdqJ+gVP6QfPMfcK0K35VPRPkXui60PlnmbbUO4hP+eeJqsYKUv8qeVb7scHG+7r5oQPUD/eY1/X/h+He3YYdOVo/sIzTM4iyasSaEuiXQBtRXgv2z5elFUQ3kvCK2evlvOlon9N+lGXpp/P5QuF/0Lht7nyit6dK+9ifMWnPmatw+766WG7a6rvant7dW7Weg2PZaA0sS8AAA==", - "debug_symbols": "tZrbiuJAFEX/Jc95qDp1OXX8lWFovMQmIFGiDgziv08iZro7BppNs1/E0lqLClXrQalbtWs21/e3ttsfz9Xq1606HLfrS3vshtHtXlebvj0c2ve3zx9XbnzJ5TH/fFp34/B8WfeXahWi1FXT7cZ3ZeD37aGpVsndf9eV+kVC7UlEF+aELBFJwpNIw7QZEWBCFwnLE2E6JwpM2BKRZXrynL48ef0y1ec42X3OH48Q86gvjqv3XL1w9YGrj1x94uozV69cfeHqudUat1rjVmvcao1brXGrNW61xq3WuNUat1rjVuudI/uxbh+I4EjAkYgjCUcyjiiOFBwxGPEOR/Ct9PhW+sWtLC49kSL6zRku01Rf8os9Ue2ZaleqvVDtxrSLo9o91S5Ue6Daqa3KT0+k/J8q3s/t4ae7KlIme7AX+3e7Gl4XFHAk4kjCkYwj3K0zpj06qt1T7UK1B6o9Uu2JmXvMVLsy7cmhf5b65HFEcCTgSMSRhCMZRxRHCo4YjGQH/fEN/2TMnuwXsj+Q/ZHsT2R/JvuV7C9kv3H9Su5Xyf0quV8l96vkfpXcr5L7VXK/Su5Xyf0Wcr+F3G/B+n0gAUcijiQcyTiiOFJwxGDEHI54HAF3/z6M/qz7dr05NM9bHPtrt/10qePy99TM7nec+uO22V37Zrzp8XHJYzxFEuoQhoWMx0NcrCXZuKzx2b2lWpwbh/7xrR+GYVjBsIp/", + "bytecode": "H4sIAAAAAAAA/9VavY7rRBQeJ3YSx3HsXQokOuAF7E2y2QZpiytR0lEi+eayHQ9A54IGiQpEzSPwBjwBDUj0iIIaHgCJO/fOyX7+fDLxaj2IjLSa8Zzj7/zMNzPHuxuZty15/RO5cez6CPqZ6TaR3bu+el6rR8SqQvkYXYCPkwvwcXoBPsYX4GMSwMc3DTe7ddqSyi6aTUpiTjcJsHSD1D1PQD7i4tcp2R0T/67aNqkS34j+b1LIbwD82xQwA+BXc4fzon3E51iEB5EJtk7bwHHe5hSbgVjEdhzG9j4ie4biNGR/aYJyqo7InvjD+ZFxLjrtoz8RyeK2H4fIkrYbh22L1z/vgh5zawJ6H8D4QzcOzMcm8L6u3vHELHPz1hyb5G0Kc5JXyfMC9UmWgixuu3aW7jkGO4glfiSk/757Llw/g3fk/VKxPyP7Hb+VOc5Lquinir69A99z48z9WA79LO+YoPu+EvxZGPyN8Afv86kSk9jPTXcPilzrjdHPqCMHTNDzuvbFhv7LWpekzzk4hZU8EStVZCHWNPbEjfZzRf8pa4pxB46tKk1/XTgOrlu1/lwcpdH3nW2F6eeS64B5oPjF1sLhyXmr2ZR4UB/HtiU095Hr7fOvFB/umSH7iO9VzE+gPX+spRdh8G8EPw2DX3ONify2XHxBazKHdZwavd4QOer/AJgfu3Fh+usWkwyxZyTDNeXz4FL3wyeuH2M/+L6JAtWIO/b1FE/4/IogjpF8qRLy5VPXWx596cYaz5iDyDPm4NyT40BnwpGDS4eHHESb4tuE9HFsW0Jzn7le4+Ac3psqc8zBqeKPD2votxzm2raYZPduvnpeq20OfgM/erlru7IMZPLNUJIM+a7xbwmxBby7jjwSv5BH2tk6UeLAeBOa+8L1Go9wnX1rX5o+dycDsDROajzCXNsWgyw0jzq5a7uyFciYRyuKH2VYp/pqS7GtnYW49nwW+r7RQtXBvFe0euH/cu9HEA+fx757/yvXa3uFcxedyR1/Q2J+eD3ux8nP2Trya/IpgTwMqSNF/zvA/MaNNV7MKG48I+5HibnenfIV/ZiQTHS/Jf9C/T7nGnAN2cqU/H7vesvDPOr6GKie2fjqAcwL2uf9pO1FyX1BMeK7Wh3H59iCnlFXMLVzi/3VfpeDnJc76Kl7Ces8DZf9yBQ/tPNE5leKPtYAYl9yiXf1aoDtuZIDn22fr7mijz5k5CvazkmGMfI9iJj8TZCbfvyyh9YgC3E/ye+18X5aKzFOSB/HtiU096PrtftJyznO8f20UvzxYWUKllbLYa5ti0EWupbr5K7tykqQcS1XQvyyb7R9VEBszM0QPJJcIo8yxdeJ6a8p7tmE5n5yvcYj/K6aKnPMo0Lxx4elcVLjEebathhkoXnUyV3blQ3lkZxpWj24JBneV3xW+77Pz91X8i7+DjFkPvd3b7n7xleHL7UltxjkqP+Le0YuSf+cf8x52Df1w6Z5aHbNq1fbQ8M1mYHcZQHsN/vN3eFme9i/3G2aze1Z+8L/zt9y2+47GcpIB/EEC/82mg3AyjxYqQdrORDLZxt9jQl/5Z5nJ/BT0s/dM/6deq74kxD+7+bRzt+kI5h/gM6fIhPd9tEGr90aZYo+nrOsL7Fam3+5OdnXBdgZ+/vglN/IBbGv5SA60SMWzomtJWGNfQeMuSY+rPVALMknrq8d/yNy1wda6xuOQb5pME60L/6UYfw5cq8A21pOxf4Y3BNb/xX3tNh83EN95p6GVQzEknxqfMvD5GDD57o5kQO0j894rmv/58RndhZ1cbR84R0md5HwqgTZkmRXIFuRv9dt31/EKsjfa/JX7l6N86Vif0320ZZmn+/lK0X/StG3XIkppzPlXVxfyWmIWuuwu3152O6a6vPaPt6cq7X+BYLVYkAJMQAA", + "debug_symbols": "tZrbqiIxEEX/pZ/7IVVJVRJ/ZRgOXtpDg6h4GRjEf59uUeeMyhw2sl/EaK1F0kklNKlTs+hmx8+Pfr3c7JvJj1Oz2synh36zHlqnc9vMdv1q1X9+fP25CeOH2SV+v52ux+b+MN0dmklM2jbdejF+KwO/7FddM7Fw/tk25jCRYaLAREUJDzAhMKEwAY88v+5VrlcihfhIKExEmEgwYTDhMJFhosBERYkSYOLlnJvGK2FD2AOhMPHy6Vr1G1HzI5Fh4uXTdb2N3O2fkbdPoeJyixXXdA9OftFXqr4Grl64euXqI1efuHrj6v1tffK73sOjPnP1hauvVL2EQPYL2a9kPzdzJSSy38h+J/sz2V/Ifu6pKxLIfnL+Cjl/JZL9iew3st/J/kz2Y/l7QSqMqOCI4sjLtVqCXZGi+ZtnVW6hUvzJnqh2o9r9TbveQ1XkyZ6p9kK1V6Y9BqpdqHal2iPVTl2R6e1Z1XKzx/pk/25W43OHFEcijiQcMRzhTh11M0nUzcSom4lRNxOjbiZG3UwsMdPdjGp3qh2+JxH8okTwmxLBr0rEI44kHDEccRzJOFJwBLubgF+dcyD7hexXsj+S/YnsN7Lfyf78tv+/r+bgbSHur1x/CWS/kP1K9keyn5y/hZy/hZy/JZP9hewnn7+VfP5W8vlbyflbyflbE9lvZL+T/eTzt5LP3wrX9mgIOAJWdJ2H1q/prp/OVt214G95XM+/1P8dfm+7h1LA7W4z7xbHXTcWBf6tBxwTRGMb49CRcTGrxFa9jIMfB6IhtRrq2JTLv6FV0aEHQy/+AA==", "file_map": { "46": { "source": "use crate::append::Append;\n\nimpl [T] {\n /// Returns the length of the slice.\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Push a new element to the end of the slice, returning a\n /// new slice with a length one greater than the\n /// original unmodified slice.\n #[builtin(slice_push_back)]\n pub fn push_back(self, elem: T) -> Self {}\n\n /// Push a new element to the front of the slice, returning a\n /// new slice with a length one greater than the\n /// original unmodified slice.\n #[builtin(slice_push_front)]\n pub fn push_front(self, elem: T) -> Self {}\n\n /// Remove the last element of the slice, returning the\n /// popped slice and the element in a tuple\n #[builtin(slice_pop_back)]\n pub fn pop_back(self) -> (Self, T) {}\n\n /// Remove the first element of the slice, returning the\n /// element and the popped slice in a tuple\n #[builtin(slice_pop_front)]\n pub fn pop_front(self) -> (T, Self) {}\n\n /// Insert an element at a specified index, shifting all elements\n /// after it to the right\n #[builtin(slice_insert)]\n pub fn insert(self, index: u32, elem: T) -> Self {}\n\n /// Remove an element at a specified index, shifting all elements\n /// after it to the left, returning the altered slice and\n /// the removed element\n #[builtin(slice_remove)]\n pub fn remove(self, index: u32) -> (Self, T) {}\n\n /// Append each element of the `other` slice to the end of `self`.\n /// This returns a new slice and leaves both input slices unchanged.\n pub fn append(mut self, other: Self) -> Self {\n for elem in other {\n self = self.push_back(elem);\n }\n self\n }\n\n pub fn as_array(self) -> [T; N] {\n assert(self.len() == N);\n\n let mut array = [crate::mem::zeroed(); N];\n for i in 0..N {\n array[i] = self[i];\n }\n array\n }\n\n // Apply a function to each element of the slice, returning a new slice\n // containing the mapped elements.\n pub fn map(self, f: fn[Env](T) -> U) -> [U] {\n let mut ret = &[];\n for elem in self {\n ret = ret.push_back(f(elem));\n }\n ret\n }\n\n // Apply a function to each element of the slice with its index, returning a\n // new slice containing the mapped elements.\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U] {\n let mut ret = &[];\n let mut index = 0;\n for elem in self {\n ret = ret.push_back(f(index, elem));\n index += 1;\n }\n ret\n }\n\n // Apply a function to each element of the slice\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for elem in self {\n f(elem);\n }\n }\n\n // Apply a function to each element of the slice with its index\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n let mut index = 0;\n for elem in self {\n f(index, elem);\n index += 1;\n }\n }\n\n // Apply a function to each element of the slice and an accumulator value,\n // returning the final accumulated value. This function is also sometimes\n // called `foldl`, `fold_left`, `reduce`, or `inject`.\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n // Apply a function to each element of the slice and an accumulator value,\n // returning the final accumulated value. Unlike fold, reduce uses the first\n // element of the given slice as its starting accumulator value.\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n // Returns a new slice containing only elements for which the given predicate\n // returns true.\n pub fn filter(self, predicate: fn[Env](T) -> bool) -> Self {\n let mut ret = &[];\n for elem in self {\n if predicate(elem) {\n ret = ret.push_back(elem);\n }\n }\n ret\n }\n\n // Flatten each element in the slice into one value, separated by `separator`.\n pub fn join(self, separator: T) -> T\n where\n T: Append,\n {\n let mut ret = T::empty();\n\n if self.len() != 0 {\n ret = self[0];\n\n for i in 1..self.len() {\n ret = ret.append(separator).append(self[i]);\n }\n }\n\n ret\n }\n\n // Returns true if all elements in the slice satisfy the predicate\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n // Returns true if any element in the slice satisfies the predicate\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq(&[].map(|x| x + 1), &[]);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq(&[].mapi(|i, x| i * x + 1), &[]);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_slice: [Field] = &[];\n empty_slice.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_slice: [Field] = &[];\n empty_slice.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = &[1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, &[2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = &[1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, &[2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = &[1, 2, 3];\n let mut b = &[];\n let b_ref = &mut b;\n a.for_each(|a| { *b_ref = b_ref.push_back(a * 2); });\n assert_eq(b, &[2, 4, 6]);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = &[1, 2, 3];\n let mut b = &[];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { *b_ref = b_ref.push_back(i + a * 2); });\n assert_eq(b, &[2, 5, 8]);\n }\n\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 5e306356553..9cf950c6b5f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -23,8 +23,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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hKbOeoKUQEYgJ1AQKAlUBGoCDYBO9gMuIGJEESOKGFHEiCJGFDGiiBFFjChiRBMjmhjRxIgmRjQxookRJ4V5Hg932ZuZPUFFoCbQAOikMF9AQiAlkBHo2Iipl+/k3vmnxT0pzBdQEqgI1ASadahOCvMFJARSAhmBnEBBoCRQEagJRIwQYoQQI4QYIcSI48K871/o48Dy91vY1i6A6jhGf8b5efP8unl+3zx/7p1/3Ng/43y5eb7ePN9unn/8/pXt8cFAtk9vW6rj/YArKAlUBGoCDYCO9wOuICHQiWdpD+jvPzXzT8gI5AQKAiWBikBNoAGQbwQSAhEjnBjhxAgnRjgxwokRToxwYkQQI4IYEcSIIEYEMSKIEUGMOC7M+470y4lw3zJ++iR7XJivoAHQcWG+goRASiAjkBMoCJQEIkYkMSKJEUWMKGJEESOKGFHEiCJGFDGiToywx4FFc3uCmkADoN4IJARSAhmBnEBBoCQQMaKJEU2MGGLEECOGGDHEiCFGDDFiiBFzYsS8PI05Tf52r/nixff0zfPn1vm9bTfPl5vn683z7eb5fvP8uHl+3jz/+P1rj6K9//bTXa8+3g+4ggZAx/sBV5AQSAlkBHICHXtmWg9oticoCVQEagINgE5q+AUkBFICGYGcQMQIJUYoMUKJEUqMMGKEESOO0+Be1/5i9kuST4+vx2HwdSTWkVxHah3pdWSWkeMY+Doi64iuI+urH+urH+urH+urH+urH+urf5z+JB6P/pXnb0Tt4/R3BQmBlEBGICdQECgJVARqAhEjihhR5OUVeXlNXl4TYZsI20TYJsI2Efa4Q0k+di8k++lEfNyhrqAm0ADouENdQUIgJZARyAkUBCJGDDFiiBEDjJjjjKKbvnyX8f7bfIKMQE6gIFASqAjUBBoAHV9mS9vjENZPjyia48vsK6gI1AA6vvHktSo0x7edvI7UOtLryCwjx7ebvI7IOqLriK0jvo6sr76vr76vr76vr76vr36sr36sr36sr36sr36sr36sr36sr36sr36sr36sr36ur36ur36ur36ur36ur36ur36ur36ur36ur36ur36tr36tr36tr36tr36tr36tr36tr36tr36tr36tr36vr36vr36vr36vr36vr36vr36vr36vr36vr36vr/6sr/6sr/6sr/6sr/6sr/6sr/6sr/6sr/6s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", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_0.snap index 7e835c29c42..f23780224f8 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_0.snap @@ -23,8 +23,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "1Z3bjhtH0oTfRde6qMpDZZVf5ccPwwetIUCQDNleYGH43XdGEmmv2M3GhBgzwRtBB4YiAUZmV3XX1/Pnq5/f/PjHL9+/ff+vD7+9+u7//nz17sNPP/z+9sP7hz/9+dfrVz9+fPvu3dtfvv/nX79qj7/M8enzv/36w/vHP/72+w8ff3/1Xdhor1+9ef/z42/nePgf/vX23ZtX32X76/9fv5oFaCagWU/XrAZoOqAxQOOAJgBNAhogBwvIwQJysIAc9NYQUUdEhogcEQUiSkS0EwevsyjXhagQ0URECxD1hog6IjJE5IgoEFEiIiQRHUlERxLRkUQYkghDEmFIIgxJhCGJMCQRhiTCkEQYkgjbScTKk8h7+6fo9cWH5+pfPrvMzx81e8pHH0vxplNK1ynFdEpxnVJCp5TUKWXolFI6pUydUnSmbehM29CZtqEzbUNn2obOtA2daRs60zZ0pm3oTNvQmbapM21TZ9qmzrRNnWmbOtM2daZt6kzb1Jm2qTNtU2faDp1pO3Sm7dCZtkNn2g6daTt0pu3QmbZDZ9oOnWk7dKZt6Uzb0pm2pTNtS2fals60LZ1pWzrTtnSmbelM29KZtlNn2k6daTt1pu3UmbZTZ9pOnWk7dabt1Jm2U2faTp1pu3Sm7dKZtktn2i6dabt0pu3SmbZLZ9ounWm7dKbtkpm21mSmrTWZaWtNZtpak5m21mSmrTWZaWtNZtpak5m21mSmrTWdadt1pm3XmbZdZ9p2nWnbdaZt15m2XWfadp1p23WmbdeZtqYzbU1n2prOtDWdaWs609Z0pq3pTFvTmbamM211WDLTYclMhyUzHZbMdFgy02HJTIclMx2WzHRYMtNhyUyHJTMdlsx0WDLTYclMhyUzHZbMdFgy02HJTIclMx2WzHRYMtNhyUyHJTMdlsx0WDLTYclMhyUzHZbMdFgy02HJTIclMx2WzHRYMtNhyUyHJTMdlsx0WDLTYclMhyUzHZbMdFgy02HJTIclMx2WzHRYMtNhyUyHJTMdlsx0WDLTYclMhyUzHZbMdFgy02HJTIclMx2WzHRYMtNhyUyHJTMdlsx0WDLTYclMhyUzHZbMdFgy02HJTIclMx2WzHRYMtNhyUyHJXMdlsx1WDLXYclchyXzJjNtXYclcx2WzHVYMtdhyVyHJXMdlsx1WDLXYclchyVzHZbMdVgy12HJXIclcx2WzHVYMtdhyVyHJXMdlsx1WDLXYclchyVzHZbMdVgy12HJXIclcx2WzHVYMtdhyVyHJXMdlsx1WDLXYclchyVzHZbMdVgy12HJXIclcx2WzHVYMtdhyVyHJXMdlsx1WDLXYclchyVzHZbMdVgy12HJXIclcx2WzHVYMtdhyVyHJXMdlsx1WDLXYclchyVzHZbMdVgy12HJXIclcx2WzHVYMtdhyVyHJXMdlsx1WDLXYclchyVzHZbMdVgy12HJXIclcx2WzHVYMtdhyVyHJXMdlsx1WDLXYclchyVzHZbMdVgy12HJXIclcx2WzHVYMtdhyVyHJXMdlsx1WDLXYclchyVzHZbMdViy0GHJQoclCx2WLHRYsmgy0zZ0WLLQYclChyULHZYsdFiy0GHJQoclCx2WLHRYstBhyUKHJQsdlix0WLLQYclChyULHZYsdFiy0GHJQoclCx2WLHRYstBhyUKHJQsdlix0WLLQYclChyULHZYsdFiy0GHJQoclCx2WLHRYstBhyUKHJQsdlix0WLLQYclChyULHZYsdFiy0GHJQoclCx2WLHRYstBhyUKHJQsdlix0WLLQYclChyULHZYsdFiy0GHJQoclCx2WLHRYstBhyUKHJQsdlix0WLLQYclChyULHZYsdFiy0GHJQoclCx2WLHRYstBhyUKHJQsdlix0WLLQYclChyULHZYsdFiy0GHJQoclCx2WLHRYstBhyUKHJQsdlix0WLLQYclChyULHZYsdFiy0GHJQoclCx2WLHRYstBhyUKHJUsdlix1WLLUYclShyXLJjNtU4clSx2WLHVYstRhyVKHJUsdlix1WLLUYclShyVLHZYsdViy1GHJUoclSx2WLHVYstRhyVKHJUsdlix1WLLUYclShyVLHZYsdViy1GHJUoclSx2WLHVYstRhyVKHJUsdlix1WLLUYclShyVLHZYsdViy1GHJUoclSx2WLHVYstRhyVKHJUsdlix1WLLUYclShyVLHZYsdViy1GHJUoclSx2WLHVYstRhyVKHJUsdlix1WLLUYclShyVLHZYsdViy1GHJUoclSx2WLHVYstRhyfJ5WbKK+vLRmu3rUp6XJbteStcpxXRKcZ1SQqeU7WnrNs6lzPXPUj6JBiIqRDQR0QJEO3TSgagjou2eiDqLstmFyBFRIKJERAMRFSKaiGgB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", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index cba92d0338c..9c6da3318df 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slice_regex/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -23,8 +23,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "22": { "source": "pub mod hash;\npub mod aes128;\npub mod array;\npub mod slice;\npub mod ecdsa_secp256k1;\npub mod ecdsa_secp256r1;\npub mod embedded_curve_ops;\npub mod field;\npub mod collections;\npub mod compat;\npub mod convert;\npub mod option;\npub mod string;\npub mod test;\npub mod cmp;\npub mod ops;\npub mod default;\npub mod prelude;\npub mod runtime;\npub mod meta;\npub mod append;\npub mod mem;\npub mod panic;\npub mod hint;\n\nuse convert::AsPrimitive;\n\n// Oracle calls are required to be wrapped in an unconstrained function\n// Thus, the only argument to the `println` oracle is expected to always be an ident\n#[oracle(print)]\nunconstrained fn print_oracle(with_newline: bool, input: T) {}\n\nunconstrained fn print_unconstrained(with_newline: bool, input: T) {\n print_oracle(with_newline, input);\n}\n\npub fn println(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(true, input);\n }\n}\n\npub fn print(input: T) {\n // Safety: a print statement cannot be constrained\n unsafe {\n print_unconstrained(false, input);\n }\n}\n\npub fn verify_proof(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n) {\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, 0);\n}\n\npub fn verify_proof_with_type(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(proof_type);\n }\n verify_proof_internal(verification_key, proof, public_inputs, key_hash, proof_type);\n}\n\n#[foreign(recursive_aggregation)]\nfn verify_proof_internal(\n verification_key: [Field; N],\n proof: [Field; M],\n public_inputs: [Field; K],\n key_hash: Field,\n proof_type: u32,\n) {}\n\n// Asserts that the given value is known at compile-time.\n// Useful for debugging for-loop bounds.\n#[builtin(assert_constant)]\npub fn assert_constant(x: T) {}\n\n// Asserts that the given value is both true and known at compile-time\n#[builtin(static_assert)]\npub fn static_assert(predicate: bool, message: str) {}\n\npub fn wrapping_add(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() + y.as_())\n}\n\npub fn wrapping_sub(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n //340282366920938463463374607431768211456 is 2^128, it is used to avoid underflow\n AsPrimitive::as_(x.as_() + 340282366920938463463374607431768211456 - y.as_())\n}\n\npub fn wrapping_mul(x: T, y: T) -> T\nwhere\n T: AsPrimitive,\n Field: AsPrimitive,\n{\n AsPrimitive::as_(x.as_() * y.as_())\n}\n\n#[builtin(as_witness)]\npub fn as_witness(x: Field) {}\n\nmod tests {\n use super::wrapping_mul;\n\n #[test(should_fail_with = \"custom message\")]\n fn test_static_assert_custom_message() {\n super::static_assert(1 == 2, \"custom message\");\n }\n\n #[test(should_fail)]\n fn test_wrapping_mul() {\n // This currently fails.\n // See: https://github.com/noir-lang/noir/issues/7528\n let zero: u128 = 0;\n let one: u128 = 1;\n let two_pow_64: u128 = 0x10000000000000000;\n let u128_max: u128 = 0xffffffffffffffffffffffffffffffff;\n\n // 1*0==0\n assert_eq(zero, wrapping_mul(zero, one));\n\n // 0*1==0\n assert_eq(zero, wrapping_mul(one, zero));\n\n // 1*1==1\n assert_eq(one, wrapping_mul(one, one));\n\n // 0 * ( 1 << 64 ) == 0\n assert_eq(zero, wrapping_mul(zero, two_pow_64));\n\n // ( 1 << 64 ) * 0 == 0\n assert_eq(zero, wrapping_mul(two_pow_64, zero));\n\n // 1 * ( 1 << 64 ) == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(two_pow_64, one));\n\n // ( 1 << 64 ) * 1 == 1 << 64\n assert_eq(two_pow_64, wrapping_mul(one, two_pow_64));\n\n // ( 1 << 64 ) * ( 1 << 64 ) == 1 << 64\n assert_eq(zero, wrapping_mul(two_pow_64, two_pow_64));\n // -1 * -1 == 1\n assert_eq(one, wrapping_mul(u128_max, u128_max));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 69f6a9d03cd..4f98f2baaa3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -42,8 +42,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "H4sIAAAAAAAA/+1da4wk11W+1dM90z0Pz+yaSEFByBIBIhzQPHa9a0Gixdldvx9ZjL22CWS8fgFCGGGEURSliMDCToiTHxFShEgiWUCIFAUBIfCDhxQHiEEQQQwIQkABBFiCWAkKRjKPu67T/fVXX92u6q7br6krjXq6761zzz33vM+tqsS90pLsz7d29tly+WZjzmSfu5O1vRph7cbEM4mEZx9R/D9xxYTvrWefbniTfP9KjQvuCZzqgn969+SDPbG+GvE/6AHMCPD3DX47DvzdtQzO96TD8B3Nu+WGhRevsT4U5Ldkfd2s3/7/5uz/HsGLse+IU910u1Lg34K1+famNM7cBv9sBt9FgH0OcK8Rfl/ez8ehTR/+9fXTpg/7hji47xv8G+vHvQ/7pji4Hxj8m+vHvQ/7lji4nzD4t9aPex/2bXFwP2nwb68f9z7sO+Lgfo3Bf3P9uPdhX4iD+ymD/131437aYN9ZP+xDg/3d9cO+ZLDvqh/2Qwb77tph7/Vl9GL9sPv+5z21wz7o6/R764fd38v7aod9zYkN94oveDU4k+h3dlzenzRZ6NDY12efsf3k4wDX0VzTigE6ceAfJLQel8HnNdn8yt9PCj4dwWDarbuofvpeaG2Iv/2/4zQf2f9FsNoVYUXm1/6ergTWreI7hSuvwzfzryeliW/m78amicFfjQTfaNEJ0ALn33L5PaoqRzbXuouqg/ZCa0P8eZ9RZyENimB1KsKaV92ocOV1+Gbx0qQ08e3WGmFZPBFZZk4ZvdZcvllfF36z2Nv6MH/YouvW4bqb6LoNWo/9z22FviMtPF57yQAuj+N1IP93qQ/5xda07Yr5LPK+7BoP2b603YCHeE7fWjSe97RDv31f9unp8FAyuKbIZpXVMWyrVwT+KMsWl7Nf+WD22RPriu1XrtEalO5BWTXeVvyC1+J3Xq9v1xMtbOwPLhAtLtREi9sLaPEjRItIdkfSwuZSa2sRXrHiILYtSq6UXuiIdSB97bcfzz7r0AscUyB9IvHwaWWzrLHN8o3t2TrgxfZsA65Dv4Gbslm2Xo/X91ewWchjPerDPTW8I9O3Hwv34sDv+3tdoieviWkxSSxsc00rFlZrC8XCXcCH9bGC1a0Iqyf6YuzpWmDdyidTuPI6fLP4dVKa+GZyHZkm1ypd5Gj96zQ39qH/zLHPJsBi/bYF1yHtuSkdZrTwnx+poMOQZ21N7I9+KPuMXTdWdp1td6QY/iCybg7mP3BNa7Q/k+hOzn/E1p1qbSHdGYpNJsl/sD8TO/8xKo8Yyn+sFKzDN84jTpKzuLFGWKyHI9G3cv6D8xhl8x9n6Tr0Ja3+WlYPGy08Xv8wpi/ZLYCpYjHDj2OF38s+ZxmXlonFYsWI7NdgLKbkr2qO5tPZ51GJxVi2ysZidgagrPxgLLbZGsDlcYyrisUYvzLyY2M/l33OUn6m5fPMIrZQ+q4On8fmmpbPE4qbnMvLOvOR/V8Ea60irGn5saN8HvZjFa68Dt/w/OAkNPHtlhph2TmvZdHLdmZkHL38HRPqZdbDX84+591XiYWX8aftOfoqSm5aLq+3kV869NtL2WdsX2Ue8jG+heqZLBOYj7Fzf2VlAnMuj4wpE5xzsb617MJ5yLlEmjuo68rugeHmYby/xB7Mck0qLk2oD/m4qo5GWvzcnNNinDX94gLv7zjr/eWGn/u0+I0KtEhmQIuya0pgTV+7MnpNG25A33Za/7pOnX7F/7iMbwa/4/K44/wdGm8A0Pe0z/YEeD506nDvoYPDhw5PHj7wwIlLh2yrfGsBnfDctO3VKoxNCj4vryUAe4dgKT5PapxH2eJtl5dzPuc3a/+0Beup4p++MVuw8k9bRDv+jWnXFvhw3t03u//Q7+l1BXN2XDhnyDmjm5IBzHPZ/2rfjI9UzFHEV2o9yhffEHjdAvS9Lhs4y9yPOuvHPIbjkcf4nI+qUW+L65jmPC/29QRMo9d6HHr1ZcxiFZQxnBPvOcfx+L9zAx6w3y4GZAzjqhXxW+icAtt+BUvlWMzmmQ1hWvvWhr46c3d+nnNge3O0S4f7MEZcTYdpsQnrD9mLHvWhXOMeFuk81F3n02H8OgIH1Gt12+XDUwenL+2fuHTq/pMHhwfXVLLLsc/mzlKv4ZqKzjBbv/o0WNzHOe1INbNgTjtUG1Z6NgSrbE7bYE0rp70aWDfOH9O39M18E1X/nnSekC1VeiSyPO2y3UC71xW4tlze7qDN6dBv7wzYvapnIEJnOvD8NPqWT9Cc6Dsqfyihddj4dycDmE9m/2+7vC1hP0fVZDYE/PcAnabtI4bODfH8+B3Hq3uKlH/NPmInQDt1xnGZfcQPBGSlDh+x6DvmGvjMk6pPKBldRn+SfUZ1b5HS6+xPKhqivmJ/Ut2rgLoM/bltgdu81c0Mt6p5iY8H5EH5CvhbyHawnkHacU5n1naXaVfW7n6yRtqp+4MZFuKfEM18UzXEpODTuXK+VE/gVUYeZm0feE/L2odPRZaHUXm6PyyYsyhPl9A6bPyfJAOYz5EeQ16w/d1wOqfUK4D/Z0An9qUi7X3w3hyk9TrRZ12MV3634muG1QV6lMmb2vi/DNBrIzK91PpR37At3RDj1wP06gpYTD/mH76OZdZ+V/duhHRTSFbL5pfsWpTHadZdbPwyn9d5IaBn6zivw9/5Pl7f7FzsKJ38JcJvDWCW0ck2/j9BJ385oJONFzYEjK/OUO+q+Kiq3kWZZT2iZF3FomgTh/Y4Q8b3/w8Im9JDyAd2frtDY1sZvMh6Wp5PKtKjTtCDc3ZdcZ2nSbcVD6bSY6zfR+VcQzp5Deb8ktDJCV2D9X2TZSWbNn6nNYBpchWyJUDK3PMXlC2JbTOq5DlnbTM4z1nWZrwG9ihGnpO/h+6lUDlR41+/L1e1hvFTNiOUE7Xx3wg67Ruy/0fZjDI60+C/TvD9LP1S3JeqfinnRFW+iOX+JND32wr0o+KDIpuxv2Q243QEm3F6QptRNq+HNuMq4HP248etW/rGegVhnUtf+Vzm/OH5gE6uI1/C35Us2pnLUXWqm2vSyXeAzrgtoJONF5QffyGgdxfNjw/p3ZAfz3bW9vitQN97Kuhku7eBdfJb5kAnJwJ/wx2fDV5Wh15qjYb7phrg2nXIH6ouqJ5RgHxQpy6/ObIuV+d3fDuTfe5O2BStquTWF9VW/OgC2YrHa7IVbwdd9rYxbcU7GltRaCt+Fuj7RA224qkltBXvjWQr3lsgI0VnZ2dhKx4XtqLovCbahBr3+oTSNdZUriuhPmULEgFrhb7jmvx63w7nN3ictcj3Wh3w/aGKFkqvll1vC9b7xvYALo+zxrywKLwxzv6/qwQ91H0XnQKYHcLJt7PpcJ+N/XXQ078G/9vvRXSPdA74GpWPZRqwTsI+1HFVZdLWdPke1gp7gjzIOjr0bOmWgKv4qEx+g/UCzhMjj8KygXsW4r9E9IVqiepsHZ5T8q0NfbHP1g09lykd7kMfezXrU8+S5GcYG93+FeTvT8knxb3hc1qxnzWu4o7Qs8bLxh2fC8QdVWvN6tygoh0/3yj285gV7do10O7zNdJOnRsIwVL6Qckp0tq3djo8z5ns993JmpTTIdqlw30YO7GcYt+d1Kd0rNKLNreXka8cATn+j8hyrOifUF9RTforgdje4Kn7Fdi3M1zUWU/fit5X8N8Ut87iPVihvQjVyxPC1YnvVXxNt7I4tLgljUuL1QWixW010aLoXXGbC0SLO2qixe0FtDi+QLS4UIEWrQAtmC9s7KuJFpFifUkLm6so/o2Vh4m872O/fw73Kyn4dC4fQ+Jc607zyZl61rYXWhviyD4H4sw+RlX/RcGK/SzVxOVlk9eN828FcOV1+HZ9Wg9NfLuxRlj2LHDlv9m6Y+sOm8vkpS3Wgbi1XF6+MY/C52D3MyDKt1b73QrQLhH4RNY3J1UOyprK9fHzE8vk+tR1kzwHzWjh4Vd5n4WqfbJN+06yaZF0obRp9r+3aXU/l+PSyWvuv3Ti5OHug3v+6/6o53JsZ/+vpYN+zB1cHod9NAbhGawu9G2UgLURgNULwFovCSs0N+LaJvib2ffVAvg9Gr+VfW/D+DWBT4fg37EymOdwZXiMwbwAY+6CHMvlselgDt67K7BPjEfdxONtrX7Ot4K8+LYN89RtQ4vwRl6w+RUNqvhFONc6wYrhF+F8iE/VPQnBuqIkLKMn7q///4ems9f7vIaW03Jm8/fvhY+DT5/3tmFuRVObvw7es7mmxXtqbSHew/HMewrWdklYRk/Fb1txaHDAet0V0ADnx++o19H+2bWss9+2MgxH0QttmNki46sd6FunvmPQt0n4Hk/z+CKsbcL3OOFrtlfx/I6Y/wqaH+dS87NdPibGHxPjPa88RjRdFdfi/hpNm/p5fhzjg/qpTP08oflUzOWbxQR8b8m7yAePVXdRPvhqwRocrEG9Bzn0zmlH14XOV3J8+T6iRSS+DL4396jIxBfmQCasrsEy8QsLJBOcgx9XJoreJf1MIxNTk4kbOgO4PI7xiSUTVsdgmfjVOZCJyPnLaxOX54MVQdO+n+3yfMnn/FnmUCZvTYf7bOwn54jWkeau9E5JJXOY06wqc7YmD/+XKshc6Pwi8gDnW9WzsZQO5zNwzxIfzOJ9TCGZ6Ig1bAtajbr3BWlRdB7wuQWixYWaaHFXqmnx2TmgReRayenE5fUD0xrnV/ek8fN6i+7P8e1iOtxnY/9qjmg9D++6U7pYvesuEbCULsb7cW5YHcDlcYyP0rfqXhS+98vmK3oPLdtrG/9PxAexngep+KDM8waQl1kXq/OA/F35J6yLbewLC0SLCzXR4mIBLV5cEFooXTkuLe4qoMVXF4gWKzXR4p5U0+LlOaBF5Lj5MHF5u6Fo3SFarwlceSzT07d70+G+fizbHl7vLOOlZc9RXLk2gMvjHNFi2f2Vz5SgRUx/xTfO19j4V5NMzLON5vPldevir18gWtxWEy3OppoWr10QWlT1V0J5NvbdbOy3EC1mmVPojKAF+ysYd4+69xlzCvelw302dpdo0eT549nQD3YHcHkc4zNunt9gFeX5+R4tG/8G4oNIZ/uD77suOicwD+dyFV+gLrKYuSxf4PnaKucE1PnaEM8kLq8nbRw+V4XvTbHxN7cHePKzZ5XuUmcPyuiuTsH8vp1Nh/ts7JvnwP8P0fd8OhhTRN87J6Av+0/j2oaz6XCfjb13DmxDQjihXmvBGm5I9Rq+l9Ywi3vJjooe+8KM9NgNgHORnP3ABHLGvvm4clZ0v+OjCyRnNxWs4bFGzqYmZ1XOi4wrZwarrJzZ+DQgZ21a4yg5U3vsnJYzXHuRnD0xBzzK9C0rZzb+KVpDpDMx83M/8N7gncJtwqkW+P/fWB5wjrg6eX8vofmcG95TR/Ovu6j7vlfWJvK9k3F87/3dYy587ybvjcojbYnrR/FypFhiP3L+rXk/tgs/24nts4K1VhFW5Dzi2O/HVrjyOnw7m9ZDE4TF87IdUz6Ejf3rTHD994+2h+F1C+D5dnc63GdjnwN4H5uOr91/hkUvEvyE1uic5gmuOSG9qsq5zTWtZ1iotSGOzIeoUzmuUbC6FWFNS3d3AutWulvhqp65eDathyZ1wkI9UOYZFrFiY15H0TmxFqyH1xF6PtynIS6K8QyLcZ8j4cc/n+EWevZ77LpAiP6KH6rS/7MB+idwXRk9w7rFN0V/i5cV/Q0G0l/F5RyzYwyEz/j72wIYCo92AR4Mg/U79uGeGLwp12/2I/vqQX2sznaH4kj+dG6x4rzQs49DsDoVYcX2yxKaT60b598K4Kreq3U2rYcmCIvl1uCrT5uHf+N5EBbrh3FjQTUP7yPCHSc2uCoD6L+/RHZLnZuIfcYjZLfqeC/N/wbsVtX30ii7ElmHnphlHIRr4jhoEh3NcVBsHa3WFtLRyFuc75jET2eeiR0HrQbWjfNvBXBdxDioDljGr6Hnkk7Lp1f3QYZ8euRZ5AG2Ba/JbEEdPv2KwEfZSjtzEbJvHr9zWYeKaZn+sZ95rs4Sq/f2tFzebg2964F++6YA/avGtCsCn9jPDJ1lLj6kx5BOScGnc+Vy8ZFkO5iLD+0z+2H2fxGssrn4Kfl7pZ8dHMrFrxSsw7ezaT00qROWXe9b6B0C03rOrNJnSn9X1WdnarQnyr4pe2I5OmVPDIayJ0h/Pi+vaqNNbiYvt1V1a5Obyfc1uZk8zlX4Ss2zqLmZd0Bu5v7OMN6Ih5079+Me6AzgMmylZ/n+BRv/CMz9MPz/TMAPZ72peGyZc0uPBuxdHbklFWvgXvL68BrlQ6r3a+Fe+NamvjPZ77uTNfl+LXxPVicd7sN3Da9mfTvUh7RR737qUp+q67PcXKaPy9P6fDqMn5JnlMdljlt/uolbg/CZ/kiLJm5t4tYmbq3WQvqsjrj1g3Mctz7TxK3YmrjVNXFrE7fqz7Lz1B23/gvEi79P+moZ474/iBz3NWcKquvo5kxBvi/GnjZnCsaHZfw6D7kBpRtDuYGyuvGLkXMDk5wp2MoWuMy5mX9vcjNB+Ex/pEWTm2lyM4ucmwnJ66x97RVYTxV70s2UotJnar9DPpjS95PkZrbAGcI+jp1843sr+7itDuC9luwT6pAyuZ4yfDBru8Z8UNauvToyH4RgJQKWqqUhrX1rp8PznMl+352syVraEO3S4T6UL66lYd/d1Mc5QuxT9003PBzm4dc3PGwtGg/bM9YV/63B2hQNz9Sztuj3Yn57gI9wn0N7H/InQrAUTyo+Qlr71oa+2Hw0RLt0uA/PHDAfYd9F6uO8OvahLiyKG7CvqcnkeSkp+HSuqck0NZmmJuNctZrMkxBX3E8+2TLWZB4J2MSmJtPUZHxrajLFuDY1mTzsZanJ/FRAN866JvOxI1CTeToy/ZuaTHXb1NRkXEx/r6nJuNHyuqg1mY/McU0mZE+O+v1Kn4gcI4VgKV03b/cjxc4bsq+t8ob2fZxa4qcg5n8+UIexuRb93P5nasyDq5ggBEvJhuJnpLVvbeibZT2lLD+HaoJGl1E1wecr1ASPmk7+uxnqZCUPy6iT76K+qjqZ9ezLoGdfqKBnY9cbbZ/K1htZ7ztar/32YqNngzw6RLt0uA91MPMo9t1DfWX1LOZSXm7OXvQb+wqd7J/m7EW8sxf3Ul/V80NVn5ts1zX19DzvJQWfzrmmni5gNfX0PKymnj4Ye2embPz3b83+X+a45CBgL5t6elNP962ppxfj2tTT87CnXc+NVU+/PaAbW4J206yn/wTZpmWsp98bmf5NPb26bWrq6S6mv9fU091oeV3UevpjkXNTk9TTQ/bkqNdufjJyjBSC1dTT49fTn4aY/8MBOZi3evq4ftX7a/SrQvGFgtXU08M5LKynf3hCnZyIuedZrzzcG+CB6/CN90HV25QNWiM6qXrYosvzx2uUZ+UfMCzEX8WurF8/keEX2w84DnCdy9NN2QfURxcL8P9twj9SvUnizzUQ5fcZ3Z0LyzLyu2/tNMo6pCwjn0wqywmtR52D8M183w6Nf3YB+DGB65gf/4jwj1TLkvg3z5t9pTW12DysphY7Hk0QVlOLHYzdyIIA//0fj0At9t+aWmyoNbVY19Rim1psHpbx6zLXYlezf+axFrub4bbMtdhjkenf1GKr26amFuti+ntNLdaNltdFrcVeHdBns67FhuzJUa/Fng7sW1OLXfxa7HmI+R8mOUjEXIt+z90tAX5Geq2I38rEBCFYR+WeO+O1ZdaL981QLyqebO4vHvT1Y1gX1mlH/d7NH47sk4VgIQ+fT4fH45kMHo/weD0/But5d0/D7MD1OG8RzMcB5nXZoMixbS432XI6R8V0G0XnkK7gvjb0sT3qpHHW7ed5murYyuYoPbKW9Sk9YveAL/Ozy3+mRr9GxaYhWMh3zJOoi1V+JilYz3sCstyFawzWHelomO8LyHKkGkpflg0+yjLyKOM/is4hWV6jvjb02ZyzkGXkX5ZlfC89yzL23Ud9ZZ/nUJQHxL7mjEWez5KCT+d0jrQ5Y5Hvi7GnzRmLQVukMxZ/D/mW36LYZBnj5N+NHCc3Zyyq6+jmjEW+L8aeNmcsxodl/FpGN0bax75u7OfPxDqUbkRdgT5+h377m8i6cZIzFp0MyWW2Tf+82LbpoLFNY7fGNgXWvYy26SjYE/tnmvYkdMYiZE8QPtdhMC7neys7sHaDYfEfwuV7kNaBNpz7i2S/cue4MPeHeW3EX9GwSCcZ/utx8D9gfnVO549w/qLxyMN8jyjyPtqSy9eng7429bXTPMxp5DX/gvKaKEeW11R8zjo+1n2NzHfq/lHErWrd8OsCeqZq3VDp4Un9CDVPKDe2VuM8yi+17yYn7IcmLp8vsrGvy2htPLMB19TJM+reww3Cf5zzRVdn+HtavIFsQCJoNS3ZUDGFqiVUjSn2ArLBvMS/hWQjcaNhqbys0qNIa9/a0Fe3roxxLoSf9YByaXRR8oi1yBAvGjzlj7DtCtUAZn3vh+FWlYfPBXi4aj2gjC+HsJQ8hHyBZTnbpOxTiIdZzz4AevZCgLfxLAdeH4tHbZ/KnndAfhl6hgH9drFGPavixDr0LJ+baUNfbB4NPf9B+as7oo/fnVBWz9rcHtYDFfQs8oXB24Br7FyAg2tX4LcWwOPx9r/B6qZ5PHB8Ox2G1cO5CdZ69r0NsHoCL+ODTZr7TPb77mTtwPDZQFwJZ5y/Q/g/CjrkMYhxLo9Ni9e/KebriPXviPG2D37Op8DXvTw3zBODTgrvLvxm8ysaJAWfCAt/s7nWCVbduqDOPQnB2qwIa5Z7iuvG+X27QozfEPgbD2xD3wb17UAfyrhvx7LvqCMQluHRofFPgv5E/PH6HTE/rxPnUvOj7mVYK+I3G+/l9p2gN57qDcNZFXAUfb2exzySfXp6ncm+71ZsJ04enrp0eGpv79oTew+e2DvJMS6uw8+/TThdxjkdvkbxV8gGoR3YLAFrMwBrPQBroySs0NyIK+on34yfVgvgr9N442fk967Ap0PwPwC89NHe8BiD+fMw5kNkp4b4jXBSMrAqcNoR422tfs5fITu1A/PE0GkKb+QFm1/RoKqdsrnWCVYsO1XHnlTVcQqW0RP31///m9PZ631eg9UKcJ04v+FzLA4+ByE7gHSz+evgPZtrWryn1hbivZB9L2svFSyjp+K3K+LQ4ID1uiugAc6P31Gvo/2za1lnP0t+gaIX2rB29r/x1THoY7/rOPSx33NlmscXYe0QvlcSvmZ7Fc/viPm3aX6cS83Pdvm4GH9cjPe88jtEU6X/FE1D8fRWYLzaM4TBPgPrJt96AfjHxfgQra4U+CCOCM+3rxHjtwPj7TvWmhHGNvTj+D8n3nkVXGPX74g1vKoA36Rg/iJ64PgrxXjPO3+c4Tir/IrxylHKr3we/IovVvBbR+loti04fh7ib8QV44iX5sDWYUxi89fhy9hc0/Jl6uCREKytirDmjd/K5nva2f+zyvf81wLke14EPfYS+SCKd0I+yCheY59C7d9mAD76Y6E8f2j8dgAf5d+pPQv5qtaHtpr9brP7yE8Iy/Do0PhupoCMn5R/pHwRjHN5rpBfGvLNinyRJMPR+yL/B/hWKov1mgEA", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_0.snap index e50c51e4b81..d5b87fb108b 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_0.snap @@ -42,8 +42,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index b5cf8da2f3a..399363d24ba 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/slices/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -42,8 +42,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 76638aee662..800faa9ca2a 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -50,8 +50,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_0.snap index 6b988d70fc1..86a562338e3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_0.snap @@ -50,8 +50,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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c45L5hyXzDkumXNcMue4ZM5xyZzjkjnHJXOOS+Ycl8w5LplzXDLnuGTOccmc45I5xyVzjkvmHJfMOS6Zc1wy57hkznHJnOOSOcclc45L5hyXzDkumXNcMue4ZM5xyZzjkjnHJXOOS+Ycl8w5LplzXDLnuGTOccmc45I5xyVzjkvmHJdMHJdMHJdMHJdMHJdMCUNbcVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVwycVyyznHJOscl6xyXrHNcsp4wtO0cl6xzXLLOcck6xyXrHJesc1yyznHJOscl6xyXrHNcsn5Kl0ymp0N377u9KuKUIqIU6ZQi25T1ui+icbzIkT0Y3rAHLLIzlcmkMoVUppLKGKlMI5VxUhmdssxR5B1wys5SJUbfh0hN8UiOR0o8UuMRi0daPOLxiOKRHo/EV9/iq2/x1bf46lt89Q+4EmMfGdmPn4fFfP96qdiw3weHjn2s0jhVnFNFJ6ySh/avaPPo+WWVzqkyMFUOuBJnqZI5VQqnSuVUMU4Vzsnsp922w/fHpuIvq8S27WOkxiMWj2xeHHMq4/lFsL26uG8/Fv1WSDOhPhMaEyFxGKdTMq6k9Hvf5vqySuVUMU6Vk76iTFm/wdJeVnFOFXGq9LPtFT9+4pdk+xO/ZL2sPTAXrJ44VTiX8e1nm47/oLX9ENIbGZ/IbF9fj15ptp+/eSMzwpmx/UTLG5k8kSkTmTqRsYlM/Hs98oHvwZE9OvLE17N9X/PoRXBs34B8I+MTGW1njvB/bN+BeyMz4pnte1r/2AVhlIn1L2UiUycyB17PH7tTMEqfCY2J0PZb6W+F8kyozITqTMhmQm0m5DOhmR1RZ3ZEndkRNrMjbGZH2MyOsJkdYTM7wmZ2hM3sCJvZETazI2xmR7SZHdFmdkSb2RFtZke0mR3RZnZEm9kRbWZHtJkd0WZ2hM/sCJ/ZET6zI3xmR2y/K3js1vXYflfwcOTX7qP/fLi//vDx5urbLvHwyR+3n75f390+ffj9v1/3n/l4f31zc/3l/df7u09Xn3/cX72/ufv08LmL9PDLw5fYyqWXXZHHZzN7t8vex8OHD9/oPtJlH2X3d+7+3v8B", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index ffdbb6d0c97..2c16159dadd 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/strings/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -50,8 +50,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 590d7b618a2..137e803270f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -144,8 +144,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "ndndauJAGIDhe8mxBzPfN7+9lWUptk2LIFqsXVhK730nXaOSjJF3TkojPCbOG3Qy89W99E+fb4+b3ev+o3v49dVt98/r42a/K0df36vu6bDZbjdvj9cvd2b4Y635AR/v691w/HFcH47dg3iz6vrdy/CfLW/wutn23YOX79+rQiwnwoly4jjxnAROIieJk4yJ8PrC6wuvL7y+8PrC6wuvL7y+8PrC6yuvr7y+8vrK6yuvr7y+8vparx/ziajRGUmcZEyc4cRyIpwoJ44Tz0nghNd3vL6r1tfsT8QZPyXecFKtryEuEOFEOXGceE4CH7HISeIXljEJhhNeP/D6oVrfyXnE/OzmD44Tz0ngpFrfWz0RL3OSOMmYRMOJ5UQ4UU4cJ56TwAmvH3n9yOsnXj/V62saiU8zIpwoJ44Tz0ngJHKSOMmYZMMJr5/r9aOcSLB5RpQTx4nnJHASOUmcZErEGE4sJ8JJtX6QcaoQXJoRh0l96Sbq+PgWvZ+RyEniJGNSX7pJNpxI0jgjlpNqyuTsSGYPvFJfulkm7s6FVYjnJHASOUl8kDMm9aWbxUGuL90sE8Efv750s0x4feX1byyqOHNeu3H2auLz32RubiyrLBvbYKTBaINxDcY3mPriinN6Nj5OTWwwqcFkbrxpMLbBSIPRBnPjPgj5bLKbGt9gQoOJDSY1mMxNMA3GNpiGsQ4NYx0axrq+FFCmyeNvT5n+2qnxdZPH7/gyzQxTExvOU78PjLmcZ/ZdVX/qXjb1x+47pn4fGBsvY+CnRhqMNhh3//Nc91nNu5Qp/NilzLOn79/Qv/6gfsdEaL7LwZ/1YbN+2van/fXXz93z1Xb78e97P9l5fz/sn/uXz0M/7MFftt+Hcc9uZY0rl/KzFS9l/MTa4XCIL1bKoSsnLSf+Bw==", + "bytecode": "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", + "debug_symbols": "tdrdbtpAEEDhd/E1F7szs395laqKSEIiJAQRIZWqKO9em+JC8dbouPFNVUf5BvBxRJj4o3laPby/3K+3z7u35u7bR7PZPS4P6922Pfr4XDQP+/Vms365v/xy47p/vHdH8Pa63HbHb4fl/tDcSXCLZrV96v7n2wHP682quQvy+X3REs+JcKKcGCeBk8hJ4iRzUjARXl94feH1hdcXXl94feH1hdcXXl94feX1lddXXl95feX1lddXXl95feX1ldc3Xt94feP1jdc3Xt94feP1jdc3Xt94/cDrB14/8PqB1w+8fuD1A68feP3A6wdeP/L6sV4/lRNRpwMinCgnxkngJHKSOMmcFEyS44TXT7x+qtbXEk7EXBgQ46RaX2MaIZGTxEnmpGCSHT5j2XMi/IkpJ8YJr595/Vytb/LnjIXBxZ8zJwWT4jip1g9eTyTIkAgnyolxEjiJnCROMieFEnGOE8+JcKKcGCf1+pp7EvIlWQzfvSz2b19ixc7f/Ht8nHd8mnd8nnd8mXV8fY/5deP9vONl3vGKxh+JcRI4iZwkTjInBRNxnHhOhBNev75LDUlOJPryP9djfe/6dePjvOPTvOPzvOPLrOPrO+WvG+/nHS9o/JEoJ8ZJ9ScmSv8RJNrgZ7i+qx4l9dVj0n4tlEIYkIJJffU4Tjwn1ZQpWU/K4OXXV4/jxDgJnEROEieZk4JJffWYfTyRrGlAPCfV+tl8TwYLTqmvHseJ3XhiFRI4iZwkTjI/yQWT+upx9CTXV4/jRPDLr68exwmvn3j9+lJw/G2svhUcN/W14A1TTdOuP/o27VrDXxuZYHSCsQkmTDBxgkkTTOamTDhv5R+vp/TXaLveiddmynOrX6POnR/H699G6+urG8ZPMPU/XTifzucgXBudYGyCCbdfz2Wf4a/Avl2d9V3aj9PX83l/dWmCydB8tgc/lvv18mGzOt3X9vy+fby4ze3w83V1dcfb6373uHp636+6e9/Ot711rYotvLP2qRxXR9J+HBbT7rC7YMSsPYztg7YP/As=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_0.snap index 147f0c80992..7b14499874c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_0.snap @@ -144,8 +144,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1bzW4jRRDusWfsjNeJkyywu29hx3ESbpEIYf+Q9g9p/1jJZLFA4iHmxIkjVy5cOHDixAtwR1xA4saRKxLiilvpsj9/U23WpDvZXqWlqGe6qqu+rq6uru5xMnNabkz/Mvecu/qKqRfhOXR1/2xlEFBWPybOLBGcjYA4LbbCxJ3/ZgS7hsaYJ4CxSABjKwGMbZPGOl8zYdd5wyyW0HjLBOa+Y9KKnVcSsGk3AYzrCWDcSABjz6QROzdNWrFzK4G53zZpxc6rCdj0rQQwvp0AxncSwHjNpBE7r5uw61zKDQZsy3Vos0HWHhbtYcwGB3uYsMm6TYRtcmmTN5sQ2YTDbuh2w7Qbkg32NoDaAGUXvV1U1mmtU1xzOjIGAW25eyjdewPoAQ+vg5L0hpR/0B9NSrNYAuMflk5mN4r8wbsifz0O/n7byXm/msvHsYjepquPq7ktj6tFTMJzE3huAk8GPLeA55aH5zbw3Pbw3AGeOx6eu8Bz18NzD3jueXjuA899D88D4Hng4XkIPA89PI+A55GH5zHwPPbwPAGeJx6ep8Dz1MPzDHieeXieA89z4lmHZynic0LDhPKYaE2gfeBosjbk4jZs7Ng9iLz2RjK2LoxN7CO6N+Lo3stInzFzGyNN9HdMzDh3etGM+gQP20d8ZBaXqjmenGh5VR+H0AqgSZvdU18AH/tWl2iYrH/o5Mm8tUx4O0198tPIPrlzgT45fBN9skW0vKqPY1WfRN8SHDI37Qi2mOZR/ctYmJbftYmWV/VxrOp36FscC9fMvHzk5Mm8lRHsNPXJvctYmJZPlkTLq/o4VvVJ9C2OhZ0Itpj63WVeaNLyuw7R8qo+jlX9Dn2LYyH+gOTjai7jc5D3Bel9AXp5rmPcvUz9eJZLNiPI77vLZg2/gTG2KzMrQmtCm8zHbC6Qn2gl0PJqUU/HveegB2UJjoL4P3PvPVe3oI/031T0t0j/Am6lDW3EsppKm/DbXHDsnq3fSTx8r1qUd+jq/tnK7L7uCOSH9Bk7Brs+fpExm3p8yYLp21NjeUD5Iy1eB5R/IvJ7ceRPJKaJj4sOnJstE8UXXnkvEv0dwhprL9oiPGwf3IssbVvBuqnQ2Me3FT3bih5N1npAWRuvqSzx+Z6p228Wk03UXK3P+UkO40CdXRgP2wFzm4LavnS1jYm/QR+UibbrLrHdpoKH30X/GtAKognvV66OnJP2cc6N0f1IswV++zmqTuueMj5ed1qu2Voiq6vg4vdiiV6e869drcX22Hbtke61OLp3MtKHtsYznejvmfq8856nyWotkVUqsgz1KxS9JdGE9xtzLrZT522NdKO/htLLugrFxr448i3hu0ifjmCbwavYpvTY5jvCF+ksrdqG9wHGXwCt5cH/PeGPcd/nw18Sft6rMsKCODOSdxgIZ0b6cgUf6i+I/wfCGeNbks+eoqun2Ihzqkj3BjP7FWC/pqJTsDUU2+K3OfblH12t5VQZ9GsqbctyqozsU0Sxz2Ag5wo8h0jRzhw50a4CDfFzadI7jsna7neQy3yMB/1IsPEa/cnVMb/r26L5fX4uulefuw7RzjJ3MqYYc/ezqy9y7jS8krfh3Vhehce2fzD/YZ/cSxamPg+ovyD+X9073i3jGA//J87J/ngwGY4n49H45cvdkzHb0JYG2Cm0/vH+8OBkZ/dk/5PRcDzc+0/9eP/XM3V/Op84O9+HZE/Efagg28gYeL/GXJNzwj9cre1DOfRrKm28D2nrQbNdg2wXK7cQTG3Fdq0ltsNvzPKMtpO2P0042zUUPOtKv8xTix5uYz0oS+7nY/5uw5bIZ9ER/z4Px2Ln+S9ox3UjsZH7+s4f/4DMv92zlqPiP3H3jH+tsn8aszzfk/ZS4ee5Q2za+W+ZrMYS3R2Fv1yiG3F1PLpzaEOsbeJvKZgKZWzs6ywX++E4cJ88qk5rzbekL/rWvwxAfaPNPwAA", - "debug_symbols": "tdrbiupAEAXQf8lzHrqquvoyv3I4DF7iIIiKlwMH8d8nEaNiEmFH62WYSNZWsrsTbfpUzKvp8ed7uV5s9sXXn1Ox2swmh+VmXR+dzmUx3S1Xq+XP9+PLhWv+kMsXsN9O1s3x/jDZHYovVlcW1Xre/Ed1wGK5qoov5fPfsiByOCGcME4EJx4nipOAk4iThBO8fcbbZ7x9xttnvH3G22e8fcbbZ7x9xttnvH3B2xe8fcHbF7x9wdsXvH3pbz/mKxEnj6TsnBqlTY+qnfRomp5M07NlundvpicK11OTxE46mabzu+me2vTuiPRimu4/d2V60tU0PZimR9P0ZDois2W6ms5VJcvxrqZzVcVyzKjpXFXTuaqmc1V756qEeCXedR44mnCSYRIcTggnjBPBiceJ4iTgpLd9z9oSlQ5JOMkwiQ4nve0ryZUodwnjRHDicaI4CTiJOEk4yTBJDid4+wlvP+HtJ7z91N++pJZo6pCAk4iThJMMk+xwQjhhnAhOPE7w9nN/+5GvJFDukIiThJOMEnYOJ4QTxongxONEcQK3zwPLod7d1nc8PdyWLmZgPfS1oRGGRxgZYfwIoyNMGGH6f0F7Lzej8dmkESbjZmBl9LWhEYZHGBlh/AgzMA5CvpnsH0wJnHvJD8b50TZ/YF0PyK8fUO1qQf3goed8fT8/t7+K64dBeM6Pxp8/vX39nbt//s79Y2AV62P5A+tYn8un9/Mp3vvV53w2zhfjfP/Z6x9ej+X6i0w7lpme74VqPBc1GOdHw/xzffBvsltOpqvqukdhcVzPHrYsHP5vq6fdC9vdZlbNj7uq2cdw38LQjKnsS3K++WrdzEB2uWS6HDYThknrw1i/af3Gvw==", + "bytecode": "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", + "debug_symbols": "tZrbbqJQGEbfhWsv9n/ah77KZNLYljYmRhtrJ5kY333QkWgAbb6t/01TGtZCWGwqbHbNW/vy/fG8WL2vv5qnX7tmuX6dbxfrVbe028+al81iuVx8PF/+uQmHHxTKEfj6nK8Oy1/b+WbbPLGFWdOu3g6/USd4Xyzb5sl4/3vWEAUcIRxhHBEcURwxHIk4knAk4when/H6jNdnvD7j9Rmvz3h9xuszXp/x+ozXF7y+4PUFry94fcHrC15f8PqC1xe8vuD1Fa+veH3F6yteX/H6itdXvL7i9RWvr3h9w+sbXt/w+obXN7y+4fUNr294fcPrG14/TtdP5YRIkEtkNlo1SW9PZiM7udrZ1S6udr3XnrS3lzyym6s9utqTqz272ounPQVXO7na7x2rmeJp1SxpZBdX+71jNSv19vEVOJmrPT7uyEzYk6s9u9qLpz0HzzMyk6vddaxm8Tzfs+tYzeZ6zriO1ew6VrPrWM2TY1ViOiEaRl+wSsARwhHGEcERxRHDkYgjCUcyjkzWV7YeMRkgHAKOEI4wjkzWN5ITYjxGFEcMRyKOJBzJOFJgZHoq4zZCOMI4gtcnvD7h9QmvPz2VYZJ7xPLtKz5r7P87sBY9r/xfn331xVU/PZ3yOD356tlXL7569dUbpD8iEUcSjmQcKTAiAUcIRxhHBEcUR/D601NFlviERCr3nI/T00qP02dffXHVT09tPU5Pvnr21YuvXiH9ETEciTByZZrk5s5cmSe5zVAFM5m8u9Hqn0p0N1A0ZKSC0QrGKphYwaQKJlcwBWdSxXFLV/an9E88uhvJOGQqPtuVZ44hnLdDMmSoguEKZvqpX6B0PgY2ZLSCsQom/rw/l33GF0LqbtL7Lt2N0dBf0T/nCqaAzL5b+DPfLOYvy/b0TuH79+r14hXD7d/PdvC24edm/dq+fW/aw3uH51cOD32Lziho91GON+Dd1W3Gdlw8nGRs1i2mbqPdhv8B", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 33b05de3c2b..6df919074ca 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/struct_inputs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -144,8 +144,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "zZvdauMwEIXfxde50Mxo9NNXWZaStm4JhKSk6cJS+u4rZ+M2xMZwcMbVTalLvi+HHo0cx/ijeWof3l/uN7vn/Vtz9+uj2e4f18fNfleOPj5XzcNhs91uXu4v/9y47ge5eALeXte77vjtuD4cmztWt2ra3VP3GxXB82bbNnfKn79XBUk4kmGEHI4QjjCOCI54HFEcCTiCt094+4S3z3j7jLfPePuMt894+4y3z3j7jLfPePuMty94+4K3L3j7grcv4+3HfEbEySWyGrw0Sm+PqgO7mtqDqT2a2tNMe6JwfmmSOLBnS7t3pnaaa/fU24fr3bOpXW73nxmxe1O7mtqDqT2arkjTWfWms6rOcr2r6awqW64ZNZ1VNZ1VNZ1VHZ1VCfGMeDc4nWnEkYQjGUaCwxHCEcYRwRGPI4ojo+171h5RGSARRxKOZBiJo+0ryRlRHiKEI4wjgiMeRxRHAo5EHEk4kmEk4e0nvP2Et5/w9tN4+5J6RNP0js/efV0Gerrw/9errT7Y6qOtPtnqs6k+O1s92ep5tt7Ll17jtV5s9d5Wr7b6YKuPtvpkq8+WenbzpzbkL332F3rktacoVE8UrieK1BMlLRiljG1/yV5GjK6iEC0aJfdXsWVlhOso2Fo5IYIjHkfGd+3IZyRQnnHG5PH7bLfTR1t9stVnU/34fcHb6clWz7Z6ma2fOmOO38e8nV5t9cFWH231yVafTfXibPXzp/ZWnxSE64ki9UQJC0aZ/vwkedEoU5+fPDYVJ4RwhHFEq6nLL7lyyjXhd12Ds6uP9URJ9UTJi0ah+D1PehVFXT1RqJ4o/GNrJUwPPjvfD3656LmOLdXs0+rriaL1RKnnOxHNC0aZ3g6DqycK1RNl0W8VJ7fDIPVE8fVE0R9bK3NOEiEsugdNbYch1hMl1RHlsxz8WR8264dte34Q5fl993jxXMrx72t79YjK62H/2D69H9ruYZXv51S6qc1+Rc7/7h4nKUdczggcQ3dIp8NYDnN50/LG/wA=", + "bytecode": "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", + "debug_symbols": "zZvdauMwEIXfxde5kOZHGvVVlqWkrVsCISlpurCUvvvaISYlNoZDVs7clKr4mxzyaWTXQl/NS/v0+fa42b3uP5qHX1/Ndv+8Pm72u2709b1qng6b7Xbz9vjzz03of8SQT8DH+3rXjz+O68OxeSANq6bdvfS/xa7A62bbNg9K379XHWI4UmAkBhyJOEI4wjgiOKI4knAEtx9x+xG3T7h9wu0Tbp9w+4TbJ9w+4fYJt0+4fcLtM26fcfuM22fcPuP2GbfPuH3G7TNun3H7gtsX3L7g9gW3L7h9we0Lbl9w+4LbF9y+4vYVt6+4fcXtK25fcfuK21fcvk7bz+WMcOCfyGp0aeahelYdVS81q6dQtXqsWp1urZ5lqF5sVJ2rVpeq1bVq9VS1eq5a3apWLzWr51t71WI6X2qcR9Vj1epUtfqtvWoSh+rj9T1L1er6/76ZieqpavVctbpVrV5qzkir2qtWtVeNas53q9qrJjXnjFXtVavaq1a1V22yVznlMyJh9PhmBUZKwJGII4QjjCOCI4ojCUcyjkzaF9IBUR4hBUUoBByJODJpXyOfEaUxwjgiOKI4knAk44jhSIGR6V2PeSTiCG4/4vYjbj/i9qd3PZRtQNTmV3ySNNwdSIpcLoauPUXJfqKYnyjFTZTpXaVKUbpbzPAI19064nWU6CcK+YnCfqKInyjqJ0ryEyW7icJ+OoiXnStl+G+pe6JM11GwuXJCMo4YjhQYkYAjEUcIRxhHBEcUR3D703uSmumMpFiWelKY3uu8T5TiJsr03mylKPPr3PSe732ikJ8o7CeK+ImifqIkP1GymyjJz7qSlu2gueenhHXQCVEcSThS3OjKS86c7t3sRVfk6yjRTxTyE4UXjRLzpZ/0Oor4iaJ+oqS7zZU03/jd9sHQ+N2r1evY2c06nc1PlOImivl5J2JLvlWcXw5N/ERRP1EW3cOZXQ4t+4lifqKUu82VW24SZdn9nrnlsEQ/UchHlO9u8Gd92Kyftu35oOLr5+75x7nF49/39uoI4/th/9y+fB7a/jDj5Rxjv8IXWcUgv/vjht2Iiq44hH7Yf/UcYjfk7kO7D/4H", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index d6facf8ae96..233a4a9a39f 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81azY4jNRB2ku4kndkhYYe/5W+PXDt/k+wBKRL7wwtwgVMm2SDeAIlLCy7wCByQeAAkxAWJF+CAuHBDAgmJJ8HOuqa//rq6M6uxxVoquW2XvyqX7XLZScc8S/ctdfx34nMpY5K6jc/z26VpQKy8Azreh++upZ4fV2qpb2lgaWgpszSydGbpjqVzSy9ZGluaWHrZ0l1LF5ZesfSqpdcsvW7pDUv3LL1p6S1Lb1t6x9K7IF814gujHOj3r88zn3eh3em38eX8dmmakdyQ+Ov8cp2Zagqs/zyDeYtlH8GMgJ8PPM6HRYnPY3Hp3Jdx/UoftzYvTPl9D/ojnvF4jCPtMce6zhcPBD+JgG+n6nAuYyzqtpS2pKjKxrYU2hKw5+dknxhrDe0TZ61NDxemeX3JPv2giCE7zwX/IeAbE96PPYqj/zX+4yj406eC/yQO/sGdWW4tfwXzHW8v5kvxV6mpJ2nrg2w8fzj1qMz78xvAZT6WiXtL5I+NbguXMhpH6H3RIV0SU/roVBlv19Rt14dxplT3HtjpO+iDmAZkYp34iYmp2y4h+ySEvQlkH14rIgNlD6A+3NzMcm1N9qgO5Y9MfW5C+qAOyRN92D58ng+j6DM9dAgf9Rkq9pG5zJQ2wRr5cgpYyD+EMSI/fkt/rFv7fKJg8trNlPFgndjX2XxGY8P902nIBZfreL+hXn2SgzGdnNmO531THYv4ELQn9pXzJiX+z0yJufHfY1OPH5IGeeaEPMFCO0hfzeeG8ynzneZzOy36dE3z2YH69U+M/TGNPVXwMqOfjZsgY5/VfAiOXdOnq7QNWsbOvsYYfW4jxbj7Nh+pxb3jlvFp8X64uSj9Z+/EXIj8bss4UL+eMhd9BS8l/o987ng/abGBMeHjH7QB6+nSw0LX+WPSM1acdhdwDclCe7X5yBct5uY5xXQq5v4ecJmPZbb5TcFMFd4OtQnvpz7/P+ec32PQnu6upfkVPis1H4V2Z7+jxVkDRb7Ixrkegt7H/kV9TBLjJNAWMp52OvwKerAN0uLm49Xso8VtQ8U+WgzI5+2pOOZRUcXCueV4F/VEn4GxmkuDoirzmEOd2EfmcIj81JZBW1JU5Yx8We6ajCV6pMT/pS+Pfd6HPtJ/osjvk/yK3kod+6VM4c8UfmfTL/y324Mx1/NqXf7AIbZPTd1vovyU+L/2ZbzDSJ7cQs/Dajs9zLeH7XK73y92W/ZjaLOmd6Eo7+nTZ++AvF+MCeez+cxBGXHPi5u/F1zvKxMzFi7fCzRfpp0z2t0j5HuB+31M/KV2bvLcoB6yXsZKf36ri/Rb0HWsKrrgWx2fRWJXXuv4PsBxzbc+197qeE1xXdtbnfCdt9jO+YHQfmi7mq93s8VudbWcb+eXz+WH2vbxTfYZYrPPMSbcHmt7Gw35JsS+K+AYci2GSWPLnZa+uukt6wfQB/3BTd+yhP8nU2L+6L81PyLjx/hd80Ecv+P84+9DTfF737S/D6XE/7PPXfnvBky0CcbITxowfwHMfwhTi6O1NSn1I4Vfe+Mdkw7YV7vPYPyv9WXfgP+VaMNiG/E8C05bbM/9uop+KeH0GuRh2Zj2+4Z2p5C+uGe0GB3vfC5JnI/3AOTHdyLk/w3k/W5KvY68RV2e4/urhe95fWJSVOu0+wHem4RfZI+Kuo7SdgZtKcm548toL8QSPVLi/9OXZU7wriP9J4r8Icmv6K3U8b3pTOE/U/jd/PwheD7HsYeOSY8yCR/rWDdZOzFilNl6fflgdpUvVvvdYb+Yn4pRQsvfLS+vdovlNn86PapzSv5/a0QeRyEoAAA=", - "debug_symbols": "tdnbquIwFAbgd+m1F8laOa39KsOwcWvdCKLiYWAQ331S0SpNOs6/mN6I0X6sJn/TNuTSLNuv8/fnervaHZuPH5dms1vMT+vdNrcu11nzdVhvNuvvz9efG9N9ULgdf9zPt13zeJofTs2HJZ417XaZv3HIfrXetM2HN9efs4YiLBIsBBVsYGFhQbBgWDhYeFjAmTOcOcOZM5y5gzN39cyDfYhAQ0GwYFg4WHhYBFhEWCRYCCq8gQWcuYcz93DmHs7cw5l7OHMPZ+7hzEM9j+QfIsWhqI+VpLsgM5znoTpWxL1wRY0Ai/hGeB6KBAtBRazOD/K9CMN+RAsLeiNicVYMCweLkcxjL9xQ1DOPfY3iSowRFgkW8kbIsOfJwMLCgt6MrgxHN1XzYEt3wXbY8xRgEWGRYCGoEAuL6uhyP7oczVAwLBwsPCwCLCIsEizknfADYY3BicUJ4cSjT09r6rc5I4+pS1SQiJOEE0Gf69YanFicEE4YJw4nHicBJxEm9eVeEPN4DwzyctOz6TorDk7k3P3gRC9vjfngWwWZukJ9OflfK9jJK9DkFXjyCm7yCn7yCmHyChGscENJg0SBvNEgq0GkQaxBToFGlruGpF8i5+9FvIF0jHXM6Vj9cWTYSs+YTMGCjkUdSyoWRwJgx0/mXMFGhsTZ1DNHvmBRV22sbzE8WSqriYrV15nvmdUx0jHWMadjYzMgmhcWChZ0LOpY+gcmZd9ExWTsKgnP+eZMMd9k7Crxf2ekY6yapuJ0THFTuObWr/lhPf/atPddvNV5u3jZ1Dv93reD/b39Ybdol+dD2+30PTf5ukS613eykk+n67olM7Nsbquwrsk2N8Pt5T83Kf+b12v5HPJ5/AE=", + "bytecode": "H4sIAAAAAAAA/81Zy64jNRB1ku4kncwlYS6v4TV7Vt15z+5KzIMNG9ixy00miD9AYtOCDXwAEh+AhNgg8QMsEBt2SCAh8TXYGdf0yenqzp0ZWxpLJbftcr1cVa44HfOk3bXQ8d+J72WMTeaufJ+/WCsC0so7IONd+O5a6Hm9Ugt9CwMLQwuZhZGFsYVbFi4svGJhYmFq4VULty1cWnjNwusW3rDwpoW3LNyx8LaFdyy8a+E9C+8Df9WIL41wIN9/vs9834V1J9+VH+cv1oqM+Iakv8lXm8yctsDyzzM4t1j2EZoR6OcDT+ejsqLPurh24cfov7LH+ealqb7vwH6kZzw9piPrMXXd5It7Qj+JQN8e1eFCdCzrtpS1pDzljWsprCVgzy/JPjF8De0Tx9eKw6Vp9i+J0w/LGLzzXOjfB/rGhM9jD+LI/5T+wyj0i8dC/1Ec+gd3Zzlf/gbOO14s5kvJV6mpN1nrA2+8f7j1aMzx+R3QZTzmibHVb7FFJ5wtcs0WHeKNtgh3DrNcs2uP5pD/iGQNHUcd4ifysH34ThpEkac4dIg+yjNQ7CNnOVTWhJbEcgq0EH8AOiI+fst+nMt9P1Vosu8OTV0fnBP7Otk/IN0SwOs09EKX57okI8qVEh+sS+TecfIszakusg/tiXslZ6aE/4WpaG7898TU78CkgZ85w09o9RQdM1OPo3A5Zb7jOEqAhyZP1zTnP5Svf0b3h6R7qtDTclo43WcFxyzqrsnTVdYGLbpjXLWdbaQ6bd+Wk7TabdKin1azhjuLKn/2zpyF8O+26IHy9ZSz6Cv0UsL/2PcO99MWGxgT7n7XbMByuna/1GX+hOSMdPfmt4GuIV5or7YcqeU8vqsj1ZQ5+1ViqrhgnsbocY+5ne+Lz3zvfO572MM+2lPm+N5r+o0V8XxXXFdjkzWsaTgeDOmIDeV29vkB6DIe80RfGTTQTBXcDq0J7ue+j1s76/HCdSCuiT3dby0tJ3OdoeV3zacEX6vptPOcKHYZgtzH/WW1hveaawmshfwt4mT4DeRgG6TlzfXV7JMp+EPFPlPCZ1txntDqoAflKS082wHpiHJivsU617VBecrz2MOc2EfOcIj4tJbBWlKe8hn5seRPpiVypIT/tR9PfN+HPbJ/qvDvE/8TuZU5zkuZgp8p+M6mX/lvF4Mx/Xm9qf7gENunpp43kX9K+N/68Yj0FX+6ek45D+ttcZhvD9vldr9f7Lacx9BmTe9CUd7TiyfvgBwvxoTL2XznII+49+/N31qexpWp33kx3lq0XKbdM3Hv0+Lg/h+TfKndm3w2KIf4i3bvii5jEz6Wtuv5Zjdb7NbXy/l2vnqmWGrzxZv4CtLmuDEmnJ9MTd0P2d4h3oQ4/gLqkLe9N0XjW1T5pukt60eQB336pm9Zgv+zqWj+5L8nph4Loj/WoFoccQ2K54//cTTVoH3T/j6UEv4vvnfjfxpook2wznvUQPNXoPkv0dRqQc0nZX6k4GN9KPJMTL2uHNE+tCnWsNpezg34f38bLbYRn7PQaatPeV9XkS8lOr0Gfjg2pr1m1upi2Ysxo9WZ+LvFNalVsZZFfHwnQvzfgd8fppLriFvW+Tm8v1vwnjUnJuXpnFbjYu0v+MJ7VNZllLUxrKXE55Yfo72QlsiREv5ffixngvW67J8q/IfE/0RuZY5r/7GCP1bw3fn8KfR8j7qHrquOPIk+zrFs4jsxapTZZrO6N7vOF+v97rBfzM/VKKH575ar691iuc0fF0dxzvH/HzzsouXlJgAA", + "debug_symbols": "tdnbquIwFAbgd+l1L7JWVk6+yjBsPNRNQVQ8DAziu08qWqVJp/OH6Y0Y6cdq8jc1Ibdq06yu31/tfns4V4sft2p3WC8v7WEfW7d7Xa1O7W7Xfn99/lyp7oPt4/rzcbnvmufL8nSpFsS6rpr9Jn7TNvptu2uqhVH3n3XFDhYeFgEVWsGCYMGw0Flh6SUsD4XAwsDCwsLBwsMioEIULAgWDAs4c4EzFzhzgTMXOHOBMxc4cwNnbvJ5ePMS3g1FfqyCfwpWw3lusmPFuheS1PCwCBPC6IGwChYEi+z8YNMLO+yH1bCQCeGSuzKwsLAYydz1QoYin7nrayRPog2ocAoWNCHCsOeOYaFhIROjG4aj67J5aOKn0JT03MMioMIrWBAsNCwEFgYWFhZwgh5O0MMJBjjBACcYsjNK90+7dmooNCwEFgYWFhYOFh4WYUqYgSClcEI4YZwYdDVDKv/XpsLrVcqcEIcTj5OArrOIFE4IJ4wTjRPBicGJxYmDSX67Z4N6rctt+Hjpkb/XycWeRZ4Xe/5YxceLHxXC3BXy28n/WoFmr8CzV9CzV5DZK5jZK9i5K4xsaxWHfiscv6dMypgpY7aM5V9ASlPomWaVMF/GQhHL766n2UgAWvSbiSRsZEiEfM+ETcJCUTU31jdn38wn1fJbyWnGZUyXMSljpozZMjY2A5z6YDZhvoyFIubVP7CQ9M1TGRt7Sux7volK5psfe0rM35mUMVM0Tb0tYwUvhXts/Vqe2uVq1zxPh7bX/frjsOjy+9gMzo2Op8O62VxPTXeC9D486vKnoGomirfTDTSxqkmrx+q+a2qKTftYVMYmxy0wk8R7iPfxBw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_0.snap index abd07ac439f..edbd6c331e9 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_0.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81ZvY7jNhCmvJJtSfZaub38/1yTPpJ/1k4RwEXeIU1SeO0TECBNkCZAGpV5gwDpkiYBAgRIEaRJd8Ddax25xzl/+jzyLbDi4QgMKJLDmW9myCElReZFeWQp8s+xr6WNRfq2vi7vV6oeZZURYHwEzwNLF96uxNLQ0sjS2FJqKbOUW5pYmlq6tDSzVFh6y9IDS1eWHlp629I7lt619J6l9y19YOlDSx9Z+tjSJ6BfdeIbAw7wPfN16usBjDt8W98u71eqlPT2KX9TXi9T0y4941+kELdQ/hGZAeSXIy/ny+Yon21xZerbuH5ljlubV+b4/BDmozzj5bEcGQ9p66ZcrkR+HEC+DVU9FRubU1/KWNy0deNYAmMx+PMX8k+ItYb+CbPWqvrKdK+v3Nv6O9kaBEtVliI/AfnG9LevphRH1CG6hyFsK+etg0/KBfWh/syE3BdlFZE+wcP+4TwwCoKnqt05WZh2HuK1hrFBHLJeZsqcmPAnQfC/uNggxhj8mSj2DBSbMBYJ9X3qa7cf/4Q5KNOATuyTGBZGX1PonwuSve3JP1PFRt57YdbW3fee6M9MyFxw3HsjwsP+4b03DoKnqiOSj3jGin8klqkyJrIy305AFvKPwUbkx2eZj30rXxeKTF67qWIP9ol/nc8/I9tw/0QdtTGn6wjlFqY7h4U9b45naah8HXZNlpXEYaD4ztVfQD/mWFxvOHcE48j/M8jc+ueZ6b4TsT7zCn0iC3OuzNXOpP5y7mLP+yAGHRqegTKG+yXsGVo95tzR5Vs+7zEHZIQ1C+Lb+cscniu+1fAMlLEc7GTbcV9p8Qj83nSIFIxaLOIzscgJ64Bs3faDteY13RUL0T84Ywfiw/c96c8UeZp9xvSXCxPC85WvXc76hjDEYTCUWi4xik7xQUL8XxNO9GOf594Dsh91ob+09crfVTAPRR21MefvAGIv7qNtP7ZWheLLnGzgHKPVd7Vh0r8NZUE4UU8wvdXptwC+X3wL/TiG9wucy/cL4f8BZH7nn7X7BccpJnmcO3FMeL83bb+FetfV9hifyRHpNt7GGfmHY+9oSnPZlpj4L317aPTYJOQv4f/R1y6//9UhE+ONuEYdMn8CmX+TzJk5lnPvI8JfKPwz4BE8M8KAczXslyBXm8t5bwb4zsnCMWkPFTnanu+aN1DwTUhO1qEP265oa0PO9rvmA/GX9k0nMqf+O/dNTfi1O5Z2zzh3x9K+c+N7hitx08a89f3lvcq8dD78B3CwD5Lm7vZq/pko/Lnin4L42VfoE5SF+sYkC2ObkY3aOwm/m7oyato6b2voE/9IDMfIT2MpjMVNW0/m2/LtkWUJjoT4f/Nt2Z9DmCPzC0X/kPS3cCt9fD9OFf5U4Xc+/dU/u7iHXM/rzfEntfg+Me3vQYb0J8T/h2/jHpY6vgfOer2r6sWu3q12h8Nyv+NzGH2WB9C/Wy82+/lyv75ZLXaL69euf77ZXH8+vymX68O+PiwXr1v/fnV9s1+uduXj6hbOq/Rr+wnzsyuyJ3HPIj++TyH/v8Jr6T//zP8sUZ/je3qGL+qob2UofXHT7tP2MuY44RfdWXOKUcZyGMOzw5WJb6O/UJbgSIj/iW9LTDAvyfxC0T8m/S3cSh/nuFzhzxV+F5//RZ6v0fa+/z/c6iT52MfYZO24df0cbtBSspEkAAA=", - "debug_symbols": "zZnbiuowFIbfpde9yForR19lsxk81KEgKh4GBvHdJ5VapanKjwZ6I0bz8a30T9uQnIpFNTt+f9Xr5WZfTP6ditVmPj3Um3Vsnc5lMdvVq1X9/XX/c6GaD6ZL//12um6a+8N0dygmxFIW1XoRv4mN/LJeVcXEqHOZdLVBUdvXBnJdZ/IDnT1r3Xb2bPm+8/+yYB5RLTKiWvSIajEjqsWOqBY3olr8iGoJ46lFFFRLQxBMMEwITGiYMDBhYcLBxPA8tde86S7BlggooRVMEEwwTAhMaJgwMGFhwsEEnLmGMzdw5gbO3MCZGzhzA2du4Mzt8Mi9uRLe9YnhqoJvCVb9+9wOVsXSETpxWJhwLwgjfcLDREAJNzgT2XSE7Y/DEUwwTMgLwiXj0DBhYOJB5q4jdJ8Yztx1jmTuOg8TASW8ekGE/sg9wQTDhLy4uqF/df3g1RXilhBKRu5hIqBEUDBBMCEwMXh/SHd1xannq1xSHLqHdPzeX7oGk1tgcwtcboF/WyAUOoGw6gtCZgEpld1A2Q3vz1TRcjNonRjeD1qT7wyaTWJ4mbTpPQCIFI4QjjCOCI5kj5Def9qIszeDTyIkl93gsxtCbgOr7AbKbuDsBvmAQd0ZbGLQ2Q0mu8F+1hDSHFx2wwfuaXt7PWqVvB75A/e0eWoQld1AuV/AwtkNkt1g0Z0VGt5CZXVNg5kTxONIgJEHu6hP9nzowTbqU4RxRHBE44jBEYsjDkc8hpxj62e6q6ezVdUeDS+P6/ndSfHhd1v1Do23u828Whx3VXN8fDs5bqYEOVdGWyylyYEMlXGv8bKCbpqWY9NdVjKXvvFfJ7GGWMcf", + "bytecode": "H4sIAAAAAAAA/81ZO48jRRDusWdsz4y9NrfH+3EhEVKPH2uTOSAngYzEa58lJBJEgkTikH+ARAYJSEhIBIiEDAn+Ft1LF/vN55rZkzy9upZKPd1dXfXVo192Yv4rzxwl4TsNtbSxSN821PayUnUoyyaA8Rl89xz1g12Zo4GjoaORo9xR4ah0NHY0cXTlaOpo5ugVR08cXTt66uhVR685et3RG47edPSWo7cdvePoXUfvgX7ViS8NOMD3T6jzUPdg3OPbhra9rFQ56e1S/sbeLHNTLx3jX+QQt1j+EZkR5NthkPPR6V4+2+LLJLQxf2WOz81rc//9FOajPBPksRwZj2nrxi5XIj+NIN+F6jgRG0/nvpSx9FTXjWMZjKXgz+/IPzFyDf0TJ9eq47Vpzq8y2Poj2RoFS2WtyM9AvjHdrasJxRF1iO5BDNvsvHbwSelTH+ovTMx1YauE9Ake9g/vA8MoeKqjPydnpr4Pca5hbBBHRhhxTmK6z58M/POy508WBU97/qB/Hit/EpKPeIaKfySWI2VMZMk9JQNZyD8EG5Efv2U+9n0Q6pkik3N3ZM7twT7xr8f+PtnWB76koTbmPI9Q7kzBxestUo7ZuGuqOsbNSVtJHHqK77xNK+jHuGK+4dwBjCP/tyBzE76npvlcb8stTZ/IwrNI5ubmPIe723MXe16LKejQ8PSUMVyLGt4Oc+q5YCse8O2IfIt7R0FYiyi+nf+/h5eKbzU82j5Xgp1sO/pYi0fku/8hUTBqsUhbYlES1h7Zuu0G65FzuikWor/XYgfiwzeL9BeKPM0+Y7rbCzPC83Go/R7zKWFI42Cw2l5iFJ3iAz63PyGc6Mcuz70nZD/qQn9p+dqnMcTI666MhF/8PAY/9xWdvK+MYUy+DcRB+j4Ltc/pn2FO076LfXyv0fa5iTIvaahFD/fxukJ7tqG2l5VqZs5jPCYbxh3aMOneBjsz57GfxNZbnf8WwHezz6Efx/BuhnP5bib8X4HML8K3djfjOKUkj88dHBPeL03db7Hu5dr+lJFtCen2pYTxTLGdz2uZy/e1lPivQntg9NiMyF/C/3Wo/fgvDTIx3ohr0CDzG5D5K8mcmvsiMvFuyjGeKfxT4BE8U8KAczXsVyBXm8v73hTwtcnCMWlnihxtzTfN6yn4JiSnaNCHbV+03JC334vuB+Kvtjd70aJTbEJ+7X6q3dHa7qfa79z4RvMlPdUxb0O/vajMrdfzG+BgH2SnF7dX889Y4S8V/2h5lZOsh968Q5KFseX7gfae43e9L8NTXeddDX3iH4nhCPlpLIex9FTXU4S23LdYluDIiP+H0Jb1OYA5Mn+m6B+Q/hpupY/fFrnCnyv83qffh28f95j5vN7c/0ktvs9M/bc0Q/oz4v8ptHENS51egPO43lXHxe64W+0Oh+V+x+cw+qyMoH+3Xmz28+V+fbta7BY3j65/vtncfDi/tcv1YX88LBePrX+/urndL1c7+7y6g/OQfm094f7si6xJXLPIj29R5P9deB39Eb75P0vU5/n+buFLGuo7GUpfeqr3aWsZ9zjhF93F6RyjjJUwhmeHL+PQRn+hLMGREf9foS0xwX1J5s8U/SPSX8Ot9PEeVyr8pcLv4/OnyAs12t71fzd3Okk+9jE2yR2f1/8CLzVTLpEkAAA=", + "debug_symbols": "zZnZquowFIbfpde9yBoy7Vc5HDYOdVMQFYcDB/Hddypapa3KjwZ6I43m81vpnw4kx2JeTQ8/3/Vqsd4VX3+OxXI9m+zr9Sq1jqeymG7r5bL++b7/ujDNB9O5/24zWTXN3X6y3RdfxFIW1WqejsQlflEvq+LLmlPZ6+qioUtfF8m3nSkMdA6seukc2PF9579lwTyiWmREteiIarEjqsWNqBY/olrCiGqJ46lFzGAt7vr/dEekWhqCYIJhQmBCYcLChIMJDxMBJiJKKJy5wpkrnLnCmSucucKZK5y5wpnb4ZEHeyWC7xLDVcVwIdi4LjFYFUtLaM8RYCK+IKx0CGdggmBicCaybQnXHYcTmFCYsC8I3xuHgwkPEw8y9y2hXWI4c986enPXG5ggmOAXROyO3AtMKEzYF2c3ds+uHzy7QnwhhLojDwYmCCYYJgQmLEw4mPAwEWACTjDCCUY4wQgnGOEE4+D1Ie1sF2+ev+WS4dg+NNNx99U12twCl1vgcwvC2wKh2AqETVcQMwvImOwGym54f6aKys2g2jO8H7RSaA3Ktmd4mbTt3ACIDI4QjjCOCI5kj5Dev9uIdzdD6EVIPrshZDfE3AY22Q2U3cDZDfIBg7kzuJ5BsxtsdoP7rCH2c/DZDR+4pt3t8aim93jkD1zT9qlBTHYD5X4AC2c3SHaDQ1e6aHgJlc01DWbuIQFHIow8WEV9sgZHD5ZRnyKMI4IjiiMWRxyOeBwJGHJKrX+TbT2ZLqvL1vDisJrd7RTv/2+qzqbxZrueVfPDtmq2j287x82UIO/LZEulNDmQpTKt/Z7foJum49T05zeZc9/0q5dUQ6rjFw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index abd07ac439f..edbd6c331e9 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/to_be_bytes/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -46,8 +46,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81ZvY7jNhCmvJJtSfZaub38/1yTPpJ/1k4RwEXeIU1SeO0TECBNkCZAGpV5gwDpkiYBAgRIEaRJd8Ddax25xzl/+jzyLbDi4QgMKJLDmW9myCElReZFeWQp8s+xr6WNRfq2vi7vV6oeZZURYHwEzwNLF96uxNLQ0sjS2FJqKbOUW5pYmlq6tDSzVFh6y9IDS1eWHlp629I7lt619J6l9y19YOlDSx9Z+tjSJ6BfdeIbAw7wPfN16usBjDt8W98u71eqlPT2KX9TXi9T0y4941+kELdQ/hGZAeSXIy/ny+Yon21xZerbuH5ljlubV+b4/BDmozzj5bEcGQ9p66ZcrkR+HEC+DVU9FRubU1/KWNy0deNYAmMx+PMX8k+ItYb+CbPWqvrKdK+v3Nv6O9kaBEtVliI/AfnG9LevphRH1CG6hyFsK+etg0/KBfWh/syE3BdlFZE+wcP+4TwwCoKnqt05WZh2HuK1hrFBHLJeZsqcmPAnQfC/uNggxhj8mSj2DBSbMBYJ9X3qa7cf/4Q5KNOATuyTGBZGX1PonwuSve3JP1PFRt57YdbW3fee6M9MyFxw3HsjwsP+4b03DoKnqiOSj3jGin8klqkyJrIy305AFvKPwUbkx2eZj30rXxeKTF67qWIP9ol/nc8/I9tw/0QdtTGn6wjlFqY7h4U9b45naah8HXZNlpXEYaD4ztVfQD/mWFxvOHcE48j/M8jc+ueZ6b4TsT7zCn0iC3OuzNXOpP5y7mLP+yAGHRqegTKG+yXsGVo95tzR5Vs+7zEHZIQ1C+Lb+cscniu+1fAMlLEc7GTbcV9p8Qj83nSIFIxaLOIzscgJ64Bs3faDteY13RUL0T84Ywfiw/c96c8UeZp9xvSXCxPC85WvXc76hjDEYTCUWi4xik7xQUL8XxNO9GOf594Dsh91ob+09crfVTAPRR21MefvAGIv7qNtP7ZWheLLnGzgHKPVd7Vh0r8NZUE4UU8wvdXptwC+X3wL/TiG9wucy/cL4f8BZH7nn7X7BccpJnmcO3FMeL83bb+FetfV9hifyRHpNt7GGfmHY+9oSnPZlpj4L317aPTYJOQv4f/R1y6//9UhE+ONuEYdMn8CmX+TzJk5lnPvI8JfKPwz4BE8M8KAczXslyBXm8t5bwb4zsnCMWkPFTnanu+aN1DwTUhO1qEP265oa0PO9rvmA/GX9k0nMqf+O/dNTfi1O5Z2zzh3x9K+c+N7hitx08a89f3lvcq8dD78B3CwD5Lm7vZq/pko/Lnin4L42VfoE5SF+sYkC2ObkY3aOwm/m7oyato6b2voE/9IDMfIT2MpjMVNW0/m2/LtkWUJjoT4f/Nt2Z9DmCPzC0X/kPS3cCt9fD9OFf5U4Xc+/dU/u7iHXM/rzfEntfg+Me3vQYb0J8T/h2/jHpY6vgfOer2r6sWu3q12h8Nyv+NzGH2WB9C/Wy82+/lyv75ZLXaL69euf77ZXH8+vymX68O+PiwXr1v/fnV9s1+uduXj6hbOq/Rr+wnzsyuyJ3HPIj++TyH/v8Jr6T//zP8sUZ/je3qGL+qob2UofXHT7tP2MuY44RfdWXOKUcZyGMOzw5WJb6O/UJbgSIj/iW9LTDAvyfxC0T8m/S3cSh/nuFzhzxV+F5//RZ6v0fa+/z/c6iT52MfYZO24df0cbtBSspEkAAA=", - "debug_symbols": "zZnbiuowFIbfpde9yForR19lsxk81KEgKh4GBvHdJ5VapanKjwZ6I0bz8a30T9uQnIpFNTt+f9Xr5WZfTP6ditVmPj3Um3Vsnc5lMdvVq1X9/XX/c6GaD6ZL//12um6a+8N0dygmxFIW1XoRv4mN/LJeVcXEqHOZdLVBUdvXBnJdZ/IDnT1r3Xb2bPm+8/+yYB5RLTKiWvSIajEjqsWOqBY3olr8iGoJ46lFFFRLQxBMMEwITGiYMDBhYcLBxPA8tde86S7BlggooRVMEEwwTAhMaJgwMGFhwsEEnLmGMzdw5gbO3MCZGzhzA2du4Mzt8Mi9uRLe9YnhqoJvCVb9+9wOVsXSETpxWJhwLwgjfcLDREAJNzgT2XSE7Y/DEUwwTMgLwiXj0DBhYOJB5q4jdJ8Yztx1jmTuOg8TASW8ekGE/sg9wQTDhLy4uqF/df3g1RXilhBKRu5hIqBEUDBBMCEwMXh/SHd1xannq1xSHLqHdPzeX7oGk1tgcwtcboF/WyAUOoGw6gtCZgEpld1A2Q3vz1TRcjNonRjeD1qT7wyaTWJ4mbTpPQCIFI4QjjCOCI5kj5Def9qIszeDTyIkl93gsxtCbgOr7AbKbuDsBvmAQd0ZbGLQ2Q0mu8F+1hDSHFx2wwfuaXt7PWqVvB75A/e0eWoQld1AuV/AwtkNkt1g0Z0VGt5CZXVNg5kTxONIgJEHu6hP9nzowTbqU4RxRHBE44jBEYsjDkc8hpxj62e6q6ezVdUeDS+P6/ndSfHhd1v1Do23u828Whx3VXN8fDs5bqYEOVdGWyylyYEMlXGv8bKCbpqWY9NdVjKXvvFfJ7GGWMcf", + "bytecode": "H4sIAAAAAAAA/81ZO48jRRDusWdsz4y9NrfH+3EhEVKPH2uTOSAngYzEa58lJBJEgkTikH+ARAYJSEhIBIiEDAn+Ft1LF/vN55rZkzy9upZKPd1dXfXVo192Yv4rzxwl4TsNtbSxSN821PayUnUoyyaA8Rl89xz1g12Zo4GjoaORo9xR4ah0NHY0cXTlaOpo5ugVR08cXTt66uhVR685et3RG47edPSWo7cdvePoXUfvgX7ViS8NOMD3T6jzUPdg3OPbhra9rFQ56e1S/sbeLHNTLx3jX+QQt1j+EZkR5NthkPPR6V4+2+LLJLQxf2WOz81rc//9FOajPBPksRwZj2nrxi5XIj+NIN+F6jgRG0/nvpSx9FTXjWMZjKXgz+/IPzFyDf0TJ9eq47Vpzq8y2Poj2RoFS2WtyM9AvjHdrasJxRF1iO5BDNvsvHbwSelTH+ovTMx1YauE9Ake9g/vA8MoeKqjPydnpr4Pca5hbBBHRhhxTmK6z58M/POy508WBU97/qB/Hit/EpKPeIaKfySWI2VMZMk9JQNZyD8EG5Efv2U+9n0Q6pkik3N3ZM7twT7xr8f+PtnWB76koTbmPI9Q7kzBxestUo7ZuGuqOsbNSVtJHHqK77xNK+jHuGK+4dwBjCP/tyBzE76npvlcb8stTZ/IwrNI5ubmPIe723MXe16LKejQ8PSUMVyLGt4Oc+q5YCse8O2IfIt7R0FYiyi+nf+/h5eKbzU82j5Xgp1sO/pYi0fku/8hUTBqsUhbYlES1h7Zuu0G65FzuikWor/XYgfiwzeL9BeKPM0+Y7rbCzPC83Go/R7zKWFI42Cw2l5iFJ3iAz63PyGc6Mcuz70nZD/qQn9p+dqnMcTI666MhF/8PAY/9xWdvK+MYUy+DcRB+j4Ltc/pn2FO076LfXyv0fa5iTIvaahFD/fxukJ7tqG2l5VqZs5jPCYbxh3aMOneBjsz57GfxNZbnf8WwHezz6Efx/BuhnP5bib8X4HML8K3djfjOKUkj88dHBPeL03db7Hu5dr+lJFtCen2pYTxTLGdz2uZy/e1lPivQntg9NiMyF/C/3Wo/fgvDTIx3ohr0CDzG5D5K8mcmvsiMvFuyjGeKfxT4BE8U8KAczXsVyBXm8v73hTwtcnCMWlnihxtzTfN6yn4JiSnaNCHbV+03JC334vuB+Kvtjd70aJTbEJ+7X6q3dHa7qfa79z4RvMlPdUxb0O/vajMrdfzG+BgH2SnF7dX889Y4S8V/2h5lZOsh968Q5KFseX7gfae43e9L8NTXeddDX3iH4nhCPlpLIex9FTXU4S23LdYluDIiP+H0Jb1OYA5Mn+m6B+Q/hpupY/fFrnCnyv83qffh28f95j5vN7c/0ktvs9M/bc0Q/oz4v8ptHENS51egPO43lXHxe64W+0Oh+V+x+cw+qyMoH+3Xmz28+V+fbta7BY3j65/vtncfDi/tcv1YX88LBePrX+/urndL1c7+7y6g/OQfm094f7si6xJXLPIj29R5P9deB39Eb75P0vU5/n+buFLGuo7GUpfeqr3aWsZ9zjhF93F6RyjjJUwhmeHL+PQRn+hLMGREf9foS0xwX1J5s8U/SPSX8Ot9PEeVyr8pcLv4/OnyAs12t71fzd3Okk+9jE2yR2f1/8CLzVTLpEkAAA=", + "debug_symbols": "zZnZquowFIbfpde9yBoy7Vc5HDYOdVMQFYcDB/Hddypapa3KjwZ6I43m81vpnw4kx2JeTQ8/3/Vqsd4VX3+OxXI9m+zr9Sq1jqeymG7r5bL++b7/ujDNB9O5/24zWTXN3X6y3RdfxFIW1WqejsQlflEvq+LLmlPZ6+qioUtfF8m3nSkMdA6seukc2PF9579lwTyiWmREteiIarEjqsWNqBY/olrCiGqJ46lFzGAt7vr/dEekWhqCYIJhQmBCYcLChIMJDxMBJiJKKJy5wpkrnLnCmSucucKZK5y5wpnb4ZEHeyWC7xLDVcVwIdi4LjFYFUtLaM8RYCK+IKx0CGdggmBicCaybQnXHYcTmFCYsC8I3xuHgwkPEw8y9y2hXWI4c986enPXG5ggmOAXROyO3AtMKEzYF2c3ds+uHzy7QnwhhLojDwYmCCYYJgQmLEw4mPAwEWACTjDCCUY4wQgnGOEE4+D1Ie1sF2+ev+WS4dg+NNNx99U12twCl1vgcwvC2wKh2AqETVcQMwvImOwGym54f6aKys2g2jO8H7RSaA3Ktmd4mbTt3ACIDI4QjjCOCI5kj5Dev9uIdzdD6EVIPrshZDfE3AY22Q2U3cDZDfIBg7kzuJ5BsxtsdoP7rCH2c/DZDR+4pt3t8aim93jkD1zT9qlBTHYD5X4AC2c3SHaDQ1e6aHgJlc01DWbuIQFHIow8WEV9sgZHD5ZRnyKMI4IjiiMWRxyOeBwJGHJKrX+TbT2ZLqvL1vDisJrd7RTv/2+qzqbxZrueVfPDtmq2j287x82UIO/LZEulNDmQpTKt/Z7foJum49T05zeZc9/0q5dUQ6rjFw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/to_bits/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/to_bits/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 3801f826638..9c28834d18d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/to_bits/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/to_bits/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -13,10 +13,6 @@ expression: artifact "error_kind": "string", "string": "attempt to subtract with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "14225679739041873922": { "error_kind": "string", "string": "Index out of bounds" @@ -27,8 +23,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1aS47TQBAtx7EzHSdKgCMgsbZj5yeBxGIkdkjskFg5vwUcgQW5AwuOwIJDsEBCQmLBCeAqxKgrfpTbzgzpnhEjtxS17S6/qnpdVd3uGY/K5um+S2c0Bvmle6X7Doz7h99TfR+f1xIl9NrEX8RZpgz+WbQ/VRrTc4MfM74j/uOexrncl/joC+u9OPwiuB5QGR+u/Of5c+n/gwafI+3rVvjK42TLjnS7YOyuGz+nQ40ZULXxWGjgwDPI++Ie7S74egO4Uk7q9GGM9Sthq2UuZtJfExe9M7gIgIt3gCvlpE6c+57gwlX8u+U6OeKHbuzfKarOF5Hd9cnTc+nA/oTn3lR/Cs4ewnOPyvU40HbIdwMYR/kXgPlIXyv6Owct8pY6zuHlUPiHjcf6Qjdfy3Yqhz8ArpSTOjGHWb/jHHDORQhcfAJcKSd1Bg1c+G64yBxznZ7K1yU8x7G6fPVhHOWfAOZjfR1RtQ4Q4OLGvyPs6BvklZAp2oiq601fyClhv+Tbq9EdkpmDUHDA8pe6L+LuSw1mUOOPX4P5DDC/Ckze3xJg4n5JcjowyEcgw/aMqMrjQGCxLNYP0xzIuv5c98qg3+Y+4T7gkkEX2ot8oDyvodfNIVPsYp2S82KaRxnDReN5UQ0+ybp5KtYj8OMqsc7yL3VvivUI3jH5E9RgvgJMGeum2G2qH0ODPMYw2zOiKo9DgcWyGOumOZC5u9K9Muh3Het1+Yp8XDXW+V3c3x3zf2/fp/kijlm/vy+5lWs96g+E/Gt9j3HHffcMO3fzPNml+S6f5ptNts4l90U79T3uaC8xMX2TE9nf+2Pd9IRvjr7LEk/oI6ruC1F/n6prks3vIE/oY3skPx3Bj5t9XhLfO2CMqZq7voEbaQfHy4jq1znHsRt7wpYuVddOtK1D1VjH9SAQz97qvsjHbwJPxpR8xhyMqRpTLNe0R2jrQFsH/qc6YDqjsmkj7694rUabeKwLY2xHkUPf9fVdrlXvwd+2Vp3VbrFWxdO2VjW2rN2zNNeBj7pv60BbB9o6UF7f/J4lzto9S3Ot+gz+3katsn3OM1ksZsvJKs7mm/Vuk6Wnznls619PZ6t1Ns3jbfLHnJvWn8/TxXqSreeraZqns5PnXMczwn0pZ3N9YL2BxvepjNvuvrSJ9XNOXsAYy7Gtyo2tx7PLvsbHs0sF9rAvHSEvrwPx7CeVdqOPmMvot/x/kAjGWN6HZ2zjSN+HMBbtr4d1IbB6Z2CxXWODfO8f7TJhhQJLGbDwGf4t6AfjHX6/AceKeNHtKAAA", - "debug_symbols": "ndndbuIwEIbhe8kxB/bYnhlzK6tVRdtQISFA/Ky0Qtz7kl3SItd78H0nldL6EaF546HNdXgfXy8fL5vden8alj+uw3b/tjpv9rv70fW2GF6Pm+128/Hy/O0hTF9i+rv+dFjtpsPTeXU8D0uVxTDu3oel+V2vN9txWJZw+7kYYgbXF3C9gusNXO/g+oqtlwCuj731MYYHiKKtEFgkWGRYFFgoLAwVqX9W2WaRayu6fYj7Q6QQWlFRkQMsIiwEFgkWGRYFFt1KUkqzyKUVBguHRUVFCbCIsBBY9H9XqrNQa4T2z6rGh8ghtUJgkWDRLTGn+X3kHFtRYKGwMFg4LCoqLMCie82zfAlphcAiwaJ/zUudhbW1W4GFwsJg4ajw/mcGnXfR+O1ThgssEiz60yDkh5DY7u1eYKGwMFg4LCoqaoBF/5pX/RTtXVsFFgkW/WsucyWScisKLBQWBgtHRQz92zYU+5xS9jWmov9DlUAxMCgySBiUGJQZVBikDDIGMUVEpghhihCmCGGKEKYIYYqQ//y1pmW+cd3jN1QJlAKDIoOEQYlBmUGFQcogYxBTRGKKyEwRmSkiM0VkpojMFJGZIjJTRGaKyEwRhdn3CrPvFWbfK8wkLMwkLMwkLMwkLMwkVGYSKjMJlSlCmSKUKUKZIpQpQpkilCnCmH3PmH3PmH3PmH3PmH3PmH3PmH3PmEnozCR0ZhI6U4QzRThThDNFOFOEM0U4U4QzRVSmiMoUUeEibvejX6vjZvW6HR+PR9eX3dvT09Lz78PYPDg9HPdv4/vlOE6PUJ+ent5ffPqvjYhMJzO96xjiIgadDqefxloWsdr9Ve+v/Ac=", + "bytecode": "H4sIAAAAAAAA/+1ZzW7aQBCexRjb/ATUvsg6mEBvOfQ9IgP1cyC1t0q9VeqtUm+VemmlSn28hmgn/jKMjSO8CQmshNbWjL9v/jy7awyVw7i5SwcMBvnn5sTNHZAHt79rd28PG2kieNvEX9gsSxT/WrR/mjhM4wffMr6n+NvI4bzflPjoC/PGt78BXA+prA9f/nP+fPr/tsbngfP1l/AVbSEPuQ784Kcjh4kNwgjfQi9xTlMj+EjxE/n7wta2+44RfGyPjA/nmmPXU2ydKDKsEZQhT0/hOWMdF1Zwxno2rGPN47HXPfcq7G2yz8vYXLt7e9Bo3ueZvy9s9dXntbiGSlw5dpFi60SRyfxFCk+k8LwkrOAE7DpjvY5aPSUsv728PI9EXvDTe/zYj/0F4yd+8O/PU9q6tp1v6GHO++4+hJzjsxHIUf8bYC7d9fOd5ezMCD6il3mWixRbT3VdZqwme0c//aB5XTH/U+0dtbjW7R1jxdYJ6b2Or1GGPLHC4xur4wHL83e8zHNtTvf1+o2IGcuqen0H5Kj/CTA/uusB1edC63FyzUH9WOhsx1jYgc8a0utNxttUcPfocevdZzdv+f5UYIYV/nQqML8A5l+Byd+1ierfb9YfKvoD0GF7xrQbx6HAYl1cG7UchEL/q5sThb/NPeAbwCWFC+3FeKA+778e+w5peamr9X15kbVelxcZz6r3RnJX1To/Gwr9727Wan0Iz2j+RBWYPwBT1vqIytGk1i8U/RHosD1j2o3jhcBiXax1LQeh0P/p5kTh913rI+GD1k+b1jr2wxvw6S4mm/Z9mi+sZf5gU8Y2oN3RBTnq/3b3mCeeuwfYWczztJjmRT7L1+tslcvYbwf+D9c2/+VicfXucmmz+XpVrLPpU/OvZlfLVTbL7Yf0zpx9/P8Bmt7ABekfAAA=", + "debug_symbols": "tZrbquJAEEX/Jc8+dHVVd1X7K8Nw8BIPAVHxMjCI/z5RjOOYPkJxZr8IkV7LS7JCh+5zs2znp8+PbrPaHprpj3Oz3i5mx2676Y/Ol0kz33frdff58fx2E64vxLfxh91scz08HGf7YzPNcdK0m2UzVevpVbdum2kKl8looISk96ESlB+DyS4/Jw0JUp6Q8oyUK1JuSHkBymNAygkpj0g5stCILDQiC43IQiOy0IgsNCILZWShjCyUkYUyslBGFsrIQhlZKCMLZWShjCxUkIUKslBBFirIQgVZqCALFWShgixUkIUKstCELDQhC03VQonCHaGY3+uj5XQfG83oVc9YvWD1CavPWL1i9YbVF6g+B6yesHpstRlbbcZWm7HVZmy1GVttxlabsdUqtlrFVqvYahVbrWKrVWy1iq1WsdUqtlrFVmvYag1brWGrNWy1hq3WsNUatlrDVmvYakv9v5fhaY+kPOuvRPUL9eo7wSF851myFKieQgD7CeyPYD+D/QL2J7A/g/0K9hvYD+6XwP1StV9mHvySvnO/JYpgP4P9AvYnsD+D/Qr2G9hfsP76Xo7/6Af3G8H9RnC/9T0GnPPgz/oy4aP6EjkXetxGeYSwHxE/Ur1XCA+/RYRGSPYj6kfMjxQ3Ul/SfY+QH6mefYl/kThC2I+IH6mf/VQGRNMIyX5E/Yj5keJGvlh0y8NEiP5d07sh7EfEj9Rn4EGGuxKFEZL9iPoR8yPFjdQXhd4j5EfqZ7/kBzIK+YsFmbeI+JH62Y/DBRNZRkj2I+pHzI8UH3Lpj37N9t1svm7v+6tXp83iabv18feufdl5vdtvF+3ytG+ve7Cftl9fLyPSOCHV27zsdmgTstB/Tv9ZfwA=", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_consistent/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_consistent/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 1e4c72c0aef..0c12a103dd3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_consistent/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_consistent/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -17,18 +17,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/7VXS07DMBCdkKTELRUFboAEa7tpmrDrgg0LJK5gUuUcPTqN5FFGL04/1B6pcj7jN2+eJ2M3ocESN2ZwTx6fnRv1bWYCYmkv0VPGPj9uVG68E+/TgMkqiBsSv9GbSnnyC8i/VA4zpj6MGQFf3zucz8OAj7n0tnT3soZ4TnH8PdBwvXTXCubEWNuI2usXD3+OtXC5lpBrFodLxfrnNDZ+NxOxJWe0FO4l7z6nD4GLfhhT1uUMtJD+Ozfqf5vp1qZsFegQWOctakmenO9F7Gt1Zt7X6izriuPH/L56i6u16Rh/Foe/Ye1kf2Ct+piv8Jzf5Y4Hzs3Fe+n/LjDf3PVC+PB6kcDNxDPkV3j8Zc2x/yON17+4ACs9EVt5/IsTsSUvNRE7o7HGcm4O/nxqUR7ckPX9LHCnckg8ekjNuHYvrTXGzw7hc6obrTlmehi0xT4k4+fg37j7uciDx+wGnl1tTVfazlZ2v9+0FrUnOr+3RtnnzdDn8JAfBP9ouFfKGHF77Fr79qeUxmvL8edEMc+bJoF4zGeqL8XdI0z3dMRY0fQ5D9dG8uB68fXhFPjHOqMmwCUjf59KhK5Y63IvyuHZlxv77/Eb8Hy90fc9r2hcU+yH/yukX98HQvchW5dNu9609W9V2nJ7tg/9AYCmNb8NEAAA", - "debug_symbols": "tdbJioQwEAbgd8nZQ7bK4qsMTeMSG0FUXAYG8d0nGWxGVGhKyEWsUB8/CXWohZQun1/Puq26kaRfC2m6IpvqrvXVsiYkH+qmqV/P/TGh4cPkX//YZ20oxykbJpJy4Alxben/FHhf1Y0jKdD1kRAGaKHQQqOFQQuLFZyiBbsSQr6FUPooOFoItJBoAWih0EKjhcEKcXlzKdUmpGZHcZkhjd0EsJOwWCEpWlzOFTB4C26OgqOFQAv54R5nAWih0EKjhcEKuBTKUrYRZdn/LDLPT82GS7k1G674vjkE2MgBisYOYLEDeOwAETtAxg6A2AEqdoBGBgRjbhiLN5reMOyG4TeMuGGw4/hYffWdDXWWN27bPKu5LXaL6PTTu8NO2g9d4cp5cGE73S2m4TWBJaDCrhaeSetEW5/hc34B", + "bytecode": "H4sIAAAAAAAA/7VW226DMAw1A1rSrtrtDyZtz0lpV/bWh+1DUCu+g08fSLY4MoH1kliqkhDnHPvETZLQYAm3mRqTx+fIrb3PXEAs6w10zsTnl1vD7QPMpwGTNYo3JH5ld3vjyS9g/KVhzJj6CGYEfLtknJ92wNe59LbhMdaQrCm63yMN/Q33jVoTY28jam/fPPEL15pzLVWuWZxY9qJ/TmOTuQVwY8zaUjXGuPucvgFX+2lOrMuF0gL9j9zam801W1eejNIhsM5fWkvy5LwE7mt1lriv1RnrSvhj/r96i6u1awR/ESd+J9rh+SBa9Zzv6rvM5RyHXpvDPPp/AuYH99fgI/tFgJvBNx1f4fHHmhP/Jxrvf3EBVjrDbTz+xQw3xmUmuDMaa4xrc+UvrxbjwQ1Z36+AO5VD4tEDNZPavbTWBD9rw+d0qKwVzrQdtNXnEPLnyr/i8QrykDa7I87mULumrJt6X5/Pu1OttSf6/26Ncs+74ZzTj/wg+J3puxI54p6xW+u7n1Ia763wr4hivjddovgknqlzKe4d4ZqXDuOZpt95em8wDqmXDfnv4d76Wv4Dc9eH6lEOAAA=", + "debug_symbols": "tdbLaoUwEAbgd8nahUlmxuS8SikHL/EQEBUvhSK+e2PxUFGhzCIbccJ8+QnMYhZRuWJ+PX1bd6N4fCyi6cp88l0bqmVNRDH4pvGv5/FYpNtHwm//2OftVo5TPkzioVAlwrVV+CMMvvaNEw9M189ESGQLYouMLQxbWK5QKVvIO6HhLTRlZ6HYQrMFsAWyBbFFxhaGK/TtywFoF5DJs7jNAGN3gfIiLFdAyha3c4US30KZs1BsodkC/nnHVSBbEFtkbGG4Am8F2VTuhKz8m0UZ+KXZKIC92ShSx+YtwEYOoDR2gIwdoGIH6NgBEDsAYwdQ1IA1VF/54POicftmU89teVh0pu/enXaefuhKV82D27afw+KzDTzKBClcG67+AQ==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_consistent/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_consistent/execute__tests__force_brillig_true_inliner_0.snap index 1e4c72c0aef..0c12a103dd3 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_consistent/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_consistent/execute__tests__force_brillig_true_inliner_0.snap @@ -17,18 +17,14 @@ expression: artifact ], "return_type": null, "error_types": { - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/7VXS07DMBCdkKTELRUFboAEa7tpmrDrgg0LJK5gUuUcPTqN5FFGL04/1B6pcj7jN2+eJ2M3ocESN2ZwTx6fnRv1bWYCYmkv0VPGPj9uVG68E+/TgMkqiBsSv9GbSnnyC8i/VA4zpj6MGQFf3zucz8OAj7n0tnT3soZ4TnH8PdBwvXTXCubEWNuI2usXD3+OtXC5lpBrFodLxfrnNDZ+NxOxJWe0FO4l7z6nD4GLfhhT1uUMtJD+Ozfqf5vp1qZsFegQWOctakmenO9F7Gt1Zt7X6izriuPH/L56i6u16Rh/Foe/Ye1kf2Ct+piv8Jzf5Y4Hzs3Fe+n/LjDf3PVC+PB6kcDNxDPkV3j8Zc2x/yON17+4ACs9EVt5/IsTsSUvNRE7o7HGcm4O/nxqUR7ckPX9LHCnckg8ekjNuHYvrTXGzw7hc6obrTlmehi0xT4k4+fg37j7uciDx+wGnl1tTVfazlZ2v9+0FrUnOr+3RtnnzdDn8JAfBP9ouFfKGHF77Fr79qeUxmvL8edEMc+bJoF4zGeqL8XdI0z3dMRY0fQ5D9dG8uB68fXhFPjHOqMmwCUjf59KhK5Y63IvyuHZlxv77/Eb8Hy90fc9r2hcU+yH/yukX98HQvchW5dNu9609W9V2nJ7tg/9AYCmNb8NEAAA", - "debug_symbols": "tdbJioQwEAbgd8nZQ7bK4qsMTeMSG0FUXAYG8d0nGWxGVGhKyEWsUB8/CXWohZQun1/Puq26kaRfC2m6IpvqrvXVsiYkH+qmqV/P/TGh4cPkX//YZ20oxykbJpJy4Alxben/FHhf1Y0jKdD1kRAGaKHQQqOFQQuLFZyiBbsSQr6FUPooOFoItJBoAWih0EKjhcEKcXlzKdUmpGZHcZkhjd0EsJOwWCEpWlzOFTB4C26OgqOFQAv54R5nAWih0EKjhcEKuBTKUrYRZdn/LDLPT82GS7k1G674vjkE2MgBisYOYLEDeOwAETtAxg6A2AEqdoBGBgRjbhiLN5reMOyG4TeMuGGw4/hYffWdDXWWN27bPKu5LXaL6PTTu8NO2g9d4cp5cGE73S2m4TWBJaDCrhaeSetEW5/hc34B", + "bytecode": "H4sIAAAAAAAA/7VW226DMAw1A1rSrtrtDyZtz0lpV/bWh+1DUCu+g08fSLY4MoH1kliqkhDnHPvETZLQYAm3mRqTx+fIrb3PXEAs6w10zsTnl1vD7QPMpwGTNYo3JH5ld3vjyS9g/KVhzJj6CGYEfLtknJ92wNe59LbhMdaQrCm63yMN/Q33jVoTY28jam/fPPEL15pzLVWuWZxY9qJ/TmOTuQVwY8zaUjXGuPucvgFX+2lOrMuF0gL9j9zam801W1eejNIhsM5fWkvy5LwE7mt1lriv1RnrSvhj/r96i6u1awR/ESd+J9rh+SBa9Zzv6rvM5RyHXpvDPPp/AuYH99fgI/tFgJvBNx1f4fHHmhP/Jxrvf3EBVjrDbTz+xQw3xmUmuDMaa4xrc+UvrxbjwQ1Z36+AO5VD4tEDNZPavbTWBD9rw+d0qKwVzrQdtNXnEPLnyr/i8QrykDa7I87mULumrJt6X5/Pu1OttSf6/26Ncs+74ZzTj/wg+J3puxI54p6xW+u7n1Ia763wr4hivjddovgknqlzKe4d4ZqXDuOZpt95em8wDqmXDfnv4d76Wv4Dc9eH6lEOAAA=", + "debug_symbols": "tdbLaoUwEAbgd8nahUlmxuS8SikHL/EQEBUvhSK+e2PxUFGhzCIbccJ8+QnMYhZRuWJ+PX1bd6N4fCyi6cp88l0bqmVNRDH4pvGv5/FYpNtHwm//2OftVo5TPkzioVAlwrVV+CMMvvaNEw9M189ESGQLYouMLQxbWK5QKVvIO6HhLTRlZ6HYQrMFsAWyBbFFxhaGK/TtywFoF5DJs7jNAGN3gfIiLFdAyha3c4US30KZs1BsodkC/nnHVSBbEFtkbGG4Am8F2VTuhKz8m0UZ+KXZKIC92ShSx+YtwEYOoDR2gIwdoGIH6NgBEDsAYwdQ1IA1VF/54POicftmU89teVh0pu/enXaefuhKV82D27afw+KzDTzKBClcG67+AQ==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_integration/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_integration/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 1f64e65b623..53d37939128 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_integration/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/to_bytes_integration/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -28,18 +28,14 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, - "12049594436772143978": { - "error_kind": "string", - "string": "array ref-count underflow detected" - }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "H4sIAAAAAAAA/+1aO5LTQBAd2ZK82q2tXeAQZNSMPpacufhcgIyAQLalhIyQBN2AgDsQcAcCqjgEAVUEnABOAGKn1+3nsdZezbAu46lySZ5pdb9+090eddkTV8PTn3b4+joQ64Nkpvoq+w1lUZd0idNzhHOFZE9sHrT2S18jeL5dH1p0OAK7NvUXMh1HBv8s4k8iptOB/pj0+270y5HW87RZ1S/A7rlYTV7+DK3xGHum1070Ot1f6PsI9LnYd47JNm8PDPgHzLd2PGkc2FZSnmku3wCXtG/Cii1VxyqZk+7ADY9jip1QrA9aG4FtuscxhO8cd8tXw/SiHNrk+Ub2940Lz4B/Wy7eM70ohzaHHVy4yF+pfwiRi6EBD9m/EOt7EwLWEJ6bWsGazD3gxmc2THgCkH8IOE/ccCrvM70CbLmNbVV7YE+I5X7yXCP7F2I93jkvXJbzzfd4BHyT/KOD51vGGJOc72EH3yb+HMdGtU+xUYDPBxgbiYvYcHP+VYsurHgm5lgDA1YPZDfFBj0bgPxj8NnVmdwUG/4GvgWzm8hxmlZ5XKlElTKezIpMptlsXKhCZUW2iIskqYq0yCezSS4nKk0qVWeTpNZ2D+ms95HpRTm0eQdnvdm2cX3b+mzvfDOb9D3fPAecd1FTMc838b3LedJ3wrf57GviG+0T36HYbX9e6GvL1ecN9vie+x06Sf4lcIV5PbXDlXHP9/V9rU89+8L0ohzaNNUz3E+yeVP8m84Dpne/dkz1VfYcptgTBjxkF2PvFeAM4fmpJZym2MMa4eZcNM62rWdd5yJ8H+bnIiHMvymcb5J/DT7vw7nIsu0Uc4uPcwNXA8DKhynXaW7XXOdckP0zsexB+s2qjamelz1GXlzl6F9ftP5ArPvF7Qcg/1Z/PwXfiOPpLXHWeanqpKzLrFws0nmJMdOOAeOpq49qu66Z+uQe2HaTO7HEWi0MfnL7p2I9jl3093zAg/wMgB9X/al7f3RcitWcagfv4W+qi1hjOZ+I31F9ksinL7r7pQODT3wvAph7p69tvnwDfRhTOEccXIr1mCK58w7ujnm6OnfM03556vZcqGr63R4aMNGaz9YIRxvj3/X9IdeSD8zfYy1xVkvUsZZ08iP3v5bE8lhLumvJJ+bvXdQS2+8vaVbm8zJXapKqKlVZ3/cX1/9FEvb0q21qpZtaUNfb1kqy/69qpalf11Ur3dShujLVSoy1Tb0l7NG46QXXlalWEiZTrSQc/0ut/Mr8PYRaWeZJMY/TeT7LkjIZ39jroZ5Y2CzlbP/noh1Bs+TxuqfaLDGR/ev/RbI1kiOskRus1++Zp1o/799FDA/5MgB5vA9g7qdY4uY+8ljmfmO/9IytkfyQzRFG+j9pyNbOmt10nYCuUQ9dhOvSID+6JS6TrhB0RQZdfI74bevyD9L35/MbbL9v2ZkvAAA=", - "debug_symbols": "tdrRauMwEAXQf/FzHjSjkWaUX1mWkrZuCYSkpOnCUvrva5c4G2y14Q7VS8CJD5dwpYlj/N499vdvz3fb/dPhtVv/eu92h4fNaXvYD0fvH6vu/rjd7bbPd9dvd2F8ofx5/uvLZj8evp42x1O3Lrzq+v1jt6aQBv603fXdOoWP36uOFAWGggICDiggFDAKIgqkBkjiJFKeiwSLDAuFhcGioCIGWFQLJ730YTYXDIsIC7khisxFgkWGhcLCYFHtnNnOgmW+PyTAgmBR7ZzDNyLCQmCRYFHtnFOZhC6EwsJgUe9cL6LMd20KsCBY8I3vsRQRFgKLBItq55HCWUReCIWFwaLaeYwXIToTOcCCYME3vsdSRFgILBIsqp2LTJNBMs2FwsJgUVChARYEC4ZFhEW1cyl0FinwXCRYZFjUO9f8tTBYFFRYgAXBotp5ukyGJGEuIizkhlhci1qCRYaFwsJgUe08Uf5SlAALggXDotp5jpPIMr9uLwKLBIsMC4WFwaKggkK19JynP2tZeUEIJ3yL6IJEnAhOEk4yTqrda5h6UVoSw0mBCdXbv/xc1QjhhHEScVJtX0UmshgtRAknGSeKE8NJgUn9xtz3pD5hSpiKGSr63wwN42ZxsvElwDjz9cljQgzNE6h5AjdPiM0TpHlCap6QmycomPCJzIOKA0nwIPIg9qDoQeJB9etnufrrIPn7laCFpvs7WuIyobROqN9v+9EEap7AzRNi8wRpnpCaJ+TmCdo8ofmeTs33dEb39CciD2IPih4kHpQ8KHuQOpA2n4zafDJq88mozSejNp+M2nwyavPJqM0nozafjNb8asea72lrvqfNM6DNM6DNM6DNM6DNM6DNPKg4UPH8ZNfv/rLldEZsRgtkHlRwxPW7wLcQeRB7UPQg8aDkQdmD1IPMgzwrgjwrgjwrgjwrgjwrgjwrgjwrgjwrguAV8TEc/dkct5v7XX9+lPTpbf9w9WTp6e9LP3vI9OV4eOgf3479+Ljp1ZOmQzhzXLHQOEbG+ol5Razj4fgplbiikobUIfkf", + "bytecode": "H4sIAAAAAAAA/+1ZO47bMBAlrY9XawS7SQ6RLiD1saRukc8F0qVIIdtSkybpU7jPDQKkyAmSI2aF5azHT5SyWZMLwzABQ7I5evP4OEOOaCnumjSfvoXmOhPDRjY35qoOa9ohlvLJU3riuSeyFOON+v6YawLP9/2BwwEn4NclfqXyZWIZn0P+WcIwPeCnhB/6wVdzg/Nuu48vwO8zsZ+8/Bnq4zH23vRdmH66vzL3CeD5mHfOybVuLy38Z2xsfXu79eBbK7UwWn4GLWnehBNfukt1tibsyI+OS4qdWAwb9c3BN91jC+A7593r9ZXhoh365PlG/o9NC2nh/1AtvjFctEOfwYQWPvJXmY0QtQgsfMj/lRjOTQxcY3juxgnXbC1Bm5D5sPGJwP4V8Lzwo6l6wXAF+PIb27qT4E+I3XzyXCP/V2IY71wXbsv15nM8B73J/vXJ661SjEmudzCht00/z7HRHlNsVDDmE4yNzEds+Kl/9WaKK9bEnGtk4SrBdiw26NkI7N/AmH3V5LbYCEf0FsxvppZ53pZpqzPdqLReVYXKi9Wy0pUuqmKTVlnWVnlV1qu6VLXOs1Z3RZ11xu8p1XrfGS7aoc+pWs/Te91qqr55aFzHE1zd1TerGrnyvLGtFxHYfwCecz+aWvMGc584jumN9aRtfLba153eu9o3ZFxtesuRscUj9oSHe95Hc+3z5seIPz7ncgKT7D+BVp7WFOuc4zw95dmMcIevbWcu8kl07ToJ/oQYrsfc/6UYxoaP90Fb/nKOM9An9qNP+/wW49rg4hmTEONrtW0v97Medi3tfcF2yIn6QtZHPPp14Ke5X4jdeRa3dcWzrJSSwDMSw/2d+4/A/ov5fil2/OgaHsCzKxvdZU3XFM1mk68bXGv6NmM6TZ3JOV4blO3MFdcGP/Vpqh66NoRsXmx5cuOEj32/DMRQH1wbfJ118LWBa8TPg23vtTxecO3nYznH2v5v51g7LNb87pW6s+1D/H+lvoWsj3jwfeicD31L9TkfJvVRx58PqXqKfHBdC+VFU66bUus6122ui3/VQlQzxlsfGt6db/ctMviBYO+q2x0n8n//HzTrIzvimvjher+HXRp8Xt8mjA+NZQb2eB/Bb7/FjjcfI49pPu4Z2C9YH9kH7DfiSP/dx6xvsf0/rAvAmh+ARbyuLfbzR/KyYcWAlViw+G+kb5+3vwjv9vMXwWy5HgUlAAA=", + "debug_symbols": "tdrbbuIwEAbgd8l1Ljz2jMfmVVarikOoIiFAHFZaId69ARGaJm7RL3VuKqXtN3/Q2LEBX6pVszi/v7Xb9e5Yzf5cqs1uOT+1u213dbnW1eLQbjbt+9vw15W7/aB4///jfr69XR5P88OpmmVfV812Vc3IScfX7aapZuKuf+uKFAUJBRkE3qGAUOBREFDAJUAceiFxLAQWERYKiwSLjIrgYFFsOOmzHymNhYdFgAW/EJnHQmARYaGwSLAo9tz79BCex/ODHSwIFsWee/eDCLBgWAgsij33knuhE6GwSLAo91yfIo9nrThYECz8i9cxFQEWDAuBRbHngdxDBD8RCosEi2LPQ3gK1pGIDhYEC//idUxFgAXDQmBR7Dlz/2TgSGOhsEiwyKhQBwuChYdFgEWx55zpIcT5sRBYRFiUe67xe5FgkVGRHCwIFsWey/PJIOzGIsCCX4jJXjQJLCIsFBYJFsWeC8VvRXawIFh4WBR7rswPoV9FPV2WU5R+XU7p86FA6V6ebcuLbfloW15tyyfb8tm0PDlnXJ+M63vj+sG4PhvXt527RMX7j9n1m4WYSYdompD8826Sj36SIOYJ0TxBzROSeUK2Tih/xvqrCWSeUN558WB7x/HnBM3UvwfXHHSSEM0T1DwhmSdk64TyJ8S/mkDmCd48IZgnsHmC+ZwO5nOazUcrm49WNh+tbD5a2Xy0svloZfvRar4CsfkKxOYrkJjPabGd09fu6t/80M4Xm+ZximB93i4HhwpO//fN6HzB/rBbNqvzobmdNBgcMujulERrUrm/77lduu6S/H3zev8r193Xtl1ql/wB", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index ab3d31883c0..6e02bad0273 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -45,8 +45,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+1YzW7TQBDeOHEc14SGllL+6YW7nZ8mB4SCoBJc4BnSVpF4AySE5DvvwIEDTwDvx5ru4C+fx1HbeKGijDSyvT8z38zOjme3Zc7owHLLvXfcMzBVkjFz90w3o6xBWalPnK0GcbYA4xPwddv5PrTctRxZ7lmOLW9ZTizfsNy3fNPytuWB5VuWdyzvWr5tec/yHcv7lu9avmf5vuUHlh9afmT5sdN9YAAAO89cJYCA64d7xoS95TDO3Xe6GWUx6W1S/iw9nMRmlRrGP4pBpgf5Q5Hf8SM/jZycV/mqfEN6pe0oL315BHMK6rt3jG2RK324B2R+Ed97pnzfB/08p63okH6fazFLx4d+1yJb9sXGvJQfgG8L6uSrurEvhL4O+PM5+cfHXkb/+NkL2XK3Br/YVtDL3IPuLE0T58s35EtP+3Ii+yU0VZK+LujG/MnUpm+Oj3cgl8exTlxb0b9tdF8UFJMdTeevFmHpmDJHhIq9gan6rgt2htT2FPy0hDko04BObJM4HZj6vBoreBr0z1TWLTJVkr4e6ZZ3Ji2OBHch4z3I5XGsE2OlVyMzVMa2qE/GDt1T/BmRTXP3nW5IOyDXkC7BJOs+ds8C4zPC9y/kjc8gl8exTszZoh/90lfwiP4E2qO8iq8NbfIPFEw9HE99MfR18lJvQVvuW/IJyxIcIY1/7b633bMLc2T+QNHfJf0ruJU29CfLaittMr7w+Qv3XvhV/pudvJTXVDxOZ+VBTHwfmmpcof6Qxr9131tkr8Ti/JI4l9NFthwtlovJ4vR0fLLgfY0+q/v3c66cXxILk1Yrt0i3n/wxTLV80K7xvayLr5oydZcCdf/aQFkrv/VGtizO2fI/Rx9h3YlrwzgQo59/vn6OEEzaOQL/4V/d+7ap5uM/cc4qiNccazrUKdgCU/U7xgvXEcdgL9d0HPfcxjVdoODpr/FdkUuazmWL6Wh2MhyfTI8no8Xo8EK5jOt6xmXM+lyAsjk3GdNcHlhXQ/cVvZvaEDZvQzow9fnB9znJd87hursxv2Ul9p4f32RajSrrUPjrA7Rjn9QydfVtSOM/gcyP7l3LsxIfCfRrZ1mZJ/nEmPU5S9oTZTzmpICw4R1tsmYe3rVqcznHJIBvnSy2kf0hcrT9VTcvUPBFJKddo4/zgxYDEqvnja3rUV+mw/Pk4+tbX6bZ1a8vz/LlLz8pmP7Xl8Z8AXv/Rn0pOQ3vFHzs4TAv7RC/dfLSFtGv3cXIOMEa+8H6+zwr9zN4/4D3I2JLQOP5ne97vpsSN9qIsbTu3iaBPu0+SzBq90lJfjFZPZIVbSBLcA2U8dElcWmy+F7sIvdc30Se5Z/f98s8hSEAAA==", - "debug_symbols": "tdjdquIwEAfwd8l1LzKZTD58lWU5VK2HQqlSdWER331TqR6xdWUG5kYSyY9/20lomovZNuvz91fb7/ZHs/p1Md1+U5/afV96l2tl1kPbde331/Pfxo4/zt/GHw91P3aPp3o4mRVgqkzTb0uLoPhd2zVmRfb6uzKO2CKwRWSLxBaZK9CyBbCFYwtkC3bNkV1zZNcc2TVHds1xsebOukk4b1+Et2wBbOHYAtnCswWxRfgk6FVEtkhskbmCFuuBmSbhbXoVyBaeLYgtAltEtkhckRZXFHm0EyHvw8NA4bPBMUOeBseM8XnwGADaAU47ALUDvHYAaQcE7YCoHZC0A7JyQNZeyVl7JWfuSh4NCowXGBKYIDBRYJLAZL4Bu3hDOaX727s0cYaiBCUJygIEi8smZ7g/iNKEGQIJchKEAuTe3BP6B0KaoeUvF2st3HfwpZ1mjCRZyxMpB3igkGcoSlCSoPwRxdmDQCtBbyZS+CnvfMrim4lE/0UoQV40J958oH5kQcS89osPPKgnOPUEVE/w6gmknhDUE6J6QlJP0N7LAqmvaVJf0yTYzgKhBHkJIgkKEhQlKEkQe1d7Lb0/9dDW666Zjud3537zdFp/+ntoXg7uD8N+02zPQzMe4f+c3o8zCoKrINlyMWMhSye629a0dCJWMd32dOO4cuIF1pf8cg3/AA==", + "bytecode": "H4sIAAAAAAAA/+1YzW7UMBB2/jabhmWXllL+6YV7sj/dPSC0CCrBBd4AKbTaMxLiHok34MATwHsyoR7y7WQS0W4sVYClURJ7/M3n8XhsxzMX5ZjEs++hffqmWVhnbZ/ZbiXvEStzydPrkacHHJ+ArwPr+4hkQBKTDEkSkj2SlOQGyYjkJsmYZEJyi2Sf5IDkNskhyR2SI5K7JPdI7pM8IHlI8ojksbV9bICAdJ65TgSB1w/7TAR3z3Jc2+9st5Inwm6f+KvsZJGY7dIz/1kCmA7wp4wfusHPYovzqtzGN8Iu152WtS9PoU9VRvYdY5txuQ3XAPev4vvQ1O9HYF/2CRQb3O5yLlbZ/MTtXOSbEY+xrPF98G1VwnLbNrZF0BaCP58L/7hYy+gfN2sh3xy08OexVeVl6cB2nmWp9eUb4UtH63LB6yUyzcJtA7CN+VOWQHzL+HgHuFJP2sS5Zftjo/uiKokYR9/5yxNcQlPniEgZr2+avhvAOCNR9xT89B76IKYBm1jHcTox7Xk1Ufj06J8lz1tsmoXbhsI2v8uixRHzrjAKwJV60ibGyrAFM1J0PdHGulP7ZH/GYkxr+53tWPYB1whbzInnfW6fFcdngt/fkDe+AK7UkzYxZ7N99MtI4cP2U6iPyya/AOp4D2ROQ9QXbQm0hWVttyp79pvzicRiHpHQf22/x/Y5gD7cf6LYHwj7W7yVOvSnxAqUOtavfP7Cvld+5X0zLGu8vuJxuaovYuz7yDTjCu1HQv+t/d4T4+VYXF+R52ZZ5JtZsSkWxfn5/KyQ6xp91rb3y1y5viIXWbSzsidsu8kf00zLB0GL73leXJ0pM/tToG2v9ZW5cnveyDfVPZv3c/QRnjtxbiQP5Ohmz9fvEcxJu0fgHv4V9GQ+xvXQ93oslrPV2XR+tvywmBWzk0utR3k2lbwkTtCBLdeXMf3Fctc5cKTY3XUMUf9jyCamPcZdn/Vdrxt5duzNb3nNfejGN7l2zuJ5qPz1EeqxjffjtjNaJPQ/A+Yn+z42zVzB8ZFCu3Yf436cT4zp/sfD9amijznJF9zwP2Pa0Q//F2p9ZY5JgV8Xlhyj9AfjaOurrZ+v8IsFTtBiT+YHLQY4Vv80tv6NM1I2/X9G6uZz/c9IF/nyl58UTn2dkXhd4t3ORRxGFj8wtf+YO9rX7sSsx1wTN1x/3yv4noz3QLyn8lh8oS/f5b37u6l54xgxprruzym0af8VmKN2r0/Ly2ENBVa8Axbzmij68RV5aVjy/8Rl/jd8YzySn+DnwzMNHwAA", + "debug_symbols": "tdjdivIwEAbge+lxDzLJTJLxVj4+lqp1KZQqVRcW8d43lepKW1cmMCeSSB7emB+b5lJs6/X586Ppdvtjsfp3Kdr9pjo1+y7VLteyWPdN2zafH89fF2b4sHhrfzxU3VA9nqr+VKzAxbKou20qESS/a9q6WJG5/i8LS2LhxSKIRRQLlgpnxAIWhfd3EeNUWLFwYoFiQWLhxSKIRRSLxTm3xo7CopkINGIBYmHFwokFigWJhX8naCqCWESxYKmgxflwTKNAM11X5MQCxYLEwotFEIsoFXFxRxE6MxJC9A8Dic8aBwYeGwd24bnxEADaAVY7wGkHoHYAaQd47YCgHRC1A1g5gLV3MmvvZF6cA47x/nBIRTc1LDdgTA6CHLT458QM9zFLRZghl4MwB1EGghe/yeEDOZqh5TOrMQbu58NUjjMWcrKW1xF7eCDPM8QZyJocBG9RmA2EtTnoxULyv9M7X7L2xUKiPxHlIJ+1Jl68jr5lMYs57eMFOKeegOoJpJ7g1ROCekJUT9A+ZQAa9QRQT1Df06i7p6+p9lX1TbVu6/FScXfuNk93jKfvQz25bjz0+029Pff1cPH4e+c4jDagL8Fj6vnQb2/LYG/Hg1QJrgzx9oBMFcaSfUpPPfgB", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_0.snap index b497c88b045..9b28e302c5d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_0.snap @@ -45,8 +45,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81Y227TQBBdO77ESU1MS8sd+syTnbRNhIQUofYFCfEFSJhWgRd44AuMxIczS3fq4+m4qI1X6kqjtXd3zpyZ3Zl1EpjLdkgSuOfI9aG53njN2vXldq0aEKv0yTMYkGcAHF9DrEcu9jFJQpKSjEkykgnJlGSHJCd5QDIjKUgekuyS7JE8ItknOSB5TPKE5CnJM5LnJC9IXpK8crYPDRCQwTP3iSDw+uP6THAPHMe1ey+3a1Um7A6JvypPjjPTbQPzX2SA6QF/zviRH/wydTinTRffCLs8dta0sTwDHdty94xnm3F5DnOA9e353jft8wHYlzojxQbP+9yLVXl04ncvqk3OPjYtfgixtS1qurZxLoa5COL5WcTHRy5jfPzkQrXZ6+Fv29T5+l346mWvqrJk/ATwjRkuLzlfYtO2QPiW+vCtnHcuT24jMYb2J4Lr0HdEIOwxHxkfWQfGXvhUG3vXFqZbh+RZw71BHongmHniqNUS5qTVEuZhuf50zzPFr1jwT7zwv/yAQ86Rafc8UWIemutxx/MSi7E34O9v0EFMAzZxjM9ZYa6fe16XK3pBT8925Jg8z+jP2vXldq0qTP/ZzRW72/owHt6HsjD9Oee3FrT3gK88ZvzJ0HGDO2zqJzZVDphyX2wOv4VxzOvYtHmHuhnM4/pPgPnOPc8UfXmOI4E3Enxwjte+d73v+rcLuEaJD34HnYL/H4X/qC9rt6ffdFe1m+OJtTtUYhwa/bvRCH957IPrtdot61HfbwWtdvM6jKP8TYM6Nm84zngOUoG5o3DSvlt4fa6s34E1HAe2jbUtv0EPa6+mK++qHPjdhCV9lPFgHK1O9+mFCr+JwIl67OG7bVot4Zqn1SjWlTXKtrTp4v7rYSxuWlzbxrhezGUwFzVdOxP3zrkjsZhHLNZ/c+8z1yegw/qFYj8R9ju8lTE8sxJrpIzxehvTL+7Z7gHX9Khp8YaqRctV+0cgxz423dpihP1YrP/h3ifCXz5/6zvy3CzrarOoN/VxfXFxdF7Leo8xwzglHuJEbX513zn8kYH63bSc2L52vnkdc838cC1ljuCe4pljX0KxXj7LHOIpmQtYJ27KhSnMaTWCOWo5Om1uhzUWWOkWWMyrUNand+SlYclac5va8YvxzPA5WS8Xq/P50fny6/GiXpz8Nyf/AuvwsF3ZGQAA", - "debug_symbols": "zZjRioMwEEX/Jc8+ZDKJyfRXlmWxrS2CaLF2YSn9902KbSUtXQY3kBfJyJybqyYTmbPY1uvT/qvpdv1RrD7Oou031dj0nY/Ol0Ksh6Ztm/3X/LaQ4aLwmn88VF0Ij2M1jGIF6ApRd1s/MuD5XdPWYmXkpXhKNRrllGu0Lu/J4F4kWwKaki2hnSd/FkLpjLyYjLyUGXmxGXlxGXmhfLygzMgLZORFZeQlo7qLGdVdzKjuIq/uBsKyCccmiEtoySaATSg2gWzi5TpVUk2E0vL92iDnbrl+iNHn1iatfJlW3qaVd0vlCW770g8hlqek8kamlYe08svfPeq7PJpIvlzqHqSUcNu1fuziCdRfE5hop5fIJjSbMGzi5XdAMhOhZ08+EcQlrGQTwCYUm0A2odmEYROUdF+45UWjhLt8SbE8pJVXaeXxP+VtXDKcTitvlss/CvbTYekWH/Vk3snbtPIu8XngKPEEJJNOcPHRdzU01bqtpwbb7tRtZv228edQR623w9Bv6u1pqEMT7tF/C0UA/OEPyoV/ex8RFiDRBxCeAqT2IYXwmqqoAARvwdv4BQ==", + "bytecode": "H4sIAAAAAAAA/81Y227TQBBdJ7YTJzUxLS136DNPdtJchIQUoUZ8ARJvYFL8wBeAxIM/nTHdYY8nk6A2XomRRrvey5kzszuzUQJzK5ekge2Htu2ZXeE1a9vmx0nRIVbuk2fQIc8AOL6GWPdt7CPSmHRAOiRNSEekY9IT0pT0AemENCN9SHpKekb6iPSc9IL0MekT0qekz0ifk74gfUn6ytq+NEBABs/8TwSB1y/bJoJ7YDmu7Xd+nBSJsNsl/ipfzBPTlo75zxLA9IA/ZfzQD34+sDjXdRvfCLs8tqldLDewp5HU9vFuMy7PYQ7w/uZ+nxvXvwD7ck9fscHzPs9ilV8t/J5FUaXsY+3wexDbRsK6bRvnIpgLIZ4fRXx85DLGx08uFNXZHv6NjK2vX4SvXs6qyHPGjwHfmO7ykvMlMk4C4dvAh2/5tPV4svTFGNofCa5dvxGBsMd8ZHxkHRh64VNUzVubmXYdkncNzwZ5xIJj4omjVkuYk1ZLmEfDtbL9ieJXJPjHXvjf/oBDzqFxZx4rMe+Z3bjjfYnE2Bvw9yfsQUwDNnGM71lmdu89r0uVfcGelu3IMXmf0Z+1bfPjpMjM/rubKnaP9WHYvQ95ZvbnnN9a4N4BX3nM+KOu4wZv2NhPbIoUMOW5NDn8FsYxryPj8g73JjCP6z8A5jvbnyj75T0OBV5f8ME5Xvvetr7r3yngGiU++DvoGvzfKH35uxxr1hhiFSux4n0nxsmht5fXp8r6ExErA7YxP9MD+7B+aHtlvU2B3yEs6aOMB+NotWbfvp7CbyRwwj328LsRLR84b7U8470yzxoZ1G3cPy2MRbXDbWSI68VcAnNh3bYzst/8dkss5hGJ9Z/t98S2Mezh/ZliPxb2W7yVMbyzEquvjPH6JqafbL85A65LYe3wuqoFy5X7M4tjHwE/lBDmcf03+z0S/vL9W9+TZ7Usi2pWVuW8vLm52payZmHMME6xhziRTP/WbIvfNy5OHBu0r91vXsdcEz9cc5kjeKZ459iXnlgv+zKHfhjHG33EOnEoF8Ywp9UI5qjl6Li+G9ZQYA2OwGJembJ+cE9eGpasNXepHd8Zz3Sfk+VyttpOr7bLr/NZOVv8Myd/A7YW0HedGAAA", + "debug_symbols": "zZjdisIwEIXfJde9yGTy66ssi1StUiit1LqwiO++ibRaoriEOpCbMlPmfDk0yVDmwnbV5nxY1+2+O7HV14U13bYc6q712eVasE1fN019WM9fMx4eAm/1p2PZhvQ0lP3AVoC2YFW785ECr9/XTcVWil+Lp1IlkY+1Skp9Lwb7otg4cGOxcWjmxd8FEzIjLyojLzojLyYjLzYjLy4fL8gz8gIZeREZecmo72JGfRcz6rv4uu9qPXmxdu4lKEyywiYrXKpC8mQFJCtEsgKTFS/PqeBiVAjJ358NZ+1U60OMtlsqWrymxRtavF2KdzDdSx9CjHekeMVp8UCLX/7tUd7xqCK8XuoeOOcw3Vof23gB8d8CKrrpGpMVMlmhUhUGSPfBiMV4DXe8djEeafGSFq8+iTfxETWaFm+W4x8N4qk5m+UNQr3DO1K85cT9x1I3OCtIF7j67Kfs63LTVONAZ39ut7P5zvB7rKJRz7HvttXu3Fdh6POY94RPAd4YCB7+JX1mVeGUjyFsg9MFcAjZrVCAL0RvwJv4Aw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index b497c88b045..9b28e302c5d 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/to_le_bytes/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -45,8 +45,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/81Y227TQBBdO77ESU1MS8sd+syTnbRNhIQUofYFCfEFSJhWgRd44AuMxIczS3fq4+m4qI1X6kqjtXd3zpyZ3Zl1EpjLdkgSuOfI9aG53njN2vXldq0aEKv0yTMYkGcAHF9DrEcu9jFJQpKSjEkykgnJlGSHJCd5QDIjKUgekuyS7JE8ItknOSB5TPKE5CnJM5LnJC9IXpK8crYPDRCQwTP3iSDw+uP6THAPHMe1ey+3a1Um7A6JvypPjjPTbQPzX2SA6QF/zviRH/wydTinTRffCLs8dta0sTwDHdty94xnm3F5DnOA9e353jft8wHYlzojxQbP+9yLVXl04ncvqk3OPjYtfgixtS1qurZxLoa5COL5WcTHRy5jfPzkQrXZ6+Fv29T5+l346mWvqrJk/ATwjRkuLzlfYtO2QPiW+vCtnHcuT24jMYb2J4Lr0HdEIOwxHxkfWQfGXvhUG3vXFqZbh+RZw71BHongmHniqNUS5qTVEuZhuf50zzPFr1jwT7zwv/yAQ86Rafc8UWIemutxx/MSi7E34O9v0EFMAzZxjM9ZYa6fe16XK3pBT8925Jg8z+jP2vXldq0qTP/ZzRW72/owHt6HsjD9Oee3FrT3gK88ZvzJ0HGDO2zqJzZVDphyX2wOv4VxzOvYtHmHuhnM4/pPgPnOPc8UfXmOI4E3Enxwjte+d73v+rcLuEaJD34HnYL/H4X/qC9rt6ffdFe1m+OJtTtUYhwa/bvRCH957IPrtdot61HfbwWtdvM6jKP8TYM6Nm84zngOUoG5o3DSvlt4fa6s34E1HAe2jbUtv0EPa6+mK++qHPjdhCV9lPFgHK1O9+mFCr+JwIl67OG7bVot4Zqn1SjWlTXKtrTp4v7rYSxuWlzbxrhezGUwFzVdOxP3zrkjsZhHLNZ/c+8z1yegw/qFYj8R9ju8lTE8sxJrpIzxehvTL+7Z7gHX9Khp8YaqRctV+0cgxz423dpihP1YrP/h3ifCXz5/6zvy3CzrarOoN/VxfXFxdF7Leo8xwzglHuJEbX513zn8kYH63bSc2L52vnkdc838cC1ljuCe4pljX0KxXj7LHOIpmQtYJ27KhSnMaTWCOWo5Om1uhzUWWOkWWMyrUNand+SlYclac5va8YvxzPA5WS8Xq/P50fny6/GiXpz8Nyf/AuvwsF3ZGQAA", - "debug_symbols": "zZjRioMwEEX/Jc8+ZDKJyfRXlmWxrS2CaLF2YSn9902KbSUtXQY3kBfJyJybqyYTmbPY1uvT/qvpdv1RrD7Oou031dj0nY/Ol0Ksh6Ztm/3X/LaQ4aLwmn88VF0Ij2M1jGIF6ApRd1s/MuD5XdPWYmXkpXhKNRrllGu0Lu/J4F4kWwKaki2hnSd/FkLpjLyYjLyUGXmxGXlxGXmhfLygzMgLZORFZeQlo7qLGdVdzKjuIq/uBsKyCccmiEtoySaATSg2gWzi5TpVUk2E0vL92iDnbrl+iNHn1iatfJlW3qaVd0vlCW770g8hlqek8kamlYe08svfPeq7PJpIvlzqHqSUcNu1fuziCdRfE5hop5fIJjSbMGzi5XdAMhOhZ08+EcQlrGQTwCYUm0A2odmEYROUdF+45UWjhLt8SbE8pJVXaeXxP+VtXDKcTitvlss/CvbTYekWH/Vk3snbtPIu8XngKPEEJJNOcPHRdzU01bqtpwbb7tRtZv228edQR623w9Bv6u1pqEMT7tF/C0UA/OEPyoV/ex8RFiDRBxCeAqT2IYXwmqqoAARvwdv4BQ==", + "bytecode": "H4sIAAAAAAAA/81Y227TQBBdJ7YTJzUxLS136DNPdtJchIQUoUZ8ARJvYFL8wBeAxIM/nTHdYY8nk6A2XomRRrvey5kzszuzUQJzK5ekge2Htu2ZXeE1a9vmx0nRIVbuk2fQIc8AOL6GWPdt7CPSmHRAOiRNSEekY9IT0pT0AemENCN9SHpKekb6iPSc9IL0MekT0qekz0ifk74gfUn6ytq+NEBABs/8TwSB1y/bJoJ7YDmu7Xd+nBSJsNsl/ipfzBPTlo75zxLA9IA/ZfzQD34+sDjXdRvfCLs8tqldLDewp5HU9vFuMy7PYQ7w/uZ+nxvXvwD7ck9fscHzPs9ilV8t/J5FUaXsY+3wexDbRsK6bRvnIpgLIZ4fRXx85DLGx08uFNXZHv6NjK2vX4SvXs6qyHPGjwHfmO7ykvMlMk4C4dvAh2/5tPV4svTFGNofCa5dvxGBsMd8ZHxkHRh64VNUzVubmXYdkncNzwZ5xIJj4omjVkuYk1ZLmEfDtbL9ieJXJPjHXvjf/oBDzqFxZx4rMe+Z3bjjfYnE2Bvw9yfsQUwDNnGM71lmdu89r0uVfcGelu3IMXmf0Z+1bfPjpMjM/rubKnaP9WHYvQ95ZvbnnN9a4N4BX3nM+KOu4wZv2NhPbIoUMOW5NDn8FsYxryPj8g73JjCP6z8A5jvbnyj75T0OBV5f8ME5Xvvetr7r3yngGiU++DvoGvzfKH35uxxr1hhiFSux4n0nxsmht5fXp8r6ExErA7YxP9MD+7B+aHtlvU2B3yEs6aOMB+NotWbfvp7CbyRwwj328LsRLR84b7U8470yzxoZ1G3cPy2MRbXDbWSI68VcAnNh3bYzst/8dkss5hGJ9Z/t98S2Mezh/ZliPxb2W7yVMbyzEquvjPH6JqafbL85A65LYe3wuqoFy5X7M4tjHwE/lBDmcf03+z0S/vL9W9+TZ7Usi2pWVuW8vLm52payZmHMME6xhziRTP/WbIvfNy5OHBu0r91vXsdcEz9cc5kjeKZ459iXnlgv+zKHfhjHG33EOnEoF8Ywp9UI5qjl6Li+G9ZQYA2OwGJembJ+cE9eGpasNXepHd8Zz3Sfk+VyttpOr7bLr/NZOVv8Myd/A7YW0HedGAAA", + "debug_symbols": "zZjdisIwEIXfJde9yGTy66ssi1StUiit1LqwiO++ibRaoriEOpCbMlPmfDk0yVDmwnbV5nxY1+2+O7HV14U13bYc6q712eVasE1fN019WM9fMx4eAm/1p2PZhvQ0lP3AVoC2YFW785ECr9/XTcVWil+Lp1IlkY+1Skp9Lwb7otg4cGOxcWjmxd8FEzIjLyojLzojLyYjLzYjLy4fL8gz8gIZeREZecmo72JGfRcz6rv4uu9qPXmxdu4lKEyywiYrXKpC8mQFJCtEsgKTFS/PqeBiVAjJ358NZ+1U60OMtlsqWrymxRtavF2KdzDdSx9CjHekeMVp8UCLX/7tUd7xqCK8XuoeOOcw3Vof23gB8d8CKrrpGpMVMlmhUhUGSPfBiMV4DXe8djEeafGSFq8+iTfxETWaFm+W4x8N4qk5m+UNQr3DO1K85cT9x1I3OCtIF7j67Kfs63LTVONAZ39ut7P5zvB7rKJRz7HvttXu3Fdh6POY94RPAd4YCB7+JX1mVeGUjyFsg9MFcAjZrVCAL0RvwJv4Aw==", "file_map": { "18": { "source": "pub mod bn254;\nuse crate::{runtime::is_unconstrained, static_assert};\nuse bn254::lt as bn254_lt;\n\nimpl Field {\n /// Asserts that `self` can be represented in `bit_size` bits.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^{bit_size}`.\n // docs:start:assert_max_bit_size\n pub fn assert_max_bit_size(self) {\n // docs:end:assert_max_bit_size\n static_assert(\n BIT_SIZE < modulus_num_bits() as u32,\n \"BIT_SIZE must be less than modulus_num_bits\",\n );\n self.__assert_max_bit_size(BIT_SIZE);\n }\n\n #[builtin(apply_range_constraint)]\n fn __assert_max_bit_size(self, bit_size: u32) {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_le_bits)]\n fn _to_le_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// Values of `N` equal to or greater than the number of bits necessary to represent the `Field` modulus\n /// (e.g. 254 for the BN254 field) allow for multiple bit decompositions. This is due to how the `Field` will\n /// wrap around due to overflow when verifying the decomposition.\n #[builtin(to_be_bits)]\n fn _to_be_bits(self: Self) -> [u1; N] {}\n\n /// Decomposes `self` into its little endian bit decomposition as a `[u1; N]` array.\n /// This slice will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_le_bits\n pub fn to_le_bits(self: Self) -> [u1; N] {\n // docs:end:to_le_bits\n let bits = self._to_le_bits();\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[N - 1 - i] != p[N - 1 - i]) {\n assert(p[N - 1 - i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its big endian bit decomposition as a `[u1; N]` array.\n /// This array will be zero padded should not all bits be necessary to represent `self`.\n ///\n /// # Failures\n /// Causes a constraint failure for `Field` values exceeding `2^N` as the resulting slice will not\n /// be able to represent the original `Field`.\n ///\n /// # Safety\n /// The bit decomposition returned is canonical and is guaranteed to not overflow the modulus.\n // docs:start:to_be_bits\n pub fn to_be_bits(self: Self) -> [u1; N] {\n // docs:end:to_be_bits\n let bits = self._to_be_bits();\n\n if !is_unconstrained() {\n // Ensure that the decomposition does not overflow the modulus\n let p = modulus_be_bits();\n assert(bits.len() <= p.len());\n let mut ok = bits.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bits[i] != p[i]) {\n assert(p[i] == 1);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bits\n }\n\n /// Decomposes `self` into its little endian byte decomposition as a `[u8;N]` array\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_le_bytes\n pub fn to_le_bytes(self: Self) -> [u8; N] {\n // docs:end:to_le_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_le_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_le_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[N - 1 - i] != p[N - 1 - i]) {\n assert(bytes[N - 1 - i] < p[N - 1 - i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n /// Decomposes `self` into its big endian byte decomposition as a `[u8;N]` array of length required to represent the field modulus\n /// This array will be zero padded should not all bytes be necessary to represent `self`.\n ///\n /// # Failures\n /// The length N of the array must be big enough to contain all the bytes of the 'self',\n /// and no more than the number of bytes required to represent the field modulus\n ///\n /// # Safety\n /// The result is ensured to be the canonical decomposition of the field element\n // docs:start:to_be_bytes\n pub fn to_be_bytes(self: Self) -> [u8; N] {\n // docs:end:to_be_bytes\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n // Compute the byte decomposition\n let bytes = self.to_be_radix(256);\n\n if !is_unconstrained() {\n // Ensure that the byte decomposition does not overflow the modulus\n let p = modulus_be_bytes();\n assert(bytes.len() <= p.len());\n let mut ok = bytes.len() != p.len();\n for i in 0..N {\n if !ok {\n if (bytes[i] != p[i]) {\n assert(bytes[i] < p[i]);\n ok = true;\n }\n }\n }\n assert(ok);\n }\n bytes\n }\n\n // docs:start:to_le_radix\n pub fn to_le_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n static_assert(1 < radix, \"radix must be greater than 1\");\n static_assert(radix <= 256, \"radix must be less than or equal to 256\");\n static_assert(radix & (radix - 1) == 0, \"radix must be a power of 2\");\n }\n self.__to_le_radix(radix)\n }\n // docs:end:to_le_radix\n\n // docs:start:to_be_radix\n pub fn to_be_radix(self: Self, radix: u32) -> [u8; N] {\n // Brillig does not need an immediate radix\n if !crate::runtime::is_unconstrained() {\n crate::assert_constant(radix);\n }\n self.__to_be_radix(radix)\n }\n // docs:end:to_be_radix\n\n // `_radix` must be less than 256\n #[builtin(to_le_radix)]\n fn __to_le_radix(self, radix: u32) -> [u8; N] {}\n\n // `_radix` must be less than 256\n #[builtin(to_be_radix)]\n fn __to_be_radix(self, radix: u32) -> [u8; N] {}\n\n // Returns self to the power of the given exponent value.\n // Caution: we assume the exponent fits into 32 bits\n // using a bigger bit size impacts negatively the performance and should be done only if the exponent does not fit in 32 bits\n pub fn pow_32(self, exponent: Field) -> Field {\n let mut r: Field = 1;\n let b: [u1; 32] = exponent.to_le_bits();\n\n for i in 1..33 {\n r *= r;\n r = (b[32 - i] as Field) * (r * self) + (1 - b[32 - i] as Field) * r;\n }\n r\n }\n\n // Parity of (prime) Field element, i.e. sgn0(x mod p) = 0 if x `elem` {0, ..., p-1} is even, otherwise sgn0(x mod p) = 1.\n pub fn sgn0(self) -> u1 {\n self as u1\n }\n\n pub fn lt(self, another: Field) -> bool {\n if crate::compat::is_bn254() {\n bn254_lt(self, another)\n } else {\n lt_fallback(self, another)\n }\n }\n\n /// Convert a little endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_le_bytes(bytes: [u8; N]) -> Field {\n static_assert(\n N <= modulus_le_bytes().len(),\n \"N must be less than or equal to modulus_le_bytes().len()\",\n );\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[i] as Field) * v;\n v = v * 256;\n }\n result\n }\n\n /// Convert a big endian byte array to a field element.\n /// If the provided byte array overflows the field modulus then the Field will silently wrap around.\n pub fn from_be_bytes(bytes: [u8; N]) -> Field {\n let mut v = 1;\n let mut result = 0;\n\n for i in 0..N {\n result += (bytes[N - 1 - i] as Field) * v;\n v = v * 256;\n }\n result\n }\n}\n\n#[builtin(modulus_num_bits)]\npub comptime fn modulus_num_bits() -> u64 {}\n\n#[builtin(modulus_be_bits)]\npub comptime fn modulus_be_bits() -> [u1] {}\n\n#[builtin(modulus_le_bits)]\npub comptime fn modulus_le_bits() -> [u1] {}\n\n#[builtin(modulus_be_bytes)]\npub comptime fn modulus_be_bytes() -> [u8] {}\n\n#[builtin(modulus_le_bytes)]\npub comptime fn modulus_le_bytes() -> [u8] {}\n\n/// An unconstrained only built in to efficiently compare fields.\n#[builtin(field_less_than)]\nunconstrained fn __field_less_than(x: Field, y: Field) -> bool {}\n\npub(crate) unconstrained fn field_less_than(x: Field, y: Field) -> bool {\n __field_less_than(x, y)\n}\n\n// Convert a 32 byte array to a field element by modding\npub fn bytes32_to_field(bytes32: [u8; 32]) -> Field {\n // Convert it to a field element\n let mut v = 1;\n let mut high = 0 as Field;\n let mut low = 0 as Field;\n\n for i in 0..16 {\n high = high + (bytes32[15 - i] as Field) * v;\n low = low + (bytes32[16 + 15 - i] as Field) * v;\n v = v * 256;\n }\n // Abuse that a % p + b % p = (a + b) % p and that low < p\n low + high * v\n}\n\nfn lt_fallback(x: Field, y: Field) -> bool {\n if is_unconstrained() {\n // Safety: unconstrained context\n unsafe {\n field_less_than(x, y)\n }\n } else {\n let x_bytes: [u8; 32] = x.to_le_bytes();\n let y_bytes: [u8; 32] = y.to_le_bytes();\n let mut x_is_lt = false;\n let mut done = false;\n for i in 0..32 {\n if (!done) {\n let x_byte = x_bytes[32 - 1 - i] as u8;\n let y_byte = y_bytes[32 - 1 - i] as u8;\n let bytes_match = x_byte == y_byte;\n if !bytes_match {\n x_is_lt = x_byte < y_byte;\n done = true;\n }\n }\n }\n x_is_lt\n }\n}\n\nmod tests {\n use crate::{panic::panic, runtime};\n use super::field_less_than;\n\n #[test]\n // docs:start:to_be_bits_example\n fn test_to_be_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_be_bits();\n assert_eq(bits, [0, 0, 0, 0, 0, 0, 1, 0]);\n }\n // docs:end:to_be_bits_example\n\n #[test]\n // docs:start:to_le_bits_example\n fn test_to_le_bits() {\n let field = 2;\n let bits: [u1; 8] = field.to_le_bits();\n assert_eq(bits, [0, 1, 0, 0, 0, 0, 0, 0]);\n }\n // docs:end:to_le_bits_example\n\n #[test]\n // docs:start:to_be_bytes_example\n fn test_to_be_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_be_bytes();\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 0, 2]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_bytes_example\n\n #[test]\n // docs:start:to_le_bytes_example\n fn test_to_le_bytes() {\n let field = 2;\n let bytes: [u8; 8] = field.to_le_bytes();\n assert_eq(bytes, [2, 0, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_bytes_example\n\n #[test]\n // docs:start:to_be_radix_example\n fn test_to_be_radix() {\n // 259, in base 256, big endian, is [1, 3].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_be_radix(256);\n assert_eq(bytes, [0, 0, 0, 0, 0, 0, 1, 3]);\n assert_eq(Field::from_be_bytes::<8>(bytes), field);\n }\n // docs:end:to_be_radix_example\n\n #[test]\n // docs:start:to_le_radix_example\n fn test_to_le_radix() {\n // 259, in base 256, little endian, is [3, 1].\n // i.e. 3 * 256^0 + 1 * 256^1\n let field = 259;\n\n // The radix (in this example, 256) must be a power of 2.\n // The length of the returned byte array can be specified to be\n // >= the amount of space needed.\n let bytes: [u8; 8] = field.to_le_radix(256);\n assert_eq(bytes, [3, 1, 0, 0, 0, 0, 0, 0]);\n assert_eq(Field::from_le_bytes::<8>(bytes), field);\n }\n // docs:end:to_le_radix_example\n\n #[test(should_fail_with = \"radix must be greater than 1\")]\n fn test_to_le_radix_1() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(1);\n } else {\n panic(f\"radix must be greater than 1\");\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be greater than 2\n //#[test]\n //fn test_to_le_radix_brillig_1() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(1);\n // crate::println(out);\n // let expected = [0; 8];\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test(should_fail_with = \"radix must be a power of 2\")]\n fn test_to_le_radix_3() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(3);\n } else {\n panic(f\"radix must be a power of 2\");\n }\n }\n\n #[test]\n fn test_to_le_radix_brillig_3() {\n // this test should only fail in constrained mode\n if runtime::is_unconstrained() {\n let field = 1;\n let out: [u8; 8] = field.to_le_radix(3);\n let mut expected = [0; 8];\n expected[0] = 1;\n assert(out == expected, \"unexpected result\");\n }\n }\n\n #[test(should_fail_with = \"radix must be less than or equal to 256\")]\n fn test_to_le_radix_512() {\n // this test should only fail in constrained mode\n if !runtime::is_unconstrained() {\n let field = 2;\n let _: [u8; 8] = field.to_le_radix(512);\n } else {\n panic(f\"radix must be less than or equal to 256\")\n }\n }\n\n // TODO: Update this test to account for the Brillig restriction that the radix must be less than 512\n //#[test]\n //fn test_to_le_radix_brillig_512() {\n // // this test should only fail in constrained mode\n // if runtime::is_unconstrained() {\n // let field = 1;\n // let out: [u8; 8] = field.to_le_radix(512);\n // let mut expected = [0; 8];\n // expected[0] = 1;\n // assert(out == expected, \"unexpected result\");\n // }\n //}\n\n #[test]\n unconstrained fn test_field_less_than() {\n assert(field_less_than(0, 1));\n assert(field_less_than(0, 0x100));\n assert(field_less_than(0x100, 0 - 1));\n assert(!field_less_than(0 - 1, 0));\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 4b688be083c..20dca92c586 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -138,14 +138,18 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "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", - "debug_symbols": "ndndauMwEIbhe/FxDqTRz0i9lWUpaeuWQEhKmi4spfe+9rZ2gzU4vDkJUciDsD9bP6OP7ql/eH+53x2ej2/d3a+Pbn983J53x8PQ+vjcdA+n3X6/e7m//Llz40fR//9/e90exubbeXs6d3cicdP1h6fxWxr8827fd3fJff7edKVgUamoDgv7OmKYRIwL4Z3ZSXTlm0QpDfGcCCeBk8hJMkmeibqGZE6Uk8JJxcQ7TjwnwkngJHLC0/c8fc/T9zx9b6cfZSZ+ScRx4jkRTgInkZPESeZEOSmc8PSDmX6SabJIkhviORFOAieRk8RJ5kQ5KZxUTCJPP/L0I08/8vSj/e6XNBNtSOIkc6KcFE4qJslx4jkRTgInPP1kv/s6E20WiilzopwUTiom2XHiORFOAieRE55+5ulnnn7m6Wc7/ehnUpdEHSeeE+EkcBI5SZxkTpSTwglPv5jpZzdNr9k302vxnAgn4QqRZstTzFyyTgWSXJpyh11TydFNJDW9VPMZUz/txbStKtRkk7BCMifKSeHEfMZ03lloCgsidk1pnXhOhBPzGdM8DbCq0pDISeLELg7m6VokL98XsUs368RzIpwETiIniZPMiXJSOOHpC09fePpyLf3iGxI4iZwkTsz0g6vfJEjzVtqlm3VSOKmY2KUbqWvEcyKcBE7M9EOaZuSQm2HcLt2sk8yJcmKnH9dIxcQu3awTz4mZfpgXV6GUhgROIieJk8yJYmLv91fnfXu/v04qJvZOfFg/TvuEYV14MV5+mWSbmqch1l0W4r6M3tCPPV0699OPD0tTubF3vVeMPWY6rz/3IC2N3GDCDSZev57LfDbtI6Pzqr8sk9Qb0rd3yVeMQvM5NP5sT7vtw77/PtZ/fj88Xpzyn/++9osD/9fT8bF/ej/149H/z6n/eNfVbYr7PR6eDg0ZxnZJaWyOyUsZmkWGPod+/wE=", + "bytecode": "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", + "debug_symbols": "ndrdbuIwEIbhe8kxB/b4Z+zeyqqqaEsrJAQVpSutqt77Jt0mIDwb9OakqhEPJv5IbI/82T1vHj9eH7b7l8N7d/frs9sdntan7WHftz6/Vt3jcbvbbV8fLl/u3PCn6Pf739/W+6H5flofT92dSFx1m/3z8F/q/ct2t+nukvu6X3WlYFGpqA4L+zpiGEWMV8I7s5Poyg+JUhriORFOAieRk8RJ5kQ5KZxUTDxP3/P0PU/f2+nniahrSOQkcZI5UU4KJxUTcZx4ToQTnr7w9IWnLzx9sdOPMhHfkMJJxSQ4TjwnwkngJHKSOMmc8PQDTz/w9CNPP/L0I08/8vQjTz/y9KOZfpJxcZUkN0Q5KZxUTJLjxHMinAROIieJE55+4uknnn7i6Wf73i9pItoQz4lwEjiJnCROMifKSeGkYqI8fbXvfZ2INgt4FU4CJ5GTxEnmRDkpnFRMiuOEp194+oWnX3j6xU4/+onUhmROlJPCScXELinNE8+JcBI4iZzw9KuZfnbj9Jp9M73aVbh5UjipN4hcb0XFrsJlHQuKucSG2Jcf3UhS04tdU1I/7pG1qfaIXVNSH2aIcBI4iZyYvzGddhaaQkMyJ8pJ4cT8jWkeH7Cqck3smtI88ZyYgyx5vBbJuSGZE+WkcFIxsUs388RzIpwETiInPP3A0w88/XAr/eIbUjGJjhPPiZl+cPWHBGnuSrt0M08iJ4kTO/06R5STwknFxC7dhDTOyCE3j3G7dDNPhJPAiZ1+nCOJk8yJcmKmH6bFVSjNUsEu3cwSu3QzTzwnwknAxN5Wz8779rZ6nhROzFz6df24T+jX6xfPy29j76tvGL/AyAITFpi4wKQFJi8wC/Kp/xm3mscp0F0WSv+ZBWNgbzHFuXM/PlybvMDoAmNPUM7reQzStanYBPtMyQ3jb1/PZT6r9pbWaVdW8vWn8/SDCwtMhOarb/xeH7frx93m55jSy8f+6eLU0unP2+bqANPb8fC0ef44boajTOdTTMP3Vbcq7n44DNI3+hXqStQPzWF0g9NVv0zq++z7/Qs=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_0.snap index 4b688be083c..20dca92c586 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_0.snap @@ -138,14 +138,18 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "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", - "debug_symbols": "ndndauMwEIbhe/FxDqTRz0i9lWUpaeuWQEhKmi4spfe+9rZ2gzU4vDkJUciDsD9bP6OP7ql/eH+53x2ej2/d3a+Pbn983J53x8PQ+vjcdA+n3X6/e7m//Llz40fR//9/e90exubbeXs6d3cicdP1h6fxWxr8827fd3fJff7edKVgUamoDgv7OmKYRIwL4Z3ZSXTlm0QpDfGcCCeBk8hJMkmeibqGZE6Uk8JJxcQ7TjwnwkngJHLC0/c8fc/T9zx9b6cfZSZ+ScRx4jkRTgInkZPESeZEOSmc8PSDmX6SabJIkhviORFOAieRk8RJ5kQ5KZxUTCJPP/L0I08/8vSj/e6XNBNtSOIkc6KcFE4qJslx4jkRTgInPP1kv/s6E20WiilzopwUTiom2XHiORFOAieRE55+5ulnnn7m6Wc7/ehnUpdEHSeeE+EkcBI5SZxkTpSTwglPv5jpZzdNr9k302vxnAgn4QqRZstTzFyyTgWSXJpyh11TydFNJDW9VPMZUz/txbStKtRkk7BCMifKSeHEfMZ03lloCgsidk1pnXhOhBPzGdM8DbCq0pDISeLELg7m6VokL98XsUs368RzIpwETiIniZPMiXJSOOHpC09fePpyLf3iGxI4iZwkTsz0g6vfJEjzVtqlm3VSOKmY2KUbqWvEcyKcBE7M9EOaZuSQm2HcLt2sk8yJcmKnH9dIxcQu3awTz4mZfpgXV6GUhgROIieJk8yJYmLv91fnfXu/v04qJvZOfFg/TvuEYV14MV5+mWSbmqch1l0W4r6M3tCPPV0699OPD0tTubF3vVeMPWY6rz/3IC2N3GDCDSZev57LfDbtI6Pzqr8sk9Qb0rd3yVeMQvM5NP5sT7vtw77/PtZ/fj88Xpzyn/++9osD/9fT8bF/ej/149H/z6n/eNfVbYr7PR6eDg0ZxnZJaWyOyUsZmkWGPod+/wE=", + "bytecode": "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", + "debug_symbols": "ndrdbuIwEIbhe8kxB/b4Z+zeyqqqaEsrJAQVpSutqt77Jt0mIDwb9OakqhEPJv5IbI/82T1vHj9eH7b7l8N7d/frs9sdntan7WHftz6/Vt3jcbvbbV8fLl/u3PCn6Pf739/W+6H5flofT92dSFx1m/3z8F/q/ct2t+nukvu6X3WlYFGpqA4L+zpiGEWMV8I7s5Poyg+JUhriORFOAieRk8RJ5kQ5KZxUTDxP3/P0PU/f2+nniahrSOQkcZI5UU4KJxUTcZx4ToQTnr7w9IWnLzx9sdOPMhHfkMJJxSQ4TjwnwkngJHKSOMmc8PQDTz/w9CNPP/L0I08/8vQjTz/y9KOZfpJxcZUkN0Q5KZxUTJLjxHMinAROIieJE55+4uknnn7i6Wf73i9pItoQz4lwEjiJnCROMifKSeGkYqI8fbXvfZ2INgt4FU4CJ5GTxEnmRDkpnFRMiuOEp194+oWnX3j6xU4/+onUhmROlJPCScXELinNE8+JcBI4iZzw9KuZfnbj9Jp9M73aVbh5UjipN4hcb0XFrsJlHQuKucSG2Jcf3UhS04tdU1I/7pG1qfaIXVNSH2aIcBI4iZyYvzGddhaaQkMyJ8pJ4cT8jWkeH7Cqck3smtI88ZyYgyx5vBbJuSGZE+WkcFIxsUs388RzIpwETiInPP3A0w88/XAr/eIbUjGJjhPPiZl+cPWHBGnuSrt0M08iJ4kTO/06R5STwknFxC7dhDTOyCE3j3G7dDNPhJPAiZ1+nCOJk8yJcmKmH6bFVSjNUsEu3cwSu3QzTzwnwknAxN5Wz8779rZ6nhROzFz6df24T+jX6xfPy29j76tvGL/AyAITFpi4wKQFJi8wC/Kp/xm3mscp0F0WSv+ZBWNgbzHFuXM/PlybvMDoAmNPUM7reQzStanYBPtMyQ3jb1/PZT6r9pbWaVdW8vWn8/SDCwtMhOarb/xeH7frx93m55jSy8f+6eLU0unP2+bqANPb8fC0ef44boajTOdTTMP3Vbcq7n44DNI3+hXqStQPzWF0g9NVv0zq++z7/Qs=", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 4e7e20d3377..df7194fea81 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/tuple_inputs/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -138,14 +138,18 @@ expression: artifact "error_kind": "string", "string": "attempt to add with overflow" }, + "12049594436772143978": { + "error_kind": "string", + "string": "array ref-count underflow detected" + }, "17843811134343075018": { "error_kind": "string", "string": "Stack too deep" } } }, - "bytecode": "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", - "debug_symbols": "tdrRbuIwEAXQf8kzD57x2GP3V1ZVRVtaISGoKF1pVfXfl7AkoGTW1a3xS9WgnItgkjGZ5LN7Xj1+vD6sty+79+7u12e32T0tD+vd9rj1+bXoHvfrzWb9+nD9cuf6P8mf9n9/W277zffDcn/o7phl0a22z/1/4ehf1ptVdxfc1/2iSwKLAIuIimwL8YMQmYpsCXHpLITTRJBzOCGcME48TswyShyJuhkJOIk4UZwknGSYkMMJ4YRx4nGCV5/w6hNefcKrT3b1hUdC12Qx21VjOO+qyrP03DKdXdN0apoulemUlc77Uk5XO/+L1+r4HIfu7zhO47Gj5kQyTLzDiVm0wMNKFq4/ypkwTjxOBCcBJxEnipOEkwwTcTjBqy949QWvvuDVF3vFSGEkWtF+JDZN15bpwVWml1tn8NXxpdYZBIo/kYCTiBO7EehIdPYzOCScZJhEhxPCCePE40RwEnAScYJXP+LVj3j1Fa++2tUXGkmuaD/KTdN90/RYmV5unZqr40utMzko/kQIJ4wTs2jRDct7pNnybg+CyiTgJH5DeHZBmMwaRh2mRzFNZ0GU7Y8vbiBh9i7ZbDdKw5WqzmcuOdnEF0hGCdtTqjIhnJjHmI5XNhr8jHicCE4CTsxjrNSG2J5SlUmCCXHLZsdU26mPx9ql2ZGfxkvb+NA2PlbHk15WgjCN17bxqW18vul3f71MGr8HdOxDabKgMruu4XrNTG3juW187QV4uX1w7RV4+QRkbRuf2sbn6vjSCehd23hqG883/e5/3j5800kJe2kbH9rG195YKbcPX3tnpXwCimsbT23juTq+dALaA+DbxUvb+HDT7/7n7eM/M+gb3aNi0bbxqWl8MM8QjkM8x+nFPgfGiceJ4CTgJOJEcZJwkmFiz6/LBK9+xKsf8erH76qfaEYCTiJOFCdm9b3LZ+J5NlKw59dFYs+vy4RwYlc/l4jHieAk4MSsvg/DONHH2QxKFScJJxkm9sjaS4kQThgnHidm9f04GfZpNue0R9ZlEnGiOEk4yRj5Om79Xu7Xy8fN6vwk6cvH9unqwdLDn7fV5BnTt/3uafX8sV/1T5teHjTti6Vukdx9//TdcYMzLzhrv0mnzbTwzh3f8/i+fwE=", + "bytecode": "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", + "debug_symbols": "tdvRbuIwEAXQf8kzD/aMPTPur6xWFW1phYSgonSlVdV/38ASiojl6jaZl6pBOReJcewwJh/d0+rh/eV+vX3evXV3vz66ze5xeVjvtv3Rx+eie9ivN5v1y/31y104/jE+nf/2utweD98Oy/2huyNKi261fTr+l3v/vN6surscPn8vOkuwyLAQVJS6SDyIlG5FqYkU7CwS2Y2IIeAk4oRwwjhJOMk4EZwoTgwnePUjXv2IVz/Wqy8XomFEGCcJJxknghPFieGkwIQCTiJO8OoTXn3Cq0949ale/UQXEq/JYnSqSj6fqkqjdHVNN9f04pnOYWJ6LBrP58ZiVyf/j4++8eQbz77xyTc++8aLb7y6xiffcZ+mj5wiw91oILmNx0bOiWScCE4UJ4aTApMccBJxQjhhnODVz9XqZxq+8eTrIXYmghPFieGkwEQCTiJOCCeMk4QTvPqCV1/w6gtefalf+5YvRCfcDmlwTY+u6TQxvb2kKfvGJ9/47BsvvvHqG2++8cU13nzHvU0fOa1bOcNGzokoTgwn9WVWL0RH7agScBJxQjhhnCScZJwIThQnhhO4+hQCTiJOCCf16qd4IeXnyy7Ve+OzpWfXdJmY3pw6qd6dny/efOOLa3x9h2C++OgbT77x7BvvO+7j9JHTuGUgwkbOiUScEE6qVZMwfJ2TKCOScJJxIt8QCiNSraHosKssdrtHTPV2saQwkDx6l3qXU+OwU6KjPT9iqxNukAKTen+0TSJOqmNML50szTwijJOEk4yT6hhrLr/1bmmbGEyy71Sdp07V/Y3j12QX+TY++cZn33iZHB/1ayXIt/HqG2++8WXWz/56mazcB+tlHrLbBVWC63ot0TeefONdO2ckUztn7QtQ1DfefOPL5PjWBTi52/1NfPSNp1k/+59PHzN0xlsX4Ayd8WZ89o2f+uOY9vShU38d074ALfjGR994mhzfugCNfeOTb3ye9bP/+fRh039I07oATX3jzTW+vj/Q3/MMREZf9uv7A23COEk4yTgRnChODCcFJVzfH2iTiBPCCePku+pbHJGME8GJ4qRafQ7lTJhoRApM6u3uNok4qVe/tAjjJOEk46Rafc5DO5GFR0RxYjgpMKm3rDm1SMQJ4YRxUq0+XzrDbDYiGSeCE8WJ4aRg5LM/+rPcr5cPm9X5CbPn9+3j1QNnh7+vq5tnz173u8fV0/t+dXwK7esBtGOxNCws/D4+ldMfMNOCWY+Hx+HCfdODE/fv2b/vPw==", "file_map": { "5": { "source": "use crate::meta::derive_via;\n\n#[derive_via(derive_eq)]\n// docs:start:eq-trait\npub trait Eq {\n fn eq(self, other: Self) -> bool;\n}\n// docs:end:eq-trait\n\n// docs:start:derive_eq\ncomptime fn derive_eq(s: TypeDefinition) -> Quoted {\n let signature = quote { fn eq(_self: Self, _other: Self) -> bool };\n let for_each_field = |name| quote { (_self.$name == _other.$name) };\n let body = |fields| {\n if s.fields_as_written().len() == 0 {\n quote { true }\n } else {\n fields\n }\n };\n crate::meta::make_trait_impl(\n s,\n quote { Eq },\n signature,\n for_each_field,\n quote { & },\n body,\n )\n}\n// docs:end:derive_eq\n\nimpl Eq for Field {\n fn eq(self, other: Field) -> bool {\n self == other\n }\n}\n\nimpl Eq for u128 {\n fn eq(self, other: u128) -> bool {\n self == other\n }\n}\nimpl Eq for u64 {\n fn eq(self, other: u64) -> bool {\n self == other\n }\n}\nimpl Eq for u32 {\n fn eq(self, other: u32) -> bool {\n self == other\n }\n}\nimpl Eq for u16 {\n fn eq(self, other: u16) -> bool {\n self == other\n }\n}\nimpl Eq for u8 {\n fn eq(self, other: u8) -> bool {\n self == other\n }\n}\nimpl Eq for u1 {\n fn eq(self, other: u1) -> bool {\n self == other\n }\n}\n\nimpl Eq for i8 {\n fn eq(self, other: i8) -> bool {\n self == other\n }\n}\nimpl Eq for i16 {\n fn eq(self, other: i16) -> bool {\n self == other\n }\n}\nimpl Eq for i32 {\n fn eq(self, other: i32) -> bool {\n self == other\n }\n}\nimpl Eq for i64 {\n fn eq(self, other: i64) -> bool {\n self == other\n }\n}\n\nimpl Eq for () {\n fn eq(_self: Self, _other: ()) -> bool {\n true\n }\n}\nimpl Eq for bool {\n fn eq(self, other: bool) -> bool {\n self == other\n }\n}\n\nimpl Eq for [T; N]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T; N]) -> bool {\n let mut result = true;\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for [T]\nwhere\n T: Eq,\n{\n fn eq(self, other: [T]) -> bool {\n let mut result = self.len() == other.len();\n for i in 0..self.len() {\n result &= self[i].eq(other[i]);\n }\n result\n }\n}\n\nimpl Eq for str {\n fn eq(self, other: str) -> bool {\n let self_bytes = self.as_bytes();\n let other_bytes = other.as_bytes();\n self_bytes == other_bytes\n }\n}\n\nimpl Eq for (A, B)\nwhere\n A: Eq,\n B: Eq,\n{\n fn eq(self, other: (A, B)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1)\n }\n}\n\nimpl Eq for (A, B, C)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n{\n fn eq(self, other: (A, B, C)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2)\n }\n}\n\nimpl Eq for (A, B, C, D)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n{\n fn eq(self, other: (A, B, C, D)) -> bool {\n self.0.eq(other.0) & self.1.eq(other.1) & self.2.eq(other.2) & self.3.eq(other.3)\n }\n}\n\nimpl Eq for (A, B, C, D, E)\nwhere\n A: Eq,\n B: Eq,\n C: Eq,\n D: Eq,\n E: Eq,\n{\n fn eq(self, other: (A, B, C, D, E)) -> bool {\n self.0.eq(other.0)\n & self.1.eq(other.1)\n & self.2.eq(other.2)\n & self.3.eq(other.3)\n & self.4.eq(other.4)\n }\n}\n\nimpl Eq for Ordering {\n fn eq(self, other: Ordering) -> bool {\n self.result == other.result\n }\n}\n\n// Noir doesn't have enums yet so we emulate (Lt | Eq | Gt) with a struct\n// that has 3 public functions for constructing the struct.\npub struct Ordering {\n result: Field,\n}\n\nimpl Ordering {\n // Implementation note: 0, 1, and 2 for Lt, Eq, and Gt are built\n // into the compiler, do not change these without also updating\n // the compiler itself!\n pub fn less() -> Ordering {\n Ordering { result: 0 }\n }\n\n pub fn equal() -> Ordering {\n Ordering { result: 1 }\n }\n\n pub fn greater() -> Ordering {\n Ordering { result: 2 }\n }\n}\n\n#[derive_via(derive_ord)]\n// docs:start:ord-trait\npub trait Ord {\n fn cmp(self, other: Self) -> Ordering;\n}\n// docs:end:ord-trait\n\n// docs:start:derive_ord\ncomptime fn derive_ord(s: TypeDefinition) -> Quoted {\n let signature = quote { fn cmp(_self: Self, _other: Self) -> std::cmp::Ordering };\n let for_each_field = |name| quote {\n if result == std::cmp::Ordering::equal() {\n result = _self.$name.cmp(_other.$name);\n }\n };\n let body = |fields| quote {\n let mut result = std::cmp::Ordering::equal();\n $fields\n result\n };\n crate::meta::make_trait_impl(s, quote { Ord }, signature, for_each_field, quote {}, body)\n}\n// docs:end:derive_ord\n\n// Note: Field deliberately does not implement Ord\n\nimpl Ord for u128 {\n fn cmp(self, other: u128) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\nimpl Ord for u64 {\n fn cmp(self, other: u64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u32 {\n fn cmp(self, other: u32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u16 {\n fn cmp(self, other: u16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for u8 {\n fn cmp(self, other: u8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i8 {\n fn cmp(self, other: i8) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i16 {\n fn cmp(self, other: i16) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i32 {\n fn cmp(self, other: i32) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for i64 {\n fn cmp(self, other: i64) -> Ordering {\n if self < other {\n Ordering::less()\n } else if self > other {\n Ordering::greater()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for () {\n fn cmp(_self: Self, _other: ()) -> Ordering {\n Ordering::equal()\n }\n}\n\nimpl Ord for bool {\n fn cmp(self, other: bool) -> Ordering {\n if self {\n if other {\n Ordering::equal()\n } else {\n Ordering::greater()\n }\n } else if other {\n Ordering::less()\n } else {\n Ordering::equal()\n }\n }\n}\n\nimpl Ord for [T; N]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T; N]) -> Ordering {\n let mut result = Ordering::equal();\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for [T]\nwhere\n T: Ord,\n{\n // The first non-equal element of both arrays determines\n // the ordering for the whole array.\n fn cmp(self, other: [T]) -> Ordering {\n let mut result = self.len().cmp(other.len());\n for i in 0..self.len() {\n if result == Ordering::equal() {\n result = self[i].cmp(other[i]);\n }\n }\n result\n }\n}\n\nimpl Ord for (A, B)\nwhere\n A: Ord,\n B: Ord,\n{\n fn cmp(self, other: (A, B)) -> Ordering {\n let result = self.0.cmp(other.0);\n\n if result != Ordering::equal() {\n result\n } else {\n self.1.cmp(other.1)\n }\n }\n}\n\nimpl Ord for (A, B, C)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n{\n fn cmp(self, other: (A, B, C)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n{\n fn cmp(self, other: (A, B, C, D)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n result\n }\n}\n\nimpl Ord for (A, B, C, D, E)\nwhere\n A: Ord,\n B: Ord,\n C: Ord,\n D: Ord,\n E: Ord,\n{\n fn cmp(self, other: (A, B, C, D, E)) -> Ordering {\n let mut result = self.0.cmp(other.0);\n\n if result == Ordering::equal() {\n result = self.1.cmp(other.1);\n }\n\n if result == Ordering::equal() {\n result = self.2.cmp(other.2);\n }\n\n if result == Ordering::equal() {\n result = self.3.cmp(other.3);\n }\n\n if result == Ordering::equal() {\n result = self.4.cmp(other.4);\n }\n\n result\n }\n}\n\n// Compares and returns the maximum of two values.\n//\n// Returns the second argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::max(1, 2), 2);\n// assert_eq(cmp::max(2, 2), 2);\n// ```\npub fn max(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v1\n } else {\n v2\n }\n}\n\n// Compares and returns the minimum of two values.\n//\n// Returns the first argument if the comparison determines them to be equal.\n//\n// # Examples\n//\n// ```\n// use std::cmp;\n//\n// assert_eq(cmp::min(1, 2), 1);\n// assert_eq(cmp::min(2, 2), 2);\n// ```\npub fn min(v1: T, v2: T) -> T\nwhere\n T: Ord,\n{\n if v1 > v2 {\n v2\n } else {\n v1\n }\n}\n\nmod cmp_tests {\n use crate::cmp::{max, min};\n\n #[test]\n fn sanity_check_min() {\n assert_eq(min(0 as u64, 1 as u64), 0);\n assert_eq(min(0 as u64, 0 as u64), 0);\n assert_eq(min(1 as u64, 1 as u64), 1);\n assert_eq(min(255 as u8, 0 as u8), 0);\n }\n\n #[test]\n fn sanity_check_max() {\n assert_eq(max(0 as u64, 1 as u64), 1);\n assert_eq(max(0 as u64, 0 as u64), 0);\n assert_eq(max(1 as u64, 1 as u64), 1);\n assert_eq(max(255 as u8, 0 as u8), 255);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap index 348bf54c6bf..29a13d6cb67 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_-9223372036854775808.snap @@ -231,8 +231,8 @@ expression: artifact } } }, - "bytecode": "H4sIAAAAAAAA/+29DZBt2VUeds7tn/f673W/n5nRjKQyUrAKY0Fu/3enynFX6b1BI40kZElohKQR/Tua/zeSZiTNaGaOZp6kAWyCcQgYcKiCuByDRawYJzhgR4aAnYIQJwGjmGKCgVTZQJmgGEigoKwz76x7vvvd7+x7Tt+1+95+fXdVV99z9j5rr7322muvvfbaa6fJzTT3lb+0+D1Z/E/h/3zSnSxvp/jfHiwtO8Jqx8IxPQU4tk4BjhOnAMfJU4Dj1CnAcfoU4HjuFOB4/hTgOHMKcJw9BTjORcDxlYSTeI50PlnkwjgXdrkwyQdrPhhyZss7MyfWXFKdrOGPvfbm/5niuQX5jsJ+eYbq9YS/1d7emBHtc8R/dQboHgH+/gzAjAC/fa6A821ZCZ/bYnyQJrH6aWs3cjv3F6htCbTF6p6MU/dBSvUl1M6E6p9NovLUckr1GT5MH/u9YGWyEp+U8iaz3nZY3lTW3Y485fLoDijHvNWCcq+H3w8Vv+Py4025EbEP2pcDbbZ357Kkk4xuE/DO6Gp0Po/lKW8G8iaz7npmi+dJqAdhGR5TVP51xfNi8X8avrHvl0T901R/F97iHdNlRpSfEeXzue+u4nc+59lc8KashOfYp5255moc+KsG/xrAT/zgtw3+3XHw78D/BoA/GQH+mwv4MWhzD+DuCL+jB70lDu078N/qT5sO7Hvj4L5i8N/mj3sH9tv9YXfG6zvi0GXN4H9jHPjrBv+d/rTpwP4r/rA7cvhd/rA3Dfa7/WHvGez3+MPeN9jf5A/7wGC/1x328qHBvq+AbTqTD/yVjlx/Xxz4Hfnyze60Wdk12O+Pg3uHZz4QB36nbz8YBf5qZ166Pw78Dv0/FAX+Wgf/b4kDvyODd+PA3zb4ewX8xA92R1bu+8PuyLODOHTp8P2hP+5HBvsoCu7rHfgPRIG/0eH5D8eB35HHD8aB39H5HooDv6PzPRwHfkcmPBIHfkc3ezQO/I5+9lgc+FsG//E48Dsy83oc+B25+UQc+B2d4SMF/CQC7I/Gwb0j9z/mj3sH9pNxcO/MKU/Fgd+R+x+PAn+zo4d/IvOmfQn7k/6wO/PV03Ho0pmvnokDvzNffcqfNh3Yz8bBvTMXPhcHfmcufD4O/M5cmGXutO/A/nQc3Dvz7Atx4HfmwRfjwO/MgzfiwO/I+89kiXPfbnX69rP+sDv9+jl/2B3d6SV/2J21+LcK2Mtbqysrm6vbm+3trYP28trB/srWysrB3lp7v727v3K4vba8fbS2sra6f7C/t7W2tbt81D7a3d8+2noF+CvOG/ne4xeSbl6ZKKvq7J+m8M5s+YuJ3ktEWJN9YN1LsPB7+zbyPva67dNOJb3J8qah7hblnSO87DenCXrGNuX98N8DXC6Hv+v00dXs5n+PPnoHwTrLffRX0xIul8PfdfrI9jc8+uhNBGsIfbRlOE0HcMX6DdcpyJs+GVw3FgSulhTPMD+dJ7wwD32/sG2c+vHaF1olXC5nKbI/x+pC0svLCbUX+ygVOIbai/4wH5go4XK5W7G9j06WcLkctzeN094V5T+m8Ai1KYU2/eEt2KZ3TN16bdqYvvXa9N+c698m9JeazPzbtfkV3drqM1+1qUTLk0nIx/L/XfE8S/ib7Nk5Jp5Hm19ZAazuHu2u7x4crO3vXiL4eWoBnXBtYLyAOpYjL2zynIupLi8Ybjne14tODvECy3qc15Wsn6E8nNutrxaTXjqx/sW66E7x3B4wpdQG83vkOg23VtKry9jvpGgfvvu54n/+/PRM+Q3CTKBOfGd8tZT00tXKKZ0srfhv9fA7rof5FeuZcKxH6dvMQx71IN2Q/6r6HddL5v/I/fpLxf/8+dmiX2dEHZ5rBdajMSk9mnlklvDCvDnI476Yh7yU8hYgj31zMSnZY3TK25PVkD2htY/lqTWG5c2INlqbjDbIB3hexOw3U1T+t6ANX1u8ND6YI1x2iuf2YGmf+wWT6pcpyrsAeSy7F0WbLW8JvlNj0ZLqa6NFXt/XzZZwuRy3A/tsgfKQn61NU/Td70O9z812fz8l6ra+Yz7aKZ7bA6XV5ToyDOufTaLKlGWWg4YP04fX8jMC16Wkd9ywP9GMqGdG1KNgPekI6xlHWA87wnraEdazjrA82/iQI6z7HGG96AjreUdYDzjCesIR1nOOsDz564YjLE/++rAjLE/ae8oJT3o96gjrKUdYo0ovT/l1Fmh/wxGWZz8+4gjLk/aeuoknvTx54jFHWJ5zmie9PHVfT93ko46wRpX21x1hebbxBUdYdkbI4Nn60NbmaCeapTwr+1h68/8MwU8T1/X4Gtu/rA6sez5S3SnVZ7TGd1i/sscZ3rMib5B9j4P1teW1o+31vYOj1cODzaOU4Buu/A77Nk26bTwhu4LR+kIcWrdV3Aq0J+VpEvLmKW8K8gxHjFsxQzC98a9Df6x/SZTHM9lN+nJJ1MP9PAis2WPCupR0jwGUEzMCz1vVFp8KHPr5UXy6hg1W+VixvZ3tkpin9ndSekZ7O+LM+y5W/tm0bMPtBaFmCLdh9zXbSrGv2RY/J9rs0de4r9vE3o59NkN52Ic8Zg0W+55Zupbd/D9F5b8d+vPOghhV++iR9oCD/VuX3oZb0330pnvlym/TeGgx6aWTwTAaxtnXKPfRrQ04rs8LOrWS3nGDOiTv43w/8Anvo6P/w4R4x3PPlMBH+VKkFf+tHn7H9WA/nPT+dmiP67j1qH3XUL+jTwLLcyv/d6Ffn53pxl3NBznMH02767Z6phI9l7yJ6rby/1WrhPljBUw1d1k/hvxUFpPqvphJeumX/+0Uz+2B0vq6ko9+8Ne2lOxwhH/Ac6jVgbRjfcmn7pWNOmMB659NeuVWjP3YWcKH6cM6xpzAdUnkMQ/OiXrmRD0K1jknWHliO9IgsJ5xhPWYEyw1fkaFXh93hHWfI6wnHGE97AjrSUdYjzrCetYRlhff58mTJz7qCOs5R1ieMsezHz1p/2FHWJ7j0bONH3SE9X5HWJ5t9JQ5TznCGlW+f9ER1lmY0244wuJ4c6a/4joT19Lsp2vl7ywqiWtLWpG2pDTprjvSWmYrpfqM3vgO61f2SfY7xbxB9pM2tlaPNpa3dnePVjePlo9WU4JvuPI73mdQvKTWRXH37lbW1X7SHNA1T5OQN0t5U5BnOKr9pDg+5CvrdeiP9S+J8hifuElfLiWat44Dy/aAlI1xmHZjtS/A+zzYft4fQj5nP/xB9gXQTt1kX6CpnZr3bd7QKutlP/xU1G19h/LLcT+1th++vZtNeukdw+4zQfgwfdjuo/Zb2C6cJ/bDV7ERJkU9CtaTjrCecYT1sCOspx1hPesIy7ONDznCus8R1ouOsJ53hPWAI6wnHGE95wjLk79uOMLy5K8PO8LypL2nnPCk16OOsJ5yhDWq9PKUX2eB9jccYXn24yOOsDxp76mbeNLLkycec4TlOad50stT9/XUTT7qCGtUaX/dEZZnG19whMV++LY+VH74U5RnZX+Y7KaTBG+neG4PlEo/fBXHJK4dp74ffpWvGOI9K/ImB8C1yg+/rs+blVfn+1NRPvJ5C+mHjzEo8jQJeecobwryDEdlN40Uv6Fdh/5Y/5Ioz374Tf0XVYxFD1hTx4RlNljlF5fbMUfNP5vHsbJDK78q9q2MFRcHfbezGr7EadIrO62/ED7bkSdEnehfOfbBHvtg47svgg1/7IPdXQ/y0Gnzwf5F6NfXnMyZmm3l82tJyWXmEZTL3K8ol7kvUC6zzMazh7FlduTzaSNPX8XrlhR9jU5NY8W1RBuP68ef0jOOM5QlVT4o/wbG2Z+jcRZpXm3MB7y/iHzAe9Tzos0hPqjb1x571DxXYx9am3iP+g/EHvWMaEP+t1M8twdKm1sqnq/VFXfNfdMHBOtLEr3utfpnk6gyq7MHrmweSB/mUTWOl5Le+e9bsrIc56n5slUBS/HDcWHl6eNOeOXpYUdYDzrCetYRlmcbH3KEdZ8jrBcdYT3pCMuT9p92hHXkCOt5R1gPOMJ6whHWc46wPHnihiOs9zvC8hzbH3aE5dmPnjLak16POsJ6yhHWqNLLc+44C7S/4QiL99zS4jevBdOkdz/Oyr6/yIis/28Nb8+t/lmFYey5rRy2NzdX9o9WjtpHa0cbmynBN1z5He/FqBhqah0T+VzImtpzQzt3niYhL7TnZjiqPbc4e4Yra3Xoj/XH3nNDPh0UVqw9t/E9NM33dW7le2geLgg1voemtx4sc9J7RKF+r3MPzSehXy1+zmJFHXkalT3IKaARzx2hPcjnA3yM9FI05P5IBT6hPbu489zySh2+wvpP6m6QmZp0VfsJPCfjGT4+k3Tc84N5etIR1jOOsB52hPW0I6xnHWE97gjLsx8fdYR1nyOsFx1hefKXJ+09+cuT719whHWjgKX28Gy+znWYH5nortP0OYxXh99yvDorf/dkCfPzBUw115+QztrI7y5P92TdeSouaipgqfUC7hG/fq6Ey+XwN35XpWdV0f4nQO/4eFFfHT1r2OsF1rPqrhf+yQjoWXF01JXa/t63yh1sB1lZjvMmxLtWANZZuEdnVO9f8bzzyfMuvVG9z+1xR1jjuweHN7bPwt2DZ+FemFG968yTXp5ywnMMeY5tT544coR1FsbQDUdYtlfdb/26MNld53HXr6+F9etS8XsG4FodJ7U3xevXNOndz2BbL+ZVxS/jpNavVu6V9VWN9eti0kunSYJnfYBrQYTBewhW/jWTJS7fU+Ayl/T2dyvR/c17q4onEQ/eJw/FOsf61R3vvHen9srU/e8TlKf60ngzTgzB9gH7ymNSZybYF2IR8mYob0nQyPIuQh7SkpPiW4xV+H01+FadI+C72i3vTSQTIvmebCjblOFsdY/KfQOhPRXvGJ1bWwdHR4cH68vr+6sre8vbofEZitGp7u8K3fm2EIfWq8rvhe91m4S8UIxOe6f8XiLFGK0VIxXrVzZqzxidfH9B0xidSqbzHIOwWqIdrKvgtyFdZZTnrlDdSJc6fRnCVcXOVXJFzaV8vhnbyOeb48jO0uZtuEz2aUcr6Z17kAY8/7wb9CC2eTfVs6cEPjOJ1kN2fOizx3MtJnVmj/djUA6znf4CfMdjEfUQ9sFCPQT5iZPSNYxOOcz/uoauMUr0zX/zWoLnOcxDPY99kE6CvtlMCZfL4W9PWf0jsMc09lUs81iXP2u+ip8KyOHT6Kt43rEepCHLiRnHetT8XmetHCdefbvn/mPkOaxzFtrD8hjnvil699cCPNdUZw6dQ8fvBu0j1rOwngnHerDMSfvH1vGxiGSf6fBcZ62YlP2vYmC0qDz+TpKS5+zdfxngOU8fiyq77g9N6jrr2nWt/K+AXfdvF7+b3h19nvJQnobWJTwfss8I5qFMG1UbH/t4oO7H/Yq6H89taONju+ElyGM95DLkIb049bMNfmS+hMvlEqqzjm3wH8FY+dn5sjy2wfBKqR7TRxX/2LeR9yEarx143vBYOzRdH1i5pvfFp6IdivY8PtU8Y/0S6byCa3ycUHzA0Fowpby6Nn81p1pS/Wk0bDo+lT6TJt24YxnUCa5lN//zGdd/CeP5nxe44J4Tzql17HbKtoVtqWOjVn2p+JbjPqq6ca5mu918Q1wXRHnEgW1zOK/at5H1831lX7KkeJ7HA/I8z0l197l4rOAc2NS/2OjUNJ7bqNCX5w8Ve03Rl+ePUaEvywWDy3IhZHuyb1H3VbanOOft2+vK51m1FdvHZQy3prYnnJN57Cn7XMhmpWLk8Z5eJF/pzprM2qD8+BG3FpXH30lSzkv2bqoAotZkTWOxtwQ+sdfNrEukjvXgd6wHtRzrQbph+ap+x3HCPi5W/jL0q52TnRF1OPLqhrIzWmI7tOIR3m/FPFybcV+gjemdWXce6irvzkoYnJTssXdN58Rbmb5vy7rzkL7flJUwOI3pW+aF6Gs8quhrvD2m7/Hp+1JWluPUj4Y/X2MNGVrbKz0ipTw156T0XOXvaGtE9nfcgbnguwvkh7nvqPqTdXRlu1T9aW1W48VkVd2+xn3OJnF4sc94LYd9iG3CNit+yNO17OZ/vqPm7dCf31sgWBUDZ6zbn13d/v6xbl9Zj5KzJ6Xbn3U98e1ZCYPTWI8p8467znlXVsLgNKZvmXdcPTz2OieGDhnZR6rxnVSs79W9k0rJYUuK9hg34/sXSrhcjnFVehvzJeJ9mvbtEH9O/fbR/sGFEi6XY3yU30LkdYfb3Wh5+kxWluPUb/3w8w3opHhN+YWc0FiO7u/4IwG9tKm/o/K3iewXvat4xZIabyzrcC+TZZ3aJ6/Lf+jf/HID/kMem6M87FPDO/K5B1e/86bn/TDebxNZh7zGdIo0JzTmQ57HcG/1s1lZjlO/OeHnB+Q15ct2QmO5I+uMhijrZkR7W0kv7yP9p+jdLwRknfLjwnchn2v24xqVffjj+mo1lXW4n/7HiyVcLse4Io8tUB72qeEdea3TWNaxfRFpj/hz6rcuuetiCZfLMT7YVyzrItkbG8u6lPKQfz+XleU49bNTvrcBnZBnWNYhDdkuFImGQb1OrSeb6nX/LiDrkD4hHzDlg899id+lRLtIc+2xY+ilcfAJxtBTdFUyjmPoKftdKvImxLtWANY7HWGZXWbUdFCm8yB6POqgDzWQN0pX5zE6NV3CfuFi9/ehccV27J3iuT1Yqj2urP6TGlctwqffuDovcOUzbHlC23fV+A3pgJj3LkdYZtMctTULr+3UHfR1xxWuWZqMK+R9vkvV8u6CcfWZ4Y+rzVtlXCn7F6+H8sTz1SB3Wr3dEdY7HWG9yxHWux1hseyIZNt1tbs1lR1o233JWXasg+z4QgF77M/RS7+z7s9xDfhk7M/RXY+a05iHPOoZ+3N0y7I8jf05yrzj0nfsz1HWfav5c5wF+n4kK8tx6kfDH6+hT50FGn4sK8tx6kfD110q4XI5S3X8iqZFO9SZYNapRsUOxzo/2uFCZ3CbxgpAG10TvyJlo1N8YrBGbX+P95+Qhog/p357eE322pHXmE6jEguvKp5Fnj6RleU49fPraLLXrnhNxYbhveTTGs/yhwPrI/SbmxDvqmyjWG7UYuewrMP9dJZ1g8RNxDg3Lx/TJ+YC5WGfGt6R7UeNZR37yyDtEX9O/exHTWQdztUs6yL5/7nNuXn6ZFaW49TPX/e4fkUs65CG7FcU24fSeKjKh9JwayW9YwblE98L/LMBWYd0nRDvQn5FVTaNxI82RzxX+8FeWVa8m1KbIsnv2nuZVv9sElW36+y5hGL/5Cm0d82x1nEs/pWsLMd5E+JdqwIWj9FBYY3qfB2K89N0PsE5ucleppqT1Roj/9spntsDpbVNNe/ymGRe8Kl7ZavumLT6Z5OoPLMc4m+kD4/JCwLXpSSsl2Ae1nNB1LMk8vgux0FgPesI6z5HWI87wnrSEdaDjrA8+/HpEYX1sCMsT9qfBb73bKNnP3ry1wOOsDzp5dmPnnLCUxZ68r1nGx9xhOXZxuuOsDzH4wuOsJ5xhHW/IyzPfnzREdaYJ5rBulHAYrvLWwvjTdx9mZV9tbZMk+66L0SqO6X6jH74DusPrVFmRd4gd/atLK+019uHe7uHh6urGxu7Tfvayi+K8mr9ZbReikPrTaMT3tm3CHTN0yTkXaC8KcgzHHObAN/ZtxgJ/zr0x/rVWHtLVpbz6kvl9x63L9urp7sv26tN+9LuOUTbzRzhiv2w44Lnymo8+/Ha2H5cpqj2Y8PVfvNc19Tme94RFtuPI52FcY0h39R+fNyzMGo/kuMT7p0rYdtZmFE7R10n7oaiM/M6zj2fyspynPr5b33eyX/ruHGhIvG4q/8W99kF0dbj8H+T+AGoe7D/Fu6j8l79qPB9SFY3jQuF/OsVP2BU6MQyANuVZWU5Tv3o9N5jnh1in4bQWI5Ew45Pg41DFZMecWslvTIJz5ZM0bvvgHlj0PgBvEZA+uB3Oy60Wdvg81mOsFfYL8oP9tYK+womgl6RfCprn1G1+meTqHNVR99VvoJqPckyBb9dSnrlzXuyshznhfRqBeu9IwiL5dKgsCYdYbHfV6RzlK7zcdPYZXj+8qUB52O+v+zHQDbfKmdUv+pySYcqWIpGg55RrTOP5unu7OZ/nid/imzQsc6z4r2ZCdUV2VfX/d7yr23Q16rPLK/pveUp4aLOBOeJ+9rK/3Pq61j+qqqvra5hxrat29e4nmty9lz1mVrPcVxMdT/irRzH8F8GdHOPOIYhPZT/Wz38LnSGg+8qjXUvOc8Nc471oD7DY/M0+Ljy+MJ9GB5fF6Ee05st7xLkfXNWwuDUz282qyEnFpNe+nKsCdTZ+P7fKhst0gbHqtoXm6LyX6Y5IdJ+lpwTrK64e9DtI2VftaT4h21xeFfnAuVdEjSuyz/W3pwH3lpDpzhL4/M4Y7DJPdvqDmAbS5391UTv57N+ZeXPFwSJzM9yLFldYx7pTqPGI7ePeeREeOStWXceymmM78Yp1jx/XP5JKQ/XjIjDtaL8FJV/w5jfTpTfTqNMWhvzyC0vk5i+edop/rcHS2txz921D7l/MKn+4b7D/uG+Q92e+w77x+KSWd5l+A55lpPqu46+mByv727FscExy5D2eDaY06jM11ezm/9Ztt43lq0nwj88PpF/msa8GyX+eWDMP2P9rUj3Zjf/M488OQI8otrH+xWR9IPOfsUFQT+s03BrCTqhbjFF754p6Kv2K5Q/szr7ofYr2EdM7evhnmXVvt6nqf8jjVPZ/+xzF2kPt5EOmKd7su48lAO4T8ep397v6+dKuFwuIVpE2ks/cX24Lp2sva+Mkxp0Wkx66cT7Iep+VBVDkmUp2kvqjCUr/z23/nzbmH94vxP5h/coLwoae+tk31eDt9TeurVpivK+VPR53pYfpv7H/sn/dorn9kBpddPgt6LAL2NXTQj6xPWtWq599sjqnyVcnfm944up4tojfdh/TsXZX6K8PB1kZTnOU/45rQCspxxh3ecI63lHWA84wnrCEdZzjrAedoTl2Y+POMLy5NWnHWF50uu6IyxPnnjBEZYXvex7L1h8FgVhO84Pjc5O5onXFqwjJoBrQu3HhG3K1Y69Gj4guY7y24WOos7vsP6M+gXrz4grn7Uelbi5KeXVOT+JbWOdNU9NdU9c/31dDVuP1an2apVuYW1i3+x/G9BFY69F7PdJ8VskP/8T57e6PIVnB/5OA9+vs0yn/+JKCZfLWRqluQLHh6IT215UDFclv/CMFad+c8zPz5dwuZyl03b25qdq8IXViXwxvh+uTGxTvlLYuW+V++GmHetR94iyvcmjHhXbXZ0LYZ47redC/nyA55qeC2kJfBbEd4P2EZ/Dw3pSx3rwO+a5lmM9SDcrr2IBDBJ3jdJK5LtiXOO51Ln3Se1Hse8Xn7Ow35zU3If3Rf1cA50I6evYf2tx4xc217lCsV24/1Dn4v5DnYv9S3CfDOnKSfUf3lXVpP9Ow71dLAORviy3Ro2+oyJ/mL6DrrvyNEz50zTW1DTlob51jvJQR2K9XM3NdWLenIb7B71lnOI7HINKn7DUj0eu31bC5XIJ1Yn6B8ePsLzHC91wmHax0x6v4mca9Am2f9A1c043lueD6iO7m6tb+ytr+5t766u7qxu7l0RbWhHrP2xvre2tba9t7K9t728eHvWrX/FNpFgMW2rNY8nycO3G8wvSiucX1keSpD4v4t1sv1WDF5W8Z5mu1sTqjkpe14yKXsXjp67PK8cOQZmO8ohTP93p3ttLuFyO26HuUVW2F/MJyt99b8Uafyop1/hq7p+i8t8/U8L8CwUidXQA5AnmF8Xbp+mcC/NEnXMu2I+Wh+dcmsZ0NDrleD7XgJdQB8L2Iu7II0p35vtc/x7Ylr779m6YaK9imHl6R3bzf2SfwE7MbKSRsq/xekvF2FbrNcXbDEvVjXPHW4gWseKfGz6LfWixRPgvifLIQwtEiwsBWP1iwd9LtLgUmRYX+9DiEuF/SZRHObBItFgKwOpHi6tZNy0uR6bFpT60uEz4XxblLwVocVHAYn3J8tV/q4ffsb0VcWa5vOhYD44BvmvjkmM9SNMlqueyYz3YvxepniuO9SCsa9nN/8bjt8P3jv6znXh1dyS9yfJeBXUz39wJedzXd0Ee98+rIQ/5n5Oa640WuUz43gZz/W2QZ22aorxfB/3uV2e64c3RN3w3DOZZ2ZcB3u8Wv1V/35M1K6fmV2uzmm9Y56yyyWF/JEkpv3Cu43tPjHbTojzCY1r/G9CTfuD27jbjGLI2qn2jC5Q3IepFmiq6XSH8LO/L0He/V2OPENceRiNel+C3uC6J6wu3vKbklSU1PlinR/mzSHl3QN4lykPZwXMbyg62MaLsGOQM1Q/WkA917iBQvqLKZsx752hDmKE8nI9ZJ8A17iXKQ95l3QP9+9SaheWUlT9XVIhrFqMZ3guE564+D+WwnjxNFt/MUPt8+Tp8909obad0TGUDUToN2k6YPvMB+kwF6BMpRmmHPudEe9VZuJB8Q15eIPrg92zjU3XjeERZ+UqZrPw+xG+I42TxTeTzbB16zog2IQ34vK06u4t0Mhotie85Jq/yc0cah+iJ8WaZnghjsvgm8j5VkJ7nAjSYFeWRnkYjFeuU9QnUNfjsldpzULqGzQFoF4xh/1/dOtpdaa/vHu0vb2+trKw3sf8rG2la8T9Jmvmn5ela1l1PDP+0PL05u/k/sg/aLtubMal9iZTy6sbL571Xta5IBQ5K9zFaNLWpo+ziNZ6K9533+85s+Q3WjbqHOq/Dd5O+abaE+Uzxe9T2x7lvsf+4b9UZnaY29aY6L+6BN7F/49jh9hpM7E+1f8e+le8UuiTDbAmYeWL7d+x5XN3N0QrQJHSnILZP6fgMS9WNsobt38PYC1Br7ZSesTyOizmixXwAVj9asP17GOsJpEXT9QTTYiEAqx8trma3Fi1mBaxRi9Md2uPkGN6ok/H+NK7Xm/oaYgzvf9ZAxqN8sjaxresJmIOfnO2GN0PfhOwJVvYTAO9jAjbrDHlinSFPbEebEnihLqL0UrOZqrMOCwDjGdrPT6Ec+wmqdUEUf6OjtcPNle3d1YOjo/2V7e0m+r6yT6WUh7RguxbbJPI0anoZ+4h5+Lg01blR97p3QN2rn87912n8oJ+K0rmnIR/L/+cwJm8riD2o3xPzRJKMXjy/qnMTiifqxq7iuQHHaFM9Hu2Hzx1TxrNupfR4dScL6/F/O6DH2zctATNPrMdH8mPq6ChKL0deXSCaKF13XtBE8TbDUnUre9ww9TWkRVN9je+JCumuF/rQgvX4i5FpsdSHFux3Htr7xPYtivZfbEiLq1k3LYbh04O0aOrTw7RQPj3KVp9W/Ld6+F3oHCTL5QuO9eAYYD3+omM9yk+K5xKPepS/jPHeFchz3Hde571lTGpvmfsT95a5D3Bvmel2p2hrKnBQc7DRouk6C9d21qYpyvvfQO/6ZVpnzdI3KGd5nWVlvwTwfknA5vk6T03XWfYt6p+R4/qtMk0xsS8DygTmNxzHit/Yn0v5MtTlGzzz8gtD9jtQZ+SVDs8yHPWci5SH/MhzhfI7UHcis9/B7zj4HaDeOVl8M0xdC9vdVNfiPcaqsxdMn7kAfUJ+B5H2zmr7HfB+Qr994Hmij+LzUN2oq8fwO4h0vqe23wHvRypbcsjvQO1lpEkvH439Dpr7HbDPTAp57HegfAuazhfs18nzBfcp+3Win+KEKGPf8hmpiwUT5c+/fHv9Nh/H18JsVzFsr5vtld2Vg4ODtb3Vg9XN/rZXd9vv8uHq9v7R8vLKV8y/e5trJ13/fnu1vbl5uL+9srWysbp1eNL17x3sb6wdrq9u7K4tb+werB/nrCuPgePi0p1WV5X+6wh/Rc3dKbUtjq/wykZK9SVJ7/oS659NtOzZccGnjKk9TfgwfariY+G3yp/oxawsV6U3nBP1KFjvc4R13RHW446wnnSE9ZAjLE/a3+8IyxOv5xxhefbjM46wPHn1UUdYnvR62BGW5xgaVTnxrCMsT9p78pcnXk87wvKUX+93hOWJ16cdYXmOIc+x7TmGHnOENYrzdpr0rh0GgTXpBCtPN7JuWBMCltKL5+H99Y88+NjHEkocIDel51aiK/7zBOdapuHh74mKOlKCZ/kxFpjLKwf7u3vLa2v7awcre6v7x3Gu4g2QPMVdoJVBMIdxaEwdZA0tVvm/weI8q+ukFpMhw3SeQoOZHeoGEQx8ceW5OO3u9GloEY31N11E25j3EHBvHlFY1kY2ZubpLZSHPB4KQJkmGiaWUwZSNjTjJGAOg1GMopure+219b2V/fWjo+W9g7McgE45pDZ1HjVaNL3wRW2i8QE/bJPlIR8YjKp+Yjm3Uzy3B0rre4oPHOEfhJyO4m58brRTqi9J9Hxn9c8mUefyznwX2jjME/P7rMCVN7Xy9GJWluO8CfGuFYD1PkdY1x1hPe4I60lHWA85wvKk/f0jitczjrCedYT1tCOs5xxhPegIy5Nenjzx/hHFy1NOPOAI66OOsB52hHUW5Ne3OMLy5K9RlYUvOMI6CzLnEUdYnjqTp5x4whGWp/7lqZuMoizMf/N6chRg5WlU1x2efH8WZOF4LTo8HWC8Fh3PtadlrvXsxxtOsPLfbA8dBbk6ynPt846wPNfInnzvac8Z1fX2WAcY6wBjHWCsA/SDNdYBhgNLtVH5kbQErJRwwfJq/7GvkxoCMuAKMY7QMEHP7Jw2VYHwh5LuZNHEGA/8lvG7mIRT1Xcfond5qorqW4VPQrAnxLs6Ti+Gk3Ua3siOMDnilJX/ZOElkee/NF9dn9H3Vr59PivaH/v2eeUUlNP/xryuE0/vY5+m1A4r/23Qp58T/asi6Vlfzwl4fxXoUufmNGwfR5yKfRJbCVPsizonsZFfOErDTACWqjt0c9owom8hLZpG35olWswFYPWjBUecOm1RdJkWoSi6/WhxNbu1aFE3konJnNMUVTZ0cyZHi8TIQ0gTThP0jLRoGu0I+wXbxLLa3mN/2Lcs/38M5pCfLn5HjgTROIIk31SEEVqmKA/pwpFKVV/X7TOjRVOnUTVelGOstYn75x9D//xkQIe7lpXlfnq+G6fzBBvl2UxFvT8N9X6xYb3Mk3lS+gNHwJoQOKPuhPxo/wdxrF7f31peWd7d39zf2D46ONw88WgP67ur61tHm+3trcO9g719r0jD9mz9NJV0j6M8vTfrLns+UPYTVHYmUPaTVHY2UPYzVHYuUPazRdl+0Xp/iXhwHmBO0LdIPx4bXwL+/5Xid46f0gmM7ipqFy/KL/TBZ57wsfK/FtDT7ZuWgJkn1tNRRsbQQVTErdDctSTKLwqaHPdWXxWBapgRQENR3Txv9b3Yhxasp8eJSFnS4nIfWlwh/K+I8upm2EXR/isNaXE166bFbZFpcaUPLW4j/G8T5a8EaHFZwFJ6V1rx3+rhd2wLQZxZv4kVsXWJ6olxIzDyk4qoOmg92L/WV8Z7GBHTj/eWtziKKyYVxfW4twsz3V4j2poKHJTebbRoulbCiKPWpinKmykA5XP8dy10lzHd6R4oM0dlTGf6y1BmgcqYrrQOZRapjOlIfxHKXKQyphu9DspcBkIgbZX+9FLWnWdl7yhgxL31ut1m3barH6LW3fzGbeZtHBNNI9TizdlfOmZk41dRHuo/Vi7nh3edSF+ODj1fHtNzTM8xPcf0FPiM6dmfnr9xQvRkW8Z3gQ7zHqJ5nH2C5Q3WCxPRxro3H3AEe+yPK5SHOjPq/Jz67RM0iW7PezyYh/aCFuWxLQRhXKY8LJ8njmRsdK6KZGzfsk5+uFC2ORTJ2Nq4JPC9nNSnh2qzWkMvUB6ue3ntjWvVK5SH68uqNX6VbRBth1j+OtAsFNHf+l5FBMe17WTxTdz1aGkLwTE5IWhzB9HpDlEeZTVHrMfvrU8VfW4L0Gc+QJ/Lkemj7KPzok08VrE8jvtFoo/i85SeERbaWEMR6PFmNaYnwpgsvhkmPdHe3JSe1nZFT76hSvltII1D9DQcFT0RxmTxzTBv/FoI0KDfjV88fpU8rTMnKH8YNV/YHIB2oFB/1b3FZx7g/lKkPczDvb2D3b39jY3t/b39lf2jk97DPNhaW2vvHqzvr61sHa4fbhwnOFWkoH3tcdC+Y6dx0L5Au7H+BVG+SZ+qdiMs29teSHrpNWg9SENrW+gWrMjjqeMDbDZz9AE+L3BtUXn8nSS9NvgfBz2ZfYDVTTshPm8JfKyP0O6Ovgk/saDrRH1fBSqcovJPXyhh/mQB87g3aCucDcZMElPGrNcO3Gb1zwoaxZB5iheQPi2i3bTAVY3lD2VluSoZMy3qUbA+6gjrKUdYzznCetIR1rOOsO5zhOVJ+0ccYXm28XlHWA84wnrCEdbjjrAecoTl2Y8PO8LypL0nXp5y1ROvUZWFzzjC8uRVT7wec4Q1qnOt53gcVfnl2Y+e85Dn/Ogpczxp/2FHWJ5tHFUZ7Un7Fx1hecrVUdUnPPXoI0dYo6ozefL9DUdYnmPIU2fyXCuMqr7qKSfe7whrVOc0T11uVG0djzrC8tSjR5VenvP2dUdYnnLiBUdYnjJnPG8Pb97+AMEymzruB6VJWcb2DHif5BPFPkncfeb11dDeXNw9s/XVlOozeidEI96DRnx4TxnzBjtffbi+cbh9tLe6snHQXj9ICb7hyu9wnypN9EU6aj8mbtyCtSPlk4PxJPI0CXnnKW8K8jCewB2Ef5wYS2tHdeiP9S+J8vdCG5r05VKix4EXrPSYsC4l3WMA5cRCUi1rMJaSyZtPFfJGndHGPWvFw3xGO1LsjdXQmMJxh/XjM5ZHPmX/gfMBWKpu5VNltJiPTIu5PrTgs/7KJwzjicwQLWYDsPrRgs9oL0SmhXdcKaZFKK5UP1pczW4tWkwJWJF5vnHsHdYb0E92lvLQh5NjKaEPJ7ab0wQ9Iy2angFG+cS+85b3A+BL8/eL36p/bE5Q8o2DfvbjY/QfeaVMVn5vcDs+UJDn6euS1/Pb5EOMctB0FeX/Pl3kLSW9vMrxwpCGc9A2pqFj24KxJEN+ZHVjSf4ozPOD+pHNCXx4TYQ8pXz3DAbycAgf1DvYf3lS4JPD/QnwnftC0l2HjVm1PsvT1ezm/ykq/xO0Povk1yXPnk9WtAHp1BJtUH52rMdO9oH1DoI1EcBrqg+sbyRYqv8WxHeGf1wfv/ZaSvVZO/Ad1j+b9M6znnKvLl1bRLtpgasapyn9Pq4dRPHVILA4hh7iad9V+edHGpfryh8+ITwVbdnewvzCSekU1qa8va+/o4TL5Rgf7BPWCZRMmEmi8nObZQ7KYLajJEk5100KWuSJY4f8q8Bcx2Oa3zE/Mj/nqd8ae3xeZHxeBGGNz4uMz4tYMtrHOi/yR456fkvg0++8yJ9U6PJNz4v808US5p/RGhd5geczxHkEzous1JV54/MivXnj8yLNYI3PiwyvjePzIs1gjc+LDA+v8XmRZrDG50Vujbl2fF5kePPQ+LzI8No4Pi8yPLk6Pi8yvDaOz4sMT2canxdpBmt8XmR4vDo+L3JrzNtnwQbjOYZGVRaO9Ynh6RNe51j+x2L/JvI5lvUhnmNZT6k+o3dCNBrGOZat3bXDteX2wdHu0d7a+sF6SvANV37H/hejcY5lffl0n2NZX65Df6x/fI6lWtaocyw/U8ib8TmW8TkWpMX4HMv4HIuixfgcS2+aoGekRYxzLL8JPj5/VPw+q+dYus5uZN15dc+xzBGdkIaz0DamoWPb2izX6/q3zYl2JEnvXYJfhnl+UP+2WYFP03MsBgN5OITPcc6x/An49I39isuUVvw3WJw39ivuzYvRp9OBdmP9Y7/i0+NXfLlQMIblV3zHkq6zqV/x/7VUwryr+H0K/Yprx1AZ+xX35o39ipvBGvsVD6+NY7/iZrDGfsXDw2vsV9wM1tiv+NaYa8d+xcObh8Z+xcNr49iveHhydexXPLw2jv2Kh6czjf2Km8Ea+xUPj1fHfsW3xrx9FtaiTzvC8pTRYx/lsW7CeV4+yr9W7P9E9lHeGKKP8kZK9Rm9E6LRUHyU1w43Ng4Oj9aP2ofL29udPcxT6qO8csp9lFfq0B/rH/soV8sa5aP8r2EPfeyjXA1r7KNcnxZjH+UyXc1uLVqMfZR70wQ9Iy1i+CinBWK5zL+j+H0GfJRXlI8y8rvpKopfpou8paR3HLCsV2NiQdBCwQr5O88Dnbg/HOkUPW7/pYLnPPzu5gU+Tf2dDQaOhxA+x/F3vgP0JI7br2JG49i+mt38zzGh/1yBa+TY8TJuP/s4Ir72O3Lc8s2U6ksSvQ60+mcJV2d8lrk/DR+mT4toNyVwXUp6+e/NWVnuOGNlDGtwWCH/2Dr8qOpRPr4c5z5Pd2c3/+fyZJ3klH2HvsP47dWszMfy/wnoAlukC6gxNNcnn2ndqsCHdfxhnMlAvZbX1WotHfKPnw7A6ndmgtd+p20dfI5oodbBSu/DeSJPk1mUdm/m+GzD3RJMg6msfnuTpNdWp9bSoXNYuB5EuwvTZ2aI9EkD9FFyVMm3lNqI5dXZGaW3nac8JStTgYOSOayrTQhYKFvP4h0s7xjfwdJJrG8fBdYtivdCc77ivSZ3sMTUQ/J0T9ZdT5Uecr1ivVRXD7HyT4Ie8tGGeojSn0Nzb0hW9Zv3rS115n0FqxWoW83L5wN1I174LX43JfBk2820wGdKwFIymGWSmhvqymBcLxtf4TyaQP07xXO7YTpcWd5qb6ysL68dHC4fra3y2hbpMBeh/pXdvc3dlb3d7YPt1eWt9b71j+KY/w6nMf83YMz/dccxj/wcWnuExmlIRvQbpzwXqnEaqhv1pbcQrrMNce2nm54nXBG/uRqwQvKs354R0ym0Z+RdN7d7WtQ9I75z1Ff2lQ3aEtugkY/UnsUM5dXds8B2c1K6otEip99RA10RxwfvIY3i/PMdkeaf7c2j/d2D7YOjzdWj3aPd3Sbyf7GizZin1gFqXc46+ajwOPshII8z/yOPY9s49ePjP14s4XI5xhXl4wLlIa8Y3sOk73Fo8TO3lW1K+tBiOkCLc4IWShZYH6q9coMReX+4s27s+DMlei/bcGslvXyL9Jqid/8isG5U8xq+Y31N3Te9IL5LK/5bPfyO66myUeGzRz1qXRI7tsl5gstrJdSJ97PusguBsodU9kKg7EeKssrug7r2r5OuPQ8wlS1thuq08l8GXfs3SddmmxbmIWzem1b+Y2qO4nE87HgxqG+wTA/Fi/ndwDhu6vuraLcE8CyPbceoI7HdFMcBrpmYF/49tIN99uYBX+avPPG+DeovMfYqLkLdav2C9eMzlkc/HGuf8elSAJaqG+dZ3re5HJkWl/rQ4jLhf1mUxzZeJFrMC1jGOzZ+LhYAXuHZS91lTDZegDItKmMycQ7KTELDEC8lNz+WdedZ2fMFjMh8KX0hsF8QJ5MvS5D/zuzmf6XD2nc5Ta5cqg/z7Zk/zG/N/GG+LWsGcybpHaN+fbm8zH56mCwP+5v1LRxvrCNdgTzWa26DvEXKux3ycDxyUnq80Skfq9lMCZfL4W+WaaH9aeWvgr5Tvy72zUJrVns2+tTRv0K6GutfM4GydfWvr7nUjfcswFT61zTVaeXfCPLuLxa/0Z7Je+5JotdEVXauKnxmCR8rv1zgoHQA+6ZKB2C/fVyjx5j3lD8l0uQC0eSCKK/8NdW8x7BU3WiDZR0gjqwqabHYhxZLhP+SKI9yd4FocSEAa7EPLUZBN0RaNNUN2RYR0g370eJq1k2LYeiGSIumuiHT4qKAFdvuME/1LDrWg2OA7VOXHOtBmi5RPZcd68H+tb4y3kN9w1F/2mCdBZPl3QF1c3++CvK4D+6EPKbbXaKtqcBB6UhGi6bnKlCfszZNUd4HYY7/EVr3mI5zHcp8iMqYbvMolNmlMqbTPARl9h3WTw+Qzo3tjb1+upJo/Ousn+bFd6/4kAywfvKA+a0RYL6tIczI66c1HhuY1FqH10+41uF1EMqNS5SHcoPnIpQbLFNQbgyytvrBGnJD6ZYp5aGuxXt13GeYhzKPbbI4f/IcjnPeJcrDcVmlK1StMXANguVfEmsM5edqdMjLfZ7OZ+EcOVl8E3deK3Uq5OsJQZvbiE63ifIoR00/XBLfW58q+lwO0Gc2QJ+Lkemj1lmzok0pPWN5HAMLRB/F5yk9Iywcj2izeKVMVn6PcQiYnghjsvhmmPTEdWtTehqNFD0XCZbyK0Iah+hp7xQ9EcZk8c2MwOGk6DkXoIFa0yE9efwqear2cOYpD2043Eeo69scgPpkqL/q2uzwfpevARk99jPpbtvYz6QefY9Di7Gfib+fyf8MY3nsZ9Jdz6j7mexl3ThV7Uf8Cs0Dx/UH+bdgP/hXxe+xP0iv7A35g/xmYLydJn+Q3wnsBTX1B4mtI6v9jKZrDlxbsz/IYgCWqjvkD3LafGOWiBbzAhbbKs8Vi9OcZ/+IbFlL9A3Ku09l3XlW9k/IdhWJn6Qdku3mcfpveVXZNiwpezPbxtBu0NSOZW3K+++RBv77OGauUB720W2Uh7oL2/FR50b75eWCMGelHz5ySvohkl58pPb3Qu0OxdliHRJ5h/U+tOXxugL7HenDSfUtxu4ahh/Or4g1/TDPr9elG55D/9rLZVurYFmdKMO5/5V+tADttzybz/jMzYyoI//bKZ7bA6YZgYtjv6xFjg3V0UVUzCN1tor7JSHa4v8k6V1zYV2zSW8fO7YtGM9JnT1U59MQ/ypYkw1hRR7LnT6dCLQb618I4KrOGV/L/GjC4/K4sPJ0txNe2EZ1ntm+izz2g/EwmC+tPUzfUDyMuwsZ7REPg/0a87Qgvqs6v/kKPkVelQyPEwu9vansSAm1gWNDYB7aG1qUx7GgMA/tcO/JynKc1FxrtMjx+rrZEi6X43Ygb1TdY45tYp55H6wXdy/rMh8gvRPHTuw1YErtT6kdqN98c9adZ2W/hfCPND9J/K0upG/VeGAZ4IPX6jbzCuIYVx9ZPkypviTROoTVf9rvkPa8E+Z9jrCuO8LyvHvF8/4Pz3stPWl/vyMsT7w876o5C/cEefKq511bnjzheZebJ15n4f4iT57wHI+e9/KOqlz9oBMs01e88LqRdcMK2QAQVlM9Zx7KXv/Ig499LKHEymOaaMQuVyDwWoJ3LdNwGT4+X+6T/1oBq0rZ5iCCO8Vze7C0xQtMTGqBmVIeLjBZCWVnoiTppoMltcC09jZ1fFKLSKUUG96KvvnfTvHcHiitHCgnBT/4q4fcR0iXuAGhl5dTqi9J9GLJ6p9NevkpxmKpbgBmxafspIlGEl4sNXWKwrzrjrAedoT1giOsG46w7nOCpcb6ILDOO8HybGOePHn1eUdYDzjCesIR1nOOsDzH440CljKKoWPfr17urhODIrAiZWUsH8s/caWE+TIZIiPpILusS2BSMpp1EHQsYNm+QDgn8D2mfjrI9y+UcLkc46qcHJUOws5jKtDrSTk59rusyXBrJb06Reiypn8X2ORRwbXxHY8LdWlEv3Hx5YbjYoraYeXfCuPiD05mXJwK3fzlCyVcLse4Hlc3TyEv/9spntsDpbWNkDNB3M3V5bWU6ksSrTvbu5NyVqi7YOdNS/xWOSVzHzYd+5j3VOYH6zlHWE86wnrIEdZ9jrCed4T1gCOsJxxhefLEw46wPPvxRUdYY54YHk/cKGD104O+7kp3nSaP6+pBVn4Z9KB28XtOlFst8vBQSGR9Keh4pg4QheiPc7HRRTlj8eVl+B07akVqd0eHNz0RdXg1P7eoPP7OEx/S+EvQl6zDTwRoZ3XlSTlqTRB94uhazfToPN2TdefV0aPzxM5lKnhHmvQmpWPbuxznT9Rw8OdxbXBZJoQunLVvUV7wOuhtgXEd++LB0GUnXD8+Y3nkeR7X5wSsUTt4nlKeCgLDByKQn9SBCGw3J8WbeBC7ifOfusQjdChdHbZmu8hpPWy9F5CpTe2F6tKdyHx7wLyJiXkzTyxTkTfZFoAHJe+l7/CwDtuA0KGRL17B1I+nf6iBvFW6Q115a9962qk+BvrZ36iQ4U8JGc71tirawwd2I/HXakiGo8yvE9gHeYH1tfMBWKpu7G8+sBtJFq2G2qbsyWnSO6dMiDZyINtzApYKMMwyOBIPtLkdk33a0RJ0QBrwwfXPBmSw6nt8F5LBrDtE0osa6Q55Yhlc5wKwPLEMRt2BnfiVfK4rgzGwVh0ZjDLOWx7/KuxbnMQFimnSq9uljvXgd6wnthzrGcL6rvHlx3zwjO0BmIfzA9MN14wWgKUur+P67vOXSrhcztJZoOF+Vpbj1I+GP36xhMvlLJ0FGh5mZTlO/Wj4uhp8WOWfeFoOhv9yg2AJKANjHQw/y3vHf1ijL5RumlKeGhvqQlqej0bFpsP8g3oZ61d11s08Hjn1W//e/6oSLpfjdiCfsE0HHcNxL+Jl0tkwsFnIXs926X8Na93Hi4gliieYX9SBWWVrYn5hX6Kd4rk9WDpU9hJLqt+ZJ7DfmSdUENyQvcTy1OVEdXnJ6JTj+Z0NeAnXbRxc1XBHHsHyHBzPyn85YOuwb1oCZp5G4aIa5NWmF9XwJdWhS29U3Th3jMJFNUiLJcJfBVfzvKgGaTEKF9UgLU76ohqkxdWsmxbDuKgGaRHzohp1xoL/Wz38ro7NXtleBq3nLFxUY/VccawHYV3Lbv43HseLJxx9AjuBQO5IepPl4eUVzDd1L6/g/nk15DW9EMdokcuEv9Ngrsfgd9amKcp7Q/Ej1z9ed1s3vDn6BuX5JOVZ2a8GeCvFb9XfZietW07Nr9bm417WEZL9ONfZvGzljUzTojzCY1p/ffEj78cfuL27zTiGOOA8roMvUN6EqBdpquh2hfCzvC3ou/Xbutsc8gvIE9t8UZ89D3jZuiRuwJ/mF9+wTh/74hu2S6HsQB9uTko+GA1zOv9oDfmggkjzWEIceCypg82h8xVqTcg6gQqKq3iXdQ+8wF2tWVhOWfm3wVgMXXxjdFAXZ+A6ZrL4ZpgXZ4TWdv0uzrAxqnQatJ0wfeYD9JkK0CfSWZsOfdQe1ZRob0i+IS8vEH3we7bxqbpxPIYuagnxG+I4WXxzUvviM6JNSIM6++LqbNGS+J59zFTAAuUjoOhpOCp6IozJ4puT8rObCbRJ0SB03hpptCS+Z30CdY1JylM2d6Vr2ByAdkG2vys6pxX/k6TemgFhXcvK8tjXVUEUDWe2cX4c9J7P3lZdH+uiyiZu/BPp/H3wLCHWiXY35ofQWcLnYF5kfw0lI/FdaJ+a7amox6Dd+oUKvRPnd9bfsR1W/iXo08+I/g35mc8JeN8m9AXGsSVwzBPbOIfhz4V90dSfi22cMwFYIX/gPLGNM5K9fzU0DyEtFgh/ZaNVc5PSTRca0oJtnMOwfau1ZUrPWH4hQIvQJe39aHE1u7VocV7AUmsdkzmR2904gP9x97j4AmlcryFNOKl1LV46+g8b2L2wX3jfAWW1vVf7qyz//x7MIV8sfkfWFRv5f+e/2aaAazgO7o50Yb+Lqks9OfXzL/wfGvSZGi/Kh8LaxP3zk9A//yigw13LynJfrNA1Jos/lmkzFXV/Eer+JwPWnSelQ1QF1cZvUX9SfjCRzrWvjWqwe+SztOJ/kvSuO7CuWYLl3LZgTADEkXVrxBlpUAVroiGsyH58nT5tBdqN9S8EcOV25MnG2qA0ydObRxSWtdH0CuaDPI3KBQYtaA/LitAFBi8H1qOKd1oB2qUCn9B6VPkhpvQdjlGT0WwHaWpv5/WtChaqLh2y8uhjr2yfbAex8r8j9qdS+n4CYKozS8wPVf5mfLbKyr/19hL336O1OraB6Yeweb9Cnc/meRfX7qHLEyPpesGLMGcFPnzR5R+TPmF6C/aXWnta+TlRL+o+3F9zVG8Oe+7OblpFskk31oubrjtwT+PCnSVcLsd1Kj8y5cPJ+4moY5tertaRfOZp2Ody2caI6y6kF5/LnSnGuIeNUdmp1H5JWvHf6uF3XI/a74nts8T+orOO9aj9gVGzQfCateklgnXHO9oZmsRBVuNW2SDYh6oqfsxXVcy5VeeT2T/Hyq/AHPofFb+VDsJ2XRU7Ts2voTOtBuOkYiqq+RLr5JiKM6KNSEN798aAjGoaS2hK4NN0L47396r24kx/Yp5Yg/Z8dwWf1T2PHnuvObR/zvXjM5ZXPKl4mWGF/AbyxPsXse3U831oUcdOjW3ks/lTAlbkc1MndhaD50+cI3j+QDt1U/8rPG+VzZRwuRz+Zr5S4y50jtq+xXnjhC/Vaw/Tl0f5Fyq/o7Tiv8HiPKtrNunlhRh2v37ypsr/gWlwnHlJwYo89jt9GrJpKDmlbAejEvNtGujL4wHXILxv8KGAjtH0ghhl31kQ3zUZD6oedd4w9nqL+zvSmNxW6zlLah3PdFZ3FrCvKMtxTmp+QZ/At9ewRyhdf5rylC9kZHnemL68nzMnaFKXhugHuN/ApqPWPSGbqtFMrdfUfI8weP+MbcxYnud6lhutijpOen1mcrJqfVYVY+tztEZB2ofsyVY+ZEdV9c5QvWjPDM2vVTyA7ayyw1eduf52wKGOHR7xYruumkcUT3IbpyvKV+0dfGdDnJlWCocqHubyPG4YPp/9x+/t23w8cTw7y98pntsN0/76xt7+2vpu+3A5f1zhy4CtjVY/judWoN34bO/OizaxvPBu31eatrm/u7m8vL22fLi2vN6kfcp2xPYPhGO+t8e1jahYUKG1cEp5TfeXlH2H8WwF8JwQeHIb8nQtu/l/LgHfmKzMR1/4PE0Xz5NQB5Y3nKao/BfApvgP6LzMpKgvL/dzELs2T+cBF8e5ZsXadg7xIHyw/kVR3n5HxnU1hOs5gauicVrxH2Hhu3NZ97uZrLc80ukc1T2L5SlvDvImqZ754hl5DWEZHlNU/n8Cm3WezsM39v2SqB/7jOtS9eP4Y1gT4p2Vz3n7Hxc4dvzwoW5POwGOozpzhLqTczLpba+Sdf3mRyW/T6PMtLkkxpy4srW1sb2y117bPNg/OlhbbTInMj1agh7sn4Vwd46Jc3da3eS6pgR9QzxTt33TgW8V3ImacKeSXtqY31UrADcEqxWA1aqAlSa9/Ynvk6RZm9W8xfO7kmEo23Ec5gll61wNWHMBWDMBWLM1YYXqRlwnCb7NHdMV8Geo/ELxjHPTOYEPz01/AHrQ9B3dZQzmH0GZPyFdKaSbXcA8UR5tZFze2prXOVXg1dnDhXpi6DIKb+QFq1/RoKkuY3XNEizvedezT0KwLtSEZfTE/s1/XzqZvl7hNtjaHNuJ9Rs+S3Hw6fDeYhamqdXvwXtW10nxnmpbiPewPPOegrVYE5bRU/HbQhwarLJcTypogPXjM8p1nP/sW5bZX3VHNxxFL5zDeH22BHmzlHcR8uYJ30tZL74Ia5HwvUT42tyreH5J1H+B6se6VP08L18U5S+K8jmv3Ek0nRbfYv8aTavWGkr/jHz2pGPHNvqjPZnrtPZjefydJL1+OX+hoJHaA0RdckK8C/m3Wznl395U7oXOi3A/MA47xXN7sNQ47jO3H23koX3LeylPxTFNk96k1hBWLof/9xvs2/XT/7vGUdYNx3RYlCdYnvVaK/+XQKf4yxQzWOmsebm3B8o15bHJrPtdPxuVlW9qo8I5O0/HtVG9leTvKNqorhY4npS+Mk3w8R3jZrxzlmT9N41lfZ106mX9yw6yXtm3eM9afcv4sP2KeRnzjmMfPq4tM09vyzTObFfDsk3O5NWhaRXd8vTWbHj4hXwZI8dOXK4jK7D+k/KV7HcOku2oykcv9j3N73OEdd0R1uOOsEb1DnZP2t/vCMsTr0ccYXnyxMOOsDzvFB9V/rpBsJRsawlYobqVLJyH99c/8uBjH0sosXNwmmjEOMA4T5yTFQhiIOU82eZrlVNyKvC5nOhUVX5JwK6aYBUecR3L60+wfBgh0kGO4GEE5XTOyjT3N+bliSfYpod8Me99jrCuO8J63BHWk46wHnKE5Un7+0cUr0ccYXnyxMOOsJ5whDWq/HWjgKUcjviw02k9pPyLAYNSU+VEOUyHYIWUExXceDpQfrZm+b7KDJ9ASisawgpClTJjz1WnC5YqGlKl9DB++C3jzTA49fuuDtwq5WgcMa67fxLKU8pax3qf9PJeDGVNtQ1xDFlyeQA2tT4rWOOIcWXyjPL2DY6wrI23csS4/ycwKSreaQVolwp8xhHjyvJ/CrQeVsS4D76qxD0tfo8jxvXiw8rj/Ku623VSEeOsXjxheStFjJu/q4TL5bjOccS4Mi8UMe7VwDPjiHHd9YwjxpV1DyNi3L0Nxrt3xLgVkuHHjRh3FebQdZpDxxHjetuINLR3/2lARo1yxDjTn5gn7ob2jCPGVcMaR4wbR4xDmnBS8wdGjPu5KyVcLoe/ma/UuKsbMc7mjXHEuF66phX/DRbnjSPGRR3744hx8O6JgI4xjhhXlhlHjLuZcpjjiHHHm6OtTfn/ccS40Y8Y9zdpLXxSEeP+prBnhubXKh7AdjaNGPe3AIfTEjHuhxrizLRSOFTxMJf3ihiH46kVqBef7d15ATM0XgeNmBaKfMYOHwomlvOKwpana5lur6LnSUU3iq0HWZvViaVB60FYtndsshttWY6ye1fZmy2puZj7BHUd3mddIJwxT91+mQoc1PzeifT2lb/7j3lTJd+EivM12mn/F5qb8CbJkLziueZfgJ32PO2dRdpn3OP+SwRN5gXuqv+4b9kWhnl17TlN9Tq8ofQ7G/Q7jh1ub+eEbVL25wyVsXws/3LAxmplWgJmnvhW8dg2VnVLeCtAE2WHRBnAewIh+oZuKM/TSdtYF/rQount0XNEi9BN2v1owbb3xci0uNCHFouE/6IofyFAi4UArH60uJrdWrRQPgGjtgcbsq/z7eBoX1+gPLSvc5RGTP32Z5vcHK72Z9l/5c9gDm7d2Q1vhr5RNhye06fuLOGld/bCZp0hT6F9JtZF8FvURZReymsGXBcsAAzTPdQpdrYbIf8bvBiRNzfWNpa3tna39jf2j7bX9veaRN6MHVki8r5KR/6E9oew/kEjRWBdswTLuW3LobYh/iH7NvtRhuxqdWFFti13+nQy0G6sX/mKNOlT1W7ldzLonpmqh2mI9bQEDq/cbEjy0b5DHVz54U5R+RWQuW8IyDWjhZJr7C+AbWb/+NMavebrC9qovScch3XGJp8ryVPIr9qiXzFtuU9C9t1zNXG0eQ4ja+FeZ54ms278d4r37cHSWk7b3769mx5d+4FZdx7qBNNF3pLIu5Z100LpEjOCFgrWm0cUlrVR8QnvV8Xyb+B24BhUEYua+ph9g+MY5H0czFO2YiWrEUYVDii/WUdVcgBl+yBnIlj2h/Y1kiQ8/nEPLE+TWTfeO8X79mBpWY1/lFs8/lE28PhX/avGxjlo22men+53HBvq/IfaD+F9jaq1DvKxanMKuLBemaed4n+7WVrmF4y3OlvF+72jsmeA8pNTP/v+I68u4XI5rlP5S6s1Ndsy1FpZ7RmYbULpLLy2iET7zljs3F6SaLs18wmu2bHf2K798cBYbOqnFPJJCfl4xT53pc4/zQZoh7w8J2hn7553pN1J+3hhf8Vcj2LbYq9H2Rcgxl4tyojQOiin839G6177Dte9WHcK+Vj+b8G697toL5H1sp3iuT1Y2lJ6S0LtVvLnuL5ean+y6Vkfo0WO83c1mEeQJ6xNc0lvP/wgjPfvhhvTIsqwjm1Jrbew77F+fMbyPEflqc5ZxFHTK0J+l2ovm3kM919YZqi97Lr8h3rMj9bgP5YLBpdlCq/F1HoZ5Y3yHVTnzdSajnX1HwfZ82skeyKtzTeV/Lak9LSU8lR0YCWX2J6FvNbUR8VokeP1fzeQPaE1OvrjWZ02v3CfYvl/Cn32v96pYVr7EU6e+sUb4DJVPp4/C7z4yyQrI/n0N56zmG+QN5hvmsqhunyD54vq3Dyg+rRFdfTrUzxTyOURHvPV/wF9+gPUp5H2VjaUDmxJree4T8+LdileYFmg9Je6fYo+/XX71GRrle/3ceX3b4AsmCvOP4/ld3di+f3XXlPC5XLcjhjy+/egz/50SPL7/x3L757UT36/XHOs/+mQ5Hd6V4nrWH7fTP3kd90+Ndk69lfp7g/LV/+TpNf2gnWN/VWitHvsr5L0yl20273urvIb1q2a+Ku07yphfnXxe+yv0qujvhHmpbG/Sjf+O8X79mDpzPmrfIMjLGvjreyvcs1xDI6yv8rroJ3jWCplajLPYl3jWCpR2t04lkrMveI8sY4Wa2+V9R21ro08nmrHn5uC9jSRtYcBWdt0/aB0RaWvo377IOm3yraofJ5Yb1t+dQnzkYB+W+ecSWiNEXc9tL5aV+bxujSSvh1cl1b5QbKcs2/VWP5QVparkjEhXxXM+6gjrKccYT3nCOtJR1jPOsK6zxGWJ+0fcYTl2cbnHWE94AjrCUdYjzvCesgRlmc/PuwIy5P2nnh5ylVPvEZVFj7jCMuTVz3xeswR1qjOtZ7jcVTll2c/es5DnvOjp8zxpP2HHWF5tnFUZbQn7V90hOUpV0dVn/DUo48cYY2qzuTJ9zccYXmOIU+dyXOtMKr6qqeceL8jrFGd0zx1uVG1dTzqCMtTjx5VennO22dhLfq0IyxPGT2qcnWsmwxPN/kAwVI+PmlSlrF9Ed4L+o+LvaC4e+nrG6H9x7j7gusbKdVn9E6IRlV31SHesyJvkJhqW2uHGxsHh0frR+3D5e3tnvstDFd+h3txaaL9ZNSeU9xzj+srylcK4xXmaRLyzlPeFORhHNk7CP84ZxvXV+rQH+tfEuU53nvdvgz54XjASo8J61LSPQZQTqizuIYznsU1ebNayBsVjxf35RUPczze03Z2l30kzgdg1Y1FeVpjE88QLWYDsPrRguPxLkSmxXwfWiwQ/iqW8XyAFnMBWP1ocTW7tWgxJWBF5vlj32WszqLzfXdLkMexbzCOL7ab0wQ9Iy2axuNF+WRtYr+nd4G/0IPFb9U/Nico+cZnhfrxMfrIvFImK79H3908TUKeIx+sKN9r5HfTVRS/TBd5S0nvOGBZr8bEgqCFgsXxq1X8pJPyu1OxjkJ+d3VjHR2AzjCo3526P53XV8ifytfRYOB4COFznPsjHxT+zur8i41p62PUFx37eC2l+pJEr6Hs3WzSOxc44tPxtZtIeumN9Gkl1fS2b9XZJj7ToM5cqfXVScG6lc8VPRcY76q/JwK0Y/7LU+isY+QzfOt1x9GonqVs6rPKvD+IzWsUYdn3eVK+0Ney7jzsY6ZpXV69u4BZdX9Z6Jyr4a3mHcSXz6B/L9kJY93vyncKYF3jM+/dCWmR17382hIul7OkeCSlvGnRDnWPHc+fSn4pOTxNeSjb+GwZjqV7sm6ccZ5XY9Z0LXW2wb6tGkNsB0+S8P2ABt94QJ2XyxOPLyv/39L4ihS7TY4vjs2h7gdFul7Nuttg5X8B1on/kNaJSl4qejK/hWIsI97cD+q+sPOBNlj5nxL2yWGf/92+o8QDcX0F/6y73f3ua+J9g352OqNZaP0U0iGQ5nXioaj1Is9F/wz6yOKhKBk0S7hj21nOTIh6WQYhz+W4/NaJ7J2d/rhMTeYlDzmBMSVfwS/rxWsY47brbGHW3c7Q3kGS9I7bfuPcdMSlpLcvmb/VXNBkzOTpLVQf8gvGurQxc5L3wXI7sC04P2B7rmbdeGAMYGxfnt5LZWcCZT9BZWcDZT9JZecCZT9DZecDZT9blFWx0IxOOe1+n2xbLYA5Ib5lH4PO/uFrSpj/nvQC7hfMU3GKeK5RZ1/zdDXrxsXK//+B/Ue1BlS2JCuv9k8RT45FouIksA71ZwH8zjngp/R3JXt5Xx5lKNqZ8jSZdcPcKd63B0tShqq7Ouq0V9FH7UGoeYRjiyCtFH1wvXrS9GkF6OPN37z+U7qbmmNYB8E8vC9c3U+a0m/cs1L2/6tZmY/lby9kkhpn6s5QtR9j5ZdEedwD5H1/3DtcSrrxM955dQC/pYb4XRTlcR+S5QDifpHwsz6+H2T6V72mu4zx/buhzOupjM17b4EyX01lbL7bgTJvoDI2z21Ama8pflsbOr5FSe888VLWnWdl31jAMN2e6bVTPLcHTGo9bnXFrXt5mfedMVke4neB8vD+2EVqBya1PrA25fz0JVpnJwIW77Eibsp+auVyfvjwifTl6NDz5TE9x/Qc03NMT4HPmJ796fkbJ0TPlPIMN9QZ82S2FV5XPww6z7cXv+usq1H/5HW10Q316QuAy9WsGxcrf72hvhpad/TTV/l+N6WvhmCF6r4kyiu/vEWBF/b/K99nZd4w18xIg6msfnsVfS6L8mpMLiW9Y3IpQJ+LQ6RPaM3clHcVPZFHeF2MtFukvBTyuB6194njlPdaDPa0KI/weFx/K4xr3mtR9lWURcq+iHLw98HWNep2YCt/HupQ5fnsR8jGlCfrJ/smZA/OirL97LbfQ/PLce22vwjzy/c1mF+wT3h+mRS4KHpz+38wML9Ymbp90tQOpvZm6tp52ddX1a38Q6186NyFwrXffi77aKtzF2yL+rsB2nvjd57wU363IVihuj3OYQxxbt9Uc5fyR6/TXkWfC6I86rdsD6+6j4/pg37oJ02f0Nyu/HBD/KP2X9QelfIZx7MeTJ9h8s9kgD79ZFUd+qg9JUUfjIHL9MH7NU6aPiH+Uf4uIf5R9MS5gvfekXbsy5JCXmg/xeZB3E+ZI7zwN84BdfZTrPz/HpgjrEyrAibPz0oO4TzDdFX7NSibrH61n7SY9K8bZSavxY2H/8+G699Qe/qtf3mODO3XGN/8LuhyL9P+SMiv4HNZd56V/Y3x/sgreYjfAuUNw76HYztkj7JyOT/84Yja9047PXk99f/BGPz6wieuznpK6e9WDvc2lWy5mnXjYuX/NCCvrEyrAibLa2/73gK1P2Tf67cXzuupSw1x7WfvWiJcEb/LNWCF6r4iyiNMntcQrys1YIXqvk2UR5hsg0W87NtR03WRBlNZ/fYq+twuyt8GZaztS1Se5QjT58oQ6RPSddVasqkdFPWuJaIP8u7lAH2GyT8LAfo09cnpZyeeD9BnMUCfhSHSJ8Q/TW01SqdHWw3vM6g54rh2dJzr3lLRjulE26/Yjm7l31jM903s6KYjhHBV+4R17cPK7o7w7s7Kb9YIl2loZ511opX/xteWMDdJB/I8k9bvXED+jLZ5qy9ybKHa53+t/lnC1RmfzvnfkI07SbrlLvO85/5cSF6o8xD5WL+Q9PYZ4mewVCwpxV8z1NZIvNA5Rz8H+E2IOqehzdw2lFW8Rr8HZA6fo2963ln5Pjc998n2LeT7qnOfOIbRhqX8kFOCVbXfxWuokF0uT1U2n/eALHuEZJk6J6xkEssydU5Y7dXweUc1XlQsNyvfby+E/RxCMakUrJDffb99Bq5bzfuMS5JUj3ulJ51QDKF1pSd1jdmsmzah/bE81aFlKMYN2kV5jYLjmMejsnWoccxjHPnU+BfHi9JV8Fyo6R3/AcuRh9AibwQA", - "debug_symbols": "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UoSTIpwU4aSIIC/u4uL+eZ3wS+bHz0lGfFWOVCCVSM3vnfHN/T2q8q6aqPlE7FEJUoqUITVvo+K6v1nlRDlSgVQiVUg1UXUgJUgpUoYUamNxSTbP6xoyIR8HF/YVNUCLO008ICFICTKCBkFOUBCUBJEiGhRRx0GQEKQEGUHzp/yz+6jW4hpin5veN4v7OHxuBBgFxoAZwDgwAQzoQEAHAjpQ0IGCDhR0oKADBR0o6EBBBwo6UNCBgg4MdGCgAwMdzAc5Pjxe4/8R34//a75Qy71eh0Aeh99QAzQf5Pj59c0Lnd8Q3JAQpAQZQYMgJygISoKKoAbISRFOinBShJMinBThpAgnRTgpwkkRTooIUkSQIoIUEaSIIEUEKSJIEUGKCFJEkCKSFJGkiCRFJCkiSRFJikhSRJIikhSRpIgiRRQpokgRRYooUkSRIooUUaSIIkUUKaJJEU2KaFJEkyKaFNGkiCZFNCmiSRENiujjIEgIUoKMoEGQExQEJUFFEClCSBFCihBShJAihBQhpAghRQgpQkgRQopQUoSSIpQUoaQIJUUoKUJJEUqKUFKEkiKMFGGkCCNFGCnCSBFGijBShJEijBRhpAgys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wwsxwHmFmeSAhSgoygQZATFATt3/DiREVQAyQHQUKQEmQEDYKcoCCIFCGkCCFFKClCSRFKilBShJIilBShpAglRSgpQkkRRopYTBI/Wyl4okGQExQEJUFFUAO0mCQ+ICFICSJFDFLEIEUMUsQgRQxSxCBFOCnCSRFOinBShJMiFpPEUX6hvu3CFpPEB5QEFUEN0GKS+ICEICXICBoEzV8ntysjj+OGiqD9lezjWMz3HpAQpAQZQYMgJygISoKKIFJEkSKKFFGkiCJFFCmiSBFFXtz5LEzrdXUZOz4u8Tf0q1FgDJgBjAMTwCQwBUxvG5mPwB6MAKPAGDADGAcmgElgChjQgYAOBHQgoAMB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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_0.snap index 3de95a45dbe..5b24d78540c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_0.snap @@ -223,8 +223,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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7/Am4x3eZL7BmzzY8fhP9ibf4YrH3+GKx9/hisff4YrH3+GKx9/hisff4YrH3+GKx9/hiife4YonCq94fo3PxfGlOL4Wx+/F8a04vhfHj+L4WRs/W3H84vrN4vrN4vrN4vrN4vrN4vrN4vrNp+vX23ojyEk38bM0vrVWHJ+K43NxfCmOr8Xxe3F8K47vxfGfr9/Pg3JdbRM/a+NTK45PxfG5OL4Ux9fi+L04vhXH9+L4xfVLxfXLxfXLxfXLxfXLxfXLxfXLxfXLxfXLxfXLxfXLz9ev9zV+/ngQvkkrjk/F8Z+u39D17x99G1+K42tx/F4c34rje3H8KI6ftfG1Fcen4vjF9avP16+v85OIzfcv1eL4T9dv9rV/ptMmvhXH9+L4URw/a+P3VhyfiuNzcXwpjq/F8YvrtxfXby+u315cv724fq24fq24fq24fq24fq24fq24fq24fq24fq24fq24fr24fr24fr24fr24fr24fr24fr24fr24fr24fr24fqO4fqO4fqO4fqO4fqO4fqO4fqO4fqO4fqO4fqO4frO4frO4frO4frO4frO4frO4frO4frO4frO4frO2fr214vhUHJ+L40txfC2O34vjW3F8L44fxfGL65eK65eK65eK65eK65eK65eK65eK65eK65eK65eK65eL65eL65eL65eL65eL65eL65eL65eL65eL65eL61eK61eK61eK61eK61eK61eK61eK61eK61eK61eK61eL61eL61eL61eL61eL67d4/5UX77/y4v1X/uD+q1+RfBh5cJfUrwg9jvDjiDyO6ONIfxzZPxrT4oZk3P/chfx2LIHQ2WmgP+dwBD84zPOf7E3GO7zJfIM3eXDE6z/Zm6R3eJP8Dm9S3uFN6ju8yf4Ob/IdrnjsHa547B2ueOwdrnj8Ha54/B2uePwdrnj8Ha54/B2uePwdrni88Irn1/heHD+K42dt/GjF8ak4PhfHl+L4Why/F8cvrt8ort8ort8ort8srt8srt8srt98un7Zb2udcGzja3H8XhzfiuN7cfwojp+l8aO14vhUHJ+L40txfC2O34vjW3F8L44fxfGL65eK65eK65eK65eK65eK65eK65eK65eK65eK65eK65eL65eL65eL65eL65eL65eL65eL65eL65eL65eL61eK61eK61eK61eK61eK61eK61eK61eK61eK61eK61efr9+8nZ0pwic3OSJv51Qmfx6z+e2n3//xl/6aNU2ZNU+ZtUyZtU6ZdZ8ya5sya58y65gy65wx6z7l2tinXBv7lGtjn3Jt7FOujX3KtbFPuTb2KdfGPuXa2KdcG23KtdGmXBttyrXRplwbn3+W56dkPeXaaFOujTbl2mhTro025droU66NPuXa6FOujT7l2vj8Ux8/Jesp10afcm30KddGn3Jt9CnXxphybYwp18aYcm2MKdfG558j+ilZT7k2xpRrY0y5NsaUa2NMuTbmlGtjTrk25pRrY065Nr7gGb2fkfWUa2NOuTbmlGtjTrk25oxrY7YZ18ZsM66N2WZcG7PNuDZmm3FtzDbj2phtxrUx24xrY7YZ18ZsU66NNOXaSFOujTTl2khTro0veLb8Z2Q95dpIU66NNOXaSFOujTTl2shTro085drIU66NPOXa+IJzG35G1lOujTzl2shTro085drIU66NMuXaKFOujTLl2ihTro0vOBPlZ2Q95dooU66NMuXaKFOujTLl2jjluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ONSmPBhnSXvG1XFJe8blcUl7xvVxSXvGBXJJe8YVckl7xiVySXvGNXJJe8ZFckl7zlVyyiNylrTnXCWnPCRnSXvOVXLKY3KWtOdcJac8KGdJe85Vcsqjcpa051wlpzwsZ0l7zlVyyuNylrTnXCWnPDBnSXvOVXLKI3OWtOdcJac8NGdJe85Vcspjc5a051wlpzw4Z0l7zlVyyqNzlrTnXCWnPDxnSfv5vu12S5vjN2n/KvD8gSAitP5dtG8FpFpAqwV6tYBVC3i1QFQLZLHA8wctnAlQtcDzlRxrh9OmF3W4588v+Dlp65xp9znTtjnT9jnTjjnTzinTfv4Yg5+T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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_9223372036854775807.snap index 21f62e633f4..7446892bd24 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_false_inliner_9223372036854775807.snap @@ -219,8 +219,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap index 348bf54c6bf..29a13d6cb67 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_-9223372036854775808.snap @@ -231,8 +231,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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UoSTIpwU4aSIIC/u4uL+eZ3wS+bHz0lGfFWOVCCVSM3vnfHN/T2q8q6aqPlE7FEJUoqUITVvo+K6v1nlRDlSgVQiVUg1UXUgJUgpUoYUamNxSTbP6xoyIR8HF/YVNUCLO008ICFICTKCBkFOUBCUBJEiGhRRx0GQEKQEGUHzp/yz+6jW4hpin5veN4v7OHxuBBgFxoAZwDgwAQzoQEAHAjpQ0IGCDhR0oKADBR0o6EBBBwo6UNCBgg4MdGCgAwMdzAc5Pjxe4/8R34//a75Qy71eh0Aeh99QAzQf5Pj59c0Lnd8Q3JAQpAQZQYMgJygISoKKoAbISRFOinBShJMinBThpAgnRTgpwkkRTooIUkSQIoIUEaSIIEUEKSJIEUGKCFJEkCKSFJGkiCRFJCkiSRFJikhSRJIikhSRpIgiRRQpokgRRYooUkSRIooUUaSIIkUUKaJJEU2KaFJEkyKaFNGkiCZFNCmiSRENiujjIEgIUoKMoEGQExQEJUFFEClCSBFCihBShJAihBQhpAghRQgpQkgRQopQUoSSIpQUoaQIJUUoKUJJEUqKUFKEkiKMFGGkCCNFGCnCSBFGijBShJEijBRhpAgys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wys2wwsxwHmFmeSAhSgoygQZATFATt3/DiREVQAyQHQUKQEmQEDYKcoCCIFCGkCCFFKClCSRFKilBShJIilBShpAglRSgpQkkRRopYTBI/Wyl4okGQExQEJUFFUAO0mCQ+ICFICSJFDFLEIEUMUsQgRQxSxCBFOCnCSRFOinBShJMiFpPEUX6hvu3CFpPEB5QEFUEN0GKS+ICEICXICBoEzV8ntysjj+OGiqD9lezjWMz3HpAQpAQZQYMgJygISoKKIFJEkSKKFFGkiCJFFCmiSBFFXtz5LEzrdXUZOz4u8Tf0q1FgDJgBjAMTwCQwBUxvG5mPwB6MAKPAGDADGAcmgElgChjQgYAOBHQgoAMB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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_0.snap b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_0.snap index 3de95a45dbe..5b24d78540c 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_0.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_0.snap @@ -223,8 +223,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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7/Am4x3eZL7BmzzY8fhP9ibf4YrH3+GKx9/hisff4YrH3+GKx9/hisff4YrH3+GKx9/hiife4YonCq94fo3PxfGlOL4Wx+/F8a04vhfHj+L4WRs/W3H84vrN4vrN4vrN4vrN4vrN4vrN4vrNp+vX23ojyEk38bM0vrVWHJ+K43NxfCmOr8Xxe3F8K47vxfGfr9/Pg3JdbRM/a+NTK45PxfG5OL4Ux9fi+L04vhXH9+L4xfVLxfXLxfXLxfXLxfXLxfXLxfXLxfXLxfXLxfXLxfXLz9ev9zV+/ngQvkkrjk/F8Z+u39D17x99G1+K42tx/F4c34rje3H8KI6ftfG1Fcen4vjF9avP16+v85OIzfcv1eL4T9dv9rV/ptMmvhXH9+L4URw/a+P3VhyfiuNzcXwpjq/F8YvrtxfXby+u315cv724fq24fq24fq24fq24fq24fq24fq24fq24fq24fq24fr24fr24fr24fr24fr24fr24fr24fr24fr24fr24fqO4fqO4fqO4fqO4fqO4fqO4fqO4fqO4fqO4fqO4frO4frO4frO4frO4frO4frO4frO4frO4frO4frO2fr214vhUHJ+L40txfC2O34vjW3F8L44fxfGL65eK65eK65eK65eK65eK65eK65eK65eK65eK65eK65eL65eL65eL65eL65eL65eL65eL65eL65eL65eL61eK61eK61eK61eK61eK61eK61eK61eK61eK61eK61eL61eL61eL61eL61eL67d4/5UX77/y4v1X/uD+q1+RfBh5cJfUrwg9jvDjiDyO6ONIfxzZPxrT4oZk3P/chfx2LIHQ2WmgP+dwBD84zPOf7E3GO7zJfIM3eXDE6z/Zm6R3eJP8Dm9S3uFN6ju8yf4Ob/IdrnjsHa547B2ueOwdrnj8Ha54/B2uePwdrnj8Ha54/B2uePwdrni88Irn1/heHD+K42dt/GjF8ak4PhfHl+L4Why/F8cvrt8ort8ort8ort8srt8srt8srt98un7Zb2udcGzja3H8XhzfiuN7cfwojp+l8aO14vhUHJ+L40txfC2O34vjW3F8L44fxfGL65eK65eK65eK65eK65eK65eK65eK65eK65eK65eK65eL65eL65eL65eL65eL65eL65eL65eL65eL65eL61eK61eK61eK61eK61eK61eK61eK61eK61eK61eK61efr9+8nZ0pwic3OSJv51Qmfx6z+e2n3//xl/6aNU2ZNU+ZtUyZtU6ZdZ8ya5sya58y65gy65wx6z7l2tinXBv7lGtjn3Jt7FOujX3KtbFPuTb2KdfGPuXa2KdcG23KtdGmXBttyrXRplwbn3+W56dkPeXaaFOujTbl2mhTro025droU66NPuXa6FOujT7l2vj8Ux8/Jesp10afcm30KddGn3Jt9CnXxphybYwp18aYcm2MKdfG558j+ilZT7k2xpRrY0y5NsaUa2NMuTbmlGtjTrk25pRrY065Nr7gGb2fkfWUa2NOuTbmlGtjTrk25oxrY7YZ18ZsM66N2WZcG7PNuDZmm3FtzDbj2phtxrUx24xrY7YZ18ZsU66NNOXaSFOujTTl2khTro0veLb8Z2Q95dpIU66NNOXaSFOujTTl2shTro085drIU66NPOXa+IJzG35G1lOujTzl2shTro085drIU66NMuXaKFOujTLl2ihTro0vOBPlZ2Q95dooU66NMuXaKFOujTLl2jjluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ODnluTg55bk4OeW5ONSmPBhnSXvG1XFJe8blcUl7xvVxSXvGBXJJe8YVckl7xiVySXvGNXJJe8ZFckl7zlVyyiNylrTnXCWnPCRnSXvOVXLKY3KWtOdcJac8KGdJe85Vcsqjcpa051wlpzwsZ0l7zlVyyuNylrTnXCWnPDBnSXvOVXLKI3OWtOdcJac8NGdJe85Vcspjc5a051wlpzw4Z0l7zlVyyqNzlrTnXCWnPDxnSfv5vu12S5vjN2n/KvD8gSAitP5dtG8FpFpAqwV6tYBVC3i1QFQLZLHA8wctnAlQtcDzlRxrh9OmF3W4588v+Dlp65xp9znTtjnT9jnTjjnTzinTfv4Yg5+T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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n", diff --git a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_9223372036854775807.snap b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_9223372036854775807.snap index 21f62e633f4..7446892bd24 100644 --- a/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_9223372036854775807.snap +++ b/tooling/nargo_cli/tests/snapshots/execution_success/uhashmap/execute__tests__force_brillig_true_inliner_9223372036854775807.snap @@ -219,8 +219,8 @@ expression: artifact } } }, - "bytecode": "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", - "debug_symbols": "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", + "bytecode": "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", + "debug_symbols": "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", "file_map": { "3": { "source": "use crate::cmp::{Eq, Ord};\nuse crate::convert::From;\nuse crate::runtime::is_unconstrained;\n\nmod check_shuffle;\nmod quicksort;\n\nimpl [T; N] {\n /// Returns the length of this array.\n ///\n /// ```noir\n /// fn len(self) -> Field\n /// ```\n ///\n /// example\n ///\n /// ```noir\n /// fn main() {\n /// let array = [42, 42];\n /// assert(array.len() == 2);\n /// }\n /// ```\n #[builtin(array_len)]\n pub fn len(self) -> u32 {}\n\n /// Returns this array as a slice.\n ///\n /// ```noir\n /// let array = [1, 2];\n /// let slice = array.as_slice();\n /// assert_eq(slice, &[1, 2]);\n /// ```\n #[builtin(as_slice)]\n pub fn as_slice(self) -> [T] {}\n\n /// Applies a function to each element of this array, returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.map(|a| a * 2);\n /// assert_eq(b, [2, 4, 6]);\n /// ```\n pub fn map(self, f: fn[Env](T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array along with its index,\n /// returning a new array containing the mapped elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let b = a.mapi(|i, a| i + a * 2);\n /// assert_eq(b, [2, 5, 8]);\n /// ```\n pub fn mapi(self, f: fn[Env](u32, T) -> U) -> [U; N] {\n let uninitialized = crate::mem::zeroed();\n let mut ret = [uninitialized; N];\n\n for i in 0..self.len() {\n ret[i] = f(i, self[i]);\n }\n\n ret\n }\n\n /// Applies a function to each element of this array.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// let mut i = 0;\n /// a.for_each(|x| {\n /// b[i] = x;\n /// i += 1;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_each(self, f: fn[Env](T) -> ()) {\n for i in 0..self.len() {\n f(self[i]);\n }\n }\n\n /// Applies a function to each element of this array along with its index.\n ///\n /// Example:\n ///\n /// ```rust\n /// let a = [1, 2, 3];\n /// let mut b = [0; 3];\n /// a.for_eachi(|i, x| {\n /// b[i] = x;\n /// });\n /// assert_eq(a, b);\n /// ```\n pub fn for_eachi(self, f: fn[Env](u32, T) -> ()) {\n for i in 0..self.len() {\n f(i, self[i]);\n }\n }\n\n /// Applies a function to each element of the array, returning the final accumulated value. The first\n /// parameter is the initial value.\n ///\n /// This is a left fold, so the given function will be applied to the accumulator and first element of\n /// the array, then the second, and so on. For a given call the expected result would be equivalent to:\n ///\n /// ```rust\n /// let a1 = [1];\n /// let a2 = [1, 2];\n /// let a3 = [1, 2, 3];\n ///\n /// let f = |a, b| a - b;\n /// a1.fold(10, f); //=> f(10, 1)\n /// a2.fold(10, f); //=> f(f(10, 1), 2)\n /// a3.fold(10, f); //=> f(f(f(10, 1), 2), 3)\n ///\n /// assert_eq(a3.fold(10, f), 10 - 1 - 2 - 3);\n /// ```\n pub fn fold(self, mut accumulator: U, f: fn[Env](U, T) -> U) -> U {\n for elem in self {\n accumulator = f(accumulator, elem);\n }\n accumulator\n }\n\n /// Same as fold, but uses the first element as the starting element.\n ///\n /// Requires the input array to be non-empty.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [1, 2, 3, 4];\n /// let reduced = arr.reduce(|a, b| a + b);\n /// assert(reduced == 10);\n /// }\n /// ```\n pub fn reduce(self, f: fn[Env](T, T) -> T) -> T {\n let mut accumulator = self[0];\n for i in 1..self.len() {\n accumulator = f(accumulator, self[i]);\n }\n accumulator\n }\n\n /// Returns true if all the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 2];\n /// let all = arr.all(|a| a == 2);\n /// assert(all);\n /// }\n /// ```\n pub fn all(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = true;\n for elem in self {\n ret &= predicate(elem);\n }\n ret\n }\n\n /// Returns true if any of the elements in this array satisfy the given predicate.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr = [2, 2, 2, 2, 5];\n /// let any = arr.any(|a| a == 5);\n /// assert(any);\n /// }\n /// ```\n pub fn any(self, predicate: fn[Env](T) -> bool) -> bool {\n let mut ret = false;\n for elem in self {\n ret |= predicate(elem);\n }\n ret\n }\n\n /// Concatenates this array with another array.\n ///\n /// Example:\n ///\n /// ```noir\n /// fn main() {\n /// let arr1 = [1, 2, 3, 4];\n /// let arr2 = [6, 7, 8, 9, 10, 11];\n /// let concatenated_arr = arr1.concat(arr2);\n /// assert(concatenated_arr == [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n /// }\n /// ```\n pub fn concat(self, array2: [T; M]) -> [T; N + M] {\n let mut result = [crate::mem::zeroed(); N + M];\n for i in 0..N {\n result[i] = self[i];\n }\n for i in 0..M {\n result[i + N] = array2[i];\n }\n result\n }\n}\n\nimpl [T; N]\nwhere\n T: Ord + Eq,\n{\n /// Returns a new sorted array. The original array remains untouched. Notice that this function will\n /// only work for arrays of fields or integers, not for any arbitrary type. This is because the sorting\n /// logic it uses internally is optimized specifically for these values. If you need a sort function to\n /// sort any type, you should use the `sort_via` function.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32];\n /// let sorted = arr.sort();\n /// assert(sorted == [32, 42]);\n /// }\n /// ```\n pub fn sort(self) -> Self {\n self.sort_via(|a, b| a <= b)\n }\n}\n\nimpl [T; N]\nwhere\n T: Eq,\n{\n /// Returns a new sorted array by sorting it with a custom comparison function.\n /// The original array remains untouched.\n /// The ordering function must return true if the first argument should be sorted to be before the second argument or is equal to the second argument.\n ///\n /// Using this method with an operator like `<` that does not return `true` for equal values will result in an assertion failure for arrays with equal elements.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let arr = [42, 32]\n /// let sorted_ascending = arr.sort_via(|a, b| a <= b);\n /// assert(sorted_ascending == [32, 42]); // verifies\n ///\n /// let sorted_descending = arr.sort_via(|a, b| a >= b);\n /// assert(sorted_descending == [32, 42]); // does not verify\n /// }\n /// ```\n pub fn sort_via(self, ordering: fn[Env](T, T) -> bool) -> Self {\n // Safety: `sorted` array is checked to be:\n // a. a permutation of `input`'s elements\n // b. satisfying the predicate `ordering`\n unsafe {\n let sorted = quicksort::quicksort(self, ordering);\n\n if !is_unconstrained() {\n for i in 0..N - 1 {\n assert(\n ordering(sorted[i], sorted[i + 1]),\n \"Array has not been sorted correctly according to `ordering`.\",\n );\n }\n check_shuffle::check_shuffle(self, sorted);\n }\n sorted\n }\n }\n}\n\nimpl [u8; N] {\n /// Converts a byte array of type `[u8; N]` to a string. Note that this performs no UTF-8 validation -\n /// the given array is interpreted as-is as a string.\n ///\n /// Example:\n ///\n /// ```rust\n /// fn main() {\n /// let hi = [104, 105].as_str_unchecked();\n /// assert_eq(hi, \"hi\");\n /// }\n /// ```\n #[builtin(array_as_str_unchecked)]\n pub fn as_str_unchecked(self) -> str {}\n}\n\nimpl From> for [u8; N] {\n /// Returns an array of the string bytes.\n fn from(s: str) -> Self {\n s.as_bytes()\n }\n}\n\nmod test {\n #[test]\n fn map_empty() {\n assert_eq([].map(|x| x + 1), []);\n }\n\n #[test]\n fn mapi_empty() {\n assert_eq([].mapi(|i, x| i * x + 1), []);\n }\n\n #[test]\n fn for_each_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_each(|_x| assert(false));\n }\n\n #[test]\n fn for_eachi_empty() {\n let empty_array: [Field; 0] = [];\n empty_array.for_eachi(|_i, _x| assert(false));\n }\n\n #[test]\n fn map_example() {\n let a = [1, 2, 3];\n let b = a.map(|a| a * 2);\n assert_eq(b, [2, 4, 6]);\n }\n\n #[test]\n fn mapi_example() {\n let a = [1, 2, 3];\n let b = a.mapi(|i, a| i + a * 2);\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn for_each_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n let mut i = 0;\n let i_ref = &mut i;\n a.for_each(|x| {\n b_ref[*i_ref] = x * 2;\n *i_ref += 1;\n });\n assert_eq(b, [2, 4, 6]);\n assert_eq(i, 3);\n }\n\n #[test]\n fn for_eachi_example() {\n let a = [1, 2, 3];\n let mut b = [0, 0, 0];\n let b_ref = &mut b;\n a.for_eachi(|i, a| { b_ref[i] = i + a * 2; });\n assert_eq(b, [2, 5, 8]);\n }\n\n #[test]\n fn concat() {\n let arr1 = [1, 2, 3, 4];\n let arr2 = [6, 7, 8, 9, 10, 11];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1, 2, 3, 4, 6, 7, 8, 9, 10, 11]);\n }\n\n #[test]\n fn concat_zero_length_with_something() {\n let arr1 = [];\n let arr2 = [1];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_something_with_zero_length() {\n let arr1 = [1];\n let arr2 = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, [1]);\n }\n\n #[test]\n fn concat_zero_lengths() {\n let arr1: [Field; 0] = [];\n let arr2: [Field; 0] = [];\n let concatenated_arr = arr1.concat(arr2);\n assert_eq(concatenated_arr, []);\n }\n}\n",